feat(mcp): truncate/select batch_get_tasks payload, expose roadblockText
batch_get_tasks with includeDescription=true had no size guard: 8 tasks' full Description/Result serialized to a single 51k-char line, blowing past the tool-result token budget and forcing a file/PowerShell workaround to read it back. Roadblock text was also only reachable via a second get_task call per task, since roadblockCount (in the lean ref) has no text sibling. - descriptionMaxChars (default 1500, was unlimited) truncates Description and Result independently, flagged via *Truncated/*FullLength so a caller never silently works off a cut string. - fields narrows taskFull to just the named properties, including the new roadblockText (the tail of Result after TaskRunner's roadblock marker) — reachable without pulling in the rest of Result/Description. - taskFull is now BatchTaskDetailDto, a batch-only shape decoupled from TaskDto so get_task's own contract is untouched. - The whole response is capped (MaxResponseChars); over that, the call throws naming which parameter (descriptionMaxChars/fields/taskIds) to adjust instead of shipping an oversized payload. 10 tasks with 5000-char descriptions (default settings) serialize to ~13.8k chars, comfortably under the 25k-char cap.
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
# External MCP tool surface
|
||||
|
||||
> **Explore-note — verify before trusting.** Distilled map of a subsystem, not authoritative.
|
||||
> Last verified against commit `20bce9b` (2026-08-06).
|
||||
> Drift check: `git log --oneline 20bce9b..HEAD -- src/ClaudeDo.Worker/External`
|
||||
> Last verified against commit `6a2a19c` (2026-08-10).
|
||||
> Drift check: `git log --oneline 6a2a19c..HEAD -- src/ClaudeDo.Worker/External`
|
||||
> Stable structure only (no line numbers). See docs/explore-notes/README.md.
|
||||
|
||||
Covers `src/ClaudeDo.Worker/External/` — the always-on MCP tools ClaudeDo exposes to general
|
||||
@@ -145,7 +145,16 @@ directory is shared with other concurrent sessions.
|
||||
single-task. Every tool returns a per-item result array (`{ id/index, ok, error?, … }`) — a
|
||||
failing item never aborts the rest — and rejects batches over **100 items**.
|
||||
`BatchGetTasks` mirrors `ListTasks`'s `includeDescription` flag (default `false`): a found item's
|
||||
`BatchGetTaskResult` carries `task` (lean) or `taskFull` (full), never both.
|
||||
`BatchGetTaskResult` carries `task` (lean `TaskRefDto`) or `taskFull`, never both. `taskFull` is
|
||||
`BatchTaskDetailDto` — a batch-only shape, **not** `TaskDto` (`get_task` is untouched) — whose
|
||||
Description/Result are cut to `descriptionMaxChars` (default 1500, was unlimited) with
|
||||
`*Truncated`/`*FullLength` flagging it, and which `fields` (an optional name allow-list, e.g.
|
||||
`['title','roadblockText']`) can narrow further; unrequested fields come back `null`.
|
||||
`roadblockText` pulls just the bullet lines after `TaskRunner.ComposeReviewResult`'s roadblock
|
||||
marker out of `Result`, without needing the rest of it. The whole per-call response is also
|
||||
capped (`BatchMcpTools.MaxResponseChars`) — over that, the call throws naming which parameter to
|
||||
adjust instead of shipping an oversized payload (the incident that prompted this: 8 tasks'
|
||||
full Description/Result serialized to a single 51k-char line).
|
||||
|
||||
**`GetTaskLog`** — latest run's log, tail-capped at 256 KB.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user