Skip to content

feat: subagent and tool presentation fixes (upstream G3) - #999

Merged
rynfar merged 7 commits into
pylonfrom
upstream/2026-10-03-g3-subagent-presentation
Oct 3, 2026
Merged

rynfar merged 7 commits into
pylonfrom
upstream/2026-10-03-g3-subagent-presentation

Conversation

@rynfar

@rynfar rynfar commented Oct 3, 2026 •

Copy link
Copy Markdown
Collaborator

Ports upstream group G3: subagent and tool presentation. Claude skill calls show the skill name. Claude subagent threads show the model their agent file picks. Subagent descriptions are formatted as display names. Mobile shows full subagent details. OpenCode reasoning labels are no longer blank.

Sources

Upstream SHA Title Outcome
43bd667739 fix(web): Claude skill calls show the skill name (#14980) Adapted. Conflict in ClaudeAdapterV2.ts: Pylon's tool-call projection has no input.presentation title. The title is now searchTitle ?? dynamicToolTitle(toolName, input) ?? null. computerUseToolTitle was renamed to dynamicToolTitle. No callers of the old name remain.
4f7760e6a0 fix(server): Claude subagents show the model their agent file picks (#14994) Adopted. Clean cherry-pick. ProviderEventIngestor now depends on ThreadCommandExecutor. When a provider_native subagent reports a different model, it writes thread.model-selection-updated to the child thread under the thread lock. The layer wiring changed in runtimeLayer.ts, ProviderReplayHarness.ts, and the test layer in ProviderSessionManager.test.ts (wiring only).
151c241cd2 fix(client-runtime): format subagent descriptions as display names (#14999) Adopted. Clean cherry-pick.
65731f986b fix(mobile): show complete subagent details (#15189) Adopted. Clean cherry-pick. Adds the new SubagentRow.tsx and the shared resolveSubagentMetadata / subagentDetailPreview helpers.
63f74e209d fix(opencode): fill blank reasoning labels (#14978) Adapted. Conflicts resolved in favor of Pylon in these places: the mobile useLiveDeviceState hook, the GlassBlurTargetContext composer wrapper with contextWindow/localOutboxCount, the web liveHandoffProjection and the supportsProviderSwitchingViaHandoff prop, and Pylon's model-change disabled-copy tests. Upstream's reportedModelSelection was added next to each of them. Pylon's mobile settings sheet has no providerInstanceId prop, so that prop was dropped from the memo deps. Adds the optional field OrchestrationV2ProviderThreadNativeMetadata.modelSelection. It is display-only and old clients ignore it.

No sources were skipped.

Pylon impact

  • Prime: Prime child/subagent items come from LegacyRuntimeEventProjector with childThreadId: null. The new subagent model sync therefore never fires for Prime. formatSubagentDisplayTitle only rewrites Codex /root/... paths, so Prime labels display as before. The Prime and legacy projector tests pass.
  • Providers: The variant label handling only affects OpenCode, the only provider that uses a variant option. Reported values are display-only and are never sent with a dispatch.
  • Contracts: Adds one optional field. No migration.
  • Scope: No changes to RunExecutionService, ProviderSessionManager, EventSink, or EffectOutbox. The only overlap is the test layer wiring in ProviderSessionManager.test.ts, which is needed because the ingestor's dependencies changed.

Review adaptations (96b335a7a9)

  • Shared model labels: An OpenCode variant the user never chose and the provider never reported now shows "Default". Upstream showed "Unknown", which would have made existing drafts show "Unknown" instead of a level such as "Medium". "Unknown" now appears only when an explicit choice can't be resolved. The shared, client-runtime and web tests were updated.
  • ProviderEventIngestor: The child-thread model sync is display-only. If it fails, it now logs Effect.logWarning and keeps the original stored events, instead of raising ProviderEventPublishError. A new regression test makes the thread.model-selection-updated write fail and checks that the stream continues. The test was confirmed to fail without the fix.
  • Mobile: The subagent row Pressable gets back its accessibilityLabel (name and status).

Rebase onto #1002 / #997 / #998 / #1000 / #1001 (dbef955759)

  • LegacyAdapterV2SessionManager.test.ts (added by feat(server): orchestrator v2 core fixes (upstream G1) #1002) now provides ThreadCommandExecutor to the ingestor layer, the same way runtimeLayer and ProviderReplayHarness do. Without it, the t3 typecheck failed with missingEffectContext.
  • The subagent display-name test in threadExecution.test.ts now expects the waiting flag that fix: thread state and timeline fixes (upstream G4) #997 added.
  • The rebase onto ProviderSessionManager.test.ts applied without conflicts.
  • After the rebase: typecheck passed for contracts, shared, client-runtime, t3, web and mobile. The 13 server suites (including LegacyAdapterV2SessionManager, ProviderEventIngestor and ProviderSessionManager) passed 489 tests. The client suites passed: shared 41, client-runtime 52, web 156, mobile 7. Format and lint on the 39 changed files: clean.

Verification

  • Typecheck passed: vp run -F @t3tools/contracts, @t3tools/shared, @t3tools/client-runtime, t3, @t3tools/web, @t3tools/mobile. Each one was confirmed to run tsc --noEmit.
  • Shared tests: vp test run on model.test.ts and toolActivity.test.ts, 41 passed.
  • Client-runtime tests: subagentDisplay.test.ts and threadExecution.test.ts, 50 passed.
  • Web tests: TraitsPicker.test.ts and MessagesTimeline.logic.test.ts, 155 passed.
  • Mobile tests: threadAgentsPresentation.test.ts, 7 passed.
  • Server adapter and ingestor tests: ClaudeAdapterV2, OpenCode2AdapterV2, CodexAdapterV2, ProviderEventIngestor (includes the subagent model-sync test and its failure-path test), and ProviderSessionManager, all passed.
  • After the review adaptations: model.test.ts 32, threadExecution.test.ts 39, TraitsPicker.test.ts 15, ProviderEventIngestor.test.ts 16, and threadAgentsPresentation.test.ts 7, all passed. Typechecks for shared, client-runtime, t3, web and mobile were re-run and passed.
  • Server integration tests: OpenCode2OrchestratorV2.integration, ThreadFork.execution, SteeringCompletion.integration, LegacyAdapterV2Bridge, LegacyRuntimeEventProjector, PrimeAgentDaemonRuntimeEvents, and OrchestratorMcpToolkit.integration, 96 passed.
  • vp fmt --check and vp lint on the 38 changed TS/TSX files: clean. Lint shows only warnings that were already in ChatView.tsx.

Not verified

  • No browser, simulator, or device check was run, so there are no before/after screenshots. That covers the web tool row skill title, the subagent bar model label, the mobile SubagentRow / agents sheet, and the OpenCode traits picker labels.
  • No live Claude agent-file or OpenCode session was tested. Coverage comes from the adapter and ingestor tests only.

Part of upstream cycle #996.

🤖 Generated with Claude Code

@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XL labels Oct 3, 2026
@github-actions

github-actions Bot commented Oct 3, 2026 •

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ℹ️ The exact PR base did not have a successful artifact. Baseline uses the latest successful main measurement shown below.

Provider Metric Main baseline This PR Impact PR ceiling
Codex Total thread wire 4.9 KiB 4.9 KiB −40 B (−0.8%) 6.8 KiB ✅
Codex Thread snapshot wire 3.7 KiB 3.7 KiB 0 B (0.0%) 4.9 KiB ✅
Codex Live turn WebSocket wire 1.2 KiB 1.1 KiB −40 B (−3.3%) 2.0 KiB ✅
Codex Live turn WebSocket decoded 20.4 KiB 20.4 KiB −41 B (−0.2%) 29.3 KiB ✅
Codex Live turn messages 2 1 −1 (−50.0%) 8 ✅
Claude Total thread wire 4.9 KiB 4.9 KiB 0 B (0.0%) 6.8 KiB ✅
Claude Thread snapshot wire 3.7 KiB 3.7 KiB 0 B (0.0%) 4.9 KiB ✅
Claude Live turn WebSocket wire 1.2 KiB 1.2 KiB 0 B (0.0%) 2.0 KiB ✅
Claude Live turn WebSocket decoded 20.8 KiB 20.8 KiB 0 B (0.0%) 29.3 KiB ✅
Claude Live turn messages 2 2 0 (0.0%) 8 ✅

Baseline: cda6633 · PR result: dbef955 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 106.1 KiB
  • Claude decoded thread snapshot: 106.4 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

t3dotgg and others added 7 commits October 3, 2026 16:48
Pylon adaptation: Pylon's Claude tool-call projection has no input.presentation title,
so the resolved title is searchTitle ?? dynamicToolTitle(...) ?? null.

(cherry picked from commit 43bd6677392b80cd12742f865c277c9939239543)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…#14994)

(cherry picked from commit 4f7760e6a0037b06917adaae1b8a220e3ee6e5cc)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…14999)

(cherry picked from commit 151c241cd2cc22c3b10ba8735e44f83fb723a511)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
(cherry picked from commit 65731f986ba2175063b0182deb6a143f8f323b74)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Pylon adaptations: keep Pylon's live device-state hook, glass blur composer wrapper,
provider-handoff ChatComposer prop and model-change disabled copy tests; the mobile
settings sheet no longer has providerInstanceId, so it is dropped from memo deps.

(cherry picked from commit 63f74e209dc27df1f8733535d6fd4a79d442add8)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Pylon adaptations to upstream G3 review findings:
- An OpenCode variant that the user never chose and the provider never
  reported now shows "Default" instead of "Unknown", so existing drafts
  no longer regress to "Unknown".
- A failed child-thread model sync now logs a warning and no longer fails
  the run's provider event stream, because that model is display-only.
- Restore the mobile subagent row accessibility label (name and status).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Provide ThreadCommandExecutor to the ProviderEventIngestor layer in the
LegacyAdapterV2SessionManager test added by #1002. Expect the `waiting`
flag that #997 added to the pending background work shown for subagent
display names.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@rynfar
rynfar force-pushed the upstream/2026-10-03-g3-subagent-presentation branch from 96b335a to dbef955 Compare October 3, 2026 22:50
@rynfar
rynfar merged commit 945852f into pylon Oct 3, 2026
23 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants