26 tasks · 6 phases · ~20 files · 2026-09-04

Your Turn, Dispatch Gating, and Mira Scroll

The To-Dos widget becomes Your Turn, a list of test pages and reviews still waiting on you; Quick Checks retire; the dispatch banner gets a real gate with settings; Mira opens at the newest turn.

26Tasks
3Quick tasks
8Files deleted
4Commands edited
The gist

The To-Dos widget goes away. In its slot, Your Turn lists the interactive documents still waiting on you: test pages not yet imported or marked done, and reviews not yet archived. The Quick Checks that /cr-entry and /cr-complete generated are retired, and both commands gain one discretionary step that offers a test page or a review only when the session's work warrants it.

Separately, the dispatch banner gets a threshold of 15 entries and 7 days with a setting to change both, and Mira's conversation opens at the newest turn and renders a window of recent turns instead of three months.

The problem

To-Dos duplicated the testing documents. The widget listed every test page (the same list the Documents widget's Testing segment shows) and, below it, Quick Checks: up to five "User:" / "Test:" items generated from every completion or entry import. Those items restated what the test page already asked, so finishing the page left orphaned checks, and checking them off left the page open. Two ledgers for one activity, neither authoritative.

"Ready for a dispatch" fires on five Chronicle records. DispatchDigestGate shows the offer once five records accumulate past the last digest, and a dismissal only snoozes it for five more. A single productive day writes five records. There is no time floor and no setting.

Mira opens at the top of the thread. The conversation view only scrolls to the bottom when the turn count changes, never on appear, so reopening lands on the oldest turn. The Code Raven thread has 187 turns, each a selectable Text inside a LazyVStack. Scrolling from the top materializes rows in bulk and stalls the main thread.

Approach

Your Turn is a filtered view, not a third ledger

Test-page state stays where it is (the store formerly called ToDoStore, renamed TestPageStore, same file on disk). Review state comes from FlowMapScanner: a review is done when it is archived. The widget reads both and shows only what is open. Nothing new is persisted.

Completion has one meaning per document kind

A test page completes when /cr-testing import lands a result or you mark it done on the row. A review completes when it is archived, from the row, from the Documents widget, or by Claude after applying the change-list. The review template's "Copy for Claude" output now ends with that instruction, so the archive happens as part of the handoff.

Quick Checks are deleted, not hidden

The store, the section, the full view and the floating panel go. QuickVerifyItem stays as a decode-only model because Chronicle records persist it. The one behavior worth keeping, "Claude:" next steps becoming Tasks, moves into a small NextStepTaskRouter called from the two importers.

The commands ask, they do not generate

/cr-entry and /cr-complete lose the "Test:" prefix guidance and gain one step: after the bridge is written, decide whether the session's work warrants a hands-on document, and if so ask one question naming the command. The criteria are spelled out so the ask stays rare: user-visible behavior across several interaction steps, no existing open test page for the plan, or a design with choices you have not reacted to.

Dispatch gating gets a time floor and a setting

Defaults move to 15 entries and 7 days since the last dispatch. Both, plus an on/off toggle, live in General settings under a Dispatches section. The gate reads UserDefaults on each evaluation so a change takes effect on the next overview refresh.

Mira renders a window

defaultScrollAnchor(.bottom) handles the landing position. A window of the most recent turns (40 to start) is rendered, with a "Show earlier" row that widens it. Jump-to-turn and parked-topic range selection widen the window automatically. The window start snaps to a segment boundary so a collapsed-segment row is never cut in half.

Decisions made for you

Judgment call

Type rename, same disk layout

The four To-Do types become TestPage types. The store keeps writing Application Support/Code Raven/ToDos/ and the bridge keeps reading .claude/todos/ with todoId and the test_page / test_result types. Renaming the wire contract would ripple into the 1000-line cr-testing template and VentureRaven's copy for no user-visible gain.

Judgment call

Manual to-dos and Move to Project for to-dos are removed with the concept

Every record on disk is a test page; nothing used the manual kind.

Judgment call

The Documents widget's Testing segment keeps showing all test pages

Done and open. Your Turn is the open subset. That is the split you asked for.

Judgment call

The discretionary ask lands in both /cr-entry and /cr-complete

The request named cr-entry. cr-complete is the end-of-cycle counterpart where a test page is most often warranted, and leaving it out would make the ask inconsistent. VentureRaven's commands are not touched.

Judgment call

SubsystemCatalog keeps the todos-testing id

Blueprints reference subsystem ids; only the display name and file patterns change.

The work

Phase 1 — Your Turn replaces To-Dos

7 tasks Rename plus one new widget; the on-disk store and bridge contract do not move.
  • Rename ToDoItem/ToDoStore/ToDoBridge/ToDoBridgeImporter to TestPageRecord/TestPageStore/TestPageBridge/TestPageBridgeImporter, keeping the on-disk store path and the .claude/todos bridge contract unchanged
  • Drop the manual to-do kind, createToDo and moveToDo from the store
  • Build YourTurnWidget listing open test pages and unarchived reviews for the project
  • Give each Your Turn row Open, Reveal in Finder and a finish action (mark test page done, archive review)
  • Delete ToDosWidget and ToDosFullView and mount YourTurnWidget in both ProjectOverviewView layouts
  • Update DocumentsHubWidget, PlanHistoryCard, PlanSnapshotDetailView and the two pipeline views to the renamed store
  • Update Code_RavenApp scan order and SubsystemCatalog file patterns for the renamed files

Phase 2 — Quick Checks retired

3 tasks Deletes four files; Chronicle records keep decoding.
  • Delete QuickVerifyStore, QuickChecksSection, QuickChecksFullView and QuickChecksPanelManager
  • Keep QuickVerifyItem and ImplementationRecord.quickVerifyItems decode-only so existing Chronicle records still load
  • Add NextStepTaskRouter so Claude-prefixed nextSteps still become Tasks from completion and checkin imports

Phase 3 — Commands

4 tasks Global and bundled copies edited together.
  • Remove the Test: prefix and Testing-panel routing from the nextSteps guidance in cr-entry and cr-complete (global and bundled)
  • Add a discretionary hands-on document step to cr-entry and cr-complete that offers /cr-testing or /cr-review only when the session's work warrants one
  • Reword cr-testing's To-Do card language to Your Turn while keeping the todoId bridge fields
  • Make a review complete by archiving: closing instruction in the review template's change-list and a note in cr-review

Phase 4 — Dispatch offer gating

3 tasks Lands independently.
  • Add DispatchOfferSettings with enabled, minimum entries and minimum days defaults read by DispatchDigestGate
  • Raise the default threshold to 15 entries and require 7 days since the last dispatch before offering
  • Add a Dispatches section to General settings with the toggle and both thresholds

Phase 5 — Mira conversation

4 tasks Lands independently.
  • Open the Mira conversation at the newest turn with defaultScrollAnchor(.bottom)
  • Render only the most recent turns with a Show earlier row that widens the window
  • Widen the window automatically for jump-to-turn requests and parked-topic range selection
  • Hoist the per-row segment and hidden-turn maps out of the row closure

Manual Testing

5 tasks Sarah, in the running app.
  • Open a project overview and confirm Your Turn lists open test pages and active reviews and Documents still shows all test pagesuser
  • Archive a review from Your Turn and confirm it leaves the widget and appears under Reviews archiveduser
  • Run /cr-entry on a UI session and confirm the testing offer appears only when warranteduser
  • Change the dispatch thresholds in Settings and confirm the banner honors themuser
  • Reopen Mira on Code Raven and confirm it lands on the newest turn and scrolls without a beach balluser

Risks & edge cases

Edge case

Existing reviews carry no archive instruction

Only pages generated after the template change end their change-list with the archive step. The row's finish action covers the six reviews already on disk.

Latency

Scanner throttle

FlowMapScanner.scan is throttled, so a review archived by Claude in the terminal reads as done on the next app activation rather than instantly. The Documents widget already has the same latency.

Edge case

Window start inside a collapsed segment

Snapping the window start to the segment boundary avoids the half-segment case; the "Show earlier" row is the escape hatch for everything else.

Distribution

Bundled command copies wait for a version bump

Your global copies take effect immediately. Installed users get the new command text only when the app version changes. No bump is part of this plan.

Out of scope

A respond/annotate loop for reviews (the cr-review notes already name it as a future). What's New highlights for this release. Renaming the .claude/todos bridge directory or the todoId field. VentureRaven parity for the command edits.

Final review

The plan removes a surface rather than adding one, which is its main strength: Your Turn is a read-only projection over two stores that already exist. Its weakest point is review completion resting on archiving, a convention rather than a signal the page emits. That is accepted because the review template's own notes describe the clipboard as the whole handoff, and archiving is the only completion the app can observe without a new bridge. The Mira window is the change most likely to need a second pass if segment boundaries and range selection interact in a way the snap logic does not anticipate.

82/100

The To-Dos and dispatch pieces are mechanical with clear semantics. The Mira fix is well-grounded (no scroll on appear is verifiable in code) but the beach-ball cause is inferred from row count and selectable text, not profiled.