nagi-ledger(AI エージェントの派遣・検証・ 試行錯誤を記録する MCP サーバ)が吐き出した台帳を、人が読める形にする 1 ページのビューアです。
素の TypeScript(strict)+ Vite — UI フレームワーク無し、ランタイム依存ゼロ。 qa-dashboard と同じ思想で作っています。
nagi-ledger は、AI エージェント(Claude Code のサブエージェント)に何を派遣し、その結果を 検証したか(あるいは検証していないか)、どの手法が行き止まりだったかを記録する MCP サーバです。 台帳そのものは SQLite の行データで、そのままでは「派遣したのに検証していない仕事がどれだけ 溜まっているか」が見えません。
ledger-view は、nagi-ledger 側の export_json.py が吐き出す
JSON スナップショットを読み込み、この「検証の滞留」を一目で見せることに主眼を置いています。
派遣した回数・確定した verdict・行き止まりに終わった手法を並べて表示するだけの、単純な
ビューアです。
npm install
npm run dev # dev server, 同梱サンプルを表示
npm run build # tsc --strict の型チェック後 dist/ にビルド
npm run preview # ビルド済み dist/ をローカルで配信
npm test # vitest — ロジック部分のユニットテスト- サマリ帯 — 派遣総数 / verdict 内訳(CONFIRMED・REFUTED・PARTIAL・PENDING)/ actions の tier 内訳 / dead-end 数 / tool_failure 件数
- 検証の滞留 — verdict が
nullのままの派遣を ts 降順で並べる。この道具の主役。 - タスク別 — task 文字列で group し、派遣回数・最新 verdict・最終 ts を表示。 派遣回数 2 以上(リトライを消費している)の行を強調。
- approaches — DEAD_END / NO_GO / WORKS をタブで切り替え。
- actions — category と tier でフィルタできる一覧。
データはページへのドラッグ&ドロップで読み込みます。何も渡さなければ
public/sample/ledger-export.json(完全な合成データ、実在のプロジェクト名や人名は
含みません)が表示されます。
ts は UTC の文字列としてそのまま表示します(タイムゾーン変換はしません)。
完全な型定義は src/types.ts を、実データ例は public/sample/ledger-export.json を参照してください。
src/logic.test.ts に、型ガード(isExport)・verdict/tier 集計・task グルーピング・
actions フィルタなど純ロジックのユニットテストが 24 件あります。DOM 描画部分
(src/render.ts)はテスト対象外です。
加えて src/realdata.integration.test.ts に opt-in の実データ統合テストが 1 件:
REAL_EXPORT_PATH に実際の export(export_json.py の出力)を指すと、本物の台帳が
型ガードを通ることを検証します(未指定なら skip — CI では走りません)。
vite.config.ts は GitHub Pages のプロジェクトページ配信に合わせて base: '/ledger-view/'
を設定しています。.github/workflows/deploy.yml が main への push で自動デプロイします。
MIT — LICENSE を参照。
{ "schema": "nagi-ledger-export/1", "exported_at": "2026-08-10 21:40:00", "actions": [ { "id": 1, "ts": "2026-07-28 09:05:00", "tier": 0, // 0 | 1 | 2 "category": "install", "description": "...", "project": "web-app" // or null } ], "dispatches": [ { "id": 1, "ts": "2026-07-28 09:20:00", "task": "fix flaky test in test_widget.py", "agent_type": "nagi-implementer", "model": "sonnet", "brief_summary": "...", "verdict": "CONFIRMED", // "CONFIRMED" | "REFUTED" | "PARTIAL" | null (= pending) "verdict_ts": "2026-07-29 08:00:00", // or null "verdict_notes": "..." // or null } ], "approaches": [ { "id": 1, "ts": "2026-07-31 09:00:00", "task": "extract changelog entries from a release notes page", "approach": "regex-based HTML parsing", "outcome": "DEAD_END", // "DEAD_END" | "NO_GO" | "WORKS" "reason": "breaks on nested <ul> tags, switched to a proper HTML parser library" } ] }