Repository navigation
🤖 fix: page foreground task reports and stop repeating unbounded fields on later pages - #6427
Conversation
…ds on later pages - Foreground `task` (single, best-of-n and workspace turns) returns the first 50,000-character page of a long report, with nextCharOffset and a note naming the task_await call that reads the next page. - `task_await` report pages after the first drop structuredOutput. - `skills_catalog_read` pages after the first drop the frontmatter. - Task card: rereading an earlier report page keeps the later pages joined, and a first page read after a later one keeps that page's await row visible. Refs #6353. --- _Generated with `xum` • Model: `anthropic:claude-opus-5-5` • Thinking: `high`_ <!-- mux-attribution: model=anthropic:claude-opus-5-5 thinking=high -->
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a0973f6e2c
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
… reports by offset Codex round 1 on #6427: - Task card: a foreground result that holds only the first page of a report seeds the report join, and the card prefers the joined report, so the task_await pages the agent read stay on the card. - task_await: the requested offset, not text equality, decides the first page, so an empty report read at offset_chars > 0 no longer repeats structuredOutput. - Report join: a delivered task_send_message to a task starts a new join for its next report. Agent reports carry no attempt ID, so a new attempt whose first page matches the old text no longer keeps the old attempt's suffix. --- _Generated with `xum` • Model: `anthropic:claude-opus-5-5` • Thinking: `high`_ <!-- mux-attribution: model=anthropic:claude-opus-5-5 thinking=high -->
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f7fdd7b974
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…f group Codex round 2 on #6427: a foreground best-of group where one candidate finished with a long report while another was backgrounded, interrupted or timed out returns a pending aggregate status. The report join dropped that completed candidate's first page, so a later task_await continuation counted as a gap and the card kept the first page. Read paged `reports` entries whatever the aggregate status; a single-task result still needs its own completed status. --- _Generated with `xum` • Model: `anthropic:claude-opus-5-5` • Thinking: `high`_ <!-- mux-attribution: model=anthropic:claude-opus-5-5 thinking=high -->
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 3d25b8dfc9
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…ering A partly corrupted chat.jsonl can hold a null or non-object entry in a foreground task result's `reports`. readForegroundFirstPages read `nextCharOffset` before any check, and the task card read `report.taskId`, so rendering the transcript threw. Both now skip such entries, so the transcript still renders and the valid entries still join (self-healing). --- _Generated with `xum` • Model: `anthropic:claude-opus-5-5` • Thinking: `high`_ <!-- mux-attribution: model=anthropic:claude-opus-5-5 thinking=high -->
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b9b7b5ac94
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…d receipt Codex round 4 on #6427: a foreground workspace turn with a report over one page returns only its first page, and a task_await read returns one page too. The terminal-notification drain required the receipt text to equal the whole recorded report, so the owner could wake again with a duplicate result. A continuation receipt now keeps its page offset (startCharOffset, or 0 for a first page with nextCharOffset). It matches when it is the whole report, or a non-empty page that equals the recorded report at that offset. A page of a different report, or at another offset, still keeps the notification. --- _Generated with `xum` • Model: `anthropic:claude-opus-5-5` • Thinking: `high`_ <!-- mux-attribution: model=anthropic:claude-opus-5-5 thinking=high -->
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a7a05bcb6a
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…rkers Codex round 5 on #6427: - taskReportLinking: the per-tool handlers are a Map, so a persisted toolName such as "__proto__" or "constructor" misses instead of resolving to an Object.prototype member and throwing while the transcript renders. - taskService: initial and continuation receipts record their page offset, and a code_execution projection must match the genuine row's text and page offset. A projection that drops nextCharOffset hides the rest of a paged report, so it no longer consumes the terminal notification. --- _Generated with `xum` • Model: `anthropic:claude-opus-5-5` • Thinking: `high`_ <!-- mux-attribution: model=anthropic:claude-opus-5-5 thinking=high -->
Summary
This fixes four paging gaps that #6312 left, tracked in #6353. A foreground
tasknow returns a long report as pages, the same waytask_awaitdoes, and the task card joins the pages back into the whole report. Pages after the first no longer repeat a skill's frontmatter or a workflow'sstructuredOutput. Xum now counts any page of a long report as delivered, so the owner is not woken again with the same report.Background
#6312 split
task_awaitreports andskills_catalog_readskill bodies into 50,000-character pages, because the next turn's rebuild no longer cuts long tool results (#6268). Its review rounds found four gaps, and I deferred them to #6353:task(run_in_background: false) still returned the whole report in one result.skills_catalog_readpage repeated the skill's frontmatter. Itslicenseandmetadatastrings have no size limit.task_awaitreport page repeated the workflow'sstructuredOutput, which also has no size limit.Implementation
task. The result holds the first 50,000 characters, plusnextCharOffsetand a note that namestask_await(task_ids: ["<id>"], timeout_secs: 0, offset_chars: N). This covers a single task, best-of-n (one page and note per report) and a foreground workspace turn. One shared helper,pageTaskReportForResult, writes the note for both tools.structuredOutput. Only a read from offset 0 carries them. The requested offset decides, not the page text, so an empty report also drops them on later reads.task_awaitpages. When the result holds only a first page, the card shows the joined report.task_send_messageto a task ID starts a new join, because sub-agent reports carry no ID for the run that wrote them.taskService.ts). Each receipt records its page offset. A completion notification counts as delivered when a non-empty page equals the full report at that offset. This also fixes a duplicate wake that has been onmainsince 🤖 fix: cap background-bash reads, task reports and catalog skill bodies #6312, for atask_awaitread of a long workspace-turn report. Acode_executionprojection that drops the paging marker does not count as delivered, so the owner still wakes with the full report.reportsentries. The join handlers are aMap, so a persisted tool name such as__proto__finds no handler instead of throwing.Validation
Each change has a test that fails with its fix reverted. The tests that check refusals pass on the old code too, so I proved them against deliberately looser versions of the check instead.
task_awaitwith the returned offset joins back to the exact report. A long workspace-turn report keeps its supersede note.structuredOutput, and later pages do not. That includes an empty report read at a positive offset.code_executionprojection without its marker.nullreportsentries, or with__proto__andconstructortool rows, still renders and joins.Risks
Medium. The change touches tool-result shapes, the renderer's report join, and how completion notifications are consumed.
main.Generated with
xum• Model:anthropic:claude-opus-5-5• Thinking:high• Cost:$302.52