elanous 0.2.9 → 0.2.11

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 (694) hide show
  1. package/apps/pwa/out/404/index.html +1 -1
  2. package/apps/pwa/out/404.html +1 -1
  3. package/apps/pwa/out/_next/static/Y4zKzL62sakG5momz3SoQ/_buildManifest.js +1 -0
  4. package/apps/pwa/out/_next/static/chunks/1159-0c5ef8bc21cb6afb.js +1 -0
  5. package/apps/pwa/out/_next/static/chunks/1394-556de6d71bbdb0fb.js +1 -0
  6. package/apps/pwa/out/_next/static/chunks/1452.93700483b9d4fc61.js +9 -0
  7. package/apps/pwa/out/_next/static/chunks/{6062-73e68343a9814f6a.js → 1829-b453a1b22d3999bb.js} +1 -1
  8. package/apps/pwa/out/_next/static/chunks/2176-c379e3ebce874151.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/2310-7a59f043f6db207e.js +1 -0
  10. package/apps/pwa/out/_next/static/chunks/2426.8c6ee0c668d53def.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/2548-6e316138d347cefe.js +1 -0
  12. package/apps/pwa/out/_next/static/chunks/3170-7ec60a56fa0e4728.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/3278-ae6ef084769f6195.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/3454-988a53dac60a1763.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/3638-aa80b4641ea439db.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/3735-fe3402553ac1c9c6.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/3869-a39d1d9921e10d43.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/390.c373e31b3b9d0c41.js +5 -0
  19. package/apps/pwa/out/_next/static/chunks/3992-2e522a8ac5f2afde.js +25 -0
  20. package/apps/pwa/out/_next/static/chunks/4215-c9d91dd644ec1719.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/4508-5d0161d1e724d735.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/4685-c3c1c625b71accd1.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/4733-623a79345b171e1c.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/4883.3bd969ea1d3aaaff.js +2 -0
  25. package/apps/pwa/out/_next/static/chunks/507-5acd98bd6dab2d8a.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/5445-745eb795c5963d79.js +1 -0
  27. package/apps/pwa/out/_next/static/chunks/5532.6899a12958a89b72.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/5845-e6c003ce8d5fd36a.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/5978-b27004c677119115.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/{8046cadf-211ca3c0e00f2b72.js → 5cd7e3a9-404fd6b8d0ecd44c.js} +1 -1
  31. package/apps/pwa/out/_next/static/chunks/6048-4c5c33579bc4ef78.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/6303-422dbf0f67c72aac.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/6751-bb3595948b2e311b.js +1 -0
  34. package/apps/pwa/out/_next/static/chunks/7274-19b7279f18b47ab3.js +1 -0
  35. package/apps/pwa/out/_next/static/chunks/{4323.c5dfb6f503304775.js → 7334.a6679d9168f37aa8.js} +1 -1
  36. package/apps/pwa/out/_next/static/chunks/7551-a0e0707b79164ddd.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/7777-79f845045aa1ed86.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/79f8be9e-957d68913b590b08.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/8025-cc24ee5d8f2fb6f8.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/8039-df92e08fede5de8f.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/8206-c6684dcde12be721.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/8421-1c4acfb1395a0edf.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/8605-ea5bee9dfae512c7.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/8725.bf46bb1395dd0fa2.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/8734-252d511cd276c0dc.js +1 -0
  46. package/apps/pwa/out/_next/static/chunks/8834-ca1cb09c1cb1a6bf.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/{2415.ed6428ff334c7ce2.js → 9269.d2a4795bc6812717.js} +1 -1
  48. package/apps/pwa/out/_next/static/chunks/9538-2816b90923606459.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/9656-c1540088f5859c80.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/9906-482c6619b3fdda20.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-d16993889b125c42.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/app/approvals/page-1dcdc58fc2de2454.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-6a061bd97f0b9398.js +1 -0
  54. package/apps/pwa/out/_next/static/chunks/app/board/page-cb95a7432c9ee744.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/app/botlab/{page-f972fc1c00a62e88.js → page-b12b6d2f8d2d1aea.js} +1 -1
  56. package/apps/pwa/out/_next/static/chunks/app/bots/page-b9efe868bfd36255.js +1 -0
  57. package/apps/pwa/out/_next/static/chunks/app/chat/page-7c97dcdfe2e37a60.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/app/consult/page-8fd36984f549270a.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/app/control/page-5721537ca8a3598c.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/app/design-check/page-b654240a572e4c48.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/app/editor/page-b9750abc897508c3.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/app/exec/page-4cd1de371f8ad048.js +1 -0
  63. package/apps/pwa/out/_next/static/chunks/app/field/page-d99f89657828421c.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/app/healthz/route-d16993889b125c42.js +1 -0
  65. package/apps/pwa/out/_next/static/chunks/app/inside/page-50cb2a0eb15e6c83.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/app/intake/page-c8b1ccda6ba7ae98.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/app/layout-d6b1d156fb95e74b.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/app/live/page-2a9932ddb62d76bd.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/app/market/page-9688f5b4f1ff950f.js +1 -0
  70. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-6b15dd6456c5df09.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/app/morning/{page-adfbd2ba9598e59a.js → page-35414e0a007b4082.js} +1 -1
  72. package/apps/pwa/out/_next/static/chunks/app/not-found-e7a529e0507ac86c.js +1 -0
  73. package/apps/pwa/out/_next/static/chunks/app/observatory/page-e001823c35c9dd67.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-371423d1a573d64b.js +1 -0
  75. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-4b764b125339ac17.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-cdf8e4b01067bcf1.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/app/outputs/page-3a24072b35470157.js +1 -0
  78. package/apps/pwa/out/_next/static/chunks/app/page-94c82eb0ae5abb32.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/app/reflection/page-0be8d4b2ced75ba0.js +1 -0
  80. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-d37cb0d52f9b6bd5.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/app/sessions/page-686da0df9bf23e5c.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-4dc614f3ce043e63.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/app/settings/page-53f80edc6b8dc07c.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-d02c782fc792e2af.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/app/setup/layout-d16993889b125c42.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/app/setup/page-239c17b911b84e72.js +1 -0
  87. package/apps/pwa/out/_next/static/chunks/app/share/page-dc6a79fb003f746c.js +1 -0
  88. package/apps/pwa/out/_next/static/chunks/app/showroom/page-0fffb84cafdc9da6.js +1 -0
  89. package/apps/pwa/out/_next/static/chunks/app/tasks/page-1218753c82d585f6.js +1 -0
  90. package/apps/pwa/out/_next/static/chunks/app/term/page-4b5935e67531efb5.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/app/today/page-3285bc87caf1eaa5.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/app/trace/page-ad553b0e06505ecd.js +1 -0
  93. package/apps/pwa/out/_next/static/chunks/app/vault/page-fca096e3e860306f.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-9ebfa78f0d9885c3.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/app/workflows/page-3dc5f21f7e39622d.js +1 -0
  96. package/apps/pwa/out/_next/static/chunks/app/workspace/page-c6da2b468454532d.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-93bc70e36f595414.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/{2ea96958-e8c7e112de50b067.js → f48170cc-d05d28bf87a43bf4.js} +1 -1
  99. package/apps/pwa/out/_next/static/chunks/framework-172630e6aa5e2d7f.js +1 -0
  100. package/apps/pwa/out/_next/static/chunks/main-app-f0fe2d7477845181.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/main-fc98ac70b44eccb0.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/pages/_app-5bd7f10271f72413.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/pages/_error-97d0d85ea05fef9b.js +1 -0
  104. package/apps/pwa/out/_next/static/chunks/webpack-9e4d02d567b98240.js +1 -0
  105. package/apps/pwa/out/_next/static/css/543f56bcb1f79fca.css +1 -0
  106. package/apps/pwa/out/approvals/index.html +1 -1
  107. package/apps/pwa/out/approvals/index.txt +23 -23
  108. package/apps/pwa/out/autopilot/index.html +1 -1
  109. package/apps/pwa/out/autopilot/index.txt +23 -23
  110. package/apps/pwa/out/board/index.html +1 -1
  111. package/apps/pwa/out/board/index.txt +23 -23
  112. package/apps/pwa/out/botlab/index.html +1 -1
  113. package/apps/pwa/out/botlab/index.txt +22 -22
  114. package/apps/pwa/out/bots/index.html +1 -1
  115. package/apps/pwa/out/bots/index.txt +22 -22
  116. package/apps/pwa/out/chat/index.html +1 -1
  117. package/apps/pwa/out/chat/index.txt +22 -22
  118. package/apps/pwa/out/consult/index.html +1 -1
  119. package/apps/pwa/out/consult/index.txt +23 -23
  120. package/apps/pwa/out/control/index.html +1 -1
  121. package/apps/pwa/out/control/index.txt +23 -23
  122. package/apps/pwa/out/design-check/index.html +1 -1
  123. package/apps/pwa/out/design-check/index.txt +23 -23
  124. package/apps/pwa/out/editor/index.html +1 -1
  125. package/apps/pwa/out/editor/index.txt +23 -23
  126. package/apps/pwa/out/exec/index.html +1 -1
  127. package/apps/pwa/out/exec/index.txt +23 -23
  128. package/apps/pwa/out/field/index.html +1 -1
  129. package/apps/pwa/out/field/index.txt +23 -23
  130. package/apps/pwa/out/healthz +1 -1
  131. package/apps/pwa/out/index.html +1 -1
  132. package/apps/pwa/out/index.txt +22 -22
  133. package/apps/pwa/out/inside/index.html +1 -0
  134. package/apps/pwa/out/inside/index.txt +31 -0
  135. package/apps/pwa/out/intake/index.html +1 -1
  136. package/apps/pwa/out/intake/index.txt +23 -23
  137. package/apps/pwa/out/live/index.html +1 -1
  138. package/apps/pwa/out/live/index.txt +23 -23
  139. package/apps/pwa/out/market/index.html +1 -1
  140. package/apps/pwa/out/market/index.txt +22 -22
  141. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  142. package/apps/pwa/out/missions/placeholder/index.txt +22 -22
  143. package/apps/pwa/out/morning/index.html +1 -1
  144. package/apps/pwa/out/morning/index.txt +23 -23
  145. package/apps/pwa/out/observatory/index.html +1 -1
  146. package/apps/pwa/out/observatory/index.txt +23 -23
  147. package/apps/pwa/out/ops/checklist/index.html +1 -1
  148. package/apps/pwa/out/ops/checklist/index.txt +22 -22
  149. package/apps/pwa/out/ops/release/index.html +1 -1
  150. package/apps/pwa/out/ops/release/index.txt +22 -22
  151. package/apps/pwa/out/ops/seats/index.html +1 -0
  152. package/apps/pwa/out/ops/seats/index.txt +30 -0
  153. package/apps/pwa/out/outputs/index.html +1 -0
  154. package/apps/pwa/out/outputs/index.txt +30 -0
  155. package/apps/pwa/out/reflection/index.html +1 -1
  156. package/apps/pwa/out/reflection/index.txt +23 -23
  157. package/apps/pwa/out/scheduler/index.html +1 -1
  158. package/apps/pwa/out/scheduler/index.txt +23 -23
  159. package/apps/pwa/out/sessions/index.html +1 -1
  160. package/apps/pwa/out/sessions/index.txt +22 -22
  161. package/apps/pwa/out/settings/devices/index.html +1 -1
  162. package/apps/pwa/out/settings/devices/index.txt +23 -23
  163. package/apps/pwa/out/settings/index.html +1 -1
  164. package/apps/pwa/out/settings/index.txt +23 -23
  165. package/apps/pwa/out/setup/done/index.html +1 -1
  166. package/apps/pwa/out/setup/done/index.txt +23 -23
  167. package/apps/pwa/out/setup/index.html +1 -1
  168. package/apps/pwa/out/setup/index.txt +23 -23
  169. package/apps/pwa/out/share/index.html +1 -1
  170. package/apps/pwa/out/share/index.txt +23 -23
  171. package/apps/pwa/out/showroom/index.html +1 -1
  172. package/apps/pwa/out/showroom/index.txt +22 -22
  173. package/apps/pwa/out/tasks/index.html +1 -1
  174. package/apps/pwa/out/tasks/index.txt +23 -23
  175. package/apps/pwa/out/term/index.html +1 -1
  176. package/apps/pwa/out/term/index.txt +23 -24
  177. package/apps/pwa/out/today/index.html +1 -0
  178. package/apps/pwa/out/today/index.txt +33 -0
  179. package/apps/pwa/out/trace/index.html +1 -1
  180. package/apps/pwa/out/trace/index.txt +23 -23
  181. package/apps/pwa/out/vault/index.html +1 -1
  182. package/apps/pwa/out/vault/index.txt +23 -23
  183. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  184. package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
  185. package/apps/pwa/out/workflows/index.html +1 -1
  186. package/apps/pwa/out/workflows/index.txt +23 -23
  187. package/apps/pwa/out/workspace/index.html +1 -1
  188. package/apps/pwa/out/workspace/index.txt +23 -24
  189. package/apps/pwa/out/worktrees/index.html +1 -1
  190. package/apps/pwa/out/worktrees/index.txt +23 -23
  191. package/graphs/drafts/draft-cleanup.yaml +19 -0
  192. package/graphs/drafts/recipes.yaml +23 -0
  193. package/graphs/field/field-feed.yaml +2 -0
  194. package/graphs/implement-loop.yaml +1 -1
  195. package/graphs/intake/intake-daily.yaml +2 -1
  196. package/graphs/ops/recipes.yaml +3 -0
  197. package/graphs/ops/secret-exposure.yaml +24 -0
  198. package/graphs/release/recipes.yaml +3 -0
  199. package/graphs/release/release-loop.yaml +4 -1
  200. package/graphs/video/explainer-line.yaml +2 -2
  201. package/package.json +2 -1
  202. package/plugins/card-followup/graphs/run-step.ts +48 -13
  203. package/plugins/doc-draft/graphs/doc-draft.yaml +3 -3
  204. package/plugins/doc-draft/graphs/run-step.ts +13 -6
  205. package/plugins/elanous-hwp/README.md +25 -0
  206. package/plugins/elanous-hwp/cli.ts +22 -0
  207. package/plugins/elanous-hwp/converter.ts +237 -0
  208. package/plugins/elanous-hwp/fixtures/fixed-controls.hwpx +0 -0
  209. package/plugins/elanous-hwp/fixtures/fixed-table-controls.hwpx +0 -0
  210. package/plugins/elanous-hwp/fixtures/fixed.hwpx +0 -0
  211. package/plugins/elanous-hwp/plugin.json +16 -0
  212. package/plugins/elanous-hwp/plugin.ts +40 -0
  213. package/scripts/ci-public-export-leak-gate.ts +75 -14
  214. package/scripts/ci-public-leak-gate.ts +44 -9
  215. package/scripts/ci-pwa-build-gate.ts +160 -0
  216. package/scripts/context-hooks/claude-stop.sh +4 -0
  217. package/scripts/context-hooks/emit.ts +24 -0
  218. package/scripts/context-hooks/post-tool-use.sh +4 -0
  219. package/scripts/coord-channel-watch.sh +54 -8
  220. package/scripts/coord-digest.ts +199 -0
  221. package/scripts/coord-post.sh +60 -3
  222. package/scripts/coord-requests-bridge.ts +143 -0
  223. package/scripts/field-feed/lib.ts +4 -0
  224. package/scripts/fleet/node-setup.sh +20 -3
  225. package/scripts/homebrew-formula-bump.ts +69 -0
  226. package/scripts/install.ps1 +68 -9
  227. package/scripts/install.sh +39 -12
  228. package/scripts/lib/pwa-scenarios/scenarios.ts +20 -0
  229. package/scripts/lib/tui-regress-checks.ts +146 -0
  230. package/scripts/marketing/measure-site-numbers.ts +169 -0
  231. package/scripts/measure-gate-shards.ts +309 -0
  232. package/scripts/memory-lifecycle-cycle.ts +2 -2
  233. package/scripts/mission-request-judge.ts +31 -1
  234. package/scripts/morning-report.ts +2 -2
  235. package/scripts/opportunity-scan.ts +1 -1
  236. package/scripts/ops-now-probe.ts +327 -0
  237. package/scripts/publish-internal-dist.ts +11 -1
  238. package/scripts/release-loop/auto-approve-node.ts +21 -4
  239. package/scripts/release-loop/cut-branch.ts +84 -0
  240. package/scripts/release-loop/cutoff.ts +19 -8
  241. package/scripts/release-loop/gate-node.ts +14 -13
  242. package/scripts/release-loop/mac-smoke-node.ts +229 -0
  243. package/scripts/release-loop/node-verdict.ts +3 -3
  244. package/scripts/release-loop/ops-upgrade-node.ts +72 -16
  245. package/scripts/release-loop/release-readiness.ts +9 -0
  246. package/scripts/release-loop/tui-node-checks.ts +42 -0
  247. package/scripts/release-loop/tui-sim-node.ts +32 -8
  248. package/scripts/release-loop/unattended-release.ts +5 -3
  249. package/scripts/release-loop/version-node.ts +112 -13
  250. package/scripts/repo-watch-cycle.ts +1 -1
  251. package/scripts/retro-cycle.ts +2 -2
  252. package/scripts/schedule-health-report.ts +1 -1
  253. package/scripts/signal-digest-cycle.ts +2 -7
  254. package/scripts/signal-digest-photo.ts +11 -0
  255. package/scripts/storyboard/storyboard.ts +5 -161
  256. package/scripts/tech1-public-measure.ts +94 -0
  257. package/scripts/test-diet/lib.ts +30 -1
  258. package/scripts/test-diet/node.ts +83 -8
  259. package/scripts/test-timeout-audit.ts +114 -0
  260. package/scripts/tree-sync-alert.ts +1 -1
  261. package/scripts/tui-regress.ts +71 -0
  262. package/scripts/ux/demo-rehearsal.ts +243 -0
  263. package/scripts/ux/lib/rehearsal-verdict.ts +73 -0
  264. package/scripts/waitlist-daily-digest.ts +1 -1
  265. package/skills/diagram-master/SKILL.md +366 -0
  266. package/skills/diagram-master/references/engines/excalidraw/color-palette.md +67 -0
  267. package/skills/diagram-master/references/engines/excalidraw/element-templates.md +182 -0
  268. package/skills/diagram-master/references/engines/excalidraw/json-schema.md +71 -0
  269. package/skills/diagram-master/references/engines/excalidraw/render_excalidraw.py +189 -0
  270. package/skills/diagram-master/references/engines/excalidraw/render_template.html +57 -0
  271. package/skills/diagram-master/references/engines/matplotlib/matplotlib-patterns.md +235 -0
  272. package/skills/diagram-master/references/engines/matplotlib/render_matplotlib.py +184 -0
  273. package/skills/diagram-master/references/engines/mermaid/domain-templates.md +435 -0
  274. package/skills/diagram-master/references/engines/mermaid/render_mermaid.py +116 -0
  275. package/skills/diagram-master/references/engines/mermaid/syntax-reference.md +2247 -0
  276. package/skills/diagram-master/references/engines/nanobannana/render_nanobannana2.py +168 -0
  277. package/skills/diagram-master/references/engines/svg/color-palette.md +188 -0
  278. package/skills/diagram-master/references/engines/svg/html-base-template.html +332 -0
  279. package/skills/diagram-master/references/engines/svg/interactivity-patterns.md +435 -0
  280. package/skills/diagram-master/references/engines/svg/render_interactive_svg.py +212 -0
  281. package/skills/diagram-master/references/engines/svg/svg-element-templates.md +349 -0
  282. package/skills/diagram-master/references/examples/README.md +69 -0
  283. package/skills/diagram-master/references/examples/ref_grid_architecture.png +0 -0
  284. package/skills/diagram-master/references/examples/ref_layered_flow.png +0 -0
  285. package/skills/diagram-master/references/pyproject.toml +16 -0
  286. package/skills/diagram-master/references/quality-checklist.md +33 -0
  287. package/skills/diagram-master/references/routing-guide.md +164 -0
  288. package/skills/diagram-master/references/uv.lock +1356 -0
  289. package/skills/explainer-video/SKILL.md +4 -0
  290. package/skills/explainer-video/engine/reel.mjs +18 -13
  291. package/skills/explainer-video/engine/reel.sh +24 -5
  292. package/skills/explainer-video/engine/stitch.mjs +145 -0
  293. package/skills/google-workspace/SKILL.md +33 -0
  294. package/skills/google-workspace/scripts/gws-safe.sh +177 -0
  295. package/skills/grill-me/SKILL.md +1 -1
  296. package/skills/lecture-note-digitizer/SKILL.md +926 -0
  297. package/skills/lecture-note-digitizer/references/convert_to_pdf.py +30 -0
  298. package/skills/lecture-note-digitizer/references/extract_slide_diagram.py +73 -0
  299. package/skills/lecture-note-digitizer/references/html-template.md +167 -0
  300. package/skills/lecture-note-digitizer/references/katex-style-guide.md +165 -0
  301. package/skills/omni-crawl/SKILL.md +21 -11
  302. package/skills/omni-crawl/scripts/main.ts +6 -6
  303. package/skills/omni-crawl/src/router.ts +3 -3
  304. package/skills/omni-digest/SKILL.md +17 -9
  305. package/skills/omni-digest/digest.md +2 -2
  306. package/skills/omni-digest/src/fetch.ts +30 -3
  307. package/skills/pitch-deck/SKILL.md +36 -0
  308. package/skills/pitch-deck/template.html +80 -0
  309. package/skills/youtube-master/SKILL.md +163 -0
  310. package/skills/youtube-master/package-lock.json +558 -0
  311. package/skills/youtube-master/package.json +13 -0
  312. package/skills/youtube-master/references/study-note-template.md +124 -0
  313. package/skills/youtube-master/scripts/main.ts +435 -0
  314. package/skills/youtube-master/scripts/transcribe-local.ts +24 -0
  315. package/skills/youtube-master/src/audio.ts +63 -0
  316. package/skills/youtube-master/src/domain-staging.ts +50 -0
  317. package/skills/youtube-master/src/env.ts +36 -0
  318. package/skills/youtube-master/src/obsidian.ts +155 -0
  319. package/skills/youtube-master/src/router.ts +110 -0
  320. package/skills/youtube-master/src/stt.ts +199 -0
  321. package/skills/youtube-master/src/study-note.ts +175 -0
  322. package/skills/youtube-master/src/summarize.ts +358 -0
  323. package/skills/youtube-master/src/transcript.ts +76 -0
  324. package/skills/youtube-master/src/types.ts +91 -0
  325. package/skills/youtube-master/src/util.ts +93 -0
  326. package/skills/youtube-master/src/youtube.ts +70 -0
  327. package/skills/youtube-master/tsconfig.json +13 -0
  328. package/src/acp/codex-approval-adapter.ts +9 -3
  329. package/src/acp/core-turn-bridge.ts +117 -18
  330. package/src/acp/fact-question.ts +11 -0
  331. package/src/acp/server.ts +53 -9
  332. package/src/acp/tool-approval.ts +126 -0
  333. package/src/acp/turn-runner.ts +36 -0
  334. package/src/agent/monad-agent-turn.ts +8 -0
  335. package/src/agent-mission/driver.ts +80 -10
  336. package/src/agent-mission/pty-decision.ts +71 -0
  337. package/src/agent-mission/review-loop.ts +30 -0
  338. package/src/ask-user-question/pending-questions.ts +25 -10
  339. package/src/ask-user-question/types.ts +9 -0
  340. package/src/auth/setup-link-tokens.ts +16 -5
  341. package/src/autopilot/build/integrity-gate.ts +12 -0
  342. package/src/autopilot/build/llm-conflict-merge.ts +16 -3
  343. package/src/autopilot/tool-registry.ts +2 -0
  344. package/src/boot/daemon-prompt-turn.ts +8 -0
  345. package/src/boot/daemon-runtime.ts +9 -3
  346. package/src/boot/daemon-tools/index.ts +8 -0
  347. package/src/boot/daemon-tools/types.ts +2 -0
  348. package/src/boot/daemon-tools/web-search.ts +4 -0
  349. package/src/card-followup/core.ts +109 -0
  350. package/src/chat/ctrl-c-in-input.ts +14 -0
  351. package/src/chat/index.ts +53 -0
  352. package/src/chat/pickers/state.ts +6 -2
  353. package/src/cli/agent-cli.ts +7 -0
  354. package/src/cli/decisions-cli.ts +25 -3
  355. package/src/cli/doctor-bundle-upload.ts +68 -0
  356. package/src/cli/doctor-cli.ts +38 -4
  357. package/src/cli/drive-input-jail.ts +101 -0
  358. package/src/cli/hooks-cli.ts +17 -3
  359. package/src/cli/make-cli.ts +43 -0
  360. package/src/cli/ops-cli.ts +20 -0
  361. package/src/cli/persona-cli.ts +90 -4
  362. package/src/cli/plugin-cli.ts +31 -22
  363. package/src/cli/pod-cli.ts +61 -2
  364. package/src/cli/pr-cli.ts +82 -17
  365. package/src/cli/pty-drive-cli.ts +41 -7
  366. package/src/cli/pty-drive-verdict.ts +40 -0
  367. package/src/cli/pwa-stop.ts +163 -13
  368. package/src/cli/pwa-test.ts +3 -0
  369. package/src/cli/release-cli.ts +80 -24
  370. package/src/cli/self-update.ts +14 -0
  371. package/src/cli/setup-cli.ts +43 -1
  372. package/src/cli/skills-cli.ts +17 -1
  373. package/src/cli/storyboard-cli.ts +37 -0
  374. package/src/cli/test-state-dir-flag.ts +11 -4
  375. package/src/connectors/linear.ts +146 -0
  376. package/src/context-bus/claude-hooks-install.ts +10 -0
  377. package/src/context-bus/context-now-surfaces.ts +48 -0
  378. package/src/context-bus/context-now.ts +104 -0
  379. package/src/context-bus/coord-events.ts +115 -0
  380. package/src/context-bus/external-events.ts +52 -0
  381. package/src/context-bus/long-term-memory.ts +108 -0
  382. package/src/dashboard/dashboard-boot-fixture.ts +23 -0
  383. package/src/dashboard/index.ts +63 -21
  384. package/src/dashboard/slash-runtime/dashboard-handlers.ts +14 -1
  385. package/src/dashboard/slash-runtime/help-from-registry.ts +43 -28
  386. package/src/decisions/decision-cards.ts +58 -3
  387. package/src/decisions/decision-ledger.ts +85 -6
  388. package/src/decisions/decision-linear-projection.ts +157 -0
  389. package/src/decisions/web-push-decision-cards.ts +50 -0
  390. package/src/directive/interpretation-card.ts +36 -0
  391. package/src/discord/sprint21-runtime.ts +5 -1
  392. package/src/discord-self-message.ts +32 -0
  393. package/src/discord-slash-wire.ts +5 -1
  394. package/src/discord.ts +19 -2
  395. package/src/domains/coo-admin-tool.ts +62 -0
  396. package/src/domains/core-tools.ts +13 -4
  397. package/src/domains/elanous-card.ts +29 -0
  398. package/src/domains/ops-facts-tool.ts +76 -0
  399. package/src/domains/outbound-alert.ts +46 -13
  400. package/src/domains/release-tool.ts +168 -0
  401. package/src/domains/telegram-kind-route.ts +65 -9
  402. package/src/exec-requests/default-outputs.ts +25 -0
  403. package/src/exec-requests/planner.ts +106 -28
  404. package/src/exec-requests/runner.ts +123 -12
  405. package/src/exec-requests/store.ts +11 -2
  406. package/src/execution-loop/launch-gate.ts +100 -0
  407. package/src/field/field-media.ts +10 -7
  408. package/src/field/field-reel.ts +19 -5
  409. package/src/field-note/index.ts +201 -0
  410. package/src/field-note/transcribe.ts +248 -0
  411. package/src/git-fs/worktree.ts +45 -6
  412. package/src/graph-kinds/registry.ts +3 -3
  413. package/src/graph-runner/graph-approval-card.ts +113 -0
  414. package/src/graph-runner/graph-cli.ts +189 -4
  415. package/src/graph-runner/graph-grow-llm.ts +37 -0
  416. package/src/graph-runner/graph-grow.ts +47 -0
  417. package/src/graph-runner/graph-notify.ts +25 -3
  418. package/src/graph-runner/runner.ts +453 -35
  419. package/src/grok/agent-search.ts +8 -2
  420. package/src/guardian/secret-exposure-scan.ts +101 -0
  421. package/src/harness/browser-verify.ts +25 -2
  422. package/src/harness/harness-cli-command.ts +478 -42
  423. package/src/harness/harness-incidents-writer.fixture.ts +24 -0
  424. package/src/harness/harness-incidents.ts +129 -0
  425. package/src/harness/harness-pod-dispatch.ts +43 -23
  426. package/src/harness/harness-seams.ts +38 -4
  427. package/src/harness/harness-stop.ts +75 -6
  428. package/src/harness/launch-registry.ts +91 -0
  429. package/src/harness/process-garbage.ts +5 -3
  430. package/src/hitl/clarification-policy.ts +3 -1
  431. package/src/hooks/dispatch.ts +82 -0
  432. package/src/hooks/expose.ts +254 -0
  433. package/src/hooks/github-shadow.ts +108 -0
  434. package/src/hooks/providers.ts +71 -5
  435. package/src/hooks/queue.ts +1 -1
  436. package/src/hooks/receiver.ts +21 -20
  437. package/src/index.ts +206 -49
  438. package/src/intake-plane/author-goals.ts +37 -4
  439. package/src/intake-plane/categorize.ts +18 -46
  440. package/src/intake-plane/check.ts +3 -0
  441. package/src/intake-plane/discord-seat-work.ts +57 -2
  442. package/src/intake-plane/front-route-classifier.ts +33 -39
  443. package/src/intake-plane/persona-answer.ts +30 -0
  444. package/src/intake-plane/runtime-callables.ts +8 -1
  445. package/src/intake-plane/seat-doc-route.ts +170 -6
  446. package/src/intake-plane/telegram-seat-work.ts +80 -4
  447. package/src/intake-plane/telegram-work.ts +1 -0
  448. package/src/intake-plane/wish-folder.ts +67 -0
  449. package/src/intent-gate/gate.ts +30 -10
  450. package/src/live/detail-switch.ts +5 -0
  451. package/src/llm/difficulty.ts +57 -0
  452. package/src/llm/judge-layer.ts +101 -0
  453. package/src/llm/mission-router.ts +33 -19
  454. package/src/loops/contract/examples/cmo-seat.loop.yaml +51 -0
  455. package/src/loops/contract/examples/orchestrator.loop.yaml +57 -0
  456. package/src/loops/contract/examples/steward.loop.yaml +50 -0
  457. package/src/loops/contract/loop-agent.schema.json +138 -0
  458. package/src/loops/contract/validate.ts +64 -0
  459. package/src/loops/registry.ts +20 -6
  460. package/src/market/signed-index.ts +4 -0
  461. package/src/maturity/bot-command-maturity.ts +45 -0
  462. package/src/maturity/cli-maturity.ts +34 -0
  463. package/src/maturity/feature-maturity.ts +120 -1
  464. package/src/maturity/tui-slash-maturity.ts +31 -0
  465. package/src/memory.ts +32 -4
  466. package/src/model-tier/index.ts +2 -2
  467. package/src/model-tier/tier-resolver.ts +20 -20
  468. package/src/model-tier/types.ts +6 -6
  469. package/src/mss/logging/log-store.ts +15 -0
  470. package/src/nexus/api/config-model-tier.ts +5 -4
  471. package/src/nexus/api/exec-requests.ts +33 -3
  472. package/src/nexus/api/fabric-plans.ts +53 -0
  473. package/src/nexus/api/harness-api.ts +5 -1
  474. package/src/nexus/api/health.ts +2 -0
  475. package/src/nexus/api/http-server.ts +89 -1
  476. package/src/nexus/api/inside-events.ts +226 -0
  477. package/src/nexus/api/meta-api.ts +32 -8
  478. package/src/nexus/api/missions.ts +6 -1
  479. package/src/nexus/api/ops-api.ts +10 -1
  480. package/src/nexus/api/ops-seats-sources.ts +37 -7
  481. package/src/nexus/api/ops-seats.ts +49 -6
  482. package/src/nexus/api/outputs-route.ts +44 -0
  483. package/src/nexus/api/seat-requests.ts +132 -10
  484. package/src/nexus/api/sessions-store.ts +42 -0
  485. package/src/nexus/api/setup-codex-login.ts +160 -0
  486. package/src/nexus/api/sub-seat-charters.ts +34 -0
  487. package/src/nexus/api/tabs-mutations.ts +3 -1
  488. package/src/nexus/api/trace.ts +18 -6
  489. package/src/nexus/api/usage-api.ts +102 -0
  490. package/src/nexus/api/workflow-run-event-bridge.ts +1 -0
  491. package/src/nexus/api/workflows.ts +80 -6
  492. package/src/nexus/index.ts +47 -4
  493. package/src/nexus/kinds/webterm.ts +2 -1
  494. package/src/nexus/webterm/pty.ts +6 -2
  495. package/src/onboarding/cli-auth-status.ts +80 -0
  496. package/src/onboarding/first-run.ts +89 -0
  497. package/src/onboarding/lan-address.ts +45 -0
  498. package/src/onboarding/voice-ai.ts +3 -3
  499. package/src/onboarding/web-first.ts +119 -24
  500. package/src/onboarding.ts +4 -0
  501. package/src/ops-now/ops-now-refresh.ts +100 -0
  502. package/src/org/seat-budget.ts +48 -0
  503. package/src/org/stall-escalation.ts +63 -0
  504. package/src/outputs/ledger.ts +120 -0
  505. package/src/persona/persona-todo.ts +79 -0
  506. package/src/persona/presets.ts +116 -2
  507. package/src/persona/team-set.ts +155 -0
  508. package/src/plugins/install/plugin-install.ts +14 -0
  509. package/src/plugins/maker/market-bundle.ts +109 -0
  510. package/src/plugins/maker/plugin-maker.ts +254 -11
  511. package/src/plugins/maker/wizard-generate.ts +103 -0
  512. package/src/pod-lease/admission.ts +150 -0
  513. package/src/pod-lease/dependency-state.ts +85 -0
  514. package/src/pod-lease/host-lease.ts +127 -0
  515. package/src/project/project-store.ts +115 -0
  516. package/src/project/project-suggestion.ts +16 -0
  517. package/src/project/session-context.ts +24 -0
  518. package/src/release-loop/checklist.ts +79 -5
  519. package/src/release-loop/feature-store.ts +159 -24
  520. package/src/release-loop/next-md-merge.ts +58 -0
  521. package/src/release-loop/release-note.ts +59 -4
  522. package/src/release-loop/release-schedule.ts +53 -0
  523. package/src/repl/index.ts +7 -0
  524. package/src/seat-dispatch/ceo-commands.ts +41 -8
  525. package/src/seat-dispatch/ceo-intent.ts +38 -0
  526. package/src/seat-dispatch/seat-ask.ts +130 -0
  527. package/src/seat-dispatch/seat-questions.ts +100 -0
  528. package/src/seat-loop/seat-loop.ts +750 -0
  529. package/src/seat-loop/seat-report.ts +99 -0
  530. package/src/self-dev/decompose.ts +66 -11
  531. package/src/self-dev/dev-cli.ts +4 -1
  532. package/src/self-dev/dev-pipeline.ts +37 -1
  533. package/src/self-dev/draft-sweep.ts +38 -33
  534. package/src/self-dev/draft-triage-rules.ts +8 -5
  535. package/src/self-dev/fabric-plan-core.ts +297 -0
  536. package/src/self-dev/orchestrate.ts +36 -4
  537. package/src/self-dev/release-path-guard.ts +62 -0
  538. package/src/self-dev/run-store.ts +10 -1
  539. package/src/self-dev/shard-aggregate.ts +230 -0
  540. package/src/self-dev/shard-placement.ts +60 -0
  541. package/src/self-dev/shard-plan.ts +48 -0
  542. package/src/self-dev/shard-pod-run.ts +77 -0
  543. package/src/self-dev/shard-run.ts +105 -0
  544. package/src/self-implement/execution-clarification.ts +115 -0
  545. package/src/self-implement/gate-baseline.ts +1 -1
  546. package/src/self-implement/gate-cli.ts +46 -4
  547. package/src/self-implement/gate-scope.ts +37 -7
  548. package/src/self-implement/graph-variant.ts +171 -0
  549. package/src/self-implement/harness-policy-gates.ts +1 -1
  550. package/src/self-implement/headless-elanous-driver.ts +22 -3
  551. package/src/self-implement/host-regate.ts +22 -1
  552. package/src/self-implement/importer-test-index.ts +2 -1
  553. package/src/self-implement/l8-merge-queue.ts +130 -0
  554. package/src/self-implement/orchestrator.ts +279 -12
  555. package/src/self-implement/pipeline-shape.ts +1 -1
  556. package/src/self-implement/route-consumer-test-index.ts +122 -0
  557. package/src/self-implement/run-status-mapping.ts +5 -3
  558. package/src/self-implement/seams.ts +72 -11
  559. package/src/self-implement/test-seams.ts +1 -0
  560. package/src/self-implement/uncommitted-work.ts +59 -0
  561. package/src/session/chat.ts +2 -0
  562. package/src/session/index.ts +45 -13
  563. package/src/shell-env-bootstrap.ts +17 -0
  564. package/src/skills/gift-install.ts +215 -0
  565. package/src/skills/tools/web-search.ts +4 -1
  566. package/src/steward/directive.ts +51 -2
  567. package/src/steward/launch.ts +266 -0
  568. package/src/steward/outcome-notify.ts +115 -0
  569. package/src/steward/steward-cards.ts +25 -11
  570. package/src/steward/triage-plan.ts +32 -4
  571. package/src/steward/triage.ts +129 -13
  572. package/src/steward/working-backwards.ts +64 -0
  573. package/src/storyboard/storyboard.ts +141 -0
  574. package/src/task-cards/card-cli.ts +25 -1
  575. package/src/task-cards/card-store.ts +2 -2
  576. package/src/task-orchestrator/mission.ts +5 -0
  577. package/src/task-orchestrator/store.ts +12 -3
  578. package/src/task-orchestrator/surfaces/pod-command-job.ts +29 -7
  579. package/src/task-orchestrator/surfaces/pod-lease.ts +397 -0
  580. package/src/task-orchestrator/surfaces/pod-pool.ts +127 -26
  581. package/src/task-orchestrator/surfaces/self-implement-pod.ts +214 -40
  582. package/src/task-orchestrator/surfaces/self-implement.ts +15 -2
  583. package/src/task-orchestrator/types.ts +2 -0
  584. package/src/telegram-card-followup.ts +153 -0
  585. package/src/telegram-commands.ts +10 -1
  586. package/src/telegram-project-command.ts +71 -0
  587. package/src/telegram-report.ts +29 -19
  588. package/src/telegram-run.ts +7 -0
  589. package/src/telegram.ts +58 -11
  590. package/src/tool-runtime/self-cognition-runtimes.ts +13 -3
  591. package/src/tool-runtime/types.ts +4 -0
  592. package/src/tui-client/dashboard-session.ts +2 -0
  593. package/src/user-config.ts +216 -27
  594. package/src/version/packed-revision.json +1 -1
  595. package/src/web-push/notify-exec-request.ts +32 -0
  596. package/src/web-search/grok.ts +7 -1
  597. package/src/web-search/index.ts +28 -1
  598. package/src/web-search/provider.ts +4 -0
  599. package/src/web-search/x-intent.ts +5 -0
  600. package/src/workflow-runtime/executor.ts +277 -47
  601. package/src/workflow-runtime/index.ts +1 -0
  602. package/src/workflow-runtime/nodes/subworkflow.ts +60 -0
  603. package/src/workflow-runtime/plugin-kind-node.ts +1 -1
  604. package/src/workflow-runtime/schema.ts +79 -4
  605. package/src/workflow-runtime/types.ts +35 -4
  606. package/apps/pwa/out/_next/static/bFI5EEwg7T6aG88ibX4Zq/_buildManifest.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/1105-c473ed46272fba79.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/1201-09613bce624467c0.js +0 -1
  609. package/apps/pwa/out/_next/static/chunks/1377-1efeffbbac0963ff.js +0 -1
  610. package/apps/pwa/out/_next/static/chunks/1470.98a6ab61ccb4131c.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/216-5acd01cbde4acda7.js +0 -1
  612. package/apps/pwa/out/_next/static/chunks/2330-c2f07246c8788af1.js +0 -1
  613. package/apps/pwa/out/_next/static/chunks/2375-cb6debea56cce4fb.js +0 -1
  614. package/apps/pwa/out/_next/static/chunks/2929-617f1e66a55be184.js +0 -1
  615. package/apps/pwa/out/_next/static/chunks/2977-e38442e86289f1d3.js +0 -1
  616. package/apps/pwa/out/_next/static/chunks/2982-2a2df543be3d2e5a.js +0 -25
  617. package/apps/pwa/out/_next/static/chunks/3403.4bc97b4066945a94.js +0 -5
  618. package/apps/pwa/out/_next/static/chunks/3441-a1dd4acfeda14488.js +0 -1
  619. package/apps/pwa/out/_next/static/chunks/371-4ad6af55dad02ced.js +0 -1
  620. package/apps/pwa/out/_next/static/chunks/4114-3e63117452378807.js +0 -1
  621. package/apps/pwa/out/_next/static/chunks/5080-1613752891fcadb4.js +0 -10
  622. package/apps/pwa/out/_next/static/chunks/5609-012bb3557211f07e.js +0 -1
  623. package/apps/pwa/out/_next/static/chunks/5791-bb82743fa6299562.js +0 -1
  624. package/apps/pwa/out/_next/static/chunks/6090-85a3f05f954e5697.js +0 -1
  625. package/apps/pwa/out/_next/static/chunks/6284-69db415193d5f8bd.js +0 -1
  626. package/apps/pwa/out/_next/static/chunks/6320-baac91d68843a9a6.js +0 -1
  627. package/apps/pwa/out/_next/static/chunks/6416-505ba707cacafbba.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/6725-68ab7cc0b1faf00d.js +0 -1
  629. package/apps/pwa/out/_next/static/chunks/6998-a654fe5c58271600.js +0 -1
  630. package/apps/pwa/out/_next/static/chunks/7032-f4ef698518fba61c.js +0 -1
  631. package/apps/pwa/out/_next/static/chunks/7647.2fcd30d894d5ee30.js +0 -1
  632. package/apps/pwa/out/_next/static/chunks/7673-2eda1507d38dadb8.js +0 -1
  633. package/apps/pwa/out/_next/static/chunks/7990-e12efba616f46e03.js +0 -1
  634. package/apps/pwa/out/_next/static/chunks/8067-d976b441a104ab74.js +0 -1
  635. package/apps/pwa/out/_next/static/chunks/8142-744998d65d7bb17e.js +0 -1
  636. package/apps/pwa/out/_next/static/chunks/8519-5632377cce994f86.js +0 -1
  637. package/apps/pwa/out/_next/static/chunks/8619-4365e03a2862830f.js +0 -1
  638. package/apps/pwa/out/_next/static/chunks/8630-cdfc61e82c653ffc.js +0 -1
  639. package/apps/pwa/out/_next/static/chunks/8894-e263b332208e3957.js +0 -1
  640. package/apps/pwa/out/_next/static/chunks/920-f7dceb78f1c585ef.js +0 -1
  641. package/apps/pwa/out/_next/static/chunks/9454-139040d37c79dbc9.js +0 -1
  642. package/apps/pwa/out/_next/static/chunks/9651-3cd291a6fa1370d2.js +0 -1
  643. package/apps/pwa/out/_next/static/chunks/9740-8f5ff96c522b5f55.js +0 -1
  644. package/apps/pwa/out/_next/static/chunks/ae787e4c-f2998de7f1ba72a4.js +0 -1
  645. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-859cea1570b6227a.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/app/approvals/page-fb7c2d458f32fcad.js +0 -1
  647. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-35e2713597dd24d1.js +0 -1
  648. package/apps/pwa/out/_next/static/chunks/app/board/page-918b656f064577ba.js +0 -1
  649. package/apps/pwa/out/_next/static/chunks/app/bots/page-5f30e00693527ebd.js +0 -1
  650. package/apps/pwa/out/_next/static/chunks/app/chat/page-7fbae173b3c103a7.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/app/consult/page-3b4edcce364062ea.js +0 -1
  652. package/apps/pwa/out/_next/static/chunks/app/control/page-c5794f484c251f44.js +0 -1
  653. package/apps/pwa/out/_next/static/chunks/app/design-check/page-1130d8eefcd87e76.js +0 -1
  654. package/apps/pwa/out/_next/static/chunks/app/editor/page-973996d584f008c1.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/app/exec/page-016e2bda04eecb1f.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/app/field/page-b4d6d9a3b56f2940.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/app/healthz/route-859cea1570b6227a.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/app/intake/page-ec49a466121233ba.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/app/layout-f72db356744ceade.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/app/live/page-a6fd9b50d1b85378.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/app/market/page-8b0402a46a749a3d.js +0 -1
  662. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-037f83e2a1edc8e2.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/app/not-found-46fedff57d4bec67.js +0 -1
  664. package/apps/pwa/out/_next/static/chunks/app/observatory/page-0cf318e9dcee2bbf.js +0 -1
  665. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-899b327cb8b6845c.js +0 -1
  666. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-6c1e6ba743a29dfe.js +0 -1
  667. package/apps/pwa/out/_next/static/chunks/app/page-1a8e4807292f6b17.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/app/reflection/page-28deba6bcb834916.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-de68e2205794037d.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/app/sessions/page-c71c33a573230672.js +0 -1
  671. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-0df30e0c7e50148a.js +0 -1
  672. package/apps/pwa/out/_next/static/chunks/app/settings/page-4fc56790fe0d2682.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-59df2aebb38a7c1e.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/app/setup/layout-859cea1570b6227a.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/app/setup/page-4647be5dbcbd0795.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/app/share/page-e025892bda74b743.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/app/showroom/page-a0955de73b89f078.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/app/tasks/page-369846d2921af584.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/app/term/page-72cbc1c8cdd0f65d.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/app/trace/page-77b28bfb0996d5ea.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/app/vault/page-3220c4934f49c6c2.js +0 -1
  682. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-90670589b87abea8.js +0 -1
  683. package/apps/pwa/out/_next/static/chunks/app/workflows/page-7df9243ed021a4cc.js +0 -1
  684. package/apps/pwa/out/_next/static/chunks/app/workspace/page-4498c3853f4f688d.js +0 -1
  685. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-35bedde6d885f08f.js +0 -1
  686. package/apps/pwa/out/_next/static/chunks/framework-ea806bb57f2b8923.js +0 -1
  687. package/apps/pwa/out/_next/static/chunks/main-8d2302399c2c8f87.js +0 -1
  688. package/apps/pwa/out/_next/static/chunks/main-app-6870f30ea99f8346.js +0 -1
  689. package/apps/pwa/out/_next/static/chunks/pages/_app-b10928c60f0b8488.js +0 -1
  690. package/apps/pwa/out/_next/static/chunks/pages/_error-689039227d443fab.js +0 -1
  691. package/apps/pwa/out/_next/static/chunks/webpack-e5bea36f183b25e6.js +0 -1
  692. package/apps/pwa/out/_next/static/css/f92f63a5df0ba229.css +0 -1
  693. package/src/dashboard/turn-typeahead-echo.ts +0 -23
  694. /package/apps/pwa/out/_next/static/{bFI5EEwg7T6aG88ibX4Zq → Y4zKzL62sakG5momz3SoQ}/_ssgManifest.js +0 -0
