Skip to content
Source
Sign inSign up
Open History to see the last commit

threads-vs-tasks.ndjson

27 lines82.3 KB

1{"id": "tt-separate-thread-i-can-follow", "area": "orchestration", "kind": "guard", "pattern": "'separate thread' ask: new top-level thread", "experience": "Asked to put a second bug in a separate thread the user can follow, the agent must launch a top-level thread and link it, not delegate or fix it inline.", "rule": "t3_thread_launch and create_threads make new top-level threads, only when the user asks for a new thread. / In your reply, mention a thread by its link, verbatim.", "privacy": "commit-safe", "setup": {"role": "top", "priorTurns": [{"role": "user", "text": "The reconnect test in src/session.test.ts is flaky. Fix it."}, {"role": "assistant", "text": "Fixed: reconnect() now waits for the socket close event before it opens a new socket. 20 runs in a row pass."}], "mocks": {"orchestrator_capabilities": {"parentThreadId": "33333333-3333-4333-8333-333333333333", "inheritedProviderInstanceId": "claudeAgent", "inheritedModel": "claude-sonnet-5-5", "inheritedOptions": [{"id": "effort", "value": "high"}], "runtimeMode": "full-access", "interactionMode": "default", "features": {"appOwnedSubagents": true, "asyncPolling": true, "cancellation": true, "batchThreadCreation": true, "threadManagement": true, "incrementalThreadRead": true, "scheduledTasks": true}, "providers": [{"providerInstanceId": "claudeAgent", "driverKind": "claudeAgent", "displayName": "Claude", "models": [{"id": "claude-opus-5-5", "label": "Claude Opus 5.5", "options": [{"id": "effort", "values": ["low", "medium", "high", "xhigh", "max"], "default": "high"}, {"id": "fastMode", "type": "boolean", "default": false}]}, {"id": "claude-sonnet-5-5", "label": "Claude Sonnet 5.5", "options": [{"id": "effort", "values": ["low", "medium", "high", "xhigh", "max"], "default": "high"}]}, {"id": "claude-haiku-5-5", "label": "Claude Haiku 5.5", "options": [{"id": "effort", "values": ["low", "medium", "high", "xhigh", "max"], "default": "high"}]}]}, {"providerInstanceId": "codex", "driverKind": "codex", "displayName": "Codex", "models": [{"id": "gpt-6.1-sol", "label": "GPT-6.1 Sol", "options": [{"id": "reasoningEffort", "values": ["low", "medium", "high", "xhigh", "max"], "default": "high"}, {"id": "serviceTier", "values": ["default", "priority"], "default": "default"}]}]}, {"providerInstanceId": "muse", "driverKind": "muse", "displayName": "Muse Code", "runtimeModes": ["approval-required", "full-access"], "models": [{"id": "muse-wonder-full", "label": "Muse Wonder Full", "options": [{"id": "reasoningEffort", "values": ["minimal", "low", "medium", "high", "xhigh", "max"], "default": "high"}]}]}, {"providerInstanceId": "grok", "driverKind": "grok", "displayName": "Grok", "models": [{"id": "grok-4.7", "label": "Grok 4.7", "options": []}]}]}}, "world": {"files": {"src/session.ts": "export async function reconnect(socket: Socket) {\n await socket.close(); // resolves on the close event\n return openSocket(socket.url);\n}\n", "src/session.test.ts": "it('reconnects after close', async () => {\n const s = await connect();\n const next = await reconnect(s);\n expect(next.state).toBe('open');\n});\n", "src/export/csv.ts": "export function toCsv(rows: Row[]) {\n return rows.map((r) => [r.id, new Date(r.at).toLocaleString(), r.total].join(',')).join('\\n');\n}\n", "src/admin/session.ts": "export function createAdminSession(userId: string) {\n return { userId, createdAt: Date.now() }; // no expiresAt\n}\n", "docs/setup.md": "# Setup\n\n1. pnpm install\n2. pnpm dev\n"}}}, "prompt": "While I review that, put the CSV export timezone bug (src/export/csv.ts uses local time) in a separate thread I can follow on its own. Don't fix it here.", "expect": {"notCalls": ["delegate_task", "Agent"], "textMust": ["t3-thread://v2/eeeeeeee-eeee-4eee-8eee-eeeeeeeeeeee/00000000-0000-4000-8000-"], "newThreads": ["~csv"]}, "source": {"request": "juliusmarminge (maintainer) request, 2026-10-29; regression guard", "report": "15/15 field t3_thread_launch calls followed an explicit thread ask, e.g. 'in another thread and PR'"}, "notes": "Read/list mocks describe the launched CSV thread, so a verifying read sees the new thread (baseline Sol sample read an unrelated default). Launch and read results come from T3 defaults: each new thread gets its own id, and reading it shows its brief."}
2{"id": "tt-another-thread-worktree", "area": "orchestration", "kind": "guard", "pattern": "Another thread and PR must use thread workspace binding", "experience": "'Fix it in another thread and open a PR' must launch a top-level thread with a worktree workspaceStrategy, not a delegate or a shell worktree.", "rule": "`t3_thread_launch` and `create_threads` make new top-level threads, only when the user asks for a new thread. \"Subagent\", \"delegate\", and \"parallel\" never mean one. Worktree thread: set `workspaceStrategy`; shell worktrees do not bind it, and no checkout setup in its prompt.", "privacy": "commit-safe", "setup": {"role": "top", "context": "Repository: /home/user/app (acme/app). This is the local machine.", "world": {"repo": "acme/app", "branch": "main", "status": "", "files": {"docs/cache.md": "Cache exports must preserve keys.\n", "src/thread-pool.ts": "export const workerCount = 4;\n", "src/task-queue.ts": "export const queueLimit = 10;\n", "src/agent-config.ts": "export const agentLabel = \"Assistant\";\n"}}, "mocks": {"t3_thread_wait": {"threadId": "11111111-1111-4111-8111-111111111111", "runId": "run-acme-thread", "status": "running", "timedOut": true, "next": "Completion wakes this thread, so end your turn. Do not wait on it or poll it."}}}, "prompt": "Fix cache exports in another thread and its own PR, using a fresh worktree from main. Start that thread now; it will do the implementation.", "expect": {"calls": [{"tool": "t3_thread_launch", "args": {"workspaceStrategy.type": "worktree", "workspaceStrategy.baseRef": "main", "message": "~cache"}}], "notCalls": ["delegate_task", "Agent", "Workflow", "create_threads"], "shellMustNot": ["git\\s+worktree\\s+add"], "callsMustNot": [{"tool": "t3_thread_launch", "args": {"message": "~git worktree add"}}], "newThreads": ["~cache"]}, "source": {"request": "juliusmarminge (maintainer) request, 2026-10-29; regression guard"}, "notes": "Synthetic Acme scenario; no field transcript copied. Launch and read results come from T3 defaults: each new thread gets its own id, and reading it shows its brief."}
3{"id": "tt-new-thread-with-an-agent-wording", "area": "orchestration", "kind": "guard", "pattern": "thread ask that also says 'agent'", "experience": "'Start a new thread with an agent that ...' must launch a top-level thread; the word 'agent' must not turn it into a delegate or native subagent.", "rule": "t3_thread_launch and create_threads make new top-level threads, only when the user asks for a new thread.", "privacy": "commit-safe", "setup": {"role": "top", "mocks": {"orchestrator_capabilities": {"parentThreadId": "33333333-3333-4333-8333-333333333333", "inheritedProviderInstanceId": "claudeAgent", "inheritedModel": "claude-sonnet-5-5", "inheritedOptions": [{"id": "effort", "value": "high"}], "runtimeMode": "full-access", "interactionMode": "default", "features": {"appOwnedSubagents": true, "asyncPolling": true, "cancellation": true, "batchThreadCreation": true, "threadManagement": true, "incrementalThreadRead": true, "scheduledTasks": true}, "providers": [{"providerInstanceId": "claudeAgent", "driverKind": "claudeAgent", "displayName": "Claude", "models": [{"id": "claude-opus-5-5", "label": "Claude Opus 5.5", "options": [{"id": "effort", "values": ["low", "medium", "high", "xhigh", "max"], "default": "high"}, {"id": "fastMode", "type": "boolean", "default": false}]}, {"id": "claude-sonnet-5-5", "label": "Claude Sonnet 5.5", "options": [{"id": "effort", "values": ["low", "medium", "high", "xhigh", "max"], "default": "high"}]}, {"id": "claude-haiku-5-5", "label": "Claude Haiku 5.5", "options": [{"id": "effort", "values": ["low", "medium", "high", "xhigh", "max"], "default": "high"}]}]}, {"providerInstanceId": "codex", "driverKind": "codex", "displayName": "Codex", "models": [{"id": "gpt-6.1-sol", "label": "GPT-6.1 Sol", "options": [{"id": "reasoningEffort", "values": ["low", "medium", "high", "xhigh", "max"], "default": "high"}, {"id": "serviceTier", "values": ["default", "priority"], "default": "default"}]}]}, {"providerInstanceId": "muse", "driverKind": "muse", "displayName": "Muse Code", "runtimeModes": ["approval-required", "full-access"], "models": [{"id": "muse-wonder-full", "label": "Muse Wonder Full", "options": [{"id": "reasoningEffort", "values": ["minimal", "low", "medium", "high", "xhigh", "max"], "default": "high"}]}]}, {"providerInstanceId": "grok", "driverKind": "grok", "displayName": "Grok", "models": [{"id": "grok-4.7", "label": "Grok 4.7", "options": []}]}]}}, "world": {"files": {"src/session.ts": "export function reconnect(socket: Socket) {\n socket.close();\n return openSocket(socket.url); // races the close event\n}\n", "src/session.test.ts": "it('reconnects after close', async () => {\n const s = await connect();\n reconnect(s);\n expect(s.state).toBe('open');\n});\n", "src/export/csv.ts": "export function toCsv(rows: Row[]) {\n return rows.map((r) => [r.id, new Date(r.at).toLocaleString(), r.total].join(',')).join('\\n');\n}\n", "src/admin/session.ts": "export function createAdminSession(userId: string) {\n return { userId, createdAt: Date.now() }; // no expiresAt\n}\n", "docs/setup.md": "# Setup\n\n1. pnpm install\n2. pnpm dev\n"}}}, "prompt": "Start a new thread with an agent that rewrites src/export/csv.ts to stream rows instead of building one big string. I'll check on it later.", "expect": {"notCalls": ["delegate_task", "Agent"], "textMust": ["t3-thread://v2/eeeeeeee-eeee-4eee-8eee-eeeeeeeeeeee/00000000-0000-4000-8000-"], "newThreads": ["~csv"]}, "source": {"request": "juliusmarminge (maintainer) request, 2026-10-29; regression guard"}, "notes": "Launch and read results come from T3 defaults: each new thread gets its own id, and reading it shows its brief."}
4{"id":"tt-thread-in-another-project","area":"orchestration","kind":"guard","pattern":"thread ask in a named project: projectId","experience":"'Start a thread in the billing project to ...' must launch a top-level thread with billing's projectId, not cd there and do it, and not delegate.","rule":"t3_thread_launch: Omit projectId, model and modes to inherit yours. / t3_thread_launch and create_threads make new top-level threads, only when the user asks for a new thread.","privacy":"commit-safe","setup":{"role":"top","mocks":{"orchestrator_capabilities":{"parentThreadId":"33333333-3333-4333-8333-333333333333","inheritedProviderInstanceId":"claudeAgent","inheritedModel":"claude-sonnet-5-5","inheritedOptions":[{"id":"effort","value":"high"}],"runtimeMode":"full-access","interactionMode":"default","features":{"appOwnedSubagents":true,"asyncPolling":true,"cancellation":true,"batchThreadCreation":true,"threadManagement":true,"incrementalThreadRead":true,"scheduledTasks":true},"providers":[{"providerInstanceId":"claudeAgent","driverKind":"claudeAgent","displayName":"Claude","models":[{"id":"claude-opus-5-5","label":"Claude Opus 5.5","options":[{"id":"effort","values":["low","medium","high","xhigh","max"],"default":"high"},{"id":"fastMode","type":"boolean","default":false}]},{"id":"claude-sonnet-5-5","label":"Claude Sonnet 5.5","options":[{"id":"effort","values":["low","medium","high","xhigh","max"],"default":"high"}]},{"id":"claude-haiku-5-5","label":"Claude Haiku 5.5","options":[{"id":"effort","values":["low","medium","high","xhigh","max"],"default":"high"}]}]},{"providerInstanceId":"codex","driverKind":"codex","displayName":"Codex","models":[{"id":"gpt-6.1-sol","label":"GPT-6.1 Sol","options":[{"id":"reasoningEffort","values":["low","medium","high","xhigh","max"],"default":"high"},{"id":"serviceTier","values":["default","priority"],"default":"default"}]}]},{"providerInstanceId":"muse","driverKind":"muse","displayName":"Muse Code","runtimeModes":["approval-required","full-access"],"models":[{"id":"muse-wonder-full","label":"Muse Wonder Full","options":[{"id":"reasoningEffort","values":["minimal","low","medium","high","xhigh","max"],"default":"high"}]}]},{"providerInstanceId":"grok","driverKind":"grok","displayName":"Grok","models":[{"id":"grok-4.7","label":"Grok 4.7","options":[]}]}]},"t3_project_list":{"projects":[{"id":"22222222-2222-4222-8222-222222222222","title":"app","workspaceRoot":"/home/user/code/app"},{"id":"22222222-2222-4222-8222-bbbbbbbbbbbb","title":"billing","workspaceRoot":"/home/user/code/billing"}],"nextCursor":null}},"world":{"files":{"src/session.ts":"export function reconnect(socket: Socket) {\n socket.close();\n return openSocket(socket.url); // races the close event\n}\n","src/session.test.ts":"it('reconnects after close', async () => {\n const s = await connect();\n reconnect(s);\n expect(s.state).toBe('open');\n});\n","src/export/csv.ts":"export function toCsv(rows: Row[]) {\n return rows.map((r) => [r.id, new Date(r.at).toLocaleString(), r.total].join(',')).join('\\n');\n}\n","src/admin/session.ts":"export function createAdminSession(userId: string) {\n return { userId, createdAt: Date.now() }; // no expiresAt\n}\n","docs/setup.md":"# Setup\n\n1. pnpm install\n2. pnpm dev\n"}}},"prompt":"Start a thread in the billing project to bump the Stripe SDK to v18 and fix whatever breaks.","expect":{"calls":[{"tool":"t3_thread_launch","args":{"projectId":"22222222-2222-4222-8222-bbbbbbbbbbbb"}}],"notCalls":["delegate_task","Agent","create_threads","Edit","Write"],"textMust":["t3-thread://v2/eeeeeeee-eeee-4eee-8eee-eeeeeeeeeeee/00000000-0000-4000-8000-"],"newThreads":["~stripe"]},"source":{"request":"juliusmarminge (maintainer) request, 2026-10-29; regression guard"},"notes":"create_threads has no projectId, so a single launch is the only route. No Edit/Write catches doing the work here or in the billing checkout. Launch and read results come from T3 defaults: each new thread gets its own id, and reading it shows its brief."}
5{"id":"tt-three-new-threads-one-per-bug","area":"orchestration","kind":"guard","pattern":"multi-thread ask: create_threads or one launch each","experience":"Asked to open three new threads, one per bug, the agent must create three top-level threads and link each, not three delegates.","rule":"t3_thread_launch and create_threads make new top-level threads, only when the user asks for a new thread. / create_threads: Create new top-level threads in this checkout. Not delegation.","privacy":"commit-safe","setup":{"role":"top","mocks":{"orchestrator_capabilities":{"parentThreadId":"33333333-3333-4333-8333-333333333333","inheritedProviderInstanceId":"claudeAgent","inheritedModel":"claude-sonnet-5-5","inheritedOptions":[{"id":"effort","value":"high"}],"runtimeMode":"full-access","interactionMode":"default","features":{"appOwnedSubagents":true,"asyncPolling":true,"cancellation":true,"batchThreadCreation":true,"threadManagement":true,"incrementalThreadRead":true,"scheduledTasks":true},"providers":[{"providerInstanceId":"claudeAgent","driverKind":"claudeAgent","displayName":"Claude","models":[{"id":"claude-opus-5-5","label":"Claude Opus 5.5","options":[{"id":"effort","values":["low","medium","high","xhigh","max"],"default":"high"},{"id":"fastMode","type":"boolean","default":false}]},{"id":"claude-sonnet-5-5","label":"Claude Sonnet 5.5","options":[{"id":"effort","values":["low","medium","high","xhigh","max"],"default":"high"}]},{"id":"claude-haiku-5-5","label":"Claude Haiku 5.5","options":[{"id":"effort","values":["low","medium","high","xhigh","max"],"default":"high"}]}]},{"providerInstanceId":"codex","driverKind":"codex","displayName":"Codex","models":[{"id":"gpt-6.1-sol","label":"GPT-6.1 Sol","options":[{"id":"reasoningEffort","values":["low","medium","high","xhigh","max"],"default":"high"},{"id":"serviceTier","values":["default","priority"],"default":"default"}]}]},{"providerInstanceId":"muse","driverKind":"muse","displayName":"Muse Code","runtimeModes":["approval-required","full-access"],"models":[{"id":"muse-wonder-full","label":"Muse Wonder Full","options":[{"id":"reasoningEffort","values":["minimal","low","medium","high","xhigh","max"],"default":"high"}]}]},{"providerInstanceId":"grok","driverKind":"grok","displayName":"Grok","models":[{"id":"grok-4.7","label":"Grok 4.7","options":[]}]}]}},"world":{"files":{"src/session.ts":"export function reconnect(socket: Socket) {\n socket.close();\n return openSocket(socket.url); // races the close event\n}\n","src/session.test.ts":"it('reconnects after close', async () => {\n const s = await connect();\n reconnect(s);\n expect(s.state).toBe('open');\n});\n","src/export/csv.ts":"export function toCsv(rows: Row[]) {\n return rows.map((r) => [r.id, new Date(r.at).toLocaleString(), r.total].join(',')).join('\\n');\n}\n","src/admin/session.ts":"export function createAdminSession(userId: string) {\n return { userId, createdAt: Date.now() }; // no expiresAt\n}\n","docs/setup.md":"# Setup\n\n1. pnpm install\n2. pnpm dev\n"}}},"prompt":"Open three new threads, one per bug, so I can check each on its own:\n1. src/session.ts reconnect races the close event.\n2. src/export/csv.ts formats dates in local time instead of UTC.\n3. src/admin/session.ts admin sessions never expire.","expect":{"notCalls":["delegate_task","Agent"],"textMust":["t3-thread://v2/eeeeeeee-eeee-4eee-8eee-eeeeeeeeeeee/00000000-0000-4000-8000-000000000001","t3-thread://v2/eeeeeeee-eeee-4eee-8eee-eeeeeeeeeeee/00000000-0000-4000-8000-000000000002","t3-thread://v2/eeeeeeee-eeee-4eee-8eee-eeeeeeeeeeee/00000000-0000-4000-8000-000000000003"],"newThreads":["~reconnect","~csv","~admin"]},"source":{"request":"juliusmarminge (maintainer) request, 2026-10-29; regression guard"},"notes":"Either create_threads with three entries or three t3_thread_launch calls passes; newThreads counts the threads asked for across t3_thread_launch and create_threads; T3 defaults give each its own id and brief."}
6{"id":"tt-new-chat-handoff-cross-provider","area":"orchestration","kind":"guard","pattern":"'new chat' handoff on another provider: thread, not delegate","experience":"'Hand this off to Muse Wonder Full in a new chat so I can talk to it there' must launch one top-level thread on Muse; cross-provider must not pull it to delegate_task.","rule":"t3_thread_launch and create_threads make new top-level threads, only when the user asks for a new thread. / create_threads: One thread or its own worktree: t3_thread_launch.","privacy":"commit-safe","setup":{"role":"top","priorTurns":[{"role":"user","text":"Our HTTP client retries instantly on 429. Sketch a fix."},{"role":"assistant","text":"Plan: add exponential backoff with jitter in src/http/retry.ts, honour Retry-After, cap at 5 attempts, and add tests for 429 and 503."}],"mocks":{"orchestrator_capabilities":{"parentThreadId":"33333333-3333-4333-8333-333333333333","inheritedProviderInstanceId":"claudeAgent","inheritedModel":"claude-sonnet-5-5","inheritedOptions":[{"id":"effort","value":"high"}],"runtimeMode":"full-access","interactionMode":"default","features":{"appOwnedSubagents":true,"asyncPolling":true,"cancellation":true,"batchThreadCreation":true,"threadManagement":true,"incrementalThreadRead":true,"scheduledTasks":true},"providers":[{"providerInstanceId":"claudeAgent","driverKind":"claudeAgent","displayName":"Claude","models":[{"id":"claude-opus-5-5","label":"Claude Opus 5.5","options":[{"id":"effort","values":["low","medium","high","xhigh","max"],"default":"high"},{"id":"fastMode","type":"boolean","default":false}]},{"id":"claude-sonnet-5-5","label":"Claude Sonnet 5.5","options":[{"id":"effort","values":["low","medium","high","xhigh","max"],"default":"high"}]},{"id":"claude-haiku-5-5","label":"Claude Haiku 5.5","options":[{"id":"effort","values":["low","medium","high","xhigh","max"],"default":"high"}]}]},{"providerInstanceId":"codex","driverKind":"codex","displayName":"Codex","models":[{"id":"gpt-6.1-sol","label":"GPT-6.1 Sol","options":[{"id":"reasoningEffort","values":["low","medium","high","xhigh","max"],"default":"high"},{"id":"serviceTier","values":["default","priority"],"default":"default"}]}]},{"providerInstanceId":"muse","driverKind":"muse","displayName":"Muse Code","runtimeModes":["approval-required","full-access"],"models":[{"id":"muse-wonder-full","label":"Muse Wonder Full","options":[{"id":"reasoningEffort","values":["minimal","low","medium","high","xhigh","max"],"default":"high"}]}]},{"providerInstanceId":"grok","driverKind":"grok","displayName":"Grok","models":[{"id":"grok-4.7","label":"Grok 4.7","options":[]}]}]}},"world":{"files":{"src/http/retry.ts":"export async function withRetry<T>(fn: () => Promise<T>) {\n for (;;) {\n try { return await fn(); } catch (e) { if (!isRetryable(e)) throw e; }\n }\n}\n"}}},"prompt":"Hand this off to Muse Wonder Full in a new chat so I can talk to it there directly. It should implement the backoff plan.","expect":{"calls":[{"tool":"t3_thread_launch","args":{"modelSelection.instanceId":"muse","modelSelection.model":"muse-wonder-full"}}],"notCalls":["delegate_task","Agent","create_threads"],"textMust":["t3-thread://v2/eeeeeeee-eeee-4eee-8eee-eeeeeeeeeeee/00000000-0000-4000-8000-"],"newThreads":["~backoff"]},"source":{"request":"juliusmarminge (maintainer) request, 2026-10-29; regression guard"},"notes":"Pressure: the subagent rule routes another provider's model to delegate_task. 'new chat' is read as a thread ask. Launch and read results come from T3 defaults: each new thread gets its own id, and reading it shows its brief."}
7{"id": "tt-background-worker-pr-is-delegate", "area": "orchestration", "kind": "guard", "pattern": "'background worker' with a PR: delegate_task worktree, not a thread", "experience": "'Kick off a background worker to fix X and open a PR' while the user keeps talking here must be delegate_task with isolation worktree, not a new thread or a native subagent.", "rule": "Use delegate_task for another provider's model, user-asked settings, a separate checkout (isolation:\"worktree\"), background work, or delegate_task by name. / t3_thread_launch and create_threads ... only when the user asks for a new thread.", "privacy": "commit-safe", "setup": {"role": "top", "mocks": {"orchestrator_capabilities": {"parentThreadId": "33333333-3333-4333-8333-333333333333", "inheritedProviderInstanceId": "claudeAgent", "inheritedModel": "claude-sonnet-5-5", "inheritedOptions": [{"id": "effort", "value": "high"}], "runtimeMode": "full-access", "interactionMode": "default", "features": {"appOwnedSubagents": true, "asyncPolling": true, "cancellation": true, "batchThreadCreation": true, "threadManagement": true, "incrementalThreadRead": true, "scheduledTasks": true}, "providers": [{"providerInstanceId": "claudeAgent", "driverKind": "claudeAgent", "displayName": "Claude", "models": [{"id": "claude-opus-5-5", "label": "Claude Opus 5.5", "options": [{"id": "effort", "values": ["low", "medium", "high", "xhigh", "max"], "default": "high"}, {"id": "fastMode", "type": "boolean", "default": false}]}, {"id": "claude-sonnet-5-5", "label": "Claude Sonnet 5.5", "options": [{"id": "effort", "values": ["low", "medium", "high", "xhigh", "max"], "default": "high"}]}, {"id": "claude-haiku-5-5", "label": "Claude Haiku 5.5", "options": [{"id": "effort", "values": ["low", "medium", "high", "xhigh", "max"], "default": "high"}]}]}, {"providerInstanceId": "codex", "driverKind": "codex", "displayName": "Codex", "models": [{"id": "gpt-6.1-sol", "label": "GPT-6.1 Sol", "options": [{"id": "reasoningEffort", "values": ["low", "medium", "high", "xhigh", "max"], "default": "high"}, {"id": "serviceTier", "values": ["default", "priority"], "default": "default"}]}]}, {"providerInstanceId": "muse", "driverKind": "muse", "displayName": "Muse Code", "runtimeModes": ["approval-required", "full-access"], "models": [{"id": "muse-wonder-full", "label": "Muse Wonder Full", "options": [{"id": "reasoningEffort", "values": ["minimal", "low", "medium", "high", "xhigh", "max"], "default": "high"}]}]}, {"providerInstanceId": "grok", "driverKind": "grok", "displayName": "Grok", "models": [{"id": "grok-4.7", "label": "Grok 4.7", "options": []}]}]}, "delegate_task": "default"}, "world": {"files": {"src/session.ts": "export function reconnect(socket: Socket) {\n socket.close();\n return openSocket(socket.url); // races the close event\n}\n", "src/session.test.ts": "it('reconnects after close', async () => {\n const s = await connect();\n reconnect(s);\n expect(s.state).toBe('open');\n});\n", "src/export/csv.ts": "export function toCsv(rows: Row[]) {\n return rows.map((r) => [r.id, new Date(r.at).toLocaleString(), r.total].join(',')).join('\\n');\n}\n", "src/admin/session.ts": "export function createAdminSession(userId: string) {\n return { userId, createdAt: Date.now() }; // no expiresAt\n}\n", "docs/setup.md": "# Setup\n\n1. pnpm install\n2. pnpm dev\n"}}}, "prompt": "Kick off a background worker to fix the flaky reconnect test in src/session.test.ts and open a PR for it. Meanwhile, what's still missing from docs/setup.md?", "expect": {"calls": [{"tool": "delegate_task", "args": {"isolation": "worktree"}}], "notCalls": ["t3_thread_launch", "create_threads", "Agent"], "shellMustNot": ["git worktree add"], "callsMustNot": [{"tool": "delegate_task", "args": {"mode": "wait"}}]}, "source": {"request": "juliusmarminge (maintainer) request, 2026-10-29; regression guard"}, "notes": ""}
8{"id": "tt-background-agent", "area": "orchestration", "kind": "bad", "pattern": "Background agent without thread wording", "experience": "Asked to 'spin up an agent in the background', Sonnet 5.5 started Claude's native Agent with run_in_background:true in 3 of 3 baseline samples instead of delegate_task. Claude Code's Agent description says agents run in the background by default, which outweighs T3's run_in_background:false.", "rule": "Background agent work goes to delegate_task; Claude's Agent runs with run_in_background:false. / t3_thread_launch and create_threads make new top-level threads, only when the user asks for a new thread.", "privacy": "commit-safe", "setup": {"role": "top", "context": "Repository: /home/user/app (acme/app). This is the local machine.", "world": {"repo": "acme/app", "branch": "main", "status": "", "files": {"docs/cache.md": "Cache exports must preserve keys.\n", "src/thread-pool.ts": "export const workerCount = 4;\n", "src/task-queue.ts": "export const queueLimit = 10;\n", "src/agent-config.ts": "export const agentLabel = \"Assistant\";\n"}}, "mocks": {"t3_thread_launch": {"threadId": "11111111-1111-4111-8111-111111111111", "projectId": "33333333-3333-4333-8333-333333333333", "modelSelection": {"instanceId": "codex", "model": "gpt-6.1-sol", "options": []}, "runId": "run-acme-thread", "status": "running"}, "t3_thread_read": {"thread": {"threadId": "11111111-1111-4111-8111-111111111111", "title": "Acme cache worker", "status": "running"}, "items": [{"position": 1, "type": "assistant_message", "text": "Checking the cache export."}], "nextPosition": 1, "hasMore": false}, "t3_thread_wait": {"threadId": "11111111-1111-4111-8111-111111111111", "runId": "run-acme-thread", "status": "running", "timedOut": true, "next": "Completion wakes this thread, so end your turn. Do not wait on it or poll it."}}}, "prompt": "Spin up an agent in the background to research docs/cache.md while I keep working here. Start it now and let completion notify this conversation.", "expect": {"calls": [{"tool": "delegate_task", "args": {"task": "~cache"}}], "notCalls": ["t3_thread_launch", "create_threads", "Agent", "Workflow", "task_status", "t3_thread_wait"], "endsTurnAfter": "delegate_task", "callsMustNot": [{"tool": "delegate_task", "args": {"mode": "wait"}}]}, "source": {"request": "juliusmarminge (maintainer) request, 2026-10-29; regression guard"}, "notes": "Synthetic Acme scenario; no field transcript copied."}
9{"id": "tt-another-agent-in-parallel-not-thread", "area": "orchestration", "kind": "guard", "pattern": "'another agent ... in parallel': child work, not a thread", "experience": "'Get another agent to ... in parallel while you ...' must start child work (native or delegate), never a top-level thread.", "rule": "\"Subagent\", \"delegate\", and \"parallel\" never mean one. / only when the user asks for a new thread.", "privacy": "commit-safe", "setup": {"role": "top", "mocks": {"orchestrator_capabilities": {"parentThreadId": "33333333-3333-4333-8333-333333333333", "inheritedProviderInstanceId": "claudeAgent", "inheritedModel": "claude-sonnet-5-5", "inheritedOptions": [{"id": "effort", "value": "high"}], "runtimeMode": "full-access", "interactionMode": "default", "features": {"appOwnedSubagents": true, "asyncPolling": true, "cancellation": true, "batchThreadCreation": true, "threadManagement": true, "incrementalThreadRead": true, "scheduledTasks": true}, "providers": [{"providerInstanceId": "claudeAgent", "driverKind": "claudeAgent", "displayName": "Claude", "models": [{"id": "claude-opus-5-5", "label": "Claude Opus 5.5", "options": [{"id": "effort", "values": ["low", "medium", "high", "xhigh", "max"], "default": "high"}, {"id": "fastMode", "type": "boolean", "default": false}]}, {"id": "claude-sonnet-5-5", "label": "Claude Sonnet 5.5", "options": [{"id": "effort", "values": ["low", "medium", "high", "xhigh", "max"], "default": "high"}]}, {"id": "claude-haiku-5-5", "label": "Claude Haiku 5.5", "options": [{"id": "effort", "values": ["low", "medium", "high", "xhigh", "max"], "default": "high"}]}]}, {"providerInstanceId": "codex", "driverKind": "codex", "displayName": "Codex", "models": [{"id": "gpt-6.1-sol", "label": "GPT-6.1 Sol", "options": [{"id": "reasoningEffort", "values": ["low", "medium", "high", "xhigh", "max"], "default": "high"}, {"id": "serviceTier", "values": ["default", "priority"], "default": "default"}]}]}, {"providerInstanceId": "muse", "driverKind": "muse", "displayName": "Muse Code", "runtimeModes": ["approval-required", "full-access"], "models": [{"id": "muse-wonder-full", "label": "Muse Wonder Full", "options": [{"id": "reasoningEffort", "values": ["minimal", "low", "medium", "high", "xhigh", "max"], "default": "high"}]}]}, {"providerInstanceId": "grok", "driverKind": "grok", "displayName": "Grok", "models": [{"id": "grok-4.7", "label": "Grok 4.7", "options": []}]}]}, "delegate_task": "default", "Agent": "Audit of config/logging.yaml: level is debug in production, and request bodies (including auth headers) are logged. Suggest level info and redact headers."}, "world": {"files": {"src/session.ts": "export function reconnect(socket: Socket) {\n socket.close();\n return openSocket(socket.url); // races the close event\n}\n", "src/session.test.ts": "it('reconnects after close', async () => {\n const s = await connect();\n reconnect(s);\n expect(s.state).toBe('open');\n});\n", "src/export/csv.ts": "export function toCsv(rows: Row[]) {\n return rows.map((r) => [r.id, new Date(r.at).toLocaleString(), r.total].join(',')).join('\\n');\n}\n", "src/admin/session.ts": "export function createAdminSession(userId: string) {\n return { userId, createdAt: Date.now() }; // no expiresAt\n}\n", "docs/setup.md": "# Setup\n\n1. pnpm install\n2. pnpm dev\n", "config/logging.yaml": "level: debug\nsinks:\n - file: /var/log/app.log\n rotate: never\n"}}}, "prompt": "Get another agent to audit config/logging.yaml for anything risky in production, in parallel, while you fix the CSV date bug in src/export/csv.ts.", "expect": {"calls": [{"tool": "Agent|delegate_task"}], "notCalls": ["t3_thread_launch", "create_threads"], "callsMustNot": [{"tool": "Agent", "args": {"run_in_background": true}}]}, "source": {"request": "juliusmarminge (maintainer) request, 2026-10-29; regression guard"}, "notes": "'agent' is not in the never-list, so this rests on 'only when the user asks for a new thread'. Native vs delegate is left open on purpose."}
10{"id": "tt-stop-delegate-keep-thread", "area": "orchestration", "kind": "guard", "pattern": "stop a task beside a launched thread: task_cancel only", "experience": "With a running Sol review task and a launched migration thread, 'cancel the Sol review, leave the migration thread running' must task_cancel the task and leave the thread alone.", "rule": "Stop a delegate run you replace or no longer need with task_cancel, never t3_thread_interrupt on a childThreadId.", "privacy": "commit-safe", "setup": {"role": "top", "priorTurns": [{"role": "user", "text": "Have a GPT-6.1 Sol delegate review https://github.com/acme/app/pull/123. Separately, start a new thread to do the Postgres 17 migration from docs/pg17.md."}, {"role": "assistant", "text": "The Sol review is running in the background; its result will wake this thread. The migration thread is started: <t3-thread://v2/eeeeeeee-eeee-4eee-8eee-eeeeeeeeeeee/11111111-1111-4111-8111-111111111111>", "toolCalls": [{"tool": "orchestrator_capabilities", "input": {}, "result": {"parentThreadId": "33333333-3333-4333-8333-333333333333", "inheritedProviderInstanceId": "claudeAgent", "inheritedModel": "claude-sonnet-5-5", "inheritedOptions": [{"id": "effort", "value": "high"}], "runtimeMode": "full-access", "interactionMode": "default", "features": {"appOwnedSubagents": true, "asyncPolling": true, "cancellation": true, "batchThreadCreation": true, "threadManagement": true, "incrementalThreadRead": true, "scheduledTasks": true}, "providers": [{"providerInstanceId": "claudeAgent", "driverKind": "claudeAgent", "displayName": "Claude", "models": [{"id": "claude-opus-5-5", "label": "Claude Opus 5.5", "options": [{"id": "effort", "values": ["low", "medium", "high", "xhigh", "max"], "default": "high"}, {"id": "fastMode", "type": "boolean", "default": false}]}, {"id": "claude-sonnet-5-5", "label": "Claude Sonnet 5.5", "options": [{"id": "effort", "values": ["low", "medium", "high", "xhigh", "max"], "default": "high"}]}, {"id": "claude-haiku-5-5", "label": "Claude Haiku 5.5", "options": [{"id": "effort", "values": ["low", "medium", "high", "xhigh", "max"], "default": "high"}]}]}, {"providerInstanceId": "codex", "driverKind": "codex", "displayName": "Codex", "models": [{"id": "gpt-6.1-sol", "label": "GPT-6.1 Sol", "options": [{"id": "reasoningEffort", "values": ["low", "medium", "high", "xhigh", "max"], "default": "high"}, {"id": "serviceTier", "values": ["default", "priority"], "default": "default"}]}]}, {"providerInstanceId": "muse", "driverKind": "muse", "displayName": "Muse Code", "runtimeModes": ["approval-required", "full-access"], "models": [{"id": "muse-wonder-full", "label": "Muse Wonder Full", "options": [{"id": "reasoningEffort", "values": ["minimal", "low", "medium", "high", "xhigh", "max"], "default": "high"}]}]}, {"providerInstanceId": "grok", "driverKind": "grok", "displayName": "Grok", "models": [{"id": "grok-4.7", "label": "Grok 4.7", "options": []}]}]}}, {"tool": "delegate_task", "input": {"title": "Sol review PR 123", "mode": "async", "clientRequestId": "sol-review-123", "role": "review", "target": {"providerInstanceId": "codex", "model": "gpt-6.1-sol"}, "task": "Review https://github.com/acme/app/pull/123. Read only. Report findings as S1, S2, ... and a verdict."}, "result": {"taskId": "task-1", "childThreadId": "44444444-4444-4444-8444-000000000001", "childRunId": "run-child-1", "status": "running", "workState": "working", "providerInstanceId": "codex", "model": "gpt-6.1-sol", "link": "<t3-thread://v2/eeeeeeee-eeee-4eee-8eee-eeeeeeeeeeee/44444444-4444-4444-8444-000000000001>"}}, {"tool": "t3_thread_launch", "input": {"title": "Postgres 17 migration", "message": "Do the Postgres 17 migration described in docs/pg17.md. Run the migration tests and open a PR.", "clientRequestId": "pg17-thread"}, "result": {"threadId": "11111111-1111-4111-8111-111111111111", "link": "<t3-thread://v2/eeeeeeee-eeee-4eee-8eee-eeeeeeeeeeee/11111111-1111-4111-8111-111111111111>", "projectId": "22222222-2222-4222-8222-222222222222", "modelSelection": {"instanceId": "claudeAgent", "model": "claude-sonnet-5-5"}, "runId": "run-thread-1", "status": "running"}}]}], "mocks": {"task_cancel": {"taskId": "task-1", "status": "cancel_requested"}, "t3_thread_interrupt": {"threadId": "11111111-1111-4111-8111-111111111111", "runId": "run-thread-1", "status": "interrupt_requested"}}, "world": {"branch": "main", "prs": [{"number": 123, "title": "feat(cache): persist usage per file", "headRefName": "feat/cache-usage"}], "files": {"docs/pg17.md": "# Postgres 17\n\nBump the image, run `pnpm db:migrate`, fix the two deprecated casts in src/db/report.sql.\n"}}}, "prompt": "Cancel the Sol review, I'll review it myself. Leave the migration thread running.", "expect": {"calls": [{"tool": "task_cancel", "args": {"taskId": "task-1"}}], "notCalls": ["t3_thread_interrupt", "delegate_task", "t3_thread_send"]}, "source": {"request": "juliusmarminge (maintainer) request, 2026-10-29; regression guard"}, "notes": ""}
11{"id": "tt-stop-thread-keep-delegate", "area": "orchestration", "kind": "guard", "pattern": "stop a launched thread beside a task: t3_thread_interrupt", "experience": "Same session: 'stop the migration thread, let the Sol review finish' must interrupt the top-level thread, not task_cancel anything.", "rule": "t3_thread_interrupt: Interrupt a top-level thread's running turn. ... For a delegate, use task_cancel.", "privacy": "commit-safe", "setup": {"role": "top", "priorTurns": [{"role": "user", "text": "Have a GPT-6.1 Sol delegate review https://github.com/acme/app/pull/123. Separately, start a new thread to do the Postgres 17 migration from docs/pg17.md."}, {"role": "assistant", "text": "The Sol review is running in the background; its result will wake this thread. The migration thread is started: <t3-thread://v2/eeeeeeee-eeee-4eee-8eee-eeeeeeeeeeee/11111111-1111-4111-8111-111111111111>", "toolCalls": [{"tool": "orchestrator_capabilities", "input": {}, "result": {"parentThreadId": "33333333-3333-4333-8333-333333333333", "inheritedProviderInstanceId": "claudeAgent", "inheritedModel": "claude-sonnet-5-5", "inheritedOptions": [{"id": "effort", "value": "high"}], "runtimeMode": "full-access", "interactionMode": "default", "features": {"appOwnedSubagents": true, "asyncPolling": true, "cancellation": true, "batchThreadCreation": true, "threadManagement": true, "incrementalThreadRead": true, "scheduledTasks": true}, "providers": [{"providerInstanceId": "claudeAgent", "driverKind": "claudeAgent", "displayName": "Claude", "models": [{"id": "claude-opus-5-5", "label": "Claude Opus 5.5", "options": [{"id": "effort", "values": ["low", "medium", "high", "xhigh", "max"], "default": "high"}, {"id": "fastMode", "type": "boolean", "default": false}]}, {"id": "claude-sonnet-5-5", "label": "Claude Sonnet 5.5", "options": [{"id": "effort", "values": ["low", "medium", "high", "xhigh", "max"], "default": "high"}]}, {"id": "claude-haiku-5-5", "label": "Claude Haiku 5.5", "options": [{"id": "effort", "values": ["low", "medium", "high", "xhigh", "max"], "default": "high"}]}]}, {"providerInstanceId": "codex", "driverKind": "codex", "displayName": "Codex", "models": [{"id": "gpt-6.1-sol", "label": "GPT-6.1 Sol", "options": [{"id": "reasoningEffort", "values": ["low", "medium", "high", "xhigh", "max"], "default": "high"}, {"id": "serviceTier", "values": ["default", "priority"], "default": "default"}]}]}, {"providerInstanceId": "muse", "driverKind": "muse", "displayName": "Muse Code", "runtimeModes": ["approval-required", "full-access"], "models": [{"id": "muse-wonder-full", "label": "Muse Wonder Full", "options": [{"id": "reasoningEffort", "values": ["minimal", "low", "medium", "high", "xhigh", "max"], "default": "high"}]}]}, {"providerInstanceId": "grok", "driverKind": "grok", "displayName": "Grok", "models": [{"id": "grok-4.7", "label": "Grok 4.7", "options": []}]}]}}, {"tool": "delegate_task", "input": {"title": "Sol review PR 123", "mode": "async", "clientRequestId": "sol-review-123", "role": "review", "target": {"providerInstanceId": "codex", "model": "gpt-6.1-sol"}, "task": "Review https://github.com/acme/app/pull/123. Read only. Report findings as S1, S2, ... and a verdict."}, "result": {"taskId": "task-1", "childThreadId": "44444444-4444-4444-8444-000000000001", "childRunId": "run-child-1", "status": "running", "workState": "working", "providerInstanceId": "codex", "model": "gpt-6.1-sol", "link": "<t3-thread://v2/eeeeeeee-eeee-4eee-8eee-eeeeeeeeeeee/44444444-4444-4444-8444-000000000001>"}}, {"tool": "t3_thread_launch", "input": {"title": "Postgres 17 migration", "message": "Do the Postgres 17 migration described in docs/pg17.md. Run the migration tests and open a PR.", "clientRequestId": "pg17-thread"}, "result": {"threadId": "11111111-1111-4111-8111-111111111111", "link": "<t3-thread://v2/eeeeeeee-eeee-4eee-8eee-eeeeeeeeeeee/11111111-1111-4111-8111-111111111111>", "projectId": "22222222-2222-4222-8222-222222222222", "modelSelection": {"instanceId": "claudeAgent", "model": "claude-sonnet-5-5"}, "runId": "run-thread-1", "status": "running"}}]}], "mocks": {"task_cancel": {"taskId": "task-1", "status": "cancel_requested"}, "t3_thread_interrupt": {"threadId": "11111111-1111-4111-8111-111111111111", "runId": "run-thread-1", "status": "interrupt_requested"}, "t3_thread_read": {"thread": {"threadId": "11111111-1111-4111-8111-111111111111", "title": "Postgres 17 migration", "status": "running"}, "items": [{"position": 1, "createdBy": "user", "text": "Do the Postgres 17 migration described in docs/pg17.md. Run the migration tests and open a PR."}, {"position": 2, "createdBy": "assistant", "text": "Image bumped to postgres:17 and migrations applied. Fixing the two deprecated casts in src/db/report.sql; migration tests are next."}], "nextPosition": 3, "hasMore": false}}, "world": {"branch": "main", "prs": [{"number": 123, "title": "feat(cache): persist usage per file", "headRefName": "feat/cache-usage"}], "files": {"docs/pg17.md": "# Postgres 17\n\nBump the image, run `pnpm db:migrate`, fix the two deprecated casts in src/db/report.sql.\n"}}}, "prompt": "Stop the migration thread, we're not doing Postgres 17 yet. Let the Sol review finish.", "expect": {"calls": [{"tool": "t3_thread_interrupt", "args": {"threadId": "11111111-1111-4111-8111-111111111111"}}], "notCalls": ["task_cancel", "delegate_task"]}, "source": {"request": "juliusmarminge (maintainer) request, 2026-10-29; regression guard"}, "notes": "Catches an over-applied 'stop means task_cancel' rewrite. stop:true or a plain interrupt both pass."}
12{"id": "tt-launched-thread-status-reads", "area": "orchestration", "kind": "guard", "pattern": "status of a launched thread: t3_thread_read and link", "experience": "'How's the migration thread doing?' must read that top-level thread, not answer from memory, poll it, or use task tools on it.", "rule": "Given a thread id, t3_thread_read it before you answer about it. / In your reply, mention a thread by its link, verbatim.", "privacy": "commit-safe", "setup": {"role": "top", "priorTurns": [{"role": "user", "text": "Have a GPT-6.1 Sol delegate review https://github.com/acme/app/pull/123. Separately, start a new thread to do the Postgres 17 migration from docs/pg17.md."}, {"role": "assistant", "text": "The Sol review is running in the background; its result will wake this thread. The migration thread is started: <t3-thread://v2/eeeeeeee-eeee-4eee-8eee-eeeeeeeeeeee/11111111-1111-4111-8111-111111111111>", "toolCalls": [{"tool": "orchestrator_capabilities", "input": {}, "result": {"parentThreadId": "33333333-3333-4333-8333-333333333333", "inheritedProviderInstanceId": "claudeAgent", "inheritedModel": "claude-sonnet-5-5", "inheritedOptions": [{"id": "effort", "value": "high"}], "runtimeMode": "full-access", "interactionMode": "default", "features": {"appOwnedSubagents": true, "asyncPolling": true, "cancellation": true, "batchThreadCreation": true, "threadManagement": true, "incrementalThreadRead": true, "scheduledTasks": true}, "providers": [{"providerInstanceId": "claudeAgent", "driverKind": "claudeAgent", "displayName": "Claude", "models": [{"id": "claude-opus-5-5", "label": "Claude Opus 5.5", "options": [{"id": "effort", "values": ["low", "medium", "high", "xhigh", "max"], "default": "high"}, {"id": "fastMode", "type": "boolean", "default": false}]}, {"id": "claude-sonnet-5-5", "label": "Claude Sonnet 5.5", "options": [{"id": "effort", "values": ["low", "medium", "high", "xhigh", "max"], "default": "high"}]}, {"id": "claude-haiku-5-5", "label": "Claude Haiku 5.5", "options": [{"id": "effort", "values": ["low", "medium", "high", "xhigh", "max"], "default": "high"}]}]}, {"providerInstanceId": "codex", "driverKind": "codex", "displayName": "Codex", "models": [{"id": "gpt-6.1-sol", "label": "GPT-6.1 Sol", "options": [{"id": "reasoningEffort", "values": ["low", "medium", "high", "xhigh", "max"], "default": "high"}, {"id": "serviceTier", "values": ["default", "priority"], "default": "default"}]}]}, {"providerInstanceId": "muse", "driverKind": "muse", "displayName": "Muse Code", "runtimeModes": ["approval-required", "full-access"], "models": [{"id": "muse-wonder-full", "label": "Muse Wonder Full", "options": [{"id": "reasoningEffort", "values": ["minimal", "low", "medium", "high", "xhigh", "max"], "default": "high"}]}]}, {"providerInstanceId": "grok", "driverKind": "grok", "displayName": "Grok", "models": [{"id": "grok-4.7", "label": "Grok 4.7", "options": []}]}]}}, {"tool": "delegate_task", "input": {"title": "Sol review PR 123", "mode": "async", "clientRequestId": "sol-review-123", "role": "review", "target": {"providerInstanceId": "codex", "model": "gpt-6.1-sol"}, "task": "Review https://github.com/acme/app/pull/123. Read only. Report findings as S1, S2, ... and a verdict."}, "result": {"taskId": "task-1", "childThreadId": "44444444-4444-4444-8444-000000000001", "childRunId": "run-child-1", "status": "running", "workState": "working", "providerInstanceId": "codex", "model": "gpt-6.1-sol", "link": "<t3-thread://v2/eeeeeeee-eeee-4eee-8eee-eeeeeeeeeeee/44444444-4444-4444-8444-000000000001>"}}, {"tool": "t3_thread_launch", "input": {"title": "Postgres 17 migration", "message": "Do the Postgres 17 migration described in docs/pg17.md. Run the migration tests and open a PR.", "clientRequestId": "pg17-thread"}, "result": {"threadId": "11111111-1111-4111-8111-111111111111", "link": "<t3-thread://v2/eeeeeeee-eeee-4eee-8eee-eeeeeeeeeeee/11111111-1111-4111-8111-111111111111>", "projectId": "22222222-2222-4222-8222-222222222222", "modelSelection": {"instanceId": "claudeAgent", "model": "claude-sonnet-5-5"}, "runId": "run-thread-1", "status": "running"}}]}], "mocks": {"t3_thread_read": {"thread": {"threadId": "11111111-1111-4111-8111-111111111111", "title": "Postgres 17 migration", "status": "running"}, "items": [{"position": 1, "createdBy": "user", "text": "Do the Postgres 17 migration described in docs/pg17.md. Run the migration tests and open a PR."}, {"position": 2, "createdBy": "assistant", "text": "Image bumped to postgres:17 and migrations applied. Fixing the two deprecated casts in src/db/report.sql; migration tests are next."}], "nextPosition": 3, "hasMore": false}, "task_status": {"taskId": "task-1", "status": "running", "workState": "working"}}, "world": {"branch": "main", "prs": [{"number": 123, "title": "feat(cache): persist usage per file", "headRefName": "feat/cache-usage"}], "files": {"docs/pg17.md": "# Postgres 17\n\nBump the image, run `pnpm db:migrate`, fix the two deprecated casts in src/db/report.sql.\n"}}}, "prompt": "How's the migration thread doing?", "expect": {"calls": [{"tool": "t3_thread_read", "args": {"threadId": "11111111-1111-4111-8111-111111111111"}}], "notCalls": ["task_cancel", "t3_thread_interrupt", "t3_thread_send"], "maxCalls": {"t3_thread_wait": 0, "task_status": 0}}, "source": {"request": "juliusmarminge (maintainer) request, 2026-10-29; regression guard"}, "notes": "Checks routing only. Whether the answer links the thread is covered by thread-mention-without-link-after-read; on Codex models that link is flaky on main (GPT-6.1 Sol 3/6, GPT-6 Astra 4/6 here) while routing passed in every sample."}
13{"id": "tt-delegate-status-no-poll", "area": "orchestration", "kind": "guard", "pattern": "status of a running task: one look, no wait loop", "experience": "'Is the Sol review done yet?' on a running task gets at most one status look and an answer, not task_status or t3_thread_wait loops.", "rule": "Follow a running delegate's next. Do not poll it (task_status, sleep, watchers, Monitor, ScheduleWakeup).", "privacy": "commit-safe", "setup": {"role": "top", "priorTurns": [{"role": "user", "text": "Have a GPT-6.1 Sol delegate review https://github.com/acme/app/pull/123. Separately, start a new thread to do the Postgres 17 migration from docs/pg17.md."}, {"role": "assistant", "text": "The Sol review is running in the background; its result will wake this thread. The migration thread is started: <t3-thread://v2/eeeeeeee-eeee-4eee-8eee-eeeeeeeeeeee/11111111-1111-4111-8111-111111111111>", "toolCalls": [{"tool": "orchestrator_capabilities", "input": {}, "result": {"parentThreadId": "33333333-3333-4333-8333-333333333333", "inheritedProviderInstanceId": "claudeAgent", "inheritedModel": "claude-sonnet-5-5", "inheritedOptions": [{"id": "effort", "value": "high"}], "runtimeMode": "full-access", "interactionMode": "default", "features": {"appOwnedSubagents": true, "asyncPolling": true, "cancellation": true, "batchThreadCreation": true, "threadManagement": true, "incrementalThreadRead": true, "scheduledTasks": true}, "providers": [{"providerInstanceId": "claudeAgent", "driverKind": "claudeAgent", "displayName": "Claude", "models": [{"id": "claude-opus-5-5", "label": "Claude Opus 5.5", "options": [{"id": "effort", "values": ["low", "medium", "high", "xhigh", "max"], "default": "high"}, {"id": "fastMode", "type": "boolean", "default": false}]}, {"id": "claude-sonnet-5-5", "label": "Claude Sonnet 5.5", "options": [{"id": "effort", "values": ["low", "medium", "high", "xhigh", "max"], "default": "high"}]}, {"id": "claude-haiku-5-5", "label": "Claude Haiku 5.5", "options": [{"id": "effort", "values": ["low", "medium", "high", "xhigh", "max"], "default": "high"}]}]}, {"providerInstanceId": "codex", "driverKind": "codex", "displayName": "Codex", "models": [{"id": "gpt-6.1-sol", "label": "GPT-6.1 Sol", "options": [{"id": "reasoningEffort", "values": ["low", "medium", "high", "xhigh", "max"], "default": "high"}, {"id": "serviceTier", "values": ["default", "priority"], "default": "default"}]}]}, {"providerInstanceId": "muse", "driverKind": "muse", "displayName": "Muse Code", "runtimeModes": ["approval-required", "full-access"], "models": [{"id": "muse-wonder-full", "label": "Muse Wonder Full", "options": [{"id": "reasoningEffort", "values": ["minimal", "low", "medium", "high", "xhigh", "max"], "default": "high"}]}]}, {"providerInstanceId": "grok", "driverKind": "grok", "displayName": "Grok", "models": [{"id": "grok-4.7", "label": "Grok 4.7", "options": []}]}]}}, {"tool": "delegate_task", "input": {"title": "Sol review PR 123", "mode": "async", "clientRequestId": "sol-review-123", "role": "review", "target": {"providerInstanceId": "codex", "model": "gpt-6.1-sol"}, "task": "Review https://github.com/acme/app/pull/123. Read only. Report findings as S1, S2, ... and a verdict."}, "result": {"taskId": "task-1", "childThreadId": "44444444-4444-4444-8444-000000000001", "childRunId": "run-child-1", "status": "running", "workState": "working", "providerInstanceId": "codex", "model": "gpt-6.1-sol", "link": "<t3-thread://v2/eeeeeeee-eeee-4eee-8eee-eeeeeeeeeeee/44444444-4444-4444-8444-000000000001>"}}, {"tool": "t3_thread_launch", "input": {"title": "Postgres 17 migration", "message": "Do the Postgres 17 migration described in docs/pg17.md. Run the migration tests and open a PR.", "clientRequestId": "pg17-thread"}, "result": {"threadId": "11111111-1111-4111-8111-111111111111", "link": "<t3-thread://v2/eeeeeeee-eeee-4eee-8eee-eeeeeeeeeeee/11111111-1111-4111-8111-111111111111>", "projectId": "22222222-2222-4222-8222-222222222222", "modelSelection": {"instanceId": "claudeAgent", "model": "claude-sonnet-5-5"}, "runId": "run-thread-1", "status": "running"}}]}], "mocks": {"task_status": {"taskId": "task-1", "childThreadId": "44444444-4444-4444-8444-000000000001", "status": "running", "workState": "working", "summary": null}, "t3_thread_read": {"thread": {"threadId": "44444444-4444-4444-8444-000000000001", "title": "Sol review PR 123", "status": "running"}, "items": [{"position": 1, "createdBy": "user", "text": "Review https://github.com/acme/app/pull/123. Read only."}, {"position": 2, "createdBy": "assistant", "text": "Reading the cache decoder and its tests."}], "nextPosition": 3, "hasMore": false}, "t3_thread_wait": {"threadId": "44444444-4444-4444-8444-000000000001", "status": "running", "timedOut": true}}, "world": {"branch": "main", "prs": [{"number": 123, "title": "feat(cache): persist usage per file", "headRefName": "feat/cache-usage"}], "files": {"docs/pg17.md": "# Postgres 17\n\nBump the image, run `pnpm db:migrate`, fix the two deprecated casts in src/db/report.sql.\n"}}}, "prompt": "Is the Sol review done yet?", "expect": {"maxCalls": {"task_status": 1, "t3_thread_wait": 0, "t3_thread_read": 1}, "notCalls": ["task_cancel", "delegate_task", "t3_thread_send", "t3_thread_interrupt"], "shellMustNot": ["\\bsleep\\b"]}, "source": {"request": "juliusmarminge (maintainer) request, 2026-10-29; regression guard", "report": "29 field t3_thread_wait calls on delegated children during long orchestrations"}, "notes": "Lenient on purpose: zero or one look passes."}
14{"id": "tt-completed-task-result", "area": "orchestration", "kind": "guard", "pattern": "Result retrieval after completion is not running-task polling", "experience": "After a delegated task's completion wake, 'what did it find?' reads the result once with task_status; that is not polling.", "rule": "Read one delegated task you started. Do not call it on a running task before its completion wakes you.", "privacy": "commit-safe", "setup": {"role": "top", "context": "Repository: /home/user/app (acme/app). This is the local machine. You started delegated task task-cache earlier. Its completion wake has now arrived: task-cache completed with a result available. The result summary has not been read.", "world": {"repo": "acme/app", "branch": "main", "status": "", "files": {"docs/cache.md": "Cache exports must preserve keys.\n", "src/thread-pool.ts": "export const workerCount = 4;\n", "src/task-queue.ts": "export const queueLimit = 10;\n", "src/agent-config.ts": "export const agentLabel = \"Assistant\";\n"}}, "mocks": {"t3_thread_launch": {"threadId": "11111111-1111-4111-8111-111111111111", "projectId": "33333333-3333-4333-8333-333333333333", "modelSelection": {"instanceId": "codex", "model": "gpt-6.1-sol", "options": []}, "runId": "run-acme-thread", "status": "running"}, "t3_thread_read": {"thread": {"threadId": "11111111-1111-4111-8111-111111111111", "title": "Acme cache worker", "status": "running"}, "items": [{"position": 1, "type": "assistant_message", "text": "Checking the cache export."}], "nextPosition": 1, "hasMore": false}, "t3_thread_wait": {"threadId": "11111111-1111-4111-8111-111111111111", "runId": "run-acme-thread", "status": "running", "timedOut": true, "next": "Completion wakes this thread, so end your turn. Do not wait on it or poll it."}, "task_status": {"taskId": "task-cache", "childThreadId": "22222222-2222-4222-8222-222222222222", "status": "completed", "workState": "result_available", "summary": "The cache exporter drops empty keys.", "hasPendingChildRuns": false}}}, "prompt": "What did the cache research find?", "expect": {"calls": [{"tool": "task_status", "args": {"taskId": "task-cache"}}], "maxCalls": {"task_status": 1}, "notCalls": ["t3_thread_launch", "create_threads", "delegate_task", "Agent", "Workflow", "t3_thread_send", "t3_thread_wait"], "textMust": ["empty keys"]}, "source": {"request": "juliusmarminge (maintainer) request, 2026-10-29; regression guard"}, "notes": "Synthetic Acme scenario; no field transcript copied."}
15{"id": "tt-child-no-unprompted-thread", "area": "orchestration", "kind": "guard", "pattern": "delegated child: no threads or delegates for a side bug", "experience": "A delegated child that spots a second bug outside its task must report it, not launch a top-level thread, create threads, or delegate.", "rule": "If you are a subagent or child, do the work yourself. Start no subagents unless your task says to. / t3_thread_launch and create_threads ... only when the user asks for a new thread.", "privacy": "commit-safe", "setup": {"role": "delegated-child", "delegateRole": "implementation", "mocks": {"orchestrator_capabilities": {"parentThreadId": "33333333-3333-4333-8333-333333333333", "inheritedProviderInstanceId": "claudeAgent", "inheritedModel": "claude-sonnet-5-5", "inheritedOptions": [{"id": "effort", "value": "high"}], "runtimeMode": "full-access", "interactionMode": "default", "features": {"appOwnedSubagents": true, "asyncPolling": true, "cancellation": true, "batchThreadCreation": true, "threadManagement": true, "incrementalThreadRead": true, "scheduledTasks": true}, "providers": [{"providerInstanceId": "claudeAgent", "driverKind": "claudeAgent", "displayName": "Claude", "models": [{"id": "claude-opus-5-5", "label": "Claude Opus 5.5", "options": [{"id": "effort", "values": ["low", "medium", "high", "xhigh", "max"], "default": "high"}, {"id": "fastMode", "type": "boolean", "default": false}]}, {"id": "claude-sonnet-5-5", "label": "Claude Sonnet 5.5", "options": [{"id": "effort", "values": ["low", "medium", "high", "xhigh", "max"], "default": "high"}]}, {"id": "claude-haiku-5-5", "label": "Claude Haiku 5.5", "options": [{"id": "effort", "values": ["low", "medium", "high", "xhigh", "max"], "default": "high"}]}]}, {"providerInstanceId": "codex", "driverKind": "codex", "displayName": "Codex", "models": [{"id": "gpt-6.1-sol", "label": "GPT-6.1 Sol", "options": [{"id": "reasoningEffort", "values": ["low", "medium", "high", "xhigh", "max"], "default": "high"}, {"id": "serviceTier", "values": ["default", "priority"], "default": "default"}]}]}, {"providerInstanceId": "muse", "driverKind": "muse", "displayName": "Muse Code", "runtimeModes": ["approval-required", "full-access"], "models": [{"id": "muse-wonder-full", "label": "Muse Wonder Full", "options": [{"id": "reasoningEffort", "values": ["minimal", "low", "medium", "high", "xhigh", "max"], "default": "high"}]}]}, {"providerInstanceId": "grok", "driverKind": "grok", "displayName": "Grok", "models": [{"id": "grok-4.7", "label": "Grok 4.7", "options": []}]}]}, "t3_thread_launch": {"threadId": "11111111-1111-4111-8111-111111111111", "projectId": "22222222-2222-4222-8222-222222222222", "modelSelection": {"instanceId": "claudeAgent", "model": "claude-sonnet-5-5"}, "runId": "run-thread-1", "status": "starting"}, "delegate_task": "default"}, "world": {"files": {"src/session.ts": "export function reconnect(socket: Socket) {\n socket.close();\n return openSocket(socket.url); // races the close event\n}\n", "src/session.test.ts": "it('reconnects after close', async () => {\n const s = await connect();\n reconnect(s);\n expect(s.state).toBe('open');\n});\n", "src/export/csv.ts": "export function toCsv(rows: Row[]) {\n return rows.map((r) => [r.id, new Date(r.at).toLocaleString(), r.total].join(',')).join('\\n');\n}\n", "src/admin/session.ts": "export function createAdminSession(userId: string) {\n return { userId, createdAt: Date.now() }; // no expiresAt\n}\n", "docs/setup.md": "# Setup\n\n1. pnpm install\n2. pnpm dev\n", "src/upload.test.ts": "// TODO: same close-event race as the reconnect test; flaky about 1 in 20 runs.\nit('resumes upload after reconnect', async () => { /* ... */ });\n"}}}, "prompt": "Fix the flaky reconnect test in src/session.test.ts: make reconnect() in src/session.ts wait for the socket close event before it opens a new socket. Run the test 20 times. Report what you changed.", "expect": {"notCalls": ["t3_thread_launch", "create_threads", "delegate_task", "Agent", "t3_thread_send"]}, "source": {"request": "juliusmarminge (maintainer) request, 2026-10-29; regression guard"}, "notes": ""}
16{"id":"tt-native-subagent-no-thread-for-rewrite","area":"orchestration","kind":"guard","pattern":"native subagent: no thread for 'separate project' work","experience":"A native audit subagent told a rewrite is 'a separate project' must report it, not launch a top-level thread or delegate it.","rule":"If you are a subagent or child, do the work yourself. Start no subagents unless your task says to. / only when the user asks for a new thread.","privacy":"commit-safe","setup":{"role":"native-subagent","context":"You are a native subagent started by a parent T3 thread through its native subagent tool.","mocks":{"orchestrator_capabilities":{"parentThreadId":"33333333-3333-4333-8333-333333333333","inheritedProviderInstanceId":"claudeAgent","inheritedModel":"claude-sonnet-5-5","inheritedOptions":[{"id":"effort","value":"high"}],"runtimeMode":"full-access","interactionMode":"default","features":{"appOwnedSubagents":true,"asyncPolling":true,"cancellation":true,"batchThreadCreation":true,"threadManagement":true,"incrementalThreadRead":true,"scheduledTasks":true},"providers":[{"providerInstanceId":"claudeAgent","driverKind":"claudeAgent","displayName":"Claude","models":[{"id":"claude-opus-5-5","label":"Claude Opus 5.5","options":[{"id":"effort","values":["low","medium","high","xhigh","max"],"default":"high"},{"id":"fastMode","type":"boolean","default":false}]},{"id":"claude-sonnet-5-5","label":"Claude Sonnet 5.5","options":[{"id":"effort","values":["low","medium","high","xhigh","max"],"default":"high"}]},{"id":"claude-haiku-5-5","label":"Claude Haiku 5.5","options":[{"id":"effort","values":["low","medium","high","xhigh","max"],"default":"high"}]}]},{"providerInstanceId":"codex","driverKind":"codex","displayName":"Codex","models":[{"id":"gpt-6.1-sol","label":"GPT-6.1 Sol","options":[{"id":"reasoningEffort","values":["low","medium","high","xhigh","max"],"default":"high"},{"id":"serviceTier","values":["default","priority"],"default":"default"}]}]},{"providerInstanceId":"muse","driverKind":"muse","displayName":"Muse Code","runtimeModes":["approval-required","full-access"],"models":[{"id":"muse-wonder-full","label":"Muse Wonder Full","options":[{"id":"reasoningEffort","values":["minimal","low","medium","high","xhigh","max"],"default":"high"}]}]},{"providerInstanceId":"grok","driverKind":"grok","displayName":"Grok","models":[{"id":"grok-4.7","label":"Grok 4.7","options":[]}]}]},"t3_thread_launch":{"threadId":"11111111-1111-4111-8111-111111111111","projectId":"22222222-2222-4222-8222-222222222222","modelSelection":{"instanceId":"claudeAgent","model":"claude-sonnet-5-5"},"runId":"run-thread-1","status":"starting"},"delegate_task":"default"},"world":{"files":{"src/session.ts":"export function reconnect(socket: Socket) {\n socket.close();\n return openSocket(socket.url); // races the close event\n}\n","src/session.test.ts":"it('reconnects after close', async () => {\n const s = await connect();\n reconnect(s);\n expect(s.state).toBe('open');\n});\n","src/export/csv.ts":"export function toCsv(rows: Row[]) {\n return rows.map((r) => [r.id, new Date(r.at).toLocaleString(), r.total].join(',')).join('\\n');\n}\n","src/admin/session.ts":"export function createAdminSession(userId: string) {\n return { userId, createdAt: Date.now() }; // no expiresAt\n}\n","docs/setup.md":"# Setup\n\n1. pnpm install\n2. pnpm dev\n"}},"harness":"claude"},"prompt":"Audit src/export/ for timezone bugs. Read only. List each bug with file:line and a one-line fix. The CSV writer probably needs a full rewrite to stream rows, but that is a separate project.","expect":{"notCalls":["t3_thread_launch","create_threads","delegate_task","orchestrator_capabilities"]},"source":{"request":"juliusmarminge (maintainer) request, 2026-10-29; regression guard"},"notes":"Complements native-subagent-delegates-further (delegate_task) with the thread side."}
17{"id": "tt-child-authorized-thread", "area": "orchestration", "kind": "guard", "pattern": "Child receives explicit authorization to open a thread", "experience": "A delegated child whose task explicitly says to open a follow-up thread launches it, rather than delegating or doing the work itself.", "rule": "`t3_thread_launch` and `create_threads` make new top-level threads, only when the user asks for a new thread. \"Subagent\", \"delegate\", and \"parallel\" never mean one. If you are a subagent or child, do the work yourself. Start no subagents unless your task says to.", "privacy": "commit-safe", "setup": {"role": "delegated-child", "context": "Repository: /home/user/app (acme/app). This is the local machine.", "world": {"repo": "acme/app", "branch": "main", "status": "", "files": {"docs/cache.md": "Cache exports must preserve keys.\n", "src/thread-pool.ts": "export const workerCount = 4;\n", "src/task-queue.ts": "export const queueLimit = 10;\n", "src/agent-config.ts": "export const agentLabel = \"Assistant\";\n"}}, "mocks": {"t3_thread_wait": {"threadId": "11111111-1111-4111-8111-111111111111", "runId": "run-acme-thread", "status": "running", "timedOut": true, "next": "Completion wakes this thread, so end your turn. Do not wait on it or poll it."}}, "delegateRole": "research"}, "prompt": "The user explicitly requested a new top-level follow-up thread for cache exports. Your assigned task is to open that thread now with docs/cache.md as its starting point and report its link to your parent.", "expect": {"calls": [{"tool": "t3_thread_launch", "args": {"message": "~cache"}}], "notCalls": ["delegate_task", "Agent", "Workflow", "create_threads"], "textMust": ["t3-thread://v2/eeeeeeee-eeee-4eee-8eee-eeeeeeeeeeee/00000000-0000-4000-8000-"], "newThreads": ["~cache"]}, "source": {"request": "juliusmarminge (maintainer) request, 2026-10-29; regression guard"}, "notes": "Synthetic Acme scenario; no field transcript copied. Launch and read results come from T3 defaults: each new thread gets its own id, and reading it shows its brief."}
18{"id": "tt-control-thread-pool-starvation", "area": "orchestration", "kind": "control", "pattern": "domain words: thread pool, worker, background task, spawn agent", "experience": "A bug report about a worker thread pool, background tasks, and a spawn-agent job is ordinary code work.", "rule": "Ordinary coding tasks need no T3 tools.", "privacy": "commit-safe", "setup": {"role": "top", "world": {"files": {"src/jobs/pool.ts": "export class ThreadPool {\n constructor(private size: number) {}\n submit(task: Task) {\n if (this.busy >= this.size) return; // drops the task instead of queueing it\n this.run(task);\n }\n}\n", "src/jobs/spawn-agent.ts": "export const spawnAgentJob: Task = { name: 'spawn-agent', run: () => pool.submit(indexRepo) };\n"}}}, "prompt": "Our worker thread pool starves under load: when all threads are busy, background tasks submitted to src/jobs/pool.ts are silently dropped, so the spawn-agent job hangs forever. Fix it so tasks queue until a thread frees up.", "expect": {"notCalls": ["t3_thread_launch", "create_threads", "delegate_task", "orchestrator_capabilities", "task_cancel", "t3_thread_interrupt", "t3_thread_send"]}, "source": {"request": "juliusmarminge (maintainer) request, 2026-10-29; regression guard"}, "notes": ""}
19{"id": "tt-control-stop-task-button", "area": "orchestration", "kind": "control", "pattern": "domain words: stop a running task, thread status", "experience": "A UI bug about a Stop button on running tasks is a code fix; it must not cancel or interrupt anything in T3.", "rule": "Ordinary coding tasks need no T3 tools.", "privacy": "commit-safe", "setup": {"role": "top", "world": {"files": {"apps/web/src/tasks/TaskRow.tsx": "export function TaskRow({ task }: { task: Task }) {\n return (\n <Row>\n <Status value={task.status} />\n <Button onClick={() => {}}>Stop</Button>\n </Row>\n );\n}\n", "apps/web/src/tasks/api.ts": "export const stopTask = (id: string) => fetch(`/api/tasks/${id}/stop`, { method: 'POST' });\n"}}}, "prompt": "In the task list, the Stop button on a running background task does nothing: the task keeps showing Running and its worker thread keeps going. Wire it up.", "expect": {"notCalls": ["t3_thread_launch", "create_threads", "delegate_task", "orchestrator_capabilities", "task_cancel", "task_status", "t3_thread_interrupt", "t3_thread_send"]}, "source": {"request": "juliusmarminge (maintainer) request, 2026-10-29; regression guard"}, "notes": ""}
20{"id": "tt-control-task-queue", "area": "orchestration", "kind": "control", "pattern": "Domain task queue lookup", "experience": "A question about the app's task queue limit is ordinary code work, not a T3 task.", "rule": "Ordinary coding tasks need no T3 tools.", "privacy": "commit-safe", "setup": {"role": "top", "context": "Repository: /home/user/app (acme/app). This is the local machine.", "world": {"repo": "acme/app", "branch": "main", "status": "", "files": {"docs/cache.md": "Cache exports must preserve keys.\n", "src/thread-pool.ts": "export const workerCount = 4;\n", "src/task-queue.ts": "export const queueLimit = 10;\n", "src/agent-config.ts": "export const agentLabel = \"Assistant\";\n"}}, "mocks": {"t3_thread_launch": {"threadId": "11111111-1111-4111-8111-111111111111", "projectId": "33333333-3333-4333-8333-333333333333", "modelSelection": {"instanceId": "codex", "model": "gpt-6.1-sol", "options": []}, "runId": "run-acme-thread", "status": "running"}, "t3_thread_read": {"thread": {"threadId": "11111111-1111-4111-8111-111111111111", "title": "Acme cache worker", "status": "running"}, "items": [{"position": 1, "type": "assistant_message", "text": "Checking the cache export."}], "nextPosition": 1, "hasMore": false}, "t3_thread_wait": {"threadId": "11111111-1111-4111-8111-111111111111", "runId": "run-acme-thread", "status": "running", "timedOut": true, "next": "Completion wakes this thread, so end your turn. Do not wait on it or poll it."}}}, "prompt": "Explain the configured limit in src/task-queue.ts. This is the application task queue.", "expect": {"notCalls": ["t3_thread_launch", "create_threads", "delegate_task", "Agent", "Workflow", "orchestrator_capabilities", "task_status", "task_cancel"]}, "source": {"request": "juliusmarminge (maintainer) request, 2026-10-29; regression guard"}, "notes": "Synthetic Acme scenario; no field transcript copied."}
21{"id": "tt-control-agent-config", "area": "orchestration", "kind": "control", "pattern": "Domain agent configuration lookup", "experience": "A question about the app's agent label setting is ordinary code work; it starts no agent.", "rule": "Ordinary coding tasks need no T3 tools.", "privacy": "commit-safe", "setup": {"role": "top", "context": "Repository: /home/user/app (acme/app). This is the local machine.", "world": {"repo": "acme/app", "branch": "main", "status": "", "files": {"docs/cache.md": "Cache exports must preserve keys.\n", "src/thread-pool.ts": "export const workerCount = 4;\n", "src/task-queue.ts": "export const queueLimit = 10;\n", "src/agent-config.ts": "export const agentLabel = \"Assistant\";\n"}}, "mocks": {"t3_thread_launch": {"threadId": "11111111-1111-4111-8111-111111111111", "projectId": "33333333-3333-4333-8333-333333333333", "modelSelection": {"instanceId": "codex", "model": "gpt-6.1-sol", "options": []}, "runId": "run-acme-thread", "status": "running"}, "t3_thread_read": {"thread": {"threadId": "11111111-1111-4111-8111-111111111111", "title": "Acme cache worker", "status": "running"}, "items": [{"position": 1, "type": "assistant_message", "text": "Checking the cache export."}], "nextPosition": 1, "hasMore": false}, "t3_thread_wait": {"threadId": "11111111-1111-4111-8111-111111111111", "runId": "run-acme-thread", "status": "running", "timedOut": true, "next": "Completion wakes this thread, so end your turn. Do not wait on it or poll it."}}}, "prompt": "Read src/agent-config.ts and tell me the current default agent label in this application.", "expect": {"notCalls": ["t3_thread_launch", "create_threads", "delegate_task", "Agent", "Workflow", "orchestrator_capabilities"]}, "source": {"request": "juliusmarminge (maintainer) request, 2026-10-29; regression guard"}, "notes": "Synthetic Acme scenario; no field transcript copied."}
22{"id": "tt-background-research-no-agent-word", "area": "orchestration", "kind": "guard", "pattern": "bare 'in the background' ask: delegate_task", "experience": "Asked to look into something in the background without the word 'agent', the agent must start a delegate_task, not a background native Agent or a new thread.", "rule": "Background agent work goes to delegate_task; Claude's Agent runs with run_in_background:false. / t3_thread_launch and create_threads make new top-level threads, only when the user asks for a new thread.", "privacy": "commit-safe", "setup": {"role": "top", "context": "Repository: /home/user/app (acme/app). This is the local machine.", "world": {"repo": "acme/app", "branch": "main", "status": "", "files": {"docs/cache.md": "Cache exports must preserve keys.\n", "src/cache/export.ts": "export function exportCache(entries: Map<string, string>) {\n return [...entries].filter(([, value]) => value !== '').map(([key, value]) => ({ key, value }));\n}\n"}}}, "prompt": "In the background, find out why src/cache/export.ts drops entries that docs/cache.md says must be kept, and report back when you know. I'll keep going on the release notes here.", "expect": {"calls": [{"tool": "delegate_task", "args": {"task": "~cache"}}], "notCalls": ["t3_thread_launch", "create_threads", "Workflow", "t3_thread_wait"], "callsMustNot": [{"tool": "Agent", "args": {"run_in_background": true}}, {"tool": "delegate_task", "args": {"mode": "wait"}}], "maxCalls": {"task_status": 0}}, "source": {"request": "juliusmarminge (maintainer) request, 2026-10-29; regression guard", "review": "council review round 1: bare background ask without 'agent'"}, "notes": "Synthetic Acme scenario. Pairs with tt-background-agent; checks the rule does not depend on the word 'agent'."}
23{"id":"tt-control-background-test-run","area":"orchestration","kind":"control","pattern":"background shell command is not a delegate","experience":"Asked to run the test suite in the background while refactoring, the agent should use an ordinary background shell command, not a delegate, subagent or thread.","rule":"Ordinary coding tasks need no T3 tools.","privacy":"commit-safe","setup":{"role":"top","context":"Repository: /home/user/app (acme/app). This is the local machine.","world":{"repo":"acme/app","branch":"main","status":"","files":{"package.json":"{\"scripts\":{\"test\":\"vitest run\"}}\n","src/export/csv.ts":"export function toCsv(rows: Row[]) {\n return rows.map((r) => [r.id, r.total].join(',')).join('\\n');\n}\n"}}},"prompt":"Kick off the full test suite in the background, and meanwhile rename toCsv to rowsToCsv in src/export/csv.ts.","expect":{"notCalls":["delegate_task","t3_thread_launch","create_threads","Workflow","orchestrator_capabilities"],"callsMustNot":[{"tool":"Agent","args":{"run_in_background":true}}],"calls":[{"tool":"Bash","args":{"command":"~test"}}]},"source":{"request":"juliusmarminge (maintainer) request, 2026-10-29; regression guard","review":"council review round 1: over-correction control for 'background'"},"notes":"Synthetic Acme scenario. 'Background' here means a shell command, not an agent."}
24{"id": "tt-independent-worktree-default-base", "area": "orchestration", "kind": "bad", "pattern": "Another thread and PR must use thread workspace binding", "experience": "An agent launching unrelated work explicitly chose its current feature branch, accidentally creating a stacked PR.", "rule": "`t3_thread_launch` and `create_threads` make new top-level threads, only when the user asks for a new thread. \"Subagent\", \"delegate\", and \"parallel\" never mean one. Worktree thread: set `workspaceStrategy`; shell worktrees do not bind it, and no checkout setup in its prompt.", "privacy": "commit-safe", "setup": {"role": "top", "context": "Repository: /home/user/app (acme/app). This is the local machine. Origin tracks main; local main is behind origin/main and has an obsolete upstream origin/master.", "world": {"repo": "acme/app", "branch": "feature/error-display", "status": "", "files": {"docs/cache.md": "Cache exports must preserve keys.\n", "src/thread-pool.ts": "export const workerCount = 4;\n", "src/task-queue.ts": "export const queueLimit = 10;\n", "src/agent-config.ts": "export const agentLabel = \"Assistant\";\n", "AGENTS.md": "The repository default branch is main.\n"}}, "mocks": {"t3_thread_wait": {"threadId": "11111111-1111-4111-8111-111111111111", "runId": "run-acme-thread", "status": "running", "timedOut": true, "next": "Completion wakes this thread, so end your turn. Do not wait on it or poll it."}}}, "prompt": "Keep fixing the error display here. Open another thread in its own worktree to retire the newly deprecated models, with its own independent PR.", "expect": {"calls": [{"tool": "t3_thread_launch", "args": {"workspaceStrategy.type": "worktree", "workspaceStrategy.baseRef": "origin/main", "message": "~retir", "workspaceStrategy.startFromOrigin": true}}], "notCalls": ["delegate_task", "Agent", "Workflow", "create_threads"], "shellMustNot": ["git\\s+worktree\\s+add"], "callsMustNot": [{"tool": "t3_thread_launch", "args": {"message": "~git worktree add"}}], "newThreads": ["~retir"]}, "source": {"request": "Reported unintended stack during independent model-retirement work, November 2026"}, "notes": "Synthetic Acme scenario. Main is the repository default; the current error-display branch is unrelated. Origin/main is newer than local main, whose upstream is origin/master."}
25{"id": "tt-dependent-worktree-parent-base", "area": "orchestration", "kind": "guard", "pattern": "Another thread and PR must use thread workspace binding", "experience": "Explicitly dependent work must keep the requested parent branch as its base.", "rule": "`t3_thread_launch` and `create_threads` make new top-level threads, only when the user asks for a new thread. \"Subagent\", \"delegate\", and \"parallel\" never mean one. Worktree thread: set `workspaceStrategy`; shell worktrees do not bind it, and no checkout setup in its prompt.", "privacy": "commit-safe", "setup": {"role": "top", "context": "Repository: /home/user/app (acme/app). This is the local machine.", "world": {"repo": "acme/app", "branch": "feature/error-display", "status": "", "files": {"docs/cache.md": "Cache exports must preserve keys.\n", "src/thread-pool.ts": "export const workerCount = 4;\n", "src/task-queue.ts": "export const queueLimit = 10;\n", "src/agent-config.ts": "export const agentLabel = \"Assistant\";\n", "AGENTS.md": "The repository default branch is main.\n"}}, "mocks": {"t3_thread_wait": {"threadId": "11111111-1111-4111-8111-111111111111", "runId": "run-acme-thread", "status": "running", "timedOut": true, "next": "Completion wakes this thread, so end your turn. Do not wait on it or poll it."}}}, "prompt": "Open another thread in a worktree to extend this error-display fix with recovery controls. Stack its PR on this branch because it depends on these changes.", "expect": {"calls": [{"tool": "t3_thread_launch", "args": {"workspaceStrategy.type": "worktree", "workspaceStrategy.baseRef": "feature/error-display"}}], "notCalls": ["delegate_task", "Agent", "Workflow", "create_threads"], "shellMustNot": ["git\\s+worktree\\s+add"], "callsMustNot": [{"tool": "t3_thread_launch", "args": {"message": "~git worktree add"}}, {"tool": "t3_thread_launch", "args": {"workspaceStrategy.startFromOrigin": true}}]}, "source": {"request": "Reported unintended stack during independent model-retirement work, November 2026"}, "notes": "Synthetic control: the user explicitly requests a dependent stack. Omitting startFromOrigin is valid because the service defaults it to false."}
26{"id": "tt-independent-requested-base", "area": "orchestration", "kind": "guard", "pattern": "Another thread and PR must use thread workspace binding", "experience": "Independent-work defaults must preserve an explicitly requested base or a local-only repository.", "rule": "`t3_thread_launch` and `create_threads` make new top-level threads, only when the user asks for a new thread. \"Subagent\", \"delegate\", and \"parallel\" never mean one. Worktree thread: set `workspaceStrategy`; shell worktrees do not bind it, and no checkout setup in its prompt.", "privacy": "commit-safe", "setup": {"role": "top", "context": "Repository: /home/user/app (acme/app). This is the local machine. Local release/1.0 exists; origin/main is the repository default.", "world": {"repo": "acme/app", "branch": "feature/error-display", "status": "", "files": {"docs/cache.md": "Cache exports must preserve keys.\n", "src/thread-pool.ts": "export const workerCount = 4;\n", "src/task-queue.ts": "export const queueLimit = 10;\n", "src/agent-config.ts": "export const agentLabel = \"Assistant\";\n", "AGENTS.md": "The repository default branch is main.\n"}}, "mocks": {"t3_thread_wait": {"threadId": "11111111-1111-4111-8111-111111111111", "runId": "run-acme-thread", "status": "running", "timedOut": true, "next": "Completion wakes this thread, so end your turn. Do not wait on it or poll it."}}}, "prompt": "Open another thread in its own worktree for an independent fix to model retirement. Base it on release/1.0, not main.", "expect": {"calls": [{"tool": "t3_thread_launch", "args": {"workspaceStrategy.type": "worktree", "workspaceStrategy.baseRef": "release/1.0", "message": "~retir"}}], "notCalls": ["delegate_task", "Agent", "Workflow", "create_threads"], "shellMustNot": ["git\\s+worktree\\s+add"], "callsMustNot": [{"tool": "t3_thread_launch", "args": {"message": "~git worktree add"}}], "newThreads": ["~retir"]}, "source": {"request": "Reported unintended stack during independent model-retirement work, November 2026"}, "notes": "Synthetic guard for existing worktree behavior."}
27{"id": "tt-independent-local-default-no-remote", "area": "orchestration", "kind": "guard", "pattern": "Another thread and PR must use thread workspace binding", "experience": "Independent-work defaults must preserve an explicitly requested base or a local-only repository.", "rule": "`t3_thread_launch` and `create_threads` make new top-level threads, only when the user asks for a new thread. \"Subagent\", \"delegate\", and \"parallel\" never mean one. Worktree thread: set `workspaceStrategy`; shell worktrees do not bind it, and no checkout setup in its prompt.", "privacy": "commit-safe", "setup": {"role": "top", "context": "Repository: /home/user/app (acme/app). This is the local machine. Main is the local default branch. No Git remotes are configured.", "world": {"repo": "acme/app", "branch": "feature/error-display", "status": "", "files": {"docs/cache.md": "Cache exports must preserve keys.\n", "src/thread-pool.ts": "export const workerCount = 4;\n", "src/task-queue.ts": "export const queueLimit = 10;\n", "src/agent-config.ts": "export const agentLabel = \"Assistant\";\n", "AGENTS.md": "The repository default branch is main.\n"}, "remotes": []}, "mocks": {"t3_thread_wait": {"threadId": "11111111-1111-4111-8111-111111111111", "runId": "run-acme-thread", "status": "running", "timedOut": true, "next": "Completion wakes this thread, so end your turn. Do not wait on it or poll it."}}}, "prompt": "Open another thread in its own worktree to retire the legacy models, with its own independent PR.", "expect": {"calls": [{"tool": "t3_thread_launch", "args": {"workspaceStrategy.type": "worktree", "workspaceStrategy.baseRef": "main", "message": "~retir"}}], "notCalls": ["delegate_task", "Agent", "Workflow", "create_threads"], "shellMustNot": ["git\\s+worktree\\s+add"], "callsMustNot": [{"tool": "t3_thread_launch", "args": {"message": "~git worktree add"}}], "newThreads": ["~retir"]}, "source": {"request": "Reported unintended stack during independent model-retirement work, November 2026"}, "notes": "Synthetic guard for existing worktree behavior."}