Skip to content

Give /squad plan validate real adversarial teeth #1757

Closed

Description

@bradygaster

Verdict

/squad plan validate does not currently have teeth. A neatly formatted bad plan passes clean.

What it checks today

workflows/squad.md, ## skill: squad-plan-validate (~L861) verifies structural well-formedness only:

  • TBD / TODO markers
  • Missing traceability
  • Epic with no stories
  • Dependency cycles
  • Task sized > L
  • Unresolved decisions
  • Missing metadata
  • Triage orphaning
  • Milestone gaps

Every one of those is a shape check. None of them ask whether the plan is a good idea.

What it should do

The design insight: validate is a GATE; Fact Checker's Devil's Advocate mode is a METHOD. Validate should invoke the DA pass and then emit its own verdict.

The DA pass contributes:

  1. Steelman of the opposition — strongest version of the counter-argument
  2. Load-bearing assumptions — what would invalidate the plan if untrue
  3. 30-day pre-mortem — concrete failure scenario
  4. Alternative approach sketch — so the chosen direction is a chosen direction
  5. Explicit risk acceptance — remaining risks named and consciously accepted

Validate then emits its own PASS / FAIL.

⚠️ Do not simply delegate to Fact Checker and forward its output. Validate owns the verdict. Fact Checker supplies the adversarial analysis; validate decides whether the plan clears the bar.

Ordering dependency

The program path currently runs plan validate after plan accept scope. It must run before both accepts, so the complete package gets challenged before anything is locked. See the long-path repair issue — these two should be sequenced together.

Where the code lives

workflows/squad.md, ## skill: squad-plan-validate (~L861).

⚠️ Never put a ## heading inside a ## skill: block — it closes implicitly at the next H2 and everything up to the next skill marker is silently discarded (~29 KB was lost this way once, and it still compiled clean). Skills use #####. Run npx vitest run test/gh-aw-quality.test.ts before pushing.

Origin

User directive, 2026-08-19 — "validate must truly beat the whole thing up and hold strong opinions." Recorded in .squad/decisions/inbox/coordinator-validate-must-have-teeth.md.

Activity

  1. bradygaster commented on Aug 20, 2026

    @bradygaster
    CollaboratorAuthor

    Flight sequencing note — revised 2026-08-20.

    Wave: 4.

    Depends on:

    Blocks: nothing else in this stream directly.

    Safe to run in parallel with: only non-workflows/squad.md work once dependencies are merged, such as #1770 and #1760. Do not parallelize with #1758.

    Why / evidence: current validation text is workflows/squad.md lines 869-916. #1758 must also edit the acceptance/validation order around lines 918-960, so those hunks are adjacent/overlapping in the same skill path. #1756 provides the upstream artifact contract at lines 577-609. Run npx vitest run test/gh-aw-quality.test.ts because lines 857-865 catch accidental inline-skill byte loss.

  2. added
    gh-awGitHub Agentic Workflows integration
    triagedIssue has been triaged
    wave:2-soonWave 2 — next 2-4 weeks
    and removed
    enhancementNew feature or improvement
    on Aug 20, 2026
  3. added
    squadSquad triage inbox — Lead will assign to a member
    on Aug 20, 2026
  4. bradygaster commented on Aug 20, 2026

    @bradygaster
    CollaboratorAuthor

    Triage note (2026-08-20): May be reclassified from enhancement → bug pending Experiment 3 (2026-08-21).

    \plan validate\ has never been run in a real E2E scenario — it sits in the never-exercised bucket alongside \�ctivate. We cannot currently distinguish between 'validate runs but produces lenient output' and 'validate effectively no-ops.'

    If tomorrow's E2E series shows that \plan validate\ currently no-ops (runs but makes no pass/fail decision and lets any plan through), then 'give validate teeth' is not a feature request — it is a bug report: the feature was shipped incomplete.

    Decision rule: Re-triage this issue after the 2026-08-21 E2E run produces a validate verdict.

    • If validate is observed to REJECT a plan: enhancement classification stands. Iterate on what 'reject' means.
    • If validate never rejects anything (or is never reached): reclassify as bug. 'Validate has no teeth' becomes a defect, not a request for new capability.

    This is connected to #1756's scope boundary: the structural contract (#1756) is pre-E2E because it targets the artifact shape the model emits. The judgment ('a well-formatted bad plan FAILS') is this issue, and it requires evidence from a run where validate was actually exercised before we can specify what failure looks like.

  5. bradygaster commented on Aug 23, 2026

    @bradygaster
    CollaboratorAuthor

    Cross-scope triage note from #1801

    Recommendation: do not absorb #1801 into #1757. Re-scope #1757 to the later adversarial-quality pass once #1801's deterministic false-green repair lands.

    Why: #1801 is a concrete bug in validation templates/artifact checking — literal pre-filled verdicts, omitted rows, and fail-open parsing. #1757 remains the broader plan validate feature: challenge assumptions, alternatives, and plan quality. Mixing them would let a subjective adversarial pass mask the concrete gate that must fail against today's recorded bad artifact.

  6. added 2 commits that reference this issue on Aug 25, 2026
    b5bfcc0
    2505e6c
  7. added a commit that references this issue on Aug 25, 2026
    63426de
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    gh-awGitHub Agentic Workflows integrationpriority:p1This sprintsquadSquad triage inbox — Lead will assign to a membertriagedIssue has been triagedtype:featureNew capabilitywave:2-soonWave 2 — next 2-4 weeks

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions