役割: DRP の永続データ契約(EDD-002)の正典 — D1 telemetry_records スキーマ(v1〜v8 migration 履歴)・KV キー設計・Durable Object の保持状態・Queue メッセージ封筒。旧 README §12.5-12.6 から抽出(strangler-fig Phase 2 / ADR-0117)。 位置づけ: ここに載るのは外から観測可能なデータ契約(監査クエリ・API レスポンス・運用 SQL が依存する形)。変更は L3(id_conventions.md §3)。

1. D1: telemetry_records(database: decision-pipeline-telemetry

審査 run 1 件 = 1 行(実行基盤の Cloudflare Workflows 移行 = ADR-0120 後も 1 run = 1 行を維持。retry 発生時に step 名 + 回数を telemetry 列へ記録する拡張は 0120 決定 4。旧 ADR-0116 の chunk 単位拡張案は Superseded で消滅)。全カラムの API 露出形は openapi.yaml の TelemetryRecord と突合できる。

1.1 スキーマバージョン履歴(v1 → v8)

バージョン導入追加カラム / 内容
v1ADR-0077telemetry 基盤導入(session_id / created_at / duration_ms / author / title / triage 系 / score 系 / rejected 系 / 各 gate detail / adr_slug / adr_number / pr_url / gate_timings JSON)
v2PR #1086(ADR-0082)trigger_source / mode_override / dry_run / draft_id / node_metrics の 5 カラム
v3PR #1134・#1135(ADR-0086 / 0087)per-gate ms 10 カラム + cross_validation_verdicts(2026-05-29 本番適用)
v4migrate-v4-rejection-reason.sqlrejection_reason 系カラム
v5migrate-v5-triage-reject-kind.sqltriage_reject_kind(not-adr-worthy / pre-gate-block / null。ADR-0088 / 0091 起案前ゲート)
v6migrate-v6-triage-short-circuit.sqltriage_decision_source(llm / short_circuit。ADR-0095 Phase A)
v7migrate-v7-light-cap-observability.sqlblind_spot_count_raw / light_capped_to_zero(ADR-0102 Light cap 観測)
v8migrate-v8-crossval-escalate.sql(ADR-0109 Part4 / PR #1343)cross_validation_escalated / crossval_round_count / crossval_stop_reason / residual_risk_titles の 4 カラム。goalpost / round-cap escalate(残余リスク付き Accept)の終端観測。2026-06-03 remote D1 適用済
  • schema_version カラムが各行の世代を持つ。旧世代行は新カラム NULL の後方互換(バックフィル状況は §1.4)。
  • マイグレーション SQL はすべて drp/migrate-*.sql。適用は npx wrangler d1 execute decision-pipeline-telemetry --file=<sql>

1.2 全カラム定義(現行 v8・56 カラム)

定義の正典 = drp/schema.sql(v1〜v4)+ migrate-v5〜v8.sql(2026-06-05 時点のコード実査)。型・制約は SQL が正で、本表が drift したら SQL に従う。

新規環境構築の注意: schema.sql に含まれるのは v4 カラムまで。新規 DB は schema.sql 適用後に migrate-v5migrate-v8この順で追加適用する必要がある。

値の例の出典: 2026-06-05 に実 run(GET /audit/runs・169 件)から採取し、長文は で短縮。INTEGER 0/1 カラムは D1 格納形が 0/1、API 露出形は true/false/audit 系 API が boolean に変換して返す)— 本表は格納形で記載。

型と上限の共通規則(桁数・文字数を列ごとに書かない理由): D1 = SQLite は型アフィニティ方式で、VARCHAR(n) / NUMERIC(p,s) 的な宣言桁数は書いても強制されないため、列単位の桁数・文字数欄は設けない。実際の上限は次の共通規則による:

  • INTEGER: 64bit 符号付き(−9,223,372,036,854,775,808 〜 9,223,372,036,854,775,807)/ REAL: IEEE 754 倍精度(8 bytes)/ TEXT: 宣言上限なし
  • D1 プラットフォーム上限D1 Limits・2026-06-05 確認): 文字列・BLOB・行 = 2,000,000 bytes(2 MB)adr_body / input_context 等の長文を含む行全体の事実上の上限)/ DB 全体 10 GB(Paid)/ SQL 文 100 KB
  • 1 テーブル 100 列 — 本テーブルは現在 56/100。将来 migration の列追加余地の管理指標とする
  • 値の範囲・列挙の制約(0/1・enum・50 点満点等)はアプリ層の慣行であり DDL では強制されない —「制約・値域」列の記載がその正典

