@iowarp/clio-coder 0.4.1 → 0.4.3

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 (604) hide show
  1. package/CHANGELOG.md +127 -0
  2. package/CONTRIBUTING.md +142 -52
  3. package/README.md +434 -473
  4. package/SECURITY.md +2 -1
  5. package/dist/{acp-ZILU3AUO.js → acp-H2NGRPWO.js} +12 -12
  6. package/dist/{agents-HYWGBGQR.js → agents-TL5LLUQP.js} +56 -55
  7. package/dist/assets/codewiki.json +1 -1
  8. package/dist/{auth-N3QT7CBO.js → auth-E5SW4HMS.js} +23 -21
  9. package/dist/builtins-IA7V7FUC.js +22 -0
  10. package/dist/{chunk-7RY5VZPH.js → chunk-2APPQIER.js} +8 -8
  11. package/dist/{chunk-72GZI5EV.js → chunk-2JH2WHGE.js} +2 -2
  12. package/dist/{chunk-JA5QWE4Z.js → chunk-2UG5F4C5.js} +1973 -1664
  13. package/dist/{chunk-5YHDIDBP.js → chunk-2UH2KFUP.js} +2 -2
  14. package/dist/{chunk-CTJ4RNAA.js → chunk-2VIKGWFZ.js} +2 -2
  15. package/dist/{chunk-I66EAJFY.js → chunk-2WZ546HR.js} +267 -232
  16. package/dist/{chunk-GIZNH63R.js → chunk-35MSIRKH.js} +9 -4
  17. package/dist/chunk-3EBYEESD.js +314 -0
  18. package/dist/{chunk-J5LZHVIT.js → chunk-3M6DQK6S.js} +113 -35
  19. package/dist/{chunk-RKSR6VSF.js → chunk-4IUZQIJ3.js} +29 -1
  20. package/dist/{chunk-6FN3E6KX.js → chunk-4O6MANBS.js} +2 -2
  21. package/dist/chunk-4UVU7BJ5.js +39 -0
  22. package/dist/{chunk-VKRH2TCS.js → chunk-4WR7VSYB.js} +2 -2
  23. package/dist/{chunk-BBTJOK6Y.js → chunk-54CBCGIR.js} +5 -5
  24. package/dist/{chunk-AP73CFDC.js → chunk-5ICU3EUH.js} +2 -2
  25. package/dist/chunk-5MEZN6CB.js +1334 -0
  26. package/dist/{chunk-O42A54GG.js → chunk-5OIVVPHF.js} +2 -2
  27. package/dist/{chunk-ABLSQ6JX.js → chunk-64I3JVYM.js} +8 -2
  28. package/dist/{chunk-AFKWHWXF.js → chunk-6PTFB5VS.js} +39 -22
  29. package/dist/{chunk-VN3SHNBN.js → chunk-7DICMOS6.js} +2 -2
  30. package/dist/chunk-7DRAWPTZ.js +360 -0
  31. package/dist/chunk-7E7I3WLS.js +3762 -0
  32. package/dist/{chunk-BJGUKIG4.js → chunk-7ZYNNDKC.js} +7 -7
  33. package/dist/{chunk-XKA2ICR3.js → chunk-AF4YM7Z4.js} +652 -252
  34. package/dist/{chunk-GVQJ5CCZ.js → chunk-AX2THNSA.js} +12 -12
  35. package/dist/{chunk-IG7BCQBA.js → chunk-B4OAX3SI.js} +65 -3
  36. package/dist/{chunk-TD3PGPQA.js → chunk-B4VEBZKF.js} +3 -3
  37. package/dist/{chunk-74YWRRU5.js → chunk-BEPZRGGU.js} +10 -10
  38. package/dist/{chunk-FEFIFZTL.js → chunk-CE5AX47J.js} +2 -2
  39. package/dist/{chunk-UAPGZHYC.js → chunk-DWUOQKRU.js} +25 -11
  40. package/dist/{chunk-THYWACCR.js → chunk-E3TPLWFX.js} +3 -3
  41. package/dist/{chunk-7EPLI7VL.js → chunk-EKCHAPYA.js} +2 -2
  42. package/dist/{chunk-HLW2MRKE.js → chunk-F4EKGO4N.js} +3 -1
  43. package/dist/{chunk-PJJ6MY27.js → chunk-F5JHEYZM.js} +7 -7
  44. package/dist/{chunk-6CCS4G3W.js → chunk-FTMGRKEF.js} +3 -3
  45. package/dist/{chunk-SINK3QR6.js → chunk-G76U63X4.js} +17 -17
  46. package/dist/{chunk-EIMVLWB3.js → chunk-GHS5EBTQ.js} +64 -9
  47. package/dist/{chunk-QMXC4JB7.js → chunk-GI7YYQ3F.js} +187 -1419
  48. package/dist/{chunk-TZSKNMZG.js → chunk-GTUD2WMY.js} +2 -1
  49. package/dist/{chunk-6HMJX2VU.js → chunk-GWZNEVM2.js} +44 -12
  50. package/dist/chunk-GYV6VZOC.js +26 -0
  51. package/dist/{chunk-MQXIVJ35.js → chunk-HAXOFFRH.js} +5 -5
  52. package/dist/{chunk-UXN6JT4W.js → chunk-HEQY7ZFI.js} +3 -3
  53. package/dist/{chunk-7PWAODYW.js → chunk-I7XBWTYH.js} +2 -2
  54. package/dist/{chunk-GCSMB2KY.js → chunk-I7ZPNEJM.js} +145 -102
  55. package/dist/{chunk-WNP7O5WZ.js → chunk-ID64D7PE.js} +4 -4
  56. package/dist/{chunk-QTFGO774.js → chunk-IGLP3ODT.js} +29 -16
  57. package/dist/chunk-IJNZMHLA.js +101 -0
  58. package/dist/{chunk-BDPT6GTK.js → chunk-INY6HTFL.js} +7 -7
  59. package/dist/{chunk-PBP4B7XR.js → chunk-IUE3Y34X.js} +2 -2
  60. package/dist/{chunk-6NJQITNH.js → chunk-IWT4SF4R.js} +6 -3
  61. package/dist/{chunk-R23Z6K6I.js → chunk-JDAY6FIL.js} +19 -19
  62. package/dist/chunk-JEQ3XTHC.js +42 -0
  63. package/dist/{chunk-FSP7CMNU.js → chunk-JGRC33J2.js} +50 -4
  64. package/dist/{chunk-TVH4ONAM.js → chunk-JKKCYP3C.js} +10 -10
  65. package/dist/{chunk-HJWWJ6IL.js → chunk-JSC3U7TI.js} +16 -4
  66. package/dist/{chunk-C537JADH.js → chunk-KK4JZPBQ.js} +19 -141
  67. package/dist/{chunk-K6BF4U2H.js → chunk-KKOJXO6R.js} +62 -14
  68. package/dist/{chunk-IHXBNWMM.js → chunk-KXDSS5WJ.js} +7 -3
  69. package/dist/{chunk-6DWBAZ5U.js → chunk-L47TF46W.js} +5 -7
  70. package/dist/{chunk-HUAS7ITX.js → chunk-LDJG7DW3.js} +91 -42
  71. package/dist/{chunk-CDNVLKUX.js → chunk-LLDJM5XK.js} +13 -7
  72. package/dist/{chunk-YPI3QQCF.js → chunk-MCEPRMZW.js} +2 -4
  73. package/dist/{chunk-Y4CAGMM6.js → chunk-MNJGS2IN.js} +5 -6
  74. package/dist/{chunk-VKFQTNDV.js → chunk-MUW2BDDH.js} +4 -4
  75. package/dist/{chunk-E67WX76H.js → chunk-MWUZBSAQ.js} +104 -152
  76. package/dist/{chunk-OJTRZGR3.js → chunk-N2Z7HLVY.js} +21 -21
  77. package/dist/{chunk-TVHHYFHE.js → chunk-NEDJ26B5.js} +2 -2
  78. package/dist/{chunk-FYUN5KZ3.js → chunk-NIQJ66N4.js} +21 -21
  79. package/dist/{chunk-U2WB7TZS.js → chunk-NMJXSHBJ.js} +97 -85
  80. package/dist/{chunk-CWVRRIEI.js → chunk-NZMNUPZZ.js} +2 -2
  81. package/dist/{chunk-VEGN6WIQ.js → chunk-O5CVSAG5.js} +3 -3
  82. package/dist/{chunk-MOPSG2X7.js → chunk-OML5D5V5.js} +8 -8
  83. package/dist/{chunk-2VG7KLYV.js → chunk-PAJQJ7BS.js} +5816 -3255
  84. package/dist/{chunk-ZW55JB7N.js → chunk-PUVDKJ2Y.js} +2 -2
  85. package/dist/{chunk-BTGG6BG2.js → chunk-QWGDJJYJ.js} +158 -19
  86. package/dist/chunk-R6Q67RJH.js +134 -0
  87. package/dist/{chunk-ZJLUDYFY.js → chunk-RRNP2ANY.js} +6 -6
  88. package/dist/{chunk-PVAMAVBB.js → chunk-RSJ25QSL.js} +102 -2
  89. package/dist/{chunk-NLFAQR7Z.js → chunk-S66XZJOF.js} +3 -23
  90. package/dist/chunk-SKHCAU7K.js +385 -0
  91. package/dist/chunk-SZAA6XDG.js +30 -0
  92. package/dist/{chunk-J4HBWF6Y.js → chunk-TM6LQDI3.js} +131 -28
  93. package/dist/chunk-UOIZ7DA4.js +41 -0
  94. package/dist/{chunk-MA3H6DM5.js → chunk-UPZU6GE4.js} +25 -3
  95. package/dist/{chunk-BWW4HLO4.js → chunk-UXCU4E3T.js} +8 -6
  96. package/dist/{chunk-N5UK64DP.js → chunk-V2ANDPVT.js} +4 -4
  97. package/dist/{chunk-AK5XEFVZ.js → chunk-VA5FNYMT.js} +26 -13
  98. package/dist/{chunk-6VC4OV3Z.js → chunk-VIA6RFQZ.js} +3 -11
  99. package/dist/{chunk-ZAZB4JMW.js → chunk-VKPAQYEB.js} +27 -8
  100. package/dist/{chunk-QKIFBZKT.js → chunk-VW6DOEDG.js} +497 -81
  101. package/dist/{chunk-SCYB3HA4.js → chunk-W6RRQCPQ.js} +63 -19
  102. package/dist/{chunk-2NM363SV.js → chunk-WBKFA554.js} +10 -10
  103. package/dist/{chunk-R32CLGZ6.js → chunk-WCXUNS7U.js} +82 -21
  104. package/dist/{chunk-GPPB3JBE.js → chunk-WRBAGUNF.js} +3 -3
  105. package/dist/{chunk-IXJT6DCX.js → chunk-XIVNBFZS.js} +85 -30
  106. package/dist/{chunk-UEDMSP56.js → chunk-XPWWI35G.js} +417 -201
  107. package/dist/chunk-XRZT5WY5.js +47 -0
  108. package/dist/{chunk-3QSOM6PA.js → chunk-Y3CBHOR6.js} +2 -2
  109. package/dist/{chunk-VXMFAE2W.js → chunk-YPC6ZR5L.js} +19 -6
  110. package/dist/{chunk-AKB4GYDL.js → chunk-YQWYVTMC.js} +5 -5
  111. package/dist/{chunk-6I5ILFOF.js → chunk-ZA4VCIGV.js} +3 -3
  112. package/dist/{chunk-7OBGU7UB.js → chunk-ZDN3Y73Y.js} +12 -18
  113. package/dist/{chunk-3I5NY75V.js → chunk-ZWPRK62N.js} +8 -5
  114. package/dist/cli/index.js +41 -39
  115. package/dist/{clio-IT3G3VQH.js → clio-CMMK4KRR.js} +9 -9
  116. package/dist/{code-nav-RK6S7F6E.js → code-nav-MDZNQS33.js} +89 -21
  117. package/dist/{components-UBWCQSRW.js → components-UCUQ4QXW.js} +4 -4
  118. package/dist/{config-3QZRWZJF.js → config-SVM5P5YI.js} +131 -84
  119. package/dist/{configure-FL7Y3KJF.js → configure-LE3IK2TJ.js} +28 -26
  120. package/dist/{context-5HE7ODYK.js → context-2OHRKS42.js} +69 -64
  121. package/dist/{context-KYQFRVDC.js → context-E3VC7RX5.js} +15 -11
  122. package/dist/{context-XNHL75JV.js → context-VNCR7KAG.js} +93 -65
  123. package/dist/{context-clear-N545L53A.js → context-clear-BW4O37TG.js} +64 -60
  124. package/dist/context-map-COB37XXN.js +505 -0
  125. package/dist/{context-working-set-QHKXSV2F.js → context-working-set-VDS25HXZ.js} +19 -18
  126. package/dist/{dispatch-runner-RGIE5PCT.js → dispatch-runner-5AHT53RF.js} +93 -82
  127. package/dist/{docs-5NAF6AU7.js → docs-PD3EXDKU.js} +21 -20
  128. package/dist/{doctor-ZGPEGHIP.js → doctor-WNNVO6FY.js} +48 -47
  129. package/dist/{eval-GXLL44RD.js → eval-7G7SGAYO.js} +287 -115
  130. package/dist/{eval-inventory-HBWSWQOK.js → eval-inventory-Y6QRFOH5.js} +4 -4
  131. package/dist/{evidence-HWLBRH3Q.js → evidence-VD6736FQ.js} +67 -64
  132. package/dist/{evolve-FTZBMNVW.js → evolve-AL3NGVRL.js} +65 -62
  133. package/dist/{extensions-VHRBEID7.js → extensions-MOVJ32NM.js} +9 -7
  134. package/dist/{fleet-CKZHJWZJ.js → fleet-QZHUMAGI.js} +114 -111
  135. package/dist/{fleet-commands-EXDXBMV6.js → fleet-commands-BAYT5FJZ.js} +10 -10
  136. package/dist/{fleet-decisions-OTHB6KRL.js → fleet-decisions-IREVMRU4.js} +7 -6
  137. package/dist/{fleet-graph-YTEZUCUT.js → fleet-graph-YCTT3HTI.js} +22 -19
  138. package/dist/{fleet-inspect-SS6YMDCK.js → fleet-inspect-QVJTDAVB.js} +58 -55
  139. package/dist/{fleet-preflight-PBY4VYOM.js → fleet-preflight-25QAFPK4.js} +4 -4
  140. package/dist/{fleet-validate-KMEM5L3S.js → fleet-validate-5O57AAJ7.js} +26 -23
  141. package/dist/{fleet-verify-QD5M7E7Q.js → fleet-verify-CPH2W2T6.js} +59 -56
  142. package/dist/{fleet-view-WAMJYNDT.js → fleet-view-SWBR3VGQ.js} +58 -55
  143. package/dist/{init-5XQRBOFV.js → init-J477LKZH.js} +82 -79
  144. package/dist/{interop-34TVO25M.js → interop-3FCM6XLG.js} +11 -11
  145. package/dist/{library-3QY6KF57.js → library-QUQEIUG6.js} +30 -27
  146. package/dist/{memory-L4UTIIIW.js → memory-SGGSEP65.js} +67 -64
  147. package/dist/{models-ZVX3QOWE.js → models-HEKUAXXK.js} +53 -46
  148. package/dist/{monitor-CEKVSYTS.js → monitor-HKU57TYQ.js} +63 -60
  149. package/dist/{orchestrator-77BAP6BC.js → orchestrator-VDFAEFAI.js} +1831 -1057
  150. package/dist/{panes-7STHOAUJ.js → panes-DN2SSFOH.js} +5 -5
  151. package/dist/{panes-SHAUIRXY.js → panes-TALGNPZT.js} +29 -14
  152. package/dist/{paths-L7LGY6RN.js → paths-NBMFAIEZ.js} +5 -5
  153. package/dist/reset-EAJFFJVB.js +344 -0
  154. package/dist/{resources-74GKTLSF.js → resources-OVKSEFVE.js} +29 -20
  155. package/dist/{run-HBAUJNNZ.js → run-7DP7ZF2J.js} +120 -115
  156. package/dist/{share-G3APVLVP.js → share-WML67FT3.js} +32 -27
  157. package/dist/{skills-35HHUKCR.js → skills-SG662R2K.js} +41 -31
  158. package/dist/{skills-eval-QN4HSHDC.js → skills-eval-VVZEUU46.js} +78 -77
  159. package/dist/{skills-inventory-J357J34F.js → skills-inventory-I2E23GET.js} +23 -20
  160. package/dist/{slash-commands-JZZCQA32.js → slash-commands-S7MBJDQK.js} +40 -36
  161. package/dist/{steer-XAVHJM22.js → steer-2LQOMCPB.js} +3 -3
  162. package/dist/{support-U7QOWY26.js → support-CC2UJBJ6.js} +6 -6
  163. package/dist/{targets-DSM6CY3M.js → targets-4QC3HIEW.js} +54 -54
  164. package/dist/{terminal-lease-JOPFUVEM.js → terminal-lease-TUHIJ6Y2.js} +5 -5
  165. package/dist/{tools-MKNWVPBH.js → tools-TFGJICCU.js} +10 -10
  166. package/dist/{trace-ECQ7TIYZ.js → trace-FXMXUZUF.js} +55 -7
  167. package/dist/uninstall-5PEVOE5B.js +408 -0
  168. package/dist/upgrade-M4WXY6KN.js +303 -0
  169. package/dist/{usage-X52N3IDJ.js → usage-N7ZNVLEM.js} +151 -104
  170. package/dist/{verifiers-EJTVVSMA.js → verifiers-DJTP4XX6.js} +15 -15
  171. package/dist/{verify-YJL6XET2.js → verify-RWE4PPEK.js} +9 -9
  172. package/dist/{web-fetch-MPIFL3LL.js → web-fetch-MPARV2K7.js} +2 -2
  173. package/dist/{wiki-generate-4NDZTQ4B.js → wiki-generate-C7IQOXSP.js} +89 -86
  174. package/dist/{with-panes-OBOBFIIR.js → with-panes-4GCGSL7J.js} +53 -257
  175. package/dist/worker/entry.js +90 -74
  176. package/docs/README.md +176 -81
  177. package/docs/{acp.md → architecture/acp.md} +36 -20
  178. package/docs/{alcf-provider.md → architecture/alcf-provider.md} +8 -5
  179. package/docs/{architecture.md → architecture/architecture.md} +43 -22
  180. package/docs/{artifact-placement.md → architecture/artifact-placement.md} +27 -23
  181. package/docs/architecture/artifact-versions.md +90 -0
  182. package/docs/{capacity-and-scheduling.md → architecture/capacity-and-scheduling.md} +26 -13
  183. package/docs/{context-engine.md → architecture/context-engine.md} +29 -25
  184. package/docs/{context-working-set.md → architecture/context-working-set.md} +13 -10
  185. package/docs/{dispatch-architecture-rationale.md → architecture/dispatch-architecture-rationale.md} +12 -9
  186. package/docs/{dispatch-typed-intent.md → architecture/dispatch-typed-intent.md} +68 -46
  187. package/docs/{evidence-and-memory.md → architecture/evidence-and-memory.md} +23 -16
  188. package/docs/{middleware-and-components.md → architecture/middleware-and-components.md} +11 -5
  189. package/docs/{model-catalog.md → architecture/model-catalog.md} +61 -27
  190. package/docs/{observability.md → architecture/observability.md} +38 -14
  191. package/docs/{pi-boundary.md → architecture/pi-boundary.md} +24 -11
  192. package/docs/{prompt-envelope-and-tools.md → architecture/prompt-envelope-and-tools.md} +57 -20
  193. package/docs/{provider-adapter-cookbook.md → architecture/provider-adapter-cookbook.md} +99 -25
  194. package/docs/{safety-model.md → architecture/safety-model.md} +35 -20
  195. package/docs/{session-lifecycle.md → architecture/session-lifecycle.md} +8 -5
  196. package/docs/architecture/time-conventions.md +125 -0
  197. package/docs/{trace-store.md → architecture/trace-store.md} +13 -5
  198. package/docs/{tui-design.md → architecture/tui-design.md} +13 -13
  199. package/docs/{worker-dispatch-mechanics.md → architecture/worker-dispatch-mechanics.md} +27 -30
  200. package/docs/{built-in-agents.md → guide/built-in-agents.md} +65 -35
  201. package/docs/{commands-and-modes.md → guide/commands-and-modes.md} +66 -61
  202. package/docs/{configuration-and-targets.md → guide/configuration-and-targets.md} +323 -297
  203. package/docs/guide/configuration-reference.md +1163 -0
  204. package/docs/{environment-variables.md → guide/environment-variables.md} +33 -28
  205. package/docs/{exit-codes-and-output.md → guide/exit-codes-and-output.md} +6 -3
  206. package/docs/{extensions-and-sharing.md → guide/extensions-and-sharing.md} +41 -14
  207. package/docs/{fleet-dispatch.md → guide/fleet-dispatch.md} +39 -43
  208. package/docs/{glossary.md → guide/glossary.md} +14 -11
  209. package/docs/{installation-and-lifecycle.md → guide/installation-and-lifecycle.md} +81 -17
  210. package/docs/guide/panes-and-files.md +290 -0
  211. package/docs/{proactive-memory.md → guide/proactive-memory.md} +131 -107
  212. package/docs/{resource-library.md → guide/resource-library.md} +13 -4
  213. package/docs/{skills-marketplace.md → guide/skills-marketplace.md} +25 -3
  214. package/docs/{tool-usage.md → guide/tool-usage.md} +87 -23
  215. package/docs/{troubleshooting.md → guide/troubleshooting.md} +9 -4
  216. package/docs/{config-knobs-audit.md → history/config-knobs-audit.md} +11 -11
  217. package/docs/{release-cut-checklist.md → history/release-cut-checklist.md} +29 -2
  218. package/docs/process/development-pipeline.md +152 -0
  219. package/docs/process/documentation-coverage.md +100 -0
  220. package/docs/process/documentation-guide.md +187 -0
  221. package/docs/{eval-runner.md → process/eval-runner.md} +108 -53
  222. package/docs/{evals-internal.md → process/evals-internal.md} +10 -10
  223. package/docs/{evolution.md → process/evolution.md} +2 -2
  224. package/docs/{fleet-demo-runbook.md → process/fleet-demo-runbook.md} +11 -7
  225. package/docs/{git-commit-provenance.md → process/git-commit-provenance.md} +11 -4
  226. package/docs/{performance-methodology.md → process/performance-methodology.md} +87 -69
  227. package/docs/{scientific-validation.md → process/scientific-validation.md} +4 -4
  228. package/evals/README.md +2 -2
  229. package/evals/behavioral-model.yaml +3 -2
  230. package/package.json +10 -8
  231. package/skills/README.md +52 -41
  232. package/skills/coding/ast-grep/SKILL.md +102 -31
  233. package/skills/coding/ast-grep/evals.md +26 -0
  234. package/skills/coding/coding-standards/SKILL.md +41 -6
  235. package/skills/coding/coding-standards/evals.md +23 -0
  236. package/skills/coding/prototype/SKILL.md +88 -29
  237. package/skills/coding/prototype/evals.md +19 -0
  238. package/skills/coding/tdd/SKILL.md +81 -54
  239. package/skills/coding/tdd/evals.md +20 -0
  240. package/skills/context/context-handoff/SKILL.md +44 -3
  241. package/skills/context/context-handoff/evals.md +44 -0
  242. package/skills/context/context-prime/SKILL.md +46 -16
  243. package/skills/context/context-prime/evals.md +45 -0
  244. package/skills/git/branch-closeout/SKILL.md +132 -0
  245. package/skills/git/branch-closeout/evals.md +133 -0
  246. package/skills/git/branch-closeout/references/closeout-checklist.md +81 -0
  247. package/skills/git/file-ticket/SKILL.md +78 -64
  248. package/skills/git/file-ticket/assets/issue-template.md +22 -0
  249. package/skills/git/file-ticket/evals.md +31 -26
  250. package/skills/git/file-ticket/references/issue-discovery.md +49 -0
  251. package/skills/git/fix-issue/SKILL.md +88 -65
  252. package/skills/git/fix-issue/evals.md +35 -31
  253. package/skills/git/fix-issue/references/diagnosis-and-rca.md +46 -0
  254. package/skills/git/resolve-merge-conflicts/SKILL.md +101 -52
  255. package/skills/git/resolve-merge-conflicts/evals.md +52 -25
  256. package/skills/git/resolve-merge-conflicts/references/conflict-matrix.md +126 -0
  257. package/skills/git/ship/SKILL.md +103 -67
  258. package/skills/git/ship/assets/pr-template.md +21 -0
  259. package/skills/git/ship/evals.md +44 -28
  260. package/skills/git/ship/references/remote-and-branch-policy.md +62 -0
  261. package/skills/git/worktree-create/SKILL.md +80 -50
  262. package/skills/git/worktree-create/evals.md +40 -33
  263. package/skills/git/worktree-create/references/worktree-setup.md +62 -66
  264. package/skills/git/worktree-merge/SKILL.md +112 -65
  265. package/skills/git/worktree-merge/evals.md +42 -34
  266. package/skills/git/worktree-merge/references/merge-strategies.md +52 -0
  267. package/skills/meta/clio-coder-dev/SKILL.md +9 -5
  268. package/skills/meta/clio-coder-dev/evals.md +3 -2
  269. package/skills/meta/clio-coder-test/SKILL.md +102 -95
  270. package/skills/meta/clio-coder-test/evals.md +9 -4
  271. package/skills/meta/clio-coder-test/references/harness.md +100 -124
  272. package/skills/meta/clio-coder-test/references/test-map.md +77 -50
  273. package/skills/meta/credentials/SKILL.md +2 -2
  274. package/skills/meta/find-skills/SKILL.md +2 -2
  275. package/skills/meta/herdr/SKILL.md +2 -2
  276. package/skills/meta/skill-craft/SKILL.md +22 -16
  277. package/skills/planning/archify/SKILL.md +196 -0
  278. package/skills/planning/archify/evals.md +65 -0
  279. package/skills/planning/architecture/SKILL.md +62 -13
  280. package/skills/planning/architecture/evals.md +65 -0
  281. package/skills/planning/backlog/SKILL.md +131 -15
  282. package/skills/planning/backlog/evals.md +142 -0
  283. package/skills/planning/prd/SKILL.md +47 -7
  284. package/skills/planning/prd/evals.md +54 -0
  285. package/skills/planning/product-intent/SKILL.md +58 -3
  286. package/skills/planning/product-intent/evals.md +70 -0
  287. package/skills/planning/tech-spec/SKILL.md +54 -3
  288. package/skills/planning/tech-spec/evals.md +73 -0
  289. package/skills/registry.yaml +70 -62
  290. package/skills/remote.yaml +13 -0
  291. package/skills/research/arxiv-literature/SKILL.md +77 -19
  292. package/skills/research/arxiv-literature/evals.md +50 -0
  293. package/skills/research/experiment-protocol/SKILL.md +21 -2
  294. package/skills/research/experiment-protocol/evals.md +23 -0
  295. package/skills/research/scientific-debugging/SKILL.md +24 -2
  296. package/skills/research/scientific-debugging/evals.md +18 -0
  297. package/skills/research/scientific-modernization/SKILL.md +27 -2
  298. package/skills/research/scientific-modernization/evals.md +27 -0
  299. package/skills/skill-marketplace.json +97 -62
  300. package/skills/workflow/cut-it/SKILL.md +66 -6
  301. package/skills/workflow/cut-it/evals.md +101 -0
  302. package/skills/workflow/design-council/SKILL.md +118 -28
  303. package/skills/workflow/design-council/evals.md +161 -0
  304. package/skills/workflow/grill-me/SKILL.md +87 -11
  305. package/skills/workflow/grill-me/evals.md +153 -0
  306. package/skills/workflow/workflow-distiller/SKILL.md +77 -18
  307. package/skills/workflow/workflow-distiller/evals.md +118 -0
  308. package/src/cli/args.ts +2 -2
  309. package/src/cli/bootstrap-generate.ts +1 -1
  310. package/src/cli/config-inspect.ts +65 -12
  311. package/src/cli/configure-interop.ts +105 -13
  312. package/src/cli/configure-oauth.ts +57 -0
  313. package/src/cli/configure-onboarding.ts +980 -0
  314. package/src/cli/configure-target.ts +594 -0
  315. package/src/cli/configure.ts +1082 -532
  316. package/src/cli/context-map.ts +114 -0
  317. package/src/cli/context.ts +4 -0
  318. package/src/cli/docs.ts +22 -14
  319. package/src/cli/doctor-naming.ts +5 -5
  320. package/src/cli/doctor-toolchain.ts +3 -3
  321. package/src/cli/eval.ts +1 -2
  322. package/src/cli/extensions.ts +2 -1
  323. package/src/cli/fleet.ts +1 -1
  324. package/src/cli/index.ts +3 -1
  325. package/src/cli/internal-dispatch.ts +3 -4
  326. package/src/cli/lifecycle-presenter.ts +436 -0
  327. package/src/cli/models.ts +10 -2
  328. package/src/cli/modes/print.ts +5 -1
  329. package/src/cli/panes.ts +19 -5
  330. package/src/cli/reset.ts +228 -106
  331. package/src/cli/run.ts +9 -4
  332. package/src/cli/select.ts +664 -0
  333. package/src/cli/share.ts +5 -1
  334. package/src/cli/skills-eval.ts +3 -3
  335. package/src/cli/skills.ts +9 -2
  336. package/src/cli/targets.ts +5 -6
  337. package/src/cli/trace.ts +55 -4
  338. package/src/cli/uninstall.ts +233 -165
  339. package/src/cli/upgrade.ts +204 -149
  340. package/src/cli/usage.ts +86 -27
  341. package/src/cli/validate-model.ts +3 -3
  342. package/src/cli/wiki-generate.ts +1 -1
  343. package/src/core/artifact-paths.ts +1 -1
  344. package/src/core/bash-exec.ts +131 -86
  345. package/src/core/bus-events.ts +51 -6
  346. package/src/core/config.ts +61 -1
  347. package/src/core/defaults.ts +7 -4
  348. package/src/core/dispatch-outcome.ts +16 -0
  349. package/src/core/external-diagnostic.ts +44 -0
  350. package/src/core/gateway-routing.ts +157 -0
  351. package/src/core/guardrails.ts +10 -49
  352. package/src/core/prompt-hint.ts +9 -0
  353. package/src/core/safe-exec.ts +17 -2
  354. package/src/core/skill-activation.ts +89 -2
  355. package/src/domains/agents/builtins/architect.md +2 -3
  356. package/src/domains/agents/builtins/coder.md +3 -2
  357. package/src/domains/agents/builtins/debugger.md +2 -2
  358. package/src/domains/agents/builtins/documenter.md +2 -2
  359. package/src/domains/agents/builtins/git-master.md +1 -1
  360. package/src/domains/agents/builtins/oracle.md +1 -1
  361. package/src/domains/agents/builtins/provenance.md +1 -1
  362. package/src/domains/agents/builtins/researcher.md +1 -1
  363. package/src/domains/agents/builtins/scout.md +1 -1
  364. package/src/domains/agents/builtins/tester.md +2 -2
  365. package/src/domains/agents/builtins/verifier.md +2 -2
  366. package/src/domains/agents/builtins/wiki-writer.md +1 -1
  367. package/src/domains/agents/builtins/world-knowledge.md +31 -0
  368. package/src/domains/agents/catalog.ts +13 -15
  369. package/src/domains/agents/contract.ts +2 -0
  370. package/src/domains/agents/extension.ts +23 -1
  371. package/src/domains/agents/result-contract.ts +70 -0
  372. package/src/domains/config/keybindings.ts +8 -0
  373. package/src/domains/context/extension.ts +0 -3
  374. package/src/domains/context/wiki/map-seed.ts +589 -0
  375. package/src/domains/context/wiki/plan.ts +2 -2
  376. package/src/domains/context/working-set/path-index.ts +1 -0
  377. package/src/domains/dispatch/admission.ts +29 -0
  378. package/src/domains/dispatch/agent-candidates.ts +10 -0
  379. package/src/domains/dispatch/budget-envelope.ts +86 -1
  380. package/src/domains/dispatch/capability-match.ts +11 -0
  381. package/src/domains/dispatch/capacity-lease.ts +17 -0
  382. package/src/domains/dispatch/contract.ts +11 -1
  383. package/src/domains/dispatch/extension.ts +237 -49
  384. package/src/domains/dispatch/host-verification.ts +435 -39
  385. package/src/domains/dispatch/intent-requirements.ts +10 -0
  386. package/src/domains/dispatch/intent.ts +18 -1
  387. package/src/domains/dispatch/path-scope.ts +235 -24
  388. package/src/domains/dispatch/run-event-journal.ts +4 -15
  389. package/src/domains/dispatch/state.ts +2 -3
  390. package/src/domains/dispatch/transport.ts +45 -21
  391. package/src/domains/dispatch/types.ts +58 -3
  392. package/src/domains/dispatch/worker-model-metadata.ts +38 -0
  393. package/src/domains/eval/artifacts/store.ts +5 -0
  394. package/src/domains/eval/metrics/call-ledger-stream.ts +34 -11
  395. package/src/domains/eval/metrics/token-stream.ts +201 -31
  396. package/src/domains/eval/metrics/tracked.ts +40 -4
  397. package/src/domains/eval/runners/clio-run.ts +5 -2
  398. package/src/domains/eval/schema/suite.ts +28 -0
  399. package/src/domains/eval/schema/verdict.ts +2 -2
  400. package/src/domains/eval/store.ts +8 -1
  401. package/src/domains/eval/suites/resolve.ts +13 -1
  402. package/src/domains/eval/suites/run.ts +24 -3
  403. package/src/domains/evidence/trust-status.ts +10 -1
  404. package/src/domains/extensions/contract.ts +15 -1
  405. package/src/domains/extensions/discovery.ts +238 -41
  406. package/src/domains/extensions/extension.ts +105 -6
  407. package/src/domains/extensions/index.ts +24 -0
  408. package/src/domains/extensions/integrity.ts +189 -0
  409. package/src/domains/extensions/manager.ts +17 -1
  410. package/src/domains/extensions/resource-path.ts +27 -0
  411. package/src/domains/extensions/resources.ts +18 -38
  412. package/src/domains/extensions/snapshot-store.ts +39 -0
  413. package/src/domains/extensions/snapshot.ts +180 -0
  414. package/src/domains/extensions/state.ts +385 -57
  415. package/src/domains/extensions/types.ts +118 -1
  416. package/src/domains/interop/registry.ts +6 -2
  417. package/src/domains/interop/types.ts +4 -0
  418. package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +27 -0
  419. package/src/domains/lifecycle/migrations/index.ts +6 -0
  420. package/src/domains/lifecycle/naming-resources.ts +19 -4
  421. package/src/domains/lifecycle/naming-yazi.ts +10 -5
  422. package/src/domains/memory/task-memory-policy.ts +70 -26
  423. package/src/domains/memory/task-memory-telemetry.ts +1 -0
  424. package/src/domains/middleware/contract.ts +26 -0
  425. package/src/domains/middleware/extension.ts +24 -24
  426. package/src/domains/middleware/hook-receipts.ts +27 -4
  427. package/src/domains/middleware/hooks-io.ts +65 -32
  428. package/src/domains/middleware/hooks.ts +64 -0
  429. package/src/domains/middleware/index.ts +28 -5
  430. package/src/domains/middleware/marketplace-offer.ts +3 -35
  431. package/src/domains/middleware/memory-intervention.ts +127 -32
  432. package/src/domains/middleware/memory-step-endpoint.ts +3 -2
  433. package/src/domains/middleware/registrations.ts +326 -0
  434. package/src/domains/middleware/runtime.ts +28 -0
  435. package/src/domains/middleware/skills-reminder.ts +31 -2
  436. package/src/domains/middleware/snapshot.ts +20 -7
  437. package/src/domains/mux/contract.ts +38 -0
  438. package/src/domains/mux/detect.ts +6 -13
  439. package/src/domains/mux/index.ts +1 -1
  440. package/src/domains/mux/operations.ts +44 -5
  441. package/src/domains/mux/yazi/assets/yazi.toml +2 -2
  442. package/src/domains/mux/yazi/session.ts +53 -4
  443. package/src/domains/mux/yazi/theme.ts +117 -17
  444. package/src/domains/observability/compaction-usage.ts +118 -0
  445. package/src/domains/observability/contract.ts +10 -11
  446. package/src/domains/observability/cost.ts +1 -1
  447. package/src/domains/observability/extension.ts +17 -4
  448. package/src/domains/observability/out-of-turn-usage.ts +52 -21
  449. package/src/domains/observability/projection.ts +14 -90
  450. package/src/domains/observability/trace-store.ts +43 -7
  451. package/src/domains/prompts/compiler.ts +73 -53
  452. package/src/domains/prompts/contract.ts +15 -3
  453. package/src/domains/prompts/extension.ts +97 -9
  454. package/src/domains/prompts/fragments/identity/clio-worker.md +1 -3
  455. package/src/domains/prompts/fragments/identity/clio.md +6 -12
  456. package/src/domains/prompts/fragments/identity/docs-routing.md +1 -2
  457. package/src/domains/prompts/fragments/identity/self-awareness.md +3 -11
  458. package/src/domains/prompts/fragments/operating/contract.md +7 -15
  459. package/src/domains/prompts/fragments/operating/delegation.md +32 -34
  460. package/src/domains/prompts/fragments/operating/skills.md +10 -24
  461. package/src/domains/prompts/fragments/operating/worker.md +1 -8
  462. package/src/domains/providers/contract.ts +4 -1
  463. package/src/domains/providers/extension.ts +40 -9
  464. package/src/domains/providers/index.ts +1 -1
  465. package/src/domains/providers/model-capabilities.ts +9 -0
  466. package/src/domains/providers/model-discovery.ts +2 -0
  467. package/src/domains/providers/model-runtime-capabilities.ts +99 -25
  468. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +699 -114
  469. package/src/domains/providers/runtime-resolution.ts +31 -0
  470. package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +225 -45
  471. package/src/domains/providers/runtimes/common/lmstudio-http.ts +6 -2
  472. package/src/domains/providers/runtimes/common/local-synth.ts +2 -0
  473. package/src/domains/providers/runtimes/common/probe-helpers.ts +7 -2
  474. package/src/domains/providers/runtimes/local-native/llamacpp.ts +9 -1
  475. package/src/domains/providers/runtimes/protocol/litellm.ts +119 -29
  476. package/src/domains/providers/support.ts +11 -5
  477. package/src/domains/providers/target-model-cache.ts +25 -2
  478. package/src/domains/providers/types/capability-flags.ts +2 -0
  479. package/src/domains/providers/types/cost-provenance.ts +19 -0
  480. package/src/domains/providers/types/local-model-quirks.ts +85 -37
  481. package/src/domains/providers/types/runtime-descriptor.ts +20 -1
  482. package/src/domains/providers/types/target-descriptor.ts +19 -0
  483. package/src/domains/resources/index.ts +3 -0
  484. package/src/domains/resources/skills/install.ts +72 -7
  485. package/src/domains/resources/skills/loader.ts +23 -19
  486. package/src/domains/resources/skills/marketplace.ts +63 -11
  487. package/src/domains/safety/autonomy.ts +15 -0
  488. package/src/domains/safety/call-target.ts +1 -1
  489. package/src/domains/safety/index.ts +1 -0
  490. package/src/domains/safety/loop-detector.ts +7 -4
  491. package/src/domains/safety/path-policy.ts +1 -1
  492. package/src/domains/safety/policy-engine.ts +34 -11
  493. package/src/domains/safety/protected-artifacts.ts +191 -88
  494. package/src/domains/safety/run-effects.ts +2 -22
  495. package/src/domains/safety/skill-authority.ts +55 -0
  496. package/src/domains/session/compaction/compact.ts +72 -22
  497. package/src/domains/session/entries.ts +6 -0
  498. package/src/domains/session/task-board.ts +10 -9
  499. package/src/domains/session/usage.ts +3 -3
  500. package/src/domains/share/archive.ts +164 -7
  501. package/src/engine/acp/server.ts +62 -9
  502. package/src/engine/agent.ts +13 -3
  503. package/src/engine/ai.ts +26 -8
  504. package/src/engine/antigravity/subprocess-runtime.ts +386 -120
  505. package/src/engine/api-registry.ts +3 -0
  506. package/src/engine/apis/llamacpp-residency.ts +3 -4
  507. package/src/engine/apis/lmstudio.ts +3 -3
  508. package/src/engine/apis/ollama-native.ts +6 -6
  509. package/src/engine/apis/openai-completions.ts +145 -39
  510. package/src/engine/apis/output-budget.ts +8 -18
  511. package/src/engine/apis/residency.ts +8 -27
  512. package/src/engine/external-subprocess.ts +114 -6
  513. package/src/engine/gemma-channel-filter.ts +19 -0
  514. package/src/engine/loop-guard.ts +92 -12
  515. package/src/engine/worker-runtime.ts +40 -11
  516. package/src/engine/worker-tools.ts +3 -1
  517. package/src/entry/background-model-metadata.ts +18 -0
  518. package/src/entry/compaction-prompt.ts +57 -0
  519. package/src/entry/extension-hook-sources.ts +28 -0
  520. package/src/entry/extension-reload.ts +309 -0
  521. package/src/entry/orchestrator.ts +464 -251
  522. package/src/entry/task-memory-lifecycle.ts +35 -0
  523. package/src/interactive/application-controller.ts +2 -1
  524. package/src/interactive/bus-notices.ts +8 -1
  525. package/src/interactive/chat-loop-messages.ts +16 -17
  526. package/src/interactive/chat-loop.ts +75 -3
  527. package/src/interactive/chat-panel.ts +36 -13
  528. package/src/interactive/chat-renderer.ts +72 -7
  529. package/src/interactive/cost-overlay.ts +26 -2
  530. package/src/interactive/dispatch-board.ts +6 -11
  531. package/src/interactive/footer/widgets.ts +13 -0
  532. package/src/interactive/interactive-application.ts +39 -4
  533. package/src/interactive/interactive-input-runtime.ts +4 -0
  534. package/src/interactive/interactive-presentation.ts +2 -2
  535. package/src/interactive/interactive-slash-runtime.ts +4 -1
  536. package/src/interactive/overlays/extensions.ts +9 -1
  537. package/src/interactive/overlays/help-reference.ts +13 -0
  538. package/src/interactive/overlays/settings.ts +27 -16
  539. package/src/interactive/panes-runtime.ts +111 -35
  540. package/src/interactive/prompt-cache-identity.ts +88 -0
  541. package/src/interactive/renderers/worker-entry.ts +32 -0
  542. package/src/interactive/slash-commands.ts +153 -20
  543. package/src/interactive/stream-pacing-policy.ts +0 -23
  544. package/src/interactive/theme/labels.ts +19 -13
  545. package/src/interactive/turn-context.ts +39 -20
  546. package/src/interactive/turn-recovery.ts +8 -0
  547. package/src/interactive/turn-runtime.ts +27 -11
  548. package/src/interactive/turn-state.ts +7 -0
  549. package/src/interactive/worker-receipts.ts +1 -0
  550. package/src/interactive/worker-stream.ts +6 -1
  551. package/src/interactive/yazi-bridge.ts +60 -6
  552. package/src/tools/agent-tools.ts +30 -1
  553. package/src/tools/artifact.ts +2 -2
  554. package/src/tools/ask-user.ts +3 -3
  555. package/src/tools/bash.ts +1 -1
  556. package/src/tools/bootstrap.ts +4 -0
  557. package/src/tools/builtin-tool-catalog.ts +52 -22
  558. package/src/tools/codewiki/code-nav-surface.ts +6 -0
  559. package/src/tools/codewiki/code-nav.ts +99 -13
  560. package/src/tools/context/docs-engine.ts +20 -7
  561. package/src/tools/context/index.ts +59 -21
  562. package/src/tools/core-bootstrap.ts +28 -6
  563. package/src/tools/credential-present.ts +1 -2
  564. package/src/tools/dispatch-arguments.ts +6 -1
  565. package/src/tools/dispatch-event-text.ts +10 -0
  566. package/src/tools/dispatch-plan.ts +49 -4
  567. package/src/tools/dispatch-run-events.ts +1 -1
  568. package/src/tools/dispatch-runner.ts +12 -0
  569. package/src/tools/dispatch-schema.ts +338 -0
  570. package/src/tools/dispatch-types.ts +3 -0
  571. package/src/tools/dispatch.ts +9 -254
  572. package/src/tools/ledger.ts +3 -5
  573. package/src/tools/monitor-surface.ts +5 -13
  574. package/src/tools/observation.ts +4 -5
  575. package/src/tools/panes-surface.ts +4 -11
  576. package/src/tools/panes.ts +4 -2
  577. package/src/tools/policy.ts +15 -2
  578. package/src/tools/read.ts +5 -6
  579. package/src/tools/registry.ts +41 -12
  580. package/src/tools/result-shaping.ts +18 -14
  581. package/src/tools/steer-surface.ts +1 -1
  582. package/src/tools/tasks.ts +1 -1
  583. package/src/tools/truncate.ts +6 -5
  584. package/src/tools/verify/surface.ts +6 -12
  585. package/src/tools/web-fetch-surface.ts +1 -3
  586. package/src/tools/worker-evidence.ts +3 -1
  587. package/src/worker/spec-contract.ts +4 -0
  588. package/dist/builtins-UJLMOVOV.js +0 -17
  589. package/dist/chunk-5QIAJV2D.js +0 -48
  590. package/dist/chunk-JZWT5J3Y.js +0 -814
  591. package/dist/chunk-K7VKOLQQ.js +0 -15
  592. package/dist/chunk-PMZCIOCJ.js +0 -25
  593. package/dist/chunk-SUW5DORT.js +0 -819
  594. package/dist/chunk-UOV2BYIW.js +0 -107
  595. package/dist/chunk-WR6U3OVP.js +0 -45
  596. package/dist/chunk-Y45G3AXC.js +0 -1558
  597. package/dist/reset-EOLM7GVE.js +0 -230
  598. package/dist/uninstall-N34PCTGJ.js +0 -331
  599. package/dist/upgrade-H7TOM7YL.js +0 -323
  600. package/docs/artifact-versions.md +0 -67
  601. package/docs/development-pipeline.md +0 -121
  602. package/docs/documentation-coverage.md +0 -46
  603. package/docs/documentation-guide.md +0 -167
  604. package/docs/time-conventions.md +0 -101
