/develop: validate against the real committed content, not only fixtures #48
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#48
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 12 of 13 in #37 · caught a blocking defect that every gate had passed
Evidence
/developon #230 finished with all gates green: typecheck 0, lint 0, build 0, 4,187 tests passing,469 browser tests passing, plus explicit probe runs. Every test used fixtures.
Forty minutes into QA, the orchestrator parsed the real shipping content —
release-notes/v0.1.0.mdandv0.2.0.md— and found the feature's first blocking defect: themarkdown parser broke wrapped bullets into stray paragraphs. Its note: "this is exactly the failure
mode the playbook's §6 fixture rule exists to catch."
That defect went on to cost 2h 21m and four fix rounds (#40), and would have shipped a
release-notes page that rendered the project's own release notes wrong.
The same lesson recurred at
/promote: writingv0.2.1.mdthe model parser-verified the new filebefore committing it, precisely because of this history — and separately discovered that a QA-added
test asserted "exactly the two committed entries", which the new file broke.
What happens now
test-workflow.mdand the domain briefs are fixture-based by design, which is right fordeterminism. Nothing requires a single pass over the real artifact the feature will actually serve.
Proposed change
Where a feature reads or renders content committed in the repository, require one validation
case that exercises the real content set, not a fixture — and require it in
/develop'scross-unit verification rather than only in QA. Fixtures stay the unit-level default; the real
content is a smoke check on the artifact that ships.
Related: watchlist RC-W9 ("baseline the suite before speccing") is the adjacent idea at the other
end of the phase.
Acceptance
/developcross-unit verification runs it before posting a terminal outcome./meta-amend outcome — amended
Commit
2e0e43eonmain.Verified at HEAD (
8440c90)The gap held. Nothing in
/dev:developrequired a pass over real content, and the nearest existing rule did not cover this case:qa-playbook.md§6's "Synthetic fixtures at an external boundary" reasons from "the repo holds the schema, not the rows" — the seeded-datastore case, where the fixture is a guess because the real data lives elsewhere. Content committed in the tree is the inverse: the real set is right there, which makes a fixture a worse excuse, not the same one. And §6 is a QA-time audit, one phase after the point where the defect was cheap.The amendment
develop/SKILL.md3.7 step 1b — Real-content smoke check, placed after the wide-tier suite run and before the terminal Phase Outcome (AC2). Lettered1bdeliberately: the file already uses2b/2c, and renumbering would have broken the3.7 step 2reference at SKILL.md:49./promotewhen v0.2.1.md landed. Both halves of the issue's evidence are now covered by the rule, not just the first.qa-playbook.md§6 gains the inverse-fixture bullet, pointing at 1b rather than restating it, and telling the audit two things it would otherwise get wrong: pick up the pass when 1b is absent or a Finding says it couldn't run, and do not flag a declared real-content test as brittle coupling.Gate
scripts/lint-conventions.sh— clean.Desk-check against the originating scenario (verity #230)
The feature rendered a release-notes page from
release-notes/v0.1.0.mdandv0.2.0.md— content committed in the repo, so the trigger fires unambiguously. Step 1b runs the parser over both files and inspects the output; wrapped bullets breaking into stray paragraphs is "visibly wrong structure", so the step fails and the fix teammate is spawned inside/dev:develop, before the terminal Phase Outcome — roughly forty minutes and one phase earlier than where QA actually caught it, and in the phase that already owns a fix-teammate path.The second incident checks out too: the QA-added test asserting "exactly the two committed entries" is precisely what the properties-over-snapshot clause forbids, and it is the one that broke at
/promoteon the next release file.Worth stating plainly: this does not claim the four fix rounds (#40) disappear. The parser bug still has to be fixed and is still a hard one. What moves is when it is found — inside the phase that can cheaply fix it, rather than forty minutes into QA against a suite that had already declared itself green.
What validates it next
The next feature that consumes committed content. Two things to watch: whether the trigger is recognised at all (it is a self-assessment, and "we have fixtures for that" is the tempting wrong answer), and whether the declared-coupling comment actually gets written — AC3's value is entirely in surviving the next reader, which no run in this repo will demonstrate for months.