fix(server): stop surfacing Claude 'task_updated' messages as work-log errors - #3741

Closed
t3dotgg wants to merge 3 commits into
mainfrom
t3code/claude-binding-error
Closed

fix(server): stop surfacing Claude 'task_updated' messages as work-log errors#3741
t3dotgg wants to merge 3 commits into
mainfrom
t3code/claude-binding-error

Conversation

@t3dotgg

@t3dotggt3dotgg commented Jul 6, 2026

Copy link
Copy Markdown
Member

What Changed

Added a task_updated case to the Claude adapter's system-message switch so the message is absorbed instead of falling into the unknown-message default, which rendered it as a red-X "Claude system message 'task_updated'" error row in the work log.

image

Why

The Claude Agent SDK emits system/task_updated as a task-state sync patch — per the SDK's own typings, "clients merge into their local task map." It's not a loggable event, and every status patch observed in practice is redundant with task_notification (which the adapter already maps to task.completed). So users saw a scary error on every background-task status change for a message that carries no user-facing information. The raw payload is still captured in the provider log file for debugging.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

🤖 Generated with Claude Code


Note

Low Risk
Narrow adapter behavior change with a focused regression test; no auth, data, or API surface changes.

Overview
Stops treating Claude system/task_updated as an unknown system message that showed up as work-log errors (runtime.warning).

The Claude adapter now no-ops on task_updated in the system-message switch (same idea as thinking_tokens): no runtime event is emitted because these messages are SDK task-map sync patches, while user-visible terminal state still comes from task_notification / existing task_progress handling.

A harness test emits task_updated plus task_progress and asserts noruntime.warning and that task.progress still appears.

Reviewed by Cursor Bugbot for commit f315a42. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix ClaudeAdapter to ignore task_updated system messages instead of emitting runtime warnings

Claude sends task_updated system messages as task-state sync patches, but the adapter was previously surfacing them as runtime.warning events. An explicit task_updated case is added to the message-handling switch in ClaudeAdapter.ts that returns immediately without enqueuing any event.

Macroscope summarized f315a42.

Summary by CodeRabbit

  • Bug Fixes
    • Improved handling of Claude system updates so a task_updated event no longer triggers an unexpected warning.
    • Client task state now stays in sync more cleanly without producing any extra user-visible events.

…g errors
The Claude Agent SDK emits system/task_updated as a task-state sync
patch (per its typings, clients merge it into their local task map).
The adapter's system-message switch had no case for it, so it fell
into the unknown-message default and showed up in the work log as a
red-X 'Claude system message' row on every background task status
change. Terminal statuses already arrive via task_notification, so
absorb the message silently; the raw payload remains in the provider
log file.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitaiBot commented Jul 6, 2026

Copy link
Copy Markdown
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
Title check✅ PassedThe title clearly summarizes the server-side fix for Claude task_updated messages surfacing as work-log errors.
Description check✅ PassedThe description covers what changed, why, and includes the checklist; the missing UI section is acceptable for a non-UI fix.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3code/claude-binding-error

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Jul 6, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 6, 2026
@macroscopeapp

macroscopeappBot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

The production code change is straightforward, but there's an unresolved high-severity comment indicating the new test may hang due to expecting 6 events when only 5 are produced. This test issue should be addressed before merging.

You can customize Macroscope's approvability policy. Learn more.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
apps/server/src/provider/Layers/ClaudeAdapter.ts (1)

2744-2748: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add regression test for task_updated silent handling.

Since the bug being fixed was exactly this subtype falling into the default branch and emitting a runtime.warning (surfaced as an error row), a test asserting no runtime event/warning is emitted for task_updated would guard against regression. The existing task_progress test at ClaudeAdapter.test.ts:1682-1700 is a good template to adapt.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@apps/server/src/provider/Layers/ClaudeAdapter.ts` around lines 2744 - 2748,
Add a regression test for ClaudeAdapter’s `task_updated` handling so it does not
fall through to the `default` branch or emit a `runtime.warning`. Mirror the
existing `task_progress` case in `ClaudeAdapter.test.ts` and assert that
`task_updated` is handled silently with no runtime event or warning surfaced.
Use the `task_updated` switch branch in `ClaudeAdapter` and the relevant
runtime/warning assertions in the test suite to anchor the new case.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@apps/server/src/provider/Layers/ClaudeAdapter.ts`:
- Around line 2744-2748: Add a regression test for ClaudeAdapter’s
`task_updated` handling so it does not fall through to the `default` branch or
emit a `runtime.warning`. Mirror the existing `task_progress` case in
`ClaudeAdapter.test.ts` and assert that `task_updated` is handled silently with
no runtime event or warning surfaced. Use the `task_updated` switch branch in
`ClaudeAdapter` and the relevant runtime/warning assertions in the test suite to
anchor the new case.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: ca86c5b4-8fae-4d67-8211-11b6ff093fef

📥 Commits

Reviewing files that changed from the base of the PR and between 32e7844 and e62609b.

📒 Files selected for processing (1)
  • apps/server/src/provider/Layers/ClaudeAdapter.ts

@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 17, 2026 19:31

Dismissing prior approval to re-evaluate f315a42

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit f315a42. Configure here.

uuid: "task-progress-after-update-1",
} as unknown as SDKMessage);

const runtimeEvents = Array.from(yield* Fiber.join(runtimeEventsFiber));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Test stream take count too high

High Severity

The new test does not surface Claude task_updated messages as runtime warnings expects 6 events from adapter.streamEvents. However, only 5 events are produced in this scenario because task_updated messages are ignored and the task_progress message lacks usage data for a thread.token-usage.updated event. This prevents Stream.take(6) from completing, causing the test to hang.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit f315a42. Configure here.

@t3dotgg

Copy link
Copy Markdown
MemberAuthor

Closing as superseded by #4244. Main now explicitly consumes task_updated and background_tasks_changed without surfacing warning rows, and this branch also retains the hanging event-count test finding.

@t3dotggt3dotgg closed this Jul 30, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS0-9 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@t3dotgg@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(server): stop surfacing Claude 'task_updated' messages as work-log errors - #3741

