MotirBuilding in public
MOTIR · moooon
onMotir
You’re viewing a public project. Anyone can view it — no account needed. Sign in to submit, upvote, or comment on requests.View-only — you can’t edit work items
MOTIR-3820

Planning bug: a card's rung-2 evidence asserted an absent workflow edge that ships — the decision survived, the argument's KIND did not

Done
Description

Found by: the motir run MOTIR-3808 parent run, 2026-08-28, while executing child MOTIR-3811 (the to-do-list decision ADR) on branch parent/MOTIR-3808-work-item-todo-list, base origin/main @ ae490d52e.

The defect

MOTIR-3811's own body offers, as Q3's rung-2 evidence, that:

"the shipped ladder (lib/workflows/defaultWorkflow.ts) has no in_progress → done edge at all, and status is driven by the pull-request lifecycle for a coding card and by an explicit act for a manual one."

The clause in bold is false on origin/main.

Evidence (the command and its output, verbatim)

$ git grep -n "'in_progress', 'done'" origin/main -- lib/workflows/defaultWorkflow.ts
origin/main:lib/workflows/defaultWorkflow.ts:145:  ['in_progress', 'done'],

The edge was added by MOTIR-1625, with a backfill migration for every existing default-workflow project, on two grounds recorded in the constant's own comment: a project with no review gate should finish work without parking it in a column it does not use, and the MOTIR-1615 upward rollup moves a parent to done from wherever it is — without the edge that rollup would be an illegal move and would strand the parent.

It is also live: get_work_item MOTIR-3808 returns the project's transition graph carrying cf17bc87-b0f3-4bc2-8dc8-0e16d74e4615 from in_progress to done.

Why it is a PLANNING bug and not a product one

The fix changes the plan (the card's body) and the reasoning habit behind it, not any shipped code — the discriminator in run.md's planner-bug-home rule. Nothing in the product is broken by it, which is why this card blocks nothing and joins no sprint.

Why "the conclusion still holds" is not the whole finding

MOTIR-3811's decision is unchanged: ticking the last to-do still must not move the card's status. But the false premise changed the argument's KIND, and that is the part worth recording:

  • As authored, the argument read as structural — the ladder makes the transition impossible, so there is nothing to decide.
  • As corrected, the transition is perfectly legal and the refusal is a design choice about who owns the status column: Motir already has two authorities over it (childStatusCascadeService / the parent rollup, and the delivery completion gate with its four defer arms), and a checkbox anyone can click would be a third with no defer arm. MOTIR-3229 is what a disagreement between two of them already cost.

A structural argument invites no successor; a design argument invites one and tells them what to argue with. Had the ADR shipped the structural form, the first reader to notice the edge exists would have concluded the whole section rested on a mistake — and the two-authorities reason, which is the real one, would have gone with it.

Disposition ALREADY APPLIED in this run

  1. docs/decisions/work-item-todo-list.md §3 states the refusal as the design choice it is, and its Context section carries the correction with this command and its output.
  2. MOTIR-3811's descriptionMd is amended on the record (the Q3 rung-2 bullet), citing this bug.
  3. The falsification is named in the parent/MOTIR-3808main pull-request body.

The takeaway (for the corpus)

A card citing rung-2 evidence in the NEGATIVE — "there is no X" — owes the grep that a positive citation owes, and it fails in the direction nobody checks: a git grep returning nothing looks identical to a git grep nobody ran, and both read as diligence. The authoring-side rule already exists (plan-rules/phase-deepen.md's NEGATIVE limb: a card explaining a decision by what does not exist owes the grep, not the verdict). What this instance adds is the consequence when the conclusion survives anyway: a falsified premise whose conclusion still stands is the case most likely to be absorbed silently, because nothing downstream breaks. The amendment is owed precisely then.

Acceptance criteria

  1. docs/decisions/work-item-todo-list.md §3 does not rest on the absence of a workflow edge, and its Context section records the falsification with the command that produced it. (Landed in this run — closing this is a read, not a build.)
  2. MOTIR-3811's Q3 rung-2 bullet no longer asserts the edge is absent and cites this bug. (Landed in this run — closing this is a read, not a build.)
  3. No product code changes: this card's whole disposition is a documentation clause and a card amendment, both already applied.