From 6eb0b018f8aba2f15011d69cc74176f3794c5ef7 Mon Sep 17 00:00:00 2001 From: alexsoyes Date: Thu, 23 Jul 2026 16:44:45 +0200 Subject: [PATCH 01/12] feat(aidd-dev): add standalone QA journey evidence --- README.md | 6 +-- docs/CATALOG.md | 3 +- plugins/aidd-dev/.claude-plugin/plugin.json | 5 ++- plugins/aidd-dev/CATALOG.md | 14 +++++++ plugins/aidd-dev/README.md | 3 +- .../skills/01-plan/actions/04-plan.md | 2 +- .../skills/01-plan/assets/phase-template.md | 26 +++++++++++++ plugins/aidd-dev/skills/11-qa/SKILL.md | 29 +++++++++++++++ .../skills/11-qa/actions/01-load-scope.md | 23 ++++++++++++ .../skills/11-qa/actions/02-choose-video.md | 21 +++++++++++ .../skills/11-qa/actions/03-run-scope.md | 31 ++++++++++++++++ .../skills/11-qa/actions/04-save-evidence.md | 26 +++++++++++++ .../11-qa/actions/05-offer-pr-upload.md | 26 +++++++++++++ .../save-evidence-qa-report-template.md | 26 +++++++++++++ .../references/run-scope-playwright-cli.md | 37 +++++++++++++++++++ 15 files changed, 270 insertions(+), 8 deletions(-) create mode 100644 plugins/aidd-dev/skills/11-qa/SKILL.md create mode 100644 plugins/aidd-dev/skills/11-qa/actions/01-load-scope.md create mode 100644 plugins/aidd-dev/skills/11-qa/actions/02-choose-video.md create mode 100644 plugins/aidd-dev/skills/11-qa/actions/03-run-scope.md create mode 100644 plugins/aidd-dev/skills/11-qa/actions/04-save-evidence.md create mode 100644 plugins/aidd-dev/skills/11-qa/actions/05-offer-pr-upload.md create mode 100644 plugins/aidd-dev/skills/11-qa/assets/save-evidence-qa-report-template.md create mode 100644 plugins/aidd-dev/skills/11-qa/references/run-scope-playwright-cli.md diff --git a/README.md b/README.md index cfafe29fb..5c6e811f5 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ ## Agentic framework for software engineers to produce 100% quality code with IA, agonistically.

- 7 plugins · 40 skills · 2 agents · MIT + 7 plugins · 41 skills · 2 agents · MIT

