Type: planning defect (an orphaned deferral) · Parent: MOTIR-1465, the planner-bug home · Discovered in: motir run MOTIR-3224, 2026-08-20 · Relates to: MOTIR-3224.
MOTIR-3224's step 6 instructs the run to:
Record the one case a poll covered and a wake does not: a submit landing on machine A while A is mid-job, when idle machine B could have run it in parallel.
wakeWorkeris in-process only. This costs latency, not correctness or money — note it here and leave the cross-machine wake to MOTIR-2783, which owns the parallelism question. Do not reintroduce a timer to cover it.
MOTIR-2783 is done (verified by get_work_item during the run; status done, closed under story MOTIR-2781, which is also done). It was a type: deploy card that decided and applied the scaling posture — the pool, the availability floor, and which SIGNAL each service scales on — and its remedy for the mid-job autostop hazard shipped as the lease / reaper / drain trio (MOTIR-3221 / 3222 / 3223). Nothing in its scope was a cross-machine wake, and nothing in it is still open to receive one.
So the deferral resolves to a closed card. This is notes.html #238 — a run DEFERRED work to a named successor card and nothing carried that obligation onto the card — in its stronger form: here the successor was named at PLAN time and was already terminal when the sentence was written, so there was never a moment at which the obligation could have landed anywhere.
The consequence is small and specific, which is why it is worth a card rather than a paragraph. MOTIR-3224 deletes the idle poll, and the poll was the only thing that would eventually let an idle machine B pick up a job submitted to a busy machine A. After it merges the behaviour is: A finishes its current job, re-ticks, and takes the queued one. That is correct and it costs latency only — the card is right about that, and right that a timer is the wrong remedy. But "we accepted a latency cost and assigned the fix to X" and "we accepted a latency cost" are different states, and the plan currently records the first while being the second.
The card's author reached for the nearest card that had discussed multi-machine behaviour, rather than checking whether that card was open and whether its scope actually covered the deferred work. The two checks are cheap and mechanical: status, and scope.
Fix direction — a DECISION, not code. Two dispositions and the choice is Yue's:
LISTEN/NOTIFY, or a POST /internal/wake fanned across machines). That is its own card under the scaling story's successor, sized on its own terms — and worth it only if planning latency behind a long job is actually felt.Either way, amend MOTIR-3224's step 6 ON THE RECORD so the next reader is not sent to a closed card, and correct the same sentence where this run copied it into motir-ai's src/jobs/worker.ts and src/jobs/wake.ts (the PR for MOTIR-3224 names this bug instead).
descriptionMd step 6 no longer defers to MOTIR-2783; it either records the acceptance with its reason, or names the card that owns the cross-machine wake.descriptionMd carries the deferral; its PR body repeats this finding.done; its description and acceptance criteria show the scope that does not include a cross-machine wake.motir-ai/src/jobs/wake.ts — wakeWorker's docstring enumerates the three ways a wake goes nowhere, the busy-sibling case among them.notes.html #238 — the deferral-with-no-owner lesson this instance repeats.