* test(#3172): failing-first suite for the stated failing-direction probe Pins the <fails_when> pairing walk, placeholder denylist, MISSING sentinel exemption, degraded-read contract, CLI arm and the plan-authoring contract text. RED by construction: the module exports it requires do not exist yet. Executed on the remote runner. * feat(#3172): require a stated failing direction for every automated acceptance command Every runnable <automated> command now carries a <fails_when> sibling naming what output constitutes failure. A command with no expressible failure mode is not an acceptance test: it reads as rigour and is not falsifiable. - verify-command-grounding gains a failing-direction probe sharing the existing <automated> grammar, MISSING sentinel and walk guard rather than copying them - gsd-tools check verify-failure-directions <N> backs it; plan-phase dispatches it and hands the JSON to gsd-plan-checker check 8f - Dimension 8 detail extracted to references to stay under the agent size cap Verified on the remote runner. * fix(#3172): close four review findings in the failing-direction probe - MISSING_SENTINEL_RE matched an env-var assignment prefix (MISSING=1 cmd), so a real command was exempted from the new blocking gate. Tightened the SHARED constant rather than adding a second copy. - Both token regexes scanned to EOF on unclosed openers (O(n^2), 1562ms at 40k). Bodies are now non-crossing; 1ms, byte-identical on well-formed input. The pre-existing AUTOMATED_BLOCK_RE carried the same defect and is fixed here too. - probePhaseFailingDirections reported status 'ok' when one plan was unreadable, conflating 'could not look' with 'nothing to report'. - Extracted the phase-resolution block both check arms had copied verbatim. Also corrects a docs/AGENTS.md dimension list stale since #2401. Verified on the remote runner. * fix(#3172): project the planner rule onto the spawn contract, settle emitted bookkeeping The remote runner refuted the planner-side edit. agents/gsd-planner.md is frozen under a 49152-LF-char cap asserted by four suites and sat at 49,146 — six chars of headroom — so the +537 of authoring rule blew it. #3297/#3645 already settled where such a rule goes: the planner spawn contract in plan-phase.md, beside <tracked_source_paths>. The agent file is reverted to origin/next verbatim. - plan-phase.md gains <failing_direction_contract>; tests row 30 now asserts the contract there and row 30b guards the freeze in both directions - plan-phase.md growth acknowledged by APPENDING to the 3409 fragment, per the precedent that two ack sources may never name the same path - install-tree fixtures regenerated for the three new reference files Verified on the remote runner. * chore(#3172): backfill PR number into the changeset fragment pr:0 -> pr:3825 now that the PR exists. --------- Co-authored-by: sim <sim@local>
This commit is contained in:
@@ -1269,6 +1269,55 @@ gsd-tools check verify-command-paths 3 --raw # probe phase 3's verify command
|
||||
|
||||
See [Resolve verify-command path findings](how-to/resolve-verify-command-path-findings.md).
|
||||
|
||||
### `gsd-tools check verify-failure-directions`
|
||||
|
||||
Deterministic presence probe over a phase's stated failing directions (#3172). Run automatically
|
||||
by `/gsd-plan-phase` before the plan-check pass and handed to `gsd-plan-checker`; runnable by
|
||||
hand to see what the checker saw.
|
||||
|
||||
Every runnable `<automated>` command must carry a `<fails_when>` sibling naming what output
|
||||
constitutes failure. A command with no expressible failure mode is not an acceptance test.
|
||||
|
||||
| Argument | Required | Description |
|
||||
|----------|----------|-------------|
|
||||
| `N` | **Yes** | Phase number whose `-PLAN.md` files are probed |
|
||||
|
||||
| Flag | Description |
|
||||
|------|-------------|
|
||||
| `--raw` | Emit the JSON payload with no surrounding prose |
|
||||
|
||||
**Prerequisites:** none — an unresolvable phase degrades to a JSON payload with `readError` set
|
||||
rather than failing.
|
||||
**Produces:** JSON on stdout. Nothing is written to disk.
|
||||
|
||||
**It never executes command text**, and it never authors a statement for the planner — a
|
||||
prescribed failure signal would be copied verbatim and carry no information.
|
||||
|
||||
**Pairing.** Within one `<task>`, each `<fails_when>` binds to the nearest **preceding**
|
||||
`<automated>`; the first statement after a command is the binding one. N runnable commands need
|
||||
N statements. A redundant second statement for the same command is ignored.
|
||||
|
||||
Each row of `commands` carries `command`, `statement`, `plan`, `task`, `status`, and `severity`.
|
||||
|
||||
| `status` | `severity` | Meaning |
|
||||
|---|---|---|
|
||||
| `ok` | `none` | A non-empty, non-placeholder statement is bound to this command |
|
||||
| `missing` | `blocker` | The command has no `<fails_when>` at all |
|
||||
| `empty` | `blocker` | A `<fails_when>` is present but blank |
|
||||
| `placeholder` | `blocker` | The whole statement is `TBD`, `TODO`, `N/A`, `NA`, `none`, `unknown`, `TBA`, `?`, or `-` (case-insensitive, whole value only) |
|
||||
| `orphan` | `warning` | A `<fails_when>` that follows no command — it satisfies nothing |
|
||||
| `sentinel` | `none` | A Nyquist `MISSING — Wave 0 …` placeholder; not runnable, so exempt |
|
||||
|
||||
The top-level `status` is `blocked` when any row is a blocker, `unresolvable` when the probe
|
||||
could not look, and `ok` otherwise. A non-empty `readError` means the probe **could not look** —
|
||||
distinct from finding nothing.
|
||||
|
||||
```bash
|
||||
gsd-tools check verify-failure-directions 3 --raw # probe phase 3's failing directions
|
||||
```
|
||||
|
||||
See [State a failing direction](how-to/state-a-failing-direction.md).
|
||||
|
||||
---
|
||||
|
||||
## Workstream Management
|
||||
|
||||
Reference in New Issue
Block a user