frizz 0.2.0 → 0.3.0

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 (115) hide show
  1. package/README.md +17 -17
  2. package/dist/claude-agent-broker.js +63 -23
  3. package/dist/dev-child.js +6877 -4459
  4. package/dist/frizz.js +654 -529
  5. package/package.json +6 -2
  6. package/runtime/cc-worker/.claude-plugin/plugin.json +1 -1
  7. package/runtime/cc-worker/DECISIONS.md +64 -4
  8. package/runtime/cc-worker/bin/frizz-mcp.mjs +494 -57
  9. package/runtime/cc-worker/hooks/agent-dispatch.mjs +1 -1
  10. package/runtime/cc-worker/hooks/deny-plan.mjs +1 -1
  11. package/runtime/cc-worker/hooks/hooks.json +0 -7
  12. package/runtime/cc-worker/hooks/precompact-instructions.mjs +39 -28
  13. package/runtime/cc-worker/hooks/scratchpad.mjs +142 -169
  14. package/runtime/cc-worker/hooks/session-seed.mjs +16 -15
  15. package/runtime/cc-worker/skills/waits/SKILL.md +2 -2
  16. package/web-dist/apple-touch-icon.png +0 -0
  17. package/web-dist/assets/{TerminalPane-ROKHp1ib.js → TerminalPane-CTdetDJJ.js} +2 -2
  18. package/web-dist/assets/{abnfDiagram-VRR7QNED-DcpdhBs3.js → abnfDiagram-VRR7QNED-BDKrjCMs.js} +1 -1
  19. package/web-dist/assets/architecture-TIHT7OUA-ChUMo004.js +1 -0
  20. package/web-dist/assets/{architectureDiagram-ZJ3FMSHR-CUAKf0mn.js → architectureDiagram-ZJ3FMSHR-BJebpUUM.js} +1 -1
  21. package/web-dist/assets/{blockDiagram-677ZJIJ3-BPwpJIzx.js → blockDiagram-677ZJIJ3-BNbuk25k.js} +1 -1
  22. package/web-dist/assets/{c4Diagram-LMCZKHZV-1lptuHzZ.js → c4Diagram-LMCZKHZV-lCfyotdU.js} +1 -1
  23. package/web-dist/assets/channel-pr7r6raB.js +1 -0
  24. package/web-dist/assets/{chunk-32BRIVSS-CFR9AKjY.js → chunk-32BRIVSS-DP72SEkr.js} +1 -1
  25. package/web-dist/assets/{chunk-52WLFC77-CM9uct7m.js → chunk-52WLFC77-DxO3gN-p.js} +1 -1
  26. package/web-dist/assets/{chunk-C7G6YPKG-DiveJARw.js → chunk-C7G6YPKG-BXFx9Vlr.js} +1 -1
  27. package/web-dist/assets/{chunk-EX3LRPZG-BE1CBw8F.js → chunk-EX3LRPZG-CR3sHpPf.js} +1 -1
  28. package/web-dist/assets/{chunk-FWX5IMBZ-DL42uXiO.js → chunk-FWX5IMBZ-CJ8L__oG.js} +2 -2
  29. package/web-dist/assets/{chunk-HOUHSVGY-DPhJWgDw.js → chunk-HOUHSVGY-BCl3JSWr.js} +1 -1
  30. package/web-dist/assets/{chunk-ICXQ74PX-CwYy-6AP.js → chunk-ICXQ74PX-CZxFMci1.js} +1 -1
  31. package/web-dist/assets/{chunk-MOJQB5TN-Ds5I9wxq.js → chunk-MOJQB5TN-Ck3_47dB.js} +1 -1
  32. package/web-dist/assets/{chunk-OGEWGWER-DHiZJwQD.js → chunk-OGEWGWER-CVXjES-F.js} +1 -1
  33. package/web-dist/assets/{chunk-PUDLZKDR-B-eyQTsF.js → chunk-PUDLZKDR-JjrVgaR7.js} +1 -1
  34. package/web-dist/assets/{chunk-Q4XR5HBZ-DK7dB3Ti.js → chunk-Q4XR5HBZ-C5YMRAQ0.js} +1 -1
  35. package/web-dist/assets/{chunk-V7JOEXUC-Dn59m74L.js → chunk-V7JOEXUC-DK0mfUHU.js} +1 -1
  36. package/web-dist/assets/{chunk-VAUOI2AC-DK7x36hd.js → chunk-VAUOI2AC-BKBntpid.js} +1 -1
  37. package/web-dist/assets/{chunk-VR4S4FIN-D7-CI3Yl.js → chunk-VR4S4FIN-zgE1dG6U.js} +1 -1
  38. package/web-dist/assets/{chunk-WYO6CB5R-B3l-mLCs.js → chunk-WYO6CB5R-CZhh1IBq.js} +1 -1
  39. package/web-dist/assets/{chunk-ZGVPDNZ5-Dobxlxie.js → chunk-ZGVPDNZ5-CrNjIEem.js} +1 -1
  40. package/web-dist/assets/classDiagram-OUVF2IWQ-CvGbPMn_.js +1 -0
  41. package/web-dist/assets/classDiagram-v2-EOCWNBFH-CvGbPMn_.js +1 -0
  42. package/web-dist/assets/{cynefin-VYW2F7L2-Dh7RuEUJ.js → cynefin-VYW2F7L2-Ca_BPfTG.js} +1 -1
  43. package/web-dist/assets/{cynefinDiagram-TSTJHNR4-ClPi2mZZ.js → cynefinDiagram-TSTJHNR4-CsINQf6g.js} +1 -1
  44. package/web-dist/assets/{dagre-VKFMJZFB-52_WP1QV.js → dagre-VKFMJZFB-CE0DYMFy.js} +1 -1
  45. package/web-dist/assets/{diagram-FQU43EPY-D_1zVsTL.js → diagram-FQU43EPY-BqTduEYE.js} +1 -1
  46. package/web-dist/assets/{diagram-G47NLZAW-CdZxuGUy.js → diagram-G47NLZAW-Cho718s6.js} +1 -1
  47. package/web-dist/assets/{diagram-NH7WQ7WH-C8pSFu0P.js → diagram-NH7WQ7WH-D0Z8t9UC.js} +1 -1
  48. package/web-dist/assets/{diagram-OA4YK3LP-C5bjZLre.js → diagram-OA4YK3LP-CBacyeDx.js} +1 -1
  49. package/web-dist/assets/{diagram-WEI45ONY-Bxzhiuzn.js → diagram-WEI45ONY-CozpXa4j.js} +1 -1
  50. package/web-dist/assets/{ebnfDiagram-CCIWWBDH-g-Z0J2wP.js → ebnfDiagram-CCIWWBDH-ba4NbQQo.js} +1 -1
  51. package/web-dist/assets/{erDiagram-Q63AITRT-DVNkgIHp.js → erDiagram-Q63AITRT-B3BciOYa.js} +1 -1
  52. package/web-dist/assets/eventmodeling-45OFAUF4-DKmyo-jd.js +1 -0
  53. package/web-dist/assets/flowDiagram-23GEKE2U-DluCBvT4.js +1 -0
  54. package/web-dist/assets/{ganttDiagram-NO4QXBWP-_71pQYEK.js → ganttDiagram-NO4QXBWP-lPmrRit4.js} +1 -1
  55. package/web-dist/assets/{gitGraph-TEB2WS4Q-ChIZiGZS.js → gitGraph-TEB2WS4Q-BjyclOq0.js} +1 -1
  56. package/web-dist/assets/{gitGraphDiagram-IHSO6WYX-DCHAFI0l.js → gitGraphDiagram-IHSO6WYX-pzeb4Yrw.js} +1 -1
  57. package/web-dist/assets/index-BQtjYMpV.css +1 -0
  58. package/web-dist/assets/index-CLW1Q49U.js +360 -0
  59. package/web-dist/assets/{info-DKCQHKI2-BW-n_T1j.js → info-DKCQHKI2-Bwycegvf.js} +1 -1
  60. package/web-dist/assets/{infoDiagram-FWYZ7A6U-CgDYsKi9.js → infoDiagram-FWYZ7A6U-BCvRGj_5.js} +1 -1
  61. package/web-dist/assets/{ishikawaDiagram-FXEZZL3T-ClzGNt9N.js → ishikawaDiagram-FXEZZL3T-Ofw1RMj3.js} +1 -1
  62. package/web-dist/assets/{journeyDiagram-5HDEW3XC-DSCQxkHC.js → journeyDiagram-5HDEW3XC-C5ROwFio.js} +1 -1
  63. package/web-dist/assets/{kanban-definition-HUTT4EX6-CdrdX9N8.js → kanban-definition-HUTT4EX6-YLPLkpeT.js} +1 -1
  64. package/web-dist/assets/{line-ha38Dc-1.js → line-KtkNqRgI.js} +1 -1
  65. package/web-dist/assets/{mermaid-parser.core-Z4uMcpip.js → mermaid-parser.core-D_FfqBe7.js} +3 -3
  66. package/web-dist/assets/{mermaid.core-iZRq3hbu.js → mermaid.core-Ffv8anVf.js} +3 -3
  67. package/web-dist/assets/{mindmap-definition-LN4V7U3C-DmhInJO_.js → mindmap-definition-LN4V7U3C-B2jj4vfm.js} +1 -1
  68. package/web-dist/assets/{packet-7NZHBO7P-DBPB36Kl.js → packet-7NZHBO7P-BjmWHwra.js} +1 -1
  69. package/web-dist/assets/{pegDiagram-2B236MQR-CAH3ljfj.js → pegDiagram-2B236MQR-Dq3iJDyq.js} +1 -1
  70. package/web-dist/assets/{pie-RZYD4A2V-_h_eX4Ca.js → pie-RZYD4A2V-jBbH1lv9.js} +1 -1
  71. package/web-dist/assets/{pieDiagram-ENE6RG2P-DFBPus8j.js → pieDiagram-ENE6RG2P-C3ETW9lq.js} +1 -1
  72. package/web-dist/assets/{quadrantDiagram-ABIIQ3AL-DMvOCjt8.js → quadrantDiagram-ABIIQ3AL-DItSmme7.js} +1 -1
  73. package/web-dist/assets/{radar-I7S5WNFK-2EzoPHEZ.js → radar-I7S5WNFK-6ey6crgP.js} +1 -1
  74. package/web-dist/assets/{railroad-3IZDKUUU-BPJnn-hm.js → railroad-3IZDKUUU-Cii-Mn0E.js} +1 -1
  75. package/web-dist/assets/railroad-abnf-AHOZXSZD-U_vb4BrX.js +1 -0
  76. package/web-dist/assets/railroad-ebnf-EBAXGLYW-BIHG7gNU.js +1 -0
  77. package/web-dist/assets/railroad-peg-LSFZ7HO6-Cpd9r-tB.js +1 -0
  78. package/web-dist/assets/{railroadDiagram-RFXS5EU6-DKq5FagA.js → railroadDiagram-RFXS5EU6-M363ils_.js} +1 -1
  79. package/web-dist/assets/{requirementDiagram-TGXJPOKE-BJ5tGazp.js → requirementDiagram-TGXJPOKE-CTs2_V6T.js} +1 -1
  80. package/web-dist/assets/{sankeyDiagram-HTMAVEWB-XSJjcBhX.js → sankeyDiagram-HTMAVEWB-QTLLcDPD.js} +1 -1
  81. package/web-dist/assets/{sequenceDiagram-DBY2YBRQ-CBb8emSe.js → sequenceDiagram-DBY2YBRQ-Bxw9Tr6e.js} +1 -1
  82. package/web-dist/assets/{stateDiagram-2N3HPSRC-DDfRW94V.js → stateDiagram-2N3HPSRC-BecB6roG.js} +1 -1
  83. package/web-dist/assets/stateDiagram-v2-6OUMAXLB-JXw9T96l.js +1 -0
  84. package/web-dist/assets/{swimlanes-5IMT3BWC-DvRYbkZi.js → swimlanes-5IMT3BWC-COiYgS0w.js} +1 -1
  85. package/web-dist/assets/swimlanesDiagram-G3AALYLV--1Wv7FQQ.js +8 -0
  86. package/web-dist/assets/{timeline-definition-FHXFAJF6-BNUa_DwI.js → timeline-definition-FHXFAJF6-Ci22coeH.js} +1 -1
  87. package/web-dist/assets/{treeView-QDETBFTQ-I6-IW6nJ.js → treeView-QDETBFTQ-4DW35czh.js} +1 -1
  88. package/web-dist/assets/{treemap-6X3UGDF4-CWWmEUYJ.js → treemap-6X3UGDF4-Dq_-Z6-Y.js} +1 -1
  89. package/web-dist/assets/{vennDiagram-L72KCM5P-DTDrPGLk.js → vennDiagram-L72KCM5P-CHQSIEYq.js} +1 -1
  90. package/web-dist/assets/{wardley-OPB4EBWU-CNsdgXXA.js → wardley-OPB4EBWU-Bwlh7HCY.js} +1 -1
  91. package/web-dist/assets/{wardleyDiagram-EHGQE667-YE0tq3Kh.js → wardleyDiagram-EHGQE667-DctjuPYn.js} +1 -1
  92. package/web-dist/assets/{xychartDiagram-FW5EYKEG-D0ofMX8C.js → xychartDiagram-FW5EYKEG-ZoIGosv8.js} +1 -1
  93. package/web-dist/favicon-16.png +0 -0
  94. package/web-dist/favicon-32.png +0 -0
  95. package/web-dist/favicon.svg +17 -61
  96. package/web-dist/icon-192.png +0 -0
  97. package/web-dist/icon-512.png +0 -0
  98. package/web-dist/icon-maskable-512.png +0 -0
  99. package/web-dist/index.html +19 -8
  100. package/web-dist/manifest.webmanifest +3 -3
  101. package/runtime/cc-worker/hooks/scratchpad-stop.mjs +0 -125
  102. package/runtime/cc-worker/skills/handoff/SKILL.md +0 -209
  103. package/web-dist/assets/architecture-TIHT7OUA-CAviNivx.js +0 -1
  104. package/web-dist/assets/channel-CqKDIFQF.js +0 -1
  105. package/web-dist/assets/classDiagram-OUVF2IWQ-B_-6iXYY.js +0 -1
  106. package/web-dist/assets/classDiagram-v2-EOCWNBFH-B_-6iXYY.js +0 -1
  107. package/web-dist/assets/eventmodeling-45OFAUF4-MpmeH5YZ.js +0 -1
  108. package/web-dist/assets/flowDiagram-23GEKE2U-D-QgjjhF.js +0 -1
  109. package/web-dist/assets/index-w4v-GZEc.js +0 -358
  110. package/web-dist/assets/index-zyi22LPz.css +0 -1
  111. package/web-dist/assets/railroad-abnf-AHOZXSZD-YeUoiySk.js +0 -1
  112. package/web-dist/assets/railroad-ebnf-EBAXGLYW-Ddw1SuGG.js +0 -1
  113. package/web-dist/assets/railroad-peg-LSFZ7HO6-Dd8BOGeW.js +0 -1
  114. package/web-dist/assets/stateDiagram-v2-6OUMAXLB-hc41W5Lx.js +0 -1
  115. package/web-dist/assets/swimlanesDiagram-G3AALYLV-BZyGdgSG.js +0 -8
