上位 doc: §4 Summary Table in adr-lint_rules.md — Summary Table 集約参照

id: frontmatter-status-sync
severity: error
category: metadata
since: 2026-06-11
status: active
fixable: true
description: frontmatter に status が宣言されている ADR は、その値が本文太字メタ欄 Status の正規化値 (accepted/proposed/superseded/rejected) と一致する。未宣言は対象外
related_adrs: [ADR-0123, ADR-0131]

Rationale

2026-06-11 の common トリオ backfill (PR #1761) で全 ADR の frontmatter に status (本文太字メタ欄 Status の写し) が入った。原本は本文・frontmatter は写しという二重保持のため、片方だけ更新される drift が構造的に起こり得る。frontmatter は docs サイトのチップ表示・検索・将来の機械読みが参照するので、drift は誤分類として下流に伝播する。本ルールは「status を宣言するなら本文と一致」を CI で強制し、二重保持期間の安全弁となる。

frontmatter に status が無い ADR は検査対象外とする。パイプライン生成 ADR (webhook) はまだ common トリオを出力しないため、必須化すると生成 PR が毎回 fail する (PR #1722 で解消した定番後修正の再発)。必須化は webhook がトリオを生成するようになってから別途行う。

❌ FAIL Example

---
status: proposed
---
# ADR-0134: ...

- **Status**: Accepted (PR #1713 merge = 受理)

(本文は Accepted なのに frontmatter が proposed のまま = flip 漏れ → FAIL)

✅ PASS Example

---
status: accepted
---
# ADR-0134: ...

- **Status**: Accepted (PR #1713 merge = 受理)

正規化対応: Accepted (注釈...)accepted / Superseded by ADR-0120superseded / Proposedproposed / Rejectedrejected (大文字小文字無視・注釈は無視)。

Migration / Corrigendum

  • 導入時に全 134 本へ backfill 済み (本文 Status から機械導出・PR #1761) で 134/134 pass
  • Status flip (Proposed→Accepted 等) の際は本文と frontmatter の両方を更新する (片方だけだと本ルールが FAIL する = 意図どおり)

References

  • ADR-0123: frontmatter 3 層モデル (common 層 = id/type/status)
  • ADR-0131: §5.3「属性側の統合は将来の別決定」— 二重保持はその移行期間の暫定形であり、本ルールはその安全弁