DRP データ定義書
役割: 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)
| バージョン | 導入 | 追加カラム / 内容 |
|---|---|---|
| v1 | ADR-0077 | telemetry 基盤導入(session_id / created_at / duration_ms / author / title / triage 系 / score 系 / rejected 系 / 各 gate detail / adr_slug / adr_number / pr_url / gate_timings JSON) |
| v2 | PR #1086(ADR-0082) | trigger_source / mode_override / dry_run / draft_id / node_metrics の 5 カラム |
| v3 | PR #1134・#1135(ADR-0086 / 0087) | per-gate ms 10 カラム + cross_validation_verdicts(2026-05-29 本番適用) |
| v4 | migrate-v4-rejection-reason.sql | rejection_reason 系カラム |
| v5 | migrate-v5-triage-reject-kind.sql | triage_reject_kind(not-adr-worthy / pre-gate-block / null。ADR-0088 / 0091 起案前ゲート) |
| v6 | migrate-v6-triage-short-circuit.sql | triage_decision_source(llm / short_circuit。ADR-0095 Phase A) |
| v7 | migrate-v7-light-cap-observability.sql | blind_spot_count_raw / light_capped_to_zero(ADR-0102 Light cap 観測) |
| v8 | migrate-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-v5〜migrate-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 KEYは NOT NULL を含意しない(INTEGER PK / WITHOUT ROWID を除く)。session_idの NN が空欄なのはこのため — 実際はアプリ層が常に UUID を書き込む。
| # | カラム | 型 | PK | FK | NN | デフォルト値 | 制約・値域 | 世代 | 意味 | 値の例 |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | session_id | TEXT | ✓ | (論理)DO / Queue 封筒 | v1 | 審査 run の一意 ID(session DO / Queue 封筒の sessionId と同一) | 8f166218-cbe8-4e67-a835-b711d1d258ce | |||
| 2 | schema_version | TEXT | ✓ | 'v1' | v1 | この行が書かれた時点のスキーマ世代 | v8 | |||
| 3 | created_at | TEXT | ✓ | 索引 | v1 | レコード作成時刻(ISO 8601 UTC・ms 精度) | 2026-06-02T16:04:36.408Z | |||
| 4 | duration_ms | INTEGER | v1 | run 全体の所要時間 | 647159(≒ 10.8 分) | |||||
| 5 | author | TEXT | ✓ | v1 | 起案者(アカウントアドレス) | [email protected] | ||||
| 6 | title | TEXT | ✓ | v1 | 起案タイトル | 審査パイプラインに「コード実査グラウンディング」を導入する | ||||
| 7 | triage_mode | TEXT | Light/Standard/Critical・索引 | v1 | Gate 0 が決定した審査モード | Standard | ||||
| 8 | needs_adr | INTEGER | 0/1 | v1 | 記録価値判定の結果(0 = 対象外終端) | 1 | ||||
| 9 | triage_reason | TEXT | v1 | Gate 0 の判定理由 | 会計仕訳の自動化基盤導入であり、業務フローと会計ロジックに影響するため。 | |||||
| 10 | blind_spot_findings | TEXT (JSON) | v1 | Gate 1 盲点検出の findings | [{"source":"devil_advocate","title":"…","severity":"critical","actionability":"monitor","evidence":"…"}] | |||||
| 11 | adr_body | TEXT | v1 | 生成された ADR 本文(Markdown 全文) | # ADR-0109: Cross-Validation 過剰審査ループの… | |||||
| 12 | score | INTEGER | 50 点満点・索引 | v1 | Gate 4 総合スコア | 48 | ||||
| 13 | scoring_mean | REAL | v1 | 複数サンプリング採点の平均 | 48.3 | |||||
| 14 | scoring_std_dev | REAL | v1 | 同・標準偏差 | 0.4 | |||||
| 15 | scoring_detail | TEXT (JSON) | v1 | Gate 4 の採点詳細(項目別 Markdown 表) | | 1 | problem_definition | 5/5 | 7/7ケース…定量化 | | |||||
| 16 | rejected | INTEGER | 0/1・索引 | v1 | 差戻し終端フラグ | 0 | ||||
| 17 | rejection_msg | TEXT | v1 | 差戻しメッセージ | ⚠️ Goalpost ループ検知 (2 連続却下)。残余リスク付き Accept として PR を起票しました。… | |||||
| 18 | cross_validation_detail | TEXT | v1 | Cross-Validation の判定詳細(軸別 Markdown) | ### Cross-Validation 結果 (評価軸別)\n\n#### #reliable (Must 軸、スコア 4) ⚠️ 6 件の盲点で毀損… | |||||
| 19 | consistency_verdict | TEXT | 観測値: PASS/INFO/CONFLICT/SUPERSEDE | v1 | Gate 2 の verdict | PASS | ||||
| 20 | consistency_detail | TEXT | v1 | Gate 2 の判定詳細(散文) | 既存 ADR との矛盾はなく、ADR-0110…を参照・整合的に拡張する。 | |||||
| 21 | parallel_review_detail | TEXT (JSON) | v1 | Gate 3(3 モデル並列レビュー)の annotations | [{"label":"Gemini","annotations":[{"quote":"撤退条件…","type":"strength"}]},…] | |||||
| 22 | policy_alignment_detail | TEXT | v1 | Policy Alignment の判定詳細(Markdown) | ## 会社方針アライメント審査結果\n\n**総合判定**: 条件付きアライン… | |||||
| 23 | scoring_effort | TEXT | v1 | LLM 実行パラメータの記録(pipelineOptions.scoringEffort) | max | |||||
| 24 | thinking_budget | INTEGER | v1 | 同(pipelineOptions.thinkingBudget。-1 = 無制限) | -1 | |||||
| 25 | review_effort | TEXT | v1 | 同(pipelineOptions.reviewEffort) | high | |||||
| 26 | input_context | TEXT | v1 | 起案者の生テキスト(draft.context。差し戻し切り分けの一次資料) | ## 何を解決するか\n手入力仕訳が月200件。…\n## コスト試算\n7人日、月$30。… | |||||
| 27 | gate_timings | TEXT (JSON) | 残置(§1.4) | v1 | 旧 per-gate 所要時間 JSON(v3 で構造化カラムに正規化済) | {"triage":99,"socratic":178512,"body_generation":203051,…} | ||||
| 28 | adr_slug | TEXT | v1 | 生成 slug(日本語混在あり) | crossvalidation-過剰審査ループの-systemic-fix-part14-bounded-rounds- | |||||
| 29 | adr_number | INTEGER | v1 | 採番された ADR 番号 | 109 | |||||
| 30 | pr_url | TEXT | v1 | 自動作成された PR の URL | https://github.com/BizLinkPartners/bizlp-gas-accounting/pull/1335 | |||||
| 31 | trigger_source | TEXT | web-ui/github-actions/claude-code/api 等 | v2 | 起点識別 | web-ui | ||||
| 32 | mode_override | TEXT | Light/Standard/Critical | v2 | Triage Mode 強制指定 | Standard | ||||
| 33 | dry_run | INTEGER | 0/1 | v2 | PR 作成スキップフラグ | 0 | ||||
| 34 | draft_id | TEXT | (論理)KV DRAFTS_KV | v2 | KV draft ID(audit 連結用) | adr-0107-crossval-part4 | ||||
| 35 | node_metrics | TEXT (JSON) | v2 | 各ノードの calls / tokens / cost | {"socratic":{"calls":2,"input_tokens":12236,"output_tokens":7483,"cost_usd":0},…} | |||||
| 36 | triage_ms | INTEGER | v3 | Gate 0 Triage 所要時間 | 99 | |||||
| 37 | socratic_ms | INTEGER | v3 | Gate 1 盲点検出 所要時間 | 178512 | |||||
| 38 | body_generation_ms | INTEGER | v3 | 本文生成 所要時間 | 203051 | |||||
| 39 | scoring_ms | INTEGER | v3 | Gate 4 Scoring 所要時間 | 120280 | |||||
| 40 | cross_validation_ms | INTEGER | v3 | Cross-Validation 所要時間 | 120770 | |||||
| 41 | consistency_ms | INTEGER | v3 | Gate 2 Consistency 所要時間 | 25235 | |||||
| 42 | parallel_review_ms | INTEGER | v3 | Gate 3 Parallel Review 所要時間 | 55059 | |||||
| 43 | policy_alignment_ms | INTEGER | v3 | Policy Alignment 所要時間 | 54970 | |||||
| 44 | slug_ms | INTEGER | v3 | slug 生成 所要時間 | 4481 | |||||
| 45 | numbering_ms | INTEGER | v3 | 採番 所要時間 | 1072 | |||||
| 46 | cross_validation_verdicts | TEXT (JSON 配列) | v3 | 全 finding × axis の verdict(PR #1112 extended) | [{"findingTitle":"…","findingSeverity":"critical","mustAxis":"#reliable","mustScore":4,"isMustAxis":true,"undermines":true,…}] | |||||
| 47 | rejection_reason_code | TEXT | 索引 | v4 | 却下経路の構造化コード(4 週レビューの自動集計用。バックフィル不可) | cost-missing(他の観測値: user-initiated-cancel/watchdog-timeout/placeholder-remaining) | ||||
| 48 | triage_reject_kind | TEXT | not-adr-worthy/pre-gate-block/NULL・索引 | v5 | triage 却下の種別(真の対象外 vs 起案前ゲート差し戻し) | pre-gate-block | ||||
| 49 | triage_decision_source | TEXT | llm/short_circuit/NULL・索引 | v6 | triage 判定の出所(精度評価のデータ汚染防止) | llm | ||||
| 50 | triage_short_circuit_reason | TEXT | v6 | short-circuit hit 時の判定根拠 | chars=29,no_identifiers | |||||
| 51 | blind_spot_count_raw | INTEGER | v7 | Gate 1 の cap 適用前盲点総数(「元々ゼロ」と「cap で削った」の区別) | 13 | |||||
| 52 | light_capped_to_zero | INTEGER | 1/0/NULL | v7 | Light cap が critical/high 盲点をゼロ化した run の検知 | 0 | ||||
| 53 | cross_validation_escalated | INTEGER | 1/0/NULL | v8 | loop-breaker が自動 reject を止め HITL escalate に切替えた run | 1 | ||||
| 54 | crossval_round_count | INTEGER | v8 | 同一 draft_id の連続 CV 却下ラウンド数(escalate 判定根拠) | 2 | |||||
| 55 | crossval_stop_reason | TEXT | goalpost/round-cap/NULL | v8 | escalate の終端理由 | goalpost | ||||
| 56 | residual_risk_titles | TEXT (JSON 配列) | v8 | 残余リスク付き Accept 時に ADR へ転記した未解決 critical 盲点タイトル | ["「persist 優先で FN=0」の保証は…未検証","…"] |
| インデックス | 対象カラム | 由来 | 用途 |
|---|---|---|---|
idx_telemetry_created_at | created_at | schema.sql | 期間絞り込み(監査クエリの基本軸) |
idx_telemetry_triage_mode | triage_mode | schema.sql | モード別集計 |
idx_telemetry_score | score | schema.sql | スコア分布分析 |
idx_telemetry_rejected | rejected | schema.sql | 却下率集計 |
idx_telemetry_rejection_reason_code | rejection_reason_code | schema.sql / migrate-v4 | 却下理由の自動集計(4 週レビュー) |
idx_telemetry_triage_reject_kind | triage_reject_kind | migrate-v5 | 却下種別の週次集計 |
idx_telemetry_triage_decision_source | triage_decision_source | migrate-v6 | short-circuit hit 率の週次集計 |
運用注意:
migrate-v5の SQL 内コメントの適用例は DB 名が旧名(decision-pipeline-db)のまま。正しい適用先はdecision-pipeline-telemetry(§1.1 の適用コマンド参照)。
1.4 互換性・バックフィルの現状
- 旧
gate_timings TEXT(JSON)カラムは互換性のため残置(将来の世代で DROP 予定)。/audit/runsAPI は新旧両カラムを 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 / retroactive) | metadata に 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>:active | semver ポインタ | どの版が有効か | キー bizlp:prompts:gate0-triage:active / 値 1.2.0(prompt.meta.yaml の semver と一致) |
bizlp:prompts:<gate-id>:<semver> | プロンプト本文 | git SSoT(prompts/production/<gate-id>/prompt.md)から scripts/prompt-kv-push.mjs でデプロイ | キー bizlp:prompts:gate0-triage:1.2.0 / 値 = prompt.md 本文(プレーンテキスト) |
bizlp:prompts:<gate-id>:params | LLM パラメータ 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_SESSIONS | PipelineSessionDO | session 1 件 = PipelineSessionState(openapi.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_SESSIONS | SocraticSessionDO | /chat/answer フローの質問・回答履歴(有効期限 24h)。型は SessionData(src/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)を明記 |