Closed
t3dotgg wants to merge 3 commits into
mainfrom
t3code/claude-binding-error
Closed

fix(server): stop surfacing Claude 'task_updated' messages as work-log errors#3741
t3dotgg wants to merge 3 commits into
mainfrom
t3code/claude-binding-error

Conversation

@t3dotgg

@t3dotggt3dotgg commented Jul 6, 2026

Copy link
Copy Markdown
Member

What Changed

Added a task_updated case to the Claude adapter's system-message switch so the message is absorbed instead of falling into the unknown-message default, which rendered it as a red-X "Claude system message 'task_updated'" error row in the work log.

image

Why

The Claude Agent SDK emits system/task_updated as a task-state sync patch — per the SDK's own typings, "clients merge into their local task map." It's not a loggable event, and every status patch observed in practice is redundant with task_notification (which the adapter already maps to task.completed). So users saw a scary error on every background-task status change for a message that carries no user-facing information. The raw payload is still captured in the provider log file for debugging.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

🤖 Generated with Claude Code


Note

Low Risk
Narrow adapter behavior change with a focused regression test; no auth, data, or API surface changes.

Overview
Stops treating Claude system/task_updated as an unknown system message that showed up as work-log errors (runtime.warning).

The Claude adapter now no-ops on task_updated in the system-message switch (same idea as thinking_tokens): no runtime event is emitted because these messages are SDK task-map sync patches, while user-visible terminal state still comes from task_notification / existing task_progress handling.

A harness test emits task_updated plus task_progress and asserts noruntime.warning and that task.progress still appears.

Reviewed by Cursor Bugbot for commit f315a42. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix ClaudeAdapter to ignore task_updated system messages instead of emitting runtime warnings

Claude sends task_updated system messages as task-state sync patches, but the adapter was previously surfacing them as runtime.warning events. An explicit task_updated case is added to the message-handling switch in ClaudeAdapter.ts that returns immediately without enqueuing any event.

Macroscope summarized f315a42.

Summary by CodeRabbit

  • Bug Fixes
    • Improved handling of Claude system updates so a task_updated event no longer triggers an unexpected warning.
    • Client task state now stays in sync more cleanly without producing any extra user-visible events.

…g errors
The Claude Agent SDK emits system/task_updated as a task-state sync
patch (per its typings, clients merge it into their local task map).
The adapter's system-message switch had no case for it, so it fell
into the unknown-message default and showed up in the work log as a
red-X 'Claude system message' row on every background task status
change. Terminal statuses already arrive via task_notification, so
absorb the message silently; the raw payload remains in the provider
log file.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitaiBot commented Jul 6, 2026

Copy link
Copy Markdown
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
Title check✅ PassedThe title clearly summarizes the server-side fix for Claude task_updated messages surfacing as work-log errors.
Description check✅ PassedThe description covers what changed, why, and includes the checklist; the missing UI section is acceptable for a non-UI fix.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3code/claude-binding-error

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Jul 6, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 6, 2026
@macroscopeapp

macroscopeappBot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

The production code change is straightforward, but there's an unresolved high-severity comment indicating the new test may hang due to expecting 6 events when only 5 are produced. This test issue should be addressed before merging.

You can customize Macroscope's approvability policy. Learn more.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
apps/server/src/provider/Layers/ClaudeAdapter.ts (1)

2744-2748: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add regression test for task_updated silent handling.

Since the bug being fixed was exactly this subtype falling into the default branch and emitting a runtime.warning (surfaced as an error row), a test asserting no runtime event/warning is emitted for task_updated would guard against regression. The existing task_progress test at ClaudeAdapter.test.ts:1682-1700 is a good template to adapt.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@apps/server/src/provider/Layers/ClaudeAdapter.ts` around lines 2744 - 2748,
Add a regression test for ClaudeAdapter’s `task_updated` handling so it does not
fall through to the `default` branch or emit a `runtime.warning`. Mirror the
existing `task_progress` case in `ClaudeAdapter.test.ts` and assert that
`task_updated` is handled silently with no runtime event or warning surfaced.
Use the `task_updated` switch branch in `ClaudeAdapter` and the relevant
runtime/warning assertions in the test suite to anchor the new case.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@apps/server/src/provider/Layers/ClaudeAdapter.ts`:
- Around line 2744-2748: Add a regression test for ClaudeAdapter’s
`task_updated` handling so it does not fall through to the `default` branch or
emit a `runtime.warning`. Mirror the existing `task_progress` case in
`ClaudeAdapter.test.ts` and assert that `task_updated` is handled silently with
no runtime event or warning surfaced. Use the `task_updated` switch branch in
`ClaudeAdapter` and the relevant runtime/warning assertions in the test suite to
anchor the new case.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: ca86c5b4-8fae-4d67-8211-11b6ff093fef

📥 Commits

Reviewing files that changed from the base of the PR and between 32e7844 and e62609b.

📒 Files selected for processing (1)
  • apps/server/src/provider/Layers/ClaudeAdapter.ts

@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 17, 2026 19:31

Dismissing prior approval to re-evaluate f315a42

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit f315a42. Configure here.

uuid: "task-progress-after-update-1",
} as unknown as SDKMessage);

const runtimeEvents = Array.from(yield* Fiber.join(runtimeEventsFiber));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Test stream take count too high

High Severity

The new test does not surface Claude task_updated messages as runtime warnings expects 6 events from adapter.streamEvents. However, only 5 events are produced in this scenario because task_updated messages are ignored and the task_progress message lacks usage data for a thread.token-usage.updated event. This prevents Stream.take(6) from completing, causing the test to hang.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit f315a42. Configure here.

@t3dotgg

Copy link
Copy Markdown
MemberAuthor

Closing as superseded by #4244. Main now explicitly consumes task_updated and background_tasks_changed without surfacing warning rows, and this branch also retains the hanging event-count test finding.

@t3dotggt3dotgg closed this Jul 30, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS0-9 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@t3dotgg@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(server): stop surfacing Claude 'task_updated' messages as work-log errors - #3741

