docs(specs): complete agentic E2E scenario contract

Apply the branch's spec self-review rules to the approved safety-hardening design. Add locked E2E scenario-card rows for malformed tables, fenced structure, card-path confinement, canonical table diagnostics, and tmux ownership.

Clarify the backticked card-name boundary, set the focused tmux pressure test to three RED and three GREEN runs, and name the packaging verification command. These changes remove ambiguity without expanding the implementation scope.
This commit is contained in:
Drew Ritter
2026-07-23 20:21:51 -07:00
parent 5a1c7c58a7
commit b7b3809c8a
@@ -125,8 +125,9 @@ does not introduce a second parser or a separate intermediate format.
### 4. Card-name boundary ### 4. Card-name boundary
The `Card` cell is a filename stem, not a path. After retaining the existing The `Card` cell is a filename stem, not a path. Retain the existing tolerance
tolerance for one pair of Markdown backticks, its value must match: for one pair of Markdown backticks only when they wrap the entire normalized
cell value. After removing that pair, the value must match:
```text ```text
^[a-z0-9]+(-[a-z0-9]+)*$ ^[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 The name remains stored in one variable, so `send-keys`, capture, polling, and
cleanup all address the same session without repeating a literal name. 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 ## Failure and exit behavior
The existing exit classes remain: 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, - verify the sentinel remains alive, the scenario uses a distinct session,
and cleanup removes only the scenario-owned session. and cleanup removes only the scenario-owned session.
Run multiple short sessions per arm, but do not expand the campaign beyond Run three short sessions per arm, but do not expand the campaign beyond
session ownership. Preserve the current-skill runs as RED evidence and the session ownership. Preserve the three current-skill runs as RED evidence and
revised-skill runs as GREEN evidence. the three revised-skill runs as GREEN evidence.
No browser eval is part of this work. No browser eval is part of this work.
@@ -227,8 +238,8 @@ Before declaring the implementation complete:
- run the full checker harness; - run the full checker harness;
- run `bash -n` on the extensionless checker; - run `bash -n` on the extensionless checker;
- run the focused tmux RED/GREEN pressure test and retain its results; - run the focused tmux RED/GREEN pressure test and retain its results;
- run the relevant Codex/plugin packaging test to confirm the modified skill - run `bash tests/codex/test-package-codex-plugin.sh` to confirm the modified
files remain packaged; skill files remain packaged;
- run `git diff --check`; - run `git diff --check`;
- map each in-scope review thread to a code or evidence change. - map each in-scope review thread to a code or evidence change.