Skip to content

feat(aidd-qa): verify acceptance and show the journey, run both before the draft PR - #1012

Draft
blafourcade wants to merge 9 commits into
nextfrom
feat/qa-verify-and-demo
Draft

blafourcade wants to merge 9 commits into
nextfrom
feat/qa-verify-and-demo

Conversation

@blafourcade

@blafourcade blafourcade commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

What & why

Split acceptance QA (qa.md) from demonstration (browser video or CLI transcript), and wire both into SDLC Check. Keep procedures in their owning skills; SDLC holds the flow diagram.

QA and Demo total 1,209 words, down from 2,499 before this lean pass. Checker changes are limited to caller-required skill orchestration and two permissions.

Validation

  • Scripts suite: 688 pass. Six injected structural defects are caught; these checks do not prove skill execution.
  • Final-source Codex Demo CLI: stdout denied, expected exit status 2, verdict pass; candidate unchanged.
  • Native QA and full SDLC validation remain incomplete: API/timeouts and missing browser tooling. The completed skipped route was nonconforming (different checkers, PR opened despite Challenge findings). No new browser video passed validation.
  • QA fail → Deliver remains unproven end to end.

Linked issues

Closes #918
Closes #919

✅ I certify

  • I DO CERTIFY I READ EACH LINE OF THE PULL REQUEST BECAUSE I AM A SOFTWARE ENGINEER, NOT A AI PUPPY.

🤖 Generated with Claude Code

https://claude.ai/code/session_01VE16AxC1V9wAMGmGgefe4z

blafourcade and others added 9 commits October 12, 2026 22:01
Acceptance QA did two jobs: judging each scenario from its step results, and
producing a short reviewer video. The video rules filled most of the runner
reference, required ffmpeg, and fixed a 1280x720 frame that has nothing to do
with a verdict.

`01-acceptance-qa` now verifies only: `qa.md` with a verdict per scenario, the
step results as its proof, no recording and no media dependency. The new
`02-demo` takes a journey and a candidate and records one labelled video, with
the recording, encoding and validation rules moved from verify.

Measured with `claude -p` on a fixture app, against a copy of this plugin from
`next` and from this tree:
- Verify, 8 runs each side: verdicts by criterion, run verdict, out-of-interface
  and rejected sets identical; no video written; about 50 s a run instead of 85.
- Demo, 4 runs: a passing journey labelled `pass`, a planted bug labelled
  `fail`, each VP9 1280x720 under 12 s.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VE16AxC1V9wAMGmGgefe4z
Real runs on a fixture app showed acceptance QA improvising where its contract
was silent. It now:
- runs one happy path per journey, where a second journey used to be rejected
  untested;
- verifies a CLI criterion by its command, output and exit code, and leaves an
  API alone out of interface;
- never asks when another skill or agent invoked it, returning `blocked` with
  the question, and always writes `qa.md`;
- proves test-only storage in its own step before any start, by memory, an
  isolated fixture or the user, never by an environment name or inference;
- allows one fallback entry only when memory or a browser test names it;
- resolves viewport and permissions from the criterion, then memory, then the
  default;
- defines one observable condition for a vague outcome, probes a timed
  boundary on both sides, and measures a short transition inside `run-code`;
- defines what is destructive, and records `Limitations` without a new status.

Measured with `claude -p` against this tree, each case graded against an
expected result written before the run:
- signup golden 3/3 unchanged; todo golden 3/3 with the planted bug failing;
- API-only spec `skipped` 2/2; CLI pass and planted fail 2/2;
- toast within 2 s pass and over 2 s fail 2/2, with measured times;
- vague "flash" 3/3 measured as a style change and revert;
- 390x844 viewport 2/2; mobile without dimensions `blocked` 2/2;
- unproven storage `blocked` 3/3 with the app never started;
- crashing entry `blocked` 2/2; documented fallback `pass` 2/2.

The skill holds 1821 words, against 1521 after the split.

