list_tasks returned every row's to_dict(), body included: a project's todo list
came to 93-165k characters, past what an MCP client accepts inline, so the list
arrived as a file to page through (the #4045 failure, one call over).
- notes.brief_row: id, title, type, project, tags, updated_at; for tasks,
status, kind, priority, milestone id and title; description, parent and due
date only when set.
- milestones.titles_for: one query for the milestone titles a page of rows
names.
- Brief rows on list_tasks, list_notes, get_milestone's steps, get_system and
list_system_records. get_task / get_note / get_snippet read a record in full,
and each docstring says so.
- tests/test_list_rows_brief.py pins the ceiling: 100 rows of ~5k-character
step plans stay under 40k characters.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01821k5B3Ysecp9fNYs92Kuy