@@ -1,6 +1,8 @@
1
1
  import { existsSync, readFileSync } from "node:fs";
2
- import { join, normalize } from "node:path";
2
+ import { isAbsolute, join, normalize, relative, resolve } from "node:path";
3
+ import { resolvePackageRoot } from "../../core/package-root.js";
3
4
  import { ToolNames } from "../../core/tool-names.js";
5
+ import { parseCodewikiRaw } from "../../domains/context/codewiki/artifact.js";
4
6
  import type { Codewiki, CodewikiFile, CodewikiSymbol } from "../../domains/context/codewiki/schema.js";
5
7
  import { listWikiPages } from "../../domains/context/wiki/layout.js";
6
8
  import { readWikiMeta } from "../../domains/context/wiki/meta.js";
@@ -22,6 +24,14 @@ import {
22
24
  import { loadCodewikiForTool, renderJson } from "./shared.js";
23
25
 
24
26
  const REGEX_SYNTAX_HINTS = /\.\*|\.\+|\^|\$|\\[dDwWsSbB]|\(\?:|\(\?=|\(\?!/;
27
+ const CLIO_CODEWIKI_RELATIVE_PATH = join("dist", "assets", "codewiki.json");
28
+
29
+ type CodeNavSource = "workspace" | "clio";
30
+
31
+ interface LoadedNavSource {
32
+ codewiki: Codewiki;
33
+ entryRoot: string | null;
34
+ }
25
35
 
26
36
  interface NavIndex {
27
37
  filesById: Map<string, CodewikiFile>;
@@ -42,6 +52,62 @@ interface NavPayload {
42
52
  }
43
53
 
44
54
  const navIndexCache = new WeakMap<Codewiki, NavIndex>();
55
+ let clioCodewikiCache: { packageRoot: string; codewiki: Codewiki } | null = null;
56
+
57
+ function packageRootResolvedPath(packageRoot: string, indexedPath: string): string {
58
+ const resolved = resolve(packageRoot, indexedPath);
59
+ const rel = relative(packageRoot, resolved);
60
+ if (
61
+ rel.length === 0 ||
62
+ rel === ".." ||
63
+ rel.startsWith(`..${process.platform === "win32" ? "\\" : "/"}`) ||
64
+ isAbsolute(rel)
65
+ ) {
66
+ throw new Error(`invalid package-root-relative path in bundled code map: ${indexedPath}`);
67
+ }
68
+ return resolved;
69
+ }
70
+
71
+ function packageRootResolvedCodewiki(packageRoot: string, codewiki: Codewiki): Codewiki {
72
+ return {
73
+ ...codewiki,
74
+ files: codewiki.files.map((file) => ({
75
+ ...file,
76
+ path: packageRootResolvedPath(packageRoot, file.path),
77
+ })),
78
+ };
79
+ }
80
+
81
+ function loadClioCodewikiForTool(): { ok: true; loaded: LoadedNavSource } | { ok: false; message: string } {
82
+ try {
83
+ const packageRoot = resolvePackageRoot();
84
+ if (clioCodewikiCache?.packageRoot === packageRoot) {
85
+ return { ok: true, loaded: { codewiki: clioCodewikiCache.codewiki, entryRoot: packageRoot } };
86
+ }
87
+ const artifactPath = join(packageRoot, CLIO_CODEWIKI_RELATIVE_PATH);
88
+ const parsed = parseCodewikiRaw(readFileSync(artifactPath, "utf8"));
89
+ if (!parsed) throw new Error("bundled artifact is not a valid codewiki");
90
+ const codewiki = packageRootResolvedCodewiki(packageRoot, parsed);
91
+ clioCodewikiCache = { packageRoot, codewiki };
92
+ return { ok: true, loaded: { codewiki, entryRoot: packageRoot } };
93
+ } catch (err) {
94
+ const message = err instanceof Error ? err.message : String(err);
95
+ return {
96
+ ok: false,
97
+ message: `code_nav: bundled Clio code map unavailable at ${CLIO_CODEWIKI_RELATIVE_PATH}: ${message}`,
98
+ };
99
+ }
100
+ }
101
+
102
+ async function loadNavSource(
103
+ source: CodeNavSource,
104
+ ): Promise<{ ok: true; loaded: LoadedNavSource } | { ok: false; message: string }> {
105
+ if (source === "clio") return loadClioCodewikiForTool();
106
+ const loaded = await loadCodewikiForTool();
107
+ return loaded.ok
108
+ ? { ok: true, loaded: { codewiki: loaded.codewiki, entryRoot: null } }
109
+ : { ok: false, message: loaded.message };
110
+ }
45
111
 
46
112
  function regexFromPattern(pattern: string): RegExp | null {
47
113
  if (pattern.startsWith("/") && pattern.lastIndexOf("/") > 0) {
@@ -73,7 +139,7 @@ function regexFromPattern(pattern: string): RegExp | null {
73
139
  return null;
74
140
  }
75
141
 
76
- function readPackageEntryPaths(cwd: string): Set<string> {
142
+ function readPackageEntryPaths(cwd: string, resolveFromRoot: boolean): Set<string> {
77
143
  const out = new Set<string>();
78
144
  const pkgPath = join(cwd, "package.json");
79
145
  if (!existsSync(pkgPath)) return out;
@@ -85,11 +151,15 @@ function readPackageEntryPaths(cwd: string): Set<string> {
85
151
  }
86
152
  if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) return out;
87
153
  const pkg = parsed as Record<string, unknown>;
88
- if (typeof pkg.main === "string") out.add(normalizeEntryPath(pkg.main));
89
- if (typeof pkg.bin === "string") out.add(normalizeEntryPath(pkg.bin));
154
+ const add = (value: string): void => {
155
+ const normalized = normalizeEntryPath(value);
156
+ out.add(resolveFromRoot ? packageRootResolvedPath(cwd, normalized) : normalized);
157
+ };
158
+ if (typeof pkg.main === "string") add(pkg.main);
159
+ if (typeof pkg.bin === "string") add(pkg.bin);
90
160
  if (typeof pkg.bin === "object" && pkg.bin !== null && !Array.isArray(pkg.bin)) {
91
161
  for (const value of Object.values(pkg.bin)) {
92
- if (typeof value === "string") out.add(normalizeEntryPath(value));
162
+ if (typeof value === "string") add(value);
93
163
  }
94
164
  }
95
165
  return out;
@@ -243,9 +313,9 @@ function runPath(index: NavIndex, query: string, limit: number): NavPayload {
243
313
  };
244
314
  }
245
315
 
246
- function runEntries(index: NavIndex, limit: number): NavPayload {
247
- const cwd = process.cwd();
248
- const packageEntries = readPackageEntryPaths(cwd);
316
+ function runEntries(index: NavIndex, limit: number, entryRoot: string | null): NavPayload {
317
+ const cwd = entryRoot ?? process.cwd();
318
+ const packageEntries = readPackageEntryPaths(cwd, entryRoot !== null);
249
319
  const candidates = [...index.filesByPath.values()].filter(
250
320
  (file) => file.lang !== "config" && (file.role === "entry" || packageEntries.has(file.path)),
251
321
  );
@@ -488,10 +558,24 @@ function parseLimit(value: unknown, fallback: number): number {
488
558
  export const codeNavTool: ToolSpec = {
489
559
  ...codeNavToolSurface,
490
560
  async run(args, options): Promise<ToolResult> {
561
+ const rawSource = args.source;
562
+ if (rawSource !== undefined && rawSource !== "workspace" && rawSource !== "clio") {
563
+ return {
564
+ kind: "error",
565
+ message: `code_nav: source must be workspace or clio; got '${String(rawSource)}'`,
566
+ };
567
+ }
568
+ const source: CodeNavSource = rawSource === "clio" ? "clio" : "workspace";
491
569
  const mode = typeof args.mode === "string" ? args.mode : "";
492
- const loaded = await loadCodewikiForTool();
570
+ if (source === "clio" && mode === "wiki") {
571
+ return {
572
+ kind: "error",
573
+ message: "code_nav: source=clio does not provide mode=wiki; use context scope=docs for Clio documentation",
574
+ };
575
+ }
576
+ const loaded = await loadNavSource(source);
493
577
  if (!loaded.ok) return { kind: "error", message: loaded.message };
494
- const index = navIndexFor(loaded.codewiki);
578
+ const index = navIndexFor(loaded.loaded.codewiki);
495
579
  const query = typeof args.query === "string" ? args.query.trim() : "";
496
580
  const limit = parseLimit(args.limit, mode === "entries" ? DEFAULT_ENTRY_LIMIT : DEFAULT_LIMIT);
497
581
  const reservation = reserveObservation(OBSERVE_SELF_CAPS.codeNav, options);
@@ -506,15 +590,17 @@ export const codeNavTool: ToolSpec = {
506
590
  }
507
591
  const close = (nav: NavPayload | ToolResult): ToolResult => {
508
592
  if ("kind" in nav) return nav;
593
+ const next = source === "clio" && nav.next !== undefined ? `source=clio ${nav.next}` : nav.next;
594
+ const payload = next === nav.next ? nav.payload : { ...nav.payload, next };
509
595
  return finalizeObservation({
510
596
  tool: ToolNames.CodeNav,
511
597
  unit: "results",
512
598
  format: "json",
513
- output: renderJson(nav.payload),
599
+ output: renderJson(payload),
514
600
  shownCount: nav.shownCount,
515
601
  totalCount: nav.totalCount,
516
602
  truncated: nav.shownCount < nav.totalCount,
517
- ...(nav.next !== undefined ? { next: nav.next } : {}),
603
+ ...(next !== undefined ? { next } : {}),
518
604
  reservation,
519
605
  ...(options ? { options } : {}),
520
606
  });
@@ -527,7 +613,7 @@ export const codeNavTool: ToolSpec = {
527
613
  if (query.length === 0) return { kind: "error", message: "code_nav: mode=path requires query" };
528
614
  return close(runPath(index, query, limit));
529
615
  }
530
- if (mode === "entries") return close(runEntries(index, limit));
616
+ if (mode === "entries") return close(runEntries(index, limit, loaded.loaded.entryRoot));
531
617
  if (mode === "outline") {
532
618
  if (query.length === 0) return { kind: "error", message: "code_nav: mode=outline requires query path" };
533
619
  return close(runOutline(index, query, limit));
@@ -1,5 +1,5 @@
1
1
  import { existsSync, readdirSync, readFileSync } from "node:fs";
2
- import { basename, join, resolve } from "node:path";
2
+ import { basename, join, relative, resolve } from "node:path";
3
3
  import { resolvePackageRoot } from "../../core/package-root.js";
4
4
 
5
5
  // Deterministic, dependency-free retrieval over Clio's bundled human docs,
@@ -298,14 +298,27 @@ function indexSection(section: RawSection): IndexedSection {
298
298
 
299
299
  function candidateDocFiles(root: string): string[] {
300
300
  const docsDir = join(root, "docs");
301
+ const htmlDir = join(docsDir, "html");
301
302
  const files: string[] = [];
302
- try {
303
- for (const name of readdirSync(docsDir).sort((a, b) => a.localeCompare(b))) {
304
- if (name.toLowerCase().endsWith(".md")) files.push(join("docs", name));
303
+ const walk = (dir: string): void => {
304
+ let entries: import("node:fs").Dirent[];
305
+ try {
306
+ entries = readdirSync(dir, { withFileTypes: true });
307
+ } catch {
308
+ return;
305
309
  }
306
- } catch {
307
- // The caller reports a missing docs directory below if nothing can load.
308
- }
310
+ for (const entry of entries.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0))) {
311
+ const absolute = join(dir, entry.name);
312
+ if (entry.isDirectory()) {
313
+ if (absolute !== htmlDir) walk(absolute);
314
+ continue;
315
+ }
316
+ if (entry.isFile() && entry.name.toLowerCase().endsWith(".md")) {
317
+ files.push(relative(root, absolute).replaceAll("\\", "/"));
318
+ }
319
+ }
320
+ };
321
+ walk(docsDir);
309
322
  for (const name of ["README.md", "CHANGELOG.md", "CLIO-CODER.md"]) {
310
323
  if (existsSync(join(root, name))) files.push(name);
311
324
  }
@@ -181,20 +181,33 @@ function pendingSkillPolicyError(name: string, options: ToolInvokeOptions | unde
181
181
  if (!policy) {
182
182
  return NO_PENDING_SKILL_DENIAL;
183
183
  }
184
+ const recipeBound = policyIsRecipeBound(policy);
185
+ // auto-edit / full-auto: the operator already chose to let the model act
186
+ // without being asked, and a skill only ever narrows the tool surface, so
187
+ // the model activates an installed skill itself under the same per-run
188
+ // policy `/skill` produces. A skill that is not installed still fails the
189
+ // lookup below with the operator-gated marketplace message.
190
+ if (policy.modelActivation === true && !recipeBound) {
191
+ if (!policy.loadedSkillNames.has(name)) return null;
192
+ const window = policy.carriedSurface === true ? "in this session" : "this turn";
193
+ return `context: skill ${name} already loaded ${window}; continue with the loaded workflow and call ask_user if an interview/choice is needed.`;
194
+ }
184
195
  const allowed = [...new Set(policy.allowedSkillNames.map((entry) => entry.trim()).filter(Boolean))];
185
196
  if (allowed.length === 0) {
186
197
  return NO_PENDING_SKILL_DENIAL;
187
198
  }
188
- const recipeBound = policyIsRecipeBound(policy);
189
199
  if (!allowed.includes(name)) {
190
- return recipeBound
191
- ? `context: this agent run may load only its declared skill(s): ${allowed.join(", ")}.`
192
- : `context: this turn has pending skill request(s): ${allowed.join(", ")}. Load only those before doing anything else.`;
200
+ if (recipeBound) return `context: this agent run may load only its declared skill(s): ${allowed.join(", ")}.`;
201
+ // A carried surface is a skill the operator activated on an earlier
202
+ // turn, not a request waiting to be loaded now. Claiming a pending
203
+ // request here would invite a retry of a load nothing asked for.
204
+ if (policy.carriedSurface === true) return NO_PENDING_SKILL_DENIAL;
205
+ return `context: this turn has pending skill request(s): ${allowed.join(", ")}. Load only those before doing anything else.`;
193
206
  }
194
207
  if (policy.loadedSkillNames.has(name)) {
195
- return recipeBound
196
- ? `context: skill ${name} is already loaded in this run; continue with its workflow.`
197
- : `context: pending skill ${name} already loaded this turn; continue with the loaded workflow and call ask_user if an interview/choice is needed.`;
208
+ if (recipeBound) return `context: skill ${name} is already loaded in this run; continue with its workflow.`;
209
+ const window = policy.carriedSurface === true ? "in this session" : "this turn";
210
+ return `context: pending skill ${name} already loaded ${window}; continue with the loaded workflow and call ask_user if an interview/choice is needed.`;
198
211
  }
199
212
  return null;
200
213
  }
@@ -203,6 +216,23 @@ function pendingSkillRequestFor(name: string, options: ToolInvokeOptions | undef
203
216
  return options?.pendingSkillPolicy?.requests.find((request) => request.name === name) ?? null;
204
217
  }
205
218
 
219
+ /**
220
+ * A hidden skill is intentionally absent from model discovery, but
221
+ * `disable-model-invocation` still promises that the operator may activate it
222
+ * by hand. Slash-command and selector requests are the two authenticated
223
+ * interactive paths for that choice. Recipe and marketplace requests do not
224
+ * widen visibility: neither proves that the operator selected an installed
225
+ * manual-only skill for this turn.
226
+ */
227
+ function operatorRequestedManualSkill(skill: Skill, request: ReturnType<typeof pendingSkillRequestFor>): boolean {
228
+ return (
229
+ skill.trusted &&
230
+ skill.disableModelInvocation &&
231
+ request?.installed === true &&
232
+ (request.source === "slash-command" || request.source === "selector")
233
+ );
234
+ }
235
+
206
236
  function renderPendingSkillTask(name: string, options: ToolInvokeOptions | undefined): string[] {
207
237
  const request = pendingSkillRequestFor(name, options);
208
238
  if (!request) return [];
@@ -257,16 +287,18 @@ function renderSkillsList(
257
287
  skills: ReadonlyArray<Skill>,
258
288
  marketplace: ReadonlyArray<MarketplaceSkill>,
259
289
  marketplaceOffered: boolean,
290
+ modelActivation: boolean,
260
291
  ): string {
261
292
  if (skills.length === 0 && marketplace.length === 0) {
262
293
  // A registry that never offers the marketplace (a worker) must not
263
294
  // claim none is configured; it simply has nothing to list.
264
295
  return marketplaceOffered ? "No skills are installed and no marketplace is configured." : "No skills are installed.";
265
296
  }
266
- const lines = [
267
- "Available skills. Match the current task against the descriptions below: when one fits, suggest the operator run /skill <name>; when several compose, suggest the sequence in order. Skill bodies load only after an explicit operator request; never load one without it.",
268
- "",
269
- ];
297
+ // The header names the listing and nothing more. The reply protocol is
298
+ // stated once, as the recency anchor at the bottom, because that is the
299
+ // line literal models act on; a second copy up here cost every listing
300
+ // call the same sentences again.
301
+ const lines = ["Available skills.", ""];
270
302
  if (skills.length > 0) {
271
303
  lines.push("Installed:");
272
304
  for (const skill of skills) {
@@ -280,10 +312,7 @@ function renderSkillsList(
280
312
  // operator's /skill <name> prompts to install before it runs, so the
281
313
  // model's move is the same suggest-and-wait. Only the body is out of
282
314
  // reach until then, which is why the description is all that appears.
283
- lines.push(
284
- "",
285
- "Marketplace (not installed; /skill <name> offers to install, or `clio-coder skills install <name>`). Suggest these the same way when one matches; their bodies cannot be loaded until the operator installs them:",
286
- );
315
+ lines.push("", "Marketplace (not installed; /skill <name> offers to install):");
287
316
  for (const entry of marketplace) {
288
317
  const category = entry.category ? ` [${entry.category}]` : "";
289
318
  lines.push(`- ${entry.name}${category}: ${entry.description}`);
@@ -293,7 +322,9 @@ function renderSkillsList(
293
322
  // template where they skip conditional prose in the header.
294
323
  lines.push(
295
324
  "",
296
- `If one skill above matches the current task, begin your reply with the line \`${SKILL_SUGGESTION_ANCHOR}\` (a comma-separated sequence, in order, when several compose), then continue the task in the same turn without it; only the operator can run it. If none match, do not mention skills.`,
325
+ modelActivation
326
+ ? `If one skill above matches the current task, load it now with context(scope="skills", name="<name>") and continue in the same turn; at this autonomy level you activate installed skills yourself and do not wait for the operator. Marketplace rows below are not installed and still need the operator. If none match, do not mention skills.`
327
+ : `If one skill above matches the current task, begin your reply with the line \`${SKILL_SUGGESTION_ANCHOR}\` (a comma-separated sequence, in order, when several compose), then continue the task in the same turn without it; only the operator can run it. If none match, do not mention skills.`,
297
328
  );
298
329
  if (marketplace.length > 0) {
299
330
  // The offer protocol mirrors the marketplace-offer middleware: fixed
@@ -407,8 +438,13 @@ function runSkillsScope(
407
438
  if (name.length === 0) {
408
439
  const list = loadSkills({ cwd: cwdFromDeps(deps), ...(deps.getSkillLoaderOptions?.() ?? {}) });
409
440
  const visible = modelVisibleSkills(list.items);
410
- const marketplace = marketplaceRowsFor(deps, visible, options);
411
- const rendered = renderSkillsList(visible, marketplace, deps.skillMarketplace !== false);
441
+ const marketplace = marketplaceRowsFor(deps, list.items, options);
442
+ const rendered = renderSkillsList(
443
+ visible,
444
+ marketplace,
445
+ deps.skillMarketplace !== false,
446
+ options?.pendingSkillPolicy?.modelActivation === true,
447
+ );
412
448
  // The catalog is bounded but not small: the whole listing must fit the
413
449
  // per-call cap like any observation, and a cut list says so instead of
414
450
  // silently dropping the marketplace tail.
@@ -437,12 +473,15 @@ function runSkillsScope(
437
473
  if (policyError) return { kind: "error", message: policyError };
438
474
  const list = loadSkills({ cwd: cwdFromDeps(deps), ...(deps.getSkillLoaderOptions?.() ?? {}) });
439
475
  const visible = modelVisibleSkills(list.items);
440
- const skill = visible.find((item) => item.name === name);
476
+ const pendingRequest = pendingSkillRequestFor(name, options);
477
+ const skill =
478
+ visible.find((item) => item.name === name) ??
479
+ list.items.find((item) => item.name === name && operatorRequestedManualSkill(item, pendingRequest));
441
480
  if (!skill) {
442
481
  // A marketplace entry is a skill that exists and is not installed. Saying
443
482
  // "unknown skill" about it denies the operator a thing the listing just
444
483
  // offered; name the state and the one move that changes it.
445
- const installable = marketplaceRowsFor(deps, visible, options).some((entry) => entry.name === name);
484
+ const installable = marketplaceRowsFor(deps, list.items, options).some((entry) => entry.name === name);
446
485
  if (installable) {
447
486
  return {
448
487
  kind: "error",
@@ -455,7 +494,6 @@ function runSkillsScope(
455
494
  }
456
495
  const includeTree = args.include_tree === true;
457
496
  const tree = includeTree ? buildResourceTree(skill.baseDir, DEFAULT_TREE_ENTRIES) : null;
458
- const pendingRequest = pendingSkillRequestFor(name, options);
459
497
  const pendingTask = pendingRequest?.args.trim() ?? "";
460
498
  // Provenance: the activated content is compared against whatever recorded
461
499
  // hash can speak for it, the audited catalog's pinned manifest or the
@@ -38,6 +38,16 @@ export interface CoreToolBootstrapDeps {
38
38
  taskBoard?: TaskBoardStore;
39
39
  userTasks?: UserTasksStore;
40
40
  agentLedger?: AgentLedgerPort;
41
+ /**
42
+ * Register the ledger tool even without a port. A worker registry needs
43
+ * this: `attestedToolSignature` signs the names a bare worker registry
44
+ * produces, and the orchestrator admits `ledger` for every batch member,
45
+ * so a registry that dropped the tool for want of a port drifted the
46
+ * signature and admission refused every batch worker. The session never
47
+ * sets it: it has no peers, and the schema was 444 tokens of every first
48
+ * turn for a tool that could only answer "no ledger".
49
+ */
50
+ includeLedgerTools?: boolean;
41
51
  getSkillLoaderOptions?: () => Pick<
42
52
  LoadSkillsInput,
43
53
  "trustProjectCompatRoots" | "disableDiscovery" | "explicitSkillPaths"
@@ -49,6 +59,8 @@ export interface CoreToolRegistration {
49
59
  includeNetworkTools: boolean;
50
60
  includeSessionTools: boolean;
51
61
  includeInteractiveTools: boolean;
62
+ /** True only when a worker bound its dispatch's agent-ledger port; the session never does. */
63
+ includeLedgerTools: boolean;
52
64
  }
53
65
 
54
66
  export function registerCoreTools(registry: ToolRegistry, deps: CoreToolBootstrapDeps = {}): CoreToolRegistration {
@@ -154,12 +166,21 @@ export function registerCoreTools(registry: ToolRegistry, deps: CoreToolBootstra
154
166
  registry.register({
155
167
  ...builtin(createArtifactTool({ getCwd: skillToolDeps.getCwd }), { path: "src/tools/artifact.ts", scope: "core" }),
156
168
  });
157
- registry.register({
158
- ...builtin(createLedgerTool(deps.agentLedger ? { agentLedger: deps.agentLedger } : {}), {
159
- path: "src/tools/ledger.ts",
160
- scope: "core",
161
- }),
162
- });
169
+ // The coordination board exists only inside a dispatch: a worker process
170
+ // binds the port, the session never does, and without a port the tool can
171
+ // only answer "no ledger". Registering it on the session put its schema on
172
+ // every first turn, so the session registers it with a port or not at all;
173
+ // a worker registry asks for it explicitly, port or no port, because its
174
+ // attested surface must not depend on whether this run bound one.
175
+ const includeLedgerTools = deps.includeLedgerTools === true || deps.agentLedger !== undefined;
176
+ if (includeLedgerTools) {
177
+ registry.register({
178
+ ...builtin(createLedgerTool(deps.agentLedger ? { agentLedger: deps.agentLedger } : {}), {
179
+ path: "src/tools/ledger.ts",
180
+ scope: "core",
181
+ }),
182
+ });
183
+ }
163
184
  registry.register({
164
185
  ...builtin(
165
186
  createTasksTool({
@@ -177,6 +198,7 @@ export function registerCoreTools(registry: ToolRegistry, deps: CoreToolBootstra
177
198
  includeNetworkTools,
178
199
  includeSessionTools: Boolean(session),
179
200
  includeInteractiveTools: Boolean(deps.askUser),
201
+ includeLedgerTools,
180
202
  };
181
203
  }
182
204
 
@@ -92,8 +92,7 @@ export const credentialPresentTool: ToolSpec = {
92
92
  name: Type.String({ description: "Credential key name, e.g. OPENAI_API_KEY." }),
93
93
  source: Type.Optional(
94
94
  StringEnum(["auto", "environment", "env", "file"], {
95
- description:
96
- "auto checks the environment and the file when file is supplied; environment/env checks only the process environment; file checks only the file.",
95
+ description: "auto (default) checks the environment, then file when given; the others check one source.",
97
96
  }),
98
97
  ),
99
98
  file: Type.Optional(Type.String({ description: "Env-style file to check for NAME=, e.g. .env." })),
@@ -50,6 +50,7 @@ const AUTO_BASELINE_BY_TASK_TYPE: Readonly<Record<AgentTaskType, string>> = {
50
50
  // Read-only shapes.
51
51
  code_review: "verifier",
52
52
  research: "researcher",
53
+ world_knowledge: "world-knowledge",
53
54
  code_read: "scout",
54
55
  unknown: "scout",
55
56
  };
@@ -186,7 +187,11 @@ function dispatchRequestFromArgs(
186
187
  let rawIntent = args.intent;
187
188
  if (Object.hasOwn(args, "gate")) {
188
189
  if (typeof args.gate !== "string" || args.gate.trim().length === 0) {
189
- return { ok: false, message: "gate must be a non-empty declared check id" };
190
+ return {
191
+ ok: false,
192
+ message:
193
+ "gate must be a non-empty declared check id: a check verify() lists, never a shell command; omit gate and run the check yourself after the receipt",
194
+ };
190
195
  }
191
196
  rawIntent = { ...(isRecord(rawIntent) ? rawIntent : {}), verification: [{ check: args.gate.trim() }] };
192
197
  }
@@ -1,3 +1,4 @@
1
+ import { gatewayRoutingObservationFromRecord, gatewayRoutingObservationLabel } from "../core/gateway-routing.js";
1
2
  import { responseModelIdObservationFromRecord } from "../core/response-model-id.js";
2
3
  import { durableAssistantTextFromEvent } from "../domains/dispatch/event-pump.js";
3
4
  import type { RunReceipt } from "../domains/dispatch/types.js";
@@ -23,3 +24,12 @@ export function receiptResponseModelIdObservationLabel(receipt: Pick<RunReceipt,
23
24
  });
24
25
  return `response_model_id_observation=${labels.join(",")}`;
25
26
  }
27
+
28
+ /** Human projection of gateway routes carried by a receipt. */
29
+ export function receiptGatewayRoutingLabel(receipt: Pick<RunReceipt, "upstreamResponses">): string | null {
30
+ const observations = (receipt.upstreamResponses ?? [])
31
+ .map((response) => gatewayRoutingObservationFromRecord(response as unknown as Record<string, unknown>))
32
+ .filter((observation) => observation !== null);
33
+ if (observations.length === 0) return null;
34
+ return observations.map(gatewayRoutingObservationLabel).join(" | ");
35
+ }
@@ -103,7 +103,14 @@ export interface DispatchPlanView {
103
103
  /** True when this call requires plan approval at supervised autonomy levels. */
104
104
  planScale: boolean;
105
105
  tasks: DispatchPlanTaskView[];
106
- /** Rendered plan artifact, deterministic for identical arguments. */
106
+ /**
107
+ * Rendered plan artifact, deterministic for identical arguments against an
108
+ * unchanged working tree. The tree is an input because a legacy task's scope
109
+ * lines resolve a "../"-leading prose token by probing the dispatch root, so
110
+ * creating or deleting the probed file between two renders of the same call
111
+ * changes this text and the hash below. Nothing re-derives the hash to compare
112
+ * it; both renders of one call happen in the same synchronous admission pass.
113
+ */
107
114
  text: string;
108
115
  /** sha256 of the rendered artifact. */
109
116
  hash: string;
@@ -251,12 +258,24 @@ function safeField(value: string, bindChangedValue = true): string {
251
258
  return `${result}{sha256=${createHash("sha256").update(value, "utf8").digest("hex")}}`;
252
259
  }
253
260
 
254
- function renderLegacyPathScope(task: DispatchPlanTaskView): string[] {
261
+ /**
262
+ * The scope lines of the approval artifact, for a task with no typed intent.
263
+ *
264
+ * `cwd` is the dispatch's own working directory, not this process's: prose
265
+ * inference probes a "../"-leading token against the dispatch root, so a plan
266
+ * rendered against `process.cwd()` would show the operator a working context
267
+ * the run does not resolve whenever the call carries an explicit `cwd` (a
268
+ * worktree, most often). Passing it makes this render and admission read the
269
+ * same tree, which is also the sense in which the artifact is deterministic:
270
+ * identical arguments against an unchanged tree, not against any tree.
271
+ */
272
+ function renderLegacyPathScope(task: DispatchPlanTaskView, cwd: string | undefined): string[] {
255
273
  if (task.intent !== undefined) return [];
256
274
  const scope = resolveDispatchPathScope({
257
275
  agentId: task.agent,
258
276
  executionRole: task.executionRole,
259
277
  task: task.task,
278
+ ...(cwd !== undefined ? { cwd } : {}),
260
279
  ...(task.briefing !== undefined ? { briefing: task.briefing } : {}),
261
280
  });
262
281
  const lines = [" scope mode=legacy-inferred"];
@@ -275,6 +294,17 @@ function renderLegacyPathScope(task: DispatchPlanTaskView): string[] {
275
294
  if (scope.provenance.workingContextPaths.length === 0 && scope.provenance.writeBoundaries.length === 0) {
276
295
  lines.push(" scope policy_paths=none");
277
296
  }
297
+ // Named here as well as on the dispatch-time notice, because this artifact is
298
+ // the surface an operator approves: a token the run anchored somewhere the
299
+ // prose did not spell, or discarded outright, would otherwise be visible in
300
+ // the plan only as a scope line that has no counterpart in the task text.
301
+ for (const entry of scope.parentTokens) {
302
+ lines.push(
303
+ ` scope parent_token raw=${JSON.stringify(safeField(entry.token))} resolved=${
304
+ entry.resolved === null ? "dropped" : JSON.stringify(safeField(entry.resolved))
305
+ } source=${entry.source}`,
306
+ );
307
+ }
278
308
  return lines;
279
309
  }
280
310
 
@@ -365,6 +395,7 @@ function renderPlanText(
365
395
  source: DispatchPlanSource,
366
396
  maxWorkers: number | null,
367
397
  onFailure: ResolvedDispatchPlanArtifact["onFailure"],
398
+ cwd: string | undefined,
368
399
  confirmation?: ResolvedDispatchPlanArtifact["confirmation"],
369
400
  ): string {
370
401
  const lines = [
@@ -453,7 +484,7 @@ function renderPlanText(
453
484
  const serialized = JSON.stringify(task.intent);
454
485
  lines.push(` intent_sha256=${createHash("sha256").update(serialized, "utf8").digest("hex")}`);
455
486
  }
456
- lines.push(...renderLegacyPathScope(task));
487
+ lines.push(...renderLegacyPathScope(task, cwd));
457
488
  for (const check of task.resolvedVerification ?? []) {
458
489
  lines.push(
459
490
  ` verification check=${safeField(check.check)} argv=${JSON.stringify(check.argv)} cwd=${JSON.stringify(check.cwd)} timeout_ms=${check.timeoutMs}`,
@@ -606,6 +637,7 @@ const RESULT_CONTRACT_KINDS = new Set<ResultContract["kind"]>([
606
637
  "council-report",
607
638
  "debugger-report",
608
639
  "research-report",
640
+ "world-knowledge-report",
609
641
  "mutation-report",
610
642
  "provenance-report",
611
643
  "oracle-report",
@@ -887,7 +919,20 @@ export function describeDispatchPlan(rawArgs: Record<string, unknown> | undefine
887
919
  tasks.some((task) => task.failover === "approved") ||
888
920
  confirmation !== undefined ||
889
921
  isRecord(args.apply_winner));
890
- const text = renderPlanText(topology, tasks, costCeilingUsd, deadlineMs, source, maxWorkers, onFailure, confirmation);
922
+ const text = renderPlanText(
923
+ topology,
924
+ tasks,
925
+ costCeilingUsd,
926
+ deadlineMs,
927
+ source,
928
+ maxWorkers,
929
+ onFailure,
930
+ // Read off the whole call rather than a task view: `cwd` is one top-level
931
+ // dispatch argument, so it survives on both the freshly parsed path and
932
+ // the resolved-artifact path, where the sealed task shape carries no cwd.
933
+ str(args.cwd),
934
+ confirmation,
935
+ );
891
936
  return {
892
937
  topology,
893
938
  taskCount: Math.max(1, tasks.length),
@@ -102,7 +102,7 @@ export function runTailEntryFromEvent(event: unknown, at: string = new Date().to
102
102
  export interface DispatchRunEventRegistryOptions {
103
103
  /**
104
104
  * Durable tee for the display tail. Omitted takes the process-wide default
105
- * journal (settings-gated by `panes.journal`); `null` turns it off for this
105
+ * journal (settings-gated by `fleet.history.journal`); `null` turns it off for this
106
106
  * registry. This is the one wiring choke point: every registry in the
107
107
  * process is built by this factory, so the sink attaches here rather than at
108
108
  * each of the three construction sites that call it.
@@ -2153,6 +2153,18 @@ export async function runDispatchTool(
2153
2153
  if (options?.signal?.aborted) return { kind: "error", message: "dispatch: aborted" };
2154
2154
  const maxOutputBytes = snapshot.maxOutputBytes;
2155
2155
  const timeoutMs = snapshot.timeoutMs;
2156
+ // All modes, including derived Scout/review runs, share the invocation's
2157
+ // admission bounds. Keep these off the serializable approved request.
2158
+ const dispatch = deps.dispatch;
2159
+ const preparation = {
2160
+ ...(options?.signal === undefined ? {} : { signal: options.signal }),
2161
+ ...(timeoutMs === undefined ? {} : { deadlineAt: Date.now() + timeoutMs }),
2162
+ };
2163
+ deps.dispatch = {
2164
+ ...dispatch,
2165
+ dispatch: (request, observer) => dispatch.dispatch(request, observer, preparation),
2166
+ dispatchBatch: (requests) => dispatch.dispatchBatch(requests, preparation),
2167
+ };
2156
2168
  let review = snapshot.review === undefined ? undefined : structuredClone(snapshot.review);
2157
2169
  let council = snapshot.council === undefined ? undefined : structuredClone(snapshot.council);
2158
2170