Handbook

National OS Japan — 取扱説明書

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. 数字だけ。 文字(議事録等)に手を出さない
  2. 出典付き。 全データに公式ソースへの 1 クリックアクセス
  3. 判断しない。 「他と違う」を示す。「おかしい」とは言わない。判断は市民がする

追跡の範囲

国(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;  -- 企業マスタ件数

本番障害時

  1. docs/ROLLBACK_PROCEDURE.md を最初に読む
  2. 詳細手順は docs/RUNBOOK.md
  3. 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)

次の一手 (優先順)

  1. collector 追加継続: migration 1589 以降 (next_migration_number.sh で採番)
  2. α.2 collector refactor 継続: collect_fiscal_cards.py 等 (col-index 直書き廃止)
  3. 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.mddocs/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.mddocs/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) で確認する。