Closed
t3dotgg wants to merge 3 commits into
mainfrom
t3code/claude-binding-error
Closed

fix(server): stop surfacing Claude 'task_updated' messages as work-log errors#3741
t3dotgg wants to merge 3 commits into
mainfrom
t3code/claude-binding-error

Conversation

@t3dotgg

@t3dotggt3dotgg commented Jul 6, 2026

Copy link
Copy Markdown
Member

What Changed

Added a task_updated case to the Claude adapter's system-message switch so the message is absorbed instead of falling into the unknown-message default, which rendered it as a red-X "Claude system message 'task_updated'" error row in the work log.

image

Why

The Claude Agent SDK emits system/task_updated as a task-state sync patch — per the SDK's own typings, "clients merge into their local task map." It's not a loggable event, and every status patch observed in practice is redundant with task_notification (which the adapter already maps to task.completed). So users saw a scary error on every background-task status change for a message that carries no user-facing information. The raw payload is still captured in the provider log file for debugging.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

🤖 Generated with Claude Code


Note

Low Risk
Narrow adapter behavior change with a focused regression test; no auth, data, or API surface changes.

Overview
Stops treating Claude system/task_updated as an unknown system message that showed up as work-log errors (runtime.warning).

The Claude adapter now no-ops on task_updated in the system-message switch (same idea as thinking_tokens): no runtime event is emitted because these messages are SDK task-map sync patches, while user-visible terminal state still comes from task_notification / existing task_progress handling.

A harness test emits task_updated plus task_progress and asserts noruntime.warning and that task.progress still appears.

Reviewed by Cursor Bugbot for commit f315a42. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix ClaudeAdapter to ignore task_updated system messages instead of emitting runtime warnings

Claude sends task_updated system messages as task-state sync patches, but the adapter was previously surfacing them as runtime.warning events. An explicit task_updated case is added to the message-handling switch in ClaudeAdapter.ts that returns immediately without enqueuing any event.

Macroscope summarized f315a42.

Summary by CodeRabbit

  • Bug Fixes
    • Improved handling of Claude system updates so a task_updated event no longer triggers an unexpected warning.
    • Client task state now stays in sync more cleanly without producing any extra user-visible events.

…g errors
The Claude Agent SDK emits system/task_updated as a task-state sync
patch (per its typings, clients merge it into their local task map).
The adapter's system-message switch had no case for it, so it fell
into the unknown-message default and showed up in the work log as a
red-X 'Claude system message' row on every background task status
change. Terminal statuses already arrive via task_notification, so
absorb the message silently; the raw payload remains in the provider
log file.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitaiBot commented Jul 6, 2026

Copy link
Copy Markdown
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
Title check✅ PassedThe title clearly summarizes the server-side fix for Claude task_updated messages surfacing as work-log errors.
Description check✅ PassedThe description covers what changed, why, and includes the checklist; the missing UI section is acceptable for a non-UI fix.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3code/claude-binding-error

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Jul 6, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 6, 2026
@macroscopeapp

macroscopeappBot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

The production code change is straightforward, but there's an unresolved high-severity comment indicating the new test may hang due to expecting 6 events when only 5 are produced. This test issue should be addressed before merging.

You can customize Macroscope's approvability policy. Learn more.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
apps/server/src/provider/Layers/ClaudeAdapter.ts (1)

2744-2748: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add regression test for task_updated silent handling.

Since the bug being fixed was exactly this subtype falling into the default branch and emitting a runtime.warning (surfaced as an error row), a test asserting no runtime event/warning is emitted for task_updated would guard against regression. The existing task_progress test at ClaudeAdapter.test.ts:1682-1700 is a good template to adapt.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@apps/server/src/provider/Layers/ClaudeAdapter.ts` around lines 2744 - 2748,
Add a regression test for ClaudeAdapter’s `task_updated` handling so it does not
fall through to the `default` branch or emit a `runtime.warning`. Mirror the
existing `task_progress` case in `ClaudeAdapter.test.ts` and assert that
`task_updated` is handled silently with no runtime event or warning surfaced.
Use the `task_updated` switch branch in `ClaudeAdapter` and the relevant
runtime/warning assertions in the test suite to anchor the new case.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@apps/server/src/provider/Layers/ClaudeAdapter.ts`:
- Around line 2744-2748: Add a regression test for ClaudeAdapter’s
`task_updated` handling so it does not fall through to the `default` branch or
emit a `runtime.warning`. Mirror the existing `task_progress` case in
`ClaudeAdapter.test.ts` and assert that `task_updated` is handled silently with
no runtime event or warning surfaced. Use the `task_updated` switch branch in
`ClaudeAdapter` and the relevant runtime/warning assertions in the test suite to
anchor the new case.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: ca86c5b4-8fae-4d67-8211-11b6ff093fef

📥 Commits

Reviewing files that changed from the base of the PR and between 32e7844 and e62609b.

📒 Files selected for processing (1)
  • apps/server/src/provider/Layers/ClaudeAdapter.ts

@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 17, 2026 19:31

Dismissing prior approval to re-evaluate f315a42

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit f315a42. Configure here.

uuid: "task-progress-after-update-1",
} as unknown as SDKMessage);

const runtimeEvents = Array.from(yield* Fiber.join(runtimeEventsFiber));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Test stream take count too high

High Severity

The new test does not surface Claude task_updated messages as runtime warnings expects 6 events from adapter.streamEvents. However, only 5 events are produced in this scenario because task_updated messages are ignored and the task_progress message lacks usage data for a thread.token-usage.updated event. This prevents Stream.take(6) from completing, causing the test to hang.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit f315a42. Configure here.

@t3dotgg

Copy link
Copy Markdown
MemberAuthor

Closing as superseded by #4244. Main now explicitly consumes task_updated and background_tasks_changed without surfacing warning rows, and this branch also retains the hanging event-count test finding.

@t3dotggt3dotgg closed this Jul 30, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS0-9 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@t3dotgg@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(server): stop surfacing Claude 'task_updated' messages as work-log errors - #3741

