diff --git a/apps/mobile/src/state/use-thread-composer-state.ts b/apps/mobile/src/state/use-thread-composer-state.ts index 3eb19861d99b4..053d165105484 100644 --- a/apps/mobile/src/state/use-thread-composer-state.ts +++ b/apps/mobile/src/state/use-thread-composer-state.ts @@ -533,6 +533,7 @@ export function useThreadComposerState(input: { const result = await editQueuedRun({ environmentId: thread.environmentId, input: { + creationSource: "mobile", threadId: thread.id, runId: edit.runId, text: restoreAttachmentOnlyBootstrapPrompt(text, payload.attachments.length > 0), diff --git a/apps/server/scripts/probe-claude-fork-local-rollback-replay.ts b/apps/server/scripts/probe-claude-fork-local-rollback-replay.ts index 3d856fb9672e6..498851990574a 100644 --- a/apps/server/scripts/probe-claude-fork-local-rollback-replay.ts +++ b/apps/server/scripts/probe-claude-fork-local-rollback-replay.ts @@ -161,7 +161,7 @@ async function recordTurn(input: { readonly label: string; readonly pathFragments: ReadonlyArray; }): Promise { - const message = makeClaudeUserMessage({ text: input.prompt }); + const message = makeClaudeUserMessage({ text: input.prompt, origin: { kind: "human" } }); input.entries.push({ type: "expect_outbound", label: input.label, diff --git a/apps/server/src/mcp/toolkits/thread/handlers.ts b/apps/server/src/mcp/toolkits/thread/handlers.ts index 88bb91bf62b77..fbf767d0dec5d 100644 --- a/apps/server/src/mcp/toolkits/thread/handlers.ts +++ b/apps/server/src/mcp/toolkits/thread/handlers.ts @@ -310,6 +310,7 @@ export const layer = McpToolAccess.toLayer(ThreadToolkit, { return yield* dispatch(input.threadId, (common) => ({ ...common, type: "queued-run.edit", + editor: { createdBy: "agent", creationSource: "mcp" }, runId, text, })); diff --git a/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.test.ts b/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.test.ts index 7822552ef12ac..af3ec7540a0d0 100644 --- a/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.test.ts +++ b/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.test.ts @@ -52,6 +52,7 @@ import { ProviderTurnId, RunAttemptId, RunId, + ScheduledTaskId, ThreadId, } from "@t3tools/contracts"; import { mcpAppFromToolItem } from "@t3tools/shared/toolOutput"; @@ -5294,6 +5295,61 @@ describe("ClaudeAdapterV2 background wake turns", () => { ), ); + it.effect.each([ + { name: "web", createdBy: "user", creationSource: "web", human: true }, + { name: "mobile", createdBy: "user", creationSource: "mobile", human: true }, + { name: "scheduled", createdBy: "user", creationSource: "web", scheduled: true, human: false }, + { name: "server", createdBy: "user", creationSource: "server", human: false }, + { name: "mcp", createdBy: "agent", creationSource: "mcp", human: false }, + ] as const)( + "stamps $name sends and steers as human only when a user typed them", + ({ createdBy, creationSource, human, ...rest }) => + Effect.gen(function* () { + const harness = yield* makeWakeHarness; + const input = makeClaudeTestTurnInput({ + threadId: harness.threadId, + providerThread: harness.providerThread, + now: yield* DateTime.now, + attemptId: RunAttemptId.make("message-origin"), + text: "Watch the artifact", + attachments: [], + messageCreatedBy: createdBy, + messageCreationSource: creationSource, + }); + const message = { + ...input.message, + ...("scheduled" in rest ? { scheduledTaskId: ScheduledTaskId.make("task-origin") } : {}), + }; + yield* harness.runtime.startTurn({ ...input, message }); + const idAllocator = yield* IdAllocator.IdAllocatorV2; + yield* harness.runtime.steerTurn({ + threadId: harness.threadId, + runId: input.runId, + providerThread: harness.providerThread, + providerTurnId: idAllocator.derive.providerTurn({ + driver: ClaudeAdapterV2.CLAUDE_PROVIDER, + nativeTurnId: `turn:${input.attemptId}`, + }), + message: { ...message, messageId: MessageId.make("message-origin-steer") }, + }); + + const expected = human ? { kind: "human" } : undefined; + assert.deepEqual(harness.offeredMessages[0]?.origin, expected); + assert.equal(harness.offeredMessages[1]?.priority, "now"); + assert.deepEqual(harness.offeredMessages[1]?.origin, expected); + }).pipe( + Effect.scoped, + Effect.provide( + Layer.mergeAll( + IdAllocator.layer, + McpProviderSessions.layer, + NodeServices.layer, + NodeCrypto.layer, + ), + ), + ), + ); + // regression: #29750 Claude sets a goal only from a prompt that opens with /goal it("keeps a /goal that mentions a skill as one native goal command", () => { const message = ClaudeAdapterV2.makeClaudeUserMessage({ @@ -10959,6 +11015,7 @@ describe("ClaudeAdapterV2 background wake turns", () => { type: "user", message: { role: "user", content: prompt }, parent_tool_use_id: null, + origin: { kind: "human" }, }, }, }, diff --git a/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts b/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts index 9977ea942a21a..4888492a72fa4 100644 --- a/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts +++ b/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts @@ -464,6 +464,9 @@ function makeClaudeQueryOpenFrame( }; } +// Recorded prompts stand in for composer messages, which T3 stamps as typed by the user. +const RECORDED_PROMPT_ORIGIN = { kind: "human" } as const; + function makeClaudePromptOfferFrame(message: SDKUserMessage): ClaudePromptOfferFrame { return { type: "prompt.offer", @@ -1619,6 +1622,7 @@ async function recordClaudeStreamingQuery(input: { try { for (const [index, prompt] of input.prompts.entries()) { const message = ClaudeAdapterV2.makeClaudeUserMessage({ + origin: RECORDED_PROMPT_ORIGIN, text: prompt, uuid: await Effect.runPromise( SecureRandom.SecureRandom.pipe( @@ -1693,6 +1697,7 @@ async function recordClaudeActiveSteeringQuery(input: { const promptQueue = new RecordingPromptQueue(); const offerPrompt = (index: number, priority?: SDKUserMessage["priority"]) => { const message = ClaudeAdapterV2.makeClaudeUserMessage({ + origin: RECORDED_PROMPT_ORIGIN, text: input.prompts[index]!, ...(priority === undefined ? {} : { priority }), }); @@ -1839,7 +1844,10 @@ async function recordClaudeRestartingQueries(input: { label: `query.open:${index + 1}`, frame: makeClaudeQueryOpenFrame({ options }), }); - const message = ClaudeAdapterV2.makeClaudeUserMessage({ text: prompt }); + const message = ClaudeAdapterV2.makeClaudeUserMessage({ + origin: RECORDED_PROMPT_ORIGIN, + text: prompt, + }); input.entries.push({ type: "expect_outbound", label: `prompt.offer:${index + 1}`, @@ -1941,7 +1949,10 @@ async function recordClaudeResumeAtCursorQuery(input: { try { const sourceCursors: Array = []; for (const [index, prompt] of input.prompts.slice(0, 2).entries()) { - const message = ClaudeAdapterV2.makeClaudeUserMessage({ text: prompt }); + const message = ClaudeAdapterV2.makeClaudeUserMessage({ + origin: RECORDED_PROMPT_ORIGIN, + text: prompt, + }); input.entries.push({ type: "expect_outbound", label: `prompt.offer:${index + 1}`, @@ -2003,7 +2014,10 @@ async function recordClaudeResumeAtCursorQuery(input: { label: "query.open:resume_at_cursor", frame: makeClaudeQueryOpenFrame({ options: resumedOptions }), }); - const resumedMessage = ClaudeAdapterV2.makeClaudeUserMessage({ text: input.prompts[2]! }); + const resumedMessage = ClaudeAdapterV2.makeClaudeUserMessage({ + origin: RECORDED_PROMPT_ORIGIN, + text: input.prompts[2]!, + }); input.entries.push({ type: "expect_outbound", label: "prompt.offer:3", @@ -2123,7 +2137,10 @@ async function recordClaudeForkSessionQuery(input: { try { const sourceCursors: Array = []; for (const [index, prompt] of input.prompts.slice(0, sourcePromptCount).entries()) { - const message = ClaudeAdapterV2.makeClaudeUserMessage({ text: prompt }); + const message = ClaudeAdapterV2.makeClaudeUserMessage({ + origin: RECORDED_PROMPT_ORIGIN, + text: prompt, + }); input.entries.push({ type: "expect_outbound", label: `prompt.offer:${index + 1}`, @@ -2225,7 +2242,10 @@ async function recordClaudeForkSessionQuery(input: { const targetIterator = targetRuntime[Symbol.asyncIterator](); for (const prompt of forkPrompts) { promptOrdinal += 1; - const targetMessage = ClaudeAdapterV2.makeClaudeUserMessage({ text: prompt }); + const targetMessage = ClaudeAdapterV2.makeClaudeUserMessage({ + origin: RECORDED_PROMPT_ORIGIN, + text: prompt, + }); input.entries.push({ type: "expect_outbound", label: `prompt.offer:${promptOrdinal}`, @@ -2283,7 +2303,10 @@ async function recordClaudeForkSessionQuery(input: { const continuationIterator = continuationRuntime[Symbol.asyncIterator](); for (const prompt of input.prompts.slice(forkPromptEnd)) { promptOrdinal += 1; - const continuationMessage = ClaudeAdapterV2.makeClaudeUserMessage({ text: prompt }); + const continuationMessage = ClaudeAdapterV2.makeClaudeUserMessage({ + origin: RECORDED_PROMPT_ORIGIN, + text: prompt, + }); input.entries.push({ type: "expect_outbound", label: `prompt.offer:${promptOrdinal}`, @@ -2371,7 +2394,10 @@ async function recordInterruptedClaudeQuery(input: { options, }); const iterator = runtime[Symbol.asyncIterator](); - const message = ClaudeAdapterV2.makeClaudeUserMessage({ text: input.prompt }); + const message = ClaudeAdapterV2.makeClaudeUserMessage({ + origin: RECORDED_PROMPT_ORIGIN, + text: input.prompt, + }); input.entries.push({ type: "expect_outbound", label: input.promptOfferLabel, @@ -2547,7 +2573,10 @@ async function recordClaudeInterruptRestartQuery(input: { label: "query.open:2", frame: makeClaudeQueryOpenFrame({ options: secondOptions }), }); - const secondMessage = ClaudeAdapterV2.makeClaudeUserMessage({ text: input.prompts[1]! }); + const secondMessage = ClaudeAdapterV2.makeClaudeUserMessage({ + origin: RECORDED_PROMPT_ORIGIN, + text: input.prompts[1]!, + }); input.entries.push({ type: "expect_outbound", label: "prompt.offer:2", diff --git a/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts b/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts index 3639374d1a320..893f5f8681b48 100644 --- a/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts +++ b/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts @@ -2744,9 +2744,21 @@ function isSupportedClaudeImageMimeType( return supportedClaudeImageMimeTypes.has(mimeType); } +// Claude's trust gates, like artifact comment auto-replies, need typed input stamped human. +function claudeMessageOrigin( + message: ProviderAdapter.ProviderAdapterV2TurnMessage, +): SDKUserMessage["origin"] { + return message.createdBy === "user" && + (message.creationSource === "web" || message.creationSource === "mobile") && + message.scheduledTaskId === undefined + ? { kind: "human" } + : undefined; +} + export function makeClaudeUserMessage(input: { readonly text: string; readonly priority?: SDKUserMessage["priority"]; + readonly origin?: SDKUserMessage["origin"]; readonly skills?: ReadonlyMap; readonly skillMentionsFrom?: number; readonly uuid?: SDKUserMessage["uuid"]; @@ -2776,6 +2788,7 @@ export function makeClaudeUserMessage(input: { }, parent_tool_use_id: null, ...(input.priority === undefined ? {} : { priority: input.priority }), + ...(input.origin === undefined ? {} : { origin: input.origin }), ...(input.uuid === undefined ? {} : { uuid: input.uuid }), }; } @@ -2916,6 +2929,7 @@ const makeClaudeUserMessageWithAttachments = Effect.fnUntraced(function* (input: readonly text: string; readonly attachments: ReadonlyArray; readonly priority?: SDKUserMessage["priority"]; + readonly origin?: SDKUserMessage["origin"]; readonly uuid?: SDKUserMessage["uuid"]; readonly attachmentsDir: string; readonly fileSystem: FileSystem.FileSystem; @@ -2931,6 +2945,7 @@ const makeClaudeUserMessageWithAttachments = Effect.fnUntraced(function* (input: ? {} : { skillMentionsFrom: input.skillMentionsFrom }), ...(input.priority === undefined ? {} : { priority: input.priority }), + ...(input.origin === undefined ? {} : { origin: input.origin }), ...(input.uuid === undefined ? {} : { uuid: input.uuid }), }); const bytes = Buffer.byteLength(encodeClaudeJson(message.message.content)); @@ -3096,6 +3111,7 @@ const makeClaudeUserMessageWithAttachments = Effect.fnUntraced(function* (input: }, parent_tool_use_id: null, ...(input.priority === undefined ? {} : { priority: input.priority }), + ...(input.origin === undefined ? {} : { origin: input.origin }), ...(input.uuid === undefined ? {} : { uuid: input.uuid }), } satisfies SDKUserMessage; }); @@ -12829,6 +12845,7 @@ export const makeClaudeAdapterV2 = Effect.fn("makeClaudeAdapterV2")(function* ( fileSystem, pdfReservation, ...(skills === undefined ? {} : { skills }), + origin: claudeMessageOrigin(turnInput.message), uuid: promptUuid, }).pipe( Effect.provideService(ChildProcessSpawner.ChildProcessSpawner, spawner), @@ -13360,6 +13377,7 @@ export const makeClaudeAdapterV2 = Effect.fn("makeClaudeAdapterV2")(function* ( ), attachments: turnInput.message.attachments, priority: "now", + origin: claudeMessageOrigin(turnInput.message), uuid: steerUuid, attachmentsDir, fileSystem, diff --git a/apps/server/src/orchestration-v2/Orchestrator.ts b/apps/server/src/orchestration-v2/Orchestrator.ts index 062049e71cc78..b398ad620e07e 100644 --- a/apps/server/src/orchestration-v2/Orchestrator.ts +++ b/apps/server/src/orchestration-v2/Orchestrator.ts @@ -3270,14 +3270,15 @@ const makeOrchestrator = Effect.fn("orchestrationV2.Orchestrator.layer")(functio worktreeSetupPending(projection) ) return; - const { messages } = projection; - const unattended = new Set( - messages - .filter((message) => message.createdBy !== "user" || message.scheduledTaskId !== undefined) - .map((message) => message.id), - ); + const messages = new Map(projection.messages.map((message) => [message.id, message])); const now = yield* DateTime.now; - const released = held.filter((run) => unattended.has(run.userMessageId)); + const released = held.filter((run) => { + const message = messages.get(run.userMessageId); + return ( + message !== undefined && + ((run.queuedBy ?? message.createdBy) !== "user" || message.scheduledTaskId !== undefined) + ); + }); if (released.length === 0) return; yield* writeSystemEvents( released.map((run) => ({ @@ -4304,21 +4305,17 @@ const makeOrchestrator = Effect.fn("orchestrationV2.Orchestrator.layer")(functio projection.runs.filter((run) => run.status === "queued").map((run) => run.userMessageId), ) .pipe(mapDispatchError(command)); - const automaticMessageIds = new Set( - [...queuedMessages.values()] - .filter( - (message) => - message.role === "user" && - (message.createdBy !== "user" || - message.scheduledTaskId !== undefined || - message.notification !== undefined || - message.delegatedCompletion !== undefined), - ) - .map((message) => message.id), - ); - const automaticQueuedRuns = projection.runs.filter( - (run) => run.status === "queued" && automaticMessageIds.has(run.userMessageId), - ); + const automaticQueuedRuns = projection.runs.filter((run) => { + const message = queuedMessages.get(run.userMessageId); + return ( + run.status === "queued" && + message?.role === "user" && + ((run.queuedBy ?? message.createdBy) !== "user" || + message.scheduledTaskId !== undefined || + message.notification !== undefined || + message.delegatedCompletion !== undefined) + ); + }); const runningRunExists = projection.runs.some((run) => ["preparing", "starting", "running", "waiting"].includes(run.status), ); @@ -7534,6 +7531,10 @@ const makeOrchestrator = Effect.fn("orchestrationV2.Orchestrator.layer")(functio .map((candidate) => candidate.queuePosition ?? candidate.ordinal), ) + 1; } + const queuedBy = projection.runs.find( + (candidate) => + candidate.userMessageId === command.messageId && candidate.queuedBy !== undefined, + )?.queuedBy; const run: OrchestrationV2Run = { id: runId, threadId: command.threadId, @@ -7545,6 +7546,7 @@ const makeOrchestrator = Effect.fn("orchestrationV2.Orchestrator.layer")(functio rootNodeId, activeAttemptId: attemptId, status: "queued", + ...(queuedBy === undefined ? {} : { queuedBy }), ...(steerWhenReadyRunId === undefined ? {} : { steerWhenReadyRunId }), ...(worktreeMissingRun !== undefined || (heldRunsToRelease.length === 0 && @@ -11623,6 +11625,20 @@ const makeOrchestrator = Effect.fn("orchestrationV2.Orchestrator.layer")(functio const now = yield* DateTime.now; const emitEvent = emit(events, command); + if ( + command.editor !== undefined && + command.editor.createdBy !== queuedMessage.createdBy && + queuedRun.queuedBy === undefined + ) { + yield* emitEvent({ + type: "run.updated", + threadId: command.threadId, + runId: queuedRun.id, + providerInstanceId: queuedRun.providerInstanceId, + occurredAt: now, + payload: { ...queuedRun, queuedBy: queuedMessage.createdBy }, + }); + } const editedAttachments = command.attachments === undefined ? {} : { attachments: command.attachments }; yield* emitEvent({ @@ -11634,6 +11650,7 @@ const makeOrchestrator = Effect.fn("orchestrationV2.Orchestrator.layer")(functio occurredAt: now, payload: withoutGuestAttribution({ ...queuedMessage, + ...command.editor, text: command.text, ...editedAttachments, ...(command.context ? { context: command.context } : {}), @@ -11650,6 +11667,7 @@ const makeOrchestrator = Effect.fn("orchestrationV2.Orchestrator.layer")(functio occurredAt: now, payload: withoutGuestAttribution({ ...queuedTurnItem, + ...command.editor, text: command.text, ...editedAttachments, ...(command.context ? { context: command.context } : {}), diff --git a/apps/server/src/orchestration-v2/SteeringCompletion.integration.test.ts b/apps/server/src/orchestration-v2/SteeringCompletion.integration.test.ts index 129b0e266425f..9fb0c98178aaa 100644 --- a/apps/server/src/orchestration-v2/SteeringCompletion.integration.test.ts +++ b/apps/server/src/orchestration-v2/SteeringCompletion.integration.test.ts @@ -1412,6 +1412,7 @@ const declinedSteerTimings = [ "stop-before-decline", "stop-after-decline", "queued-model", + "agent-edited", "two-steers", ] as const; @@ -1507,21 +1508,68 @@ it.effect.each(declinedSteerTimings)( ); } const messageId = MessageId.make("message:declined"); - yield* orchestrator.dispatch({ - type: "message.dispatch", - commandId: CommandId.make("steer"), - threadId, - messageId, - text: "follow up", - attachments: [], - ...(timing === "queued-model" ? { modelSelection: steerSelection } : {}), - dispatchMode: { type: "steer_active", targetRunId: first.runId }, - createdBy: "user", - creationSource: "web", - }); + if (timing === "agent-edited") { + yield* Effect.forEach([MessageId.make("message:held"), messageId], (id) => + orchestrator.dispatch({ + type: "message.dispatch", + commandId: CommandId.make(`queue:${id}`), + threadId, + messageId: id, + text: id, + attachments: [], + dispatchMode: { type: "queue_after_active" }, + createdBy: "user", + creationSource: "web", + }), + ); + const { runs } = yield* orchestrator.getThreadProjection(threadId); + const held = runs.find((run) => run.userMessageId === MessageId.make("message:held"))!; + const queuedRunId = runs.find((run) => run.userMessageId === messageId)!.id; + // A Stop held the user's queue and a provider wake started past it. + yield* (yield* EventSink.EventSinkV2).write({ + events: [ + { + id: EventId.make("hold-queue"), + type: "run.updated", + threadId, + runId: held.id, + occurredAt: yield* DateTime.now, + payload: { ...held, queueHeld: true }, + }, + ], + }); + yield* orchestrator.dispatch({ + type: "queued-run.edit", + commandId: CommandId.make("agent-edit"), + threadId, + runId: queuedRunId, + text: "follow up", + editor: { createdBy: "agent", creationSource: "mcp" }, + }); + yield* orchestrator.dispatch({ + type: "queued-message.promote-to-steer", + commandId: CommandId.make("steer"), + threadId, + queuedRunId, + targetRunId: first.runId, + }); + } else { + yield* orchestrator.dispatch({ + type: "message.dispatch", + commandId: CommandId.make("steer"), + threadId, + messageId, + text: "follow up", + attachments: [], + ...(timing === "queued-model" ? { modelSelection: steerSelection } : {}), + dispatchMode: { type: "steer_active", targetRunId: first.runId }, + createdBy: "user", + creationSource: "web", + }); + } yield* worker.drain(); const pending = yield* orchestrator.getThreadProjection(threadId); - const queued = pending.runs.find( + const queued = pending.runs.findLast( (run) => run.userMessageId === messageId && run.id !== first.runId, ); const effects = yield* (yield* EffectOutbox.EffectOutboxV2).listByCommandId( @@ -1581,6 +1629,31 @@ it.effect.each(declinedSteerTimings)( assert.equal(started.length, 1); return; } + if (timing === "agent-edited") { + assert.isTrue(queued?.queueHeld); + yield* orchestrator.dispatch({ + type: "message.dispatch", + commandId: CommandId.make("wake"), + threadId, + messageId: MessageId.make("message:wake"), + text: "wake", + attachments: [], + dispatchMode: { type: "queue_after_active" }, + createdBy: "agent", + creationSource: "provider", + }); + } + const nextStarted = yield* orchestrator.streamDomainEvents.pipe( + Stream.filter( + (event) => + event.type === "run.updated" && + event.payload.id !== first.runId && + event.payload.status === "starting", + ), + Stream.take(1), + Stream.runDrain, + Effect.forkScoped, + ); const settled = yield* orchestrator.streamDomainEvents.pipe( Stream.filter( (event) => @@ -1610,9 +1683,17 @@ it.effect.each(declinedSteerTimings)( }); yield* Fiber.join(settled); yield* worker.drain(); + // The run-update listener releases unattended holds, then starts the next queued run. + yield* Fiber.join(nextStarted); yield* orchestrator.resumeQueuedRuns; yield* worker.drain(); assert.equal(started.length, 2); + if (timing === "agent-edited") { + assert.equal(started[1]?.message.messageId, MessageId.make("message:wake")); + const after = yield* orchestrator.getThreadProjection(threadId); + assert.isTrue(after.runs.find((run) => run.id === queued?.id)?.queueHeld); + return; + } assert.equal(started[1]?.message.messageId, messageId); assert.equal(started[1]?.runId, queued?.id); }).pipe(Effect.provide(layer)); diff --git a/apps/server/src/orchestration-v2/ThreadManagementService.test.ts b/apps/server/src/orchestration-v2/ThreadManagementService.test.ts index d1ae8ab555161..db49adf776085 100644 --- a/apps/server/src/orchestration-v2/ThreadManagementService.test.ts +++ b/apps/server/src/orchestration-v2/ThreadManagementService.test.ts @@ -87,6 +87,35 @@ it("stamps authoritative provenance on commands that create threads or messages" expect(stamped).not.toHaveProperty("linkOrigin"); expect(stamped).not.toHaveProperty("delegatedFrom"); expect(stamped).not.toHaveProperty("initialMessage"); + + for (const creationSource of ["web", "mobile"] as const) { + expect( + ThreadManagementService.withCreationProvenance( + { + type: "queued-run.edit", + commandId: CommandId.make("command:thread-management:edit"), + threadId: command.threadId, + runId: RunId.make("run:thread-management:edit"), + text: "Edited by the user", + editor: { createdBy: "agent", creationSource: "mcp" }, + }, + { createdBy: "user", creationSource }, + ), + ).toMatchObject({ editor: { createdBy: "user", creationSource } }); + } + // Older clients send no editor, so the edit keeps the message's existing provenance. + expect( + ThreadManagementService.withCreationProvenance( + { + type: "queued-run.edit", + commandId: CommandId.make("command:thread-management:edit-legacy"), + threadId: command.threadId, + runId: RunId.make("run:thread-management:edit"), + text: "Edited by an older client", + }, + { createdBy: "user", creationSource: "web" }, + ), + ).not.toHaveProperty("editor"); }); const layerReceiptsTest = CommandReceiptStore.layer.pipe( diff --git a/apps/server/src/orchestration-v2/ThreadManagementService.ts b/apps/server/src/orchestration-v2/ThreadManagementService.ts index a6aad880cd88a..4f0fa6dd8f405 100644 --- a/apps/server/src/orchestration-v2/ThreadManagementService.ts +++ b/apps/server/src/orchestration-v2/ThreadManagementService.ts @@ -98,6 +98,8 @@ export function withCreationProvenance( case "thread.merge_back": case "delegated_task.request": return { ...command, ...provenance }; + case "queued-run.edit": + return command.editor === undefined ? command : { ...command, editor: provenance }; default: return command; } diff --git a/apps/server/src/orchestration-v2/runtimeLayer.test.ts b/apps/server/src/orchestration-v2/runtimeLayer.test.ts index d9538b4e72e24..4ce9a2049f82e 100644 --- a/apps/server/src/orchestration-v2/runtimeLayer.test.ts +++ b/apps/server/src/orchestration-v2/runtimeLayer.test.ts @@ -6710,6 +6710,34 @@ it.layer(layerTest)("OrchestrationV2LayerLive lifecycle", (it) => { blocked.runs.filter((run) => run.status === "queued").map((run) => run.userMessageId), ["settle-automatic-user-queued", "settle-automatic-agent-queued-2"], ); + + // An agent's edit restamps the user's held message; it stays the user's and still blocks. + const userRun = blocked.runs.find( + (run) => run.userMessageId === "settle-automatic-user-queued", + ); + assert.isDefined(userRun); + yield* orchestrator.dispatch({ + type: "queued-run.edit", + commandId: CommandId.make("settle-automatic-agent-edit"), + threadId, + runId: userRun.id, + text: "settle-automatic-user-queued, edited by an agent", + editor: { createdBy: "agent", creationSource: "mcp" }, + }); + const editedError = yield* orchestrator + .dispatch({ + type: "thread.settle", + commandId: CommandId.make("settle-automatic-settle-3"), + threadId, + }) + .pipe(Effect.flip); + assert.equal(editedError.cause, error.cause); + assert.deepEqual( + (yield* orchestrator.getThreadProjection(threadId)).runs + .filter((run) => run.status === "queued") + .map((run) => run.userMessageId), + ["settle-automatic-user-queued", "settle-automatic-agent-queued-2"], + ); }), ); @@ -7759,6 +7787,7 @@ it.layer(layerTest)("OrchestrationV2LayerLive lifecycle", (it) => { it.effect("releases held agent messages once a later run completes, not the user's", () => Effect.gen(function* () { + const orchestrator = yield* Orchestrator.OrchestratorV2; const eventSink = yield* EventSink.EventSinkV2; const threadId = ThreadId.make("runtime-layer-failed-queue-agent-messages"); const { send, runFor, end, startedRunIds, releasedAfter, awaitHeld } = @@ -7771,6 +7800,15 @@ it.layer(layerTest)("OrchestrationV2LayerLive lifecycle", (it) => { yield* end("active", "failed"); yield* awaitHeld("issue"); assert.isTrue((yield* runFor("issue")).queueHeld); + // An agent's edit restamps the user's message but leaves the user's hold in place. + yield* orchestrator.dispatch({ + type: "queued-run.edit", + commandId: CommandId.make(`${threadId}:edit:user`), + threadId, + runId: (yield* runFor("user")).id, + text: "user, edited by an agent", + editor: { createdBy: "agent", creationSource: "mcp" }, + }); // Delivery bookkeeping rewrites an older completed run; the thread has not moved on. yield* end("earlier", "completed", ":bookkeeping"); // A scheduled tick finds the thread idle and starts past the held queue. @@ -9629,6 +9667,51 @@ it.layer(layerTest)("OrchestrationV2LayerLive lifecycle", (it) => { ); assert.deepEqual(yield* effectRequests("runtime-layer-queued-edit-text-only"), []); + yield* orchestrator.dispatch({ + type: "queued-run.edit", + commandId: CommandId.make("runtime-layer-queued-edit-agent"), + threadId, + runId: queuedRun.id, + text: "Agent-authored replacement.", + editor: { createdBy: "agent", creationSource: "mcp" }, + }); + const afterAgentEdit = yield* orchestrator.getThreadProjection(threadId); + const agentEditedMessage = afterAgentEdit.messages.find( + (message) => message.id === queuedRun.userMessageId, + ); + assert.equal(agentEditedMessage?.createdBy, "agent"); + assert.equal(agentEditedMessage?.creationSource, "mcp"); + assert.equal(agentEditedMessage?.text, "Agent-authored replacement."); + + yield* orchestrator.dispatch({ + type: "queued-run.edit", + commandId: CommandId.make("runtime-layer-queued-edit-legacy"), + threadId, + runId: queuedRun.id, + text: "An unattributed edit must not restore human provenance.", + }); + const afterLegacyEdit = yield* orchestrator.getThreadProjection(threadId); + assert.equal( + afterLegacyEdit.messages.find((message) => message.id === queuedRun.userMessageId) + ?.createdBy, + "agent", + ); + + yield* orchestrator.dispatch({ + type: "queued-run.edit", + commandId: CommandId.make("runtime-layer-queued-edit-human"), + threadId, + runId: queuedRun.id, + text: "Human-authored replacement.", + editor: { createdBy: "user", creationSource: "mobile" }, + }); + const afterHumanEdit = yield* orchestrator.getThreadProjection(threadId); + const humanEditedMessage = afterHumanEdit.messages.find( + (message) => message.id === queuedRun.userMessageId, + ); + assert.equal(humanEditedMessage?.createdBy, "user"); + assert.equal(humanEditedMessage?.creationSource, "mobile"); + const emptyEditError = yield* orchestrator .dispatch({ type: "queued-run.edit", diff --git a/apps/server/src/orchestration-v2/testkit/OrchestratorReplayRestartBackgroundNote.integration.test.ts b/apps/server/src/orchestration-v2/testkit/OrchestratorReplayRestartBackgroundNote.integration.test.ts index d8b2a0332eba4..a0a8c416d8d21 100644 --- a/apps/server/src/orchestration-v2/testkit/OrchestratorReplayRestartBackgroundNote.integration.test.ts +++ b/apps/server/src/orchestration-v2/testkit/OrchestratorReplayRestartBackgroundNote.integration.test.ts @@ -70,6 +70,7 @@ const readRestartTranscript = Effect.fn("readRestartTranscript")(function* ( type: "user", message: { role: "user", content: text }, parent_tool_use_id: null, + origin: { kind: "human" }, }, }, }, diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/claude_background_monitor_wake/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/claude_background_monitor_wake/claude_transcript.ndjson index afc19f75dc295..fcaf57f3ffe70 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/claude_background_monitor_wake/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/claude_background_monitor_wake/claude_transcript.ndjson @@ -1,6 +1,6 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"claude_background_monitor_wake","metadata":{"prompts":["Live-test a background Monitor wake. You must call the Monitor tool before replying. Do exactly this, with no extra steps.\n\n1) Call the Monitor tool with description \"Background monitor test\" and this exact command:\n sleep 8 && echo MONITOR_DONE\n2) After that tool call returns, reply with exactly STARTED and stop. Do not poll, read its output, or wait for it.\n3) When its completion is reported later, reply with exactly WAKE_DONE and stop."],"model":"claude-sonnet-4-6","nativeSessionId":"64676197-7fbc-467e-aeac-eae812bfce63","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","backgroundWakeCounts":[1],"generatedBy":"recordClaudeAgentSdkReplayTranscript"}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"claude_background_monitor_wake","metadata":{"prompts":["Live-test a background Monitor wake. You must call the Monitor tool before replying. Do exactly this, with no extra steps.\n\n1) Call the Monitor tool with description \"Background monitor test\" and this exact command:\n sleep 8 && echo MONITOR_DONE\n2) After that tool call returns, reply with exactly STARTED and stop. Do not poll, read its output, or wait for it.\n3) When its completion is reported later, reply with exactly WAKE_DONE and stop."],"model":"claude-sonnet-4-6","nativeSessionId":"64676197-7fbc-467e-aeac-eae812bfce63","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","backgroundWakeCounts":[1],"generatedBy":"recordClaudeAgentSdkReplayTranscript","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","settings":{"showThinkingSummaries":true},"allowDangerouslySkipPermissions":true,"sessionId":"64676197-7fbc-467e-aeac-eae812bfce63"}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Live-test a background Monitor wake. You must call the Monitor tool before replying. Do exactly this, with no extra steps.\n\n1) Call the Monitor tool with description \"Background monitor test\" and this exact command:\n sleep 8 && echo MONITOR_DONE\n2) After that tool call returns, reply with exactly STARTED and stop. Do not poll, read its output, or wait for it.\n3) When its completion is reported later, reply with exactly WAKE_DONE and stop."},"parent_tool_use_id":null,"uuid":"adf55c08-889c-4e86-8d93-06fc4b672108"}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Live-test a background Monitor wake. You must call the Monitor tool before replying. Do exactly this, with no extra steps.\n\n1) Call the Monitor tool with description \"Background monitor test\" and this exact command:\n sleep 8 && echo MONITOR_DONE\n2) After that tool call returns, reply with exactly STARTED and stop. Do not poll, read its output, or wait for it.\n3) When its completion is reported later, reply with exactly WAKE_DONE and stop."},"parent_tool_use_id":null,"uuid":"adf55c08-889c-4e86-8d93-06fc4b672108","origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"command_lifecycle","frame":{"type":"command_lifecycle","command_uuid":"adf55c08-889c-4e86-8d93-06fc4b672108","state":"queued","uuid":"91ea2e3b-de6f-4e62-b4a6-94b3eba0220b","session_id":"64676197-7fbc-467e-aeac-eae812bfce63"}} {"type":"emit_inbound","label":"command_lifecycle","frame":{"type":"command_lifecycle","command_uuid":"adf55c08-889c-4e86-8d93-06fc4b672108","state":"started","uuid":"e32ce64d-dd44-4696-b909-7747289aad48","session_id":"64676197-7fbc-467e-aeac-eae812bfce63"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.281","cwd":"/tmp/claude-replay-claude_background_monitor_wake","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"8e0a0969-84d9-4916-a1ae-be7c94d00a4e","session_id":"64676197-7fbc-467e-aeac-eae812bfce63"}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/claude_background_subagent_after_root/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/claude_background_subagent_after_root/claude_transcript.ndjson index 9a528c2480bab..405f669ab230c 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/claude_background_subagent_after_root/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/claude_background_subagent_after_root/claude_transcript.ndjson @@ -1,6 +1,6 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"claude_background_subagent_after_root","metadata":{"prompts":["Live-test a background subagent that keeps working after your turn ends. Do exactly this, with no extra steps.\n\n1) Use the Agent tool with run_in_background set to true to launch ONE general-purpose subagent with this prompt:\n \"Do 2 steps. Before each step, write exactly one line: SUB_STEP_N (N = 1, then 2). Then run this exact command with the Bash tool: sleep 3 && echo SUB_DONE_N. After both steps, reply with exactly: SUB_FINAL_REPORT\"\n2) Immediately after launching it, reply with exactly ROOT_STARTED and stop. Do not wait for it or check on it.\n3) When its completion is reported, reply with exactly ROOT_WAKE_DONE and stop."],"model":"claude-sonnet-4-6","nativeSessionId":"cca274e4-25ae-4171-b972-bbb31118517e","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","backgroundWakeCounts":[1],"generatedBy":"recordClaudeAgentSdkReplayTranscript"}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"claude_background_subagent_after_root","metadata":{"prompts":["Live-test a background subagent that keeps working after your turn ends. Do exactly this, with no extra steps.\n\n1) Use the Agent tool with run_in_background set to true to launch ONE general-purpose subagent with this prompt:\n \"Do 2 steps. Before each step, write exactly one line: SUB_STEP_N (N = 1, then 2). Then run this exact command with the Bash tool: sleep 3 && echo SUB_DONE_N. After both steps, reply with exactly: SUB_FINAL_REPORT\"\n2) Immediately after launching it, reply with exactly ROOT_STARTED and stop. Do not wait for it or check on it.\n3) When its completion is reported, reply with exactly ROOT_WAKE_DONE and stop."],"model":"claude-sonnet-4-6","nativeSessionId":"cca274e4-25ae-4171-b972-bbb31118517e","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","backgroundWakeCounts":[1],"generatedBy":"recordClaudeAgentSdkReplayTranscript","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","settings":{"showThinkingSummaries":true},"allowDangerouslySkipPermissions":true,"sessionId":"cca274e4-25ae-4171-b972-bbb31118517e"}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Live-test a background subagent that keeps working after your turn ends. Do exactly this, with no extra steps.\n\n1) Use the Agent tool with run_in_background set to true to launch ONE general-purpose subagent with this prompt:\n \"Do 2 steps. Before each step, write exactly one line: SUB_STEP_N (N = 1, then 2). Then run this exact command with the Bash tool: sleep 3 && echo SUB_DONE_N. After both steps, reply with exactly: SUB_FINAL_REPORT\"\n2) Immediately after launching it, reply with exactly ROOT_STARTED and stop. Do not wait for it or check on it.\n3) When its completion is reported, reply with exactly ROOT_WAKE_DONE and stop."},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Live-test a background subagent that keeps working after your turn ends. Do exactly this, with no extra steps.\n\n1) Use the Agent tool with run_in_background set to true to launch ONE general-purpose subagent with this prompt:\n \"Do 2 steps. Before each step, write exactly one line: SUB_STEP_N (N = 1, then 2). Then run this exact command with the Bash tool: sleep 3 && echo SUB_DONE_N. After both steps, reply with exactly: SUB_FINAL_REPORT\"\n2) Immediately after launching it, reply with exactly ROOT_STARTED and stop. Do not wait for it or check on it.\n3) When its completion is reported, reply with exactly ROOT_WAKE_DONE and stop."},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.280","cwd":"/tmp/claude-replay-claude_background_subagent_after_root","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"ee3f6b98-4849-495a-abb1-37faacb17b52","session_id":"cca274e4-25ae-4171-b972-bbb31118517e"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"status","status":"requesting","session_id":"cca274e4-25ae-4171-b972-bbb31118517e","uuid":"e991590d-2d22-4b95-adcd-fc290a2a65d6"}} {"type":"emit_inbound","label":"stream_event","frame":{"type":"stream_event","event":{"type":"message_start","message":{"model":"claude-sonnet-4-6","id":"msg_011CfMZATZbmjsnGq3KN8YAS","type":"message","role":"assistant","content":[],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":61993,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":61993},"output_tokens":8,"service_tier":"standard","inference_geo":"not_available"},"diagnostics":null,"context_management":null}},"session_id":"cca274e4-25ae-4171-b972-bbb31118517e","parent_tool_use_id":null,"uuid":"3b57aa17-471d-4f9c-9473-b185eca22030","ttft_ms":1814}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/claude_background_subagent_lifecycle/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/claude_background_subagent_lifecycle/claude_transcript.ndjson index 6c9bad42c0fbb..65b0e494e0a34 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/claude_background_subagent_lifecycle/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/claude_background_subagent_lifecycle/claude_transcript.ndjson @@ -1,6 +1,6 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"claude_background_subagent_lifecycle","metadata":{"prompts":["Live-test background subagents. You must call the Agent tool before replying. Do exactly this, with no extra steps.\n\n1) In one message, make TWO Agent tool calls that launch general-purpose subagents, both with run_in_background set to true:\n - description \"Agent A\", model \"haiku\", prompt: \"Reply with exactly: A_FIRST\"\n - description \"Agent B\", prompt: \"Call the Bash tool in the foreground (run_in_background false) with this exact command and wait for it: node -e \\\"setTimeout(() => console.log('B_DONE'), 90000)\\\" Then reply with exactly: B_FINAL\"\n2) After both calls return, reply with exactly LAUNCHED and stop. Do not wait for them or check on them.\n3) When Agent A's completion is reported, reply with exactly A_REPORTED and stop.","Stop Agent B now with the TaskStop tool. Then reply with exactly: B_STOPPED","Use the SendMessage tool to send Agent A this message: Reply with exactly: A_SECOND\nThen reply with exactly RESUMED and stop. When Agent A's new completion is reported, reply with exactly A_RESUME_REPORTED and stop.","Reply with exactly: ALL_DONE"],"model":"claude-sonnet-4-6","nativeSessionId":"d87b5f75-35b2-4e8b-a518-815b77b99304","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","backgroundWakeCounts":[1,0,1,0],"generatedBy":"recordClaudeAgentSdkReplayTranscript"}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"claude_background_subagent_lifecycle","metadata":{"prompts":["Live-test background subagents. You must call the Agent tool before replying. Do exactly this, with no extra steps.\n\n1) In one message, make TWO Agent tool calls that launch general-purpose subagents, both with run_in_background set to true:\n - description \"Agent A\", model \"haiku\", prompt: \"Reply with exactly: A_FIRST\"\n - description \"Agent B\", prompt: \"Call the Bash tool in the foreground (run_in_background false) with this exact command and wait for it: node -e \\\"setTimeout(() => console.log('B_DONE'), 90000)\\\" Then reply with exactly: B_FINAL\"\n2) After both calls return, reply with exactly LAUNCHED and stop. Do not wait for them or check on them.\n3) When Agent A's completion is reported, reply with exactly A_REPORTED and stop.","Stop Agent B now with the TaskStop tool. Then reply with exactly: B_STOPPED","Use the SendMessage tool to send Agent A this message: Reply with exactly: A_SECOND\nThen reply with exactly RESUMED and stop. When Agent A's new completion is reported, reply with exactly A_RESUME_REPORTED and stop.","Reply with exactly: ALL_DONE"],"model":"claude-sonnet-4-6","nativeSessionId":"d87b5f75-35b2-4e8b-a518-815b77b99304","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","backgroundWakeCounts":[1,0,1,0],"generatedBy":"recordClaudeAgentSdkReplayTranscript","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","settings":{"showThinkingSummaries":true},"allowDangerouslySkipPermissions":true,"sessionId":"d87b5f75-35b2-4e8b-a518-815b77b99304"}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Live-test background subagents. You must call the Agent tool before replying. Do exactly this, with no extra steps.\n\n1) In one message, make TWO Agent tool calls that launch general-purpose subagents, both with run_in_background set to true:\n - description \"Agent A\", model \"haiku\", prompt: \"Reply with exactly: A_FIRST\"\n - description \"Agent B\", prompt: \"Call the Bash tool in the foreground (run_in_background false) with this exact command and wait for it: node -e \\\"setTimeout(() => console.log('B_DONE'), 90000)\\\" Then reply with exactly: B_FINAL\"\n2) After both calls return, reply with exactly LAUNCHED and stop. Do not wait for them or check on them.\n3) When Agent A's completion is reported, reply with exactly A_REPORTED and stop."},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Live-test background subagents. You must call the Agent tool before replying. Do exactly this, with no extra steps.\n\n1) In one message, make TWO Agent tool calls that launch general-purpose subagents, both with run_in_background set to true:\n - description \"Agent A\", model \"haiku\", prompt: \"Reply with exactly: A_FIRST\"\n - description \"Agent B\", prompt: \"Call the Bash tool in the foreground (run_in_background false) with this exact command and wait for it: node -e \\\"setTimeout(() => console.log('B_DONE'), 90000)\\\" Then reply with exactly: B_FINAL\"\n2) After both calls return, reply with exactly LAUNCHED and stop. Do not wait for them or check on them.\n3) When Agent A's completion is reported, reply with exactly A_REPORTED and stop."},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.281","cwd":"/tmp/claude-replay-claude_background_subagent_lifecycle","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"c2d453f2-ce39-41c6-8b15-c735ce3dd4d1","session_id":"d87b5f75-35b2-4e8b-a518-815b77b99304"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"status","status":"requesting","session_id":"d87b5f75-35b2-4e8b-a518-815b77b99304","uuid":"5688cda0-1881-4260-a6d3-795e68f0531a"}} {"type":"emit_inbound","label":"stream_event","frame":{"type":"stream_event","event":{"type":"message_start","message":{"model":"claude-sonnet-4-6","id":"msg_011CfP3ajYTzZctSLJyc9bTK","type":"message","role":"assistant","content":[],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":11983,"cache_read_input_tokens":24699,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":11983},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"},"diagnostics":{"cache_miss_reason":{"type":"messages_changed","cache_missed_input_tokens":12321}},"context_management":null}},"session_id":"d87b5f75-35b2-4e8b-a518-815b77b99304","parent_tool_use_id":null,"uuid":"6ca2dd7a-2f62-4efc-9ad5-ad318c4faaf2","ttft_ms":2500}} @@ -130,7 +130,7 @@ {"type":"emit_inbound","label":"stream_event","frame":{"type":"stream_event","event":{"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"container":null},"usage":{"input_tokens":3,"cache_creation_input_tokens":426,"cache_read_input_tokens":37726,"output_tokens":7,"output_tokens_details":{"thinking_tokens":0},"iterations":[{"input_tokens":3,"output_tokens":7,"cache_read_input_tokens":37726,"cache_creation_input_tokens":426,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":426},"type":"message"}]},"context_management":{"applied_edits":[]}},"session_id":"d87b5f75-35b2-4e8b-a518-815b77b99304","parent_tool_use_id":null,"uuid":"c704a4e8-6adf-4258-b056-b9d8c4e9544f"}} {"type":"emit_inbound","label":"stream_event","frame":{"type":"stream_event","event":{"type":"message_stop"},"session_id":"d87b5f75-35b2-4e8b-a518-815b77b99304","parent_tool_use_id":null,"uuid":"914d8a07-66d0-41d4-82c1-54cf5677bd36"}} {"type":"emit_inbound","label":"result:background-wake:1","frame":{"duration_api_ms":11841,"stop_reason":"end_turn","session_id":"d87b5f75-35b2-4e8b-a518-815b77b99304","total_cost_usd":0.1287655,"usage":{"input_tokens":3,"cache_creation_input_tokens":426,"cache_read_input_tokens":37726,"output_tokens":7,"output_tokens_details":{"thinking_tokens":0},"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":426,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":3,"output_tokens":7,"cache_read_input_tokens":37726,"cache_creation_input_tokens":426,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":426},"type":"message"}],"speed":"standard"},"modelUsage":{"claude-sonnet-4-6":{"inputTokens":10,"outputTokens":323,"cacheReadInputTokens":100311,"cacheCreationInputTokens":13453,"webSearchRequests":0,"costUSD":0.11568630000000002,"contextWindow":200000,"maxOutputTokens":32000,"thinkingTokens":35,"canonicalModel":"claude-sonnet-4-6","provider":"firstParty","costBasis":"list"},"claude-haiku-4-5-20251001":{"inputTokens":10,"outputTokens":56,"cacheReadInputTokens":14652,"cacheCreationInputTokens":5662,"webSearchRequests":0,"costUSD":0.013079200000000001,"contextWindow":200000,"maxOutputTokens":32000,"thinkingTokens":46,"canonicalModel":"claude-haiku-4-5","provider":"firstParty","costBasis":"list"}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","origin":{"kind":"task-notification"},"subagent_stats":{"spawned":2,"requested":{"background":2,"foreground":0,"unset":0},"started_in_background":2,"max_depth":1,"spawned_by_subagents":0,"completed":1,"failed":0,"killed":{"parent":0,"user":0,"system":0},"refused":{"depth_limit":0,"concurrency_limit":0,"budget":0},"by_type":{"general-purpose":2}},"is_error":false,"num_turns":1,"subtype":"success","api_error_status":null,"result":"A_REPORTED","ttft_ms":1908,"type":"result","duration_ms":1929,"uuid":"b49d3c5a-cbc9-4144-b36c-6f5a8019c373","ttft_stream_ms":1839,"time_to_request_ms":25,"first_content_frame_ms":1840,"queued_turn_count":0,"result_index":1}} -{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Stop Agent B now with the TaskStop tool. Then reply with exactly: B_STOPPED"},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Stop Agent B now with the TaskStop tool. Then reply with exactly: B_STOPPED"},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"assistant","frame":{"type":"assistant","message":{"model":"claude-sonnet-4-6","id":"msg_011CfP3b6L7eAwqbrRPWnZnW","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_013WR5HJDmonrQMKYVcRvwPx","name":"Bash","input":{"command":"node -e \"setTimeout(() => console.log('B_DONE'), 90000)\"","description":"Wait 90 seconds then print B_DONE","timeout":120000,"run_in_background":false},"caller":{"type":"direct"}}],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":5534,"cache_read_input_tokens":14315,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":5534},"output_tokens":8,"service_tier":"standard","inference_geo":"not_available"},"diagnostics":{"cache_miss_reason":{"type":"messages_changed","cache_missed_input_tokens":5266}},"context_management":null},"parent_tool_use_id":"toolu_01S6ww4YPkENakG6NCFnChBU","session_id":"d87b5f75-35b2-4e8b-a518-815b77b99304","uuid":"0258abe8-ddd8-4f39-903c-e8b81038e83b","timestamp":"2026-09-24T22:22:30.319Z","subagent_type":"general-purpose","task_description":"Agent B"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"task_progress","task_id":"af44d5c14aa3ce867","tool_use_id":"toolu_01S6ww4YPkENakG6NCFnChBU","description":"Running Wait 90 seconds then print B_DONE","subagent_type":"general-purpose","usage":{"total_tokens":20010,"tool_uses":1,"duration_ms":4923},"last_tool_name":"Bash","uuid":"97c7b182-310d-4c8c-92af-568900b2b741","session_id":"d87b5f75-35b2-4e8b-a518-815b77b99304"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.281","cwd":"/tmp/claude-replay-claude_background_subagent_lifecycle","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"1f8918c7-3b99-4377-a044-eca1c3311e24","session_id":"d87b5f75-35b2-4e8b-a518-815b77b99304"}} @@ -235,7 +235,7 @@ {"type":"emit_inbound","label":"stream_event","frame":{"type":"stream_event","event":{"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"container":null},"usage":{"input_tokens":3,"cache_creation_input_tokens":388,"cache_read_input_tokens":38371,"output_tokens":10,"output_tokens_details":{"thinking_tokens":0},"iterations":[{"input_tokens":3,"output_tokens":10,"cache_read_input_tokens":38371,"cache_creation_input_tokens":388,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":388},"type":"message"}]},"context_management":{"applied_edits":[]}},"session_id":"d87b5f75-35b2-4e8b-a518-815b77b99304","parent_tool_use_id":null,"uuid":"af9dbd75-e468-4487-adea-11e7da00255d"}} {"type":"emit_inbound","label":"stream_event","frame":{"type":"stream_event","event":{"type":"message_stop"},"session_id":"d87b5f75-35b2-4e8b-a518-815b77b99304","parent_tool_use_id":null,"uuid":"33548044-648f-431f-bfb4-5dcf43c7326c"}} {"type":"emit_inbound","label":"result:background-wake:2","frame":{"duration_api_ms":24116,"stop_reason":"end_turn","session_id":"d87b5f75-35b2-4e8b-a518-815b77b99304","total_cost_usd":0.22417900000000002,"usage":{"input_tokens":6,"cache_creation_input_tokens":761,"cache_read_input_tokens":76737,"output_tokens":63,"output_tokens_details":{"thinking_tokens":48},"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":761,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":3,"output_tokens":10,"cache_read_input_tokens":38371,"cache_creation_input_tokens":388,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":388},"type":"message"}],"speed":"standard"},"modelUsage":{"claude-sonnet-4-6":{"inputTokens":23,"outputTokens":730,"cacheReadInputTokens":267696,"cacheCreationInputTokens":19962,"webSearchRequests":0,"costUSD":0.2110998,"contextWindow":200000,"maxOutputTokens":32000,"thinkingTokens":195,"canonicalModel":"claude-sonnet-4-6","provider":"firstParty","costBasis":"list"},"claude-haiku-4-5-20251001":{"inputTokens":10,"outputTokens":56,"cacheReadInputTokens":14652,"cacheCreationInputTokens":5662,"webSearchRequests":0,"costUSD":0.013079200000000001,"contextWindow":200000,"maxOutputTokens":32000,"thinkingTokens":46,"canonicalModel":"claude-haiku-4-5","provider":"firstParty","costBasis":"list"}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","origin":{"kind":"task-notification"},"subagent_stats":{"spawned":2,"requested":{"background":2,"foreground":0,"unset":0},"started_in_background":2,"max_depth":1,"spawned_by_subagents":0,"completed":1,"failed":0,"killed":{"parent":1,"user":0,"system":0},"refused":{"depth_limit":0,"concurrency_limit":0,"budget":0},"by_type":{"general-purpose":2}},"is_error":false,"num_turns":2,"subtype":"success","api_error_status":null,"result":"Agent B has been confirmed killed.","ttft_ms":2261,"type":"result","duration_ms":3967,"uuid":"d270fcf9-505e-4c05-9f8d-cdbf0a7ddb53","ttft_stream_ms":1478,"time_to_request_ms":15,"first_content_frame_ms":1558,"queued_turn_count":0,"result_index":3}} -{"type":"expect_outbound","label":"prompt.offer:3","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Use the SendMessage tool to send Agent A this message: Reply with exactly: A_SECOND\nThen reply with exactly RESUMED and stop. When Agent A's new completion is reported, reply with exactly A_RESUME_REPORTED and stop."},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:3","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Use the SendMessage tool to send Agent A this message: Reply with exactly: A_SECOND\nThen reply with exactly RESUMED and stop. When Agent A's new completion is reported, reply with exactly A_RESUME_REPORTED and stop."},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.281","cwd":"/tmp/claude-replay-claude_background_subagent_lifecycle","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"8ce6024c-9ce2-4499-b695-217f9a712b1b","session_id":"d87b5f75-35b2-4e8b-a518-815b77b99304"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"status","status":"requesting","session_id":"d87b5f75-35b2-4e8b-a518-815b77b99304","uuid":"54baff82-47e0-438b-8a76-a69115d0fce6"}} {"type":"emit_inbound","label":"stream_event","frame":{"type":"stream_event","event":{"type":"message_start","message":{"model":"claude-sonnet-4-6","id":"msg_011CfP3cP1VmDUh86CJBgohG","type":"message","role":"assistant","content":[],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":65,"cache_read_input_tokens":38759,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":65},"output_tokens":8,"service_tier":"standard","inference_geo":"not_available"},"diagnostics":null,"context_management":null}},"session_id":"d87b5f75-35b2-4e8b-a518-815b77b99304","parent_tool_use_id":null,"uuid":"6fd53200-af07-4ff4-b216-972b4960711a","ttft_ms":1635}} @@ -319,7 +319,7 @@ {"type":"emit_inbound","label":"stream_event","frame":{"type":"stream_event","event":{"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"container":null},"usage":{"input_tokens":3,"cache_creation_input_tokens":428,"cache_read_input_tokens":39084,"output_tokens":10,"output_tokens_details":{"thinking_tokens":0},"iterations":[{"input_tokens":3,"output_tokens":10,"cache_read_input_tokens":39084,"cache_creation_input_tokens":428,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":428},"type":"message"}]},"context_management":{"applied_edits":[]}},"session_id":"d87b5f75-35b2-4e8b-a518-815b77b99304","parent_tool_use_id":null,"uuid":"c66bff3e-4c87-4934-a6d7-c3dfd2256185"}} {"type":"emit_inbound","label":"stream_event","frame":{"type":"stream_event","event":{"type":"message_stop"},"session_id":"d87b5f75-35b2-4e8b-a518-815b77b99304","parent_tool_use_id":null,"uuid":"c830a332-6f88-4c9e-948e-18e8777e38bb"}} {"type":"emit_inbound","label":"result:background-wake:3","frame":{"duration_api_ms":31686,"stop_reason":"end_turn","session_id":"d87b5f75-35b2-4e8b-a518-815b77b99304","total_cost_usd":0.2689475,"usage":{"input_tokens":3,"cache_creation_input_tokens":428,"cache_read_input_tokens":39084,"output_tokens":10,"output_tokens_details":{"thinking_tokens":0},"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":428,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":3,"output_tokens":10,"cache_read_input_tokens":39084,"cache_creation_input_tokens":428,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":428},"type":"message"}],"speed":"standard"},"modelUsage":{"claude-sonnet-4-6":{"inputTokens":30,"outputTokens":916,"cacheReadInputTokens":384363,"cacheCreationInputTokens":20715,"webSearchRequests":0,"costUSD":0.25342889999999996,"contextWindow":200000,"maxOutputTokens":32000,"thinkingTokens":245,"canonicalModel":"claude-sonnet-4-6","provider":"firstParty","costBasis":"list"},"claude-haiku-4-5-20251001":{"inputTokens":20,"outputTokens":98,"cacheReadInputTokens":34966,"cacheCreationInputTokens":5756,"webSearchRequests":0,"costUSD":0.0155186,"contextWindow":200000,"maxOutputTokens":32000,"thinkingTokens":78,"canonicalModel":"claude-haiku-4-5","provider":"firstParty","costBasis":"list"}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","origin":{"kind":"task-notification"},"subagent_stats":{"spawned":2,"requested":{"background":2,"foreground":0,"unset":0},"started_in_background":2,"max_depth":1,"spawned_by_subagents":0,"completed":1,"failed":0,"killed":{"parent":1,"user":0,"system":0},"refused":{"depth_limit":0,"concurrency_limit":0,"budget":0},"by_type":{"general-purpose":2}},"is_error":false,"num_turns":1,"subtype":"success","api_error_status":null,"result":"A_RESUME_REPORTED","ttft_ms":1304,"type":"result","duration_ms":1339,"uuid":"1189d1a8-5ee4-483e-9a11-d2cb11d612f8","ttft_stream_ms":1283,"time_to_request_ms":16,"first_content_frame_ms":1283,"queued_turn_count":0,"result_index":5}} -{"type":"expect_outbound","label":"prompt.offer:4","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Reply with exactly: ALL_DONE"},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:4","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Reply with exactly: ALL_DONE"},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.281","cwd":"/tmp/claude-replay-claude_background_subagent_lifecycle","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"ac06114f-0747-4606-a2bd-8b74297d3014","session_id":"d87b5f75-35b2-4e8b-a518-815b77b99304"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"status","status":"requesting","session_id":"d87b5f75-35b2-4e8b-a518-815b77b99304","uuid":"604a05f1-c13e-4b86-ab7a-717680af588e"}} {"type":"emit_inbound","label":"stream_event","frame":{"type":"stream_event","event":{"type":"message_start","message":{"model":"claude-sonnet-4-6","id":"msg_011CfP3dEdjFZUMQzGeJLEsi","type":"message","role":"assistant","content":[],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":120,"cache_read_input_tokens":39512,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":120},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"},"diagnostics":null,"context_management":null}},"session_id":"d87b5f75-35b2-4e8b-a518-815b77b99304","parent_tool_use_id":null,"uuid":"b4efc56e-483b-413a-b499-e88779c6465d","ttft_ms":1475}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/claude_background_task_after_root/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/claude_background_task_after_root/claude_transcript.ndjson index fc41950bf3c3e..26a435c1e78f0 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/claude_background_task_after_root/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/claude_background_task_after_root/claude_transcript.ndjson @@ -1,6 +1,6 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"claude_background_task_after_root","metadata":{"prompts":["Live-test post-settle background Bash wake. Do exactly this in order, with no extra steps.\n\n1) Run this exact command using the Bash tool with run_in_background set to true:\n sleep 25 && echo L2_BG_DONE\n2) Immediately after starting it, reply with a short message containing exactly L2_STARTED and stop.\n3) Do NOT poll TaskOutput. Do NOT wait for the task. Do not spawn subagents or monitors.\n4) If its completion is reported later, acknowledge it once by replying with exactly L2_WAKE: L2_BG_DONE and stop.\n\nThe point is that your first turn ends while the command is still running."],"model":"claude-sonnet-4-6","nativeSessionId":"ec24a006-617b-4324-b516-57a7afff15a4","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","timingCompression":"25-second background gap controlled by the replay scenario gate","generatedBy":"manual-replay-from-thread-ec24a006 (ctm-catchup-l2-20260729, captured 2026-07-30T00:35:14Z)","syntheticExtension":"Wake assistant and result frames extend the captured notification-only transcript to exercise completion consumption."}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"claude_background_task_after_root","metadata":{"prompts":["Live-test post-settle background Bash wake. Do exactly this in order, with no extra steps.\n\n1) Run this exact command using the Bash tool with run_in_background set to true:\n sleep 25 && echo L2_BG_DONE\n2) Immediately after starting it, reply with a short message containing exactly L2_STARTED and stop.\n3) Do NOT poll TaskOutput. Do NOT wait for the task. Do not spawn subagents or monitors.\n4) If its completion is reported later, acknowledge it once by replying with exactly L2_WAKE: L2_BG_DONE and stop.\n\nThe point is that your first turn ends while the command is still running."],"model":"claude-sonnet-4-6","nativeSessionId":"ec24a006-617b-4324-b516-57a7afff15a4","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","timingCompression":"25-second background gap controlled by the replay scenario gate","generatedBy":"manual-replay-from-thread-ec24a006 (ctm-catchup-l2-20260729, captured 2026-07-30T00:35:14Z)","syntheticExtension":"Wake assistant and result frames extend the captured notification-only transcript to exercise completion consumption.","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","allowDangerouslySkipPermissions":true,"sessionId":"ec24a006-617b-4324-b516-57a7afff15a4","settings":{"showThinkingSummaries":true}}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Live-test post-settle background Bash wake. Do exactly this in order, with no extra steps.\n\n1) Run this exact command using the Bash tool with run_in_background set to true:\n sleep 25 && echo L2_BG_DONE\n2) Immediately after starting it, reply with a short message containing exactly L2_STARTED and stop.\n3) Do NOT poll TaskOutput. Do NOT wait for the task. Do not spawn subagents or monitors.\n4) If its completion is reported later, acknowledge it once by replying with exactly L2_WAKE: L2_BG_DONE and stop.\n\nThe point is that your first turn ends while the command is still running."},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Live-test post-settle background Bash wake. Do exactly this in order, with no extra steps.\n\n1) Run this exact command using the Bash tool with run_in_background set to true:\n sleep 25 && echo L2_BG_DONE\n2) Immediately after starting it, reply with a short message containing exactly L2_STARTED and stop.\n3) Do NOT poll TaskOutput. Do NOT wait for the task. Do not spawn subagents or monitors.\n4) If its completion is reported later, acknowledge it once by replying with exactly L2_WAKE: L2_BG_DONE and stop.\n\nThe point is that your first turn ends while the command is still running."},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system:init","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.219","cwd":"/tmp/claude-replay-claude_background_task_after_root","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"fdd8c2b3-f443-405c-996d-1a5ac798e100","session_id":"ec24a006-617b-4324-b516-57a7afff15a4"}} {"type":"emit_inbound","label":"assistant:background-bash","frame":{"type":"assistant","message":{"model":"claude-sonnet-4-6","id":"msg_011CdXJcN9jaK2KDf7LcqkDx","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01DAnwwvVvLM1cTfzrm6kkor","name":"Bash","input":{"command":"sleep 25 && echo L2_BG_DONE","run_in_background":true},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":89,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":null,"session_id":"ec24a006-617b-4324-b516-57a7afff15a4","uuid":"6e8e602b-da0f-409d-92a4-8a912b9c7ca9"}} {"type":"emit_inbound","label":"task_started:local_bash","frame":{"type":"system","subtype":"task_started","task_id":"bc9gkn8ei","tool_use_id":"toolu_01DAnwwvVvLM1cTfzrm6kkor","description":"sleep 25 && echo L2_BG_DONE","task_type":"local_bash","uuid":"ed0f530b-93fe-4f94-a385-367b440a04ba","session_id":"ec24a006-617b-4324-b516-57a7afff15a4"}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/claude_background_task_interrupt/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/claude_background_task_interrupt/claude_transcript.ndjson index 99f6315407d7f..bb5983d256496 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/claude_background_task_interrupt/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/claude_background_task_interrupt/claude_transcript.ndjson @@ -1,6 +1,6 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"claude_background_task_interrupt","metadata":{"prompts":["Live-test interrupting a turn that owns background work. You must make two Bash tool calls, one after the other. Do exactly this, with no extra steps.\n\n1) Call the Bash tool with run_in_background set to true and this exact command:\n sleep 30 && echo BG_INTERRUPT_DONE\n2) After that call returns, call the Bash tool again in the foreground (run_in_background false) with this exact command and wait for it:\n node -e \"setTimeout(() => console.log('FG_DONE'), 30000)\"\n3) After it finishes, reply with exactly FINISHED."],"model":"claude-sonnet-4-6","nativeSessionId":"4f157dc1-b8c2-42ca-914f-e7234e47ca31","queryMode":"interrupt","tools":"claude_code","permissionMode":"bypassPermissions","interruptAfter":"tool_use","interruptAfterToolUses":2,"generatedBy":"recordClaudeAgentSdkReplayTranscript"}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"claude_background_task_interrupt","metadata":{"prompts":["Live-test interrupting a turn that owns background work. You must make two Bash tool calls, one after the other. Do exactly this, with no extra steps.\n\n1) Call the Bash tool with run_in_background set to true and this exact command:\n sleep 30 && echo BG_INTERRUPT_DONE\n2) After that call returns, call the Bash tool again in the foreground (run_in_background false) with this exact command and wait for it:\n node -e \"setTimeout(() => console.log('FG_DONE'), 30000)\"\n3) After it finishes, reply with exactly FINISHED."],"model":"claude-sonnet-4-6","nativeSessionId":"4f157dc1-b8c2-42ca-914f-e7234e47ca31","queryMode":"interrupt","tools":"claude_code","permissionMode":"bypassPermissions","interruptAfter":"tool_use","interruptAfterToolUses":2,"generatedBy":"recordClaudeAgentSdkReplayTranscript","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","settings":{"showThinkingSummaries":true},"allowDangerouslySkipPermissions":true,"sessionId":"4f157dc1-b8c2-42ca-914f-e7234e47ca31"}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Live-test interrupting a turn that owns background work. You must make two Bash tool calls, one after the other. Do exactly this, with no extra steps.\n\n1) Call the Bash tool with run_in_background set to true and this exact command:\n sleep 30 && echo BG_INTERRUPT_DONE\n2) After that call returns, call the Bash tool again in the foreground (run_in_background false) with this exact command and wait for it:\n node -e \"setTimeout(() => console.log('FG_DONE'), 30000)\"\n3) After it finishes, reply with exactly FINISHED."},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Live-test interrupting a turn that owns background work. You must make two Bash tool calls, one after the other. Do exactly this, with no extra steps.\n\n1) Call the Bash tool with run_in_background set to true and this exact command:\n sleep 30 && echo BG_INTERRUPT_DONE\n2) After that call returns, call the Bash tool again in the foreground (run_in_background false) with this exact command and wait for it:\n node -e \"setTimeout(() => console.log('FG_DONE'), 30000)\"\n3) After it finishes, reply with exactly FINISHED."},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.281","cwd":"/tmp/claude-replay-claude_background_task_interrupt","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"b34d83fc-dab7-4791-9097-cfa8aee5affb","session_id":"4f157dc1-b8c2-42ca-914f-e7234e47ca31"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"status","status":"requesting","session_id":"4f157dc1-b8c2-42ca-914f-e7234e47ca31","uuid":"9766b3fe-a48f-4c99-9f99-429c0d9f125b"}} {"type":"emit_inbound","label":"stream_event","frame":{"type":"stream_event","event":{"type":"message_start","message":{"model":"claude-sonnet-4-6","id":"msg_011CfP3N8gPi9b8u8BDWznWU","type":"message","role":"assistant","content":[],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":11928,"cache_read_input_tokens":24699,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":11928},"output_tokens":8,"service_tier":"standard","inference_geo":"not_available"},"diagnostics":{"cache_miss_reason":{"type":"messages_changed","cache_missed_input_tokens":12251}},"context_management":null}},"session_id":"4f157dc1-b8c2-42ca-914f-e7234e47ca31","parent_tool_use_id":null,"uuid":"5d2ae08c-44b4-40a0-8c5e-ba3d426b36e9","ttft_ms":1947}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/claude_background_task_wake/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/claude_background_task_wake/claude_transcript.ndjson index 46441bc964912..056b5ac9449dd 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/claude_background_task_wake/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/claude_background_task_wake/claude_transcript.ndjson @@ -1,6 +1,6 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"claude_background_task_wake","metadata":{"prompts":["Live-test a background Bash wake. You must call the Bash tool before replying. Do exactly this, with no extra steps.\n\n1) Call the Bash tool with run_in_background set to true and this exact command:\n sleep 8 && echo BG_DONE\n2) After that tool call returns, reply with exactly STARTED and stop. Do not poll, read its output, or wait for it.\n3) When its completion is reported later, reply with exactly WAKE_DONE and stop.","Reply with exactly: USER_REPLY"],"model":"claude-sonnet-4-6","nativeSessionId":"7901ee61-9647-498d-b68d-ecdcb93bae84","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","backgroundWakeCounts":[1,0],"generatedBy":"recordClaudeAgentSdkReplayTranscript"}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"claude_background_task_wake","metadata":{"prompts":["Live-test a background Bash wake. You must call the Bash tool before replying. Do exactly this, with no extra steps.\n\n1) Call the Bash tool with run_in_background set to true and this exact command:\n sleep 8 && echo BG_DONE\n2) After that tool call returns, reply with exactly STARTED and stop. Do not poll, read its output, or wait for it.\n3) When its completion is reported later, reply with exactly WAKE_DONE and stop.","Reply with exactly: USER_REPLY"],"model":"claude-sonnet-4-6","nativeSessionId":"7901ee61-9647-498d-b68d-ecdcb93bae84","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","backgroundWakeCounts":[1,0],"generatedBy":"recordClaudeAgentSdkReplayTranscript","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","settings":{"showThinkingSummaries":true},"allowDangerouslySkipPermissions":true,"sessionId":"7901ee61-9647-498d-b68d-ecdcb93bae84"}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Live-test a background Bash wake. You must call the Bash tool before replying. Do exactly this, with no extra steps.\n\n1) Call the Bash tool with run_in_background set to true and this exact command:\n sleep 8 && echo BG_DONE\n2) After that tool call returns, reply with exactly STARTED and stop. Do not poll, read its output, or wait for it.\n3) When its completion is reported later, reply with exactly WAKE_DONE and stop."},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Live-test a background Bash wake. You must call the Bash tool before replying. Do exactly this, with no extra steps.\n\n1) Call the Bash tool with run_in_background set to true and this exact command:\n sleep 8 && echo BG_DONE\n2) After that tool call returns, reply with exactly STARTED and stop. Do not poll, read its output, or wait for it.\n3) When its completion is reported later, reply with exactly WAKE_DONE and stop."},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.281","cwd":"/tmp/claude-replay-claude_background_task_wake","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"ac32deec-b605-4fa9-8251-3b330fdc27d7","session_id":"7901ee61-9647-498d-b68d-ecdcb93bae84"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"status","status":"requesting","session_id":"7901ee61-9647-498d-b68d-ecdcb93bae84","uuid":"f26f7cd2-fa4d-4155-a3e8-f63ae378d452"}} {"type":"emit_inbound","label":"stream_event","frame":{"type":"stream_event","event":{"type":"message_start","message":{"model":"claude-sonnet-4-6","id":"msg_011CfNyEdN7oFi6GZwnDtBjJ","type":"message","role":"assistant","content":[],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":11897,"cache_read_input_tokens":24699,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":11897},"output_tokens":8,"service_tier":"standard","inference_geo":"not_available"},"diagnostics":{"cache_miss_reason":{"type":"messages_changed","cache_missed_input_tokens":12220}},"context_management":null}},"session_id":"7901ee61-9647-498d-b68d-ecdcb93bae84","parent_tool_use_id":null,"uuid":"73d2f90f-5da3-4318-8ce5-40b47ef339ea","ttft_ms":1737}} @@ -96,7 +96,7 @@ {"type":"emit_inbound","label":"stream_event","frame":{"type":"stream_event","event":{"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"container":null},"usage":{"input_tokens":3,"cache_creation_input_tokens":318,"cache_read_input_tokens":36949,"output_tokens":8,"output_tokens_details":{"thinking_tokens":0},"iterations":[{"input_tokens":3,"output_tokens":8,"cache_read_input_tokens":36949,"cache_creation_input_tokens":318,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":318},"type":"message"}]},"context_management":{"applied_edits":[]}},"session_id":"7901ee61-9647-498d-b68d-ecdcb93bae84","parent_tool_use_id":null,"uuid":"c0d1794a-c501-43b7-b3e2-054440678418"}} {"type":"emit_inbound","label":"stream_event","frame":{"type":"stream_event","event":{"type":"message_stop"},"session_id":"7901ee61-9647-498d-b68d-ecdcb93bae84","parent_tool_use_id":null,"uuid":"c22b035b-3315-4da7-9db1-63a41d6b3b04"}} {"type":"emit_inbound","label":"result:background-wake:1","frame":{"duration_api_ms":12656,"stop_reason":"end_turn","session_id":"7901ee61-9647-498d-b68d-ecdcb93bae84","total_cost_usd":0.1150302,"usage":{"input_tokens":3,"cache_creation_input_tokens":318,"cache_read_input_tokens":36949,"output_tokens":8,"output_tokens_details":{"thinking_tokens":0},"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":318,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":3,"output_tokens":8,"cache_read_input_tokens":36949,"cache_creation_input_tokens":318,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":318},"type":"message"}],"speed":"standard"},"modelUsage":{"claude-sonnet-4-6":{"inputTokens":10,"outputTokens":227,"cacheReadInputTokens":98244,"cacheCreationInputTokens":13687,"webSearchRequests":0,"costUSD":0.1150302,"contextWindow":200000,"maxOutputTokens":32000,"thinkingTokens":89,"canonicalModel":"claude-sonnet-4-6","provider":"firstParty","costBasis":"list"}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","origin":{"kind":"task-notification"},"subagent_stats":{"spawned":0,"requested":{"background":0,"foreground":0,"unset":0},"started_in_background":0,"max_depth":0,"spawned_by_subagents":0,"completed":0,"failed":0,"killed":{"parent":0,"user":0,"system":0},"refused":{"depth_limit":0,"concurrency_limit":0,"budget":0},"by_type":{}},"is_error":false,"num_turns":1,"subtype":"success","api_error_status":null,"result":"WAKE_DONE","ttft_ms":6326,"type":"result","duration_ms":6342,"uuid":"860c9876-ce31-44c8-be01-1cda38168fed","ttft_stream_ms":6325,"time_to_request_ms":18,"first_content_frame_ms":6326,"queued_turn_count":0,"result_index":1}} -{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Reply with exactly: USER_REPLY"},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Reply with exactly: USER_REPLY"},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.281","cwd":"/tmp/claude-replay-claude_background_task_wake","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"e2d6837f-846c-4381-84bd-4369be0940e2","session_id":"7901ee61-9647-498d-b68d-ecdcb93bae84"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"status","status":"requesting","session_id":"7901ee61-9647-498d-b68d-ecdcb93bae84","uuid":"d25ec9c1-9fc3-4598-8675-c249e98f3b26"}} {"type":"emit_inbound","label":"stream_event","frame":{"type":"stream_event","event":{"type":"message_start","message":{"model":"claude-sonnet-4-6","id":"msg_011CfNyFwsd2XscPpo9cYegB","type":"message","role":"assistant","content":[],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":19,"cache_read_input_tokens":37267,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":19},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"},"diagnostics":null,"context_management":null}},"session_id":"7901ee61-9647-498d-b68d-ecdcb93bae84","parent_tool_use_id":null,"uuid":"bd7b03f3-bcf7-4afd-81a7-c1c00151531a","ttft_ms":1138}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/claude_background_wake_before_queued_prompt/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/claude_background_wake_before_queued_prompt/claude_transcript.ndjson index e2b88ec9340ff..ad2d4a990fb07 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/claude_background_wake_before_queued_prompt/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/claude_background_wake_before_queued_prompt/claude_transcript.ndjson @@ -1,6 +1,6 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"claude_background_wake_before_queued_prompt","metadata":{"prompts":["Live-test background subagents. You must call the Agent tool before replying. Do exactly this, with no extra steps.\n\n1) In one message, make TWO Agent tool calls that launch general-purpose subagents, both with run_in_background set to true:\n - description \"Agent A\", model \"haiku\", prompt: \"Reply with exactly: A_FIRST\"\n - description \"Agent B\", prompt: \"Run this exact command with the Bash tool: sleep 60 && echo B_DONE. Then reply with exactly: B_FINAL\"\n2) After both calls return, reply with exactly LAUNCHED and stop. Do not wait for them or check on them.\n3) When Agent A's completion is reported, reply with exactly A_REPORTED and stop.","Stop Agent B now with the TaskStop tool. Then reply with exactly: B_STOPPED","Use the SendMessage tool to send Agent A this message: Reply with exactly: A_SECOND\nThen reply with exactly RESUMED and stop. When Agent A's new completion is reported, reply with exactly A_RESUME_REPORTED and stop.","Reply with exactly: ALL_DONE"],"model":"claude-sonnet-4-6","nativeSessionId":"a0022020-f8b1-4b3d-8d96-1a00ba9153de","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","backgroundWakeCounts":[1,0,1,0],"offerNextPromptImmediately":true,"generatedBy":"recordClaudeAgentSdkReplayTranscript"}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"claude_background_wake_before_queued_prompt","metadata":{"prompts":["Live-test background subagents. You must call the Agent tool before replying. Do exactly this, with no extra steps.\n\n1) In one message, make TWO Agent tool calls that launch general-purpose subagents, both with run_in_background set to true:\n - description \"Agent A\", model \"haiku\", prompt: \"Reply with exactly: A_FIRST\"\n - description \"Agent B\", prompt: \"Run this exact command with the Bash tool: sleep 60 && echo B_DONE. Then reply with exactly: B_FINAL\"\n2) After both calls return, reply with exactly LAUNCHED and stop. Do not wait for them or check on them.\n3) When Agent A's completion is reported, reply with exactly A_REPORTED and stop.","Stop Agent B now with the TaskStop tool. Then reply with exactly: B_STOPPED","Use the SendMessage tool to send Agent A this message: Reply with exactly: A_SECOND\nThen reply with exactly RESUMED and stop. When Agent A's new completion is reported, reply with exactly A_RESUME_REPORTED and stop.","Reply with exactly: ALL_DONE"],"model":"claude-sonnet-4-6","nativeSessionId":"a0022020-f8b1-4b3d-8d96-1a00ba9153de","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","backgroundWakeCounts":[1,0,1,0],"offerNextPromptImmediately":true,"generatedBy":"recordClaudeAgentSdkReplayTranscript","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","settings":{"showThinkingSummaries":true},"allowDangerouslySkipPermissions":true,"sessionId":"a0022020-f8b1-4b3d-8d96-1a00ba9153de"}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Live-test background subagents. You must call the Agent tool before replying. Do exactly this, with no extra steps.\n\n1) In one message, make TWO Agent tool calls that launch general-purpose subagents, both with run_in_background set to true:\n - description \"Agent A\", model \"haiku\", prompt: \"Reply with exactly: A_FIRST\"\n - description \"Agent B\", prompt: \"Run this exact command with the Bash tool: sleep 60 && echo B_DONE. Then reply with exactly: B_FINAL\"\n2) After both calls return, reply with exactly LAUNCHED and stop. Do not wait for them or check on them.\n3) When Agent A's completion is reported, reply with exactly A_REPORTED and stop."},"parent_tool_use_id":null,"uuid":"69fab11a-5542-4fa2-933b-e042a40972ab"}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Live-test background subagents. You must call the Agent tool before replying. Do exactly this, with no extra steps.\n\n1) In one message, make TWO Agent tool calls that launch general-purpose subagents, both with run_in_background set to true:\n - description \"Agent A\", model \"haiku\", prompt: \"Reply with exactly: A_FIRST\"\n - description \"Agent B\", prompt: \"Run this exact command with the Bash tool: sleep 60 && echo B_DONE. Then reply with exactly: B_FINAL\"\n2) After both calls return, reply with exactly LAUNCHED and stop. Do not wait for them or check on them.\n3) When Agent A's completion is reported, reply with exactly A_REPORTED and stop."},"parent_tool_use_id":null,"uuid":"69fab11a-5542-4fa2-933b-e042a40972ab","origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"command_lifecycle","frame":{"type":"command_lifecycle","command_uuid":"69fab11a-5542-4fa2-933b-e042a40972ab","state":"queued","uuid":"7670380d-583a-4b26-8c15-6b224e2cb39b","session_id":"a0022020-f8b1-4b3d-8d96-1a00ba9153de"}} {"type":"emit_inbound","label":"command_lifecycle","frame":{"type":"command_lifecycle","command_uuid":"69fab11a-5542-4fa2-933b-e042a40972ab","state":"started","uuid":"19befc30-64dd-46d3-89ff-c3dc35892ac6","session_id":"a0022020-f8b1-4b3d-8d96-1a00ba9153de"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.281","cwd":"/tmp/claude-replay-claude_background_wake_before_queued_prompt","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"bad92c6b-ec72-4173-af41-d082d523c222","session_id":"a0022020-f8b1-4b3d-8d96-1a00ba9153de"}} @@ -121,7 +121,7 @@ {"type":"emit_inbound","label":"stream_event","frame":{"type":"stream_event","event":{"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"container":null},"usage":{"input_tokens":3,"cache_creation_input_tokens":422,"cache_read_input_tokens":37832,"output_tokens":7,"output_tokens_details":{"thinking_tokens":0},"iterations":[{"input_tokens":3,"output_tokens":7,"cache_read_input_tokens":37832,"cache_creation_input_tokens":422,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":422},"type":"message"}]},"context_management":{"applied_edits":[]}},"session_id":"a0022020-f8b1-4b3d-8d96-1a00ba9153de","parent_tool_use_id":null,"uuid":"21135761-0770-4c9d-902c-64754ff8c69f"}} {"type":"emit_inbound","label":"stream_event","frame":{"type":"stream_event","event":{"type":"message_stop"},"session_id":"a0022020-f8b1-4b3d-8d96-1a00ba9153de","parent_tool_use_id":null,"uuid":"4b122c87-768f-4228-b59a-15b08b9eaac6"}} {"type":"emit_inbound","label":"result:background-wake:1","frame":{"duration_api_ms":15643,"stop_reason":"end_turn","session_id":"a0022020-f8b1-4b3d-8d96-1a00ba9153de","total_cost_usd":0.4272384,"usage":{"input_tokens":3,"cache_creation_input_tokens":422,"cache_read_input_tokens":37832,"output_tokens":7,"output_tokens_details":{"thinking_tokens":0},"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":422,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":3,"output_tokens":7,"cache_read_input_tokens":37832,"cache_creation_input_tokens":422,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":422},"type":"message"}],"speed":"standard"},"modelUsage":{"claude-sonnet-4-6":{"inputTokens":13,"outputTokens":475,"cacheReadInputTokens":74648,"cacheCreationInputTokens":59413,"webSearchRequests":0,"costUSD":0.3860364,"contextWindow":200000,"maxOutputTokens":32000,"thinkingTokens":74,"canonicalModel":"claude-sonnet-4-6","provider":"firstParty","costBasis":"list"},"claude-haiku-4-5-20251001":{"inputTokens":10,"outputTokens":50,"cacheReadInputTokens":0,"cacheCreationInputTokens":20471,"webSearchRequests":0,"costUSD":0.041202,"contextWindow":200000,"maxOutputTokens":32000,"thinkingTokens":40,"canonicalModel":"claude-haiku-4-5","provider":"firstParty","costBasis":"list"}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","origin":{"kind":"task-notification"},"subagent_stats":{"spawned":2,"requested":{"background":2,"foreground":0,"unset":0},"started_in_background":2,"max_depth":1,"spawned_by_subagents":0,"completed":1,"failed":0,"killed":{"parent":0,"user":0,"system":0},"refused":{"depth_limit":0,"concurrency_limit":0,"budget":0},"by_type":{"general-purpose":2}},"is_error":false,"num_turns":1,"subtype":"success","api_error_status":null,"result":"A_REPORTED","ttft_ms":2225,"type":"result","duration_ms":2245,"uuid":"16f4b3bf-8128-4a50-b100-e00f2779310c","ttft_stream_ms":2160,"time_to_request_ms":23,"first_content_frame_ms":2161,"queued_turn_count":0,"result_index":1}} -{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Stop Agent B now with the TaskStop tool. Then reply with exactly: B_STOPPED"},"parent_tool_use_id":null,"uuid":"5e1b6b08-060a-4021-9235-5bf1c83ae703"}}} +{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Stop Agent B now with the TaskStop tool. Then reply with exactly: B_STOPPED"},"parent_tool_use_id":null,"uuid":"5e1b6b08-060a-4021-9235-5bf1c83ae703","origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"command_lifecycle","frame":{"type":"command_lifecycle","command_uuid":"5e1b6b08-060a-4021-9235-5bf1c83ae703","state":"queued","uuid":"5917aaa0-b361-4098-8675-4992e61e7b68","session_id":"a0022020-f8b1-4b3d-8d96-1a00ba9153de"}} {"type":"emit_inbound","label":"command_lifecycle","frame":{"type":"command_lifecycle","command_uuid":"5e1b6b08-060a-4021-9235-5bf1c83ae703","state":"started","uuid":"7ccc5415-b281-49a6-b723-354f1099dd7a","session_id":"a0022020-f8b1-4b3d-8d96-1a00ba9153de"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.281","cwd":"/tmp/claude-replay-claude_background_wake_before_queued_prompt","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"c69efb4a-83d8-484d-bba1-eea5d3429f11","session_id":"a0022020-f8b1-4b3d-8d96-1a00ba9153de"}} @@ -183,7 +183,7 @@ {"type":"emit_inbound","label":"stream_event","frame":{"type":"stream_event","event":{"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"container":null},"usage":{"input_tokens":1,"cache_creation_input_tokens":177,"cache_read_input_tokens":38283,"output_tokens":7,"output_tokens_details":{"thinking_tokens":0},"iterations":[{"input_tokens":1,"output_tokens":7,"cache_read_input_tokens":38283,"cache_creation_input_tokens":177,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":177},"type":"message"}]},"context_management":{"applied_edits":[]}},"session_id":"a0022020-f8b1-4b3d-8d96-1a00ba9153de","parent_tool_use_id":null,"uuid":"b868e653-1b4c-4370-b8e2-48a25e49f8e8"}} {"type":"emit_inbound","label":"stream_event","frame":{"type":"stream_event","event":{"type":"message_stop"},"session_id":"a0022020-f8b1-4b3d-8d96-1a00ba9153de","parent_tool_use_id":null,"uuid":"86628516-3557-4969-8351-e6a5c631c53e"}} {"type":"emit_inbound","label":"result","frame":{"duration_api_ms":22294,"stop_reason":"end_turn","session_id":"a0022020-f8b1-4b3d-8d96-1a00ba9153de","total_cost_usd":0.4662198,"usage":{"input_tokens":4,"cache_creation_input_tokens":206,"cache_read_input_tokens":76537,"output_tokens":123,"output_tokens_details":{"thinking_tokens":42},"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":206,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":1,"output_tokens":7,"cache_read_input_tokens":38283,"cache_creation_input_tokens":177,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":177},"type":"message"}],"speed":"standard"},"modelUsage":{"claude-sonnet-4-6":{"inputTokens":18,"outputTokens":764,"cacheReadInputTokens":171166,"cacheCreationInputTokens":60359,"webSearchRequests":0,"costUSD":0.4250178,"contextWindow":200000,"maxOutputTokens":32000,"thinkingTokens":143,"canonicalModel":"claude-sonnet-4-6","provider":"firstParty","costBasis":"list"},"claude-haiku-4-5-20251001":{"inputTokens":10,"outputTokens":50,"cacheReadInputTokens":0,"cacheCreationInputTokens":20471,"webSearchRequests":0,"costUSD":0.041202,"contextWindow":200000,"maxOutputTokens":32000,"thinkingTokens":40,"canonicalModel":"claude-haiku-4-5","provider":"firstParty","costBasis":"list"}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","subagent_stats":{"spawned":2,"requested":{"background":2,"foreground":0,"unset":0},"started_in_background":2,"max_depth":1,"spawned_by_subagents":0,"completed":1,"failed":0,"killed":{"parent":1,"user":0,"system":0},"refused":{"depth_limit":0,"concurrency_limit":0,"budget":0},"by_type":{"general-purpose":2}},"is_error":false,"num_turns":2,"subtype":"success","api_error_status":null,"result":"B_STOPPED","ttft_ms":2193,"type":"result","duration_ms":4015,"uuid":"aa61d2db-0245-40e1-acfb-249053de4f00","ttft_stream_ms":1492,"time_to_request_ms":29,"first_content_frame_ms":1492,"user_message_uuid":"5e1b6b08-060a-4021-9235-5bf1c83ae703","user_message_uuids":["5e1b6b08-060a-4021-9235-5bf1c83ae703"],"request_sent_wall_ms":1790299934276,"queued_turn_count":0,"result_index":2}} -{"type":"expect_outbound","label":"prompt.offer:3","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Use the SendMessage tool to send Agent A this message: Reply with exactly: A_SECOND\nThen reply with exactly RESUMED and stop. When Agent A's new completion is reported, reply with exactly A_RESUME_REPORTED and stop."},"parent_tool_use_id":null,"uuid":"7d0f7f80-7538-402f-9a9b-0c0fdcf3d7e9"}}} +{"type":"expect_outbound","label":"prompt.offer:3","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Use the SendMessage tool to send Agent A this message: Reply with exactly: A_SECOND\nThen reply with exactly RESUMED and stop. When Agent A's new completion is reported, reply with exactly A_RESUME_REPORTED and stop."},"parent_tool_use_id":null,"uuid":"7d0f7f80-7538-402f-9a9b-0c0fdcf3d7e9","origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"command_lifecycle","frame":{"type":"command_lifecycle","command_uuid":"5e1b6b08-060a-4021-9235-5bf1c83ae703","state":"completed","uuid":"b49fcfbc-a103-4897-a274-0de19a5c5d78","session_id":"a0022020-f8b1-4b3d-8d96-1a00ba9153de"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.281","cwd":"/tmp/claude-replay-claude_background_wake_before_queued_prompt","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"353203b4-837f-421d-84a2-2b895d789100","session_id":"a0022020-f8b1-4b3d-8d96-1a00ba9153de"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"status","status":"requesting","session_id":"a0022020-f8b1-4b3d-8d96-1a00ba9153de","uuid":"1468eb7e-38a4-4500-923e-b18984f58592"}} @@ -315,7 +315,7 @@ {"type":"emit_inbound","label":"stream_event","frame":{"type":"stream_event","event":{"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"container":null},"usage":{"input_tokens":1,"cache_creation_input_tokens":255,"cache_read_input_tokens":38985,"output_tokens":5,"output_tokens_details":{"thinking_tokens":0},"iterations":[{"input_tokens":1,"output_tokens":5,"cache_read_input_tokens":38985,"cache_creation_input_tokens":255,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":255},"type":"message"}]},"context_management":{"applied_edits":[]}},"session_id":"a0022020-f8b1-4b3d-8d96-1a00ba9153de","parent_tool_use_id":null,"uuid":"af3cf865-727d-4315-b893-e711242d78f9"}} {"type":"emit_inbound","label":"stream_event","frame":{"type":"stream_event","event":{"type":"message_stop"},"session_id":"a0022020-f8b1-4b3d-8d96-1a00ba9153de","parent_tool_use_id":null,"uuid":"0e56654e-1744-4e1f-8882-358bb5d76f0a"}} {"type":"emit_inbound","label":"result","frame":{"duration_api_ms":29542,"stop_reason":"end_turn","session_id":"a0022020-f8b1-4b3d-8d96-1a00ba9153de","total_cost_usd":0.5098695,"usage":{"input_tokens":4,"cache_creation_input_tokens":406,"cache_read_input_tokens":77819,"output_tokens":175,"output_tokens_details":{"thinking_tokens":51},"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":406,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":1,"output_tokens":5,"cache_read_input_tokens":38985,"cache_creation_input_tokens":255,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":255},"type":"message"}],"speed":"standard"},"modelUsage":{"claude-sonnet-4-6":{"inputTokens":25,"outputTokens":1035,"cacheReadInputTokens":287445,"cacheCreationInputTokens":61139,"webSearchRequests":0,"costUSD":0.4686675,"contextWindow":200000,"maxOutputTokens":32000,"thinkingTokens":264,"canonicalModel":"claude-sonnet-4-6","provider":"firstParty","costBasis":"list"},"claude-haiku-4-5-20251001":{"inputTokens":10,"outputTokens":50,"cacheReadInputTokens":0,"cacheCreationInputTokens":20471,"webSearchRequests":0,"costUSD":0.041202,"contextWindow":200000,"maxOutputTokens":32000,"thinkingTokens":40,"canonicalModel":"claude-haiku-4-5","provider":"firstParty","costBasis":"list"}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","subagent_stats":{"spawned":2,"requested":{"background":2,"foreground":0,"unset":0},"started_in_background":2,"max_depth":1,"spawned_by_subagents":0,"completed":1,"failed":0,"killed":{"parent":1,"user":0,"system":0},"refused":{"depth_limit":0,"concurrency_limit":0,"budget":0},"by_type":{"general-purpose":2}},"is_error":false,"num_turns":2,"subtype":"success","api_error_status":null,"result":"RESUMED","ttft_ms":2135,"type":"result","duration_ms":4544,"uuid":"b8c0b349-8509-4787-a184-5cb0a8871507","ttft_stream_ms":1191,"time_to_request_ms":39,"first_content_frame_ms":1191,"user_message_uuid":"7d0f7f80-7538-402f-9a9b-0c0fdcf3d7e9","user_message_uuids":["7d0f7f80-7538-402f-9a9b-0c0fdcf3d7e9"],"request_sent_wall_ms":1790299941088,"queued_turn_count":0,"result_index":4}} -{"type":"expect_outbound","label":"prompt.offer:4","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Reply with exactly: ALL_DONE"},"parent_tool_use_id":null,"uuid":"73042612-0601-4c16-978d-627fb49f437f"}}} +{"type":"expect_outbound","label":"prompt.offer:4","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Reply with exactly: ALL_DONE"},"parent_tool_use_id":null,"uuid":"73042612-0601-4c16-978d-627fb49f437f","origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"command_lifecycle","frame":{"type":"command_lifecycle","command_uuid":"7d0f7f80-7538-402f-9a9b-0c0fdcf3d7e9","state":"completed","uuid":"bc866048-01d6-4a60-860d-7525aec35a73","session_id":"a0022020-f8b1-4b3d-8d96-1a00ba9153de"}} {"type":"emit_inbound","label":"command_lifecycle","frame":{"type":"command_lifecycle","command_uuid":"73042612-0601-4c16-978d-627fb49f437f","state":"queued","uuid":"46d6ed5e-d591-4d39-8e60-42a6b1d8364b","session_id":"a0022020-f8b1-4b3d-8d96-1a00ba9153de"}} {"type":"emit_inbound","label":"command_lifecycle","frame":{"type":"command_lifecycle","command_uuid":"73042612-0601-4c16-978d-627fb49f437f","state":"started","uuid":"44752584-5ac2-4a9a-befc-7fe63c002de2","session_id":"a0022020-f8b1-4b3d-8d96-1a00ba9153de"}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/claude_background_wake_before_queued_prompt_no_echo/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/claude_background_wake_before_queued_prompt_no_echo/claude_transcript.ndjson index 41b76e3f07a20..740cc196bcdce 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/claude_background_wake_before_queued_prompt_no_echo/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/claude_background_wake_before_queued_prompt_no_echo/claude_transcript.ndjson @@ -1,6 +1,6 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"claude_background_wake_before_queued_prompt_no_echo","metadata":{"prompts":["Live-test background subagents. You must call the Agent tool before replying. Do exactly this, with no extra steps.\n\n1) In one message, make TWO Agent tool calls that launch general-purpose subagents, both with run_in_background set to true:\n - description \"Agent A\", model \"haiku\", prompt: \"Reply with exactly: A_FIRST\"\n - description \"Agent B\", prompt: \"Run this exact command with the Bash tool: sleep 60 && echo B_DONE. Then reply with exactly: B_FINAL\"\n2) After both calls return, reply with exactly LAUNCHED and stop. Do not wait for them or check on them.\n3) When Agent A's completion is reported, reply with exactly A_REPORTED and stop.","Stop Agent B now with the TaskStop tool. Then reply with exactly: B_STOPPED","Use the SendMessage tool to send Agent A this message: Reply with exactly: A_SECOND\nThen reply with exactly RESUMED and stop. When Agent A's new completion is reported, reply with exactly A_RESUME_REPORTED and stop.","Reply with exactly: ALL_DONE"],"model":"claude-sonnet-4-6","nativeSessionId":"44d49909-e67d-4595-b7d7-07d140c6d3bc","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","backgroundWakeCounts":[1,0,1,0],"generatedBy":"recordClaudeAgentSdkReplayTranscript (claude_background_subagent_lifecycle scenario, first live run; a wake turn ran before prompt 3)"}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"claude_background_wake_before_queued_prompt_no_echo","metadata":{"prompts":["Live-test background subagents. You must call the Agent tool before replying. Do exactly this, with no extra steps.\n\n1) In one message, make TWO Agent tool calls that launch general-purpose subagents, both with run_in_background set to true:\n - description \"Agent A\", model \"haiku\", prompt: \"Reply with exactly: A_FIRST\"\n - description \"Agent B\", prompt: \"Run this exact command with the Bash tool: sleep 60 && echo B_DONE. Then reply with exactly: B_FINAL\"\n2) After both calls return, reply with exactly LAUNCHED and stop. Do not wait for them or check on them.\n3) When Agent A's completion is reported, reply with exactly A_REPORTED and stop.","Stop Agent B now with the TaskStop tool. Then reply with exactly: B_STOPPED","Use the SendMessage tool to send Agent A this message: Reply with exactly: A_SECOND\nThen reply with exactly RESUMED and stop. When Agent A's new completion is reported, reply with exactly A_RESUME_REPORTED and stop.","Reply with exactly: ALL_DONE"],"model":"claude-sonnet-4-6","nativeSessionId":"44d49909-e67d-4595-b7d7-07d140c6d3bc","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","backgroundWakeCounts":[1,0,1,0],"generatedBy":"recordClaudeAgentSdkReplayTranscript (claude_background_subagent_lifecycle scenario, first live run; a wake turn ran before prompt 3)","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","settings":{"showThinkingSummaries":true},"allowDangerouslySkipPermissions":true,"sessionId":"44d49909-e67d-4595-b7d7-07d140c6d3bc"}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Live-test background subagents. You must call the Agent tool before replying. Do exactly this, with no extra steps.\n\n1) In one message, make TWO Agent tool calls that launch general-purpose subagents, both with run_in_background set to true:\n - description \"Agent A\", model \"haiku\", prompt: \"Reply with exactly: A_FIRST\"\n - description \"Agent B\", prompt: \"Run this exact command with the Bash tool: sleep 60 && echo B_DONE. Then reply with exactly: B_FINAL\"\n2) After both calls return, reply with exactly LAUNCHED and stop. Do not wait for them or check on them.\n3) When Agent A's completion is reported, reply with exactly A_REPORTED and stop."},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Live-test background subagents. You must call the Agent tool before replying. Do exactly this, with no extra steps.\n\n1) In one message, make TWO Agent tool calls that launch general-purpose subagents, both with run_in_background set to true:\n - description \"Agent A\", model \"haiku\", prompt: \"Reply with exactly: A_FIRST\"\n - description \"Agent B\", prompt: \"Run this exact command with the Bash tool: sleep 60 && echo B_DONE. Then reply with exactly: B_FINAL\"\n2) After both calls return, reply with exactly LAUNCHED and stop. Do not wait for them or check on them.\n3) When Agent A's completion is reported, reply with exactly A_REPORTED and stop."},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.281","cwd":"/tmp/claude-replay-claude_background_subagent_lifecycle","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"d33ccf16-4d05-4223-ab3a-2a7eda865ade","session_id":"44d49909-e67d-4595-b7d7-07d140c6d3bc"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"status","status":"requesting","session_id":"44d49909-e67d-4595-b7d7-07d140c6d3bc","uuid":"70e42d85-f223-4b35-8188-fc3cf47db2fe"}} {"type":"emit_inbound","label":"stream_event","frame":{"type":"stream_event","event":{"type":"message_start","message":{"model":"claude-sonnet-4-6","id":"msg_011CfNzTS7v8RJZgad12zyfw","type":"message","role":"assistant","content":[],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":11958,"cache_read_input_tokens":24699,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":11958},"output_tokens":8,"service_tier":"standard","inference_geo":"not_available"},"diagnostics":{"cache_miss_reason":{"type":"messages_changed","cache_missed_input_tokens":12297}},"context_management":null}},"session_id":"44d49909-e67d-4595-b7d7-07d140c6d3bc","parent_tool_use_id":null,"uuid":"0c9fd79a-afd8-4d5a-9337-a97306c8988b","ttft_ms":2679}} @@ -114,7 +114,7 @@ {"type":"emit_inbound","label":"stream_event","frame":{"type":"stream_event","event":{"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"container":null},"usage":{"input_tokens":3,"cache_creation_input_tokens":428,"cache_read_input_tokens":37677,"output_tokens":7,"output_tokens_details":{"thinking_tokens":0},"iterations":[{"input_tokens":3,"output_tokens":7,"cache_read_input_tokens":37677,"cache_creation_input_tokens":428,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":428},"type":"message"}]},"context_management":{"applied_edits":[]}},"session_id":"44d49909-e67d-4595-b7d7-07d140c6d3bc","parent_tool_use_id":null,"uuid":"c88e989e-6a67-4b78-8eb5-1ce477ac2661"}} {"type":"emit_inbound","label":"stream_event","frame":{"type":"stream_event","event":{"type":"message_stop"},"session_id":"44d49909-e67d-4595-b7d7-07d140c6d3bc","parent_tool_use_id":null,"uuid":"f6d7ce6b-0e15-4024-9153-a74cf6f41e8c"}} {"type":"emit_inbound","label":"result:background-wake:1","frame":{"duration_api_ms":15201,"stop_reason":"end_turn","session_id":"44d49909-e67d-4595-b7d7-07d140c6d3bc","total_cost_usd":0.167871,"usage":{"input_tokens":3,"cache_creation_input_tokens":428,"cache_read_input_tokens":37677,"output_tokens":7,"output_tokens_details":{"thinking_tokens":0},"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":428,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":3,"output_tokens":7,"cache_read_input_tokens":37677,"cache_creation_input_tokens":428,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":428},"type":"message"}],"speed":"standard"},"modelUsage":{"claude-sonnet-4-6":{"inputTokens":13,"outputTokens":447,"cacheReadInputTokens":114526,"cacheCreationInputTokens":18915,"webSearchRequests":0,"costUSD":0.1545918,"contextWindow":200000,"maxOutputTokens":32000,"thinkingTokens":67,"canonicalModel":"claude-sonnet-4-6","provider":"firstParty","costBasis":"list"},"claude-haiku-4-5-20251001":{"inputTokens":10,"outputTokens":96,"cacheReadInputTokens":14652,"cacheCreationInputTokens":5662,"webSearchRequests":0,"costUSD":0.013279200000000001,"contextWindow":200000,"maxOutputTokens":32000,"thinkingTokens":86,"canonicalModel":"claude-haiku-4-5","provider":"firstParty","costBasis":"list"}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","origin":{"kind":"task-notification"},"subagent_stats":{"spawned":2,"requested":{"background":2,"foreground":0,"unset":0},"started_in_background":2,"max_depth":1,"spawned_by_subagents":0,"completed":1,"failed":0,"killed":{"parent":0,"user":0,"system":0},"refused":{"depth_limit":0,"concurrency_limit":0,"budget":0},"by_type":{"general-purpose":2}},"is_error":false,"num_turns":1,"subtype":"success","api_error_status":null,"result":"A_REPORTED","ttft_ms":1799,"type":"result","duration_ms":1819,"uuid":"6679aff6-5720-4824-a3fe-abd2d4cd83f5","ttft_stream_ms":1727,"time_to_request_ms":22,"first_content_frame_ms":1728,"queued_turn_count":0,"result_index":1}} -{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Stop Agent B now with the TaskStop tool. Then reply with exactly: B_STOPPED"},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Stop Agent B now with the TaskStop tool. Then reply with exactly: B_STOPPED"},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.281","cwd":"/tmp/claude-replay-claude_background_subagent_lifecycle","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"935a768a-139a-4446-9d78-9d7371e6ec50","session_id":"44d49909-e67d-4595-b7d7-07d140c6d3bc"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"status","status":"requesting","session_id":"44d49909-e67d-4595-b7d7-07d140c6d3bc","uuid":"0725d40f-df37-43c3-8e32-7fe698999160"}} {"type":"emit_inbound","label":"stream_event","frame":{"type":"stream_event","event":{"type":"message_start","message":{"model":"claude-sonnet-4-6","id":"msg_011CfNzU8jBUZcBvTCfxtFRR","type":"message","role":"assistant","content":[],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":29,"cache_read_input_tokens":38105,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":29},"output_tokens":8,"service_tier":"standard","inference_geo":"not_available"},"diagnostics":null,"context_management":null}},"session_id":"44d49909-e67d-4595-b7d7-07d140c6d3bc","parent_tool_use_id":null,"uuid":"7f441b28-614d-40f2-9146-ab6ae9093428","ttft_ms":1232}} @@ -173,7 +173,7 @@ {"type":"emit_inbound","label":"stream_event","frame":{"type":"stream_event","event":{"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"container":null},"usage":{"input_tokens":1,"cache_creation_input_tokens":192,"cache_read_input_tokens":38134,"output_tokens":7,"output_tokens_details":{"thinking_tokens":0},"iterations":[{"input_tokens":1,"output_tokens":7,"cache_read_input_tokens":38134,"cache_creation_input_tokens":192,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":192},"type":"message"}]},"context_management":{"applied_edits":[]}},"session_id":"44d49909-e67d-4595-b7d7-07d140c6d3bc","parent_tool_use_id":null,"uuid":"ec20a363-6181-4338-971f-f336666b14e3"}} {"type":"emit_inbound","label":"stream_event","frame":{"type":"stream_event","event":{"type":"message_stop"},"session_id":"44d49909-e67d-4595-b7d7-07d140c6d3bc","parent_tool_use_id":null,"uuid":"966de110-885d-4b63-864e-943e78c648c9"}} {"type":"emit_inbound","label":"result","frame":{"duration_api_ms":22340,"stop_reason":"end_turn","session_id":"44d49909-e67d-4595-b7d7-07d140c6d3bc","total_cost_usd":0.20634989999999998,"usage":{"input_tokens":4,"cache_creation_input_tokens":221,"cache_read_input_tokens":76239,"output_tokens":131,"output_tokens_details":{"thinking_tokens":46},"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":221,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":1,"output_tokens":7,"cache_read_input_tokens":38134,"cache_creation_input_tokens":192,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":192},"type":"message"}],"speed":"standard"},"modelUsage":{"claude-sonnet-4-6":{"inputTokens":18,"outputTokens":714,"cacheReadInputTokens":210589,"cacheCreationInputTokens":19855,"webSearchRequests":0,"costUSD":0.19307069999999998,"contextWindow":200000,"maxOutputTokens":32000,"thinkingTokens":113,"canonicalModel":"claude-sonnet-4-6","provider":"firstParty","costBasis":"list"},"claude-haiku-4-5-20251001":{"inputTokens":10,"outputTokens":96,"cacheReadInputTokens":14652,"cacheCreationInputTokens":5662,"webSearchRequests":0,"costUSD":0.013279200000000001,"contextWindow":200000,"maxOutputTokens":32000,"thinkingTokens":86,"canonicalModel":"claude-haiku-4-5","provider":"firstParty","costBasis":"list"}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","subagent_stats":{"spawned":2,"requested":{"background":2,"foreground":0,"unset":0},"started_in_background":2,"max_depth":1,"spawned_by_subagents":0,"completed":1,"failed":0,"killed":{"parent":1,"user":0,"system":0},"refused":{"depth_limit":0,"concurrency_limit":0,"budget":0},"by_type":{"general-purpose":2}},"is_error":false,"num_turns":2,"subtype":"success","api_error_status":null,"result":"B_STOPPED","ttft_ms":1885,"type":"result","duration_ms":3531,"uuid":"416a3377-140d-46d8-888a-bf6534943973","ttft_stream_ms":1263,"time_to_request_ms":31,"first_content_frame_ms":1267,"queued_turn_count":0,"result_index":2}} -{"type":"expect_outbound","label":"prompt.offer:3","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Use the SendMessage tool to send Agent A this message: Reply with exactly: A_SECOND\nThen reply with exactly RESUMED and stop. When Agent A's new completion is reported, reply with exactly A_RESUME_REPORTED and stop."},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:3","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Use the SendMessage tool to send Agent A this message: Reply with exactly: A_SECOND\nThen reply with exactly RESUMED and stop. When Agent A's new completion is reported, reply with exactly A_RESUME_REPORTED and stop."},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.281","cwd":"/tmp/claude-replay-claude_background_subagent_lifecycle","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"8bab30bc-6863-432a-bd6d-bd1db26d032c","session_id":"44d49909-e67d-4595-b7d7-07d140c6d3bc"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"status","status":"requesting","session_id":"44d49909-e67d-4595-b7d7-07d140c6d3bc","uuid":"ed5bcf80-befd-4ee0-b0dd-9e2c7924f134"}} {"type":"emit_inbound","label":"stream_event","frame":{"type":"stream_event","event":{"type":"message_start","message":{"model":"claude-sonnet-4-6","id":"msg_011CfNzUPpHQ8Cg31VsC1xki","type":"message","role":"assistant","content":[],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":377,"cache_read_input_tokens":38326,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":377},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"},"diagnostics":null,"context_management":null}},"session_id":"44d49909-e67d-4595-b7d7-07d140c6d3bc","parent_tool_use_id":null,"uuid":"408fb17d-cedd-4ed4-a856-7a450b59a12c","ttft_ms":1468}} @@ -248,7 +248,7 @@ {"type":"emit_inbound","label":"stream_event","frame":{"type":"stream_event","event":{"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"container":null},"usage":{"input_tokens":1,"cache_creation_input_tokens":247,"cache_read_input_tokens":38768,"output_tokens":5,"output_tokens_details":{"thinking_tokens":0},"iterations":[{"input_tokens":1,"output_tokens":5,"cache_read_input_tokens":38768,"cache_creation_input_tokens":247,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":247},"type":"message"}]},"context_management":{"applied_edits":[]}},"session_id":"44d49909-e67d-4595-b7d7-07d140c6d3bc","parent_tool_use_id":null,"uuid":"085ebe96-1476-49e9-82d8-e484088f70d9"}} {"type":"emit_inbound","label":"stream_event","frame":{"type":"stream_event","event":{"type":"message_stop"},"session_id":"44d49909-e67d-4595-b7d7-07d140c6d3bc","parent_tool_use_id":null,"uuid":"a8503814-61df-4db0-9f4d-d45b8f0d2ab3"}} {"type":"emit_inbound","label":"result","frame":{"duration_api_ms":29933,"stop_reason":"end_turn","session_id":"44d49909-e67d-4595-b7d7-07d140c6d3bc","total_cost_usd":0.25042339999999996,"usage":{"input_tokens":4,"cache_creation_input_tokens":312,"cache_read_input_tokens":77471,"output_tokens":163,"output_tokens_details":{"thinking_tokens":37},"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":312,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":1,"output_tokens":5,"cache_read_input_tokens":38768,"cache_creation_input_tokens":247,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":247},"type":"message"}],"speed":"standard"},"modelUsage":{"claude-sonnet-4-6":{"inputTokens":25,"outputTokens":887,"cacheReadInputTokens":326386,"cacheCreationInputTokens":20544,"webSearchRequests":0,"costUSD":0.23455979999999998,"contextWindow":200000,"maxOutputTokens":32000,"thinkingTokens":150,"canonicalModel":"claude-sonnet-4-6","provider":"firstParty","costBasis":"list"},"claude-haiku-4-5-20251001":{"inputTokens":20,"outputTokens":151,"cacheReadInputTokens":34966,"cacheCreationInputTokens":5796,"webSearchRequests":0,"costUSD":0.015863600000000002,"contextWindow":200000,"maxOutputTokens":32000,"thinkingTokens":131,"canonicalModel":"claude-haiku-4-5","provider":"firstParty","costBasis":"list"}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","subagent_stats":{"spawned":2,"requested":{"background":2,"foreground":0,"unset":0},"started_in_background":2,"max_depth":1,"spawned_by_subagents":0,"completed":1,"failed":0,"killed":{"parent":1,"user":0,"system":0},"refused":{"depth_limit":0,"concurrency_limit":0,"budget":0},"by_type":{"general-purpose":2}},"is_error":false,"num_turns":2,"subtype":"success","api_error_status":null,"result":"RESUMED","ttft_ms":2028,"type":"result","duration_ms":4902,"uuid":"e690f532-4454-40e3-ac78-131d6fb581be","ttft_stream_ms":1639,"time_to_request_ms":27,"first_content_frame_ms":1639,"queued_turn_count":0,"result_index":4}} -{"type":"expect_outbound","label":"prompt.offer:4","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Reply with exactly: ALL_DONE"},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:4","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Reply with exactly: ALL_DONE"},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.281","cwd":"/tmp/claude-replay-claude_background_subagent_lifecycle","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"05321305-342d-4888-a956-e4a5dcbeee08","session_id":"44d49909-e67d-4595-b7d7-07d140c6d3bc"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"status","status":"requesting","session_id":"44d49909-e67d-4595-b7d7-07d140c6d3bc","uuid":"aadc066e-c34a-4265-80cc-fb8058dce3ac"}} {"type":"emit_inbound","label":"stream_event","frame":{"type":"stream_event","event":{"type":"message_start","message":{"model":"claude-sonnet-4-6","id":"msg_011CfNzUsujEce8777pY4ghb","type":"message","role":"assistant","content":[],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":427,"cache_read_input_tokens":39015,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":427},"output_tokens":8,"service_tier":"standard","inference_geo":"not_available"},"diagnostics":null,"context_management":null}},"session_id":"44d49909-e67d-4595-b7d7-07d140c6d3bc","parent_tool_use_id":null,"uuid":"df7dac5f-9e95-4ffb-9566-00db2f3aa96d","ttft_ms":1490}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/claude_compact_after_peer_turn/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/claude_compact_after_peer_turn/claude_transcript.ndjson index a6b03a4e4530f..cac28c40686cc 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/claude_compact_after_peer_turn/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/claude_compact_after_peer_turn/claude_transcript.ndjson @@ -1,6 +1,6 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.3.276","scenario":"claude_compact_after_peer_turn","metadata":{"prompts":["Reply with exactly: compact probe first turn","/compact"],"model":"claude-sonnet-4-6","nativeSessionId":"c0de0c0d-5e55-4c0a-9a7c-0000000000c1","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"hand-ported: live claude 2.1.285 /compact capture + peer-origin turn from provider log 2026-09-30T07:46:53Z"}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.3.276","scenario":"claude_compact_after_peer_turn","metadata":{"prompts":["Reply with exactly: compact probe first turn","/compact"],"model":"claude-sonnet-4-6","nativeSessionId":"c0de0c0d-5e55-4c0a-9a7c-0000000000c1","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"hand-ported: live claude 2.1.285 /compact capture + peer-origin turn from provider log 2026-09-30T07:46:53Z","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","settings":{"showThinkingSummaries":true},"allowDangerouslySkipPermissions":true,"sessionId":"c0de0c0d-5e55-4c0a-9a7c-0000000000c1"}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Reply with exactly: compact probe first turn"},"parent_tool_use_id":null,"uuid":"c1c3afd6-55ec-423c-a2b2-f7c8c18a8131"}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Reply with exactly: compact probe first turn"},"parent_tool_use_id":null,"uuid":"c1c3afd6-55ec-423c-a2b2-f7c8c18a8131","origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"command_lifecycle","frame":{"type":"command_lifecycle","command_uuid":"c1c3afd6-55ec-423c-a2b2-f7c8c18a8131","state":"queued","uuid":"83be7596-5556-4a53-984f-6e50b9970966","session_id":"c0de0c0d-5e55-4c0a-9a7c-0000000000c1"}} {"type":"emit_inbound","label":"command_lifecycle","frame":{"type":"command_lifecycle","command_uuid":"c1c3afd6-55ec-423c-a2b2-f7c8c18a8131","state":"started","uuid":"e5bdaab3-f3b1-4bf1-96a9-eba816e3b0d4","session_id":"c0de0c0d-5e55-4c0a-9a7c-0000000000c1"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.285","cwd":"/tmp/claude-replay-claude_compact_after_peer_turn","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"c943d4f2-f3da-4a2e-825d-c2e869746105","session_id":"c0de0c0d-5e55-4c0a-9a7c-0000000000c1"}} @@ -15,7 +15,7 @@ {"type":"emit_inbound","label":"stream_event","frame":{"type":"stream_event","event":{"type":"message_stop"},"session_id":"c0de0c0d-5e55-4c0a-9a7c-0000000000c1","parent_tool_use_id":null,"uuid":"2dcb01ce-be13-4b5f-8071-45a2ea77d928"}} {"type":"emit_inbound","label":"result","frame":{"duration_api_ms":3960,"stop_reason":"end_turn","session_id":"c0de0c0d-5e55-4c0a-9a7c-0000000000c1","total_cost_usd":0.16794900000000001,"usage":{"input_tokens":3,"cache_creation_input_tokens":27435,"cache_read_input_tokens":0,"output_tokens":7,"output_tokens_details":{"thinking_tokens":0},"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":27435,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":3,"output_tokens":7,"cache_read_input_tokens":0,"cache_creation_input_tokens":27435,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":27435},"type":"message"}],"speed":"standard","fallback_credit":null},"modelUsage":{"claude-sonnet-4-6":{"inputTokens":1018,"outputTokens":19,"cacheReadInputTokens":0,"cacheCreationInputTokens":27435,"webSearchRequests":0,"costUSD":0.16794900000000001,"contextWindow":200000,"maxOutputTokens":32000,"thinkingTokens":0,"canonicalModel":"claude-sonnet-4-6","provider":"firstParty","costBasis":"list"}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","subagent_stats":{"spawned":0,"requested":{"background":0,"foreground":0,"unset":0},"started_in_background":0,"max_depth":0,"spawned_by_subagents":0,"completed":0,"failed":0,"killed":{"parent":0,"user":0,"system":0},"refused":{"depth_limit":0,"concurrency_limit":0,"budget":0},"by_type":{}},"is_error":false,"num_turns":1,"subtype":"success","api_error_status":null,"result":"compact probe first turn","ttft_ms":3051,"type":"result","duration_ms":3078,"uuid":"61f3189e-50b3-4c08-9dd7-d03238598eee","ttft_stream_ms":2979,"time_to_request_ms":85,"first_content_frame_ms":2980,"user_message_uuid":"c1c3afd6-55ec-423c-a2b2-f7c8c18a8131","user_message_uuids":["c1c3afd6-55ec-423c-a2b2-f7c8c18a8131"],"request_sent_wall_ms":1790828393697,"queued_turn_count":0,"result_index":0}} {"type":"emit_inbound","label":"command_lifecycle","frame":{"type":"command_lifecycle","command_uuid":"c1c3afd6-55ec-423c-a2b2-f7c8c18a8131","state":"completed","uuid":"2cfdfbc2-b150-4709-85a9-84126ab680c8","session_id":"c0de0c0d-5e55-4c0a-9a7c-0000000000c1"}} -{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"/compact"},"parent_tool_use_id":null,"uuid":"02888b9e-8190-40b9-8f1b-c7bb9083f803"}}} +{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"/compact"},"parent_tool_use_id":null,"uuid":"02888b9e-8190-40b9-8f1b-c7bb9083f803","origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"command_lifecycle","frame":{"type":"command_lifecycle","command_uuid":"02888b9e-8190-40b9-8f1b-c7bb9083f803","state":"queued","uuid":"0b7b4d3e-6a0f-4d9a-9f0e-5c1a2b3c4d11","session_id":"c0de0c0d-5e55-4c0a-9a7c-0000000000c1"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.285","cwd":"/tmp/claude-replay-claude_compact_after_peer_turn","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"89c10694-8b77-49af-bc61-a50e5d625c5c","session_id":"c0de0c0d-5e55-4c0a-9a7c-0000000000c1"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"status","status":"requesting","session_id":"c0de0c0d-5e55-4c0a-9a7c-0000000000c1","uuid":"ddee11c1-8e3c-47ce-abf1-b1b56c21520c"}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/claude_compact_after_peer_turn_no_echo/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/claude_compact_after_peer_turn_no_echo/claude_transcript.ndjson index b0f987bb6ef64..724bbe24fc5ab 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/claude_compact_after_peer_turn_no_echo/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/claude_compact_after_peer_turn_no_echo/claude_transcript.ndjson @@ -1,6 +1,6 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.3.276","scenario":"claude_compact_after_peer_turn_no_echo","metadata":{"prompts":["Reply with exactly: compact probe first turn","/compact"],"model":"claude-sonnet-4-6","nativeSessionId":"c0de0c0d-5e55-4c0a-9a7c-0000000000c1","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"hand-ported: claude_compact_after_peer_turn without prompt echoes or command_lifecycle frames, the shape of a CLI before 2.1.252"}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.3.276","scenario":"claude_compact_after_peer_turn_no_echo","metadata":{"prompts":["Reply with exactly: compact probe first turn","/compact"],"model":"claude-sonnet-4-6","nativeSessionId":"c0de0c0d-5e55-4c0a-9a7c-0000000000c1","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"hand-ported: claude_compact_after_peer_turn without prompt echoes or command_lifecycle frames, the shape of a CLI before 2.1.252","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","settings":{"showThinkingSummaries":true},"allowDangerouslySkipPermissions":true,"sessionId":"c0de0c0d-5e55-4c0a-9a7c-0000000000c1"}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Reply with exactly: compact probe first turn"},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Reply with exactly: compact probe first turn"},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.285","cwd":"/tmp/claude-replay-claude_compact_after_peer_turn_no_echo","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"c943d4f2-f3da-4a2e-825d-c2e869746105","session_id":"c0de0c0d-5e55-4c0a-9a7c-0000000000c1"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"status","status":"requesting","session_id":"c0de0c0d-5e55-4c0a-9a7c-0000000000c1","uuid":"45483fc9-b857-405b-b79e-e7f9487be447"}} {"type":"emit_inbound","label":"stream_event","frame":{"type":"stream_event","event":{"type":"message_start","message":{"model":"claude-sonnet-4-6","id":"msg_011CfasheXv56NiEcGmwdisp","type":"message","role":"assistant","content":[],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":27435,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":27435},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"},"diagnostics":null,"context_management":null}},"session_id":"c0de0c0d-5e55-4c0a-9a7c-0000000000c1","parent_tool_use_id":null,"uuid":"aba19806-284b-49e2-9d49-4386c550fa0c","ttft_ms":2895}} @@ -12,7 +12,7 @@ {"type":"emit_inbound","label":"stream_event","frame":{"type":"stream_event","event":{"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"container":null},"usage":{"input_tokens":3,"cache_creation_input_tokens":27435,"cache_read_input_tokens":0,"output_tokens":7,"output_tokens_details":{"thinking_tokens":0},"iterations":[{"input_tokens":3,"output_tokens":7,"cache_read_input_tokens":0,"cache_creation_input_tokens":27435,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":27435},"type":"message"}]},"context_management":{"applied_edits":[]}},"session_id":"c0de0c0d-5e55-4c0a-9a7c-0000000000c1","parent_tool_use_id":null,"uuid":"c2296988-3238-467e-9fc0-e75bc59bc448"}} {"type":"emit_inbound","label":"stream_event","frame":{"type":"stream_event","event":{"type":"message_stop"},"session_id":"c0de0c0d-5e55-4c0a-9a7c-0000000000c1","parent_tool_use_id":null,"uuid":"2dcb01ce-be13-4b5f-8071-45a2ea77d928"}} {"type":"emit_inbound","label":"result","frame":{"duration_api_ms":3960,"stop_reason":"end_turn","session_id":"c0de0c0d-5e55-4c0a-9a7c-0000000000c1","total_cost_usd":0.16794900000000001,"usage":{"input_tokens":3,"cache_creation_input_tokens":27435,"cache_read_input_tokens":0,"output_tokens":7,"output_tokens_details":{"thinking_tokens":0},"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":27435,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":3,"output_tokens":7,"cache_read_input_tokens":0,"cache_creation_input_tokens":27435,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":27435},"type":"message"}],"speed":"standard","fallback_credit":null},"modelUsage":{"claude-sonnet-4-6":{"inputTokens":1018,"outputTokens":19,"cacheReadInputTokens":0,"cacheCreationInputTokens":27435,"webSearchRequests":0,"costUSD":0.16794900000000001,"contextWindow":200000,"maxOutputTokens":32000,"thinkingTokens":0,"canonicalModel":"claude-sonnet-4-6","provider":"firstParty","costBasis":"list"}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","subagent_stats":{"spawned":0,"requested":{"background":0,"foreground":0,"unset":0},"started_in_background":0,"max_depth":0,"spawned_by_subagents":0,"completed":0,"failed":0,"killed":{"parent":0,"user":0,"system":0},"refused":{"depth_limit":0,"concurrency_limit":0,"budget":0},"by_type":{}},"is_error":false,"num_turns":1,"subtype":"success","api_error_status":null,"result":"compact probe first turn","ttft_ms":3051,"type":"result","duration_ms":3078,"uuid":"61f3189e-50b3-4c08-9dd7-d03238598eee","ttft_stream_ms":2979,"time_to_request_ms":85,"first_content_frame_ms":2980,"request_sent_wall_ms":1790828393697,"queued_turn_count":0,"result_index":0}} -{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"/compact"},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"/compact"},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.285","cwd":"/tmp/claude-replay-claude_compact_after_peer_turn_no_echo","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"89c10694-8b77-49af-bc61-a50e5d625c5c","session_id":"c0de0c0d-5e55-4c0a-9a7c-0000000000c1"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"status","status":"requesting","session_id":"c0de0c0d-5e55-4c0a-9a7c-0000000000c1","uuid":"ddee11c1-8e3c-47ce-abf1-b1b56c21520c"}} {"type":"emit_inbound","label":"stream_event","frame":{"type":"stream_event","event":{"type":"message_start","message":{"model":"claude-sonnet-4-6","id":"msg_011CfZFfrqqHPHu8XPypPQCh","type":"message","role":"assistant","content":[],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":3,"output_tokens":1},"diagnostics":null,"context_management":null}},"session_id":"c0de0c0d-5e55-4c0a-9a7c-0000000000c1","parent_tool_use_id":null,"uuid":"cfca2ae0-bbba-44e3-aacb-6ad1e73d217d","ttft_ms":3511}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/claude_compact_after_resume_wake/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/claude_compact_after_resume_wake/claude_transcript.ndjson index cdd4f76c53000..109c35d48390e 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/claude_compact_after_resume_wake/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/claude_compact_after_resume_wake/claude_transcript.ndjson @@ -1,6 +1,6 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.3.276","scenario":"claude_compact_after_resume_wake","metadata":{"prompts":["Reply with exactly: compact probe first turn","/compact"],"model":"claude-sonnet-4-6","nativeSessionId":"c0de0c0d-5e55-4c0a-9a7c-0000000000c1","queryMode":"restart","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"hand-ported: live claude 2.1.285 /compact capture + recorded wake turn (claude_background_wake_before_queued_prompt) in the resume order of provider log 2026-09-30T16:42Z"}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.3.276","scenario":"claude_compact_after_resume_wake","metadata":{"prompts":["Reply with exactly: compact probe first turn","/compact"],"model":"claude-sonnet-4-6","nativeSessionId":"c0de0c0d-5e55-4c0a-9a7c-0000000000c1","queryMode":"restart","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"hand-ported: live claude 2.1.285 /compact capture + recorded wake turn (claude_background_wake_before_queued_prompt) in the resume order of provider log 2026-09-30T16:42Z","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open:1","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","settings":{"showThinkingSummaries":true},"allowDangerouslySkipPermissions":true,"sessionId":"c0de0c0d-5e55-4c0a-9a7c-0000000000c1"}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Reply with exactly: compact probe first turn"},"parent_tool_use_id":null,"uuid":"c1c3afd6-55ec-423c-a2b2-f7c8c18a8131"}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Reply with exactly: compact probe first turn"},"parent_tool_use_id":null,"uuid":"c1c3afd6-55ec-423c-a2b2-f7c8c18a8131","origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"command_lifecycle","frame":{"type":"command_lifecycle","command_uuid":"c1c3afd6-55ec-423c-a2b2-f7c8c18a8131","state":"queued","uuid":"83be7596-5556-4a53-984f-6e50b9970966","session_id":"c0de0c0d-5e55-4c0a-9a7c-0000000000c1"}} {"type":"emit_inbound","label":"command_lifecycle","frame":{"type":"command_lifecycle","command_uuid":"c1c3afd6-55ec-423c-a2b2-f7c8c18a8131","state":"started","uuid":"e5bdaab3-f3b1-4bf1-96a9-eba816e3b0d4","session_id":"c0de0c0d-5e55-4c0a-9a7c-0000000000c1"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.285","cwd":"/tmp/claude-replay-claude_compact_after_resume_wake","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"c943d4f2-f3da-4a2e-825d-c2e869746105","session_id":"c0de0c0d-5e55-4c0a-9a7c-0000000000c1"}} @@ -17,7 +17,7 @@ {"type":"emit_inbound","label":"command_lifecycle","frame":{"type":"command_lifecycle","command_uuid":"c1c3afd6-55ec-423c-a2b2-f7c8c18a8131","state":"completed","uuid":"2cfdfbc2-b150-4709-85a9-84126ab680c8","session_id":"c0de0c0d-5e55-4c0a-9a7c-0000000000c1"}} {"type":"runtime_exit","status":"success"} {"type":"expect_outbound","label":"query.open:2","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","settings":{"showThinkingSummaries":true},"allowDangerouslySkipPermissions":true,"resume":"c0de0c0d-5e55-4c0a-9a7c-0000000000c1"}}} -{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"/compact"},"parent_tool_use_id":null,"uuid":"02888b9e-8190-40b9-8f1b-c7bb9083f803"}}} +{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"/compact"},"parent_tool_use_id":null,"uuid":"02888b9e-8190-40b9-8f1b-c7bb9083f803","origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"command_lifecycle","frame":{"type":"command_lifecycle","command_uuid":"02888b9e-8190-40b9-8f1b-c7bb9083f803","state":"queued","uuid":"0b7b4d3e-6a0f-4d9a-9f0e-5c1a2b3c4d01","session_id":"c0de0c0d-5e55-4c0a-9a7c-0000000000c1"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"task_notification","task_id":"b6hcbdfjd","tool_use_id":"toolu_01VaEszfztSGi2xwnxDEaMhD","status":"stopped","output_file":"","summary":"Orphaned by a previous Claude Code process exit and reported in an aggregate summary.","uuid":"b92029ee-dc51-4433-b5af-b7e5c11dad01","session_id":"c0de0c0d-5e55-4c0a-9a7c-0000000000c1"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.285","cwd":"/tmp/claude-replay-claude_compact_after_resume_wake","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"0fd4e673-2ec0-4766-8305-954e9274cbc5","session_id":"c0de0c0d-5e55-4c0a-9a7c-0000000000c1"}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/claude_idle_resume/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/claude_idle_resume/claude_transcript.ndjson index cdc0f801e607e..8c9144ac2af2c 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/claude_idle_resume/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/claude_idle_resume/claude_transcript.ndjson @@ -1,6 +1,6 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"claude_idle_resume","metadata":{"prompts":["Respond with exactly: idle resume first turn complete","Respond with exactly: idle resume second turn complete"],"model":"claude-sonnet-4-6","nativeSessionId":"1d1e5e55-1041-4e40-8e40-000000000001","queryMode":"restart","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"manual-replay-from-thread-d0fe9018 runs 6-8 (idle-released session must reopen with resume, 2026-07-02T20:46:05Z)"}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"claude_idle_resume","metadata":{"prompts":["Respond with exactly: idle resume first turn complete","Respond with exactly: idle resume second turn complete"],"model":"claude-sonnet-4-6","nativeSessionId":"1d1e5e55-1041-4e40-8e40-000000000001","queryMode":"restart","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"manual-replay-from-thread-d0fe9018 runs 6-8 (idle-released session must reopen with resume, 2026-07-02T20:46:05Z)","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open:1","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","allowDangerouslySkipPermissions":true,"sessionId":"1d1e5e55-1041-4e40-8e40-000000000001","settings":{"showThinkingSummaries":true}}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Respond with exactly: idle resume first turn complete"},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Respond with exactly: idle resume first turn complete"},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_started","hook_id":"96353a54-8984-4e77-8060-b1dc6b030cf6","hook_name":"SessionStart:startup","hook_event":"SessionStart","uuid":"ffbfcc28-dd82-4c2a-a99f-58e5af6e393e","session_id":"1d1e5e55-1041-4e40-8e40-000000000001"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_response","hook_id":"96353a54-8984-4e77-8060-b1dc6b030cf6","hook_name":"SessionStart:startup","hook_event":"SessionStart","output":"","stdout":"","stderr":"","exit_code":0,"outcome":"success","uuid":"bbf29fb9-d4b3-4ab2-b0e3-9d2aa833099c","session_id":"1d1e5e55-1041-4e40-8e40-000000000001"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.111","cwd":"/tmp/claude-replay-claude_idle_resume","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"f468f37d-e0e6-43cf-bcd7-71e34045083e","session_id":"1d1e5e55-1041-4e40-8e40-000000000001"}} @@ -9,7 +9,7 @@ {"type":"emit_inbound","label":"result","frame":{"type":"result","subtype":"success","is_error":false,"api_error_status":null,"duration_ms":2809,"duration_api_ms":2523,"num_turns":1,"result":"idle resume first turn complete","stop_reason":"end_turn","session_id":"1d1e5e55-1041-4e40-8e40-000000000001","total_cost_usd":0.0036516,"usage":{"input_tokens":3,"cache_creation_input_tokens":0,"cache_read_input_tokens":11792,"output_tokens":7,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":0,"ephemeral_5m_input_tokens":0},"inference_geo":"","iterations":[{"input_tokens":3,"output_tokens":7,"cache_read_input_tokens":11792,"cache_creation_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"type":"message"}],"speed":"standard"},"modelUsage":{"claude-sonnet-4-6":{"inputTokens":3,"outputTokens":7,"cacheReadInputTokens":11792,"cacheCreationInputTokens":0,"webSearchRequests":0,"costUSD":0.0036516,"contextWindow":200000,"maxOutputTokens":32000}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","uuid":"d88c31ae-a8fd-4ed4-a168-96cfd3b0edd7"}} {"type":"runtime_exit","status":"success"} {"type":"expect_outbound","label":"query.open:2","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","allowDangerouslySkipPermissions":true,"resume":"1d1e5e55-1041-4e40-8e40-000000000001","settings":{"showThinkingSummaries":true}}}} -{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Respond with exactly: idle resume second turn complete"},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Respond with exactly: idle resume second turn complete"},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_started","hook_id":"4db1e61e-de28-49ee-b7ef-c375670d0aae","hook_name":"SessionStart:resume","hook_event":"SessionStart","uuid":"66e900fe-b02e-41a0-ac08-92260125b13d","session_id":"377e06a0-fe46-420e-bfaa-b4b9fcc8b871"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_response","hook_id":"4db1e61e-de28-49ee-b7ef-c375670d0aae","hook_name":"SessionStart:resume","hook_event":"SessionStart","output":"","stdout":"","stderr":"","exit_code":0,"outcome":"success","uuid":"03f2754d-daee-4128-b180-c1a39faa03f0","session_id":"377e06a0-fe46-420e-bfaa-b4b9fcc8b871"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.111","cwd":"/tmp/claude-replay-claude_idle_resume","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"5e1d64c9-a2ca-4ad1-ba2c-546ba18d1785","session_id":"1d1e5e55-1041-4e40-8e40-000000000001"}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/claude_local_bash_task/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/claude_local_bash_task/claude_transcript.ndjson index b7d8d2524dc80..29c78232adcef 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/claude_local_bash_task/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/claude_local_bash_task/claude_transcript.ndjson @@ -1,6 +1,6 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"claude_local_bash_task","metadata":{"prompts":["Run a local Bash typecheck command, then answer exactly: claude local bash task fixture complete"],"model":"claude-sonnet-4-6","nativeSessionId":"6a8f8455-10bc-4e31-8e30-b0ea9f88b911","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"manual-replay-from-thread-7f1dfff1"}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"claude_local_bash_task","metadata":{"prompts":["Run a local Bash typecheck command, then answer exactly: claude local bash task fixture complete"],"model":"claude-sonnet-4-6","nativeSessionId":"6a8f8455-10bc-4e31-8e30-b0ea9f88b911","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"manual-replay-from-thread-7f1dfff1","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","allowDangerouslySkipPermissions":true,"sessionId":"6a8f8455-10bc-4e31-8e30-b0ea9f88b911","settings":{"showThinkingSummaries":true}}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Run a local Bash typecheck command, then answer exactly: claude local bash task fixture complete"},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Run a local Bash typecheck command, then answer exactly: claude local bash task fixture complete"},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.183","cwd":"/tmp/claude-replay-claude_local_bash_task","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"af3bf4cc-1385-4e19-a5fa-fcbe2a0ca001","session_id":"6a8f8455-10bc-4e31-8e30-b0ea9f88b911"}} {"type":"emit_inbound","label":"assistant:commentary","frame":{"type":"assistant","message":{"model":"claude-sonnet-4-6","id":"msg_01localbashfixture1","type":"message","role":"assistant","content":[{"type":"text","text":"I'll run the typecheck command now."}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":1,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":null,"session_id":"6a8f8455-10bc-4e31-8e30-b0ea9f88b911","uuid":"97898e28-ee4e-4fcf-80c3-5c790c502a42"}} {"type":"emit_inbound","label":"assistant:bash","frame":{"type":"assistant","message":{"model":"claude-sonnet-4-6","id":"msg_01localbashfixture1","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01QHaWEM6vnYqxYPvpqv6Xq4","name":"Bash","input":{"command":"vp run --filter @t3tools/web typecheck 2>&1 | tail -30"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":1,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":null,"session_id":"6a8f8455-10bc-4e31-8e30-b0ea9f88b911","uuid":"1d21fda6-13b4-4229-aa5c-c7c92bdca799"}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/claude_mcp_tool_presentation/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/claude_mcp_tool_presentation/claude_transcript.ndjson index 150d6f4866fa3..f13f2dcc885fb 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/claude_mcp_tool_presentation/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/claude_mcp_tool_presentation/claude_transcript.ndjson @@ -1,6 +1,6 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"claude_mcp_tool_presentation","metadata":{"prompts":["Do exactly this, one tool call at a time, with no other tool calls:\n1) Call the Firecrawl firecrawl_scrape tool on https://example.com with formats [\"markdown\"].\n2) Call the Firecrawl firecrawl_map tool on https://example.com with limit 1.\n3) Reply with exactly: mcp presentation fixture complete"],"model":"claude-sonnet-4-6","nativeSessionId":"e51402d3-25be-4866-81d5-2ab30cecb268","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","handEdits":["Removed tool_use_meta from the firecrawl_map assistant frame, standing in for a Claude Code build that sends no display metadata for an MCP tool."],"generatedBy":"recordClaudeAgentSdkReplayTranscript"}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"claude_mcp_tool_presentation","metadata":{"prompts":["Do exactly this, one tool call at a time, with no other tool calls:\n1) Call the Firecrawl firecrawl_scrape tool on https://example.com with formats [\"markdown\"].\n2) Call the Firecrawl firecrawl_map tool on https://example.com with limit 1.\n3) Reply with exactly: mcp presentation fixture complete"],"model":"claude-sonnet-4-6","nativeSessionId":"e51402d3-25be-4866-81d5-2ab30cecb268","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","handEdits":["Removed tool_use_meta from the firecrawl_map assistant frame, standing in for a Claude Code build that sends no display metadata for an MCP tool."],"generatedBy":"recordClaudeAgentSdkReplayTranscript","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","settings":{"showThinkingSummaries":true},"allowDangerouslySkipPermissions":true,"sessionId":"e51402d3-25be-4866-81d5-2ab30cecb268"}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Do exactly this, one tool call at a time, with no other tool calls:\n1) Call the Firecrawl firecrawl_scrape tool on https://example.com with formats [\"markdown\"].\n2) Call the Firecrawl firecrawl_map tool on https://example.com with limit 1.\n3) Reply with exactly: mcp presentation fixture complete"},"parent_tool_use_id":null,"uuid":"8935142f-0551-46e6-9a6b-95034332fa1a"}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Do exactly this, one tool call at a time, with no other tool calls:\n1) Call the Firecrawl firecrawl_scrape tool on https://example.com with formats [\"markdown\"].\n2) Call the Firecrawl firecrawl_map tool on https://example.com with limit 1.\n3) Reply with exactly: mcp presentation fixture complete"},"parent_tool_use_id":null,"uuid":"8935142f-0551-46e6-9a6b-95034332fa1a","origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"command_lifecycle","frame":{"type":"command_lifecycle","command_uuid":"8935142f-0551-46e6-9a6b-95034332fa1a","state":"queued","uuid":"042fc299-7a91-42e7-a7c8-7ad83c342c61","session_id":"e51402d3-25be-4866-81d5-2ab30cecb268"}} {"type":"emit_inbound","label":"rate_limit_event","frame":{"type":"rate_limit_event","rate_limit_info":{"status":"allowed"},"uuid":"16a8e60b-317a-4de1-b45e-2707aebd957e","session_id":"e51402d3-25be-4866-81d5-2ab30cecb268"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"commands_changed","commands":[],"uuid":"5882c810-a76d-43ef-a7d8-20a4ce7272f7","session_id":"e51402d3-25be-4866-81d5-2ab30cecb268"}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/claude_nested_background_subagent_wake/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/claude_nested_background_subagent_wake/claude_transcript.ndjson index a6b03d62e92a5..d8497955a26eb 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/claude_nested_background_subagent_wake/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/claude_nested_background_subagent_wake/claude_transcript.ndjson @@ -1,6 +1,6 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"claude_nested_background_subagent_wake","metadata":{"prompts":["Live-test a background subagent that starts its own background subagent. Do exactly this, with no extra steps.\n\n1) Use the Agent tool with subagent_type \"general-purpose\" and run_in_background set to true to launch ONE subagent with this prompt:\n \"Do exactly this. a) Use the Agent tool with subagent_type \\\"general-purpose\\\" and run_in_background set to true to launch ONE subagent with the prompt: Reply with exactly GRANDCHILD_DONE. b) Run this exact command with the Bash tool: sleep 20 && echo CHILD_WAITED. c) Reply with exactly CHILD_DONE.\"\n2) Immediately after launching it, reply with exactly ROOT_STARTED and stop. Do not wait for it or check on it.\n3) When its completion is reported, reply with exactly ROOT_WAKE_DONE and stop."],"model":"claude-sonnet-4-6","nativeSessionId":"1124d20c-d64e-42b2-873f-eaf287cd0d3f","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","backgroundWakeCounts":[1],"generatedBy":"recordClaudeAgentSdkReplayTranscript"}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"claude_nested_background_subagent_wake","metadata":{"prompts":["Live-test a background subagent that starts its own background subagent. Do exactly this, with no extra steps.\n\n1) Use the Agent tool with subagent_type \"general-purpose\" and run_in_background set to true to launch ONE subagent with this prompt:\n \"Do exactly this. a) Use the Agent tool with subagent_type \\\"general-purpose\\\" and run_in_background set to true to launch ONE subagent with the prompt: Reply with exactly GRANDCHILD_DONE. b) Run this exact command with the Bash tool: sleep 20 && echo CHILD_WAITED. c) Reply with exactly CHILD_DONE.\"\n2) Immediately after launching it, reply with exactly ROOT_STARTED and stop. Do not wait for it or check on it.\n3) When its completion is reported, reply with exactly ROOT_WAKE_DONE and stop."],"model":"claude-sonnet-4-6","nativeSessionId":"1124d20c-d64e-42b2-873f-eaf287cd0d3f","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","backgroundWakeCounts":[1],"generatedBy":"recordClaudeAgentSdkReplayTranscript","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","settings":{"showThinkingSummaries":true},"allowDangerouslySkipPermissions":true,"sessionId":"1124d20c-d64e-42b2-873f-eaf287cd0d3f"}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Live-test a background subagent that starts its own background subagent. Do exactly this, with no extra steps.\n\n1) Use the Agent tool with subagent_type \"general-purpose\" and run_in_background set to true to launch ONE subagent with this prompt:\n \"Do exactly this. a) Use the Agent tool with subagent_type \\\"general-purpose\\\" and run_in_background set to true to launch ONE subagent with the prompt: Reply with exactly GRANDCHILD_DONE. b) Run this exact command with the Bash tool: sleep 20 && echo CHILD_WAITED. c) Reply with exactly CHILD_DONE.\"\n2) Immediately after launching it, reply with exactly ROOT_STARTED and stop. Do not wait for it or check on it.\n3) When its completion is reported, reply with exactly ROOT_WAKE_DONE and stop."},"parent_tool_use_id":null,"uuid":"9dc39d95-92fe-40e4-a75b-835d9f6ab53b"}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Live-test a background subagent that starts its own background subagent. Do exactly this, with no extra steps.\n\n1) Use the Agent tool with subagent_type \"general-purpose\" and run_in_background set to true to launch ONE subagent with this prompt:\n \"Do exactly this. a) Use the Agent tool with subagent_type \\\"general-purpose\\\" and run_in_background set to true to launch ONE subagent with the prompt: Reply with exactly GRANDCHILD_DONE. b) Run this exact command with the Bash tool: sleep 20 && echo CHILD_WAITED. c) Reply with exactly CHILD_DONE.\"\n2) Immediately after launching it, reply with exactly ROOT_STARTED and stop. Do not wait for it or check on it.\n3) When its completion is reported, reply with exactly ROOT_WAKE_DONE and stop."},"parent_tool_use_id":null,"uuid":"9dc39d95-92fe-40e4-a75b-835d9f6ab53b","origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_started","hook_id":"d9940174-9404-49d0-96f5-20d7845e0094","hook_name":"SessionStart:startup","hook_event":"SessionStart","uuid":"9e05be7a-6cca-4c72-99f0-c5e3321f9bd2","session_id":"1124d20c-d64e-42b2-873f-eaf287cd0d3f"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_response","hook_id":"d9940174-9404-49d0-96f5-20d7845e0094","hook_name":"SessionStart:startup","hook_event":"SessionStart","output":"","stdout":"","stderr":"","exit_code":0,"outcome":"success","uuid":"d0f8f1ad-8a03-4be1-adc6-07db46f0d0e9","session_id":"1124d20c-d64e-42b2-873f-eaf287cd0d3f"}} {"type":"emit_inbound","label":"command_lifecycle","frame":{"type":"command_lifecycle","command_uuid":"9dc39d95-92fe-40e4-a75b-835d9f6ab53b","state":"queued","uuid":"3c1831f6-d763-48f4-88c4-af37343e3eb1","session_id":"1124d20c-d64e-42b2-873f-eaf287cd0d3f"}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/claude_nested_subagent_model/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/claude_nested_subagent_model/claude_transcript.ndjson index 5859782009c61..1fbc718fe15e8 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/claude_nested_subagent_model/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/claude_nested_subagent_model/claude_transcript.ndjson @@ -1,6 +1,6 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"claude_nested_subagent_model","metadata":{"prompts":["Live-test nested subagents. Do exactly this, with no extra steps.\n\n1) Call the Agent tool once with subagent_type \"general-purpose\", model \"haiku\", run_in_background false, and this prompt:\n \"Call the Agent tool once with subagent_type \\\"general-purpose\\\", run_in_background false, no model parameter, and the prompt: Reply with exactly NESTED_LEAF_OK. Then reply with exactly what that agent said.\"\n2) When it finishes, reply with exactly what it said."],"model":"claude-sonnet-4-6","nativeSessionId":"fbcbe711-d6fa-479a-aace-7f634ed09697","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"recordClaudeAgentSdkReplayTranscript"}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"claude_nested_subagent_model","metadata":{"prompts":["Live-test nested subagents. Do exactly this, with no extra steps.\n\n1) Call the Agent tool once with subagent_type \"general-purpose\", model \"haiku\", run_in_background false, and this prompt:\n \"Call the Agent tool once with subagent_type \\\"general-purpose\\\", run_in_background false, no model parameter, and the prompt: Reply with exactly NESTED_LEAF_OK. Then reply with exactly what that agent said.\"\n2) When it finishes, reply with exactly what it said."],"model":"claude-sonnet-4-6","nativeSessionId":"fbcbe711-d6fa-479a-aace-7f634ed09697","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"recordClaudeAgentSdkReplayTranscript","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","settings":{"showThinkingSummaries":true},"allowDangerouslySkipPermissions":true,"sessionId":"fbcbe711-d6fa-479a-aace-7f634ed09697"}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Live-test nested subagents. Do exactly this, with no extra steps.\n\n1) Call the Agent tool once with subagent_type \"general-purpose\", model \"haiku\", run_in_background false, and this prompt:\n \"Call the Agent tool once with subagent_type \\\"general-purpose\\\", run_in_background false, no model parameter, and the prompt: Reply with exactly NESTED_LEAF_OK. Then reply with exactly what that agent said.\"\n2) When it finishes, reply with exactly what it said."},"parent_tool_use_id":null,"uuid":"89fe752a-4d27-4e54-815c-95b3e6a0f6ab"}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Live-test nested subagents. Do exactly this, with no extra steps.\n\n1) Call the Agent tool once with subagent_type \"general-purpose\", model \"haiku\", run_in_background false, and this prompt:\n \"Call the Agent tool once with subagent_type \\\"general-purpose\\\", run_in_background false, no model parameter, and the prompt: Reply with exactly NESTED_LEAF_OK. Then reply with exactly what that agent said.\"\n2) When it finishes, reply with exactly what it said."},"parent_tool_use_id":null,"uuid":"89fe752a-4d27-4e54-815c-95b3e6a0f6ab","origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"command_lifecycle","frame":{"type":"command_lifecycle","command_uuid":"89fe752a-4d27-4e54-815c-95b3e6a0f6ab","state":"queued","uuid":"6e11031d-6b46-48ef-be60-0f2c8ba62b5f","session_id":"fbcbe711-d6fa-479a-aace-7f634ed09697"}} {"type":"emit_inbound","label":"command_lifecycle","frame":{"type":"command_lifecycle","command_uuid":"89fe752a-4d27-4e54-815c-95b3e6a0f6ab","state":"started","uuid":"d1ba159e-31f8-44b7-ae8f-44853c42ae12","session_id":"fbcbe711-d6fa-479a-aace-7f634ed09697"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.285","cwd":"/tmp/claude-replay-claude_nested_subagent_model","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"30753315-10eb-421f-b20d-349d89ea1b37","session_id":"fbcbe711-d6fa-479a-aace-7f634ed09697"}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/claude_result_is_error/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/claude_result_is_error/claude_transcript.ndjson index 2597109378ee2..bf84cb88d1ddd 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/claude_result_is_error/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/claude_result_is_error/claude_transcript.ndjson @@ -1,10 +1,10 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"claude_result_is_error","metadata":{"prompts":["Say hello before the credentials expire.","Try again now that auth is back."],"model":"claude-sonnet-4-6","nativeSessionId":"aa401aa4-e597-4e40-8e40-1e401e401e40","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"manual-replay-from-thread-47763f5e run 1 (subtype success + is_error 401 result, 2026-07-01T20:56:54Z)"}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"claude_result_is_error","metadata":{"prompts":["Say hello before the credentials expire.","Try again now that auth is back."],"model":"claude-sonnet-4-6","nativeSessionId":"aa401aa4-e597-4e40-8e40-1e401e401e40","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"manual-replay-from-thread-47763f5e run 1 (subtype success + is_error 401 result, 2026-07-01T20:56:54Z)","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","allowDangerouslySkipPermissions":true,"sessionId":"aa401aa4-e597-4e40-8e40-1e401e401e40","settings":{"showThinkingSummaries":true}}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Say hello before the credentials expire."},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Say hello before the credentials expire."},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system:init:1","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.183","cwd":"/tmp/claude-replay-claude_result_is_error","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"aa401aa4-0000-4000-8000-000000000001","session_id":"aa401aa4-e597-4e40-8e40-1e401e401e40"}} {"type":"emit_inbound","label":"assistant:synthetic_auth_error","frame":{"type":"assistant","message":{"id":"7f28a402-6d4c-491e-abbb-2b3c231a06f0","container":null,"model":"","role":"assistant","stop_details":null,"stop_reason":"stop_sequence","stop_sequence":"","type":"message","usage":{"input_tokens":0,"output_tokens":0,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":null,"cache_creation":{"ephemeral_1h_input_tokens":0,"ephemeral_5m_input_tokens":0},"inference_geo":null,"iterations":null,"speed":null},"content":[{"type":"text","text":"Failed to authenticate. API Error: 401 Invalid authentication credentials"}],"context_management":null},"parent_tool_use_id":null,"session_id":"aa401aa4-e597-4e40-8e40-1e401e401e40","uuid":"aa401aa4-0000-4000-8000-000000000002","error":"authentication_failed"}} {"type":"emit_inbound","label":"result:1_is_error","frame":{"type":"result","subtype":"success","is_error":true,"api_error_status":401,"duration_ms":2116,"duration_api_ms":0,"num_turns":1,"result":"Failed to authenticate. API Error: 401 Invalid authentication credentials","stop_reason":"stop_sequence","session_id":"aa401aa4-e597-4e40-8e40-1e401e401e40","total_cost_usd":0,"usage":{"input_tokens":0,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":0,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":0,"ephemeral_5m_input_tokens":0},"inference_geo":"","iterations":[],"speed":"standard"},"modelUsage":{},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","uuid":"aa401aa4-0000-4000-8000-000000000003"}} -{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Try again now that auth is back."},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Try again now that auth is back."},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"assistant:recovered","frame":{"type":"assistant","message":{"model":"claude-sonnet-4-6","id":"msg_01iserrorfixture1","type":"message","role":"assistant","content":[{"type":"text","text":"claude result is_error fixture recovered"}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":1,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":null,"session_id":"aa401aa4-e597-4e40-8e40-1e401e401e40","uuid":"aa401aa4-0000-4000-8000-000000000004"}} {"type":"emit_inbound","label":"result:2_success","frame":{"type":"result","subtype":"success","is_error":false,"api_error_status":null,"duration_ms":4000,"duration_api_ms":3500,"num_turns":1,"result":"claude result is_error fixture recovered","stop_reason":"end_turn","session_id":"aa401aa4-e597-4e40-8e40-1e401e401e40","total_cost_usd":0.001,"usage":{"input_tokens":2,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":2,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":0,"ephemeral_5m_input_tokens":0},"inference_geo":"","iterations":[{"input_tokens":1,"output_tokens":1,"cache_read_input_tokens":0,"cache_creation_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"type":"message"}],"speed":"standard"},"modelUsage":{"claude-sonnet-4-6":{"inputTokens":2,"outputTokens":2,"cacheReadInputTokens":0,"cacheCreationInputTokens":0,"webSearchRequests":0,"costUSD":0.001,"contextWindow":200000,"maxOutputTokens":32000}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","uuid":"aa401aa4-0000-4000-8000-000000000005"}} {"type":"runtime_exit","status":"success"} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/claude_subagent_resume_after_restart/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/claude_subagent_resume_after_restart/claude_transcript.ndjson index 3843dfb6cbfa9..e5c9c121b8806 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/claude_subagent_resume_after_restart/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/claude_subagent_resume_after_restart/claude_transcript.ndjson @@ -1,6 +1,6 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.3.276","scenario":"claude_subagent_resume_after_restart","metadata":{"prompts":["Do a brief audit of this repo. What does it contain? Use subagents: spawn two, one per file in src/, and have each run a couple of shell commands (ls, wc -l, cat) before reporting.","send a message back to one of the agents to find a bug and report a fix"],"model":"claude-sonnet-4-6","nativeSessionId":"35180cc3-631c-49d4-bdb2-ecb5211a6993","queryMode":"restart","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"manual-replay-from-thread-42e302f0 (2026-09-25): the math.ts subagent only. Its runs are ordered before each root result, as claude_background_subagent_lifecycle recorded; the live runs finished after it. subagent.found is what getSubagentMessages returned for the task against the live session."}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.3.276","scenario":"claude_subagent_resume_after_restart","metadata":{"prompts":["Do a brief audit of this repo. What does it contain? Use subagents: spawn two, one per file in src/, and have each run a couple of shell commands (ls, wc -l, cat) before reporting.","send a message back to one of the agents to find a bug and report a fix"],"model":"claude-sonnet-4-6","nativeSessionId":"35180cc3-631c-49d4-bdb2-ecb5211a6993","queryMode":"restart","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"manual-replay-from-thread-42e302f0 (2026-09-25): the math.ts subagent only. Its runs are ordered before each root result, as claude_background_subagent_lifecycle recorded; the live runs finished after it. subagent.found is what getSubagentMessages returned for the task against the live session.","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open:1","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","allowDangerouslySkipPermissions":true,"settings":{"showThinkingSummaries":true},"sessionId":"35180cc3-631c-49d4-bdb2-ecb5211a6993"}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Do a brief audit of this repo. What does it contain? Use subagents: spawn two, one per file in src/, and have each run a couple of shell commands (ls, wc -l, cat) before reporting."},"parent_tool_use_id":null,"uuid":"1aa25bfc-0ebd-460d-9598-28a85a6cd159"}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Do a brief audit of this repo. What does it contain? Use subagents: spawn two, one per file in src/, and have each run a couple of shell commands (ls, wc -l, cat) before reporting."},"parent_tool_use_id":null,"uuid":"1aa25bfc-0ebd-460d-9598-28a85a6cd159","origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.281","cwd":"/tmp/claude-replay-claude_subagent_resume_after_restart","tools":[],"mcp_servers":[],"model":"claude-sonnet-5","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"0839e9f1-86d3-4777-93d0-9ba8c9a66fe0","session_id":"35180cc3-631c-49d4-bdb2-ecb5211a6993"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"status","status":"requesting","session_id":"35180cc3-631c-49d4-bdb2-ecb5211a6993","uuid":"0cce030b-d27e-4244-adaa-605c4612e101"}} {"type":"emit_inbound","label":"assistant","frame":{"type":"assistant","message":{"model":"claude-sonnet-5","id":"msg_011CfQa7PQMxCC2dmHGhLCBx","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"Let me check the repo structure to see what files exist under src/.\n\n","signature":"EtICCqgBCBIYAipABV7ZUPIvhQrXyTZC3FKpB5D5gCvAMicC0bGNpQdBZQ7Lu21eJfbYo7VVDkMXYG/2m8OA9n+7gtaGW6RpuvXa7TIPY2xhdWRlLXNvbm5ldC01OABCCHRoaW5raW5nWiQ1NTA5YWI4NS0zYzY0LTRlYjMtODM2MC00NmI2NmFmMTM1NjdyEE9N8GWYikjTNTKSAKcLWGCIAQGoAbnl2tUGsAECEgwvJU/6MyjUysiCzwEaDC5aUkljHEWEAt2oxiIwxaUET8f8nYBuNgb30veIaQ3qhtRdjVZblN46x9vmX2IO/NNZfaGskRWnzSyCK6aLKlcAJYbGj5H3hHNwauc6jQZwP/LSnzh4PnkRGVQ5+sVWKz3dAvJjser7mI87dPn0jJWxpBz8ApM0pyQM58Cppy8o1bzbY6dtJ4krw0sZFHUsJFVfLZdr7mgYAQ=="}],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":79705,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":79705},"output_tokens":5,"service_tier":"standard","inference_geo":"not_available"},"diagnostics":null,"context_management":null},"parent_tool_use_id":null,"session_id":"35180cc3-631c-49d4-bdb2-ecb5211a6993","uuid":"cd4fbe61-2161-4705-aaff-05b00ada328c","timestamp":"2026-09-25T17:43:21.785Z","user_message_uuid":"1aa25bfc-0ebd-460d-9598-28a85a6cd159","user_message_uuids":["1aa25bfc-0ebd-460d-9598-28a85a6cd159"]}} @@ -25,7 +25,7 @@ {"type":"emit_inbound","label":"result","frame":{"duration_api_ms":24514,"stop_reason":"end_turn","session_id":"35180cc3-631c-49d4-bdb2-ecb5211a6993","total_cost_usd":0.5927652,"usage":{"input_tokens":6,"cache_creation_input_tokens":81690,"cache_read_input_tokens":159916,"output_tokens":827,"output_tokens_details":{"thinking_tokens":22},"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":81690,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":48,"cache_read_input_tokens":80211,"cache_creation_input_tokens":1479,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":1479},"type":"message"}],"speed":"standard"},"modelUsage":{"claude-sonnet-5":{"inputTokens":10,"outputTokens":1025,"cacheReadInputTokens":159916,"cacheCreationInputTokens":137628,"webSearchRequests":0,"costUSD":0.5927652,"contextWindow":200000,"maxOutputTokens":64000,"thinkingTokens":22,"canonicalModel":"claude-sonnet-5","provider":"firstParty","costBasis":"list"}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","subagent_stats":{"spawned":2,"requested":{"background":0,"foreground":0,"unset":2},"started_in_background":2,"max_depth":1,"spawned_by_subagents":0,"completed":0,"failed":0,"killed":{"parent":0,"user":0,"system":0},"refused":{"depth_limit":0,"concurrency_limit":0,"budget":0},"by_type":{"general-purpose":2}},"is_error":false,"num_turns":4,"subtype":"success","api_error_status":null,"result":"Both audit subagents are running in the background (one for `greet.ts`, one for `math.ts`). I'll report a combined summary once they finish.","ttft_ms":5983,"type":"result","duration_ms":17847,"uuid":"689786ed-b9ff-4bed-aee0-9a7096a3656c","ttft_stream_ms":4455,"time_to_request_ms":121,"first_content_frame_ms":4458,"user_message_uuid":"1aa25bfc-0ebd-460d-9598-28a85a6cd159","user_message_uuids":["1aa25bfc-0ebd-460d-9598-28a85a6cd159"],"request_sent_wall_ms":1790358195923,"queued_turn_count":0,"result_index":0}} {"type":"runtime_exit","status":"success"} {"type":"expect_outbound","label":"query.open:2","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","allowDangerouslySkipPermissions":true,"settings":{"showThinkingSummaries":true},"resume":"35180cc3-631c-49d4-bdb2-ecb5211a6993"}}} -{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"send a message back to one of the agents to find a bug and report a fix"},"parent_tool_use_id":null,"uuid":"19984fe9-a947-4435-9a43-7df2a113ddb0"}}} +{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"send a message back to one of the agents to find a bug and report a fix"},"parent_tool_use_id":null,"uuid":"19984fe9-a947-4435-9a43-7df2a113ddb0","origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.281","cwd":"/tmp/claude-replay-claude_subagent_resume_after_restart","tools":[],"mcp_servers":[],"model":"claude-sonnet-5","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"86cb3554-fe61-4c2c-8309-423165ba4daa","session_id":"35180cc3-631c-49d4-bdb2-ecb5211a6993"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"status","status":"requesting","session_id":"35180cc3-631c-49d4-bdb2-ecb5211a6993","uuid":"595b7270-7275-4d3f-8e44-7977602cd815"}} {"type":"emit_inbound","label":"assistant","frame":{"type":"assistant","message":{"model":"claude-sonnet-5","id":"msg_011CfQc5scgJS84qSTpKAsSe","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"The user wants me to send a message back to one of the previously spawned subagents to find a bug and report a fix, but it's unclear which agent they mean since there are several with different files like greet.ts and math.ts. I need to figure out which agent ID to target given the ambiguity.\n\n","signature":"EpsLCqgBCBIYAipA8fcPy+lkWpV+nCRnoGvxPnHnpNh3VrIAVsswQXRQbOadks+HCDe37TeOZVBYamqlQgNbVXrUOuVx2LA1FhdlDzIPY2xhdWRlLXNvbm5ldC01OABCCHRoaW5raW5nWiQ1NTA5YWI4NS0zYzY0LTRlYjMtODM2MC00NmI2NmFmMTM1NjdyEE9N8GWYikjTNTKSAKcLWGCIAQGoAc7x2tUGsAECEgzhxhiYDy7nKhbv2zEaDAl5jNuQax9I+9cs+SIw7wNtErdq2eX/1Bq/7vPYVCN6qzqIM6K1cGKXDnzDv1mpSdxofc5gBvnVhPi2IEwcKp8JuV3m4xbF9qLqxbsU2wowk570U+/EFL4oZFemIwr2VsTmme6wm+8S4K+6MELIPX/8Z278lkGQ/PnRlICfm1zteNOXza89uUbQat0fTl03nf4jhfii0w9+wOkL4jiIxHrcx8xNk+iWHddlQHj7WXTpWg0OU7wBMya5nl4no5rZFwCrtP5uKbfqMbYR5AJPnljedhJ9bC2tH9f4fF+wx/CF6p3pH8UO/D0L6gyZK5ZqKwObVNC4yIkwsmIV5UEq6YfknSPfJNXeTx9mf97eg9bs2fswQyJUNOH3rYBOZQcONBDSgRRXKbg3Twtm1hqdbPe03zaAOGGuE8ZnQqhh2x6v+G5Fp7TNbp5rmwfJSsyYyk+wp9A4agr4HYI++HHK9b5mDGmWDHvXN6BEPrC7g6sThk36qqSTUs6B31qmUKhyb3+cFIWkc47fsnU4WltQHHyJPCVtIOsjy6I/nRHahItOo6u+duIn6/46m1g2PyZTxLDgOUhvcrLfZopybrvjVhl9j6UUlQoQXxCgCyneEQ/QjpvZqiwNzhbBKWn14UhCSuDChRh5T6LceEVM0mxtltdVCxUn+OsY9C6A+e5h7YgQoqzdLxzqZjIceQ8VejxHigpb3ZzQ56i1RxHgn3VD44HXIfKAkRIjh1D00GNA+dA8XqvZNAx6X9g8R7F7aTVTPDnxKhvOtCoLTf6jh8WW7Q6vmvXJBObqj1uXtSPmihAXd11fzQm87KBFKfqpjq+FWrRhnzNByzUHlXUDygjkZwX72aOCkM3zCYpyoWTncKKs0RJAfJJLWX43gQ1bevoaXZVpkiFCdKesawdCTFljugK3M6uE8y6UHq4ZTi5SxxXJgx9g9bDz9MXXrSXyVFV1NuhPZlFnD+0SgsxIC03xbz+FobpAFJbXrJXPtj+iqzFq8NUwhYS1qswSdzhkUBpPDuQcZAZsFhjFgDJSQTjq9Rrz8Bih+1HWECvdEFFKn5rmOMLCUwlAnHCbrzVt1s1R4vSluOuRsJ4oGsdb2JgvMpgUC4jr0DulXxrPZhND7OUK7ejZ2cEARH1qW5nAhF3owcmnqIAC3N/Y1dVeE0dnDvJbfttMw02SCrEuaAIda54fiVl9jdEyG5yzHsnkhqjzlnp2hDxWN+Ss+Xo4/ts/ACgTjSj8T0seSuXiYGfUJLoVUy9q9v86tDILaobFHc4Tc2m3Bn5J667yzYakmPjyBvUJBLzHrxWErjvLaCmrRAmRoKdMNa3LWSx9j0SaaQ7CikxNoR0FqfqPd/jsvks93WG1zag4Cb8tmnvKOLCvervrQIgY24r6D8J/5Rsa12M8pGl0WzXbt14NupL82pC7z+O6Et6N7Q5lnddctLtRv4pqx4OzKNNno7kriztab9dv6eXoiVHE473tQx/7/eVtI9amt6Z/6zvd1nE1SIkP7cJmiVaCsRRcGFyEqyHulW87ZUg3VQqVruWo32i2hzTmountkeLro511ZA+TFYTHJ/0s7XjxmHUnuwMgL/ffQLm+pWwAkQDedQnIOFluXWQ/S1/WjPcSAp94OYlUjXJXS9j+ssaPDgHXRsdw7v9rmd3BjxgB"}],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":213,"cache_read_input_tokens":85388,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":213},"output_tokens":2,"service_tier":"standard","inference_geo":"not_available"},"diagnostics":null,"context_management":null},"parent_tool_use_id":null,"session_id":"35180cc3-631c-49d4-bdb2-ecb5211a6993","uuid":"bddcf0d5-9bc2-4eac-baa9-3240c3279599","timestamp":"2026-09-25T18:09:18.402Z","user_message_uuid":"19984fe9-a947-4435-9a43-7df2a113ddb0","user_message_uuids":["19984fe9-a947-4435-9a43-7df2a113ddb0"]}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/command_output_streaming/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/command_output_streaming/claude_transcript.ndjson index 3eb36167f4e7e..b44592396f2ce 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/command_output_streaming/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/command_output_streaming/claude_transcript.ndjson @@ -1,6 +1,6 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"command_output_streaming","metadata":{"prompts":["Run this exact shell command in the foreground and wait for it to finish: `for i in 1 2 3 4; do printf '\\033[32mstream line %s\\033[0m\\n' $i; sleep 1; done; printf 'progress 50%%\\rprogress 100%%\\n'`. Then respond exactly: command output fixture complete"],"model":"claude-sonnet-4-6","nativeSessionId":"95b68ca2-f0b8-4902-839b-3586d4ba3f3d","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"recordClaudeAgentSdkReplayTranscript"}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"command_output_streaming","metadata":{"prompts":["Run this exact shell command in the foreground and wait for it to finish: `for i in 1 2 3 4; do printf '\\033[32mstream line %s\\033[0m\\n' $i; sleep 1; done; printf 'progress 50%%\\rprogress 100%%\\n'`. Then respond exactly: command output fixture complete"],"model":"claude-sonnet-4-6","nativeSessionId":"95b68ca2-f0b8-4902-839b-3586d4ba3f3d","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"recordClaudeAgentSdkReplayTranscript","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","settings":{"showThinkingSummaries":true},"allowDangerouslySkipPermissions":true,"sessionId":"95b68ca2-f0b8-4902-839b-3586d4ba3f3d"}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Run this exact shell command in the foreground and wait for it to finish: `for i in 1 2 3 4; do printf '\\033[32mstream line %s\\033[0m\\n' $i; sleep 1; done; printf 'progress 50%%\\rprogress 100%%\\n'`. Then respond exactly: command output fixture complete"},"parent_tool_use_id":null,"uuid":"99a8b580-5528-4f14-b057-e5bf7b2769d5"}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Run this exact shell command in the foreground and wait for it to finish: `for i in 1 2 3 4; do printf '\\033[32mstream line %s\\033[0m\\n' $i; sleep 1; done; printf 'progress 50%%\\rprogress 100%%\\n'`. Then respond exactly: command output fixture complete"},"parent_tool_use_id":null,"uuid":"99a8b580-5528-4f14-b057-e5bf7b2769d5","origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"command_lifecycle","frame":{"type":"command_lifecycle","command_uuid":"99a8b580-5528-4f14-b057-e5bf7b2769d5","state":"queued","uuid":"6fe0d477-fdc3-47dc-8ff1-3ccc54d469b4","session_id":"95b68ca2-f0b8-4902-839b-3586d4ba3f3d"}} {"type":"emit_inbound","label":"rate_limit_event","frame":{"type":"rate_limit_event","rate_limit_info":{"status":"allowed"},"uuid":"08a52454-78a5-452f-9bb8-e88ed4059728","session_id":"95b68ca2-f0b8-4902-839b-3586d4ba3f3d"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"commands_changed","commands":[],"uuid":"c8217962-8361-44e9-bb14-3af863bc1120","session_id":"95b68ca2-f0b8-4902-839b-3586d4ba3f3d"}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/message_steering/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/message_steering/claude_transcript.ndjson index a1cacf97d8002..67672a2f603bf 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/message_steering/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/message_steering/claude_transcript.ndjson @@ -1,7 +1,7 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"message_steering","metadata":{"prompts":["Respond with exactly: steering fixture initial response","Actually, respond with exactly: steering fixture observed"],"model":"claude-sonnet-4-6","nativeSessionId":"05f72f7d-81d5-4db9-a3cf-234191cf79f9","queryMode":"active_steering","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"recordClaudeAgentSdkReplayTranscript"}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"message_steering","metadata":{"prompts":["Respond with exactly: steering fixture initial response","Actually, respond with exactly: steering fixture observed"],"model":"claude-sonnet-4-6","nativeSessionId":"05f72f7d-81d5-4db9-a3cf-234191cf79f9","queryMode":"active_steering","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"recordClaudeAgentSdkReplayTranscript","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","allowDangerouslySkipPermissions":true,"sessionId":"05f72f7d-81d5-4db9-a3cf-234191cf79f9","settings":{"showThinkingSummaries":true}}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Respond with exactly: steering fixture initial response"},"parent_tool_use_id":null}}} -{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Actually, respond with exactly: steering fixture observed"},"parent_tool_use_id":null,"priority":"now"}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Respond with exactly: steering fixture initial response"},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} +{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Actually, respond with exactly: steering fixture observed"},"parent_tool_use_id":null,"priority":"now","origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_started","hook_id":"2961831d-241e-47c4-8099-b8779c6b3878","hook_name":"SessionStart:startup","hook_event":"SessionStart","uuid":"d45438eb-d485-490f-9668-a02c5721a6b3","session_id":"05f72f7d-81d5-4db9-a3cf-234191cf79f9"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_response","hook_id":"2961831d-241e-47c4-8099-b8779c6b3878","hook_name":"SessionStart:startup","hook_event":"SessionStart","output":"","stdout":"","stderr":"","exit_code":0,"outcome":"success","uuid":"40ef0c52-1168-4049-99af-4c3beb507994","session_id":"05f72f7d-81d5-4db9-a3cf-234191cf79f9"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.111","cwd":"/tmp/claude-replay-message_steering","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"71579637-9bc5-4182-b104-4ebb8f2bda0d","session_id":"05f72f7d-81d5-4db9-a3cf-234191cf79f9"}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/multi_turn/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/multi_turn/claude_transcript.ndjson index 5c5826ffccc24..de173fecd1be3 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/multi_turn/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/multi_turn/claude_transcript.ndjson @@ -1,13 +1,13 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"multi_turn","metadata":{"prompts":["Respond with exactly: first fixture turn complete","Respond with exactly: second fixture turn complete"],"model":"claude-sonnet-4-6","nativeSessionId":"01899f29-45f7-43c3-b963-0f9181ed013f","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"recordClaudeAgentSdkReplayTranscript"}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"multi_turn","metadata":{"prompts":["Respond with exactly: first fixture turn complete","Respond with exactly: second fixture turn complete"],"model":"claude-sonnet-4-6","nativeSessionId":"01899f29-45f7-43c3-b963-0f9181ed013f","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"recordClaudeAgentSdkReplayTranscript","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","allowDangerouslySkipPermissions":true,"sessionId":"01899f29-45f7-43c3-b963-0f9181ed013f","settings":{"showThinkingSummaries":true}}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Respond with exactly: first fixture turn complete"},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Respond with exactly: first fixture turn complete"},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_started","hook_id":"a8f3420b-6e02-4f06-8b20-139030128614","hook_name":"SessionStart:startup","hook_event":"SessionStart","uuid":"91827846-9643-43f7-802a-7622a4d59945","session_id":"01899f29-45f7-43c3-b963-0f9181ed013f"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_response","hook_id":"a8f3420b-6e02-4f06-8b20-139030128614","hook_name":"SessionStart:startup","hook_event":"SessionStart","output":"","stdout":"","stderr":"","exit_code":0,"outcome":"success","uuid":"3f1f1a2b-1ddb-4e07-8f62-d3e2020a1bf0","session_id":"01899f29-45f7-43c3-b963-0f9181ed013f"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.111","cwd":"/tmp/claude-replay-multi_turn","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"dbef42fe-0daa-40e2-8b4a-b8fbf39191bc","session_id":"01899f29-45f7-43c3-b963-0f9181ed013f"}} {"type":"emit_inbound","label":"assistant","frame":{"type":"assistant","message":{"model":"claude-sonnet-4-6","id":"msg_018QDgm81Jgo5XonK3Bm8dEc","type":"message","role":"assistant","content":[{"type":"text","text":"first fixture turn complete"}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":2337,"cache_read_input_tokens":9455,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":2337},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":null,"session_id":"01899f29-45f7-43c3-b963-0f9181ed013f","uuid":"d513887e-fb2d-47a1-adbb-e8678b42ad9a"}} {"type":"emit_inbound","label":"rate_limit_event","frame":{"type":"rate_limit_event","rate_limit_info":{"status":"allowed"},"uuid":"53a27a3d-676a-4781-9c94-abe4a8af8fdd","session_id":"01899f29-45f7-43c3-b963-0f9181ed013f"}} {"type":"emit_inbound","label":"result","frame":{"type":"result","subtype":"success","is_error":false,"api_error_status":null,"duration_ms":1877,"duration_api_ms":1400,"num_turns":1,"result":"first fixture turn complete","stop_reason":"end_turn","session_id":"01899f29-45f7-43c3-b963-0f9181ed013f","total_cost_usd":0.01171425,"usage":{"input_tokens":3,"cache_creation_input_tokens":2337,"cache_read_input_tokens":9455,"output_tokens":7,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":2337,"ephemeral_5m_input_tokens":0},"inference_geo":"","iterations":[{"input_tokens":3,"output_tokens":7,"cache_read_input_tokens":9455,"cache_creation_input_tokens":2337,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":2337},"type":"message"}],"speed":"standard"},"modelUsage":{"claude-sonnet-4-6":{"inputTokens":3,"outputTokens":7,"cacheReadInputTokens":9455,"cacheCreationInputTokens":2337,"webSearchRequests":0,"costUSD":0.01171425,"contextWindow":200000,"maxOutputTokens":32000}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","uuid":"bd7da0d2-bc9e-42db-841e-4285de52d9a2"}} -{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Respond with exactly: second fixture turn complete"},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Respond with exactly: second fixture turn complete"},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.111","cwd":"/tmp/claude-replay-multi_turn","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"09aafcb5-80e8-465c-b99f-14185f9e737d","session_id":"01899f29-45f7-43c3-b963-0f9181ed013f"}} {"type":"emit_inbound","label":"assistant","frame":{"type":"assistant","message":{"model":"claude-sonnet-4-6","id":"msg_01PifXzuLoccLsnMjRC9hXJ8","type":"message","role":"assistant","content":[{"type":"text","text":"second fixture turn complete"}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":19,"cache_read_input_tokens":11792,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":19},"output_tokens":7,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":null,"session_id":"01899f29-45f7-43c3-b963-0f9181ed013f","uuid":"8553017b-6ade-4de7-913a-0beacfd3728c"}} {"type":"emit_inbound","label":"result","frame":{"type":"result","subtype":"success","is_error":false,"api_error_status":null,"duration_ms":1415,"duration_api_ms":2278,"num_turns":1,"result":"second fixture turn complete","stop_reason":"end_turn","session_id":"01899f29-45f7-43c3-b963-0f9181ed013f","total_cost_usd":0.0154371,"usage":{"input_tokens":3,"cache_creation_input_tokens":19,"cache_read_input_tokens":11792,"output_tokens":7,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":19,"ephemeral_5m_input_tokens":0},"inference_geo":"","iterations":[{"input_tokens":3,"output_tokens":7,"cache_read_input_tokens":11792,"cache_creation_input_tokens":19,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":19},"type":"message"}],"speed":"standard"},"modelUsage":{"claude-sonnet-4-6":{"inputTokens":6,"outputTokens":14,"cacheReadInputTokens":21247,"cacheCreationInputTokens":2356,"webSearchRequests":0,"costUSD":0.0154371,"contextWindow":200000,"maxOutputTokens":32000}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","uuid":"f57bf2b0-a6e3-4701-9898-cd3be185a5d0"}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/multi_turn_restart/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/multi_turn_restart/claude_transcript.ndjson index 70de0f791d61b..495d4c547f7a3 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/multi_turn_restart/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/multi_turn_restart/claude_transcript.ndjson @@ -1,6 +1,6 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"multi_turn_restart","metadata":{"prompts":["Respond with exactly: first fixture turn complete","Respond with exactly: second fixture turn complete"],"model":"claude-sonnet-4-6","nativeSessionId":"a9b9a331-6bf3-4753-93dd-b14ff7130f3f","queryMode":"restart","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"recordClaudeAgentSdkReplayTranscript"}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"multi_turn_restart","metadata":{"prompts":["Respond with exactly: first fixture turn complete","Respond with exactly: second fixture turn complete"],"model":"claude-sonnet-4-6","nativeSessionId":"a9b9a331-6bf3-4753-93dd-b14ff7130f3f","queryMode":"restart","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"recordClaudeAgentSdkReplayTranscript","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open:1","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","allowDangerouslySkipPermissions":true,"sessionId":"a9b9a331-6bf3-4753-93dd-b14ff7130f3f","settings":{"showThinkingSummaries":true}}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Respond with exactly: first fixture turn complete"},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Respond with exactly: first fixture turn complete"},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_started","hook_id":"96353a54-8984-4e77-8060-b1dc6b030cf6","hook_name":"SessionStart:startup","hook_event":"SessionStart","uuid":"ffbfcc28-dd82-4c2a-a99f-58e5af6e393e","session_id":"a9b9a331-6bf3-4753-93dd-b14ff7130f3f"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_response","hook_id":"96353a54-8984-4e77-8060-b1dc6b030cf6","hook_name":"SessionStart:startup","hook_event":"SessionStart","output":"","stdout":"","stderr":"","exit_code":0,"outcome":"success","uuid":"bbf29fb9-d4b3-4ab2-b0e3-9d2aa833099c","session_id":"a9b9a331-6bf3-4753-93dd-b14ff7130f3f"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.111","cwd":"/tmp/claude-replay-multi_turn_restart","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"f468f37d-e0e6-43cf-bcd7-71e34045083e","session_id":"a9b9a331-6bf3-4753-93dd-b14ff7130f3f"}} @@ -9,7 +9,7 @@ {"type":"emit_inbound","label":"result","frame":{"type":"result","subtype":"success","is_error":false,"api_error_status":null,"duration_ms":2809,"duration_api_ms":2523,"num_turns":1,"result":"first fixture turn complete","stop_reason":"end_turn","session_id":"a9b9a331-6bf3-4753-93dd-b14ff7130f3f","total_cost_usd":0.0036516,"usage":{"input_tokens":3,"cache_creation_input_tokens":0,"cache_read_input_tokens":11792,"output_tokens":7,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":0,"ephemeral_5m_input_tokens":0},"inference_geo":"","iterations":[{"input_tokens":3,"output_tokens":7,"cache_read_input_tokens":11792,"cache_creation_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"type":"message"}],"speed":"standard"},"modelUsage":{"claude-sonnet-4-6":{"inputTokens":3,"outputTokens":7,"cacheReadInputTokens":11792,"cacheCreationInputTokens":0,"webSearchRequests":0,"costUSD":0.0036516,"contextWindow":200000,"maxOutputTokens":32000}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","uuid":"d88c31ae-a8fd-4ed4-a168-96cfd3b0edd7"}} {"type":"runtime_exit","status":"success"} {"type":"expect_outbound","label":"query.open:2","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","allowDangerouslySkipPermissions":true,"resume":"a9b9a331-6bf3-4753-93dd-b14ff7130f3f","settings":{"showThinkingSummaries":true}}}} -{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Respond with exactly: second fixture turn complete"},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Respond with exactly: second fixture turn complete"},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_started","hook_id":"4db1e61e-de28-49ee-b7ef-c375670d0aae","hook_name":"SessionStart:resume","hook_event":"SessionStart","uuid":"66e900fe-b02e-41a0-ac08-92260125b13d","session_id":"377e06a0-fe46-420e-bfaa-b4b9fcc8b871"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_response","hook_id":"4db1e61e-de28-49ee-b7ef-c375670d0aae","hook_name":"SessionStart:resume","hook_event":"SessionStart","output":"","stdout":"","stderr":"","exit_code":0,"outcome":"success","uuid":"03f2754d-daee-4128-b180-c1a39faa03f0","session_id":"377e06a0-fe46-420e-bfaa-b4b9fcc8b871"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.111","cwd":"/tmp/claude-replay-multi_turn_restart","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"5e1d64c9-a2ca-4ad1-ba2c-546ba18d1785","session_id":"a9b9a331-6bf3-4753-93dd-b14ff7130f3f"}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/queued_turn/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/queued_turn/claude_transcript.ndjson index b4a17e2511be9..4d9211fb4dbca 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/queued_turn/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/queued_turn/claude_transcript.ndjson @@ -1,13 +1,13 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"queued_turn","metadata":{"prompts":["Respond with exactly: first fixture turn complete","Respond with exactly: second fixture turn complete"],"model":"claude-sonnet-4-6","nativeSessionId":"df83c769-3523-4961-95ad-9739bfdf71dd","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"recordClaudeAgentSdkReplayTranscript"}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"queued_turn","metadata":{"prompts":["Respond with exactly: first fixture turn complete","Respond with exactly: second fixture turn complete"],"model":"claude-sonnet-4-6","nativeSessionId":"df83c769-3523-4961-95ad-9739bfdf71dd","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"recordClaudeAgentSdkReplayTranscript","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","allowDangerouslySkipPermissions":true,"sessionId":"df83c769-3523-4961-95ad-9739bfdf71dd","settings":{"showThinkingSummaries":true}}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Respond with exactly: first fixture turn complete"},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Respond with exactly: first fixture turn complete"},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_started","hook_id":"cbcb8e66-b64a-49c2-a192-5928cf12f605","hook_name":"SessionStart:startup","hook_event":"SessionStart","uuid":"e1ba5cbc-e83f-452d-a12e-2decc801d1df","session_id":"df83c769-3523-4961-95ad-9739bfdf71dd"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_response","hook_id":"cbcb8e66-b64a-49c2-a192-5928cf12f605","hook_name":"SessionStart:startup","hook_event":"SessionStart","output":"","stdout":"","stderr":"","exit_code":0,"outcome":"success","uuid":"9a8d10e1-b662-44f5-873a-cddcb1f95cd0","session_id":"df83c769-3523-4961-95ad-9739bfdf71dd"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.111","cwd":"/tmp/claude-replay-queued_turn","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"86533c51-7a5a-4034-b94f-12b1b6dd6472","session_id":"df83c769-3523-4961-95ad-9739bfdf71dd"}} {"type":"emit_inbound","label":"assistant","frame":{"type":"assistant","message":{"model":"claude-sonnet-4-6","id":"msg_01NQEE1Hdycdhefjehrr9zcz","type":"message","role":"assistant","content":[{"type":"text","text":"first fixture turn complete"}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":2337,"cache_read_input_tokens":9455,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":2337},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":null,"session_id":"df83c769-3523-4961-95ad-9739bfdf71dd","uuid":"284c2284-4cd0-4f23-8e0d-32ad924e9227"}} {"type":"emit_inbound","label":"rate_limit_event","frame":{"type":"rate_limit_event","rate_limit_info":{"status":"allowed"},"uuid":"ab9548dc-42c4-4c53-bfb3-765384bd3c8c","session_id":"df83c769-3523-4961-95ad-9739bfdf71dd"}} {"type":"emit_inbound","label":"result","frame":{"type":"result","subtype":"success","is_error":false,"api_error_status":null,"duration_ms":1429,"duration_api_ms":1065,"num_turns":1,"result":"first fixture turn complete","stop_reason":"end_turn","session_id":"df83c769-3523-4961-95ad-9739bfdf71dd","total_cost_usd":0.01171425,"usage":{"input_tokens":3,"cache_creation_input_tokens":2337,"cache_read_input_tokens":9455,"output_tokens":7,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":2337,"ephemeral_5m_input_tokens":0},"inference_geo":"","iterations":[{"input_tokens":3,"output_tokens":7,"cache_read_input_tokens":9455,"cache_creation_input_tokens":2337,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":2337},"type":"message"}],"speed":"standard"},"modelUsage":{"claude-sonnet-4-6":{"inputTokens":3,"outputTokens":7,"cacheReadInputTokens":9455,"cacheCreationInputTokens":2337,"webSearchRequests":0,"costUSD":0.01171425,"contextWindow":200000,"maxOutputTokens":32000}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","uuid":"bd5d5c48-b577-45f8-a0ef-d45fce2ab84d"}} -{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Respond with exactly: second fixture turn complete"},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Respond with exactly: second fixture turn complete"},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.111","cwd":"/tmp/claude-replay-queued_turn","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"9e812fd7-f51a-49f6-878e-b95360f3da63","session_id":"df83c769-3523-4961-95ad-9739bfdf71dd"}} {"type":"emit_inbound","label":"assistant","frame":{"type":"assistant","message":{"model":"claude-sonnet-4-6","id":"msg_01TLFS8vZYtEwwSUSbBztEFJ","type":"message","role":"assistant","content":[{"type":"text","text":"second fixture turn complete"}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":19,"cache_read_input_tokens":11792,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":19},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":null,"session_id":"df83c769-3523-4961-95ad-9739bfdf71dd","uuid":"39376d80-6475-4fbc-a95c-b005f83dcfee"}} {"type":"emit_inbound","label":"result","frame":{"type":"result","subtype":"success","is_error":false,"api_error_status":null,"duration_ms":1866,"duration_api_ms":2133,"num_turns":1,"result":"second fixture turn complete","stop_reason":"end_turn","session_id":"df83c769-3523-4961-95ad-9739bfdf71dd","total_cost_usd":0.0154371,"usage":{"input_tokens":3,"cache_creation_input_tokens":19,"cache_read_input_tokens":11792,"output_tokens":7,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":19,"ephemeral_5m_input_tokens":0},"inference_geo":"","iterations":[{"input_tokens":3,"output_tokens":7,"cache_read_input_tokens":11792,"cache_creation_input_tokens":19,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":19},"type":"message"}],"speed":"standard"},"modelUsage":{"claude-sonnet-4-6":{"inputTokens":6,"outputTokens":14,"cacheReadInputTokens":21247,"cacheCreationInputTokens":2356,"webSearchRequests":0,"costUSD":0.0154371,"contextWindow":200000,"maxOutputTokens":32000}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","uuid":"5e21b6c3-b1e0-4d8c-a106-d34a14e941ee"}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/simple/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/simple/claude_transcript.ndjson index 0c1d647473b0b..b6772ffc3244c 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/simple/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/simple/claude_transcript.ndjson @@ -1,6 +1,6 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"simple","metadata":{"prompts":["Respond with the following text: fixture simple ok"],"model":"claude-sonnet-4-6","nativeSessionId":"77171d01-fb4f-4dff-a961-d9dd334be93d","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"recordClaudeAgentSdkReplayTranscript"}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"simple","metadata":{"prompts":["Respond with the following text: fixture simple ok"],"model":"claude-sonnet-4-6","nativeSessionId":"77171d01-fb4f-4dff-a961-d9dd334be93d","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"recordClaudeAgentSdkReplayTranscript","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","allowDangerouslySkipPermissions":true,"sessionId":"77171d01-fb4f-4dff-a961-d9dd334be93d","settings":{"showThinkingSummaries":true}}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Respond with the following text: fixture simple ok"},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Respond with the following text: fixture simple ok"},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_started","hook_id":"6402f3ef-506b-4859-b69c-173458c244b3","hook_name":"SessionStart:startup","hook_event":"SessionStart","uuid":"5daa14d4-b571-4451-986a-a9a07d3c277e","session_id":"77171d01-fb4f-4dff-a961-d9dd334be93d"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_response","hook_id":"6402f3ef-506b-4859-b69c-173458c244b3","hook_name":"SessionStart:startup","hook_event":"SessionStart","output":"","stdout":"","stderr":"","exit_code":0,"outcome":"success","uuid":"adfe8057-6178-47bc-945d-b178f5ca578a","session_id":"77171d01-fb4f-4dff-a961-d9dd334be93d"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.111","cwd":"/tmp/claude-replay-simple","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"df4adde0-72a9-49e1-9149-195fe0f629ee","session_id":"77171d01-fb4f-4dff-a961-d9dd334be93d"}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/subagent/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/subagent/claude_transcript.ndjson index d54b2f8bb0e2a..1ac4627a0331e 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/subagent/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/subagent/claude_transcript.ndjson @@ -1,6 +1,6 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"subagent","metadata":{"prompts":["Spawn 2 subagents, one to read package.json and one to read tsconfig.json"],"model":"claude-sonnet-4-6","nativeSessionId":"edf38df1-8d2f-4781-b9e3-f9e72ba7b76d","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"recordClaudeAgentSdkReplayTranscript"}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"subagent","metadata":{"prompts":["Spawn 2 subagents, one to read package.json and one to read tsconfig.json"],"model":"claude-sonnet-4-6","nativeSessionId":"edf38df1-8d2f-4781-b9e3-f9e72ba7b76d","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"recordClaudeAgentSdkReplayTranscript","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","allowDangerouslySkipPermissions":true,"sessionId":"edf38df1-8d2f-4781-b9e3-f9e72ba7b76d","settings":{"showThinkingSummaries":true}}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Spawn 2 subagents, one to read package.json and one to read tsconfig.json"},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Spawn 2 subagents, one to read package.json and one to read tsconfig.json"},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_started","hook_id":"4fde9c84-285e-4a68-9070-3704c94168f6","hook_name":"SessionStart:startup","hook_event":"SessionStart","uuid":"caf0439c-1455-4bd5-bcbf-14be3b13db5c","session_id":"edf38df1-8d2f-4781-b9e3-f9e72ba7b76d"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_response","hook_id":"4fde9c84-285e-4a68-9070-3704c94168f6","hook_name":"SessionStart:startup","hook_event":"SessionStart","output":"","stdout":"","stderr":"","exit_code":0,"outcome":"success","uuid":"5af52be5-9839-49fb-aebe-da4068d0ba2a","session_id":"edf38df1-8d2f-4781-b9e3-f9e72ba7b76d"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.111","cwd":"/tmp/claude-replay-subagent","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"38e13364-a3ab-43cf-865f-cb790e39532b","session_id":"edf38df1-8d2f-4781-b9e3-f9e72ba7b76d"}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/thread_fork_native/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/thread_fork_native/claude_transcript.ndjson index dc9335bf5a553..ee1a77266b8e9 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/thread_fork_native/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/thread_fork_native/claude_transcript.ndjson @@ -1,6 +1,6 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"thread_fork_native","metadata":{"prompts":["Respond with the following text: source fork seed ok","Respond with the following text: fork native ok"],"model":"claude-sonnet-4-6","nativeSessionId":"8d0dafab-45d3-45eb-abef-41b9e55d5ff9","queryMode":"fork_session","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"recordClaudeAgentSdkReplayTranscript","sourceAssistantMessageUuids":["68baa075-b7d4-4689-866b-96bd51e570c3"],"forkUpToMessageId":"68baa075-b7d4-4689-866b-96bd51e570c3","forkedNativeSessionId":"7e7ad6ec-db4a-4510-85ff-59df35cf7fad"}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"thread_fork_native","metadata":{"prompts":["Respond with the following text: source fork seed ok","Respond with the following text: fork native ok"],"model":"claude-sonnet-4-6","nativeSessionId":"8d0dafab-45d3-45eb-abef-41b9e55d5ff9","queryMode":"fork_session","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"recordClaudeAgentSdkReplayTranscript","sourceAssistantMessageUuids":["68baa075-b7d4-4689-866b-96bd51e570c3"],"forkUpToMessageId":"68baa075-b7d4-4689-866b-96bd51e570c3","forkedNativeSessionId":"7e7ad6ec-db4a-4510-85ff-59df35cf7fad","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open:source","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","allowDangerouslySkipPermissions":true,"sessionId":"8d0dafab-45d3-45eb-abef-41b9e55d5ff9","settings":{"showThinkingSummaries":true}}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Respond with the following text: source fork seed ok"},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Respond with the following text: source fork seed ok"},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_started","hook_id":"72dd9de7-b5a9-46bf-9c57-9bca11344e73","hook_name":"SessionStart:startup","hook_event":"SessionStart","uuid":"4edf7621-d696-4b60-9821-187bcac04c7d","session_id":"8d0dafab-45d3-45eb-abef-41b9e55d5ff9"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_response","hook_id":"72dd9de7-b5a9-46bf-9c57-9bca11344e73","hook_name":"SessionStart:startup","hook_event":"SessionStart","output":"","stdout":"","stderr":"","exit_code":0,"outcome":"success","uuid":"6959d784-05f0-48b4-97de-d3f4a11b4b1a","session_id":"8d0dafab-45d3-45eb-abef-41b9e55d5ff9"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.111","cwd":"/tmp/claude-replay-thread_fork_native","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"fd90233b-ff4e-429c-a3b2-088d9b3bafc8","session_id":"8d0dafab-45d3-45eb-abef-41b9e55d5ff9"}} @@ -11,7 +11,7 @@ {"type":"expect_outbound","label":"session.fork","frame":{"type":"session.fork","sessionId":"8d0dafab-45d3-45eb-abef-41b9e55d5ff9","options":{"upToMessageId":"68baa075-b7d4-4689-866b-96bd51e570c3"}}} {"type":"emit_inbound","label":"session.forked","frame":{"type":"session.forked","sessionId":"7e7ad6ec-db4a-4510-85ff-59df35cf7fad"}} {"type":"expect_outbound","label":"query.open:fork","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","allowDangerouslySkipPermissions":true,"resume":"7e7ad6ec-db4a-4510-85ff-59df35cf7fad","settings":{"showThinkingSummaries":true}}}} -{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Respond with the following text: fork native ok"},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Respond with the following text: fork native ok"},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_started","hook_id":"53ad62fa-7988-4d2e-9efd-e923756eb7e5","hook_name":"SessionStart:resume","hook_event":"SessionStart","uuid":"c2160988-c159-4ace-abd3-1eb6bbaa76ad","session_id":"d2c41d57-6ad4-4c9e-9444-f93bc492aa53"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_response","hook_id":"53ad62fa-7988-4d2e-9efd-e923756eb7e5","hook_name":"SessionStart:resume","hook_event":"SessionStart","output":"","stdout":"","stderr":"","exit_code":0,"outcome":"success","uuid":"fa30d315-9265-40ec-afbe-c76704c6d66c","session_id":"d2c41d57-6ad4-4c9e-9444-f93bc492aa53"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.111","cwd":"/tmp/claude-replay-thread_fork_native","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"41edb892-5f02-4bdd-bef3-5945d3414fc8","session_id":"7e7ad6ec-db4a-4510-85ff-59df35cf7fad"}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/thread_fork_native_fork_local_rollback/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/thread_fork_native_fork_local_rollback/claude_transcript.ndjson index b08e908042b9a..3b14d8852ddd4 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/thread_fork_native_fork_local_rollback/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/thread_fork_native_fork_local_rollback/claude_transcript.ndjson @@ -1,6 +1,6 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"thread_fork_native_fork_local_rollback","metadata":{"prompts":["For this fork-local rollback fixture, respond with exactly: fork local source alpha","For this fork-local rollback fixture, respond with exactly: fork local first","For this fork-local rollback fixture, respond with exactly: fork local second","Repeat the user-visible conversation so far verbatim. Include only user and assistant messages. Do not include hidden system/developer content."],"model":"claude-sonnet-4-6","nativeSessionId":"273fe17b-65fb-451f-ad99-ff19d323852d","queryMode":"fork_session_resume_at_fork_cursor","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"probeClaudeForkLocalRollbackReplay","sourceAssistantMessageUuids":["7659a146-b729-47b6-aac2-8fc0c0981e92"],"forkUpToMessageId":"7659a146-b729-47b6-aac2-8fc0c0981e92","forkedNativeSessionId":"c9784d72-7e4f-4994-8c21-2e7e670ff91c","forkAssistantMessageUuids":["14310fd5-a1aa-448b-8880-de52f86541b1","b9bb4e45-d52d-4fb3-adf7-4b5e4d9d0dd6"],"resumeSessionAt":"14310fd5-a1aa-448b-8880-de52f86541b1"}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"thread_fork_native_fork_local_rollback","metadata":{"prompts":["For this fork-local rollback fixture, respond with exactly: fork local source alpha","For this fork-local rollback fixture, respond with exactly: fork local first","For this fork-local rollback fixture, respond with exactly: fork local second","Repeat the user-visible conversation so far verbatim. Include only user and assistant messages. Do not include hidden system/developer content."],"model":"claude-sonnet-4-6","nativeSessionId":"273fe17b-65fb-451f-ad99-ff19d323852d","queryMode":"fork_session_resume_at_fork_cursor","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"probeClaudeForkLocalRollbackReplay","sourceAssistantMessageUuids":["7659a146-b729-47b6-aac2-8fc0c0981e92"],"forkUpToMessageId":"7659a146-b729-47b6-aac2-8fc0c0981e92","forkedNativeSessionId":"c9784d72-7e4f-4994-8c21-2e7e670ff91c","forkAssistantMessageUuids":["14310fd5-a1aa-448b-8880-de52f86541b1","b9bb4e45-d52d-4fb3-adf7-4b5e4d9d0dd6"],"resumeSessionAt":"14310fd5-a1aa-448b-8880-de52f86541b1","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open:source","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","allowDangerouslySkipPermissions":true,"sessionId":"273fe17b-65fb-451f-ad99-ff19d323852d","settings":{"showThinkingSummaries":true}}}} -{"type":"expect_outbound","label":"prompt.offer:source","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"For this fork-local rollback fixture, respond with exactly: fork local source alpha"},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:source","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"For this fork-local rollback fixture, respond with exactly: fork local source alpha"},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_started","hook_id":"36e94137-12f0-4e71-828b-bd4c76467204","hook_name":"SessionStart:startup","hook_event":"SessionStart","uuid":"f8884f88-0672-4602-bb93-a35473be10f8","session_id":"273fe17b-65fb-451f-ad99-ff19d323852d"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_response","hook_id":"36e94137-12f0-4e71-828b-bd4c76467204","hook_name":"SessionStart:startup","hook_event":"SessionStart","output":"","stdout":"","stderr":"","exit_code":0,"outcome":"success","uuid":"9b44ee7b-9a43-41a6-993d-6cb5945a8210","session_id":"273fe17b-65fb-451f-ad99-ff19d323852d"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","cwd":"/private/tmp/claude-replay-thread_fork_native_fork_local_rollback","session_id":"273fe17b-65fb-451f-ad99-ff19d323852d","tools":["Task","AskUserQuestion","Bash","CronCreate","CronDelete","CronList","Edit","EnterPlanMode","EnterWorktree","ExitPlanMode","ExitWorktree","Glob","Grep","ListMcpResourcesTool","Monitor","NotebookEdit","PushNotification","Read","ReadMcpResourceTool","RemoteTrigger","ScheduleWakeup","Skill","TaskOutput","TaskStop","TodoWrite","ToolSearch","WebFetch","WebSearch","Write","mcp__claude_ai_Google_Drive__authenticate","mcp__claude_ai_Google_Drive__complete_authentication","mcp__uidotsh__uidotsh_fetch"],"mcp_servers":[{"name":"uidotsh","status":"connected"},{"name":"claude.ai Google Drive","status":"needs-auth"}],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":["update-config","debug","simplify","batch","less-permission-prompts","loop","schedule","claude-api","expo-dev-client","ui","agent-browser","native-data-fetching","expo-deployment","btca-cli","uniwind","web-design-guidelines","react-doctor","migrate-nativewind-to-uniwind","building-native-ui","frontend-design","turborepo","vercel-composition-patterns","expo-cicd-workflows","expo-tailwind-setup","coderabbit:review","coderabbit:coderabbit-review","coderabbit:code-review","agent-browser:agent-browser","frontend-design:frontend-design","coderabbit:autofix","compact","context","cost","heapdump","init","review","security-review","extra-usage","insights","team-onboarding"],"apiKeySource":"none","claude_code_version":"2.1.111","output_style":"default","agents":["coderabbit:code-reviewer","Explore","general-purpose","Plan","statusline-setup"],"skills":["update-config","debug","simplify","batch","less-permission-prompts","loop","schedule","claude-api","expo-dev-client","ui","agent-browser","native-data-fetching","expo-deployment","btca-cli","uniwind","web-design-guidelines","react-doctor","migrate-nativewind-to-uniwind","building-native-ui","frontend-design","turborepo","vercel-composition-patterns","expo-cicd-workflows","expo-tailwind-setup","coderabbit:code-review","agent-browser:agent-browser","frontend-design:frontend-design","coderabbit:autofix","coderabbit:code-review"],"plugins":[{"name":"coderabbit","path":"/home/replay-user/.claude/plugins/marketplaces/coderabbit/","source":"coderabbit@coderabbit"},{"name":"agent-browser","path":"/home/replay-user/.claude/plugins/cache/agent-browser/agent-browser/ea17db856473","source":"agent-browser@agent-browser"},{"name":"frontend-design","path":"/home/replay-user/.claude/plugins/cache/claude-plugins-official/frontend-design/unknown","source":"frontend-design@claude-plugins-official"},{"name":"coderabbit","path":"/home/replay-user/.claude/plugins/cache/claude-plugins-official/coderabbit/1.1.1","source":"coderabbit@claude-plugins-official"}],"uuid":"1e7d6f8f-2295-42cb-a413-50274ffe1bdd","memory_paths":{"auto":"/home/replay-user/.claude/projects/-private-var-folders-b3-b51-pdxj7dl0t981zpqkxxhr0000gn-T-t3-orchestrator-v2-claude-agent-sdk-record-thread-fork-native-fork-local-rollback-6isYFV/memory/"},"fast_mode_state":"off"}} @@ -11,20 +11,20 @@ {"type":"expect_outbound","label":"session.fork","frame":{"type":"session.fork","sessionId":"273fe17b-65fb-451f-ad99-ff19d323852d","options":{"upToMessageId":"7659a146-b729-47b6-aac2-8fc0c0981e92"}}} {"type":"emit_inbound","label":"session.forked","frame":{"type":"session.forked","sessionId":"c9784d72-7e4f-4994-8c21-2e7e670ff91c"}} {"type":"expect_outbound","label":"query.open:fork","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","allowDangerouslySkipPermissions":true,"resume":"c9784d72-7e4f-4994-8c21-2e7e670ff91c","settings":{"showThinkingSummaries":true}}}} -{"type":"expect_outbound","label":"prompt.offer:fork-first","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"For this fork-local rollback fixture, respond with exactly: fork local first"},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:fork-first","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"For this fork-local rollback fixture, respond with exactly: fork local first"},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_started","hook_id":"b8ac144f-11aa-4f98-96f3-9c9caa8c93ef","hook_name":"SessionStart:resume","hook_event":"SessionStart","uuid":"7e53533c-0f7a-4c67-bed4-0124e8b57438","session_id":"1eb8c977-ac69-4559-8501-92edb5a32f2f"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_response","hook_id":"b8ac144f-11aa-4f98-96f3-9c9caa8c93ef","hook_name":"SessionStart:resume","hook_event":"SessionStart","output":"","stdout":"","stderr":"","exit_code":0,"outcome":"success","uuid":"c176d46f-750b-4bab-9d7a-ab863903a141","session_id":"1eb8c977-ac69-4559-8501-92edb5a32f2f"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","cwd":"/private/tmp/claude-replay-thread_fork_native_fork_local_rollback","session_id":"c9784d72-7e4f-4994-8c21-2e7e670ff91c","tools":["Task","AskUserQuestion","Bash","CronCreate","CronDelete","CronList","Edit","EnterPlanMode","EnterWorktree","ExitPlanMode","ExitWorktree","Glob","Grep","ListMcpResourcesTool","Monitor","NotebookEdit","PushNotification","Read","ReadMcpResourceTool","RemoteTrigger","ScheduleWakeup","Skill","TaskOutput","TaskStop","TodoWrite","ToolSearch","WebFetch","WebSearch","Write","mcp__claude_ai_Google_Drive__authenticate","mcp__claude_ai_Google_Drive__complete_authentication","mcp__uidotsh__uidotsh_fetch"],"mcp_servers":[{"name":"uidotsh","status":"connected"},{"name":"claude.ai Google Drive","status":"needs-auth"}],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":["update-config","debug","simplify","batch","less-permission-prompts","loop","schedule","claude-api","expo-dev-client","ui","agent-browser","native-data-fetching","expo-deployment","btca-cli","uniwind","web-design-guidelines","react-doctor","migrate-nativewind-to-uniwind","building-native-ui","frontend-design","turborepo","vercel-composition-patterns","expo-cicd-workflows","expo-tailwind-setup","coderabbit:review","coderabbit:coderabbit-review","coderabbit:code-review","agent-browser:agent-browser","frontend-design:frontend-design","coderabbit:autofix","compact","context","cost","heapdump","init","review","security-review","extra-usage","insights","team-onboarding"],"apiKeySource":"none","claude_code_version":"2.1.111","output_style":"default","agents":["coderabbit:code-reviewer","Explore","general-purpose","Plan","statusline-setup"],"skills":["update-config","debug","simplify","batch","less-permission-prompts","loop","schedule","claude-api","expo-dev-client","ui","agent-browser","native-data-fetching","expo-deployment","btca-cli","uniwind","web-design-guidelines","react-doctor","migrate-nativewind-to-uniwind","building-native-ui","frontend-design","turborepo","vercel-composition-patterns","expo-cicd-workflows","expo-tailwind-setup","coderabbit:code-review","agent-browser:agent-browser","frontend-design:frontend-design","coderabbit:autofix","coderabbit:code-review"],"plugins":[{"name":"coderabbit","path":"/home/replay-user/.claude/plugins/cache/coderabbit/coderabbit/1.0.0","source":"coderabbit@coderabbit"},{"name":"agent-browser","path":"/home/replay-user/.claude/plugins/cache/agent-browser/agent-browser/ea17db856473","source":"agent-browser@agent-browser"},{"name":"frontend-design","path":"/home/replay-user/.claude/plugins/cache/claude-plugins-official/frontend-design/unknown","source":"frontend-design@claude-plugins-official"},{"name":"coderabbit","path":"/home/replay-user/.claude/plugins/cache/claude-plugins-official/coderabbit/1.1.1","source":"coderabbit@claude-plugins-official"}],"uuid":"741656e7-2341-497c-83bc-89e946bd631f","memory_paths":{"auto":"/home/replay-user/.claude/projects/-private-var-folders-b3-b51-pdxj7dl0t981zpqkxxhr0000gn-T-t3-orchestrator-v2-claude-agent-sdk-record-thread-fork-native-fork-local-rollback-6isYFV/memory/"},"fast_mode_state":"off"}} {"type":"emit_inbound","label":"assistant","frame":{"type":"assistant","message":{"model":"claude-sonnet-4-6","id":"msg_01Fum9PErU1oqWY16swx8VpU","type":"message","role":"assistant","content":[{"type":"text","text":"fork local first"}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":0,"cache_read_input_tokens":11826,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":null,"session_id":"c9784d72-7e4f-4994-8c21-2e7e670ff91c","uuid":"14310fd5-a1aa-448b-8880-de52f86541b1"}} {"type":"emit_inbound","label":"rate_limit_event","frame":{"type":"rate_limit_event","rate_limit_info":{"status":"allowed","resetsAt":1779846000,"rateLimitType":"five_hour","overageStatus":"rejected","overageDisabledReason":"org_level_disabled","isUsingOverage":false},"uuid":"830763b3-7ff2-4b0f-8dd9-35b141cca7a4","session_id":"c9784d72-7e4f-4994-8c21-2e7e670ff91c"}} {"type":"emit_inbound","label":"result","frame":{"type":"result","subtype":"success","is_error":false,"api_error_status":null,"duration_ms":2891,"duration_api_ms":2011,"num_turns":1,"result":"fork local first","stop_reason":"end_turn","session_id":"c9784d72-7e4f-4994-8c21-2e7e670ff91c","total_cost_usd":0.0036468,"usage":{"input_tokens":3,"cache_creation_input_tokens":0,"cache_read_input_tokens":11826,"output_tokens":6,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":0,"ephemeral_5m_input_tokens":0},"inference_geo":"","iterations":[{"input_tokens":3,"output_tokens":6,"cache_read_input_tokens":11826,"cache_creation_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"type":"message"}],"speed":"standard"},"modelUsage":{"claude-sonnet-4-6":{"inputTokens":3,"outputTokens":6,"cacheReadInputTokens":11826,"cacheCreationInputTokens":0,"webSearchRequests":0,"costUSD":0.0036468,"contextWindow":200000,"maxOutputTokens":32000}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","uuid":"bac4638c-4c4e-4e8d-9361-1c32f538297e"}} -{"type":"expect_outbound","label":"prompt.offer:fork-second","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"For this fork-local rollback fixture, respond with exactly: fork local second"},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:fork-second","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"For this fork-local rollback fixture, respond with exactly: fork local second"},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","cwd":"/private/tmp/claude-replay-thread_fork_native_fork_local_rollback","session_id":"c9784d72-7e4f-4994-8c21-2e7e670ff91c","tools":["Task","AskUserQuestion","Bash","CronCreate","CronDelete","CronList","Edit","EnterPlanMode","EnterWorktree","ExitPlanMode","ExitWorktree","Glob","Grep","ListMcpResourcesTool","Monitor","NotebookEdit","PushNotification","Read","ReadMcpResourceTool","RemoteTrigger","ScheduleWakeup","Skill","TaskOutput","TaskStop","TodoWrite","ToolSearch","WebFetch","WebSearch","Write","mcp__claude_ai_Google_Drive__authenticate","mcp__claude_ai_Google_Drive__complete_authentication","mcp__uidotsh__uidotsh_fetch"],"mcp_servers":[{"name":"uidotsh","status":"connected"},{"name":"claude.ai Google Drive","status":"needs-auth"}],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":["update-config","debug","simplify","batch","less-permission-prompts","loop","schedule","claude-api","expo-dev-client","ui","agent-browser","native-data-fetching","expo-deployment","btca-cli","uniwind","web-design-guidelines","react-doctor","migrate-nativewind-to-uniwind","building-native-ui","frontend-design","turborepo","vercel-composition-patterns","expo-cicd-workflows","expo-tailwind-setup","coderabbit:review","coderabbit:coderabbit-review","coderabbit:code-review","agent-browser:agent-browser","frontend-design:frontend-design","coderabbit:autofix","compact","context","cost","heapdump","init","review","security-review","extra-usage","insights","team-onboarding"],"apiKeySource":"none","claude_code_version":"2.1.111","output_style":"default","agents":["coderabbit:code-reviewer","Explore","general-purpose","Plan","statusline-setup"],"skills":["update-config","debug","simplify","batch","less-permission-prompts","loop","schedule","claude-api","expo-dev-client","ui","agent-browser","native-data-fetching","expo-deployment","btca-cli","uniwind","web-design-guidelines","react-doctor","migrate-nativewind-to-uniwind","building-native-ui","frontend-design","turborepo","vercel-composition-patterns","expo-cicd-workflows","expo-tailwind-setup","coderabbit:code-review","agent-browser:agent-browser","frontend-design:frontend-design","coderabbit:autofix","coderabbit:code-review"],"plugins":[{"name":"coderabbit","path":"/home/replay-user/.claude/plugins/cache/coderabbit/coderabbit/1.0.0","source":"coderabbit@coderabbit"},{"name":"agent-browser","path":"/home/replay-user/.claude/plugins/cache/agent-browser/agent-browser/ea17db856473","source":"agent-browser@agent-browser"},{"name":"frontend-design","path":"/home/replay-user/.claude/plugins/cache/claude-plugins-official/frontend-design/unknown","source":"frontend-design@claude-plugins-official"},{"name":"coderabbit","path":"/home/replay-user/.claude/plugins/cache/claude-plugins-official/coderabbit/1.1.1","source":"coderabbit@claude-plugins-official"}],"uuid":"d53475a1-0a9f-4c9e-b247-b3b9d347229f","memory_paths":{"auto":"/home/replay-user/.claude/projects/-private-var-folders-b3-b51-pdxj7dl0t981zpqkxxhr0000gn-T-t3-orchestrator-v2-claude-agent-sdk-record-thread-fork-native-fork-local-rollback-6isYFV/memory/"},"fast_mode_state":"off"}} {"type":"emit_inbound","label":"assistant","frame":{"type":"assistant","message":{"model":"claude-sonnet-4-6","id":"msg_016vLjeBrWCvu6QqJMFd8jDp","type":"message","role":"assistant","content":[{"type":"text","text":"fork local second"}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":0,"cache_read_input_tokens":11851,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":6,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":null,"session_id":"c9784d72-7e4f-4994-8c21-2e7e670ff91c","uuid":"b9bb4e45-d52d-4fb3-adf7-4b5e4d9d0dd6"}} {"type":"emit_inbound","label":"result","frame":{"type":"result","subtype":"success","is_error":false,"api_error_status":null,"duration_ms":2787,"duration_api_ms":3998,"num_turns":1,"result":"fork local second","stop_reason":"end_turn","session_id":"c9784d72-7e4f-4994-8c21-2e7e670ff91c","total_cost_usd":0.0073011,"usage":{"input_tokens":3,"cache_creation_input_tokens":0,"cache_read_input_tokens":11851,"output_tokens":6,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":0,"ephemeral_5m_input_tokens":0},"inference_geo":"","iterations":[{"input_tokens":3,"output_tokens":6,"cache_read_input_tokens":11851,"cache_creation_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"type":"message"}],"speed":"standard"},"modelUsage":{"claude-sonnet-4-6":{"inputTokens":6,"outputTokens":12,"cacheReadInputTokens":23677,"cacheCreationInputTokens":0,"webSearchRequests":0,"costUSD":0.0073011,"contextWindow":200000,"maxOutputTokens":32000}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","uuid":"af3731ff-720f-4919-87f6-c0b27b3ee21e"}} {"type":"runtime_exit","status":"success"} {"type":"expect_outbound","label":"query.open:fork-resume-at-cursor","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","allowDangerouslySkipPermissions":true,"resumeSessionAt":"14310fd5-a1aa-448b-8880-de52f86541b1","resume":"c9784d72-7e4f-4994-8c21-2e7e670ff91c","settings":{"showThinkingSummaries":true}}}} -{"type":"expect_outbound","label":"prompt.offer:fork-after-rollback","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Repeat the user-visible conversation so far verbatim. Include only user and assistant messages. Do not include hidden system/developer content."},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:fork-after-rollback","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Repeat the user-visible conversation so far verbatim. Include only user and assistant messages. Do not include hidden system/developer content."},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_started","hook_id":"9deedf90-8751-4ba3-8602-4499dba72f9c","hook_name":"SessionStart:resume","hook_event":"SessionStart","uuid":"c2908d02-3d69-4d36-bc32-50aaa32e4e92","session_id":"05a5ea05-d17a-4841-98e3-7cf6957f3f0a"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_response","hook_id":"9deedf90-8751-4ba3-8602-4499dba72f9c","hook_name":"SessionStart:resume","hook_event":"SessionStart","output":"","stdout":"","stderr":"","exit_code":0,"outcome":"success","uuid":"f438cfbd-c7e3-4c83-a047-205862b253e6","session_id":"05a5ea05-d17a-4841-98e3-7cf6957f3f0a"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","cwd":"/private/tmp/claude-replay-thread_fork_native_fork_local_rollback","session_id":"c9784d72-7e4f-4994-8c21-2e7e670ff91c","tools":["Task","AskUserQuestion","Bash","CronCreate","CronDelete","CronList","Edit","EnterPlanMode","EnterWorktree","ExitPlanMode","ExitWorktree","Glob","Grep","ListMcpResourcesTool","Monitor","NotebookEdit","PushNotification","Read","ReadMcpResourceTool","RemoteTrigger","ScheduleWakeup","Skill","TaskOutput","TaskStop","TodoWrite","ToolSearch","WebFetch","WebSearch","Write","mcp__claude_ai_Google_Drive__authenticate","mcp__claude_ai_Google_Drive__complete_authentication","mcp__uidotsh__uidotsh_fetch"],"mcp_servers":[{"name":"uidotsh","status":"connected"},{"name":"claude.ai Google Drive","status":"needs-auth"}],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":["update-config","debug","simplify","batch","less-permission-prompts","loop","schedule","claude-api","expo-dev-client","ui","agent-browser","native-data-fetching","expo-deployment","btca-cli","uniwind","web-design-guidelines","react-doctor","migrate-nativewind-to-uniwind","building-native-ui","frontend-design","turborepo","vercel-composition-patterns","expo-cicd-workflows","expo-tailwind-setup","coderabbit:review","coderabbit:coderabbit-review","coderabbit:code-review","agent-browser:agent-browser","frontend-design:frontend-design","coderabbit:autofix","compact","context","cost","heapdump","init","review","security-review","extra-usage","insights","team-onboarding"],"apiKeySource":"none","claude_code_version":"2.1.111","output_style":"default","agents":["coderabbit:code-reviewer","Explore","general-purpose","Plan","statusline-setup"],"skills":["update-config","debug","simplify","batch","less-permission-prompts","loop","schedule","claude-api","expo-dev-client","ui","agent-browser","native-data-fetching","expo-deployment","btca-cli","uniwind","web-design-guidelines","react-doctor","migrate-nativewind-to-uniwind","building-native-ui","frontend-design","turborepo","vercel-composition-patterns","expo-cicd-workflows","expo-tailwind-setup","coderabbit:code-review","agent-browser:agent-browser","frontend-design:frontend-design","coderabbit:code-review","coderabbit:autofix"],"plugins":[{"name":"coderabbit","path":"/home/replay-user/.claude/plugins/marketplaces/coderabbit/","source":"coderabbit@coderabbit"},{"name":"agent-browser","path":"/home/replay-user/.claude/plugins/cache/agent-browser/agent-browser/ea17db856473","source":"agent-browser@agent-browser"},{"name":"frontend-design","path":"/home/replay-user/.claude/plugins/cache/claude-plugins-official/frontend-design/unknown","source":"frontend-design@claude-plugins-official"},{"name":"coderabbit","path":"/home/replay-user/.claude/plugins/cache/claude-plugins-official/coderabbit/1.1.1","source":"coderabbit@claude-plugins-official"}],"uuid":"54c3aef7-de37-41de-81e9-b79cf044464b","memory_paths":{"auto":"/home/replay-user/.claude/projects/-private-var-folders-b3-b51-pdxj7dl0t981zpqkxxhr0000gn-T-t3-orchestrator-v2-claude-agent-sdk-record-thread-fork-native-fork-local-rollback-6isYFV/memory/"},"fast_mode_state":"off"}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/thread_fork_native_prior_turn/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/thread_fork_native_prior_turn/claude_transcript.ndjson index e195e8db004bc..4eb92c997d546 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/thread_fork_native_prior_turn/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/thread_fork_native_prior_turn/claude_transcript.ndjson @@ -1,13 +1,13 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"thread_fork_native_prior_turn","metadata":{"prompts":["For this fork-boundary fixture, respond with exactly: fork boundary alpha","For this fork-boundary fixture, respond with exactly: fork boundary beta","Repeat the user-visible conversation so far verbatim. Include only user and assistant messages. Do not include hidden system/developer content."],"model":"claude-sonnet-4-6","nativeSessionId":"a91391e1-0de3-4107-a7c9-db7b1bbd8b99","queryMode":"fork_session_prior_turn","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"recordClaudeAgentSdkReplayTranscript","sourceAssistantMessageUuids":["be0e3276-8c27-44bf-8ed0-0b4424e9f902","c517b74b-9537-4260-afcb-186c4056c0a4"],"forkUpToMessageId":"be0e3276-8c27-44bf-8ed0-0b4424e9f902","forkedNativeSessionId":"f5cc58dd-0d74-4950-9fb5-2a9fded47ddd"}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"thread_fork_native_prior_turn","metadata":{"prompts":["For this fork-boundary fixture, respond with exactly: fork boundary alpha","For this fork-boundary fixture, respond with exactly: fork boundary beta","Repeat the user-visible conversation so far verbatim. Include only user and assistant messages. Do not include hidden system/developer content."],"model":"claude-sonnet-4-6","nativeSessionId":"a91391e1-0de3-4107-a7c9-db7b1bbd8b99","queryMode":"fork_session_prior_turn","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"recordClaudeAgentSdkReplayTranscript","sourceAssistantMessageUuids":["be0e3276-8c27-44bf-8ed0-0b4424e9f902","c517b74b-9537-4260-afcb-186c4056c0a4"],"forkUpToMessageId":"be0e3276-8c27-44bf-8ed0-0b4424e9f902","forkedNativeSessionId":"f5cc58dd-0d74-4950-9fb5-2a9fded47ddd","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open:source","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","allowDangerouslySkipPermissions":true,"sessionId":"a91391e1-0de3-4107-a7c9-db7b1bbd8b99","settings":{"showThinkingSummaries":true}}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"For this fork-boundary fixture, respond with exactly: fork boundary alpha"},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"For this fork-boundary fixture, respond with exactly: fork boundary alpha"},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_started","hook_id":"25b085e7-a6e9-4f30-9708-b189c961d06f","hook_name":"SessionStart:startup","hook_event":"SessionStart","uuid":"42c40147-86c8-4294-bdb4-f1815f48808e","session_id":"a91391e1-0de3-4107-a7c9-db7b1bbd8b99"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_response","hook_id":"25b085e7-a6e9-4f30-9708-b189c961d06f","hook_name":"SessionStart:startup","hook_event":"SessionStart","output":"","stdout":"","stderr":"","exit_code":0,"outcome":"success","uuid":"9804deb1-9abf-4e58-9d04-6e163dc7b0af","session_id":"a91391e1-0de3-4107-a7c9-db7b1bbd8b99"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.111","cwd":"/tmp/claude-replay-thread_fork_native_prior_turn","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"b9412e24-eefc-4838-9ede-bb6e00951d15","session_id":"a91391e1-0de3-4107-a7c9-db7b1bbd8b99"}} {"type":"emit_inbound","label":"assistant","frame":{"type":"assistant","message":{"model":"claude-sonnet-4-6","id":"msg_014hdmSJdwbpJ5NkFgqbhfEe","type":"message","role":"assistant","content":[{"type":"text","text":"fork boundary alpha"}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":2342,"cache_read_input_tokens":9455,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":2342},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":null,"session_id":"a91391e1-0de3-4107-a7c9-db7b1bbd8b99","uuid":"be0e3276-8c27-44bf-8ed0-0b4424e9f902"}} {"type":"emit_inbound","label":"rate_limit_event","frame":{"type":"rate_limit_event","rate_limit_info":{"status":"allowed"},"uuid":"0c649726-b7a2-4e89-a62a-a9ae534905c7","session_id":"a91391e1-0de3-4107-a7c9-db7b1bbd8b99"}} {"type":"emit_inbound","label":"result","frame":{"type":"result","subtype":"success","is_error":false,"api_error_status":null,"duration_ms":1174,"duration_api_ms":897,"num_turns":1,"result":"fork boundary alpha","stop_reason":"end_turn","session_id":"a91391e1-0de3-4107-a7c9-db7b1bbd8b99","total_cost_usd":0.011718000000000001,"usage":{"input_tokens":3,"cache_creation_input_tokens":2342,"cache_read_input_tokens":9455,"output_tokens":6,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":2342,"ephemeral_5m_input_tokens":0},"inference_geo":"","iterations":[{"input_tokens":3,"output_tokens":6,"cache_read_input_tokens":9455,"cache_creation_input_tokens":2342,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":2342},"type":"message"}],"speed":"standard"},"modelUsage":{"claude-sonnet-4-6":{"inputTokens":3,"outputTokens":6,"cacheReadInputTokens":9455,"cacheCreationInputTokens":2342,"webSearchRequests":0,"costUSD":0.011718000000000001,"contextWindow":200000,"maxOutputTokens":32000}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","uuid":"d384185c-9b38-44a4-8917-53d7a8765a5a"}} -{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"For this fork-boundary fixture, respond with exactly: fork boundary beta"},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"For this fork-boundary fixture, respond with exactly: fork boundary beta"},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.111","cwd":"/tmp/claude-replay-thread_fork_native_prior_turn","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"5fd1f879-e742-4911-95e3-3dfb0141dc52","session_id":"a91391e1-0de3-4107-a7c9-db7b1bbd8b99"}} {"type":"emit_inbound","label":"assistant","frame":{"type":"assistant","message":{"model":"claude-sonnet-4-6","id":"msg_0181K4CdzyVanM6Px26CQP7L","type":"message","role":"assistant","content":[{"type":"text","text":"fork boundary beta"}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":23,"cache_read_input_tokens":11797,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":23},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":null,"session_id":"a91391e1-0de3-4107-a7c9-db7b1bbd8b99","uuid":"c517b74b-9537-4260-afcb-186c4056c0a4"}} {"type":"emit_inbound","label":"result","frame":{"type":"result","subtype":"success","is_error":false,"api_error_status":null,"duration_ms":2545,"duration_api_ms":3001,"num_turns":1,"result":"fork boundary beta","stop_reason":"end_turn","session_id":"a91391e1-0de3-4107-a7c9-db7b1bbd8b99","total_cost_usd":0.01544235,"usage":{"input_tokens":3,"cache_creation_input_tokens":23,"cache_read_input_tokens":11797,"output_tokens":6,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":23,"ephemeral_5m_input_tokens":0},"inference_geo":"","iterations":[{"input_tokens":3,"output_tokens":6,"cache_read_input_tokens":11797,"cache_creation_input_tokens":23,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":23},"type":"message"}],"speed":"standard"},"modelUsage":{"claude-sonnet-4-6":{"inputTokens":6,"outputTokens":12,"cacheReadInputTokens":21252,"cacheCreationInputTokens":2365,"webSearchRequests":0,"costUSD":0.01544235,"contextWindow":200000,"maxOutputTokens":32000}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","uuid":"e4f26af4-3a60-45f3-8d5c-c0f8b968c400"}} @@ -15,7 +15,7 @@ {"type":"expect_outbound","label":"session.fork","frame":{"type":"session.fork","sessionId":"a91391e1-0de3-4107-a7c9-db7b1bbd8b99","options":{"upToMessageId":"be0e3276-8c27-44bf-8ed0-0b4424e9f902"}}} {"type":"emit_inbound","label":"session.forked","frame":{"type":"session.forked","sessionId":"f5cc58dd-0d74-4950-9fb5-2a9fded47ddd"}} {"type":"expect_outbound","label":"query.open:fork","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","allowDangerouslySkipPermissions":true,"resume":"f5cc58dd-0d74-4950-9fb5-2a9fded47ddd","settings":{"showThinkingSummaries":true}}}} -{"type":"expect_outbound","label":"prompt.offer:3","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Repeat the user-visible conversation so far verbatim. Include only user and assistant messages. Do not include hidden system/developer content."},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:3","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Repeat the user-visible conversation so far verbatim. Include only user and assistant messages. Do not include hidden system/developer content."},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_started","hook_id":"6ce9327c-4534-484c-96e5-b47fa1a3143f","hook_name":"SessionStart:resume","hook_event":"SessionStart","uuid":"d4280b57-8334-4021-971d-93bba0e38b4c","session_id":"1dc8dab2-9e1b-4475-bd46-f40e2ebca07d"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_response","hook_id":"6ce9327c-4534-484c-96e5-b47fa1a3143f","hook_name":"SessionStart:resume","hook_event":"SessionStart","output":"","stdout":"","stderr":"","exit_code":0,"outcome":"success","uuid":"ac1dee1e-63c5-4db8-81b7-e1f68ecadf01","session_id":"1dc8dab2-9e1b-4475-bd46-f40e2ebca07d"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.111","cwd":"/tmp/claude-replay-thread_fork_native_prior_turn","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"65e2ff1d-ded8-42d2-a491-70fed78b2368","session_id":"f5cc58dd-0d74-4950-9fb5-2a9fded47ddd"}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/thread_merge_back_siblings/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/thread_merge_back_siblings/claude_transcript.ndjson index 00db6482c3070..9c449d51312c1 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/thread_merge_back_siblings/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/thread_merge_back_siblings/claude_transcript.ndjson @@ -1,6 +1,6 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"thread_merge_back_siblings","metadata":{"prompts":["Remember the opaque marker merge-sibling-source-3C7K for later in this conversation. Respond with exactly: merge sibling source stored","Remember the fork-local marker merge-sibling-first-6V2J. Respond with exactly: first merge sibling stored","Remember the fork-local marker merge-sibling-second-9X5B. Respond with exactly: second merge sibling stored","Context handoff (merge_back / fork_delta_summary):\nMerge-back context from first forked conversation.\n\nFork delta:\n- User introduced opaque marker merge-sibling-first-6V2J.\n- Assistant confirmed: first merge sibling stored\n\nUser message:\nRetain the first transferred marker for later. Respond with exactly: first merge delta stored","Context handoff (merge_back / fork_delta_summary):\nMerge-back context from second forked conversation.\n\nFork delta:\n- User introduced opaque marker merge-sibling-second-9X5B.\n- Assistant confirmed: second merge sibling stored\n\nUser message:\nRetain the second transferred marker for later. Respond with exactly: second merge delta stored","Return the source marker followed by both transferred fork markers in merge order, separated by single | characters. Respond with only the markers and separators."],"model":"claude-sonnet-4-6","nativeSessionId":"093127f0-d3a7-42f8-938e-b1162927a0ea","queryMode":"fork_session_merge_back_siblings","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"recordClaudeAgentSdkReplayTranscript","sourceAssistantMessageUuids":["1fc21da3-d746-4ed9-9a01-47a5bced6ad7"],"forkUpToMessageId":"1fc21da3-d746-4ed9-9a01-47a5bced6ad7","forkedNativeSessionId":"aeec447f-87e5-4874-8fe7-7f937f7c3311","forkedNativeSessionIds":["aeec447f-87e5-4874-8fe7-7f937f7c3311","f85cf945-d406-4573-b2ae-0e799d9a9365"],"sourceContinuationPromptCount":3}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"thread_merge_back_siblings","metadata":{"prompts":["Remember the opaque marker merge-sibling-source-3C7K for later in this conversation. Respond with exactly: merge sibling source stored","Remember the fork-local marker merge-sibling-first-6V2J. Respond with exactly: first merge sibling stored","Remember the fork-local marker merge-sibling-second-9X5B. Respond with exactly: second merge sibling stored","Context handoff (merge_back / fork_delta_summary):\nMerge-back context from first forked conversation.\n\nFork delta:\n- User introduced opaque marker merge-sibling-first-6V2J.\n- Assistant confirmed: first merge sibling stored\n\nUser message:\nRetain the first transferred marker for later. Respond with exactly: first merge delta stored","Context handoff (merge_back / fork_delta_summary):\nMerge-back context from second forked conversation.\n\nFork delta:\n- User introduced opaque marker merge-sibling-second-9X5B.\n- Assistant confirmed: second merge sibling stored\n\nUser message:\nRetain the second transferred marker for later. Respond with exactly: second merge delta stored","Return the source marker followed by both transferred fork markers in merge order, separated by single | characters. Respond with only the markers and separators."],"model":"claude-sonnet-4-6","nativeSessionId":"093127f0-d3a7-42f8-938e-b1162927a0ea","queryMode":"fork_session_merge_back_siblings","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"recordClaudeAgentSdkReplayTranscript","sourceAssistantMessageUuids":["1fc21da3-d746-4ed9-9a01-47a5bced6ad7"],"forkUpToMessageId":"1fc21da3-d746-4ed9-9a01-47a5bced6ad7","forkedNativeSessionId":"aeec447f-87e5-4874-8fe7-7f937f7c3311","forkedNativeSessionIds":["aeec447f-87e5-4874-8fe7-7f937f7c3311","f85cf945-d406-4573-b2ae-0e799d9a9365"],"sourceContinuationPromptCount":3,"handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open:source","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","allowDangerouslySkipPermissions":true,"sessionId":"093127f0-d3a7-42f8-938e-b1162927a0ea","settings":{"showThinkingSummaries":true}}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Remember the opaque marker merge-sibling-source-3C7K for later in this conversation. Respond with exactly: merge sibling source stored"},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Remember the opaque marker merge-sibling-source-3C7K for later in this conversation. Respond with exactly: merge sibling source stored"},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_started","hook_id":"287092a3-3285-4f46-aec5-46b1564d2c0f","hook_name":"SessionStart:startup","hook_event":"SessionStart","uuid":"6e964ad7-4a39-40da-a119-9d2d1f2d3a4d","session_id":"093127f0-d3a7-42f8-938e-b1162927a0ea"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_response","hook_id":"287092a3-3285-4f46-aec5-46b1564d2c0f","hook_name":"SessionStart:startup","hook_event":"SessionStart","output":"","stdout":"","stderr":"","exit_code":0,"outcome":"success","uuid":"d721febd-160d-4f12-a7c0-ed4d7d50e627","session_id":"093127f0-d3a7-42f8-938e-b1162927a0ea"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.159","cwd":"/tmp/claude-replay-thread_merge_back_siblings","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"6356a232-e499-4aab-9b93-ebcaf58a44ae","session_id":"093127f0-d3a7-42f8-938e-b1162927a0ea"}} @@ -11,7 +11,7 @@ {"type":"expect_outbound","label":"session.fork:1","frame":{"type":"session.fork","sessionId":"093127f0-d3a7-42f8-938e-b1162927a0ea","options":{"upToMessageId":"1fc21da3-d746-4ed9-9a01-47a5bced6ad7"}}} {"type":"emit_inbound","label":"session.forked:1","frame":{"type":"session.forked","sessionId":"aeec447f-87e5-4874-8fe7-7f937f7c3311"}} {"type":"expect_outbound","label":"query.open:fork:1","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","allowDangerouslySkipPermissions":true,"resume":"aeec447f-87e5-4874-8fe7-7f937f7c3311","settings":{"showThinkingSummaries":true}}}} -{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Remember the fork-local marker merge-sibling-first-6V2J. Respond with exactly: first merge sibling stored"},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Remember the fork-local marker merge-sibling-first-6V2J. Respond with exactly: first merge sibling stored"},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_started","hook_id":"a4497d0c-e144-496b-a3c6-8353bd5a478f","hook_name":"SessionStart:resume","hook_event":"SessionStart","uuid":"e3634541-eac3-4e8a-8f66-f4ce9aa1cf3e","session_id":"a0138f8c-497c-4d60-919d-97615e7f41f3"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_response","hook_id":"a4497d0c-e144-496b-a3c6-8353bd5a478f","hook_name":"SessionStart:resume","hook_event":"SessionStart","output":"","stdout":"","stderr":"","exit_code":0,"outcome":"success","uuid":"c2cc2495-045f-4d09-8dfb-039360e1f075","session_id":"a0138f8c-497c-4d60-919d-97615e7f41f3"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.159","cwd":"/tmp/claude-replay-thread_merge_back_siblings","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"383d91ea-4429-40e2-8138-c88e6898a6ac","session_id":"aeec447f-87e5-4874-8fe7-7f937f7c3311"}} @@ -22,7 +22,7 @@ {"type":"expect_outbound","label":"session.fork:2","frame":{"type":"session.fork","sessionId":"093127f0-d3a7-42f8-938e-b1162927a0ea","options":{"upToMessageId":"1fc21da3-d746-4ed9-9a01-47a5bced6ad7"}}} {"type":"emit_inbound","label":"session.forked:2","frame":{"type":"session.forked","sessionId":"f85cf945-d406-4573-b2ae-0e799d9a9365"}} {"type":"expect_outbound","label":"query.open:fork:2","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","allowDangerouslySkipPermissions":true,"resume":"f85cf945-d406-4573-b2ae-0e799d9a9365","settings":{"showThinkingSummaries":true}}}} -{"type":"expect_outbound","label":"prompt.offer:3","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Remember the fork-local marker merge-sibling-second-9X5B. Respond with exactly: second merge sibling stored"},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:3","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Remember the fork-local marker merge-sibling-second-9X5B. Respond with exactly: second merge sibling stored"},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_started","hook_id":"67ef07f2-14fe-426e-9f98-0045dfc87584","hook_name":"SessionStart:resume","hook_event":"SessionStart","uuid":"53ba32d0-f84e-4d95-a546-c59a6cf79204","session_id":"0c31bc0d-e94d-40a1-8438-7a046085e63c"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_response","hook_id":"67ef07f2-14fe-426e-9f98-0045dfc87584","hook_name":"SessionStart:resume","hook_event":"SessionStart","output":"","stdout":"","stderr":"","exit_code":0,"outcome":"success","uuid":"a4415555-c7a7-4438-90d3-3ede9f25c09e","session_id":"0c31bc0d-e94d-40a1-8438-7a046085e63c"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.159","cwd":"/tmp/claude-replay-thread_merge_back_siblings","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"3915b18b-6762-41cf-a1e4-efe7c59b02fb","session_id":"f85cf945-d406-4573-b2ae-0e799d9a9365"}} @@ -31,18 +31,18 @@ {"type":"emit_inbound","label":"result","frame":{"type":"result","subtype":"success","is_error":false,"api_error_status":null,"duration_ms":3142,"duration_api_ms":2643,"ttft_ms":2742,"num_turns":1,"result":"second merge sibling stored","stop_reason":"end_turn","session_id":"f85cf945-d406-4573-b2ae-0e799d9a9365","total_cost_usd":0.005865,"usage":{"input_tokens":3,"cache_creation_input_tokens":0,"cache_read_input_tokens":19120,"output_tokens":8,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":0,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":3,"output_tokens":8,"cache_read_input_tokens":19120,"cache_creation_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"type":"message"}],"speed":"standard"},"modelUsage":{"claude-sonnet-4-6":{"inputTokens":3,"outputTokens":8,"cacheReadInputTokens":19120,"cacheCreationInputTokens":0,"webSearchRequests":0,"costUSD":0.005865,"contextWindow":200000,"maxOutputTokens":32000}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","uuid":"416477cb-5817-4ce6-91f6-9af0512546c1"}} {"type":"runtime_exit","status":"success"} {"type":"expect_outbound","label":"query.open:source-continuation","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","allowDangerouslySkipPermissions":true,"resume":"093127f0-d3a7-42f8-938e-b1162927a0ea","settings":{"showThinkingSummaries":true}}}} -{"type":"expect_outbound","label":"prompt.offer:4","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Context handoff (merge_back / fork_delta_summary):\nMerge-back context from first forked conversation.\n\nFork delta:\n- User introduced opaque marker merge-sibling-first-6V2J.\n- Assistant confirmed: first merge sibling stored\n\nUser message:\nRetain the first transferred marker for later. Respond with exactly: first merge delta stored"},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:4","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Context handoff (merge_back / fork_delta_summary):\nMerge-back context from first forked conversation.\n\nFork delta:\n- User introduced opaque marker merge-sibling-first-6V2J.\n- Assistant confirmed: first merge sibling stored\n\nUser message:\nRetain the first transferred marker for later. Respond with exactly: first merge delta stored"},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_started","hook_id":"34c28999-6908-4d67-b82b-57b867c753c4","hook_name":"SessionStart:resume","hook_event":"SessionStart","uuid":"a54c5bb9-b6ee-4fc6-9e88-a7e46e280f66","session_id":"60a34659-0e64-4a1a-bfe5-c509b267fd8c"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_response","hook_id":"34c28999-6908-4d67-b82b-57b867c753c4","hook_name":"SessionStart:resume","hook_event":"SessionStart","output":"","stdout":"","stderr":"","exit_code":0,"outcome":"success","uuid":"2884b7c6-317a-4b6b-bf65-8309cb8b6311","session_id":"60a34659-0e64-4a1a-bfe5-c509b267fd8c"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.159","cwd":"/tmp/claude-replay-thread_merge_back_siblings","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"1af63cf2-01bf-4777-8c9a-5af132449a84","session_id":"093127f0-d3a7-42f8-938e-b1162927a0ea"}} {"type":"emit_inbound","label":"assistant","frame":{"type":"assistant","message":{"model":"claude-sonnet-4-6","id":"msg_019cPzFiAZRSLJVq7oAmq9iS","type":"message","role":"assistant","content":[{"type":"text","text":"first merge delta stored"}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":0,"cache_read_input_tokens":19174,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"},"diagnostics":null,"context_management":null},"parent_tool_use_id":null,"session_id":"093127f0-d3a7-42f8-938e-b1162927a0ea","uuid":"eefb144e-de0a-4bd0-9b5b-1d0275f8279a","request_id":"req_011CbrhdGmcr3UsGQaYg3J2P"}} {"type":"emit_inbound","label":"rate_limit_event","frame":{"type":"rate_limit_event","rate_limit_info":{"status":"allowed"},"uuid":"e02f1855-f7bf-4f32-8881-67521b3c3f50","session_id":"093127f0-d3a7-42f8-938e-b1162927a0ea"}} {"type":"emit_inbound","label":"result","frame":{"type":"result","subtype":"success","is_error":false,"api_error_status":null,"duration_ms":2290,"duration_api_ms":1716,"ttft_ms":1887,"num_turns":1,"result":"first merge delta stored","stop_reason":"end_turn","session_id":"093127f0-d3a7-42f8-938e-b1162927a0ea","total_cost_usd":0.0058662,"usage":{"input_tokens":3,"cache_creation_input_tokens":0,"cache_read_input_tokens":19174,"output_tokens":7,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":0,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":3,"output_tokens":7,"cache_read_input_tokens":19174,"cache_creation_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"type":"message"}],"speed":"standard"},"modelUsage":{"claude-sonnet-4-6":{"inputTokens":3,"outputTokens":7,"cacheReadInputTokens":19174,"cacheCreationInputTokens":0,"webSearchRequests":0,"costUSD":0.0058662,"contextWindow":200000,"maxOutputTokens":32000}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","uuid":"60db1964-08e2-4150-9a53-d801b42532e3"}} -{"type":"expect_outbound","label":"prompt.offer:5","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Context handoff (merge_back / fork_delta_summary):\nMerge-back context from second forked conversation.\n\nFork delta:\n- User introduced opaque marker merge-sibling-second-9X5B.\n- Assistant confirmed: second merge sibling stored\n\nUser message:\nRetain the second transferred marker for later. Respond with exactly: second merge delta stored"},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:5","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Context handoff (merge_back / fork_delta_summary):\nMerge-back context from second forked conversation.\n\nFork delta:\n- User introduced opaque marker merge-sibling-second-9X5B.\n- Assistant confirmed: second merge sibling stored\n\nUser message:\nRetain the second transferred marker for later. Respond with exactly: second merge delta stored"},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.159","cwd":"/tmp/claude-replay-thread_merge_back_siblings","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"a75759c3-f74c-4a6b-96fd-37d9676c8aa0","session_id":"093127f0-d3a7-42f8-938e-b1162927a0ea"}} {"type":"emit_inbound","label":"assistant","frame":{"type":"assistant","message":{"model":"claude-sonnet-4-6","id":"msg_01V73UC9GPx9CYzNQZ98G7Cj","type":"message","role":"assistant","content":[{"type":"text","text":"second merge delta stored"}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":0,"cache_read_input_tokens":19266,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":7,"service_tier":"standard","inference_geo":"not_available"},"diagnostics":null,"context_management":null},"parent_tool_use_id":null,"session_id":"093127f0-d3a7-42f8-938e-b1162927a0ea","uuid":"0ca21389-bb8b-4e36-9945-03197086ff4a","request_id":"req_011CbrhdTjvQiYZFwuo6LRFF"}} {"type":"emit_inbound","label":"result","frame":{"type":"result","subtype":"success","is_error":false,"api_error_status":null,"duration_ms":2674,"duration_api_ms":3656,"ttft_ms":2315,"num_turns":1,"result":"second merge delta stored","stop_reason":"end_turn","session_id":"093127f0-d3a7-42f8-938e-b1162927a0ea","total_cost_usd":0.01176,"usage":{"input_tokens":3,"cache_creation_input_tokens":0,"cache_read_input_tokens":19266,"output_tokens":7,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":0,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":3,"output_tokens":7,"cache_read_input_tokens":19266,"cache_creation_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"type":"message"}],"speed":"standard"},"modelUsage":{"claude-sonnet-4-6":{"inputTokens":6,"outputTokens":14,"cacheReadInputTokens":38440,"cacheCreationInputTokens":0,"webSearchRequests":0,"costUSD":0.01176,"contextWindow":200000,"maxOutputTokens":32000}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","uuid":"2371916a-f2e1-448d-8e02-021b3f285f26"}} -{"type":"expect_outbound","label":"prompt.offer:6","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Return the source marker followed by both transferred fork markers in merge order, separated by single | characters. Respond with only the markers and separators."},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:6","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Return the source marker followed by both transferred fork markers in merge order, separated by single | characters. Respond with only the markers and separators."},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.159","cwd":"/tmp/claude-replay-thread_merge_back_siblings","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"0424e87c-1117-425e-b1bd-b8818bd515ff","session_id":"093127f0-d3a7-42f8-938e-b1162927a0ea"}} {"type":"emit_inbound","label":"assistant","frame":{"type":"assistant","message":{"model":"claude-sonnet-4-6","id":"msg_01Th7ELGf9SmiFAU5SdHWj6M","type":"message","role":"assistant","content":[{"type":"text","text":"merge-sibling-source-3C7K|merge-sibling-first-6V2J|merge-sibling-second-9X5B"}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":0,"cache_read_input_tokens":19306,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"},"diagnostics":null,"context_management":null},"parent_tool_use_id":null,"session_id":"093127f0-d3a7-42f8-938e-b1162927a0ea","uuid":"c944fb89-eaf9-4d43-a866-61c938cd5b16","request_id":"req_011Cbrhde6GjewDduCrJMfAK"}} {"type":"emit_inbound","label":"result","frame":{"type":"result","subtype":"success","is_error":false,"api_error_status":null,"duration_ms":2913,"duration_api_ms":6052,"ttft_ms":2605,"num_turns":1,"result":"merge-sibling-source-3C7K|merge-sibling-first-6V2J|merge-sibling-second-9X5B","stop_reason":"end_turn","session_id":"093127f0-d3a7-42f8-938e-b1162927a0ea","total_cost_usd":0.0181308,"usage":{"input_tokens":3,"cache_creation_input_tokens":0,"cache_read_input_tokens":19306,"output_tokens":38,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":0,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":3,"output_tokens":38,"cache_read_input_tokens":19306,"cache_creation_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"type":"message"}],"speed":"standard"},"modelUsage":{"claude-sonnet-4-6":{"inputTokens":9,"outputTokens":52,"cacheReadInputTokens":57746,"cacheCreationInputTokens":0,"webSearchRequests":0,"costUSD":0.0181308,"contextWindow":200000,"maxOutputTokens":32000}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","uuid":"ed8d4207-bb59-4363-af94-dd399e7280b5"}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/thread_rollback/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/thread_rollback/claude_transcript.ndjson index fae862d128069..c272f3dd77e28 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/thread_rollback/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/thread_rollback/claude_transcript.ndjson @@ -1,19 +1,19 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"thread_rollback","metadata":{"prompts":["Respond with exactly: rollback fixture first turn complete","Respond with exactly: rollback fixture second turn complete","Repeat the conversation verbatim."],"model":"claude-sonnet-4-6","nativeSessionId":"f9415703-bf61-49e3-8155-1d3fed83f935","queryMode":"resume_at_cursor","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"recordClaudeAgentSdkReplayTranscript","resumeSessionAt":"3831efb6-619c-4c16-a38a-bf788040ac42","sourceAssistantMessageUuids":["3831efb6-619c-4c16-a38a-bf788040ac42","d03f5cd6-5e8b-4cf5-998f-7d96a923ecf8"]}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"thread_rollback","metadata":{"prompts":["Respond with exactly: rollback fixture first turn complete","Respond with exactly: rollback fixture second turn complete","Repeat the conversation verbatim."],"model":"claude-sonnet-4-6","nativeSessionId":"f9415703-bf61-49e3-8155-1d3fed83f935","queryMode":"resume_at_cursor","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"recordClaudeAgentSdkReplayTranscript","resumeSessionAt":"3831efb6-619c-4c16-a38a-bf788040ac42","sourceAssistantMessageUuids":["3831efb6-619c-4c16-a38a-bf788040ac42","d03f5cd6-5e8b-4cf5-998f-7d96a923ecf8"],"handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open:source","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","allowDangerouslySkipPermissions":true,"sessionId":"f9415703-bf61-49e3-8155-1d3fed83f935","settings":{"showThinkingSummaries":true}}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Respond with exactly: rollback fixture first turn complete"},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Respond with exactly: rollback fixture first turn complete"},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_started","hook_id":"10af24d0-396e-4d26-a07b-d6c66704b322","hook_name":"SessionStart:startup","hook_event":"SessionStart","uuid":"45ae7f96-b6f0-49fa-933d-ea449ac377ea","session_id":"f9415703-bf61-49e3-8155-1d3fed83f935"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_response","hook_id":"10af24d0-396e-4d26-a07b-d6c66704b322","hook_name":"SessionStart:startup","hook_event":"SessionStart","output":"","stdout":"","stderr":"","exit_code":0,"outcome":"success","uuid":"b3e745a0-d47d-4bb8-b67f-5faf244eb50d","session_id":"f9415703-bf61-49e3-8155-1d3fed83f935"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.111","cwd":"/tmp/claude-replay-thread_rollback","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"218871ce-bb95-4526-ba59-0dcc71e47835","session_id":"f9415703-bf61-49e3-8155-1d3fed83f935"}} {"type":"emit_inbound","label":"assistant","frame":{"type":"assistant","message":{"model":"claude-sonnet-4-6","id":"msg_01NUv7RH7XTuJnHd6WyVG1Vo","type":"message","role":"assistant","content":[{"type":"text","text":"rollback fixture first turn complete"}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":11794,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":11794},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":null,"session_id":"f9415703-bf61-49e3-8155-1d3fed83f935","uuid":"3831efb6-619c-4c16-a38a-bf788040ac42"}} {"type":"emit_inbound","label":"rate_limit_event","frame":{"type":"rate_limit_event","rate_limit_info":{"status":"allowed"},"uuid":"db72cb9f-000f-454a-8b05-cc231a6434ed","session_id":"f9415703-bf61-49e3-8155-1d3fed83f935"}} {"type":"emit_inbound","label":"result","frame":{"type":"result","subtype":"success","is_error":false,"api_error_status":null,"duration_ms":1813,"duration_api_ms":1317,"num_turns":1,"result":"rollback fixture first turn complete","stop_reason":"end_turn","session_id":"f9415703-bf61-49e3-8155-1d3fed83f935","total_cost_usd":0.0443715,"usage":{"input_tokens":3,"cache_creation_input_tokens":11794,"cache_read_input_tokens":0,"output_tokens":9,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":11794,"ephemeral_5m_input_tokens":0},"inference_geo":"","iterations":[{"input_tokens":3,"output_tokens":9,"cache_read_input_tokens":0,"cache_creation_input_tokens":11794,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":11794},"type":"message"}],"speed":"standard"},"modelUsage":{"claude-sonnet-4-6":{"inputTokens":3,"outputTokens":9,"cacheReadInputTokens":0,"cacheCreationInputTokens":11794,"webSearchRequests":0,"costUSD":0.0443715,"contextWindow":200000,"maxOutputTokens":32000}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","uuid":"7b499f7a-fb88-462d-bdd0-aa4841528c96"}} -{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Respond with exactly: rollback fixture second turn complete"},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Respond with exactly: rollback fixture second turn complete"},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.111","cwd":"/tmp/claude-replay-thread_rollback","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"b398ca88-f2c0-4606-9480-d4a37be9fcdc","session_id":"f9415703-bf61-49e3-8155-1d3fed83f935"}} {"type":"emit_inbound","label":"assistant","frame":{"type":"assistant","message":{"model":"claude-sonnet-4-6","id":"msg_01U9BNPSbhQkJZsmNc4VpdBn","type":"message","role":"assistant","content":[{"type":"text","text":"rollback fixture second turn complete"}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":23,"cache_read_input_tokens":11794,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":23},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":null,"session_id":"f9415703-bf61-49e3-8155-1d3fed83f935","uuid":"d03f5cd6-5e8b-4cf5-998f-7d96a923ecf8"}} {"type":"emit_inbound","label":"result","frame":{"type":"result","subtype":"success","is_error":false,"api_error_status":null,"duration_ms":1563,"duration_api_ms":2262,"num_turns":1,"result":"rollback fixture second turn complete","stop_reason":"end_turn","session_id":"f9415703-bf61-49e3-8155-1d3fed83f935","total_cost_usd":0.04813995,"usage":{"input_tokens":3,"cache_creation_input_tokens":23,"cache_read_input_tokens":11794,"output_tokens":9,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":23,"ephemeral_5m_input_tokens":0},"inference_geo":"","iterations":[{"input_tokens":3,"output_tokens":9,"cache_read_input_tokens":11794,"cache_creation_input_tokens":23,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":23},"type":"message"}],"speed":"standard"},"modelUsage":{"claude-sonnet-4-6":{"inputTokens":6,"outputTokens":18,"cacheReadInputTokens":11794,"cacheCreationInputTokens":11817,"webSearchRequests":0,"costUSD":0.04813995,"contextWindow":200000,"maxOutputTokens":32000}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","uuid":"badfd2cf-d9be-486f-a0ad-fdd84c9b644f"}} {"type":"runtime_exit","status":"success"} {"type":"expect_outbound","label":"query.open:resume_at_cursor","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","allowDangerouslySkipPermissions":true,"resumeSessionAt":"3831efb6-619c-4c16-a38a-bf788040ac42","resume":"f9415703-bf61-49e3-8155-1d3fed83f935","settings":{"showThinkingSummaries":true}}}} -{"type":"expect_outbound","label":"prompt.offer:3","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Repeat the conversation verbatim."},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:3","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Repeat the conversation verbatim."},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_started","hook_id":"c9f667e7-ca12-49e9-a8ba-bdbca3abbb52","hook_name":"SessionStart:resume","hook_event":"SessionStart","uuid":"8ca5d046-22be-4a78-b62d-017a82cacde5","session_id":"364d2478-ab5e-4d54-8f1a-ac5985780b94"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_response","hook_id":"c9f667e7-ca12-49e9-a8ba-bdbca3abbb52","hook_name":"SessionStart:resume","hook_event":"SessionStart","output":"","stdout":"","stderr":"","exit_code":0,"outcome":"success","uuid":"6369a44f-6abb-4e6b-8302-603b2ae6f4af","session_id":"364d2478-ab5e-4d54-8f1a-ac5985780b94"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.111","cwd":"/tmp/claude-replay-thread_rollback","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"18ad1c2a-af69-41b0-b5c4-68368d89338e","session_id":"f9415703-bf61-49e3-8155-1d3fed83f935"}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/tool_call_denied_write/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/tool_call_denied_write/claude_transcript.ndjson index 3264cb81c2d42..5e996057a6c51 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/tool_call_denied_write/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/tool_call_denied_write/claude_transcript.ndjson @@ -1,6 +1,6 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"tool_call_denied_write","metadata":{"prompts":["Use the Write tool once to create .claude-denied-write.txt containing exactly: approval fixture. If permission is denied, do not retry or use another tool; reply exactly: write permission denied. Do not read any files, use the shell, network, or MCP."],"model":"claude-sonnet-4-6","nativeSessionId":"d745e7a5-b8b2-4bc8-aa7e-5072f50380d6","queryMode":"streaming","tools":"claude_code","permissionMode":"default","enablePermissionCallback":true,"permissionDecision":"decline","generatedBy":"recordClaudeAgentSdkReplayTranscript","verifiedAbsentWorkspacePaths":[".claude-denied-write.txt"],"recordedSdkVersion":"0.3.260","recordedClaudeCodeVersion":"2.1.268","sanitization":"Workspace paths replaced with the canonical replay workspace, including streamed tool-input JSON; opaque thinking signatures redacted; verifiedAbsentWorkspacePaths recorded from a real before/after filesystem check of the isolated recording workspace."}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"tool_call_denied_write","metadata":{"prompts":["Use the Write tool once to create .claude-denied-write.txt containing exactly: approval fixture. If permission is denied, do not retry or use another tool; reply exactly: write permission denied. Do not read any files, use the shell, network, or MCP."],"model":"claude-sonnet-4-6","nativeSessionId":"d745e7a5-b8b2-4bc8-aa7e-5072f50380d6","queryMode":"streaming","tools":"claude_code","permissionMode":"default","enablePermissionCallback":true,"permissionDecision":"decline","generatedBy":"recordClaudeAgentSdkReplayTranscript","verifiedAbsentWorkspacePaths":[".claude-denied-write.txt"],"recordedSdkVersion":"0.3.260","recordedClaudeCodeVersion":"2.1.268","sanitization":"Workspace paths replaced with the canonical replay workspace, including streamed tool-input JSON; opaque thinking signatures redacted; verifiedAbsentWorkspacePaths recorded from a real before/after filesystem check of the isolated recording workspace.","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"default","sessionId":"d745e7a5-b8b2-4bc8-aa7e-5072f50380d6","settings":{"showThinkingSummaries":true}}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Use the Write tool once to create .claude-denied-write.txt containing exactly: approval fixture. If permission is denied, do not retry or use another tool; reply exactly: write permission denied. Do not read any files, use the shell, network, or MCP."},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Use the Write tool once to create .claude-denied-write.txt containing exactly: approval fixture. If permission is denied, do not retry or use another tool; reply exactly: write permission denied. Do not read any files, use the shell, network, or MCP."},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_started","hook_id":"0eb5832b-2bb4-426b-919f-1465da7ae9b8","hook_name":"SessionStart:startup","hook_event":"SessionStart","uuid":"45db57bc-47dc-48fe-bc82-65eccdc0ff29","session_id":"d745e7a5-b8b2-4bc8-aa7e-5072f50380d6"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_response","hook_id":"0eb5832b-2bb4-426b-919f-1465da7ae9b8","hook_name":"SessionStart:startup","hook_event":"SessionStart","output":"","stdout":"","stderr":"","exit_code":0,"outcome":"success","uuid":"3052aee7-c67a-4f05-86f9-5698d0d9d595","session_id":"d745e7a5-b8b2-4bc8-aa7e-5072f50380d6"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.268","cwd":"/tmp/claude-replay-tool_call_denied_write","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"default","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"6a711eca-4865-4aba-a905-81a013f65e1a","session_id":"d745e7a5-b8b2-4bc8-aa7e-5072f50380d6"}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/tool_call_read_only/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/tool_call_read_only/claude_transcript.ndjson index cdbe3fca8b805..7b4eff5248191 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/tool_call_read_only/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/tool_call_read_only/claude_transcript.ndjson @@ -1,6 +1,6 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"tool_call_read_only","metadata":{"prompts":["Read /tmp/claude-replay-tool_call_read_only/package.json and /tmp/claude-replay-tool_call_read_only/tsconfig.json, then answer exactly: read only tool fixture complete"],"model":"claude-sonnet-4-6","nativeSessionId":"473fb58f-85a3-4f21-b9d3-b1fdf5ef41f9","queryMode":"streaming","tools":["Read","Glob","Grep"],"permissionMode":"dontAsk","allowedTools":["Read","Glob","Grep"],"generatedBy":"recordClaudeAgentSdkReplayTranscript"}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"tool_call_read_only","metadata":{"prompts":["Read /tmp/claude-replay-tool_call_read_only/package.json and /tmp/claude-replay-tool_call_read_only/tsconfig.json, then answer exactly: read only tool fixture complete"],"model":"claude-sonnet-4-6","nativeSessionId":"473fb58f-85a3-4f21-b9d3-b1fdf5ef41f9","queryMode":"streaming","tools":["Read","Glob","Grep"],"permissionMode":"dontAsk","allowedTools":["Read","Glob","Grep"],"generatedBy":"recordClaudeAgentSdkReplayTranscript","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":["Read","Glob","Grep"],"permissionMode":"dontAsk","allowedTools":["Read","Glob","Grep"],"sessionId":"473fb58f-85a3-4f21-b9d3-b1fdf5ef41f9","settings":{"showThinkingSummaries":true}}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Read /tmp/claude-replay-tool_call_read_only/package.json and /tmp/claude-replay-tool_call_read_only/tsconfig.json, then answer exactly: read only tool fixture complete"},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Read /tmp/claude-replay-tool_call_read_only/package.json and /tmp/claude-replay-tool_call_read_only/tsconfig.json, then answer exactly: read only tool fixture complete"},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_started","hook_id":"4d07cf82-fa99-4897-afc7-51775243eb93","hook_name":"SessionStart:startup","hook_event":"SessionStart","uuid":"1c40e207-bb7e-438e-b09e-8fe547a5fd7f","session_id":"473fb58f-85a3-4f21-b9d3-b1fdf5ef41f9"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_response","hook_id":"4d07cf82-fa99-4897-afc7-51775243eb93","hook_name":"SessionStart:startup","hook_event":"SessionStart","output":"","stdout":"","stderr":"","exit_code":0,"outcome":"success","uuid":"926cc2b6-6925-495e-95d4-15e722ed3e80","session_id":"473fb58f-85a3-4f21-b9d3-b1fdf5ef41f9"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.111","cwd":"/tmp/claude-replay-tool_call_read_only","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"dontAsk","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"7d295979-f2e5-43cb-a9ee-b05f140f3ed8","session_id":"473fb58f-85a3-4f21-b9d3-b1fdf5ef41f9"}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/tool_call_read_only_on_request/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/tool_call_read_only_on_request/claude_transcript.ndjson index aebaa34d10aa9..ff2154d52f322 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/tool_call_read_only_on_request/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/tool_call_read_only_on_request/claude_transcript.ndjson @@ -1,6 +1,6 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"tool_call_read_only_on_request","metadata":{"prompts":["Create or overwrite .codex-probe-write-action.txt with exactly this text: codex app-server approval fixture. Use a local shell command or file edit only, then briefly report what happened. Do not read package metadata, use GitHub, use web, or use MCP."],"model":"claude-sonnet-4-6","nativeSessionId":"2b73817d-f7ab-41a7-a533-31b13b698b0d","queryMode":"streaming","tools":"claude_code","permissionMode":"default","enablePermissionCallback":true,"generatedBy":"recordClaudeAgentSdkReplayTranscript"}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"tool_call_read_only_on_request","metadata":{"prompts":["Create or overwrite .codex-probe-write-action.txt with exactly this text: codex app-server approval fixture. Use a local shell command or file edit only, then briefly report what happened. Do not read package metadata, use GitHub, use web, or use MCP."],"model":"claude-sonnet-4-6","nativeSessionId":"2b73817d-f7ab-41a7-a533-31b13b698b0d","queryMode":"streaming","tools":"claude_code","permissionMode":"default","enablePermissionCallback":true,"generatedBy":"recordClaudeAgentSdkReplayTranscript","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":["Read","Glob","Grep"],"permissionMode":"default","allowedTools":["Read","Glob","Grep"],"sessionId":"2b73817d-f7ab-41a7-a533-31b13b698b0d","settings":{"showThinkingSummaries":true}}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Create or overwrite .codex-probe-write-action.txt with exactly this text: codex app-server approval fixture. Use a local shell command or file edit only, then briefly report what happened. Do not read package metadata, use GitHub, use web, or use MCP."},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Create or overwrite .codex-probe-write-action.txt with exactly this text: codex app-server approval fixture. Use a local shell command or file edit only, then briefly report what happened. Do not read package metadata, use GitHub, use web, or use MCP."},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_started","hook_id":"ae3f0d68-becd-4b08-871b-f857a9ca1f90","hook_name":"SessionStart:startup","hook_event":"SessionStart","uuid":"1d299042-40fc-44af-8459-0a80baa7b7de","session_id":"2b73817d-f7ab-41a7-a533-31b13b698b0d"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_response","hook_id":"ae3f0d68-becd-4b08-871b-f857a9ca1f90","hook_name":"SessionStart:startup","hook_event":"SessionStart","output":"","stdout":"","stderr":"","exit_code":0,"outcome":"success","uuid":"5c410b64-6b03-49c4-9991-a8e624d0fe12","session_id":"2b73817d-f7ab-41a7-a533-31b13b698b0d"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.111","cwd":"/tmp/claude-replay-tool_call_read_only_on_request","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"default","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"c5dfaae5-ef85-4e12-8409-cc9351fd7210","session_id":"2b73817d-f7ab-41a7-a533-31b13b698b0d"}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/tool_call_restricted_granular/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/tool_call_restricted_granular/claude_transcript.ndjson index 7c4bf9364e35a..e7961572937ce 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/tool_call_restricted_granular/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/tool_call_restricted_granular/claude_transcript.ndjson @@ -1,6 +1,6 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"tool_call_restricted_granular","metadata":{"prompts":["Create or overwrite .codex-probe-write-action.txt with exactly this text: codex app-server approval fixture. Use a local shell command or file edit only, then briefly report what happened. Do not read package metadata, use GitHub, use web, or use MCP."],"model":"claude-sonnet-4-6","nativeSessionId":"ffd3df75-f3cf-433d-bb67-1dd1e9db316b","queryMode":"streaming","tools":"claude_code","permissionMode":"default","enablePermissionCallback":true,"generatedBy":"recordClaudeAgentSdkReplayTranscript"}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"tool_call_restricted_granular","metadata":{"prompts":["Create or overwrite .codex-probe-write-action.txt with exactly this text: codex app-server approval fixture. Use a local shell command or file edit only, then briefly report what happened. Do not read package metadata, use GitHub, use web, or use MCP."],"model":"claude-sonnet-4-6","nativeSessionId":"ffd3df75-f3cf-433d-bb67-1dd1e9db316b","queryMode":"streaming","tools":"claude_code","permissionMode":"default","enablePermissionCallback":true,"generatedBy":"recordClaudeAgentSdkReplayTranscript","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":["Read","Glob","Grep"],"permissionMode":"default","sessionId":"ffd3df75-f3cf-433d-bb67-1dd1e9db316b","settings":{"showThinkingSummaries":true}}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Create or overwrite .codex-probe-write-action.txt with exactly this text: codex app-server approval fixture. Use a local shell command or file edit only, then briefly report what happened. Do not read package metadata, use GitHub, use web, or use MCP."},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Create or overwrite .codex-probe-write-action.txt with exactly this text: codex app-server approval fixture. Use a local shell command or file edit only, then briefly report what happened. Do not read package metadata, use GitHub, use web, or use MCP."},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_started","hook_id":"ba333d12-6a9a-4a5e-9cb5-2d6ce18cd0f8","hook_name":"SessionStart:startup","hook_event":"SessionStart","uuid":"544c0cee-2195-49a9-ab30-088c3d3d5e83","session_id":"ffd3df75-f3cf-433d-bb67-1dd1e9db316b"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_response","hook_id":"ba333d12-6a9a-4a5e-9cb5-2d6ce18cd0f8","hook_name":"SessionStart:startup","hook_event":"SessionStart","output":"","stdout":"","stderr":"","exit_code":0,"outcome":"success","uuid":"09419836-e234-4231-a15d-927acb1fbdb1","session_id":"ffd3df75-f3cf-433d-bb67-1dd1e9db316b"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.111","cwd":"/tmp/claude-replay-tool_call_restricted_granular","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"default","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"cc4bb931-a9d3-4819-8d00-58e00c2d81fe","session_id":"ffd3df75-f3cf-433d-bb67-1dd1e9db316b"}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/tool_call_workspace_never/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/tool_call_workspace_never/claude_transcript.ndjson index b5f97acf5d390..64579e9ea769f 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/tool_call_workspace_never/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/tool_call_workspace_never/claude_transcript.ndjson @@ -1,6 +1,6 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"tool_call_workspace_never","metadata":{"prompts":["Create or overwrite .codex-probe-write-action.txt with exactly this text: codex app-server approval fixture. Use a local shell command or file edit only, then briefly report what happened. Do not read package metadata, use GitHub, use web, or use MCP."],"model":"claude-sonnet-4-6","nativeSessionId":"d5a53b77-f5e5-4b4b-b387-65392391e9c9","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"recordClaudeAgentSdkReplayTranscript"}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"tool_call_workspace_never","metadata":{"prompts":["Create or overwrite .codex-probe-write-action.txt with exactly this text: codex app-server approval fixture. Use a local shell command or file edit only, then briefly report what happened. Do not read package metadata, use GitHub, use web, or use MCP."],"model":"claude-sonnet-4-6","nativeSessionId":"d5a53b77-f5e5-4b4b-b387-65392391e9c9","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"recordClaudeAgentSdkReplayTranscript","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","allowDangerouslySkipPermissions":true,"sessionId":"d5a53b77-f5e5-4b4b-b387-65392391e9c9","settings":{"showThinkingSummaries":true}}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Create or overwrite .codex-probe-write-action.txt with exactly this text: codex app-server approval fixture. Use a local shell command or file edit only, then briefly report what happened. Do not read package metadata, use GitHub, use web, or use MCP."},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Create or overwrite .codex-probe-write-action.txt with exactly this text: codex app-server approval fixture. Use a local shell command or file edit only, then briefly report what happened. Do not read package metadata, use GitHub, use web, or use MCP."},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_started","hook_id":"7c9c2603-f09a-4200-93a0-3b5a2d9f7b7d","hook_name":"SessionStart:startup","hook_event":"SessionStart","uuid":"b8818ae6-b7d3-4d82-b22d-4c93a4ca297e","session_id":"d5a53b77-f5e5-4b4b-b387-65392391e9c9"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_response","hook_id":"7c9c2603-f09a-4200-93a0-3b5a2d9f7b7d","hook_name":"SessionStart:startup","hook_event":"SessionStart","output":"","stdout":"","stderr":"","exit_code":0,"outcome":"success","uuid":"cfb9d36b-2b7d-4e20-a097-a6435b424cb2","session_id":"d5a53b77-f5e5-4b4b-b387-65392391e9c9"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.111","cwd":"/tmp/claude-replay-tool_call_workspace_never","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"f27f371a-cb8f-4b65-a45c-b6140b83de93","session_id":"d5a53b77-f5e5-4b4b-b387-65392391e9c9"}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/turn_interrupt/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/turn_interrupt/claude_transcript.ndjson index bb068e663e6ab..aac6ea5002713 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/turn_interrupt/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/turn_interrupt/claude_transcript.ndjson @@ -1,6 +1,6 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"turn_interrupt","metadata":{"prompts":["Do not answer immediately. First run the local shell command `sleep 30`, then respond with exactly: interrupt fixture should not finish naturally."],"model":"claude-sonnet-4-6","nativeSessionId":"2da9a7f1-f9cd-4d45-abd7-25f5370301f3","queryMode":"interrupt","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"recordClaudeAgentSdkReplayTranscript"}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"turn_interrupt","metadata":{"prompts":["Do not answer immediately. First run the local shell command `sleep 30`, then respond with exactly: interrupt fixture should not finish naturally."],"model":"claude-sonnet-4-6","nativeSessionId":"2da9a7f1-f9cd-4d45-abd7-25f5370301f3","queryMode":"interrupt","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"recordClaudeAgentSdkReplayTranscript","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","allowDangerouslySkipPermissions":true,"sessionId":"2da9a7f1-f9cd-4d45-abd7-25f5370301f3","settings":{"showThinkingSummaries":true}}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Do not answer immediately. First run the local shell command `sleep 30`, then respond with exactly: interrupt fixture should not finish naturally."},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Do not answer immediately. First run the local shell command `sleep 30`, then respond with exactly: interrupt fixture should not finish naturally."},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"expect_outbound","label":"query.interrupt:1","frame":{"type":"query.interrupt"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_started","hook_id":"7dd3898f-86a3-4aac-ae8a-222fe62cb13f","hook_name":"SessionStart:startup","hook_event":"SessionStart","uuid":"34154a8b-b7bb-4204-8c14-d9feb1971e17","session_id":"2da9a7f1-f9cd-4d45-abd7-25f5370301f3"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_response","hook_id":"7dd3898f-86a3-4aac-ae8a-222fe62cb13f","hook_name":"SessionStart:startup","hook_event":"SessionStart","output":"","stdout":"","stderr":"","exit_code":0,"outcome":"success","uuid":"3e1cab63-3de4-4a98-a36c-a237d01bbea6","session_id":"2da9a7f1-f9cd-4d45-abd7-25f5370301f3"}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/turn_interrupt_mid_tool/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/turn_interrupt_mid_tool/claude_transcript.ndjson index 8e990888d46f4..5ec645f25cfbb 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/turn_interrupt_mid_tool/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/turn_interrupt_mid_tool/claude_transcript.ndjson @@ -1,6 +1,6 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"turn_interrupt_mid_tool","metadata":{"prompts":["Run this exact local command: `node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\"`. Do not answer until it completes, then respond exactly: interrupt fixture should not finish naturally."],"model":"claude-sonnet-4-6","nativeSessionId":"7d29f78b-4ff3-4147-b35f-4d0f89c5d7f5","queryMode":"interrupt","tools":"claude_code","permissionMode":"bypassPermissions","interruptAfter":"tool_use","generatedBy":"recordClaudeAgentSdkReplayTranscript"}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"turn_interrupt_mid_tool","metadata":{"prompts":["Run this exact local command: `node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\"`. Do not answer until it completes, then respond exactly: interrupt fixture should not finish naturally."],"model":"claude-sonnet-4-6","nativeSessionId":"7d29f78b-4ff3-4147-b35f-4d0f89c5d7f5","queryMode":"interrupt","tools":"claude_code","permissionMode":"bypassPermissions","interruptAfter":"tool_use","generatedBy":"recordClaudeAgentSdkReplayTranscript","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","allowDangerouslySkipPermissions":true,"sessionId":"7d29f78b-4ff3-4147-b35f-4d0f89c5d7f5","settings":{"showThinkingSummaries":true}}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Run this exact local command: `node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\"`. Do not answer until it completes, then respond exactly: interrupt fixture should not finish naturally."},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Run this exact local command: `node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\"`. Do not answer until it completes, then respond exactly: interrupt fixture should not finish naturally."},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_started","hook_id":"8557ae70-649c-47ed-94c4-555567ddf93f","hook_name":"SessionStart:startup","hook_event":"SessionStart","uuid":"5f8a6db0-da77-4ac6-a34e-1502fdddcb2d","session_id":"7d29f78b-4ff3-4147-b35f-4d0f89c5d7f5"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_response","hook_id":"8557ae70-649c-47ed-94c4-555567ddf93f","hook_name":"SessionStart:startup","hook_event":"SessionStart","output":"","stdout":"","stderr":"","exit_code":0,"outcome":"success","uuid":"93406e3b-e131-447a-8e21-066c7ac7da5a","session_id":"7d29f78b-4ff3-4147-b35f-4d0f89c5d7f5"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.111","cwd":"/tmp/claude-replay-turn_interrupt_mid_tool","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"24114010-ef49-4403-92e8-d76b3234d9eb","session_id":"7d29f78b-4ff3-4147-b35f-4d0f89c5d7f5"}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/turn_interrupt_restart/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/turn_interrupt_restart/claude_transcript.ndjson index ee77902045edc..56cb3da2917df 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/turn_interrupt_restart/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/turn_interrupt_restart/claude_transcript.ndjson @@ -1,6 +1,6 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"turn_interrupt_restart","metadata":{"prompts":["Run this exact local command: `node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\"`. Do not answer until it completes, then respond exactly: interrupt fixture should not finish naturally.","Respond with exactly: interrupt recovery fixture complete"],"model":"claude-sonnet-4-6","nativeSessionId":"fb591f8f-073f-4981-bf67-9b5bffb537d5","queryMode":"interrupt_restart","tools":"claude_code","permissionMode":"bypassPermissions","interruptAfter":"tool_use","generatedBy":"recordClaudeAgentSdkReplayTranscript"}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"turn_interrupt_restart","metadata":{"prompts":["Run this exact local command: `node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\"`. Do not answer until it completes, then respond exactly: interrupt fixture should not finish naturally.","Respond with exactly: interrupt recovery fixture complete"],"model":"claude-sonnet-4-6","nativeSessionId":"fb591f8f-073f-4981-bf67-9b5bffb537d5","queryMode":"interrupt_restart","tools":"claude_code","permissionMode":"bypassPermissions","interruptAfter":"tool_use","generatedBy":"recordClaudeAgentSdkReplayTranscript","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open:1","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","allowDangerouslySkipPermissions":true,"sessionId":"fb591f8f-073f-4981-bf67-9b5bffb537d5","settings":{"showThinkingSummaries":true}}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Run this exact local command: `node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\"`. Do not answer until it completes, then respond exactly: interrupt fixture should not finish naturally."},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Run this exact local command: `node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\"`. Do not answer until it completes, then respond exactly: interrupt fixture should not finish naturally."},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_started","hook_id":"9e9d889c-c7cc-41c8-862c-691efcebe3a4","hook_name":"SessionStart:startup","hook_event":"SessionStart","uuid":"ac49901c-0458-4870-b5d7-9c8ed20ffa68","session_id":"fb591f8f-073f-4981-bf67-9b5bffb537d5"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_response","hook_id":"9e9d889c-c7cc-41c8-862c-691efcebe3a4","hook_name":"SessionStart:startup","hook_event":"SessionStart","output":"","stdout":"","stderr":"","exit_code":0,"outcome":"success","uuid":"1f69ab12-dcff-4bb3-9dc7-6284fc356fd4","session_id":"fb591f8f-073f-4981-bf67-9b5bffb537d5"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.111","cwd":"/tmp/claude-replay-turn_interrupt_restart","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"a3d73993-da1f-4dd2-ae3f-6d9fbfde4e17","session_id":"fb591f8f-073f-4981-bf67-9b5bffb537d5"}} @@ -10,7 +10,7 @@ {"type":"emit_inbound","label":"rate_limit_event","frame":{"type":"rate_limit_event","rate_limit_info":{"status":"allowed"},"uuid":"72dd2e75-8bf4-4119-85b4-0176e138ca89","session_id":"fb591f8f-073f-4981-bf67-9b5bffb537d5"}} {"type":"runtime_exit","status":"success"} {"type":"expect_outbound","label":"query.open:2","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","allowDangerouslySkipPermissions":true,"resume":"fb591f8f-073f-4981-bf67-9b5bffb537d5","settings":{"showThinkingSummaries":true}}}} -{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Respond with exactly: interrupt recovery fixture complete"},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:2","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Respond with exactly: interrupt recovery fixture complete"},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_started","hook_id":"b6eca4f5-a876-4c87-b985-ac51dfdcd45a","hook_name":"SessionStart:resume","hook_event":"SessionStart","uuid":"333f23b1-5e16-416a-ad70-28fc820390b8","session_id":"be6cf26c-092d-4fe1-8a63-057bfd8b4723"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_response","hook_id":"b6eca4f5-a876-4c87-b985-ac51dfdcd45a","hook_name":"SessionStart:resume","hook_event":"SessionStart","output":"","stdout":"","stderr":"","exit_code":0,"outcome":"success","uuid":"29fb9baf-b0ed-4097-b8fc-be223aa6dd76","session_id":"be6cf26c-092d-4fe1-8a63-057bfd8b4723"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.111","cwd":"/tmp/claude-replay-turn_interrupt_restart","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"1b86dd32-214c-4c7e-81d1-2a73befc5da8","session_id":"fb591f8f-073f-4981-bf67-9b5bffb537d5"}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/web_search/claude_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/web_search/claude_transcript.ndjson index 0b047f81bc9a2..3faa04029e690 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/web_search/claude_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/web_search/claude_transcript.ndjson @@ -1,6 +1,6 @@ -{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"web_search","metadata":{"prompts":["Search the web for FIFA World Cup ticket pricing, then answer exactly: web search fixture complete"],"model":"claude-sonnet-4-6","nativeSessionId":"f5ff7f51-4729-4331-93bd-416f3fdf2d19","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"recordClaudeAgentSdkReplayTranscript"}} +{"type":"transcript_start","provider":"claudeAgent","protocol":"claude-agent-sdk.query","version":"0.2.111","scenario":"web_search","metadata":{"prompts":["Search the web for FIFA World Cup ticket pricing, then answer exactly: web search fixture complete"],"model":"claude-sonnet-4-6","nativeSessionId":"f5ff7f51-4729-4331-93bd-416f3fdf2d19","queryMode":"streaming","tools":"claude_code","permissionMode":"bypassPermissions","generatedBy":"recordClaudeAgentSdkReplayTranscript","handEdited":"prompt.offer frames gained origin {kind: human} by hand when T3 began stamping user-typed prompts; provider frames are as recorded"}} {"type":"expect_outbound","label":"query.open","frame":{"type":"query.open","options":{"model":"claude-sonnet-4-6","tools":{"type":"preset","preset":"claude_code"},"permissionMode":"bypassPermissions","allowDangerouslySkipPermissions":true,"sessionId":"f5ff7f51-4729-4331-93bd-416f3fdf2d19","settings":{"showThinkingSummaries":true}}}} -{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Search the web for FIFA World Cup ticket pricing, then answer exactly: web search fixture complete"},"parent_tool_use_id":null}}} +{"type":"expect_outbound","label":"prompt.offer:1","frame":{"type":"prompt.offer","message":{"type":"user","message":{"role":"user","content":"Search the web for FIFA World Cup ticket pricing, then answer exactly: web search fixture complete"},"parent_tool_use_id":null,"origin":{"kind":"human"}}}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_started","hook_id":"824ca161-8a1d-45f3-9fac-d5611119d73b","hook_name":"SessionStart:startup","hook_event":"SessionStart","uuid":"37c7a47b-8682-443c-a12c-61b2b3520213","session_id":"f5ff7f51-4729-4331-93bd-416f3fdf2d19"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"hook_response","hook_id":"824ca161-8a1d-45f3-9fac-d5611119d73b","hook_name":"SessionStart:startup","hook_event":"SessionStart","output":"","stdout":"","stderr":"","exit_code":0,"outcome":"success","uuid":"6c2fbe70-34ca-4fd7-be53-7ee413e9ea0c","session_id":"f5ff7f51-4729-4331-93bd-416f3fdf2d19"}} {"type":"emit_inbound","label":"system","frame":{"type":"system","subtype":"init","agents":[],"apiKeySource":"none","claude_code_version":"2.1.111","cwd":"/tmp/claude-replay-web_search","tools":[],"mcp_servers":[],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":[],"output_style":"default","skills":[],"plugins":[],"fast_mode_state":"off","uuid":"c0128e2f-6a1c-4e08-a6df-e0c9e770e520","session_id":"f5ff7f51-4729-4331-93bd-416f3fdf2d19"}} diff --git a/apps/server/src/ws.ts b/apps/server/src/ws.ts index dfb96d3fc84f8..5f4911678c955 100644 --- a/apps/server/src/ws.ts +++ b/apps/server/src/ws.ts @@ -1978,7 +1978,13 @@ export const layerWsRpc = ( ThreadManagementService.withCreationProvenance(command, { createdBy: "user", creationSource: - "creationSource" in command ? command.creationSource : "web", + command.type === "queued-run.edit" + ? command.editor?.creationSource === "mobile" + ? "mobile" + : "web" + : "creationSource" in command + ? command.creationSource + : "web", }), ) ).pipe(Effect.provide(intakeContext)), diff --git a/packages/client-runtime/src/operations/commands.ts b/packages/client-runtime/src/operations/commands.ts index 50717d0cafd41..243b29defb5b1 100644 --- a/packages/client-runtime/src/operations/commands.ts +++ b/packages/client-runtime/src/operations/commands.ts @@ -269,6 +269,7 @@ export interface RetryWorkspacePreparationInput extends ThreadCommandInput { } export interface EditQueuedRunInput extends ThreadCommandInput { + readonly creationSource?: "web" | "mobile"; readonly runId: RunId; readonly text: string; /** @@ -1168,6 +1169,7 @@ export const editQueuedRun = Effect.fn("EnvironmentCommands.editQueuedRun")(func : yield* persistAttachments(input.threadId, input.edit.messageId, input.edit.attachments); return yield* dispatch({ type: "queued-run.edit", + editor: { createdBy: "user", creationSource: input.creationSource ?? "web" }, commandId: yield* allocateCommandId(input), threadId: input.threadId, runId: input.runId, diff --git a/packages/contracts/src/orchestrationV2.ts b/packages/contracts/src/orchestrationV2.ts index 44e9aa8290e9a..7d168a61ff17e 100644 --- a/packages/contracts/src/orchestrationV2.ts +++ b/packages/contracts/src/orchestrationV2.ts @@ -734,6 +734,8 @@ export const OrchestrationV2Run = Schema.Struct({ status: OrchestrationV2RunStatus, queuePosition: Schema.optional(Schema.NullOr(PositiveInt)), queueHeld: Schema.optional(Schema.Boolean), + /** Who queued the message, kept when an edit restamps it. Absent means its `createdBy`. */ + queuedBy: Schema.optional(OrchestrationV2Actor), steerWhenReadyRunId: Schema.optional(RunId), requestedAt: Schema.DateTimeUtc, startedAt: Schema.NullOr(Schema.DateTimeUtc), @@ -3470,6 +3472,7 @@ export const OrchestrationV2Command = Schema.Union([ }), Schema.Struct({ type: Schema.Literal("queued-run.edit"), + editor: Schema.optional(Schema.Struct(OrchestrationV2CreationFields)), context: Schema.optional(OrchestrationMessageContext), commandId: CommandId, threadId: ThreadId,