tests/e2e/ — agent-driven e2e integration test

v0.1.0-draft · status: active · REQ-VER-009 / verification.html §4.1 Step 2 の試作実装

§1. Purpose — sandbox 単体テストとの違い

sandbox (../scenarios/ + runner.sh)e2e (本 cluster)
検証対象hook script 単体 (stdin payload → exit code)live load 済 plugin 全体 (4 hook + marker + SKILL)
発火方式mock JSON payload を echo | bashagent の実 Edit/Write tool 操作 (Claude Code が hook を発火)
一次 assertionexit_code + stderr_containsfile 作成有無 (PreToolUse deny → 不在 / PostToolUse notify → 存在)
実行者runner.sh (自動)agent が runbook.md を読んで手動 walk
前提yq + jqfolio plugin が load 済 session (~/.claude/plugins/folio symlink + cld auto discovery)

一次 assertion を「file 作成有無」とする理由: PreToolUse の deny は transcript に確実には現れない (research §2.6 / Issue #39344 等)。 一方 file system 上の作成/不在は決定的に観察できる。 PreToolUse deny → file 不在、 PostToolUse notify → file 存在 + 通知、 という対応で hook の発火を間接的かつ確実に判定する。

§2. File Inventory

path役割VCS
README.html本 cluster index (この file)追跡
runbook.mdS-A〜S-J の手順書 (agent が読んで実行する markdown)追跡
baselines/reference/walk 観察結果の golden JSON (hook 系は file_created / notify、 CLI 系は exit/state 記録)追跡
baselines/local/再 walk 時の actual 出力 (golden 比較先)ignore (.gitignore)

§3. Scenarios (10 件)

IDシナリオmarker期待観察 (一次 = file 作成有無)
S-Ahappy-path: 正規 spec を書くSETfile 作成 (4 hook 通過) + readme-index notify (未掲載のため)
S-Bguardrail: 誤りを捕まえる (B1 marker無 / B2 spec_path外 / B3 string@context / B4 README未掲載)B1=UNSET, B2-4=SETB1/B2 不在 (PreToolUse deny) / B3/B4 作成 + PostToolUse notify
S-Cfalse-positive: gate 対象外は誤作動しないUNSETfile 作成 / Edit allow (spec_path 外は非 gate)
S-DCLI: bin/folio version / help (skeleton)exit 0 + 出力。 init/validate/fix/inventory/prime の lifecycle 統合は S-H〜S-J で被覆 (S-D は version/help に限定)
S-Emarker-ux: 手動 set→edit→unset フロー成立SET→UNSETset 中は spec 編集可、 unset 後は deny 復帰 (fail-open しない)
S-FSessionStart context injection (Tier 1 digest 注入、 REQ-VER-012 / ADR-0007、 Track 2)fresh session の初期 context に digest 注入 (full chain 動作)。 startup (S-F) + compact (S-F-compact、 実 /compact) 両 source = PASS。 golden = observations-sessionstart.json
S-Gfolio-architect 7-Phase + Phase F 3-agent review (ears/vocabulary/ssot 並列 spawn、 REQ-VER-016 / ADR-0027、 Track X4-D)SET→UNSETseed spec の既知 violation (EARS 欠落 / forbidden synonym / domain 越境) を 3 review agent が flag (検出有無が一次 assertion)。 live walk は plugin reload 後の fresh session。 structural (REQ-VER-016 (a)) は ../scenarios/agent-structure.yaml で決定的 PASS。 golden = observations-architect.json (walk 後に確定する placeholder)
S-HCLI lifecycle: init → validate (fresh consumer project が out-of-the-box clean、 REQ-VER-014、 Track X4-E)init exit 0 + 5 file scaffold (folio build で index.html も生成) / validate exit 0 clean (15-gate、 nav 3 gate も graceful OK)。 bash-CLI = session 非依存ゆえ本 session で walk 可。 golden = observations-cli.json
S-ICLI lifecycle: detect→remediate (validate→fix→build の連鎖が live で閉じ冪等、 REQ-VER-015 / ADR-0025/0035、 Track X4-E)forward 片側注入 → validate exit 1 (nav-regen-drift + broken-reverse) → fix exit 0 reverse materialize → build exit 0 nav index 再生成 → validate clean → 再 fix 冪等 no-op。 ★remediate は fix (graph) + build (nav) の 2 ツール。 golden = observations-cli.json
S-JCLI read-only: inventory + prime (live repo digest 生成、 REQ-VER-010/012、 Track X4-E)inventory exit 0 + 37 specs / prime exit 0 + Tier 1 digest。 S-F (SessionStart 経由注入) に対し CLI 直接呼び出しを被覆。 golden = observations-cli.json

各シナリオの詳細手順と期待観察は runbook.md、 walk 結果の golden は baselines/reference/ を参照。

§4. 実行前提

§5. References