610c869ac6
The core-tool rename shipped `todo_list` on the wire (legacy alias `todo` kept for old transcripts), but the Desktop renderer still matched the tool by the literal `todo` in seven places: the live tool.start/tool.complete mirror into the composer status stack, the todo-stream router, args carry-over, the transcript hoist, the silent-tool class, the count noun, and stored-history hydration. Every live task update therefore went into the transcript as an ordinary tool row while the task panel stayed empty, and reopening a chat never restored a finished list. One predicate (`isTodoToolName`) now owns the wire/legacy name pair and every site reads it.