Closed
t3dotgg wants to merge 3 commits into
mainfrom
t3code/claude-binding-error
Closed

fix(server): stop surfacing Claude 'task_updated' messages as work-log errors#3741
t3dotgg wants to merge 3 commits into
mainfrom
t3code/claude-binding-error

Conversation

@t3dotgg

@t3dotggt3dotgg commented Jul 6, 2026

Copy link
Copy Markdown
Member

What Changed

Added a task_updated case to the Claude adapter's system-message switch so the message is absorbed instead of falling into the unknown-message default, which rendered it as a red-X "Claude system message 'task_updated'" error row in the work log.

image

Why

The Claude Agent SDK emits system/task_updated as a task-state sync patch — per the SDK's own typings, "clients merge into their local task map." It's not a loggable event, and every status patch observed in practice is redundant with task_notification (which the adapter already maps to task.completed). So users saw a scary error on every background-task status change for a message that carries no user-facing information. The raw payload is still captured in the provider log file for debugging.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

🤖 Generated with Claude Code


Note

Low Risk
Narrow adapter behavior change with a focused regression test; no auth, data, or API surface changes.

Overview
Stops treating Claude system/task_updated as an unknown system message that showed up as work-log errors (runtime.warning).

The Claude adapter now no-ops on task_updated in the system-message switch (same idea as thinking_tokens): no runtime event is emitted because these messages are SDK task-map sync patches, while user-visible terminal state still comes from task_notification / existing task_progress handling.

A harness test emits task_updated plus task_progress and asserts noruntime.warning and that task.progress still appears.

Reviewed by Cursor Bugbot for commit f315a42. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix ClaudeAdapter to ignore task_updated system messages instead of emitting runtime warnings

Claude sends task_updated system messages as task-state sync patches, but the adapter was previously surfacing them as runtime.warning events. An explicit task_updated case is added to the message-handling switch in ClaudeAdapter.ts that returns immediately without enqueuing any event.

Macroscope summarized f315a42.

Summary by CodeRabbit

  • Bug Fixes
    • Improved handling of Claude system updates so a task_updated event no longer triggers an unexpected warning.
    • Client task state now stays in sync more cleanly without producing any extra user-visible events.

…g errors
The Claude Agent SDK emits system/task_updated as a task-state sync
patch (per its typings, clients merge it into their local task map).
The adapter's system-message switch had no case for it, so it fell
into the unknown-message default and showed up in the work log as a
red-X 'Claude system message' row on every background task status
change. Terminal statuses already arrive via task_notification, so
absorb the message silently; the raw payload remains in the provider
log file.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitaiBot commented Jul 6, 2026

Copy link
Copy Markdown
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
Title check✅ PassedThe title clearly summarizes the server-side fix for Claude task_updated messages surfacing as work-log errors.
Description check✅ PassedThe description covers what changed, why, and includes the checklist; the missing UI section is acceptable for a non-UI fix.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3code/claude-binding-error

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Jul 6, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 6, 2026
@macroscopeapp

macroscopeappBot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

The production code change is straightforward, but there's an unresolved high-severity comment indicating the new test may hang due to expecting 6 events when only 5 are produced. This test issue should be addressed before merging.

You can customize Macroscope's approvability policy. Learn more.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
apps/server/src/provider/Layers/ClaudeAdapter.ts (1)

2744-2748: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add regression test for task_updated silent handling.

Since the bug being fixed was exactly this subtype falling into the default branch and emitting a runtime.warning (surfaced as an error row), a test asserting no runtime event/warning is emitted for task_updated would guard against regression. The existing task_progress test at ClaudeAdapter.test.ts:1682-1700 is a good template to adapt.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@apps/server/src/provider/Layers/ClaudeAdapter.ts` around lines 2744 - 2748,
Add a regression test for ClaudeAdapter’s `task_updated` handling so it does not
fall through to the `default` branch or emit a `runtime.warning`. Mirror the
existing `task_progress` case in `ClaudeAdapter.test.ts` and assert that
`task_updated` is handled silently with no runtime event or warning surfaced.
Use the `task_updated` switch branch in `ClaudeAdapter` and the relevant
runtime/warning assertions in the test suite to anchor the new case.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@apps/server/src/provider/Layers/ClaudeAdapter.ts`:
- Around line 2744-2748: Add a regression test for ClaudeAdapter’s
`task_updated` handling so it does not fall through to the `default` branch or
emit a `runtime.warning`. Mirror the existing `task_progress` case in
`ClaudeAdapter.test.ts` and assert that `task_updated` is handled silently with
no runtime event or warning surfaced. Use the `task_updated` switch branch in
`ClaudeAdapter` and the relevant runtime/warning assertions in the test suite to
anchor the new case.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: ca86c5b4-8fae-4d67-8211-11b6ff093fef

📥 Commits

Reviewing files that changed from the base of the PR and between 32e7844 and e62609b.

📒 Files selected for processing (1)
  • apps/server/src/provider/Layers/ClaudeAdapter.ts

@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 17, 2026 19:31

Dismissing prior approval to re-evaluate f315a42

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit f315a42. Configure here.

uuid: "task-progress-after-update-1",
} as unknown as SDKMessage);

const runtimeEvents = Array.from(yield* Fiber.join(runtimeEventsFiber));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Test stream take count too high

High Severity

The new test does not surface Claude task_updated messages as runtime warnings expects 6 events from adapter.streamEvents. However, only 5 events are produced in this scenario because task_updated messages are ignored and the task_progress message lacks usage data for a thread.token-usage.updated event. This prevents Stream.take(6) from completing, causing the test to hang.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit f315a42. Configure here.

@t3dotgg

Copy link
Copy Markdown
MemberAuthor

Closing as superseded by #4244. Main now explicitly consumes task_updated and background_tasks_changed without surfacing warning rows, and this branch also retains the hanging event-count test finding.

@t3dotggt3dotgg closed this Jul 30, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS0-9 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@t3dotgg@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(server): stop surfacing Claude 'task_updated' messages as work-log errors - #3741