@@ -0,0 +1,297 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { spawnSync } from 'node:child_process';
3
+ import { appendFileSync, closeSync, existsSync, linkSync, mkdirSync, openSync, readFileSync, statSync, truncateSync, unlinkSync, writeFileSync } from 'node:fs';
4
+ import { join } from 'node:path';
5
+ import { debug } from '../debug/log.js';
6
+ import {
7
+ decomposeFabricRequest,
8
+ type FabricDecomposeRequestOptions,
9
+ } from './fabric-decompose-adapter.js';
10
+ import type { JobKind } from './orchestrate.js';
11
+
12
+ export interface FabricPlanNode {
13
+ id: string;
14
+ title: string;
15
+ kind: JobKind;
16
+ dependsOn: string[];
17
+ expectedOutput: string;
18
+ children: FabricPlanNode[];
19
+ }
20
+
21
+ export interface FabricPlan {
22
+ id: string;
23
+ request: string;
24
+ status: 'draft' | 'approved';
25
+ nodes: FabricPlanNode[];
26
+ createdAt: string;
27
+ updatedAt: string;
28
+ }
29
+
30
+ export interface FabricPlanEdit {
31
+ id: string;
32
+ title?: string;
33
+ kind?: JobKind;
34
+ dependsOn?: string[];
35
+ expectedOutput?: string;
36
+ }
37
+
38
+ export interface FabricExecutionCandidate {
39
+ planId: string;
40
+ nodes: FabricPlanNode[];
41
+ approvedAt: string;
42
+ }
43
+
44
+ type FabricPlanEvent =
45
+ | { type: 'plan'; plan: FabricPlan }
46
+ | { type: 'execution-candidate'; candidate: FabricExecutionCandidate };
47
+ /** An approval is one line, so a torn write can never leave «approved» without its candidate (review must-fix). */
48
+ type FabricPlanLine = FabricPlanEvent | { type: 'approved'; plan: FabricPlan; candidate: FabricExecutionCandidate };
49
+
50
+ function ledgerPath(root: string): string {
51
+ return join(root, 'fabric', 'plans.jsonl');
52
+ }
53
+
54
+ // One ledger lock also protects reads: a reader must not observe half of an approval pair.
55
+ // The owner file is fully written before its hard link becomes the visible lock.
56
+ function lockOwnerAlive(pid: number): boolean {
57
+ try {
58
+ process.kill(pid, 0);
59
+ return true;
60
+ } catch (error) {
61
+ return (error as NodeJS.ErrnoException).code !== 'ESRCH';
62
+ }
63
+ }
64
+
65
+ /** Process start time as `ps` reports it — with the pid it identifies one process even after the pid is reused. */
66
+ function processStart(pid: number): string | null {
67
+ const r = spawnSync('ps', ['-o', 'lstart=', '-p', String(pid)], { encoding: 'utf8' });
68
+ const value = r.status === 0 ? r.stdout.trim() : '';
69
+ return value || null;
70
+ }
71
+
72
+ function reclaimAbandonedLock(lockPath: string): void {
73
+ let observed: string;
74
+ let inode: number;
75
+ try {
76
+ observed = readFileSync(lockPath, 'utf8');
77
+ inode = statSync(lockPath).ino;
78
+ } catch (error) {
79
+ if ((error as NodeJS.ErrnoException).code === 'ENOENT') return;
80
+ throw error;
81
+ }
82
+ const [pidText, ...startParts] = observed.trim().split('|');
83
+ const pid = Number(pidText);
84
+ const ownerStart = startParts.join('|');
85
+ // Unidentified locks are not evidence that their owner has died.
86
+ if (!Number.isSafeInteger(pid) || pid <= 0) return;
87
+ // Alive pid with a different start time = the pid was reused by another process; the owner is gone (review must-fix).
88
+ const reused = ownerStart !== '' && lockOwnerAlive(pid) && processStart(pid) !== null && processStart(pid) !== ownerStart;
89
+ if (lockOwnerAlive(pid) && !reused) return;
90
+ try {
91
+ if (statSync(lockPath).ino === inode && readFileSync(lockPath, 'utf8') === observed) unlinkSync(lockPath);
92
+ } catch (error) {
93
+ if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error;
94
+ }
95
+ }
96
+
97
+ function withLedgerLock<T>(root: string, operation: () => T): T {
98
+ const directory = join(root, 'fabric');
99
+ mkdirSync(directory, { recursive: true });
100
+ const lockPath = join(directory, 'plans.lock');
101
+ const ownerPath = join(directory, `plans.lock.${process.pid}.${randomUUID()}`);
102
+ writeFileSync(ownerPath, `${process.pid}|${processStart(process.pid) ?? ''}`, { flag: 'wx' });
103
+ const deadline = Date.now() + 10_000;
104
+ let acquired = false;
105
+ try {
106
+ while (!acquired) {
107
+ try {
108
+ linkSync(ownerPath, lockPath);
109
+ acquired = true;
110
+ } catch (error) {
111
+ if ((error as NodeJS.ErrnoException).code !== 'EEXIST') throw error;
112
+ reclaimAbandonedLock(lockPath);
113
+ if (Date.now() >= deadline) throw new Error('fabric plan ledger lock timeout');
114
+ Bun.sleepSync(5);
115
+ }
116
+ }
117
+ return operation();
118
+ } finally {
119
+ if (acquired) unlinkSync(lockPath);
120
+ unlinkSync(ownerPath);
121
+ }
122
+ }
123
+
124
+ function appendLines(root: string, lines: readonly FabricPlanLine[]): void {
125
+ const path = ledgerPath(root);
126
+ mkdirSync(join(root, 'fabric'), { recursive: true });
127
+ appendFileSync(path, lines.map((line) => JSON.stringify(line)).join('\n') + '\n');
128
+ }
129
+
130
+ function appendEvent(root: string, event: FabricPlanEvent): void {
131
+ appendLines(root, [event]);
132
+ }
133
+
134
+ /** Called under the ledger lock. A torn last line (crash mid-append) is cut back to the last whole line so the ledger stays usable. */
135
+ function readEvents(root: string): FabricPlanEvent[] {
136
+ const path = ledgerPath(root);
137
+ if (!existsSync(path)) return [];
138
+ const text = readFileSync(path, 'utf8');
139
+ const lines = text.split('\n');
140
+ const events: FabricPlanEvent[] = [];
141
+ let offset = 0;
142
+ for (let i = 0; i < lines.length; i++) {
143
+ const line = lines[i]!;
144
+ const complete = i < lines.length - 1;
145
+ if (line) {
146
+ let parsed: FabricPlanLine | undefined;
147
+ try { parsed = JSON.parse(line) as FabricPlanLine; } catch { parsed = undefined; }
148
+ if (!parsed || !complete) {
149
+ // Only the tail may be torn; a bad line in the middle is real corruption and must not be silently skipped.
150
+ if (lines.slice(i + 1).some(Boolean)) throw new Error(`fabric plan ledger corrupt at line ${i + 1}`);
151
+ truncateSync(path, Buffer.byteLength(text.slice(0, offset)));
152
+ debug.log('fabric.plan', 'torn-tail-repaired', { line: i + 1, bytes: Buffer.byteLength(line) });
153
+ break;
154
+ }
155
+ if (parsed.type === 'approved') events.push({ type: 'plan', plan: parsed.plan }, { type: 'execution-candidate', candidate: parsed.candidate });
156
+ else events.push(parsed);
157
+ }
158
+ offset += line.length + 1;
159
+ }
160
+ return events;
161
+ }
162
+
163
+ function inferredKind(text: string): JobKind {
164
+ if (/영상|비디오|video|media|편집|촬영/i.test(text)) return 'media';
165
+ if (/배포|출시|deploy|release|publish/i.test(text)) return 'deploy';
166
+ if (/조사|검색|분석|research|search|investigat/i.test(text)) return 'search';
167
+ return 'dev';
168
+ }
169
+
170
+ function flatten(nodes: readonly FabricPlanNode[]): FabricPlanNode[] {
171
+ return nodes.flatMap((node) => [node, ...flatten(node.children)]);
172
+ }
173
+
174
+ function validateNodes(nodes: readonly FabricPlanNode[]): void {
175
+ const all = flatten(nodes);
176
+ if (!all.length) throw new Error('fabric plan requires nodes');
177
+ const byId = new Map(all.map((node) => [node.id, node]));
178
+ if (byId.size !== all.length) throw new Error('duplicate fabric plan node id');
179
+ const visiting = new Set<string>();
180
+ const visited = new Set<string>();
181
+ const visit = (id: string): void => {
182
+ if (visiting.has(id)) throw new Error('cyclic fabric plan dependency');
183
+ if (visited.has(id)) return;
184
+ const node = byId.get(id);
185
+ if (!node) throw new Error(`unknown fabric plan dependency: ${id}`);
186
+ visiting.add(id);
187
+ for (const dependency of node.dependsOn) visit(dependency);
188
+ visiting.delete(id);
189
+ visited.add(id);
190
+ };
191
+ for (const node of all) {
192
+ if (typeof node.title !== 'string' || !node.title.trim()
193
+ || typeof node.expectedOutput !== 'string' || !node.expectedOutput.trim()) {
194
+ throw new Error('fabric plan node requires title and expected output');
195
+ }
196
+ if (!['dev', 'search', 'deploy', 'media'].includes(node.kind)) throw new Error('invalid fabric plan node kind');
197
+ if (!Array.isArray(node.dependsOn) || node.dependsOn.some((id) => typeof id !== 'string')) {
198
+ throw new Error('invalid fabric plan dependencies');
199
+ }
200
+ visit(node.id);
201
+ }
202
+ }
203
+
204
+ function loadPlanUnlocked(root: string, id: string): FabricPlan | null {
205
+ const events = readEvents(root);
206
+ return events.filter((event): event is Extract<FabricPlanEvent, { type: 'plan' }> => event.type === 'plan')
207
+ .map((event) => event.plan).reverse().find((plan) => plan.id === id) ?? null;
208
+ }
209
+
210
+ export function loadFabricPlan(root: string, id: string): FabricPlan | null {
211
+ return withLedgerLock(root, () => loadPlanUnlocked(root, id));
212
+ }
213
+
214
+ export function listFabricExecutionCandidates(root: string): FabricExecutionCandidate[] {
215
+ return withLedgerLock(root, () => readEvents(root)
216
+ .filter((event): event is Extract<FabricPlanEvent, { type: 'execution-candidate' }> => event.type === 'execution-candidate')
217
+ .map((event) => event.candidate));
218
+ }
219
+
220
+ /** Drafting and human edits record plan versions, never executable candidates. */
221
+ export async function createFabricPlan(
222
+ root: string,
223
+ request: string,
224
+ options: FabricDecomposeRequestOptions = {},
225
+ ): Promise<FabricPlan> {
226
+ if (!request.trim()) throw new Error('fabric plan request is empty');
227
+ const result = await decomposeFabricRequest(request, options);
228
+ if (result.status !== 'decomposed' || result.rfc.arcs.length === 0) {
229
+ throw new Error(`fabric plan decomposition failed: ${result.status}`);
230
+ }
231
+ const nodes: FabricPlanNode[] = result.rfc.arcs.map((arc, arcIndex) => {
232
+ const id = `arc-${arcIndex + 1}`;
233
+ const previousArc = result.rfc.arcs[arcIndex - 1];
234
+ const previous = previousArc ? [`arc-${arcIndex}:task-${previousArc.workItems.length}`] : [];
235
+ const children: FabricPlanNode[] = arc.workItems.map((item, itemIndex) => ({
236
+ id: `${id}:task-${itemIndex + 1}`,
237
+ title: item.title,
238
+ kind: inferredKind(`${arc.heading} ${item.title}`),
239
+ dependsOn: itemIndex ? [`${id}:task-${itemIndex}`] : [id],
240
+ expectedOutput: item.detail?.trim() || item.title,
241
+ children: [],
242
+ }));
243
+ return {
244
+ id,
245
+ title: arc.heading,
246
+ kind: inferredKind(arc.heading),
247
+ dependsOn: previous,
248
+ expectedOutput: arc.workItems.map((item) => item.detail?.trim() || item.title).join('; '),
249
+ children,
250
+ };
251
+ });
252
+ validateNodes(nodes);
253
+ const now = new Date().toISOString();
254
+ const plan: FabricPlan = { id: randomUUID(), request, status: 'draft', nodes, createdAt: now, updatedAt: now };
255
+ withLedgerLock(root, () => appendEvent(root, { type: 'plan', plan }));
256
+ return plan;
257
+ }
258
+
259
+ export function reviseFabricPlan(root: string, id: string, edits: readonly FabricPlanEdit[]): FabricPlan {
260
+ return withLedgerLock(root, () => {
261
+ const current = loadPlanUnlocked(root, id);
262
+ if (!current) throw new Error(`fabric plan not found: ${id}`);
263
+ if (current.status !== 'draft' || readEvents(root).some((event) => event.type === 'execution-candidate' && event.candidate.planId === id)) {
264
+ throw new Error('approved fabric plan cannot be revised');
265
+ }
266
+ const ids = new Set(flatten(current.nodes).map((node) => node.id));
267
+ if (new Set(edits.map((edit) => edit.id)).size !== edits.length || edits.some((edit) => !ids.has(edit.id))) {
268
+ throw new Error('duplicate or unknown fabric plan edit id');
269
+ }
270
+ const byId = new Map(edits.map((edit) => [edit.id, edit]));
271
+ const apply = (node: FabricPlanNode): FabricPlanNode => {
272
+ const edit = byId.get(node.id);
273
+ return { ...node, ...edit, dependsOn: [...(edit?.dependsOn ?? node.dependsOn)], children: node.children.map(apply) };
274
+ };
275
+ const nodes = current.nodes.map(apply);
276
+ validateNodes(nodes);
277
+ const plan: FabricPlan = { ...current, nodes, updatedAt: new Date().toISOString() };
278
+ appendEvent(root, { type: 'plan', plan });
279
+ return plan;
280
+ });
281
+ }
282
+
283
+ /** Approval is the sole operation allowed to append an execution candidate. */
284
+ export function approveFabricPlan(root: string, id: string): FabricExecutionCandidate {
285
+ return withLedgerLock(root, () => {
286
+ const current = loadPlanUnlocked(root, id);
287
+ if (!current) throw new Error(`fabric plan not found: ${id}`);
288
+ if (current.status !== 'draft' || readEvents(root).some((event) => event.type === 'execution-candidate' && event.candidate.planId === id)) {
289
+ throw new Error('fabric plan already approved');
290
+ }
291
+ validateNodes(current.nodes);
292
+ const approvedAt = new Date().toISOString();
293
+ const candidate: FabricExecutionCandidate = { planId: id, nodes: current.nodes, approvedAt };
294
+ appendLines(root, [{ type: 'approved', plan: { ...current, status: 'approved', updatedAt: approvedAt }, candidate }]);
295
+ return candidate;
296
+ });
297
+ }
@@ -21,7 +21,8 @@ import { spawn, execFileSync } from 'node:child_process';
21
21
  import { emitDecision } from '../live/detail-switch.js';