[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) @@ -229,9 +229,9 @@ Project init, memory bank, context-artifact generation, diagrams, learning, expl ### ⚙️ [aidd-dev](plugins/aidd-dev/README.md) -`11 skills` · stable +`12 skills` · stable -SDLC loop: plan, implement, assert, audit, review, test, refactor, debug. +SDLC loop: plan, implement, assert, audit, review, test, refactor, debug. Standalone QA records UI evidence. diff --git a/docs/CATALOG.md b/docs/CATALOG.md index dff6ad294..922948f05 100644 --- a/docs/CATALOG.md +++ b/docs/CATALOG.md @@ -34,7 +34,7 @@ Bootstrap, project init, context-artifact generation, diagrams, learning, and ex ## 💻 aidd-dev -The development SDLC: plan, implement, assert, audit, review, test, refactor, debug, for-sure, todo. +The development SDLC: plan, implement, assert, audit, review, test, refactor, debug, for-sure, todo. Standalone QA records UI evidence. | Skill | Role | Actions | | --------------- | -------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | @@ -49,6 +49,7 @@ The development SDLC: plan, implement, assert, audit, review, test, refactor, de | `08-debug` | Reproduce and fix bugs with a test-driven workflow | `01-reproduce`, `02-debug`, `03-reflect-issue` | | `09-for-sure` | Iterative loop that retries until a success condition is met | `01-init-tracking`, `02-auto-accept`, `03-autonomous-loop` | | `10-todo` | Split the prompt into independent todos, run one implementer agent per todo in parallel | `01-todo` | +| `11-qa` | Run post-review UI QA and save reviewer evidence | `01-load-scope`, `02-choose-video`, `03-run-scope`, `04-save-evidence`, `05-offer-pr-upload` | ## 📋 aidd-pm diff --git a/plugins/aidd-dev/.claude-plugin/plugin.json b/plugins/aidd-dev/.claude-plugin/plugin.json index ae392460a..68a886a36 100644 --- a/plugins/aidd-dev/.claude-plugin/plugin.json +++ b/plugins/aidd-dev/.claude-plugin/plugin.json @@ -2,7 +2,7 @@ "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "aidd-dev", "version": "2.3.1", - "description": "Code transformation: Dev SDLC orchestrator (code-shipping pipeline), plan, assert, audit, review, test, refactor, debug, for-sure. Hosts engineering agents.", + "description": "Code transformation: Dev SDLC orchestrator, plan, assert, audit, review, test, refactor, debug, for-sure, plus standalone QA evidence. Hosts engineering agents.", "author": { "name": "AI-Driven Dev", "url": "https://github.com/ai-driven-dev" @@ -18,7 +18,8 @@ "./skills/07-refactor", "./skills/08-debug", "./skills/09-for-sure", - "./skills/10-todo" + "./skills/10-todo", + "./skills/11-qa" ], "agents": [ "./agents/executor.md", diff --git a/plugins/aidd-dev/CATALOG.md b/plugins/aidd-dev/CATALOG.md index 399feb29a..2a137ffc2 100644 --- a/plugins/aidd-dev/CATALOG.md +++ b/plugins/aidd-dev/CATALOG.md @@ -20,6 +20,7 @@ Auto-generated index of skills, agents, references and assets shipped by the `ai - [`skills/08-debug`](#skills08-debug) - [`skills/09-for-sure`](#skills09-for-sure) - [`skills/10-todo`](#skills10-todo) + - [`skills/11-qa`](#skills11-qa) --- @@ -156,3 +157,16 @@ Auto-generated index of skills, agents, references and assets shipped by the `ai | `actions` | [01-todo.md](skills/10-todo/actions/01-todo.md) | - | | `-` | [SKILL.md](skills/10-todo/SKILL.md) | `Split the user prompt into independent todos and run one executor agent per todo in parallel, then report a minimal table. Use when the user says "todo" or asks to fan out a multi-part request into parallel implementations.` | +#### `skills/11-qa` + +| Group | File | Description | +|-------|------|---| +| `actions` | [01-load-scope.md](skills/11-qa/actions/01-load-scope.md) | - | +| `actions` | [02-choose-video.md](skills/11-qa/actions/02-choose-video.md) | - | +| `actions` | [03-run-scope.md](skills/11-qa/actions/03-run-scope.md) | - | +| `actions` | [04-save-evidence.md](skills/11-qa/actions/04-save-evidence.md) | - | +| `actions` | [05-offer-pr-upload.md](skills/11-qa/actions/05-offer-pr-upload.md) | - | +| `assets` | [save-evidence-qa-report-template.md](skills/11-qa/assets/save-evidence-qa-report-template.md) | - | +| `references` | [run-scope-playwright-cli.md](skills/11-qa/references/run-scope-playwright-cli.md) | - | +| `-` | [SKILL.md](skills/11-qa/SKILL.md) | `Run post-review QA for a planned UI feature and produce reviewer evidence. Use when the user wants to validate a happy path, exercise edge cases, record QA video, or prepare QA evidence for a pull request. Not for writing automated tests, reviewing a diff, or fixing the application.` | + diff --git a/plugins/aidd-dev/README.md b/plugins/aidd-dev/README.md index c214a1cc0..c1e6c7aa9 100644 --- a/plugins/aidd-dev/README.md +++ b/plugins/aidd-dev/README.md @@ -8,7 +8,7 @@ Code transformation plugin for the AI-Driven Development framework. First time? Install with `/plugin install aidd-dev@aidd-framework`, then run `aidd-dev:00-sdlc`. -Covers the full SDLC coding loop: orchestrator, planning, implementation, assertions, audits, code review, testing, refactoring, debugging, for-sure, and parallel todo fan-out. Also hosts AI agents. +Covers the full SDLC coding loop: orchestrator, planning, implementation, assertions, audits, code review, testing, refactoring, debugging, for-sure, and parallel todo fan-out. Standalone QA records UI evidence. Also hosts AI agents. ## Skills @@ -25,6 +25,7 @@ Covers the full SDLC coding loop: orchestrator, planning, implementation, assert | [2.8] | [debug](skills/08-debug/SKILL.md) | Reproduce and fix bugs systematically using test-driven workflow, root cause analysis, and hypothesis validation. | | [2.9] | [for-sure](skills/09-for-sure/SKILL.md) | Iterative agent loop that tracks attempts and retries until a success condition is met. | | [2.10] | [todo](skills/10-todo/SKILL.md) | Split the prompt into independent todos, run one executor agent per todo in parallel, then report a minimal table. | +| [2.11] | [qa](skills/11-qa/SKILL.md) | Run post-review UI QA from the planned happy path and edge cases, then save reviewer evidence. | ## Agents diff --git a/plugins/aidd-dev/skills/01-plan/actions/04-plan.md b/plugins/aidd-dev/skills/01-plan/actions/04-plan.md index 627681e32..810c7f0e5 100644 --- a/plugins/aidd-dev/skills/01-plan/actions/04-plan.md +++ b/plugins/aidd-dev/skills/01-plan/actions/04-plan.md @@ -14,7 +14,7 @@ A feature folder, always at `aidd_docs/tasks//_ observable expected outcome`; each edge case also names its trigger. Add edge cases only when their trigger and expected outcome are known. Keep a phase's Wireframe only when that phase ships UI. 4. **Show.** Display the written paths. 5. **Review.** Show the complete plan and its phases with a confidence score (0 to 10, ✓ reasons and ✗ risks). Take feedback, revise the files, and re-show until approved. The score is never written to the plan. diff --git a/plugins/aidd-dev/skills/01-plan/assets/phase-template.md b/plugins/aidd-dev/skills/01-plan/assets/phase-template.md index 5718c0cdd..359d4c348 100644 --- a/plugins/aidd-dev/skills/01-plan/assets/phase-template.md +++ b/plugins/aidd-dev/skills/01-plan/assets/phase-template.md @@ -21,6 +21,32 @@ flowchart TD A[TODO] ``` +## Test Scope + + + +### Happy Path + +```mermaid +--- +title: Happy path +--- +journey + section {journey stage} + {action} => {observable expected outcome}: 5: {actor} +``` + +### Edge Cases + +```mermaid +--- +title: Edge cases +--- +journey + section {edge-case scenario} + {trigger} => {action} => {observable expected outcome}: 1: {actor} +``` + ## Wireframe diff --git a/plugins/aidd-dev/skills/11-qa/SKILL.md b/plugins/aidd-dev/skills/11-qa/SKILL.md new file mode 100644 index 000000000..ce5816649 --- /dev/null +++ b/plugins/aidd-dev/skills/11-qa/SKILL.md @@ -0,0 +1,29 @@ +--- +name: 11-qa +description: Run post-review QA for a planned UI feature and produce reviewer evidence. Use when the user wants to validate a happy path, exercise edge cases, record QA video, or prepare QA evidence for a pull request. Not for writing automated tests, reviewing a diff, or fixing the application. +argument-hint: load-scope | choose-video | run-scope | save-evidence | offer-pr-upload +--- + +# QA + +Validate a reviewed UI feature through its planned test scope and produce evidence for reviewers. + +## Actions + +| # | Action | Role | Input | +| --- | ----------------- | -------------------------------------------------------- | ----------------------------- | +| 01 | `load-scope` | Load and show the planned happy path and edge cases | plan path | +| 02 | `choose-video` | Confirm happy-path or full-scope video coverage | displayed QA scope | +| 03 | `run-scope` | Execute every confirmed scenario and record its verdict | scope and video choice | +| 04 | `save-evidence` | Save QA media and the report in the feature folder | execution results | +| 05 | `offer-pr-upload` | Offer to add the main video to an existing pull request | saved evidence and pull request | + +Run `01 → 02 → 03 → 04 → 05` for a QA run. Run `05` alone only when saved QA evidence and an existing pull request are supplied. Run each action's Test before the next. +Before running an action, read its file in `actions/`, not only the table or assets. + +## Transversal rules + +- Run against a reviewed change. A failed scenario returns findings to the implementation loop. It never patches the application. +- Take the happy path and edge cases only from the plan's test scope. Propose additional edge cases only for the user to confirm. +- Save all evidence in the feature folder beside the plan and phases. +- An external pull request update requires an existing request and the user's approval. diff --git a/plugins/aidd-dev/skills/11-qa/actions/01-load-scope.md b/plugins/aidd-dev/skills/11-qa/actions/01-load-scope.md new file mode 100644 index 000000000..5536a31ae --- /dev/null +++ b/plugins/aidd-dev/skills/11-qa/actions/01-load-scope.md @@ -0,0 +1,23 @@ +# 01 - Load Scope + +Load the planned QA scope and show it to the user before execution. + +## Input + +The feature folder or plan path. + +## Output + +A QA scope table with one happy path, planned edge cases, proposed edge cases, and expected outcomes. + +## Process + +1. **Resolve.** Find the feature folder, its plan, and its phase files. +2. **Read.** Extract the happy path and edge cases from the test scope. Read the user journey and acceptance criteria only to resolve their expected outcomes. +3. **Propose.** Identify additional observable edge cases from untested boundaries or failures in the planned behavior. Label each as proposed and name its source. +4. **Show.** Display one table covering the happy path and every edge case. Ask the user to confirm the scenarios that will run. +5. **Stop.** Return a scope gap when the plan has no ordered happy path with expected outcomes. Never invent execution steps. + +## Test + +- The QA scope contains one ordered happy path and zero or more named edge cases with expected outcomes. diff --git a/plugins/aidd-dev/skills/11-qa/actions/02-choose-video.md b/plugins/aidd-dev/skills/11-qa/actions/02-choose-video.md new file mode 100644 index 000000000..fbf9f8007 --- /dev/null +++ b/plugins/aidd-dev/skills/11-qa/actions/02-choose-video.md @@ -0,0 +1,21 @@ +# 02 - Choose Video + +Confirm the video coverage before any scenario runs. + +## Input + +The confirmed QA scope. + +## Output + +One confirmed video coverage choice: `happy-path` for the happy path only, or `full-scope` for the happy path and every confirmed edge case. + +## Process + +1. **Present.** Show the `happy-path` and `full-scope` recording choices and name the scenarios each includes. +2. **Confirm.** Ask the user to choose `happy-path` or `full-scope`. +3. **Record.** Carry the confirmed choice into execution. Do not start browser recording before the choice is known. + +## Test + +- The confirmed choice is `happy-path` or `full-scope`, and full-scope includes every confirmed edge case. diff --git a/plugins/aidd-dev/skills/11-qa/actions/03-run-scope.md b/plugins/aidd-dev/skills/11-qa/actions/03-run-scope.md new file mode 100644 index 000000000..b760e5f90 --- /dev/null +++ b/plugins/aidd-dev/skills/11-qa/actions/03-run-scope.md @@ -0,0 +1,31 @@ +# 03 - Run Scope + +Execute every confirmed QA scenario and record actual behavior. + +## Input + +The confirmed QA scope, the application URL, the recording choice, and a pinned Playwright CLI version. + +## Output + +A verdict per scenario, with expected and actual outcomes and the requested video files. + +## Process + +1. **Resolve.** Confirm the application URL responds. Skip the QA run with a recorded reason when the UI is unavailable. +2. **Prepare.** Run the Playwright CLI through the pinned ephemeral command in the referenced runner contract. Do not add `@playwright/test` to the application dependencies. +3. **Configure.** Give this run an isolated named browser session. Start a lightweight WebM recording before the happy path. Start edge-case recording only for full-scope coverage. +4. **Run.** Execute the happy path, then every confirmed edge case. Compare each observed outcome with its expected outcome. +5. **Capture.** Record the actual result and a screenshot for every scenario. Stop each video before closing its browser session. Collect its saved WebM file after it stops. +6. **Verdict.** Mark the QA run failed when any scenario fails. Continue only with scenarios whose results remain meaningful, and record every invalidated downstream scenario. + +```md +@../references/run-scope-playwright-cli.md +``` + +## Test + +- Every confirmed scenario records expected and actual outcomes and a screenshot. +- The run records the exact Playwright CLI package version and uses an isolated named session. +- Every requested WebM file exists after its browser context closes. +- A scenario whose actual outcome differs from its expected outcome is marked failed and makes the overall QA verdict fail. diff --git a/plugins/aidd-dev/skills/11-qa/actions/04-save-evidence.md b/plugins/aidd-dev/skills/11-qa/actions/04-save-evidence.md new file mode 100644 index 000000000..7f979ca95 --- /dev/null +++ b/plugins/aidd-dev/skills/11-qa/actions/04-save-evidence.md @@ -0,0 +1,26 @@ +# 04 - Save Evidence + +Save the QA report and its media beside the feature plan and phases. + +## Input + +The QA scope, scenario verdicts, screenshots, requested WebM files, and the recording choice. + +## Output + +A `qa.md` report and a `qa/` media directory in the feature folder. + +## Process + +1. **Resolve.** Use the feature folder resolved from the plan. Create its `qa/` directory when evidence exists. +2. **Copy.** Save every retained WebM file and screenshot under `qa/` with a scenario-based name. +3. **Report.** Fill the QA report from the action asset. Include the scope, every verdict, each evidence path, and any invalidated scenario. +4. **Check.** Verify each path in the report exists. Omit edge-case video entries when the user selected happy-path coverage. + +```md +@../assets/save-evidence-qa-report-template.md +``` + +## Test + +- The task folder contains qa.md and each referenced media file exists. diff --git a/plugins/aidd-dev/skills/11-qa/actions/05-offer-pr-upload.md b/plugins/aidd-dev/skills/11-qa/actions/05-offer-pr-upload.md new file mode 100644 index 000000000..c24b6d52f --- /dev/null +++ b/plugins/aidd-dev/skills/11-qa/actions/05-offer-pr-upload.md @@ -0,0 +1,26 @@ +# 05 - Offer Pull Request Upload + +Offer to add the main QA video to an existing pull request. + +## Input + +The saved QA report, the happy-path WebM file, and the current branch. + +## Output + +An updated pull request body after approval and a supported attachment capability, or a reported QA evidence path and status. + +## Process + +1. **Detect.** Resolve whether the current branch already has an open pull request through the project's configured VCS read capability. +2. **Report.** When no pull request exists, report both `qa.md` and `qa/happy-path.webm`. Stop without an external update. +3. **Offer.** When a pull request exists, show `qa/happy-path.webm` and ask the user to approve the update. +4. **Attach.** After approval, use a configured VCS UI capability that can attach local files. Add the resulting video URL to the pull request body without removing its existing content. +5. **Block.** When no attachment-capable VCS UI is available, report `blocked: attachment-capability-unavailable`. Never claim the video was uploaded. +6. **Confirm.** Verify the pull request body contains the uploaded video URL. Record its URL in `qa.md`. + +## Test + +- Without a pull request, no external update occurs and the qa.md and main WebM paths are reported. +- With a pull request, user approval, and an attachment-capable VCS UI, the body contains the video URL. +- Without an attachment-capable VCS UI, the action reports `blocked: attachment-capability-unavailable` and does not claim success. diff --git a/plugins/aidd-dev/skills/11-qa/assets/save-evidence-qa-report-template.md b/plugins/aidd-dev/skills/11-qa/assets/save-evidence-qa-report-template.md new file mode 100644 index 000000000..8b05459b1 --- /dev/null +++ b/plugins/aidd-dev/skills/11-qa/assets/save-evidence-qa-report-template.md @@ -0,0 +1,26 @@ + + +# QA: {{feature}} + +- **Verdict**: {{pass | fail | skipped}} +- **Plan**: `{{plan-path}}` +- **Run**: {{yyyy_mm_dd}} + +## Scope + +| Scenario | Kind | Source | Expected Outcome | +| -------- | ---- | ------ | ---------------- | + +## Happy Path + +| Step | Expected | Actual | Verdict | Impact | Evidence | +| ---- | -------- | ------ | ------- | ------ | -------- | + +## Edge Cases + +| Scenario | Source | Expected | Actual | Verdict | Impact | Evidence | +| -------- | ------ | -------- | ------ | ------- | ------ | -------- | + +## Pull Request + +- {{pull-request-url, or no pull request}} diff --git a/plugins/aidd-dev/skills/11-qa/references/run-scope-playwright-cli.md b/plugins/aidd-dev/skills/11-qa/references/run-scope-playwright-cli.md new file mode 100644 index 000000000..25f17e51a --- /dev/null +++ b/plugins/aidd-dev/skills/11-qa/references/run-scope-playwright-cli.md @@ -0,0 +1,37 @@ +# Playwright CLI runner + +Run browser QA through the Playwright Agent CLI. It produces human-viewable WebM recordings without adding a test dependency to the application. + +## Invocation + +Use the exact package version supplied to the QA run. The current framework pin is `0.1.17`. + +```bash +npx --yes @playwright/cli@0.1.17 -s=qa- +``` + +Record the package version and the full command prefix in the QA result. Upgrade the pin deliberately with the framework, never by using `latest` during a QA run. + +## Browser provisioning + +The CLI downloads Chromium when it first needs a browser. Prewarm it when a local machine or CI job must avoid that delay. + +```bash +npx --yes @playwright/cli@0.1.17 install-browser +``` + +On Linux, add `--with-deps` when the environment lacks Chromium system dependencies. Browser binaries live outside the application repository. + +## Recording contract + +Use one named session per QA run. It prevents concurrent QA runs from sharing browser state. + +```bash +npx --yes @playwright/cli@0.1.17 -s=qa- video-start happy-path.webm --size=800x600 +npx --yes @playwright/cli@0.1.17 -s=qa- video-chapter "" +# Drive the scenario with the same session. +npx --yes @playwright/cli@0.1.17 -s=qa- video-stop +npx --yes @playwright/cli@0.1.17 -s=qa- close +``` + +`video-stop` writes the file under `.playwright-cli/` in the current directory. Action `save-evidence` moves the retained WebM files into the feature's `qa/` directory. Use a separate recording for each requested edge case. Add chapters only for meaningful user-visible milestones. From aee73be6948b17f44eca2da61ebb2ed856688bad Mon Sep 17 00:00:00 2001 From: alexsoyes Date: Fri, 24 Jul 2026 14:02:31 +0200 Subject: [PATCH 02/12] feat(aidd-dev): generalize test-scope journeys --- .../skills/01-plan/actions/04-plan.md | 2 +- .../skills/01-plan/assets/phase-template.md | 19 ++++--------------- 2 files changed, 5 insertions(+), 16 deletions(-) diff --git a/plugins/aidd-dev/skills/01-plan/actions/04-plan.md b/plugins/aidd-dev/skills/01-plan/actions/04-plan.md index 810c7f0e5..5bbf7ef70 100644 --- a/plugins/aidd-dev/skills/01-plan/actions/04-plan.md +++ b/plugins/aidd-dev/skills/01-plan/actions/04-plan.md @@ -14,7 +14,7 @@ A feature folder, always at `aidd_docs/tasks//_ observable expected outcome`; each edge case also names its trigger. Add edge cases only when their trigger and expected outcome are known. Keep a phase's Wireframe only when that phase ships UI. +3. **Fill.** Scaffold from the templates, filling only what qualifies and omitting any section whose bar nothing meets. Slice the projection across the phases. Resources lists external sources only, not code files. Decisions holds architecture-magnitude choices only. For every phase, express the Test Scope happy path and edge cases in one Mermaid user journey. Each task states `action => observable expected outcome`; each edge case also names its trigger. Add edge cases only when their trigger and expected outcome are known. Keep a phase's Wireframe only when that phase ships UI. 4. **Show.** Display the written paths. 5. **Review.** Show the complete plan and its phases with a confidence score (0 to 10, ✓ reasons and ✗ risks). Take feedback, revise the files, and re-show until approved. The score is never written to the plan. diff --git a/plugins/aidd-dev/skills/01-plan/assets/phase-template.md b/plugins/aidd-dev/skills/01-plan/assets/phase-template.md index 359d4c348..e4a3f4724 100644 --- a/plugins/aidd-dev/skills/01-plan/assets/phase-template.md +++ b/plugins/aidd-dev/skills/01-plan/assets/phase-template.md @@ -23,27 +23,16 @@ flowchart TD ## Test Scope - - -### Happy Path + ```mermaid --- -title: Happy path +title: Test scope --- journey - section {journey stage} + section Happy path {action} => {observable expected outcome}: 5: {actor} -``` - -### Edge Cases - -```mermaid ---- -title: Edge cases ---- -journey - section {edge-case scenario} + section Edge case - {scenario} {trigger} => {action} => {observable expected outcome}: 1: {actor} ``` From 6bba3f95097730cfa19e384f4c5673fb3648947e Mon Sep 17 00:00:00 2001 From: alexsoyes Date: Fri, 24 Jul 2026 14:02:44 +0200 Subject: [PATCH 03/12] refactor(aidd-dev): trim redundant QA action inputs --- plugins/aidd-dev/skills/11-qa/actions/01-load-scope.md | 2 +- plugins/aidd-dev/skills/11-qa/actions/02-choose-video.md | 1 - plugins/aidd-dev/skills/11-qa/actions/03-run-scope.md | 2 +- .../skills/11-qa/references/run-scope-playwright-cli.md | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/plugins/aidd-dev/skills/11-qa/actions/01-load-scope.md b/plugins/aidd-dev/skills/11-qa/actions/01-load-scope.md index 5536a31ae..c2636e1dc 100644 --- a/plugins/aidd-dev/skills/11-qa/actions/01-load-scope.md +++ b/plugins/aidd-dev/skills/11-qa/actions/01-load-scope.md @@ -13,7 +13,7 @@ A QA scope table with one happy path, planned edge cases, proposed edge cases, a ## Process 1. **Resolve.** Find the feature folder, its plan, and its phase files. -2. **Read.** Extract the happy path and edge cases from the test scope. Read the user journey and acceptance criteria only to resolve their expected outcomes. +2. **Read.** Extract the happy path, edge cases, and expected outcomes from the test scope. 3. **Propose.** Identify additional observable edge cases from untested boundaries or failures in the planned behavior. Label each as proposed and name its source. 4. **Show.** Display one table covering the happy path and every edge case. Ask the user to confirm the scenarios that will run. 5. **Stop.** Return a scope gap when the plan has no ordered happy path with expected outcomes. Never invent execution steps. diff --git a/plugins/aidd-dev/skills/11-qa/actions/02-choose-video.md b/plugins/aidd-dev/skills/11-qa/actions/02-choose-video.md index fbf9f8007..c44742eef 100644 --- a/plugins/aidd-dev/skills/11-qa/actions/02-choose-video.md +++ b/plugins/aidd-dev/skills/11-qa/actions/02-choose-video.md @@ -14,7 +14,6 @@ One confirmed video coverage choice: `happy-path` for the happy path only, or `f 1. **Present.** Show the `happy-path` and `full-scope` recording choices and name the scenarios each includes. 2. **Confirm.** Ask the user to choose `happy-path` or `full-scope`. -3. **Record.** Carry the confirmed choice into execution. Do not start browser recording before the choice is known. ## Test diff --git a/plugins/aidd-dev/skills/11-qa/actions/03-run-scope.md b/plugins/aidd-dev/skills/11-qa/actions/03-run-scope.md index b760e5f90..16833028b 100644 --- a/plugins/aidd-dev/skills/11-qa/actions/03-run-scope.md +++ b/plugins/aidd-dev/skills/11-qa/actions/03-run-scope.md @@ -4,7 +4,7 @@ Execute every confirmed QA scenario and record actual behavior. ## Input -The confirmed QA scope, the application URL, the recording choice, and a pinned Playwright CLI version. +The confirmed QA scope, the application URL, and the recording choice. ## Output diff --git a/plugins/aidd-dev/skills/11-qa/references/run-scope-playwright-cli.md b/plugins/aidd-dev/skills/11-qa/references/run-scope-playwright-cli.md index 25f17e51a..e67d4a545 100644 --- a/plugins/aidd-dev/skills/11-qa/references/run-scope-playwright-cli.md +++ b/plugins/aidd-dev/skills/11-qa/references/run-scope-playwright-cli.md @@ -4,7 +4,7 @@ Run browser QA through the Playwright Agent CLI. It produces human-viewable WebM ## Invocation -Use the exact package version supplied to the QA run. The current framework pin is `0.1.17`. +Use the framework pin below. The current version is `0.1.17`. ```bash npx --yes @playwright/cli@0.1.17 -s=qa- From 6070b03d456f11bc5cd3216f3040bce036042b94 Mon Sep 17 00:00:00 2001 From: alexsoyes Date: Fri, 24 Jul 2026 16:30:03 +0200 Subject: [PATCH 04/12] feat(aidd-dev): streamline browser QA evidence Lock executable journeys, minimize discovery, record short WebM evidence, and keep every feature artifact under its task folder. --- README.md | 2 +- docs/CATALOG.md | 4 +- plugins/aidd-dev/.claude-plugin/plugin.json | 2 +- plugins/aidd-dev/CATALOG.md | 10 ++-- plugins/aidd-dev/README.md | 4 +- .../skills/01-plan/actions/04-plan.md | 2 +- .../skills/01-plan/assets/phase-template.md | 6 ++- plugins/aidd-dev/skills/11-qa/SKILL.md | 31 ++++++------ .../skills/11-qa/actions/01-load-scope.md | 26 ++++++---- .../skills/11-qa/actions/02-choose-video.md | 20 -------- .../skills/11-qa/actions/02-prepare-run.md | 30 ++++++++++++ .../skills/11-qa/actions/03-run-scenarios.md | 41 ++++++++++++++++ .../skills/11-qa/actions/03-run-scope.md | 31 ------------ .../skills/11-qa/actions/04-save-evidence.md | 26 ---------- .../11-qa/actions/05-offer-pr-upload.md | 26 ---------- .../skills/11-qa/assets/qa-report-template.md | 12 +++++ .../save-evidence-qa-report-template.md | 26 ---------- .../references/run-scope-playwright-cli.md | 48 ++++++++++++++----- 18 files changed, 166 insertions(+), 181 deletions(-) delete mode 100644 plugins/aidd-dev/skills/11-qa/actions/02-choose-video.md create mode 100644 plugins/aidd-dev/skills/11-qa/actions/02-prepare-run.md create mode 100644 plugins/aidd-dev/skills/11-qa/actions/03-run-scenarios.md delete mode 100644 plugins/aidd-dev/skills/11-qa/actions/03-run-scope.md delete mode 100644 plugins/aidd-dev/skills/11-qa/actions/04-save-evidence.md delete mode 100644 plugins/aidd-dev/skills/11-qa/actions/05-offer-pr-upload.md create mode 100644 plugins/aidd-dev/skills/11-qa/assets/qa-report-template.md delete mode 100644 plugins/aidd-dev/skills/11-qa/assets/save-evidence-qa-report-template.md diff --git a/README.md b/README.md index 5c6e811f5..0aa4c8cc8 100644 --- a/README.md +++ b/README.md @@ -231,7 +231,7 @@ Project init, memory bank, context-artifact generation, diagrams, learning, expl `12 skills` · stable -SDLC loop: plan, implement, assert, audit, review, test, refactor, debug. Standalone QA records UI evidence. +SDLC loop: plan, implement, assert, audit, review, test, refactor, debug. Standalone QA records short UI evidence. diff --git a/docs/CATALOG.md b/docs/CATALOG.md index 922948f05..e9a07d1cc 100644 --- a/docs/CATALOG.md +++ b/docs/CATALOG.md @@ -34,7 +34,7 @@ Bootstrap, project init, context-artifact generation, diagrams, learning, and ex ## 💻 aidd-dev -The development SDLC: plan, implement, assert, audit, review, test, refactor, debug, for-sure, todo. Standalone QA records UI evidence. +The development SDLC: plan, implement, assert, audit, review, test, refactor, debug, for-sure, todo. Standalone QA records short UI evidence. | Skill | Role | Actions | | --------------- | -------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | @@ -49,7 +49,7 @@ The development SDLC: plan, implement, assert, audit, review, test, refactor, de | `08-debug` | Reproduce and fix bugs with a test-driven workflow | `01-reproduce`, `02-debug`, `03-reflect-issue` | | `09-for-sure` | Iterative loop that retries until a success condition is met | `01-init-tracking`, `02-auto-accept`, `03-autonomous-loop` | | `10-todo` | Split the prompt into independent todos, run one implementer agent per todo in parallel | `01-todo` | -| `11-qa` | Run post-review UI QA and save reviewer evidence | `01-load-scope`, `02-choose-video`, `03-run-scope`, `04-save-evidence`, `05-offer-pr-upload` | +| `11-qa` | Record short reviewer videos for a locked happy path and sourced edge cases | `01-load-scope`, `02-prepare-run`, `03-run-scenarios` | ## 📋 aidd-pm diff --git a/plugins/aidd-dev/.claude-plugin/plugin.json b/plugins/aidd-dev/.claude-plugin/plugin.json index 68a886a36..2747b8a21 100644 --- a/plugins/aidd-dev/.claude-plugin/plugin.json +++ b/plugins/aidd-dev/.claude-plugin/plugin.json @@ -2,7 +2,7 @@ "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "aidd-dev", "version": "2.3.1", - "description": "Code transformation: Dev SDLC orchestrator, plan, assert, audit, review, test, refactor, debug, for-sure, plus standalone QA evidence. Hosts engineering agents.", + "description": "Code transformation: Dev SDLC orchestrator, plan, assert, audit, review, test, refactor, debug, for-sure, plus short standalone QA evidence. Hosts engineering agents.", "author": { "name": "AI-Driven Dev", "url": "https://github.com/ai-driven-dev" diff --git a/plugins/aidd-dev/CATALOG.md b/plugins/aidd-dev/CATALOG.md index 2a137ffc2..634820511 100644 --- a/plugins/aidd-dev/CATALOG.md +++ b/plugins/aidd-dev/CATALOG.md @@ -162,11 +162,9 @@ Auto-generated index of skills, agents, references and assets shipped by the `ai | Group | File | Description | |-------|------|---| | `actions` | [01-load-scope.md](skills/11-qa/actions/01-load-scope.md) | - | -| `actions` | [02-choose-video.md](skills/11-qa/actions/02-choose-video.md) | - | -| `actions` | [03-run-scope.md](skills/11-qa/actions/03-run-scope.md) | - | -| `actions` | [04-save-evidence.md](skills/11-qa/actions/04-save-evidence.md) | - | -| `actions` | [05-offer-pr-upload.md](skills/11-qa/actions/05-offer-pr-upload.md) | - | -| `assets` | [save-evidence-qa-report-template.md](skills/11-qa/assets/save-evidence-qa-report-template.md) | - | +| `actions` | [02-prepare-run.md](skills/11-qa/actions/02-prepare-run.md) | - | +| `actions` | [03-run-scenarios.md](skills/11-qa/actions/03-run-scenarios.md) | - | +| `assets` | [qa-report-template.md](skills/11-qa/assets/qa-report-template.md) | - | | `references` | [run-scope-playwright-cli.md](skills/11-qa/references/run-scope-playwright-cli.md) | - | -| `-` | [SKILL.md](skills/11-qa/SKILL.md) | `Run post-review QA for a planned UI feature and produce reviewer evidence. Use when the user wants to validate a happy path, exercise edge cases, record QA video, or prepare QA evidence for a pull request. Not for writing automated tests, reviewing a diff, or fixing the application.` | +| `-` | [SKILL.md](skills/11-qa/SKILL.md) | `Run post-review browser QA and produce short named videos for a locked happy path and sourced edge cases. Use when the user wants concise reviewer evidence for a UI feature. Not for writing automated tests, reviewing a diff, or fixing the application.` | diff --git a/plugins/aidd-dev/README.md b/plugins/aidd-dev/README.md index c1e6c7aa9..a7c7d0f73 100644 --- a/plugins/aidd-dev/README.md +++ b/plugins/aidd-dev/README.md @@ -8,7 +8,7 @@ Code transformation plugin for the AI-Driven Development framework. First time? Install with `/plugin install aidd-dev@aidd-framework`, then run `aidd-dev:00-sdlc`. -Covers the full SDLC coding loop: orchestrator, planning, implementation, assertions, audits, code review, testing, refactoring, debugging, for-sure, and parallel todo fan-out. Standalone QA records UI evidence. Also hosts AI agents. +Covers the full SDLC coding loop: orchestrator, planning, implementation, assertions, audits, code review, testing, refactoring, debugging, for-sure, and parallel todo fan-out. Standalone QA records short UI evidence. Also hosts AI agents. ## Skills @@ -25,7 +25,7 @@ Covers the full SDLC coding loop: orchestrator, planning, implementation, assert | [2.8] | [debug](skills/08-debug/SKILL.md) | Reproduce and fix bugs systematically using test-driven workflow, root cause analysis, and hypothesis validation. | | [2.9] | [for-sure](skills/09-for-sure/SKILL.md) | Iterative agent loop that tracks attempts and retries until a success condition is met. | | [2.10] | [todo](skills/10-todo/SKILL.md) | Split the prompt into independent todos, run one executor agent per todo in parallel, then report a minimal table. | -| [2.11] | [qa](skills/11-qa/SKILL.md) | Run post-review UI QA from the planned happy path and edge cases, then save reviewer evidence. | +| [2.11] | [qa](skills/11-qa/SKILL.md) | Record one short named video for a locked happy path and each sourced edge case. | ## Agents diff --git a/plugins/aidd-dev/skills/01-plan/actions/04-plan.md b/plugins/aidd-dev/skills/01-plan/actions/04-plan.md index 5bbf7ef70..16563fe48 100644 --- a/plugins/aidd-dev/skills/01-plan/actions/04-plan.md +++ b/plugins/aidd-dev/skills/01-plan/actions/04-plan.md @@ -14,7 +14,7 @@ A feature folder, always at `aidd_docs/tasks//_ observable expected outcome`; each edge case also names its trigger. Add edge cases only when their trigger and expected outcome are known. Keep a phase's Wireframe only when that phase ships UI. +3. **Fill.** Scaffold from the templates, filling only what qualifies and omitting any section whose bar nothing meets. Slice the projection across the phases. Resources lists external sources only, not code files. Decisions holds architecture-magnitude choices only. For every phase, express setup, happy path, edge cases, and teardown in one Mermaid Test Scope. Setup names deterministic preconditions and fixtures. Each scenario task states `action => observable expected outcome`; each edge case also names its trigger. Add edge cases only when their trigger and expected outcome are known. Teardown is required when a scenario changes state. Keep a phase's Wireframe only when that phase ships UI. 4. **Show.** Display the written paths. 5. **Review.** Show the complete plan and its phases with a confidence score (0 to 10, ✓ reasons and ✗ risks). Take feedback, revise the files, and re-show until approved. The score is never written to the plan. diff --git a/plugins/aidd-dev/skills/01-plan/assets/phase-template.md b/plugins/aidd-dev/skills/01-plan/assets/phase-template.md index e4a3f4724..20962bced 100644 --- a/plugins/aidd-dev/skills/01-plan/assets/phase-template.md +++ b/plugins/aidd-dev/skills/01-plan/assets/phase-template.md @@ -23,17 +23,21 @@ flowchart TD ## Test Scope - + ```mermaid --- title: Test scope --- journey + section Setup + {deterministic precondition or fixture} => {ready state}: 5: {actor} section Happy path {action} => {observable expected outcome}: 5: {actor} section Edge case - {scenario} {trigger} => {action} => {observable expected outcome}: 1: {actor} + section Teardown + {cleanup or reset action} => {baseline restored}: 5: {actor} ``` ## Wireframe diff --git a/plugins/aidd-dev/skills/11-qa/SKILL.md b/plugins/aidd-dev/skills/11-qa/SKILL.md index ce5816649..1cd2d3751 100644 --- a/plugins/aidd-dev/skills/11-qa/SKILL.md +++ b/plugins/aidd-dev/skills/11-qa/SKILL.md @@ -1,29 +1,28 @@ --- name: 11-qa -description: Run post-review QA for a planned UI feature and produce reviewer evidence. Use when the user wants to validate a happy path, exercise edge cases, record QA video, or prepare QA evidence for a pull request. Not for writing automated tests, reviewing a diff, or fixing the application. -argument-hint: load-scope | choose-video | run-scope | save-evidence | offer-pr-upload +description: Run post-review browser QA and produce short named videos for a locked happy path and sourced edge cases. Use when the user wants concise reviewer evidence for a UI feature. Not for writing automated tests, reviewing a diff, or fixing the application. +argument-hint: load-scope | prepare-run | run-scenarios --- # QA -Validate a reviewed UI feature through its planned test scope and produce evidence for reviewers. +```mermaid +flowchart LR + scope["load-scope"] --> prepare["prepare-run"] --> run["run-scenarios"] +``` ## Actions -| # | Action | Role | Input | -| --- | ----------------- | -------------------------------------------------------- | ----------------------------- | -| 01 | `load-scope` | Load and show the planned happy path and edge cases | plan path | -| 02 | `choose-video` | Confirm happy-path or full-scope video coverage | displayed QA scope | -| 03 | `run-scope` | Execute every confirmed scenario and record its verdict | scope and video choice | -| 04 | `save-evidence` | Save QA media and the report in the feature folder | execution results | -| 05 | `offer-pr-upload` | Offer to add the main video to an existing pull request | saved evidence and pull request | +Read only the next action's file before running it. -Run `01 → 02 → 03 → 04 → 05` for a QA run. Run `05` alone only when saved QA evidence and an existing pull request are supplied. Run each action's Test before the next. -Before running an action, read its file in `actions/`, not only the table or assets. +| # | Action | Does | +| --- | --------------- | ---------------------------------------------------------- | +| 01 | `load-scope` | Lock one happy path and a bounded set of sourced edge cases | +| 02 | `prepare-run` | Resolve the shortest deterministic path to executable runs | +| 03 | `run-scenarios` | Record, normalize, verify, reset, and report every scenario | ## Transversal rules -- Run against a reviewed change. A failed scenario returns findings to the implementation loop. It never patches the application. -- Take the happy path and edge cases only from the plan's test scope. Propose additional edge cases only for the user to confirm. -- Save all evidence in the feature folder beside the plan and phases. -- An external pull request update requires an existing request and the user's approval. +- Run against a reviewed change and never patch the application. +- Never spawn agents. Batch independent reads and tool checks, but keep state-changing browser work sequential. +- Do not narrate action transitions, searches, fixtures, selectors, or successful checks. Report only a blocker, a required decision, or the final verdict and paths. diff --git a/plugins/aidd-dev/skills/11-qa/actions/01-load-scope.md b/plugins/aidd-dev/skills/11-qa/actions/01-load-scope.md index c2636e1dc..4a65cf3d4 100644 --- a/plugins/aidd-dev/skills/11-qa/actions/01-load-scope.md +++ b/plugins/aidd-dev/skills/11-qa/actions/01-load-scope.md @@ -1,23 +1,31 @@ # 01 - Load Scope -Load the planned QA scope and show it to the user before execution. +Lock the smallest defensible browser QA scope before execution. ## Input -The feature folder or plan path. +The user request, plus a feature folder, plan path, or implementation artifact. ## Output -A QA scope table with one happy path, planned edge cases, proposed edge cases, and expected outcomes. +One locked happy path, a bounded set of sourced edge cases, a source label, and a resolved evidence folder. ## Process -1. **Resolve.** Find the feature folder, its plan, and its phase files. -2. **Read.** Extract the happy path, edge cases, and expected outcomes from the test scope. -3. **Propose.** Identify additional observable edge cases from untested boundaries or failures in the planned behavior. Label each as proposed and name its source. -4. **Show.** Display one table covering the happy path and every edge case. Ask the user to confirm the scenarios that will run. -5. **Stop.** Return a scope gap when the plan has no ordered happy path with expected outcomes. Never invent execution steps. +1. **Resolve.** Resolve the exact requested feature and batch-read its plan plus directly referenced implementation artifacts. +2. **Lock.** Lock one happy path from the explicit user journey, then the plan Test Scope, then observable acceptance criteria in the implementation artifact. Ask one concise question only when those sources conflict or expose multiple journeys. +3. **Collect.** Include every planned edge case. Collect candidates from explicit validation, error, empty-state, permission, boundary, or recovery branches already visible in the implementation artifact. Search directly related tests only when the plan contains no edge case. +4. **Bound.** Deduplicate candidates against planned edges. Keep at most three proposed edges, ranked by user impact, browser observability, determinism, and proximity to the requested journey. +5. **Decide.** Automatically include a proposed edge only when it is deterministic, browser-observable, in scope, and non-destructive. Require a decision only for an external or destructive action. +6. **Validate.** Reject a scenario without a source, trigger, observable outcome, or executable teardown when it changes state. +7. **Locate.** Use the existing AIDD feature folder when the source belongs to one. Otherwise use `aidd_docs/tasks//_/`. +8. **Show.** Emit `Happy path: locked ()` and one compact `Edge case | Source | Decision` table. Do not repeat scenario steps. ## Test -- The QA scope contains one ordered happy path and zero or more named edge cases with expected outcomes. +- Exactly one happy path is locked with a source and observable outcome. +- Every planned edge case is included. +- At most three proposed edges remain; each has a distinct source, trigger, observable outcome, and decision. +- Every state-changing scenario has an executable teardown or reset. +- The source label and evidence folder are resolved whether the source is a plan, implementation artifact, or user request. +- The user-facing output contains one lock line and one edge-case table only. diff --git a/plugins/aidd-dev/skills/11-qa/actions/02-choose-video.md b/plugins/aidd-dev/skills/11-qa/actions/02-choose-video.md deleted file mode 100644 index c44742eef..000000000 --- a/plugins/aidd-dev/skills/11-qa/actions/02-choose-video.md +++ /dev/null @@ -1,20 +0,0 @@ -# 02 - Choose Video - -Confirm the video coverage before any scenario runs. - -## Input - -The confirmed QA scope. - -## Output - -One confirmed video coverage choice: `happy-path` for the happy path only, or `full-scope` for the happy path and every confirmed edge case. - -## Process - -1. **Present.** Show the `happy-path` and `full-scope` recording choices and name the scenarios each includes. -2. **Confirm.** Ask the user to choose `happy-path` or `full-scope`. - -## Test - -- The confirmed choice is `happy-path` or `full-scope`, and full-scope includes every confirmed edge case. diff --git a/plugins/aidd-dev/skills/11-qa/actions/02-prepare-run.md b/plugins/aidd-dev/skills/11-qa/actions/02-prepare-run.md new file mode 100644 index 000000000..a134f7181 --- /dev/null +++ b/plugins/aidd-dev/skills/11-qa/actions/02-prepare-run.md @@ -0,0 +1,30 @@ +# 02 - Prepare Run + +Resolve every operational dependency before retained recording begins. + +## Input + +The final QA scope and application URL. + +## Output + +A prepared run with a reachable application, authenticated sessions, deterministic fixtures, executable scenario steps, proven teardown, and available recording and media tools. + +## Process + +1. **Preflight.** Batch the independent checks for the application, pinned Playwright CLI, `ffprobe`, `ffmpeg`, and the fixed `1280×720` viewport. +2. **Reuse.** Read `aidd_docs/memory/testing.md` first when it exists. Resolve Browser QA entry, auth, fixtures, and reset from its `Browser QA` section, then a directly related browser test, then one targeted browser snapshot. Stop searching as soon as the run is executable. +3. **Authenticate.** Establish the required role before recording. Never include login discovery or secret lookup in evidence. +4. **Fixture.** Use deterministic data satisfying each setup. Never choose a live record by guesswork. +5. **Rehearse.** Rehearse only non-mutating steps and selectors. Never execute the final state-changing action merely to rehearse it. +6. **Reset.** Resolve an executable teardown for every state-changing scenario. If preparation changed state, execute the teardown and verify the baseline now; a future restart is not proof. +7. **Return.** Keep only the fixture, initial URL, minimal steps, expected outcome, teardown, and isolated session id per scenario. + +## Test + +- One batched preflight confirms the application, Playwright CLI, `ffprobe`, viewport, and `ffmpeg` availability. +- Existing Browser QA memory is used before any code or browser discovery; its absence does not block fallback. +- Every scenario uses a `1280×720` viewport. +- Every scenario has deterministic setup data, minimal executable steps, and an expected outcome. +- Every state-changing scenario has an executable reset; every preparation mutation was actually reset. +- No retained video exists at the end of preparation. diff --git a/plugins/aidd-dev/skills/11-qa/actions/03-run-scenarios.md b/plugins/aidd-dev/skills/11-qa/actions/03-run-scenarios.md new file mode 100644 index 000000000..761fe73cc --- /dev/null +++ b/plugins/aidd-dev/skills/11-qa/actions/03-run-scenarios.md @@ -0,0 +1,41 @@ +# 03 - Run Scenarios + +Execute, save, and report one clean browser QA take per scenario. + +## Input + +The prepared run, source label, and resolved evidence folder. + +## Output + +`/qa.md` and one final WebM per scenario under `/qa/`. + +## Process + +1. **Group.** Run at most two read-only scenarios concurrently in isolated sessions. Run every state-changing scenario sequentially. +2. **Record.** Apply setup before recording, start immediately before the first scenario action, and stop at the observable outcome. +3. **Verdict.** Compare actual with expected. Retain a product failure and mark the run failed. +4. **Recover.** Discard a setup or tooling failure, reset, and retry once. A second operational failure blocks the scenario. +5. **Reset.** Execute teardown after every state-changing take, verify the baseline, then close the session. +6. **Normalize.** Normalize at most two independent raw files concurrently. Save only `qa/happy-path.webm` and `qa/edge-case-.webm`, each at most 12 seconds and 1280 pixels wide. +7. **Clean.** Delete raw takes only after every final file passes codec, dimension, duration, and path checks. Never create screenshots or alternate media. +8. **Report.** Fill the report asset with the source label. Keep one result row per scenario and add Findings only for a failure or blocker. +9. **Return.** Output only the overall verdict, `qa.md` path, and final WebM paths, one item per line. + +```md +@../references/run-scope-playwright-cli.md +``` + +```md +@../assets/qa-report-template.md +``` + +## Test + +- `qa.md`, `qa/happy-path.webm`, and one `qa/edge-case-.webm` per locked edge case exist. +- Every final video is VP9 WebM, 1280 pixels wide, and at most 12 seconds. +- Every retained file contains only its scenario, with no setup, discovery, or operational retry. +- A product mismatch is retained as evidence and makes the overall verdict fail. +- Every state-changing scenario restores its baseline. +- The report contains its source and no unfilled `{{...}}` placeholder. +- No raw take, screenshot, alternate media, or external update remains. diff --git a/plugins/aidd-dev/skills/11-qa/actions/03-run-scope.md b/plugins/aidd-dev/skills/11-qa/actions/03-run-scope.md deleted file mode 100644 index 16833028b..000000000 --- a/plugins/aidd-dev/skills/11-qa/actions/03-run-scope.md +++ /dev/null @@ -1,31 +0,0 @@ -# 03 - Run Scope - -Execute every confirmed QA scenario and record actual behavior. - -## Input - -The confirmed QA scope, the application URL, and the recording choice. - -## Output - -A verdict per scenario, with expected and actual outcomes and the requested video files. - -## Process - -1. **Resolve.** Confirm the application URL responds. Skip the QA run with a recorded reason when the UI is unavailable. -2. **Prepare.** Run the Playwright CLI through the pinned ephemeral command in the referenced runner contract. Do not add `@playwright/test` to the application dependencies. -3. **Configure.** Give this run an isolated named browser session. Start a lightweight WebM recording before the happy path. Start edge-case recording only for full-scope coverage. -4. **Run.** Execute the happy path, then every confirmed edge case. Compare each observed outcome with its expected outcome. -5. **Capture.** Record the actual result and a screenshot for every scenario. Stop each video before closing its browser session. Collect its saved WebM file after it stops. -6. **Verdict.** Mark the QA run failed when any scenario fails. Continue only with scenarios whose results remain meaningful, and record every invalidated downstream scenario. - -```md -@../references/run-scope-playwright-cli.md -``` - -## Test - -- Every confirmed scenario records expected and actual outcomes and a screenshot. -- The run records the exact Playwright CLI package version and uses an isolated named session. -- Every requested WebM file exists after its browser context closes. -- A scenario whose actual outcome differs from its expected outcome is marked failed and makes the overall QA verdict fail. diff --git a/plugins/aidd-dev/skills/11-qa/actions/04-save-evidence.md b/plugins/aidd-dev/skills/11-qa/actions/04-save-evidence.md deleted file mode 100644 index 7f979ca95..000000000 --- a/plugins/aidd-dev/skills/11-qa/actions/04-save-evidence.md +++ /dev/null @@ -1,26 +0,0 @@ -# 04 - Save Evidence - -Save the QA report and its media beside the feature plan and phases. - -## Input - -The QA scope, scenario verdicts, screenshots, requested WebM files, and the recording choice. - -## Output - -A `qa.md` report and a `qa/` media directory in the feature folder. - -## Process - -1. **Resolve.** Use the feature folder resolved from the plan. Create its `qa/` directory when evidence exists. -2. **Copy.** Save every retained WebM file and screenshot under `qa/` with a scenario-based name. -3. **Report.** Fill the QA report from the action asset. Include the scope, every verdict, each evidence path, and any invalidated scenario. -4. **Check.** Verify each path in the report exists. Omit edge-case video entries when the user selected happy-path coverage. - -```md -@../assets/save-evidence-qa-report-template.md -``` - -## Test - -- The task folder contains qa.md and each referenced media file exists. diff --git a/plugins/aidd-dev/skills/11-qa/actions/05-offer-pr-upload.md b/plugins/aidd-dev/skills/11-qa/actions/05-offer-pr-upload.md deleted file mode 100644 index c24b6d52f..000000000 --- a/plugins/aidd-dev/skills/11-qa/actions/05-offer-pr-upload.md +++ /dev/null @@ -1,26 +0,0 @@ -# 05 - Offer Pull Request Upload - -Offer to add the main QA video to an existing pull request. - -## Input - -The saved QA report, the happy-path WebM file, and the current branch. - -## Output - -An updated pull request body after approval and a supported attachment capability, or a reported QA evidence path and status. - -## Process - -1. **Detect.** Resolve whether the current branch already has an open pull request through the project's configured VCS read capability. -2. **Report.** When no pull request exists, report both `qa.md` and `qa/happy-path.webm`. Stop without an external update. -3. **Offer.** When a pull request exists, show `qa/happy-path.webm` and ask the user to approve the update. -4. **Attach.** After approval, use a configured VCS UI capability that can attach local files. Add the resulting video URL to the pull request body without removing its existing content. -5. **Block.** When no attachment-capable VCS UI is available, report `blocked: attachment-capability-unavailable`. Never claim the video was uploaded. -6. **Confirm.** Verify the pull request body contains the uploaded video URL. Record its URL in `qa.md`. - -## Test - -- Without a pull request, no external update occurs and the qa.md and main WebM paths are reported. -- With a pull request, user approval, and an attachment-capable VCS UI, the body contains the video URL. -- Without an attachment-capable VCS UI, the action reports `blocked: attachment-capability-unavailable` and does not claim success. diff --git a/plugins/aidd-dev/skills/11-qa/assets/qa-report-template.md b/plugins/aidd-dev/skills/11-qa/assets/qa-report-template.md new file mode 100644 index 000000000..4cb53a5e8 --- /dev/null +++ b/plugins/aidd-dev/skills/11-qa/assets/qa-report-template.md @@ -0,0 +1,12 @@ +# QA: {{feature}} + +- **Verdict**: {{pass | fail | skipped}} +- **Source**: {{plan path | implementation path | user request}} +- **Run**: {{yyyy_mm_dd}} + +## Scenarios + +| Scenario | Result | Verdict | Evidence | Duration | +| -------- | ------ | ------- | -------- | -------- | + +{{findings-section-when-needed}} diff --git a/plugins/aidd-dev/skills/11-qa/assets/save-evidence-qa-report-template.md b/plugins/aidd-dev/skills/11-qa/assets/save-evidence-qa-report-template.md deleted file mode 100644 index 8b05459b1..000000000 --- a/plugins/aidd-dev/skills/11-qa/assets/save-evidence-qa-report-template.md +++ /dev/null @@ -1,26 +0,0 @@ - - -# QA: {{feature}} - -- **Verdict**: {{pass | fail | skipped}} -- **Plan**: `{{plan-path}}` -- **Run**: {{yyyy_mm_dd}} - -## Scope - -| Scenario | Kind | Source | Expected Outcome | -| -------- | ---- | ------ | ---------------- | - -## Happy Path - -| Step | Expected | Actual | Verdict | Impact | Evidence | -| ---- | -------- | ------ | ------- | ------ | -------- | - -## Edge Cases - -| Scenario | Source | Expected | Actual | Verdict | Impact | Evidence | -| -------- | ------ | -------- | ------ | ------- | ------ | -------- | - -## Pull Request - -- {{pull-request-url, or no pull request}} diff --git a/plugins/aidd-dev/skills/11-qa/references/run-scope-playwright-cli.md b/plugins/aidd-dev/skills/11-qa/references/run-scope-playwright-cli.md index e67d4a545..42087456e 100644 --- a/plugins/aidd-dev/skills/11-qa/references/run-scope-playwright-cli.md +++ b/plugins/aidd-dev/skills/11-qa/references/run-scope-playwright-cli.md @@ -10,28 +10,50 @@ Use the framework pin below. The current version is `0.1.17`. npx --yes @playwright/cli@0.1.17 -s=qa- ``` -Record the package version and the full command prefix in the QA result. Upgrade the pin deliberately with the framework, never by using `latest` during a QA run. +Upgrade the pin deliberately with the framework, never by using `latest` during a QA run. -## Browser provisioning +## Recording contract -The CLI downloads Chromium when it first needs a browser. Prewarm it when a local machine or CI job must avoid that delay. +Use one named session and one raw WebM per scenario. Fix the browser viewport and recording frame at `1280×720`. Reach the prepared initial state before `video-start`; stop immediately after the observable result. ```bash -npx --yes @playwright/cli@0.1.17 install-browser +npx --yes @playwright/cli@0.1.17 -s=qa-- resize 1280 720 +npx --yes @playwright/cli@0.1.17 -s=qa-- video-start raw-.webm --size=1280x720 +# Drive the scenario with the same session. +npx --yes @playwright/cli@0.1.17 -s=qa-- video-stop +npx --yes @playwright/cli@0.1.17 -s=qa-- close ``` -On Linux, add `--with-deps` when the environment lacks Chromium system dependencies. Browser binaries live outside the application repository. +`video-stop` writes under `.playwright-cli/` in the current directory. Use `raw-happy-path.webm` and `raw-edge-case-.webm`. -## Recording contract +## Duration gate -Use one named session per QA run. It prevents concurrent QA runs from sharing browser state. +Inspect every raw take in one call. ```bash -npx --yes @playwright/cli@0.1.17 -s=qa- video-start happy-path.webm --size=800x600 -npx --yes @playwright/cli@0.1.17 -s=qa- video-chapter "" -# Drive the scenario with the same session. -npx --yes @playwright/cli@0.1.17 -s=qa- video-stop -npx --yes @playwright/cli@0.1.17 -s=qa- close +ffprobe -v error -select_streams v:0 \ + -show_entries stream=codec_name,width,height:format=duration \ + -of json raw-.webm +``` + +When `ffmpeg` is unavailable, only an already-short raw take can pass. A take above 12 seconds reports `blocked: media-postprocess-unavailable`. + +Trim known dead time first. Re-encode without audio. + +```bash +ffmpeg -y -ss -to -i raw-.webm \ + -an -vf "fps=12,scale=1280:-2:force_original_aspect_ratio=decrease" \ + -c:v libvpx-vp9 -crf 36 -b:v 0 .webm ``` -`video-stop` writes the file under `.playwright-cli/` in the current directory. Action `save-evidence` moves the retained WebM files into the feature's `qa/` directory. Use a separate recording for each requested edge case. Add chapters only for meaningful user-visible milestones. +When the meaningful segment still exceeds 12 seconds, set `` to `duration / 12` and accelerate it. + +```bash +ffmpeg -y -i raw-.webm \ + -an -vf "setpts=PTS/,fps=12,scale=1280:-2:force_original_aspect_ratio=decrease" \ + -c:v libvpx-vp9 -crf 36 -b:v 0 .webm +``` + +Inspect the final file with the same `ffprobe` command. Require codec `vp9`, width `1280`, and duration at most 12 seconds. Never keep invalid reviewer evidence. + +Remove raw takes only after every final WebM passes the duration gate. From f7a49524ebad55c3fc164fc1176e79efbec62e11 Mon Sep 17 00:00:00 2001 From: alexsoyes Date: Fri, 24 Jul 2026 16:30:20 +0200 Subject: [PATCH 05/12] feat(aidd-context): add browser QA memory fields QA runs can reuse app entry, test auth, fixtures, and reset instructions without introducing another project configuration. --- .../assets/templates/memory/core/testing.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/plugins/aidd-context/skills/02-project-memory/assets/templates/memory/core/testing.md b/plugins/aidd-context/skills/02-project-memory/assets/templates/memory/core/testing.md index bc237a33b..bd6dc76e5 100644 --- a/plugins/aidd-context/skills/02-project-memory/assets/templates/memory/core/testing.md +++ b/plugins/aidd-context/skills/02-project-memory/assets/templates/memory/core/testing.md @@ -18,8 +18,14 @@ How the project is tested: the layers, the tools, and the conventions. Where tes - +## Browser QA + +- Entry: +- Auth: +- State: + From b13071603adc00859038a8e960185190a02c9ecd Mon Sep 17 00:00:00 2001 From: alexsoyes Date: Sat, 25 Jul 2026 14:04:05 +0200 Subject: [PATCH 06/12] feat(aidd-dev): scope QA to browser journeys The skill name and plan channels now make browser-only evidence explicit, preventing API, CLI, or system scenarios from entering Playwright runs. --- README.md | 6 ++-- docs/CATALOG.md | 4 +-- plugins/aidd-dev/.claude-plugin/plugin.json | 4 +-- plugins/aidd-dev/CATALOG.md | 16 ++++----- plugins/aidd-dev/README.md | 4 +-- .../skills/01-plan/actions/04-plan.md | 2 +- .../skills/01-plan/assets/phase-template.md | 10 +++--- .../skills/{11-qa => 11-browser-qa}/SKILL.md | 6 ++-- .../11-browser-qa/actions/01-load-scope.md | 33 +++++++++++++++++++ .../actions/02-prepare-run.md | 0 .../actions/03-run-scenarios.md | 0 .../assets/qa-report-template.md | 2 +- .../references/run-scope-playwright-cli.md | 0 .../skills/11-qa/actions/01-load-scope.md | 31 ----------------- 14 files changed, 60 insertions(+), 58 deletions(-) rename plugins/aidd-dev/skills/{11-qa => 11-browser-qa}/SKILL.md (82%) create mode 100644 plugins/aidd-dev/skills/11-browser-qa/actions/01-load-scope.md rename plugins/aidd-dev/skills/{11-qa => 11-browser-qa}/actions/02-prepare-run.md (100%) rename plugins/aidd-dev/skills/{11-qa => 11-browser-qa}/actions/03-run-scenarios.md (100%) rename plugins/aidd-dev/skills/{11-qa => 11-browser-qa}/assets/qa-report-template.md (91%) rename plugins/aidd-dev/skills/{11-qa => 11-browser-qa}/references/run-scope-playwright-cli.md (100%) delete mode 100644 plugins/aidd-dev/skills/11-qa/actions/01-load-scope.md diff --git a/README.md b/README.md index 0aa4c8cc8..d457a0658 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ ## Agentic framework for software engineers to produce 100% quality code with IA, agonistically.