Closed
t3dotgg wants to merge 3 commits into
mainfrom
t3code/claude-binding-error
Closed

fix(server): stop surfacing Claude 'task_updated' messages as work-log errors#3741
t3dotgg wants to merge 3 commits into
mainfrom
t3code/claude-binding-error

Conversation

@t3dotgg

@t3dotggt3dotgg commented Jul 6, 2026

Copy link
Copy Markdown
Member

What Changed

Added a task_updated case to the Claude adapter's system-message switch so the message is absorbed instead of falling into the unknown-message default, which rendered it as a red-X "Claude system message 'task_updated'" error row in the work log.

image

Why

The Claude Agent SDK emits system/task_updated as a task-state sync patch — per the SDK's own typings, "clients merge into their local task map." It's not a loggable event, and every status patch observed in practice is redundant with task_notification (which the adapter already maps to task.completed). So users saw a scary error on every background-task status change for a message that carries no user-facing information. The raw payload is still captured in the provider log file for debugging.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

🤖 Generated with Claude Code


Note

Low Risk
Narrow adapter behavior change with a focused regression test; no auth, data, or API surface changes.

Overview
Stops treating Claude system/task_updated as an unknown system message that showed up as work-log errors (runtime.warning).

The Claude adapter now no-ops on task_updated in the system-message switch (same idea as thinking_tokens): no runtime event is emitted because these messages are SDK task-map sync patches, while user-visible terminal state still comes from task_notification / existing task_progress handling.

A harness test emits task_updated plus task_progress and asserts noruntime.warning and that task.progress still appears.

Reviewed by Cursor Bugbot for commit f315a42. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix ClaudeAdapter to ignore task_updated system messages instead of emitting runtime warnings

Claude sends task_updated system messages as task-state sync patches, but the adapter was previously surfacing them as runtime.warning events. An explicit task_updated case is added to the message-handling switch in ClaudeAdapter.ts that returns immediately without enqueuing any event.

Macroscope summarized f315a42.

Summary by CodeRabbit

  • Bug Fixes
    • Improved handling of Claude system updates so a task_updated event no longer triggers an unexpected warning.
    • Client task state now stays in sync more cleanly without producing any extra user-visible events.

…g errors
The Claude Agent SDK emits system/task_updated as a task-state sync
patch (per its typings, clients merge it into their local task map).
The adapter's system-message switch had no case for it, so it fell
into the unknown-message default and showed up in the work log as a
red-X 'Claude system message' row on every background task status
change. Terminal statuses already arrive via task_notification, so
absorb the message silently; the raw payload remains in the provider
log file.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitaiBot commented Jul 6, 2026

Copy link
Copy Markdown
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
Title check✅ PassedThe title clearly summarizes the server-side fix for Claude task_updated messages surfacing as work-log errors.
Description check✅ PassedThe description covers what changed, why, and includes the checklist; the missing UI section is acceptable for a non-UI fix.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3code/claude-binding-error

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Jul 6, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 6, 2026
@macroscopeapp

macroscopeappBot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

The production code change is straightforward, but there's an unresolved high-severity comment indicating the new test may hang due to expecting 6 events when only 5 are produced. This test issue should be addressed before merging.

You can customize Macroscope's approvability policy. Learn more.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
apps/server/src/provider/Layers/ClaudeAdapter.ts (1)

2744-2748: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add regression test for task_updated silent handling.

Since the bug being fixed was exactly this subtype falling into the default branch and emitting a runtime.warning (surfaced as an error row), a test asserting no runtime event/warning is emitted for task_updated would guard against regression. The existing task_progress test at ClaudeAdapter.test.ts:1682-1700 is a good template to adapt.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@apps/server/src/provider/Layers/ClaudeAdapter.ts` around lines 2744 - 2748,
Add a regression test for ClaudeAdapter’s `task_updated` handling so it does not
fall through to the `default` branch or emit a `runtime.warning`. Mirror the
existing `task_progress` case in `ClaudeAdapter.test.ts` and assert that
`task_updated` is handled silently with no runtime event or warning surfaced.
Use the `task_updated` switch branch in `ClaudeAdapter` and the relevant
runtime/warning assertions in the test suite to anchor the new case.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@apps/server/src/provider/Layers/ClaudeAdapter.ts`:
- Around line 2744-2748: Add a regression test for ClaudeAdapter’s
`task_updated` handling so it does not fall through to the `default` branch or
emit a `runtime.warning`. Mirror the existing `task_progress` case in
`ClaudeAdapter.test.ts` and assert that `task_updated` is handled silently with
no runtime event or warning surfaced. Use the `task_updated` switch branch in
`ClaudeAdapter` and the relevant runtime/warning assertions in the test suite to
anchor the new case.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: ca86c5b4-8fae-4d67-8211-11b6ff093fef

📥 Commits

Reviewing files that changed from the base of the PR and between 32e7844 and e62609b.

📒 Files selected for processing (1)
  • apps/server/src/provider/Layers/ClaudeAdapter.ts

@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 17, 2026 19:31

Dismissing prior approval to re-evaluate f315a42

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit f315a42. Configure here.

uuid: "task-progress-after-update-1",
} as unknown as SDKMessage);

const runtimeEvents = Array.from(yield* Fiber.join(runtimeEventsFiber));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Test stream take count too high

High Severity

The new test does not surface Claude task_updated messages as runtime warnings expects 6 events from adapter.streamEvents. However, only 5 events are produced in this scenario because task_updated messages are ignored and the task_progress message lacks usage data for a thread.token-usage.updated event. This prevents Stream.take(6) from completing, causing the test to hang.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit f315a42. Configure here.

@t3dotgg

Copy link
Copy Markdown
MemberAuthor

Closing as superseded by #4244. Main now explicitly consumes task_updated and background_tasks_changed without surfacing warning rows, and this branch also retains the hanging event-count test finding.

@t3dotggt3dotgg closed this Jul 30, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS0-9 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@t3dotgg@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(server): stop surfacing Claude 'task_updated' messages as work-log errors - #3741

