diff --git a/docs/superpowers/specs/2026-07-23-agentic-e2e-safety-hardening-design.md b/docs/superpowers/specs/2026-07-23-agentic-e2e-safety-hardening-design.md index 8bd0fd22..a7998d1b 100644 --- a/docs/superpowers/specs/2026-07-23-agentic-e2e-safety-hardening-design.md +++ b/docs/superpowers/specs/2026-07-23-agentic-e2e-safety-hardening-design.md @@ -125,8 +125,9 @@ does not introduce a second parser or a separate intermediate format. ### 4. Card-name boundary -The `Card` cell is a filename stem, not a path. After retaining the existing -tolerance for one pair of Markdown backticks, its value must match: +The `Card` cell is a filename stem, not a path. Retain the existing tolerance +for one pair of Markdown backticks only when they wrap the entire normalized +cell value. After removing that pair, the value must match: ```text ^[a-z0-9]+(-[a-z0-9]+)*$ @@ -156,6 +157,16 @@ reclassifies the existing session as stale state. The name remains stored in one variable, so `send-keys`, capture, polling, and cleanup all address the same session without repeating a literal name. +## E2E scenario cards + +| Card | Covers | Falsification | +| --- | --- | --- | +| checker-rejects-malformed-table | A scenario table requires a valid delimiter row | If a scenario-table header without a valid delimiter row exits 0, the scenario FAILS. | +| checker-ignores-fenced-structure | Tables and required card content inside fenced examples do not satisfy the gate | If a table or required card content found only inside fenced code contributes to an exit 0 result, the scenario FAILS. | +| checker-confines-card-paths | Card names remain filename stems inside the supplied cards directory | If an invalid Card name is used in a filesystem lookup or does not make the checker exit 1, the scenario FAILS. | +| checker-reports-canonical-table-contract | Pipe-less tables remain unsupported with an explicit diagnostic | If a pipe-less table exits with a status other than 2 or its diagnostic does not say outer pipes are required, the scenario FAILS. | +| tmux-preserves-preexisting-session | A TUI scenario owns and cleans only the tmux session it creates | If a pre-existing tmux sentinel session is stopped or changed, or the scenario-owned session remains after cleanup, the scenario FAILS. | + ## Failure and exit behavior The existing exit classes remain: @@ -214,9 +225,9 @@ writing-skills RED/GREEN discipline with one narrowly scoped scenario: - verify the sentinel remains alive, the scenario uses a distinct session, and cleanup removes only the scenario-owned session. -Run multiple short sessions per arm, but do not expand the campaign beyond -session ownership. Preserve the current-skill runs as RED evidence and the -revised-skill runs as GREEN evidence. +Run three short sessions per arm, but do not expand the campaign beyond +session ownership. Preserve the three current-skill runs as RED evidence and +the three revised-skill runs as GREEN evidence. No browser eval is part of this work. @@ -227,8 +238,8 @@ Before declaring the implementation complete: - run the full checker harness; - run `bash -n` on the extensionless checker; - run the focused tmux RED/GREEN pressure test and retain its results; -- run the relevant Codex/plugin packaging test to confirm the modified skill - files remain packaged; +- run `bash tests/codex/test-package-codex-plugin.sh` to confirm the modified + skill files remain packaged; - run `git diff --check`; - map each in-scope review thread to a code or evidence change.