- 7 plugins · 41 skills · 2 agents · MIT + 7 plugins · 42 skills · 2 agents · MIT

[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) @@ -229,9 +229,9 @@ Project init, memory bank, context-artifact generation, diagrams, learning, expl ### ⚙️ [aidd-dev](plugins/aidd-dev/README.md) -`12 skills` · stable +`13 skills` · stable -SDLC loop: plan, implement, assert, audit, review, test, refactor, debug. Standalone QA records short UI evidence. +SDLC loop: plan, implement, assert, audit, review, test, refactor, debug. Standalone Browser QA records short web evidence. diff --git a/docs/CATALOG.md b/docs/CATALOG.md index e9a07d1cc..c281df442 100644 --- a/docs/CATALOG.md +++ b/docs/CATALOG.md @@ -34,7 +34,7 @@ Bootstrap, project init, context-artifact generation, diagrams, learning, and ex ## 💻 aidd-dev -The development SDLC: plan, implement, assert, audit, review, test, refactor, debug, for-sure, todo. Standalone QA records short UI evidence. +The development SDLC: plan, implement, assert, audit, review, test, refactor, debug, for-sure, todo. Standalone Browser QA records short web evidence. | Skill | Role | Actions | | --------------- | -------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | @@ -49,7 +49,7 @@ The development SDLC: plan, implement, assert, audit, review, test, refactor, de | `08-debug` | Reproduce and fix bugs with a test-driven workflow | `01-reproduce`, `02-debug`, `03-reflect-issue` | | `09-for-sure` | Iterative loop that retries until a success condition is met | `01-init-tracking`, `02-auto-accept`, `03-autonomous-loop` | | `10-todo` | Split the prompt into independent todos, run one implementer agent per todo in parallel | `01-todo` | -| `11-qa` | Record short reviewer videos for a locked happy path and sourced edge cases | `01-load-scope`, `02-prepare-run`, `03-run-scenarios` | +| `11-browser-qa` | Record short reviewer videos for browser-scoped happy and edge cases | `01-load-scope`, `02-prepare-run`, `03-run-scenarios` | ## 📋 aidd-pm diff --git a/plugins/aidd-dev/.claude-plugin/plugin.json b/plugins/aidd-dev/.claude-plugin/plugin.json index 2747b8a21..fa247aa27 100644 --- a/plugins/aidd-dev/.claude-plugin/plugin.json +++ b/plugins/aidd-dev/.claude-plugin/plugin.json @@ -2,7 +2,7 @@ "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "aidd-dev", "version": "2.3.1", - "description": "Code transformation: Dev SDLC orchestrator, plan, assert, audit, review, test, refactor, debug, for-sure, plus short standalone QA evidence. Hosts engineering agents.", + "description": "Code transformation: Dev SDLC orchestrator, plan, assert, audit, review, test, refactor, debug, for-sure, plus short standalone Browser QA evidence. Hosts engineering agents.", "author": { "name": "AI-Driven Dev", "url": "https://github.com/ai-driven-dev" @@ -19,7 +19,7 @@ "./skills/08-debug", "./skills/09-for-sure", "./skills/10-todo", - "./skills/11-qa" + "./skills/11-browser-qa" ], "agents": [ "./agents/executor.md", diff --git a/plugins/aidd-dev/CATALOG.md b/plugins/aidd-dev/CATALOG.md index 634820511..5045f7d61 100644 --- a/plugins/aidd-dev/CATALOG.md +++ b/plugins/aidd-dev/CATALOG.md @@ -20,7 +20,7 @@ Auto-generated index of skills, agents, references and assets shipped by the `ai - [`skills/08-debug`](#skills08-debug) - [`skills/09-for-sure`](#skills09-for-sure) - [`skills/10-todo`](#skills10-todo) - - [`skills/11-qa`](#skills11-qa) + - [`skills/11-browser-qa`](#skills11-browser-qa) --- @@ -157,14 +157,14 @@ Auto-generated index of skills, agents, references and assets shipped by the `ai | `actions` | [01-todo.md](skills/10-todo/actions/01-todo.md) | - | | `-` | [SKILL.md](skills/10-todo/SKILL.md) | `Split the user prompt into independent todos and run one executor agent per todo in parallel, then report a minimal table. Use when the user says "todo" or asks to fan out a multi-part request into parallel implementations.` | -#### `skills/11-qa` +#### `skills/11-browser-qa` | Group | File | Description | |-------|------|---| -| `actions` | [01-load-scope.md](skills/11-qa/actions/01-load-scope.md) | - | -| `actions` | [02-prepare-run.md](skills/11-qa/actions/02-prepare-run.md) | - | -| `actions` | [03-run-scenarios.md](skills/11-qa/actions/03-run-scenarios.md) | - | -| `assets` | [qa-report-template.md](skills/11-qa/assets/qa-report-template.md) | - | -| `references` | [run-scope-playwright-cli.md](skills/11-qa/references/run-scope-playwright-cli.md) | - | -| `-` | [SKILL.md](skills/11-qa/SKILL.md) | `Run post-review browser QA and produce short named videos for a locked happy path and sourced edge cases. Use when the user wants concise reviewer evidence for a UI feature. Not for writing automated tests, reviewing a diff, or fixing the application.` | +| `actions` | [01-load-scope.md](skills/11-browser-qa/actions/01-load-scope.md) | - | +| `actions` | [02-prepare-run.md](skills/11-browser-qa/actions/02-prepare-run.md) | - | +| `actions` | [03-run-scenarios.md](skills/11-browser-qa/actions/03-run-scenarios.md) | - | +| `assets` | [qa-report-template.md](skills/11-browser-qa/assets/qa-report-template.md) | - | +| `references` | [run-scope-playwright-cli.md](skills/11-browser-qa/references/run-scope-playwright-cli.md) | - | +| `-` | [SKILL.md](skills/11-browser-qa/SKILL.md) | `Run post-review browser QA and produce short named videos for a locked happy path and sourced browser edge cases. Use when the user wants concise reviewer evidence for a web journey. Not for API, CLI, automated tests, diff review, or application fixes.` | diff --git a/plugins/aidd-dev/README.md b/plugins/aidd-dev/README.md index a7c7d0f73..938b9bfcd 100644 --- a/plugins/aidd-dev/README.md +++ b/plugins/aidd-dev/README.md @@ -8,7 +8,7 @@ Code transformation plugin for the AI-Driven Development framework. First time? Install with `/plugin install aidd-dev@aidd-framework`, then run `aidd-dev:00-sdlc`. -Covers the full SDLC coding loop: orchestrator, planning, implementation, assertions, audits, code review, testing, refactoring, debugging, for-sure, and parallel todo fan-out. Standalone QA records short UI evidence. Also hosts AI agents. +Covers the full SDLC coding loop: orchestrator, planning, implementation, assertions, audits, code review, testing, refactoring, debugging, for-sure, and parallel todo fan-out. Standalone Browser QA records short web evidence. Also hosts AI agents. ## Skills @@ -25,7 +25,7 @@ Covers the full SDLC coding loop: orchestrator, planning, implementation, assert | [2.8] | [debug](skills/08-debug/SKILL.md) | Reproduce and fix bugs systematically using test-driven workflow, root cause analysis, and hypothesis validation. | | [2.9] | [for-sure](skills/09-for-sure/SKILL.md) | Iterative agent loop that tracks attempts and retries until a success condition is met. | | [2.10] | [todo](skills/10-todo/SKILL.md) | Split the prompt into independent todos, run one executor agent per todo in parallel, then report a minimal table. | -| [2.11] | [qa](skills/11-qa/SKILL.md) | Record one short named video for a locked happy path and each sourced edge case. | +| [2.11] | [browser-qa](skills/11-browser-qa/SKILL.md) | Record one short named video for a locked browser happy path and each sourced browser edge case. | ## Agents diff --git a/plugins/aidd-dev/skills/01-plan/actions/04-plan.md b/plugins/aidd-dev/skills/01-plan/actions/04-plan.md index 16563fe48..94e5795be 100644 --- a/plugins/aidd-dev/skills/01-plan/actions/04-plan.md +++ b/plugins/aidd-dev/skills/01-plan/actions/04-plan.md @@ -14,7 +14,7 @@ A feature folder, always at `aidd_docs/tasks//_ observable expected outcome`; each edge case also names its trigger. Add edge cases only when their trigger and expected outcome are known. Teardown is required when a scenario changes state. Keep a phase's Wireframe only when that phase ships UI. +3. **Fill.** Scaffold from the templates, filling only what qualifies and omitting any section whose bar nothing meets. Slice the projection across the phases. Resources lists external sources only, not code files. Decisions holds architecture-magnitude choices only. For every phase, express setup, happy path, edge cases, and teardown in one Mermaid Test Scope. Setup names deterministic preconditions and fixtures. Mark every task with exactly one execution channel actor: `browser`, `api`, `cli`, or `system`. Keep one channel across all tasks in a Happy path or Edge case section; Setup and Teardown may differ. Each scenario task states `action => observable expected outcome`; each edge case also names its trigger. Add edge cases only when their trigger and expected outcome are known. Teardown is required when a scenario changes state. Keep a phase's Wireframe only when that phase ships UI. 4. **Show.** Display the written paths. 5. **Review.** Show the complete plan and its phases with a confidence score (0 to 10, ✓ reasons and ✗ risks). Take feedback, revise the files, and re-show until approved. The score is never written to the plan. diff --git a/plugins/aidd-dev/skills/01-plan/assets/phase-template.md b/plugins/aidd-dev/skills/01-plan/assets/phase-template.md index 20962bced..1816c0a50 100644 --- a/plugins/aidd-dev/skills/01-plan/assets/phase-template.md +++ b/plugins/aidd-dev/skills/01-plan/assets/phase-template.md @@ -23,7 +23,7 @@ flowchart TD ## Test Scope - + ```mermaid --- @@ -31,13 +31,13 @@ title: Test scope --- journey section Setup - {deterministic precondition or fixture} => {ready state}: 5: {actor} + {deterministic precondition or fixture} => {ready state}: 5: {setup channel} section Happy path - {action} => {observable expected outcome}: 5: {actor} + {action} => {observable expected outcome}: 5: {scenario channel} section Edge case - {scenario} - {trigger} => {action} => {observable expected outcome}: 1: {actor} + {trigger} => {action} => {observable expected outcome}: 1: {scenario channel} section Teardown - {cleanup or reset action} => {baseline restored}: 5: {actor} + {cleanup or reset action} => {baseline restored}: 5: {teardown channel} ``` ## Wireframe diff --git a/plugins/aidd-dev/skills/11-qa/SKILL.md b/plugins/aidd-dev/skills/11-browser-qa/SKILL.md similarity index 82% rename from plugins/aidd-dev/skills/11-qa/SKILL.md rename to plugins/aidd-dev/skills/11-browser-qa/SKILL.md index 1cd2d3751..78214a371 100644 --- a/plugins/aidd-dev/skills/11-qa/SKILL.md +++ b/plugins/aidd-dev/skills/11-browser-qa/SKILL.md @@ -1,10 +1,10 @@ --- -name: 11-qa -description: Run post-review browser QA and produce short named videos for a locked happy path and sourced edge cases. Use when the user wants concise reviewer evidence for a UI feature. Not for writing automated tests, reviewing a diff, or fixing the application. +name: 11-browser-qa +description: Run post-review browser QA and produce short named videos for a locked happy path and sourced browser edge cases. Use when the user wants concise reviewer evidence for a web journey. Not for API, CLI, automated tests, diff review, or application fixes. argument-hint: load-scope | prepare-run | run-scenarios --- -# QA +# Browser QA ```mermaid flowchart LR diff --git a/plugins/aidd-dev/skills/11-browser-qa/actions/01-load-scope.md b/plugins/aidd-dev/skills/11-browser-qa/actions/01-load-scope.md new file mode 100644 index 000000000..f23dd190d --- /dev/null +++ b/plugins/aidd-dev/skills/11-browser-qa/actions/01-load-scope.md @@ -0,0 +1,33 @@ +# 01 - Load Scope + +Lock the smallest defensible browser QA scope before execution. + +## Input + +The user request, plus a feature folder, plan path, or implementation artifact. + +## Output + +One locked browser happy path, a bounded set of sourced browser edge cases, a source label, and a resolved evidence folder. + +## Process + +1. **Resolve.** Resolve the exact requested feature and batch-read its plan plus directly referenced implementation artifacts. +2. **Filter.** Keep only Happy path and Edge case sections where every task's Mermaid actor is `browser`. Carry their Setup and Teardown tasks as dependencies regardless of channel. Ignore non-browser, mixed-channel, and unmarked scenario sections without displaying them. +3. **Lock.** Lock one browser happy path from the explicit user journey, then the filtered plan Test Scope, then browser-observable acceptance criteria in the implementation artifact. Ask one concise question only when those sources conflict or expose multiple browser journeys. +4. **Collect.** Include every filtered planned edge case. Collect candidates from explicit browser validation, error, empty-state, permission, boundary, or recovery branches already visible in the implementation artifact. Search directly related browser tests only when the filtered plan contains no edge case. +5. **Bound.** Deduplicate candidates against planned edges. Keep at most three proposed edges, ranked by user impact, browser observability, determinism, and proximity to the requested journey. +6. **Decide.** Automatically include a proposed edge only when it is deterministic, browser-observable, in scope, and non-destructive. Require a decision only for an external or destructive action. +7. **Validate.** Reject a scenario without a source, trigger, browser-observable outcome, or executable teardown when it changes state. +8. **Locate.** Use the existing AIDD feature folder when the source belongs to one. Otherwise use `aidd_docs/tasks//_/`. +9. **Show.** Emit `Happy path: locked ()` and one compact `Edge case | Source | Decision` table. Do not repeat scenario steps. + +## Test + +- Exactly one browser happy path is locked with a source and observable outcome. +- Every planned `browser` edge case is included. +- No non-browser, mixed-channel, or unmarked happy path or edge case enters the QA scope. +- At most three proposed edges remain; each has a distinct source, trigger, observable outcome, and decision. +- Every state-changing scenario has an executable teardown or reset. +- The source label and evidence folder are resolved whether the source is a plan, implementation artifact, or user request. +- The user-facing output contains one lock line and one edge-case table only. diff --git a/plugins/aidd-dev/skills/11-qa/actions/02-prepare-run.md b/plugins/aidd-dev/skills/11-browser-qa/actions/02-prepare-run.md similarity index 100% rename from plugins/aidd-dev/skills/11-qa/actions/02-prepare-run.md rename to plugins/aidd-dev/skills/11-browser-qa/actions/02-prepare-run.md diff --git a/plugins/aidd-dev/skills/11-qa/actions/03-run-scenarios.md b/plugins/aidd-dev/skills/11-browser-qa/actions/03-run-scenarios.md similarity index 100% rename from plugins/aidd-dev/skills/11-qa/actions/03-run-scenarios.md rename to plugins/aidd-dev/skills/11-browser-qa/actions/03-run-scenarios.md diff --git a/plugins/aidd-dev/skills/11-qa/assets/qa-report-template.md b/plugins/aidd-dev/skills/11-browser-qa/assets/qa-report-template.md similarity index 91% rename from plugins/aidd-dev/skills/11-qa/assets/qa-report-template.md rename to plugins/aidd-dev/skills/11-browser-qa/assets/qa-report-template.md index 4cb53a5e8..464dede59 100644 --- a/plugins/aidd-dev/skills/11-qa/assets/qa-report-template.md +++ b/plugins/aidd-dev/skills/11-browser-qa/assets/qa-report-template.md @@ -1,4 +1,4 @@ -# QA: {{feature}} +# Browser QA: {{feature}} - **Verdict**: {{pass | fail | skipped}} - **Source**: {{plan path | implementation path | user request}} diff --git a/plugins/aidd-dev/skills/11-qa/references/run-scope-playwright-cli.md b/plugins/aidd-dev/skills/11-browser-qa/references/run-scope-playwright-cli.md similarity index 100% rename from plugins/aidd-dev/skills/11-qa/references/run-scope-playwright-cli.md rename to plugins/aidd-dev/skills/11-browser-qa/references/run-scope-playwright-cli.md diff --git a/plugins/aidd-dev/skills/11-qa/actions/01-load-scope.md b/plugins/aidd-dev/skills/11-qa/actions/01-load-scope.md deleted file mode 100644 index 4a65cf3d4..000000000 --- a/plugins/aidd-dev/skills/11-qa/actions/01-load-scope.md +++ /dev/null @@ -1,31 +0,0 @@ -# 01 - Load Scope - -Lock the smallest defensible browser QA scope before execution. - -## Input - -The user request, plus a feature folder, plan path, or implementation artifact. - -## Output - -One locked happy path, a bounded set of sourced edge cases, a source label, and a resolved evidence folder. - -## Process - -1. **Resolve.** Resolve the exact requested feature and batch-read its plan plus directly referenced implementation artifacts. -2. **Lock.** Lock one happy path from the explicit user journey, then the plan Test Scope, then observable acceptance criteria in the implementation artifact. Ask one concise question only when those sources conflict or expose multiple journeys. -3. **Collect.** Include every planned edge case. Collect candidates from explicit validation, error, empty-state, permission, boundary, or recovery branches already visible in the implementation artifact. Search directly related tests only when the plan contains no edge case. -4. **Bound.** Deduplicate candidates against planned edges. Keep at most three proposed edges, ranked by user impact, browser observability, determinism, and proximity to the requested journey. -5. **Decide.** Automatically include a proposed edge only when it is deterministic, browser-observable, in scope, and non-destructive. Require a decision only for an external or destructive action. -6. **Validate.** Reject a scenario without a source, trigger, observable outcome, or executable teardown when it changes state. -7. **Locate.** Use the existing AIDD feature folder when the source belongs to one. Otherwise use `aidd_docs/tasks//_/`. -8. **Show.** Emit `Happy path: locked ()` and one compact `Edge case | Source | Decision` table. Do not repeat scenario steps. - -## Test - -- Exactly one happy path is locked with a source and observable outcome. -- Every planned edge case is included. -- At most three proposed edges remain; each has a distinct source, trigger, observable outcome, and decision. -- Every state-changing scenario has an executable teardown or reset. -- The source label and evidence folder are resolved whether the source is a plan, implementation artifact, or user request. -- The user-facing output contains one lock line and one edge-case table only. From 504b41277574654e3e43e6fde7de68fd5022ba83 Mon Sep 17 00:00:00 2001 From: alexsoyes Date: Sun, 26 Jul 2026 08:24:11 +0200 Subject: [PATCH 07/12] refactor(browser-qa): alex's streamline documentation --- README.md | 4 +-- .../11-browser-qa/actions/01-load-scope.md | 31 ++++++++---------- .../11-browser-qa/actions/02-prepare-run.md | 29 ++++++++--------- .../11-browser-qa/actions/03-run-scenarios.md | 32 ++++++++----------- 4 files changed, 42 insertions(+), 54 deletions(-) diff --git a/README.md b/README.md index d457a0658..7fd6737b6 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ ## Agentic framework for software engineers to produce 100% quality code with IA, agonistically.