Closed
t3dotgg wants to merge 3 commits into
mainfrom
t3code/claude-binding-error
Closed

fix(server): stop surfacing Claude 'task_updated' messages as work-log errors#3741
t3dotgg wants to merge 3 commits into
mainfrom
t3code/claude-binding-error

Conversation

@t3dotgg

@t3dotggt3dotgg commented Jul 6, 2026

Copy link
Copy Markdown
Member

What Changed

Added a task_updated case to the Claude adapter's system-message switch so the message is absorbed instead of falling into the unknown-message default, which rendered it as a red-X "Claude system message 'task_updated'" error row in the work log.

image

Why

The Claude Agent SDK emits system/task_updated as a task-state sync patch — per the SDK's own typings, "clients merge into their local task map." It's not a loggable event, and every status patch observed in practice is redundant with task_notification (which the adapter already maps to task.completed). So users saw a scary error on every background-task status change for a message that carries no user-facing information. The raw payload is still captured in the provider log file for debugging.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

🤖 Generated with Claude Code


Note

Low Risk
Narrow adapter behavior change with a focused regression test; no auth, data, or API surface changes.

Overview
Stops treating Claude system/task_updated as an unknown system message that showed up as work-log errors (runtime.warning).

The Claude adapter now no-ops on task_updated in the system-message switch (same idea as thinking_tokens): no runtime event is emitted because these messages are SDK task-map sync patches, while user-visible terminal state still comes from task_notification / existing task_progress handling.

A harness test emits task_updated plus task_progress and asserts noruntime.warning and that task.progress still appears.

Reviewed by Cursor Bugbot for commit f315a42. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix ClaudeAdapter to ignore task_updated system messages instead of emitting runtime warnings

Claude sends task_updated system messages as task-state sync patches, but the adapter was previously surfacing them as runtime.warning events. An explicit task_updated case is added to the message-handling switch in ClaudeAdapter.ts that returns immediately without enqueuing any event.

Macroscope summarized f315a42.

Summary by CodeRabbit

  • Bug Fixes
    • Improved handling of Claude system updates so a task_updated event no longer triggers an unexpected warning.
    • Client task state now stays in sync more cleanly without producing any extra user-visible events.

…g errors
The Claude Agent SDK emits system/task_updated as a task-state sync
patch (per its typings, clients merge it into their local task map).
The adapter's system-message switch had no case for it, so it fell
into the unknown-message default and showed up in the work log as a
red-X 'Claude system message' row on every background task status
change. Terminal statuses already arrive via task_notification, so
absorb the message silently; the raw payload remains in the provider
log file.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitaiBot commented Jul 6, 2026

Copy link
Copy Markdown
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
Title check✅ PassedThe title clearly summarizes the server-side fix for Claude task_updated messages surfacing as work-log errors.
Description check✅ PassedThe description covers what changed, why, and includes the checklist; the missing UI section is acceptable for a non-UI fix.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3code/claude-binding-error

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Jul 6, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 6, 2026
@macroscopeapp

macroscopeappBot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

The production code change is straightforward, but there's an unresolved high-severity comment indicating the new test may hang due to expecting 6 events when only 5 are produced. This test issue should be addressed before merging.

You can customize Macroscope's approvability policy. Learn more.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
apps/server/src/provider/Layers/ClaudeAdapter.ts (1)

2744-2748: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add regression test for task_updated silent handling.

Since the bug being fixed was exactly this subtype falling into the default branch and emitting a runtime.warning (surfaced as an error row), a test asserting no runtime event/warning is emitted for task_updated would guard against regression. The existing task_progress test at ClaudeAdapter.test.ts:1682-1700 is a good template to adapt.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@apps/server/src/provider/Layers/ClaudeAdapter.ts` around lines 2744 - 2748,
Add a regression test for ClaudeAdapter’s `task_updated` handling so it does not
fall through to the `default` branch or emit a `runtime.warning`. Mirror the
existing `task_progress` case in `ClaudeAdapter.test.ts` and assert that
`task_updated` is handled silently with no runtime event or warning surfaced.
Use the `task_updated` switch branch in `ClaudeAdapter` and the relevant
runtime/warning assertions in the test suite to anchor the new case.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@apps/server/src/provider/Layers/ClaudeAdapter.ts`:
- Around line 2744-2748: Add a regression test for ClaudeAdapter’s
`task_updated` handling so it does not fall through to the `default` branch or
emit a `runtime.warning`. Mirror the existing `task_progress` case in
`ClaudeAdapter.test.ts` and assert that `task_updated` is handled silently with
no runtime event or warning surfaced. Use the `task_updated` switch branch in
`ClaudeAdapter` and the relevant runtime/warning assertions in the test suite to
anchor the new case.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: ca86c5b4-8fae-4d67-8211-11b6ff093fef

📥 Commits

Reviewing files that changed from the base of the PR and between 32e7844 and e62609b.

📒 Files selected for processing (1)
  • apps/server/src/provider/Layers/ClaudeAdapter.ts

@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 17, 2026 19:31

Dismissing prior approval to re-evaluate f315a42

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit f315a42. Configure here.

uuid: "task-progress-after-update-1",
} as unknown as SDKMessage);

const runtimeEvents = Array.from(yield* Fiber.join(runtimeEventsFiber));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Test stream take count too high

High Severity

The new test does not surface Claude task_updated messages as runtime warnings expects 6 events from adapter.streamEvents. However, only 5 events are produced in this scenario because task_updated messages are ignored and the task_progress message lacks usage data for a thread.token-usage.updated event. This prevents Stream.take(6) from completing, causing the test to hang.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit f315a42. Configure here.

@t3dotgg

Copy link
Copy Markdown
MemberAuthor

Closing as superseded by #4244. Main now explicitly consumes task_updated and background_tasks_changed without surfacing warning rows, and this branch also retains the hanging event-count test finding.

@t3dotggt3dotgg closed this Jul 30, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS0-9 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@t3dotgg@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(server): stop surfacing Claude 'task_updated' messages as work-log errors - #3741

