- Aligned the blocked-todo reconciliation test with the debounced
subagent-lifecycle observer on main (fake timers + 100ms advance).
- Carries in-progress robomp queue/sandbox/config scaffolding from the
shared worktree (.env.example, config.py, queue.py, sandbox.py).
Two review findings on the blocked-todo support:
- A blocker `reason` with an embedded newline corrupted the Markdown
round-trip: `phasesToMarkdown` writes the note as a trailing HTML comment
on one checklist line, so a newline split it across two lines — the first
an unclosed `<!-- blocker: …`, the second an unrecognized-syntax error —
losing the reason on `/todo edit` and export/import. Normalize the reason
to a single line (collapse whitespace runs) at the `block` op source, so
the round-trip, HUD, and summary consumers all stay one-line-safe.
- The todo prompt now directs the agent to `block` a task waiting on
another agent, but `#reconcileTodosWithSubagents` only auto-completed
pending/in_progress todos. A todo blocked on a detached subagent would
stay blocked after that subagent completed, and since blocked todos are
excluded from the stop reminder it stranded silently. Include `blocked`
in the reconciliation (a matching subagent completing is the unblock
signal) and drop the now-stale blocker note when completing.
Both paths are revert-proven by new regression tests.
Co-Authored-By: seal <noreply@sealedsecurity.com>
- Subagent lifecycle reconciliation now runs behind the 100ms observer UI
coalescing timer; the test advances fake timers instead of asserting
synchronously after emit.
Main removed the floating todoReminderContainer in 112317bc8 (todo
reminders are now anchored inside the scrollback transcript and reset
by renderInitialMessages({clearTerminalHistory: true})), so the added
this.todoReminderContainer.clear() references a property that no longer
exists post-merge, failing typecheck and throwing on every /btw branch.
Revert the interactive-mode hunk and its test, and reword the changelog
entry to cover only the goal-mode todo context fixes.
- Anchors the incomplete-todo reminder block inside the scrollback transcript instead of a floating live container.
- Eliminates duplicate reminder copies piling up in terminal scrollback during terminal reflows.
- Removes the dedicated `todoReminderContainer` and simplifies state synchronization on todo reload.
- Updates tests to verify sequential reminders commit as separate blocks and are left intact when tools succeed.
- Redesigned the Todo HUD as a connector tree with fixed-budget stage previews.
- Anchored status and HUD containers to prevent redundant UI elements in terminal scrollback.
- Implemented tree-based rendering for project phases and tasks while removing dynamic border rules.
- Upgraded `sherpa-onnx` and related packages to support current infrastructure.
The sticky panel above the editor rendered as ambient text:
Todos
└ I. Foundation
└ ☐ ...
so users perceived the bordered tool-result block in chat as the
only todo display. Once that result scrolled into history they
concluded the list 'isn't anchored'.
Bracket the panel with dim horizontal rules (matching BtwPanel /
OmfgPanel) and inline progress + active-phase pointer in the header
(`Todos · 2/7 done · I/III Foundation`) so the persistent HUD reads
as a real panel and stays self-describing without scrolling back.
Fixes#3213
- Renamed `TodoWriteTool` to `TodoTool` and its source/prompt files.
- Updated tool registration, schema, renderers, and gating to `todo`.
- Adjusted cursor provider native tool names and tests to match.
- Renamed strike-animation constants and `todo-error-reminder` type.
Applied tasks.todoClearDelay to the interactive Todos panel without mutating the session todo history used by the model.
Added regression coverage for instant, delayed, and disabled auto-clear behavior.
Fixes#1644