ADR-0059: docs-nav-lint に R5 prefix-cross-doc-consistency rule を追加 (ADR-0055 拡張)
- Status: Accepted
- Mode: Standard
- Scope: platform
- Kruchten Type: Existence/Property
- Implementation Status: Not Started
- 起案者: [email protected]
- 起案日時 (JST): 2026-05-22 18:14
- 承認日時 (JST): 2026-05-22 18:30 (Pipeline 通常 flow v2 49/50 通過)
- Deciders: [email protected] (単独)
コンテキスト
1.1 背景 (Background)
ADR-0055 (PR #861/#862, 2026-05-19/20) で _config.json の nav prefix を <NS>.<group_number>.<page_index> 形式に刷新し、docs-nav-lint.mjs R4 で _config.json 内の prefix-group 整合を CI 検証している。一方、TOC として機能する docs/index.md の section header (A.01 architecture/ / I.05 05_how-to/ 等、PR #877 で整合化) と _config.json group prefix の機械整合は手動レビューに依存している。
1.2 現状 (Current State / As-Is)
docs-nav-lint.mjsR1-R4 が_config.json内整合を検証する。docs/index.mdの section header (現 13 個) と_config.jsongroup prefix (現 ~40 グループ) のクロスドキュメント整合は手動レビューに依存。- PR #877 (2026-05-20) で
docs/index.md13 個の section header を ADR-0055 形式に 手動で更新 (~30min 実測)。これは sub session の audit (handover §Step 4-b) で偶然発覚した構造的脆弱性。
1.3 課題 (Problem)
片方を変更したときに整合が崩れるリスクが残存し、見過ごし得る漏れリスクがある。
痛みの定量化 (proxy 実測 + 推定 + 再評価タイミング):
- 実測サンプル (n=1): PR #877 (2026-05-20) で
docs/index.md13 section header の手動更新に ~30min (session log proxy ベース) - 年間想定発生頻度: 6-12 回/年 (新 group 追加 / nav prefix 変更想定) → ~2.5-5h/年の手動 audit 工数
- 集計手順 (再現可能化):
- 過去 PR を
gh pr list --search 'docs/index.md ## A.'で抽出 - 各 PR の diff から手動更新 section header 数を集計
- 平均処理時間 ~2-3min/section × 件数 = 工数推定
- 過去 PR を
- 信頼区間: 実測 1 件のみのため推定区間は ±50% (1.25-7.5h/年)
- 再評価タイミング: Jr 入社 (2026-10) 後 2 ヶ月 (2026-12) で実測 n≥5 件に到達した時点で本 §1.3 を更新、信頼区間を狭める。1 年後 (2027-05-22) Review After にも明記
1.4 制約・要件 (Constraints & Requirements)
- ADR-0055 (NS prefix 形式) / ADR-0051 (docs-nav-lint.mjs SSoT 構造) と整合すること。
- ADR Immutability 原則を遵守 (ADR-0055 への corrigendum での吸収は不可)。
- 既存
docs-nav-lintworkflow に統合可能であること (新規 workflow を増やさない)。 - 個人開発フェーズの保守コストに見合うこと (依存追加は最小限)。
- 将来の Jr 入社 (2026-10) 時に規約として説明可能であること。
1.5 目標 (Goals / To-Be)
docs/index.mdの section header と_config.jsongroup prefix のクロスドキュメント整合を CI で機械検証する。- 手動 audit 工数 ~2.5-5h/年を撤廃する。
- Non-Goals: ADR-0057 (docs-link-check.mjs) との統合 / 個別 rule 別ファイル分割 (将来検討)。
決定
scripts/docs-nav-lint.mjs に R5 (prefix-cross-doc-consistency) rule を追加し、docs/index.md の ^## <NS>.<group_number> 形式 section header が _config.json 内の group prefix と整合するかを regex 方式で検証する。既存 docs-nav-lint workflow と同 job に統合し、.docs-nav-lint-allowlist.json に index_md_section_special_cases フィールドを新設して special case を扱う。初期は WARN で運用し、3 ヶ月後に false-positive 0 + true-positive ≥ 1 を満たせば ERROR に昇格する。
判断基準 (Decision Drivers)
3.1 評価軸 (Q42 9 タグから 3-5 個選定)
| # | 軸 | 重要度 (係数) | 案件特有の解釈 |
|---|---|---|---|
| 1 | #reliable | [Must] (×2.0) | クロスドキュメント整合崩れを構造的に検出できるか |
| 2 | #maintainable | [High] (×1.0) | lint rule 追加による保守コスト、依存追加の有無 |
| 3 | #suitable | [Must] (×2.0) | ADR Immutability 原則 / ADR-0055 自然延長としての適切性 |
| 4 | #efficient | [High] (×1.0) | CI 実行時間、手動 audit 工数削減 ROI |
| 5 | #operable | [Medium] (×0.5) | false-positive 発生時の allowlist 運用容易性 |
K.O. criterion: Must 軸 (#reliable, #suitable) の score < 3 は不採用。
3.2 評価軸 × 案スコア表
| 軸 | 係数 | 採択案 (R5/regex/同job) | 案 X1 (手動継続) | 案 X2 (corrigendum) | 案 X3 (AST方式) |
|---|---|---|---|---|---|
#reliable | ×2.0 | 5 | 1 | 4 | 5 |
#maintainable | ×1.0 | 4 | 5 | 3 | 2 |
#suitable | ×2.0 | 5 | 3 | 1 | 4 |
#efficient | ×1.0 | 4 | 2 | 3 | 3 |
#operable | ×0.5 | 4 | 3 | 2 | 3 |
| 加重和 (正規化) | 0.918 | 0.491 | 0.464 | 0.745 | |
| K.O. 通過 (Must ≥3) | ✓ | ❌ (#reliable=1) | ❌ (#suitable=1) | ✓ |
加重和は K.O. 通過候補 (採択案 / 案 X3) のタイブレーク用。採択案が #maintainable (依存追加なし) で X3 を上回り選定。
検討した代替案 (Alternatives Considered)
- 採用案 (R5 を docs-nav-lint.mjs に追加, regex 方式, 同 job 統合):
- Good: ADR-0055 の自然延長、R4 と同 pattern、保守コスト最小、CI 起動オーバーヘッドゼロ
- Bad:
docs/index.mdのフォーマット規約に依存 (将来 index.md 形式変更時に rule 改修必要)
- 案 X1: 手動レビュー継続 (DOC-OPS-02 のまま):
- Good: 工数ゼロ
- Bad: 構造的脆弱性が残存、PR #877 のような事後修正が発生し続ける、年間 ~2.5-5h の audit 工数
- 不採用理由: K.O. 不通過 (
#reliable= 1, 構造的検出不能)
- 案 X2: ADR-0055 への corrigendum で吸収 (新規 ADR を起案しない):
- Good: ADR 数増えない
- Bad: ADR Immutability 原則と齟齬 (corrigendum は誤字修正範囲、新 rule 追加は越える)、ADR-0031 (Kruchten Type 遡及追加) と比較すると本件は機能追加なので別 ADR が筋
- 不採用理由: K.O. 不通過 (
#suitable= 1, Immutability 違反)
- 案 X3: Markdown AST (remark/unified) 方式:
- Good: 厳密な header 解析、コードブロック内擬似 header 誤検出回避
- Bad: 依存追加 (remark / unified)、対象 1 ファイル単純 regex で十分、過剰設計
- 不採用理由: K.O. は通過するが
#maintainableで採択案に劣る (加重和 0.745 < 0.918)
実装方式選定詳細
| 実装方式 | 採用 | 理由 |
|---|---|---|
| (A) regex pattern | ✅ 採用 | 既存 R1-R4 と同 pattern、依存追加なし、対象 1 ファイル (index.md) で十分 |
| (B) Markdown AST (remark/unified) | 不採用 | 依存追加コスト > 得られる正確性ゲイン (section header は H2 のみで regex で十分一意) |
検証ロジック
- R5 検証対象:
docs/index.mdの^## <NS>.<group_number>形式 section header - 検証内容: section header の
<NS>.<group_number>部分が_config.json内に存在する group prefix と一致するか - 違反例:
docs/index.mdに## A.99 nonexistent-group/があるが_config.jsonにはarc42.99_*group が存在しない → FAIL (error) - 違反例:
_config.jsonにarc42.07_deployment(= A.07) があるがdocs/index.mdに## A.07 *section が存在しない → WARN (削除済 group の可能性、または index.md 未更新)
Special case 除外機構 (allowlist 設計)
.docs-nav-lint-allowlist.json に index_md_section_special_cases フィールド (string[] of regex patterns) を新規追加:
{
"files": [...],
"patterns": [...],
"index_md_section_special_cases": [
"^## トップレベル$",
"^## ナビゲーション補助$"
]
}
R5 実行時、上記 regex にマッチする section header は <NS>.<group_number> 形式を満たさなくても skip。初期想定 ≤ 5 件、超過時は ADR 再評価。
影響 (Consequences)
5.1 正の影響 (Good)
- TOC (
docs/index.md) と nav SSoT (_config.json) の機械整合が確立される。 - 手動 audit 工数 ~2.5-5h/年を撤廃。
docs/index.md更新漏れの構造的防止 (PR #877 と同種の事後修正が発生しなくなる)。- ADR-0055 の自然延長として、ADR-0051 (docs-nav-lint.mjs SSoT 構造) パターンを補強。
- 将来 stakeholder (Jr 入社 2026-10) への規約説明が CI 出力で機械的に可能。
5.2 負の影響 (Bad)
docs/index.mdのフォーマット規約 (H2 section header) に依存し、将来 index.md 形式変更時に rule 改修が必要。- false-positive リスクがあり、special case の allowlist 運用が発生する。
docs-nav-lint.mjsがdocs-nav-lint.mjs:167→ ~200-220 行に肥大化 (将来 R6-RN 追加で 500 行超過する負債化リスク)。- 継続運用コスト: 新 group 追加時の R5 違反対応 ~5-10min/件 × 6-12 件/年 = ~1-2h/年。
5.3 中立・トレードオフ (Neutral / Trade-offs)
- R5 を error 化 vs warn 化: 初期は WARN (3 ヶ月運用) → false-positive 0 + true-positive ≥ 1 なら ERROR 昇格。
- Deciders / 利害関係者: Decider = 代表取締役 (単独)、事実上のレビュアー = sub workspace audit (handover §Step 4-b)、将来 stakeholder = Jr 入社 (2026-10)。
- 改修対象:
scripts/docs-nav-lint.mjs(+30-50 行)、.docs-nav-lint-allowlist.json(+ 1 フィールド)。 - 検証対象:
docs/index.mdの section header (現 13 個)、docs/_config.jsonの group prefix (現 ~40 グループ)。 - CI 結合: 既存
docs-nav-lintworkflow に統合 (新規 workflow なし)。
コスト試算
| 項目 | 数値 |
|---|---|
| 実装工数 | ~2-3h (R4 = ADR-0055 PR #861 同等規模、AI 支援込み) |
| 追加コード行数 | ~30-50 行 (docs-nav-lint.mjs:167 → ~200-220 行) |
| CI 実行時間増分 | +1-3 秒 (docs/index.md 1 ファイル regex scan のみ、対象 ~200 行) |
| 継続運用コスト | 新 group 追加時の R5 違反対応 ~5-10min/件 × 6-12 件/年 = ~1-2h/年 |
| 削減効果 | 手動 audit 工数 ~2.5-5h/年 (§1.3 痛みの定量化より) |
| ROI | (2.5-5h 削減 - 1-2h 継続) ÷ 2-3h 実装 = ~6-12 ヶ月で回収 |
検証可能な完了条件
| # | 観測可能な指標 | 測定方法 |
|---|---|---|
| 1 | R5 実装 PR で docs/index.md 13 section header 全件が PASS | 実装 PR の CI ログで R5: 0 FAIL 確認 |
| 2 | 故意違反 PR (テスト用) で R5 が WARN/FAIL を発火 | テスト用 PR を作成 → CI fail → revert |
| 3 | 3 ヶ月後 (2026-08-22) の R5 違反検出件数 ≥ 1 件 (実害 catch) または false-positive 0 件 | GitHub Actions の docs-nav-lint workflow ログを 3 ヶ月分集計 |
| 4 | DOC-OPS-02 を docs/_internal/02_project/TODO_future.md §7 から close | TODO_future.md の該当 entry に「完了 (PR #NNN)」マーク |
| 5 | 手動 audit 撤廃の確認: handover §Step 4-b から「docs/index.md 整合性チェック」項目を削除 | sub workspace handover prompt の差分 |
| 6 | R5 を WARN → ERROR 昇格 (3 ヶ月運用後、false-positive 0 + true-positive ≥ 1 を満たす場合) | 昇格 PR の severity 変更 commit |
6.5 Confirmation (準拠確認 / Fitness Function)
- 検証手段:
scripts/docs-nav-lint.mjsの R5 ロジック + 既存.github/workflows/docs-nav-lint.ymlへの組み込み。.docs-nav-lint-allowlist.jsonのindex_md_section_special_cases配列サイズも同 lint で監視 (≤ 5 件超過時に WARN)。 - 実行頻度: PR ごと (
docs/index.mdまたはdocs/_config.json変更時にトリガ)、加えて main への push 時。 - 違反時の対応: ERROR なら PR マージブロック、WARN なら通知のみ。false-positive と判定なら
.docs-nav-lint-allowlist.jsonのindex_md_section_special_casesに regex 追加 (allowlist 上限 5 件超は ADR 再評価)。
撤退条件 (Rollback Plan)
- 3 ヶ月後 (2026-08-22): R5 違反検出件数 + false-positive 率を評価。false-positive が常態化 (allowlist 5 件超) なら revert PR で R5 削除 + DOC-OPS-02 を TODO_future.md §7 で再 open。
- 6 ヶ月後 (2026-11-22): 採用ツール (
docs-nav-lint.mjs) の総行数が 500 行超なら個別 rule 別ファイル分割を検討 (ADR-0054 §X5 パターン)。 - 撤退判断指標:
- false-positive 率 > 30% (常態化) → revert
- 3 ヶ月で違反検出 0 件 + 真の broken 0 件 → 「過剰防衛」と判断、WARN 維持 or 削除
docs-nav-lint.mjs維持コストが他 rule の 2 倍超 → 撤退
長期影響 / Review After
- Review After:
- 3 ヶ月後 (2026-08-22): WARN → ERROR 昇格判断、false-positive 率評価
- 6 ヶ月後 (2026-11-22):
docs-nav-lint.mjs総行数 / rule 数の肥大化評価 - 1 年後 (2027-05-22): ADR-0057
docs-link-check.mjsとの将来統合検討
- 負債化リスク:
- リスク 1: lint rule 群肥大化 (R1-R5 → 将来 R6-RN 追加で
docs-nav-lint.mjsが 500 行超過) → individual rule 別ファイル分割パターン (ADR-0054 §X5 で確立) への移行検討 - リスク 2:
docs/index.mdフォーマット規約の将来変更 (例: H2 → H3 への階層化、別ファイルへの TOC 切り出し) で R5 改修が必要 - リスク 3: ADR-0057 (docs-link-check.mjs) との将来統合 (
docs-lint-suite.mjsumbrella script、ADR-0057 §7.2 で言及済) で R5 も移行対象
- リスク 1: lint rule 群肥大化 (R1-R5 → 将来 R6-RN 追加で
参照 (References)
- 関連 ADR:
- ADR-0055 (Refines): NS prefix 形式の根拠、R4 の前例
- ADR-0051 (基盤): docs-nav-lint.mjs 全般、R1-R4 の SSoT 構造
- ADR-0031 (比較対照): Kruchten Type 遡及追加パターンと本件 (新規 rule) の Immutability 観点比較
- ADR-0057 (将来統合候補): docs-link-check.mjs、§7.2 で 3 ADR 統合可能性に言及
- ADR-0054 (パターン参照): §X5 個別 rule 別ファイル分割パターン
- 関連 PR/Issue:
- PR #877 (実問題発生事例):
docs/index.md13 section header 手動更新 (~30min) - PR #861/#862 (ADR-0055 実装): R4 の前例
- TODO_future.md §7 DOC-OPS-02 (本 ADR の起票元): 本 ADR Accepted 時に「完了 (PR #NNN)」マーク
- PR #877 (実問題発生事例):
- 外部資料: -
11. 参照: Pipeline 審査履歴 (2026-05-22 実行時, 通常 flow)
本セクションは Decision Pipeline (LangGraph TS on Cloudflare Workers) で本 ADR 草案を通常 flow (retroactive=false) で審査した結果のログ。v1 (53 行版) で 39/50 差し戻し → 8 採点項目に対応する改善反映 v2 → 49/50 で Standard 閾値 40 + Critical 閾値 45 双方クリア。ADR-0056 §8 / ADR-0058 §11 / ADR-0057 §8 で確立した §audit history パターンの 第四適用例 (本 ADR は ADR-0057/0058 と異なり通常 flow で auto-PR 生成された第一例)。デフォルトでは折りたたまれており、
▶をクリックで展開する。
📋 Pipeline 審査履歴 全 Gate 結果 (合格 Score 49 / 50, v1 39 → v2 49 +10 pt) — クリックで展開
Gate 0 Triage
- needsAdr: true / triageMode: Standard
- 理由: ADR-0055 拡張の新規 lint rule、78 files 影響、CI 整合自動化、可逆
Gate 1 Socratic
- pass: true (追加質問 0 件、v2 改善反映で context 十分)
Gate 2 Consistency: verdict PASS
- 既存 ADR との整合性 OK (ADR-0055 / 0051 / 0031 / 0057 / 0054 への参照を §9 で明示)
- ADR-0031 (Kruchten Type 遡及追加) との比較で「本件は機能追加につき別 ADR が筋」を §4 X2 K.O. で明示
Gate 3 Parallel Review
- 3 vendor (Gemini Flash / Claude Sonnet / GPT-4o) からの詳細指摘は §改善余地 に要約
Gate 4 Scoring: 49 / 50
| # | 採点項目 | 点数 | コメント |
|---|---|---|---|
| 1 | 問題定義 | 4 | PR #877 の ~30min は実測だが、年間 6-12 回/年は推定で実測サンプル 1 件のみ。session log proxy の集計手順・信頼区間が未明示で、痛みの規模感を後任が再検証しづらい。 |
| 2 | 代替案 | 5 | X1 (手動継続) / X2 (corrigendum) / X3 (AST) に加え実装方式 (A regex / B AST) まで網羅。K.O. 不通過理由も明示。 |
| 3 | 判断基準 | 5 | 5 軸 × 係数 (Must/High/Medium) + K.O. criterion + 加重和 + タイブレーク理由 (#maintainable で X3 を上回る) を明示。 |
| 4 | 過去ADR整合性 | 5 | ADR-0055 (Refines) / 0051 (基盤) / 0031 (比較対照) / 0057 (将来統合) / 0054 (パターン) を役割付きで参照、Immutability 原則も明示。 |
| 5 | 影響範囲 | 5 | 改修対象 (docs-nav-lint.mjs +30-50 行, allowlist +1 フィールド)、検証対象 (index.md 13 個, _config.json ~40 グループ)、ステークホルダー全特定。 |
| 6 | 運用上の罠 | 5 | allowlist 上限 5 件・超過時 ADR 再評価、フォーマット規約依存、500 行超過時の分割パターン、WARN→ERROR 昇格基準まで明示。 |
| 7 | ロールバック | 5 | revert PR で R5 削除 + DOC-OPS-02 を TODO_future.md §7 で再 open。撤退判断指標 3 件 (FP > 30%, 検出 0, 維持コスト 2 倍超) 明示。 |
| 8 | コスト試算 | 5 | 実装 2-3h / コード +30-50 行 / CI +1-3 秒 / 運用 1-2h/年 / 削減 2.5-5h/年 / ROI 6-12 ヶ月まで定量化。 |
| 9 | 完了条件 | 5 | 6 つの観測可能指標 + 測定方法、故意違反テスト PR 計画、handover 差分まで含む。 |
| 10 | 長期的影響 | 5 | Review After 3 段階 (3/6/12 ヶ月) + 負債化リスク 3 件 (rule 肥大化 / フォーマット変更 / ADR-0057 統合) + ADR-0054 §X5 移行パターン参照。 |
合計: 49 / 50 (Standard 閾値 40 / 50 → PASS, Critical 閾値 45 / 50 → PASS)
v1 (39/50) → v2 (49/50) 改善効果
| 項目 | v1 | v2 | 改善反映 |
|---|---|---|---|
| 問題定義 | 4 | 4 | proxy 実測 + 年間頻度 + 工数明示 (信頼区間は §1.3 本 PR で追加反映) |
| 代替案 | 4 | 5 | 実装方式 (A regex / B AST) + CI job 構成を sub-alternative として追加 |
| 影響範囲 | 4 | 5 | Decider + sub workspace audit のレビュアープロセス明示 |
| 運用罠 | 4 | 5 | index_md_section_special_cases allowlist フィールド設計を JSON 例示 |
| ロールバック | 4 | 5 | 撤退判断指標 3 つ + revert PR 計画 |
| コスト試算 | 2 | 5 | §7 新設: 工数 2-3h / +30-50 行 / CI +1-3 秒 / ROI 6-12 ヶ月 |
| 完了条件 | 3 | 5 | §8 新設: 6 観測指標 (初検証 PR / 3 ヶ月検出件数 / DOC-OPS-02 close / 手動 audit 撤廃確認 / WARN→ERROR 昇格) |
| 長期影響 | 4 | 5 | 3/6/12 ヶ月 Review After + 1 年先 lint 群肥大化 + ADR-0057 統合 |
v1 → v2 改善: +10 pt (39 → 49)。
改善余地 (本 PR で反映済)
| # | 指摘 | 反映先 | 効果 |
|---|---|---|---|
| 1 | §1.3 推定の信頼区間 + Jr 入社後の実測置換タイミング (2026-12 再評価) を補足 | §1.3 に「集計手順 (再現可能化)」「信頼区間 ±50%」「再評価タイミング 2026-12 (Jr 入社後 n≥5)」を追記 | 問題定義 4/5 → 5/5 見込 (満点) |
改善効果見込: 49/50 → 50/50 達成可能性。
Status 遷移
- v1 起案 (2026-05-22 KV 投入) → Pipeline 通常 flow 39/50 差し戻し
- v2 改善 (8 採点項目に対応) → Pipeline 再投入 → 49/50 通過 → auto-PR #904 生成 (Proposed)
- 本 PR で Status: Proposed → Accepted に更新、§1.3 改善余地 1 件を同時反映