Status: SSoT (ADR-0058 で確立、2026-05-22) 対象: docs/ 配下 7 ディレクトリ (78 files) の起案者・レビュアー・AI Agent (Claude / Gemini / GPT) 検証: scripts/adr-lint.mjs Phase 4 本体 + scripts/adr-lint-doc-consistency.mjs (本 doc ↔ code ↔ _meta/templates/ の 3 way 整合、Phase 2 で実装予定) 根拠 ADR:

  • ADR-0058 — frontmatter Lint Rule Reference SSoT 確立
  • ADR-0054 — 10 節構造の確立
  • ADR-0039 — frontmatter 起源 (Phase 4-b)

1. Purpose & Scope

本 doc は scripts/adr-lint.mjs:179-220 に実装された 全 4 frontmatter rule + 許容値 2 表 (types 19 種 / statuses 8 種) + type 層必須キー (ADR-0123) + Enforced Directories 8 件 の規約を 1 箇所に集約した Single Source of Truth (SSoT) である。ADR-0039 §移行計画 Phase 4-b に分散していた根拠を、Discovery (Summary Table) + Detail (各 rule 深掘り) + 許容値表の三層構造で集約する。

対象読者:

  • doc 起案者: docs/{domains,architecture,research,data,operations,_meta,_nav}/ 配下に新規 .md を追加する前に §4 Summary Table と §6 / §7 許容値表を読む
  • PR レビュアー: CI で fm-* rule が fail した時の rule 解釈根拠として参照
  • AI Agent: doc 起案・レビュー時に frontmatter 構造を機械判別する根拠
  • Jr 入社時 (2026-10): onboarding 主要参照先 (CLAUDE.md / git_workflow.md と並ぶドキュメント運用 SSoT)

Non-Goals: adr-lint.mjs 本体の autofix 実装 / 過去 ADR-0039 / ADR-0058 本文の書き換え (本 doc から過去 ADR への片方向参照リンクのみ追加、Immutability 遵守)。

2. Severity Legend

severity意味CI 挙動
errorPR マージブロック、起案者修正必須adr-lint.mjs --check-frontmatter exit 2 で fail
warn警告のみ、CI fail させない現状 4 rule すべて error、warn rule なし (将来追加分用)

3. Category Legend

category意味主な検証対象
validationfrontmatter の構文・必須キー・値域チェック--- ブロック存在 / id type status 必須 / type status の enum 値域

全 4 rule とも validation カテゴリ。将来 metadata (例: related: の link 存在検証) や structure (例: YAML インデント整合) 系 rule が追加された場合は本表を拡張する。

4. Summary Table (Discovery Layer)

#IDSeverityCategoryDescriptionRelated ADR
1fm-missingerrorvalidationfrontmatter (---) ブロックが冒頭に存在ADR-0039
2fm-requirederrorvalidation必須キー (id / type / status) が存在ADR-0039
3fm-type-enumerrorvalidationtype 値が ALLOWED_TYPES (19 種、§6) に含まれるADR-0039
4fm-status-enumerrorvalidationstatus 値が ALLOWED_STATUSES (8 種、§7) に含まれるADR-0039
5fm-type-required-keyerrorvalidationtype 層の必須キー (§6.1) が存在 (operator-prompt 等)ADR-0123
6fm-dir-type-matrixwarnstructureディレクトリ×type マトリクス (schema.dirTypeMatrix、現 Phase 空)ADR-0123

集計: error 5 件 / warn 1 件 / 対象: 7 既存ディレクトリ + decision_pipeline/ (§8 参照、_meta/templates/ は lint 対象外)。type 層 3 層モデルは ADR-0123 で追加。

5. Validation Rules (Detail)

5.1 fm-missing

id: fm-missing
severity: error
category: validation
since: 2026-05-14  # ADR-0039 採択日
status: active
fixable: false
description: frontmatter (---) ブロックが冒頭に存在
related_adrs: [ADR-0039, ADR-0058]

Rationale

ENFORCED_FRONTMATTER_DIRS (§8) 配下の .md は冒頭に YAML --- ブロックが必須。これにより AI Agent が doc 種別 (type) と運用状態 (status) を機械判別でき、人間レビュー前の自動振り分け・検索・分類が可能になる。違反すると AI Agent が doc 性格を読み取れず、検索 index 構築や related: 逆引きが破壊される。

