PLANNING BUG — a ROUND-TRIP eviction: 11.5.5 and 11.5.19 handed `next_ready` to each other 22 minutes apart, so no card's criteria owned the port and it reached the deletion card
MOTIR-2214 (11.5.6) is written as a deletion: "nothing is removable until every method has moved." When it came up for execution, one had not — MotirClient.nextReady was still calling the next_ready tool, and no card's acceptance criteria had ever contained the port.
⚠️ RE-DIAGNOSED 2026-08-07 at close-out. The conclusion held; the mechanism in the original filing did not.
This card was filed as "a card titled for the SIDE EFFECT (
keyed by KEY) was read as owning the PORT".get_work_item_activityfalsifies that: at00:45:41Z, when 11.5.5 evictednextReady, MOTIR-2338's title read "11.5.19 The dispatch loop selects by KEY — retirenext_readyand the row-id exclusion list" and its description said the same. The reading was correct, and reading its acceptance criteria instead would have agreed. The card was retitled OUT of the port 21m57s later.
How the gap actually opened — a ROUND TRIP
All times UTC, from get_work_item_activity view:"history" and git log --date=iso-strict.
| when | what |
|---|---|
08-06 09:21:04 | 11.5.5 retitled to ADD nextReady; 5 → 8 pts. |
08-07 00:39:15 | 11.5.19 created as "…retire next_ready and the row-id exclusion list", 5 pts / 60 min. |
08-07 00:39:46 | 11.5.5 blocked_by 11.5.19. One link hop. |
08-07 00:45:41 | Eviction 1. 11.5.5 retitled, nextReady dropped, 8 → 5 pts; note written: "11.5.19 retires next_ready outright". True at the time. |
08-07 01:07:38 | Eviction 2, 21m57s later. 11.5.19's own run retitles it "The exclusion list is keyed by KEY…", 5 → 3 pts, 60 → 40 min, and writes "Retiring nextReady moved to 11.5.5 … It belongs in 11.5.5". 11.5.5 was not touched. |
08-07 01:53:06 | d0482329 (11.5.4) writes clientCore.test.ts:96 — "11.5.19 retires the first". 45 min after 11.5.19 stopped. |
08-07 09:02:04 | Hop 3. 56004140 — 11.5.5's OWN run — writes "nextReady (retired by 11.5.6)": a third owner, invented, by the run editing the file where nextReady still called the tool. |
08-07 ~11:45 | 11.5.6 comes up. Caught. |
Neither card's acceptance criteria ever contained the port. 11.5.19's never mention nextReady; 11.5.5's five-method table never lists it. Each body names the other as owner, so a reader who checks either is sent to the other. A forward hand-off leaves one card holding the work; a round trip leaves zero, and every participant still reads as internally consistent.
The fix
- MOTIR-2398 (11.5.23) — the actual port. Landed
5cab8e1f; blocks 11.5.6. - MOTIR-2214 — re-scoped in place; its predecessor list names 11.5.23 rather than assuming the work. Landed
d70b25d1. - MOTIR-2213 — the referrer sweep eviction 2 owed, performed at close-out. Its two surviving false sentences (the re-plan note and the 11.5.19 context ref) are corrected in place.
notes.html#240 — motir-meta#143.
Acceptance criteria
— settled NO at close-out; see the verdict. Do not restore this criterion.prompts/plan-rules.mdgains the rule belowmotir-meta/notes.htmlgains an entry recording the mistake with its date and this card's key. → #240.- It lands in ONE
motir-metaPR, per the branch-and-PR convention for that repo. → #143, branchdocs/owner-claim-migrated-across-three-cards(noMOTIR-id, per the sync convention). - The referrer sweep eviction 2 skipped is performed on MOTIR-2213.
The verdict — LESSON, not a rule
prompts/plan-rules.md was NOT amended, and no SHARED_PLANNING_RULES mirror card is owed. The governing check is already there, verbatim, in the sweep the REFERRERS on any re-scope corollary:
"Re-scoping or re-purposing a card silently stales every card that referenced its OLD shape. When you change what a card delivers, grep the tree for cards that name it or depend on it and fix their prose + edges in the same pass … A re-scope is not done until its referrers are swept."
It landed 22c9aef, 2026-06-22 — 45 days before eviction 2, same planner, same story — and the referrer was one link hop away (11.5.5 was blocked_by 11.5.19, written six minutes earlier). It was not run at all. A rule that ran and stopped short is a trigger problem; a rule that was not run is a diligence problem (#224's discriminator) — and this is the second time on this story, after MOTIR-2339 / #233, which resolved LESSON on the same ground.
The originally proposed rule text is also aimed at a failure that did not occur:
- "read its criteria, not its title" — at eviction 1 the criteria said the same thing the title did.
- "a removal card must name its preconditions as
blocked_byedges, not prose" — the ninth instance of the prose-vs-graph family (#187 / #189 / #204 / #210 / #239), adding no check those do not already state.
Close-out verification (2026-08-07)
- Citations re-derived from history, not from this card. The "three separate places" count is corroborated — 11.5.5's re-plan note, 11.5.6's predecessor list (since re-scoped), and
clientCore.test.ts:96atd0482329. It undercounts by one:56004140added a fourth, naming a third card. - The correction held. 11.5.23 is
blocked_by-wired to 11.5.6 and both commits are onparent/MOTIR-1855-cli-v1-migration;git grep next_ready -- packages/cli/srcat branch HEAD returns comments only, no call site. - Still stale, reported not fixed:
clientCore.test.ts:96now claims 11.5.6 retirednextReadyand that it still speaks MCP — both false at branch HEAD. Left to the parent-run's own author (motir-core, another repo); flagged as a comment on MOTIR-2214.