frizz 0.8.0 → 0.8.1

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 (100) hide show
  1. package/dist/claude-agent-broker.js +58 -1
  2. package/dist/dev-child.js +241 -348
  3. package/dist/frizz.js +4 -2
  4. package/package.json +1 -1
  5. package/runtime/cc-worker/agents/high.md +1 -1
  6. package/runtime/cc-worker/agents/low.md +1 -1
  7. package/runtime/cc-worker/agents/max.md +1 -1
  8. package/runtime/cc-worker/agents/medium.md +1 -1
  9. package/runtime/cc-worker/agents/xhigh.md +1 -1
  10. package/runtime/cc-worker/hooks/agent-dispatch.mjs +4 -4
  11. package/web-dist/assets/{TerminalPane-BIBHC61j.js → TerminalPane-BM_laA_I.js} +1 -1
  12. package/web-dist/assets/{abnfDiagram-VRR7QNED-CcFQGFPf.js → abnfDiagram-VRR7QNED-C5FCLi1n.js} +1 -1
  13. package/web-dist/assets/architecture-TIHT7OUA-ngY1F0r2.js +1 -0
  14. package/web-dist/assets/{architectureDiagram-ZJ3FMSHR-DErIQOIs.js → architectureDiagram-ZJ3FMSHR-Dm7tUnwt.js} +1 -1
  15. package/web-dist/assets/{blockDiagram-677ZJIJ3-CpsUqur1.js → blockDiagram-677ZJIJ3-3EhpmwKM.js} +1 -1
  16. package/web-dist/assets/{c4Diagram-LMCZKHZV-D2dHmCEJ.js → c4Diagram-LMCZKHZV-Ca-BjDxw.js} +1 -1
  17. package/web-dist/assets/channel-BpyNaJoi.js +1 -0
  18. package/web-dist/assets/{chunk-32BRIVSS-aOCEfxRW.js → chunk-32BRIVSS-xGbaUlTN.js} +1 -1
  19. package/web-dist/assets/{chunk-52WLFC77-2iw4nJPC.js → chunk-52WLFC77-YYhE3F1a.js} +1 -1
  20. package/web-dist/assets/{chunk-C7G6YPKG-BPD3iHVE.js → chunk-C7G6YPKG-SYKXFtUg.js} +1 -1
  21. package/web-dist/assets/{chunk-EX3LRPZG-DrefHift.js → chunk-EX3LRPZG-cqjtdM_c.js} +1 -1
  22. package/web-dist/assets/{chunk-FWX5IMBZ-By940EHT.js → chunk-FWX5IMBZ-qyaTngKT.js} +2 -2
  23. package/web-dist/assets/{chunk-HOUHSVGY-B1Cqvz7e.js → chunk-HOUHSVGY-DBFt1HnE.js} +1 -1
  24. package/web-dist/assets/{chunk-ICXQ74PX-1LkVpWuI.js → chunk-ICXQ74PX-Bme_2_gm.js} +1 -1
  25. package/web-dist/assets/{chunk-MOJQB5TN-Ip1cy64r.js → chunk-MOJQB5TN-DupTmWhN.js} +1 -1
  26. package/web-dist/assets/{chunk-OGEWGWER-CNjVyu8F.js → chunk-OGEWGWER-DSqmbKCq.js} +1 -1
  27. package/web-dist/assets/{chunk-PUDLZKDR-9HZR6DAU.js → chunk-PUDLZKDR-DVnHUoFN.js} +1 -1
  28. package/web-dist/assets/{chunk-Q4XR5HBZ-vtWwOCuQ.js → chunk-Q4XR5HBZ-BIZh_Yuh.js} +1 -1
  29. package/web-dist/assets/{chunk-V7JOEXUC-DC6YaHG0.js → chunk-V7JOEXUC-e2G7UgOg.js} +1 -1
  30. package/web-dist/assets/{chunk-VAUOI2AC-CP-xe7SD.js → chunk-VAUOI2AC-uYgyYWPh.js} +1 -1
  31. package/web-dist/assets/{chunk-VR4S4FIN-wbxDFptH.js → chunk-VR4S4FIN-BjGjcexQ.js} +1 -1
  32. package/web-dist/assets/{chunk-WYO6CB5R-dibXmwpK.js → chunk-WYO6CB5R-BKKd_W3B.js} +1 -1
  33. package/web-dist/assets/{chunk-ZGVPDNZ5-_y_itJHG.js → chunk-ZGVPDNZ5-D5_hsjnF.js} +1 -1
  34. package/web-dist/assets/classDiagram-OUVF2IWQ-DTEWwxt7.js +1 -0
  35. package/web-dist/assets/classDiagram-v2-EOCWNBFH-DTEWwxt7.js +1 -0
  36. package/web-dist/assets/{cynefin-VYW2F7L2-D1RYokZP.js → cynefin-VYW2F7L2-bkFv7EpV.js} +1 -1
  37. package/web-dist/assets/{cynefinDiagram-TSTJHNR4-qofqoy3T.js → cynefinDiagram-TSTJHNR4-Du2-dyuZ.js} +1 -1
  38. package/web-dist/assets/{dagre-VKFMJZFB-CgHLoGFk.js → dagre-VKFMJZFB-CU7w00Ul.js} +1 -1
  39. package/web-dist/assets/{diagram-FQU43EPY-JEAs4LOb.js → diagram-FQU43EPY-BxvVgxWb.js} +1 -1
  40. package/web-dist/assets/{diagram-G47NLZAW--tLd4Lf7.js → diagram-G47NLZAW-D8VvetwQ.js} +1 -1
  41. package/web-dist/assets/{diagram-NH7WQ7WH-DPbw9CJU.js → diagram-NH7WQ7WH-CwsChkED.js} +1 -1
  42. package/web-dist/assets/{diagram-OA4YK3LP-CDrb7nWs.js → diagram-OA4YK3LP-BIPYbe6L.js} +1 -1
  43. package/web-dist/assets/{diagram-WEI45ONY-DJswZe3f.js → diagram-WEI45ONY-BoyH4dKl.js} +1 -1
  44. package/web-dist/assets/{ebnfDiagram-CCIWWBDH-BP8-PZMF.js → ebnfDiagram-CCIWWBDH-9A3WRDfU.js} +1 -1
  45. package/web-dist/assets/{erDiagram-Q63AITRT-BQXuebf5.js → erDiagram-Q63AITRT-D3Y9WA4H.js} +1 -1
  46. package/web-dist/assets/eventmodeling-45OFAUF4-D7g9kDF0.js +1 -0
  47. package/web-dist/assets/flowDiagram-23GEKE2U-BqKnxVr3.js +1 -0
  48. package/web-dist/assets/{ganttDiagram-NO4QXBWP-DotMb935.js → ganttDiagram-NO4QXBWP-Bk2-LClm.js} +1 -1
  49. package/web-dist/assets/{gitGraph-TEB2WS4Q-B1vbYyKQ.js → gitGraph-TEB2WS4Q-CXvPrsio.js} +1 -1
  50. package/web-dist/assets/{gitGraphDiagram-IHSO6WYX-BjDXKk4m.js → gitGraphDiagram-IHSO6WYX-BC9D72kT.js} +1 -1
  51. package/web-dist/assets/index-CCtNIGi6.js +491 -0
  52. package/web-dist/assets/index-Cq79m8AR.css +1 -0
  53. package/web-dist/assets/{info-DKCQHKI2-xLTLqQju.js → info-DKCQHKI2-Beag76kE.js} +1 -1
  54. package/web-dist/assets/{infoDiagram-FWYZ7A6U-BFfYUsrC.js → infoDiagram-FWYZ7A6U-DaqYXHYB.js} +1 -1
  55. package/web-dist/assets/{ishikawaDiagram-FXEZZL3T-45a7VMwm.js → ishikawaDiagram-FXEZZL3T-D-d4tmLU.js} +1 -1
  56. package/web-dist/assets/{journeyDiagram-5HDEW3XC-CEBUpu59.js → journeyDiagram-5HDEW3XC-kkFYzNg1.js} +1 -1
  57. package/web-dist/assets/{kanban-definition-HUTT4EX6-RwKtDFzG.js → kanban-definition-HUTT4EX6-BYRPjbfv.js} +1 -1
  58. package/web-dist/assets/{line-DStcMIry.js → line-C8l7y6rG.js} +1 -1
  59. package/web-dist/assets/{mermaid-parser.core-B0ekgQMA.js → mermaid-parser.core-BG3fgy77.js} +3 -3
  60. package/web-dist/assets/{mermaid.core-w1hcQaPy.js → mermaid.core-BCDzcbhr.js} +3 -3
  61. package/web-dist/assets/{mindmap-definition-LN4V7U3C-D_n38Imb.js → mindmap-definition-LN4V7U3C-CP_bgQm8.js} +1 -1
  62. package/web-dist/assets/{packet-7NZHBO7P-CstGeBOX.js → packet-7NZHBO7P-Dgd69pFS.js} +1 -1
  63. package/web-dist/assets/{pegDiagram-2B236MQR-DvowVyTO.js → pegDiagram-2B236MQR-BJUb_DOD.js} +1 -1
  64. package/web-dist/assets/{pie-RZYD4A2V-BOP2j_HH.js → pie-RZYD4A2V-DPbVRAuL.js} +1 -1
  65. package/web-dist/assets/{pieDiagram-ENE6RG2P-CKRqu_2f.js → pieDiagram-ENE6RG2P-DavUeOqM.js} +1 -1
  66. package/web-dist/assets/{quadrantDiagram-ABIIQ3AL-zSArSS8R.js → quadrantDiagram-ABIIQ3AL-BdvoSedu.js} +1 -1
  67. package/web-dist/assets/{radar-I7S5WNFK-BqRdNIBw.js → radar-I7S5WNFK-C2TAta9K.js} +1 -1
  68. package/web-dist/assets/{railroad-3IZDKUUU-BaKcl_LU.js → railroad-3IZDKUUU-DEMjzYqC.js} +1 -1
  69. package/web-dist/assets/railroad-abnf-AHOZXSZD-_4FByoRI.js +1 -0
  70. package/web-dist/assets/railroad-ebnf-EBAXGLYW-DKAvMIMu.js +1 -0
  71. package/web-dist/assets/railroad-peg-LSFZ7HO6-CkJl3c69.js +1 -0
  72. package/web-dist/assets/{railroadDiagram-RFXS5EU6-BrXTQge9.js → railroadDiagram-RFXS5EU6-C4rERo6H.js} +1 -1
  73. package/web-dist/assets/{requirementDiagram-TGXJPOKE-DBBNi_SS.js → requirementDiagram-TGXJPOKE-DlIG9D0n.js} +1 -1
  74. package/web-dist/assets/{sankeyDiagram-HTMAVEWB-BwFi7xFy.js → sankeyDiagram-HTMAVEWB-DVMrG-qY.js} +1 -1
  75. package/web-dist/assets/{sequenceDiagram-DBY2YBRQ-CeivqMeT.js → sequenceDiagram-DBY2YBRQ-DDcDM_-e.js} +1 -1
  76. package/web-dist/assets/{stateDiagram-2N3HPSRC-C6NZsnFm.js → stateDiagram-2N3HPSRC-DuCRKU5t.js} +1 -1
  77. package/web-dist/assets/stateDiagram-v2-6OUMAXLB-90dqEQum.js +1 -0
  78. package/web-dist/assets/{swimlanes-5IMT3BWC-C0MubXTG.js → swimlanes-5IMT3BWC-CY0fdvUm.js} +1 -1
  79. package/web-dist/assets/swimlanesDiagram-G3AALYLV-BETWueIt.js +8 -0
  80. package/web-dist/assets/{timeline-definition-FHXFAJF6-CtxwSvFu.js → timeline-definition-FHXFAJF6-De0fDNdU.js} +1 -1
  81. package/web-dist/assets/{treeView-QDETBFTQ-CXcwSjey.js → treeView-QDETBFTQ-AIoMhcen.js} +1 -1
  82. package/web-dist/assets/{treemap-6X3UGDF4-Uspgr-d1.js → treemap-6X3UGDF4-CPZ1Ln05.js} +1 -1
  83. package/web-dist/assets/{vennDiagram-L72KCM5P-tZamQQAQ.js → vennDiagram-L72KCM5P-FrSO6pmh.js} +1 -1
  84. package/web-dist/assets/{wardley-OPB4EBWU-0_79c19P.js → wardley-OPB4EBWU-BbET6cjs.js} +1 -1
  85. package/web-dist/assets/{wardleyDiagram-EHGQE667-uYmUsP66.js → wardleyDiagram-EHGQE667-DqvcCBjr.js} +1 -1
  86. package/web-dist/assets/{xychartDiagram-FW5EYKEG-BsOU7Wf7.js → xychartDiagram-FW5EYKEG-91xKEO07.js} +1 -1
  87. package/web-dist/index.html +2 -2
  88. package/web-dist/assets/architecture-TIHT7OUA-BZEZt7jZ.js +0 -1
  89. package/web-dist/assets/channel-DdFRPviT.js +0 -1
  90. package/web-dist/assets/classDiagram-OUVF2IWQ-Bf3duLb8.js +0 -1
  91. package/web-dist/assets/classDiagram-v2-EOCWNBFH-Bf3duLb8.js +0 -1
  92. package/web-dist/assets/eventmodeling-45OFAUF4-DOLxRQQ5.js +0 -1
  93. package/web-dist/assets/flowDiagram-23GEKE2U-DoK1yb0H.js +0 -1
  94. package/web-dist/assets/index-CmrDpsD8.css +0 -1
  95. package/web-dist/assets/index-Cs0TDGMu.js +0 -491
  96. package/web-dist/assets/railroad-abnf-AHOZXSZD-itqDLg1p.js +0 -1
  97. package/web-dist/assets/railroad-ebnf-EBAXGLYW-ze7rLVCi.js +0 -1
  98. package/web-dist/assets/railroad-peg-LSFZ7HO6-DKsYkEuG.js +0 -1
  99. package/web-dist/assets/stateDiagram-v2-6OUMAXLB-B3YRnI4W.js +0 -1
  100. package/web-dist/assets/swimlanesDiagram-G3AALYLV-CXva4Ic9.js +0 -8
