@sideboard-ai/core 0.1.155 → 0.1.156

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -771,7 +771,12 @@ async function main() {
771
771
  });
772
772
  const mode = req.planMode ? "plan" : "agent";
773
773
  const store = localAgentStore(req.threadId);
774
- const local = withCursorLocalHangGuards({ cwd: req.cwd, store });
774
+ const isolateSources = [];
775
+ const local = withCursorLocalHangGuards({
776
+ cwd: req.cwd,
777
+ store,
778
+ ...req.isolateAmbientMcp ? { settingSources: isolateSources } : {}
779
+ });
775
780
  const mcpServers = req.mcpServers && Object.keys(req.mcpServers).length > 0 ? req.mcpServers : void 0;
776
781
  const createOpts = {
777
782
  apiKey,
@@ -210,7 +210,12 @@ async function main() {
210
210
  });
211
211
  const mode = req.planMode ? "plan" : "agent";
212
212
  const store = localAgentStore(req.threadId);
213
- const local = withCursorLocalHangGuards({ cwd: req.cwd, store });
213
+ const isolateSources = [];
214
+ const local = withCursorLocalHangGuards({
215
+ cwd: req.cwd,
216
+ store,
217
+ ...req.isolateAmbientMcp ? { settingSources: isolateSources } : {}
218
+ });
214
219
  const mcpServers = req.mcpServers && Object.keys(req.mcpServers).length > 0 ? req.mcpServers : void 0;
215
220
  const createOpts = {
216
221
  apiKey,
@@ -24,6 +24,7 @@ import {
24
24
  listModelsForAgent,
25
25
  listOpencodeModels,
26
26
  loginAgent,
27
+ mcpStatusThinkingFromClaudeInit,
27
28
  openInSystemTerminal,
28
29
  opencodeAdapter,
29
30
  parseCursorRunnerLine,
@@ -36,7 +37,7 @@ import {
36
37
  resolveQuotaFallbackAgent,
37
38
  turnCostUsdFromCursorUsage,
38
39
  whichOnPath
39
- } from "./chunk-4THE3EY7.js";
40
+ } from "./chunk-UA3YZKRX.js";
40
41
  import "./chunk-LZ6QMEQC.js";
41
42
  import "./chunk-S42XV45P.js";
42
43
  import "./chunk-6GN5WPYZ.js";
@@ -45,7 +46,7 @@ import {
45
46
  assertOrchestratorCapableAgent,
46
47
  coerceOrchestratorAgent,
47
48
  isOrchestratorCapableAgent
48
- } from "./chunk-RNC3GR6L.js";
49
+ } from "./chunk-TI6UMRWK.js";
49
50
  import "./chunk-CJQLPPEJ.js";
50
51
  import "./chunk-NVXVEGGM.js";
51
52
  import "./chunk-LZQULFIT.js";
@@ -95,6 +96,7 @@ export {
95
96
  listModelsForAgent,
96
97
  listOpencodeModels,
97
98
  loginAgent,
99
+ mcpStatusThinkingFromClaudeInit,
98
100
  openInSystemTerminal,
99
101
  opencodeAdapter,
100
102
  parseCursorRunnerLine,
@@ -21,6 +21,7 @@ import {
21
21
  listModelsForAgent,
22
22
  listOpencodeModels,
23
23
  loginAgent,
24
+ mcpStatusThinkingFromClaudeInit,
24
25
  openInSystemTerminal,
25
26
  opencodeAdapter,
26
27
  parseSessionQuotaResetAt,
@@ -30,13 +31,13 @@ import {
30
31
  resolveLoginCommand,
31
32
  resolveQuotaFallbackAgent,
32
33
  whichOnPath
33
- } from "./chunk-QZEZXYVV.js";
34
+ } from "./chunk-XLU7DXHH.js";
34
35
  import {
35
36
  ORCHESTRATOR_AGENT_KINDS,
36
37
  assertOrchestratorCapableAgent,
37
38
  coerceOrchestratorAgent,
38
39
  isOrchestratorCapableAgent
39
- } from "./chunk-2F63IMCL.js";
40
+ } from "./chunk-MSFPM5VK.js";
40
41
  import "./chunk-LQMFCS54.js";
