markharness

0033: traceabilityは--at省略時に作業ツリーを読む

ステータス

Accepted(2026-09-16決定)。0032が導入したtraceabilityコマンドの入力ソースを拡張する。--atを省略可とする部分は、0043で--at自体を削除したため置き換えられた(作業ツリーを読むという決定は有効)。決定4のimpactを対象外とする部分は、0046でimpact --worktreeを追加したため置き換えられた。

背景

0032は、traceability・impact・coverageの3コマンドを、いずれも指定したGit ref時点のコミット内容だけを読む設計に揃えた。実装したtraceability --at <ref>(既定値HEAD)は、GitTreeKnowledgeSource経由でGitオブジェクトから読むため、対象refに最低1回のコミットが存在しないと動作しない(未コミットの空リポジトリではHEADが解決できずgit ls-treeが失敗する)。

これはmarkharness-viewの実際の利用シーンで不便であることが判明した。GUIやviewが、利用者がKnowledgeを編集している最中にリアルタイムで関係を表示しようとすると、変更のたびにコミットを要求するのは編集ループとして成立しない。

一方、impact・coverageにはこの制約を外す動機がない。

traceabilityには2点比較も監査要件もなく、「今のKnowledgeの関係を見る」という単純な問い合わせである。generate・verifyは既にWorkingTreeKnowledgeSource経由で作業ツリーを直接読んでおり、traceabilityだけがGit ref必須である理由は本質的にはない。

決定

1. --atはrequiredではなくoptionalにし、省略時は作業ツリーを読む

markharness traceabilityの--at <ref>を省略した場合、GitTreeKnowledgeSourceではなくWorkingTreeKnowledgeSource(generate・verifyと同じ経路)を使い、作業ツリーの現在の内容をそのまま読む。--at <ref>を指定した場合は、0032決定1のとおり従来通りGit ref時点を読む。

デフォルト値をHEADから「省略」に変える(--atにdefault_valueを設けない)。「省略時は作業ツリー」という振る舞いは、generate・verifyが既に確立している既存の直感と一致する。

2. 出力のatフィールドで読み取り元を区別できるようにする

作業ツリーを読んだ場合、atフィールドには固定文字列"working-tree"を格納する。Git ref指定時は、従来通り利用者が指定した文字列(解決前のref名)をそのまま格納する。これにより、出力を見るだけでどちらのソースを読んだ結果かが判別できる。

working-treeという値は、record_kindと同様「レコードの取り違えを防ぐための識別情報」の一種であり、Git refの値と衝突しない予約語として扱う(利用者がGit refにworking-treeという名前を付けた場合との衝突は、既存のHEAD等と同様、実用上のリスクとして許容する)。

3. Requirement・Featureの読み取りに作業ツリー版を追加する

現在のrequirements_at・features_at(src/traceability.rs)は、git::ls_tree_recursive/git::show_blob_by_shaによるGitオブジェクト読み取りのみを実装している。作業ツリー読み取りに対応するには、同等の内容をファイルシステムから直接読む実装を追加する必要がある。具体的な実装方法(関数を分けるか、KnowledgeSource同様の抽象化を導入するか)は、本ADRでは決定せず、実装フェーズの設計判断とする。

4. impact・coverageは対象外とする

両コマンドに作業ツリー読み取りへの対応を広げる具体的な必要性は、現時点で確認されていない(YAGNI)。将来必要になれば、その時点で別のADRとして扱う。

5. 出力契約(record_kind・schema_version・フィールド構成)は変更しない

本ADRは入力ソースの選択肢を増やすものであり、TraceabilityReadModelのフィールド構成自体には影響しない。

影響範囲

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