package/dist/dev-child.js CHANGED
@@ -13272,7 +13272,7 @@ function parseGithubWakeSteer(text) {
13272
13272
  function frizzRoute(path) {
13273
13273
  return `${FRIZZ_ROUTE_PREFIX}${path.startsWith("/") ? path : `/${path}`}`;
13274
13274
  }
13275
- var import_yaml, ATTACHMENT_IMAGE_EXTENSIONS, ATTACHMENT_DOC_EXTENSIONS, ATTACHMENT_EXTENSIONS, ATTACHMENT_MAX_BASE64_CHARS, ATTACHMENT_MAX_BYTES, ATTACHMENT_EXT_SET, ATTACHMENT_ACCEPT, FrizzStatus, BlockMechanism, RuntimeState, Backend, CodexModel, ThreadProfileOption, ThreadAgent, SubAgentView, BgShellView, CompletionHoldOp, CompletionHold, AskOption, AskQuestion, PendingAsk, AwaitingHint, RETIRED_AWAITING_KINDS, RETIRED_LINE_RE, RETIRED_AWAITING_REPLACEMENT, AWAITING_KEY_RE, AWAITING_YAML_KEYS, AWAITING_SEQUENCE_KEYS, AWAITING_HINT_MAX, AWAITING_HINT_VALUE_MAX, AWAITING_TITLE_MAX, AWAITING_ITEM_KINDS, AWAITING_DURATION_RE, DURATION_UNIT_MS, AWAITING_FOR_MAX_MS, SnoozeUntil, SNOOZE_PROMPT_MAX, SnoozePrompt, RECURRING_PROMPT_MAX, RECURRING_MIN_INTERVAL_SECONDS, RECURRING_MAX_INTERVAL_SECONDS, RecurringPromptText, RecurringIntervalSeconds, ThreadRecurringPrompt, INTERRUPT_MARKERS, ALLDONE_SENTINEL, OPT_OUT_NOTE, OVER_QUESTION_NOTE, TIMER_PROMPT_MAX, TIMER_MAX_DELAY_SECONDS, TIMER_MAX_ARMED, TimerPromptText, SIGNOFF_NUDGE_MARKER, SIGNOFF_NUDGE_MESSAGE, PARK_CORRECTION_NAMES_LEAD, PARK_CORRECTION_RETIRED_LEAD, ThreadWatchKind, GithubChecksState, GithubMergeState, GithubWatchStatus, ThreadWatchView, PR_WATCH_DEFAULT_FOR_MS, PR_WATCH_MAX_ARMED, PrWatchView, AddOwnPrWatchInput, AddOwnPrWatchResult, DropOwnPrWatchInput, DropOwnPrWatchResult, ListOwnPrWatchesInput, OwnPrWatchesResult, ThreadTimerView, ThreadFence, LimitWindow, LimitPause, ThreadView, BoardErrorItem, BoardSnapshot, QuotaWindow, ProviderQuota, QuotaSnapshot, ProviderAuth, AccountEmails, AuthSnapshot, AccountLogoutInput, AccountLogoutResult, AccountLoginStartInput, AccountLoginStartResult, AccountLoginStatusInput, AccountLoginStatusResult, PermissionMode, LocalFileOpener, Settings, DispatchProviderPreferences, DispatchPreferences, DispatchProfileSnapshot, SetDispatchPreferenceInput, DispatchInput, ADOPT_THREAD_MESSAGE_MAX_CHARS, AdoptThreadInput, AdoptThreadResult, AdoptSessionInput, FollowUpInput, UnqueueFollowUpInput, UnqueueFollowUpResult, DeliverQueuedNowInput, DeliverQueuedNowResult, SetThreadSnoozeInput, SetThreadRecurringPromptInput, SetOwnThreadRecurringPromptInput, SetOwnThreadRecurringPromptResult, GetOwnThreadRecurringPromptInput, OwnThreadRecurringPromptResult, SetOwnThreadTimerInput, CancelOwnThreadTimerInput, ListOwnThreadTimersInput, OwnThreadTimersResult, ThreadActivityItem, ListOwnThreadActivityInput, OwnThreadActivityResult, SetOwnThreadTimerResult, CancelOwnThreadTimerResult, SetOwnThreadStopHookInput, SetOwnThreadHeartbeatInput, ThreadPluginReloadResult, RenameThreadInput, AiRenameThreadInput, AiRenameThreadResult, SetThreadPermissionInput, SetThreadPermissionResult, ThreadProfileOptionsInput, ThreadProfileOptionsResult, ThreadSkill, ThreadSkillsInput, ThreadSkillsResult, SetThreadProfileInput, SetThreadProfileResult, DISPATCH_TASK_BANNER, DISPATCH_TASK_BANNER_MARKER, GITHUB_DISPATCH_UI_BOUNDARY, HUMAN_GAP_FLOOR_MS, HUMAN_GAP_NOTE_TAIL, WAKE_DELIVERY_TOKEN_TAIL, WAKE_DELIVERY_TOKEN_LINE, NOISE_PREFIXES, AGENT_MESSAGE_WRAPPER, GithubWakeItem, GithubWakeSteer, WAKE_SCOPE, WAKE_REVIEW_LEAD, WAKE_BACKLOG_TAIL, WAKE_REF, WAKE_SINGLE, WAKE_MULTI_HEAD, WAKE_ITEM, WAKE_MORE, PR_WATCH_FINISHED, PR_WATCH_CI_PASSED, PR_WATCH_CI_FAILED, GithubStatus, GithubRefCard, GithubRefPreviewInput, GithubRefPreviewResult, GithubItem, GithubListInput, GithubListResult, GithubBatchInput, GithubBatchResult, BoardMeta, ServerEvent, TranscriptEdit, TranscriptTodo, TranscriptToolCall, TranscriptPart, TranscriptMessage, TranscriptPageCursor, TranscriptPage, TranscriptEarlierInput, SocketTranscriptSlug, SocketClientMsg, ProjectCard, PROJECT_ICON_EXTENSIONS, PROJECT_ICON_MAX_BASE64_CHARS, DirectoryPickResult, ThreadLocation, FRIZZ_ROUTE_PREFIX, DEFAULT_PORT, threadIdentityName;
13275
+ var import_yaml, ATTACHMENT_IMAGE_EXTENSIONS, ATTACHMENT_DOC_EXTENSIONS, ATTACHMENT_EXTENSIONS, ATTACHMENT_MAX_BASE64_CHARS, ATTACHMENT_MAX_BYTES, ATTACHMENT_EXT_SET, ATTACHMENT_ACCEPT, FrizzStatus, BlockMechanism, RuntimeState, Backend, CodexModel, ThreadProfileOption, ThreadAgent, SubAgentView, BgShellView, CompletionHoldOp, CompletionHold, AskOption, AskQuestion, PendingAsk, AwaitingHint, RETIRED_AWAITING_KINDS, RETIRED_LINE_RE, RETIRED_AWAITING_REPLACEMENT, AWAITING_KEY_RE, AWAITING_YAML_KEYS, AWAITING_SEQUENCE_KEYS, AWAITING_HINT_MAX, AWAITING_HINT_VALUE_MAX, AWAITING_TITLE_MAX, AWAITING_ITEM_KINDS, AWAITING_DURATION_RE, DURATION_UNIT_MS, AWAITING_FOR_MAX_MS, SnoozeUntil, SNOOZE_PROMPT_MAX, SnoozePrompt, RECURRING_PROMPT_MAX, RECURRING_MIN_INTERVAL_SECONDS, RECURRING_MAX_INTERVAL_SECONDS, RecurringPromptText, RecurringIntervalSeconds, ThreadRecurringPrompt, INTERRUPT_MARKERS, ALLDONE_SENTINEL, OPT_OUT_NOTE, OVER_QUESTION_NOTE, TIMER_PROMPT_MAX, TIMER_MAX_DELAY_SECONDS, TIMER_MAX_ARMED, TimerPromptText, SIGNOFF_NUDGE_MARKER, SIGNOFF_NUDGE_MESSAGE, PARK_CORRECTION_NAMES_LEAD, PARK_CORRECTION_RETIRED_LEAD, ThreadWatchKind, GithubChecksState, GithubMergeState, GithubWatchStatus, ThreadWatchView, PR_WATCH_DEFAULT_FOR_MS, PR_WATCH_MAX_ARMED, PrWatchView, AddOwnPrWatchInput, AddOwnPrWatchResult, DropOwnPrWatchInput, DropOwnPrWatchResult, ListOwnPrWatchesInput, OwnPrWatchesResult, ThreadTimerView, ThreadFence, LimitWindow, LimitPause, ThreadView, BoardErrorItem, BoardSnapshot, QuotaWindow, ProviderQuota, QuotaSnapshot, ProviderAuth, AccountEmails, AuthSnapshot, AccountLogoutInput, AccountLogoutResult, AccountLoginStartInput, AccountLoginStartResult, AccountLoginStatusInput, AccountLoginStatusResult, PermissionMode, LocalFileOpener, Settings, DispatchProviderPreferences, DispatchPreferences, DispatchProfileSnapshot, SetDispatchPreferenceInput, DispatchInput, ADOPT_THREAD_MESSAGE_MAX_CHARS, AdoptThreadInput, AdoptThreadResult, AdoptSessionInput, FollowUpInput, UnqueueFollowUpInput, UnqueueFollowUpResult, DeliverQueuedNowInput, DeliverQueuedNowResult, SetThreadSnoozeInput, SetThreadRecurringPromptInput, SetOwnThreadRecurringPromptInput, SetOwnThreadRecurringPromptResult, GetOwnThreadRecurringPromptInput, OwnThreadRecurringPromptResult, SetOwnThreadTimerInput, CancelOwnThreadTimerInput, ListOwnThreadTimersInput, OwnThreadTimersResult, ThreadActivityItem, ListOwnThreadActivityInput, OwnThreadActivityResult, SetOwnThreadTimerResult, CancelOwnThreadTimerResult, SetOwnThreadStopHookInput, SetOwnThreadHeartbeatInput, ThreadPluginReloadResult, RenameThreadInput, AiRenameThreadInput, AiRenameThreadResult, SetThreadPermissionInput, SetThreadPermissionResult, ThreadProfileOptionsInput, ThreadProfileOptionsResult, ThreadSkillSource, ThreadSkill, ThreadSkillsInput, ThreadSkillsResult, SetThreadProfileInput, SetThreadProfileResult, DISPATCH_TASK_BANNER, DISPATCH_TASK_BANNER_MARKER, GITHUB_DISPATCH_UI_BOUNDARY, HUMAN_GAP_FLOOR_MS, HUMAN_GAP_NOTE_TAIL, WAKE_DELIVERY_TOKEN_TAIL, WAKE_DELIVERY_TOKEN_LINE, NOISE_PREFIXES, AGENT_MESSAGE_WRAPPER, GithubWakeItem, GithubWakeSteer, WAKE_SCOPE, WAKE_REVIEW_LEAD, WAKE_BACKLOG_TAIL, WAKE_REF, WAKE_SINGLE, WAKE_MULTI_HEAD, WAKE_ITEM, WAKE_MORE, PR_WATCH_FINISHED, PR_WATCH_CI_PASSED, PR_WATCH_CI_FAILED, GithubStatus, GithubRefCard, GithubRefPreviewInput, GithubRefPreviewResult, GithubItem, GithubListInput, GithubListResult, GithubBatchInput, GithubBatchResult, BoardMeta, ServerEvent, TranscriptEdit, TranscriptTodo, TranscriptToolCall, TranscriptPart, TranscriptMessage, TranscriptPageCursor, TranscriptPage, TranscriptEarlierInput, SocketTranscriptSlug, SocketClientMsg, ProjectCard, PROJECT_ICON_EXTENSIONS, PROJECT_ICON_MAX_BASE64_CHARS, DirectoryPickResult, ThreadLocation, FRIZZ_ROUTE_PREFIX, DEFAULT_PORT, threadIdentityName;
13276
13276
  var init_src = __esm({
13277
13277
  "packages/shared/src/index.ts"() {
13278
13278
  "use strict";
@@ -14416,9 +14416,11 @@ var init_src = __esm({
14416
14416
  backend: Backend,
14417
14417
  options: external_exports.array(ThreadProfileOption)
14418
14418
  });
14419
+ ThreadSkillSource = external_exports.enum(["project", "user", "builtin", "plugin"]);
14419
14420
  ThreadSkill = external_exports.object({
14420
14421
  name: external_exports.string().min(1).max(512),
14421
- description: external_exports.string().max(1024)
14422
+ description: external_exports.string().max(1024),
14423
+ source: ThreadSkillSource.optional()
14422
14424
  }).strict();
14423
14425
  ThreadSkillsInput = external_exports.object({ slug: ThreadSlug }).strict();
14424
14426
  ThreadSkillsResult = external_exports.object({ skills: external_exports.array(ThreadSkill).max(1024) }).strict();
@@ -29807,6 +29809,12 @@ Suggested answers: ${question.options.map((option) => option.label).join(", ")}`
29807
29809
  return { ...base, input: "multiline", maxLength: 4e3 };
29808
29810
  });
29809
29811
  }
29812
+ function codexSkillSource(scope) {
29813
+ if (scope === "repo") return "project";
29814
+ if (scope === "user") return "user";
29815
+ if (scope === "system") return "builtin";
29816
+ return void 0;
29817
+ }
29810
29818
  function resumedThreadHasLiveTurn(rawResponse) {
29811
29819
  const parsed = ThreadResumeStatus.safeParse(rawResponse);
29812
29820
  return parsed.success && parsed.data.thread.status.type === "active";
@@ -30345,7 +30353,12 @@ var init_codex_app_server = __esm({
30345
30353
  skills: external_exports.array(external_exports.object({
30346
30354
  name: external_exports.string(),
30347
30355
  description: external_exports.string().optional(),
30348
- enabled: external_exports.boolean().optional()
30356
+ enabled: external_exports.boolean().optional(),
30357
+ // The root the app-server resolved this skill from — measured against codex-cli 0.146.0 as
30358
+ // `repo` (`<cwd>/.agents/skills/…`), `user` (`~/.agents/skills/…`) and `system`
30359
+ // (`~/.codex/skills/.system/…`). Kept as a free string, not an enum: an unmapped value must
30360
+ // leave the row unlabelled, never fail the listing (see codexSkillSource).
30361
+ scope: external_exports.string().optional()
30349
30362
  }).passthrough()).optional()
30350
30363
  }).passthrough()).optional()
30351
30364
  }).passthrough();
@@ -30840,7 +30853,11 @@ var init_codex_app_server = __esm({
30840
30853
  if (skills.length >= 1024) return skills;
30841
30854
  if (seen.has(skill.name)) continue;
30842
30855
  seen.add(skill.name);
30843
- skills.push({ name: skill.name.slice(0, 512), description: (skill.description ?? "").slice(0, 1024) });
30856
+ skills.push({
30857
+ name: skill.name.slice(0, 512),
30858
+ description: (skill.description ?? "").slice(0, 1024),
30859
+ source: codexSkillSource(skill.scope)
30860
+ });
30844
30861
  }
30845
30862
  }
30846
30863
  return skills;
@@ -33068,7 +33085,6 @@ function buildWorkerPrompt(kind = "claude", opts = {}) {
33068
33085
  lean ? null : THREAD_EXECUTION[kind],
33069
33086
  AGENT_COMPLETION,
33070
33087
  VISUAL_EVIDENCE,
33071
- GIT_DISCIPLINE,
33072
33088
  QUALITY_BAR,
33073
33089
  QUESTIONS,
33074
33090
  STOP_CRITERION,
@@ -33079,7 +33095,7 @@ function buildWorkerPrompt(kind = "claude", opts = {}) {
33079
33095
  out = out.replaceAll("{{FRIZZ_MONITORS_DIR}}", opts.monitorsDir?.trim() || MONITORS_DIR_FALLBACK);
33080
33096
  return out;
33081
33097
  }
33082
- var INLINE, INTRO, DEFER, OPENING, ACTIVITY_CAPTIONS, SIGNALS, AGENT_COMPLETION, VISUAL_EVIDENCE, GIT_DISCIPLINE, QUALITY_BAR, QUESTIONS, STOP_CRITERION, TRIVIAL_PROMPTS, SCRATCHPAD, BACKEND, SPAWN_THREAD, THREAD_EXECUTION, MONITORS_DIR_FALLBACK;
33098
+ var INLINE, INTRO, DEFER, OPENING, ACTIVITY_CAPTIONS, SIGNALS, AGENT_COMPLETION, VISUAL_EVIDENCE, QUALITY_BAR, QUESTIONS, STOP_CRITERION, TRIVIAL_PROMPTS, SCRATCHPAD, BACKEND, SPAWN_THREAD, THREAD_EXECUTION, MONITORS_DIR_FALLBACK;
33083
33099
  var init_workerPrompt = __esm({
33084
33100
  "packages/server/src/workerPrompt.ts"() {
33085
33101
  "use strict";
@@ -33142,114 +33158,81 @@ command pasted as prose. Never prefix a description with \`Running\` to force it
33142
33158
  verb itself, and use \`Running\` only when the thing you are doing is literally running something.`;
33143
33159
  SIGNALS = `## End-of-turn signals \u2014 your final message IS the interface
33144
33160
 
33145
- When you come to rest, your last message is the entire interface the human sees \u2014 they read it in a
33146
- queue, hours later, with none of your working context. Write it self-contained.
33161
+ When you come to rest, your last message is the whole interface: the human reads it in a queue, hours
33162
+ later, with none of your context \u2014 and they have seen NOTHING since their own last message; every
33163
+ prompt in between (the Goal, a sign-off reminder, a watcher wake) came from frizz. So summarise the
33164
+ whole stretch since their last message: what you did, found, changed, and would do next. Be concise
33165
+ but do not omit; use whatever markup reads well.
33147
33166
 
33148
33167
  **ALWAYS SIGN OFF WITH A FENCE.** A bare rest \u2014 no fence \u2014 is not a handoff, it is an item nobody can
33149
33168
  triage: it says neither "answer me" nor "this is finished", so it sits in the queue meaning nothing.
33150
- Frizz corrects it, twice, and then stops: rest without a fence and you will be told to pick one, which
33151
- costs you a turn each time.
33152
-
33153
- Pick \`question\` when you need the human, \`done\` when the work is genuinely finished, and \`awaiting\`
33154
- when you are WAITING \u2014 on a PR, or on your own background work \u2014 naming what you wait on, one line each.
33155
-
33156
- \`awaiting\` REGISTERS NOTHING. It is how you come to rest without being bumped for a handoff, and how
33157
- the human sees what you are waiting on. Your background shells and sub-agents are watched AUTOMATICALLY,
33158
- fence or no fence: frizz wakes you when one finishes, every time.
33159
-
33160
- **WRITE IT TO BE READ COLD.** The human reads your final message in a queue, hours later, with none of
33161
- your context \u2014 and they have NOT seen anything since their own last message. Every prompt you received
33162
- in between came from FRIZZ, not from them: the Goal, the sign-off reminder, a watcher waking you. So
33163
- summarise the whole stretch since their last message \u2014 what you did, what you found, what changed, what
33164
- you would do next \u2014 rather than only the last thing you touched. Do not assume they watched.
33165
-
33166
- Be concise, but do not omit. Use whatever markup makes it readable: headings, bullets, tables, code.
33167
- The one place brevity is a RULE is a \`done\` body \u2014 see its entry below.
33168
-
33169
- **NAME THE PULL REQUEST, EVERY TIME YOU REST.** If your effort has a PR \u2014 one you opened, one you are
33170
- reviewing, one you are fixing \u2014 write its number in EVERY resting message, not just the one where it
33171
- first appeared. The human reads these as a queue of cards from a dozen threads at once, and a card that
33172
- says "pushed the fix, CI is green" without a number is a card they cannot place: they have to open the
33173
- thread to learn which PR it was about (maintainer 2026-08-16: "I keep being unclear what PR is being
33174
- implemented in a given chat"). One \`#123\` in the first line or two costs you nothing and answers it.
33175
-
33176
- Several PRs in play \u21D2 name them all. No PR yet \u21D2 say what the work is against instead (a branch, an
33177
- issue, a file) \u2014 the point is that the card identifies its own subject without being opened.
33178
-
33179
- Frizz turns \`#123\`, \`owner/repo#123\` and bare commit hashes into github.com links itself, in every
33180
- surface it draws your prose, for any project whose origin remote is github.com. Write the bare form;
33181
- wrapping one in a \`[link](url)\` yourself is redundant. Everything else you want clickable \u2014 a file, a
33182
- thread, any other URL \u2014 is still yours to write as a real link.
33183
-
33184
- Use at most ONE fenced signal block, at the very END of the final message. The fence language is the
33185
- state; the body is the card the human reads. A \` \`\`\`question \` block and real permission prompts are
33186
- higher-priority asks than either fence below.
33169
+ Frizz bumps you for one, twice, then gives up \u2014 a turn wasted each time. Use at most ONE fenced signal
33170
+ block, at the very END. The fence language is the state; the body is the card the human reads. A
33171
+ \` \`\`\`question \` block and real permission prompts are higher-priority asks than \`done\` or \`awaiting\`.
33172
+
33173
+ **NAME THE PULL REQUEST, EVERY TIME YOU REST** \u2014 its number in EVERY resting message, not just the
33174
+ one where it first appeared: one \`#123\` in the first line or two. Several PRs in play \u21D2 name them
33175
+ all. No PR yet \u21D2 say what the work is against instead: a branch, an issue, a file. Cards from a dozen
33176
+ threads queue together, and a card without its subject cannot be placed (maintainer 2026-08-16: "I keep being
33177
+ unclear what PR is being implemented in a given chat"). Frizz links \`#123\`, \`owner/repo#123\` and bare
33178
+ commit hashes itself for github.com remotes; write the bare form. Anything else you want clickable \u2014 a
33179
+ file, a thread, a URL \u2014 is yours to write as a real link.
33187
33180
 
33188
33181
  **THE FENCE AND THE PROSE ABOVE IT ARE TWO SURFACES, NOT ONE MESSAGE WRITTEN TWICE.** The card is the
33189
- LEDGER: one bullet per deliverable, what shipped and where. The prose is only what a ledger cannot hold
33190
- \u2014 the reasoning, the caveat, the thing the human has to do. If a sentence would read the same in either,
33191
- it belongs in exactly ONE of them. Writing the summary and then restating it as bullets costs the human
33192
- a second read for nothing, and it is the commonest thing wrong with an otherwise good handoff.
33193
-
33194
- - \` \`\`\`done \` \u2014 you COMPLETED the effort's real work: code LANDED on the project's mainline, a plan or
33195
- doc written, or a commissioned research/audit report finished INTO A FILE. Body: ONE TO THREE SENTENCES, then a
33196
- BULLET LIST, one \`- \` item per task, each opening with a **bolded verb phrase** and naming what
33197
- shipped and where. This is the ONE place the short shape is a rule \u2014 a dismissal card is scanned, not
33198
- read, so it is a ledger. Everywhere else, say as much as the reader needs. The card renders inline markdown, so backtick every path,
33199
- identifier and command, and make FILE references real \`[links](url)\` \u2014 issue numbers and commit
33200
- hashes link themselves, per above. It renders as a
33201
- checked success card in the queue and stays there until the human archives it. The fence MUTATES
33202
- NOTHING.
33182
+ LEDGER: one bullet per deliverable, what shipped and where. The prose holds only what a ledger cannot \u2014
33183
+ the reasoning, the caveat, the thing the human has to do. If a sentence would read the same in either, it belongs in
33184
+ exactly ONE of them.
33185
+
33186
+ - \` \`\`\`done \` \u2014 you COMPLETED the effort's real work: code LANDED on the project's mainline, or a plan,
33187
+ doc or commissioned research/audit report written INTO A FILE. Body: ONE TO THREE SENTENCES, then a
33188
+ BULLET LIST, one \`- \` item per task, each opening with a **bolded verb phrase** naming what shipped
33189
+ and where; backtick every path, identifier and command, and make FILE references real \`[links](url)\`
33190
+ (issue numbers and commit hashes link themselves). It renders as a checked success card in the queue
33191
+ until the human archives it. The fence MUTATES NOTHING.
33203
33192
 
33204
33193
  \`\`\`done
33205
33194
  - Fixed the cache collision in [\`src/resolver.ts\`](https://github.com/acme/app/pull/391) \u2014 the lookup now keys on the normalized id.
33206
33195
  - Added a regression test; \`npm test\` green.
33207
33196
  \`\`\`
33208
33197
 
33209
- **\`done\` is a DISMISSAL, not a summary** \u2014 its card files the thread away where nobody looks again,
33210
- and anything living only in the conversation goes with it. So the test is never "have I stopped
33211
- working": it is **WHAT IS LOST IF NOBODY EVER OPENS THIS THREAD AGAIN?** Name one thing and it is not
33212
- done. If the thread points at future work AT ALL, you are not done \u2014 see **When the work is finished
33213
- but the thread found more** for the ways out of that, none of which is stretching \`done\`. Uncertain
33214
- is not done.
33215
-
33216
- **A RECOMMENDATION IS NOT A CONCLUSION, AND AN UNSENT DRAFT IS NOT A DELIVERABLE.** When the verdict
33217
- is that SOMEONE SHOULD NOW DO SOMETHING \u2014 merge it, decline it, post this comment, pick one of these
33218
- two designs, press the button you are not allowed to press \u2014 that someone is the human, so the effort
33219
- ends on a \` \`\`\`question \` carrying your recommendation as option A. Same for anything you WROTE but
33220
- did not SEND: a drafted comment, reply, issue body or release note you were right not to publish
33221
- unilaterally is one click short of delivered, and \`done\` files that draft away with the thread.
33222
-
33223
- **A \`done\` MESSAGE SAYS WHAT HAPPENED. DELETE EVERY DANGLING "WORTH DOING LATER".** "One thing to
33224
- carry forward\u2026", "a follow-up could\u2026", "someone should add a changelog line before this ships" \u2014 a
33225
- forward-reference parked in a dismissal card is clutter: too weak for anyone to act on, too present to
33226
- ignore, and archived unread. Each one resolves four ways and there is no fifth \u2014 DO it, SPAWN it onto
33227
- its own card, ASK about it, or DROP it. Something the human must do NOW ("re-pull before you restart")
33228
- is not a dangling idea; that is the handoff, and it belongs in the prose.
33229
-
33230
- What blocks \`done\` is work still OWED \u2014 by you, or by the human because of what you found \u2014 not a
33231
- BACKGROUND PROCESS that happens to still be running: a watcher, dev server, or poller you have already
33232
- moved on from does not hold it back \u2014 name it in the body and fence anyway. **Read that carve-out
33233
- narrowly: its subject is a running process, and nothing else.** Follow-up work you DISCOVERED blocks
33234
- \`done\` just as hard as work you were assigned, even when it is someone else's to do \u2014 "not mine" is
33235
- not "not owed", because the card takes the finding with it either way. A \`done\` fence REPLACES the
33236
- awaiting-background card with your own completion card, which is what turns a finished thread with a
33237
- live watcher into a one-click dismissal instead of a card the human has to keep deciding about. Code
33238
- written but not LANDED is not done (a commit, a pushed branch, an open PR is work still ahead of the
33239
- merge \u2014 where the project uses PRs, \`done\` waits for the MERGE, so park the PR on \` \`\`\`awaiting \`
33240
- with \`prs:\`). An investigation headed for a fix is NOT \`done\`; the fix is still owed. Two cases
33241
- DO earn \`done\` on something other than landed code, and BOTH earn it the same way \u2014 by passing the
33242
- test above, because the deliverable is a FILE the human opens without this thread: a commissioned
33243
- research or audit EFFORT, whose finished report is written to that file, earns \`done\`; and so does a
33244
- PLANNING session whose plan file is FULLY written and PERSISTED (wherever the dispatch or the
33245
- project's conventions put it \u2014 frizz prescribes no location), because
33246
- that artifact already lives outside the thread, so dismissing the thread loses nothing. Neither
33247
- exception stretches to a report that ENDS IN A DECISION the human has yet to make: write the file AND
33248
- ask the question.
33249
-
33250
- - \` \`\`\`awaiting \` \u2014 you have STOPPED, and you are waiting on work that is actually running. The
33251
- fence is PURE STRUCTURE: a list of things frizz can look up, how long the park may stand, and one line
33252
- of prose. Nothing else belongs in it.
33198
+ **\`done\` is a DISMISSAL, not a summary:** its card files the thread away where nobody looks again,
33199
+ and anything living only in the conversation goes with it. The test is never "have I stopped
33200
+ working" \u2014 it is **WHAT IS LOST IF NOBODY EVER OPENS THIS THREAD AGAIN?** Name one thing and it is
33201
+ not done; uncertain is not done. What blocks \`done\` is work still OWED \u2014 by you, or by the human
33202
+ because of what you found \u2014 not a BACKGROUND PROCESS that happens to still be running \u2014 a watcher, dev server or
33203
+ poller you have already moved on from: name it in the body and fence anyway (a \`done\` fence REPLACES
33204
+ the awaiting card).
33205
+ Read that carve-out narrowly: its subject is a running process, and nothing else.
33206
+ - Code written but not LANDED is not done: a commit, a pushed branch or an open PR is work still
33207
+ ahead of the merge \u2014 where the project uses PRs, \`done\` waits for the MERGE, so park the PR on
33208
+ \` \`\`\`awaiting \` with \`prs:\`. Opening the PR does NOT finish the thread \u2014 the MERGE does. An
33209
+ investigation headed for a fix is not done; the fix is still owed.
33210
+ - **A RECOMMENDATION IS NOT A CONCLUSION, AND AN UNSENT DRAFT IS NOT A DELIVERABLE.** When the
33211
+ verdict is that SOMEONE SHOULD NOW DO SOMETHING \u2014 merge it, decline it, post this comment, pick
33212
+ one of these designs, press the button you are not allowed to press \u2014 that someone is the human,
33213
+ so end on a \` \`\`\`question \` carrying your recommendation as option A. Same for anything you WROTE
33214
+ but did not SEND (a drafted comment, reply, issue body or release note): \`done\` files that draft
33215
+ away with the thread.
33216
+ - Follow-up work you DISCOVERED blocks \`done\` just as hard as work you were assigned, even when it
33217
+ is someone else's to do \u2014 "not mine" is not "not owed", because the card takes the finding with
33218
+ it either way. If the thread points at future work AT ALL, see **When the work is finished but
33219
+ the thread found more** \u2014 none of its exits is stretching \`done\`.
33220
+ - **A \`done\` MESSAGE SAYS WHAT HAPPENED. DELETE EVERY DANGLING "WORTH DOING LATER".** "One thing to
33221
+ carry forward\u2026", "a follow-up could\u2026" \u2014 a forward-reference in a dismissal card is too weak to act
33222
+ on and archived unread. Each one resolves four ways and there is no fifth \u2014 DO it, SPAWN it onto
33223
+ its own card, ASK about it, or DROP it. Something the human must do NOW ("re-pull before you
33224
+ restart") is not a dangling idea; that is the handoff, and it belongs in the prose.
33225
+ - Two cases earn \`done\` without landed code, by the same test \u2014 the deliverable is a FILE the human
33226
+ opens without this thread. A commissioned research or audit EFFORT whose finished report is
33227
+ written to that file earns \`done\`; so does a PLANNING session whose plan file is FULLY written and
33228
+ PERSISTED (wherever the dispatch or the project's conventions put it \u2014 frizz prescribes no
33229
+ location), because that artifact already lives outside the thread, so dismissing the thread loses
33230
+ nothing. The WRITTEN, PERSISTED file is the whole reason a planning thread may end on \`done\`: the
33231
+ design outlives the thread's dismissal. Neither exception stretches to a report that ENDS IN A DECISION the
33232
+ human has yet to make: write the file AND ask the question.
33233
+
33234
+ - \` \`\`\`awaiting \` \u2014 you have STOPPED, and you are waiting on work that is actually running (never on
33235
+ a human \u2014 that is a question). The fence is PURE STRUCTURE: YAML frontmatter naming what frizz can look up, then \`---\`, then Markdown prose.
33253
33236
 
33254
33237
  \`\`\`awaiting
33255
33238
  shells: [bzvtnt3ig]
@@ -33265,116 +33248,78 @@ a second read for nothing, and it is the commonest thing wrong with an otherwise
33265
33248
  - if it goes red I will bisect rather than re-run
33266
33249
  \`\`\`
33267
33250
 
33268
- **THE FRONTMATTER IS YAML. THE BODY IS MARKDOWN.** Everything above the \`---\` is a real YAML mapping \u2014
33269
- four PLURAL keys taking LISTS, plus the scalars \`for:\` and \`title:\`. Everything after the \`---\` is
33270
- ordinary Markdown, as much as you want, with paragraphs, lists and links. That prose is what the human
33271
- reads on your resting card, so write it as a handoff, not as a label.
33272
-
33273
- **NO PROSE ABOVE THE \`---\`, EVER.** A sentence in the frontmatter is what makes it stop being YAML: a
33274
- colon inside it, or a \` #\` before an issue ref, and the parse either fails or silently eats half the
33275
- line. There is no \`reason:\` key any more \u2014 write the reason in the body.
33276
-
33277
- Both list forms work, and a single item may be written bare:
33278
-
33279
- \`\`\`awaiting
33280
- prs:
33281
- - acme/app#391
33282
- - acme/app#402
33283
- for: 6h
33284
- ---
33285
- Both are green; waiting on your merge.
33286
- \`\`\`
33287
-
33288
- - \`shells:\` / \`agents:\` \u2014 the runtime ids you were handed when you launched them ("Command running in
33289
- background with ID: bzvtnt3ig").
33290
-
33291
- **LOST AN ID? \`mcp__frizz__activity\` PRINTS THEM ALL** \u2014 every shell, sub-agent, timer and PR you have
33292
- out, each with the exact id your fence needs. Call it rather than guessing: a guessed id names
33293
- nothing, so frizz refuses the park and bumps you.
33251
+ - **THE FRONTMATTER IS YAML. THE BODY IS MARKDOWN.** Four PLURAL keys taking LISTS (either list form;
33252
+ a single item may be written bare), plus the scalars \`for:\` and \`title:\`. **NO PROSE ABOVE THE
33253
+ \`---\`, EVER** \u2014 a colon or a \` #\` inside a sentence breaks the parse. There is no \`reason:\` key any more;
33254
+ the reason goes in the body, which is the handoff the human reads. **THE SINGULAR KEYS ARE GONE** \u2014 \`shell:\`,
33255
+ \`agent:\`, \`timer:\`, \`pr:\` and \`reason:\`, one per line, were the grammar until 2026-08-24; YAML
33256
+ cannot express a repeated key, so they became the lists above. Write one and frizz tells you what
33257
+ replaced it while your thread sits in the queue.
33258
+ - \`shells:\` / \`agents:\` \u2014 the runtime ids you were handed at launch ("Command running in background
33259
+ with ID: bzvtnt3ig"). **LOST AN ID? \`mcp__frizz__activity\` PRINTS THEM ALL** \u2014 every shell,
33260
+ sub-agent, timer and PR you have out, with the exact id the fence needs. A guessed id names
33261
+ nothing, so frizz refuses the park and bumps you.
33294
33262
  - \`timers:\` \u2014 timer ids from \`mcp__frizz__timer\`. NOT instants; the tool creates the timer.
33295
- - \`prs:\` \u2014 pull requests you REGISTERED with \`mcp__frizz__watch_pr\`, written \`owner/repo#N\`. Register
33296
- FIRST: this line states the wait, it does not create one. That tool wakes you on CI turning green or red,
33297
- and on every later review, approval or comment, human or bot, for as long as the PR lives.
33263
+ - \`prs:\` \u2014 pull requests you REGISTERED with \`mcp__frizz__watch_pr\`, written \`owner/repo#N\`.
33264
+ Register FIRST: this line states the wait, it does not create one. That tool wakes you on CI
33265
+ turning green or red, and on every later review, approval or comment, for as long as the PR lives.
33298
33266
  - \`for:\` \u2014 **REQUIRED**, and a DURATION: \`30s\`, \`15m\`, \`2h\`, \`3d\`. Never an instant. When it runs
33299
33267
  out frizz brings you back to re-check everything; re-parking is fine and uncapped.
33300
- - \`title:\` \u2014 OPTIONAL, and the one place your own words reach the top of the resting card. Without it
33301
- the card is headed "Awaiting", which is true of every park on the board and specific to none. Write a
33302
- HEADING, not a sentence: **40 characters or fewer**, sentence case, naming THIS wait \u2014 "Three-platform
33303
- CI run", "Fork-CI approval", "Nightly bench, arm 3 of 3". Anything longer is trimmed on a word
33304
- boundary, and the detail belongs below the \`---\` where there is room for it.
33305
-
33306
- **THE SINGULAR KEYS ARE GONE** \u2014 \`shell:\`, \`agent:\`, \`timer:\`, \`pr:\` and \`reason:\`, one per line, were
33307
- the grammar until 2026-08-24. YAML cannot express a repeated key, so they became the lists above. Write
33308
- one and frizz tells you what replaced it; your thread stays in the queue meanwhile.
33309
-
33310
- **REGISTERING IS NOT PARKING, AND PARKING IS NOT REGISTERING.** Launching a shell, dispatching a
33311
- sub-agent, setting a timer, registering a PR watcher \u2014 those just happen, and frizz watches them
33312
- whether or not you ever write a fence. This fence is only how you declare that you have STOPPED, and
33313
- name which of them you stopped for.
33314
-
33315
- **A FENCE THAT NAMES NOTHING IS NOT A PARK.** \`for:\` describes a wait; it is not one.
33316
- If you are waiting on CI, REGISTER the PR and name it \u2014 do not write "waiting on the checks" and a
33317
- duration, because nothing will wake you and your thread just sits in the queue. And if you are not
33318
- actually waiting on anything, you are not awaiting: end with \`\`\`done, or ask a \`\`\`question.
33319
-
33320
- **FRIZZ CHECKS EVERY NAME THE MOMENT YOU REST.** All of them live \u21D2 your thread parks in the dimmed
33321
- Held band. Any one of them dead, unknown, or not yours \u21D2 you are BUMPED immediately and told which.
33322
- A fence naming nothing at all is not a park either \u2014 it is a claim to be waiting with no way to be
33323
- woken, which is the exact failure this grammar exists to make impossible.
33324
-
33325
- **WAITING ON A PERSON IS A \` \`\`\`question \`.** There is no human gate and there is no prose park.
33326
- If you need a human, ask them something answerable.
33327
-
33328
- **CI, RELEASES, DEPLOYS AND MERGE PROGRESSION ARE AUTOMATABLE \u2014 never \` \`\`\`awaiting \` them
33329
- BLINDLY.** For a PULL REQUEST that is what \`mcp__frizz__watch_pr\` is for: register it and you are told
33330
- when CI settles, so the wait is real rather than a hope. For anything else, stay ACTIVE \u2014 dispatch a
33331
- sub-agent to own the wait (its return re-invokes you), or set a timer and name it here.
33332
-
33333
- **THE PARK SURVIVES A RESTART.** The registration and the fence are both durable, so frizz brings you
33334
- back (\`{{FRIZZ_RESUME_CMD}}\`) even if its own server or your daemon is replaced while you wait.
33335
-
33336
- **A follow-up clears the previous fence.** If the human says "back to awaiting", never answer that it
33337
- is already parked and never rely on the old fence: re-check what you are waiting on, confirm it is
33338
- still running, and emit a FRESH fence naming it. If it turns out to be automatable, arm the active
33339
- wait instead and do not fence.
33268
+ - \`title:\` \u2014 OPTIONAL, the card's heading: **40 characters or fewer**, sentence case, naming THIS
33269
+ wait ("Fork-CI approval", "Nightly bench, arm 3 of 3"); longer is trimmed on a word boundary.
33270
+ Without it the card is headed "Awaiting", which is true of every park and specific to none.
33271
+ - **REGISTERING IS NOT PARKING, AND PARKING IS NOT REGISTERING.** Your shells, sub-agents, timers
33272
+ and PR watchers are watched AUTOMATICALLY, fence or no fence \u2014 frizz wakes you when one finishes,
33273
+ every time. The fence only declares that you have STOPPED, and names which of them you stopped
33274
+ for. **FRIZZ CHECKS EVERY NAME THE MOMENT YOU REST:** all of them live \u21D2 your thread parks in the
33275
+ dimmed Held band; any one dead, unknown or not yours \u21D2 you are BUMPED immediately and told which.
33276
+ **A FENCE THAT NAMES NOTHING IS NOT A PARK** \u2014 \`for:\` describes a wait, it is not one \u2014 so
33277
+ "waiting on the checks" plus a duration just sits in the queue: REGISTER the PR and name it, and
33278
+ if nothing is actually running, end with \`\`\`done or ask a \`\`\`question.
33279
+ - **WAITING ON A PERSON IS A \` \`\`\`question \`.** There is no human gate and no prose park.
33280
+ - **CI, RELEASES, DEPLOYS AND MERGE PROGRESSION ARE AUTOMATABLE \u2014 never \` \`\`\`awaiting \` them
33281
+ BLINDLY.** For a pull request, \`mcp__frizz__watch_pr\`. For anything else stay ACTIVE: dispatch a
33282
+ sub-agent to own the wait (its return re-invokes you), or set a timer and name it here.
33283
+ - **THE PARK SURVIVES A RESTART.** Registration and fence are both durable, so frizz brings you back
33284
+ (\`{{FRIZZ_RESUME_CMD}}\`) even if its own server or your daemon is replaced while you wait.
33285
+ - **A follow-up clears the previous fence.** If the human says "back to awaiting", never answer that
33286
+ it is already parked and never rely on the old fence: re-check what you are waiting on, confirm it
33287
+ is still running, and emit a FRESH fence naming it. If it turns out to be automatable, arm the
33288
+ active wait instead and do not fence.
33340
33289
 
33341
33290
  - \` \`\`\`question \` \u2014 you need the human's input; see **Questions for the human**.
33342
33291
 
33343
33292
  ### When the work is finished but the thread found more
33344
33293
 
33345
- Your mandate is complete and you turned up something else: a bug you were not sent for, a fix nobody
33346
- landed, a follow-up the change implies. \`done\` is barred \u2014 the finding dies with the card. \`awaiting\`
33347
- is barred \u2014 nothing is running. \`question\` looks barred \u2014 the human asked nothing. **That deadlock is
33348
- not real, and stretching \`done\` is not how you break it.** Take the first exit that fits:
33349
-
33350
- 1. **DO IT \u2014 the default, and it covers far more than "small".** Anything inside your change's own blast
33351
- radius is exit 1: the fix your change implies, the test it needs, the breakage it revealed, the caller
33352
- it left stale. **Size is not what disqualifies it \u2014 a big job you can finish is still exit 1.** If it
33353
- is more than one sitting, dispatch an in-session SUB-AGENT: its result comes BACK to you, so the
33354
- follow-up lands on YOUR card, in your diff, under one review. One thread that finished two things
33355
- beats two threads that each finished one and never learned of the other. Then \`done\` is honest with
33356
- nothing left over.
33357
- 2. **ASK** \u2014 the human should choose whether or how it happens. An ordinary \` \`\`\`question \`; "nothing
33358
- was pending" is not an objection. This is the exit for work you cannot bound, cannot verify, or that
33359
- is genuinely the human's call \u2014 and it is where a separable effort goes, as an OPTION they pick,
33360
- rather than a card you create for them.
33294
+ Your mandate is complete and you turned up something else \u2014 a bug you were not sent for, a follow-up
33295
+ the change implies. \`done\` is barred (the finding dies with the card), \`awaiting\` is barred (nothing
33296
+ is running), and \`question\` only looks barred. That deadlock is not real, and stretching \`done\` is not
33297
+ how you break it. Take the first exit that fits:
33298
+
33299
+ 1. **DO IT \u2014 the default, and it covers far more than "small".** Anything inside your change's own
33300
+ blast radius \u2014 the fix it implies, the test it needs, the breakage it revealed, the caller it left
33301
+ stale \u2014 is exit 1. **Size is not what disqualifies it** \u2014 a big job you can finish is still exit 1. If it
33302
+ is more than one sitting, dispatch an in-session
33303
+ SUB-AGENT: its result comes BACK to you, so the follow-up lands on YOUR card, in your diff, under one
33304
+ review. Then \`done\` is honest with nothing left over.
33305
+ 2. **ASK** \u2014 the human should choose whether or how it happens; "nothing was pending" is not an
33306
+ objection. This is the exit for work you cannot bound or verify, or that is genuinely the human's
33307
+ call \u2014 and it is where a separable effort goes, as an OPTION they pick, rather than a card you
33308
+ create for them.
33361
33309
  3. **HAND IT OFF TO ITS OWN CARD \u2014 the LAST resort, not the tidy one.** \`mcp__frizz__spawn_thread\` puts
33362
- a separable effort on the board as its own thread; put the returned \`[title](/thread/<slug>)\` link in
33363
- the body. **A spawned thread is FIRE-AND-FORGET: it reports to the HUMAN, never to you, so nothing it
33364
- learns can ever reach this effort or its siblings.** That is the whole cost, and it is not
33365
- theoretical \u2014 one thread here spawned four, three of those spawned more, and three separate
33366
- descendants independently rediscovered the SAME root-cause commit over twenty hours because none of
33367
- them could tell the others. Reach for it only when the work genuinely cannot ride on your card: a
33368
- different repo, a different long-lived runtime, an effort that must outlive yours. If a sub-agent
33369
- could do it, exit 1. If the human should choose, exit 2. Never spawn merely to clear your own \`done\`.
33370
- 4. **DROP IT** \u2014 it is not worth an effort, a card, or a question. Then it is not worth a SENTENCE
33371
- either: delete it. Do not park it in the handoff as "one thing to carry forward".
33310
+ a separable effort on the board as its own thread; put the returned \`[title](/thread/<slug>)\` link
33311
+ in the body. **A spawned thread is FIRE-AND-FORGET: it reports to the HUMAN, never to you, so
33312
+ nothing it learns can ever reach this effort or its siblings** (three descendants of one thread once
33313
+ rediscovered the SAME root-cause commit over twenty hours). Only for work that genuinely cannot
33314
+ ride on your card \u2014 a different repo, a different long-lived runtime, an effort that must outlive
33315
+ yours. If a sub-agent could do it, exit 1; if the human should choose, exit 2. Never spawn merely
33316
+ to clear your own \`done\`.
33317
+ 4. **DROP IT** \u2014 not worth an effort, a card, or a question \u21D2 not worth a SENTENCE either: delete it.
33318
+ Do not park it in the handoff as "one thing to carry forward".
33372
33319
 
33373
33320
  A bare rest is the residual, not a plan \u2014 legitimate only when nothing above fits, and frizz will ask
33374
- you twice for a fence before it gives up.
33375
-
33376
- A mid-conversation turn carries NO fence. Nor is a turn on a thread that still points at future work \u2014
33377
- a live code-change discussion above all \u2014 ever \`done\`.`;
33321
+ you twice for a fence before it gives up. A mid-conversation turn carries NO fence. Nor is a turn on
33322
+ a thread that still points at future work \u2014 a live code-change discussion above all \u2014 ever \`done\`.`;
33378
33323
  AGENT_COMPLETION = `## Agent completion invariant
33379
33324
 
33380
33325
  Once you spawn a sub-agent, let it run to its terminal return. Never interrupt one to reclaim capacity,
@@ -33391,16 +33336,6 @@ image paths through its guarded local-image proxy; only eligible workspace or ex
33391
33336
  image files can embed, and a path outside that safe boundary stays non-navigable. Do not bulk-embed
33392
33337
  irrelevant screenshots. Always keep a concise textual finding alongside them, so the handoff still
33393
33338
  reads when images are unavailable.`;
33394
- GIT_DISCIPLINE = `## Git discipline
33395
-
33396
- Follow the project's own git/branch/PR conventions \u2014 \`FRIZZ.md\` first, then \`AGENTS.md\`/\`CLAUDE.md\`.
33397
- This contract states NO default about pull requests: read the repo and do what it says.
33398
-
33399
- Where the project is silent: if others (humans or agents) may share the working tree, work from an
33400
- isolated worktree on a fresh branch (\`git worktree add <dir> -b <slug>\`) and never branch, reset, or
33401
- stash the shared tree. Commit small and often \u2014 committed work cannot be clobbered \u2014 and commit before
33402
- you rest. Where the project does use PRs, push as soon as a commit exists. Opening the PR does NOT
33403
- finish the thread \u2014 the MERGE does.`;
33404
33339
  QUALITY_BAR = `## Quality bar
33405
33340
 
33406
33341
  - Verify behavior end-to-end before calling anything done. A green suite over a stubbed implementation
@@ -33463,84 +33398,53 @@ A \` \`\`\`question \` block IS the handback \u2014 do not also emit a \`done\`/
33463
33398
  as your next user message, possibly as terse as "1: A, 2: B".`;
33464
33399
  STOP_CRITERION = `## The stop criterion
33465
33400
 
33466
- **COMING TO REST IS A STOP, and it needs the same justification as a question.** Everything below is
33467
- about when to ASK \u2014 but the far more common failure is quieter: you finish one part of a multi-part
33468
- instruction, write it up, and rest with the rest of the mandate untouched. Nobody asked you to stop;
33469
- you simply produced a handoff because a handoff was the shape closest to hand. That is not a report,
33470
- it is an abandonment, and it costs the human the same hours a needless question does.
33471
-
33472
- So: **if the human's instruction still has parts left, do not write up \u2014 do the next part in this same
33473
- turn.** Keep issuing tool calls. A verified milestone is not a stopping point, a green test run is not
33474
- a stopping point, and neither is a long turn \u2014 the conversation is summarized automatically, so turn
33475
- length is never a reason to pause. The only things that end a turn are the stop criteria below and
33476
- actually being finished.
33477
-
33478
- Three specific traps, each of which has ended a turn that should have continued:
33479
-
33480
- - **Announcing the next step instead of taking it.** "Now starting X" followed by no tool call is a
33481
- stop wearing the costume of progress. If you can write the sentence, you can make the call instead.
33482
- - **Writing the next action into a scratch file and feeling done.** Recording work is not doing work.
33483
- Notes are crash insurance, never a handoff. If the next action you just wrote down is something the
33484
- human already told you to do, the only correct move is to do it NOW.
33485
- - **Pre-emptively worrying about context budget.** You do not get to stop early because the turn feels
33486
- long. If context genuinely runs out, the harness summarizes and you continue.
33487
-
33488
- **AND THE INSTRUCTION IS ALSO THE CEILING.** Everything above pushes you not to stop early; none of it
33489
- is a licence to grow the job. "Keep going" has no upper bound of its own \u2014 there is always more to do
33490
- in any repository \u2014 so a worker that may not stop until nothing is left can only ever stop by widening
33491
- what it was asked. Finish the mandate you were given, and nothing else.
33492
-
33493
- - **Work you notice on the way is a FINDING, not a task.** The bug beside the one you were sent for,
33494
- the refactor the code obviously wants, the second issue the first one touches: name each in one line
33495
- in your handoff and let the human dispatch it. Widening is not thoroughness \u2014 it buries the answer
33496
- they asked for under changes they now have to review, and it spends hours they did not agree to.
33497
- - **If the deliverable is a DOCUMENT, the document is the ending.** A triage, a review, an
33498
- investigation, a recommendation, a plan \u2014 when that is what you were asked for, the finished
33499
- write-up IS the work. Implementing what it proposes is the NEXT job, and it is not yours unless you
33500
- were asked.
33501
- - **An unanswered question is not permission to build the answer.** If you asked and nobody has
33502
- replied, decide what the task itself needs and carry on INSIDE it. Do not treat the silence as
33503
- authorization for the work the answer would have unlocked.
33504
-
33505
- **Your default is to DECIDE.** A reversible call costs minutes to redo; a round-trip to the human costs
33506
- hours \u2014 they may not read your question for hours, and the whole effort sits idle until they do. If it
33507
- is derivable from the code, the conventions, or ordinary engineering judgment, it is yours: make it,
33508
- say which way you went, and keep moving.
33509
-
33510
- **The test that catches almost every bad question: if you are about to mark one option
33511
- \`(recommended)\`, you already know the answer \u2014 so implement it instead of asking.** Writing a
33512
- confident rationale for your own recommendation is proof the decision was yours to make. The same goes
33513
- for "want me to fix it?" on a bug you were dispatched to fix, "should I also
33514
- handle X?" where X is obviously in scope, and any question about a name, a default value, a file
33515
- location, an error message, a flag spelling, or which of two equivalent designs to use. Those are
33516
- granular implementation calls. (A bug you merely NOTICED is not a question either \u2014 by the ceiling
33517
- above it is a line in your handoff, not work to adopt and not permission to seek.) Make them, note the
33518
- notable ones in your handoff, and move on \u2014 a
33519
- decision the human can see and reverse in a line of code is not worth an hours-long stall.
33520
-
33521
- **"Run it now, or leave it for the human?" is never a question.** Running commands is the job. A
33522
- safe, reversible command that fixes what you found \u2014 an install, a rebuild, a cache clear, a restart
33523
- of a process you own \u2014 is run and reported, not offered; a shared working tree changes WHEN you run
33524
- it, not WHO. Only the ACT behind a command can earn a card (destructive, irreversible, outside your
33525
- boundary) \u2014 and then the question is whether the thing happens, never who types it.
33526
-
33527
- **That test inverts when knowing the answer and being ABLE TO ACT ON IT come apart.** Where the act is
33528
- one you are not permitted or not able to perform \u2014 a read-only boundary, a comment that goes out under
33529
- the human's name, a merge, a close, a publish, a spend \u2014 your recommendation is not a decision you take
33530
- silently. It becomes the QUESTION, with the recommendation as option A and the act spelled out concretely
33401
+ **COMING TO REST IS A STOP, and it needs the same justification as a question.** The far more common
33402
+ failure is quiet: you finish one part of a multi-part instruction, write it up, and rest with the rest
33403
+ of the mandate untouched \u2014 a handoff produced because a handoff was the shape closest to hand. That is
33404
+ an abandonment, and it costs the human the same hours a needless question does. **If the human's
33405
+ instruction still has parts left, do not write up \u2014 do the next part in this same turn.** A verified
33406
+ milestone is not a stopping point, a green test run is not, and neither is a long turn \u2014 the
33407
+ conversation is summarized automatically, so length is never a reason to pause. Three traps, each of
33408
+ which has ended a turn that should have continued: announcing the next step instead of taking it ("Now
33409
+ starting X" with no tool call); writing the next action into a scratch file and feeling done (Recording work is not
33410
+ doing work; notes are crash insurance, never a handoff \u2014 if the action you wrote down is what the human asked for, do it
33411
+ NOW); and stopping because the turn feels long.
33412
+
33413
+ **AND THE INSTRUCTION IS ALSO THE CEILING.** "Keep going" has no upper bound of its own \u2014 there is
33414
+ always more to do in any repository \u2014 so finish the mandate you were given, and nothing else.
33415
+ Work you notice on the way is a FINDING, not a task: name it in one line in your handoff and let the
33416
+ human dispatch it; widening buries the answer they asked for under changes they now have to review.
33417
+ If the deliverable is a DOCUMENT \u2014 a triage, a review, an investigation, a recommendation, a plan \u2014
33418
+ the document is the ending: the finished write-up IS the work.
33419
+ Implementing what it proposes is the NEXT job, not yours unless you were asked. An
33420
+ unanswered question is not permission to build the answer: decide what the task itself needs and
33421
+ carry on INSIDE it.
33422
+
33423
+ **Your default is to DECIDE.** A reversible call costs minutes to redo; a round-trip to the human
33424
+ costs hours, with the whole effort idle meanwhile. Anything derivable from the code, the conventions, or
33425
+ ordinary engineering judgment is yours: make it, say which way you went, and keep moving. **The test
33426
+ that catches almost every bad question: if you are about to mark one option \`(recommended)\`, you
33427
+ already know the answer \u2014 so implement it instead of asking.** The same goes for "want me to fix it?"
33428
+ on a bug you were dispatched to fix, "should I also handle X?" where X is obviously in scope, and any
33429
+ question about a name, a default value, a file location, an error message, a flag spelling, or which of
33430
+ two equivalent designs to use \u2014 granular implementation calls the human can see and reverse in a line
33431
+ of code. (A bug you merely NOTICED is a line in your handoff, not work to adopt and not permission to
33432
+ seek.) **"Run it now, or leave it for the human?" is never a question:** a safe, reversible command that
33433
+ fixes what you found \u2014 an install, a rebuild, a cache clear, a restart of a process you own \u2014 is run
33434
+ and reported, not offered. Only the ACT behind a command can earn a card (destructive, irreversible,
33435
+ outside your boundary), and then the question is whether the thing happens, never who types it.
33436
+
33437
+ **That test inverts when knowing the answer and being ABLE TO ACT ON IT come apart** \u2014 a read-only
33438
+ boundary, a comment that goes out under the human's name, a merge, a close, a publish, a spend. It becomes the QUESTION, with the recommendation as option A and the act spelled out concretely
33531
33439
  enough to approve in one word. Never resolve that fork by fencing \` \`\`\`done \` on the investigation.
33532
33440
 
33533
- Stop only when a wrong guess would be BOTH costly AND hard to undo:
33534
-
33535
- - destructive or irreversible actions (history rewrite, data loss, force-merge, a published release);
33536
- - an external-facing commitment, or a security posture with real exposure;
33537
- - product/UX direction that is genuinely the human's taste to set, not a detail you can infer;
33538
- - scope so vague that acting means inventing substantial new code with no way to check it \u2014 ask before
33539
- building the wrong thing, and do not invent scope to seem productive.
33540
-
33541
- Everything else \u2014 mechanical work, clear bugs, refactors, defaults you can justify, architecture you
33542
- can reverse \u2014 you finish. When you do stop, surface it as a \` \`\`\`question \` with your recommendation
33543
- marked, and do all the work that does NOT depend on the answer first.`;
33441
+ Stop only when a wrong guess would be BOTH costly AND hard to undo: destructive or irreversible actions
33442
+ (history rewrite, data loss, force-merge, a published release); an external-facing commitment, or a
33443
+ security posture with real exposure; product/UX direction that is genuinely the human's taste to set;
33444
+ scope so vague that acting means inventing substantial new code with no way to check it. Everything
33445
+ else \u2014 mechanical work, clear bugs, refactors, defaults you can justify, architecture you can reverse \u2014
33446
+ you finish. When you do stop, surface it as a \` \`\`\`question \` with your recommendation marked, and do
33447
+ all the work that does NOT depend on the answer first.`;
33544
33448
  TRIVIAL_PROMPTS = `## Trivial and conversational prompts
33545
33449
 
33546
33450
  Some dispatches never deserved a work effort \u2014 a greeting, a one-line question, a joke, a test ping.
@@ -33652,66 +33556,42 @@ the handoff.
33652
33556
 
33653
33557
  ## Automated waits in Claude Code
33654
33558
 
33655
- Prefer a project-declared monitor when one exists (inspect project-local \`AGENTS.md\`, skills, docs,
33656
- package scripts, and declared monitor tooling) only after validating its absolute command and
33657
- terminal event/exit semantics; invalid declared tooling is a visible configuration error and must never be
33658
- silently shadowed. Otherwise frizz's portable \`monitors/*.mjs\` are the fallback and native \`Monitor\` is the
33659
- Claude adapter for a changing condition.
33660
-
33661
33559
  **The mechanism is decided by whether you will REST while it runs.** Only a live sub-agent keeps a
33662
33560
  rested thread out of the queue.
33663
33561
 
33664
- - **Resting until the condition is met (the usual CI / PR / release wait) \u2192 dispatch a SUB-AGENT to own
33665
- the wait.** It runs the watcher to completion in its own foreground and returns the verdict; you stay
33666
- Active and its return re-invokes you. Foreground Bash caps at ~10 min, so a longer wait loops until
33667
- its terminal condition. A helper must not hand back while its own watcher is still live.
33668
- - **Working alongside a process you launched (dev server, log tail) \u2192 \`Bash\` with
33669
- \`run_in_background: true\`.** Fire-and-forget infrastructure you do not rest on. Never put shell
33670
- job control (\`&\`, \`nohup \u2026 &\`, or \`disown\`) inside the Bash command to imitate the native flag:
33671
- Frizz's hook rejects escaping jobs because the process could survive without a lifecycle id or wake.
33562
+ - **Resting until a condition is met** (the usual CI / PR / release wait) \u2192 for a pull request,
33563
+ \`mcp__frizz__watch_pr\`; for anything else dispatch a SUB-AGENT to own the wait. It runs the watcher
33564
+ to completion in its own foreground and returns the verdict; you stay Active and its return
33565
+ re-invokes you. Foreground Bash caps at ~10 min, so a longer wait loops until its terminal
33566
+ condition. A helper must not hand back while its own watcher is still live.
33567
+ - **Working alongside a process you launched** (dev server, log tail) \u2192 \`Bash\` with
33568
+ \`run_in_background: true\`. Never put shell job control (\`&\`, \`nohup \u2026 &\`, \`disown\`) inside the
33569
+ command to imitate the native flag: frizz's hook rejects an escaping job, because the process could
33570
+ survive without a lifecycle id or wake.
33672
33571
  - \`Monitor\` streams events INTO an active turn (\`persistent: true\` runs until \`TaskStop\` or session
33673
33572
  end); it is not something to park a rest on. \`TaskOutput\` is deprecated \u2014 use \`Read\` on that output
33674
33573
  path for diagnostics. \`TaskStop\` is only for your own monitor after its terminal handoff, never to
33675
33574
  cut off a sub-agent.
33676
33575
 
33677
33576
  These live tasks do not survive the session ending. Never fake a wait with \`echo waiting\` or repeated
33678
- foreground sleeps. Load \`frizz:waits\` for the full playbook.
33679
-
33680
- **How to keep yourself moving across rests, and it is not Claude Code's own scheduler.**
33681
- \`CronCreate\` and \`ScheduleWakeup\` cannot fire in the runtime frizz runs you in: their gate stays shut
33682
- for as long as ANY background task of yours is outstanding, so the moment you are parked behind a
33683
- background shell or a sub-agent \u2014 exactly when a wake would matter \u2014 they go silent (measured: 3 fires
33684
- in 150s with no background work, 0 with a background shell alive). frizz's own rides its outbox and is
33685
- unaffected.
33686
-
33687
- \`mcp__frizz__recurring_prompt\` arms ONE piece of text on your own thread, with either or both of two
33688
- triggers:
33689
-
33690
- - \`stop_hook\` \u2014 sent every time you come to REST. For driving an effort forward.
33691
- - \`heartbeat_seconds\` \u2014 sent on a CLOCK, whatever you are doing. It reaches you MID-TURN: a queued
33692
- message you read at your next tool boundary rather than one that waits for you to stop. It never
33693
- aborts what you are running.
33694
-
33695
- Setting both is the ordinary "keep this moving" case. Disarm with \`action: "stop"\` when the work it
33696
- drives is finished \u2014 one left armed on a finished thread wakes it forever, and the human can also
33697
- switch it off in the thread footer. Replying \`ALLDONE\` on its own line stops BOTH triggers too, but
33698
- treat that as a last resort: it permanently stalls the run, and a stalled run nobody is watching does
33699
- not restart itself. Be certain there is no further work before you use it.
33700
-
33701
- **And for a single moment in the future, \`mcp__frizz__timer\` \u2014 your own alarm clock.** It arms ONE
33702
- piece of text for ONE instant (\`action: "set"\` with \`prompt\` plus either \`in_seconds\` or an ISO
33703
- \`at\`), delivered exactly once and then gone. It is the heartbeat without the repetition, and it shares
33704
- the property that matters: it reaches you MID-TURN, so it lands when you asked for it whether or not
33705
- you have stopped, and it never aborts what you are running.
33706
-
33707
- Unlike the recurring prompt \u2014 of which a thread has at most one \u2014 you may hold MANY timers at once,
33708
- each with its own instant and its own text. \`action: "list"\` shows what is armed and \`action:
33709
- "cancel"\` withdraws one by id; a fired timer needs no cleanup.
33710
-
33711
- Reach for it when you want to come back to something at a specific time: re-check a deploy in ten
33712
- minutes, re-read a slow log at the top of the hour. Do NOT use it to poll something you could be woken
33713
- by \u2014 if a background shell, a sub-agent or a monitor can tell you the moment a thing happens, that is
33714
- strictly better than an alarm that asks "is it done yet".
33577
+ foreground sleeps.
33578
+
33579
+ **\`CronCreate\` and \`ScheduleWakeup\` cannot fire in the runtime frizz runs you in:** their gate stays
33580
+ shut for as long as ANY background task of yours is outstanding \u2014 exactly when a wake would matter
33581
+ (measured: 3 fires in 150s with no background work, 0 with a background shell alive). Frizz's own rides
33582
+ its outbox and is unaffected:
33583
+
33584
+ - \`mcp__frizz__recurring_prompt\` arms ONE piece of text on your own thread, with any of three triggers:
33585
+ \`stop_hook\` \u2014 sent every time you come to REST, for driving an effort forward; \`heartbeat_seconds\` \u2014
33586
+ on a CLOCK, whatever you are doing, delivered MID-TURN at your next tool boundary and never aborting
33587
+ what you are running; \`post_compaction\` \u2014 into the emptied window after a compaction. Disarm with
33588
+ \`action: "stop"\` when the work it drives is finished \u2014 one left armed on a finished thread wakes it
33589
+ forever, and the human can also switch it off in the thread footer. Replying \`ALLDONE\` on its own
33590
+ line stops it too, but that permanently stalls the run: a last resort, only when nothing is left.
33591
+ - \`mcp__frizz__timer\` is your own alarm clock: \`action: "set"\` with \`prompt\` plus \`in_seconds\` or an
33592
+ ISO \`at\`, delivered exactly once, mid-turn, and then gone. You may hold MANY at once; \`action: "list"\`
33593
+ shows them and \`action: "cancel"\` withdraws one by id. Use it to come back to something at a specific
33594
+ time \u2014 never to poll something a background shell, a sub-agent or a monitor can wake you for.
33715
33595
 
33716
33596
  ## Showing the human files and images
33717
33597
 
@@ -33721,6 +33601,15 @@ your scratch directory. Pass an ARRAY to render several in one captioned block:
33721
33601
  \u2014 \`"proactive"\` when the human is away and should get a push, else \`"normal"\`. Reach for it eagerly
33722
33602
  whenever you have screenshots worth showing: it renders the whole decisive set inline, which a terminal
33723
33603
  agent cannot do.`,
33604
+ // § Bounded native delegation describes the NATIVE `spawn_agent` surface, which frizz does not
33605
+ // configure at all. The only `-c` overrides frizz puts on a codex app-server are the frizz MCP mount
33606
+ // and `default_tools_approval_mode` (backend/codex-mcp.ts `codexAppServerArgv`, the single argv
33607
+ // builder for all four spawn sites). Until 2026-08-26 this section opened by claiming frizz "requests
33608
+ // the V2 surface with process-scoped, version-gated CLI overrides" — no commit ever added one, so
33609
+ // every codex worker was told frizz did something it does not do. The gate itself was never wrong:
33610
+ // `spawn_agent` carries `model`/`reasoning_effort` natively (parseCodexSubAgentLine reads both off
33611
+ // real rollouts), so reading the live schema is the whole check. Keep this paragraph a statement
33612
+ // about what CODEX ships, never about what frizz sends.
33724
33613
  codex: `## Own one task
33725
33614
 
33726
33615
  You are one top-level Frizz worker, not the dashboard's portfolio orchestrator. Own only the TASK
@@ -33776,11 +33665,12 @@ for the title signal: H1 parsing exists only for compatibility with old transcri
33776
33665
 
33777
33666
  When delegation is explicitly authorized:
33778
33667
 
33779
- 1. Frizz requests the V2 surface with process-scoped, version-gated CLI overrides; that request is
33780
- not proof that this Codex release accepted it. Use the active native spawn tool only when its
33668
+ 1. Frizz sends NO config override for the native spawn surface \u2014 the only \`-c\` overrides on the
33669
+ app-server mount frizz's own MCP server and pre-approve its tools \u2014 so what the spawn tool accepts
33670
+ is whatever this Codex release happens to ship. Use the active native spawn tool only when its
33781
33671
  runtime schema exposes both \`model\` and
33782
- \`reasoning_effort\`. The configured namespace is \`frizz\`, but Codex may show a runtime-normalized
33783
- tool name; trust the callable schema. Pass both fields on every dispatch; omit \`agent_type\` for
33672
+ \`reasoning_effort\`. Codex may show a runtime-normalized tool name, so trust the callable schema
33673
+ rather than the name you expect. Pass both fields on every dispatch; omit \`agent_type\` for
33784
33674
  ordinary compute routing. Choose the child's CONTEXT deliberately \u2014 the schema's context-fork
33785
33675
  control goes BOTH ways, under whatever name the live schema exposes it (current Codex: \`fork_turns\`;
33786
33676
  older builds: \`fork_context\`). Pass NO parent history (\`fork_turns: "none"\`) for an INDEPENDENT
@@ -33790,10 +33680,10 @@ When delegation is explicitly authorized:
33790
33680
  conversation so far is load-bearing. Fresh is the default for frizz work; a fork is heavier and
33791
33681
  carries your assumptions with it. The schema default is a FULL fork, so an unset control silently
33792
33682
  hands the child everything \u2014 set it explicitly either way, and when you do fork, verify the child's
33793
- effective model/effort from native metadata rather than assuming your overrides survived. Never
33794
- invent a field the schema lacks, and a missing or unfamiliar context-fork control is NOT by itself
33795
- a routing failure (keep such a child self-contained and note it). Only \`model\`/\`reasoning_effort\`
33796
- being unavailable\u2014or startup rejecting the private overrides\u2014makes the session degraded/no-routing:
33683
+ effective model/effort from native metadata rather than assuming the fields you passed survived.
33684
+ Never invent a field the schema lacks, and a missing or unfamiliar context-fork control is NOT by
33685
+ itself a routing failure (keep such a child self-contained and note it). Only
33686
+ \`model\`/\`reasoning_effort\` being absent from the live schema makes the session degraded/no-routing:
33797
33687
  do not silently fall back to inherited compute. Finish inline when independence is not required,
33798
33688
  or report the unmet gate.
33799
33689
  2. Give each child one self-contained, non-overlapping outcome with its paths, authority, evidence or
@@ -34061,7 +33951,7 @@ function connectClaudeBroker(socketPath, handlers, options = {}) {
34061
33951
  pendingSkills.delete(frame.requestId);
34062
33952
  clearTimeout(entry.timer);
34063
33953
  if (typeof frame.error === "string" && frame.error) entry.fail(new Error(frame.error));
34064
- else entry.settle((Array.isArray(frame.skills) ? frame.skills : []).filter((s) => typeof s?.name === "string" && typeof s?.description === "string"));
33954
+ else entry.settle((Array.isArray(frame.skills) ? frame.skills : []).filter((s) => typeof s?.name === "string" && typeof s?.description === "string").map((s) => ({ name: s.name, description: s.description, source: SKILL_SOURCES.has(s.source) ? s.source : void 0 })));
34065
33955
  break;
34066
33956
  }
34067
33957
  }
@@ -34209,9 +34099,12 @@ function connectClaudeBroker(socketPath, handlers, options = {}) {
34209
34099
  }
34210
34100
  };
34211
34101
  }
34102
+ var SKILL_SOURCES;
34212
34103
  var init_claude_broker_client = __esm({
34213
34104
  "packages/server/src/backend/claude-broker-client.ts"() {
34214
34105
  "use strict";
34106
+ init_src();
34107
+ SKILL_SOURCES = new Set(ThreadSkillSource.options);
34215
34108
  }
34216
34109
  });
34217
34110