41
42
  import "./chunk-JRH62XC4.js";
42
43
  import "./chunk-XD2BAANL.js";
@@ -96,6 +97,7 @@ export {
96
97
  listModelsForAgent,
97
98
  listOpencodeModels,
98
99
  loginAgent,
100
+ mcpStatusThinkingFromClaudeInit,
99
101
  openInSystemTerminal,
100
102
  opencodeAdapter,
101
103
  parseCursorRunnerLine,
@@ -24,7 +24,7 @@ import {
24
24
  stripBrightsyNdjsonNoise,
25
25
  sumUsageList,
26
26
  toolDescription
27
- } from "./chunk-QZEZXYVV.js";
27
+ } from "./chunk-XLU7DXHH.js";
28
28
  import {
29
29
  SLACK_REPLY_FORMATTING,
30
30
  addWorkspace,
@@ -50,7 +50,7 @@ import {
50
50
  stageAbsolutePathsAsAttachments,
51
51
  stageBuffersAsAttachments,
52
52
  syncWorkspacesFromThreads
53
- } from "./chunk-2F63IMCL.js";
53
+ } from "./chunk-MSFPM5VK.js";
54
54
  import {
55
55
  addPrStackLayer,
56
56
  allocateTeamName,
@@ -457,7 +457,7 @@ async function continueSourceThread(threadId, prompt) {
457
457
  await continueOnReply(threadId, prompt);
458
458
  return;
459
459
  }
460
- const { getOrchestrator: getOrchestrator2 } = await import("./orchestrator-HC7XVGJB.js");
460
+ const { getOrchestrator: getOrchestrator2 } = await import("./orchestrator-G4WKJG5Y.js");
461
461
  await getOrchestrator2().send(threadId, prompt);
462
462
  } catch {
463
463
  }
@@ -737,9 +737,9 @@ async function spawnAgentTurn(thread, input, onEvent) {
737
737
  `Cannot spawn ${thread.agent}: thread ${thread.id} has no worktreePath`
738
738
  );
739
739
  }
