1---2name: todos-update3description: Use when user asks to update todos, resync the task list, say what to do next, or plan and tree have drifted apart. Not for coarse lists: use todos-enhance. Not for adding requirements: use todo-add.4---56# Update todos78## Contract910| Field | Bound contract |11|---|---|12| Trigger | User says 'update the todos', asks to resync the task list or what to do next, or the plan and the tree have drifted apart. |13| Authority | Reversible local: writes only the task list through the todo tool; rollback is undo. No remote mutation. |14| Side effect | Edits the task list or todo state; performs no implementation. |15| Done | The delta report lists Completed, Still open, Overtaken, Blocked, and New; every completion carries proof and the stale count is zero. |1617## Inputs1819- Current task list (required).20- Codebase state via file reads and test/command output (required for proof).21- Conversation context establishing design decisions (optional; used to detect overtaken items).2223## Refusals2425- Will not mark an item complete without proof: test output, command result, or `path:line` evidence.26- Will not fabricate a list state if the todo tool fails.27- Will not drop an overtaken item silently: every drop carries a one-line reason.28- Will not pretend the done predicate holds when the codebase state cannot be fully determined.2930## Procedure31321. Read the current task list. **Done when:** the current list is loaded.332. Inspect the codebase: read changed files, run targeted tests or commands, check `path:line` references to determine what actually landed. **Done when:** the codebase state is determined for every item.343. Read conversation context for design changes that may have overtaken items. **Done when:** overtaken-item candidates are identified.354. For each existing item, classify exactly once: `landed` (done, with proof), `still-open` (unchanged, still required), `overtaken` (a design change made it unnecessary), `blocked` (cannot proceed until something external clears), `newly-discovered` (not on the list; found during the work). **Done when:** every item is classified.365. A `landed` claim requires proof: the test, the command output, or the `path:line` that demonstrates it. An unproven completion stays `still-open`. Someone saying an item is done is not proof; it is the claim under test. **Done when:** every `landed` item cites its proof.376. Write the reconciled list back through the `todo` tool. **Done when:** the reconciled list is written.387. An `overtaken` item is dropped with a one-line reason recorded in the report, never deleted silently. A dropped item with no recorded reason is indistinguishable from a forgotten item. **Done when:** every dropped item has a recorded reason.398. Name exactly one next action: the first `still-open` item whose blockers are all clear, stated as a concrete action rather than a heading. When two items tie, the tiebreak is which one unblocks more of the remaining list. When every remaining item is `blocked`, name the blocker that has to clear first, one answer, not a list. **Done when:** exactly one next action or one blocker is named.409. Emit the delta only: what changed classification, and why. **Done when:** the delta report is emitted.4142## Failure and recovery4344| Failure class | Behavior |45|---|---|46| Missing proof | An item claimed complete but lacking test output, command result, or `path:line` evidence stays `still-open`. Record the proof gap in the report. |47| Todo tool failure | Do not fabricate a list state. Report the error; the list remains unchanged. |48| Non-convergent delta | If the codebase state cannot be fully determined, return a partial result with explicit gaps rather than pretending the done predicate holds. |4950## Output5152Delta report: each item whose classification changed, its new class, and the reason, every `landed` item cites its proof, exactly one next action is named or one blocker is named as the reason none is, and zero stale items remain.