markharness

0023: Requirementの正本をnative/externalの二モードにする

ステータス

Accepted(2026-09-11決定、2026-09-12実装完了。checklist-v2-core.md参照)。0017§1・§3が定めるnative Requirement(Feature⇄Requirementの多対多関連、Feature側が関係の正本)を維持したうえで、正本を外部仕様書に置くモードを追加する。

背景

markharness-v2-design.mdの再検討(2026-09-11)では、仕様(Requirement)の正本をStrictDoc(.sdoc、Git管理)に置き、markharnessは固定参照(source_locator/source_revision)だけを保持する方針を確定した。しかし、この方針をrequirement.ymlの唯一の形として実装すると次の問題が生じる。

  1. StrictDocを導入していない運用でmarkharnessが使えなくなる。 North Starの4問(影響確認・修正漏れ検知・過去の検証スコープ確認・リリース影響判断)は、いずれも外部仕様書の存在を前提としていない。
  2. MVPの期間中、固定参照が実質的に機能しない。 .sdocの取込・解析は同設計書のM3(将来)であり、M0〜M2では外部要件の実体を読まない。参照先が存在しないままsource_locatorを必須にすると、「誰も読まないファイルのblob OIDを固定するだけ」の状態になる。
  3. 現行実装と現在の利用形態がnative前提である。 knowledge/requirements/<id>/requirement.ymllabel/description/axisとUIDを持つnative実体であり(src/knowledge.rs)、本リポジトリ自身を含め、StrictDocを併用していない利用が存在する。

決定

1. requirement.ymlsourceを持たせる

source: native | externalを追加し、省略時はnativeとみなす。

2. nativeモード

label(必須)・description(任意)をmarkharnessが正本として保持する。source_locator/source_revisionは書けない。仕様側の変更検知はrequirement.yml自体のbase/head差分で行う(粒度はRequirement単位であり、外部ツールを必要としない)。

3. externalモード

source_locator(markharnessと同一Gitリポジトリ内の.sdocパス)とsource_revision(固定したGit blob OID)が必須。label/descriptionは持てない(外部正本の複製禁止、markharness-v2-design.mdのP1)。仕様側の変更検知はsource_locatorが指す.sdoc blobのbase/head差分で行う。固定参照とheadのblob OIDの不一致はstale pinとして別に算出する。repinは仕様変更を打ち消さず、対応確認の代替にもならない(同設計書§6.1)。2026-09-11のレビュー修正により、従来の固定参照対headを変更検知に用いる規則を本規則へ訂正する。

4. 混在は拒否する

両モードのフィールドを併せ持つ、あるいはどちらのモードとしても不完全なrequirement.ymlvalidateで拒否する。

5. axisは両モードで保持する

axisはmarkharness自身の分類であり、外部正本の複製ではないため、externalモードでも保持する。

影響範囲

検討したが採用しない選択肢