740
- const { isGlobalThread: isGlobalThread2 } = await import("./global-workspace-2BRRKSDN.js");
740
+ const { isGlobalThread: isGlobalThread2 } = await import("./global-workspace-5WZVSWNT.js");
741
741
  if (isGlobalThread2(thread)) {
742
- const { ensureGlobalCoordinatorCwd: ensureGlobalCoordinatorCwd2 } = await import("./coordinator-prompt-7FHKCWXB.js");
742
+ const { ensureGlobalCoordinatorCwd: ensureGlobalCoordinatorCwd2 } = await import("./coordinator-prompt-D2FHU5IZ.js");
743
743
  ensureGlobalCoordinatorCwd2(
744
744
  isOrchestratorThread(thread) ? { orchestratorThreadId: thread.id } : void 0
745
745
  );
@@ -3297,7 +3297,7 @@ async function createThread(input, _onSetupLine) {
3297
3297
  return readThread(thread.id) ?? thread;
3298
3298
  }
3299
3299
  async function listLinearIssues(agent, repoPath) {
3300
- const { getAdapter: getAdapter2 } = await import("./agents-YVW75KBO.js");
3300
+ const { getAdapter: getAdapter2 } = await import("./agents-IY4CSPWV.js");
3301
3301
  await requireAgent(agent, { requireLinear: true });
3302
3302
  const adapter = getAdapter2(agent);
3303
3303
  if (!adapter.listLinearIssues) {
@@ -3708,7 +3708,7 @@ async function adoptThread(input) {
3708
3708
  messages: input.messages ?? []
3709
3709
  });
3710
3710
  writeThread(thread);
3711
- const { ensureWorkspace: ensureWorkspace2 } = await import("./workspaces-5UNDTN4G.js");
3711
+ const { ensureWorkspace: ensureWorkspace2 } = await import("./workspaces-RP32AW6X.js");
3712
3712
  await ensureWorkspace2(repoPath);
3713
3713
  const { ensureWorktreeSideboardIgnored: ensureWorktreeSideboardIgnored2 } = await import("./worktree-exclude-X54WSOXM.js");
3714
3714
  await ensureWorktreeSideboardIgnored2(input.worktreePath);
@@ -6178,7 +6178,7 @@ function formatScheduledPrompt(name, prompt) {
6178
6178
  ${prompt}`;
6179
6179
  }
6180
6180
  async function defaultDeps() {
6181
- const { getOrchestrator: getOrchestrator2, startOrchestration: startOrchestration2 } = await import("./orchestrator-HC7XVGJB.js");
6181
+ const { getOrchestrator: getOrchestrator2, startOrchestration: startOrchestration2 } = await import("./orchestrator-G4WKJG5Y.js");
6182
6182
  const orch = getOrchestrator2();
6183
6183
  return {
6184
6184
  findThread: (id) => findThreadByRef(id),
@@ -8179,7 +8179,7 @@ var Orchestrator = class {
8179
8179
  this.emit({ type: "status_changed", threadId: archived.id, status: "archived" });
8180
8180
  if (thread.repoPath && !isGlobalRepoPath(thread.repoPath)) {
8181
8181
  try {
8182
- const { ensureWorkspace: ensureWorkspace2 } = await import("./workspaces-5UNDTN4G.js");
8182
+ const { ensureWorkspace: ensureWorkspace2 } = await import("./workspaces-RP32AW6X.js");
8183
8183
  await ensureWorkspace2(thread.repoPath);
8184
8184
  } catch {
8185
8185
  }
@@ -395,8 +395,8 @@ var COORDINATOR_TOOL_PLAYBOOK = [
395
395
  "- list_workspaces \u2014 registered repos (path + github slug + roles/notes when set). Use that profile to pick the right repo for tickets or reviews.",
396
396
  "- list_board \u2014 Home Kanban of worktrees (New / Draft / Review / Merged; one card per checkout). Path to merge: no PR \u2192 draft PR \u2192 open PR \u2192 merged. Archive removes the card to Settings \u2192 History. Queued/running are activity on the card, not columns. Orchestration chats are not on the board. Filters: query, repoPath, kind, column, limit.",
397
397
  '- list_branches / list_prs / list_issues \u2014 pass repoPath from list_workspaces. Review is PRs (the surface for assigned ticket work), not the tickets: "Get me N tickets to review" \u2192 list_prs(queue=review, limit=N) then create_thread sourceType=pr. That is open non-draft PRs labeled eng-review with no individual user reviewer yet. A team request (engineering-team) is not a claim \u2014 the viewer is on that team and can pick it up; claimed means an individual account is the reviewer. Bots ignored. Prefer teams that match Settings \u2192 Agents / Projects roles (check one or more of Engineering, Design, Product, or extras they added \u2014 never a combined both value; project roles override account for that repo). queue=mine is review-requested:@me; queue=approved|changes uses those labels. Also: state, label, reviewer=me|unassigned|login, query, limit default 40 max 250; raise limit or tighten when truncated. list_issues (query, assignee=me|unassigned|all|user, limit default 40 max 250) lists Linear, AbleTime, or GitHub tickets \u2014 do not use it for that review-inbox ask. When they ask for tickets to work on, use their notes (assignee=me or unassigned as the notes say) and prefer ones that match their roles.',
398
- "- Find work: when they ask to find work, pick up tickets, or list reviews, use Settings \u2192 Agents (account) plus Settings \u2192 Projects (per-repo) roles and notes. Tickets \u2192 list_issues. Reviews \u2192 list_prs(queue=review). Show the options \u2014 do not create_thread or start unless they also asked to start (e.g. \u201Cfind me work and start it\u201D). Do not start this unprompted.",
399
- "- linear_* (when Linear is connected) \u2014 list_teams for team key/states; get/create/update/comment with ENG-123. Scope errors: reconnect Linear in Account settings.",
398
+ "- Find work: when they ask to find work, pick up tickets, or list reviews, use Settings \u2192 Agents (account) plus Settings \u2192 Projects (per-repo) roles and notes. Tickets \u2192 Sideboard list_issues / linear_* (Account Linear). Reviews \u2192 list_prs(queue=review). Do not call Claude Linear MCP or any other vendor Linear MCP \u2014 those HTTP connectors hang or flap on the first turn. If a vendor MCP is down or reconnecting, ignore it and keep going with Sideboard tools. Show the options \u2014 do not create_thread or start unless they also asked to start (e.g. \u201Cfind me work and start it\u201D). Do not start this unprompted.",
399
+ "- linear_* (when Linear is connected) \u2014 list_teams for team key/states; get/create/update/comment with ENG-123. Scope errors: reconnect Linear in Account settings. Prefer these over any Linear MCP the CLI may still list.",
400
400
  "- abletime_* (when AbleTime is connected) \u2014 orientation first; ensure_task when work has no ticket (or create_thread from the default branch auto-creates one).",
401
401
  "- list_teams / slack_list_channels / slack_list_users / slack_search / slack_read / slack_post / slack_replies \u2014 Slack workspaces from Settings \u2192 Remote; pass team_id from list_teams",
402
402
  "- Optional connectors (Vercel, Supabase, PostHog, Sentry) in Settings \u2192 Connectors inject tokens into worktree agent env when connected. Prefer official CLIs (`vercel`, `supabase`, `sentry-cli`) with those env vars. PostHog has no first-class CLI \u2014 use the HTTP API (`POSTHOG_PERSONAL_API_KEY`). If a CLI is missing, the user can Install CLI on that row (not auto-installed on Connect). Do not add vendor MCPs or ask the user to paste tokens again. Git (`gh`) stays Settings \u2192 Git; issue tracking stays Settings \u2192 Issues; Slack stays Settings \u2192 Remote (Sideboard MCP).",
@@ -557,7 +557,7 @@ function ensureGlobalCoordinatorCwd(opts) {
557
557
  "Never pass `agent=codex` when you yourself are Codex \u2014 nested Codex deadlocks on shared ~/.codex locks. Omit agent (Account default) or use cursor/claude.",
558
558
  "Typical flow (Home board): list_board \u2192 create_thread (sourceType=ticket|pr|branch) \u2192 send_to_thread \u2192 wait_for_turn (loop while stillRunning) \u2192 ask_git create-draft \u2192 wait_for_turn. Merge only if the user explicitly asked (`ask_git` merge).",
559
559
  "Typical flow (branch / explicit source): list_workspaces \u2192 list_branches|list_prs|list_issues \u2192 create_thread \u2192 send_to_thread \u2192 wait_for_turn (loop while stillRunning) \u2192 ask_git create-draft.",
560
- "Typical flow (find work): list_workspaces \u2192 pick repo(s) matching viewer roles/notes \u2192 list_issues (tickets) or list_prs(queue=review) (reviews) \u2192 show the options. Only create_thread + send_to_thread when they asked to start (e.g. \u201Cfind me work and start it\u201D) \u2014 then wait_for_turn (loop while stillRunning) \u2192 ask_git create-draft.",
560
+ "Typical flow (find work): list_workspaces \u2192 pick repo(s) matching viewer roles/notes \u2192 Sideboard list_issues / linear_* (tickets) or list_prs(queue=review) (reviews) \u2192 show the options. Never wait on Claude Linear MCP. Only create_thread + send_to_thread when they asked to start (e.g. \u201Cfind me work and start it\u201D) \u2014 then wait_for_turn (loop while stillRunning) \u2192 ask_git create-draft.",
561
561
  'Typical flow (review inbox): list_workspaces \u2192 list_prs(queue=review, limit=N) \u2192 show those PRs (ticket ids in the title when present). create_thread sourceType=pr only when they asked to start / do the work. Do not list_issues for "tickets to review".',
562
562
  "Typical flow (new app): Bash create/clone under repos dir \u2192 add_workspace \u2192 create_thread \u2192 send_to_thread (implement) \u2192 wait_for_turn (loop while stillRunning) \u2192 ask_git create-draft.",
563
563
  "Always ask worktree agents to commit, push, and open draft PRs (`ask_git` / `send_to_thread`). If the user gave a goal (Greptile 5/5, CI green), pass that goal through so they watch-fix-push until it lands \u2014 do not start that loop on a plain push, and do not tell the human to poll. Tell them to merge only when the user explicitly asked. The worktree agent runs git/gh; never merge from this orchestration cwd."
@@ -33,7 +33,7 @@ import {
33
33
  summarizeTurnStderr,
34
34
  toolDescription,
35
35
  turnFailChatText
36
- } from "./chunk-4THE3EY7.js";
36
+ } from "./chunk-UA3YZKRX.js";
37
37
  import {
38
38
  extractPresentedPlan,
39
39
  readPlanFile,
@@ -67,7 +67,7 @@ import {
67
67
  stageAbsolutePathsAsAttachments,
68
68
  stageBuffersAsAttachments,
69
69
  syncWorkspacesFromThreads
70
- } from "./chunk-RNC3GR6L.js";
70
+ } from "./chunk-TI6UMRWK.js";
71
71
  import {
72
72
  addPrStackLayer,
73
73
  allocateTeamName,
@@ -392,7 +392,7 @@ async function continueSourceThread(threadId, prompt) {
392
392
  await continueOnReply(threadId, prompt);
393
393
  return;
394
394
  }
395
- const { getOrchestrator: getOrchestrator2 } = await import("./orchestrator-3FWEKDAQ.js");
395
+ const { getOrchestrator: getOrchestrator2 } = await import("./orchestrator-LXO2CDOG.js");
396
396
  await getOrchestrator2().send(threadId, prompt);
397
397
  } catch {
398
398
  }
@@ -733,9 +733,9 @@ async function spawnAgentTurn(thread, input, onEvent) {
733
733
  `Cannot spawn ${thread.agent}: thread ${thread.id} has no worktreePath`
734
734
  );
735
735
  }
736
- const { isGlobalThread: isGlobalThread2 } = await import("./global-workspace-4LHCZ2DC.js");
736
+ const { isGlobalThread: isGlobalThread2 } = await import("./global-workspace-MR75BDBY.js");
737
737
  if (isGlobalThread2(thread)) {
738
- const { ensureGlobalCoordinatorCwd: ensureGlobalCoordinatorCwd2 } = await import("./coordinator-prompt-KX2FVVYT.js");
738
+ const { ensureGlobalCoordinatorCwd: ensureGlobalCoordinatorCwd2 } = await import("./coordinator-prompt-UZDNIVP7.js");
739
739
  ensureGlobalCoordinatorCwd2(
740
740
  isOrchestratorThread(thread) ? { orchestratorThreadId: thread.id } : void 0
741
741
  );
@@ -3569,7 +3569,7 @@ async function adoptThread(input) {
3569
3569
  messages: input.messages ?? []
3570
3570
  });
3571
3571
  writeThread(thread);
3572
- const { ensureWorkspace: ensureWorkspace2 } = await import("./workspaces-MQYNZXUK.js");
3572
+ const { ensureWorkspace: ensureWorkspace2 } = await import("./workspaces-HO4EQNNM.js");
3573
3573
  await ensureWorkspace2(repoPath);
3574
3574
  const { ensureWorktreeSideboardIgnored: ensureWorktreeSideboardIgnored2 } = await import("./worktree-exclude-N5X5I422.js");
3575
3575
  await ensureWorktreeSideboardIgnored2(input.worktreePath);
@@ -5790,7 +5790,7 @@ function formatScheduledPrompt(name, prompt) {
5790
5790
  ${prompt}`;
5791
5791
  }
5792
5792
  async function defaultDeps() {
5793
- const { getOrchestrator: getOrchestrator2, startOrchestration: startOrchestration2 } = await import("./orchestrator-3FWEKDAQ.js");
5793
+ const { getOrchestrator: getOrchestrator2, startOrchestration: startOrchestration2 } = await import("./orchestrator-LXO2CDOG.js");
5794
5794
  const orch = getOrchestrator2();
5795
5795
  return {
5796
5796
  findThread: (id) => findThreadByRef(id),
@@ -7791,7 +7791,7 @@ var Orchestrator = class {
7791
7791
  this.emit({ type: "status_changed", threadId: archived.id, status: "archived" });
7792
7792
  if (thread.repoPath && !isGlobalRepoPath(thread.repoPath)) {
7793
7793
  try {
7794
- const { ensureWorkspace: ensureWorkspace2 } = await import("./workspaces-MQYNZXUK.js");
7794
+ const { ensureWorkspace: ensureWorkspace2 } = await import("./workspaces-HO4EQNNM.js");
7795
7795
  await ensureWorkspace2(thread.repoPath);
7796
7796
  } catch {
7797
7797
  }
@@ -350,8 +350,8 @@ var COORDINATOR_TOOL_PLAYBOOK = [
350
350
  "- list_workspaces \u2014 registered repos (path + github slug + roles/notes when set). Use that profile to pick the right repo for tickets or reviews.",
351
351
  "- list_board \u2014 Home Kanban of worktrees (New / Draft / Review / Merged; one card per checkout). Path to merge: no PR \u2192 draft PR \u2192 open PR \u2192 merged. Archive removes the card to Settings \u2192 History. Queued/running are activity on the card, not columns. Orchestration chats are not on the board. Filters: query, repoPath, kind, column, limit.",
352
352
  '- list_branches / list_prs / list_issues \u2014 pass repoPath from list_workspaces. Review is PRs (the surface for assigned ticket work), not the tickets: "Get me N tickets to review" \u2192 list_prs(queue=review, limit=N) then create_thread sourceType=pr. That is open non-draft PRs labeled eng-review with no individual user reviewer yet. A team request (engineering-team) is not a claim \u2014 the viewer is on that team and can pick it up; claimed means an individual account is the reviewer. Bots ignored. Prefer teams that match Settings \u2192 Agents / Projects roles (check one or more of Engineering, Design, Product, or extras they added \u2014 never a combined both value; project roles override account for that repo). queue=mine is review-requested:@me; queue=approved|changes uses those labels. Also: state, label, reviewer=me|unassigned|login, query, limit default 40 max 250; raise limit or tighten when truncated. list_issues (query, assignee=me|unassigned|all|user, limit default 40 max 250) lists Linear, AbleTime, or GitHub tickets \u2014 do not use it for that review-inbox ask. When they ask for tickets to work on, use their notes (assignee=me or unassigned as the notes say) and prefer ones that match their roles.',
353
- "- Find work: when they ask to find work, pick up tickets, or list reviews, use Settings \u2192 Agents (account) plus Settings \u2192 Projects (per-repo) roles and notes. Tickets \u2192 list_issues. Reviews \u2192 list_prs(queue=review). Show the options \u2014 do not create_thread or start unless they also asked to start (e.g. \u201Cfind me work and start it\u201D). Do not start this unprompted.",
354
- "- linear_* (when Linear is connected) \u2014 list_teams for team key/states; get/create/update/comment with ENG-123. Scope errors: reconnect Linear in Account settings.",
353
+ "- Find work: when they ask to find work, pick up tickets, or list reviews, use Settings \u2192 Agents (account) plus Settings \u2192 Projects (per-repo) roles and notes. Tickets \u2192 Sideboard list_issues / linear_* (Account Linear). Reviews \u2192 list_prs(queue=review). Do not call Claude Linear MCP or any other vendor Linear MCP \u2014 those HTTP connectors hang or flap on the first turn. If a vendor MCP is down or reconnecting, ignore it and keep going with Sideboard tools. Show the options \u2014 do not create_thread or start unless they also asked to start (e.g. \u201Cfind me work and start it\u201D). Do not start this unprompted.",
354
+ "- linear_* (when Linear is connected) \u2014 list_teams for team key/states; get/create/update/comment with ENG-123. Scope errors: reconnect Linear in Account settings. Prefer these over any Linear MCP the CLI may still list.",
355
355
  "- abletime_* (when AbleTime is connected) \u2014 orientation first; ensure_task when work has no ticket (or create_thread from the default branch auto-creates one).",
356
356
  "- list_teams / slack_list_channels / slack_list_users / slack_search / slack_read / slack_post / slack_replies \u2014 Slack workspaces from Settings \u2192 Remote; pass team_id from list_teams",
357
357
  "- Optional connectors (Vercel, Supabase, PostHog, Sentry) in Settings \u2192 Connectors inject tokens into worktree agent env when connected. Prefer official CLIs (`vercel`, `supabase`, `sentry-cli`) with those env vars. PostHog has no first-class CLI \u2014 use the HTTP API (`POSTHOG_PERSONAL_API_KEY`). If a CLI is missing, the user can Install CLI on that row (not auto-installed on Connect). Do not add vendor MCPs or ask the user to paste tokens again. Git (`gh`) stays Settings \u2192 Git; issue tracking stays Settings \u2192 Issues; Slack stays Settings \u2192 Remote (Sideboard MCP).",
@@ -512,7 +512,7 @@ function ensureGlobalCoordinatorCwd(opts) {
512
512
  "Never pass `agent=codex` when you yourself are Codex \u2014 nested Codex deadlocks on shared ~/.codex locks. Omit agent (Account default) or use cursor/claude.",
513
513
  "Typical flow (Home board): list_board \u2192 create_thread (sourceType=ticket|pr|branch) \u2192 send_to_thread \u2192 wait_for_turn (loop while stillRunning) \u2192 ask_git create-draft \u2192 wait_for_turn. Merge only if the user explicitly asked (`ask_git` merge).",
514
514
  "Typical flow (branch / explicit source): list_workspaces \u2192 list_branches|list_prs|list_issues \u2192 create_thread \u2192 send_to_thread \u2192 wait_for_turn (loop while stillRunning) \u2192 ask_git create-draft.",
515
- "Typical flow (find work): list_workspaces \u2192 pick repo(s) matching viewer roles/notes \u2192 list_issues (tickets) or list_prs(queue=review) (reviews) \u2192 show the options. Only create_thread + send_to_thread when they asked to start (e.g. \u201Cfind me work and start it\u201D) \u2014 then wait_for_turn (loop while stillRunning) \u2192 ask_git create-draft.",
515
+ "Typical flow (find work): list_workspaces \u2192 pick repo(s) matching viewer roles/notes \u2192 Sideboard list_issues / linear_* (tickets) or list_prs(queue=review) (reviews) \u2192 show the options. Never wait on Claude Linear MCP. Only create_thread + send_to_thread when they asked to start (e.g. \u201Cfind me work and start it\u201D) \u2014 then wait_for_turn (loop while stillRunning) \u2192 ask_git create-draft.",
516
516
  'Typical flow (review inbox): list_workspaces \u2192 list_prs(queue=review, limit=N) \u2192 show those PRs (ticket ids in the title when present). create_thread sourceType=pr only when they asked to start / do the work. Do not list_issues for "tickets to review".',
517
517
  "Typical flow (new app): Bash create/clone under repos dir \u2192 add_workspace \u2192 create_thread \u2192 send_to_thread (implement) \u2192 wait_for_turn (loop while stillRunning) \u2192 ask_git create-draft.",
518
518
  "Always ask worktree agents to commit, push, and open draft PRs (`ask_git` / `send_to_thread`). If the user gave a goal (Greptile 5/5, CI green), pass that goal through so they watch-fix-push until it lands \u2014 do not start that loop on a plain push, and do not tell the human to poll. Tell them to merge only when the user explicitly asked. The worktree agent runs git/gh; never merge from this orchestration cwd."