Closed
t3dotgg wants to merge 3 commits into
mainfrom
t3code/claude-binding-error
Closed

fix(server): stop surfacing Claude 'task_updated' messages as work-log errors#3741
t3dotgg wants to merge 3 commits into
mainfrom
t3code/claude-binding-error

Conversation

@t3dotgg

@t3dotggt3dotgg commented Jul 6, 2026

Copy link
Copy Markdown
Member

What Changed

Added a task_updated case to the Claude adapter's system-message switch so the message is absorbed instead of falling into the unknown-message default, which rendered it as a red-X "Claude system message 'task_updated'" error row in the work log.

image

Why

The Claude Agent SDK emits system/task_updated as a task-state sync patch — per the SDK's own typings, "clients merge into their local task map." It's not a loggable event, and every status patch observed in practice is redundant with task_notification (which the adapter already maps to task.completed). So users saw a scary error on every background-task status change for a message that carries no user-facing information. The raw payload is still captured in the provider log file for debugging.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

🤖 Generated with Claude Code


Note

Low Risk
Narrow adapter behavior change with a focused regression test; no auth, data, or API surface changes.

Overview
Stops treating Claude system/task_updated as an unknown system message that showed up as work-log errors (runtime.warning).

The Claude adapter now no-ops on task_updated in the system-message switch (same idea as thinking_tokens): no runtime event is emitted because these messages are SDK task-map sync patches, while user-visible terminal state still comes from task_notification / existing task_progress handling.

A harness test emits task_updated plus task_progress and asserts noruntime.warning and that task.progress still appears.

Reviewed by Cursor Bugbot for commit f315a42. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix ClaudeAdapter to ignore task_updated system messages instead of emitting runtime warnings

Claude sends task_updated system messages as task-state sync patches, but the adapter was previously surfacing them as runtime.warning events. An explicit task_updated case is added to the message-handling switch in ClaudeAdapter.ts that returns immediately without enqueuing any event.

Macroscope summarized f315a42.

Summary by CodeRabbit

  • Bug Fixes
    • Improved handling of Claude system updates so a task_updated event no longer triggers an unexpected warning.
    • Client task state now stays in sync more cleanly without producing any extra user-visible events.

…g errors
The Claude Agent SDK emits system/task_updated as a task-state sync
patch (per its typings, clients merge it into their local task map).
The adapter's system-message switch had no case for it, so it fell
into the unknown-message default and showed up in the work log as a
red-X 'Claude system message' row on every background task status
change. Terminal statuses already arrive via task_notification, so
absorb the message silently; the raw payload remains in the provider
log file.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitaiBot commented Jul 6, 2026

Copy link
Copy Markdown
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
Title check✅ PassedThe title clearly summarizes the server-side fix for Claude task_updated messages surfacing as work-log errors.
Description check✅ PassedThe description covers what changed, why, and includes the checklist; the missing UI section is acceptable for a non-UI fix.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3code/claude-binding-error

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Jul 6, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 6, 2026
@macroscopeapp

macroscopeappBot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

The production code change is straightforward, but there's an unresolved high-severity comment indicating the new test may hang due to expecting 6 events when only 5 are produced. This test issue should be addressed before merging.

You can customize Macroscope's approvability policy. Learn more.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
apps/server/src/provider/Layers/ClaudeAdapter.ts (1)

2744-2748: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add regression test for task_updated silent handling.

Since the bug being fixed was exactly this subtype falling into the default branch and emitting a runtime.warning (surfaced as an error row), a test asserting no runtime event/warning is emitted for task_updated would guard against regression. The existing task_progress test at ClaudeAdapter.test.ts:1682-1700 is a good template to adapt.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@apps/server/src/provider/Layers/ClaudeAdapter.ts` around lines 2744 - 2748,
Add a regression test for ClaudeAdapter’s `task_updated` handling so it does not
fall through to the `default` branch or emit a `runtime.warning`. Mirror the
existing `task_progress` case in `ClaudeAdapter.test.ts` and assert that
`task_updated` is handled silently with no runtime event or warning surfaced.
Use the `task_updated` switch branch in `ClaudeAdapter` and the relevant
runtime/warning assertions in the test suite to anchor the new case.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@apps/server/src/provider/Layers/ClaudeAdapter.ts`:
- Around line 2744-2748: Add a regression test for ClaudeAdapter’s
`task_updated` handling so it does not fall through to the `default` branch or
emit a `runtime.warning`. Mirror the existing `task_progress` case in
`ClaudeAdapter.test.ts` and assert that `task_updated` is handled silently with
no runtime event or warning surfaced. Use the `task_updated` switch branch in
`ClaudeAdapter` and the relevant runtime/warning assertions in the test suite to
anchor the new case.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: ca86c5b4-8fae-4d67-8211-11b6ff093fef

📥 Commits

Reviewing files that changed from the base of the PR and between 32e7844 and e62609b.

📒 Files selected for processing (1)
  • apps/server/src/provider/Layers/ClaudeAdapter.ts

@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 17, 2026 19:31

Dismissing prior approval to re-evaluate f315a42

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit f315a42. Configure here.

uuid: "task-progress-after-update-1",
} as unknown as SDKMessage);

const runtimeEvents = Array.from(yield* Fiber.join(runtimeEventsFiber));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Test stream take count too high

High Severity

The new test does not surface Claude task_updated messages as runtime warnings expects 6 events from adapter.streamEvents. However, only 5 events are produced in this scenario because task_updated messages are ignored and the task_progress message lacks usage data for a thread.token-usage.updated event. This prevents Stream.take(6) from completing, causing the test to hang.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit f315a42. Configure here.

@t3dotgg

Copy link
Copy Markdown
MemberAuthor

Closing as superseded by #4244. Main now explicitly consumes task_updated and background_tasks_changed without surfacing warning rows, and this branch also retains the hanging event-count test finding.

@t3dotggt3dotgg closed this Jul 30, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS0-9 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@t3dotgg@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(server): stop surfacing Claude 'task_updated' messages as work-log errors - #3741