❌ FAIL Example

# 仕様書タイトル

本文...

✅ PASS Example

---
id: spec-feature-x
type: spec
status: active
---

# 仕様書タイトル

References

  • ADR-0039 §移行計画 Phase 4-b: frontmatter 必須化 (line 124)
  • scripts/adr-lint.mjs:208: 実装本体 (if (!fm) return [{ rule: 'fm-missing', ... }])
  • 起源: arc42 + MADR ハイブリッド構造の機械判別要件 (ADR-0039 §決定)

5.2 fm-required

id: fm-required
severity: error
category: validation
since: 2026-05-14
status: active
fixable: false
description: 必須キー id / type / status が存在
related_adrs: [ADR-0039, ADR-0058]

Rationale

frontmatter ブロック内に id / type / status の 3 キーが必須。id は doc 内部参照と link rewriting の anchor、type は AI Agent の自動分類根拠、status は廃止 doc の検索除外に使用する。1 つでも欠けると Site Generator (scripts/docs-build.mjs) の nav 整合性 check や related: 逆引きが破綻する。任意フィールド (related / audience / legacy_id / date) は本 rule の対象外。

❌ FAIL Example

---
type: spec
status: active
---

# id 欠落
---
id: spec-x
status: active
---

# type 欠落

✅ PASS Example

---
id: spec-feature-x
type: spec
status: active
related:
  - ../../adr/0042-...md
legacy_id: ""
---

References

  • ADR-0039 §75: 「全ファイルに id / type / status / related / legacy_id を含む frontmatter を必須化」
  • scripts/adr-lint.mjs:209-211: 実装本体 (for (const key of ['id', 'type', 'status']) { if (!fm[key]) errs.push(...) })

5.3 fm-type-enum

id: fm-type-enum
severity: error
category: validation
since: 2026-05-14
status: active
fixable: false
description: type 値が ALLOWED_TYPES (19 種、§6) に含まれる
related_adrs: [ADR-0039, ADR-0058, ADR-0123]

Rationale

