最終更新: 2026/06/22 18:56
frontmatter-meta-sync — ADR メタキーの frontmatter ⇔ 本文整合
上位 doc: §4 Summary Table in adr-lint_rules.md — Summary Table 集約参照
id: frontmatter-meta-sync
severity: error
category: metadata
since: 2026-06-11
status: active
fixable: true
description: frontmatter の ADR メタキー (mode/kruchten/scope/implementation_status/proposed_at/approved_at/deciders〔deprecated〕/approver_role/approver_who/driver/consulted/informed) は本文太字メタ欄と一致し、値は文字列のみ (YAML 配列禁止)。未宣言キーは対象外
related_adrs: [ADR-0137, ADR-0141]
Rationale
ADR-0137 Phase 1 で、ADR メタデータ 7 キーが本文太字メタ欄 (原本) から frontmatter へ複製された。Phase 2 (本文側の一括削除) までの二重保持期間は、片方だけ更新される drift が構造的に起こり得る。本ルールは status 1 キーのみだった drift 防御 (frontmatter-status-sync) を残り 7 キーへ拡張する。
あわせて 文字列型強制 (ADR-0137 §5.2・Confirmation d) を行う: 多値フィールド (deciders 等) を YAML 配列で書くと、カンマ区切り文字列を前提とする消費者 (adr-index / lint-rules の .trim()・文字列比較) で TypeError が連鎖するため、flow 配列 ([a, b]) とブロック配列 (値なし行 + - 項目) を禁止する。
frontmatter にキーが無い ADR は検査対象外とする。パイプライン生成直後の ADR と triage 起案前ゲートの synthetic draft は frontmatter メタを持たないため (生成側対応は Phase 2 / main 領分)。
❌ FAIL Example
---
mode: "Standard"
deciders: [[email protected], [email protected]]
---
# ADR-0150: ...
- **Mode**: Light
(mode が本文と不一致 = drift、deciders が YAML 配列 = 型違反 → FAIL)
✅ PASS Example
---
mode: "Standard"
implementation_status: "Done (2026-06-11 実装: X + Y)"
deciders: "[email protected], [email protected]"
---
# ADR-0150: ...
- **Mode**: Standard
- **Implementation Status**: Done (2026-06-11 実装: X + Y)
- **Deciders**: [email protected], [email protected]
値の書式: 全値 JSON 互換の二重引用符 (: や # を含む値の YAML パーサ差異を避ける)。比較は引用符を剥がした文字列の完全一致 (前後空白は無視)。
Migration / Corrigendum
- 導入時 (2026-06-11・Phase 1) に全 138 本へ機械 backfill 済み (901 値・存在する本文メタ行のみ複製) で 138/138 pass
- メタ更新 (Status flip / Implementation Status 更新等) は本文と frontmatter の両方を編集する (片方だけだと本ルールまたは frontmatter-status-sync が FAIL する = 意図どおり)
- 承認者体系の拡張 (ADR-0141・2026-06-12): 同期キーに
approver_role/approver_who/driver/consulted/informedを追加し、decidersを deprecated とした。本ルールは body↔frontmatter の同期のみを担う。値の意味検査 (approver 単一性・role enum・scope→role 整合) は ④ 受理 PR 層の adr-lint 別ルールが所有する (main 実装)。既存 ADR は新キー未宣言で対象外。deciders→4 欄の変換 (115 本) は ADR-0137 Phase 2 + 改訂時 touch-time で行い専用一括 PR は作らない - Phase 2 (本文太字メタ欄の一括削除) 完了時に本ルールは撤去される (ADR-0137 §決定)
References
- ADR-0137: メタデータ frontmatter 移行の 3 段階計画 (§5.2 文字列型の根拠・Confirmation d)
- frontmatter-status-sync: status キーの同型ルール (Phase 0)
- 読み出し実装:
scripts/lib/adr_meta.mjs(frontmatter 優先・本文フォールバック・ADR_LINT_FRONTMATTER_FIRST=falseで一括ロールバック)