National OS Japan Handbook
「読んだら全体像・現在地・動き方がわかる」 一冊本。
詳細は §8 の地図から各専門 doc へ。
N2 axiom (Natural Neutrality) に従い、自己評価・称賛表現を含まない。
§0 このドキュメントについて
役割: docs/ に散在する情報の統合入口。初回セッション / 引き継ぎ / 長期空白後の再開時に最初に読む 1 本。運用時の逐次参照は docs/handbook/ (完全取扱説明書、AI 単一入口 = docs/state/os_manifest.json) を使う。
canonical source: docs/HANDBOOK.md (shin-vps /root/national-os-japan/)
web 公開: https://national-os.jp/handbook
更新トリガー:
- §6 現在地: Phase 遷移時 + 月次 (最低 1 回)
- §7 教訓: 新 ADR の教訓が横断的に重要な場合のみ追記
- §8 地図: 新規 doc 追加・移動時
- §0 版番号: 毎回更新
注意: このドキュメントは snapshot。数値が古い可能性がある場合は (要確認) と記す。
canonical source (DB / git log / ADR) で実測してから判断すること。
このドキュメントと他 doc の棲み分け:
docs/INDEX.md= 全 md ファイルの 1 行説明索引 (カタログ)docs/HANDBOOK.md= 通読書 (本 file)docs/LIVING_DESIGN.md= axiom + 不変的構造 (launch まで community vote 経由のみ更新)docs/RUNBOOK.md= 平時運用手順の詳細
§1 Mission
国の予算 123 兆円が、どこを通って、誰の手に渡って、何に使われたか。全部数字で追える。
3 原則 (VISION.md より転記)
- 数字だけ。 文字(議事録等)に手を出さない
- 出典付き。 全データに公式ソースへの 1 クリックアクセス
- 判断しない。 「他と違う」を示す。「おかしい」とは言わない。判断は市民がする
追跡の範囲
国(123 兆円)
→ 主要経費別(社会保障 37 兆 / 国債費 27 兆 / 地方配分 17 兆 / 防衛 8.6 兆 / ...)
→ 都道府県別配分(突合チェック、透明度スコア)
→ 市区町村別配分(突合チェック)
→ 目的別歳出(財源構成比率付き)
→ 受注企業(法人番号で紐付け)
どの階層でもズームイン / アウト可能。企業側からの逆引きも可能。
意図的に捨てたもの
| 捨てたもの | 理由 |
|---|---|
| 独自スコアリング | 「誰が作った? 査読は?」 に答えられない |
| 消滅時計 / Death Clock | 煽り表現。データと事実のみに徹する |
| 議事録 AI 解析 | 文脈誤読・名誉毀損リスク |
| 「おかしい」 判断 | 中立性を保つ。 「他と違う」 を示すだけ |
| ブランディング (税金の探偵等) | データ基盤に思想は不要 |
§2 全体像
何を: 政府公式統計 23 種を正規化・突合して、公金の流れを国から企業まで 5 階層で追跡するデータ基盤
誰のために: 「国民の税金がどこに使われているか知りたい」 全市民。 研究者・ジャーナリスト
どう作る: 完全オープンアルゴリズム (GitHub public)。 全計算ロジック公開。 全レコードに公式ソース URL 保持。 改ざん検知 (Merkle root + GitHub tag 週次外部アンカー)
現在地: 基盤完備 (旧 Phase 0-ε 全完了)。 v4.1 (synchronous-twilight) Phase 1-6 全完了 (2026-05-17)。
v4.1 実装フェーズ (synchronous-twilight)
| Phase | 内容 | 状態 (2026-05-17) |
|---|---|---|
| 1 | Foundation (vendor pipeline / scaffold / tokens / middleware) | 完了 (task 46/46 done) |
| 2 | Core Components + NoJSChart pattern | 完了 (PR #513-515) |
| 3 | Public Budget Views | 完了 (PR #516-518) |
| 4 | Region & Money Flow | 完了 (PR #521) |
| 5 | Reconciliation & Evidence | 完了 (PR #522-523) |
| 6 | Polish + Launch (2026-10-31) | 完了 (a0fa24a) |
旧基盤 (Phase 0-ε) KPI 達成状況
| KPI | 達成値 | 目標 |
|---|---|---|
| 一般会計カバー率 | 99.98% | ≥95% |
| 特別会計カバー率 | 100% (FY2019-2024) | — |
| col-index 直書き箇所 | 0 | 0 |
| exclude_keys (全 active rule 計) | 110 | ≤110 |
| tolerance_rationale populate 率 | 100% (44/44) | 100% |
§3 アーキ quick ref
技術スタック
| Layer | Technology |
|---|---|
| Frontend | Next.js 16.2.6 + React 19.2.4 + RSC + Tailwind v4 + shadcn/ui (14 components) |
| Backend | Python 3.12 + FastAPI + SQLAlchemy 2.0 (121 EP / 41 route modules) |
| Database | PostgreSQL 16 + PostGIS 3.4 (Docker、 container national_os_db) |
| Type 生成 | orval v8.9.0 (FastAPI → TypeScript 自動生成) |
| Reverse Proxy | Nginx (rate limiting / caching) |
| Process manager | pm2 cluster 2 instance (pm2 reload web zero-downtime) |
| Evidence | Merkle root + GitHub tag (週次 systemd timer) |
| CI | GitHub Actions (INP emulation / a11y / type-check / pytest) |
| Font | Inter Variable + Noto Sans JP Variable (self-host、 SRI sha384) |
| Chart | ECharts (Sankey / Stacked Area) + Leaflet (Map) + server-side SVG fallback |
不可侵 axiom 12 個 (HANDOFF_PACK §1 より転記)
PR review で違反即 reject。 axiom 追加は launch 後 community vote 経由のみ。
構造的 (S1-S5):
| ID | 名称 | 内容 |
|---|---|---|
| S1 | Public First, JS Second | JS 無効でも RSC pure HTML で全数字 + evidence link 到達 |
| S2 | Sovereign Source | runtime asset self-host + SRI。 build-time deps lockfile SHA-512 pin。 npm audit critical 0 |
| S3 | Every number has Static Evidence | 全数字 hover で sha256 + snapshot URL + 出典 + 取得日 popover |
| S4 | Explain the Delta | 全数字に Δ% 必須 (前期 / 前年) |
| S5 | Build to be Replaced (Lite) | LIVING_DESIGN.md + ADR (「捨てたもの」 必須) 整備。 後継者 = 内部 reviewer 限定 |
様式的 (V1-V5):
| ID | 内容 |
|---|---|
| V1 | No emoji / No illustration |
| V2 | No gradient as decoration (hero/footer brand-identity gradient 1 個のみ可) |
| V3 | All numbers tabular-nums (font-feature-settings: 'tnum','lnum','zero') |
| V4 | Sans-serif headlines only (Inter Variable + Noto Sans JP Variable + system-ui fallback) |
| V5 | No CTA shouting (動詞 + 目的語の地の文) |
中立性 (N1-N2):
| ID | 名称 | 内容 |
|---|---|---|
| N1 | Lineage Transparency | 全数値に「どこまで追えたか + なぜそこで終わったか」 を 5 終端タイプで分類。 silent gap 0% |
| N2 | Natural Neutrality | 当サイトは記録機・審判ではない。 ただし 自己宣言しない (posturing 禁止) |
ディレクトリ構造
/root/national-os-japan/
├── services/
│ ├── api/ # FastAPI 本体 (models.py が canonical)
│ ├── db/migrations/ # 229+ files、採番 = scripts/next_migration_number.sh
│ ├── evidence_manager/ # snapshot → canonical sha256 (S3 axiom)
│ └── scraper/collectors/ # データ収集 109 スクリプト
├── apps/
│ └── web/ # Next.js 16.2.6 (v4.1 移行先 / App Router)
│ └── src/app/ # pages (handbook/ 等)
├── docs/ # 全 md 索引は docs/INDEX.md
│ ├── adr/ # 600+ ADR (active ~220 / archive ~138)
│ ├── design/ # VISION_FOUNDATION_v1 等
│ ├── deployment/ # PORT_REGISTRY / RUNNER_SETUP 等
│ ├── migration/ # history / collisions
│ ├── state/ # auto-generated state files (編集禁止)
│ ├── strategy/ # collision matrix 等
│ └── rule_audits/ # R-35/R-57/R-77/R-78 audit 群
├── scripts/ # 109 本 (migration 採番 / SRI 生成 / vendor copy)
├── tests/ # pytest
└── deploy/systemd/ # timer 群 (Merkle / reconciliation / procurement-diff)
PORT / URL
| サービス | HOST:PORT | 備考 |
|---|---|---|
| FastAPI (本番) | 162.43.77.190:8000 | Nginx 経由 |
| Next.js (本番) | 162.43.77.190:3000 | pm2 cluster |
| PostgreSQL | localhost:5432 (Docker) | container national_os_db |
| live dashboard | https://national-os.jp/dashboard/ | |
| Swagger UI | https://national-os.jp/api/v1/docs | canonical API source |
§4 データ quick ref
規模 (要確認: 増加中)
| 指標 | 値 |
|---|---|
| テーブル数 | 151 (canonical: services/api/models.py) |
| DB 容量 | 19 GB |
| データソース種類 | 23 種 (収集済み) |
| 調達契約 | 299,001 件 / 法人番号紐付 99.10% / FY2013-2026 |
| 最大テーブル | expenditure_source: 20.7M 行 (1989-2018) |
| 市区町村 | 1,918 (公式 1,741 + 政令市区 + 政令市) |
追跡可能度 (2026-04-20 実測)
| 階層 | カバー率 | データ規模 |
|---|---|---|
| 国 → 省庁別 | 100% | 1959-2024 |
| 国 → 一般会計 事項・目レベル | 99.98% | 122.998 兆 / 123.024 兆 |
| 国 → 特別会計 | 100% | 217.2 兆 (FY2019-2024 全 6 年) |
| 国 → 政府関係機関 | 100% | 2.045 兆 (FY2019-2024 全 6 年) |
| 国 → 受注事業者 | 法人番号 99.10% | 299,001 件 |
| 省庁 → 県 (国庫支出金) | 85% | e-Stat 32 カテゴリ × 47 都道府県 |
| 県 → 市 | 90% | e-Stat + 決算カード |
| 市 → 目的別歳出 | 95% | e-Stat 歳出内訳 (2,071 万行) |
重要な概念
P-ID (パイプライン ID): 全レコードに付与する不変 ID。 階層を跨いで資金フローをトレース。
origin_pid + Lamport clock + immutability triggers で保護 (Phase 7-A 完了)。
透明度スコア: 「どこまで追えたか」 を 0-100 で数値化。 Unidentified (追跡不能) を定量管理。 5 終端タイプ分類 (N1 axiom)。
reconciliation rules: 異なるソース間の数値突合ルール。
- active: 41 rules (0 violations 維持)
- R-21 の 4 件は intentional policy monitoring signal として文書化済み (intent 的な 0 violations)
- skeleton: criteria populate 済み (active 化条件を明示)
Merkle root: 全データの改ざん検知。 weekly SHA256 + GitHub tag で外部アンカー。
確認: deploy/systemd/merkle.timer
canonical source 優先順位
| 情報 | canonical source | historical artifact (参照禁止) |
|---|---|---|
| テーブル構造・カラム | services/api/models.py |
DB_SCHEMA.md (15T 記載、現 151T) |
| API 仕様 | /api/v1/docs (Swagger UI) |
API.md (104EP 記載、現 121EP) |
| migration 番号 | scripts/next_migration_number.sh --check-vps |
— |
| ADR 番号 | scripts/next_adr_number.sh |
— |
| reconciliation rules | SELECT rule_id, rule_name FROM reconciliation_rules ORDER BY rule_id |
— |
§5 運用 quick ref
通常デプロイ (v4.1 Phase 1 以降)
# PR merge 後
ssh shin-vps
cd /root/national-os-japan
git pull origin main
# Python / FastAPI 再起動
source .venv/bin/activate
systemctl restart national-os-api
# Next.js rebuild + zero-downtime reload
cd apps/web
pnpm build
pm2 reload web
migration 実行
# 1. 番号採番 (全 origin/* scan で衝突回避)
scripts/next_migration_number.sh --check-vps
# 2. migration ファイル作成 (db/migrations/NNN_<description>.sql)
# 3. 実行
docker exec -it national_os_db psql -U nsjapan -d national_os -f /path/to/migration.sql
# 4. 動作確認
docker exec -it national_os_db psql -U nsjapan -d national_os \
-c "SELECT rule_id, rule_name, tolerance FROM reconciliation_rules ORDER BY rule_id DESC LIMIT 5"
ADR 作成
# 番号採番 (衝突防止)
scripts/next_adr_number.sh
# 作成先: docs/adr/NNNN-<kebab-case-title>.md
# 必須セクション: Status / Context / Decision / Alternatives (「捨てたもの」) / Consequences
# Adversarial Self-Review: CLAUDE.md の 5 観点チェック必須
データ収集
# 個別 collector 実行
python scripts/collect_<name>.py
# e-Stat API: timeout 120s、 retry 3 回設定済み
# 全スクリプト一覧: ls scripts/collect_*.py | head -20
DB 直接確認
docker exec -it national_os_db psql -U nsjapan -d national_os
# よく使うクエリ
\dt -- テーブル一覧
\d table_name -- テーブル構造
SELECT COUNT(*) FROM corp_master; -- 企業マスタ件数
本番障害時
docs/ROLLBACK_PROCEDURE.mdを最初に読む- 詳細手順は
docs/RUNBOOK.md - DB backup:
docker exec national_os_db pg_dump -U nsjapan national_os > backup.sql
並行 session 対策
- worktree 強制:
.githooks/post-checkoutが自動的に worktree 作業を強制 - migration 採番:
scripts/next_migration_number.shを 必ず 使う - ADR 採番:
scripts/next_adr_number.shを 必ず 使う - worktree は
/root/national-os-japan-corp,/root/wt-*等、repo root 外に作るrepo root 直下の wt-*に作ると docs/ が duplicate になり混乱 (教訓: wt-phase1-pr4/ が過去にその状態)
CI gates (push 前)
pnpm type-check # TypeScript 0 errors (厳守)
pnpm lint # ruff (Python) + ESLint
pytest # Python tests
pnpm build # Next.js build success
INP threshold (launch envelope、 ADR-0005 確定):
- LCP < 4000ms / INP < 600ms / CLS < 0.1
- Phase 1-5 中は「launch envelope を割らない」 ことだけ守る
§6 現在地と次の一手
この section は最も drift しやすい。
git log --oneline -5と task-tree DB を最初に確認すること。
今どこにいるか (2026-05-17 時点)
v4.1 (synchronous-twilight) 進行状況:
- Phase 1-6 全完了 (Phase 6: a0fa24a)
- 最新 main commit: #604 collect_kessan_obr α.2 refactor
- collector 追加継続中 (最新 migration 1579 factory_location_stat)
- worktree: main + corp (detached) + perf のみ (stale worktrees 整理済み 2026-05-17)
旧基盤 (Phase 0-ε) 状態:
- Master Plan 全完了 (Phase 0/α/β/γ/δ/ε + 7-M-θ)
- KPI: 一般会計 99.98% / exclude_keys 110 / tolerance_rationale 100% 達成
- reconciliation: 41 active rules + skeleton (0 violations 維持)
ADR 状況:
- 1600+ 本 (docs/adr/ 配下 281 files)
- 最新 ADR: ADR-1620 factory_location_stat (2026-05-17)
次の一手 (優先順)
- collector 追加継続: migration 1589 以降 (next_migration_number.sh で採番)
- α.2 collector refactor 継続: collect_fiscal_cards.py 等 (col-index 直書き廃止)
- phase4/muni-choropleth: リモートブランチに市区町村コロプレス機能あり — cherry-pick/PR検討
マイルストーン
| 目標 | 期限 |
|---|---|
| v4.1 Phase 1-6 完了 + launch | 2026-10-31 |
| INP Phase 6 trial (BrowserStack 実機 vs emulation) | 2026-10 中旬 |
| Cloudflare Universal SSL 切替 | Phase 6 |
§7 教訓・禁則・ハマりどころ
絶対 NG (即 reject または事故になる操作)
| 禁則 | 理由 |
|---|---|
migration を next_migration_number.sh なしに採番 |
衝突 15 件発生済み (docs/migration/collisions.md)。 --check-vps flag で全 origin/* scan 必須 |
ADR を next_adr_number.sh なしに採番 |
同上の衝突リスク |
| worktree を repo root 直下に作る | docs/ が duplicate になり wc -l ランキングを汚染。 /root/wt-* に作る |
rm -rf wt-<name> (worktree 直接削除) |
git tracking が壊れる。 必ず git worktree remove <path> |
| PR で axiom (S1-S5/V1-V5/N1-N2) 違反 | 即 reject。 CLAUDE.md の Adversarial Self-Review 5 観点チェック必須 |
| DB_SCHEMA.md / API.md を canonical として参照 | 陳腐化確定。 canonical は models.py (テーブル) と Swagger UI (API) |
| ADR に自己評価スコア「N/100 点」 記述 | ADR-0657 禁止。 chain stop も同様 (ADR-0194) |
| path 仮説で直 implement (log 先読みせず) | ADR-0274/0279/0284/0298。 必ず実測 → 仮説 → grep verify の順 |
| 「parser fix 不能」 と PDF 全頁 probe 前に結論 | 7-M-θ で 2 回覆った。 情報公開請求より先に PDF raw text 全頁確認 |
よくハマる現象と対処
| 現象 | 原因 | 対処 |
|---|---|---|
| rule_id が migration ファイル番号と乖離 | SEQUENCE drift | DB query SELECT rule_id, rule_name FROM reconciliation_rules ORDER BY rule_id が真実 |
nohup で起動したプロセスが SSH disconnect で死ぬ |
nohup は SIGHUP を防げない | setsid nohup ... & で PPid=1 (init) に attach → SIGHUP 完全遮断 |
| collector が中断後に再開すると重複データ | date range の重複 start | 最後の commit 済み date を DB から取得して resume |
| reconciliation tolerance 計算が単位不一致 | 億円 vs 百万円 vs 千円の混在 | docs/UNIT_AUDIT.md で全ソースの単位を確認してから計算 |
| ADR amendment chain が際限なく続く | 検証ゼロで self-claim | ADR-0194 によりchain stop。 amendment は root cause fix のみ |
| migration rollback でデータが silent に消える | psycopg2 rollback は partial commit を捨てる | BEGIN/COMMIT を明示的に。 per-step commit で最小単位に分割 |
| 並行 session が同じ worktree を使う事故 | session 間で worktree 認識がズレる | 各 session は独立 worktree に固定。 .githooks/post-checkout で強制 |
| settlement PDF の「parser fix 不能」判定が後で覆る | yield 重複・state machine 経路の見落とし | raw PDF 全頁 probe + 複数 fix path (yield dedup / state machine 拡張) を試してから諦める |
設計上の学び
| 教訓 | 内容 |
|---|---|
| Plans Are Prompts | placeholder (TBD / 後で書く) を plan に入れると実装が止まる。 最初から完全な仕様を書く |
| backfill は時系列連続性で確認 | 単年度 OK ≠ 12 年連続 OK。 必ず全 FY range で確認 |
| skeleton rule は 数を減らすより criteria を明示 | blockers + invariants を 100% populate → 「いつ active 化できるか」 が判定可能 = KPI 本来意図を満たす |
| delta と evidence は後方互換で追加できる | Next.js middleware + FastAPI decorator で既存 EP を汚染せず S3/S4 axiom を充足 |
| reconciliation backfill は时系列連続性で確認 | FY2019-2024 全 6 年を通して 0 violations を確認してから active 化 |
| signal/noise 改善は WHERE 句 1 行 | resolution IS NULL OR = 'unresolved' で WARN 17 件 → 2 件。 監視 script の意味は filter 設計で決まる |
| 真因解消後は explicit な resolved 化 | parser 重複 yield 解消後も暫定 viol は自動解消されない。 resolution='methodology_diff' + remarks で明示的に recorded |
§8 もっと知るための地図
| 知りたいこと | 読む先 |
|---|---|
| 全 doc 一覧 (索引) | docs/INDEX.md — 番号体系 + 陳腐化警告付き |
| Mission + 3 原則の詳細 | docs/VISION.md |
| 123 兆円追跡の全アーキ + 11 構造原則 | docs/FULL_MONEY_TRACE_DESIGN.md (3,360 行、 核設計書) |
| DB テーブル数・行数・カラム構造 | docs/data_scale.md + services/api/models.py |
| API 仕様 | https://national-os.jp/api/v1/docs (Swagger UI、 canonical) |
| 本番障害時の対処 | docs/ROLLBACK_PROCEDURE.md → docs/RUNBOOK.md |
| migration 設計・衝突履歴 | docs/migration/history.md + docs/migration/collisions.md |
| reconciliation rules 現状 | docs/reconciliation_rules_registry.md |
| UI/UX v4.1 設計 (synchronous-twilight) | docs/design/VISION_FOUNDATION_v1.md |
| 引き継ぎ (後継者向け) | docs/handoffs/2026-04-PACK.md (symlink: HANDOFF_PACK.md) |
| データソースの単位 (百万円 vs 千円) | docs/UNIT_AUDIT.md |
| NULL 判定規約 | docs/NULL_REASON_DECISION_TABLE.md |
| ADR 索引 (600+ 本) | docs/adr/README.md → docs/adr/INDEX.md |
| Master Plan 完了履歴 | docs/COMPLETION_RECORD.md + docs/phases/master_plan_completion_summary.md |
| task-tree 現状 (auto-generated) | docs/phases/task-tree-progress.md (編集禁止) |
| 租税特別措置の取り扱い | docs/tax_expenditure_source.md + docs/tax_expenditure_income_source.md |
| R-57 / paper company 系 | docs/rule_audits/r57_*.md (4 file 連鎖) |
| CI axiom gates 仕様 | docs/design/CI_AXIOM_GATES_SPEC.md |
| VPS 直接操作 | ssh shin-vps → /root/national-os-japan/ |
| live dashboard | https://national-os.jp/dashboard/ |
| GitHub repo | free26kkai-stack/national-os-japan (private) |
最終更新ログ
| 日付 | 更新者 | 内容 |
|---|---|---|
| 2026-05-16 | Kai | 初版作成。§0-8 全章、axiom 12 件、教訓・禁則・地図 |
| 2026-05-17 | Claude | §4/§6 現在地更新: v4.1 Phase 1-6 全完了確認、collector migration 1579、ADR 1620 まで反映 |
Handbook は living document。 数値が古い可能性がある場合は先に canonical source (DB / git log / ADR) で確認する。