markharness

ChangeEvent連動:実行状態追跡(Verification Status Tracking)仕様書

Status: Implemented(markharness verify trace / markharness verify pending) 関連ドキュメント: テスト知識管理のGit-nativeモデル_統合版.md(以下「統合版」)、gap-analysis-mh-sample-test-case.md 対象読者markharness(またはその後継ツール)の実装者

位置づけ:本資料は統合版第3.5節・図4が構想する「ChangeEventを起点とした影響TestCase特定→再確認」のうち、実行結果側との連動を具体化するための追加仕様である。統合版はChangeEventの自動生成とimpacted_testcasesの特定までを核心的貢献としており、「その後、実際に再実行されたか」を自動判定する仕組みは第7章(Future Work)相当の未確定領域だった。本資料はこの領域を仕様化する。


1. 解決したい問題

現状(MMフォルダの実装)で自動的に答えられない、しかし運用上は必ず聞かれる2つの問いを解決する。

現行実装では、executions/<milestone>/results.ymlcase_id / result / executor / executed_atのみを保持し、changes/<from>-<to>.yamlのimpacted_testcasesとの突き合わせは人間が目視で行っている。この突合を自動化する。


2. データモデル拡張

2.1 TESTEXECUTIONへのフィールド追加

統合版のER図(第3.1節)におけるTESTEXECUTIONに、以下を追加する。

# executions/<milestone>/results.yml の1レコード
case_id: tc-edit-existing-todo-001
result: pass
executor: soreiyu52
executed_at: 2026-08-08T16:38:52Z
verified_feature_tree_shas:        # 追加フィールド
  todo-edit: 4f2c9a1e8b3d5670012ab34cd56ef7890a1b2c3

2.2 TESTCASEのgenerated_fromは既存のまま利用

generated/testcases/*.ymlgenerated_from.feature(例:todo-edit)は既にFeature idを保持しているため、verified_feature_tree_shasのキーとして流用できる。スキーマ変更は不要。

2.3 ChangeEventへのresolved状態は持たせない

ChangeEvent(changes/*.yaml)自体に「再確認済みフラグ」を持たせる設計は採らない。理由:

2.4 impacted_testcasesの再計算モード(--historical既定 / --current-tree

changes computeが書き出すChangeEvent.impacted_testcasesは、2026-08時点で2つのモードを持つ。

本節2.1のverified_feature_tree_shasとの突合(第3.2節Q2)は、changes/*.yamlに書き出されたimpacted_testcasesの集合をそのままImpactedとして使うため、--current-treeで計算したchanges/*.yamlを後から--historical(既定)で再計算し直すと、Impacted集合自体が変わりうる点に注意する。再現性が必要な運用(本節が前提とするpending/stale判定)では既定のhistoricalモードを使うこと。


3. 判定アルゴリズム

3.1 Q1:この結果はどの変更の後の実行か

入力:case_id, milestone(対象TestExecutionレコード)

  1. results.ymlから対象レコードのverified_feature_tree_shasを取得する。
  2. 各Feature idについて、changes/配下の全ChangeEventレコードをto_tree_sha == verified_feature_tree_shas[feature_id]で検索する。
  3. 一致するChangeEventのevent_idfrom_milestoneto_milestoneを「この結果が反映している変更」として返す。
  4. 一致するChangeEventが無い場合(=そのマイルストーンで対象Featureに変更が無かった場合)、直近のderived_from鎖を遡り「最後に変更があったマイルストーン」を返す。

出力例:

$ markharness verify trace tc-edit-existing-todo-001 --milestone test2
case_id: tc-edit-existing-todo-001
feature: todo-edit
executed_at: 2026-08-08T16:38:52Z
reflects_change: todo-edit--test1--test2
  from_milestone: test1
  to_milestone: test2
  change_type: (未記録、markharness changes annotate で事後入力すれば表示される)

3.2 Q2:変更があったのに未実行のTestCaseはどれか

入力:from_milestone, to_milestone(比較したいマイルストーン区間。省略時は直近の隣接ペア)

  1. changes/<from>-<to>.yamlから対象区間の全ChangeEventを読み、impacted_testcasesを統合した集合 Impacted を作る。
  2. to_milestone以降(to_milestone自身を含む、以降の全マイルストーン)のresults.ymlを走査し、各case_idについてverified_feature_tree_shas[feature_id] == changes[event].to_tree_shaを満たすレコードが1件でもあれば「再検証済み」とする。
  3. Impacted - 再検証済み集合 を「未再実行」として出力する。
  4. to_milestoneより後に、対象Featureがさらに変更されている場合(=to_tree_shaがすでに古くなっている場合)は、「未再実行」ではなく「対象自体が陳腐化(stale)」の区分で別掲する(3.3節)。

出力例:

$ markharness verify pending --from test1 --to test2
pending (再実行なし):
  - tc-edit-existing-todo-001  (todo-edit の変更 test1→test2 の影響、未実行)

stale (影響範囲がさらに変更済み):
  (なし)

3.3 「pending」と「stale」の区別

Q2をマイルストーン跨ぎで運用すると、「再実行される前に対象Featureがさらに変わってしまった」ケースが必ず発生する。これを一律「未実行」として扱うと、テスターは「どの版に対して確認すればよいか」を見失う。そこで2区分に分ける。

判定:対象Feature idについて、Impacted集合の生成元ChangeEventのto_tree_shaが、現在の(問い合わせ時点の)tree SHAと一致するかをid_indexキャッシュで確認する。一致すれば pending、不一致なら stale。


4. ツールインターフェース仕様

markharness本体のCLIサブコマンドとして以下2コマンドを実装する。

コマンド 用途 対応する問い
markharness verify trace <case_id> --milestone <m> 指定した実行結果がどのChangeEventを反映しているかを表示 Q1
markharness verify pending [--from <m1> --to <m2>] 未再実行/陳腐化したTestCase一覧を表示 Q2

5. 既存MM実装データでのトレース例

現行のchanges/test2.yamlexecutions/test2/results.ymlを本仕様に沿って再構成すると、以下のようになる(verified_feature_tree_shasは本仕様導入後に新規実行分から付与される想定であり、既存レコードには遡及適用しない。第6章参照。to_tree_shaはFeatureディレクトリ全体のtree SHAであり、changes computeの再実行によって値が変わる。以下は例示用の値)。

# changes/test2.yaml(例示。tree SHA化により実際の値は変わる)
- event_id: todo-edit--test1--test2
  feature_id: todo-edit
  from_milestone: test1
  to_milestone: test2
  from_tree_sha: null
  to_tree_sha: 4f2c9a1e8b3d5670012ab34cd56ef7890a1b2c3
  impacted_testcases:
  - tc-edit-existing-todo-001
# executions/test2/results.yml(本仕様導入後の形)
- case_id: tc-edit-existing-todo-001
  result: pass
  executor: soreiyu52
  executed_at: 2026-08-08T16:38:52Z
  verified_feature_tree_shas:
    todo-edit: 4f2c9a1e8b3d5670012ab34cd56ef7890a1b2c3

この2つを突き合わせると、to_tree_shaverified_feature_tree_shas.todo-editが一致するため、markharness verify pending --from test1 --to test2tc-edit-existing-todo-001を pending 扱いにせず、正しく「再検証済み」と判定する。


6. 導入・移行方針


7. Threats / 留意事項