type 値は §6 Allowed Types Reference の 19 種に限定される。任意値を許すと AI Agent が「research-foo」「spec-v2」のような表記揺れ造語を作り、type: フィルタ検索が機能しなくなる。新 type 追加は schema + doc 同時更新 (scripts/frontmatter-schema.jsonallowedTypes + 本 doc §6 表 + 該当する _meta/templates/*.md) を必須とし、scripts/adr-lint-doc-consistency.mjs の 3 way CI で機械強制する (ADR-0123: SSoT は schema へ移行)。

❌ FAIL Example

---
id: spec-x
type: specification   # spec ではなく specification
status: active
---
---
id: research-x
type: invalid-type   # ALLOWED_TYPES に未登録 (架空の値)
status: active
---

✅ PASS Example

---
id: spec-x
type: spec       # §6 #1
status: active
---

References

  • ADR-0039 §移行計画: type 区分
  • scripts/frontmatter-schema.json allowedTypes: 定義本体 (19 種、SSoT・ADR-0123)
  • scripts/adr-lint.mjs checkFrontmatter: 実装本体 (if (fm.type && !ALLOWED_TYPES.has(fm.type)) errs.push(...))
  • §6 Allowed Types Reference: 19 種の意味と主な配置先

5.4 fm-status-enum

id: fm-status-enum
severity: error
category: validation
since: 2026-05-14
status: active
fixable: false
description: status 値が ALLOWED_STATUSES (8 種、§7) に含まれる
related_adrs: [ADR-0039, ADR-0058, ADR-0123]

Rationale

status 値は §7 Allowed Statuses Reference の 8 種 (active / deprecated / superseded / draft / proposed / archived / accepted / ready-to-execute) に限定される。任意値を許すと「廃止」「old」「working」のような表記揺れが発生し、検索 index で「現役 doc のみ」を絞り込めなくなる。deprecated (非推奨だが残置) と superseded (後継 doc に置換) の使い分けは ADR-0039 の運用方針に従う。

❌ FAIL Example

---
id: spec-x
type: spec
status: unknown-state    # ALLOWED_STATUSES に未登録 (架空の値)
---
---
id: spec-x
type: spec
status: deprecate   # ALLOWED_STATUSES の表記揺れ (架空の値)
---

✅ PASS Example

---
id: spec-x
type: spec
status: active      # §7 #1
---
---
id: spec-x-old
type: spec
status: superseded  # 後継 doc に置換済 (related: で後継を指す)
---

References

  • ADR-0039: status 区分
  • scripts/frontmatter-schema.json allowedStatuses: 定義本体 (8 種、SSoT・ADR-0123)
  • scripts/adr-lint.mjs checkFrontmatter: 実装本体 (if (fm.status && !ALLOWED_STATUSES.has(fm.status)) errs.push(...))
  • §7 Allowed Statuses Reference: 8 種の意味

6. Allowed Types Reference

ALLOWED_TYPES (19 種、SSoT=scripts/frontmatter-schema.json allowedTypes):

#TypeDescription主な配置先
1spec仕様書docs/domains/<feature>/current-spec.md, docs/architecture/spec_*.md
2research外部調査結果docs/research/ (将来用、現状 0 files)
3ops運用ドキュメントdocs/operations/
4how-to手順書docs/_internal/05_how-to/
5tracking進捗管理docs/_internal/02_project/
6workflowワークフロー定義docs/_internal/05_how-to/git_workflow.md
7runbookインシデント手順docs/operations/runbooks/
8policyポリシー文書docs/_internal/biz/
9promptプロンプトdocs/_internal/01_discovery/research_prompts/
10setupセットアップガイドdocs/_internal/05_how-to/hooks_setup.md
11dataデータ定義docs/data/
12itgcJ-SOX 証跡docs/operations/itgc/
13adrアーキテクチャ決定記録docs/adr/ (本体)
14research-synthesis3 モデル並列調査の Synthesis (ADR-0050 標準テンプレ)docs/_internal/01_discovery/research_prompts/RQ-NNN_*_synthesis.md, _meta/templates/synthesis.md
15research-resultDeep Research per-model 出力 (synthesis の前段、各 provider の結果)docs/research/rq-NNN-result-{claude,openai,gemini}.md
16operator-promptDRP 操作手順プロンプト (KV 投入・審査実行・遡及検証等)docs/_internal/03_decisions/decision_pipeline/*_prompt.md
17implementation-prompt実装指示プロンプト (main workspace 向け)decision_pipeline/*_implementation_prompt.md
18validation-reportADR 遡及検証 / Gate4 検証レポートdecision_pipeline/ADR-*_validation*.md
19reference外部規範・調査を統合した参照正典 (要件カタログ・原則集。既存使用 4 files を 2026-06-12 に追認)docs/_internal/05_how-to/adr_*_requirements.md, adr_structure_pyramid_principle.md

新 type 追加時の手順 (3 way 整合必須):

  1. scripts/frontmatter-schema.jsonallowedTypes に追加 (SSoT・ADR-0123)
  2. 本表 §6 に行を追加 (#, Type, Description, 主な配置先)
  3. type 層必須キーがあれば frontmatter-schema.jsontypeRequiredKeys に定義 + §6.1 に追記
  4. 該当する _meta/templates/*.md のテンプレートを追加 or 既存テンプレの type: 値を整合
  5. scripts/adr-lint-doc-consistency.mjs の 3 way CI が schema ↔ doc §6 ↔ templates 整合を検証

6.1 Type 層必須キー (ADR-0123 3 層モデル)

scripts/frontmatter-schema.jsontypeRequiredKeys。common 層 (id/type/status) に加え、以下の type は固有キーが error で必須 (fm-type-required-key):

Type必須キー
operator-prompttarget_session / target_endpoint / date
implementation-prompttarget_session / target_repo / date / adr / adr_status
validation-reporttarget_adr / draft_id / verdict / date

その他の type (spec / how-to / prompt / setup / policy 等) は common のみで type 層追加なし。ディレクトリ×type マトリクス検証は現 Phase では warn (fm-dir-type-matrix)、強制化は Phase 2 候補。

7. Allowed Statuses Reference

ALLOWED_STATUSES (9 種、SSoT=scripts/frontmatter-schema.json allowedStatuses):

#Status意味使用タイミング
1active現役運用中通常運用の doc
2deprecated非推奨だが残置新規参照は避けるが、過去 link 維持のため削除しない
3superseded後継 doc に置換済related: で後継 doc を指す (link を辿れば移行先が見つかる)
4draft起案中レビュー前・実装前の暫定 doc
5proposed起案中・承認待ちSynthesis (3 モデル並列調査結果) で ADR 承認前の段階 (ADR-0050 標準テンプレ)
6archivedアーカイブ済 (運用終了・履歴保持)完了した operator-prompt 等。上書き禁止 + change_log 必須 (ADR-0123 §9)
7accepted受理済 (決定確定)MVP exit 記録等、代表取締役が確定した文書
8ready-to-execute実行準備完了内容確定済で実行待ち。未完成の draft とは別: draft=レビュー前の暫定、ready-to-execute=確定済で着手待ち (ADR-0123 盲点 #3)
9umbrellaumbrella ADR (読み取り専用化済)ADR-0152 で構造改訂され子 ADR に責務分割された ADR (例 ADR-0028)。本文編集は CI (umbrella-readonly) で機械的に拒否される (ADR-0152 KPI 4)

: ADR 本体の ## Status セクション (Proposed / Accepted / Rejected / Superseded / Umbrella) とは別軸 (frontmatter は小文字、ADR 本体は Capitalize)。frontmatter の status: は doc 運用ライフサイクルを表し、ADR 自体の決定ライフサイクル (MADR) とは独立だが、proposed / umbrella は ADR Status と意味が重なる (ADR-0050 / ADR-0152 由来の運用整合)。

audience任意フィールドであり lint 強制対象外(§5.2 / commonRequiredid/type/status のみ・scripts/frontmatter-schema.json に audience 不在)。下記は「値を書く場合の推奨値域」であって、欠落は違反ではない。

ADR-0045 ↔ ADR-0123 の整合: ADR-0045 §1.5 は type/status/audience の3点必須化を目標としたが、後発の ADR-0123 が common 必須トリオを id/type/status に確定し、audience 必須化(案C)を明示的に却下(保有34/63で必須化は29件の追加 backfill + 既存7ディレクトリの強制トリオと乖離)。したがって frontmatter モデルの現行正典は ADR-0123であり、audience は「推奨・任意」に確定(2026-06-09 doc セッションで再確認・確定)。

ADR-0129 による役目の限定(読み分け用途は終了): エージェント設定(CLAUDE.md / .claude/rules/)の読み分けでは audience frontmatter は役目を終えた。読み分けの正式手段はファイル配置と path-scoped rules(paths glob)(ADR-0129 が決定・ADR-0123 の該当用途を supersede)。audience 値そのものは引き続き人間向けドキュメントの読者明示(および将来の RAG メタデータ用途)として有効で、本節の推奨値域はその用途に対する規約。

推奨値域(3値):

意味主な対象
both人間・AI Agent 双方が読む(既定・迷ったらこれ)大半の how-to / spec / policy
agentAI Agent が主対象実行プロンプト(operator-prompt / implementation-prompt)等
human人間読者が主対象オンボーディング・ナラティブな背景説明・非エンジニア向け

実 frontmatter の audience 値(2026-06-09 実測・frontmatter ブロック内のみ集計): both(98) / agent(25) / human(3) / non-engineer(1)。表記揺れは実質 1 件のみ。

正規化(実対象 1 件):

現状値対象
non-engineerhumanREADME_easy.md(DRP 非エンジニア向け・2026-06-09 適用済)

訂正(2026-06-09): 本節初版は RQ-045/046 の研究結果ファイル本文(human \| agent \| both / [solo, jr, agent, auditor] / developer \| operator \| future-self / internal 等、audience enum を論じた本文)を frontmatter と誤検出し「7 件の outlier」と記載していた。当該ファイルはそもそも frontmatter を持たず(2026-06-09 の Phase 2 backfill で id/type/status を付与・本文は不変)、実 frontmatter の audience outlier は non-engineer の 1 件のみだった。

audience に main/doc(ワークスペース役割)を入れない: 「doc はこの doc を読み飛ばし可」という役割別の読み分けは human/agent とは別軸であり、ディレクトリ所有(workspace_rules.md ファイルマトリクス)と nested CLAUDE.md で扱う(ADR-0045 Phase 2 handover item 5)。これは上記 ADR-0129 の決定(読み分けはファイル配置と paths が正式手段)と同じ方向で、エージェント向けの読み分けを audience frontmatter に背負わせない。audience を main/doc に転用すると既存 ~128 件の全 backfill が発生し ADR-0123 の「audience=任意」とも衝突する。

将来 lint で値検証したくなったら(任意・main 領分): scripts/frontmatter-schema.jsonallowedAudiences: ["both","agent","human"] を追加し、adr-lint.mjs で「audience が存在する場合のみ enum 検査」する optional rule を足す(presence は引き続き非必須)。scripts/ は doc read-only のため main 申し送り。

8. Enforced Directories

scripts/adr-lint.mjs ENFORCED_FRONTMATTER_DIRS (8 ディレクトリ):

#ディレクトリ用途
1docs/domains/feature-folder 仕様 (current-spec.md 中心)
2docs/architecture/arc42 章構造 (spec_*.md / building-block_*.md)
3docs/research/外部調査
4docs/data/データ定義書 (data_def_index.md 系)
5docs/operations/運用ドキュメント + ITGC
6docs/_meta/テンプレート + メタ情報
7docs/_nav/ナビ補助
8docs/_internal/03_decisions/decision_pipeline/DRP 文書 (ADR-0123・3 層モデル・type 層必須キーも強制)

lint 対象外: _meta/templates/*.md は除外 (!f.includes('/templates/'))。テンプレートは adr-lint-doc-consistency.mjs 3 way 整合 check で別軸検証。

lint 適用外ディレクトリ: docs/adr/ (別の 14 rule で検証) / docs/_internal/ の DRP 以外 (frontmatter 規約緩和の暫定領域、_internal/ 全体の強制は ADR-0123 Phase 2 候補)。

9. Legacy / Deprecated

該当 rule なし。本 doc 起案時点 (2026-05-22) で全 4 rule が status: active。Deprecated 化された rule が出た場合は本節に「deprecated 日付」「代替 rule への移行手順」「最終削除予定日」を記載する。

既知の 3 way 整合 follow-up (Phase 2 で対応済)

Phase 1 起案時、_meta/templates/synthesis.md の frontmatter が以下の ALLOWED_TYPES / STATUSES 外の値を使用していた:

  • type: research-synthesis ← ALLOWED_TYPES (13 種) に未登録
  • status: proposed ← ALLOWED_STATUSES (4 種) に未登録

Phase 2 で採択した方針 (案 a): ALLOWED_TYPES を 14 種に、ALLOWED_STATUSES を 5 種に拡張 (ADR-0050 標準 Synthesis テンプレを既存値域として正規化)。synthesis テンプレ・RQ-050/051/052 既存 synthesis 3 件は変更せず、code と doc 側を拡張。3 way 整合 CI (scripts/adr-lint-doc-consistency.mjs) が以降ガード。

10. Changelog

日付変更内容PR
2026-05-22v1.0 初版 — 10 節構造 + 4 rule Detail (YAML + Rationale + FAIL + PASS + References) + 許容値 2 表 + Enforced Directories + 既知 follow-up#906
2026-05-22v1.1 Phase 2 (案 a ALLOWED 拡張) — research-synthesis を §6 に、proposed を §7 に追加 (ADR-0050 Synthesis テンプレ整合)。§5.3 / §5.4 の FAIL Example を真の架空値 (invalid-type / unknown-state) に置換。§9 follow-up を解消済 marker に更新。3 way 整合 CI (adr-lint-doc-consistency.mjs) で機械強制#906
2026-06-09§7.1 追加 — 推奨 audience 値域 (both/agent/human・任意・非強制) を確定し正規化マッピングを定義。ADR-0045 (audience 必須) ↔ ADR-0123 (audience 任意) 衝突を ADR-0123 正典で整合。main/sub は audience 軸でない旨を明記 (ADR-0045 Phase 2)#1591
2026-06-09§7.1 訂正 — 初版の「7件 outlier」は RQ-045/046 研究結果本文の誤検出と判明。実 frontmatter outlier は non-engineer(README_easy) 1件のみに訂正。あわせて _internal frontmatter 欠落 121本へ id/type/status を backfill (Phase 2 #2)(本 PR)