Problem
Personal Workspace task boards show titles such as todo add recorded for todo_584f55f8f3b4 for some open Todos (reproducible with the public examples/status.example.json).
These rows come from build_todo_index (loopx/control_plane/todos/todo_index.py). Todos present in the attention queue use their real text, but a Todo that is only known from the rollout event log (for example because the attention queue carries a bounded Todo list) is indexed from the event itself:
loopx todo add|update|… records the event with summary="todo <command> recorded for <todo_id>" (loopx/cli_commands/todo_event.py);
_indexed_rollout_todo_event uses that summary as both text and title, falling back to "<event_kind> recorded for <todo_id>".
The event carries no Todo text, so the index has nothing better to show, and the audit sentence reaches the operator as if it were the task.
Options
Both change a control-plane contract, so this needs a maintainer decision before a PR:
- Record the Todo text on the event —
todo_event.py adds a compact, public-safe details.text (same redaction as other Todo text in the status projection), and the index prefers it over the summary. Additive to the append-only event log; events written before the change keep the audit title.
- Type the title source in the index —
_indexed_rollout_todo_event marks such rows (e.g. title_source: "event_audit"), and the workspace renders them as an event-only Todo (id plus last event) instead of a task title. No event-log change; works for existing events.
They are not exclusive: (1) improves new events, (2) makes existing ones honest.
Acceptance
- A rollout-only open Todo never renders
… recorded for todo_… as its task title.
- Todos present in the attention queue are unchanged.
Problem
Personal Workspace task boards show titles such as
todo add recorded for todo_584f55f8f3b4for some open Todos (reproducible with the publicexamples/status.example.json).These rows come from
build_todo_index(loopx/control_plane/todos/todo_index.py). Todos present in the attention queue use their real text, but a Todo that is only known from the rollout event log (for example because the attention queue carries a bounded Todo list) is indexed from the event itself:loopx todo add|update|…records the event withsummary="todo <command> recorded for <todo_id>"(loopx/cli_commands/todo_event.py);_indexed_rollout_todo_eventuses that summary as bothtextandtitle, falling back to"<event_kind> recorded for <todo_id>".The event carries no Todo text, so the index has nothing better to show, and the audit sentence reaches the operator as if it were the task.
Options
Both change a control-plane contract, so this needs a maintainer decision before a PR:
todo_event.pyadds a compact, public-safedetails.text(same redaction as other Todo text in the status projection), and the index prefers it over the summary. Additive to the append-only event log; events written before the change keep the audit title._indexed_rollout_todo_eventmarks such rows (e.g.title_source: "event_audit"), and the workspace renders them as an event-only Todo (id plus last event) instead of a task title. No event-log change; works for existing events.They are not exclusive: (1) improves new events, (2) makes existing ones honest.
Acceptance
… recorded for todo_…as its task title.