What this is
Two findings from the review of PR #461, left out of it on purpose: neither is a defect that PR introduced, both are decisions rather than typos, and one of them asks /qa to do something it has never done.
They are filed together because they compound, and the compound is worse than either.
1. /qa writes its durable block and nothing commits it
uat-prep writes <artifacts_dir>/<slug>/qa-checks.md — the block naming every check that came back unresolved and whether an install ran. #430's criterion 10 requires that block to be durable, in those words:
the block is durable — it lands in a file under <artifacts_dir>/<slug>/, the repo-relative Session dir, and a block that exists only in a node's console output does not satisfy this criterion.
The letter is met. The purpose is not. Nothing in unic-dlc-qa.yaml ever commits that file: grep -c 'git add\|git commit\|git push' returns 0 for that Box and 8 for unic-dlc-build.yaml. The file is written into an Archon worktree, and the worktree is removed by archon complete or by /cleanup. The block dies with it.
/build does not have this problem for the same reason it never came up: open-pr stages SESSION/report.md onto the PR branch. /qa has no open-pr and no report node — that absence is exactly why criterion 10's amendment gave uat-prep the Write tool in the first place.
Why this was not fixed in #461: giving /qa a commit is new behaviour, not a correction. It puts a QA record on the feature branch and into the merge, which is a product decision about what a merged branch should carry. The criterion's author specified uat-prep writing the file, and #461 did exactly that.
2. /qa declares no evidence_policy, so a run that merges nothing still reports success
unic-dlc-build.yaml declares evidence_policy: { required: true }. /qa, /pr-review and /explore declare none — grep -c evidence_policy returns 4, 0, 0, 0 across the four Boxes. That is ADR-0034's explicit scope: "No other Box gains an evidence gate in this ADR."
Since #461, /qa's merge node is gated on $test.output.result == 'pass'. So with an unresolved test:
merge's when: is false, so merge is skipped.
merge is the last of the Box's ten nodes.
- A skipped node is terminal, and no node reports on it.
- The run reaches completed.
A /qa run therefore finishes green having merged nothing, and its exit status says so to nobody.
The compound, which is the actual reason to file this
Set gates.qa: afk, which is the mode /qa is built to support, and run it against a project whose config declares no test:
uat-gate and merge-gate are skipped — both are when: gate == 'hitl'.
uat-prep still runs and writes qa-checks.md, which explains exactly what went wrong.
merge is skipped on the floor.
- The run reports completed.
archon complete removes the worktree, and qa-checks.md goes with it.
No human is at any gate, nothing is merged, no explanation survives, and the run's status is success. Finding 1 destroys the evidence and finding 2 removes the signal; either one alone leaves a way to notice.
This is the same shape #430 was opened about — a result that reads green while nothing was checked — arriving through the Box that merges rather than the Box that builds.
What would settle each
Not proposed as decided. Both need grilling, and the second may be a two-line change or may be out of scope entirely.
- For 1: either
/qa commits qa-checks.md (and then: onto which branch, at which node, and does it belong in the merge?), or the block goes somewhere already durable, or criterion 10's durability requirement is honestly narrowed to the two Boxes that can satisfy it. The third is a real option and should not be dismissed for looking like a retreat.
- For 2: either
/qa gains an evidence_policy of its own, which reopens what ADR-0034 deliberately closed, or merge stops being silent when its when: blocks — a node after it that reports the non-merge would cost less and change no engine behaviour.
Out of scope
- Anything about
/build's evidence gate. It works, and ADR-0034 §4 already records the one cost it accepts (a red build still opens a PR).
/pr-review and /explore having no evidence_policy. Neither merges nor certifies anything, so neither has a silent-success failure of this shape.
What this is
Two findings from the review of PR #461, left out of it on purpose: neither is a defect that PR introduced, both are decisions rather than typos, and one of them asks
/qato do something it has never done.They are filed together because they compound, and the compound is worse than either.
1.
/qawrites its durable block and nothing commits ituat-prepwrites<artifacts_dir>/<slug>/qa-checks.md— the block naming every check that came backunresolvedand whether an install ran. #430's criterion 10 requires that block to be durable, in those words:The letter is met. The purpose is not. Nothing in
unic-dlc-qa.yamlever commits that file:grep -c 'git add\|git commit\|git push'returns 0 for that Box and 8 forunic-dlc-build.yaml. The file is written into an Archon worktree, and the worktree is removed byarchon completeor by/cleanup. The block dies with it./builddoes not have this problem for the same reason it never came up:open-prstagesSESSION/report.mdonto the PR branch./qahas noopen-prand no report node — that absence is exactly why criterion 10's amendment gaveuat-preptheWritetool in the first place.Why this was not fixed in #461: giving
/qaa commit is new behaviour, not a correction. It puts a QA record on the feature branch and into the merge, which is a product decision about what a merged branch should carry. The criterion's author specifieduat-prepwriting the file, and #461 did exactly that.2.
/qadeclares noevidence_policy, so a run that merges nothing still reports successunic-dlc-build.yamldeclaresevidence_policy: { required: true }./qa,/pr-reviewand/exploredeclare none —grep -c evidence_policyreturns 4, 0, 0, 0 across the four Boxes. That is ADR-0034's explicit scope: "No other Box gains an evidence gate in this ADR."Since #461,
/qa'smergenode is gated on$test.output.result == 'pass'. So with an unresolved test:merge'swhen:is false, somergeis skipped.mergeis the last of the Box's ten nodes.A
/qarun therefore finishes green having merged nothing, and its exit status says so to nobody.The compound, which is the actual reason to file this
Set
gates.qa: afk, which is the mode/qais built to support, and run it against a project whose config declares notest:uat-gateandmerge-gateare skipped — both arewhen: gate == 'hitl'.uat-prepstill runs and writesqa-checks.md, which explains exactly what went wrong.mergeis skipped on the floor.archon completeremoves the worktree, andqa-checks.mdgoes with it.No human is at any gate, nothing is merged, no explanation survives, and the run's status is success. Finding 1 destroys the evidence and finding 2 removes the signal; either one alone leaves a way to notice.
This is the same shape #430 was opened about — a result that reads green while nothing was checked — arriving through the Box that merges rather than the Box that builds.
What would settle each
Not proposed as decided. Both need grilling, and the second may be a two-line change or may be out of scope entirely.
/qacommitsqa-checks.md(and then: onto which branch, at which node, and does it belong in the merge?), or the block goes somewhere already durable, or criterion 10's durability requirement is honestly narrowed to the two Boxes that can satisfy it. The third is a real option and should not be dismissed for looking like a retreat./qagains anevidence_policyof its own, which reopens what ADR-0034 deliberately closed, ormergestops being silent when itswhen:blocks — a node after it that reports the non-merge would cost less and change no engine behaviour.Out of scope
/build's evidence gate. It works, and ADR-0034 §4 already records the one cost it accepts (a red build still opens a PR)./pr-reviewand/explorehaving noevidence_policy. Neither merges nor certifies anything, so neither has a silent-success failure of this shape.