Planning bug: MOTIR-3892 "measured" a closed PR from its CARD — #332 never split the constant, changed no test, and turned no guard red
A planning pass authored MOTIR-3892's central evidence paragraph — and MOTIR-3891's explanation repeated half of it — from a reading of a closed pull request rather than a measurement of it. All three figures are wrong, and they are wrong about WHAT THE PULL REQUEST DID, not by how much.
What the cards said
MOTIR-3892: "Measured on the attempt in motir-ai#332 (closed): splitting VERIFY_EVERY_PRECONDITION moved 13 spaces to newlines in the composed prompt, and routing its limbs turned eleven ordering guards red."
MOTIR-3891 (explanation): "an ordering guard that went red eleven times".
Note the word "Measured". The paragraph carries the register of a measurement and cites a ref, which is exactly the shape plan-rules/phase-deepen.md's ENUMERATION limb exists to make checkable — and it passed every gate: validate_work_item returned valid: true with no advisory, the story validated clean, and the figures are specific enough to read as observed.
What the pull request actually did
Re-measured at origin/main 5b55264 against 36c24ad (the head of feat/split-verify-precondition-3856):
$ git diff --stat $(git merge-base 36c24ad origin/main) 36c24ad
src/llm/planningRulePacks.ts | 56 ++++++++++
tests/fixtures/planningRuleRouting.baseline.txt | 42 ++++++++
tests/fixtures/sharedPlanningRules.baseline.txt | 14 ++++
tests/fixtures/sharedPlanningRules.registerCeiling.json | 18 +++---
4 files changed, 121 insertions(+), 9 deletions(-)
VERIFY_EVERY_PRECONDITIONwas never split — byte-identical in both refs, 48,839 chars, zero internal newlines.- The +14 newlines are 14 ADDED segments, not a split: #332 appended one
A_<TYPE>_CARDS_PRECONDITIONper type beside the untouched constant, +7,533 chars of NEW text. Each newCORPUS_ORDERentry contributes one join newline. Not "13 spaces moved to newlines". - No ordering guard went red, because #332 changed no test file at all. The three fixtures it touched are the conservation, routing and register BASELINES — the sanctioned deliberate-refresh path.
The discriminator, and why it is a PLANNING bug
The card's CONCLUSION is correct and survives: the line-as-rule invariant is real, verified directly (clauseOf's comment states it; 23 call sites read a 48,839-char line as "the rule"). So this is not a wrong decision — it is a correct decision resting on a fabricated fixture, which is worse than a wrong one, because the fixture is what a reader checks when they doubt the conclusion. A reader who went to #332 to understand the cost would have found nothing matching the description and concluded the corpus was unreliable.
What produced it: #332's TITLE is "a PRECONDITION rule for every one of the 14 types" and MOTIR-3856's title is "Split VERIFY_EVERY_PRECONDITION into its numbered limbs". The CARD said split; the PULL REQUEST added. The planning pass read the card's title and the closure, and wrote a measurement of the branch it never opened. A closed pull request's own card is not evidence about the pull request — the card is what was intended, the diff is what happened, and a closure is the strongest signal available that the two came apart.
The fix, which is a RULE change
plan-rules/phase-deepen.md's ENUMERATION limb already binds a card COUNTING a population to the ref the count was taken on, and run.md binds a run to re-measure it. Neither reaches this shape, because the ref here was cited correctly and the count was of a thing that never happened. The limb it needs is the one this bug is: a figure attributed to a NAMED PULL REQUEST, BRANCH OR COMMIT owes the command that reads THAT ref — git diff --stat <base>..<head>, git show <ref>:<path> — never the CARD the pull request was opened from, and never its title. The two are routinely opposite exactly when the pull request was CLOSED rather than merged, which is the only reason anybody is citing it.
Amendments already applied
- MOTIR-3892's description: the paragraph struck on the record, replaced with the re-measurement and its commands.
- MOTIR-3891's explanation: the "eleven times" clause struck, same treatment.
motir-metaprompts/plan-rules/DECISION.clause-unit.mdcarries the correction as a Context subsection, so the record a reader lands on states it rather than quietly omitting it.
Comments (0)
No comments yet — be the first to weigh in.