Files
msd-core/get-shit-done/workflows/validate-phase.md
Fana ef032bc8f1 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>
2026-03-03 11:19:44 -06:00

4.9 KiB

Audit Nyquist validation gaps for a completed phase. Generate missing tests. Update VALIDATION.md.

<required_reading> @~/.claude/get-shit-done/references/ui-brand.md </required_reading>

0. Initialize

INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init phase-op "${PHASE_ARG}")

Parse: phase_dir, phase_number, phase_name, phase_slug, padded_phase.

AUDITOR_MODEL=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" resolve-model gsd-nyquist-auditor --raw)
NYQUIST_CFG=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" config get workflow.nyquist_validation --raw)

If NYQUIST_CFG is false: exit with "Nyquist validation is disabled. Enable via /gsd:settings."

Display banner: GSD > VALIDATE PHASE {N}: {name}

1. Detect Input State

VALIDATION_FILE=$(ls "${PHASE_DIR}"/*-VALIDATION.md 2>/dev/null | head -1)
SUMMARY_FILES=$(ls "${PHASE_DIR}"/*-SUMMARY.md 2>/dev/null)
  • State A (VALIDATION_FILE non-empty): Audit existing
  • State B (VALIDATION_FILE empty, SUMMARY_FILES non-empty): Reconstruct from artifacts
  • State C (SUMMARY_FILES empty): Exit — "Phase {N} not executed. Run /gsd:execute-phase {N} first."

2. Discovery

2a. Read Phase Artifacts

Read all PLAN and SUMMARY files. Extract: task lists, requirement IDs, key-files changed, verify blocks.

2b. Build Requirement-to-Task Map

Per task: { task_id, plan_id, wave, requirement_ids, has_automated_command }

2c. Detect Test Infrastructure

State A: Parse from existing VALIDATION.md Test Infrastructure table. State B: Filesystem scan:

find . -name "pytest.ini" -o -name "jest.config.*" -o -name "vitest.config.*" -o -name "pyproject.toml" 2>/dev/null | head -10
find . \( -name "*.test.*" -o -name "*.spec.*" -o -name "test_*" \) -not -path "*/node_modules/*" 2>/dev/null | head -40

2d. Cross-Reference

Match each requirement to existing tests by filename, imports, test descriptions. Record: requirement → test_file → status.

3. Gap Analysis

Classify each requirement:

Status Criteria
COVERED Test exists, targets behavior, runs green
PARTIAL Test exists, failing or incomplete
MISSING No test found

Build: { task_id, requirement, gap_type, suggested_test_path, suggested_command }

No gaps → skip to Step 6, set nyquist_compliant: true.

4. Present Gap Plan

Call AskUserQuestion with gap table and options:

  1. "Fix all gaps" → Step 5
  2. "Skip — mark manual-only" → add to Manual-Only, Step 6
  3. "Cancel" → exit

5. Spawn gsd-nyquist-auditor

Task(
  prompt="Read ~/.claude/agents/gsd-nyquist-auditor.md for instructions.\n\n" +
    "<files_to_read>{PLAN, SUMMARY, impl files, VALIDATION.md}</files_to_read>" +
    "<gaps>{gap list}</gaps>" +
    "<test_infrastructure>{framework, config, commands}</test_infrastructure>" +
    "<constraints>Never modify impl files. Max 3 debug iterations. Escalate impl bugs.</constraints>",
  subagent_type="gsd-nyquist-auditor",
  model="{AUDITOR_MODEL}",
  description="Fill validation gaps for Phase {N}"
)

Handle return:

  • ## GAPS FILLED → record tests + map updates, Step 6
  • ## PARTIAL → record resolved, move escalated to manual-only, Step 6
  • ## ESCALATE → move all to manual-only, Step 6

6. Generate/Update VALIDATION.md

State B (create):

  1. Read template from ~/.claude/get-shit-done/templates/VALIDATION.md
  2. Fill: frontmatter, Test Infrastructure, Per-Task Map, Manual-Only, Sign-Off
  3. Write to ${PHASE_DIR}/${PADDED_PHASE}-VALIDATION.md

State A (update):

  1. Update Per-Task Map statuses, add escalated to Manual-Only, update frontmatter
  2. Append audit trail:
## Validation Audit {date}
| Metric | Count |
|--------|-------|
| Gaps found | {N} |
| Resolved | {M} |
| Escalated | {K} |

7. Commit

git add {test_files}
git commit -m "test(phase-${PHASE}): add Nyquist validation tests"

node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit-docs "docs(phase-${PHASE}): add/update validation strategy"

8. Results + Routing

Compliant:

GSD > PHASE {N} IS NYQUIST-COMPLIANT
All requirements have automated verification.
▶ Next: /gsd:audit-milestone

Partial:

GSD > PHASE {N} VALIDATED (PARTIAL)
{M} automated, {K} manual-only.
▶ Retry: /gsd:validate-phase {N}

Display /clear reminder.

<success_criteria>

  • Nyquist config checked (exit if disabled)
  • Input state detected (A/B/C)
  • State C exits cleanly
  • PLAN/SUMMARY files read, requirement map built
  • Test infrastructure detected
  • Gaps classified (COVERED/PARTIAL/MISSING)
  • User gate with gap table
  • Auditor spawned with complete context
  • All three return formats handled
  • VALIDATION.md created or updated
  • Test files committed separately
  • Results with routing presented </success_criteria>