@coreplane/switchboard 1.260.3 → 1.260.4

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.
Files changed (121) hide show
  1. package/dist/assets/deploy/cloudflare-resident/Dockerfile +11 -2
  2. package/dist/assets/package-lock.json +3 -3
  3. package/dist/assets/package.json +4 -3
  4. package/dist/assets/project.json +4 -0
  5. package/dist/assets/source.json +3 -3
  6. package/dist/assets/src/core/coordinator/driver.ts +4 -4
  7. package/dist/assets/src/core/runFriction.ts +1 -1
  8. package/dist/assets/src/core/ship/contract.ts +1 -1
  9. package/dist/assets/src/core/ship/coordinator.ts +31 -31
  10. package/dist/assets/src/core/ship/renewal.ts +3 -1
  11. package/dist/assets/src/execution/bashTimeout.ts +1 -1
  12. package/dist/assets/src/execution/sandboxErrors.ts +6 -6
  13. package/dist/assets/web/dist/.vite/manifest.json +488 -488
  14. package/dist/assets/web/dist/assets/{AppShell-CSXDCV4x.js → AppShell-DPJVhUGP.js} +1 -1
  15. package/dist/assets/web/dist/assets/{CostChart-DsuPS2g7.js → CostChart-4TeDdbvJ.js} +1 -1
  16. package/dist/assets/web/dist/assets/CostsPage-8HDgvuWB.js +1 -0
  17. package/dist/assets/web/dist/assets/{DeliveryPage-62qCSLvk.js → DeliveryPage-BaemWKW8.js} +1 -1
  18. package/dist/assets/web/dist/assets/{HomePage-Dk3HRBc3.js → HomePage-fgKQHLaO.js} +1 -1
  19. package/dist/assets/web/dist/assets/{InputMenu-BdZXnibG.js → InputMenu-BRV35UWP.js} +1 -1
  20. package/dist/assets/web/dist/assets/{MetricsPage-o5fSaCTe.js → MetricsPage-BQBuIuYU.js} +1 -1
  21. package/dist/assets/web/dist/assets/{NotFoundPage-DHuWyjlq.js → NotFoundPage-CDjMfCcj.js} +1 -1
  22. package/dist/assets/web/dist/assets/{PendingTurnRow-CeTGOXUy.js → PendingTurnRow-vuWiDzvz.js} +1 -1
  23. package/dist/assets/web/dist/assets/{PlanePage-RD0M6O6W.js → PlanePage-DXMJf8FB.js} +1 -1
  24. package/dist/assets/web/dist/assets/{ResidentDetailPage-Dl2KId95.js → ResidentDetailPage-DdC8yU_S.js} +1 -1
  25. package/dist/assets/web/dist/assets/{ResidentsIndexPage-DBy43I1R.js → ResidentsIndexPage-CSM-KODv.js} +1 -1
  26. package/dist/assets/web/dist/assets/{RunFoldRow-CwHDL-Mo.js → RunFoldRow-Csik3wD6.js} +1 -1
  27. package/dist/assets/web/dist/assets/{RunRoutePage-Du1HqLZs.js → RunRoutePage-jo6NZxsP.js} +3 -3
  28. package/dist/assets/web/dist/assets/{RunsIndexPage-BZphy3Hr.js → RunsIndexPage-Dx1Y4sSq.js} +1 -1
  29. package/dist/assets/web/dist/assets/{RunsTabs-kHbbxVHx.js → RunsTabs-C7Ua3XX5.js} +1 -1
  30. package/dist/assets/web/dist/assets/{ScheduledPage-B7jh898t.js → ScheduledPage-BuB_NZyR.js} +1 -1
  31. package/dist/assets/web/dist/assets/{SettingSelect-BfID5nF4.js → SettingSelect-CEeA4iuC.js} +1 -1
  32. package/dist/assets/web/dist/assets/{SettingsPage-3uLEsiiE.js → SettingsPage-Cn96jB6Q.js} +1 -1
  33. package/dist/assets/web/dist/assets/{SilentTurn-CKxSxnQC.js → SilentTurn-D2cJfpEq.js} +1 -1
  34. package/dist/assets/web/dist/assets/{SlackMark-CtiHrNjr.js → SlackMark-DB0MGiF5.js} +1 -1
  35. package/dist/assets/web/dist/assets/{StatusDot-x7vcK0iE.js → StatusDot-DDHUCPVJ.js} +1 -1
  36. package/dist/assets/web/dist/assets/{Tooltip-wVXCWhMp.js → Tooltip-B4VIHkAI.js} +1 -1
  37. package/dist/assets/web/dist/assets/{UnitRoutePage-V5BXK7FH.js → UnitRoutePage-C-2DfjLI.js} +1 -1
  38. package/dist/assets/web/dist/assets/{angular-html-C8b5YTHf.js → angular-html-BRRhsdQE.js} +1 -1
  39. package/dist/assets/web/dist/assets/{angular-ts-C3f4WYNe.js → angular-ts-BFj-mqCm.js} +1 -1
  40. package/dist/assets/web/dist/assets/{apl-DSHxUJc3.js → apl-CsBuy1IL.js} +1 -1
  41. package/dist/assets/web/dist/assets/{astro-BSGCCBP6.js → astro-cVaqxBZq.js} +1 -1
  42. package/dist/assets/web/dist/assets/{blade-DFeYrMKk.js → blade-MEP5mWha.js} +1 -1
  43. package/dist/assets/web/dist/assets/{browser-B6T5hjfR.js → browser-CCImen5O.js} +1 -1
  44. package/dist/assets/web/dist/assets/{c-L_QOnFVv.js → c-D4NGQ_Pd.js} +1 -1
  45. package/dist/assets/web/dist/assets/{chapel-DLQWUwhu.js → chapel-BkWImsIy.js} +1 -1
  46. package/dist/assets/web/dist/assets/{cobol-1DlMmrEO.js → cobol-RPDSPSET.js} +1 -1
  47. package/dist/assets/web/dist/assets/{coffee-BTB6os6N.js → coffee-DZ5z7oVX.js} +1 -1
  48. package/dist/assets/web/dist/assets/{cpp-BvJI2z3u.js → cpp-CrBtIaRZ.js} +1 -1
  49. package/dist/assets/web/dist/assets/{crystal-B11wGW_h.js → crystal-DJesYi6f.js} +1 -1
  50. package/dist/assets/web/dist/assets/{css-BiIWx5Pw.js → css-DO9mjau-.js} +1 -1
  51. package/dist/assets/web/dist/assets/{dist-C-XGnvM4.js → dist-Cf1CmCSK.js} +2 -2
  52. package/dist/assets/web/dist/assets/{edge-nSglEXaD.js → edge-C3VzbSW0.js} +1 -1
  53. package/dist/assets/web/dist/assets/{elixir-x7o8qMl8.js → elixir-BkD_Vhfe.js} +1 -1
  54. package/dist/assets/web/dist/assets/{elm-DGrRyqTQ.js → elm-KIM0mFPk.js} +1 -1
  55. package/dist/assets/web/dist/assets/{erb--_dh58Nw.js → erb-D2ruCqb2.js} +1 -1
  56. package/dist/assets/web/dist/assets/{eventSource-Bj_dZf6M.js → eventSource-Cv0AFlMi.js} +1 -1
  57. package/dist/assets/web/dist/assets/{git-rebase-DbpUXwyg.js → git-rebase-CnfbQTxA.js} +1 -1
  58. package/dist/assets/web/dist/assets/{glimmer-js-BG0CuZG5.js → glimmer-js-CbiwFXWH.js} +1 -1
  59. package/dist/assets/web/dist/assets/{glimmer-ts-CQIl5qyR.js → glimmer-ts-DV8ii0Pv.js} +1 -1
  60. package/dist/assets/web/dist/assets/{glsl-9PJNQTcw.js → glsl-CgmznWkA.js} +1 -1
  61. package/dist/assets/web/dist/assets/{graphql-CzVTzjEI.js → graphql-BK-bBYfH.js} +1 -1
  62. package/dist/assets/web/dist/assets/{hack-BhCmAz3Q.js → hack-DnwTTP5n.js} +1 -1
  63. package/dist/assets/web/dist/assets/{haml-BmI12COR.js → haml-DAVJsWwT.js} +1 -1
  64. package/dist/assets/web/dist/assets/{handlebars-Cib-ISTS.js → handlebars-voOVfxFL.js} +1 -1
  65. package/dist/assets/web/dist/assets/{html-D3lDapvI.js → html-3FTqwaPk.js} +1 -1
  66. package/dist/assets/web/dist/assets/{html-derivative-DRPY8vOK.js → html-derivative-CSlhLDQn.js} +1 -1
  67. package/dist/assets/web/dist/assets/{http-B9VttK6m.js → http-Vx4ilPfS.js} +1 -1
  68. package/dist/assets/web/dist/assets/{hurl-C0saNJYj.js → hurl-DxyZDE3R.js} +1 -1
  69. package/dist/assets/web/dist/assets/{java-BCFbtYAj.js → java-nWqdjNJG.js} +1 -1
  70. package/dist/assets/web/dist/assets/{javascript-nwBjnrhh.js → javascript-Dr82HOwp.js} +1 -1
  71. package/dist/assets/web/dist/assets/{jinja-CMYO9byN.js → jinja-BhjLrPOt.js} +1 -1
  72. package/dist/assets/web/dist/assets/{jison-Cko8HnE_.js → jison-DilGIUa8.js} +1 -1
  73. package/dist/assets/web/dist/assets/{json-Dzv__YsX.js → json-CrOcvmhJ.js} +1 -1
  74. package/dist/assets/web/dist/assets/{jsx-CTFxagih.js → jsx-BW_RX-fo.js} +1 -1
  75. package/dist/assets/web/dist/assets/{julia-_Xvten1-.js → julia-CWH071DB.js} +1 -1
  76. package/dist/assets/web/dist/assets/{just-bLps4qOu.js → just-DkhhoWBy.js} +1 -1
  77. package/dist/assets/web/dist/assets/{latex-D6UaYsUP.js → latex-cuHJ4TUT.js} +1 -1
  78. package/dist/assets/web/dist/assets/{liquid-CoDIeULa.js → liquid-DG6afYQN.js} +1 -1
  79. package/dist/assets/web/dist/assets/{lua-D1KFRnVf.js → lua-C5CMnCPS.js} +1 -1
  80. package/dist/assets/web/dist/assets/{main-DAL--hyj.js → main-DxPqaFu9.js} +3 -3
  81. package/dist/assets/web/dist/assets/{marko-B5N5XcOw.js → marko-Dy2_DuC4.js} +1 -1
  82. package/dist/assets/web/dist/assets/{mdc-uxzjQO3q.js → mdc-BMKb_EeA.js} +1 -1
  83. package/dist/assets/web/dist/assets/{nginx-BMJxs2TK.js → nginx-og0RgMKf.js} +1 -1
  84. package/dist/assets/web/dist/assets/{nim-DqQ3-8p1.js → nim-CQxTQQP0.js} +1 -1
  85. package/dist/assets/web/dist/assets/{org-DsY6LK59.js → org-b5lkq_Pl.js} +1 -1
  86. package/dist/assets/web/dist/assets/{perl--pq9iJFp.js → perl-D9X5_i_J.js} +1 -1
  87. package/dist/assets/web/dist/assets/{php-RHCMbsM2.js → php-CwUxvLX0.js} +1 -1
  88. package/dist/assets/web/dist/assets/{pug-CFNq_FCp.js → pug-uOIOExr0.js} +1 -1
  89. package/dist/assets/web/dist/assets/{qml-C9Acx9E8.js → qml-g5RoADf-.js} +1 -1
  90. package/dist/assets/web/dist/assets/{r-DxlU8FBd.js → r-5LdAopD3.js} +1 -1
  91. package/dist/assets/web/dist/assets/{razor-CLJ2kKih.js → razor-DwrvFLYQ.js} +1 -1
  92. package/dist/assets/web/dist/assets/{regexp-CzmdGoEp.js → regexp-dGtAaxC-.js} +1 -1
  93. package/dist/assets/web/dist/assets/{rst-D9yuxBET.js → rst-wFdW0brr.js} +1 -1
  94. package/dist/assets/web/dist/assets/{ruby-CIRcEvnD.js → ruby-DPglN6I9.js} +1 -1
  95. package/dist/assets/web/dist/assets/{sas-LOl-uUPh.js → sas-CUbCs40d.js} +1 -1
  96. package/dist/assets/web/dist/assets/{scss-BX2_sZHY.js → scss-B-DUiI1c.js} +1 -1
  97. package/dist/assets/web/dist/assets/{shellscript-4d-QvKkY.js → shellscript-lGOV7Ram.js} +1 -1
  98. package/dist/assets/web/dist/assets/{shellsession-DhB16UGy.js → shellsession-BDWtAAjr.js} +1 -1
  99. package/dist/assets/web/dist/assets/{soy-Cm1xTUBr.js → soy-zod_dcOy.js} +1 -1
  100. package/dist/assets/web/dist/assets/{sql-BsfcBJdu.js → sql-BG0HSSoM.js} +1 -1
  101. package/dist/assets/web/dist/assets/{sseReplay-BqgOggyQ.js → sseReplay-BzoeVxZB.js} +1 -1
  102. package/dist/assets/web/dist/assets/{stata-Dwat3BSw.js → stata-BVUMLp1W.js} +1 -1
  103. package/dist/assets/web/dist/assets/{surrealql-P4rtxzAW.js → surrealql-DiSUbHKF.js} +1 -1
  104. package/dist/assets/web/dist/assets/{svelte-DTcsi8S8.js → svelte-DZenT45Y.js} +1 -1
  105. package/dist/assets/web/dist/assets/{templ-D-kP0Tg5.js → templ-BWKRNM0-.js} +1 -1
  106. package/dist/assets/web/dist/assets/{tex-D-4vuedK.js → tex-CbMzBlkK.js} +1 -1
  107. package/dist/assets/web/dist/assets/{ts-tags-jEEWYxsu.js → ts-tags-CZsVorDN.js} +1 -1
  108. package/dist/assets/web/dist/assets/{tsx-CFnlrVzT.js → tsx-R1r3mH4W.js} +1 -1
  109. package/dist/assets/web/dist/assets/{twig-D5rGrPjs.js → twig-BjPMyjKH.js} +1 -1
  110. package/dist/assets/web/dist/assets/{typescript-nYIQ35or.js → typescript-Bx-66VN_.js} +1 -1
  111. package/dist/assets/web/dist/assets/{typst-3-UX8dna.js → typst-fW037Eo6.js} +1 -1
  112. package/dist/assets/web/dist/assets/{vue-CLIPIX03.js → vue-D1V_GNxW.js} +1 -1
  113. package/dist/assets/web/dist/assets/{vue-html-Ci9CpkHU.js → vue-html-C-4pTZ-s.js} +1 -1
  114. package/dist/assets/web/dist/assets/{vue-vine-DL5pEYYk.js → vue-vine-C-QsX3hR.js} +1 -1
  115. package/dist/assets/web/dist/assets/{wallClock-DmaC1sKA.js → wallClock-x0hjr0J_.js} +1 -1
  116. package/dist/assets/web/dist/assets/{xml-bO80qikC.js → xml-BJTJXPgC.js} +1 -1
  117. package/dist/assets/web/dist/assets/{xsl-BPze60Ej.js → xsl-Xc9lukqe.js} +1 -1
  118. package/dist/assets/web/dist/assets/{yaml-BQUSon_o.js → yaml-Dw-FMsQa.js} +1 -1
  119. package/dist/cli.js +134 -146
  120. package/package.json +1 -1
  121. package/dist/assets/web/dist/assets/CostsPage-BaeWnm-o.js +0 -1