Closed
t3dotgg wants to merge 3 commits into
mainfrom
t3code/claude-binding-error
Closed

fix(server): stop surfacing Claude 'task_updated' messages as work-log errors#3741
t3dotgg wants to merge 3 commits into
mainfrom
t3code/claude-binding-error

Conversation

@t3dotgg

@t3dotggt3dotgg commented Jul 6, 2026

Copy link
Copy Markdown
Member

What Changed

Added a task_updated case to the Claude adapter's system-message switch so the message is absorbed instead of falling into the unknown-message default, which rendered it as a red-X "Claude system message 'task_updated'" error row in the work log.

image

Why

The Claude Agent SDK emits system/task_updated as a task-state sync patch — per the SDK's own typings, "clients merge into their local task map." It's not a loggable event, and every status patch observed in practice is redundant with task_notification (which the adapter already maps to task.completed). So users saw a scary error on every background-task status change for a message that carries no user-facing information. The raw payload is still captured in the provider log file for debugging.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

🤖 Generated with Claude Code


Note

Low Risk
Narrow adapter behavior change with a focused regression test; no auth, data, or API surface changes.

Overview
Stops treating Claude system/task_updated as an unknown system message that showed up as work-log errors (runtime.warning).

The Claude adapter now no-ops on task_updated in the system-message switch (same idea as thinking_tokens): no runtime event is emitted because these messages are SDK task-map sync patches, while user-visible terminal state still comes from task_notification / existing task_progress handling.

A harness test emits task_updated plus task_progress and asserts noruntime.warning and that task.progress still appears.

Reviewed by Cursor Bugbot for commit f315a42. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix ClaudeAdapter to ignore task_updated system messages instead of emitting runtime warnings

Claude sends task_updated system messages as task-state sync patches, but the adapter was previously surfacing them as runtime.warning events. An explicit task_updated case is added to the message-handling switch in ClaudeAdapter.ts that returns immediately without enqueuing any event.

Macroscope summarized f315a42.

Summary by CodeRabbit

  • Bug Fixes
    • Improved handling of Claude system updates so a task_updated event no longer triggers an unexpected warning.
    • Client task state now stays in sync more cleanly without producing any extra user-visible events.

…g errors
The Claude Agent SDK emits system/task_updated as a task-state sync
patch (per its typings, clients merge it into their local task map).
The adapter's system-message switch had no case for it, so it fell
into the unknown-message default and showed up in the work log as a
red-X 'Claude system message' row on every background task status
change. Terminal statuses already arrive via task_notification, so
absorb the message silently; the raw payload remains in the provider
log file.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitaiBot commented Jul 6, 2026

Copy link
Copy Markdown
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
Title check✅ PassedThe title clearly summarizes the server-side fix for Claude task_updated messages surfacing as work-log errors.
Description check✅ PassedThe description covers what changed, why, and includes the checklist; the missing UI section is acceptable for a non-UI fix.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3code/claude-binding-error

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Jul 6, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 6, 2026
@macroscopeapp

macroscopeappBot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

The production code change is straightforward, but there's an unresolved high-severity comment indicating the new test may hang due to expecting 6 events when only 5 are produced. This test issue should be addressed before merging.

You can customize Macroscope's approvability policy. Learn more.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
apps/server/src/provider/Layers/ClaudeAdapter.ts (1)

2744-2748: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add regression test for task_updated silent handling.

Since the bug being fixed was exactly this subtype falling into the default branch and emitting a runtime.warning (surfaced as an error row), a test asserting no runtime event/warning is emitted for task_updated would guard against regression. The existing task_progress test at ClaudeAdapter.test.ts:1682-1700 is a good template to adapt.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@apps/server/src/provider/Layers/ClaudeAdapter.ts` around lines 2744 - 2748,
Add a regression test for ClaudeAdapter’s `task_updated` handling so it does not
fall through to the `default` branch or emit a `runtime.warning`. Mirror the
existing `task_progress` case in `ClaudeAdapter.test.ts` and assert that
`task_updated` is handled silently with no runtime event or warning surfaced.
Use the `task_updated` switch branch in `ClaudeAdapter` and the relevant
runtime/warning assertions in the test suite to anchor the new case.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@apps/server/src/provider/Layers/ClaudeAdapter.ts`:
- Around line 2744-2748: Add a regression test for ClaudeAdapter’s
`task_updated` handling so it does not fall through to the `default` branch or
emit a `runtime.warning`. Mirror the existing `task_progress` case in
`ClaudeAdapter.test.ts` and assert that `task_updated` is handled silently with
no runtime event or warning surfaced. Use the `task_updated` switch branch in
`ClaudeAdapter` and the relevant runtime/warning assertions in the test suite to
anchor the new case.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: ca86c5b4-8fae-4d67-8211-11b6ff093fef

📥 Commits

Reviewing files that changed from the base of the PR and between 32e7844 and e62609b.

📒 Files selected for processing (1)
  • apps/server/src/provider/Layers/ClaudeAdapter.ts

@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 17, 2026 19:31

Dismissing prior approval to re-evaluate f315a42

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit f315a42. Configure here.

uuid: "task-progress-after-update-1",
} as unknown as SDKMessage);

const runtimeEvents = Array.from(yield* Fiber.join(runtimeEventsFiber));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Test stream take count too high

High Severity

The new test does not surface Claude task_updated messages as runtime warnings expects 6 events from adapter.streamEvents. However, only 5 events are produced in this scenario because task_updated messages are ignored and the task_progress message lacks usage data for a thread.token-usage.updated event. This prevents Stream.take(6) from completing, causing the test to hang.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit f315a42. Configure here.

@t3dotgg

Copy link
Copy Markdown
MemberAuthor

Closing as superseded by #4244. Main now explicitly consumes task_updated and background_tasks_changed without surfacing warning rows, and this branch also retains the hanging event-count test finding.

@t3dotggt3dotgg closed this Jul 30, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS0-9 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@t3dotgg@juliusmarminge