Refs #918

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VE16AxC1V9wAMGmGgefe4z
The demo now shows a journey through its own interface: a browser journey as
one video, a CLI journey as a transcript of the command, its output and its
exit status, so a CLI needs no ffmpeg. A failing journey is shown as observed
and labelled `fail`, never staged.

The artifact lands in the folder the caller names, else beside the journey's
source, and is named after its journey, never `happy-path` for a bug.
Invoked by another skill or agent, the demo asks nothing and returns paths and
labels; it offers to open a video only when the user invoked it directly.
Both routers take the `| Action | Does |` form.

Measured with `claude -p` against this tree, 2 runs a case:
- a `qa.md` scenario: video in the `qa/` folder beside it, named after the
  journey, VP9 under 12 s, `pass`;
- a bug, invoked by an agent: video in the caller's folder, `fail`, no question;
- a CLI journey, invoked by an agent: transcript in the caller's folder, `fail`
  on output `3` against `2`, no video, no question.

The demo holds 1059 words, against 1078 after the split.

Refs #918

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VE16AxC1V9wAMGmGgefe4z
…aft PR

Check reviewed the candidate and opened the draft pull request without ever
running acceptance QA, so criteria only a run could prove reached the pull
request unverified.

After Review clears, the checker now runs acceptance QA on the same contract
and candidate and routes its verdict: `pass` or `skipped` to Challenge, `fail`
to Deliver, `blocked` by its criteria to Frame, `blocked` by the environment to
a stop with the user action. On `pass` it runs the demo on the passing
scenarios. Only `qa.md` and its demo artifacts may then be new, any other
change re-enters Review, and a failed or blocked run is never committed. The
draft pull request receives `qa.md` and the artifact paths.

The checker may invoke both QA skills and writes only QA-owned paths. The
pull-request skill links whatever evidence its caller passes and never
presents a failed or blocked run as cleared. `aidd-qa` joins the recommended
plugins.

A guard pins each rule, red before the change; each mutation reddens its own
test.

Refs #919

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VE16AxC1V9wAMGmGgefe4z
The new handoff let only `qa.md` and its demo artifacts be new, and the checker
wrote only QA-owned paths, yet the same checker writes the review round in that
zone. Read literally, the review report was either never committed or sent the
run back to Review. Check again commits everything it wrote, never a failed or
blocked QA run, and a product or validator change still re-enters Review; the
checker writes only the reports its skills own.

Refs #919

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VE16AxC1V9wAMGmGgefe4z
With `aidd-qa` absent, an end-to-end run still produced a `qa.md` in the
template's shape and a recording: the checker ran QA by other means instead of
stopping, despite the general rule to verify each provider. Check now says it:
without the QA skill, stop with the instruction to install `aidd-qa`, never run
QA by other means. Rerun the same way, it stopped at the QA step with that
instruction, wrote no `qa.md` and opened no pull request.

Refs #919

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VE16AxC1V9wAMGmGgefe4z
Merge repeated rules and replace the verbose recording example with a compact
protocol while keeping exact values, reducing the demo from 1059 to 691 words.

Six real claude -p runs against frozen plugin copies retained observed outcomes:
two qa.md scenarios produced qa/signup-with-email.webm labelled pass (vp9,
1280 wide, 4.75 s and 4.4 s); two agent-invoked bug journeys produced
demo/delete-buy-milk.webm labelled fail (vp9, 1280 wide, 9.5 s and 9.67 s)
without a question; two agent-invoked CLI journeys produced demo/count-a-b.txt
labelled fail without a question.

Refs #918

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VE16AxC1V9wAMGmGgefe4z
Keep procedure details in their owning skills and SDLC routing in its
diagram. Reduce QA and demo from 2499 to 1204 words.

Validation: 688 static tests pass; all six injected structural defects
are detected. Codex demo CLI passes with the expected exit status 2.
Full native QA and SDLC validation remains incomplete due to API and
tooling failures; the skipped-route run is nonconforming.

Refs #918
Refs #919
Keep capability descriptions with the plugin, flow inputs in the diagram,
and report fields in the existing template. Preserve one skill per call.

Refs #918
Refs #919
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant