backlog-burndown states its central rule as "Group so that no file is claimed by two live groups at once. This is the rule the skill exists for, and it binds harder than any throughput target."
In this repository that rule is unsatisfiable for any round carrying two canonical-content groups, and the skill never names the file that makes it so.
drive-pr step 2 requires every worker to run local-strict-review, and that skill's carried-content pass records before the commit "because that ledger is tracked". canonical_review.py record writes two tracked files: reports/canonical-review.json and a full regeneration of reports/canonical-review.md. So every worker whose group edits a carried canonical unit necessarily writes both. Carried canonical content is the hub's dominant issue class, and backlog-burndown's own "Choosing the Worker's Model Tier" contemplates such groups in the plural. Two live groups, one file.
The concrete failure is in the .md rather than the .json. write_ledger sorts the ledger per unit precisely "so a concurrent branch touching a different unit merges cleanly", and it does. The burn-down report carries global counts. Two branches each recording one new pass both rewrite the same - covered: N line to the same N+1, which git merges silently as an identical change on both sides, and each deletes a different bullet from the per-file "never" lists, which also merges cleanly. Develop then holds a report whose counts are lower than the ledger's, and .github/actions/validate/action.yml runs canonical_review.py report --check on every pull request, so the next unrelated pull request fails validate with no branch to blame.
The skill's own detection does not reach it. "Predict each group's file set by reading the issues" cannot predict a file no issue names, and "Verify the prediction before dispatching" runs at the round's step 3, before any worker has pushed a pull request whose gh pr diff --name-only would show the ledger.
Possible shapes, all design calls rather than wording ones:
- Name the ledger files as an implicit claim every canonical-content group holds, and cap such groups at one per round. Simple, and it costs most of the parallelism on the repository's dominant issue class.
- Have the orchestrator record every canonical pass itself at the round's cleanup step, so no worker writes the ledger. This crosses the "the orchestrator edits nothing" line, and the digest binding means the orchestrator would be recording a read it did not perform.
- Make
report --check tolerant, or make the .md derive its counts at check time rather than storing them, so a stale count is regenerated rather than failed on. This fixes the merge collision at its source and leaves the claim rule honest.
Found by a local-strict-review diff pass on the pull request that added this skill. It is distinct from #1275, which covers --prune, the hardcoded origin/develop three-dot base, the missing branch-to-claim traversal, and the "closing keyword is deliberately absent" falsehood.
backlog-burndownstates its central rule as "Group so that no file is claimed by two live groups at once. This is the rule the skill exists for, and it binds harder than any throughput target."In this repository that rule is unsatisfiable for any round carrying two canonical-content groups, and the skill never names the file that makes it so.
drive-prstep 2 requires every worker to runlocal-strict-review, and that skill's carried-content pass records before the commit "because that ledger is tracked".canonical_review.py recordwrites two tracked files:reports/canonical-review.jsonand a full regeneration ofreports/canonical-review.md. So every worker whose group edits a carried canonical unit necessarily writes both. Carried canonical content is the hub's dominant issue class, andbacklog-burndown's own "Choosing the Worker's Model Tier" contemplates such groups in the plural. Two live groups, one file.The concrete failure is in the
.mdrather than the.json.write_ledgersorts the ledger per unit precisely "so a concurrent branch touching a different unit merges cleanly", and it does. The burn-down report carries global counts. Two branches each recording one new pass both rewrite the same- covered: Nline to the sameN+1, which git merges silently as an identical change on both sides, and each deletes a different bullet from the per-file "never" lists, which also merges cleanly. Develop then holds a report whose counts are lower than the ledger's, and.github/actions/validate/action.ymlrunscanonical_review.py report --checkon every pull request, so the next unrelated pull request fails validate with no branch to blame.The skill's own detection does not reach it. "Predict each group's file set by reading the issues" cannot predict a file no issue names, and "Verify the prediction before dispatching" runs at the round's step 3, before any worker has pushed a pull request whose
gh pr diff --name-onlywould show the ledger.Possible shapes, all design calls rather than wording ones:
report --checktolerant, or make the.mdderive its counts at check time rather than storing them, so a stale count is regenerated rather than failed on. This fixes the merge collision at its source and leaves the claim rule honest.Found by a local-strict-review diff pass on the pull request that added this skill. It is distinct from #1275, which covers
--prune, the hardcodedorigin/developthree-dot base, the missing branch-to-claim traversal, and the "closing keyword is deliberately absent" falsehood.