1import { ProviderDriverKind } from "@t3tools/contracts";
2
3import { claudeBackgroundSubagentAfterRootInput } from "./claude_background_subagent_after_root/input.ts";
4import { assertClaudeBackgroundSubagentAfterRootOutput } from "./claude_background_subagent_after_root/output.ts";
5import { claudeBackgroundTaskAfterRootInput } from "./claude_background_task_after_root/input.ts";
6import { assertClaudeBackgroundTaskAfterRootOutput } from "./claude_background_task_after_root/output.ts";
7import { claudeBackgroundSubagentLifecycleInput } from "./claude_background_subagent_lifecycle/input.ts";
8import { assertClaudeBackgroundSubagentLifecycleOutput } from "./claude_background_subagent_lifecycle/output.ts";
9import { claudeBackgroundTaskInterruptInput } from "./claude_background_task_interrupt/input.ts";
10import { claudeBackgroundWakeBeforeQueuedPromptInput } from "./claude_background_wake_before_queued_prompt/input.ts";
11import { assertClaudeBackgroundWakeBeforeQueuedPromptOutput } from "./claude_background_wake_before_queued_prompt/output.ts";
12import { claudeBackgroundWakeBeforeQueuedPromptNoEchoInput } from "./claude_background_wake_before_queued_prompt_no_echo/input.ts";
13import { assertClaudeBackgroundWakeBeforeQueuedPromptNoEchoOutput } from "./claude_background_wake_before_queued_prompt_no_echo/output.ts";
14import { assertClaudeBackgroundTaskInterruptOutput } from "./claude_background_task_interrupt/output.ts";
15import { claudeBackgroundMonitorWakeInput } from "./claude_background_monitor_wake/input.ts";
16import { assertClaudeBackgroundMonitorWakeOutput } from "./claude_background_monitor_wake/output.ts";
17import { claudeBackgroundTaskWakeInput } from "./claude_background_task_wake/input.ts";
18import { assertClaudeBackgroundTaskWakeOutput } from "./claude_background_task_wake/output.ts";
19import {
20 claudeCompactAfterPeerTurnInput,
21 claudeCompactAfterPeerTurnNoEchoInput,
22} from "./claude_compact_after_peer_turn/input.ts";
23import { assertClaudeCompactAfterPeerTurnOutput } from "./claude_compact_after_peer_turn/output.ts";
24import { assertClaudeCompactAfterPeerTurnNoEchoOutput } from "./claude_compact_after_peer_turn_no_echo/output.ts";
25import { claudeCompactAfterResumeWakeInput } from "./claude_compact_after_resume_wake/input.ts";
26import { assertClaudeCompactAfterResumeWakeOutput } from "./claude_compact_after_resume_wake/output.ts";
27import { claudeIdleResumeInput } from "./claude_idle_resume/input.ts";
28import { assertClaudeIdleResumeOutput } from "./claude_idle_resume/output.ts";
29import { claudeLocalBashTaskInput } from "./claude_local_bash_task/input.ts";
30import { assertClaudeLocalBashTaskOutput } from "./claude_local_bash_task/output.ts";
31import { claudeNestedBackgroundSubagentWakeInput } from "./claude_nested_background_subagent_wake/input.ts";
32import { assertClaudeNestedBackgroundSubagentWakeOutput } from "./claude_nested_background_subagent_wake/output.ts";
33import { claudeNestedSubagentModelInput } from "./claude_nested_subagent_model/input.ts";
34import { assertClaudeNestedSubagentModelOutput } from "./claude_nested_subagent_model/output.ts";
35import { claudeMcpToolPresentationInput } from "./claude_mcp_tool_presentation/input.ts";
36import { assertClaudeMcpToolPresentationOutput } from "./claude_mcp_tool_presentation/output.ts";
37import { claudeResultIsErrorInput } from "./claude_result_is_error/input.ts";
38import { assertClaudeResultIsErrorOutput } from "./claude_result_is_error/output.ts";
39import { grokAutoBlockedCommandInput } from "./grok_auto_blocked_command/input.ts";
40import { assertGrokAutoBlockedCommandOutput } from "./grok_auto_blocked_command/output.ts";
41import { grokBackgroundBashInput } from "./grok_background_bash/input.ts";
42import { assertGrokBackgroundBashOutput } from "./grok_background_bash/output.ts";
43import { grokBackgroundBashFastWakeInput } from "./grok_background_bash_fast_wake/input.ts";
44import { assertGrokBackgroundBashFastWakeOutput } from "./grok_background_bash_fast_wake/output.ts";
45import { grokBackgroundSubagentInput } from "./grok_background_subagent/input.ts";
46import { assertGrokBackgroundSubagentOutput } from "./grok_background_subagent/output.ts";
47import { grokMonitorInput } from "./grok_monitor/input.ts";
48import { assertGrokMonitorOutput } from "./grok_monitor/output.ts";
49import { grokPromptErrorInput } from "./grok_prompt_error/input.ts";
50import { assertGrokPromptErrorOutput } from "./grok_prompt_error/output.ts";
51import { grokSubagentLineageInput } from "./grok_subagent_lineage/input.ts";
52import { assertGrokSubagentLineageOutput } from "./grok_subagent_lineage/output.ts";
53import { assertClaudeMessageSteeringOutput } from "./message_steering/claude_output.ts";
54import { assertMessageSteeringOutput } from "./message_steering/codex_output.ts";
55import { assertCursorMessageSteeringOutput } from "./message_steering/cursor_output.ts";
56import { assertGrokMessageSteeringOutput } from "./message_steering/grok_output.ts";
57import { messageSteeringInput } from "./message_steering/input.ts";
58import { assertPiMessageSteeringOutput } from "./message_steering/pi_output.ts";
59import { MUSE_PERMISSION_DECLINED_FILE, musePermissionInput } from "./muse_permission/input.ts";
60import { assertMusePermissionOutput } from "./muse_permission/output.ts";
61import { museSubagentApprovalInput } from "./muse_subagent_approval/input.ts";
62import { assertMuseSubagentApprovalOutput } from "./muse_subagent_approval/output.ts";
63import { museSubagentInterruptInput } from "./muse_subagent_interrupt/input.ts";
64import { assertMuseSubagentInterruptOutput } from "./muse_subagent_interrupt/output.ts";
65import { museWorkflowInput } from "./muse_workflow/input.ts";
66import { assertMuseWorkflowOutput } from "./muse_workflow/output.ts";
67import { assertMuseSubagentV2Output } from "./subagent_v2/muse_output.ts";
68import { assertMuseMultiTurnOutput } from "./multi_turn/muse_output.ts";
69import { assertMuseTurnInterruptOutput } from "./turn_interrupt/muse_output.ts";
70import { piCompactionInput } from "./pi_compaction/input.ts";
71import { assertPiCompactionOutput } from "./pi_compaction/output.ts";
72import { providerThreadResumeInput } from "./provider_thread_resume/input.ts";
73import { assertPiProviderThreadResumeOutput } from "./provider_thread_resume/pi_output.ts";
74import { assertMultiTurnClaudeOutput } from "./multi_turn/claude_output.ts";
75import { assertMultiTurnOutput } from "./multi_turn/codex_output.ts";
76import { assertPiMultiTurnOutput } from "./multi_turn/pi_output.ts";
77import { multiTurnInput } from "./multi_turn/input.ts";
78import { openCodeChildApprovalInput } from "./opencode_child_approval/input.ts";
79import { assertOpenCodeChildApprovalOutput } from "./opencode_child_approval/output.ts";
80import { openCodeRunningChildApprovalInput } from "./opencode_running_child_approval/input.ts";
81import { assertOpenCodeRunningChildApprovalOutput } from "./opencode_running_child_approval/output.ts";
82import { openCodeSubagentInput } from "./opencode_subagent/input.ts";
83import { openCode2InboxInput } from "./opencode2_inbox/input.ts";
84import { openCode2RevertInput } from "./opencode2_revert/input.ts";
85import { assertOpenCode2RevertOutput } from "./opencode2_revert/output.ts";
86import { assertOpenCode2InboxOutput } from "./opencode2_inbox/output.ts";
87import { openCode2CommandInput } from "./opencode2_command/input.ts";
88import { assertOpenCode2CommandOutput } from "./opencode2_command/output.ts";
89import { openCode2CompactionInput } from "./opencode2_compaction/input.ts";
90import { assertOpenCode2CompactionOutput } from "./opencode2_compaction/output.ts";
91import { openCode2InterruptInput } from "./opencode2_interrupt/input.ts";
92import { assertOpenCode2InterruptOutput } from "./opencode2_interrupt/output.ts";
93import { openCode2PermissionInput } from "./opencode2_permission/input.ts";
94import { assertOpenCode2PermissionOutput } from "./opencode2_permission/output.ts";
95import { openCode2QuestionInput } from "./opencode2_question/input.ts";
96import { assertOpenCode2QuestionOutput } from "./opencode2_question/output.ts";
97import { openCode2BackgroundInput } from "./opencode2_background/input.ts";
98import { assertOpenCode2BackgroundOutput } from "./opencode2_background/output.ts";
99import { openCode2NestedBackgroundInput } from "./opencode2_nested_background/input.ts";
100import { assertOpenCode2NestedBackgroundOutput } from "./opencode2_nested_background/output.ts";
101import { openCode2SubagentInput } from "./opencode2_subagent/input.ts";
102import { assertOpenCode2SubagentOutput } from "./opencode2_subagent/output.ts";
103import { openCode2ResumeAfterRestartInput } from "./opencode2_resume_after_restart/input.ts";
104import { assertOpenCode2ResumeAfterRestartOutput } from "./opencode2_resume_after_restart/output.ts";
105import { openCode2SimpleInput } from "./opencode2_simple/input.ts";
106import { openCode2SkillInput } from "./opencode2_skill/input.ts";
107import { assertOpenCode2SkillOutput } from "./opencode2_skill/output.ts";
108import { assertOpenCode2SimpleOutput } from "./opencode2_simple/output.ts";
109import { openCode2ToolCallInput } from "./opencode2_tool_call/input.ts";
110import { assertOpenCode2ToolCallOutput } from "./opencode2_tool_call/output.ts";
111import { assertOpenCodeSubagentOutput } from "./opencode_subagent/output.ts";
112import {
113 assertCodexPlanQuestionsOutput,
114 assertPlanQuestionsOutput,
115} from "./plan_questions/codex_output.ts";
116import { assertOpenCodePlanQuestionsOutput } from "./plan_questions/opencode_output.ts";
117import { planQuestionsInput } from "./plan_questions/input.ts";
118import { assertProposedPlanOutput } from "./proposed_plan/codex_output.ts";
119import { assertProposedPlanCursorOutput } from "./proposed_plan/cursor_output.ts";
120import { proposedPlanInput } from "./proposed_plan/input.ts";
121import { assertQueuedCancelledWhileActiveOutput } from "./queued_cancelled_while_active/codex_output.ts";
122import { queuedCancelledWhileActiveInput } from "./queued_cancelled_while_active/input.ts";
123import { assertQueuedTurnOutput } from "./queued_turn/codex_output.ts";
124import { queuedTurnInput } from "./queued_turn/input.ts";
125import { assertSimpleClaudeOutput } from "./simple/claude_output.ts";
126import { assertSkillInvocationCursorOutput } from "./skill_invocation/cursor_output.ts";
127import { skillInvocationInput } from "./skill_invocation/input.ts";
128import { assertSimpleOutput } from "./simple/codex_output.ts";
129import { assertPiSimpleOutput } from "./simple/pi_output.ts";
130import { simpleInput } from "./simple/input.ts";
131import { assertSubagentOutput } from "./subagent/codex_output.ts";
132import { assertClaudeSubagentOutput } from "./subagent/claude_output.ts";
133import { subagentInput } from "./subagent/input.ts";
134import { assertCursorSubagentOutput } from "./subagent/cursor_output.ts";
135import { assertSubagentContinueOutput } from "./subagent_continue/codex_output.ts";
136import { subagentContinueInput } from "./subagent_continue/input.ts";
137import { assertSubagentV2Output } from "./subagent_v2/codex_output.ts";
138import { subagentV2Input, subagentV2NestedInput } from "./subagent_v2/input.ts";
139import { assertSubagentV2ApprovalOutput } from "./subagent_v2_approval/codex_output.ts";
140import {
141 SUBAGENT_V2_APPROVAL_POLICY,
142 subagentV2ApprovalInput,
143} from "./subagent_v2_approval/input.ts";
144import { assertSubagentV2NestedOutput } from "./subagent_v2_nested/codex_output.ts";
145import { assertSubagentV2NestedApprovalOutput } from "./subagent_v2_nested_approval/codex_output.ts";
146import { subagentV2NestedApprovalInput } from "./subagent_v2_nested_approval/input.ts";
147import { assertClaudeThreadRollbackOutput } from "./thread_rollback/claude_output.ts";
148import { assertThreadRollbackOutput } from "./thread_rollback/codex_output.ts";
149import { threadRollbackInput } from "./thread_rollback/input.ts";
150import { assertPiThreadRollbackOutput } from "./thread_rollback/pi_output.ts";
151import { assertThreadRollbackAfterRestartOutput } from "./thread_rollback_after_restart/codex_output.ts";
152import { threadRollbackAfterRestartInput } from "./thread_rollback_after_restart/input.ts";
153import { threadRollbackAfterStopInput } from "./thread_rollback_after_stop/input.ts";
154import { assertPiThreadRollbackAfterStopOutput } from "./thread_rollback_after_stop/pi_output.ts";
155import { assertThreadRollbackToStoppedTurnOutput } from "./thread_rollback_to_stopped_turn/codex_output.ts";
156import { threadRollbackToStoppedTurnInput } from "./thread_rollback_to_stopped_turn/input.ts";
157import { assertTodoListOutput } from "./todo_list/codex_output.ts";
158import { assertTodoListCursorOutput } from "./todo_list/cursor_output.ts";
159import { assertTodoListGrokOutput } from "./todo_list/grok_output.ts";
160import { todoListInput } from "./todo_list/input.ts";
161import { assertToolCallDeniedWriteClaudeOutput } from "./tool_call_denied_write/claude_output.ts";
162import {
163 DENIED_WRITE_POLICY,
164 TOOL_CALL_DENIED_WRITE_TARGET,
165 toolCallDeniedWriteInput,
166} from "./tool_call_denied_write/input.ts";
167import { assertToolCallReadOnlyClaudeOutput } from "./tool_call_read_only/claude_output.ts";
168import { assertToolCallReadOnlyCursorOutput } from "./tool_call_read_only/cursor_output.ts";
169import { toolCallReadOnlyInput } from "./tool_call_read_only/input.ts";
170import {
171 assertToolCallReadOnlyOnRequestGrokOutput,
172 assertToolCallReadOnlyOnRequestOutput,
173} from "./tool_call_read_only_on_request/output.ts";
174import { toolCallReadOnlyOnRequestInput } from "./tool_call_read_only_on_request/input.ts";
175import {
176 stopBackgroundWorkAfterFailedTurnInput,
177 stopBackgroundWorkAfterReleaseInput,
178} from "./stop_background_work_after_failed_turn/input.ts";
179import { assertStopBackgroundWorkAfterFailedTurnOutput } from "./stop_background_work_after_failed_turn/output.ts";
180import { assertToolCallRestrictedGranularClaudeOutput } from "./tool_call_restricted_granular/claude_output.ts";
181import { assertToolCallRestrictedGranularOutput } from "./tool_call_restricted_granular/codex_output.ts";
182import { toolCallRestrictedGranularInput } from "./tool_call_restricted_granular/input.ts";
183import { assertToolCallWorkspaceNeverClaudeOutput } from "./tool_call_workspace_never/claude_output.ts";
184import { assertToolCallWorkspaceNeverOutput } from "./tool_call_workspace_never/codex_output.ts";
185import { toolCallWorkspaceNeverInput } from "./tool_call_workspace_never/input.ts";
186import { assertTurnInterruptClaudeOutput } from "./turn_interrupt/claude_output.ts";
187import { assertTurnInterruptOutput } from "./turn_interrupt/codex_output.ts";
188import { turnInterruptInput } from "./turn_interrupt/input.ts";
189import { assertTurnInterruptMidToolClaudeOutput } from "./turn_interrupt_mid_tool/claude_output.ts";
190import { assertTurnInterruptMidToolCodexOutput } from "./turn_interrupt_mid_tool/codex_output.ts";
191import { assertTurnInterruptMidToolCursorOutput } from "./turn_interrupt_mid_tool/cursor_output.ts";
192import { turnInterruptMidToolInput } from "./turn_interrupt_mid_tool/input.ts";
193import { assertTurnInterruptMidToolPiOutput } from "./turn_interrupt_mid_tool/pi_output.ts";
194import { assertTurnInterruptRestartClaudeOutput } from "./turn_interrupt_restart/claude_output.ts";
195import { turnInterruptRestartInput } from "./turn_interrupt_restart/input.ts";
196import { assertClaudeWebSearchOutput } from "./web_search/claude_output.ts";
197import { assertWebSearchOutput } from "./web_search/codex_output.ts";
198import { webSearchInput } from "./web_search/input.ts";
199import {
200 ACP_REGISTRY_MODEL_SELECTION,
201 CLAUDE_MODEL_SELECTION,
202 CODEX_MODEL_SELECTION,
203 CURSOR_MODEL_SELECTION,
204 GROK_MODEL_SELECTION,
205 MUSE_MODEL_SELECTION,
206 OPENCODE_MODEL_SELECTION,
207 OPENCODE2_MODEL_SELECTION,
208 PI_MODEL_SELECTION,
209 READ_ONLY_NEVER_POLICY,
210 READ_ONLY_ON_REQUEST_POLICY,
211 RESTRICTED_GRANULAR_POLICY,
212 type OrchestratorReplayFixture,
213 WORKSPACE_NEVER_POLICY,
214} from "./shared.ts";
215
216export const ORCHESTRATOR_REPLAY_FIXTURES: ReadonlyArray<OrchestratorReplayFixture> = [
217 {
218 name: "claude_background_subagent_after_root",
219 buildInput: claudeBackgroundSubagentAfterRootInput,
220 providers: [
221 {
222 driver: ProviderDriverKind.make("claudeAgent"),
223 transcriptFile: new URL(
224 "./claude_background_subagent_after_root/claude_transcript.ndjson",
225 import.meta.url,
226 ),
227 modelSelection: CLAUDE_MODEL_SELECTION,
228 runContinuationWorker: true,
229 assertOutput: assertClaudeBackgroundSubagentAfterRootOutput,
230 },
231 ],
232 },
233 {
234 name: "claude_background_task_after_root",
235 buildInput: claudeBackgroundTaskAfterRootInput,
236 providers: [
237 {
238 driver: ProviderDriverKind.make("claudeAgent"),
239 transcriptFile: new URL(
240 "./claude_background_task_after_root/claude_transcript.ndjson",
241 import.meta.url,
242 ),
243 modelSelection: CLAUDE_MODEL_SELECTION,
244 assertOutput: assertClaudeBackgroundTaskAfterRootOutput,
245 },
246 ],
247 },
248 {
249 name: "claude_background_subagent_lifecycle",
250 buildInput: claudeBackgroundSubagentLifecycleInput,
251 providers: [
252 {
253 driver: ProviderDriverKind.make("claudeAgent"),
254 transcriptFile: new URL(
255 "./claude_background_subagent_lifecycle/claude_transcript.ndjson",
256 import.meta.url,
257 ),
258 modelSelection: CLAUDE_MODEL_SELECTION,
259 runContinuationWorker: true,
260 assertOutput: assertClaudeBackgroundSubagentLifecycleOutput,
261 },
262 ],
263 },
264 {
265 name: "claude_background_task_interrupt",
266 buildInput: claudeBackgroundTaskInterruptInput,
267 providers: [
268 {
269 driver: ProviderDriverKind.make("claudeAgent"),
270 transcriptFile: new URL(
271 "./claude_background_task_interrupt/claude_transcript.ndjson",
272 import.meta.url,
273 ),
274 modelSelection: CLAUDE_MODEL_SELECTION,
275 runContinuationWorker: true,
276 assertOutput: assertClaudeBackgroundTaskInterruptOutput,
277 },
278 ],
279 },
280 {
281 name: "claude_background_wake_before_queued_prompt",
282 buildInput: claudeBackgroundWakeBeforeQueuedPromptInput,
283 providers: [
284 {
285 driver: ProviderDriverKind.make("claudeAgent"),
286 transcriptFile: new URL(
287 "./claude_background_wake_before_queued_prompt/claude_transcript.ndjson",
288 import.meta.url,
289 ),
290 modelSelection: CLAUDE_MODEL_SELECTION,
291 runContinuationWorker: true,
292 assertOutput: assertClaudeBackgroundWakeBeforeQueuedPromptOutput,
293 },
294 ],
295 },
296 {
297 name: "claude_background_wake_before_queued_prompt_no_echo",
298 buildInput: claudeBackgroundWakeBeforeQueuedPromptNoEchoInput,
299 providers: [
300 {
301 driver: ProviderDriverKind.make("claudeAgent"),
302 transcriptFile: new URL(
303 "./claude_background_wake_before_queued_prompt_no_echo/claude_transcript.ndjson",
304 import.meta.url,
305 ),
306 modelSelection: CLAUDE_MODEL_SELECTION,
307 runContinuationWorker: true,
308 assertOutput: assertClaudeBackgroundWakeBeforeQueuedPromptNoEchoOutput,
309 },
310 ],
311 },
312 {
313 name: "claude_compact_after_resume_wake",
314 buildInput: claudeCompactAfterResumeWakeInput,
315 providers: [
316 {
317 driver: ProviderDriverKind.make("claudeAgent"),
318 transcriptFile: new URL(
319 "./claude_compact_after_resume_wake/claude_transcript.ndjson",
320 import.meta.url,
321 ),
322 modelSelection: CLAUDE_MODEL_SELECTION,
323 runContinuationWorker: true,
324 assertOutput: assertClaudeCompactAfterResumeWakeOutput,
325 },
326 ],
327 },
328 {
329 name: "claude_compact_after_peer_turn",
330 buildInput: claudeCompactAfterPeerTurnInput,
331 providers: [
332 {
333 driver: ProviderDriverKind.make("claudeAgent"),
334 transcriptFile: new URL(
335 "./claude_compact_after_peer_turn/claude_transcript.ndjson",
336 import.meta.url,
337 ),
338 modelSelection: CLAUDE_MODEL_SELECTION,
339 runContinuationWorker: true,
340 assertOutput: assertClaudeCompactAfterPeerTurnOutput,
341 },
342 ],
343 },
344 {
345 name: "claude_compact_after_peer_turn_no_echo",
346 buildInput: claudeCompactAfterPeerTurnNoEchoInput,
347 providers: [
348 {
349 driver: ProviderDriverKind.make("claudeAgent"),
350 transcriptFile: new URL(
351 "./claude_compact_after_peer_turn_no_echo/claude_transcript.ndjson",
352 import.meta.url,
353 ),
354 modelSelection: CLAUDE_MODEL_SELECTION,
355 runContinuationWorker: true,
356 assertOutput: assertClaudeCompactAfterPeerTurnNoEchoOutput,
357 },
358 ],
359 },
360 {
361 name: "claude_background_monitor_wake",
362 buildInput: claudeBackgroundMonitorWakeInput,
363 providers: [
364 {
365 driver: ProviderDriverKind.make("claudeAgent"),
366 transcriptFile: new URL(
367 "./claude_background_monitor_wake/claude_transcript.ndjson",
368 import.meta.url,
369 ),
370 modelSelection: CLAUDE_MODEL_SELECTION,
371 runContinuationWorker: true,
372 assertOutput: assertClaudeBackgroundMonitorWakeOutput,
373 },
374 ],
375 },
376 {
377 name: "claude_background_task_wake",
378 buildInput: claudeBackgroundTaskWakeInput,
379 providers: [
380 {
381 driver: ProviderDriverKind.make("claudeAgent"),
382 transcriptFile: new URL(
383 "./claude_background_task_wake/claude_transcript.ndjson",
384 import.meta.url,
385 ),
386 modelSelection: CLAUDE_MODEL_SELECTION,
387 runContinuationWorker: true,
388 assertOutput: assertClaudeBackgroundTaskWakeOutput,
389 },
390 ],
391 },
392 {
393 name: "claude_local_bash_task",
394 buildInput: claudeLocalBashTaskInput,
395 providers: [
396 {
397 driver: ProviderDriverKind.make("claudeAgent"),
398 transcriptFile: new URL(
399 "./claude_local_bash_task/claude_transcript.ndjson",
400 import.meta.url,
401 ),
402 modelSelection: CLAUDE_MODEL_SELECTION,
403 assertOutput: assertClaudeLocalBashTaskOutput,
404 },
405 ],
406 },
407 {
408 name: "claude_nested_background_subagent_wake",
409 buildInput: claudeNestedBackgroundSubagentWakeInput,
410 providers: [
411 {
412 driver: ProviderDriverKind.make("claudeAgent"),
413 transcriptFile: new URL(
414 "./claude_nested_background_subagent_wake/claude_transcript.ndjson",
415 import.meta.url,
416 ),
417 modelSelection: CLAUDE_MODEL_SELECTION,
418 runContinuationWorker: true,
419 assertOutput: assertClaudeNestedBackgroundSubagentWakeOutput,
420 },
421 ],
422 },
423 {
424 name: "claude_nested_subagent_model",
425 buildInput: claudeNestedSubagentModelInput,
426 providers: [
427 {
428 driver: ProviderDriverKind.make("claudeAgent"),
429 transcriptFile: new URL(
430 "./claude_nested_subagent_model/claude_transcript.ndjson",
431 import.meta.url,
432 ),
433 modelSelection: CLAUDE_MODEL_SELECTION,
434 assertOutput: assertClaudeNestedSubagentModelOutput,
435 },
436 ],
437 },
438 {
439 name: "claude_mcp_tool_presentation",
440 buildInput: claudeMcpToolPresentationInput,
441 providers: [
442 {
443 driver: ProviderDriverKind.make("claudeAgent"),
444 transcriptFile: new URL(
445 "./claude_mcp_tool_presentation/claude_transcript.ndjson",
446 import.meta.url,
447 ),
448 modelSelection: CLAUDE_MODEL_SELECTION,
449 assertOutput: assertClaudeMcpToolPresentationOutput,
450 },
451 ],
452 },
453 {
454 name: "claude_idle_resume",
455 buildInput: claudeIdleResumeInput,
456 providers: [
457 {
458 driver: ProviderDriverKind.make("claudeAgent"),
459 transcriptFile: new URL("./claude_idle_resume/claude_transcript.ndjson", import.meta.url),
460 modelSelection: CLAUDE_MODEL_SELECTION,
461 assertOutput: assertClaudeIdleResumeOutput,
462 },
463 ],
464 },
465 {
466 name: "claude_result_is_error",
467 buildInput: claudeResultIsErrorInput,
468 providers: [
469 {
470 driver: ProviderDriverKind.make("claudeAgent"),
471 transcriptFile: new URL(
472 "./claude_result_is_error/claude_transcript.ndjson",
473 import.meta.url,
474 ),
475 modelSelection: CLAUDE_MODEL_SELECTION,
476 assertOutput: assertClaudeResultIsErrorOutput,
477 },
478 ],
479 },
480 {
481 name: "grok_auto_blocked_command",
482 buildInput: grokAutoBlockedCommandInput,
483 providers: [
484 {
485 driver: ProviderDriverKind.make("grok"),
486 transcriptFile: new URL(
487 "./grok_auto_blocked_command/grok_transcript.ndjson",
488 import.meta.url,
489 ),
490 modelSelection: { ...GROK_MODEL_SELECTION, model: "grok-4.7-build-fast" },
491 assertOutput: assertGrokAutoBlockedCommandOutput,
492 },
493 ],
494 },
495 {
496 name: "grok_background_bash",
497 buildInput: grokBackgroundBashInput,
498 providers: [
499 {
500 driver: ProviderDriverKind.make("grok"),
501 transcriptFile: new URL("./grok_background_bash/grok_transcript.ndjson", import.meta.url),
502 modelSelection: { ...GROK_MODEL_SELECTION, model: "grok-4.7-build-fast" },
503 runContinuationWorker: true,
504 assertOutput: assertGrokBackgroundBashOutput,
505 },
506 ],
507 },
508 {
509 name: "grok_background_bash_fast_wake",
510 buildInput: grokBackgroundBashFastWakeInput,
511 providers: [
512 {
513 driver: ProviderDriverKind.make("grok"),
514 transcriptFile: new URL(
515 "./grok_background_bash_fast_wake/grok_transcript.ndjson",
516 import.meta.url,
517 ),
518 modelSelection: { ...GROK_MODEL_SELECTION, model: "grok-4.7-build-fast" },
519 runContinuationWorker: true,
520 assertOutput: assertGrokBackgroundBashFastWakeOutput,
521 },
522 ],
523 },
524 {
525 name: "grok_background_subagent",
526 buildInput: grokBackgroundSubagentInput,
527 providers: [
528 {
529 driver: ProviderDriverKind.make("grok"),
530 transcriptFile: new URL(
531 "./grok_background_subagent/grok_transcript.ndjson",
532 import.meta.url,
533 ),
534 modelSelection: GROK_MODEL_SELECTION,
535 runContinuationWorker: true,
536 assertOutput: assertGrokBackgroundSubagentOutput,
537 },
538 ],
539 },
540 {
541 name: "grok_monitor",
542 buildInput: grokMonitorInput,
543 providers: [
544 {
545 driver: ProviderDriverKind.make("grok"),
546 transcriptFile: new URL("./grok_monitor/grok_transcript.ndjson", import.meta.url),
547 modelSelection: GROK_MODEL_SELECTION,
548 runContinuationWorker: true,
549 assertOutput: assertGrokMonitorOutput,
550 },
551 ],
552 },
553 {
554 name: "grok_prompt_error",
555 buildInput: grokPromptErrorInput,
556 providers: [
557 {
558 driver: ProviderDriverKind.make("grok"),
559 transcriptFile: new URL("./grok_prompt_error/grok_transcript.ndjson", import.meta.url),
560 modelSelection: GROK_MODEL_SELECTION,
561 assertOutput: assertGrokPromptErrorOutput,
562 },
563 ],
564 },
565 {
566 name: "grok_subagent_lineage",
567 buildInput: grokSubagentLineageInput,
568 providers: [
569 {
570 driver: ProviderDriverKind.make("grok"),
571 transcriptFile: new URL("./grok_subagent_lineage/grok_transcript.ndjson", import.meta.url),
572 modelSelection: {
573 ...GROK_MODEL_SELECTION,
574 model: "grok-composer-2.5-fast",
575 },
576 assertOutput: assertGrokSubagentLineageOutput,
577 },
578 ],
579 },
580 {
581 name: "acp_elicitation",
582 buildInput: planQuestionsInput,
583 providers: [
584 // Grok Build still elicits with the pre-1.0 session/elicitation wire
585 // method the current spec removed; T3 supports standard ACP only, so
586 // the scenario covers the registry driver until Grok ships
587 // elicitation/create.
588 {
589 driver: ProviderDriverKind.make("acpRegistry"),
590 transcriptFile: new URL("./acp_elicitation/registry_transcript.ndjson", import.meta.url),
591 modelSelection: ACP_REGISTRY_MODEL_SELECTION,
592 runtimePolicyOverride: READ_ONLY_NEVER_POLICY,
593 assertOutput: assertPlanQuestionsOutput,
594 },
595 ],
596 },
597 {
598 name: "simple",
599 buildInput: simpleInput,
600 providers: [
601 {
602 driver: ProviderDriverKind.make("codex"),
603 transcriptFile: new URL("./simple/codex_transcript.ndjson", import.meta.url),
604 modelSelection: CODEX_MODEL_SELECTION,
605 assertOutput: assertSimpleOutput,
606 },
607 {
608 driver: ProviderDriverKind.make("claudeAgent"),
609 transcriptFile: new URL("./simple/claude_transcript.ndjson", import.meta.url),
610 modelSelection: CLAUDE_MODEL_SELECTION,
611 assertOutput: assertSimpleClaudeOutput,
612 },
613 {
614 driver: ProviderDriverKind.make("cursor"),
615 transcriptFile: new URL("./simple/cursor_transcript.ndjson", import.meta.url),
616 modelSelection: CURSOR_MODEL_SELECTION,
617 assertOutput: assertSimpleOutput,
618 },
619 {
620 driver: ProviderDriverKind.make("grok"),
621 transcriptFile: new URL("./simple/grok_transcript.ndjson", import.meta.url),
622 modelSelection: GROK_MODEL_SELECTION,
623 assertOutput: assertSimpleOutput,
624 },
625 {
626 driver: ProviderDriverKind.make("acpRegistry"),
627 transcriptFile: new URL("./simple/registry_transcript.ndjson", import.meta.url),
628 modelSelection: ACP_REGISTRY_MODEL_SELECTION,
629 assertOutput: assertSimpleOutput,
630 },
631 {
632 driver: ProviderDriverKind.make("opencode"),
633 transcriptFile: new URL("./simple/opencode_transcript.ndjson", import.meta.url),
634 modelSelection: OPENCODE_MODEL_SELECTION,
635 assertOutput: assertSimpleOutput,
636 },
637 {
638 driver: ProviderDriverKind.make("pi"),
639 transcriptFile: new URL("./simple/pi_transcript.ndjson", import.meta.url),
640 modelSelection: PI_MODEL_SELECTION,
641 assertOutput: assertPiSimpleOutput,
642 },
643 {
644 driver: ProviderDriverKind.make("muse"),
645 transcriptFile: new URL("./simple/muse_transcript.ndjson", import.meta.url),
646 modelSelection: MUSE_MODEL_SELECTION,
647 assertOutput: assertSimpleOutput,
648 },
649 ],
650 },
651 {
652 name: "skill_invocation",
653 buildInput: skillInvocationInput,
654 providers: [
655 {
656 driver: ProviderDriverKind.make("cursor"),
657 transcriptFile: new URL("./skill_invocation/cursor_transcript.ndjson", import.meta.url),
658 modelSelection: CURSOR_MODEL_SELECTION,
659 assertOutput: assertSkillInvocationCursorOutput,
660 },
661 ],
662 },
663 {
664 name: "tool_call_denied_write",
665 buildInput: toolCallDeniedWriteInput,
666 providers: [
667 {
668 driver: ProviderDriverKind.make("claudeAgent"),
669 transcriptFile: new URL(
670 "./tool_call_denied_write/claude_transcript.ndjson",
671 import.meta.url,
672 ),
673 modelSelection: CLAUDE_MODEL_SELECTION,
674 runtimePolicyOverride: DENIED_WRITE_POLICY,
675 expectedAbsentWorkspacePaths: [TOOL_CALL_DENIED_WRITE_TARGET],
676 assertOutput: assertToolCallDeniedWriteClaudeOutput,
677 },
678 ],
679 },
680 {
681 name: "tool_call_read_only",
682 buildInput: toolCallReadOnlyInput,
683 providers: [
684 {
685 driver: ProviderDriverKind.make("claudeAgent"),
686 transcriptFile: new URL("./tool_call_read_only/claude_transcript.ndjson", import.meta.url),
687 modelSelection: CLAUDE_MODEL_SELECTION,
688 runtimePolicyOverride: READ_ONLY_NEVER_POLICY,
689 assertOutput: assertToolCallReadOnlyClaudeOutput,
690 },
691 {
692 driver: ProviderDriverKind.make("cursor"),
693 transcriptFile: new URL("./tool_call_read_only/cursor_transcript.ndjson", import.meta.url),
694 modelSelection: CURSOR_MODEL_SELECTION,
695 runtimePolicyOverride: READ_ONLY_NEVER_POLICY,
696 assertOutput: assertToolCallReadOnlyCursorOutput,
697 },
698 {
699 driver: ProviderDriverKind.make("grok"),
700 transcriptFile: new URL("./tool_call_read_only/grok_transcript.ndjson", import.meta.url),
701 modelSelection: GROK_MODEL_SELECTION,
702 runtimePolicyOverride: READ_ONLY_NEVER_POLICY,
703 assertOutput: assertToolCallReadOnlyCursorOutput,
704 },
705 {
706 driver: ProviderDriverKind.make("acpRegistry"),
707 transcriptFile: new URL(
708 "./tool_call_read_only/registry_transcript.ndjson",
709 import.meta.url,
710 ),
711 modelSelection: ACP_REGISTRY_MODEL_SELECTION,
712 runtimePolicyOverride: READ_ONLY_NEVER_POLICY,
713 assertOutput: assertToolCallReadOnlyCursorOutput,
714 },
715 ],
716 },
717 {
718 name: "tool_call_read_only_on_request",
719 buildInput: toolCallReadOnlyOnRequestInput,
720 providers: [
721 {
722 driver: ProviderDriverKind.make("codex"),
723 transcriptFile: new URL(
724 "./tool_call_read_only_on_request/codex_transcript.ndjson",
725 import.meta.url,
726 ),
727 // gpt-6-luna declines the write under a read-only sandbox, so nothing asks for approval.
728 modelSelection: { ...CODEX_MODEL_SELECTION, model: "gpt-6-sol" },
729 runtimePolicyOverride: READ_ONLY_ON_REQUEST_POLICY,
730 assertOutput: assertToolCallReadOnlyOnRequestOutput,
731 },
732 {
733 driver: ProviderDriverKind.make("claudeAgent"),
734 transcriptFile: new URL(
735 "./tool_call_read_only_on_request/claude_transcript.ndjson",
736 import.meta.url,
737 ),
738 modelSelection: CLAUDE_MODEL_SELECTION,
739 runtimePolicyOverride: READ_ONLY_ON_REQUEST_POLICY,
740 assertOutput: assertToolCallReadOnlyOnRequestOutput,
741 },
742 {
743 driver: ProviderDriverKind.make("grok"),
744 transcriptFile: new URL(
745 "./tool_call_read_only_on_request/grok_transcript.ndjson",
746 import.meta.url,
747 ),
748 modelSelection: GROK_MODEL_SELECTION,
749 runtimePolicyOverride: READ_ONLY_ON_REQUEST_POLICY,
750 assertOutput: assertToolCallReadOnlyOnRequestGrokOutput,
751 },
752 {
753 driver: ProviderDriverKind.make("acpRegistry"),
754 transcriptFile: new URL(
755 "./tool_call_read_only_on_request/registry_transcript.ndjson",
756 import.meta.url,
757 ),
758 modelSelection: ACP_REGISTRY_MODEL_SELECTION,
759 runtimePolicyOverride: READ_ONLY_ON_REQUEST_POLICY,
760 assertOutput: assertToolCallReadOnlyOnRequestOutput,
761 },
762 ],
763 },
764 {
765 name: "tool_call_workspace_never",
766 buildInput: toolCallWorkspaceNeverInput,
767 providers: [
768 {
769 driver: ProviderDriverKind.make("codex"),
770 transcriptFile: new URL(
771 "./tool_call_workspace_never/codex_transcript.ndjson",
772 import.meta.url,
773 ),
774 modelSelection: CODEX_MODEL_SELECTION,
775 runtimePolicyOverride: WORKSPACE_NEVER_POLICY,
776 assertOutput: assertToolCallWorkspaceNeverOutput,
777 },
778 {
779 driver: ProviderDriverKind.make("claudeAgent"),
780 transcriptFile: new URL(
781 "./tool_call_workspace_never/claude_transcript.ndjson",
782 import.meta.url,
783 ),
784 modelSelection: CLAUDE_MODEL_SELECTION,
785 runtimePolicyOverride: WORKSPACE_NEVER_POLICY,
786 assertOutput: assertToolCallWorkspaceNeverClaudeOutput,
787 },
788 ],
789 },
790 {
791 name: "tool_call_restricted_granular",
792 buildInput: toolCallRestrictedGranularInput,
793 providers: [
794 {
795 driver: ProviderDriverKind.make("codex"),
796 transcriptFile: new URL(
797 "./tool_call_restricted_granular/codex_transcript.ndjson",
798 import.meta.url,
799 ),
800 // gpt-6 models write through the shell; gpt-5.6-terra's apply_patch raises the
801 // file-change approval this fixture covers.
802 modelSelection: { ...CODEX_MODEL_SELECTION, model: "gpt-5.6-terra" },
803 runtimePolicyOverride: RESTRICTED_GRANULAR_POLICY,
804 assertOutput: assertToolCallRestrictedGranularOutput,
805 },
806 {
807 driver: ProviderDriverKind.make("claudeAgent"),
808 transcriptFile: new URL(
809 "./tool_call_restricted_granular/claude_transcript.ndjson",
810 import.meta.url,
811 ),
812 modelSelection: CLAUDE_MODEL_SELECTION,
813 runtimePolicyOverride: RESTRICTED_GRANULAR_POLICY,
814 assertOutput: assertToolCallRestrictedGranularClaudeOutput,
815 },
816 ],
817 },
818 {
819 name: "subagent",
820 buildInput: subagentInput,
821 providers: [
822 {
823 driver: ProviderDriverKind.make("codex"),
824 transcriptFile: new URL("./subagent/codex_transcript.ndjson", import.meta.url),
825 // gpt-5.6-luna still runs multi-agent v1 (collabAgentToolCall); subagent_v2 covers v2.
826 modelSelection: { ...CODEX_MODEL_SELECTION, model: "gpt-5.6-luna" },
827 runtimePolicyOverride: READ_ONLY_ON_REQUEST_POLICY,
828 assertOutput: assertSubagentOutput,
829 },
830 {
831 driver: ProviderDriverKind.make("claudeAgent"),
832 transcriptFile: new URL("./subagent/claude_transcript.ndjson", import.meta.url),
833 modelSelection: CLAUDE_MODEL_SELECTION,
834 assertOutput: assertClaudeSubagentOutput,
835 },
836 {
837 driver: ProviderDriverKind.make("cursor"),
838 transcriptFile: new URL("./subagent/cursor_transcript.ndjson", import.meta.url),
839 modelSelection: CURSOR_MODEL_SELECTION,
840 runtimePolicyOverride: READ_ONLY_NEVER_POLICY,
841 assertOutput: assertCursorSubagentOutput,
842 },
843 ],
844 },
845 {
846 name: "subagent_continue",
847 buildInput: subagentContinueInput,
848 providers: [
849 {
850 driver: ProviderDriverKind.make("codex"),
851 transcriptFile: new URL("./subagent_continue/codex_transcript.ndjson", import.meta.url),
852 // gpt-5.6-luna still runs multi-agent v1 (collabAgentToolCall); subagent_v2 covers v2.
853 modelSelection: { ...CODEX_MODEL_SELECTION, model: "gpt-5.6-luna" },
854 assertOutput: assertSubagentContinueOutput,
855 },
856 ],
857 },
858 {
859 name: "subagent_v2",
860 buildInput: subagentV2Input,
861 providers: [
862 {
863 driver: ProviderDriverKind.make("codex"),
864 transcriptFile: new URL("./subagent_v2/codex_transcript.ndjson", import.meta.url),
865 modelSelection: CODEX_MODEL_SELECTION,
866 assertOutput: assertSubagentV2Output,
867 },
868 {
869 driver: ProviderDriverKind.make("muse"),
870 transcriptFile: new URL("./subagent_v2/muse_transcript.ndjson", import.meta.url),
871 modelSelection: MUSE_MODEL_SELECTION,
872 assertOutput: assertMuseSubagentV2Output,
873 },
874 ],
875 },
876 {
877 name: "subagent_v2_approval",
878 buildInput: subagentV2ApprovalInput,
879 providers: [
880 {
881 driver: ProviderDriverKind.make("codex"),
882 transcriptFile: new URL("./subagent_v2_approval/codex_transcript.ndjson", import.meta.url),
883 modelSelection: CODEX_MODEL_SELECTION,
884 runtimePolicyOverride: SUBAGENT_V2_APPROVAL_POLICY,
885 assertOutput: assertSubagentV2ApprovalOutput,
886 },
887 ],
888 },
889 {
890 name: "subagent_v2_nested",
891 buildInput: subagentV2NestedInput,
892 providers: [
893 {
894 driver: ProviderDriverKind.make("codex"),
895 transcriptFile: new URL("./subagent_v2_nested/codex_transcript.ndjson", import.meta.url),
896 modelSelection: CODEX_MODEL_SELECTION,
897 assertOutput: assertSubagentV2NestedOutput,
898 },
899 ],
900 },
901 {
902 name: "subagent_v2_nested_approval",
903 buildInput: subagentV2NestedApprovalInput,
904 providers: [
905 {
906 driver: ProviderDriverKind.make("codex"),
907 transcriptFile: new URL(
908 "./subagent_v2_nested_approval/codex_transcript.ndjson",
909 import.meta.url,
910 ),
911 modelSelection: CODEX_MODEL_SELECTION,
912 runtimePolicyOverride: SUBAGENT_V2_APPROVAL_POLICY,
913 assertOutput: assertSubagentV2NestedApprovalOutput,
914 },
915 ],
916 },
917 {
918 name: "opencode_subagent",
919 buildInput: openCodeSubagentInput,
920 providers: [
921 {
922 driver: ProviderDriverKind.make("opencode"),
923 transcriptFile: new URL("./opencode_subagent/opencode_transcript.ndjson", import.meta.url),
924 modelSelection: OPENCODE_MODEL_SELECTION,
925 assertOutput: assertOpenCodeSubagentOutput,
926 },
927 ],
928 },
929 // OpenCode 2 runtime of the same driver, recorded against 2.0.18 over HTTP and SSE.
930 {
931 name: "opencode2_simple",
932 buildInput: openCode2SimpleInput,
933 providers: [
934 {
935 driver: ProviderDriverKind.make("opencode"),
936 transcriptFile: new URL("./opencode2_simple/opencode_transcript.ndjson", import.meta.url),
937 modelSelection: OPENCODE2_MODEL_SELECTION,
938 assertOutput: assertOpenCode2SimpleOutput,
939 },
940 ],
941 },
942 {
943 name: "opencode2_tool_call",
944 buildInput: openCode2ToolCallInput,
945 providers: [
946 {
947 driver: ProviderDriverKind.make("opencode"),
948 transcriptFile: new URL(
949 "./opencode2_tool_call/opencode_transcript.ndjson",
950 import.meta.url,
951 ),
952 modelSelection: {
953 instanceId: OPENCODE2_MODEL_SELECTION.instanceId,
954 model: "opencode/big-pickle",
955 },
956 assertOutput: assertOpenCode2ToolCallOutput,
957 },
958 ],
959 },
960 {
961 name: "opencode2_interrupt",
962 buildInput: openCode2InterruptInput,
963 providers: [
964 {
965 driver: ProviderDriverKind.make("opencode"),
966 transcriptFile: new URL(
967 "./opencode2_interrupt/opencode_transcript.ndjson",
968 import.meta.url,
969 ),
970 modelSelection: {
971 instanceId: OPENCODE2_MODEL_SELECTION.instanceId,
972 model: "opencode/big-pickle",
973 },
974 assertOutput: assertOpenCode2InterruptOutput,
975 },
976 ],
977 },
978 {
979 name: "opencode2_inbox",
980 buildInput: openCode2InboxInput,
981 providers: [
982 {
983 driver: ProviderDriverKind.make("opencode"),
984 transcriptFile: new URL("./opencode2_inbox/opencode_transcript.ndjson", import.meta.url),
985 modelSelection: {
986 instanceId: OPENCODE2_MODEL_SELECTION.instanceId,
987 model: "opencode/big-pickle",
988 },
989 assertOutput: assertOpenCode2InboxOutput,
990 },
991 ],
992 },
993 {
994 name: "opencode2_revert",
995 buildInput: openCode2RevertInput,
996 providers: [
997 {
998 driver: ProviderDriverKind.make("opencode"),
999 transcriptFile: new URL("./opencode2_revert/opencode_transcript.ndjson", import.meta.url),
1000 modelSelection: {
1001 instanceId: OPENCODE2_MODEL_SELECTION.instanceId,
1002 model: "opencode/big-pickle",
1003 },
1004 assertOutput: assertOpenCode2RevertOutput,
1005 },
1006 ],
1007 },
1008 {
1009 name: "opencode2_permission",
1010 buildInput: openCode2PermissionInput,
1011 providers: [
1012 {
1013 driver: ProviderDriverKind.make("opencode"),
1014 transcriptFile: new URL(
1015 "./opencode2_permission/opencode_transcript.ndjson",
1016 import.meta.url,
1017 ),
1018 modelSelection: {
1019 instanceId: OPENCODE2_MODEL_SELECTION.instanceId,
1020 model: "opencode/big-pickle",
1021 },
1022 assertOutput: assertOpenCode2PermissionOutput,
1023 },
1024 ],
1025 },
1026 {
1027 name: "opencode2_question",
1028 buildInput: openCode2QuestionInput,
1029 providers: [
1030 {
1031 driver: ProviderDriverKind.make("opencode"),
1032 transcriptFile: new URL("./opencode2_question/opencode_transcript.ndjson", import.meta.url),
1033 modelSelection: {
1034 instanceId: OPENCODE2_MODEL_SELECTION.instanceId,
1035 model: "opencode/big-pickle",
1036 },
1037 assertOutput: assertOpenCode2QuestionOutput,
1038 },
1039 ],
1040 },
1041 {
1042 name: "opencode2_subagent",
1043 buildInput: openCode2SubagentInput,
1044 providers: [
1045 {
1046 driver: ProviderDriverKind.make("opencode"),
1047 transcriptFile: new URL("./opencode2_subagent/opencode_transcript.ndjson", import.meta.url),
1048 modelSelection: {
1049 instanceId: OPENCODE2_MODEL_SELECTION.instanceId,
1050 model: "opencode/big-pickle",
1051 },
1052 assertOutput: assertOpenCode2SubagentOutput,
1053 },
1054 ],
1055 },
1056 {
1057 name: "opencode2_background",
1058 buildInput: openCode2BackgroundInput,
1059 providers: [
1060 {
1061 driver: ProviderDriverKind.make("opencode"),
1062 transcriptFile: new URL(
1063 "./opencode2_background/opencode_transcript.ndjson",
1064 import.meta.url,
1065 ),
1066 modelSelection: {
1067 instanceId: OPENCODE2_MODEL_SELECTION.instanceId,
1068 model: "opencode/big-pickle",
1069 },
1070 runContinuationWorker: true,
1071 assertOutput: assertOpenCode2BackgroundOutput,
1072 },
1073 ],
1074 },
1075 {
1076 name: "opencode2_nested_background",
1077 buildInput: openCode2NestedBackgroundInput,
1078 providers: [
1079 {
1080 driver: ProviderDriverKind.make("opencode"),
1081 transcriptFile: new URL(
1082 "./opencode2_nested_background/opencode_transcript.ndjson",
1083 import.meta.url,
1084 ),
1085 modelSelection: {
1086 instanceId: OPENCODE2_MODEL_SELECTION.instanceId,
1087 model: "openrouter/deepseek/deepseek-v4-flash",
1088 },
1089 assertOutput: assertOpenCode2NestedBackgroundOutput,
1090 },
1091 ],
1092 },
1093 {
1094 name: "opencode2_compaction",
1095 buildInput: openCode2CompactionInput,
1096 providers: [
1097 {
1098 driver: ProviderDriverKind.make("opencode"),
1099 transcriptFile: new URL(
1100 "./opencode2_compaction/opencode_transcript.ndjson",
1101 import.meta.url,
1102 ),
1103 modelSelection: {
1104 instanceId: OPENCODE2_MODEL_SELECTION.instanceId,
1105 model: "opencode/big-pickle",
1106 },
1107 assertOutput: assertOpenCode2CompactionOutput,
1108 },
1109 ],
1110 },
1111 {
1112 name: "opencode2_resume_after_restart",
1113 buildInput: openCode2ResumeAfterRestartInput,
1114 providers: [
1115 {
1116 driver: ProviderDriverKind.make("opencode"),
1117 transcriptFile: new URL(
1118 "./opencode2_resume_after_restart/opencode_transcript.ndjson",
1119 import.meta.url,
1120 ),
1121 modelSelection: {
1122 instanceId: OPENCODE2_MODEL_SELECTION.instanceId,
1123 model: "opencode/big-pickle",
1124 },
1125 assertOutput: assertOpenCode2ResumeAfterRestartOutput,
1126 },
1127 ],
1128 },
1129 // Recorded live against 2.0.18 on OpenRouter with the workspace's own command and skill.
1130 ...(
1131 [
1132 ["opencode2_command", openCode2CommandInput, assertOpenCode2CommandOutput],
1133 ["opencode2_skill", openCode2SkillInput, assertOpenCode2SkillOutput],
1134 ] as const
1135 ).map(([name, buildInput, assertOutput]) => ({
1136 name,
1137 buildInput,
1138 providers: [
1139 {
1140 driver: ProviderDriverKind.make("opencode"),
1141 transcriptFile: new URL(`./${name}/opencode_transcript.ndjson`, import.meta.url),
1142 modelSelection: {
1143 instanceId: OPENCODE2_MODEL_SELECTION.instanceId,
1144 model: "openrouter/deepseek/deepseek-v4-flash",
1145 },
1146 assertOutput,
1147 },
1148 ],
1149 })),
1150 {
1151 name: "opencode_child_approval",
1152 buildInput: openCodeChildApprovalInput,
1153 providers: [
1154 {
1155 driver: ProviderDriverKind.make("opencode"),
1156 transcriptFile: new URL(
1157 "./opencode_child_approval/opencode_transcript.ndjson",
1158 import.meta.url,
1159 ),
1160 modelSelection: OPENCODE_MODEL_SELECTION,
1161 assertOutput: assertOpenCodeChildApprovalOutput,
1162 },
1163 ],
1164 },
1165 {
1166 name: "opencode_running_child_approval",
1167 buildInput: openCodeRunningChildApprovalInput,
1168 providers: [
1169 {
1170 driver: ProviderDriverKind.make("opencode"),
1171 transcriptFile: new URL(
1172 "./opencode_running_child_approval/opencode_transcript.ndjson",
1173 import.meta.url,
1174 ),
1175 modelSelection: OPENCODE_MODEL_SELECTION,
1176 assertOutput: assertOpenCodeRunningChildApprovalOutput,
1177 },
1178 ],
1179 },
1180 {
1181 name: "multi_turn",
1182 buildInput: multiTurnInput,
1183 providers: [
1184 {
1185 driver: ProviderDriverKind.make("codex"),
1186 transcriptFile: new URL("./multi_turn/codex_transcript.ndjson", import.meta.url),
1187 modelSelection: CODEX_MODEL_SELECTION,
1188 assertOutput: assertMultiTurnOutput,
1189 },
1190 {
1191 driver: ProviderDriverKind.make("claudeAgent"),
1192 transcriptFile: new URL("./multi_turn/claude_transcript.ndjson", import.meta.url),
1193 modelSelection: CLAUDE_MODEL_SELECTION,
1194 assertOutput: assertMultiTurnClaudeOutput,
1195 },
1196 {
1197 driver: ProviderDriverKind.make("cursor"),
1198 transcriptFile: new URL("./multi_turn/cursor_transcript.ndjson", import.meta.url),
1199 modelSelection: CURSOR_MODEL_SELECTION,
1200 assertOutput: assertMultiTurnOutput,
1201 },
1202 {
1203 driver: ProviderDriverKind.make("grok"),
1204 transcriptFile: new URL("./multi_turn/grok_transcript.ndjson", import.meta.url),
1205 modelSelection: GROK_MODEL_SELECTION,
1206 assertOutput: assertMultiTurnOutput,
1207 },
1208 {
1209 driver: ProviderDriverKind.make("acpRegistry"),
1210 transcriptFile: new URL("./multi_turn/registry_transcript.ndjson", import.meta.url),
1211 modelSelection: ACP_REGISTRY_MODEL_SELECTION,
1212 assertOutput: assertMultiTurnOutput,
1213 },
1214 {
1215 driver: ProviderDriverKind.make("pi"),
1216 transcriptFile: new URL("./multi_turn/pi_transcript.ndjson", import.meta.url),
1217 modelSelection: PI_MODEL_SELECTION,
1218 assertOutput: assertPiMultiTurnOutput,
1219 },
1220 {
1221 driver: ProviderDriverKind.make("muse"),
1222 transcriptFile: new URL("./multi_turn/muse_transcript.ndjson", import.meta.url),
1223 modelSelection: MUSE_MODEL_SELECTION,
1224 assertOutput: assertMuseMultiTurnOutput,
1225 },
1226 ],
1227 },
1228 {
1229 name: "muse_permission",
1230 buildInput: musePermissionInput,
1231 providers: [
1232 {
1233 driver: ProviderDriverKind.make("muse"),
1234 transcriptFile: new URL("./muse_permission/muse_transcript.ndjson", import.meta.url),
1235 modelSelection: MUSE_MODEL_SELECTION,
1236 expectedAbsentWorkspacePaths: [MUSE_PERMISSION_DECLINED_FILE],
1237 assertOutput: assertMusePermissionOutput,
1238 },
1239 ],
1240 },
1241 {
1242 name: "muse_subagent_approval",
1243 buildInput: museSubagentApprovalInput,
1244 providers: [
1245 {
1246 driver: ProviderDriverKind.make("muse"),
1247 transcriptFile: new URL("./muse_subagent_approval/muse_transcript.ndjson", import.meta.url),
1248 modelSelection: MUSE_MODEL_SELECTION,
1249 assertOutput: assertMuseSubagentApprovalOutput,
1250 },
1251 ],
1252 },
1253 {
1254 name: "muse_subagent_interrupt",
1255 buildInput: museSubagentInterruptInput,
1256 providers: [
1257 {
1258 driver: ProviderDriverKind.make("muse"),
1259 transcriptFile: new URL(
1260 "./muse_subagent_interrupt/muse_transcript.ndjson",
1261 import.meta.url,
1262 ),
1263 modelSelection: MUSE_MODEL_SELECTION,
1264 assertOutput: assertMuseSubagentInterruptOutput,
1265 },
1266 ],
1267 },
1268 {
1269 name: "muse_workflow",
1270 buildInput: museWorkflowInput,
1271 providers: [
1272 {
1273 driver: ProviderDriverKind.make("muse"),
1274 transcriptFile: new URL("./muse_workflow/muse_transcript.ndjson", import.meta.url),
1275 modelSelection: MUSE_MODEL_SELECTION,
1276 runContinuationWorker: true,
1277 assertOutput: assertMuseWorkflowOutput,
1278 },
1279 ],
1280 },
1281 {
1282 name: "pi_compaction",
1283 buildInput: piCompactionInput,
1284 providers: [
1285 {
1286 driver: ProviderDriverKind.make("pi"),
1287 transcriptFile: new URL("./pi_compaction/pi_transcript.ndjson", import.meta.url),
1288 modelSelection: PI_MODEL_SELECTION,
1289 assertOutput: assertPiCompactionOutput,
1290 },
1291 ],
1292 },
1293 {
1294 name: "provider_thread_resume",
1295 buildInput: providerThreadResumeInput,
1296 providers: [
1297 {
1298 driver: ProviderDriverKind.make("pi"),
1299 transcriptFile: new URL("./provider_thread_resume/pi_transcript.ndjson", import.meta.url),
1300 modelSelection: PI_MODEL_SELECTION,
1301 assertOutput: assertPiProviderThreadResumeOutput,
1302 },
1303 ],
1304 },
1305 {
1306 name: "multi_turn_restart",
1307 buildInput: multiTurnInput,
1308 providers: [
1309 {
1310 driver: ProviderDriverKind.make("claudeAgent"),
1311 transcriptFile: new URL("./multi_turn_restart/claude_transcript.ndjson", import.meta.url),
1312 modelSelection: CLAUDE_MODEL_SELECTION,
1313 assertOutput: assertMultiTurnClaudeOutput,
1314 },
1315 ],
1316 },
1317 {
1318 name: "queued_cancelled_while_active",
1319 buildInput: queuedCancelledWhileActiveInput,
1320 providers: [
1321 {
1322 driver: ProviderDriverKind.make("codex"),
1323 transcriptFile: new URL("./queued_turn/codex_transcript.ndjson", import.meta.url),
1324 recordedScenario: "queued_turn",
1325 transcriptEntriesThroughLabel: "turn/completed",
1326 modelSelection: CODEX_MODEL_SELECTION,
1327 assertOutput: assertQueuedCancelledWhileActiveOutput,
1328 },
1329 ],
1330 },
1331 {
1332 name: "queued_turn",
1333 buildInput: queuedTurnInput,
1334 providers: [
1335 {
1336 driver: ProviderDriverKind.make("codex"),
1337 transcriptFile: new URL("./queued_turn/codex_transcript.ndjson", import.meta.url),
1338 modelSelection: CODEX_MODEL_SELECTION,
1339 assertOutput: assertQueuedTurnOutput,
1340 },
1341 {
1342 driver: ProviderDriverKind.make("claudeAgent"),
1343 transcriptFile: new URL("./queued_turn/claude_transcript.ndjson", import.meta.url),
1344 modelSelection: CLAUDE_MODEL_SELECTION,
1345 assertOutput: assertQueuedTurnOutput,
1346 },
1347 {
1348 driver: ProviderDriverKind.make("cursor"),
1349 transcriptFile: new URL("./queued_turn/cursor_transcript.ndjson", import.meta.url),
1350 modelSelection: CURSOR_MODEL_SELECTION,
1351 assertOutput: assertQueuedTurnOutput,
1352 },
1353 {
1354 driver: ProviderDriverKind.make("grok"),
1355 transcriptFile: new URL("./queued_turn/grok_transcript.ndjson", import.meta.url),
1356 modelSelection: GROK_MODEL_SELECTION,
1357 assertOutput: assertQueuedTurnOutput,
1358 },
1359 {
1360 driver: ProviderDriverKind.make("acpRegistry"),
1361 transcriptFile: new URL("./queued_turn/registry_transcript.ndjson", import.meta.url),
1362 modelSelection: ACP_REGISTRY_MODEL_SELECTION,
1363 assertOutput: assertQueuedTurnOutput,
1364 },
1365 ],
1366 },
1367 {
1368 name: "todo_list",
1369 buildInput: todoListInput,
1370 providers: [
1371 {
1372 driver: ProviderDriverKind.make("codex"),
1373 transcriptFile: new URL("./todo_list/codex_transcript.ndjson", import.meta.url),
1374 modelSelection: CODEX_MODEL_SELECTION,
1375 runtimePolicyOverride: READ_ONLY_NEVER_POLICY,
1376 assertOutput: assertTodoListOutput,
1377 },
1378 {
1379 driver: ProviderDriverKind.make("cursor"),
1380 transcriptFile: new URL("./todo_list/cursor_transcript.ndjson", import.meta.url),
1381 modelSelection: CURSOR_MODEL_SELECTION,
1382 runtimePolicyOverride: READ_ONLY_NEVER_POLICY,
1383 assertOutput: assertTodoListCursorOutput,
1384 },
1385 {
1386 driver: ProviderDriverKind.make("grok"),
1387 transcriptFile: new URL("./todo_list/grok_transcript.ndjson", import.meta.url),
1388 modelSelection: GROK_MODEL_SELECTION,
1389 assertOutput: assertTodoListGrokOutput,
1390 },
1391 {
1392 driver: ProviderDriverKind.make("acpRegistry"),
1393 transcriptFile: new URL("./todo_list/registry_transcript.ndjson", import.meta.url),
1394 modelSelection: ACP_REGISTRY_MODEL_SELECTION,
1395 assertOutput: assertTodoListGrokOutput,
1396 },
1397 ],
1398 },
1399 {
1400 name: "web_search",
1401 buildInput: webSearchInput,
1402 providers: [
1403 {
1404 driver: ProviderDriverKind.make("codex"),
1405 transcriptFile: new URL("./web_search/codex_transcript.ndjson", import.meta.url),
1406 modelSelection: CODEX_MODEL_SELECTION,
1407 assertOutput: assertWebSearchOutput,
1408 },
1409 {
1410 driver: ProviderDriverKind.make("claudeAgent"),
1411 transcriptFile: new URL("./web_search/claude_transcript.ndjson", import.meta.url),
1412 modelSelection: CLAUDE_MODEL_SELECTION,
1413 assertOutput: assertClaudeWebSearchOutput,
1414 },
1415 ],
1416 },
1417 {
1418 name: "plan_questions",
1419 buildInput: planQuestionsInput,
1420 providers: [
1421 {
1422 driver: ProviderDriverKind.make("codex"),
1423 transcriptFile: new URL("./plan_questions/codex_transcript.ndjson", import.meta.url),
1424 modelSelection: CODEX_MODEL_SELECTION,
1425 runtimePolicyOverride: READ_ONLY_NEVER_POLICY,
1426 assertOutput: assertCodexPlanQuestionsOutput,
1427 },
1428 {
1429 driver: ProviderDriverKind.make("grok"),
1430 transcriptFile: new URL("./plan_questions/grok_transcript.ndjson", import.meta.url),
1431 modelSelection: GROK_MODEL_SELECTION,
1432 runtimePolicyOverride: READ_ONLY_NEVER_POLICY,
1433 assertOutput: assertPlanQuestionsOutput,
1434 },
1435 {
1436 driver: ProviderDriverKind.make("opencode"),
1437 transcriptFile: new URL("./plan_questions/opencode_transcript.ndjson", import.meta.url),
1438 modelSelection: OPENCODE_MODEL_SELECTION,
1439 runtimePolicyOverride: READ_ONLY_NEVER_POLICY,
1440 assertOutput: assertOpenCodePlanQuestionsOutput,
1441 },
1442 ],
1443 },
1444 {
1445 name: "proposed_plan",
1446 buildInput: proposedPlanInput,
1447 providers: [
1448 {
1449 driver: ProviderDriverKind.make("codex"),
1450 transcriptFile: new URL("./proposed_plan/codex_transcript.ndjson", import.meta.url),
1451 modelSelection: CODEX_MODEL_SELECTION,
1452 runtimePolicyOverride: READ_ONLY_NEVER_POLICY,
1453 assertOutput: assertProposedPlanOutput,
1454 },
1455 {
1456 driver: ProviderDriverKind.make("cursor"),
1457 transcriptFile: new URL("./proposed_plan/cursor_transcript.ndjson", import.meta.url),
1458 modelSelection: CURSOR_MODEL_SELECTION,
1459 runtimePolicyOverride: READ_ONLY_NEVER_POLICY,
1460 assertOutput: assertProposedPlanCursorOutput,
1461 },
1462 ],
1463 },
1464 {
1465 name: "message_steering",
1466 buildInput: messageSteeringInput,
1467 providers: [
1468 {
1469 driver: ProviderDriverKind.make("codex"),
1470 transcriptFile: new URL("./message_steering/codex_transcript.ndjson", import.meta.url),
1471 modelSelection: CODEX_MODEL_SELECTION,
1472 assertOutput: assertMessageSteeringOutput,
1473 },
1474 {
1475 driver: ProviderDriverKind.make("claudeAgent"),
1476 transcriptFile: new URL("./message_steering/claude_transcript.ndjson", import.meta.url),
1477 modelSelection: CLAUDE_MODEL_SELECTION,
1478 assertOutput: assertClaudeMessageSteeringOutput,
1479 },
1480 {
1481 driver: ProviderDriverKind.make("cursor"),
1482 transcriptFile: new URL("./message_steering/cursor_transcript.ndjson", import.meta.url),
1483 modelSelection: CURSOR_MODEL_SELECTION,
1484 assertOutput: assertCursorMessageSteeringOutput,
1485 },
1486 {
1487 driver: ProviderDriverKind.make("grok"),
1488 transcriptFile: new URL("./message_steering/grok_transcript.ndjson", import.meta.url),
1489 modelSelection: GROK_MODEL_SELECTION,
1490 assertOutput: assertGrokMessageSteeringOutput,
1491 },
1492 {
1493 driver: ProviderDriverKind.make("acpRegistry"),
1494 transcriptFile: new URL("./message_steering/registry_transcript.ndjson", import.meta.url),
1495 modelSelection: ACP_REGISTRY_MODEL_SELECTION,
1496 assertOutput: assertGrokMessageSteeringOutput,
1497 },
1498 {
1499 driver: ProviderDriverKind.make("pi"),
1500 transcriptFile: new URL("./message_steering/pi_transcript.ndjson", import.meta.url),
1501 modelSelection: PI_MODEL_SELECTION,
1502 assertOutput: assertPiMessageSteeringOutput,
1503 },
1504 ],
1505 },
1506 {
1507 name: "turn_interrupt",
1508 buildInput: turnInterruptInput,
1509 providers: [
1510 {
1511 driver: ProviderDriverKind.make("codex"),
1512 transcriptFile: new URL("./turn_interrupt/codex_transcript.ndjson", import.meta.url),
1513 modelSelection: CODEX_MODEL_SELECTION,
1514 runtimePolicyOverride: WORKSPACE_NEVER_POLICY,
1515 assertOutput: assertTurnInterruptOutput,
1516 },
1517 {
1518 driver: ProviderDriverKind.make("claudeAgent"),
1519 transcriptFile: new URL("./turn_interrupt/claude_transcript.ndjson", import.meta.url),
1520 modelSelection: CLAUDE_MODEL_SELECTION,
1521 runtimePolicyOverride: WORKSPACE_NEVER_POLICY,
1522 assertOutput: assertTurnInterruptClaudeOutput,
1523 },
1524 {
1525 driver: ProviderDriverKind.make("grok"),
1526 transcriptFile: new URL("./turn_interrupt/grok_transcript.ndjson", import.meta.url),
1527 modelSelection: GROK_MODEL_SELECTION,
1528 runtimePolicyOverride: WORKSPACE_NEVER_POLICY,
1529 assertOutput: assertTurnInterruptOutput,
1530 },
1531 {
1532 driver: ProviderDriverKind.make("acpRegistry"),
1533 transcriptFile: new URL("./turn_interrupt/registry_transcript.ndjson", import.meta.url),
1534 modelSelection: ACP_REGISTRY_MODEL_SELECTION,
1535 runtimePolicyOverride: WORKSPACE_NEVER_POLICY,
1536 assertOutput: assertTurnInterruptOutput,
1537 },
1538 {
1539 driver: ProviderDriverKind.make("opencode"),
1540 transcriptFile: new URL("./turn_interrupt/opencode_transcript.ndjson", import.meta.url),
1541 modelSelection: OPENCODE_MODEL_SELECTION,
1542 runtimePolicyOverride: WORKSPACE_NEVER_POLICY,
1543 assertOutput: assertTurnInterruptOutput,
1544 },
1545 {
1546 driver: ProviderDriverKind.make("muse"),
1547 transcriptFile: new URL("./turn_interrupt/muse_transcript.ndjson", import.meta.url),
1548 modelSelection: MUSE_MODEL_SELECTION,
1549 assertOutput: assertMuseTurnInterruptOutput,
1550 },
1551 ],
1552 },
1553 {
1554 name: "turn_interrupt_mid_tool",
1555 buildInput: turnInterruptMidToolInput,
1556 providers: [
1557 {
1558 driver: ProviderDriverKind.make("codex"),
1559 transcriptFile: new URL(
1560 "./turn_interrupt_mid_tool/codex_transcript.ndjson",
1561 import.meta.url,
1562 ),
1563 modelSelection: CODEX_MODEL_SELECTION,
1564 runtimePolicyOverride: WORKSPACE_NEVER_POLICY,
1565 assertOutput: assertTurnInterruptMidToolCodexOutput,
1566 },
1567 {
1568 driver: ProviderDriverKind.make("claudeAgent"),
1569 transcriptFile: new URL(
1570 "./turn_interrupt_mid_tool/claude_transcript.ndjson",
1571 import.meta.url,
1572 ),
1573 modelSelection: CLAUDE_MODEL_SELECTION,
1574 runtimePolicyOverride: WORKSPACE_NEVER_POLICY,
1575 assertOutput: assertTurnInterruptMidToolClaudeOutput,
1576 },
1577 {
1578 driver: ProviderDriverKind.make("cursor"),
1579 transcriptFile: new URL(
1580 "./turn_interrupt_mid_tool/cursor_transcript.ndjson",
1581 import.meta.url,
1582 ),
1583 modelSelection: CURSOR_MODEL_SELECTION,
1584 runtimePolicyOverride: WORKSPACE_NEVER_POLICY,
1585 assertOutput: assertTurnInterruptMidToolCursorOutput,
1586 },
1587 {
1588 driver: ProviderDriverKind.make("pi"),
1589 transcriptFile: new URL("./turn_interrupt_mid_tool/pi_transcript.ndjson", import.meta.url),
1590 modelSelection: PI_MODEL_SELECTION,
1591 assertOutput: assertTurnInterruptMidToolPiOutput,
1592 },
1593 ],
1594 },
1595 {
1596 name: "turn_interrupt_restart",
1597 buildInput: turnInterruptRestartInput,
1598 providers: [
1599 {
1600 driver: ProviderDriverKind.make("claudeAgent"),
1601 transcriptFile: new URL(
1602 "./turn_interrupt_restart/claude_transcript.ndjson",
1603 import.meta.url,
1604 ),
1605 modelSelection: CLAUDE_MODEL_SELECTION,
1606 runtimePolicyOverride: WORKSPACE_NEVER_POLICY,
1607 assertOutput: assertTurnInterruptRestartClaudeOutput,
1608 },
1609 ],
1610 },
1611 {
1612 name: "thread_rollback",
1613 buildInput: threadRollbackInput,
1614 providers: [
1615 {
1616 driver: ProviderDriverKind.make("codex"),
1617 transcriptFile: new URL("./thread_rollback/codex_transcript.ndjson", import.meta.url),
1618 modelSelection: CODEX_MODEL_SELECTION,
1619 assertOutput: assertThreadRollbackOutput,
1620 },
1621 {
1622 driver: ProviderDriverKind.make("claudeAgent"),
1623 transcriptFile: new URL("./thread_rollback/claude_transcript.ndjson", import.meta.url),
1624 modelSelection: CLAUDE_MODEL_SELECTION,
1625 assertOutput: assertClaudeThreadRollbackOutput,
1626 },
1627 {
1628 driver: ProviderDriverKind.make("pi"),
1629 transcriptFile: new URL("./thread_rollback/pi_transcript.ndjson", import.meta.url),
1630 modelSelection: PI_MODEL_SELECTION,
1631 assertOutput: assertPiThreadRollbackOutput,
1632 },
1633 ],
1634 },
1635 {
1636 name: "thread_rollback_after_restart",
1637 buildInput: threadRollbackAfterRestartInput,
1638 providers: [
1639 {
1640 driver: ProviderDriverKind.make("codex"),
1641 transcriptFile: new URL(
1642 "./thread_rollback_after_restart/codex_transcript.ndjson",
1643 import.meta.url,
1644 ),
1645 modelSelection: CODEX_MODEL_SELECTION,
1646 assertOutput: assertThreadRollbackAfterRestartOutput,
1647 },
1648 ],
1649 },
1650 {
1651 name: "thread_rollback_after_stop",
1652 buildInput: threadRollbackAfterStopInput,
1653 providers: [
1654 {
1655 driver: ProviderDriverKind.make("pi"),
1656 transcriptFile: new URL(
1657 "./thread_rollback_after_stop/pi_transcript.ndjson",
1658 import.meta.url,
1659 ),
1660 modelSelection: PI_MODEL_SELECTION,
1661 assertOutput: assertPiThreadRollbackAfterStopOutput,
1662 },
1663 ],
1664 },
1665 {
1666 name: "thread_rollback_to_stopped_turn",
1667 buildInput: threadRollbackToStoppedTurnInput,
1668 providers: [
1669 {
1670 driver: ProviderDriverKind.make("codex"),
1671 transcriptFile: new URL(
1672 "./thread_rollback_to_stopped_turn/codex_transcript.ndjson",
1673 import.meta.url,
1674 ),
1675 modelSelection: CODEX_MODEL_SELECTION,
1676 runtimePolicyOverride: WORKSPACE_NEVER_POLICY,
1677 assertOutput: assertThreadRollbackToStoppedTurnOutput,
1678 },
1679 ],
1680 },
1681 {
1682 name: "stop_background_work_after_failed_turn",
1683 buildInput: stopBackgroundWorkAfterFailedTurnInput,
1684 providers: [
1685 {
1686 driver: ProviderDriverKind.make("acpRegistry"),
1687 transcriptFile: new URL(
1688 "./stop_background_work_after_failed_turn/registry_transcript.ndjson",
1689 import.meta.url,
1690 ),
1691 modelSelection: ACP_REGISTRY_MODEL_SELECTION,
1692 assertOutput: assertStopBackgroundWorkAfterFailedTurnOutput,
1693 },
1694 ],
1695 },
1696 {
1697 name: "stop_background_work_after_release",
1698 buildInput: stopBackgroundWorkAfterReleaseInput,
1699 providers: [
1700 {
1701 driver: ProviderDriverKind.make("acpRegistry"),
1702 transcriptFile: new URL(
1703 "./stop_background_work_after_failed_turn/registry_transcript.ndjson",
1704 import.meta.url,
1705 ),
1706 recordedScenario: "stop_background_work_after_failed_turn",
1707 modelSelection: ACP_REGISTRY_MODEL_SELECTION,
1708 assertOutput: assertStopBackgroundWorkAfterFailedTurnOutput,
1709 },
1710 ],
1711 },
1712];
1713
1714// TODO(claude-v2/context-transfer): add provider-switch handoff and return fixtures when portable
1715// context handoff is implemented. Cross-reference docs/orchestration-v2/provider-switching-and-context.md
1716// and docs/orchestration-v2/thread-lineage-and-context-transfer.md. The return fixture should
1717// prefer a delta handoff into an existing Claude provider thread.
1718
1719// TODO(claude-v2/context-transfer-fixtures): register provider-switch, merge-back, and cross-provider
1720// fork fixtures after each path has a real provider transcript. Cross-reference
1721// docs/orchestration-v2/provider-switching-and-context.md and
1722// docs/orchestration-v2/thread-lineage-and-context-transfer.md.