peaks-cli 1.3.7 → 1.3.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/cli/commands/core-artifact-commands.js +119 -14
- package/dist/src/cli/commands/project-commands.js +58 -1
- package/dist/src/cli/commands/request-commands.js +124 -4
- package/dist/src/cli/commands/retrospective-commands.d.ts +3 -0
- package/dist/src/cli/commands/retrospective-commands.js +113 -0
- package/dist/src/cli/program.js +2 -0
- package/dist/src/services/artifacts/request-artifact-service.d.ts +16 -0
- package/dist/src/services/artifacts/request-artifact-service.js +18 -2
- package/dist/src/services/memory/project-memory-service.d.ts +19 -0
- package/dist/src/services/memory/project-memory-service.js +33 -0
- package/dist/src/services/retrospective/migrate-from-md.d.ts +37 -0
- package/dist/src/services/retrospective/migrate-from-md.js +528 -0
- package/dist/src/services/retrospective/retrospective-index.d.ts +37 -0
- package/dist/src/services/retrospective/retrospective-index.js +110 -0
- package/dist/src/services/retrospective/retrospective-show.d.ts +40 -0
- package/dist/src/services/retrospective/retrospective-show.js +109 -0
- package/dist/src/services/session/caller-binding-service.d.ts +70 -0
- package/dist/src/services/session/caller-binding-service.js +148 -0
- package/dist/src/services/session/caller-id-types.d.ts +77 -0
- package/dist/src/services/session/caller-id-types.js +46 -0
- package/dist/src/services/session/index.d.ts +4 -0
- package/dist/src/services/session/index.js +5 -0
- package/dist/src/services/session/platform-fallbacks.d.ts +31 -0
- package/dist/src/services/session/platform-fallbacks.js +35 -0
- package/dist/src/services/session/resolve-caller-id.d.ts +57 -0
- package/dist/src/services/session/resolve-caller-id.js +88 -0
- package/dist/src/services/skills/skill-presence-service.d.ts +11 -0
- package/dist/src/services/skills/skill-presence-service.js +59 -0
- package/dist/src/shared/format-md-compact.d.ts +32 -0
- package/dist/src/shared/format-md-compact.js +297 -0
- package/dist/src/shared/stale-policy.d.ts +67 -0
- package/dist/src/shared/stale-policy.js +85 -0
- package/dist/src/shared/version.d.ts +1 -1
- package/dist/src/shared/version.js +1 -1
- package/package.json +1 -1
- package/skills/peaks-qa/SKILL.md +86 -515
- package/skills/peaks-qa/references/artifact-per-request.md +7 -79
- package/skills/peaks-qa/references/browser-validation-contracts.md +51 -0
- package/skills/peaks-qa/references/codegraph-regression-focus.md +5 -0
- package/skills/peaks-qa/references/external-capability-guidance.md +9 -0
- package/skills/peaks-qa/references/qa-compact-handoff.md +3 -0
- package/skills/peaks-qa/references/qa-context-governance.md +24 -0
- package/skills/peaks-qa/references/qa-fanout-contract.md +8 -0
- package/skills/peaks-qa/references/qa-gstack-integration.md +7 -0
- package/skills/peaks-qa/references/qa-local-artifacts.md +3 -0
- package/skills/peaks-qa/references/qa-matt-pocock-integration.md +9 -0
- package/skills/peaks-qa/references/qa-refactor-role.md +3 -0
- package/skills/peaks-qa/references/qa-runbook.md +74 -0
- package/skills/peaks-qa/references/qa-skill-presence.md +22 -0
- package/skills/peaks-qa/references/qa-standards-preflight.md +8 -0
- package/skills/peaks-qa/references/qa-sub-agent-dispatch.md +38 -0
- package/skills/peaks-qa/references/qa-transition-gates.md +79 -0
- package/skills/peaks-qa/references/requirement-boundary-recheck.md +9 -0
- package/skills/peaks-qa/references/test-case-generation.md +27 -0
- package/skills/peaks-qa/references/test-report-output.md +14 -0
- package/skills/peaks-rd/SKILL.md +85 -732
- package/skills/peaks-rd/references/artifact-and-standards-output.md +9 -0
- package/skills/peaks-rd/references/artifact-per-request.md +20 -0
- package/skills/peaks-rd/references/browser-self-test-contracts.md +29 -0
- package/skills/peaks-rd/references/codegraph-project-analysis.md +5 -0
- package/skills/peaks-rd/references/compact-handoff.md +3 -0
- package/skills/peaks-rd/references/external-references.md +11 -0
- package/skills/peaks-rd/references/frontend-project-generation.md +11 -0
- package/skills/peaks-rd/references/library-version-awareness.md +30 -0
- package/skills/peaks-rd/references/mandatory-perf-baseline.md +40 -0
- package/skills/peaks-rd/references/mandatory-tech-doc.md +18 -0
- package/skills/peaks-rd/references/matt-pocock-integration.md +11 -0
- package/skills/peaks-rd/references/mock-data-placement.md +40 -0
- package/skills/peaks-rd/references/parallel-review-fanout.md +81 -0
- package/skills/peaks-rd/references/rd-context-governance.md +36 -0
- package/skills/peaks-rd/references/rd-gstack-integration.md +16 -0
- package/skills/peaks-rd/references/rd-runbook.md +125 -0
- package/skills/peaks-rd/references/rd-standards-preflight.md +8 -0
- package/skills/peaks-rd/references/rd-sub-agent-dispatch.md +39 -0
- package/skills/peaks-rd/references/rd-transition-gates.md +148 -0
- package/skills/peaks-rd/references/skill-presence-and-title.md +22 -0
- package/skills/peaks-solo/SKILL.md +87 -786
- package/skills/peaks-solo/references/anchoring-and-session-info.md +25 -0
- package/skills/peaks-solo/references/boundaries.md +21 -0
- package/skills/peaks-solo/references/codegraph-orchestration.md +5 -0
- package/skills/peaks-solo/references/completion-handoff.md +16 -0
- package/skills/peaks-solo/references/context-governance.md +51 -0
- package/skills/peaks-solo/references/external-references.md +17 -0
- package/skills/peaks-solo/references/frontend-only-mode.md +87 -0
- package/skills/peaks-solo/references/gstack-integration.md +7 -0
- package/skills/peaks-solo/references/local-artifact-workspace.md +79 -0
- package/skills/peaks-solo/references/micro-cycle.md +68 -0
- package/skills/peaks-solo/references/mode-selection.md +21 -0
- package/skills/peaks-solo/references/openspec-workflow.md +43 -0
- package/skills/peaks-solo/references/project-memory-loading.md +17 -0
- package/skills/peaks-solo/references/project-scan-checklist.md +136 -0
- package/skills/peaks-solo/references/quality-gate-cheatsheet.md +13 -0
- package/skills/peaks-solo/references/resume-detection.md +63 -0
- package/skills/peaks-solo/references/runbook.md +1 -1
- package/skills/peaks-solo/references/skill-presence-and-title.md +31 -0
- package/skills/peaks-solo/references/standards-preflight.md +23 -0
- package/skills/peaks-solo/references/sub-agent-dispatch.md +46 -0
- package/skills/peaks-solo/references/swarm-dispatch-contract.md +56 -0
package/skills/peaks-qa/SKILL.md
CHANGED
|
@@ -7,31 +7,7 @@ description: QA and verification skill for Peaks. Use when a workflow needs unit
|
|
|
7
7
|
|
|
8
8
|
> **Read once at the top of this file; the rest of the skill is written against it.**
|
|
9
9
|
|
|
10
|
-
The `.peaks/` workspace is partitioned by **two orthogonal axes
|
|
11
|
-
|
|
12
|
-
| Axis | Path root | Holds | When to use |
|
|
13
|
-
|---|---|---|---|
|
|
14
|
-
| **change-id axis** (reviewable artifacts) | `.peaks/<changeId>/...` | PRD, RD plan, code-review, security-review, test-cases, handoff capsules, gate targets | The artifact should be reviewable on its own and survives across sessions for the same change. Change-id is the unit of work. |
|
|
15
|
-
| **session-id axis** (ephemeral state) | `.peaks/_runtime/<sessionId>/...` | Session bindings (`.peaks/_runtime/session.json`), live in-flight state, the per-session project-scan and tech-doc scaffold while the session is open | The artifact is session-scoped and only meaningful while the parent session is live. |
|
|
16
|
-
| **sub-agent axis** | `.peaks/_sub_agents/<sessionId>/...` | Sub-agent dispatch records, sub-agent heartbeats, per-sub-agent shared channel entries, sub-agent artifact outputs | A sub-agent ran in a parent session. The axis nests under the parent session-id; sub-agent outputs are flushed into the change-id root on commit. |
|
|
17
|
-
|
|
18
|
-
**Which CLI commands operate on which axis:**
|
|
19
|
-
|
|
20
|
-
- **change-id axis** (reviewable artifacts): `peaks request init`, `peaks request transition`, `peaks request show`, `peaks request lint`, `peaks request repair-status`, `peaks scan diff-vs-scope`, `peaks scan acceptance-coverage`. Inputs reference `.peaks/<changeId>/...`.
|
|
21
|
-
- **session-id axis** (ephemeral state): `peaks session info`, `peaks session start`, `peaks session finish`, `peaks session list`. Reads/writes `.peaks/_runtime/<sessionId>/session.json`.
|
|
22
|
-
- **sub-agent axis** (under parent session-id): `peaks sub-agent dispatch`, `peaks sub-agent heartbeat`, `peaks sub-agent share`, `peaks sub-agent shared-read`. All output paths are under `.peaks/_sub_agents/<sessionId>/...`.
|
|
23
|
-
|
|
24
|
-
**Placeholder convention used in this file:**
|
|
25
|
-
|
|
26
|
-
- `<changeId>` / `<change-id>` — the change-id axis. Use when describing a path that lives at `.peaks/<changeId>/...` (root-level, NOT inside `_runtime/`).
|
|
27
|
-
- `<sessionId>` / `<session-id>` — the session-id axis. Use when describing a path that lives at `.peaks/_runtime/<sessionId>/...` or `.peaks/_sub_agents/<sessionId>/...`. The long form `<session-id>` is used inside bash / shell examples where `<sessionId>` would break parsing.
|
|
28
|
-
- The bare `<sid>` placeholder is **forbidden** in new content — it is ambiguous between the two axes. Legacy occurrences are replaced by this convention; new content must use the right axis label.
|
|
29
|
-
|
|
30
|
-
**Cross-references:**
|
|
31
|
-
|
|
32
|
-
- Slice `2026-06-05-change-id-as-unit-of-work` (commits `48958fc` + `928eb53`) — established the change-id axis as the canonical root for reviewable artifacts (`src/shared/change-id.ts:131,335`, `src/services/scan/acceptance-coverage-service.ts:155`).
|
|
33
|
-
- Slice `005-session-runtime-dir-regression` (commit `178a47e`) — added the `getSessionDir()` resolver at `src/services/session/getSessionDir.ts` and routed 4 stragglers that were constructing `.peaks/${sessionId}` (no `_runtime/`) through the canonical resolver. Defense-in-depth scan: `tests/unit/services/session/session-dir-canonical.test.ts`.
|
|
34
|
-
- Slice `006-5th-writer-changeid-path` (this slice) — disambiguates the SKILL.md placeholders and adds the regression test `tests/unit/skills/skills-skill-md-naming.test.ts` that mechanically enforces (a) zero bare `<sid>`, (b) every `.peaks/<X>/` reference has an axis label, (c) the "Two-axis naming convention" callout is present in `peaks-solo`, `peaks-rd`, `peaks-qa`.
|
|
10
|
+
The `.peaks/` workspace is partitioned by **two orthogonal axes**: **change-id** (reviewable artifacts at `.peaks/<changeId>/...`) and **session-id** (ephemeral state at `.peaks/_runtime/<sessionId>/...`), with a nested **sub-agent axis** under `.peaks/_sub_agents/<sessionId>/...`. Use `<changeId>` / `<sessionId>` placeholders (NEVER bare `<sid>`). CLI axis mapping: change-id → `peaks request *` / `peaks scan *`; session-id → `peaks session *`; sub-agent → `peaks sub-agent *`. Regression test `tests/unit/skills/skills-skill-md-naming.test.ts` enforces (a) zero bare `<sid>`, (b) every `.peaks/<X>/` has an axis label, (c) this callout is present.
|
|
35
11
|
|
|
36
12
|
# Peaks-Cli QA
|
|
37
13
|
|
|
@@ -39,147 +15,33 @@ Peaks-Cli QA proves that planned changes are protected and accepted.
|
|
|
39
15
|
|
|
40
16
|
## Hard contracts for browser validation (BLOCKING — read before any browser_take_screenshot / login flow)
|
|
41
17
|
|
|
42
|
-
These two contracts are non-negotiable. The previous prose-only phrasing let the LLM skip the browser gate entirely when an auth wall appeared, and let screenshots land in the project root because the LLM forgot to pass `filename`. Both fail modes are blocking violations
|
|
43
|
-
|
|
44
|
-
### Contract 1 — Screenshot path is mandatory and must land under .peaks/_runtime/<sessionId>/qa/screenshots/
|
|
18
|
+
These two contracts are non-negotiable. The previous prose-only phrasing let the LLM skip the browser gate entirely when an auth wall appeared, and let screenshots land in the project root because the LLM forgot to pass `filename`. Both fail modes are blocking violations.
|
|
45
19
|
|
|
46
|
-
|
|
20
|
+
**Contract 1 — Screenshot path is mandatory:** every Playwright `browser_take_screenshot` MUST pass `filename` whose absolute path is **inside** `.peaks/_runtime/<sessionId>/qa/screenshots/`. Project-root `.png` is a violation. Enforced by `ls .peaks/_runtime/<session-id>/qa/screenshots/*.png` + `find . -maxdepth 1 -name '*.png'`.
|
|
47
21
|
|
|
48
|
-
|
|
49
|
-
# The LLM invokes this directly; peaks-cli is no longer the dispatcher.
|
|
50
|
-
# (This shape remains as documentation of the args schema.)
|
|
51
|
-
browser_take_screenshot \
|
|
52
|
-
--args '{"filename":"/abs/path/.peaks/_runtime/<sessionId>/qa/screenshots/<state>.png"}'
|
|
53
|
-
```
|
|
22
|
+
**Contract 2 — Login / CAPTCHA / SSO / MFA is a hard block, not a skip:** surface the wall with `AskUserQuestion` and pick one of three paths (login now / skip browser validation / cancel workflow). Do not infer login completion from DOM state. Do not route through Chrome DevTools MCP as a substitute.
|
|
54
23
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
This rule is enforced by a Peaks-Cli preflight check inside this skill:
|
|
58
|
-
|
|
59
|
-
```bash
|
|
60
|
-
# After every browser_take_screenshot batch and before declaring the test report complete:
|
|
61
|
-
ls .peaks/_runtime/<session-id>/qa/screenshots/*.png 2>&1
|
|
62
|
-
# Expected: at least one .png file under the screenshots directory.
|
|
63
|
-
# "No such file" → BLOCKED. Either the screenshot was never taken, or
|
|
64
|
-
# it landed in the project root (move it before continuing).
|
|
65
|
-
find . -maxdepth 1 -name '*.png' 2>&1
|
|
66
|
-
# Expected: empty. Any .png at the project root is a leak — move it
|
|
67
|
-
# to .peaks/_runtime/<session-id>/qa/screenshots/ before completing this skill.
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
### Contract 2 — Login / CAPTCHA / SSO / MFA wall is a hard block, not a skip
|
|
71
|
-
|
|
72
|
-
When the headed browser hits a login wall (Feishu / Lark SSO, GitHub OAuth, custom captcha, MFA push, anything that needs the human), QA **MUST NOT** silently downgrade to static screenshots, manual steps, or any other tool. The skill must surface the wall to the user with `AskUserQuestion` and pick one of three paths:
|
|
73
|
-
|
|
74
|
-
```
|
|
75
|
-
AskUserQuestion({
|
|
76
|
-
question: "Headed browser hit a login wall at <URL>. How should QA proceed?",
|
|
77
|
-
options: [
|
|
78
|
-
{ label: "I am logged in / I'll log in now",
|
|
79
|
-
description: "Pause QA. The visible browser is already open; the user completes login in-place, then types 'logged in' or equivalent. QA then resumes browser_navigate + browser_snapshot from the post-login page." },
|
|
80
|
-
{ label: "Skip browser validation for this slice",
|
|
81
|
-
description: "Mark the affected acceptance items as unverified in the test report. Do NOT issue a pass verdict. The slice stays in qa-running with the browser gate marked blocked, reason=login-required. peaks-solo's repair loop will surface this on the next cycle." },
|
|
82
|
-
{ label: "Cancel the workflow",
|
|
83
|
-
description: "Stop QA immediately. Emit a blocked TXT handoff so peaks-solo can surface the auth wall to the user. Do not mark any acceptance items as accepted." }
|
|
84
|
-
]
|
|
85
|
-
})
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
Do **not** infer login completion from DOM state (presence of an avatar, a user-name span, etc.) — only the user's explicit confirmation counts. Do **not** route through Chrome DevTools MCP as a substitute for the headed browser; it does not launch a browser and cannot simulate user interaction.
|
|
89
|
-
|
|
90
|
-
This is the hard-block replacement for the previous "wait for the user" prose. Without an explicit decision from the user, QA does not advance past the wall.
|
|
24
|
+
→ see `references/browser-validation-contracts.md` for the full contract + AskUserQuestion options.
|
|
91
25
|
|
|
92
26
|
## Sub-agent dispatch (when launched by peaks-solo swarm)
|
|
93
27
|
|
|
94
|
-
When this skill is launched as a sub-agent via `peaks sub-agent dispatch <role>` (then the LLM executes the returned toolCall) from `peaks-solo`, the following sections of THIS skill are **suspended** for the sub-agent run:
|
|
95
|
-
|
|
96
|
-
## QA fan-out (业务 + 性能 + 安全 并发, 业务可再分)
|
|
97
|
-
|
|
98
|
-
When peaks-qa is the **main loop** (i.e. it is the active skill and is about to run its own sub-agent dispatch, rather than being a sub-agent itself), it fans out the 3 QA review activities concurrently using the same `peaks sub-agent dispatch` primitive:
|
|
99
|
-
|
|
100
|
-
```
|
|
101
|
-
peaks sub-agent dispatch qa-business \
|
|
102
|
-
--prompt "<qa-business contract, plus runtime args project=<repo>, session-id=<session-id>, request-id=<rid>>" \
|
|
103
|
-
--request-id <rid> --session-id <session-id> --project <repo> --json
|
|
104
|
-
|
|
105
|
-
peaks sub-agent dispatch qa-perf \
|
|
106
|
-
--prompt "<qa-perf contract, plus runtime args>" \
|
|
107
|
-
--request-id <rid> --session-id <session-id> --project <repo> --json
|
|
108
|
-
|
|
109
|
-
peaks sub-agent dispatch qa-security \
|
|
110
|
-
--prompt "<qa-security contract, plus runtime args>" \
|
|
111
|
-
--request-id <rid> --session-id <session-id> --project <repo> --json
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
All three are issued in a single message; the LLM fires all 3 returned toolCalls in parallel; the IDE runs them concurrently; peaks-qa then collects the three envelopes and merges their outputs into:
|
|
115
|
-
|
|
116
|
-
- `.peaks/_runtime/<sessionId>/qa/test-reports/<rid>.md` (business findings)
|
|
117
|
-
- `.peaks/_runtime/<sessionId>/qa/performance-findings.md` (perf findings)
|
|
118
|
-
- `.peaks/_runtime/<sessionId>/qa/security-findings.md` (security findings)
|
|
119
|
-
|
|
120
|
-
## 业务测试细分 (optional)
|
|
28
|
+
When this skill is launched as a sub-agent via `peaks sub-agent dispatch <role>` (then the LLM executes the returned toolCall) from `peaks-solo`, the following sections of THIS skill are **suspended** for the sub-agent run: Session id, Skill presence, Workspace initialization, Mode selection, Statusline install. The sub-agent must NOT call `peaks request init` (Solo already initialised the slot), and must write `.peaks/_runtime/<sessionId>/qa/test-cases/<rid>.md` with test cases that link to PRD acceptance items. Return only a compact JSON envelope.
|
|
121
29
|
|
|
122
|
-
|
|
30
|
+
→ see `references/qa-sub-agent-dispatch.md` for the full contract + hard prohibitions.
|
|
123
31
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
- **Session id** — use the parent's sid (read `.peaks/_runtime/session.json` or pass `--session-id <parent-sid>` to any session-creating CLI). Do NOT spawn your own session. The new `peaks session info --active` reads the canonical binding for you.
|
|
127
|
-
- **Skill presence (MANDATORY first action)** — do NOT call `peaks skill presence:set peaks-qa`. The sub-agent must not overwrite `.peaks/.active-skill.json`; the main Solo loop owns that file. If you need to mark your own state, write a marker file at `.peaks/_runtime/<sessionId>/system/sub-agent-qa.json` and only that.
|
|
128
|
-
- **Workspace initialization** — Solo has already run `peaks workspace init` before fan-out. Do not re-run it.
|
|
129
|
-
- **Mode selection** — Solo has already chosen the mode.
|
|
130
|
-
- **Statusline install** — already done by Solo at session startup.
|
|
131
|
-
|
|
132
|
-
What the sub-agent **MUST** still do:
|
|
133
|
-
|
|
134
|
-
0. **Do NOT call `peaks request init`** — Solo has already initialised the request artefact slot in the main loop before fan-out. The sub-agent reads it via `peaks request show <rid> --role qa --project <repo> --json` if it needs to.
|
|
135
|
-
2. `peaks request show <rid> --role prd --project <repo> --json` (and `--role rd`, `--role ui` if UI is in the swarm plan).
|
|
136
|
-
3. Standards preflight (dry-run only).
|
|
137
|
-
4. Write `.peaks/_runtime/<sessionId>/qa/test-cases/<rid>.md` with test cases that link to PRD acceptance items.
|
|
138
|
-
5. Return only a compact JSON envelope:
|
|
139
|
-
|
|
140
|
-
```json
|
|
141
|
-
{
|
|
142
|
-
"role": "qa-test-cases",
|
|
143
|
-
"rid": "<rid>",
|
|
144
|
-
"status": "ok" | "blocked" | "skipped",
|
|
145
|
-
"artefacts": [".peaks/_runtime/<sessionId>/qa/test-cases/<rid>.md"],
|
|
146
|
-
"warnings": [],
|
|
147
|
-
"blockedReason": null
|
|
148
|
-
}
|
|
149
|
-
```
|
|
32
|
+
## QA fan-out (业务 + 性能 + 安全 并发, 业务可再分)
|
|
150
33
|
|
|
151
|
-
**
|
|
34
|
+
When peaks-qa is the **main loop** (i.e. it is the active skill and is about to run its own sub-agent dispatch, rather than being a sub-agent itself), it fans out the 3 QA review activities concurrently using the same `peaks sub-agent dispatch` primitive: qa-business, qa-perf, qa-security. All three are issued in a single message; the LLM fires all 3 returned toolCalls in parallel; the IDE runs them concurrently; peaks-qa then collects the three envelopes and merges their outputs into `.peaks/_runtime/<sessionId>/qa/test-reports/<rid>.md` (business findings) + `qa/performance-findings.md` + `qa/security-findings.md`.
|
|
152
35
|
|
|
153
|
-
-
|
|
154
|
-
- Do NOT call `peaks skill presence:set` — Solo owns the active-skill file.
|
|
155
|
-
- Do NOT run the actual test suite, do NOT execute security/perf tools, do NOT open a browser — those are the **QA validation** phase, not the Swarm planning phase. The Swarm sub-agent is "QA(test-cases)" (planning), which only produces the test-case artefact. The actual validation runs after RD implementation in a separate sub-agent or inline run.
|
|
156
|
-
- Do NOT commit, push, install hooks, or apply settings.json mutations.
|
|
157
|
-
- Do NOT ask the user interactive questions. If you need clarification, return `{"status":"blocked","blockedReason":"<text>"}`.
|
|
36
|
+
If the PRD or project warrants it, subdivide `qa-business` further into roles like `qa-business-api` / `qa-business-frontend` / `qa-business-regression`. Subdivision must stay ≤ 2 levels deep (RL-4).
|
|
158
37
|
|
|
159
|
-
|
|
38
|
+
→ see `references/qa-fanout-contract.md` for the full contract + heartbeat / batch-id / 30s cadence / 100-truncation / 5min stale.
|
|
160
39
|
|
|
161
40
|
## Skill presence (MANDATORY first action — main-loop context only)
|
|
162
41
|
|
|
163
|
-
When this skill is running in the main Claude session (not as a sub-agent), before any analysis or tool call, immediately run:
|
|
164
|
-
|
|
165
|
-
```bash
|
|
166
|
-
peaks skill presence:set peaks-qa --project <repo> --mode <mode> --gate startup
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
On the first presence:set in a project, ensure the out-of-band status bar is installed so the user can see at a glance that Peaks is orchestrating — it renders the active skill in Claude Code's terminal status line, independent of model output:
|
|
170
|
-
|
|
171
|
-
```bash
|
|
172
|
-
peaks statusline install --project <repo> # idempotent; skips if already installed
|
|
173
|
-
```
|
|
42
|
+
When this skill is running in the main Claude session (not as a sub-agent), before any analysis or tool call, immediately run `peaks skill presence:set peaks-qa --project <repo> --mode <mode> --gate startup`. Install statusline on first run. Read durable project memory via `peaks project memories --project <repo> --json`.
|
|
174
43
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
```bash
|
|
178
|
-
peaks project memories --project <repo> --json
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
This returns durable memories from `.peaks/memory` — decisions, conventions, modules, and rules captured in past sessions. Filter with `--kind <decision|convention|module|rule|reference|project>`. (`.peaks/PROJECT.md` is a human-readable session timeline only.)
|
|
182
|
-
Then display: `Peaks-Cli Skill: peaks-qa | Peaks-Cli Gate: startup | Next: <one short action>`. Update with `peaks skill presence:set peaks-qa --project <repo> --mode <mode> --gate <gate>` when gates change. When the role's work ends, run `peaks skill presence:clear --project <repo>`.
|
|
44
|
+
→ see `references/qa-skill-presence.md` for the full contract.
|
|
183
45
|
|
|
184
46
|
## Responsibilities
|
|
185
47
|
|
|
@@ -194,429 +56,138 @@ Then display: `Peaks-Cli Skill: peaks-qa | Peaks-Cli Gate: startup | Next: <one
|
|
|
194
56
|
|
|
195
57
|
## Mandatory per-request artifact
|
|
196
58
|
|
|
197
|
-
Every QA invocation — feature, bug, refactor, clarification — must write **three separate files
|
|
59
|
+
Every QA invocation — feature, bug, refactor, clarification — must write **three separate files** (test cases + test report + request artifact). Do not merge them into one. Each serves a different reader.
|
|
198
60
|
|
|
199
|
-
|
|
200
|
-
|---|------|------|--------|---------|
|
|
201
|
-
| 1 | Test cases | `.peaks/_runtime/<sessionId>/qa/test-cases/<request-id>.md` | RD (before impl), QA | Generated test scenarios with status |
|
|
202
|
-
| 2 | Test report | `.peaks/_runtime/<sessionId>/qa/test-reports/<request-id>.md` | QA, SC, Solo | Summary, coverage%, security, perf, risks |
|
|
203
|
-
| 3 | Request artifact | `.peaks/_runtime/<sessionId>/qa/requests/<request-id>.md` | Solo, RD↔QA loop | Verdict, boundary check, links to #1 and #2 |
|
|
204
|
-
|
|
205
|
-
Concrete template and rules: `references/artifact-per-request.md`.
|
|
61
|
+
→ see `references/artifact-per-request.md` for the 3-file contract (test cases / test report / request artifact).
|
|
206
62
|
|
|
207
63
|
## Default runbook
|
|
208
64
|
|
|
209
|
-
The default sequence the QA skill should execute. Do not skip the boundary check, the unit test gate, the validation report, or — when frontend is in scope — the Playwright MCP browser gate.
|
|
210
|
-
|
|
211
|
-
```bash
|
|
212
|
-
# 0. confirm QA's own runbook integrity before validating anything
|
|
213
|
-
peaks skill runbook peaks-qa --json
|
|
214
|
-
peaks skill presence:set peaks-qa --project <repo> # show persistent skill presence every turn
|
|
215
|
-
|
|
216
|
-
# 1. capture the QA request artifact and read upstream scope
|
|
217
|
-
peaks request init --role qa --id <request-id> --project <repo> --apply --json
|
|
218
|
-
peaks request show <request-id> --role prd --project <repo> --json
|
|
219
|
-
peaks request show <request-id> --role rd --project <repo> --json
|
|
220
|
-
peaks request show <request-id> --role ui --project <repo> --json # if UI involved
|
|
221
|
-
|
|
222
|
-
# 2. standards preflight and red-line boundary check against the diff
|
|
223
|
-
peaks standards init --project <repo> --dry-run --json
|
|
224
|
-
peaks standards update --project <repo> --dry-run --json
|
|
225
|
-
peaks codegraph affected --project <repo> <changed-files...> --json # regression-surface hint
|
|
226
|
-
|
|
227
|
-
# 3. OpenSpec exit gate when openspec/ exists
|
|
228
|
-
peaks openspec validate <change-id> --project <repo> --json
|
|
229
|
-
peaks openspec validate <change-id> --project <repo> --prefer-external --json # optional
|
|
230
|
-
|
|
231
|
-
# 4. generate test cases — MANDATORY, write to .peaks/_runtime/<sessionId>/qa/test-cases/<request-id>.md
|
|
232
|
-
# categories: unit, integration, UI regression (frontend only)
|
|
233
|
-
#
|
|
234
|
-
# Optimization (slice 004): peaks-rd's parallel fan-out now includes a 4th
|
|
235
|
-
# sub-agent (`qa-test-cases-writer`) that pre-drafts this file at the
|
|
236
|
-
# end of RD implementation. If `.peaks/_runtime/<sessionId>/qa/test-cases/<rid>.md`
|
|
237
|
-
# already exists when QA's main loop reaches this step, **QA does NOT
|
|
238
|
-
# re-draft it** — it just verifies the file is present and the
|
|
239
|
-
# per-criterion `ts` snippets are syntactically valid, then proceeds
|
|
240
|
-
# to step 5 (EXECUTE). The wall-clock win: QA's first action is
|
|
241
|
-
# "execute pre-drafted test plan" instead of "draft + execute".
|
|
242
|
-
# Fallback: if the file is missing (sub-agent failed / degraded to
|
|
243
|
-
# inline), QA drafts it inline as before.
|
|
244
|
-
|
|
245
|
-
# 5. EXECUTE tests against the actual implementation — Peaks-Cli Gate A2
|
|
246
|
-
# Run the project test command. Record output. Tests on paper are worthless.
|
|
247
|
-
# Peaks-Cli Gate A3: Run security review → .peaks/<changeId>/qa/security-findings.md
|
|
248
|
-
# Peaks-Cli Gate A4: Run performance check → .peaks/<changeId>/qa/performance-findings.md
|
|
249
|
-
# CRITICAL: Peaks-Cli Gate A3 and Peaks-Cli Gate A4 are NON-NEGOTIABLE. You MUST run actual security
|
|
250
|
-
# and performance checks — not just write a checklist item. These gates exist
|
|
251
|
-
# because code review alone does not catch: hardcoded secrets, XSS vectors,
|
|
252
|
-
# bundle size regressions, render-performance issues, or missing CSP headers.
|
|
253
|
-
# If you skip A3 or A4, Peaks-Cli Gate C will block the verdict.
|
|
254
|
-
#
|
|
255
|
-
# Before running A4, read the RD's perf-baseline at
|
|
256
|
-
# .peaks/<changeId>/rd/perf-baseline.md (if present) and use the
|
|
257
|
-
# captured thresholds as the comparison baseline. The QA stage
|
|
258
|
-
# is still responsible for running the actual measurement
|
|
259
|
-
# (lighthouse / k6 / autocannon / project-local bench) and
|
|
260
|
-
# for the verdict — the RD-side baseline is the *known-good
|
|
261
|
-
# reference* that lets the QA stage say "X regressed by Y%"
|
|
262
|
-
# instead of "X is bad, but I have no number for what good
|
|
263
|
-
# looks like". If the RD did not produce a perf-baseline
|
|
264
|
-
# (e.g. the slice is docs / chore / has no perf surface),
|
|
265
|
-
# surface that absence in the QA test-report under a
|
|
266
|
-
# `## Performance baseline` section.
|
|
267
|
-
|
|
268
|
-
# 6. write test-report — MANDATORY, write to .peaks/_runtime/<sessionId>/qa/test-reports/<request-id>.md
|
|
269
|
-
# MUST contain actual execution results (pass/fail counts, coverage %, findings).
|
|
270
|
-
# A template with placeholder text does not pass Peaks-Cli Gate B.
|
|
271
|
-
|
|
272
|
-
# 7. frontend browser validation (when frontend is in scope)
|
|
273
|
-
# Slice #016: peaks-cli no longer manages MCP install/dispatch. The LLM
|
|
274
|
-
# checks its own tool list for any Playwright MCP entry in the LLM tool list. If absent,
|
|
275
|
-
# QA reports the missing tool and tells the user the install command
|
|
276
|
-
# (`claude mcp add playwright -- npx @playwright/mcp@latest` in Claude
|
|
277
|
-
# Code; other IDEs have their own MCP install path). QA does NOT
|
|
278
|
-
# auto-install on the user's behalf and does NOT hand-edit
|
|
279
|
-
# `~/.claude/settings.json`.
|
|
280
|
-
# DEV-SERVER REQUIREMENT (BLOCKING): a running dev server is REQUIRED for browser E2E.
|
|
281
|
-
# The same lifecycle applies to ANY service QA starts (backend API, mock server, database,
|
|
282
|
-
# etc): capture PID on startup, validate, then kill the process after verification.
|
|
283
|
-
# Start the dev server (npm run dev / pnpm dev / umi dev / etc) and capture the actual
|
|
284
|
-
# advertised URL from its stdout (do NOT hard-code localhost:8000). Capture the dev server
|
|
285
|
-
# PID on startup so it can be killed after verification. If the dev server fails to start,
|
|
286
|
-
# hangs, or times out (e.g. tailwindcss/plugin slowness, port conflict, missing env), this
|
|
287
|
-
# is a BLOCKER — NOT a reason to skip browser E2E. You MUST:
|
|
288
|
-
# 1. Record the failure and root cause in qa/test-reports/<rid>.md;
|
|
289
|
-
# 2. Return verdict=blocked (or return-to-rd if the root cause is implementation-related);
|
|
290
|
-
# 3. NEVER substitute a production build (`umi build` / `vite build` / `next build`) for
|
|
291
|
-
# browser E2E. A successful production build proves compilation, not runtime behavior,
|
|
292
|
-
# and does NOT satisfy Peaks-Cli Gate D. Treating prod build as a fallback is a workflow violation.
|
|
293
|
-
# 4. After browser validation completes, KILL the dev server. Do not leave it running.
|
|
294
|
-
# Playwright MCP MUST simulate real user operations — not just take static screenshots.
|
|
295
|
-
# The LLM invokes the tools by name from its own tool list (no peaks-cli envelope):
|
|
296
|
-
# 1. Detect: check the LLM tool list for any Playwright MCP entry in the LLM tool list.
|
|
297
|
-
# If absent, STOP and tell the user the install command for their IDE.
|
|
298
|
-
# 2. Navigate: browser_navigate --args '{"url":"<url>"}'
|
|
299
|
-
# 3. Inspect: browser_snapshot / browser_console_messages / browser_network_requests
|
|
300
|
-
# 4. Interact: browser_click / browser_type / browser_select_option / browser_fill_form
|
|
301
|
-
# / browser_wait_for (no idle waits; use deterministic selectors)
|
|
302
|
-
# 5. Screenshot: browser_take_screenshot --args '{"filename":"<abs-path>","fullPage":<bool>}'
|
|
303
|
-
# 6. Close: browser_close
|
|
304
|
-
# Static screenshots without user-interaction simulation do NOT pass this gate.
|
|
305
|
-
# Block QA pass if Playwright MCP is unavailable in the LLM tool list.
|
|
306
|
-
#
|
|
307
|
-
# CLEANUP: After browser validation completes (all screenshots saved, console/network
|
|
308
|
-
# evidence captured), QA MUST kill every process it started during verification.
|
|
309
|
-
# This includes: frontend dev server, backend API server, mock server, database
|
|
310
|
-
# instances, proxy, or any other long-running process. Find the process by port
|
|
311
|
-
# (lsof -ti :<port>) or by the pid captured at startup, then kill it. Do NOT leave
|
|
312
|
-
# orphaned processes running — they consume ports and resources, and may interfere
|
|
313
|
-
# with subsequent development or other QA sessions.
|
|
314
|
-
|
|
315
|
-
# 8. write per-criterion acceptance results, regression matrix, security/performance findings,
|
|
316
|
-
# and the final verdict into the QA request artifact. Mark state=verdict-issued.
|
|
317
|
-
# BEFORE the transition, run the QA quality-gate CLI checks (see Peaks-Cli Gate E/F):
|
|
318
|
-
peaks scan acceptance-coverage --rid <rid> --project <repo> --json
|
|
319
|
-
# → ok=false → BLOCKED. Some PRD acceptance items have no linked test case
|
|
320
|
-
# (or some test cases reference non-existent acceptance ids). Fix the test-cases file.
|
|
321
|
-
peaks request lint <rid> --role qa --project <repo> --json
|
|
322
|
-
# → ok=false → BLOCKED. The QA artifact body has unfilled <placeholders> or "..." stubs.
|
|
323
|
-
|
|
324
|
-
# 9. on verdict=return-to-rd, route findings back through the request id; otherwise close.
|
|
325
|
-
peaks request show <request-id> --role qa --project <repo> --json
|
|
326
|
-
peaks openspec archive <change-id> --project <repo> --json # preview, then --apply on full pass
|
|
327
|
-
peaks project memories:extract --session-id <session-id> --project <repo> --json # extract durable memories
|
|
328
|
-
peaks skill presence:clear --project <repo> # QA complete, remove presence indicator
|
|
329
|
-
```
|
|
330
|
-
|
|
331
|
-
Verdict `pass` is blocked until every applicable validation gate has evidence in the artifact.
|
|
332
|
-
|
|
333
|
-
### Transition verification gates (MANDATORY — run the command, see the output)
|
|
334
|
-
|
|
335
|
-
You cannot declare a phase complete from memory. Each gate below is a `ls` or `grep` command you **MUST run** and whose output you **MUST see** before proceeding. If any file shows "No such file" or any command returns empty, the phase is incomplete.
|
|
336
|
-
|
|
337
|
-
> **CLI enforcement (NEW)**: the gates below are now ALSO enforced by `peaks request transition`. The CLI checks the same files before allowing the transition and fails with `code: PREREQUISITES_MISSING` if any are absent. Required files depend on the request type recorded at `peaks request init --type ...`:
|
|
338
|
-
>
|
|
339
|
-
> | Type | qa:running requires | qa:verdict-issued also requires |
|
|
340
|
-
> |---|---|---|
|
|
341
|
-
> | feature / refactor | `qa/test-cases/<rid>.md` | `qa/test-reports/<rid>.md` + `qa/security-findings.md` + `qa/performance-findings.md` |
|
|
342
|
-
> | bugfix | `qa/test-cases/<rid>.md` (MUST include the regression test) | `qa/test-reports/<rid>.md` + `qa/security-findings.md` (perf optional unless the bug is performance-related) |
|
|
343
|
-
> | config | (none) | `qa/security-findings.md` only |
|
|
344
|
-
> | docs / chore | (none) | (none) |
|
|
345
|
-
>
|
|
346
|
-
> For feature / refactor, `security-findings.md` and `performance-findings.md` MUST exist — record `"no findings"` inside if truly clean rather than skipping the file. The escape hatch `--allow-incomplete --reason "<justification>"` is recorded in the artifact transition note.
|
|
347
|
-
|
|
348
|
-
**Peaks-Cli Gate A — After test-case generation:**
|
|
349
|
-
```bash
|
|
350
|
-
ls .peaks/<changeId>/qa/test-cases/<rid>.md
|
|
351
|
-
# Expected output: .peaks/<changeId>/qa/test-cases/<rid>.md
|
|
352
|
-
# "No such file" → STOP, generate test cases first. Do not proceed to validation.
|
|
353
|
-
```
|
|
354
|
-
|
|
355
|
-
**Peaks-Cli Gate A2 — After test execution: tests actually ran and produced output (CRITICAL):**
|
|
356
|
-
```bash
|
|
357
|
-
# Run the project's test command. Do NOT skip this. Writing test cases is not enough.
|
|
358
|
-
# Example (adapt to project):
|
|
359
|
-
# QA validation defaults to the CHANGED-ONLY suite (matches `peaks slice check` default as of run 017).
|
|
360
|
-
# Use the full suite only when the slice is structurally significant or when the user explicitly asks
|
|
361
|
-
# for it (e.g. via /peaks-solo-test or `peaks slice check --run-tests`).
|
|
362
|
-
npx vitest run --changed --reporter=verbose 2>&1 | tail -30
|
|
363
|
-
# Expected: exit code 0, actual test output with pass/fail counts
|
|
364
|
-
# "0 tests executed" or "no test files found" → BLOCKED. Tests were written but not run.
|
|
365
|
-
# Record the raw test output and link it in the test report.
|
|
366
|
-
```
|
|
367
|
-
|
|
368
|
-
**Peaks-Cli Gate A3 — Security test executed (NOT just a checklist item):**
|
|
369
|
-
```bash
|
|
370
|
-
# Run security review against the changed surface. Record findings.
|
|
371
|
-
ls .peaks/<changeId>/qa/security-findings.md 2>&1
|
|
372
|
-
# Expected: .peaks/<changeId>/qa/security-findings.md
|
|
373
|
-
# "No such file" → BLOCKED. Run security review against changed files,
|
|
374
|
-
# record every finding with severity, then re-check.
|
|
375
|
-
```
|
|
376
|
-
|
|
377
|
-
**Peaks-Cli Gate A4 — Performance test executed:**
|
|
378
|
-
```bash
|
|
379
|
-
# Run available performance check against the changed surface. Record findings.
|
|
380
|
-
ls .peaks/<changeId>/qa/performance-findings.md 2>&1
|
|
381
|
-
# Expected: .peaks/<changeId>/qa/performance-findings.md
|
|
382
|
-
# "No such file" → BLOCKED. Run performance check (build-size, Lighthouse,
|
|
383
|
-
# bundle analysis, or project equivalent), record baseline vs. after, then re-check.
|
|
384
|
-
```
|
|
385
|
-
|
|
386
|
-
**Peaks-Cli Gate B — After test-report write (MUST contain execution results, not just planned cases):**
|
|
387
|
-
```bash
|
|
388
|
-
ls .peaks/<changeId>/qa/test-reports/<rid>.md
|
|
389
|
-
# Expected output: .peaks/<changeId>/qa/test-reports/<rid>.md
|
|
390
|
-
# "No such file" → STOP, write the test report first. Do not issue a verdict.
|
|
391
|
-
# Additionally verify the report is not a placeholder:
|
|
392
|
-
grep -c "pass\|fail\|blocked" .peaks/<changeId>/qa/test-reports/<rid>.md
|
|
393
|
-
# Expected: non-zero count (report contains actual pass/fail/blocked results)
|
|
394
|
-
# Zero → the report is empty/template-only. Tests were not executed.
|
|
395
|
-
```
|
|
396
|
-
|
|
397
|
-
**Peaks-Cli Gate C — Before issuing verdict:**
|
|
398
|
-
```bash
|
|
399
|
-
ls .peaks/<changeId>/qa/test-cases/<rid>.md \
|
|
400
|
-
.peaks/<changeId>/qa/test-reports/<rid>.md \
|
|
401
|
-
.peaks/<changeId>/qa/security-findings.md \
|
|
402
|
-
.peaks/<changeId>/qa/performance-findings.md \
|
|
403
|
-
.peaks/<changeId>/qa/requests/<rid>.md
|
|
404
|
-
# All five must exist. Missing any → QA incomplete, verdict blocked.
|
|
405
|
-
# NOTE: security-findings.md and performance-findings.md are NOT optional.
|
|
406
|
-
# If you can't run a full security scan, run at minimum: grep for secrets,
|
|
407
|
-
# check for XSS vectors, verify no hardcoded credentials.
|
|
408
|
-
# If you can't run Lighthouse, run at minimum: build-size check, bundle analysis.
|
|
409
|
-
# An empty "N/A — skipped" file does NOT pass. Every file must contain findings.
|
|
410
|
-
```
|
|
411
|
-
|
|
412
|
-
**Peaks-Cli Gate E — Acceptance coverage (every PRD acceptance item has a linked test case):**
|
|
413
|
-
```bash
|
|
414
|
-
peaks scan acceptance-coverage --rid <rid> --project <repo> --session-id <session-id> --json
|
|
415
|
-
# Expected: ok=true. exit 0.
|
|
416
|
-
# uncovered[] non-empty → BLOCKED. List of acceptance items without test cases is in the output.
|
|
417
|
-
# Add `- **Acceptance:** A<N>` lines to the matching test cases in qa/test-cases/<rid>.md, then re-run.
|
|
418
|
-
# invalidReferences[] non-empty → BLOCKED. A test case references an acceptance id that does not exist.
|
|
419
|
-
# Fix the typo or remove the reference.
|
|
420
|
-
# unlinkedTestCases[] non-empty → WARNING (not blocking). These test cases have no Acceptance: field;
|
|
421
|
-
# either link them or add `- **Acceptance:** —` with rationale in the Evidence field.
|
|
422
|
-
```
|
|
423
|
-
|
|
424
|
-
**Peaks-Cli Gate F — QA artifact body has no unfilled placeholders:**
|
|
425
|
-
```bash
|
|
426
|
-
peaks request lint <rid> --role qa --project <repo> --session-id <session-id> --json
|
|
427
|
-
# Expected: ok=true. exit 0.
|
|
428
|
-
# ok=false → BLOCKED. Lint output lists every <placeholder>, "- ..." stub, and TBD marker.
|
|
429
|
-
# Fill them in before issuing the verdict.
|
|
430
|
-
```
|
|
431
|
-
|
|
432
|
-
**Peaks-Cli Gate D — Frontend browser evidence (BLOCKING when frontend is in scope):**
|
|
433
|
-
```bash
|
|
434
|
-
# Verify browser screenshots exist. Screenshots are the only acceptable evidence
|
|
435
|
-
# that Playwright MCP actually launched and interacted with the running app.
|
|
436
|
-
ls .peaks/<changeId>/qa/screenshots/*.png 2>&1
|
|
437
|
-
# Expected: one or more .png files
|
|
438
|
-
# "No such file" → BLOCKED. Playwright MCP was not used or screenshots not saved.
|
|
439
|
-
# Screenshots, logs, manual steps, or other tools must NOT substitute for this gate.
|
|
440
|
-
# A successful production build (`umi build` / `vite build` / `next build` exit 0) does
|
|
441
|
-
# NOT substitute for this gate. Compilation success ≠ runtime behavior.
|
|
442
|
-
# If the dev server cannot start, verdict MUST be `blocked` (or `return-to-rd`),
|
|
443
|
-
# NOT `pass`. Record the dev-server failure root cause in the test report.
|
|
444
|
-
# Re-run frontend browser validation (step 7 in runbook) and save screenshots.
|
|
445
|
-
```
|
|
446
|
-
```bash
|
|
447
|
-
# Verify console and network checks were actually performed
|
|
448
|
-
grep -c "browser_console_messages\|browser_network_requests" .peaks/<changeId>/qa/test-reports/<rid>.md
|
|
449
|
-
# Expected: non-zero count (means console/network were checked)
|
|
450
|
-
# Zero → BLOCKED. Browser error feedback loop was not executed.
|
|
451
|
-
```
|
|
65
|
+
The default sequence the QA skill should execute. Do not skip the boundary check, the unit test gate, the validation report, or — when frontend is in scope — the Playwright MCP browser gate. The full 10-step runbook (steps #0–#9) with every CLI invocation, the rd-side pre-drafted test-cases optimization, the dev-server lifecycle requirement, the security/performance check discipline, and the 8 quality-gate CLI checks is in the references file.
|
|
452
66
|
|
|
453
|
-
|
|
67
|
+
→ see `references/qa-runbook.md` for the full runbook.
|
|
454
68
|
|
|
455
|
-
|
|
69
|
+
## Transition verification gates (MANDATORY — run the command, see the output)
|
|
456
70
|
|
|
457
|
-
|
|
458
|
-
- `peaks standards update --project <path> --dry-run`
|
|
71
|
+
You cannot declare a phase complete from memory. CLI enforcement: the gates below are ALSO enforced by `peaks request transition`, which fails with `code: PREREQUISITES_MISSING` if any are absent. Per-type required files: feature / refactor → test-cases + test-reports + security-findings + performance-findings; bugfix → test-cases + test-reports + security-findings (perf optional); config → security-findings only; docs / chore → none.
|
|
459
72
|
|
|
460
|
-
|
|
73
|
+
Gate index: A (test-cases), A2 (tests executed), A3 (security executed), A4 (performance executed), B (test-reports with results), C (all 5 files present before verdict), D (browser screenshots), E (acceptance coverage scan), F (QA artifact lint).
|
|
461
74
|
|
|
462
|
-
|
|
75
|
+
→ see `references/qa-transition-gates.md` for the full per-gate contract + `ls` / `grep` shell snippets.
|
|
463
76
|
|
|
464
|
-
|
|
77
|
+
## Project standards preflight
|
|
465
78
|
|
|
466
|
-
|
|
79
|
+
Before QA verification in a code repository, call `peaks standards init --project <path> --dry-run` and `peaks standards update --project <path> --dry-run`. Apply only when write authorization exists.
|
|
467
80
|
|
|
468
|
-
|
|
81
|
+
→ see `references/qa-standards-preflight.md` for the full preflight contract.
|
|
469
82
|
|
|
470
|
-
|
|
471
|
-
- map regression-test creation to Peaks-Cli acceptance checks and coverage evidence;
|
|
472
|
-
- keep Peaks-Cli QA as the acceptance authority, with gstack browser and QA patterns as references only when capabilities and user approval allow them.
|
|
83
|
+
## Refactor role
|
|
473
84
|
|
|
474
|
-
|
|
85
|
+
For refactors, QA must be involved before implementation. It defines the regression and acceptance surface, then verifies the same surface after implementation.
|
|
475
86
|
|
|
476
|
-
|
|
87
|
+
→ see `references/qa-refactor-role.md`.
|
|
477
88
|
|
|
478
|
-
|
|
479
|
-
2. strictly fail QA if the change modifies, deletes, mocks, or replaces content outside the approved boundary, including unrelated list/query endpoints, existing records, delete/update flows, auth, permissions, shared configuration, or request plumbing;
|
|
480
|
-
3. API and mock validation must exercise only the approved request paths unless the spec explicitly includes broader API coverage. Do not create, update, delete, or overwrite unrelated server/client state during QA;
|
|
481
|
-
4. browser E2E must avoid destructive interactions unless the requirement explicitly includes them and the user confirms the action;
|
|
482
|
-
5. record a “red-line boundary check” section in the validation report with pass/fail, evidence, and any out-of-scope findings.
|
|
89
|
+
## GStack integration
|
|
483
90
|
|
|
484
|
-
|
|
91
|
+
Map gstack stages (`Review → Test → Ship`) to Peaks-Cli regression matrices and validation reports. Keep Peaks-Cli QA as the acceptance authority; gstack is reference only.
|
|
485
92
|
|
|
486
|
-
|
|
93
|
+
→ see `references/qa-gstack-integration.md`.
|
|
487
94
|
|
|
488
|
-
|
|
95
|
+
## Requirement boundary recheck
|
|
489
96
|
|
|
490
|
-
|
|
491
|
-
2. **Integration test cases** — API contract verification, data flow through changed components, mock alignment with real API shapes
|
|
492
|
-
3. **UI regression test cases** (frontend only) — page load, component render states (loading, empty, error, populated), modal open/close, form submit/validation, table sort/filter/pagination, navigation flow, keyboard accessibility
|
|
97
|
+
Before QA passes or returns work to RD, it must independently recheck the implementation against the approved requirement boundary: compare PRD/RD/OpenSpec/diff; strictly fail QA if the change modifies out-of-scope surfaces; API/mock validation must exercise only the approved request paths; browser E2E must avoid destructive interactions; record a "red-line boundary check" section in the validation report.
|
|
493
98
|
|
|
494
|
-
|
|
99
|
+
→ see `references/requirement-boundary-recheck.md` for the full 5-step contract.
|
|
495
100
|
|
|
496
|
-
|
|
497
|
-
## Test Case: <title>
|
|
498
|
-
- **Category:** unit | integration | ui-regression
|
|
499
|
-
- **Target:** <file-or-route>
|
|
500
|
-
- **Acceptance:** A1, A2 (comma-separated IDs from PRD `## Acceptance criteria`; see "Acceptance linkage" below)
|
|
501
|
-
- **Preconditions:** <state-before>
|
|
502
|
-
- **Steps:** 1. ... 2. ...
|
|
503
|
-
- **Expected result:** <what-should-happen>
|
|
504
|
-
- **Status:** pass | fail | blocked | skipped
|
|
505
|
-
- **Evidence:** <link-or-observation>
|
|
506
|
-
```
|
|
101
|
+
## Mandatory test-case generation
|
|
507
102
|
|
|
508
|
-
|
|
103
|
+
QA must generate test cases, not merely inspect existing ones. Every QA invocation that validates code changes must produce a test-case artifact at `.peaks/_runtime/<sessionId>/qa/test-cases/<request-id>.md`. Minimum categories: Unit / Integration / UI regression. Each test case MUST have an `**Acceptance:**` field linking to PRD acceptance IDs (A1, A2, ...). The `peaks scan acceptance-coverage` command enforces coverage.
|
|
509
104
|
|
|
510
|
-
|
|
105
|
+
→ see `references/test-case-generation.md` for the full format + acceptance-linkage contract.
|
|
511
106
|
|
|
512
107
|
## Mandatory test-report output
|
|
513
108
|
|
|
514
|
-
Every QA invocation must produce a test-report artifact at `.peaks/_runtime/<sessionId>/qa/test-reports/<request-id>.md
|
|
515
|
-
|
|
516
|
-
**Minimum test-report sections:**
|
|
109
|
+
Every QA invocation must produce a test-report artifact at `.peaks/_runtime/<sessionId>/qa/test-reports/<request-id>.md` (separate from test-cases + request artifact). Minimum sections: Summary, Test execution results, Coverage evidence, Browser validation, Security findings, Performance findings, Residual risks, Red-line boundary check.
|
|
517
110
|
|
|
518
|
-
|
|
519
|
-
2. **Test execution results** — number of test cases executed, passed, failed, skipped
|
|
520
|
-
3. **Coverage evidence** — changed-files coverage %, overall project coverage %, link to coverage report
|
|
521
|
-
4. **Browser validation results** (frontend only) — pages validated, screenshots path, console errors found, network errors found
|
|
522
|
-
5. **Security findings** — issues found, severity, resolution status
|
|
523
|
-
6. **Performance findings** — baseline vs after numbers (build size, Lighthouse, etc. as applicable)
|
|
524
|
-
7. **Residual risks** — known issues not fixed, why, mitigation
|
|
525
|
-
8. **Red-line boundary check** — pass/fail against the approved scope
|
|
111
|
+
→ see `references/test-report-output.md` for the full minimum-sections contract.
|
|
526
112
|
|
|
527
113
|
## Mandatory validation gates
|
|
528
114
|
|
|
529
|
-
QA cannot pass a change until the report contains evidence for every applicable gate
|
|
530
|
-
|
|
531
|
-
0. **Test-case generation** — enforced by Peaks-Cli Gate A.
|
|
532
|
-
1. **Test-report** — enforced by Peaks-Cli Gate B.
|
|
533
|
-
2. **Unit tests** — run the project test command or a focused test command that covers new/changed code. For legacy projects below the target coverage, require coverage for the new or changed code rather than failing on pre-existing uncovered code.
|
|
534
|
-
3. **API validation** — when the change touches API contracts, data loading, request handling, auth, or integrations, exercise the relevant API path and record request/response evidence or a justified local substitute.
|
|
535
|
-
4. **Frontend browser validation** — when the repository has a frontend or the change affects UI, launch the app and use Playwright MCP for real browser end-to-end validation. This means **simulating real user operations**: clicking buttons, filling forms, selecting dropdowns, navigating between pages, waiting for async data to render, and verifying each resulting state. Static screenshots without interaction are insufficient. The LLM checks its tool list for any Playwright MCP entry in the LLM tool list; if absent, QA tells the user the install command (`claude mcp add playwright -- npx @playwright/mcp@latest` for Claude Code) and reports the gate as blocked. The LLM invokes the tool by name directly — there is no peaks-cli envelope:
|
|
536
|
-
|
|
537
|
-
The Playwright tool names that drive validation are: `browser_navigate` (launches headed browser), `browser_click` (simulate clicks on tabs/buttons/links), `browser_type` (type into inputs), `browser_select_option` (select dropdowns), `browser_fill_form` (fill complete forms), `browser_wait_for` (wait for async rendering), `browser_take_screenshot` (capture state after each interaction), `browser_close` (close the browser when done), `browser_console_messages` (read console failures), and `browser_network_requests` (read network failures). The bare server-and-tool MCP prefix is owned by the LLM runtime, not by the skill body — never bake the prefix into this SKILL.md or any artifact QA emits. If login, CAPTCHA, SSO, or MFA appears, the visible browser is already open; wait for the user to complete login and explicitly confirm completion before continuing. Capture sanitized interaction sequences, sanitized screenshots per state, sanitized console (`browser_console_messages`) and network (`browser_network_requests`) failures. (Chrome DevTools MCP is an optional secondary surface for CDP inspection of an already-running Chrome on `:9222`; it does NOT launch a browser and cannot simulate user interaction.)
|
|
538
|
-
5. **Browser-error feedback loop** — if Playwright MCP observation surfaces a page error, console exception, broken network request, hydration/render failure, or visible regression, return the work to RD/development with the exact evidence. Do not pass QA until the fixed build is retested in the browser.
|
|
539
|
-
6. **Security check** — run security review for the changed surface and dependency/config changes. Record findings, fixes, and unresolved risks.
|
|
540
|
-
7. **Performance check** — run the project’s available performance check, build-size check, Lighthouse-equivalent check, or browser performance inspection appropriate to the change. Record baseline/after numbers when available.
|
|
541
|
-
8. **Library version regressions** — when the slice's diff contains an `import` statement that matches a `breakingChanges[].api` entry in `schemas/library-breaking-changes.data.json` for the library's installed major (read from the RD-handoff's `## Library versions` section), record a `## Library version regressions` block in `qa/test-reports/<rid>.md` listing each hit. Per row: `<api>` → `<replacement>`, source `schemas/library-breaking-changes.data.json`. Treat each unreplaced hit as a **return-to-rd** reason — the LLM should fix the diff before re-handoff. (This is the QA-side counterpart of the RD `## Library version awareness` preflight; the two together form a check-and-verify pair.)
|
|
542
|
-
8. **Validation report** — write or link a report containing scope, environment, commands, sanitized browser evidence, security/performance results, pass/fail summary, residual risks, and next action.
|
|
543
|
-
9. **Acceptance coverage** — every PRD acceptance item has at least one linked QA test case (`peaks scan acceptance-coverage --rid <rid>`). **→ verified by Peaks-Cli Gate E**. This is the deterministic check that no requirement was forgotten between PRD and verdict.
|
|
544
|
-
10. **QA artifact lint** — the QA request artifact body has no unfilled placeholders (`peaks request lint <rid> --role qa`). **→ verified by Peaks-Cli Gate F**. Catches the "wrote the template, forgot to fill it" failure mode that template-style reports invite.
|
|
115
|
+
QA cannot pass a change until the report contains evidence for every applicable gate. The 11 gates (0 test-case generation, 1 test-report, 2 unit tests, 3 API validation, 4 frontend browser validation, 5 browser-error feedback loop, 6 security check, 7 performance check, 8 library version regressions, 9 validation report, 10 acceptance coverage, 11 QA artifact lint) are mapped to Peaks-Cli Gates A/A2/A3/A4/B/C/D/E/F.
|
|
545
116
|
|
|
546
117
|
If Playwright MCP is unavailable (not installed and the user has not authorized installation), mark the gate blocked with the missing capability. Screenshots, logs, manual steps, or other tools must not substitute for the mandatory frontend browser gate. Do not silently downgrade frontend validation to API-only testing.
|
|
547
118
|
|
|
548
119
|
## Local intermediate artifacts
|
|
549
120
|
|
|
550
|
-
QA reports, sanitized browser evidence, logs, matrices, and validation summaries should be written to `.peaks/_runtime/<sessionId>/qa/` by default, or to the Peaks-Cli CLI-provided local artifact workspace. Do not store login URLs, cookies, headers, tokens, storage state, browser traces, or screenshots/logs containing PII or SSO/MFA material. Do not default to git-backed storage or external artifact sync
|
|
121
|
+
QA reports, sanitized browser evidence, logs, matrices, and validation summaries should be written to `.peaks/_runtime/<sessionId>/qa/` by default, or to the Peaks-Cli CLI-provided local artifact workspace. Do not store login URLs, cookies, headers, tokens, storage state, browser traces, or screenshots/logs containing PII or SSO/MFA material. Do not default to git-backed storage or external artifact sync.
|
|
122
|
+
|
|
123
|
+
→ see `references/qa-local-artifacts.md`.
|
|
551
124
|
|
|
552
125
|
## Compact handoff
|
|
553
126
|
|
|
554
127
|
Before QA work stops, finishes, blocks, or hands off, emit a short resumable capsule: validation surface, coverage status, commands run, pass/fail summary, artifact paths, residual risks, blockers, and next action. Link to logs, coverage reports, regression matrices, browser evidence, and validation reports instead of pasting full outputs.
|
|
555
128
|
|
|
556
|
-
|
|
129
|
+
→ see `references/qa-compact-handoff.md`.
|
|
557
130
|
|
|
558
|
-
|
|
131
|
+
## Matt Pocock skills integration
|
|
559
132
|
|
|
560
|
-
|
|
561
|
-
- `triage` to classify failures, blockers, release risk, and retest priority.
|
|
562
|
-
- `grill-with-docs` to recheck PRD/RD evidence and acceptance criteria against source material.
|
|
133
|
+
When capability discovery exposes `mattpocock/skills`, use `tdd` / `triage` / `grill-with-docs` as QA references only. Inspect upstream content before applying; Peaks-Cli QA acceptance authority remains.
|
|
563
134
|
|
|
564
|
-
|
|
135
|
+
→ see `references/qa-matt-pocock-integration.md` for the full contract.
|
|
565
136
|
|
|
566
137
|
## Codegraph regression focus
|
|
567
138
|
|
|
568
|
-
QA may use `peaks codegraph affected --project <path> <changed-files...> --json` as regression-surface evidence
|
|
139
|
+
QA may use `peaks codegraph affected --project <path> <changed-files...> --json` as regression-surface evidence. External analysis cannot pass QA by itself — treat output as untrusted supporting evidence.
|
|
569
140
|
|
|
570
|
-
|
|
141
|
+
→ see `references/codegraph-regression-focus.md`.
|
|
571
142
|
|
|
572
143
|
## External capability guidance
|
|
573
144
|
|
|
574
|
-
Use `peaks capabilities --source access-repo --json` and
|
|
145
|
+
Use `peaks capabilities --source access-repo --json` and `--source mcp-server --json` before recommending browser or validation tooling. Playwright MCP is the required path for controlled headed browser and E2E validation. Chrome DevTools MCP is an optional secondary surface for CDP inspection only. Agent Browser can support browser walkthroughs, but never submit forms, purchase, delete, or mutate authenticated state without explicit confirmation.
|
|
575
146
|
|
|
576
|
-
|
|
577
|
-
- Chrome DevTools MCP is an optional secondary surface for CDP inspection (console, network, performance) of an already-running Chrome started with `--remote-debugging-port=9222`; it does NOT launch a browser on its own. The LLM invokes Chrome DevTools MCP tools directly when present in the tool list.
|
|
578
|
-
- Agent Browser can support browser walkthroughs, but never submit forms, purchase, delete, or mutate authenticated state without explicit confirmation.
|
|
579
|
-
- Canonical browser workflow (URL allow-list, login handoff, sanitization rules, tool mapping): `peaks-solo/references/browser-workflow.md`.
|
|
580
|
-
- If Playwright MCP is not installed and the user does not authorize installation, mark frontend browser validation blocked; screenshots, logs, manual steps, or other tools must not substitute for the mandatory headed browser gate.
|
|
147
|
+
→ see `references/external-capability-guidance.md` for the full inventory.
|
|
581
148
|
|
|
582
149
|
## OpenSpec validation gate
|
|
583
150
|
|
|
584
|
-
When the target repository has `openspec/`, QA must run validation on the change pack before passing or before archiving a shipped change.
|
|
585
|
-
|
|
586
|
-
- `peaks openspec validate <id> --project <repo> --json` — required gate. `data.valid === true` is mandatory. Record every error and warning in the validation report.
|
|
587
|
-
- `peaks openspec validate <id> --project <repo> --prefer-external --json` — preferred when the external `openspec` CLI is installed; falls back to internal lint with an explicit `openspec-cli-unavailable` warning when not.
|
|
588
|
-
- `peaks openspec archive <id> --project <repo> [--apply] --json` — optional terminator after QA accepts a shipped change.
|
|
151
|
+
When the target repository has `openspec/`, QA must run validation on the change pack before passing or before archiving a shipped change. `data.valid === true` is mandatory. `peaks openspec archive <id> [--apply]` is the optional terminator after QA accepts a shipped change.
|
|
589
152
|
|
|
590
|
-
|
|
153
|
+
→ see `references/openspec-validation-gate.md` for the full contract + `--prefer-external` fallback rules.
|
|
591
154
|
|
|
592
155
|
## Boundaries
|
|
593
156
|
|
|
594
|
-
Do not own product scope or implementation. Do not modify runtime configuration.
|
|
595
|
-
|
|
596
|
-
Reference: `references/regression-gates.md`.
|
|
157
|
+
Do not own product scope or implementation. Do not modify runtime configuration. Reference: `references/regression-gates.md`.
|
|
597
158
|
|
|
598
159
|
## Sub-agent context governance (G7 + G7.7 + G8 + G9 — slice #010)
|
|
599
160
|
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
161
|
+
QA sub-agents (qa / qa-business / qa-perf / qa-security) follow the same G7 metadata-only + G8.6 share protocol as RD. Detailed: `skills/peaks-solo/references/context-governance.md`.
|
|
162
|
+
|
|
163
|
+
→ see `references/qa-context-governance.md` for the full G7 / G8.6 / G9 protocol + QA sub-agent prompt template.
|
|
164
|
+
|
|
165
|
+
## References
|
|
166
|
+
|
|
167
|
+
Index of every `references/` file in this skill. Read on demand.
|
|
168
|
+
|
|
169
|
+
| File | Coverage |
|
|
170
|
+
|---|---|
|
|
171
|
+
| `references/artifact-contracts.md` | Sub-agent handoff artifact contracts. |
|
|
172
|
+
| `references/artifact-per-request.md` | QA 3-file per-request artifact contract. |
|
|
173
|
+
| `references/browser-validation-contracts.md` | Browser contracts (1) + (2) + AskUserQuestion. |
|
|
174
|
+
| `references/codegraph-regression-focus.md` | Codegraph regression-surface evidence. |
|
|
175
|
+
| `references/command-migration.md` | Legacy command migration map. |
|
|
176
|
+
| `references/external-capability-guidance.md` | Playwright / Chrome DevTools / Agent Browser. |
|
|
177
|
+
| `references/openspec-validation-gate.md` | OpenSpec validation + archive gate. |
|
|
178
|
+
| `references/qa-compact-handoff.md` | QA compact handoff capsule. |
|
|
179
|
+
| `references/qa-context-governance.md` | G7 + G8.6 + G9 QA sub-agent protocol. |
|
|
180
|
+
| `references/qa-fanout-contract.md` | QA 业务+性能+安全 concurrent fan-out. |
|
|
181
|
+
| `references/qa-gstack-integration.md` | GStack → Peaks QA mapping. |
|
|
182
|
+
| `references/qa-local-artifacts.md` | `.peaks/_runtime/<sessionId>/qa/` storage. |
|
|
183
|
+
| `references/qa-matt-pocock-integration.md` | Matt Pocock skills as references. |
|
|
184
|
+
| `references/qa-refactor-role.md` | QA refactor role. |
|
|
185
|
+
| `references/qa-runbook.md` | Default 10-step QA runbook. |
|
|
186
|
+
| `references/qa-skill-presence.md` | QA skill presence (main loop only). |
|
|
187
|
+
| `references/qa-standards-preflight.md` | Standards preflight dry-run contract. |
|
|
188
|
+
| `references/qa-sub-agent-dispatch.md` | Sub-agent suspended sections + contract. |
|
|
189
|
+
| `references/qa-transition-gates.md` | Per-gate A-A4-B-C-D-E-F contract. |
|
|
190
|
+
| `references/regression-gates.md` | Regression gates (preserved). |
|
|
191
|
+
| `references/requirement-boundary-recheck.md` | 5-step requirement boundary recheck. |
|
|
192
|
+
| `references/test-case-generation.md` | Test case categories + format + acceptance linkage. |
|
|
193
|
+
| `references/test-report-output.md` | Test report minimum 8 sections. |
|