package/dist/cli.js CHANGED
@@ -1874,7 +1874,7 @@ function bashBudgetWithinRun(wantedMs, remainingMs) {
1874
1874
  if (cap < BASH_TIMEOUT_MIN_MS) {
1875
1875
  return {
1876
1876
  kind: "exhausted",
1877
- note: `run budget exhausted \u2014 ${secs(remainingMs)}s of wall clock left, inside the ${secs(RUN_DEADLINE_RESERVE_MS)}s write-up reserve, so the command was not run; write up what you have now`
1877
+ note: `the run budget is exhausted \u2014 ${secs(remainingMs)}s of wall clock left, inside the ${secs(RUN_DEADLINE_RESERVE_MS)}s write-up reserve, so the command was not run; write up what you have now`
1878
1878
  };
1879
1879
  }
1880
1880
  if (cap >= wantedMs) return { kind: "unchanged" };
@@ -2094,7 +2094,7 @@ function renderFirstInstruction(rebase) {
2094
2094
  const branch2 = rebase.branch ? `\`${rebase.branch}\`` : "the unit's branch";
2095
2095
  const onto = rebase.onto ? `\`${rebase.onto}\`` : "the merged parent";
2096
2096
  const gates = `${FAST_GATES_POINTER} ${GATE_RECEIPTS}`;
2097
- return `Rebase ${branch2} onto ${onto} before any other work \u2014 the parent unit has merged and the base has moved; the only writes are your own on that branch. Push the branch as soon as the change exists and the fast gates pass \u2014 the project's full verification is CI's gate, run there after the push with any fix as a further commit; an unpushed tree does not survive the run's end. ${gates} ${REBASE_POINTER} At the wind-down note, commit and push what compiles, say what does not, then answer. ${TIMEOUT_ON_LONG_COMMANDS}`;
2097
+ return `Rebase ${branch2} onto ${onto} before any other work \u2014 the parent unit has merged and the base has moved; the only writes are your own on that branch. Push the branch as soon as the change exists and the fast gates pass \u2014 the project's full verification is CI's gate and runs there after the push, with any fix as a further commit; an unpushed tree does not survive the run's end. ${gates} ${REBASE_POINTER} At the wind-down note, commit and push what compiles, say what does not, then answer. ${TIMEOUT_ON_LONG_COMMANDS}`;
2098
2098
  }
2099
2099
  function renderSpecRow(row2, dropText) {
2100
2100
  const head = `#### ${row2.spec} item ${row2.item}`;
@@ -3007,7 +3007,7 @@ function renewalDecision(input) {
3007
3007
  };
3008
3008
  }
3009
3009
  function renderRenewal(decision, grant2, options = {}) {
3010
- const recourse = options.idle ? "reply in this thread to continue" : "re-issue the request to try again";
3010
+ const recourse = options.idle ? "the next reply in this thread continues the unit" : "the next reply in this thread continues the original task";
3011
3011
  const senders = options.senders?.length ? `, with ${options.senders.length} message${options.senders.length === 1 ? "" : "s"} from ${options.senders.join(", ")}` : "";
3012
3012
  if (decision.renew)
3013
3013
  return `budget renewed, ${decision.segment - 1} of ${grant2.renewals}, continues ${decision.from !== void 0 ? decision.from.slice(0, 7) : "the branch's head"}${senders}`;
@@ -3455,9 +3455,9 @@ function interruptionCauseOfWords(words) {
3455
3455
  }
3456
3456
  function shipInterruptedNote(prUrl3, cause, idle = false) {
3457
3457
  const stands = prUrl3 ? `Its work stands on GitHub: ${prUrl3}.` : "Whatever it pushed stands on its pipeline branch; no PR was opened yet.";
3458
- const reissue = idle ? "To continue, reply in this thread to continue." : prUrl3 ? `To continue the review loop, re-issue \`agent:ship\` in this thread with only the PR URL (${prUrl3}).` : "To continue, re-issue `agent:ship` in this thread with the task \u2014 round 0 runs again on the same branch.";
3458
+ const continuation = idle ? "The next reply in this thread continues the unit." : prUrl3 ? `The pipeline kept its task, branch and pull request; the next reply in this thread continues the review loop at ${prUrl3}.` : "The pipeline kept its task and branch; the next reply in this thread starts round 0 again on that branch.";
3459
3459
  const opening = cause === "container_replaced" ? "\u26A0\uFE0F The resident container running this pipeline's child was replaced (a deploy's image swap) and the child could not resume, so the pipeline stopped." : cause === "sandbox_fault" ? "\u26A0\uFE0F The sandbox running this pipeline's child failed and the child could not resume, so the pipeline stopped." : cause === "bot_restart" ? "\u26A0\uFE0F The bot restarted while this ship pipeline was running, so the pipeline stopped." : "\u26A0\uFE0F This ship pipeline's child was interrupted and could not resume, so the pipeline stopped.";
3460
- return `${opening} ${stands} ${reissue}`;
3460
+ return `${opening} ${stands} ${continuation}`;
3461
3461
  }
3462
3462
  function planIdOf(planPath) {
3463
3463
  const base = planPath.split("/").pop() ?? "";
@@ -4735,7 +4735,7 @@ function analyzeRunFriction(events, opts = {}) {
4735
4735
  findings.push({
4736
4736
  category: "infra_failure",
4737
4737
  severity: "high",
4738
- summary: `no result for tool call (run ended mid-tool): ${event.summary}`,
4738
+ summary: `no result for tool call (the run ended mid-tool): ${event.summary}`,
4739
4739
  tool: event.tool,
4740
4740
  eventIndex: index,
4741
4741
  ...durationMs !== void 0 ? { durationMs } : {},
@@ -11680,13 +11680,13 @@ function fleetBusyRunEndedLine(run2, thread, err2) {
11680
11680
  });
11681
11681
  }
11682
11682
  function fleetBusyExhaustedMessage(waitedMs) {
11683
- return `sandbox fleet busy \u2014 no free per-thread sandbox after waiting ${Math.round(waitedMs / 1e3)}s (the fleet's max_instances is reached); try again in a few minutes`;
11683
+ return `this is a bug: the sandbox fleet had no free per-thread sandbox after waiting ${Math.round(waitedMs / 1e3)}s (the fleet's max_instances is reached), and no automatic queue remained`;
11684
11684
  }
11685
11685
  function isWaitReason(reason2) {
11686
11686
  return reason2 === FLEET_BUSY_REASON || reason2 === SANDBOX_STARTING_REASON || reason2 === RUNTIME_BUSY_REASON;
11687
11687
  }
11688
11688
  function startWaitExhaustedMessage(waitedMs) {
11689
- return `sandbox not ready \u2014 the thread's container did not finish starting within ${Math.round(waitedMs / 1e3)}s; try again in a few minutes`;
11689
+ return `this is a bug: the thread's sandbox did not finish starting within ${Math.round(waitedMs / 1e3)}s, and no automatic start wait remained`;
11690
11690
  }
11691
11691
  function runtimeBusyExhaustedMessage(waitedMs) {
11692
11692
  return `sandbox busy \u2014 the thread's container did not accept a connection within ${Math.round(waitedMs / 1e3)}s (the platform refused every connect of the wait; a command saturating its cores is one cause, an idle container has met it too); retry`;
@@ -15748,9 +15748,7 @@ var init_resident = __esm({
15748
15748
  * the factory binds the thread to it (loudly) instead of asking. Undefined
15749
15749
  * from a Worker predating that field → the dispatcher asks as before. */
15750
15750
  constructor(resource, defaultRef) {
15751
- super(
15752
- `the ${resource} resident needs a branch for this thread: no ref is bound yet. Name the branch to work on (e.g. "on main") and try again.`
15753
- );
15751
+ super(`Which branch should the ${resource} resident use for this thread (for example, "main")?`);
15754
15752
  this.resource = resource;
15755
15753
  this.defaultRef = defaultRef;
15756
15754
  this.name = "ResidentNeedsRefError";
@@ -16280,7 +16278,7 @@ var init_resident = __esm({
16280
16278
  const callTimeoutMs = opts.callTimeoutMs ?? BASH_TIMEOUT_MS;
16281
16279
  const stillGone = (data) => classifyError(
16282
16280
  new ExecInfraError(
16283
- `resident ${route2}: worktree still unavailable after a re-attach (${String(data.error ?? "")}) \u2014 the resident may be mid-restore; try again shortly.`,
16281
+ `this is a bug: resident ${route2} still had no worktree after its automatic re-attach (${String(data.error ?? "")}); no further restore wait was scheduled`,
16284
16282
  "refused"
16285
16283
  ),
16286
16284
  { kind: "infra", code: "attach" }
@@ -21529,7 +21527,7 @@ var init_metricsService = __esm({
21529
21527
  init_budgets();
21530
21528
  init_metrics();
21531
21529
  init_clock();
21532
- METRICS_OFF_MESSAGE = "Run metrics aren't configured \u2014 set metrics.dataset in config (beside the costs block's Cloudflare account and analytics token) to enable this view.";
21530
+ METRICS_OFF_MESSAGE = "Metrics by run aren't configured \u2014 metrics.dataset in config (beside the costs block's Cloudflare account and analytics token) enables this view.";
21533
21531
  NullMetricsService = class {
21534
21532
  report() {
21535
21533
  return Promise.reject(new Error(METRICS_OFF_MESSAGE));
@@ -23045,7 +23043,7 @@ var init_artifacts = __esm({
23045
23043
  if (!read.ok)
23046
23044
  throw new CommandError(
23047
23045
  "unavailable",
23048
- `the rules were applied to ${bucket} but reading them back failed \u2014 ${read.problem}; run \`artifacts lifecycle\` again to confirm`
23046
+ `this is a bug: the rules were applied to ${bucket}, but their read-back failed (${read.problem}) and no automatic confirmation was completed`
23049
23047
  );
23050
23048
  const match = rulesMatch(read.value, rules);
23051
23049
  if (!match.ok)
@@ -23565,7 +23563,7 @@ var init_config4 = __esm({
23565
23563
  destructive: destructiveBeyondMe,
23566
23564
  risk: configRisk
23567
23565
  },
23568
- describe: "Drop every runtime override of a channel (gated), of yourself (your GitHub binding stays \u2014 it is an identity admin's write), or of a thread (gated like the channel); `config clear user --user <id>` removes one person's GitHub binding (identity admins). Static config.yaml values show through again.",
23566
+ describe: "Drops every runtime override of a channel (gated), of yourself (your GitHub binding stays \u2014 it is an identity admin's write), or of a thread (gated like the channel); `config clear user --user <id>` removes one person's GitHub binding (identity admins). Static config.yaml values show through again.",
23569
23567
  render: (output) => {
23570
23568
  const scope = output.scope;
23571
23569
  return scope === "user" ? "Cleared the user's GitHub binding." : `Cleared ${who(scope)} overrides.`;
@@ -23809,7 +23807,7 @@ function renderCostsBy(output, surface = "text") {
23809
23807
  const columns = surface === "chat" ? [] : [
23810
23808
  `${String(o.dimension).padEnd(40)} ${count.padStart(6)} ${"LLM".padStart(10)}${cloud ? "cloud".padStart(10) : ""} ${"total".padStart(10)} share`
23811
23809
  ];
23812
- const where = coverage2.historyOn === false ? "run history is off \u2014 no runs to attribute" : `runs from ${String(coverage2.from)}${coverage2.clamped === true ? ` (earlier days are past the history's ${String(coverage2.retentionDays)}-day window)` : ""}${typeof o.pending === "number" && o.pending > 0 ? ` \xB7 ${o.pending} run(s) still being priced` : ""}`;
23810
+ const where = coverage2.historyOn === false ? "history is off \u2014 no runs to attribute" : `runs from ${String(coverage2.from)}${coverage2.clamped === true ? ` (earlier days are past the history's ${String(coverage2.retentionDays)}-day window)` : ""}${typeof o.pending === "number" && o.pending > 0 ? ` \xB7 ${o.pending} run(s) still being priced` : ""}`;
23813
23811
  const tieOut = typeof rec2.comparedDays === "number" && rec2.comparedDays > 0 ? `LLM attributed ${money(rec2.attributedLlmUsd)} of ${money(rec2.workspaceLlmUsd)} on the workspace over ${rec2.comparedDays} day(s)` + (typeof rec2.unattributedLlmUsd === "number" && rec2.unattributedLlmUsd < 0 ? ` \xB7 ${money(-rec2.unattributedLlmUsd)} more attributed than the workspace figure` : ` \xB7 ${money(rec2.unattributedLlmUsd)} unattributed`) : "no day in range has a workspace LLM figure to compare against";
23814
23812
  const cloudLine = cloud ? ` \xB7 cloud allocated ${money(rec2.cloudAllocatedUsd)}${typeof rec2.cloudUnallocatedUsd === "number" && rec2.cloudUnallocatedUsd > 0 ? ` \xB7 ${money(rec2.cloudUnallocatedUsd)} on days with no runs` : ""}` : "";
23815
23813
  return [
@@ -23852,7 +23850,7 @@ var init_costs2 = __esm({
23852
23850
  if (message4 === COSTS_OFF_MESSAGE) throw new CommandError("unavailable", message4);
23853
23851
  throw new CommandError(
23854
23852
  "busy",
23855
- `costs snapshot not taken: ${message4} \u2014 the previous snapshot still serves; try again`
23853
+ `costs snapshot not taken: ${message4} \u2014 the previous snapshot still serves, and the scheduled loop will take the next snapshot`
23856
23854
  );
23857
23855
  }
23858
23856
  }
@@ -24288,7 +24286,7 @@ ${formatDeployResults(result.results, result.notAttempted)}`
24288
24286
  if (drift.length > 0)
24289
24287
  throw new CommandError(
24290
24288
  "conflict",
24291
- `Worker configs are not the render of their templates \u2014 ${drift.map((f) => `${f.path} (${f.status})`).join(", ")}; run \`npm run deploy:gen\` and commit the result`
24289
+ `this is a bug: Worker configs are not the render of their templates \u2014 ${drift.map((f) => `${f.path} (${f.status})`).join(", ")} \u2014 and deploy did not repair or commit the generated files automatically`
24292
24290
  );
24293
24291
  const output = { profile: { origin: loaded.origin, path: loaded.path }, files };
24294
24292
  return output;
@@ -24703,7 +24701,7 @@ function patternSignature(f) {
24703
24701
  return "slow_model_turn:model_turn";
24704
24702
  case "infra_failure": {
24705
24703
  if (summary.startsWith("sandbox dead")) return "infra_failure:sandbox_dead";
24706
- const mid = /^no result for tool call \(run ended mid-tool\):\s*/.exec(summary);
24704
+ const mid = /^no result for tool call \(the run ended mid-tool\):\s*/.exec(summary);
24707
24705
  if (mid) return `infra_failure:mid-tool ${commandSignature(summary.slice(mid[0].length))}`;
24708
24706
  const during = /^exec infrastructure failed during\s*/.exec(summary);
24709
24707
  return `infra_failure:${commandSignature(during ? summary.slice(during[0].length) : summary)}`;
@@ -25265,7 +25263,7 @@ async function recentRecords(ledger, query) {
25265
25263
  function inProgressHint(diagnosis, finished) {
25266
25264
  if (!finished) return void 0;
25267
25265
  const midTool = diagnosis.findings.some(
25268
- (f) => f.category === "infra_failure" && f.summary.includes("run ended mid-tool")
25266
+ (f) => f.category === "infra_failure" && f.summary.includes("the run ended mid-tool")
25269
25267
  );
25270
25268
  return midTool ? "(hint: the stream ends on a tool call with no result \u2014 if this capture was taken mid-run, pass --in-progress)" : void 0;
25271
25269
  }
@@ -25286,7 +25284,7 @@ var init_friction = __esm({
25286
25284
  defineCommand9 = commandDefiner();
25287
25285
  positiveInt2 = z12.coerce.number().int().positive();
25288
25286
  repoSlug = z12.string().refine((s) => /^[\w.-]+\/[\w.-]+$/.test(s), "expected an owner/name slug");
25289
- NO_LEDGER_MESSAGE = "Run history is not configured in this deployment (`runHistory`), so there are no recent runs to analyze.";
25287
+ NO_LEDGER_MESSAGE = "History is not configured in this deployment (`runHistory`), so there are no recent runs to analyze.";
25290
25288
  NO_REPO_MESSAGE = "Set `selfImprovement.repo` (an `owner/name`) in config.yaml to tell `friction propose` where to file issues.";
25291
25289
  asJson2 = (r) => r;
25292
25290
  render = (output) => formatSelfImprovementReport(output);
@@ -25338,7 +25336,7 @@ var init_friction = __esm({
25338
25336
  openWorld: true,
25339
25337
  risk: (input) => dryRunRequested(input) ? PLAN_ONLY_RISK : "files issues on the tracker"
25340
25338
  },
25341
- describe: "Run the self-improvement step: cluster recent friction, dedupe against open issues, file the top proposals as labeled issues.",
25339
+ describe: "Clusters recent friction, deduplicates against open issues, and files the top proposals as labeled issues.",
25342
25340
  render,
25343
25341
  handler: async ({ options, caller, deps }) => {
25344
25342
  const ledger = await ledgerOf(deps);
@@ -25927,15 +25925,15 @@ function planCallback(ticket, identity2, now) {
25927
25925
  function refusalMessage(r) {
25928
25926
  switch (r.kind) {
25929
25927
  case "not_authorizing":
25930
- return "This sign-in did not start from a connect link, or the link was opened again since. Open the connect link and try again.";
25928
+ return "This is a bug: this sign-in did not start from a live connect link, and no fresh connect link was opened automatically.";
25931
25929
  case "oauth_failed":
25932
25930
  return `Sign-in with the server did not complete: ${r.reason}.`;
25933
25931
  case "not_found":
25934
- return "This connect link is not known. Ask for a new one with `mcp connect <name>`.";
25932
+ return "This is a bug: this connect link is not known, and no fresh connect link was opened automatically.";
25935
25933
  case "expired":
25936
- return "This connect link has expired (links last 10 minutes). Ask for a new one with `mcp connect <name>`.";
25934
+ return "This is a bug: this connect link expired after 10 minutes, and no fresh connect link was opened automatically.";
25937
25935
  case "used":
25938
- return "This connect link was already used. If the credential needs replacing, ask for a new one with `mcp connect <name>`.";
25936
+ return "This connect link was already used; no credential was changed by this visit.";
25939
25937
  case "cancelled":
25940
25938
  return "This connect link was cancelled.";
25941
25939
  case "wrong_identity":
@@ -25988,7 +25986,7 @@ async function readCapped2(res, max, signal2) {
25988
25986
  let total = 0;
25989
25987
  try {
25990
25988
  for (; ; ) {
25991
- if (signal2?.aborted) throw new McpError("timeout", "run aborted");
25989
+ if (signal2?.aborted) throw new McpError("timeout", "the run was aborted");
25992
25990
  const { value, done } = await reader.read();
25993
25991
  if (done) break;
25994
25992
  if (value) {
@@ -26484,7 +26482,7 @@ function needsRefresh(cred, now) {
26484
26482
  async function refreshCredential(fetchImpl, cred, now) {
26485
26483
  if (!cred.refreshToken)
26486
26484
  throw new OAuthError(
26487
- "the access token expired and the server issued no refresh token \u2014 run `mcp connect` to sign in again"
26485
+ "this is a bug: the access token expired, the server issued no refresh token, and no fresh sign-in was opened automatically"
26488
26486
  );
26489
26487
  const tokens = await tokenRequest(fetchImpl, cred.tokenEndpoint, {
26490
26488
  grant_type: "refresh_token",
@@ -27701,7 +27699,7 @@ var init_service = __esm({
27701
27699
  } catch (err2) {
27702
27700
  return { name: r.name, unavailable: `secret store: ${err2 instanceof Error ? err2.message : String(err2)}` };
27703
27701
  }
27704
- if (!sealed) return { name: r.name, unavailable: "no credential stored \u2014 run `mcp connect`" };
27702
+ if (!sealed) return { name: r.name, unavailable: "no credential is stored, so this server is unavailable" };
27705
27703
  try {
27706
27704
  const stored = parseStoredCredential(await openCredential(this.opts.key, sealed));
27707
27705
  if (stored.kind === "bearer") return { spec: { ...base, auth: { type: "bearer", token: stored.token } } };
@@ -27926,7 +27924,7 @@ var init_mcp = __esm({
27926
27924
  // Org-only by definition: it changes what every run in the org can reach,
27927
27925
  // so it is destructive at its every input (record 0057's audit rule).
27928
27926
  annotations: { destructive: true, risk: () => "adds or moves a server every run in the scope can use" },
27929
- describe: "Re-issue a person's MCP server in the org tier (admins): the same name, URL and auth, added by you; a bearer/oauth server gets a fresh org connect link for you to complete \u2014 the person's credential is never copied.",
27927
+ describe: "Promote a person's MCP server into the org tier (admins): the same name, URL and auth, added by you; a bearer/oauth server gets a fresh org connect link for you to complete \u2014 the person's credential is never copied.",
27930
27928
  render: renderAdd,
27931
27929
  settle: (output, { deps }) => settleConnect(deps, output),
27932
27930
  handler: async ({ args, options, caller, deps }) => {
@@ -29764,7 +29762,7 @@ async function fencedTarget(args) {
29764
29762
  if (args.refusePending && checks.total === 0)
29765
29763
  throw new CommandError(
29766
29764
  "conflict",
29767
- `no check reported at the head of ${name} \u2014 nothing was done; retry once CI registers (a repository with no CI stays a person's click on GitHub)`
29765
+ `no check reported at the head of ${name} \u2014 nothing was done; this is a bug when the repository has CI because no automatic wait or event re-fire was scheduled (a repository with no CI stays a person's click on GitHub)`
29768
29766
  );
29769
29767
  if (checks.failed.length > 0)
29770
29768
  throw new CommandError(
@@ -29957,7 +29955,7 @@ var init_metrics2 = __esm({
29957
29955
  const message4 = err2 instanceof Error ? err2.message : String(err2);
29958
29956
  if (message4 === METRICS_OFF_MESSAGE) throw new CommandError("unavailable", message4);
29959
29957
  const kind = err2 instanceof Error ? err2.name : "Error";
29960
- throw new CommandError("unavailable", `run metrics unavailable: ${kind}: ${message4}`);
29958
+ throw new CommandError("unavailable", `metrics by run unavailable: ${kind}: ${message4}`);
29961
29959
  }
29962
29960
  }
29963
29961
  });
@@ -29992,7 +29990,7 @@ function runLine(row2, now, surface) {
29992
29990
  }
29993
29991
  function prLine(row2, surface) {
29994
29992
  const name = `${row2.pr.repo}#${row2.pr.number}`;
29995
- const owner = row2.owner.unitKey ?? (row2.owner.runId ? `run ${shortId(row2.owner.runId)}` : "a person");
29993
+ const owner = row2.owner.unitKey ?? (row2.owner.runId ? `the run ${shortId(row2.owner.runId)}` : "a person");
29996
29994
  const health = healthWords(row2.health) || "-";
29997
29995
  if (surface === "chat") return `\u2022 ${name} \u2014 ${health} \xB7 ${owner}`;
29998
29996
  return `${name.padEnd(32)} ${health.padEnd(24)} ${owner}`.trimEnd();
@@ -30484,7 +30482,7 @@ function defineOp(op) {
30484
30482
  // agent, or the exec grant a token was minted with (policy.ts).
30485
30483
  resource: () => ({ type: "agent", name: "coding" }),
30486
30484
  effect: "write",
30487
- describe: `Run the repo's onboarded ${op} command with zero model turns (needs coding-agent access; the ref must be a plausible branch).`,
30485
+ describe: `Executes the repo's onboarded ${op} command with zero model turns (needs coding-agent access; the ref must be a plausible branch).`,
30488
30486
  render: renderOp,
30489
30487
  handler: async ({ args, caller, deps, span }) => {
30490
30488
  if (!await deps.repo.canUseRepo(caller.id, args.slug))
@@ -30530,7 +30528,7 @@ ${line4}` : ""}`);
30530
30528
  case "error":
30531
30529
  throw new CommandError(
30532
30530
  "unavailable",
30533
- result.transient === true ? `${result.message} \u2014 the resident was unavailable for a moment; re-run the command` : result.message
30531
+ result.transient === true ? `${result.message} \u2014 the resident was unavailable for a moment; Switchboard ended the command as unavailable` : result.message
30534
30532
  );
30535
30533
  }
30536
30534
  }
@@ -30718,7 +30716,7 @@ ${line4}`
30718
30716
  `\u2022 ${n(w.backupObjects)} snapshot backup object(s) in R2${ids}`,
30719
30717
  `\u2022 ${n(w.r2Objects)} object(s) under the resident's R2 prefix`,
30720
30718
  `\u2022 ${n(w.threadBindings)} thread binding(s) and the container (currently \`${String(w.container ?? "?")}\`)`,
30721
- `Nothing was changed. Run \`repo offboard ${slug}\` to execute.`
30719
+ `Nothing was changed. Without \`--dry-run\`, \`repo offboard ${slug}\` performs this removal.`
30722
30720
  ].join("\n");
30723
30721
  }
30724
30722
  const errors = Array.isArray(o.errors) ? o.errors : [];
@@ -30758,7 +30756,7 @@ ${line4}`
30758
30756
  snap ? `\u2022 discard the snapshot from ${String(snap.createdAt ?? "?")} (${n(discards.backupObjects)} backup object(s); ids ${String(snap.mirrorBackupId ?? "?")}, ${String(snap.checkoutBackupId ?? "?")})` : "\u2022 discard no snapshot (none recorded)",
30759
30757
  `\u2022 reprovision from scratch on \`${String(reprov.defaultRef ?? "?")}\` (budget ${n(reprov.provisioningTimeoutMs)}ms)`,
30760
30758
  `\u2022 keep the registry record and ${n(keeps.threadBindings)} thread binding(s)`,
30761
- `Nothing was changed. Run \`repo rebuild ${slug}\` to execute.`
30759
+ `Nothing was changed. Without \`--dry-run\`, \`repo rebuild ${slug}\` performs this rebuild.`
30762
30760
  ].join("\n");
30763
30761
  }
30764
30762
  return `\u{1F504} Rebuilding \`${slug}\`: discarded ${n(o.backupObjectsDeleted)} backup object(s); reprovisioning from scratch on \`${String(reprov.defaultRef ?? "?")}\` (state \`onboarding\` \u2014 I'll report here when it is warm or has failed; \`repo list\` shows the live state meanwhile).`;
@@ -31704,7 +31702,7 @@ function newestFinished(a, b) {
31704
31702
  }
31705
31703
  function hostedSealAnswer(units, runnerStopped) {
31706
31704
  const lines = units.map((u) => {
31707
- const how = u.ending ? u.ending.kind : u.threadKey !== void 0 ? "no ending was recorded \u2014 re-issue `agent:ship` in its thread to continue" : "not started";
31705
+ const how = u.ending ? u.ending.kind : u.threadKey !== void 0 ? "no ending was recorded \u2014 the next reply in its thread continues the unit" : "not started";
31708
31706
  return `${u.unit} \u2014 ${how}${u.pr ? ` \u2014 ${u.pr.url}` : ""}`;
31709
31707
  });
31710
31708
  return [
@@ -32345,10 +32343,10 @@ async function abridgerOf(deps) {
32345
32343
  async function assertVisible(deps, id, caller) {
32346
32344
  const runs = await deps.review.runs();
32347
32345
  const res = await runs.getRun(id);
32348
- if (!res.ok) throw new CommandError("not_found", "run not found");
32346
+ if (!res.ok) throw new CommandError("not_found", "no run found");
32349
32347
  const actor = caller.actor;
32350
32348
  if (!authorize(actor, "runs:read", runResource(res.value)).allow)
32351
- throw new CommandError("not_found", "run not found", "policy");
32349
+ throw new CommandError("not_found", "no run found", "policy");
32352
32350
  }
32353
32351
  function refused2(err2) {
32354
32352
  if (err2 instanceof AbridgeRefusal) throw new CommandError(err2.code, err2.message);
@@ -32368,13 +32366,13 @@ var init_review = __esm({
32368
32366
  init_runsService();
32369
32367
  defineCommand19 = commandDefiner();
32370
32368
  runId = z22.string().regex(RUN_ID_PATTERN);
32371
- ABRIDGE_OFF_MESSAGE = "The abridged reading diff is off in this deployment: it needs the `meat` binary on the bot host, the Anthropic provider's credential, `review.readingDiff.provider` not `off`, and run history to store it.";
32369
+ ABRIDGE_OFF_MESSAGE = "The abridged reading diff is off in this deployment: it needs the `meat` binary on the bot host, the Anthropic provider's credential, `review.readingDiff.provider` not `off`, plus history to store it.";
32372
32370
  reviewAbridge = defineCommand19({
32373
32371
  id: "review.abridge",
32374
32372
  // Hidden unless the abridging can happen here (the binary, the credential,
32375
32373
  // the switch) AND there is a record to append to.
32376
32374
  enabledWhen: (caps) => caps.runHistory && caps.readingDiffAbridge,
32377
- args: [{ name: "id", schema: runId, describe: "run id of a finished PR review" }],
32375
+ args: [{ name: "id", schema: runId, describe: "id of a finished PR review run" }],
32378
32376
  options: z22.object({
32379
32377
  model: z22.string().min(1).optional().describe("meat's model (default review.readingDiff.meatModel; without either the abridge fails naming the key)"),
32380
32378
  force: flag.optional().describe("recompute even when an abridged diff is already stored, or retry a failed one"),
@@ -32414,7 +32412,7 @@ import { z as z23 } from "zod";
32414
32412
  function unwrap2(res, what = "run") {
32415
32413
  if (res.ok) return res.value;
32416
32414
  if (res.error === "hosted") throw new CommandError("conflict", HOSTED_STOP_REFUSAL);
32417
- throw new CommandError(res.error, res.error === "not_found" ? `${what} not found` : "run already finished");
32415
+ throw new CommandError(res.error, res.error === "not_found" ? `no ${what} found` : "the run already finished");
32418
32416
  }
32419
32417
  async function getVisibleRun(runs, id, caller, action, deps, commandId, opts = {}) {
32420
32418
  const view = unwrap2(await runs.getRun(id, opts));
@@ -32422,7 +32420,7 @@ async function getVisibleRun(runs, id, caller, action, deps, commandId, opts = {
32422
32420
  const decision = authorize(actor, action, runResource(view));
32423
32421
  if (!decision.allow) {
32424
32422
  (deps.denied ?? logDenied)({ commandId, actorId: actor.id, action, reason: decision.reason });
32425
- throw new CommandError("not_found", "run not found");
32423
+ throw new CommandError("not_found", "no run found");
32426
32424
  }
32427
32425
  return view;
32428
32426
  }
@@ -32553,7 +32551,7 @@ var init_runs = __esm({
32553
32551
  defineCommand20 = commandDefiner();
32554
32552
  runId2 = z23.string().regex(RUN_ID_PATTERN);
32555
32553
  positiveInt3 = z23.coerce.number().int().positive();
32556
- idArg = { name: "id", schema: runId2, describe: "run id" };
32554
+ idArg = { name: "id", schema: runId2, describe: "id of the run" };
32557
32555
  HOSTED_STOP_REFUSAL = "this run is a pipeline; its units run in their own threads, so a soft stop ends nothing; `--mode hard` is the escape: it seals the run failed and releases the thread";
32558
32556
  NO_RUNS_NAME_PR = "no runs name this pull request";
32559
32557
  SESSION_SEARCH_DEFAULT_HITS = 10;
@@ -33121,8 +33119,8 @@ function capabilityLine(c) {
33121
33119
  `execution ${c.execution}`,
33122
33120
  `github ${onOff(c.github)}`,
33123
33121
  `memory ${onOff(c.memory)}`,
33124
- `run history ${onOff(c.runHistory)}`,
33125
- `run ledger ${onOff(c.runLedger)}`,
33122
+ `history ${onOff(c.runHistory)}`,
33123
+ `ledger ${onOff(c.runLedger)}`,
33126
33124
  `mcp ${onOff(c.mcp)}`,
33127
33125
  `costs ${onOff(c.costs)}`,
33128
33126
  `schedules ${onOff(c.schedules)}`,
@@ -35073,7 +35071,7 @@ function activityLine(e) {
35073
35071
  case "answer":
35074
35072
  return "answer ready";
35075
35073
  case "run_meta":
35076
- return "run context recorded";
35074
+ return "context for the run recorded";
35077
35075
  // published straight to the registry too — never arrives here
35078
35076
  case "lease":
35079
35077
  return "lease started";
@@ -35363,13 +35361,13 @@ var init_reply = __esm({
35363
35361
  live_agent_allowlist: (p) => `\u{1F6AB} You're not on the allowlist for the \`${p.agent}\` agent, whose run is in flight in this thread. Ask ${p.adminsHint} for access.`,
35364
35362
  elsewhere_agent_allowlist: (p) => `\u{1F6AB} You're not on the allowlist for the \`${p.agent}\` agent, whose run is in flight in this thread. Ask ${p.adminsHint} for access.`,
35365
35363
  repo_not_visible: (p) => `\u{1F4E6} \`${p.slug}\` is not a repository this installation can see \u2014 GitHub answered 404 \u2014 so I did not start ${aRun(p.agent)} for it. The repository is outside the Switchboard GitHub App installation (\`github_repos\` lists the reachable ones), or the name is wrong.`,
35366
- repo_unverified: (p) => p.via === "github" ? `\u26A0\uFE0F I couldn't verify \`${p.slug}\` against GitHub \u2014 it didn't answer \u2014 so I did not start ${aRun(p.agent)} rather than guess which repository you meant. Try again in a minute.` : `\u26A0\uFE0F I couldn't verify that \`${p.slug}\` is an onboarded repo \u2014 the resident registry didn't answer \u2014 so I did not start a *${p.agent}* run rather than guess which repo you meant. Try again in a minute, or name the repository by URL (https://github.com/${p.slug}) to run in a cold per-thread sandbox.`,
35364
+ repo_unverified: (p) => p.via === "github" ? `\u26A0\uFE0F This is a bug: I couldn't verify \`${p.slug}\` against GitHub because it did not answer, so I did not start ${aRun(p.agent)} and no automatic retry was scheduled.` : `\u26A0\uFE0F This is a bug: I couldn't verify that \`${p.slug}\` is an onboarded repo because the resident registry did not answer, so I did not start a *${p.agent}* run and no automatic fallback was started.`,
35367
35365
  repo_not_onboarded: (p) => `\u{1F4E6} \`${p.slug}\` is not onboarded as a resident, so I did not start a *${p.agent}* run for it. ${p.onboardHint} for a warm, deps-ready environment, or name the repository by URL (https://github.com/${p.slug}) to run in a cold per-thread sandbox.`,
35368
35366
  repo_access: (p) => `\u{1F6AB} You're not on the allowlist for the \`${p.repo}\` repo environment. Ask ${p.adminsHint} for access.`,
35369
35367
  which_branch: (p) => `\u{1F33F} Which branch of \`${p.repo}\` should this thread work on? No branch is bound yet; a branch token such as \`branch:main\` will bind it.`,
35370
35368
  ship_thread_live: () => "\u{1F6AB} A pipeline is already running in this thread \u2014 one pipeline per thread. Follow the one in flight here, or start this one in a thread of its own.",
35371
35369
  pipeline_thread_owned: (p) => `\u{1F6A6} This thread belongs to the live *${p.agent}* pipeline runner \u2014 nothing runs beside it here. ` + (p.units.length > 0 ? `Reply in the unit's own thread instead: ${p.units.map((u) => `${u.unit}${u.threadKey !== void 0 ? ` (\`${u.threadKey}\`)` : ""}`).join(", ")}.` : "Reply in the unit's own thread instead."),
35372
- ship_budget: (p) => `\u{1F6AB} Ship cannot start under a ${p.maxMinutes}-minute budget: the loop it allows (${p.maxRounds} review rounds) needs ${p.need} minutes \u2014 ${p.provision} to provision, the coding child's ${p.coding}, and the reserve for the rounds after it at their floors. Widen the budget or the boundary that clipped it, or run \`agent:coding\` for a single pass without the review loop.`
35370
+ ship_budget: (p) => `\u{1F6AB} Ship cannot start under a ${p.maxMinutes}-minute budget: the loop it allows (${p.maxRounds} review rounds) needs ${p.need} minutes \u2014 ${p.provision} to provision, the coding child's ${p.coding}, and the reserve for the rounds after it at their floors. Switchboard left the budget and boundary unchanged and did not start either the review loop or a single coding pass.`
35373
35371
  };
35374
35372
  LONG_COMMAND_REPLY_CHARS = 3e3;
35375
35373
  }
@@ -36064,7 +36062,7 @@ function checkPrHeadPreflight(input) {
36064
36062
  return {
36065
36063
  ok: false,
36066
36064
  where,
36067
- reply: `\u{1F500} Review of ${where} not started: GitHub did not give me a usable head commit for the PR (the lookup failed, or answered without a well-formed SHA), so I cannot pin a review to it. Re-send the request in a moment; if it keeps failing, look at the PR on GitHub and at the bot's GitHub App credentials.`
36065
+ reply: `\u{1F500} Review of ${where} not started: GitHub did not give me a usable head commit for the PR (the lookup failed, or answered without a well-formed SHA), so I cannot pin a review to it. This is a bug: no automatic head lookup retry was scheduled, and nothing was posted to GitHub.`
36068
36066
  };
36069
36067
  }
36070
36068
  async function guardAttachedHead(input) {
@@ -36079,7 +36077,7 @@ async function guardAttachedHead(input) {
36079
36077
  console.log(`[review] ${input.logKey} not started: ${namedSource} unreadable, PR head ${expected} (${where})`);
36080
36078
  return {
36081
36079
  outcome: "refused",
36082
- reply: `\u{1F500} Review of ${where} not started: ${namedSource} could not be read, so the workspace cannot be verified against PR head ${expected}. This infrastructure failure is not a finding and nothing was posted to GitHub; re-send the request after the workspace backend recovers.`
36080
+ reply: `\u{1F500} Review of ${where} not started: ${namedSource} could not be read, so the workspace cannot be verified against PR head ${expected}. This is a bug: the infrastructure failure was not retried automatically. It is not a finding, and nothing was posted to GitHub.`
36083
36081
  };
36084
36082
  }
36085
36083
  if (sameCommit(expected, attached)) return { outcome: "verified" };
@@ -36093,7 +36091,7 @@ async function guardAttachedHead(input) {
36093
36091
  console.log(`[review] ${input.logKey} not started: ${namedSource} ${attached}, PR head ${expected} (${where})`);
36094
36092
  return {
36095
36093
  outcome: "refused",
36096
- reply: `\u{1F500} Review of ${where} not started: the ${namedSource} is at ${attached}, but the PR head is ${expected} \u2014 the branch moved while the workspace was being prepared (a push or force-push). This infrastructure mismatch is not a finding and nothing was posted to GitHub; re-send the request to review the new head.`
36094
+ reply: `\u{1F500} Review of ${where} not started: the ${namedSource} is at ${attached}, but the PR head is ${expected} \u2014 the branch moved while the workspace was being prepared (a push or force-push). This is a bug: the workspace was not reprovisioned automatically at the new head. It is not a finding, and nothing was posted to GitHub.`
36097
36095
  };
36098
36096
  }
36099
36097
  function makeSystemComposer(input) {
@@ -36415,56 +36413,34 @@ function boundaryOf(scope) {
36415
36413
  return "the parent run's remaining budget";
36416
36414
  }
36417
36415
  }
36418
- function wayForward(scope, axis, needs, adminsHint) {
36416
+ function boundaryOutcome(scope) {
36419
36417
  switch (scope) {
36420
36418
  case "channel":
36421
- return `run it in a channel that allows \`${needs}\`, or ask ${adminsHint} to raise this channel's boundary`;
36419
+ return "Switchboard left this channel's boundary unchanged";
36422
36420
  case "user":
36423
- return `raise your own boundary with \`config set me --boundary.${axis} ${needs}\`, or drop your overrides with \`config clear me\``;
36421
+ return "Switchboard left your boundary and overrides unchanged";
36424
36422
  case "defaults":
36425
- return `ask ${adminsHint} to raise \`defaults.boundary\` in the configuration`;
36423
+ return "Switchboard left the installation's default boundary unchanged";
36426
36424
  case "directive":
36427
- return "send the message again without the budget directive";
36425
+ return "Switchboard applied this message's budget directive";
36428
36426
  case "parent":
36429
- return `spawn it from a run with at least ${needs} left`;
36427
+ return "Switchboard left the parent run's remaining budget unchanged";
36430
36428
  }
36431
36429
  }
36432
- function minutesWayForward(scope, needs, adminsHint) {
36433
- switch (scope) {
36434
- case "directive":
36435
- return `send the message again with \`budget:${needs}\` or more`;
36436
- case "user":
36437
- return `raise your own boundary with \`config set me --boundary.maxMinutes ${needs}\`, or drop your overrides with \`config clear me\``;
36438
- case "channel":
36439
- return `run it in a channel whose boundary allows ${needs} minutes, or ask ${adminsHint} to raise this channel's boundary`;
36440
- case "defaults":
36441
- return `ask ${adminsHint} to raise \`defaults.boundary\` in the configuration`;
36442
- case "parent":
36443
- return `spawn it from a run with at least ${needs} minutes left`;
36444
- }
36445
- }
36446
- function profileRefusalReply(agentName, refusal, adminsHint) {
36447
- const capitalize = (s) => s.charAt(0).toUpperCase() + s.slice(1);
36430
+ function profileRefusalReply(agentName, refusal, _adminsHint) {
36448
36431
  if (refusal.axis === "identity") {
36449
- const how2 = wayForward(refusal.scope, "maxIdentity", refusal.needs, adminsHint);
36450
- return `\u{1F6AB} \`${agentName}\` needs a \`${refusal.needs}\` credential; ${boundaryOf(refusal.scope)} caps runs at \`${refusal.cap}\`. ${capitalize(how2)}.`;
36432
+ const outcome = boundaryOutcome(refusal.scope);
36433
+ return `\u{1F6AB} \`${agentName}\` needs a \`${refusal.needs}\` credential; ${boundaryOf(refusal.scope)} caps runs at \`${refusal.cap}\`. ${outcome} and did not start the run.`;
36451
36434
  }
36452
36435
  if (refusal.axis === "minutes") {
36453
- const how2 = minutesWayForward(refusal.scope, refusal.needs, adminsHint);
36454
- return `\u{1F6AB} \`${agentName}\` needs at least ${refusal.needs} minutes \u2014 a turn, then its write-up and post-step \u2014 and ${boundaryOf(refusal.scope)} gives it ${refusal.have}. ${capitalize(how2)}.`;
36436
+ const outcome = boundaryOutcome(refusal.scope);
36437
+ return `\u{1F6AB} \`${agentName}\` needs at least ${refusal.needs} minutes \u2014 a turn, then its write-up and post-step \u2014 and ${boundaryOf(refusal.scope)} gives it ${refusal.have}. ${outcome} and did not start the run.`;
36455
36438
  }
36456
36439
  const scopes = refusal.scopes.map(boundaryOf);
36457
36440
  const who2 = scopes.length > 1 ? `${scopes.join(" and ")} allow` : `${scopes[0] ?? "the boundary"} allows`;
36458
36441
  const allowed2 = refusal.allowed.map((m) => `\`${m}\``).join(", ");
36459
- const how = refusal.scopes.map(
36460
- (scope) => wayForward(
36461
- scope,
36462
- "machines",
36463
- scope === "user" ? `<classes including ${refusal.needs}>` : refusal.needs,
36464
- adminsHint
36465
- )
36466
- ).join("; ");
36467
- return `\u{1F6AB} \`${agentName}\` runs on a \`${refusal.needs}\` machine; ${who2} only ${allowed2}. ${capitalize(how)}.`;
36442
+ const outcomes = refusal.scopes.map(boundaryOutcome).join("; ");
36443
+ return `\u{1F6AB} \`${agentName}\` runs on a \`${refusal.needs}\` machine; ${who2} only ${allowed2}. ${outcomes}; it did not start the run.`;
36468
36444
  }
36469
36445
  function escapeRegExp2(s) {
36470
36446
  return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
@@ -36958,7 +36934,7 @@ function steerAck(live, now) {
36958
36934
  }
36959
36935
  function refusalReply(live, decision, now) {
36960
36936
  return `\u23F3 A *${live.agent}* run is already in flight in this thread (${elapsed(live, now)} in).${linkSuffix(live)}
36961
- An \`agent:${decision.requestedAgent}\` request cannot start beside it \u2014 one run per thread. Wait for it to finish and re-send, or start a new thread.`;
36937
+ An \`agent:${decision.requestedAgent}\` request cannot start beside it \u2014 one run per thread \u2014 so this request was not started.`;
36962
36938
  }
36963
36939
  function followUpPrompt(inputs, opts = {}) {
36964
36940
  const body = inputs.map((i) => attributedText(attributed(i))).map((line4) => inputs.length > 1 ? `- ${line4}` : line4).join("\n");
@@ -37398,13 +37374,13 @@ async function steerRun2(deps, sender, target, text) {
37398
37374
  if (live && live.runId === target.runId) {
37399
37375
  live.inbox.push(followUpOf(msg, text, at, { ledgerSeq, ...sender.from ? { from: sender.from } : {} }));
37400
37376
  console.log(
37401
- `[steer] ${sender.from ? `run ${sender.from.runId}` : sender.userId} \u2192 ${target.agent} run ${target.runId} in ${target.threadKey} (${live.inbox.size} pending${ledgerSeq !== void 0 ? `, durable seq ${ledgerSeq}` : ""})`
37377
+ `[steer] ${sender.from ? `the run ${sender.from.runId}` : sender.userId} \u2192 the ${target.agent} run ${target.runId} in ${target.threadKey} (${live.inbox.size} pending${ledgerSeq !== void 0 ? `, durable seq ${ledgerSeq}` : ""})`
37402
37378
  );
37403
37379
  return { kind: "steered", where: "here", at, ...ledgerSeq !== void 0 ? { ledgerSeq } : {} };
37404
37380
  }
37405
37381
  if (ledgerSeq !== void 0) {
37406
37382
  console.log(
37407
- `[steer] ${sender.from ? `run ${sender.from.runId}` : sender.userId} \u2192 ${target.agent} run ${target.runId} live on another generation (durable seq ${ledgerSeq})`
37383
+ `[steer] ${sender.from ? `the run ${sender.from.runId}` : sender.userId} \u2192 the ${target.agent} run ${target.runId} live on another generation (durable seq ${ledgerSeq})`
37408
37384
  );
37409
37385
  return { kind: "steered", where: "elsewhere", at, ledgerSeq };
37410
37386
  }
@@ -37420,7 +37396,7 @@ function createSteerSender(deps) {
37420
37396
  return {
37421
37397
  async send(runId3, words, caller) {
37422
37398
  const run2 = deps.runs.getById(runId3);
37423
- if (!run2) throw new CommandError("not_found", `run ${runId3} is not known here.`);
37399
+ if (!run2) throw new CommandError("not_found", `the run ${runId3} is not known here.`);
37424
37400
  const owner = authorizeSteerOwner({
37425
37401
  caller: { ids: caller.actor.self ?? [caller.actor.id], grants: effectiveGrants(caller.actor) },
37426
37402
  target: {
@@ -37435,7 +37411,7 @@ function createSteerSender(deps) {
37435
37411
  const ended = run2.finished || run2.threadKey === void 0 || run2.agent === void 0;
37436
37412
  if (ended) {
37437
37413
  const when = run2.finishedAt !== void 0 ? `at ${new Date(run2.finishedAt).toISOString()}` : "before this steer arrived";
37438
- throw new CommandError("conflict", `run ${runId3} ended ${when}; nothing to steer.`);
37414
+ throw new CommandError("conflict", `the run ${runId3} ended ${when}; nothing to steer.`);
37439
37415
  }
37440
37416
  const out = await steerRun2(
37441
37417
  deps,
@@ -37466,7 +37442,7 @@ function createSteerSender(deps) {
37466
37442
  case "not_live":
37467
37443
  throw new CommandError(
37468
37444
  "conflict",
37469
- `run ${runId3} ended while the steer was being delivered; nothing to steer.`
37445
+ `the run ${runId3} ended while the steer was being delivered; nothing to steer.`
37470
37446
  );
37471
37447
  }
37472
37448
  }
@@ -39038,11 +39014,11 @@ var init_confirm = __esm({
39038
39014
  init_runOwner();
39039
39015
  init_commandRun();
39040
39016
  init_route();
39041
- OFFER_EXPIRED_LINE = "this offer expired; its ten minutes passed \u2014 type the line to run it";
39042
- QUESTION_EXPIRED_LINE = "this question expired; its day passed \u2014 type the line to run it";
39017
+ OFFER_EXPIRED_LINE = "this offer expired after ten minutes; nothing ran, and a later request may receive a fresh confirmation";
39018
+ QUESTION_EXPIRED_LINE = "this question expired after one day; nothing ran, and a later request may receive a fresh question";
39043
39019
  OFFER_FOREIGN_LINE = "only the requester can confirm this";
39044
39020
  OFFER_USED_LINE = "this offer was already used";
39045
- OFFER_UNREADABLE_LINE = "the confirmation could not be read; type the line to run it";
39021
+ OFFER_UNREADABLE_LINE = "this is a bug: the confirmation could not be read, so nothing ran and no replacement offer was minted";
39046
39022
  OFFER_CANCELLED_LINE = "Cancelled; nothing ran";
39047
39023
  CONFIRMED_REASON = "confirmed after offer";
39048
39024
  REFUSED_REASON = "refused after offer";
@@ -39449,7 +39425,7 @@ function resolveTarget2(deps, ctx) {
39449
39425
  throw new RefusalError(
39450
39426
  refusalOf(
39451
39427
  "model_card_refused",
39452
- `Model "${resolved.modelRef}" speaks the openai-responses wire, which the "opencode" harness cannot speak yet: run it on pi, or use an openai-chat block.`
39428
+ `Model "${resolved.modelRef}" speaks the openai-responses wire, which the "opencode" harness cannot speak yet; this request needs the pi harness or an openai-chat block.`
39453
39429
  )
39454
39430
  );
39455
39431
  }
@@ -43132,7 +43108,7 @@ async function spawnChild(deps, parent, request2) {
43132
43108
  if (AGENTS[request2.preset]?.identity === "write") {
43133
43109
  return refused7(
43134
43110
  "spawn_identity",
43135
- `\`${request2.preset}\` runs as a \`write\` identity \u2014 it pushes branches and opens pull requests \u2014 and a spawned child never writes: it reads this conversation and reports; the person who asked starts that work by hand with \`agent:${request2.preset}\``
43111
+ `\`${request2.preset}\` runs as a \`write\` identity \u2014 it pushes branches and opens pull requests \u2014 so this run was not started: spawned children read this conversation and report, but never write`
43136
43112
  );
43137
43113
  }
43138
43114
  const childPreset = LOOP_PRESETS.includes(request2.preset) ? request2.preset : "general";
@@ -46348,28 +46324,32 @@ function windDownAnswer(ending, maxMinutes, facts2) {
46348
46324
  return unlabelledAnswer(ending.text, ending.writeUpFailed, ending.ended, facts2);
46349
46325
  }
46350
46326
  }
46351
- function established(facts2, advice) {
46352
- const then = advice ? ` \u2014 ${advice}` : "";
46327
+ function established(facts2) {
46353
46328
  const w = facts2?.workspace;
46354
46329
  let tree = "";
46355
- if (w?.kind === "unmeasured") tree = `The workspace could not be measured, so work may sit unpushed there${then}.`;
46330
+ if (w?.kind === "unmeasured") tree = "The workspace could not be measured, so work may sit unpushed there.";
46356
46331
  else if (w?.kind === "clean")
46357
46332
  tree = `The tree was clean${w.branch ? ` and \`${w.branch}\` held no unpushed commits` : " with no unpushed commits"}${w.head ? ` \u2014 its head \`${shortSha2(w.head)}\` is on the remote` : ""}.`;
46358
46333
  else if (w?.kind === "salvaged")
46359
46334
  tree = `What the tree held was pushed to \`${w.branch}\`${w.head ? ` at \`${shortSha2(w.head)}\`` : ""} by the budget salvage, unreviewed \u2014 a follow-up starts from it.`;
46360
46335
  else if (w?.kind === "left")
46361
- tree = w.fate === "kept" ? `${counted(w)} sit in the workspace, kept for this thread until it idles out \u2014 a follow-up here reuses them.` : w.fate === "discarded" ? `${counted(w)} were left in the tree and discarded at the run's end${then}.` : `${counted(w)} were left in the tree, which is torn down since a command may still be running in it${then}.`;
46336
+ tree = w.fate === "kept" ? `${counted(w)} sit in the workspace, kept for this thread until it idles out \u2014 a follow-up here reuses them.` : w.fate === "discarded" ? `${counted(w)} were left in the tree and discarded at the run's end.` : `${counted(w)} were left in the tree, which is torn down since a command may still be running in it.`;
46362
46337
  const description = facts2?.description === "submitted" ? "The PR description was submitted." : facts2?.description === "not_submitted" ? "No PR description was submitted." : "";
46363
46338
  return [tree, description].filter((s) => s !== "").join(" ");
46364
46339
  }
46365
- function nothingWritten(facts2, advice) {
46366
- const known = established(facts2, advice);
46367
- if (known) return ` ${known}`;
46368
- if (facts2?.workspace?.kind === "none") return advice ? ` ${advice.charAt(0).toUpperCase()}${advice.slice(1)}.` : "";
46369
- return ` Partial work may exist in the workspace${advice ? ` \u2014 ${advice}` : ""}.`;
46340
+ function gapApplies(facts2) {
46341
+ const w = facts2?.workspace;
46342
+ return w === void 0 || w.kind === "unread" || w.kind === "unmeasured" || w.kind === "none" || w.kind === "left" && w.fate !== "kept";
46343
+ }
46344
+ function nothingWritten(facts2, gap) {
46345
+ const gapSentence = gap && gapApplies(facts2) ? `${gap.charAt(0).toUpperCase()}${gap.slice(1)}.` : "";
46346
+ const known = established(facts2);
46347
+ if (known) return ` ${[gapSentence, known].filter((s) => s !== "").join(" ")}`;
46348
+ if (facts2?.workspace?.kind === "none") return gapSentence ? ` ${gapSentence}` : "";
46349
+ return ` Partial work may exist in the workspace${gap ? ` \u2014 ${gap}` : ""}.`;
46370
46350
  }
46371
46351
  function beforeFindings(facts2) {
46372
- const known = established(facts2, void 0);
46352
+ const known = established(facts2);
46373
46353
  return known ? `. ${known} Findings so far:` : " \u2014 findings so far:";
46374
46354
  }
46375
46355
  function elapsedMinutes(ms) {
@@ -46393,10 +46373,10 @@ var init_windDown = __esm({
46393
46373
  MODEL_CALL_IN_FLIGHT = "a model call was in flight";
46394
46374
  timeBudgetNote = (doing) => doing ? `the loop's time is up while ${doing} \u2014 writing up findings so far inside the lease` : "the loop's time is up \u2014 writing up findings so far inside the lease";
46395
46375
  toolCutNote = (doing) => `the loop's end cut the command in flight (${doing}) so the write-up keeps its allowance`;
46396
- commandPastLoopEndRefusal = (askedSecs, leftSecs) => `budget \u2014 this command asked for a ${askedSecs} s timeout and the loop ends in ${leftSecs} s, so it could never finish: re-issue it with a timeout inside the ${leftSecs} s left if it finishes sooner, or push what you have and write up \u2014 the full verification is CI's.`;
46376
+ commandPastLoopEndRefusal = (askedSecs, leftSecs) => `budget \u2014 this command asked for a ${askedSecs} s timeout and the loop ends in ${leftSecs} s, so it could never finish. A timeout inside the ${leftSecs} s left can still finish; otherwise the current work and write-up stand, and CI owns full verification.`;
46397
46377
  turnGuardNote = (pace) => `turn guard fired: ${pace}, a pace that looks like a loop \u2014 writing up findings so far`;
46398
46378
  softStopNote = () => "soft stop \u2014 no further steps, writing up findings so far";
46399
- hardStopNote = () => "hard stop \u2014 run aborted, no summary written";
46379
+ hardStopNote = () => "hard stop \u2014 the run was aborted, no summary written";
46400
46380
  windDownFailureNote = (error, closes = "run") => `the model call failed during the wind-down (${error}); the ${closes} closes with its findings so far`;
46401
46381
  finaleWaitNote = (reason2, doing, interruptUnanswered, closes = "run") => `the finale bound ended the wait${doing ? ` while ${doing}` : ""}${interruptUnanswered ? ", the loop-end interrupt unanswered" : ""} (${reason2}); the ${closes} closes with its findings so far`;
46402
46382
  finaleTimedOutNote = (closes = "run") => `finale timed out \u2014 closing the ${closes} without a write-up`;
@@ -46420,14 +46400,14 @@ var init_windDown = __esm({
46420
46400
  wrapUpName = (kind) => kind === "time" ? "time-budget" : kind === "turns" ? "turn-guard" : "soft-stop";
46421
46401
  finaleAbortReason = (boundMs) => `aborted at the finale bound (${elapsedMinutes(boundMs)})`;
46422
46402
  noWriteUp = (failed, onTool) => failed ? onTool ? `; the finale bound ended the wait on a tool call (${failed}), so no write-up came` : `; the model call failed during the wind-down (${failed}), so no write-up came` : "";
46423
- TIME_ADVICE = "narrow the task and try again";
46424
- TURN_ADVICE = "look for a retry loop in the run's events before trying again";
46403
+ TIME_ADVICE = "this is a bug: the task outlived its run budget and no automatic continuation was scheduled";
46404
+ TURN_ADVICE = "this is a bug: a retry loop spent the turn guard and no automatic recovery was scheduled";
46425
46405
  shortSha2 = (sha) => sha.slice(0, 7);
46426
46406
  counted = (w) => `${w.uncommitted} uncommitted change(s) and ${w.unpushed} unpushed commit(s)`;
46427
46407
  timeBudgetAnswer = (text, maxMinutes, writeUpFailed, facts2, writeUpFailedOnTool) => text ? `\u26A0\uFE0F _Hit the ${maxMinutes}-minute budget before finishing${beforeFindings(facts2)}_
46428
46408
 
46429
46409
  ${text}` : `Stopped at the ${maxMinutes}-minute budget without finishing${noWriteUp(writeUpFailed, writeUpFailedOnTool)}.${nothingWritten(facts2, TIME_ADVICE)}`;
46430
- turnGuardAnswer = (text, pace, writeUpFailed, facts2, writeUpFailedOnTool) => text ? `\u26A0\uFE0F _Stopped after ${pace} \u2014 that pace looks like a loop${established(facts2, void 0) ? beforeFindings(facts2) : "; findings so far:"}_
46410
+ turnGuardAnswer = (text, pace, writeUpFailed, facts2, writeUpFailedOnTool) => text ? `\u26A0\uFE0F _Stopped after ${pace} \u2014 that pace looks like a loop${established(facts2) ? beforeFindings(facts2) : "; findings so far:"}_
46431
46411
 
46432
46412
  ${text}` : `Stopped after ${pace} \u2014 that pace looks like a loop \u2014 without finishing${noWriteUp(writeUpFailed, writeUpFailedOnTool)}.${nothingWritten(facts2, TURN_ADVICE)}`;
46433
46413
  unlabelledAnswer = (text, writeUpFailed, ended = "failed", facts2) => {
@@ -52908,12 +52888,12 @@ async function handOffToCoordinator(deps, input) {
52908
52888
  if (status3.kind === "unanswered")
52909
52889
  return refused5(
52910
52890
  "plan_runner_state_unknown",
52911
- `\u26A0\uFE0F The plan runner could not tell whether \`${latest.id}\` still runs: ${status3.reason}. Nothing ran; re-issue the request to try again.`
52891
+ `\u26A0\uFE0F This is a bug: the plan runner could not tell whether \`${latest.id}\` still runs (${status3.reason}), so nothing ran and no automatic state retry was scheduled.`
52912
52892
  );
52913
52893
  if (status3.kind === "status" && RUNNING.has(status3.status))
52914
52894
  return refused5(
52915
52895
  "plan_runner_live",
52916
- `\u{1F6AB} A runner for ${where} is still running (\`${latest.id}\`, status: ${status3.status}): wait for it to end \u2014 or terminate it in the Workflows dashboard \u2014 before re-issuing.`
52896
+ `\u{1F6AB} A runner for ${where} is still running (\`${latest.id}\`, status: ${status3.status}), so this request started no second runner.`
52917
52897
  );
52918
52898
  if (status3.kind === "status" && !ENDED.has(status3.status))
52919
52899
  return refused5(
@@ -52977,7 +52957,7 @@ async function start(deps, input, instance, units, where, write) {
52977
52957
  );
52978
52958
  return refused5(
52979
52959
  "plan_runner_conflict",
52980
- `\u{1F6AB} A runner for \`${instance.id}\` was just recorded by another request \u2014 re-issue in a minute if it did not start.`
52960
+ `\u{1F6AB} A runner for \`${instance.id}\` was just recorded by another request, so this request started nothing; the recorded runner owns the pipeline.`
52981
52961
  );
52982
52962
  }
52983
52963
  const rows = await deps.instances.putUnits(units);
@@ -53035,7 +53015,7 @@ async function start(deps, input, instance, units, where, write) {
53035
53015
  log(`[ship] ${input.msg.threadKey}: the plan runner ${instance.id} could not be started \u2014 ${answer.reason}`);
53036
53016
  return refused5(
53037
53017
  "plan_start_failed",
53038
- `\u26A0\uFE0F The plan runner could not be started: ${answer.reason}. Nothing ran; re-issue the request to try again.`
53018
+ `\u26A0\uFE0F This is a bug: the plan runner could not be started (${answer.reason}), nothing ran, and no automatic start retry was scheduled.`
53039
53019
  );
53040
53020
  }
53041
53021
  }
@@ -53618,7 +53598,7 @@ function settleThread(deps, ctx) {
53618
53598
  console.log(`[dispatch] ${msg.threadKey} ${fromRuns} steer(s) from a parent run never read \u2014 not run fresh`);
53619
53599
  const stopMode = stopCounts ? control?.requested : void 0;
53620
53600
  if (pending2.length > 0 && stopMode) {
53621
- console.log(`[dispatch] ${msg.threadKey} ${pending2.length} follow-up(s) dropped: run stopped (${stopMode})`);
53601
+ console.log(`[dispatch] ${msg.threadKey} ${pending2.length} follow-up(s) dropped: the run stopped (${stopMode})`);
53622
53602
  return { kind: "dropped", stopMode, pending: pending2 };
53623
53603
  }
53624
53604
  if (pending2.length > 0 && admitted) {
@@ -53669,7 +53649,7 @@ var init_settle = __esm({
53669
53649
  init_requestTrace();
53670
53650
  init_threadAdmission();
53671
53651
  init_admission();
53672
- FOLLOW_UP_DROPPED_BY_STOP = "\u26D4 The run this was folded into was stopped before it read this follow-up, so it was not run. Re-send it to run it fresh.";
53652
+ FOLLOW_UP_DROPPED_BY_STOP = "\u26D4 This is a bug: the run was stopped before it read this folded follow-up, and the follow-up was not replayed as a fresh request.";
53673
53653
  fromPerson = (p) => p.from === void 0 && p.io !== void 0;
53674
53654
  }
53675
53655
  });
@@ -53692,7 +53672,7 @@ function carriedCoordinatorTag(row2, events) {
53692
53672
  }
53693
53673
  function lostWorkspaceNote(why, restarts) {
53694
53674
  const lost = `resumed after a restart: the run's workspace could not be re-attached (${why})`;
53695
- return restarts ? `${lost}; the run restarts from its request under the same run id` : `${lost}, and the row's request cannot be read, so the run ends here; re-send it to run it again`;
53675
+ return restarts ? `${lost}; the run restarts from its request under the same run id` : `${lost}; this is a bug: the row's request cannot be read, so the run ends here and no replacement run starts`;
53696
53676
  }
53697
53677
  function carriedRunIdentity(registry, runId3, note) {
53698
53678
  const snap = registry.snapshotById(runId3);
@@ -53737,7 +53717,7 @@ async function abandonLostWorkspace(ctx) {
53737
53717
  shell.close({
53738
53718
  kind: "not_started",
53739
53719
  icon: "\u{1F501}",
53740
- reason: restored ? "workspace lost across the restart; restarting from the request" : "workspace lost across the restart; re-send to run again",
53720
+ reason: restored ? "workspace lost across the restart; restarting from the request" : "this is a bug: the workspace was lost across the restart, the request could not be read, and no replacement run starts",
53741
53721
  ...closeLines(clock4(), false)
53742
53722
  })
53743
53723
  );
@@ -54415,7 +54395,7 @@ async function dispatch(deps, msg, io, opts = {}) {
54415
54395
  const original = await shipRequestOf(runsService, owner.run.id);
54416
54396
  if (original === void 0) {
54417
54397
  await io.reply(
54418
- "This ship pipeline ended, but its original task could not be read; what task should this thread re-issue?"
54398
+ "This ship pipeline ended, but its original task could not be read. What was the pipeline's original task?"
54419
54399
  );
54420
54400
  await recordPendingOperator();
54421
54401
  return ended;
@@ -62704,7 +62684,7 @@ function findOrphanedCards(input) {
62704
62684
  }
62705
62685
  function interruptedCardFrame(cardText) {
62706
62686
  const label = cardText.replace(LIVE_GLYPH_PREFIX, "").replace(SHUTDOWN_NOTICE_SUFFIX, "").replace(ACTIVITY_SUFFIX, "").replaceAll("&lt;", "<").replaceAll("&gt;", ">").replaceAll("&amp;", "&").trim();
62707
- const detail = "The bot restarted (a deploy) while this run was in flight, so the run was lost and this card stopped updating. Re-send your request to run it again.";
62687
+ const detail = "This is a bug: the bot restarted while this run was in flight, but the run could not be resumed from the ledger. The card stopped updating and no replacement run was started.";
62708
62688
  return { title: `\u274C interrupted \xB7 ${label}`, detail };
62709
62689
  }
62710
62690
  async function catchUpMissedMentions(opts) {
@@ -63861,7 +63841,7 @@ var init_slack = __esm({
63861
63841
  PLATFORM3 = "slack";
63862
63842
  SLACK_MSG_LIMIT = 3500;
63863
63843
  SLACK_SECTION_LIMIT = 3e3;
63864
- CLICK_FAILED_LINE = "this click could not be handled; type the line to run it";
63844
+ CLICK_FAILED_LINE = "this click could not be handled; nothing ran, and the command line remains visible in the offer";
63865
63845
  LOADING_PHRASES = [
63866
63846
  "is patching you through\u2026",
63867
63847
  "is untangling the cords\u2026",
@@ -65440,7 +65420,7 @@ function serveEvents(subscribe, sink, onLive) {
65440
65420
  );
65441
65421
  if (!subscribed) {
65442
65422
  sink.writeHead(404, { "content-type": "text/plain; charset=utf-8" });
65443
- sink.write("run not found");
65423
+ sink.write("no run found");
65444
65424
  sink.end();
65445
65425
  return;
65446
65426
  }
@@ -65731,7 +65711,7 @@ function createLiveViewHandler(deps) {
65731
65711
  };
65732
65712
  const liveTokens = () => new Map(index.listActive().map((s) => [s.id, s.token]));
65733
65713
  const notFoundPage = (req, res, viewer) => {
65734
- deps.page(req, res, 404, viewer, "Run not found", {
65714
+ deps.page(req, res, 404, viewer, "No run found", {
65735
65715
  page: "runNotFound",
65736
65716
  retentionDays: deps.retention ? deps.retention.retentionDays : null
65737
65717
  });
@@ -65929,7 +65909,7 @@ function createLiveViewHandler(deps) {
65929
65909
  }
65930
65910
  const result = access.requestStop(mode);
65931
65911
  if (!result.ok) {
65932
- if (result.reason === "finished") text(res, 409, "run already finished");
65912
+ if (result.reason === "finished") text(res, 409, "the run already finished");
65933
65913
  else if (result.reason === "hosted") text(res, 409, HOSTED_STOP);
65934
65914
  else text(res, 404, NOT_FOUND2);
65935
65915
  return true;
@@ -65963,13 +65943,13 @@ function createLiveViewHandler(deps) {
65963
65943
  return;
65964
65944
  }
65965
65945
  if (found.value.finished) {
65966
- text(res, 409, "run already finished");
65946
+ text(res, 409, "the run already finished");
65967
65947
  return;
65968
65948
  }
65969
65949
  const stopped = await service.stopRun(route2.id, mode, { kind: "access", id: actor.id });
65970
65950
  if (!stopped.ok) {
65971
65951
  if (stopped.error === "hosted") text(res, 409, HOSTED_STOP);
65972
- else if (stopped.error === "conflict") text(res, 409, "run already finished");
65952
+ else if (stopped.error === "conflict") text(res, 409, "the run already finished");
65973
65953
  else text(res, 404, NOT_FOUND2);
65974
65954
  return;
65975
65955
  }
@@ -66104,7 +66084,7 @@ var init_liveView = __esm({
66104
66084
  INDEX_PAGE_SIZE = 25;
66105
66085
  RUNS_GET = { type: "command", id: "runs.get" };
66106
66086
  RUNS_STOP = { type: "command", id: "runs.stop" };
66107
- NOT_FOUND2 = "run not found";
66087
+ NOT_FOUND2 = "no run found";
66108
66088
  HOSTED_STOP = "this run is a pipeline; its units run in their own threads, so a stop here ends nothing; an operator's hard stop seals it failed and releases the thread";
66109
66089
  TEXT = { "content-type": "text/plain; charset=utf-8" };
66110
66090
  JSON_NO_STORE2 = { "content-type": "application/json; charset=utf-8", "cache-control": "no-store" };
@@ -67022,7 +67002,7 @@ function createWebChatHandler(deps) {
67022
67002
  const threadKey = threadKeyFor(sub, route2.id);
67023
67003
  readTurns(threadKey, ctx.actor).then(async (open2) => {
67024
67004
  if (open2.runs.length === 0 && !ownLane(sub, threadKey)) {
67025
- deps.page(req, res, 404, ctx.actor, "Run not found", { page: "runNotFound", retentionDays });
67005
+ deps.page(req, res, 404, ctx.actor, "No run found", { page: "runNotFound", retentionDays });
67026
67006
  return;
67027
67007
  }
67028
67008
  const seed = await seedFor(ctx, route2.id, threadKey, open2);
@@ -67304,14 +67284,14 @@ function createMetricsViewHandler(service, page2) {
67304
67284
  json2(res, report2);
67305
67285
  return;
67306
67286
  }
67307
- page2(req, res, 200, ctx.actor, "Run metrics", { page: "metrics", report: report2 });
67287
+ page2(req, res, 200, ctx.actor, "Metrics by run", { page: "metrics", report: report2 });
67308
67288
  }).catch((err2) => {
67309
67289
  const message4 = err2 instanceof Error ? err2.message : String(err2);
67310
67290
  if (message4 === METRICS_OFF_MESSAGE) {
67311
67291
  plain3(res, 503, METRICS_OFF_MESSAGE);
67312
67292
  return;
67313
67293
  }
67314
- plain3(res, 503, `run metrics unavailable: ${err2 instanceof Error ? err2.name : "Error"}`);
67294
+ plain3(res, 503, `metrics by run unavailable: ${err2 instanceof Error ? err2.name : "Error"}`);
67315
67295
  });
67316
67296
  return true;
67317
67297
  };
@@ -68121,7 +68101,7 @@ async function complete(svc, nonce, identity2, token2, res) {
68121
68101
  res,
68122
68102
  400,
68123
68103
  "Token rejected by the server",
68124
- `<p class="err">${esc(warning ?? "the server rejected the token")}</p><p>Nothing was stored. Check the token and try again.</p>${server ? entryForm(server, nonce) : ""}`
68104
+ `<p class="err">${esc(warning ?? "the server rejected the token")}</p><p>Nothing was stored. This is a bug: the token was refused and no fresh sign-in was opened automatically.</p>${server ? entryForm(server, nonce) : ""}`
68125
68105
  );
68126
68106
  }
68127
68107
  return connected(res, server, toolCount, warning);
@@ -68269,7 +68249,12 @@ function page(res, status3, title, body, head = "") {
68269
68249
  }
68270
68250
  function failure(res, err2) {
68271
68251
  console.error(`[mcp-connect] ${err2 instanceof Error ? err2.message : String(err2)}`);
68272
- page(res, 503, "Registry unavailable", "<p>The MCP registry could not be reached. Try again in a moment.</p>");
68252
+ page(
68253
+ res,
68254
+ 503,
68255
+ "Registry unavailable",
68256
+ "<p>This is a bug: the MCP registry could not be reached and no automatic retry was scheduled.</p>"
68257
+ );
68273
68258
  }
68274
68259
  function esc(s) {
68275
68260
  return s.replace(
@@ -68398,8 +68383,8 @@ function closureNote(agent, prUrl3, cause) {
68398
68383
  if (agent === "ship")
68399
68384
  return shipInterruptedNote(prUrl3, cause === "resident_replaced" ? "container_replaced" : "bot_restart");
68400
68385
  if (cause !== void 0)
68401
- return `This run ended \u2014 ${endingCauseWords(cause)} \u2014 and it could not be resumed, so this card stopped updating. Re-send your request to run it again.`;
68402
- return "The bot restarted while this run was in flight and it could not be resumed, so this card stopped updating. Re-send your request to run it again.";
68386
+ return `This is a bug: this run ended \u2014 ${endingCauseWords(cause)} \u2014 but it could not be resumed from the ledger. This card stopped updating and no replacement run was started.`;
68387
+ return "This is a bug: the bot restarted while this run was in flight, but the run could not be resumed from the ledger. This card stopped updating and no replacement run was started.";
68403
68388
  }
68404
68389
  function prUrlOf(events) {
68405
68390
  let url;
@@ -69544,7 +69529,7 @@ ${turn}`, contract };
69544
69529
  return {
69545
69530
  preset: "coding",
69546
69531
  ref: unit.branch,
69547
- prompt: `The approved pull request ${prUrl(instance.repo, brief.pr)} conflicts with \`${brief.base}\` at reviewed head \`${brief.headSha}\`. Rebase \`${unit.branch}\` onto the latest \`${brief.base}\`, resolve only the conflicts git left using the thread and repository rules, run the changed-set fast gates, and push with lease. Resubmit the pull request description at the pushed head. Never merge and never approve; the pipeline re-reviews the changed patch.`
69532
+ prompt: `The approved pull request ${prUrl(instance.repo, brief.pr)} conflicts with \`${brief.base}\` at reviewed head \`${brief.headSha}\`. Rebase \`${unit.branch}\` onto the latest \`${brief.base}\`, resolve only the conflicts git left using the thread and repository rules, and make the lease-protected push only after the changed-set fast gates pass. Resubmit the pull request description at the pushed head. Never merge and never approve; the pipeline re-reviews the changed patch.`
69548
69533
  };
69549
69534
  default: {
69550
69535
  const unknown = brief;
@@ -69554,7 +69539,7 @@ ${turn}`, contract };
69554
69539
  }
69555
69540
  async function facts(readers, runId3) {
69556
69541
  const read = await readers.readRunFacts(runId3);
69557
- if (!read) throw new Error(`run ${runId3} is not in the run history`);
69542
+ if (!read) throw new Error(`the run ${runId3} is not in history`);
69558
69543
  return read;
69559
69544
  }
69560
69545
  var SPECS_DIR2, RULES_FILES2, isGenerated, prUrl;
@@ -70840,7 +70825,7 @@ async function unitWake(body, deps) {
70840
70825
  } else {
70841
70826
  answer = {
70842
70827
  kind: "answered",
70843
- reply: `${renderRenewal(decision, grantFact.grant, { idle: true })} (grant from ${grantFact.source}); run \`runs stop ${instance.id}:${row2.unit}\` to end this idle unit.`
70828
+ reply: `${renderRenewal(decision, grantFact.grant, { idle: true })} (grant from ${grantFact.source}); the idle unit remains open, and \`runs stop ${instance.id}:${row2.unit}\` is its stop command.`
70844
70829
  };
70845
70830
  }
70846
70831
  }
@@ -71230,7 +71215,7 @@ async function merge(body, deps, subject2) {
71230
71215
  const enqueue = async () => {
71231
71216
  if (deps.enqueuePullRequest === void 0)
71232
71217
  return refused7(
71233
- `\`${facts2.baseRef ?? "the base"}\` takes changes only through a merge queue and the door cannot enqueue \u2014 enqueue ${where} by hand (\`gh pr merge --auto\`); the approved work stands`
71218
+ `\`${facts2.baseRef ?? "the base"}\` takes changes only through a merge queue and the door cannot enqueue \u2014 this is a bug: automatic merge-queue enqueue is unavailable; the approved work stands`
71234
71219
  );
71235
71220
  let queued;
71236
71221
  try {
@@ -71329,7 +71314,7 @@ async function checksStep(body, deps) {
71329
71314
  function planSummary(units, generated = false) {
71330
71315
  const lines = units.map((u) => {
71331
71316
  const kind = u.ending ? u.ending.kind : u.threadKey ? "unfinished" : "not started";
71332
- const how = u.ending ? endingWordOf(u.ending.kind) : u.threadKey ? "no ending was recorded \u2014 re-issue `agent:ship` in its thread to continue" : kind;
71317
+ const how = u.ending ? endingWordOf(u.ending.kind) : u.threadKey ? "no ending was recorded \u2014 the next reply in its thread continues the unit" : kind;
71333
71318
  const pr = u.pr ? ` \u2014 ${u.pr.url}` : "";
71334
71319
  return generated ? `${ENDING_ICON[kind] ?? "\u2022"} ${how}${pr}` : `${ENDING_ICON[kind] ?? "\u2022"} ${u.unit} \u2014 ${how}${pr}`;
71335
71320
  });
@@ -72040,14 +72025,17 @@ async function sweepOne(pr, deps, owner) {
72040
72025
  return at("skipped", "deferred \u2014 its pipeline runner owns the rebase");
72041
72026
  const dirty = pr.mergeableState === "dirty";
72042
72027
  if (!dirty && (pr.mergeableState === "unknown" || pr.mergeableState === ""))
72043
- return at("skipped", "mergeability still computing \u2014 run the sweep again in a minute");
72028
+ return at("skipped", "mergeability still computing \u2014 no rebase was attempted");
72044
72029
  if (!dirty) return at("skipped", "skipped, already current");
72045
72030
  try {
72046
72031
  const rebased = await deps.git.rebase(pr);
72047
72032
  const decision = rebased.kind === "conflict" ? owner === "runner" ? { action: "model-round", file: rebased.file } : decideSweep({ dirty, rebase: rebased, modelRoundSpent: await deps.effects.modelRoundSpent(pr) }) : decideSweep({ dirty, rebase: rebased, patchUnchanged: await deps.git.patchUnchanged(pr, rebased.newHead) });
72048
72033
  switch (decision.action) {
72049
72034
  case "end":
72050
- return at("conflict", `conflict in ${decision.file}, its fix round is spent \u2014 rebase it by hand`);
72035
+ return at(
72036
+ "conflict",
72037
+ `this is a bug: the conflict in ${decision.file} remained after the sweep's fix round, and no automatic recovery remains`
72038
+ );
72051
72039
  case "model-round": {
72052
72040
  if (owner === "runner")
72053
72041
  return at("conflict", `conflict in ${decision.file}, the pipeline runner's fix round will resolve it`);
@@ -73845,7 +73833,7 @@ function askExitCode(finished) {
73845
73833
  function missingBotConfig(configPath) {
73846
73834
  return new CommandError(
73847
73835
  "unavailable",
73848
- `bot config not found at ${configPath} \u2014 set SWITCHBOARD_CONFIG to a config file or run from a checkout with config/config.yaml (deploy, env, friction analyze need none)`
73836
+ `bot config not found at ${configPath} \u2014 the command stopped before work began; the config path comes from SWITCHBOARD_CONFIG or defaults to config/config.yaml (deploy, env, friction analyze need no bot config)`
73849
73837
  );
73850
73838
  }
73851
73839
  async function loadBotConfig(configPath, overridesPath, opts = {}) {