markharness

0008: 製品ロードマップをPR Verification Plan中心に再定義する

ステータス

Accepted(Stage 0〜3は2026-08-18に実行済み。Stage 3ではlocalhost限定のread-only Release Verification Dashboard、Feature History、Rustバイナリへのfrontend同梱を実装)。本ADRが中心に据えたVerification Planという枠組みは、0020およびmarkharness-v2-design.mdのChange Impact/Release Coverageへ置き換えられた(Stage 3で実装したdashboardは0022により廃止)。Stage 0〜3の実装記録およびモジュラーモノリス方針としては有効。

コンテキスト

docs/Markharness_改善・実装検討_統合設計文書.md(2026-08-17付、以下「統合設計文書」。採否判断が本ADRおよびverification-plan-canonical-model-design.mdへの転記により完了したため、ファイル自体は削除済み。git log -- docs/で復元可能)は、現行のmarkharness設計(テスト知識をprimary artifact、TestCaseをderived artifactとするGit-nativeモデル、第2.4節・第3章の通り実装済み)を土台に、次の3方向の拡張を検討した。

  1. Doorstop・StrictDoc・TestRail・Gherkin/Cucumber・Playwright・JUnit等を入力元とする正規化(canonical import)基盤。
  2. PRのcode/spec/knowledge diffから、影響済みテストと新規に必要なテストを含むVerification Planを生成する機能。
  3. Release Verification Dashboard・Feature History等、Markharness固有モデルを可視化するGUI。

現状のmarkharness CLIは、単一Gitリポジトリ内のknowledge/を対象に、マイルストーン境界のChangeEvent自動計算(changes compute)・実行証拠のversion bind(verify trace/verify pending)までを実装済みである(論文git-native-model-for-test-knowledge-management.md第3章)。一方、PR単位(base/head任意の2点)でのVerification Plan生成、外部ツールからのインポート、GUIはいずれも未着手である。

統合設計文書が指摘する主要なリスクは、この3方向を無秩序に並行着手すると、(a)import/normalize機能が前面に出すぎて「version-aware middleware」に縮小して見える、(b)TestCase CRUDの再実装に陥る、(c)GUIが独自のstatus modelを持ちDomain Engineと乖離する、の3点である。本ADRは、この3方向をどの順序・どの境界で着手するかを決定する。

決定

1. 製品ビジョンを次の1文に固定する

Markharness turns a change into a reviewable verification plan. Git remains the source of truth.

競争軸をdashboard・RBAC・SSO等の機能数に置かず、「この変更で、何をテストすれば十分か」への回答速度と品質に置く。この文言はREADME等の対外説明文の更新時に参照する一次情報とする。

2. 着手順序をStage 0〜3の順に固定する

既存のchanges compute(マイルストーン境界)を拡張し、PRのbase/head任意の2点を第一級のversion rangeとして扱えるようにする方向で、以下の順に進める。優先順位の理由は、canonical modelがPlanの安定した入力になり、PlanがGUIの意味のあるread modelになるという依存関係に基づく(統合設計文書第8章)。

Stage スコープ Exit Criteria
Stage 0 現行domain model・用語をADR/schema文書に固定。fixture repositoryとgolden dataset化。CLI JSON contractのversioning方針を定義。 同一fixtureから同一canonical snapshot・change・plan statusを再生成できる。
Stage 1 canonical artifact/version/relation/evidence schema。Markharness native importerとJUnit evidence importer。stored/derived traceのorigin区別。import --format json native knowledgeとJUnit resultから、version-awareなplan statusをCIで再現できる。
Stage 2 base/head diff収集。stored/derived traceによるaffected existing tests。rule-basedのmissing test検査。optionalなAI proposal adapter。markharness plan --base --head --format json 履歴PRデータセットで、人間のplanと比較した評価結果(precision/recall等)が得られる。
Stage 3 markharness serveによるread-only Release Verification Dashboard・Feature History。 対象ユーザーがCLI/ファイルのみより短時間でreleaseの残検証を説明できる。

Stage 4(外部import拡張・PR check/comment統合)・Stage 5(collaborative SaaS)は、Stage 0〜3の完了と利用実績を前提とする条件付き着手とし、本ADRでは着手順序を確定しない(第4節)。

3. 境界(やらないことの明文化)

以下を製品の前面に出さない境界として明記する。実装時にこの境界を越える提案が出た場合は、新たなADRとして是非を判断する。

4. Stage 4・5は条件付き着手とする

Stage 5(collaborative SaaS: RBAC・SSO・共有DB等)は、次の条件が確認された場合のみ着手を検討する。本ADRの時点では着手しない。

Stage 4(TestRail等の既存TMSからのインポータ、GitHub/GitLab PR check連携)は、Stage 2のVerification Plan PoCが実用的な精度(precision/recall)を示した後に着手する。TestRail importerは需要確認後とし、Stage 1のimporter導入順序は「Markharness native → JUnit XML → Gherkin → Playwright → Doorstop/StrictDoc → TestRail」の順とする(ファイルベースを先行させ、SaaS API固有の認証・pagination・rate limit対応を後段に送る、統合設計文書第3.8節)。

5. 既存機能の扱い

統合設計文書第9節の提案を踏まえ、以下を維持・縮小の方針として採用する。

