# Files changed · PR \#21644 · pingdotgg/t3code

[View on GitCafe](https://git.cafe/pingdotgg/t3code/pull/21644/diffs)

Repository: [pingdotgg/t3code](https://git.cafe/pingdotgg/t3code)

Visibility: public

[fix\(claude\): preserve subagent task context snapshots](https://git.cafe/pingdotgg/t3code/pull/21644.md)

Version: 2

Head commit: 93c22b64a6ef44dd0a6b714a1cbcb40e317be9d0

Base commit: 90df6f1425d462c234423abeab9b51783340ed0e

Comparison base: 90df6f1425d462c234423abeab9b51783340ed0e

Showing up to 20 entries from this revision. If the pull request changes, reopen the first page before continuing.

## apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.test.ts

Status: modified; +134; −12

```diff
@@ -9679,6 +9679,94 @@
     ),
   );
 
+  it.effect("replaces subagent context snapshots and clears them on an in-turn resume", () =>
+    Effect.scoped(
+      Effect.gen(function* () {
+        const harness = yield* makeWakeHarness;
+        yield* harness.runtime.startTurn(
+          makeClaudeTestTurnInput({
+            threadId: harness.threadId,
+            providerThread: harness.providerThread,
+            now: yield* DateTime.now,
+            attemptId: RunAttemptId.make("attempt-context-snapshots"),
+            text: "Run an audit, then resume it.",
+            attachments: [],
+          }),
+        );
+        let sequence = 4100;
+        const taskFrame = (message: Record<string, unknown>) =>
+          claudeSdkFrame({
+            type: "system",
+            task_id: "context-agent",
+            tool_use_id: "toolu-context-agent",
+            session_id: WAKE_NATIVE_SESSION,
+            uuid: `00000000-0000-4000-8000-${String(++sequence).padStart(12, "0")}`,
+            ...message,
+          });
+        const started = {
+          subtype: "task_started",
+          description: "Audit recent commits",
+          task_type: "local_agent",
+          subagent_type: "general-purpose",
+        };
+        const completed = {
+          subtype: "task_notification",
+          status: "completed",
+          output_file: "",
+          summary: "Audit complete.",
+        };
+        for (const message of [
+          started,
+          {
+            subtype: "task_progress",
+            description: "Reading files",
+            usage: { total_tokens: 12_000, tool_uses: 2, duration_ms: 900 },
+          },
+          {
+            subtype: "task_progress",
+            description: "",
+            usage: { total_tokens: 8_000, tool_uses: 3, duration_ms: 1_000 },
+          },
+          { ...completed, usage: { total_tokens: 7_000, tool_uses: 4, duration_ms: 2_000 } },
+          started,
+          {
+            subtype: "task_progress",
+            description: "Resumed audit",
+            usage: { total_tokens: 0, tool_uses: 0, duration_ms: 0 },
+          },
+          completed,
+        ]) {
+          yield* harness.offerAndWait(taskFrame(message));
+        }
+        yield* harness.offerAndWait(
+          makeResultFrame({
+            uuid: "00000000-0000-4000-8000-000000004199",
+            result: "Both audits finished.",
+          }),
+        );
+        yield* Queue.take(harness.terminalReceipts);
+        const snapshots = harness.events.flatMap((event) =>
+          event.type === "subagent.updated"
+            ? [[event.subagent.status, event.subagent.progress, event.subagent.usage]]
+            : [],
+        );
+        assert.deepEqual(snapshots, [
+          ["running", undefined, undefined],
+          ["running", "Reading files", { contextTokens: 12_000, toolUses: 2 }],
+          ["running", "Reading files", { contextTokens: 8_000, toolUses: 3 }],
+          ["completed", "Reading files", { contextTokens: 7_000, toolUses: 4 }],
+          ["running", undefined, undefined],
+          ["running", "Resumed audit", { contextTokens: 0, toolUses: 0 }],
+          ["completed", "Resumed audit", { contextTokens: 0, toolUses: 0 }],
+        ]);
+      }).pipe(
+        Effect.provide(
+          Layer.mergeAll(IdAllocator.layer, McpProviderSessions.layer, NodeServices.layer),
+        ),
+      ),
+    ),
+  );
+
   it.effect.each([false, true])(
     "drops an idle start superseded by live completion, later resume %s",
     (resume) =>
@@ -9710,11 +9798,14 @@
               uuid: `00000000-0000-4000-8000-${suffix}`,
             });
           const finished = (taskId: string, suffix: string) =>
+            claudeSdkFrame({
+              ...makeSubagentNotificationFrame({
+                taskId,
+                toolUseId: `toolu-${taskId}`,
+                summary: "Finished audit.",
+                uuid: `00000000-0000-4000-8000-${suffix}`,
+              }),
-            makeSubagentNotificationFrame({
+              usage: { total_tokens: 18_000, tool_uses: 4, duration_ms: 2_000 },
-              taskId,
-              toolUseId: `toolu-${taskId}`,
-              summary: "Finished audit.",
-              uuid: `00000000-0000-4000-8000-${suffix}`,
             });
           yield* startTurn(1);
           yield* harness.offerAndWait(started("stale-agent", "000000004001"));
@@ -9736,6 +9827,13 @@
             }),
           );
           yield* Queue.take(harness.terminalReceipts);
+          assert.deepEqual(
+            harness.events
+              .filter((event) => event.type === "subagent.updated")
+              .findLast((event) => event.subagent.nativeTaskRef?.nativeId === "stale-agent")
+              ?.subagent.usage,
+            { contextTokens: 18_000, toolUses: 4 },
+          );
           if (resume) yield* harness.offerAndWait(started("stale-agent", "000000004007"));
           yield* harness.offerAndWait(finished("wake-agent", "000000004008"));
           yield* Queue.take(harness.continuationReceipts);
@@ -9757,6 +9855,17 @@
           assert.equal(latest.subagent.status, resume ? "running" : "completed");
           assert.equal(latest.subagent.result, resume ? null : "Finished audit.");
           assert.equal(latest.subagent.completedAt === null, resume);
+          assert.deepEqual(
+            latest.subagent.usage,
+            resume ? undefined : { contextTokens: 18_000, toolUses: 4 },
+          );
+          assert.deepEqual(
+            harness.events
+              .filter((event) => event.type === "subagent.updated")
+              .findLast((event) => event.subagent.nativeTaskRef?.nativeId === "wake-agent")
+              ?.subagent.usage,
+            { contextTokens: 18_000, toolUses: 4 },
+          );
         }).pipe(
           Effect.provide(
             Layer.mergeAll(IdAllocator.layer, McpProviderSessions.layer, NodeServices.layer),
@@ -13145,10 +13254,16 @@
         for (let index = 0; index < 5; index++) yield* offerProgressOnly(index);
         yield* Queue.offer(
           harness.sdkMessages,
+          claudeSdkFrame({
+            ...workflowSnapshot({ uuid: "00000000-0000-4000-8000-000000001121", state: "start" }),
+            usage: { total_tokens: 12000, tool_uses: 3, duration_ms: 1000 },
-          workflowSnapshot({ uuid: "00000000-0000-4000-8000-000000001121", state: "start" }),
+          }),
         );
-        yield* awaitUntil(() => coordinatorCount() > inTurnCount, "in-turn workflow snapshot");
+        while (coordinatorCount() <= inTurnCount) yield* Queue.take(harness.subagentReceipts);
         assert.equal(coordinatorCount(), inTurnCount + 1);
+        const inTurnCoordinator = workflowCoordinatorEvents(harness.events).at(-1)?.subagent;
+        assert.equal(inTurnCoordinator?.workflow?.totalTokens, 12000);
+        assert.equal(inTurnCoordinator?.workflow?.toolCalls, 3);
 
         yield* Queue.offer(
           harness.sdkMessages,
@@ -13163,13 +13278,20 @@
         for (let index = 5; index < 10; index++) yield* offerProgressOnly(index);
         yield* Queue.offer(
           harness.sdkMessages,
+          claudeSdkFrame({
+            ...workflowSnapshot({ uuid: "00000000-0000-4000-8000-000000001123", state: "done" }),
-          workflowSnapshot({ uuid: "00000000-0000-4000-8000-000000001123", state: "done" }),
+            usage: { total_tokens: 18000, tool_uses: 5, duration_ms: 2000 },
-        );
-        yield* awaitUntil(
-          () => coordinatorCount() > betweenTurnCount,
-          "between-turn workflow snapshot",
+          }),
         );
+        while (coordinatorCount() <= betweenTurnCount) yield* Queue.take(harness.subagentReceipts);
         assert.equal(coordinatorCount(), betweenTurnCount + 1);
+        const betweenTurnCoordinator = workflowCoordinatorEvents(harness.events).at(-1)?.subagent;
+        assert.equal(betweenTurnCoordinator?.workflow?.totalTokens, 18000);
+        assert.equal(betweenTurnCoordinator?.workflow?.toolCalls, 5);
+        assert.deepEqual(
+          [inTurnCoordinator?.usage, betweenTurnCoordinator?.usage],
+          [undefined, undefined],
+        );
       }).pipe(
         Effect.provide(
           Layer.mergeAll(IdAllocator.layer, McpProviderSessions.layer, NodeServices.layer),
```

## apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts

Status: modified; +29; −6

```diff
@@ -4980,6 +4980,7 @@
           readonly effort?: string;
           readonly owner?: ActiveClaudeSubagent;
           readonly progress?: string;
+          readonly usage?: { readonly total_tokens: number; readonly tool_uses: number };
           readonly workflowFrame?: unknown;
           readonly workflowName?: string;
           readonly workflowRunHandles?: OrchestrationV2WorkflowRunHandles;
@@ -5063,9 +5064,10 @@
             existingSubagent === undefined
               ? undefined
               : isReopen
+                ? (({ progress: _staleProgress, usage: _staleUsage, ...rest }) => ({
+                    ...rest,
+                    result: null,
+                  }))(existingSubagent.task)
-                ? (({ progress: _staleProgress, ...rest }) => ({ ...rest, result: null }))(
-                    existingSubagent.task,
-                  )
                 : existingSubagent.task;
           const workflow = mergeClaudeWorkflowProgress({
             previous: priorTask?.workflow,
@@ -5129,12 +5131,21 @@
                 }
               : {}),
             ...(input.progress === undefined ? {} : { progress: input.progress }),
+            ...(input.usage === undefined || workflowWithThreads !== undefined
+              ? {}
+              : {
+                  usage: {
+                    contextTokens: input.usage.total_tokens,
+                    toolUses: input.usage.tool_uses,
+                  },
+                }),
             ...(workflowWithThreads === undefined ? {} : { workflow: workflowWithThreads }),
             ...(input.result === undefined ? {} : { result: input.result }),
             ...(isReopen ? { startedAt: now } : {}),
             completedAt: input.status === "running" ? null : (priorTask?.completedAt ?? now),
             updatedAt: now,
           } satisfies OrchestrationV2Subagent;
+          if (workflowWithThreads !== undefined) delete task.usage;
           const subagent = {
             task,
             confirmedOutcome:
@@ -6409,7 +6420,11 @@
                   : "failed",
               ...(completion === undefined
                 ? {}
+                : {
+                    workflowFrame: completion,
+                    result: completion.summary,
+                    ...(completion.usage === undefined ? {} : { usage: completion.usage }),
-                : { workflowFrame: completion, result: completion.summary }),
+                  }),
               onlyIfRunningInRun: subagent.task.runId,
             });
           }
@@ -6529,7 +6544,11 @@
               if (registered === undefined || registered.task.status === "running") {
                 return current;
               }
+              const {
+                progress: _staleProgress,
+                usage: _staleUsage,
+                ...priorTask
-              const { progress: _staleProgress, ...priorTask } = registered.task;
+              } = registered.task;
               return new Map(current).set(message.task_id, {
                 ...registered,
                 confirmedOutcome: undefined,
@@ -6974,6 +6993,7 @@
                   context: settled,
                   taskId: message.task_id,
                   ...(message.tool_use_id === undefined ? {} : { toolUseId: message.tool_use_id }),
+                  ...(message.usage === undefined ? {} : { usage: message.usage }),
                   workflowFrame: message,
                   nativeOutcome: message,
                   result: message.summary,
@@ -7505,7 +7525,8 @@
               (yield* Ref.get(sessionSubagentsByTaskId)).get(message.task_id)?.task.workflow !==
               undefined;
             if (
-              (carriesWorkflowTelemetry || (progress.length > 0 && !isWorkflowCoordinator)) &&
+              (carriesWorkflowTelemetry ||
+                ((progress.length > 0 || message.usage !== undefined) && !isWorkflowCoordinator)) &&
               !context.ignoredTaskIds.has(message.task_id) &&
               !isBackgroundTask
             ) {
@@ -7514,6 +7535,7 @@
                 taskId: message.task_id,
                 ...(message.tool_use_id === undefined ? {} : { toolUseId: message.tool_use_id }),
                 ...(progress.length === 0 ? {} : { progress }),
+                usage: message.usage,
                 workflowFrame: message,
                 status: "running",
               });
@@ -7575,6 +7597,7 @@
                 context,
                 taskId: message.task_id,
                 ...(message.tool_use_id === undefined ? {} : { toolUseId: message.tool_use_id }),
+                ...(message.usage === undefined ? {} : { usage: message.usage }),
                 workflowFrame: message,
                 nativeOutcome: message,
                 result: message.summary,
```
