markharness

0015: Behaviorへのstep概念の導入(段階的アプローチ)

ステータス

Superseded by 0016 (2026-08-31)。Phase 1(inline Behavior.stepsの導入)は実装され「Acceptedへ変更する条件」を一度満たしたが、実データでの利用によりbehavior.stepsをConditionの共通粒度とする前提そのものが崩れたため、0016がこのADRを置き換える。

背景

generate.rs::generate_testcasesが生成するTestCase.stepsは、実装上は配列型だが実際には常に[behavior.description]という単一要素にしかならない(testcase-generation-design.md §3.3(現行の見出しは0016後の内容に更新済みだが、当時のtitle = condition.description/steps = behavior.stepsという単純転記方式の記述はそのまま残っている))。behavior.yml(behavior.schema.json)自体にはdescriptionという1つの自由文フィールドしかなく、Test Designerは本来順序立てて書きたい複数の操作手順を1つの文字列に無理に詰め込んでいる。testcase-generation-design.md §7は「Behavior階層を使ったより高度なグルーピング・Axisの多段管理などのモデル拡張」を将来課題として明示していたが、steps自体の複数要素化には言及していなかった。

同時に、複数のBehaviorが同じ操作手順(例: ログイン手順)を繰り返し記述する再利用ニーズが将来生じうる。descriptionを都度コピーすると内容の乖離(あるBehaviorだけ手順が更新され、他が古いまま)を検出できない、という懸念がある。

当初案では、Behaviorの複数要素化・共有Stepレジストリ・UID・ハッシュ整合性検証・acceptコマンドを一度に導入する設計を検討した。しかしレビューにより、この一括導入は過剰であると判断した。共有ニーズは現時点で実データに基づく確認ができておらず(本ADR時点でリポジトリ内にbehavior.ymlの実データは存在しない)、共有Step変更時の影響範囲(全参照Behavior一括更新か個別承認か、原子性、復旧)や、Stepを第6のEntityKindとしてidentity lifecycle基盤に統合する必要性も未検証のまま、hash不一致のfail-closed運用だけを先に確定させることはリスクが大きい。

そのため本ADRは、複数要素化そのもの(Phase 1)だけを決定事項とし、共有レジストリ以降(Phase 2〜4)は実データで需要を確認したうえで改めて設計する方針とする。

前提

決定内容

Phase 1(本ADRで決定): inline Behavior.stepsを導入する

  1. behavior.ymlsteps: Vec<String>(必須、順序付き配列)を追加する。各要素はその場に直接書くインライン文字列であり、共有レジストリへの参照は行わない。
  2. Step粒度は「steps配列の1要素 = 1操作」に統一する。複数操作をまとめて1要素に書くことは許容しない。
  3. descriptionは人間向けの1文要約として残すが、テストケース生成には一切使わない。
  4. generate.rs::generate_testcasessteps = [behavior.description]steps = behavior.stepsに置き換える。behavior.descriptionは生成ロジックから完全に除外され、knowledge/上の人間向けドキュメントとしての役割のみを持つ。
  5. stepsが空配列である場合、および各要素が空文字列である場合は、Knowledge検証でエラーとする。
  6. 共有Stepレジストリ、UID、hash整合性検証、steps accept等の復旧コマンドは、本Phaseでは導入しない。
  7. Behaviorを作成できる唯一のサポート経路であるknowledge add --edit(KnowledgeDraft/BehaviorDraftsrc/knowledge_draft.rs)を、新設の必須stepsを入力・検証できるように更新する。具体的には、BehaviorDraftstepsフィールドを追加し、knowledge add --editが開く空draftテンプレートおよび非対話呼び出し用のテンプレート出力(markharness knowledge add --edit --print-template相当、cli.rs)にもsteps:の記入欄を含める。push_missing_descriptionと同様に、draft側でもstepsが空・全要素空文字列の場合は検証エラーとする。この更新を行わない限り、唯一の作成経路が新しい必須フィールドを満たせず、Behaviorを新規作成できなくなる。
# behavior.yml
id: todo-add-task
feature: todo
label: Add Task
axis: [ui]
description: "User adds a task."
steps:
  - "タイトル欄をクリックする"
  - "何も入力しない"
  - "送信ボタンを押す"

実装時の留意事項(本ADRでは決定しない)

Phase 2(将来の方向性、未確定): 実データで共有需要を確認する

Phase 1導入後、しばらく実データを蓄積した上で次を確認する。

判断基準は定量的な閾値を設けず、定性的に「重複・更新漏れが実際に発生したら」次のPhaseへ進む。実際に発生しなければ、inline Behavior.steps(Phase 1)のみで完了とする。

Phase 3(将来の方向性、未確定): 共有Stepレジストリを別ADRとして設計する

Phase 2で共有需要が確認できた場合に限り、別ADR(または本ADRの改訂版)として次を設計する。詳細は本ADRでは決定しない。

Phase 4(将来の方向性、未確定): ハッシュ検証とaccept運用を追加する

Phase 3で共有レジストリを導入する場合に限り、次を設計する。詳細は本ADRでは決定しない。

Acceptedへ変更する条件

対象外