fix(claude): report subagent model and effort - #7287

Open
lnieuwenhuis wants to merge 4 commits into
pingdotgg:mainfrom
lnieuwenhuis:dev/fix/subagent-model-attribution
Open

fix(claude): report subagent model and effort#7287
lnieuwenhuis wants to merge 4 commits into
pingdotgg:mainfrom
lnieuwenhuis:dev/fix/subagent-model-attribution

Conversation

@lnieuwenhuis

@lnieuwenhuislnieuwenhuis commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Problem

Claude file-defined subagents were seeded with the parent session's model and effort. The Agents panel therefore showed the parent settings for every subagent, and authoritative model snapshots that arrived late never reached the client.

Fix

  • leave subagent model and effort unknown unless the Agent launch explicitly overrides them
  • reconcile authoritative model snapshots before or after task.started
  • capture each subagent's effort through the SDK's typed SubagentStart and SubagentStop hooks
  • emit late identity corrections and bound pending refinements to avoid unbounded session growth
  • cover parent non-inheritance, event ordering, terminal-task correction, explicit overrides, and cache eviction

Verification

  • pnpm exec vp test run apps/server/src/provider/Layers/ClaudeAdapter.test.ts (74 passed)
  • pnpm exec vp test run packages/client-runtime/src/state/subagentRuntime.test.ts (48 passed)
  • pnpm exec vp run --filter t3 typecheck
  • targeted format, lint, diff, and changed-file secret checks

Fixes#7281

Model: GPT-5.6 Sol
Harness: Codex in T3 Code


Note

Medium Risk
Changes runtime task.* event payloads (model/effort may be undefined where they were previously inherited), which can affect UI and consumers that assumed parent session values.

Overview
Fixes misattributed subagent identity in ClaudeAdapter: file-defined agents no longer inherit the parent session’s model or effort on task.started when the Agent tool omits overrides.

Seeding and reconciliation now use only explicit Agent tool model/effort, buffered pre-start assistant snapshots, and SDK SubagentStart/SubagentStop hooks (effort.level). Pending state is merged as model+effort refinements (cap 256) instead of model-only buffers. Late snapshots or hook updates emit task.updated so the Agents panel can correct identity after a task completes.

Tests cover non-inheritance, ordering (snapshot before/after task_started), explicit overrides, late corrections, and eviction of unmatched pending snapshots.

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

Note

Fix subagent model and effort reporting in ClaudeAdapter

  • Adds invokeSubagentEffortHook test utility that retrieves and invokes the configured SubagentStart/SubagentStop callback with synthetic hook input containing session, agent, effort, and stop fields
  • Adds and updates tests in ClaudeAdapter.test.ts to verify subagent model and effort are no longer inferred from the parent session; instead they come from explicit Agent tool overrides, pre-start subagent snapshots, or hook effort — or remain undefined when none are available
  • Adds coverage for late subagent snapshots producing a task.updated correction after terminal events, and for eviction of the pending subagent snapshot buffer at 257 unmatched entries
  • Behavioral Change: file-defined subagents no longer inherit the parent session's model or effort; both fields are undefined unless an explicit override, snapshot, or hook supplies them

Macroscope summarized 1aeabb1.

@coderabbitai

coderabbitaiBot commented Aug 17, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 85bd484b-088d-4ed0-9fd2-ac17437dce64

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 17, 2026
@macroscopeapp

macroscopeappBot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — ClaudeAdapter now changes existing subagent event semantics and adds asynchronous SDK hook, buffering, and late-correction behavior that reaches persisted activity and the Agents panel. The scope is tested and does not alter model routing, but the cross-event production lifecycle changes warrant human review.

You can add or adjust custom eligibility rules. Learn more.

@t3dotggt3dotgg added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 24, 2026
…del-attribution
# Conflicts:
#	apps/server/src/provider/Layers/ClaudeAdapter.ts
@lnieuwenhuis

Copy link
Copy Markdown
ContributorAuthor

Merged current main and resolved the conflicts with #7583, which landed a narrower version of the snapshot/task_started race fix (model only, keyed by parent_tool_use_id). This branch's pending-refinement buffer subsumes that behavior, so I kept the refinement implementation and removed the now-redundant pendingTaskModels map.

Two notes for reviewers:

  • fix(server): keep the authoritative subagent model when snapshots race task_started #7583's new test ("a subagent snapshot that beats task_started still wins over the seed") asserted that a subagent with no explicit effort override inherits the parent session's effort. That inheritance is exactly the misattribution this PR removes, so the assertion now expects undefined; the model assertions (including propagation into task.progress) are unchanged, and effort attribution is covered by the SubagentStart-hook tests here.
  • Everything else merged cleanly. All 82 ClaudeAdapter tests pass locally.

@SamGu-NRX

Copy link
Copy Markdown

Independent reproduction, plus one data point on AgentInfo.model that may be useful here.

Prevalence. I compared the label on every local_agent task in my local event store against the model: each agent file declares, normalizing effort and [1m] suffixes. Over 241 tasks: 192 wrong at task_started (79%), and 35 still wrong at rest (14%) after snapshot refinement had its chance. One task recorded "model": "claude-opus-5" on task.started and "model": "gpt-5.6-luna" on task.progress seconds later, for the same task id, which matches your reading that routing was correct and only the label was wrong.

The 79%→14% gap is the part I found interesting: refinement does most of the work, so the residual is concentrated in children that never stream an assistant snapshot the parent sees.

One possible addition.query.supportedAgents() returns AgentInfo[], and AgentInfo.model is documented as "Model alias this agent uses. If omitted, inherits the parent's model" (sdk.d.ts:97-109). It resolves off the cached initialization result rather than a per-task control request. Probing my installed CLI 2.1.245:

claude (inherits)
Explore (inherits)
general-purpose (inherits)
Plan (inherits)
statusline-setup sonnet
theo-composer cursor/composer-2.5

That would give a launch-time value between an explicit Agent override and the parent fallback, so a definition-pinned agent starts with its own alias rather than blank, while genuinely inheriting agents still fall through. It is an alias, not the resolved API id, so your snapshot path would still be the authority that corrects it.

Worth noting the built-in defaults are version-sensitive: on the SDK-bundled 2.1.170 Explore reports haiku, but on 2.1.245 it inherits. So this helps custom agents much more than stock ones, and it does not reach effort at all, since AgentInfo has no effort field. It may well not be worth the extra surface here.