- 7 plugins · 42 skills · 2 agents · MIT + 7 plugins · 41 skills · 2 agents · MIT

[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) @@ -229,7 +229,7 @@ Project init, memory bank, context-artifact generation, diagrams, learning, expl ### ⚙️ [aidd-dev](plugins/aidd-dev/README.md) -`13 skills` · stable +`12 skills` · stable SDLC loop: plan, implement, assert, audit, review, test, refactor, debug. Standalone Browser QA records short web evidence. diff --git a/plugins/aidd-dev/skills/11-browser-qa/actions/01-load-scope.md b/plugins/aidd-dev/skills/11-browser-qa/actions/01-load-scope.md index f23dd190d..faa0d42df 100644 --- a/plugins/aidd-dev/skills/11-browser-qa/actions/01-load-scope.md +++ b/plugins/aidd-dev/skills/11-browser-qa/actions/01-load-scope.md @@ -4,30 +4,25 @@ Lock the smallest defensible browser QA scope before execution. ## Input -The user request, plus a feature folder, plan path, or implementation artifact. +Plan path or implementation artifact. ## Output -One locked browser happy path, a bounded set of sourced browser edge cases, a source label, and a resolved evidence folder. +- 1 locked browser happy path, +- a bounded set of sourced browser edge cases, +- a source label, +- a resolved evidence folder. ## Process -1. **Resolve.** Resolve the exact requested feature and batch-read its plan plus directly referenced implementation artifacts. -2. **Filter.** Keep only Happy path and Edge case sections where every task's Mermaid actor is `browser`. Carry their Setup and Teardown tasks as dependencies regardless of channel. Ignore non-browser, mixed-channel, and unmarked scenario sections without displaying them. -3. **Lock.** Lock one browser happy path from the explicit user journey, then the filtered plan Test Scope, then browser-observable acceptance criteria in the implementation artifact. Ask one concise question only when those sources conflict or expose multiple browser journeys. -4. **Collect.** Include every filtered planned edge case. Collect candidates from explicit browser validation, error, empty-state, permission, boundary, or recovery branches already visible in the implementation artifact. Search directly related browser tests only when the filtered plan contains no edge case. -5. **Bound.** Deduplicate candidates against planned edges. Keep at most three proposed edges, ranked by user impact, browser observability, determinism, and proximity to the requested journey. +1. **Resolve.** the requested feature from its plan. +2. **Filter.** Keep only Happy path and Edge case sections where every task's Mermaid actor is `browser` (Ignore non-browser, mixed-channel, and unmarked scenario sections without displaying them). +3. **Lock.** Lock 1 browser happy path from the explicit user journey, then the filtered plan Test Scope, then browser-observable acceptance criteria in the implementation artifact. + 1. Ask one concise question only when those sources conflict or expose multiple browser journeys. +4. **Collect.** Include every filtered planned edge case + candidates from explicit browser validation, error, empty-state, permission, boundary, or recovery branches already visible in the implementation artifact. + 1. Search directly related browser tests only when the filtered plan contains no edge case. +5. **Bound.** Deduplicate candidates against planned edges. Keep at least 3 proposed edges, ranked by user impact, browser observability, determinism, and proximity to the requested journey. 6. **Decide.** Automatically include a proposed edge only when it is deterministic, browser-observable, in scope, and non-destructive. Require a decision only for an external or destructive action. 7. **Validate.** Reject a scenario without a source, trigger, browser-observable outcome, or executable teardown when it changes state. 8. **Locate.** Use the existing AIDD feature folder when the source belongs to one. Otherwise use `aidd_docs/tasks//_/`. -9. **Show.** Emit `Happy path: locked ()` and one compact `Edge case | Source | Decision` table. Do not repeat scenario steps. - -## Test - -- Exactly one browser happy path is locked with a source and observable outcome. -- Every planned `browser` edge case is included. -- No non-browser, mixed-channel, or unmarked happy path or edge case enters the QA scope. -- At most three proposed edges remain; each has a distinct source, trigger, observable outcome, and decision. -- Every state-changing scenario has an executable teardown or reset. -- The source label and evidence folder are resolved whether the source is a plan, implementation artifact, or user request. -- The user-facing output contains one lock line and one edge-case table only. +9. **Show.** Emit `Happy path: locked ()` and one compact `Edge case | Source | Decision` table. Do not repeat scenario steps. diff --git a/plugins/aidd-dev/skills/11-browser-qa/actions/02-prepare-run.md b/plugins/aidd-dev/skills/11-browser-qa/actions/02-prepare-run.md index a134f7181..ba3afe0c7 100644 --- a/plugins/aidd-dev/skills/11-browser-qa/actions/02-prepare-run.md +++ b/plugins/aidd-dev/skills/11-browser-qa/actions/02-prepare-run.md @@ -4,27 +4,24 @@ Resolve every operational dependency before retained recording begins. ## Input -The final QA scope and application URL. +Earlier defined scope. ## Output -A prepared run with a reachable application, authenticated sessions, deterministic fixtures, executable scenario steps, proven teardown, and available recording and media tools. +A successfull prepared run with a reachable application, authenticated sessions, deterministic fixtures, executable scenario steps, proven teardown, and available recording and media tools. ## Process 1. **Preflight.** Batch the independent checks for the application, pinned Playwright CLI, `ffprobe`, `ffmpeg`, and the fixed `1280×720` viewport. -2. **Reuse.** Read `aidd_docs/memory/testing.md` first when it exists. Resolve Browser QA entry, auth, fixtures, and reset from its `Browser QA` section, then a directly related browser test, then one targeted browser snapshot. Stop searching as soon as the run is executable. -3. **Authenticate.** Establish the required role before recording. Never include login discovery or secret lookup in evidence. -4. **Fixture.** Use deterministic data satisfying each setup. Never choose a live record by guesswork. -5. **Rehearse.** Rehearse only non-mutating steps and selectors. Never execute the final state-changing action merely to rehearse it. -6. **Reset.** Resolve an executable teardown for every state-changing scenario. If preparation changed state, execute the teardown and verify the baseline now; a future restart is not proof. +2. **Reuse.** Read `aidd_docs/memory/testing.md` first when it exists. + 1. Resolve Browser QA entry, auth, fixtures, and reset from its `Browser QA` section, then a directly related browser test, then one targeted browser snapshot. + 2. Stop searching as soon as the run is executable. +3. **Authenticate.** Establish the required role before recording. + 1. Never include login discovery or secret lookup in evidence. +4. **Fixture.** Use deterministic data satisfying each setup. + 1. Never choose a live record by guesswork. +5. **Rehearse** only non-mutating steps and selectors. + 1. Never execute the final state-changing action merely to rehearse it. +6. **Reset.** Resolve an executable teardown for every state-changing scenario. + 1. If preparation changed state, execute the teardown and verify the baseline now; a future restart is not proof. 7. **Return.** Keep only the fixture, initial URL, minimal steps, expected outcome, teardown, and isolated session id per scenario. - -## Test - -- One batched preflight confirms the application, Playwright CLI, `ffprobe`, viewport, and `ffmpeg` availability. -- Existing Browser QA memory is used before any code or browser discovery; its absence does not block fallback. -- Every scenario uses a `1280×720` viewport. -- Every scenario has deterministic setup data, minimal executable steps, and an expected outcome. -- Every state-changing scenario has an executable reset; every preparation mutation was actually reset. -- No retained video exists at the end of preparation. diff --git a/plugins/aidd-dev/skills/11-browser-qa/actions/03-run-scenarios.md b/plugins/aidd-dev/skills/11-browser-qa/actions/03-run-scenarios.md index 761fe73cc..e7fc62e5c 100644 --- a/plugins/aidd-dev/skills/11-browser-qa/actions/03-run-scenarios.md +++ b/plugins/aidd-dev/skills/11-browser-qa/actions/03-run-scenarios.md @@ -8,19 +8,25 @@ The prepared run, source label, and resolved evidence folder. ## Output -`/qa.md` and one final WebM per scenario under `/qa/`. +`/qa.md` + 1 final WebM per scenario. ## Process -1. **Group.** Run at most two read-only scenarios concurrently in isolated sessions. Run every state-changing scenario sequentially. +1. **Group.** Run at most two read-only scenarios concurrently in isolated sessions. + 1. Run every state-changing scenario sequentially. 2. **Record.** Apply setup before recording, start immediately before the first scenario action, and stop at the observable outcome. -3. **Verdict.** Compare actual with expected. Retain a product failure and mark the run failed. -4. **Recover.** Discard a setup or tooling failure, reset, and retry once. A second operational failure blocks the scenario. +3. **Verdict.** Compare actual with expected. + 1. Retain a product failure and mark the run failed. +4. **Recover.** Discard a setup or tooling failure, reset, and retry once. + 1. A second operational failure blocks the scenario. 5. **Reset.** Execute teardown after every state-changing take, verify the baseline, then close the session. -6. **Normalize.** Normalize at most two independent raw files concurrently. Save only `qa/happy-path.webm` and `qa/edge-case-.webm`, each at most 12 seconds and 1280 pixels wide. -7. **Clean.** Delete raw takes only after every final file passes codec, dimension, duration, and path checks. Never create screenshots or alternate media. -8. **Report.** Fill the report asset with the source label. Keep one result row per scenario and add Findings only for a failure or blocker. -9. **Return.** Output only the overall verdict, `qa.md` path, and final WebM paths, one item per line. +6. **Normalize.** Normalize at most two independent raw files concurrently. + 1. Save only `qa/happy-path.webm` and `qa/edge-case-.webm`, each at most 12 seconds and 1280 pixels wide. +7. **Clean.** Delete raw takes only after every final file passes codec, dimension, duration, and path checks. + 1. Never create screenshots or alternate media. +8. **Report.** Fill the report asset with the source label. + 1. Keep one result row per scenario and add Findings only for a failure or blocker. +9. **Return.** Output only the overall verdict, `qa.md` path, and final WebM paths, one item per line. ```md @../references/run-scope-playwright-cli.md @@ -29,13 +35,3 @@ The prepared run, source label, and resolved evidence folder. ```md @../assets/qa-report-template.md ``` - -## Test - -- `qa.md`, `qa/happy-path.webm`, and one `qa/edge-case-.webm` per locked edge case exist. -- Every final video is VP9 WebM, 1280 pixels wide, and at most 12 seconds. -- Every retained file contains only its scenario, with no setup, discovery, or operational retry. -- A product mismatch is retained as evidence and makes the overall verdict fail. -- Every state-changing scenario restores its baseline. -- The report contains its source and no unfilled `{{...}}` placeholder. -- No raw take, screenshot, alternate media, or external update remains. From f1f9430b993f38ec70eb8e0ebf0444228b494aa8 Mon Sep 17 00:00:00 2001 From: alexsoyes Date: Sun, 26 Jul 2026 08:24:21 +0200 Subject: [PATCH 08/12] refactor(plan): clarify phase template and test scope instructions --- .../references/skill-authoring.md | 2 +- .../aidd-dev/skills/01-plan/actions/04-plan.md | 3 ++- .../skills/01-plan/assets/phase-template.md | 18 ++++++++++++------ 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/plugins/aidd-context/skills/04-skill-generate/references/skill-authoring.md b/plugins/aidd-context/skills/04-skill-generate/references/skill-authoring.md index b38aeae1f..7ebb012d0 100644 --- a/plugins/aidd-context/skills/04-skill-generate/references/skill-authoring.md +++ b/plugins/aidd-context/skills/04-skill-generate/references/skill-authoring.md @@ -8,7 +8,7 @@ The contract every generated skill satisfies. `skill-generate` obeys it too. - **R4.** `argument-hint`: the action slugs when actions run one at a time, the user's cases (`setup | refresh | rewire`) for a pipeline, omitted for one action. - **R5.** `name` is not the invocation token: a colon or prefix breaks loading. In prose call a skill `plugin:folder`. - **R6.** One fact, one home. An action acts within a router rule and cites a shared reference by a markdown link `[name](path)`, never restating either. -- **R7.** `references/` are read in place, `assets/` are copied or filled. A template holds no rule. +- **R7.** `references/` are read in place. `assets/` are copied or filled and own their artifact-local fill contract. - **R8.** References stay flat, nesting one directory deep only as a load boundary. Each stands alone, never pulling in another. - **R9.** One file, one artifact. Split two apart only when a path needs one without the other. - **R10.** Budget what a run reads, not file size: the router stays the leanest file. diff --git a/plugins/aidd-dev/skills/01-plan/actions/04-plan.md b/plugins/aidd-dev/skills/01-plan/actions/04-plan.md index 94e5795be..2a841290f 100644 --- a/plugins/aidd-dev/skills/01-plan/actions/04-plan.md +++ b/plugins/aidd-dev/skills/01-plan/actions/04-plan.md @@ -14,13 +14,14 @@ A feature folder, always at `aidd_docs/tasks//_ observable expected outcome`; each edge case also names its trigger. Add edge cases only when their trigger and expected outcome are known. Teardown is required when a scenario changes state. Keep a phase's Wireframe only when that phase ships UI. +3. **Fill.** Fill the plan and each phase from their templates, following the inline contracts. Slice the projection across the phases. 4. **Show.** Display the written paths. 5. **Review.** Show the complete plan and its phases with a confidence score (0 to 10, ✓ reasons and ✗ risks). Take feedback, revise the files, and re-show until approved. The score is never written to the plan. ## Test - `aidd_docs/tasks//_/plan.md` exists with one `phase-.md` per phase next to it. +- Every written file satisfies its template's inline contract. - No `{...}` placeholder is left in any written file. - The phase projection slices together cover the modify, create, and delete lists. - A confidence score was reported and written to no file. diff --git a/plugins/aidd-dev/skills/01-plan/assets/phase-template.md b/plugins/aidd-dev/skills/01-plan/assets/phase-template.md index 1816c0a50..21bba1457 100644 --- a/plugins/aidd-dev/skills/01-plan/assets/phase-template.md +++ b/plugins/aidd-dev/skills/01-plan/assets/phase-template.md @@ -23,21 +23,27 @@ flowchart TD ## Test Scope - + ```mermaid --- title: Test scope --- journey + %% Every task has exactly one actor: browser, api, cli, or system. section Setup - {deterministic precondition or fixture} => {ready state}: 5: {setup channel} + %% Deterministic preconditions and fixtures. Its channel may differ. + {prepare fixture} => {ready state}: 5: {channel} section Happy path - {action} => {observable expected outcome}: 5: {scenario channel} - section Edge case - {scenario} - {trigger} => {action} => {observable expected outcome}: 1: {scenario channel} + %% Required. Every task states action => observable outcome. All tasks use the same channel. + {action} => {observable expected outcome}: 5: {channel} + %% Add one named section per edge case only when its trigger and expected outcome are known. + section Edge case - {name} + %% Every task names trigger => action => observable outcome. All tasks use the same channel. + {trigger} => {action} => {observable expected outcome}: 1: {channel} + %% Include only when a scenario changes state. Its channel may differ. section Teardown - {cleanup or reset action} => {baseline restored}: 5: {teardown channel} + {cleanup or reset action} => {baseline restored}: 5: {channel} ``` ## Wireframe From a77227254aefc8cdf0f82ebe91e4f5bfb690bf75 Mon Sep 17 00:00:00 2001 From: alexsoyes Date: Sun, 26 Jul 2026 08:47:15 +0200 Subject: [PATCH 09/12] feat(aidd-vcs): link browser QA videos in pull requests --- plugins/aidd-vcs/skills/02-pull-request/actions/02-draft.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/aidd-vcs/skills/02-pull-request/actions/02-draft.md b/plugins/aidd-vcs/skills/02-pull-request/actions/02-draft.md index 36b5c4e6c..0fc1ac558 100644 --- a/plugins/aidd-vcs/skills/02-pull-request/actions/02-draft.md +++ b/plugins/aidd-vcs/skills/02-pull-request/actions/02-draft.md @@ -13,10 +13,11 @@ The proposed title, body, and base, approved by the user. ## Process 1. **Template.** Load the request template, the project's own when set, else the bundled `@../assets/pull_request.md`. -2. **Write.** Draft a concise title and a body following the template from the change summary. +2. **Write.** Draft a concise title and body from the change summary. Link every changed `**/qa/*.webm` under the template's testing or verification section. 3. **Confirm.** Show the title, body, and base, apply any overrides, and wait for approval. ## Test - The body follows the project's template sections when one exists. +- Every changed `**/qa/*.webm` is linked in the body. - The user approved the title, body, and base before creation. From 3127fb73807734532e6a21addf76d7ac28ac9e17 Mon Sep 17 00:00:00 2001 From: alexsoyes Date: Sun, 26 Jul 2026 15:34:41 +0200 Subject: [PATCH 10/12] fix(aidd-dev): make browser QA videos reviewable Pace recorded interactions, preserve the final outcome, and offer direct Happy Path playback for reviewer control. --- .../skills/11-browser-qa/actions/03-run-scenarios.md | 6 +++--- .../11-browser-qa/references/run-scope-playwright-cli.md | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/aidd-dev/skills/11-browser-qa/actions/03-run-scenarios.md b/plugins/aidd-dev/skills/11-browser-qa/actions/03-run-scenarios.md index e7fc62e5c..3f3147a06 100644 --- a/plugins/aidd-dev/skills/11-browser-qa/actions/03-run-scenarios.md +++ b/plugins/aidd-dev/skills/11-browser-qa/actions/03-run-scenarios.md @@ -14,19 +14,19 @@ The prepared run, source label, and resolved evidence folder. 1. **Group.** Run at most two read-only scenarios concurrently in isolated sessions. 1. Run every state-changing scenario sequentially. -2. **Record.** Apply setup before recording, start immediately before the first scenario action, and stop at the observable outcome. +2. **Record.** Apply setup before recording, then follow the runner's recording contract. 3. **Verdict.** Compare actual with expected. 1. Retain a product failure and mark the run failed. 4. **Recover.** Discard a setup or tooling failure, reset, and retry once. 1. A second operational failure blocks the scenario. 5. **Reset.** Execute teardown after every state-changing take, verify the baseline, then close the session. 6. **Normalize.** Normalize at most two independent raw files concurrently. - 1. Save only `qa/happy-path.webm` and `qa/edge-case-.webm`, each at most 12 seconds and 1280 pixels wide. + 1. Save only `qa/happy-path.webm` and `qa/edge-case-.webm` after they pass the runner's media gates. 7. **Clean.** Delete raw takes only after every final file passes codec, dimension, duration, and path checks. 1. Never create screenshots or alternate media. 8. **Report.** Fill the report asset with the source label. 1. Keep one result row per scenario and add Findings only for a failure or blocker. -9. **Return.** Output only the overall verdict, `qa.md` path, and final WebM paths, one item per line. +9. **Return.** Output the verdict and evidence paths, then ask `Open happy-path.webm in the browser for review?`; open the final file there when confirmed. ```md @../references/run-scope-playwright-cli.md diff --git a/plugins/aidd-dev/skills/11-browser-qa/references/run-scope-playwright-cli.md b/plugins/aidd-dev/skills/11-browser-qa/references/run-scope-playwright-cli.md index 42087456e..9cb92954e 100644 --- a/plugins/aidd-dev/skills/11-browser-qa/references/run-scope-playwright-cli.md +++ b/plugins/aidd-dev/skills/11-browser-qa/references/run-scope-playwright-cli.md @@ -14,7 +14,7 @@ Upgrade the pin deliberately with the framework, never by using `latest` during ## Recording contract -Use one named session and one raw WebM per scenario. Fix the browser viewport and recording frame at `1280×720`. Reach the prepared initial state before `video-start`; stop immediately after the observable result. +Use one named session and one raw WebM per scenario. Fix the browser viewport and recording frame at `1280×720`. Reach the prepared initial state before `video-start`. Start immediately before the first scenario action. After every click, use session-scoped `run-code` with `page.waitForTimeout(250)` before the next action. Once the observable result is stable, use `page.waitForTimeout(2000)`, then stop. ```bash npx --yes @playwright/cli@0.1.17 -s=qa-- resize 1280 720 @@ -36,9 +36,9 @@ ffprobe -v error -select_streams v:0 \ -of json raw-.webm ``` -When `ffmpeg` is unavailable, only an already-short raw take can pass. A take above 12 seconds reports `blocked: media-postprocess-unavailable`. +Twelve seconds is a maximum, never a target. Never pad or extend a shorter take. When `ffmpeg` is unavailable, only an already-short raw take can pass. A take above 12 seconds reports `blocked: media-postprocess-unavailable`. -Trim known dead time first. Re-encode without audio. +Trim only dead time before the first action or after the final two-second hold. Re-encode without audio. ```bash ffmpeg -y -ss -to -i raw-.webm \ From 43f14f965a46dc7cb5f088b2473416fa1e845483 Mon Sep 17 00:00:00 2001 From: alexsoyes Date: Sun, 26 Jul 2026 16:39:29 +0200 Subject: [PATCH 11/12] fix(aidd-dev): harden browser QA video capture Run each recorded journey atomically and preserve command failures so invalid takes cannot look successful. Validate cut points and final evidence on frames because metadata alone misses broken recordings. --- .../11-browser-qa/actions/03-run-scenarios.md | 6 +-- .../references/run-scope-playwright-cli.md | 48 ++++++++++++++----- 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/plugins/aidd-dev/skills/11-browser-qa/actions/03-run-scenarios.md b/plugins/aidd-dev/skills/11-browser-qa/actions/03-run-scenarios.md index 3f3147a06..746f07eb0 100644 --- a/plugins/aidd-dev/skills/11-browser-qa/actions/03-run-scenarios.md +++ b/plugins/aidd-dev/skills/11-browser-qa/actions/03-run-scenarios.md @@ -21,9 +21,9 @@ The prepared run, source label, and resolved evidence folder. 1. A second operational failure blocks the scenario. 5. **Reset.** Execute teardown after every state-changing take, verify the baseline, then close the session. 6. **Normalize.** Normalize at most two independent raw files concurrently. - 1. Save only `qa/happy-path.webm` and `qa/edge-case-.webm` after they pass the runner's media gates. -7. **Clean.** Delete raw takes only after every final file passes codec, dimension, duration, and path checks. - 1. Never create screenshots or alternate media. + 1. Save only `qa/happy-path.webm` and `qa/edge-case-.webm` after `ffprobe` and chronological frame inspection pass. +7. **Clean.** Delete raw takes and temporary validation frames only after every final file passes codec, dimension, duration, path, cut-point, and frame checks. + 1. Never retain screenshots or alternate media. 8. **Report.** Fill the report asset with the source label. 1. Keep one result row per scenario and add Findings only for a failure or blocker. 9. **Return.** Output the verdict and evidence paths, then ask `Open happy-path.webm in the browser for review?`; open the final file there when confirmed. diff --git a/plugins/aidd-dev/skills/11-browser-qa/references/run-scope-playwright-cli.md b/plugins/aidd-dev/skills/11-browser-qa/references/run-scope-playwright-cli.md index 9cb92954e..b84062a30 100644 --- a/plugins/aidd-dev/skills/11-browser-qa/references/run-scope-playwright-cli.md +++ b/plugins/aidd-dev/skills/11-browser-qa/references/run-scope-playwright-cli.md @@ -12,14 +12,30 @@ npx --yes @playwright/cli@0.1.17 -s=qa- Upgrade the pin deliberately with the framework, never by using `latest` during a QA run. +`run-code` receives one `page` argument. Pass a complete function with the exact shape `async page => { ... }`, never bare statements. Keep its stdout, stderr, and exit status visible: never redirect, pipe, use command substitution, append `|| true`, or otherwise mask them. A `SyntaxError` or non-zero exit invalidates the take. + ## Recording contract -Use one named session and one raw WebM per scenario. Fix the browser viewport and recording frame at `1280×720`. Reach the prepared initial state before `video-start`. Start immediately before the first scenario action. After every click, use session-scoped `run-code` with `page.waitForTimeout(250)` before the next action. Once the observable result is stable, use `page.waitForTimeout(2000)`, then stop. +Use one named session and one raw WebM per scenario. Fix the browser viewport and recording frame at `1280×720`. Reach the prepared initial state before `video-start`. Drive every recorded interaction in one `run-code`; never issue recorded click, fill, or scroll commands separately. Hold the initial state for `1000 ms`. Wait `300 ms` between scenario actions and after every scroll. Verify the observable result, hold it for `1000 ms`, then stop. Run `video-stop` only after `run-code` exits successfully. ```bash npx --yes @playwright/cli@0.1.17 -s=qa-- resize 1280 720 npx --yes @playwright/cli@0.1.17 -s=qa-- video-start raw-.webm --size=1280x720 -# Drive the scenario with the same session. +# Replace the example locators and omit the scroll block when irrelevant. +npx --yes @playwright/cli@0.1.17 -s=qa-- run-code 'async page => { + const pause = milliseconds => page.waitForTimeout(milliseconds); + await pause(1000); + + await page.getByRole("button", { name: "first action" }).click(); + await pause(300); + + await page.mouse.wheel(0, 600); + await pause(300); + + await page.getByRole("button", { name: "final action" }).click(); + await page.getByText("observable expected outcome").waitFor({ state: "visible" }); + await pause(1000); +}' npx --yes @playwright/cli@0.1.17 -s=qa-- video-stop npx --yes @playwright/cli@0.1.17 -s=qa-- close ``` @@ -38,22 +54,32 @@ ffprobe -v error -select_streams v:0 \ Twelve seconds is a maximum, never a target. Never pad or extend a shorter take. When `ffmpeg` is unavailable, only an already-short raw take can pass. A take above 12 seconds reports `blocked: media-postprocess-unavailable`. -Trim only dead time before the first action or after the final two-second hold. Re-encode without audio. +Never infer the first action from a scene-change threshold and never trim the head: the initial one-second hold is required evidence. Before trimming tail time, extract and inspect frames immediately before and after the proposed cut. Reject a cut that removes the observable result or its final one-second hold. ```bash -ffmpeg -y -ss -to -i raw-.webm \ - -an -vf "fps=12,scale=1280:-2:force_original_aspect_ratio=decrease" \ - -c:v libvpx-vp9 -crf 36 -b:v 0 .webm +qa_cut_frames=$(mktemp -d) +ffmpeg -v error -ss -i raw-.webm \ + -frames:v 1 "$qa_cut_frames/before.png" +ffmpeg -v error -ss -i raw-.webm \ + -frames:v 1 "$qa_cut_frames/after.png" ``` -When the meaningful segment still exceeds 12 seconds, set `` to `duration / 12` and accelerate it. +Re-encode without audio. Use only a visually verified tail cut; omit `-to` when none is needed. ```bash -ffmpeg -y -i raw-.webm \ - -an -vf "setpts=PTS/,fps=12,scale=1280:-2:force_original_aspect_ratio=decrease" \ +ffmpeg -y -to -i raw-.webm \ + -an -vf "fps=12,scale=1280:-2:force_original_aspect_ratio=decrease" \ -c:v libvpx-vp9 -crf 36 -b:v 0 .webm ``` -Inspect the final file with the same `ffprobe` command. Require codec `vp9`, width `1280`, and duration at most 12 seconds. Never keep invalid reviewer evidence. +When the meaningful take still exceeds 12 seconds, remove non-scenario actions and record it again. Never accelerate a take because that invalidates the pacing contract. Report blocked when the required journey cannot fit. + +Inspect the final file with the same `ffprobe` command, then extract frames at four frames per second and inspect them in chronological order. Require the initial state, every scenario action, every transition, and the final observable result to be visible. The initial and final holds must each span at least four sampled frames. `ffprobe` alone never validates a take. + +```bash +qa_final_frames=$(mktemp -d) +ffmpeg -v error -i .webm -vf "fps=4" \ + "$qa_final_frames/frame-%03d.png" +``` -Remove raw takes only after every final WebM passes the duration gate. +Require codec `vp9`, width `1280`, and duration at most 12 seconds. Remove raw takes, cut-point frames, and final validation frames only after every final WebM passes both gates. From 2366ffc5ffeb13bc4c22966db5232e8046fed224 Mon Sep 17 00:00:00 2001 From: alexsoyes Date: Fri, 31 Jul 2026 14:42:03 +0700 Subject: [PATCH 12/12] refactor(aidd-dev): streamline browser QA setup Keep dependency recovery explicit while preserving deterministic Playwright and video evidence. --- plugins/aidd-dev/CATALOG.md | 1 + .../aidd-dev/skills/11-browser-qa/SKILL.md | 5 +- .../11-browser-qa/actions/00-prerequisites.md | 28 ++++++++++ .../11-browser-qa/actions/02-prepare-run.md | 8 +-- .../references/run-scope-playwright-cli.md | 54 +++++++++++-------- 5 files changed, 68 insertions(+), 28 deletions(-) create mode 100644 plugins/aidd-dev/skills/11-browser-qa/actions/00-prerequisites.md diff --git a/plugins/aidd-dev/CATALOG.md b/plugins/aidd-dev/CATALOG.md index 5045f7d61..992f49c0e 100644 --- a/plugins/aidd-dev/CATALOG.md +++ b/plugins/aidd-dev/CATALOG.md @@ -161,6 +161,7 @@ Auto-generated index of skills, agents, references and assets shipped by the `ai | Group | File | Description | |-------|------|---| +| `actions` | [00-prerequisites.md](skills/11-browser-qa/actions/00-prerequisites.md) | - | | `actions` | [01-load-scope.md](skills/11-browser-qa/actions/01-load-scope.md) | - | | `actions` | [02-prepare-run.md](skills/11-browser-qa/actions/02-prepare-run.md) | - | | `actions` | [03-run-scenarios.md](skills/11-browser-qa/actions/03-run-scenarios.md) | - | diff --git a/plugins/aidd-dev/skills/11-browser-qa/SKILL.md b/plugins/aidd-dev/skills/11-browser-qa/SKILL.md index 78214a371..f77bac286 100644 --- a/plugins/aidd-dev/skills/11-browser-qa/SKILL.md +++ b/plugins/aidd-dev/skills/11-browser-qa/SKILL.md @@ -1,14 +1,14 @@ --- name: 11-browser-qa description: Run post-review browser QA and produce short named videos for a locked happy path and sourced browser edge cases. Use when the user wants concise reviewer evidence for a web journey. Not for API, CLI, automated tests, diff review, or application fixes. -argument-hint: load-scope | prepare-run | run-scenarios +argument-hint: prerequisites | load-scope | prepare-run | run-scenarios --- # Browser QA ```mermaid flowchart LR - scope["load-scope"] --> prepare["prepare-run"] --> run["run-scenarios"] + prerequisites["prerequisites"] --> scope["load-scope"] --> prepare["prepare-run"] --> run["run-scenarios"] ``` ## Actions @@ -17,6 +17,7 @@ Read only the next action's file before running it. | # | Action | Does | | --- | --------------- | ---------------------------------------------------------- | +| 00 | `prerequisites` | Verify the browser runner and media dependencies | | 01 | `load-scope` | Lock one happy path and a bounded set of sourced edge cases | | 02 | `prepare-run` | Resolve the shortest deterministic path to executable runs | | 03 | `run-scenarios` | Record, normalize, verify, reset, and report every scenario | diff --git a/plugins/aidd-dev/skills/11-browser-qa/actions/00-prerequisites.md b/plugins/aidd-dev/skills/11-browser-qa/actions/00-prerequisites.md new file mode 100644 index 000000000..aa53c07a1 --- /dev/null +++ b/plugins/aidd-dev/skills/11-browser-qa/actions/00-prerequisites.md @@ -0,0 +1,28 @@ +# 00 - Prerequisites + +Verify the runner dependencies before resolving the QA scope. + +## Input + +None. + +## Output + +Verified `npx`, Playwright CLI `0.1.17`, `ffmpeg`, and `ffprobe`. + +## Process + +1. **Check.** In one pass, resolve `npx`, run `npx --yes @playwright/cli@0.1.17 --version`, and resolve `ffmpeg` and `ffprobe`. +2. **Continue.** When every check passes, continue without reporting it. +3. **Resolve.** When a dependency is missing, ask one concise question: the user installs the listed dependencies, or authorizes you to install them now. + 1. If the user installs them, provide only the shortest platform-appropriate commands and stop until they confirm completion. + 2. If authorized, install only the missing dependencies, then rerun every check. +4. **Stop.** Report the shortest decisive error when installation is declined or a recheck fails. +5. **Protect.** Never add runner or media dependencies to the application manifest. + +## Test + +- Passing checks produce no message. +- A missing dependency produces one choice and no unapproved installation. +- Either installation path reruns every check before continuing. +- No application dependency file changes. diff --git a/plugins/aidd-dev/skills/11-browser-qa/actions/02-prepare-run.md b/plugins/aidd-dev/skills/11-browser-qa/actions/02-prepare-run.md index ba3afe0c7..10319577e 100644 --- a/plugins/aidd-dev/skills/11-browser-qa/actions/02-prepare-run.md +++ b/plugins/aidd-dev/skills/11-browser-qa/actions/02-prepare-run.md @@ -1,18 +1,18 @@ # 02 - Prepare Run -Resolve every operational dependency before retained recording begins. +Resolve the application state and scenario paths before retained recording begins. ## Input -Earlier defined scope. +Verified prerequisites and the earlier defined scope. ## Output -A successfull prepared run with a reachable application, authenticated sessions, deterministic fixtures, executable scenario steps, proven teardown, and available recording and media tools. +A successful prepared run with a reachable application, authenticated sessions, deterministic fixtures, executable scenario steps, and proven teardown. ## Process -1. **Preflight.** Batch the independent checks for the application, pinned Playwright CLI, `ffprobe`, `ffmpeg`, and the fixed `1280×720` viewport. +1. **Preflight.** Check the application and fixed `1280×720` viewport. 2. **Reuse.** Read `aidd_docs/memory/testing.md` first when it exists. 1. Resolve Browser QA entry, auth, fixtures, and reset from its `Browser QA` section, then a directly related browser test, then one targeted browser snapshot. 2. Stop searching as soon as the run is executable. diff --git a/plugins/aidd-dev/skills/11-browser-qa/references/run-scope-playwright-cli.md b/plugins/aidd-dev/skills/11-browser-qa/references/run-scope-playwright-cli.md index b84062a30..1eb2f5ba3 100644 --- a/plugins/aidd-dev/skills/11-browser-qa/references/run-scope-playwright-cli.md +++ b/plugins/aidd-dev/skills/11-browser-qa/references/run-scope-playwright-cli.md @@ -1,37 +1,37 @@ # Playwright CLI runner -Run browser QA through the Playwright Agent CLI. It produces human-viewable WebM recordings without adding a test dependency to the application. +Playwright Agent CLI produces WebM evidence without becoming an application dependency. -## Invocation +## Version and invocation -Use the framework pin below. The current version is `0.1.17`. +Support `@playwright/cli >= 0.1.17`; execute the framework pin `@playwright/cli@0.1.17`. Upgrade it deliberately, never through `latest` during QA. ```bash npx --yes @playwright/cli@0.1.17 -s=qa- ``` -Upgrade the pin deliberately with the framework, never by using `latest` during a QA run. +`run-code` takes one `page` argument: pass `async page => { ... }`, never bare statements. Keep stdout, stderr, and exit status visible; no redirects, pipes, command substitutions, or `|| true`. A `SyntaxError` or non-zero exit invalidates the take. -`run-code` receives one `page` argument. Pass a complete function with the exact shape `async page => { ... }`, never bare statements. Keep its stdout, stderr, and exit status visible: never redirect, pipe, use command substitution, append `|| true`, or otherwise mask them. A `SyntaxError` or non-zero exit invalidates the take. +## Recording -## Recording contract - -Use one named session and one raw WebM per scenario. Fix the browser viewport and recording frame at `1280×720`. Reach the prepared initial state before `video-start`. Drive every recorded interaction in one `run-code`; never issue recorded click, fill, or scroll commands separately. Hold the initial state for `1000 ms`. Wait `300 ms` between scenario actions and after every scroll. Verify the observable result, hold it for `1000 ms`, then stop. Run `video-stop` only after `run-code` exits successfully. +- One named session and raw WebM per scenario; viewport and frame `1280×720`. +- Reach the initial state before `video-start`; put every recorded interaction in one `run-code`. +- Never record separate click, fill, or scroll commands. +- Hold the initial and verified final states for `1000 ms`. +- Wait `300 ms` between actions and after each scroll. +- Run `video-stop` only after `run-code` succeeds. ```bash npx --yes @playwright/cli@0.1.17 -s=qa-- resize 1280 720 npx --yes @playwright/cli@0.1.17 -s=qa-- video-start raw-.webm --size=1280x720 -# Replace the example locators and omit the scroll block when irrelevant. +# Replace the locators; omit the scroll block when irrelevant. npx --yes @playwright/cli@0.1.17 -s=qa-- run-code 'async page => { const pause = milliseconds => page.waitForTimeout(milliseconds); await pause(1000); - await page.getByRole("button", { name: "first action" }).click(); await pause(300); - await page.mouse.wheel(0, 600); await pause(300); - await page.getByRole("button", { name: "final action" }).click(); await page.getByText("observable expected outcome").waitFor({ state: "visible" }); await pause(1000); @@ -40,21 +40,21 @@ npx --yes @playwright/cli@0.1.17 -s=qa-- video-stop npx --yes @playwright/cli@0.1.17 -s=qa-- close ``` -`video-stop` writes under `.playwright-cli/` in the current directory. Use `raw-happy-path.webm` and `raw-edge-case-.webm`. +`video-stop` writes to `.playwright-cli/` in the current directory. Name raw files `raw-happy-path.webm` or `raw-edge-case-.webm`. -## Duration gate +## Duration -Inspect every raw take in one call. +Probe each raw take once. Maximum 12 seconds, never a target; do not pad or extend. ```bash ffprobe -v error -select_streams v:0 \ -show_entries stream=codec_name,width,height:format=duration \ - -of json raw-.webm + -of json ``` -Twelve seconds is a maximum, never a target. Never pad or extend a shorter take. When `ffmpeg` is unavailable, only an already-short raw take can pass. A take above 12 seconds reports `blocked: media-postprocess-unavailable`. +Without `ffmpeg`, only an already-short raw take passes; otherwise report `blocked: media-postprocess-unavailable`. -Never infer the first action from a scene-change threshold and never trim the head: the initial one-second hold is required evidence. Before trimming tail time, extract and inspect frames immediately before and after the proposed cut. Reject a cut that removes the observable result or its final one-second hold. +Never trim the head or infer the first action from scene changes. Inspect both sides of a tail cut; reject one that removes the result or final one-second hold. ```bash qa_cut_frames=$(mktemp -d) @@ -64,7 +64,9 @@ ffmpeg -v error -ss -i raw-.webm \ -frames:v 1 "$qa_cut_frames/after.png" ``` -Re-encode without audio. Use only a visually verified tail cut; omit `-to` when none is needed. +## Normalization + +Re-encode without audio. Use only a visually verified tail cut; omit `-to` when unused. ```bash ffmpeg -y -to -i raw-.webm \ @@ -72,9 +74,11 @@ ffmpeg -y -to -i raw-.webm \ -c:v libvpx-vp9 -crf 36 -b:v 0 .webm ``` -When the meaningful take still exceeds 12 seconds, remove non-scenario actions and record it again. Never accelerate a take because that invalidates the pacing contract. Report blocked when the required journey cannot fit. +Above 12 seconds, remove non-scenario actions and record again. Never accelerate. Block when the required journey cannot fit. + +## Validation -Inspect the final file with the same `ffprobe` command, then extract frames at four frames per second and inspect them in chronological order. Require the initial state, every scenario action, every transition, and the final observable result to be visible. The initial and final holds must each span at least four sampled frames. `ffprobe` alone never validates a take. +Probe the final file, then inspect four frames per second chronologically. ```bash qa_final_frames=$(mktemp -d) @@ -82,4 +86,10 @@ ffmpeg -v error -i .webm -vf "fps=4" \ "$qa_final_frames/frame-%03d.png" ``` -Require codec `vp9`, width `1280`, and duration at most 12 seconds. Remove raw takes, cut-point frames, and final validation frames only after every final WebM passes both gates. +Require: + +- codec `vp9`, width `1280`, duration at most 12 seconds; +- initial state, every action and transition, and final result visible; +- initial and final holds spanning at least four sampled frames. + +`ffprobe` alone is insufficient. Delete raw takes, cut-point frames, and validation frames only after every final WebM passes both checks.