維持・強化:structured test knowledge、deterministic TestCase generation、Git tree SHAによるFeature version、milestone/snapshot diff、change→affected TestCase導出、execution evidenceのversion bind、derived pending/re-verification、file/CLI workflow。いずれも現行実装(論文第3章)の中核であり変更しない。

縮小・再設計:milestone-only UXを、PR base/headをfirst-classに追加した共通version rangeへ一般化する(Stage 2で着手)。human-oriented text出力のみに依存せず、stable JSON/schemaを同等以上に重視する(Stage 0〜1で着手)。単純なPASS/FAIL表示は、既存のverify trace/verify pendingが持つvalid/stale/unknown区分(論文第3.7節)を追跡入力として活用する形に統合する。

6. 実装アーキテクチャをモジュラーモノリスに固定する

Stage 0〜3は、Gitをsource of truthとする単一製品・単一リポジトリのモジュラーモノリスとして実装する。Webサーバー、共有DB、常駐ワーカー、マイクロサービスをDomain Engineの前提にしない。既存のRust CLIを全面再実装せず、現在の決定的生成、Git tree SHA比較、実Git fixtureテスト、fs_safetychanges computeのbackfill再利用を維持する。

Module 責務 主なInterface
KnowledgeWorkspace knowledge/axes/の読込、正規化、参照・schema検証、Knowledge Snapshot構築 loadvalidatesnapshotapply
TestcaseCompiler SnapshotからTestCaseとtraceability indexを決定的に生成 compile(snapshot) -> GeneratedArtifacts
ChangeAnalyzer CommitRefで表した任意のfrom/to間のFeature tree SHA比較、ChangeEvent・影響TestCase・true_divergences導出 compute(from, to, options) -> ChangeSet
VerificationEngine ChangeEventとversion bindされたexecution evidenceからvalid/pending/stale/unknownを導出 trace(input)pending(input)
BackfillCoordinator 未処理version rangeの選択、ChangeAnalyzer呼出し、Git notesへの進捗記録 run_once(policy) -> BackfillSummary

CLI・CI summary・Stage 3 GUIはDomain Engineの計算を再実装せず、Application Use Caseが返す同一の結果型を異なるPresentationで表現する。依存方向はPresentation -> Application -> Domain -> Infrastructureとする。ModuleのInterface、CommitRefKnowledgeSource、生成物更新の原子性、段階的移行はdecisions/0009を決定記録、domain-application-infrastructure-layering-design.mdを詳細設計の正とする。

7. スケーラビリティの優先順位を固定する

Stage 0〜3で最初に改善するスケールは、サーバー台数ではなく、機能数・コード量・テスト数・開発人数である。Domain ModuleとApplication Use CaseのInterfaceを安定させ、変更の局所性とCLI/CI/GUI間の再利用性を高める。

Knowledge件数、milestone数、execution件数に対する性能改善は、正確性を保つ次の順序で行う。

  1. 同一コマンド内で正規化済みKnowledge Snapshotを共有する。
  2. GitTreeKnowledgeSourceで過去commitをGit tree/blobから直接読み込む。
  3. Feature・ChangeEvent・Executionの再構築可能な索引を追加する。
  4. backfill runへ処理量制限を追加する。
  5. 計測結果に基づき増分生成または限定的な並列処理を追加する。

全生成・全検証を正準動作として維持し、増分処理と索引は削除・再構築可能な最適化に限定する。Stage 5の着手条件が成立するまでは、水平スケール、共有DB、分散ジョブキューを導入しない。詳細なPhase 1〜5とテスト戦略はdecisions/0009およびその設計文書へ委ねる。

8. Stage 3 GUIの配置と配布を固定する

Stage 3 GUIは別製品・別リポジトリとして開始せず、markharnessと同一リポジトリ内の独立frontend packageとして実装する。プロダクトは一つに保ち、コード上はDomain Engine、Application、CLI、localhost server、frontendを別Module/packageに分ける。

markharness/
  crates/
    markharness-domain/
    markharness-application/
    markharness-git/
    markharness-cli/
    markharness-server/
  ui/
  schema/
  tests/fixtures/
  tests/golden/

上記は目標とする責務配置を示すものであり、Stage 0で直ちにcrate分割することを要求しない。まず既存crate内でInterfaceと依存方向を確立し、独立ビルド・依存管理・リリース上の価値が生じたModuleからworkspace crateへ分離する。

markharness serve --dir <repository>はlocalhostに限定したread-only serverとして、Domain Engineが生成するversioned read modelと静的GUI assetsを配信する。GUIはChangeEvent、evidence freshness、Verification Plan statusを独自計算せず、Domain Engineが返したvalid/pending/stale/unknownおよびreason/source/confidenceを表示する。

公開契約はmarkharness plan --format jsonと対応するversioned JSON Schemaとする。Stage 3のlocalhost HTTP Interfaceは同一リリース内の内部Interfaceとして開始し、初期段階では外部クライアント向けの長期互換性を約束しない。リリース時はfrontendの静的成果物をRustバイナリへ同梱し、利用者にNode.js環境を要求しない。

GUIの別リポジトリ化は、次のいずれかが成立した場合に新しいADRで再検討する。

結果

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