22
22
  import { parentUnlandedProgressLine } from './run-supervisor.js';
23
23
  import { mkdirSync, openSync, writeFileSync, closeSync, renameSync, unlinkSync } from 'node:fs';
24
- import { join } from 'node:path';
24
+ import { join, resolve } from 'node:path';
25
+ import { goalPathFromArgv, launchRegistryDir, removeLaunchBinding, writeLaunchBinding } from '../harness/launch-registry.js';
25
26
  import { availableParallelism, cpus } from 'node:os';
26
27
  import { selfDevRunsDir } from './run-store.js';
27
28
  import { HARNESS_RUN_ID_ENV, normalizeRunId } from '../harness/harness-space.js';
@@ -56,6 +57,7 @@ import {
56
57
  } from '../task-orchestrator/surfaces/self-implement.js';
57
58
  import { collectOrchestrateUnionDiff, type UnionDiffFileReader } from './orchestrate-union-diff.js';
58
59
  import { debug } from '../debug/log.js';
60
+ import { parseGoalReleaseNoteSection, type ReleaseNoteSection } from '../release-loop/release-note.js';
59
61
  import { readHarnessScreen, readHarnessScreenTail, resolveHarnessScreenKey } from '../harness/harness-screen.js';
60
62
  import {
61
63
  dedupWorkingMemory,
@@ -101,6 +103,7 @@ export type JobKindRegistry = Readonly<Partial<Record<JobKind, JobKindDefinition
101
103
  interface SelfDevShardIdentity {
102
104
  orchestrationId: string;
103
105
  parentRequest?: string;
106
+ releaseNote?: ReleaseNoteSection;
104
107
  shardId: string;
105
108
  totalShards: number;
106
109
  position: number;
@@ -199,6 +202,8 @@ export interface SelfDevGoal {
199
202
  goalType?: SelfDevGoalType;
200
203
  /** Feature/goal text → `elanous self implement <feature>` for dev jobs. */
201
204
  feature: string;
205
+ /** Pod lease predecessor goal ID or PR number. */
206
+ after?: string | number;
202
207
  base?: string;
203
208
  autoMerge?: boolean;
204
209
  /** G8 — attach `auto-review` opt-in label on PR (subject to eligibility self-assessment). */
@@ -890,6 +895,8 @@ export interface OrchestrateSelfDevOptions {
890
895
  runId?: string;
891
896
  /** Override the run directory root for isolated tests. */
892
897
  runsDir?: string;
898
+ /** Host-wide run → process binding for `harness stop` across worktrees · `null` = do not write · default: write only when `runsDir` is not overridden. */
899
+ launchRegistryDir?: string | null;
893
900
  /** Signal source and kubectl seams for isolated lifecycle tests. */
894
901
  signalSource?: Pick<NodeJS.Process, 'on' | 'off'>;
895
902
  /** Pod context/namespace pairs chosen by the caller that launched the Jobs. */
@@ -990,7 +997,7 @@ async function deleteLabelledJobs(runId: string, selectedTargets: readonly { con
990
997
  /** `self-dev-runs/<runId>/pid.json` — what `harness stop <runId>` reads (start time guards PID reuse).
991
998
  * HS1: written as soon as the run ID exists, not only when the jobs start — pod planning and image sync can
992
999
  * take minutes before that, and a stop in that window found «no process» (10-01 · three runs). */
993
- export function writeRunPidRecord(runId: string, runsDir: string = selfDevRunsDir()): string {
1000
+ export function writeRunPidRecord(runId: string, runsDir: string = selfDevRunsDir(), registryDir: string | null = launchRegistryDir()): string {
994
1001
  const pidPath = join(runsDir, runId, 'pid.json');
995
1002
  mkdirSync(join(runsDir, runId), { recursive: true });
996
1003
  const temporary = `${pidPath}.${process.pid}.${randomUUID()}.tmp`;
@@ -1001,6 +1008,13 @@ export function writeRunPidRecord(runId: string, runsDir: string = selfDevRunsDi
1001
1008
  } finally { closeSync(fd); }
1002
1009
  renameSync(temporary, pidPath);
1003
1010
  } catch (error) { unlinkSync(temporary); throw error; }
1011
+ // A stop from another worktree/universe cannot see this pid.json — leave the same binding in the host-wide registry.
1012
+ if (registryDir !== null) {
1013
+ const cwd = process.cwd();
1014
+ const goalPath = goalPathFromArgv(process.argv, cwd);
1015
+ writeLaunchBinding(runId, { pid: process.pid, startedAt: Date.now() - Math.floor(process.uptime() * 1000), argv0: process.argv0,
1016
+ cwd, ...(goalPath ? { goalPath } : {}), runsDir: resolve(runsDir) }, registryDir);
1017
+ }
1004
1018
  return pidPath;
1005
1019
  }
1006
1020
 
@@ -1013,6 +1027,8 @@ export function orchestrateSelfDev(opts: OrchestrateSelfDevOptions): Promise<Sel
1013
1027
  const runId = opts.runId ?? process.env[HARNESS_RUN_ID_ENV];
1014
1028
  if (runId && runId !== normalizeRunId(runId)) throw new Error(`invalid self-dev run ID: ${runId}`);
1015
1029
  const pidPath = runId ? join(opts.runsDir ?? selfDevRunsDir(), runId, 'pid.json') : undefined;
1030
+ // Only the real run directory gets a host-wide binding by default — an overridden runsDir is an isolated test.
1031
+ const registryDir = opts.launchRegistryDir !== undefined ? opts.launchRegistryDir : opts.runsDir === undefined ? launchRegistryDir() : null;
1016
1032
  const graph = new TaskGraph();
1017
1033
  const bus = new TaskEventBus();
1018
1034
  const registry = new SurfaceRegistry();
@@ -1186,6 +1202,7 @@ export function orchestrateSelfDev(opts: OrchestrateSelfDevOptions): Promise<Sel
1186
1202
  surface: (goal) => ({
1187
1203
  kind: 'self-implement',
1188
1204
  feature: goal.feature,
1205
+ ...(goal.after !== undefined ? { after: goal.after } : {}),
1189
1206
  ...(goal.base !== undefined ? { base: goal.base } : {}),
1190
1207
  ...(goal.autoMerge !== undefined ? { autoMerge: goal.autoMerge } : {}),
1191
1208
  ...(goal.autoReview !== undefined ? { autoReview: goal.autoReview } : {}),
@@ -1307,6 +1324,7 @@ export function orchestrateSelfDev(opts: OrchestrateSelfDevOptions): Promise<Sel
1307
1324
  });
1308
1325
 
1309
1326
  if (opts.goals.length > 0) {
1327
+ const releaseNote = opts.parentRequest === undefined ? undefined : parseGoalReleaseNoteSection(opts.parentRequest).fragment;
1310
1328
  const orchestrationId = randomUUID();
1311
1329
  const shards = opts.goals.map((goal, index) => ({
1312
1330
  goal,
@@ -1320,6 +1338,7 @@ export function orchestrateSelfDev(opts: OrchestrateSelfDevOptions): Promise<Sel
1320
1338
  const identity: SelfDevShardIdentity = {
1321
1339
  orchestrationId,
1322
1340
  ...(opts.parentRequest === undefined ? {} : { parentRequest: opts.parentRequest }),
1341
+ ...(releaseNote ? { releaseNote } : {}),
1323
1342
  shardId: shard.shardId,
1324
1343
  totalShards: shards.length,
1325
1344
  position: shard.position,
@@ -1328,7 +1347,7 @@ export function orchestrateSelfDev(opts: OrchestrateSelfDevOptions): Promise<Sel
1328
1347
  .filter((sibling) => sibling !== shard)
1329
1348
  .map(({ shardId, summary }) => ({ shardId, summary })),
1330
1349
  };
1331
- const task = graph.getTask(taskId);
1350
+ const task = graph.getTask(taskId);
1332
1351
  if (task?.surface.kind === 'self-implement') {
1333
1352
  graph.updateTask(taskId, {
1334
1353
  surface: { ...task.surface, feature: shardIdentityFeature(shard.goal.feature, identity) },
@@ -1401,6 +1420,7 @@ export function orchestrateSelfDev(opts: OrchestrateSelfDevOptions): Promise<Sel
1401
1420
  catch (error) {
1402
1421
  if ((error as NodeJS.ErrnoException).code !== 'ENOENT') debug.log('self-dev.orchestrate', 'pid-cleanup-failed', { pidPath, error: String(error) }, { level: 'warn' });
1403
1422
  }
1423
+ if (registryDir !== null) removeLaunchBinding(runId!, registryDir);
1404
1424
  }
1405
1425
  };
1406
1426
  const cancel = (signal: NodeJS.Signals): void => {
@@ -1436,7 +1456,7 @@ export function orchestrateSelfDev(opts: OrchestrateSelfDevOptions): Promise<Sel
1436
1456
  signals.on('SIGTERM', onTerm);
1437
1457
  signals.on('SIGINT', onInt);
1438
1458
  try {
1439
- if (pidPath) writeRunPidRecord(runId!, opts.runsDir ?? selfDevRunsDir());
1459
+ if (pidPath) writeRunPidRecord(runId!, opts.runsDir ?? selfDevRunsDir(), registryDir);
1440
1460
  } catch (error) { cleanup(); reject(error); return; }
1441
1461
 
1442
1462
  // Current full result set: resumed-done goals + each running task's
@@ -1488,6 +1508,18 @@ export function orchestrateSelfDev(opts: OrchestrateSelfDevOptions): Promise<Sel
1488
1508
  if (settled) return;
1489
1509
  settled = true;
1490
1510
  const out = buildResults();
1511
+ for (const result of out) {
1512
+ try {
1513
+ debug.log('self-implement.result', 'final', {
1514
+ runId: result.runId ?? null,
1515
+ taskId: result.taskId,
1516
+ stage: result.stage ?? null,
1517
+ mergeReason: result.mergeReason ?? null,
1518
+ failureClassification: result.failureClassification ?? null,
1519
+ prNumber: result.prNumber ?? null,
1520
+ });
1521
+ } catch { /* terminal observation must not change the result */ }
1522
+ }
1491
1523
  // S3 — teardown (opt-in): remove each job's worktree (fail-soft),
1492
1524
  // preserving any job that opened a PR (branch/worktree still needed).
1493
1525
  if (opts.teardown === true && !cancelling) {
@@ -0,0 +1,62 @@
1
+ // Release path = what publishing reads directly: the release scripts and graph, plus the manifest, release notes and cut schedule
2
+ // in `src/release-loop/`. The checklist store (`checklist.ts`, `feature-store.ts`) is shared ops ledger code — the gate catches its regressions (OP 10-03).
3
+ export const RELEASE_PATH_PREFIXES = ['scripts/release-loop/', 'graphs/release/', 'src/release-loop/manifest', 'src/release-loop/release-note', 'src/release-loop/release-schedule'] as const;
4
+ export const RELEASE_PATH_LABEL = 'elanous:release-path';
5
+
6
+ /** Flatten every GitHub PR file page, including the source of a rename. */
7
+ export function releasePrFilePaths(pages: unknown): string[] {
8
+ if (!Array.isArray(pages) || pages.length === 0 || !pages.every((page: unknown) => Array.isArray(page) && page.every((file: unknown) =>
9
+ !!file && typeof file === 'object' && 'filename' in file && typeof file.filename === 'string'
10
+ && (!('previous_filename' in file) || typeof file.previous_filename === 'string')
11
+ && (!('status' in file) || file.status !== 'renamed' || ('previous_filename' in file && typeof file.previous_filename === 'string'))))) {
12
+ throw new Error('gh api PR files returned an invalid file list');
13
+ }
14
+ return pages.flatMap((page: Array<{ filename: string; previous_filename?: string }>) =>
15
+ page.flatMap((file) => file.previous_filename ? [file.filename, file.previous_filename] : [file.filename]));
16
+ }
17
+
18
+ /** git diff --name-status -z emits status then one path (or two for rename/copy). */
19
+ export function releaseGitDiffPaths(output: string): string[] {
20
+ const tokens = output.split('\0');
21
+ if (tokens.pop() !== '') throw new Error('invalid NUL-delimited git diff');
22
+ const paths: string[] = [];
23
+ for (let i = 0; i < tokens.length;) {
24
+ const status = tokens[i++];
25
+ if (!status || !/^[ACDMRTUXB][0-9]*$/.test(status)) throw new Error('invalid git diff status');
26
+ const count = /^[RC]/.test(status) ? 2 : 1;
27
+ for (let n = 0; n < count; n++) {
28
+ const path = tokens[i++];
29
+ if (!path) throw new Error('missing git diff path');
30
+ paths.push(path);
31
+ }
32
+ }
33
+ return paths;
34
+ }
35
+
36
+ /** Evaluate the paths from the opened PR, not the requested goal or local working tree. */
37
+ export function releasePathHold(paths: readonly string[]): string | undefined {
38
+ return paths.find((path) => RELEASE_PATH_PREFIXES.some((prefix) => path.startsWith(prefix)));
39
+ }
40
+
41
+ /** Fixed opening of the hold comment — also how a PR held by several merge surfaces (or polls) is recognised, so it is posted once. */
42
+ export const RELEASE_PATH_HOLD_MARKER = 'OP approval required: automatic merge held because this PR changes ';
43
+
44
+ export function releasePathHoldComment(path: string): string {
45
+ return `${RELEASE_PATH_HOLD_MARKER}${path}.`;
46
+ }
47
+
48
+ /** True when the PR's issue-comment pages (gh api --paginate --slurp) already carry a hold comment. */
49
+ export function releasePathHoldAlreadyPosted(pages: unknown): boolean {
50
+ if (!Array.isArray(pages)) throw new Error('gh api PR comments returned an invalid list');
51
+ return pages.some((page: unknown) => Array.isArray(page) && page.some((comment: unknown) =>
52
+ !!comment && typeof comment === 'object' && 'body' in comment && typeof comment.body === 'string' && comment.body.startsWith(RELEASE_PATH_HOLD_MARKER)));
53
+ }
54
+
55
+ /** Unknown comment history must not drop the hold comment: when it cannot be read, post (a duplicate beats a silent hold). */
56
+ export function releasePathHoldShouldPost(readPages: () => unknown): boolean {
57
+ try { return !releasePathHoldAlreadyPosted(readPages()); } catch { return true; }
58
+ }
59
+
60
+ export function releasePathHoldCommentsArgs(pr: string | number): string[] {
61
+ return ['api', '--paginate', '--slurp', '--method', 'GET', '-f', 'per_page=100', `repos/{owner}/{repo}/issues/${pr}/comments`];
62
+ }
@@ -111,6 +111,8 @@ function runPath(runId: string, dir: string): string {
111
111
  return path;
112
112
  }
113
113
 
114
+ const loggedAbsentCheckpoints = new Set<string>();
115
+
114
116
  function loadSelfDevRunFromPath(path: string): SelfDevRunState | null {
115
117
  const runId = path.slice(path.lastIndexOf(sep) + 1, -'.json'.length);
116
118
  try {
@@ -118,7 +120,14 @@ function loadSelfDevRunFromPath(path: string): SelfDevRunState | null {
118
120
  if (o && typeof o.runId === 'string' && Array.isArray(o.results)) return o;
119
121
  try { debug.log('self-dev.run-store', 'read-failed', { runId, reason: 'invalid checkpoint shape' }); } catch { /* preserve fail-soft reads */ }
120
122
  } catch (error) {
121
- try { debug.log('self-dev.run-store', 'read-failed', { runId, reason: String(error) }); } catch { /* preserve fail-soft reads */ }
123
+ if ((error as NodeJS.ErrnoException).code === 'ENOENT') {
124
+ if (!loggedAbsentCheckpoints.has(runId)) {
125
+ loggedAbsentCheckpoints.add(runId);
126
+ try { debug.log('self-dev.run-store', 'checkpoint-absent', { runId }); } catch { /* preserve fail-soft reads */ }
127
+ }
128
+ } else {
129
+ try { debug.log('self-dev.run-store', 'read-failed', { runId, reason: String(error) }); } catch { /* preserve fail-soft reads */ }
130
+ }
122
131
  }
123
132
  return null;
124
133
  }