markharness

0026: 既存モジュールの棚卸し結果とplanの廃止、および後方互換を考えない方針

ステータス

Accepted(2026-09-11決定、2026-09-12実装完了。checklist-v2-core.md参照)。markharness-v2-design.md§9が「棚卸し対象」「要判断」として保留していたモジュールの帰結を確定する。あわせて00190025の実装にあたり、後方互換を一切考えないことを明文化する。

背景

markharness-v2-design.md§9は、src/verify.rssrc/audit_scope.rssrc/derived_index.rssrc/lineage.rsを「棚卸し対象(本書では未分類)」、src/milestone.rssrc/backfill.rsを「要判断」、src/canonical.rsを「見直し」として、M0着手時に判定することとしていた。

2026-09-11の実装前grillingセッションで、各モジュールの実際の呼び出し関係を計測した。その結果、設計書および0021の前提の一部が事実と異なること、および削除の可否がモジュールごとに大きく異なることが判明した。

決定

1. planを廃止する

src/plan.rsmarkharness planサブコマンド、src/application.rssrc/presentation.rsのplan経路(CommandOutcome::PlanBuiltplan_exit_codebuild_verification_plan_value等)、tests/plan_domain.rstests/plan_cli.rsを削除する。

0020がEvidence適用可能性の厳密な突合を不要とした結果、planに残る機能は「TestCaseにExecutionBindingがあるか」を返すことだけになる。これはmarkharness-v2-design.md§6.2のcoverageが返す情報の部分集合であり、二つのサブコマンドで同じ問いに答える状態になる。縮小して残すより廃止するほうが小さい。

2. src/canonical.rsimport専用に縮小する

markharness import(native/JUnit)は維持する。0020が否定したのは証跡の保存・管理であり、外部テスト結果の取込経路そのものではない。CanonicalEvidenceEvidenceResultRelationOriginKindのうちplan専用の型は§1の削除に伴って削除する。

StrictDoc取込を将来追加する場合は、markharness-v2-design.md§9のとおり別Adapterとして設計する。本ADRはその設計を先取りしない。

3. src/derived_index.rsmarkharness cache indexを廃止する

derived_index.rsplan::BoundVersionsexecution::read_all_resultsを入力とする。§1でplan.rsが削除され、execution.rs0025ExecutionBindingへ置換されるため、入力の両方が失われる。.markharness-cache/index/の派生インデックスはChange Impact・Release Coverageの算出経路に登場せず、CLI統合テストも存在しない。

4. src/lineage.rssrc/milestone.rsは維持する

両モジュールはsrc/changes.rsから内部利用されている。changes.rslineage::classifyでmerge commitの親関係を分類し、milestone::verify_audit_matches_tagをfail-closedゲートとして呼ぶ。changes.rsmarkharness-v2-design.md§6.1でChange Impactの基盤として維持されるため、両モジュールを削除するとchanges computebackfill runがコンパイル不能になる。

CLIサブコマンドchanges lineagemilestone initも維持する。milestone initが作る.markharness/executions/<tag>/milestone.yml0020が廃止する実行記録とは別物(schema versionの監査コピー)であり、changes computeのゲートの入力である。CLIを削除するとこの入力を人が用意できなくなる。

5. src/verify.rssrc/backfill.rssrc/audit_scope.rsは維持する

verify.rs(生成物とコミット済み生成物の差分検査)とbackfill.rs(過去milestone間のChangeEvent一括計算)は、逆向きの依存を持たず単独で削除できる。しかし00190025のいずれとも衝突せず、削除する積極的な理由が無い。CLAUDE.mdのYAGNI原則は「要求されていない実装を足さない」ことを求めるものであり、既に動作し衝突しないコードを削除する根拠にはならない。

audit_scope.rs(62行)はidentity migrate --jsonidentity audit --jsonchanges compute --jsonの出力に含まれるaudit_scopeフィールドの型であり、0013の検証規則が定める出力契約の一部である。

6. execution::iso8601_utc_nowsrc/time.rsへ移設する

この関数はsrc/identity/feature_ops.rssrc/identity/migration_manifest.rsから利用されている。0025§1によりExecutionBindingは実行日時を持たないため、時刻生成関数がexecutionモジュールに残ると「ExecutionBindingは日時を持たないのにexecutionが時刻関数を公開している」という、読み手を誤らせる構造になる。identity eventは日時を持ち続けるため関数自体は必要であり、責務に対応する位置へ移す。

7. 後方互換を一切考えない

00190025の実装において、過去のスキーマ・データは最初から存在しなかったものとして扱う。互換コード、移行コード、旧データを名指しする診断、スキーマ版の引き上げは実装しない。これはCLAUDE.mdの設計ルール(「後方互換性を想定せず互換のための設計は排除し、常に最善のプロダクトを目指す」)の適用であり、markharness-v2-design.md旧§9.1が定めていた「廃止したevent種別を含むログを診断付きで拒否する」規定を置き換える。

帰結は次の通り。

8. 0021影響範囲節の記述は実測と異なる

0021「影響範囲」節は、retire/restore/release/reissueの縮小対象をsrc/identity/recovery.rs(742行)・src/identity/audit.rs(816行)としている。2026-09-11の実測ではこれは誤りであり、実際の対象は次の通りである。

recovery.rslock.rsに現れるreleaseIdentityLockのファイルロック解放であり、ID予約解除とは無関係である。audit.rsにはretire/restore/release/reissueの語が一度も出現しない。

0021決定内容(何を廃止するか)は正しく、誤っているのは影響範囲の見積もりのみであるため、決定の効力は変わらない。release-and-license instructionsのADR運用方針に従い、0021本文は歴史的決定記録として書き換えず、訂正を本ADRに記録する。markharness-v2-design.md§9は現在の計画を表す生きた文書であるため、そちらは訂正する。

影響範囲

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