impact --worktreeでHEADと作業ツリーの未コミット変更を比較するAccepted(2026-10-12決定)。0033の決定4のうち、impactを作業ツリー対応の対象外とする部分を置き換える(coverageは対象外のまま)。決定2(未追跡のファイルを対象外とする)と決定3のgit add -uは、0047が置き換える。
impactは、--baseと--headをGit refとして解決し、要求・Feature・TestCaseをそのrefのツリーから読む。そのため、要求やFeatureを編集している最中に「この変更がどの要求とTestCaseに影響するか」を確かめるには、いったんコミットする必要があった。0033決定4は「2点比較に未コミット状態を混ぜる動機が確認されていない(YAGNI)」としてimpactを対象外にしたが、コミット前に影響を確かめたいという要求(Issue #129)が、その動機にあたる。
impact --worktreeを追加する--worktreeは、HEADを基準とし、HEADから作業ツリーまでの未コミット変更に基づいて影響を分析する。--base・--head・--fail-on-findingsのいずれとも併用できない(clapのconflicts_with)。基準をHEAD固定とするのは、任意のrefとの比較はコミットすれば既存の--base/--headでできるためで、「任意のrefから作業ツリー」は動機が確認されていないので扱わない(YAGNI)。
ステージ済みの変更と未ステージの変更を区別せず、追跡されているファイルの作業ツリー上の現在の内容を対象にする。削除も反映する。git addしたが未コミットの新規ファイルは追跡対象として扱う。未追跡のファイルは対象外で、git addすると結果に現れる。この制約はcli-manualとコマンドのhelpに明記する。
実インデックスのコピーをGIT_INDEX_FILEに指定し、git add -u、git write-treeの順に実行して、作業ツリーに対応するツリーOIDを得る。このOIDを既存のref向けの処理(ls-tree、blob SHAの比較、id_cacheのtree SHA比較、GitTreeKnowledgeSource)にそのまま渡す。コミット間のimpactと、差分と識別子の意味が同一になる。実インデックスとHEADは変更しない。
副作用は、git add -uが書き込むblobがオブジェクトDBに増えることである。HEADと同じ内容のファイルは既存のblobと同一ハッシュなので増えず、増えるのは編集中のファイルの分だけである。見積もりは1回あたり数十KB〜数百KBで、繰り返し実行しても参照されないblobはgit gcが回収する。無視できる量と判断した。
record_kindで区別するrecord_kindはchange_impact_worktreeとする。schema_versionは全種別で1に固定されており、版では分岐しない(markharness-v2-design.md§9.2.2)。フィールド構成はchange_impactと同一にして、受け取る側が同じパーサーで読めるようにする。値だけが次のとおり異なる。
base_commit: HEADのコミットOID。head_commit: 固定文字列"worktree"。コミットOIDではない。作業ツリーに対応するコミットは存在しないため、OIDを装わない。rejected_trailers: 常に空配列。record_kindが異なるので、change_impactを想定した利用側が暫定結果を正式な結果として取り込む事故を防げる。作業ツリーは変わり続けるため、同じ入力で同じ結果を返すというコミット間のimpactの性質(AC37)はこの結果には成り立たない。
Spec-Reviewedは数えない範囲HEAD..作業ツリーの間にコミットが無いため、確認の記録(Spec-Reviewedトレーラー)は数えられない。判定はfollowed_upとunconfirmedの2つになり、confirmedは出ない。そのため、変更に触れた要求がある限り--fail-on-findingsは常に終了コード2になるので、併用を拒否する(決定1)。
HEADのコミットだけを使い、コミット範囲を辿らない。そのため、浅いクローンの検査はしない。HEADが存在しない(最初のコミット前の)リポジトリでは、比較する基準がないのでエラーで終了する。
src/impact.rs: compute_worktreeを追加し、computeと共通の分析部分をanalyzeとして抽出src/git.rs: 追跡ファイルだけを対象にする一時インデックスのwrite_tree_of_tracked_worktreeを追加src/cli.rs: impactに--worktreeを追加、--worktree指定時は--base・--headを不要にするtests/impact_cli.rs: ステージ済み・未ステージ・未追跡・実インデックス不変・併用拒否・浅いクローン・HEADなしのテストdocs/ja/cli-manual.md・docs/en/cli-manual.md(§1.13)、docs/ja/design/cli-read-model-design.md・docs/en/design/cli-read-model-design.md、docs/ja/design/markharness-v2-design.md・docs/en/design/markharness-v2-design.md(§9.2.2のrecord_kind一覧)impactを実行する): 一時的なコミットを作って戻す運用になり、履歴を汚すか後始末の手間が要る。WorkingTreeKnowledgeSourceのようにファイルシステムから直接読む: impactが使うid_cacheのtree SHA比較、changed_between、blob_sha_atを作業ツリー版として書き直す必要がある。差分の意味がコミット間と食い違うリスクもある。.gitignoreとの整合を決める必要があり、初期実装の範囲を超える。必要になった時点で別に扱う。git addの有無で結果が変わるため採らない。record_kindは変えずprovisional項目を足す: 項目を見ない利用側が暫定結果を正式な結果として扱う。markharness-v2-design.md§9.2.2の「将来必要そうなフィールドをoptionalとして足さない」にも沿わない。head_commitを持たない別の構造体にする: 同じ内容を出力するのに型を分けると、受け取る側のパーサーが2つになる。--fail-on-findingsの意味を再定義して許可する: 暫定結果をCIで判定する動機は確認されていない。changes compute --current-treeで代用する: 出力の単位がFeatureで、要求との対応と判定が無い。