Planning bug: an `## Advisory dispositions` section discharged gate 4 by naming the BRANCH the substrate sits on — "committed on parent/… " read as "shipped", and the card sealed ready against a 404
Logged by motir run MOTIR-4139 (2026-09-02), guard #4. The correction is already applied to the tenant; this is the RECORD. It holds nothing up.
The defect
MOTIR-4139 sealed ready: true, valid: true, openBlockers: [] with a thorough ## Advisory dispositions section whose first bullet read:
No
blocked_byis owed. Both halves it composes are shipped:motir-core's manifest and route are committed onparent/MOTIR-3909-legal-manifest, andmotir-marketing's comparison is on that repository's parent branch. This card needs them to EXIST, which they do; it does not consume anything either is still producing.
Every clause of that is literally true and the conclusion is false. The card's criterion 2 does not need the manifest to exist — it needs motir-core to be serving it, because AMENDMENT 2 §E deliberately chose a served artifact as the transport. Measured at dispatch:
| claim | command | result |
|---|---|---|
| the manifest is served | curl -s -o /dev/null -w '%{http_code}' https://app.motir.co/api/legal/egress-manifest | 404 |
the manifest is on motir-core main | git ls-tree origin/main lib/legal/egress-manifest.json app/api/legal/egress-manifest/route.ts | wc -l | 0 |
AMENDMENT 2 §E is on motir-core main | git show origin/main:docs/decisions/public-surface-hosts.md | grep -c 'AMENDMENT 2' | 0 |
| the producing PR has merged | gh pr view 2513 --json state,mergedAt | OPEN, mergedAt: null |
A second, independent defect on the same card: it was pinned targetRepo: motir-marketing while criterion 1 records the mechanism in docs/decisions/public-surface-hosts.md — a document that exists only in motir-core. motir-marketing's origin/main has no docs/decisions/ directory at all (git ls-tree -r origin/main --name-only docs/decisions | wc -l → 0). The straddle detector could not see it: likely-repo-straddle matches a repo-qualified PATH in a criterion, and the criterion names a bare filename.
Fix applied (already in the tenant)
link_work_items— MOTIR-4139blocked_byMOTIR-3909, the sibling container under epic MOTIR-3875 that ownsmotir-core's half. Container edge, not a leaf edge to MOTIR-4008: gate 7 forbids a cross-parentblocked_by, andreadiness.blockedByAncestormakes the container edge sufficient.transition_statusMOTIR-4139 → Blocked.update_work_item— the false disposition struck on the record (kept, not deleted) with the evidence table beside it, and criteria tagged per repository.update_work_item—targetRepos: ['motir-marketing', 'motir-core']. Abugcarries a repository SET (onlykind: subtaskis bound by ONE REPO = ONE PR), so this is one card with two pull requests, not a split into siblings.add_commenton MOTIR-4139 recording the halt.
No worktree was created and no code was written.
What would have prevented it
Gate 4 (an AC that names a not-done card is a missing blocked_by until proven otherwise) and run.md guard #4 both exist and both fired correctly at DISPATCH — the run-time half worked exactly as written, including read the card's own advisory dispositions as a reason to look HARDER. What has no rule is the AUTHORING half: what counts as "proven otherwise".
The tell is grep-able and it is in the words an author actually types when discharging gate 4:
"committed on
<branch>" · "on that repository's parent branch" · "lands in PR #N" · "already written, awaiting merge" · "it needs them to EXIST, which they do"
Each of these is a citation of a branch offered as evidence that a dependency is satisfied, and none of them is one. The discharge a merged trunk supports is git ls-tree origin/main; the discharge a served artifact requires is a fetch. Distrust the thorough disposition specifically — a card that never mentions its advisories reads careless, and one that quotes, agrees and reasons them away reads considered, so the false discharge arrives with the better paper trail.
Open question this record should settle, per the promote-vs-lesson test — default is LESSON: is a one-line clause owed under gate 4 (a disposition citing a BRANCH, a PR number, or "exists" discharges nothing; the discharge is git ls-tree origin/main, or a fetch where the transport is a served artifact), or does the existing global lesson corpus already carry it? Read MOTIR-1464's not-done children FIRST — a W card for this family may already exist, and a duplicate splits the warrant of the very rule it is trying to strengthen.
Acceptance criteria
- MOTIR-4139 reads
status: blockedwith MOTIR-3909 in itsopenBlockers, and its body carries the struck disposition plus the evidence table. (Verify byget_work_item; nothing to build.) - MOTIR-4139's
targetReposis['motir-marketing', 'motir-core']. - The promote-vs-lesson question above is SETTLED on evidence — MOTIR-1464's not-done children read first, the family counted, and the answer written here. If SHARPEN, the clause is folded into an existing W card in the same region rather than filed as a new one; if LESSON, say which existing lesson covers it.
Advisory dispositions
- No
blocked_byis owed, and this time the discharge is that the card CONSUMES nothing. Its criteria read on the tenant graph (already in the state they assert) and on the corpus — not on any output MOTIR-4139 or MOTIR-3909 is still producing.relates_toMOTIR-4139 carries the discovery trace, which is provenance rather than consumption. - No sprint. MOTIR-1465 carries none and a planning bug is not build work; this one blocks nothing.
Context refs
- MOTIR-4139 — the card this was filed about;
relates_to - MOTIR-3909 — the wired blocker;
motir-corePR #2513 is its open half motir-meta/prompts/run.mdguard #4 — the run-time half, which workedmotir-meta/prompts/plan-rules/core.mdgate 4 / gate 7 / gate 21 — the authoring half, where the gap is- Global lessons reinforced against this occurrence:
cpqdjl5t0mlk9hf4v92xtawnn(an acceptance criterion that reads on state this card does not produce),cc7jdch5mk43j82mpq2aavrou(an absence-criterion commissions a producer in the other repository)