QA fix loop: stop patching after a second same-class re-validation finding #40
Labels
No labels
component:adapters
component:lifecycle
component:qa
component:setup
component:shared
component:worktrees
phase/accepted
phase/backlog
phase/deployed
phase/developing
phase/integrating
phase/planning
phase/qa
phase/requirements
phase/uat
priority:critical
priority:critical
priority:high
priority:high
priority:low
priority:low
priority:medium
priority:medium
type:bug
type:chore
type:docs
type:feature
type:infra
type:tech-debt
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
jbr870/devwork-skills#40
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Rank 3 of 13 in #37 · est. saving ~45m
Evidence
QA on #230 spent 2h 21m on a single defect class — the release-notes markdown parser
mishandling continuation lines — across four fix rounds, and still did not converge:
1)slippedEach round cost a red-test write, a fixer agent, an assertion-constraint check, four gates and a
fresh-context re-validation. The orchestrator itself named the pattern at round 3: it had accepted
a fix that traded correctness elsewhere, and said so.
What happens now
fix-workflow.mdhas no stopping rule. Each re-validation finding is treated as a new finding andenters a new round, so a mis-scoped rule can be patched indefinitely.
Proposed change
Add a convergence rule: when a second re-validation finds a defect of the same class as the one
just fixed, the loop stops patching. The next round must either be explicitly aimed at the root
(stated as a class, with the red tests written against the class rather than the reported cases),
or the class is filed as an issue and the run advances with the known residue recorded.
Acceptance
fix-workflow.mddefines "same class" and the two permitted exits./meta-amend outcome — amended
Commit
6aeae6bonmain.Verified at HEAD (
7f75154)The finding held.
fix-workflow.mdStep 2 built the fix plan from the current report and prior-round decisions (escalationretry-with-guidance,fix-nowpromotions) but never compared this round's findings against what the previous round fixed. Step 3 carried "Fix the family, not just the instance" — a within-round rule about sibling occurrences, not a cross-round convergence rule — andqa-playbook.md§3's stopping guidance was entirely §7's exit invariant, which stops the loop when it is done and says nothing about a loop that is stuck.The amendment
New subsection in
fix-workflow.md§2, The convergence rule — a second same-class finding stops the patching:defer-to-issuethrough the normal settling path, and record the residue as a Finding on the round's Phase Outcome. The already-written regression tests stay red-marked against the class.Same-class: [class, Nth recurrence — which exit]line and the summary gains**Class aimed at:**.qa-playbook.md§3 references it rather than restating it: "§7 stops the loop when it is done; the convergence rule stops it when it is stuck."Gate
scripts/lint-conventions.sh— clean.Desk-check against the originating scenario (verity #230, the release-notes continuation-line parser)
Replaying the four recorded rounds against the amended text:
1)slipped throughAll three acceptance criteria are met: the definition and the two exits are in
fix-workflow.md; a third same-class round requires the class named in the brief (and reported); the deferred residue lands as a Finding on the Phase Outcome.What validates it next
The next QA run whose re-validation returns a same-class finding twice. Two things to watch: whether "same class" is legible enough to be applied without hindsight (the risk is under-calling it, since differing symptoms are persuasive in the moment), and whether Exit A's "include the cases earlier rounds got right" actually gets written into the red tests — that clause is the one carrying the round-3 regression guard.