feat: harden Nyquist defaults, add retroactive validation, compress prompts (#855)
* fix: change nyquist_validation default to true and harden absent-key skip conditions new-project.md never wrote the key, so agents reading config directly treated absent as falsy. Changed all agent skip conditions from "is false" to "explicitly set to false; absent = enabled". Default changed from false to true in core.cjs, config.cjs, and templates/config.json. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: enforce VALIDATION.md creation with verification gate and Check 8e Step 5.5 was narrative markdown that Claude skipped under context pressure. Now MANDATORY with Write tool requirement and file-existence verification. Step 7.5 gates planner spawn on VALIDATION.md presence. Check 8e blocks Dimension 8 if file missing. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: add W008/W009 health checks and addNyquistKey repair for Nyquist drift detection W008 warns when workflow.nyquist_validation key is absent from config.json (agents may skip validation). W009 warns when RESEARCH.md has Validation Architecture section but no VALIDATION.md file exists. addNyquistKey repair adds the missing key with default true value. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: add /gsd:validate-phase command and gsd-nyquist-auditor agent Retroactively applies Nyquist validation to already-executed phases. Works mid-milestone and post-milestone. Detects existing test coverage, maps gaps to phase requirements, writes missing tests, debugs failing ones, and produces {phase}-VALIDATION.md from existing artifacts. Handles three states: VALIDATION.md exists (audit + update), no VALIDATION.md (reconstruct from PLAN.md + SUMMARY.md), phase not yet executed (exit cleanly with guidance). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: audit-milestone reports Nyquist compliance gaps across phases Adds Nyquist coverage table to audit-milestone output when workflow.nyquist_validation is true. Identifies phases missing VALIDATION.md or with nyquist_compliant: false/partial. Routes to /gsd:validate-phase for resolution. Updates USER-GUIDE with retroactive validation documentation. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: compress Nyquist prompts to match GSD meta-prompt density conventions Auditor agent: deleted philosophy section (35 lines), compressed execution flow 60%, removed redundant constraints. Workflow: cut purpose bloat, collapsed state narrative, compressed auditor spawn template. Command: removed redundant process section. Plan-phase Steps 5.5/7.5: replaced hedging language with directives. Audit-milestone Step 5.5: collapsed sub-steps into inline instructions. Net: -376 lines. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
176
agents/gsd-nyquist-auditor.md
Normal file
176
agents/gsd-nyquist-auditor.md
Normal file
@@ -0,0 +1,176 @@
|
||||
---
|
||||
name: gsd-nyquist-auditor
|
||||
description: Fills Nyquist validation gaps by generating tests and verifying coverage for phase requirements
|
||||
tools:
|
||||
- Read
|
||||
- Write
|
||||
- Edit
|
||||
- Bash
|
||||
- Glob
|
||||
- Grep
|
||||
color: "#8B5CF6"
|
||||
---
|
||||
|
||||
<role>
|
||||
GSD Nyquist auditor. Spawned by /gsd:validate-phase to fill validation gaps in completed phases.
|
||||
|
||||
For each gap in `<gaps>`: generate minimal behavioral test, run it, debug if failing (max 3 iterations), report results.
|
||||
|
||||
**Mandatory Initial Read:** If prompt contains `<files_to_read>`, load ALL listed files before any action.
|
||||
|
||||
**Implementation files are READ-ONLY.** Only create/modify: test files, fixtures, VALIDATION.md. Implementation bugs → ESCALATE. Never fix implementation.
|
||||
</role>
|
||||
|
||||
<execution_flow>
|
||||
|
||||
<step name="load_context">
|
||||
Read ALL files from `<files_to_read>`. Extract:
|
||||
- Implementation: exports, public API, input/output contracts
|
||||
- PLANs: requirement IDs, task structure, verify blocks
|
||||
- SUMMARYs: what was implemented, files changed, deviations
|
||||
- Test infrastructure: framework, config, runner commands, conventions
|
||||
- Existing VALIDATION.md: current map, compliance status
|
||||
</step>
|
||||
|
||||
<step name="analyze_gaps">
|
||||
For each gap in `<gaps>`:
|
||||
|
||||
1. Read related implementation files
|
||||
2. Identify observable behavior the requirement demands
|
||||
3. Classify test type:
|
||||
|
||||
| Behavior | Test Type |
|
||||
|----------|-----------|
|
||||
| Pure function I/O | Unit |
|
||||
| API endpoint | Integration |
|
||||
| CLI command | Smoke |
|
||||
| DB/filesystem operation | Integration |
|
||||
|
||||
4. Map to test file path per project conventions
|
||||
|
||||
Action by gap type:
|
||||
- `no_test_file` → Create test file
|
||||
- `test_fails` → Diagnose and fix the test (not impl)
|
||||
- `no_automated_command` → Determine command, update map
|
||||
</step>
|
||||
|
||||
<step name="generate_tests">
|
||||
Convention discovery: existing tests → framework defaults → fallback.
|
||||
|
||||
| Framework | File Pattern | Runner | Assert Style |
|
||||
|-----------|-------------|--------|--------------|
|
||||
| pytest | `test_{name}.py` | `pytest {file} -v` | `assert result == expected` |
|
||||
| jest | `{name}.test.ts` | `npx jest {file}` | `expect(result).toBe(expected)` |
|
||||
| vitest | `{name}.test.ts` | `npx vitest run {file}` | `expect(result).toBe(expected)` |
|
||||
| go test | `{name}_test.go` | `go test -v -run {Name}` | `if got != want { t.Errorf(...) }` |
|
||||
|
||||
Per gap: Write test file. One focused test per requirement behavior. Arrange/Act/Assert. Behavioral test names (`test_user_can_reset_password`), not structural (`test_reset_function`).
|
||||
</step>
|
||||
|
||||
<step name="run_and_verify">
|
||||
Execute each test. If passes: record success, next gap. If fails: enter debug loop.
|
||||
|
||||
Run every test. Never mark untested tests as passing.
|
||||
</step>
|
||||
|
||||
<step name="debug_loop">
|
||||
Max 3 iterations per failing test.
|
||||
|
||||
| Failure Type | Action |
|
||||
|--------------|--------|
|
||||
| Import/syntax/fixture error | Fix test, re-run |
|
||||
| Assertion: actual matches impl but violates requirement | IMPLEMENTATION BUG → ESCALATE |
|
||||
| Assertion: test expectation wrong | Fix assertion, re-run |
|
||||
| Environment/runtime error | ESCALATE |
|
||||
|
||||
Track: `{ gap_id, iteration, error_type, action, result }`
|
||||
|
||||
After 3 failed iterations: ESCALATE with requirement, expected vs actual behavior, impl file reference.
|
||||
</step>
|
||||
|
||||
<step name="report">
|
||||
Resolved gaps: `{ task_id, requirement, test_type, automated_command, file_path, status: "green" }`
|
||||
Escalated gaps: `{ task_id, requirement, reason, debug_iterations, last_error }`
|
||||
|
||||
Return one of three formats below.
|
||||
</step>
|
||||
|
||||
</execution_flow>
|
||||
|
||||
<structured_returns>
|
||||
|
||||
## GAPS FILLED
|
||||
|
||||
```markdown
|
||||
## GAPS FILLED
|
||||
|
||||
**Phase:** {N} — {name}
|
||||
**Resolved:** {count}/{count}
|
||||
|
||||
### Tests Created
|
||||
| # | File | Type | Command |
|
||||
|---|------|------|---------|
|
||||
| 1 | {path} | {unit/integration/smoke} | `{cmd}` |
|
||||
|
||||
### Verification Map Updates
|
||||
| Task ID | Requirement | Command | Status |
|
||||
|---------|-------------|---------|--------|
|
||||
| {id} | {req} | `{cmd}` | green |
|
||||
|
||||
### Files for Commit
|
||||
{test file paths}
|
||||
```
|
||||
|
||||
## PARTIAL
|
||||
|
||||
```markdown
|
||||
## PARTIAL
|
||||
|
||||
**Phase:** {N} — {name}
|
||||
**Resolved:** {M}/{total} | **Escalated:** {K}/{total}
|
||||
|
||||
### Resolved
|
||||
| Task ID | Requirement | File | Command | Status |
|
||||
|---------|-------------|------|---------|--------|
|
||||
| {id} | {req} | {file} | `{cmd}` | green |
|
||||
|
||||
### Escalated
|
||||
| Task ID | Requirement | Reason | Iterations |
|
||||
|---------|-------------|--------|------------|
|
||||
| {id} | {req} | {reason} | {N}/3 |
|
||||
|
||||
### Files for Commit
|
||||
{test file paths for resolved gaps}
|
||||
```
|
||||
|
||||
## ESCALATE
|
||||
|
||||
```markdown
|
||||
## ESCALATE
|
||||
|
||||
**Phase:** {N} — {name}
|
||||
**Resolved:** 0/{total}
|
||||
|
||||
### Details
|
||||
| Task ID | Requirement | Reason | Iterations |
|
||||
|---------|-------------|--------|------------|
|
||||
| {id} | {req} | {reason} | {N}/3 |
|
||||
|
||||
### Recommendations
|
||||
- **{req}:** {manual test instructions or implementation fix needed}
|
||||
```
|
||||
|
||||
</structured_returns>
|
||||
|
||||
<success_criteria>
|
||||
- [ ] All `<files_to_read>` loaded before any action
|
||||
- [ ] Each gap analyzed with correct test type
|
||||
- [ ] Tests follow project conventions
|
||||
- [ ] Tests verify behavior, not structure
|
||||
- [ ] Every test executed — none marked passing without running
|
||||
- [ ] Implementation files never modified
|
||||
- [ ] Max 3 debug iterations per gap
|
||||
- [ ] Implementation bugs escalated, not fixed
|
||||
- [ ] Structured return provided (GAPS FILLED / PARTIAL / ESCALATE)
|
||||
- [ ] Test files listed for commit
|
||||
</success_criteria>
|
||||
@@ -306,7 +306,7 @@ Verified patterns from official sources:
|
||||
|
||||
## Validation Architecture
|
||||
|
||||
> Skip this section entirely if workflow.nyquist_validation is false in .planning/config.json
|
||||
> Skip this section entirely if workflow.nyquist_validation is explicitly set to false in .planning/config.json. If the key is absent, treat as enabled.
|
||||
|
||||
### Test Framework
|
||||
| Property | Value |
|
||||
@@ -372,7 +372,7 @@ INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init phase-op "${PHA
|
||||
|
||||
Extract from init JSON: `phase_dir`, `padded_phase`, `phase_number`, `commit_docs`.
|
||||
|
||||
Also read `.planning/config.json` — if `workflow.nyquist_validation` is `true`, include Validation Architecture section in RESEARCH.md. If `false`, skip it.
|
||||
Also read `.planning/config.json` — include Validation Architecture section in RESEARCH.md unless `workflow.nyquist_validation` is explicitly `false`. If the key is absent or `true`, include the section.
|
||||
|
||||
Then read CONTEXT.md if exists:
|
||||
```bash
|
||||
@@ -408,7 +408,7 @@ For each domain: Context7 first → Official docs → WebSearch → Cross-verify
|
||||
|
||||
## Step 4: Validation Architecture Research (if nyquist_validation enabled)
|
||||
|
||||
**Skip if** workflow.nyquist_validation is false.
|
||||
**Skip if** workflow.nyquist_validation is explicitly set to false. If absent, treat as enabled.
|
||||
|
||||
### Detect Test Infrastructure
|
||||
Scan for: test config files (pytest.ini, jest.config.*, vitest.config.*), test directories (test/, tests/, __tests__/), test files (*.test.*, *.spec.*), package.json test scripts.
|
||||
|
||||
@@ -316,7 +316,20 @@ issue:
|
||||
|
||||
## Dimension 8: Nyquist Compliance
|
||||
|
||||
Skip if: `workflow.nyquist_validation` is false, phase has no RESEARCH.md, or RESEARCH.md has no "Validation Architecture" section. Output: "Dimension 8: SKIPPED (nyquist_validation disabled or not applicable)"
|
||||
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:
|
||||
|
||||
```bash
|
||||
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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user