Commit 38ee671
authored
feat(qa): W29 guards — per-PR self-QA block, config-presence≠functional, read-findings (#33)
Three QA guards distilled from a week of Round-1 reviews where the same
failure modes recurred. All lessons are generalised — no environment-,
customer-, or ticket-specific detail.
## Q1 — Self-QA / self-resolve is a per-PR hard blocker
The `implementer ≠ reviewer` guard must hold for **each resolved
PR/change**, not once at the ticket level. When a ticket bundles several
PRs, a reviewer can legitimately QA the PRs they did not author while
still owing a second pair of eyes on their own. A PR resolved, approved,
or QA-closed by its own author is a blocking `(x)` that invalidates the
QA for that change — "only a quick one" and "already deployed, just
closing it out" are not exemptions. Self-*resolving* on the internal
path is the same violation as self-passing to QA2.
- `SKILL.md` "When it applies" — terse per-PR pointer to §E (kept under
the 500-word cap).
- `references/edge-cases.md` §E — new "per resolved PR/change, not per
ticket" paragraph; terminal-verdict block now covers the internal
Resolve path, not just QA2.
- `references/anti-patterns.md` #17 — per-PR clause + self-resolve =
blocking `(x)`.
Coordination: **PR #32** (`fix/self-review-team-queue-31`) tackles the
*detection* side of the same theme — inferring self-review from
authorship rather than the assignee on an unassigned team queue. This PR
is complementary (the *per-PR granularity* + self-resolve-as-blocker
angle) and touches the same §E / #17 regions, so the two should be
rebased together at merge time.
## Q2 — Config presence ≠ functionally proven
A set or grepped config flag, a present setting, or a green healthcheck
proves the setting *exists*, not that the feature *works*. Exercise the
feature end-to-end (fire the webhook with a real payload, render and
screenshot the output, confirm the role/flag actually takes effect) and
attach that evidence to the ticket. A shadowed or overridden config that
still "reports healthy" is its own trap — verify the *effective* running
configuration, not the health endpoint.
- `references/checklist.md` Pillar R — new **R7** (functional proof, not
config presence); severity note extended so R7 is `(x)` for a
behavioural change.
- `references/anti-patterns.md` #21 — mirror.
## Q3 — Two smaller anti-patterns
- **#22 QA findings treated as noise to clear** — a verdict with open
`(!)` / `(?)` items is not "passed". Findings are to be worked, not
clicked away; when four of five checks pass, the fifth is the point.
- **#23 Proposing a fix without checking the current state first** —
verify what already exists (a certificate, a router, a config block may
already be in place) before recommending an addition.
## Notes
- Anti-patterns appended as #21–#23 to keep the existing 1..20 citation
numbers stable (the catalog is cited by number; MD029 is intentionally
disabled for it).
- Lint: markdownlint-cli2, validate-skill (word cap), version-parity,
and the rest of the pre-commit set all pass.
- `CHANGELOG.md` Unreleased updated; no version bump (parity preserved).
Draft — not for merge; opened for review and coordination with #32.5 files changed
Lines changed: 22 additions & 3 deletions
File tree
- skills/peer-qa-review
- references
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
21 | 21 | | |
22 | 22 | | |
23 | 23 | | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
24 | 29 | | |
25 | 30 | | |
26 | 31 | | |
| |||
30 | 35 | | |
31 | 36 | | |
32 | 37 | | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
33 | 46 | | |
34 | 47 | | |
35 | 48 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
21 | 21 | | |
22 | 22 | | |
23 | 23 | | |
24 | | - | |
| 24 | + | |
25 | 25 | | |
26 | 26 | | |
27 | 27 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
29 | 29 | | |
30 | 30 | | |
31 | 31 | | |
32 | | - | |
| 32 | + | |
33 | 33 | | |
34 | 34 | | |
35 | 35 | | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
47 | 47 | | |
48 | 48 | | |
49 | 49 | | |
| 50 | + | |
50 | 51 | | |
51 | | - | |
| 52 | + | |
52 | 53 | | |
53 | 54 | | |
54 | 55 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
59 | 59 | | |
60 | 60 | | |
61 | 61 | | |
| 62 | + | |
| 63 | + | |
62 | 64 | | |
63 | 65 | | |
64 | 66 | | |
| |||
0 commit comments