Planning bug: a card told a second repository to MIRROR a mechanism the first repository retired nineteen hours later — "mirror X" is a claim about another repo's current shape, and nothing re-checks it
Found while running MOTIR-4112 under motir run MOTIR-3877, 2026-09-02. The correction is already applied — the lane shipped without the retired half, and the card is amended on the record. This is the telemetry.
What happened, with the clock
| moment | event |
|---|---|
2026-09-01T19:40:19Z | MOTIR-4112 authored. It asks for "an acceptance-video workflow mirroring motir-core's .github/workflows/acceptance-video.yml and its .github/actions/upload-acceptance-video composite, publishing through POST /api/work-items/{id}/acceptance-evidence with an upload token", and lists both by path under Context refs. |
2026-09-02T14:20:55Z | motir-core bb56e595a (#2517, MOTIR-4096) DELETES both, plus scripts/upload-acceptance-video.mjs, the job's id-token: write grant and its MOTIR_UPLOAD_TOKEN reference. |
2026-09-02T16:0x | The run reaches the card, ls finds neither file, and git log --diff-filter=D dates the deletion. |
Nineteen hours between the card and the deletion; two hours between the deletion and the run.
Why building it anyway would have been worse than a wasted hour
docs/decisions/acceptance-video.md's amendment of 2026-09-02 does not merely relocate the uploader. It decides "CI NO LONGER UPLOADS THE RECORDING. THE AGENT PUBLISHES IT, over the Motir MCP surface", and retires the credential with the mechanism, on the stated ground that "a credential with no consumer is one nobody thinks about when deciding whether to rotate it."
So a faithful execution of the card would have created a MOTIR_UPLOAD_TOKEN in a second repository the day after it was deleted from the first — a live credential, in a repository whose CI deploys the public website, existing only to feed a mechanism the product had just decided against. And it would have read as diligence: the card asked for it by path.
The same amendment names the precedent that settles it: nextjs-prisma-vercel-starter carries its own copy of the lane and the Action, and MOTIR-4097 follows there — the disposition for a repository that would carry the copy is RETIRE, not mirror.
The takeaway, which is not "the card was stale"
Staleness is the symptom. The defect is a class of instruction that is a claim about another repository's CURRENT shape, and that nothing re-checks:
"mirror X" · "the same shape as Y" · "copy the pattern in Z" · "as
<repo>does it"
A card citing a FILE in its own repository is checked by the compiler, the test suite and the reviewer's diff. A card citing a file in ANOTHER repository is checked by nobody: the referenced repository moves on its own schedule, no guard spans the pair, and the advisory channel cannot see across a repository boundary either — validate_work_item returned no advisory at all for MOTIR-4112, because subsumption keys on a merged pull request touching this card's paths, and the pull request that falsified this card touched paths in a different repository.
And the cost is asymmetric. A stale reference to something that still EXISTS is caught the moment it is opened. A reference to something that has been DELETED is caught immediately too — an ls fails. The dangerous middle case is the one here: the artefact is gone and a reasonable agent could rebuild it from the description, so the card is executable and wrong.
Acceptance criteria
motir-meta'splan-rules/carries the corollary, placed with the existing cross-repository rules rather than as a new pack: an instruction to MIRROR, COPY or FOLLOW a named artefact in another repository is a claim about that repository's current shape — the running agent verifies the artefact still exists AND that no decision record has superseded it, before building to it; when it has gone, the disposition is the deciding record's, not a rebuild.- The rule names the cheap check that would have caught it:
git log --diff-filter=D -- <the named path>in the cited repository, and a read of the decision record the card also cites. - It records why no automated channel covers this: the prior-art advisory keys on merged pull requests touching THIS card's paths, so it is structurally blind across a repository boundary.
- This card is cited as the fixture.
Context refs
motir-corebb56e595a— the deletion, anddocs/decisions/acceptance-video.md's amendment of 2026-09-02 that decides itmotir-marketing/playwright.config.ts— where the corrected disposition is written down, on branchparent/MOTIR-3877-public-project-pagesmotir-meta/prompts/run.md— thedonedesign blocker that merged AFTER the card rule, which is this shape one repository narrower and is where the corollary belongs besidemotir-meta/prompts/plan-rules/core.md— the cross-repository gates