@@ -46,7 +46,7 @@ const EPILOGUE = `
46
46
 
47
47
  ---
48
48
  [ORCHESTRATION EPILOGUE — auto-appended by the frizz worker dispatch hook] You are a helper sub-agent for a frizz worker. Your final message is the handoff: report your outcome/status; what you did; changed files, artifacts, and commit SHA when applicable; verification or evidence and its result; caveats or unresolved work; and the next action when one remains. A bare "done" or progress-only message is not a complete handoff.
49
- The worker's scratchpad is shared: merge your own scoped progress into it as you work rather than leaving the root as its sole writer. Re-read before every edit and preserve every other agent's content. This exact scratchpad is Frizz coordination state, not a project deliverable or source edit: a scoped merge is an explicit exception to delegated phrases such as "write only <path>" or "do not modify the repo"; never classify it as unauthorized or roll it back. Never delete, truncate, reinitialize, move, or replace the whole file. Other project files, including repository-root files, remain governed by your delegated authority; their location alone neither permits nor forbids editing. Do not edit other \`.frizz/\` state unless your prompt explicitly asks you to.
49
+ The worker has a scratch directory (it will name the path if it wants your notes on disk). Write your OWN file there never edit or delete a file another agent wrote, and never treat one shared document as yours to rewrite. Writing your own file there is Frizz coordination state, not a project deliverable or source edit, so it remains allowed when a delegated task limits your deliverable paths with phrases such as "write only <path>" or "do not modify the repo"; never classify it as unauthorized or roll it back. Other project files, including repository-root files, remain governed by your delegated authority; their location alone neither permits nor forbids editing. Do not edit other \`.frizz/\` state unless your prompt explicitly asks you to.
50
50
  You have an upward channel while you work: \`SendMessage({to: "main", summary: "<5-10 words>", message: "…"})\` delivers to your dispatcher. Use it when the dispatcher acting before you finish could change the outcome—for example, when you hit an unresolved blocker, complete a milestone another task needs, or discover that your instructions should change. Do not use it for routine progress updates.
51
51
  Do the work yourself: do NOT dispatch sub-agents of your own unless your dispatch prompt explicitly tells you to. You are already one prong of someone else's fan-out, and another layer below you buys little — it splits the context you were handed, buries the real work one level further from whoever reads the tree, and leaves you collecting a handoff instead of doing the task. A slice that feels large is still yours to work through in your own turn.
52
52
  If your prompt DOES ask you to dispatch a helper, its completion is delivered to you automatically. Never hand-roll a wait loop over a helper's transcript or \`.output\` path to decide whether it finished: that path is a SYMLINK, so \`stat\` without \`-L\` reports the link's own size (the length of its target path, ~150 bytes) and its frozen creation mtime, and the \`"type":"result"\` record is not reliably written — so a helper that is working hard reads as tiny, stale, and dead, and you will discard live work and redo it. Judge a helper only by its completion notification or the text it returns. Give it a \`description\` naming its narrower slice rather than restating your own, so the dispatch tree stays readable.`;
