Repository navigation
The dogfood release gate is unrunnable for every sibling repo whenever aprender is not on main #2701
Description
Found while running pmat's 3.32.0 pre-release protocol. This is the revisit trigger the shim itself names, and it has now fired.
Reproduction, today
$ cd /home/noah/src/aprender && git rev-parse --abbrev-ref HEAD
fix/benchmark-matrix-determinism
$ ls scripts/dogfood.sh
ls: cannot access 'scripts/dogfood.sh': No such file or directory
$ git cat-file -e origin/main:scripts/dogfood.sh && echo present-on-main
present-on-main # 1,419 lines
$ bash ~/.claude/skills/dogfood/dogfood.sh
dogfood: the canonical runner is not reachable.
looked for: /home/noah/src/aprender/scripts/dogfood.sh
exit 2
The file is not deleted. It is on main, and the checkout is on a feature branch. A release gate for the entire fleet is therefore a function of which branch an unrelated repository happens to have checked out.
Why this is the trigger, not a new problem
~/.claude/skills/dogfood/dogfood.sh says so itself, verbatim:
REVISIT TRIGGER — the one signal that this arrangement has outgrown itself: the first time dogfood is invoked on a crate whose OWN repo is checked out but
aprenderis NOT. That means the protocol is being asked to serve the fleet from a repo that is not present, and the correct answer is to move it into shared infra — not to copy the runner back here.
That condition is now met — with a nuance worth recording, because it is worse than the one anticipated: aprender is checked out. It is simply on the wrong branch. The trigger as written checks for an absent repository; the failure mode that actually occurs is an absent file in a present repository, which is far easier to hit and gives no signal that anything is wrong until a release is blocked.
History says this recurs
aprender#2640 removed a second divergent copy of this runner (nine silent divergences, every hunk a real hardening, neither copy safe to delete). The fix chosen there was this shim. That got the diagnosis right — one canon, not two — and the cure wrong: the target is a path in another repository's working tree.
It has already cost a real release once. Measured 2026-08-23, mid-release: aprender sat on fix/wgpu-feature-surface-contract, scripts/dogfood.sh was absent, and pmat's release gate exited 2. Three edits to shared directories were silently lost the same day for the same underlying reason.
pmat's response was to vendor the protocol into its own repo (scripts/dogfood/, files prefixed pmat- so symlinks into a shared skills dir cannot collide). That works, and it means pmat is not blocked — but it is one crate solving it for itself. Every other repo reaching for this skill today gets a release gate that cannot run, and a release protocol that cannot run is indistinguishable from no release protocol.
Ask
Move the runner somewhere its availability does not depend on a working tree — shared infra, an installed artifact, or a per-repo vendored copy on pmat's model. Explicitly not a second copy under ~/.claude/skills/: not in git, not PR-reviewed, not CI-reachable, not diffable, which is what produced #2361 and #2640.
Whatever is chosen, two properties are worth making non-negotiable, because both were absent here:
- Resolution must not depend on any repository's checked-out branch. Reading from
git show main:scripts/dogfood.shwould already be strictly better than reading the working tree, if the shim stays. - The shim's own guard must detect the failure that actually happens. It checks "is aprender present"; it needs to check "is the runner reachable", which is the weaker and correct precondition.
Filed from pmat's 3.32.0 pre-release, where this was hit and worked around rather than fixed.
Activity
noahgift commentedon Sep 24, 2026
Milestone 0.70.0 → 0.70.1 (gate triage). 0.70.0 now holds only the operator's release gate: "FULL ontology spec and all aprender binary working" + "0.70 to crates.io" (ONT-001, every [[bin]] build+smoke, the publish cascade), plus P0s and operator-ruled rows. This issue isn't needed for any of those. Evidence: evidence/m070-gate-triage-1835.md. If that's wrong, move it back to 0.70.0 and say which gate it serves.
noahgift commentedon Sep 25, 2026
Fix pushed on
fix/2701-dogfood-canon-ref@1b6cc1c23.scripts/dogfood.shat a pinned git ref (DOGFOOD_CANON_REF, defaultorigin/main) instead of the aprender checkout's working tree. That commit'sscripts/is extracted once per SHA into~/.cache/dogfood-canon/, and the shim prints the SHA it ran.DOGFOOD_CANON_REF=worktreestill runs the working tree, for editing the runner. The shim still fails closed and names the revisit trigger.check_dogfood_shim.shgains behavioural row 3e (a fixture checkout whose branch lacks the runner while main has it) and self-test row 10 (the old working-tree shim is rejected by 3e alone).cp scripts/.dogfood-shim-reference.sh ~/.claude/skills/dogfood/dogfood.sh.noahgift commentedon Sep 25, 2026
The fix is on
stage/0.70.1as 2289808. This stays open on the 0.70.1 milestone and closes when 0.70.1 releases. (aprender-d1, on the cop's triage row)noahgift commentedon Oct 14, 2026
P0 to P1 (2026-10-14 P0 triage): P0 now means it blocks the next release or carries the operator's own words on it; this issue does neither, so it stays on the 0.71.0 milestone at P1.
noahgift commentedon Oct 14, 2026
Folded into #2582 as a checklist row (TRIAGE-100, 2026-10-14): the open-ticket cap is 100, so this ticket is now tracked on that master and closed as not planned. Nothing is lost: reopen it when its work resumes, and an open PR for it reopens it. Pushed branch:
fix/2701-dogfood-canon-ref,fix/2701-dogfood-canon-ref-port.Agent: aprender-clerk