Files
msd-core/gsd-core/references/nyquist-compliance.md
Tom Boucher c933184b97 enhance(#3172): require a stated failing direction for every automated acceptance command (#3825)
* 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>
2026-08-24 19:05:11 -04:00

2.8 KiB
Raw Blame History

Dimension 8 — Nyquist Compliance (checks 8a–8e)

Reference file for gsd-plan-checker agent. Loaded on-demand via @ reference. Extracted from agents/gsd-plan-checker.md in #3172 to stay under the agent's LARGE size cap. Checks 8a-8e are moved unchanged; the only edit is to the Dimension 8 Output table, which gains a Failing Direction column and a stated/runnable tally so check 8f's result is reported alongside them. Check 8f itself lives in its own reference: @gsd-core/references/failing-direction.md

Skip if: workflow.nyquist_validation is explicitly set to false in config.json (absent key = enabled), phase has no RESEARCH.md, or RESEARCH.md has no "Validation Architecture" section. Output: "Dimension 8: SKIPPED (nyquist_validation disabled or not applicable)"

Check 8e — VALIDATION.md Existence (Gate)

Before running checks 8a-8d, verify VALIDATION.md exists:

ls "${PHASE_DIR}"/*-VALIDATION.md 2>/dev/null

If missing: BLOCKING FAIL — "VALIDATION.md not found for phase {N}. Re-run /gsd:plan-phase {N} --research to regenerate." Skip checks 8a-8d entirely. Report Dimension 8 as FAIL with this single issue.

If exists: Proceed to checks 8a-8d.

Check 8a — Automated Verify Presence

For each <task> in each plan:

  • <verify> must contain <automated> command, OR a Wave 0 dependency that creates the test first
  • If <automated> is absent with no Wave 0 dependency → BLOCKING FAIL
  • If <automated> says "MISSING", a Wave 0 task must reference the same test file path → BLOCKING FAIL if link broken

Check 8b — Feedback Latency Assessment

For each <automated> command:

  • Full E2E suite (playwright, cypress, selenium) → WARNING — suggest faster unit/smoke test
  • Watch mode flags (--watchAll) → BLOCKING FAIL
  • Delays > 30 seconds → WARNING

Check 8c — Sampling Continuity

Map tasks to waves. Per wave, any consecutive window of 3 implementation tasks must have ≥2 with <automated> verify. 3 consecutive without → BLOCKING FAIL.

Check 8d — Wave 0 Completeness

For each <automated>MISSING</automated> reference:

  • Wave 0 task must exist with matching <files> path
  • Wave 0 plan must execute before dependent task
  • Missing match → BLOCKING FAIL

Dimension 8 Output

## Dimension 8: Nyquist Compliance

| Task | Plan | Wave | Automated Command | Failing Direction | Status |
|------|------|------|-------------------|-------------------|--------|
| {task} | {plan} | {wave} | `{command}` | `{fails_when}` / ❌ | ✅ / ❌ |

Sampling: Wave {N}: {X}/{Y} verified → ✅ / ❌
Wave 0: {test file} → ✅ present / ❌ MISSING
Failing directions: {stated}/{runnable} → ✅ / ❌
Overall: ✅ PASS / ❌ FAIL

If FAIL: return to planner with specific fixes. Same revision loop as other dimensions (max 3 loops).