@@ -47,7 +47,7 @@ try {
47
47
  // the model reads is `additionalContext`, injected as a plain-text system-reminder. Exit 0 with
48
48
  // this JSON on stdout (exit 2 would make Claude Code ignore the JSON — never mix).
49
49
  const reason =
50
- 'Interactive plan-approval prompts freeze headless workers (no one is at the keyboard to approve). Do NOT present a plan for approval. Instead: if the plan is settled, just proceed with the work. If the plan is the deliverable, write it into a plan file `.frizz/plans/<topic>.md` (free-form markdown) and/or your scratchpad. If it needs a human call before you build, ask in your FINAL MESSAGE with a two-option ```question block stating what you need approved, then come to rest — the human reviews it from the frizz queue.';
50
+ 'Interactive plan-approval prompts freeze headless workers (no one is at the keyboard to approve). Do NOT present a plan for approval. Instead: if the plan is settled, just proceed with the work. If the plan is the deliverable, write it into a plan file `.frizz/plans/<topic>.md` (free-form markdown) and/or a file in your scratch directory. If it needs a human call before you build, ask in your FINAL MESSAGE with a two-option ```question block stating what you need approved, then come to rest — the human reviews it from the frizz queue.';
51
51
 
52
52
  process.stdout.write(
53
53
  JSON.stringify({
@@ -40,13 +40,6 @@
40
40
  ]
41
41
  }
42
42
  ],
43
- "Stop": [
44
- {
45
- "hooks": [
46
- { "type": "command", "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/scratchpad-stop.mjs\"" }
47
- ]
48
- }
49
- ],
50
43
  "PermissionRequest": [
51
44
  {
52
45
  "matcher": "ExitPlanMode",
@@ -22,20 +22,32 @@
22
22
  //
23
23
  // no hook (control) postTokens 4,060
24
24
  // qualitative "prefer a long summary" postTokens 4,429 (+9% — noise)
25
- // explicit ">= 15,000 words" postTokens 20,339 (5.0x the control) <-- WORD_TARGET
25
+ // explicit ">= 15,000 words" postTokens 20,339 (5.0x the control)
26
26
  // explicit ">= 35,000 words" postTokens 5,182 (WORSE, and slower + dearer)
27
27
  //
28
- // DO NOT RAISE WORD_TARGET without re-measuring: the response is NON-MONOTONIC. 35,000 words is past
29
- // what the model will produce in one response and asking for it degraded compliance badly — a quarter
30
- // the output of the 15,000 ask (2,174 words vs 9,829), at 11.2 min / $3.73 vs 8.6 min / $2.04. Three
31
- // single samples, so treat the exact figures as indicative, but 15,000 was clearly the best of them.
28
+ // The response is NON-MONOTONIC, so do not move WORD_TARGET far in either direction without
29
+ // re-measuring. 35,000 words is past what the model will produce in one response and asking for it
30
+ // degraded compliance badly — a quarter the output of the 15,000 ask (2,174 words vs 9,829), at
31
+ // 11.2 min / $3.73 vs 8.6 min / $2.04. Three single samples; treat the exact figures as indicative.
32
32
  //
33
- // Adjectives do nothing; a hard number does the work. The COST is latency: the 15,000-word run
34
- // produced no compaction result at all inside a 10-minute cap and only completed on a longer budget.
35
- // That is acceptable here because frizz workers run with `precomputeCompactionEnabled`, which arms
36
- // summary generation in a background sidecar at ~80% of the window and swaps it in at the real
37
- // threshold so on an `auto` trigger the wait is largely hidden. A `manual` /compact pays it in
38
- // front of the human.
33
+ // WHY IT IS NO LONGER 15,000 (2026-08-06, maintainer: "let's tone this down a bit"). That row is the
34
+ // one that reads as a win in isolation and is the expensive one in production: a 20,339-token summary
35
+ // is where the next context STARTS, so every compaction handed the thread ~16k tokens of overhead over
36
+ // the control before it did any work. On a long-lived thread that compounds each cycle begins nearer
37
+ // the ceiling, so the next compaction arrives sooner, and the window between them shrinks. Observed on
38
+ // the maintainer's own 10-day `are-taking-over-an-in-flight-epic` thread: 31 compactions, then a
39
+ // cold resume whose replay overflowed the window outright ("Prompt is too long"), leaving a thread that
40
+ // could not complete the one turn that would have compacted it. The latency was the visible cost; the
41
+ // post-compaction FOOTPRINT was the one that actually mattered.
42
+ //
43
+ // 5,000 is UNMEASURED — an explicit number (adjectives measurably do nothing) at a third of the ask,
44
+ // chosen to keep the mechanism that works while cutting what it leaves behind. There is no data point
45
+ // between the qualitative row and 15,000; if this matters, re-run the differential above and add rows.
46
+ //
47
+ // The remaining COST is latency. That is acceptable because frizz workers run with
48
+ // `precomputeCompactionEnabled`, which arms summary generation in a background sidecar at ~80% of the
49
+ // window and swaps it in at the real threshold — so on an `auto` trigger the wait is largely hidden. A
50
+ // `manual` /compact pays it in front of the human.
39
51
  //
40
52
  // HARD CEILING: the summary is ONE model response, so it is bounded by max output tokens (64k for
41
53
  // Opus 5 / Sonnet 5, ~48k words). A 200k-token summary is unreachable at any prompt.
@@ -46,13 +58,14 @@
46
58
  // brief about what to retain.
47
59
  //
48
60
  // GATE: everything is gated on FRIZZ_THREAD, so the plugin stays inert when loaded outside a
49
- // frizz worker. Sub-agent contexts are skipped, matching session-seed.mjs — the scratchpad path
61
+ // frizz worker. Sub-agent contexts are skipped, matching session-seed.mjs — the scratch-directory path
50
62
  // below is only guaranteed correct for the top-level worker session.
51
63
  import { readFileSync } from 'node:fs';
52
64
  import { currentSessionId } from '../scripts/frizz/config.mjs';
53
65
 
54
- // See "LENGTH IS ONLY STEERABLE BY AN EXPLICIT NUMBER" above before changing this.
55
- const WORD_TARGET = 15000;
66
+ // See "LENGTH IS ONLY STEERABLE BY AN EXPLICIT NUMBER" and "WHY IT IS NO LONGER 15,000" above before
67
+ // changing this. The number is load-bearing; the prose around it is not.
68
+ const WORD_TARGET = 5000;
56
69
 
57
70
  /** @type {{ agent_id?: unknown, agentId?: unknown, trigger?: string, session_id?: string }} */
58
71
  let input = {};
@@ -75,27 +88,25 @@ try {
75
88
  /* best-effort — fall back to the generic path shape below */
76
89
  }
77
90
  const scratch = sid
78
- ? '.frizz/threads/' + sid + '/scratch.md'
79
- : '.frizz/threads/<session-id>/scratch.md';
91
+ ? '.frizz/threads/' + sid + '/'
92
+ : '.frizz/threads/<session-id>/';
80
93
 
81
94
  // Written as an editorial brief, not as a command block — see TONE MATTERS above.
82
95
  const brief = [
83
- 'This is a frizz worker session driving one engineering effort (`' + thread + '`). Three things ' +
84
- 'matter more here than brevity does, because they are what actually gets lost in compaction:',
96
+ 'This is a frizz worker session driving one engineering effort (`' + thread + '`). Three things to ' +
97
+ 'get right, because they are what actually gets lost in compaction:',
85
98
  '',
86
- '1. LENGTH. Write an EXHAUSTIVE summary, not a condensed one: target at least ' +
87
- WORD_TARGET.toLocaleString('en-US') + ' words. There is ample room for it, so do not compress. ' +
88
- 'A short summary is the failure mode here omitting something load-bearing is far worse than ' +
89
- 'including something redundant.',
99
+ '1. LENGTH. Target about ' + WORD_TARGET.toLocaleString('en-US') + ' words long enough that ' +
100
+ 'nothing load-bearing has to be dropped, but this is a working handover and not an archive. ' +
101
+ 'Spend the length on what the next turn cannot recover for itself.',
90
102
  '',
91
103
  '2. THE HIGH-LEVEL APPROACH, AT HIGH FIDELITY. Preserve the shape of the work, not just its ' +
92
104
  'mechanics: what problem is being solved, the approach chosen, the approaches considered and ' +
93
- 'REJECTED and why, and the reasoning that led there. Reproduce this in full rather than ' +
94
- 'condensing it into a sentence — a summary that lists edits but loses the plan leaves the next ' +
95
- 'turn unable to judge whether a step is still the right one. Include substantial verbatim ' +
96
- 'excerpts of the code and output that matter rather than describing them from memory.',
105
+ 'REJECTED and why, and the reasoning that led there. This is the part worth its space — a summary ' +
106
+ 'that lists edits but loses the plan leaves the next turn unable to judge whether a step is still ' +
107
+ 'the right one. Quote code and output where the exact text matters; summarize where it does not.',
97
108
  '',
98
- 'Carry forward, in as much detail as you can:',
109
+ 'Carry forward:',
99
110
  '- The task list and its state — every item, marked done / in progress / not started / blocked.',
100
111
  '- Decisions made and the rationale for each, especially any the human made, approved, or reversed.',
101
112
  '- Constraints, conventions, and explicit human instructions or corrections — in the human\'s own ' +
@@ -110,7 +121,7 @@ const brief = [
110
121
  '3. RE-GROUNDING. End the summary with a final section headed exactly "Re-grounding before ' +
111
122
  'continuing:" that tells the next turn what to re-establish BEFORE it asserts anything or resumes ' +
112
123
  'editing. Make it concrete and specific to this session — not generic advice:',
113
- '- Re-read the scratchpad at `' + scratch + '` first. It is the durable working state and it ' +
124
+ '- Read whatever the worker left in `' + scratch + '` first. That is its durable working state and it ' +
114
125
  'outlives this summary.',
115
126
  '- Name the specific files to re-read before describing or changing them, rather than relying on ' +
116
127
  'remembered contents.',