フラグ列の凡例: PK = PRIMARY KEY / NN = NOT NULL(いずれも SQL 宣言ベース・✓ のみ表示)。FK: 本 DB は単一テーブル構成で SQL 外部キー宣言はゼロ — FK 列の「(論理)」表記は DDL 外の論理参照(D1 → DO / KV)であり、参照整合性は強制されない。デフォルト値: SQL の DEFAULT 宣言ベース。空欄 = 宣言なし(SQLite では未指定 INSERT 時に NULL)。宣言があるのは schema_version の 1 列のみ。 SQLite の既知の仕様: TEXT PRIMARY KEYNOT NULL を含意しない(INTEGER PK / WITHOUT ROWID を除く)。session_id の NN が空欄なのはこのため — 実際はアプリ層が常に UUID を書き込む。

#カラムPKFKNNデフォルト値制約・値域世代意味値の例
1session_idTEXT(論理)DO / Queue 封筒v1審査 run の一意 ID(session DO / Queue 封筒の sessionId と同一)8f166218-cbe8-4e67-a835-b711d1d258ce
2schema_versionTEXT'v1'v1この行が書かれた時点のスキーマ世代v8
3created_atTEXT索引v1レコード作成時刻(ISO 8601 UTC・ms 精度)2026-06-02T16:04:36.408Z
4duration_msINTEGERv1run 全体の所要時間647159(≒ 10.8 分)
5authorTEXTv1起案者(アカウントアドレス)[email protected]
6titleTEXTv1起案タイトル審査パイプラインに「コード実査グラウンディング」を導入する
7triage_modeTEXTLight/Standard/Critical・索引v1Gate 0 が決定した審査モードStandard
8needs_adrINTEGER0/1v1記録価値判定の結果(0 = 対象外終端)1
9triage_reasonTEXTv1Gate 0 の判定理由会計仕訳の自動化基盤導入であり、業務フローと会計ロジックに影響するため。
10blind_spot_findingsTEXT (JSON)v1Gate 1 盲点検出の findings[{"source":"devil_advocate","title":"…","severity":"critical","actionability":"monitor","evidence":"…"}]
11adr_bodyTEXTv1生成された ADR 本文(Markdown 全文)# ADR-0109: Cross-Validation 過剰審査ループの…
12scoreINTEGER50 点満点・索引v1Gate 4 総合スコア48
13scoring_meanREALv1複数サンプリング採点の平均48.3
14scoring_std_devREALv1同・標準偏差0.4
15scoring_detailTEXT (JSON)v1Gate 4 の採点詳細(項目別 Markdown 表)| 1 | problem_definition | 5/5 | 7/7ケース…定量化 |
16rejectedINTEGER0/1・索引v1差戻し終端フラグ0
17rejection_msgTEXTv1差戻しメッセージ⚠️ Goalpost ループ検知 (2 連続却下)。残余リスク付き Accept として PR を起票しました。…
18cross_validation_detailTEXTv1Cross-Validation の判定詳細(軸別 Markdown)### Cross-Validation 結果 (評価軸別)\n\n#### #reliable (Must 軸、スコア 4) ⚠️ 6 件の盲点で毀損…
19consistency_verdictTEXT観測値: PASS/INFO/CONFLICT/SUPERSEDEv1Gate 2 の verdictPASS
20consistency_detailTEXTv1Gate 2 の判定詳細(散文)既存 ADR との矛盾はなく、ADR-0110…を参照・整合的に拡張する。
21parallel_review_detailTEXT (JSON)v1Gate 3(3 モデル並列レビュー)の annotations[{"label":"Gemini","annotations":[{"quote":"撤退条件…","type":"strength"}]},…]
22policy_alignment_detailTEXTv1Policy Alignment の判定詳細(Markdown)## 会社方針アライメント審査結果\n\n**総合判定**: 条件付きアライン…
23scoring_effortTEXTv1LLM 実行パラメータの記録(pipelineOptions.scoringEffortmax
24thinking_budgetINTEGERv1同(pipelineOptions.thinkingBudget-1 = 無制限)-1
25review_effortTEXTv1同(pipelineOptions.reviewEfforthigh
26input_contextTEXTv1起案者の生テキスト(draft.context。差し戻し切り分けの一次資料)## 何を解決するか\n手入力仕訳が月200件。…\n## コスト試算\n7人日、月$30。…
27gate_timingsTEXT (JSON)残置(§1.4)v1旧 per-gate 所要時間 JSON(v3 で構造化カラムに正規化済){"triage":99,"socratic":178512,"body_generation":203051,…}
28adr_slugTEXTv1生成 slug(日本語混在あり)crossvalidation-過剰審査ループの-systemic-fix-part14-bounded-rounds-
29adr_numberINTEGERv1採番された ADR 番号109
30pr_urlTEXTv1自動作成された PR の URLhttps://github.com/BizLinkPartners/bizlp-gas-accounting/pull/1335
31trigger_sourceTEXTweb-ui/github-actions/claude-code/apiv2起点識別web-ui
32mode_overrideTEXTLight/Standard/Criticalv2Triage Mode 強制指定Standard
33dry_runINTEGER0/1v2PR 作成スキップフラグ0
34draft_idTEXT(論理)KV DRAFTS_KVv2KV draft ID(audit 連結用)adr-0107-crossval-part4
35node_metricsTEXT (JSON)v2各ノードの calls / tokens / cost{"socratic":{"calls":2,"input_tokens":12236,"output_tokens":7483,"cost_usd":0},…}
36triage_msINTEGERv3Gate 0 Triage 所要時間99
37socratic_msINTEGERv3Gate 1 盲点検出 所要時間178512
38body_generation_msINTEGERv3本文生成 所要時間203051
39scoring_msINTEGERv3Gate 4 Scoring 所要時間120280
40cross_validation_msINTEGERv3Cross-Validation 所要時間120770
41consistency_msINTEGERv3Gate 2 Consistency 所要時間25235
42parallel_review_msINTEGERv3Gate 3 Parallel Review 所要時間55059
43policy_alignment_msINTEGERv3Policy Alignment 所要時間54970
44slug_msINTEGERv3slug 生成 所要時間4481
45numbering_msINTEGERv3採番 所要時間1072
46cross_validation_verdictsTEXT (JSON 配列)v3全 finding × axis の verdict(PR #1112 extended)[{"findingTitle":"…","findingSeverity":"critical","mustAxis":"#reliable","mustScore":4,"isMustAxis":true,"undermines":true,…}]
47rejection_reason_codeTEXT索引v4却下経路の構造化コード(4 週レビューの自動集計用。バックフィル不可)cost-missing(他の観測値: user-initiated-cancel/watchdog-timeout/placeholder-remaining
48triage_reject_kindTEXTnot-adr-worthy/pre-gate-block/NULL・索引v5triage 却下の種別(真の対象外 vs 起案前ゲート差し戻し)pre-gate-block
49triage_decision_sourceTEXTllm/short_circuit/NULL・索引v6triage 判定の出所(精度評価のデータ汚染防止)llm
50triage_short_circuit_reasonTEXTv6short-circuit hit 時の判定根拠chars=29,no_identifiers
51blind_spot_count_rawINTEGERv7Gate 1 の cap 適用盲点総数(「元々ゼロ」と「cap で削った」の区別)13
52light_capped_to_zeroINTEGER1/0/NULLv7Light cap が critical/high 盲点をゼロ化した run の検知0
53cross_validation_escalatedINTEGER1/0/NULLv8loop-breaker が自動 reject を止め HITL escalate に切替えた run1
54crossval_round_countINTEGERv8同一 draft_id の連続 CV 却下ラウンド数(escalate 判定根拠)2
55crossval_stop_reasonTEXTgoalpost/round-cap/NULLv8escalate の終端理由goalpost
56residual_risk_titlesTEXT (JSON 配列)v8残余リスク付き Accept 時に ADR へ転記した未解決 critical 盲点タイトル["「persist 優先で FN=0」の保証は…未検証","…"]
インデックス対象カラム由来用途
idx_telemetry_created_atcreated_atschema.sql期間絞り込み(監査クエリの基本軸)
idx_telemetry_triage_modetriage_modeschema.sqlモード別集計
idx_telemetry_scorescoreschema.sqlスコア分布分析
idx_telemetry_rejectedrejectedschema.sql却下率集計
idx_telemetry_rejection_reason_coderejection_reason_codeschema.sql / migrate-v4却下理由の自動集計(4 週レビュー)
idx_telemetry_triage_reject_kindtriage_reject_kindmigrate-v5却下種別の週次集計
idx_telemetry_triage_decision_sourcetriage_decision_sourcemigrate-v6short-circuit hit 率の週次集計

運用注意: migrate-v5 の SQL 内コメントの適用例は DB 名が旧名(decision-pipeline-db)のまま。正しい適用先は decision-pipeline-telemetry(§1.1 の適用コマンド参照)。

1.4 互換性・バックフィルの現状

  • gate_timings TEXT(JSON)カラムは互換性のため残置(将来の世代で DROP 予定)。/audit/runs API は新旧両カラムを JSON parse して返却。
  • per-gate ms は v3 適用時の既存 31 件を json_extract(gate_timings, '$.gate') でバックフィル済。cross_validation_verdicts は実行時のみ生成のため過去レコードは NULL(バックフィル不可)。

1.5 クエリ例

-- Gate 別平均所要時間
SELECT AVG(scoring_ms), AVG(cross_validation_ms) FROM telemetry_records WHERE score IS NOT NULL;
-- 軸別毀損件数 (cross_validation_verdicts JSON 展開)
SELECT axis.value AS axis_name, COUNT(*) FROM telemetry_records, json_each(cross_validation_verdicts) je,
  json_each(je.value) axis WHERE axis.key = 'mustAxis' AND je.value LIKE '%"undermines":true%' GROUP BY axis_name;

2. KV 名前空間

2.1 DRAFTS_KV(起案 draft + キャッシュ)

キー備考値の例
<draft_id>[a-zA-Z0-9_-]{1,64}draft 本体 JSON(id / author / title / context / options / retroactivemetadata に mtime / title / size / retroactive を持ち、一覧 API は metadata のみで返す。上限 100 件・1 MB/件。PR 作成成功後に自動削除(ADR-0037)キー pipeline-productization-go-no-go / 値 {"author":"[email protected]","title":"[ADR] 意思決定審査パイプラインの製品化に…","context":"# …(生テキスト Markdown 全文)","options":"","retroactive":false} / metadata {"mtime":1780577100612,"title":"…","size":6389,"retroactive":false}
_cache:adr-summaries既存 ADR 一覧キャッシュ(TTL=3600s)Gate 2 の GitHub REST + GraphQL 呼出を節約(ADR-0083)。手動無効化は DELETE /drafts/_cache:adr-summaries各 ADR 先頭抜粋を \n\n 連結したプレーンテキスト(summaries.join('\n\n')・JSON ではない)。TTL 失効中は GET が {"error":"not found"}

read-after-write 整合: POST 直後は per-id / 一覧のどちらかが旧値を返しうる。成否判定は POST 201 + mtime で行う(運用知見)。

2.2 PROMPTS_KV(プロンプト・パラメータ管理 / ADR-0042・0085)

キーパターン備考値の例
bizlp:prompts:<gate-id>:activesemver ポインタどの版が有効かキー bizlp:prompts:gate0-triage:active / 値 1.2.0prompt.meta.yamlsemver と一致)
bizlp:prompts:<gate-id>:<semver>プロンプト本文git SSoTprompts/production/<gate-id>/prompt.md)から scripts/prompt-kv-push.mjs でデプロイキー bizlp:prompts:gate0-triage:1.2.0 / 値 = prompt.md 本文(プレーンテキスト)
bizlp:prompts:<gate-id>:paramsLLM パラメータ JSON(temperature / seed / sampling_n 等)prompt.meta.yaml 由来{"temperature":0.4,"seed":42}(gate2-consistency のコード内フォールバック既定と同形)
bizlp:prompts:gate4-scoring:thresholds{"Light": 35, "Standard": 40, "Critical": 45}KV 未設定時はコード内デフォルトにフォールバック(ADR-0084)値列のとおり(このキーのみ固定キー・JSON)

ゲート別の読込経路と fallback の対応は プロンプト仕様書 が正典。

3. Durable Objects

bindingクラス保持状態値の例
PIPELINE_SESSIONSPipelineSessionDOsession 1 件 = PipelineSessionStateopenapi.yaml の同名スキーマが API 露出形の正典)。TTL 24h(expiresAt)。watchdog alarm(状態遷移仕様)を併設{"sessionId":"ee852e0a-…","status":"cancelled","draft":{"author":"…","title":"…","context":"…"},"pipelineOptions":{"thinkingBudget":-1,"scoringEffort":"max","reviewEffort":"high"},"triggerSource":"web-ui","gateProgress":{},"triageResult":{"needsAdr":true,"triageMode":"Critical",…},"createdAt":1780593372120,"updatedAt":1780593376917,"expiresAt":1780679772120,"cancelRequested":true,"partialResults":{},"lastSuccessfulGate":null}(実 session・epoch ms)
SOCRATIC_SESSIONSSocraticSessionDO/chat/answer フローの質問・回答履歴(有効期限 24h)。型は SessionDatasrc/do/socratic_session.ts{"input":{"author":"…","title":"…","context":"…","options":"","thinkingBudget":-1,"scoringEffort":"max","reviewEffort":"high"},"questions":["…?"],"createdAt":1780593372120}

4. Queue メッセージ封筒

項目
キューpipeline-queue(binding: PIPELINE_QUEUE)/ DLQ: pipeline-queue-dlq
封筒{ "sessionId": string (UUID) }本文を運ばない。draft 内容・進捗・結果はすべて session DO が正(封筒は参照のみ)。値の例: {"sessionId":"8f166218-cbe8-4e67-a835-b711d1d258ce"}
配信設定max_batch_size=1 / max_batch_timeout=5s / max_retries=3(超過で DLQ 隔離)

変更履歴

日時変更
2026-06-05初版 — 旧 README §12.5-12.6(2026-06-05 時点 L577-646)から抽出し、KV / DO / Queue 封筒の定義を集約(ADR-0117 Phase 2)
2026-06-05§1.2 を全カラム定義表(v8 現行・56 カラム)に拡張、§1.3 にインデックス 7 本を追加 — schema.sql + migrate-v2〜v8 のコード実査で正典化。旧 §1.2(v2)/§1.3(v3)の部分表は世代列に吸収。schema.sql の v4 まで問題・v5 コメント旧 DB 名の運用注意を追記
2026-06-05§1.2 に「値の例」列を追加 — 実 run 169 件(GET /audit/runs)から採取・長文は短縮。consistency_verdict の観測値域(PASS/INFO/CONFLICT/SUPERSEDE)と INTEGER 0/1 の格納形 vs API 露出形(boolean)の差も明記
2026-06-05§1.2 に連番(#)列を追加。§2 KV / §3 DO / §4 Queue 封筒にも「値の例」を追加 — 実 KV draft(GET /drafts)・実 session DO(GET /chat/status/:id)・コード実査(socratic_session.ts SessionData / consistency.ts cache 書込形 / prompt.meta.yaml semver)から採取
2026-06-05§1.2 に「型と上限の共通規則」注記を追加 — SQLite 型アフィニティのため列単位の桁数欄は設けない判断の明文化 + INTEGER/REAL/TEXT の実上限 + D1 プラットフォーム上限(行 2MB・100 列/テーブル = 現在 56/100)
2026-06-05§1.2 の制約をフラグ列に分離 — PK / FK / NN 列を新設(SQL 宣言ベース: PK=1・NN=4・FK 宣言ゼロ)。session_id / draft_id の DO・KV への論理参照を FK 列に「(論理)」表記で収載。SQLite の TEXT PRIMARY KEY が NOT NULL を含意しない仕様も注記
2026-06-05§1.2 に「デフォルト値」列を追加 — SQL DEFAULT 宣言ベース(宣言ありは schema_version = 'v1' の 1 列のみ・空欄 = 未指定 INSERT 時 NULL)
2026-06-05§1 冒頭の ADR-0116 参照を ADR-0120(Workflows 移行)へ更新 — 1 run = 1 行の維持と retry 記録拡張(0120 決定 4)を明記