Composition. I have a separate fix for a different bug in this file, the parent context meter counting subagent tokens (#5942, PR #8453). I applied your branch and mine together on today's main: they typecheck, and the suite passes at 85 tests once three shared tests are reconciled. Only the test file collides; the source changes are independent. Happy to rebase mine whenever yours lands.

…l-attribution
# Conflicts:
#	apps/server/src/provider/Layers/ClaudeAdapter.test.ts
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 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.

Agents panel shows the parent session's model/effort for every subagent instead of the subagent's own

3 participants

@lnieuwenhuis@SamGu-NRX@t3dotgg
, '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(claude): report subagent model and effort - #7287

Open
lnieuwenhuis wants to merge 4 commits into
pingdotgg:mainfrom
lnieuwenhuis:dev/fix/subagent-model-attribution
Open

fix(claude): report subagent model and effort#7287
lnieuwenhuis wants to merge 4 commits into
pingdotgg:mainfrom
lnieuwenhuis:dev/fix/subagent-model-attribution

Conversation

@lnieuwenhuis

@lnieuwenhuislnieuwenhuis commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Problem

Claude file-defined subagents were seeded with the parent session's model and effort. The Agents panel therefore showed the parent settings for every subagent, and authoritative model snapshots that arrived late never reached the client.

Fix

  • leave subagent model and effort unknown unless the Agent launch explicitly overrides them
  • reconcile authoritative model snapshots before or after task.started
  • capture each subagent's effort through the SDK's typed SubagentStart and SubagentStop hooks
  • emit late identity corrections and bound pending refinements to avoid unbounded session growth
  • cover parent non-inheritance, event ordering, terminal-task correction, explicit overrides, and cache eviction

Verification

  • pnpm exec vp test run apps/server/src/provider/Layers/ClaudeAdapter.test.ts (74 passed)
  • pnpm exec vp test run packages/client-runtime/src/state/subagentRuntime.test.ts (48 passed)
  • pnpm exec vp run --filter t3 typecheck
  • targeted format, lint, diff, and changed-file secret checks

Fixes#7281

Model: GPT-5.6 Sol
Harness: Codex in T3 Code


Note

Medium Risk
Changes runtime task.* event payloads (model/effort may be undefined where they were previously inherited), which can affect UI and consumers that assumed parent session values.

Overview
Fixes misattributed subagent identity in ClaudeAdapter: file-defined agents no longer inherit the parent session’s model or effort on task.started when the Agent tool omits overrides.

Seeding and reconciliation now use only explicit Agent tool model/effort, buffered pre-start assistant snapshots, and SDK SubagentStart/SubagentStop hooks (effort.level). Pending state is merged as model+effort refinements (cap 256) instead of model-only buffers. Late snapshots or hook updates emit task.updated so the Agents panel can correct identity after a task completes.

Tests cover non-inheritance, ordering (snapshot before/after task_started), explicit overrides, late corrections, and eviction of unmatched pending snapshots.

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

Note

Fix subagent model and effort reporting in ClaudeAdapter

  • Adds invokeSubagentEffortHook test utility that retrieves and invokes the configured SubagentStart/SubagentStop callback with synthetic hook input containing session, agent, effort, and stop fields
  • Adds and updates tests in ClaudeAdapter.test.ts to verify subagent model and effort are no longer inferred from the parent session; instead they come from explicit Agent tool overrides, pre-start subagent snapshots, or hook effort — or remain undefined when none are available
  • Adds coverage for late subagent snapshots producing a task.updated correction after terminal events, and for eviction of the pending subagent snapshot buffer at 257 unmatched entries
  • Behavioral Change: file-defined subagents no longer inherit the parent session's model or effort; both fields are undefined unless an explicit override, snapshot, or hook supplies them

Macroscope summarized 1aeabb1.

@coderabbitai

coderabbitaiBot commented Aug 17, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 85bd484b-088d-4ed0-9fd2-ac17437dce64

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 17, 2026
@macroscopeapp

macroscopeappBot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — ClaudeAdapter now changes existing subagent event semantics and adds asynchronous SDK hook, buffering, and late-correction behavior that reaches persisted activity and the Agents panel. The scope is tested and does not alter model routing, but the cross-event production lifecycle changes warrant human review.

You can add or adjust custom eligibility rules. Learn more.

@t3dotggt3dotgg added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 24, 2026
…del-attribution
# Conflicts:
#	apps/server/src/provider/Layers/ClaudeAdapter.ts
@lnieuwenhuis

Copy link
Copy Markdown
ContributorAuthor

Merged current main and resolved the conflicts with #7583, which landed a narrower version of the snapshot/task_started race fix (model only, keyed by parent_tool_use_id). This branch's pending-refinement buffer subsumes that behavior, so I kept the refinement implementation and removed the now-redundant pendingTaskModels map.

Two notes for reviewers:

  • fix(server): keep the authoritative subagent model when snapshots race task_started #7583's new test ("a subagent snapshot that beats task_started still wins over the seed") asserted that a subagent with no explicit effort override inherits the parent session's effort. That inheritance is exactly the misattribution this PR removes, so the assertion now expects undefined; the model assertions (including propagation into task.progress) are unchanged, and effort attribution is covered by the SubagentStart-hook tests here.
  • Everything else merged cleanly. All 82 ClaudeAdapter tests pass locally.

@SamGu-NRX

Copy link
Copy Markdown

Independent reproduction, plus one data point on AgentInfo.model that may be useful here.

Prevalence. I compared the label on every local_agent task in my local event store against the model: each agent file declares, normalizing effort and [1m] suffixes. Over 241 tasks: 192 wrong at task_started (79%), and 35 still wrong at rest (14%) after snapshot refinement had its chance. One task recorded "model": "claude-opus-5" on task.started and "model": "gpt-5.6-luna" on task.progress seconds later, for the same task id, which matches your reading that routing was correct and only the label was wrong.

The 79%→14% gap is the part I found interesting: refinement does most of the work, so the residual is concentrated in children that never stream an assistant snapshot the parent sees.

One possible addition.query.supportedAgents() returns AgentInfo[], and AgentInfo.model is documented as "Model alias this agent uses. If omitted, inherits the parent's model" (sdk.d.ts:97-109). It resolves off the cached initialization result rather than a per-task control request. Probing my installed CLI 2.1.245:

claude (inherits)
Explore (inherits)
general-purpose (inherits)
Plan (inherits)
statusline-setup sonnet
theo-composer cursor/composer-2.5

That would give a launch-time value between an explicit Agent override and the parent fallback, so a definition-pinned agent starts with its own alias rather than blank, while genuinely inheriting agents still fall through. It is an alias, not the resolved API id, so your snapshot path would still be the authority that corrects it.

Worth noting the built-in defaults are version-sensitive: on the SDK-bundled 2.1.170 Explore reports haiku, but on 2.1.245 it inherits. So this helps custom agents much more than stock ones, and it does not reach effort at all, since AgentInfo has no effort field. It may well not be worth the extra surface here.

Composition. I have a separate fix for a different bug in this file, the parent context meter counting subagent tokens (#5942, PR #8453). I applied your branch and mine together on today's main: they typecheck, and the suite passes at 85 tests once three shared tests are reconciled. Only the test file collides; the source changes are independent. Happy to rebase mine whenever yours lands.

…l-attribution
# Conflicts:
#	apps/server/src/provider/Layers/ClaudeAdapter.test.ts
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 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.

Agents panel shows the parent session's model/effort for every subagent instead of the subagent's own

3 participants

@lnieuwenhuis@SamGu-NRX@t3dotgg
, '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(claude): report subagent model and effort - #7287

Open
lnieuwenhuis wants to merge 4 commits into
pingdotgg:mainfrom
lnieuwenhuis:dev/fix/subagent-model-attribution
Open

fix(claude): report subagent model and effort#7287
lnieuwenhuis wants to merge 4 commits into
pingdotgg:mainfrom
lnieuwenhuis:dev/fix/subagent-model-attribution

Conversation

@lnieuwenhuis

@lnieuwenhuislnieuwenhuis commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Problem

Claude file-defined subagents were seeded with the parent session's model and effort. The Agents panel therefore showed the parent settings for every subagent, and authoritative model snapshots that arrived late never reached the client.

Fix

  • leave subagent model and effort unknown unless the Agent launch explicitly overrides them
  • reconcile authoritative model snapshots before or after task.started
  • capture each subagent's effort through the SDK's typed SubagentStart and SubagentStop hooks
  • emit late identity corrections and bound pending refinements to avoid unbounded session growth
  • cover parent non-inheritance, event ordering, terminal-task correction, explicit overrides, and cache eviction

Verification

  • pnpm exec vp test run apps/server/src/provider/Layers/ClaudeAdapter.test.ts (74 passed)
  • pnpm exec vp test run packages/client-runtime/src/state/subagentRuntime.test.ts (48 passed)
  • pnpm exec vp run --filter t3 typecheck
  • targeted format, lint, diff, and changed-file secret checks

Fixes#7281

Model: GPT-5.6 Sol
Harness: Codex in T3 Code


Note

Medium Risk
Changes runtime task.* event payloads (model/effort may be undefined where they were previously inherited), which can affect UI and consumers that assumed parent session values.

Overview
Fixes misattributed subagent identity in ClaudeAdapter: file-defined agents no longer inherit the parent session’s model or effort on task.started when the Agent tool omits overrides.

Seeding and reconciliation now use only explicit Agent tool model/effort, buffered pre-start assistant snapshots, and SDK SubagentStart/SubagentStop hooks (effort.level). Pending state is merged as model+effort refinements (cap 256) instead of model-only buffers. Late snapshots or hook updates emit task.updated so the Agents panel can correct identity after a task completes.

Tests cover non-inheritance, ordering (snapshot before/after task_started), explicit overrides, late corrections, and eviction of unmatched pending snapshots.

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

Note

Fix subagent model and effort reporting in ClaudeAdapter

  • Adds invokeSubagentEffortHook test utility that retrieves and invokes the configured SubagentStart/SubagentStop callback with synthetic hook input containing session, agent, effort, and stop fields
  • Adds and updates tests in ClaudeAdapter.test.ts to verify subagent model and effort are no longer inferred from the parent session; instead they come from explicit Agent tool overrides, pre-start subagent snapshots, or hook effort — or remain undefined when none are available
  • Adds coverage for late subagent snapshots producing a task.updated correction after terminal events, and for eviction of the pending subagent snapshot buffer at 257 unmatched entries
  • Behavioral Change: file-defined subagents no longer inherit the parent session's model or effort; both fields are undefined unless an explicit override, snapshot, or hook supplies them

Macroscope summarized 1aeabb1.

@coderabbitai

coderabbitaiBot commented Aug 17, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 85bd484b-088d-4ed0-9fd2-ac17437dce64

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 17, 2026
@macroscopeapp

macroscopeappBot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — ClaudeAdapter now changes existing subagent event semantics and adds asynchronous SDK hook, buffering, and late-correction behavior that reaches persisted activity and the Agents panel. The scope is tested and does not alter model routing, but the cross-event production lifecycle changes warrant human review.

You can add or adjust custom eligibility rules. Learn more.

@t3dotggt3dotgg added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 24, 2026
…del-attribution
# Conflicts:
#	apps/server/src/provider/Layers/ClaudeAdapter.ts
@lnieuwenhuis

Copy link
Copy Markdown
ContributorAuthor

Merged current main and resolved the conflicts with #7583, which landed a narrower version of the snapshot/task_started race fix (model only, keyed by parent_tool_use_id). This branch's pending-refinement buffer subsumes that behavior, so I kept the refinement implementation and removed the now-redundant pendingTaskModels map.

Two notes for reviewers:

  • fix(server): keep the authoritative subagent model when snapshots race task_started #7583's new test ("a subagent snapshot that beats task_started still wins over the seed") asserted that a subagent with no explicit effort override inherits the parent session's effort. That inheritance is exactly the misattribution this PR removes, so the assertion now expects undefined; the model assertions (including propagation into task.progress) are unchanged, and effort attribution is covered by the SubagentStart-hook tests here.
  • Everything else merged cleanly. All 82 ClaudeAdapter tests pass locally.

@SamGu-NRX

Copy link
Copy Markdown

Independent reproduction, plus one data point on AgentInfo.model that may be useful here.

Prevalence. I compared the label on every local_agent task in my local event store against the model: each agent file declares, normalizing effort and [1m] suffixes. Over 241 tasks: 192 wrong at task_started (79%), and 35 still wrong at rest (14%) after snapshot refinement had its chance. One task recorded "model": "claude-opus-5" on task.started and "model": "gpt-5.6-luna" on task.progress seconds later, for the same task id, which matches your reading that routing was correct and only the label was wrong.

The 79%→14% gap is the part I found interesting: refinement does most of the work, so the residual is concentrated in children that never stream an assistant snapshot the parent sees.

One possible addition.query.supportedAgents() returns AgentInfo[], and AgentInfo.model is documented as "Model alias this agent uses. If omitted, inherits the parent's model" (sdk.d.ts:97-109). It resolves off the cached initialization result rather than a per-task control request. Probing my installed CLI 2.1.245:

claude (inherits)
Explore (inherits)
general-purpose (inherits)
Plan (inherits)
statusline-setup sonnet
theo-composer cursor/composer-2.5

That would give a launch-time value between an explicit Agent override and the parent fallback, so a definition-pinned agent starts with its own alias rather than blank, while genuinely inheriting agents still fall through. It is an alias, not the resolved API id, so your snapshot path would still be the authority that corrects it.

Worth noting the built-in defaults are version-sensitive: on the SDK-bundled 2.1.170 Explore reports haiku, but on 2.1.245 it inherits. So this helps custom agents much more than stock ones, and it does not reach effort at all, since AgentInfo has no effort field. It may well not be worth the extra surface here.

Composition. I have a separate fix for a different bug in this file, the parent context meter counting subagent tokens (#5942, PR #8453). I applied your branch and mine together on today's main: they typecheck, and the suite passes at 85 tests once three shared tests are reconciled. Only the test file collides; the source changes are independent. Happy to rebase mine whenever yours lands.

…l-attribution
# Conflicts:
#	apps/server/src/provider/Layers/ClaudeAdapter.test.ts
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 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.

Agents panel shows the parent session's model/effort for every subagent instead of the subagent's own

3 participants

@lnieuwenhuis@SamGu-NRX@t3dotgg
, '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(claude): report subagent model and effort - #7287

Open
lnieuwenhuis wants to merge 4 commits into
pingdotgg:mainfrom
lnieuwenhuis:dev/fix/subagent-model-attribution
Open

fix(claude): report subagent model and effort#7287
lnieuwenhuis wants to merge 4 commits into
pingdotgg:mainfrom
lnieuwenhuis:dev/fix/subagent-model-attribution

Conversation

@lnieuwenhuis

@lnieuwenhuislnieuwenhuis commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Problem

Claude file-defined subagents were seeded with the parent session's model and effort. The Agents panel therefore showed the parent settings for every subagent, and authoritative model snapshots that arrived late never reached the client.

Fix

  • leave subagent model and effort unknown unless the Agent launch explicitly overrides them
  • reconcile authoritative model snapshots before or after task.started
  • capture each subagent's effort through the SDK's typed SubagentStart and SubagentStop hooks
  • emit late identity corrections and bound pending refinements to avoid unbounded session growth
  • cover parent non-inheritance, event ordering, terminal-task correction, explicit overrides, and cache eviction

Verification

  • pnpm exec vp test run apps/server/src/provider/Layers/ClaudeAdapter.test.ts (74 passed)
  • pnpm exec vp test run packages/client-runtime/src/state/subagentRuntime.test.ts (48 passed)
  • pnpm exec vp run --filter t3 typecheck
  • targeted format, lint, diff, and changed-file secret checks

Fixes#7281

Model: GPT-5.6 Sol
Harness: Codex in T3 Code


Note

Medium Risk
Changes runtime task.* event payloads (model/effort may be undefined where they were previously inherited), which can affect UI and consumers that assumed parent session values.

Overview
Fixes misattributed subagent identity in ClaudeAdapter: file-defined agents no longer inherit the parent session’s model or effort on task.started when the Agent tool omits overrides.

Seeding and reconciliation now use only explicit Agent tool model/effort, buffered pre-start assistant snapshots, and SDK SubagentStart/SubagentStop hooks (effort.level). Pending state is merged as model+effort refinements (cap 256) instead of model-only buffers. Late snapshots or hook updates emit task.updated so the Agents panel can correct identity after a task completes.

Tests cover non-inheritance, ordering (snapshot before/after task_started), explicit overrides, late corrections, and eviction of unmatched pending snapshots.

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

Note

Fix subagent model and effort reporting in ClaudeAdapter

  • Adds invokeSubagentEffortHook test utility that retrieves and invokes the configured SubagentStart/SubagentStop callback with synthetic hook input containing session, agent, effort, and stop fields
  • Adds and updates tests in ClaudeAdapter.test.ts to verify subagent model and effort are no longer inferred from the parent session; instead they come from explicit Agent tool overrides, pre-start subagent snapshots, or hook effort — or remain undefined when none are available
  • Adds coverage for late subagent snapshots producing a task.updated correction after terminal events, and for eviction of the pending subagent snapshot buffer at 257 unmatched entries
  • Behavioral Change: file-defined subagents no longer inherit the parent session's model or effort; both fields are undefined unless an explicit override, snapshot, or hook supplies them

Macroscope summarized 1aeabb1.

@coderabbitai

coderabbitaiBot commented Aug 17, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 85bd484b-088d-4ed0-9fd2-ac17437dce64

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 17, 2026
@macroscopeapp

macroscopeappBot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — ClaudeAdapter now changes existing subagent event semantics and adds asynchronous SDK hook, buffering, and late-correction behavior that reaches persisted activity and the Agents panel. The scope is tested and does not alter model routing, but the cross-event production lifecycle changes warrant human review.

You can add or adjust custom eligibility rules. Learn more.

@t3dotggt3dotgg added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 24, 2026
…del-attribution
# Conflicts:
#	apps/server/src/provider/Layers/ClaudeAdapter.ts
@lnieuwenhuis

Copy link
Copy Markdown
ContributorAuthor

Merged current main and resolved the conflicts with #7583, which landed a narrower version of the snapshot/task_started race fix (model only, keyed by parent_tool_use_id). This branch's pending-refinement buffer subsumes that behavior, so I kept the refinement implementation and removed the now-redundant pendingTaskModels map.

Two notes for reviewers:

  • fix(server): keep the authoritative subagent model when snapshots race task_started #7583's new test ("a subagent snapshot that beats task_started still wins over the seed") asserted that a subagent with no explicit effort override inherits the parent session's effort. That inheritance is exactly the misattribution this PR removes, so the assertion now expects undefined; the model assertions (including propagation into task.progress) are unchanged, and effort attribution is covered by the SubagentStart-hook tests here.
  • Everything else merged cleanly. All 82 ClaudeAdapter tests pass locally.

@SamGu-NRX

Copy link
Copy Markdown

Independent reproduction, plus one data point on AgentInfo.model that may be useful here.

Prevalence. I compared the label on every local_agent task in my local event store against the model: each agent file declares, normalizing effort and [1m] suffixes. Over 241 tasks: 192 wrong at task_started (79%), and 35 still wrong at rest (14%) after snapshot refinement had its chance. One task recorded "model": "claude-opus-5" on task.started and "model": "gpt-5.6-luna" on task.progress seconds later, for the same task id, which matches your reading that routing was correct and only the label was wrong.

The 79%→14% gap is the part I found interesting: refinement does most of the work, so the residual is concentrated in children that never stream an assistant snapshot the parent sees.

One possible addition.query.supportedAgents() returns AgentInfo[], and AgentInfo.model is documented as "Model alias this agent uses. If omitted, inherits the parent's model" (sdk.d.ts:97-109). It resolves off the cached initialization result rather than a per-task control request. Probing my installed CLI 2.1.245:

claude (inherits)
Explore (inherits)
general-purpose (inherits)
Plan (inherits)
statusline-setup sonnet
theo-composer cursor/composer-2.5

That would give a launch-time value between an explicit Agent override and the parent fallback, so a definition-pinned agent starts with its own alias rather than blank, while genuinely inheriting agents still fall through. It is an alias, not the resolved API id, so your snapshot path would still be the authority that corrects it.

Worth noting the built-in defaults are version-sensitive: on the SDK-bundled 2.1.170 Explore reports haiku, but on 2.1.245 it inherits. So this helps custom agents much more than stock ones, and it does not reach effort at all, since AgentInfo has no effort field. It may well not be worth the extra surface here.

Composition. I have a separate fix for a different bug in this file, the parent context meter counting subagent tokens (#5942, PR #8453). I applied your branch and mine together on today's main: they typecheck, and the suite passes at 85 tests once three shared tests are reconciled. Only the test file collides; the source changes are independent. Happy to rebase mine whenever yours lands.

…l-attribution
# Conflicts:
#	apps/server/src/provider/Layers/ClaudeAdapter.test.ts
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 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.

Agents panel shows the parent session's model/effort for every subagent instead of the subagent's own

3 participants

@lnieuwenhuis@SamGu-NRX@t3dotgg
, '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(claude): report subagent model and effort - #7287

Open
lnieuwenhuis wants to merge 4 commits into
pingdotgg:mainfrom
lnieuwenhuis:dev/fix/subagent-model-attribution
Open

fix(claude): report subagent model and effort#7287
lnieuwenhuis wants to merge 4 commits into
pingdotgg:mainfrom
lnieuwenhuis:dev/fix/subagent-model-attribution

Conversation

@lnieuwenhuis

@lnieuwenhuislnieuwenhuis commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Problem

Claude file-defined subagents were seeded with the parent session's model and effort. The Agents panel therefore showed the parent settings for every subagent, and authoritative model snapshots that arrived late never reached the client.

Fix

  • leave subagent model and effort unknown unless the Agent launch explicitly overrides them
  • reconcile authoritative model snapshots before or after task.started
  • capture each subagent's effort through the SDK's typed SubagentStart and SubagentStop hooks
  • emit late identity corrections and bound pending refinements to avoid unbounded session growth
  • cover parent non-inheritance, event ordering, terminal-task correction, explicit overrides, and cache eviction

Verification

  • pnpm exec vp test run apps/server/src/provider/Layers/ClaudeAdapter.test.ts (74 passed)
  • pnpm exec vp test run packages/client-runtime/src/state/subagentRuntime.test.ts (48 passed)
  • pnpm exec vp run --filter t3 typecheck
  • targeted format, lint, diff, and changed-file secret checks

Fixes#7281

Model: GPT-5.6 Sol
Harness: Codex in T3 Code


Note

Medium Risk
Changes runtime task.* event payloads (model/effort may be undefined where they were previously inherited), which can affect UI and consumers that assumed parent session values.

Overview
Fixes misattributed subagent identity in ClaudeAdapter: file-defined agents no longer inherit the parent session’s model or effort on task.started when the Agent tool omits overrides.

Seeding and reconciliation now use only explicit Agent tool model/effort, buffered pre-start assistant snapshots, and SDK SubagentStart/SubagentStop hooks (effort.level). Pending state is merged as model+effort refinements (cap 256) instead of model-only buffers. Late snapshots or hook updates emit task.updated so the Agents panel can correct identity after a task completes.

Tests cover non-inheritance, ordering (snapshot before/after task_started), explicit overrides, late corrections, and eviction of unmatched pending snapshots.

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

Note

Fix subagent model and effort reporting in ClaudeAdapter

  • Adds invokeSubagentEffortHook test utility that retrieves and invokes the configured SubagentStart/SubagentStop callback with synthetic hook input containing session, agent, effort, and stop fields
  • Adds and updates tests in ClaudeAdapter.test.ts to verify subagent model and effort are no longer inferred from the parent session; instead they come from explicit Agent tool overrides, pre-start subagent snapshots, or hook effort — or remain undefined when none are available
  • Adds coverage for late subagent snapshots producing a task.updated correction after terminal events, and for eviction of the pending subagent snapshot buffer at 257 unmatched entries
  • Behavioral Change: file-defined subagents no longer inherit the parent session's model or effort; both fields are undefined unless an explicit override, snapshot, or hook supplies them

Macroscope summarized 1aeabb1.

@coderabbitai

coderabbitaiBot commented Aug 17, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 85bd484b-088d-4ed0-9fd2-ac17437dce64

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 17, 2026
@macroscopeapp

macroscopeappBot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — ClaudeAdapter now changes existing subagent event semantics and adds asynchronous SDK hook, buffering, and late-correction behavior that reaches persisted activity and the Agents panel. The scope is tested and does not alter model routing, but the cross-event production lifecycle changes warrant human review.

You can add or adjust custom eligibility rules. Learn more.

@t3dotggt3dotgg added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 24, 2026
…del-attribution
# Conflicts:
#	apps/server/src/provider/Layers/ClaudeAdapter.ts
@lnieuwenhuis

Copy link
Copy Markdown
ContributorAuthor

Merged current main and resolved the conflicts with #7583, which landed a narrower version of the snapshot/task_started race fix (model only, keyed by parent_tool_use_id). This branch's pending-refinement buffer subsumes that behavior, so I kept the refinement implementation and removed the now-redundant pendingTaskModels map.

Two notes for reviewers:

  • fix(server): keep the authoritative subagent model when snapshots race task_started #7583's new test ("a subagent snapshot that beats task_started still wins over the seed") asserted that a subagent with no explicit effort override inherits the parent session's effort. That inheritance is exactly the misattribution this PR removes, so the assertion now expects undefined; the model assertions (including propagation into task.progress) are unchanged, and effort attribution is covered by the SubagentStart-hook tests here.
  • Everything else merged cleanly. All 82 ClaudeAdapter tests pass locally.

@SamGu-NRX

Copy link
Copy Markdown

Independent reproduction, plus one data point on AgentInfo.model that may be useful here.

Prevalence. I compared the label on every local_agent task in my local event store against the model: each agent file declares, normalizing effort and [1m] suffixes. Over 241 tasks: 192 wrong at task_started (79%), and 35 still wrong at rest (14%) after snapshot refinement had its chance. One task recorded "model": "claude-opus-5" on task.started and "model": "gpt-5.6-luna" on task.progress seconds later, for the same task id, which matches your reading that routing was correct and only the label was wrong.

The 79%→14% gap is the part I found interesting: refinement does most of the work, so the residual is concentrated in children that never stream an assistant snapshot the parent sees.

One possible addition.query.supportedAgents() returns AgentInfo[], and AgentInfo.model is documented as "Model alias this agent uses. If omitted, inherits the parent's model" (sdk.d.ts:97-109). It resolves off the cached initialization result rather than a per-task control request. Probing my installed CLI 2.1.245:

claude (inherits)
Explore (inherits)
general-purpose (inherits)
Plan (inherits)
statusline-setup sonnet
theo-composer cursor/composer-2.5

That would give a launch-time value between an explicit Agent override and the parent fallback, so a definition-pinned agent starts with its own alias rather than blank, while genuinely inheriting agents still fall through. It is an alias, not the resolved API id, so your snapshot path would still be the authority that corrects it.

Worth noting the built-in defaults are version-sensitive: on the SDK-bundled 2.1.170 Explore reports haiku, but on 2.1.245 it inherits. So this helps custom agents much more than stock ones, and it does not reach effort at all, since AgentInfo has no effort field. It may well not be worth the extra surface here.

Composition. I have a separate fix for a different bug in this file, the parent context meter counting subagent tokens (#5942, PR #8453). I applied your branch and mine together on today's main: they typecheck, and the suite passes at 85 tests once three shared tests are reconciled. Only the test file collides; the source changes are independent. Happy to rebase mine whenever yours lands.

…l-attribution
# Conflicts:
#	apps/server/src/provider/Layers/ClaudeAdapter.test.ts
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 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.

Agents panel shows the parent session's model/effort for every subagent instead of the subagent's own

3 participants

@lnieuwenhuis@SamGu-NRX@t3dotgg
, '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(claude): report subagent model and effort - #7287

Open
lnieuwenhuis wants to merge 4 commits into
pingdotgg:mainfrom
lnieuwenhuis:dev/fix/subagent-model-attribution
Open

fix(claude): report subagent model and effort#7287
lnieuwenhuis wants to merge 4 commits into
pingdotgg:mainfrom
lnieuwenhuis:dev/fix/subagent-model-attribution

Conversation

@lnieuwenhuis

@lnieuwenhuislnieuwenhuis commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Problem

Claude file-defined subagents were seeded with the parent session's model and effort. The Agents panel therefore showed the parent settings for every subagent, and authoritative model snapshots that arrived late never reached the client.

Fix

  • leave subagent model and effort unknown unless the Agent launch explicitly overrides them
  • reconcile authoritative model snapshots before or after task.started
  • capture each subagent's effort through the SDK's typed SubagentStart and SubagentStop hooks
  • emit late identity corrections and bound pending refinements to avoid unbounded session growth
  • cover parent non-inheritance, event ordering, terminal-task correction, explicit overrides, and cache eviction

Verification

  • pnpm exec vp test run apps/server/src/provider/Layers/ClaudeAdapter.test.ts (74 passed)
  • pnpm exec vp test run packages/client-runtime/src/state/subagentRuntime.test.ts (48 passed)
  • pnpm exec vp run --filter t3 typecheck
  • targeted format, lint, diff, and changed-file secret checks

Fixes#7281

Model: GPT-5.6 Sol
Harness: Codex in T3 Code


Note

Medium Risk
Changes runtime task.* event payloads (model/effort may be undefined where they were previously inherited), which can affect UI and consumers that assumed parent session values.

Overview
Fixes misattributed subagent identity in ClaudeAdapter: file-defined agents no longer inherit the parent session’s model or effort on task.started when the Agent tool omits overrides.

Seeding and reconciliation now use only explicit Agent tool model/effort, buffered pre-start assistant snapshots, and SDK SubagentStart/SubagentStop hooks (effort.level). Pending state is merged as model+effort refinements (cap 256) instead of model-only buffers. Late snapshots or hook updates emit task.updated so the Agents panel can correct identity after a task completes.

Tests cover non-inheritance, ordering (snapshot before/after task_started), explicit overrides, late corrections, and eviction of unmatched pending snapshots.

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

Note

Fix subagent model and effort reporting in ClaudeAdapter

  • Adds invokeSubagentEffortHook test utility that retrieves and invokes the configured SubagentStart/SubagentStop callback with synthetic hook input containing session, agent, effort, and stop fields
  • Adds and updates tests in ClaudeAdapter.test.ts to verify subagent model and effort are no longer inferred from the parent session; instead they come from explicit Agent tool overrides, pre-start subagent snapshots, or hook effort — or remain undefined when none are available
  • Adds coverage for late subagent snapshots producing a task.updated correction after terminal events, and for eviction of the pending subagent snapshot buffer at 257 unmatched entries
  • Behavioral Change: file-defined subagents no longer inherit the parent session's model or effort; both fields are undefined unless an explicit override, snapshot, or hook supplies them

Macroscope summarized 1aeabb1.

@coderabbitai

coderabbitaiBot commented Aug 17, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 85bd484b-088d-4ed0-9fd2-ac17437dce64

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 17, 2026
@macroscopeapp

macroscopeappBot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — ClaudeAdapter now changes existing subagent event semantics and adds asynchronous SDK hook, buffering, and late-correction behavior that reaches persisted activity and the Agents panel. The scope is tested and does not alter model routing, but the cross-event production lifecycle changes warrant human review.

You can add or adjust custom eligibility rules. Learn more.

@t3dotggt3dotgg added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 24, 2026
…del-attribution
# Conflicts:
#	apps/server/src/provider/Layers/ClaudeAdapter.ts
@lnieuwenhuis

Copy link
Copy Markdown
ContributorAuthor

Merged current main and resolved the conflicts with #7583, which landed a narrower version of the snapshot/task_started race fix (model only, keyed by parent_tool_use_id). This branch's pending-refinement buffer subsumes that behavior, so I kept the refinement implementation and removed the now-redundant pendingTaskModels map.

Two notes for reviewers:

  • fix(server): keep the authoritative subagent model when snapshots race task_started #7583's new test ("a subagent snapshot that beats task_started still wins over the seed") asserted that a subagent with no explicit effort override inherits the parent session's effort. That inheritance is exactly the misattribution this PR removes, so the assertion now expects undefined; the model assertions (including propagation into task.progress) are unchanged, and effort attribution is covered by the SubagentStart-hook tests here.
  • Everything else merged cleanly. All 82 ClaudeAdapter tests pass locally.

@SamGu-NRX

Copy link
Copy Markdown

Independent reproduction, plus one data point on AgentInfo.model that may be useful here.

Prevalence. I compared the label on every local_agent task in my local event store against the model: each agent file declares, normalizing effort and [1m] suffixes. Over 241 tasks: 192 wrong at task_started (79%), and 35 still wrong at rest (14%) after snapshot refinement had its chance. One task recorded "model": "claude-opus-5" on task.started and "model": "gpt-5.6-luna" on task.progress seconds later, for the same task id, which matches your reading that routing was correct and only the label was wrong.

The 79%→14% gap is the part I found interesting: refinement does most of the work, so the residual is concentrated in children that never stream an assistant snapshot the parent sees.

One possible addition.query.supportedAgents() returns AgentInfo[], and AgentInfo.model is documented as "Model alias this agent uses. If omitted, inherits the parent's model" (sdk.d.ts:97-109). It resolves off the cached initialization result rather than a per-task control request. Probing my installed CLI 2.1.245:

claude (inherits)
Explore (inherits)
general-purpose (inherits)
Plan (inherits)
statusline-setup sonnet
theo-composer cursor/composer-2.5

That would give a launch-time value between an explicit Agent override and the parent fallback, so a definition-pinned agent starts with its own alias rather than blank, while genuinely inheriting agents still fall through. It is an alias, not the resolved API id, so your snapshot path would still be the authority that corrects it.

Worth noting the built-in defaults are version-sensitive: on the SDK-bundled 2.1.170 Explore reports haiku, but on 2.1.245 it inherits. So this helps custom agents much more than stock ones, and it does not reach effort at all, since AgentInfo has no effort field. It may well not be worth the extra surface here.

Composition. I have a separate fix for a different bug in this file, the parent context meter counting subagent tokens (#5942, PR #8453). I applied your branch and mine together on today's main: they typecheck, and the suite passes at 85 tests once three shared tests are reconciled. Only the test file collides; the source changes are independent. Happy to rebase mine whenever yours lands.

…l-attribution
# Conflicts:
#	apps/server/src/provider/Layers/ClaudeAdapter.test.ts
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 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.

Agents panel shows the parent session's model/effort for every subagent instead of the subagent's own

3 participants

@lnieuwenhuis@SamGu-NRX@t3dotgg
, '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(claude): report subagent model and effort - #7287

Open
lnieuwenhuis wants to merge 4 commits into
pingdotgg:mainfrom
lnieuwenhuis:dev/fix/subagent-model-attribution
Open

fix(claude): report subagent model and effort#7287
lnieuwenhuis wants to merge 4 commits into
pingdotgg:mainfrom
lnieuwenhuis:dev/fix/subagent-model-attribution

Conversation

@lnieuwenhuis

@lnieuwenhuislnieuwenhuis commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Problem

Claude file-defined subagents were seeded with the parent session's model and effort. The Agents panel therefore showed the parent settings for every subagent, and authoritative model snapshots that arrived late never reached the client.

Fix

  • leave subagent model and effort unknown unless the Agent launch explicitly overrides them
  • reconcile authoritative model snapshots before or after task.started
  • capture each subagent's effort through the SDK's typed SubagentStart and SubagentStop hooks
  • emit late identity corrections and bound pending refinements to avoid unbounded session growth
  • cover parent non-inheritance, event ordering, terminal-task correction, explicit overrides, and cache eviction

Verification

  • pnpm exec vp test run apps/server/src/provider/Layers/ClaudeAdapter.test.ts (74 passed)
  • pnpm exec vp test run packages/client-runtime/src/state/subagentRuntime.test.ts (48 passed)
  • pnpm exec vp run --filter t3 typecheck
  • targeted format, lint, diff, and changed-file secret checks

Fixes#7281

Model: GPT-5.6 Sol
Harness: Codex in T3 Code


Note

Medium Risk
Changes runtime task.* event payloads (model/effort may be undefined where they were previously inherited), which can affect UI and consumers that assumed parent session values.

Overview
Fixes misattributed subagent identity in ClaudeAdapter: file-defined agents no longer inherit the parent session’s model or effort on task.started when the Agent tool omits overrides.

Seeding and reconciliation now use only explicit Agent tool model/effort, buffered pre-start assistant snapshots, and SDK SubagentStart/SubagentStop hooks (effort.level). Pending state is merged as model+effort refinements (cap 256) instead of model-only buffers. Late snapshots or hook updates emit task.updated so the Agents panel can correct identity after a task completes.

Tests cover non-inheritance, ordering (snapshot before/after task_started), explicit overrides, late corrections, and eviction of unmatched pending snapshots.

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

Note

Fix subagent model and effort reporting in ClaudeAdapter

  • Adds invokeSubagentEffortHook test utility that retrieves and invokes the configured SubagentStart/SubagentStop callback with synthetic hook input containing session, agent, effort, and stop fields
  • Adds and updates tests in ClaudeAdapter.test.ts to verify subagent model and effort are no longer inferred from the parent session; instead they come from explicit Agent tool overrides, pre-start subagent snapshots, or hook effort — or remain undefined when none are available
  • Adds coverage for late subagent snapshots producing a task.updated correction after terminal events, and for eviction of the pending subagent snapshot buffer at 257 unmatched entries
  • Behavioral Change: file-defined subagents no longer inherit the parent session's model or effort; both fields are undefined unless an explicit override, snapshot, or hook supplies them

Macroscope summarized 1aeabb1.

@coderabbitai

coderabbitaiBot commented Aug 17, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 85bd484b-088d-4ed0-9fd2-ac17437dce64

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 17, 2026
@macroscopeapp

macroscopeappBot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — ClaudeAdapter now changes existing subagent event semantics and adds asynchronous SDK hook, buffering, and late-correction behavior that reaches persisted activity and the Agents panel. The scope is tested and does not alter model routing, but the cross-event production lifecycle changes warrant human review.

You can add or adjust custom eligibility rules. Learn more.

@t3dotggt3dotgg added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 24, 2026
…del-attribution
# Conflicts:
#	apps/server/src/provider/Layers/ClaudeAdapter.ts
@lnieuwenhuis

Copy link
Copy Markdown
ContributorAuthor

Merged current main and resolved the conflicts with #7583, which landed a narrower version of the snapshot/task_started race fix (model only, keyed by parent_tool_use_id). This branch's pending-refinement buffer subsumes that behavior, so I kept the refinement implementation and removed the now-redundant pendingTaskModels map.

Two notes for reviewers:

  • fix(server): keep the authoritative subagent model when snapshots race task_started #7583's new test ("a subagent snapshot that beats task_started still wins over the seed") asserted that a subagent with no explicit effort override inherits the parent session's effort. That inheritance is exactly the misattribution this PR removes, so the assertion now expects undefined; the model assertions (including propagation into task.progress) are unchanged, and effort attribution is covered by the SubagentStart-hook tests here.
  • Everything else merged cleanly. All 82 ClaudeAdapter tests pass locally.

@SamGu-NRX

Copy link
Copy Markdown

Independent reproduction, plus one data point on AgentInfo.model that may be useful here.

Prevalence. I compared the label on every local_agent task in my local event store against the model: each agent file declares, normalizing effort and [1m] suffixes. Over 241 tasks: 192 wrong at task_started (79%), and 35 still wrong at rest (14%) after snapshot refinement had its chance. One task recorded "model": "claude-opus-5" on task.started and "model": "gpt-5.6-luna" on task.progress seconds later, for the same task id, which matches your reading that routing was correct and only the label was wrong.

The 79%→14% gap is the part I found interesting: refinement does most of the work, so the residual is concentrated in children that never stream an assistant snapshot the parent sees.

One possible addition.query.supportedAgents() returns AgentInfo[], and AgentInfo.model is documented as "Model alias this agent uses. If omitted, inherits the parent's model" (sdk.d.ts:97-109). It resolves off the cached initialization result rather than a per-task control request. Probing my installed CLI 2.1.245:

claude (inherits)
Explore (inherits)
general-purpose (inherits)
Plan (inherits)
statusline-setup sonnet
theo-composer cursor/composer-2.5

That would give a launch-time value between an explicit Agent override and the parent fallback, so a definition-pinned agent starts with its own alias rather than blank, while genuinely inheriting agents still fall through. It is an alias, not the resolved API id, so your snapshot path would still be the authority that corrects it.

Worth noting the built-in defaults are version-sensitive: on the SDK-bundled 2.1.170 Explore reports haiku, but on 2.1.245 it inherits. So this helps custom agents much more than stock ones, and it does not reach effort at all, since AgentInfo has no effort field. It may well not be worth the extra surface here.

Composition. I have a separate fix for a different bug in this file, the parent context meter counting subagent tokens (#5942, PR #8453). I applied your branch and mine together on today's main: they typecheck, and the suite passes at 85 tests once three shared tests are reconciled. Only the test file collides; the source changes are independent. Happy to rebase mine whenever yours lands.

…l-attribution
# Conflicts:
#	apps/server/src/provider/Layers/ClaudeAdapter.test.ts
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 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.

Agents panel shows the parent session's model/effort for every subagent instead of the subagent's own

3 participants

@lnieuwenhuis@SamGu-NRX@t3dotgg
, '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(claude): report subagent model and effort - #7287

Open
lnieuwenhuis wants to merge 4 commits into
pingdotgg:mainfrom
lnieuwenhuis:dev/fix/subagent-model-attribution
Open

fix(claude): report subagent model and effort#7287
lnieuwenhuis wants to merge 4 commits into
pingdotgg:mainfrom
lnieuwenhuis:dev/fix/subagent-model-attribution

Conversation

@lnieuwenhuis

@lnieuwenhuislnieuwenhuis commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Problem

Claude file-defined subagents were seeded with the parent session's model and effort. The Agents panel therefore showed the parent settings for every subagent, and authoritative model snapshots that arrived late never reached the client.

Fix

  • leave subagent model and effort unknown unless the Agent launch explicitly overrides them
  • reconcile authoritative model snapshots before or after task.started
  • capture each subagent's effort through the SDK's typed SubagentStart and SubagentStop hooks
  • emit late identity corrections and bound pending refinements to avoid unbounded session growth
  • cover parent non-inheritance, event ordering, terminal-task correction, explicit overrides, and cache eviction

Verification

  • pnpm exec vp test run apps/server/src/provider/Layers/ClaudeAdapter.test.ts (74 passed)
  • pnpm exec vp test run packages/client-runtime/src/state/subagentRuntime.test.ts (48 passed)
  • pnpm exec vp run --filter t3 typecheck
  • targeted format, lint, diff, and changed-file secret checks

Fixes#7281

Model: GPT-5.6 Sol
Harness: Codex in T3 Code


Note

Medium Risk
Changes runtime task.* event payloads (model/effort may be undefined where they were previously inherited), which can affect UI and consumers that assumed parent session values.

Overview
Fixes misattributed subagent identity in ClaudeAdapter: file-defined agents no longer inherit the parent session’s model or effort on task.started when the Agent tool omits overrides.

Seeding and reconciliation now use only explicit Agent tool model/effort, buffered pre-start assistant snapshots, and SDK SubagentStart/SubagentStop hooks (effort.level). Pending state is merged as model+effort refinements (cap 256) instead of model-only buffers. Late snapshots or hook updates emit task.updated so the Agents panel can correct identity after a task completes.

Tests cover non-inheritance, ordering (snapshot before/after task_started), explicit overrides, late corrections, and eviction of unmatched pending snapshots.

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

Note

Fix subagent model and effort reporting in ClaudeAdapter

  • Adds invokeSubagentEffortHook test utility that retrieves and invokes the configured SubagentStart/SubagentStop callback with synthetic hook input containing session, agent, effort, and stop fields
  • Adds and updates tests in ClaudeAdapter.test.ts to verify subagent model and effort are no longer inferred from the parent session; instead they come from explicit Agent tool overrides, pre-start subagent snapshots, or hook effort — or remain undefined when none are available
  • Adds coverage for late subagent snapshots producing a task.updated correction after terminal events, and for eviction of the pending subagent snapshot buffer at 257 unmatched entries
  • Behavioral Change: file-defined subagents no longer inherit the parent session's model or effort; both fields are undefined unless an explicit override, snapshot, or hook supplies them

Macroscope summarized 1aeabb1.

@coderabbitai

coderabbitaiBot commented Aug 17, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 85bd484b-088d-4ed0-9fd2-ac17437dce64

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 17, 2026
@macroscopeapp

macroscopeappBot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — ClaudeAdapter now changes existing subagent event semantics and adds asynchronous SDK hook, buffering, and late-correction behavior that reaches persisted activity and the Agents panel. The scope is tested and does not alter model routing, but the cross-event production lifecycle changes warrant human review.

You can add or adjust custom eligibility rules. Learn more.

@t3dotggt3dotgg added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 24, 2026
…del-attribution
# Conflicts:
#	apps/server/src/provider/Layers/ClaudeAdapter.ts
@lnieuwenhuis

Copy link
Copy Markdown
ContributorAuthor

Merged current main and resolved the conflicts with #7583, which landed a narrower version of the snapshot/task_started race fix (model only, keyed by parent_tool_use_id). This branch's pending-refinement buffer subsumes that behavior, so I kept the refinement implementation and removed the now-redundant pendingTaskModels map.

Two notes for reviewers:

  • fix(server): keep the authoritative subagent model when snapshots race task_started #7583's new test ("a subagent snapshot that beats task_started still wins over the seed") asserted that a subagent with no explicit effort override inherits the parent session's effort. That inheritance is exactly the misattribution this PR removes, so the assertion now expects undefined; the model assertions (including propagation into task.progress) are unchanged, and effort attribution is covered by the SubagentStart-hook tests here.
  • Everything else merged cleanly. All 82 ClaudeAdapter tests pass locally.

@SamGu-NRX

Copy link
Copy Markdown

Independent reproduction, plus one data point on AgentInfo.model that may be useful here.

Prevalence. I compared the label on every local_agent task in my local event store against the model: each agent file declares, normalizing effort and [1m] suffixes. Over 241 tasks: 192 wrong at task_started (79%), and 35 still wrong at rest (14%) after snapshot refinement had its chance. One task recorded "model": "claude-opus-5" on task.started and "model": "gpt-5.6-luna" on task.progress seconds later, for the same task id, which matches your reading that routing was correct and only the label was wrong.

The 79%→14% gap is the part I found interesting: refinement does most of the work, so the residual is concentrated in children that never stream an assistant snapshot the parent sees.

One possible addition.query.supportedAgents() returns AgentInfo[], and AgentInfo.model is documented as "Model alias this agent uses. If omitted, inherits the parent's model" (sdk.d.ts:97-109). It resolves off the cached initialization result rather than a per-task control request. Probing my installed CLI 2.1.245:

claude (inherits)
Explore (inherits)
general-purpose (inherits)
Plan (inherits)
statusline-setup sonnet
theo-composer cursor/composer-2.5

That would give a launch-time value between an explicit Agent override and the parent fallback, so a definition-pinned agent starts with its own alias rather than blank, while genuinely inheriting agents still fall through. It is an alias, not the resolved API id, so your snapshot path would still be the authority that corrects it.

Worth noting the built-in defaults are version-sensitive: on the SDK-bundled 2.1.170 Explore reports haiku, but on 2.1.245 it inherits. So this helps custom agents much more than stock ones, and it does not reach effort at all, since AgentInfo has no effort field. It may well not be worth the extra surface here.

Composition. I have a separate fix for a different bug in this file, the parent context meter counting subagent tokens (#5942, PR #8453). I applied your branch and mine together on today's main: they typecheck, and the suite passes at 85 tests once three shared tests are reconciled. Only the test file collides; the source changes are independent. Happy to rebase mine whenever yours lands.

…l-attribution
# Conflicts:
#	apps/server/src/provider/Layers/ClaudeAdapter.test.ts
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 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.

Agents panel shows the parent session's model/effort for every subagent instead of the subagent's own

3 participants

@lnieuwenhuis@SamGu-NRX@t3dotgg