peaks-loop 4.0.0-beta.9 → 4.0.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 (552) hide show
  1. package/CHANGELOG.md +572 -234
  2. package/README-en.md +67 -30
  3. package/README.md +67 -30
  4. package/agents/karpathy-reviewer.md +33 -0
  5. package/bin/peaks.js +0 -0
  6. package/dist/cli/cli-helpers.d.ts +31 -6
  7. package/dist/cli/cli-helpers.js +48 -25
  8. package/dist/cli/commands/_register.d.ts +3 -0
  9. package/dist/cli/commands/_register.js +139 -0
  10. package/dist/cli/commands/_super.d.ts +10 -0
  11. package/dist/cli/commands/_super.js +97 -0
  12. package/dist/cli/commands/adapter-commands-s2a.js +1 -1
  13. package/dist/cli/commands/asset-commands.js +33 -16
  14. package/dist/cli/commands/audit-commands.js +2 -2
  15. package/dist/cli/commands/autonomous-swarm-commands.d.ts +12 -0
  16. package/dist/cli/commands/autonomous-swarm-commands.js +120 -0
  17. package/dist/cli/commands/bee-commands.js +1 -1
  18. package/dist/cli/commands/capability-commands.js +1 -1
  19. package/dist/cli/commands/capability-worker-config-sc-commands.js +0 -2
  20. package/dist/cli/commands/changeset-commands.d.ts +13 -0
  21. package/dist/cli/commands/changeset-commands.js +46 -0
  22. package/dist/cli/commands/code-commands.d.ts +11 -1
  23. package/dist/cli/commands/code-commands.js +19 -699
  24. package/dist/cli/commands/code-job-shape-commands.d.ts +9 -0
  25. package/dist/cli/commands/code-job-shape-commands.js +164 -0
  26. package/dist/cli/commands/code-mode-gate-commands.d.ts +9 -0
  27. package/dist/cli/commands/code-mode-gate-commands.js +223 -0
  28. package/dist/cli/commands/code-review-commands.js +2 -2
  29. package/dist/cli/commands/code-run-command.d.ts +12 -0
  30. package/dist/cli/commands/code-run-command.js +68 -0
  31. package/dist/cli/commands/code-runtime-commands.d.ts +11 -0
  32. package/dist/cli/commands/code-runtime-commands.js +391 -0
  33. package/dist/cli/commands/codegraph-commands.js +1 -1
  34. package/dist/cli/commands/compact-command.js +53 -1
  35. package/dist/cli/commands/complexity-commands.js +1 -1
  36. package/dist/cli/commands/config-commands.js +4 -75
  37. package/dist/cli/commands/container-commands.d.ts +28 -0
  38. package/dist/cli/commands/container-commands.js +221 -0
  39. package/dist/cli/commands/context-commands.js +3 -2
  40. package/dist/cli/commands/core/artifacts-command.js +1 -1
  41. package/dist/cli/commands/core/binding-commands.js +1 -1
  42. package/dist/cli/commands/core/doctor-command.js +63 -3
  43. package/dist/cli/commands/core/memory-command.js +1 -1
  44. package/dist/cli/commands/core/profile-command.js +1 -1
  45. package/dist/cli/commands/core/proxy-command.js +1 -1
  46. package/dist/cli/commands/core/session-command.js +9 -7
  47. package/dist/cli/commands/core/skill-command.js +7 -4
  48. package/dist/cli/commands/core/standards-command.js +1 -1
  49. package/dist/cli/commands/cron-commands.d.ts +57 -0
  50. package/dist/cli/commands/cron-commands.js +257 -0
  51. package/dist/cli/commands/cron-scheduler-commands.d.ts +47 -0
  52. package/dist/cli/commands/cron-scheduler-commands.js +284 -0
  53. package/dist/cli/commands/dashboard-commands.d.ts +4 -0
  54. package/dist/cli/commands/dashboard-commands.js +10 -0
  55. package/dist/cli/commands/dashboard-long-run.d.ts +25 -0
  56. package/dist/cli/commands/dashboard-long-run.js +122 -0
  57. package/dist/cli/commands/dashboard-summary.d.ts +12 -0
  58. package/dist/cli/commands/dashboard-summary.js +58 -0
  59. package/dist/cli/commands/dispatch-commands.d.ts +0 -7
  60. package/dist/cli/commands/dispatch-commands.js +372 -8
  61. package/dist/cli/commands/dispatch-from-dag.js +4 -1
  62. package/dist/cli/commands/doc-commands.js +1 -1
  63. package/dist/cli/commands/ecc-commands.d.ts +30 -0
  64. package/dist/cli/commands/ecc-commands.js +119 -0
  65. package/dist/cli/commands/evolution-commands.js +1 -1
  66. package/dist/cli/commands/feedback-commands.js +1 -1
  67. package/dist/cli/commands/final-review-commands.js +1 -1
  68. package/dist/cli/commands/fixture-commands.js +1 -1
  69. package/dist/cli/commands/fork-commands.js +1 -1
  70. package/dist/cli/commands/gate-commands.js +128 -6
  71. package/dist/cli/commands/governance-classify-contract-commands.d.ts +21 -0
  72. package/dist/cli/commands/governance-classify-contract-commands.js +273 -0
  73. package/dist/cli/commands/heartbeat-commands.js +76 -5
  74. package/dist/cli/commands/heartbeat-watch-command.d.ts +31 -0
  75. package/dist/cli/commands/heartbeat-watch-command.js +146 -0
  76. package/dist/cli/commands/hook-handle.js +1 -1
  77. package/dist/cli/commands/hooks-commands.js +126 -10
  78. package/dist/cli/commands/ide-commands.js +1 -1
  79. package/dist/cli/commands/impact-commands.js +1 -1
  80. package/dist/cli/commands/job-commands.js +34 -1
  81. package/dist/cli/commands/lease-metrics-commands.d.ts +67 -0
  82. package/dist/cli/commands/lease-metrics-commands.js +231 -0
  83. package/dist/cli/commands/lease-stats-commands.d.ts +65 -0
  84. package/dist/cli/commands/lease-stats-commands.js +107 -0
  85. package/dist/cli/commands/legacy-commands.js +1 -1
  86. package/dist/cli/commands/log-commands.js +1 -1
  87. package/dist/cli/commands/loop-commands.js +1 -1
  88. package/dist/cli/commands/loop-eval-commands.js +1 -1
  89. package/dist/cli/commands/memory-commands.js +1 -1
  90. package/dist/cli/commands/migrate-1-4-1-command.js +1 -1
  91. package/dist/cli/commands/migrate-v2-10-to-v2-11-command.js +1 -1
  92. package/dist/cli/commands/mut-commands.d.ts +1 -1
  93. package/dist/cli/commands/mut-commands.js +1 -5
  94. package/dist/cli/commands/observability-commands.js +1 -1
  95. package/dist/cli/commands/openspec-commands.js +65 -4
  96. package/dist/cli/commands/perf-audit-commands.js +3 -3
  97. package/dist/cli/commands/perf-commands.js +1 -1
  98. package/dist/cli/commands/polyrepo-commands.js +1 -1
  99. package/dist/cli/commands/prd-blocks-commands.js +1 -1
  100. package/dist/cli/commands/prd-commands.js +4 -2
  101. package/dist/cli/commands/preferences-commands.js +23 -3
  102. package/dist/cli/commands/project-commands.js +1 -1
  103. package/dist/cli/commands/qa-business-review-commands.js +1 -1
  104. package/dist/cli/commands/qa-commands.d.ts +1 -1
  105. package/dist/cli/commands/qa-commands.js +39 -3
  106. package/dist/cli/commands/release-commands.d.ts +15 -0
  107. package/dist/cli/commands/release-commands.js +113 -21
  108. package/dist/cli/commands/request-commands.js +1 -1
  109. package/dist/cli/commands/retrospective-commands.js +1 -1
  110. package/dist/cli/commands/reviewer-commands.js +1 -1
  111. package/dist/cli/commands/role-commands.js +1 -1
  112. package/dist/cli/commands/runtime-commands-helpers.d.ts +7 -0
  113. package/dist/cli/commands/runtime-commands-helpers.js +24 -0
  114. package/dist/cli/commands/runtime-commands.js +1 -2
  115. package/dist/cli/commands/sc-commands.js +4 -2
  116. package/dist/cli/commands/scan-commands.js +1 -1
  117. package/dist/cli/commands/security-audit-commands.js +3 -3
  118. package/dist/cli/commands/sediment-commands.js +10 -1
  119. package/dist/cli/commands/session-24h-mode.d.ts +26 -0
  120. package/dist/cli/commands/session-24h-mode.js +196 -0
  121. package/dist/cli/commands/share-commands.d.ts +19 -0
  122. package/dist/cli/commands/share-commands.js +121 -2
  123. package/dist/cli/commands/skill-conformance-commands.js +1 -1
  124. package/dist/cli/commands/skill-loop-engineering-readiness-commands.js +1 -1
  125. package/dist/cli/commands/skill-search-commands.js +4 -1
  126. package/dist/cli/commands/slice-commands.js +1 -1
  127. package/dist/cli/commands/slice-integrate-commands.js +1 -1
  128. package/dist/cli/commands/slice-review-commands.js +1 -1
  129. package/dist/cli/commands/smoke-commands.js +1 -1
  130. package/dist/cli/commands/sop-commands.js +1 -1
  131. package/dist/cli/commands/spill-demo-command.d.ts +7 -0
  132. package/dist/cli/commands/spill-demo-command.js +29 -0
  133. package/dist/cli/commands/statusline-commands.d.ts +12 -0
  134. package/dist/cli/commands/statusline-commands.js +79 -17
  135. package/dist/cli/commands/sub-agent-commands.js +2 -1
  136. package/dist/cli/commands/sub-agent-shared.d.ts +10 -0
  137. package/dist/cli/commands/sub-agent-shared.js +24 -1
  138. package/dist/cli/commands/swarm-commands.d.ts +13 -0
  139. package/dist/cli/commands/swarm-commands.js +77 -0
  140. package/dist/cli/commands/tech-commands.d.ts +64 -0
  141. package/dist/cli/commands/tech-commands.js +195 -0
  142. package/dist/cli/commands/understand-commands.js +1 -1
  143. package/dist/cli/commands/upgrade-commands.d.ts +2 -0
  144. package/dist/cli/commands/upgrade-commands.js +40 -5
  145. package/dist/cli/commands/user-touchpoint-commands.js +1 -1
  146. package/dist/cli/commands/verdict-aggregate-command.js +1 -1
  147. package/dist/cli/commands/vm-commands.d.ts +31 -0
  148. package/dist/cli/commands/vm-commands.js +274 -0
  149. package/dist/cli/commands/workflow-commands.js +24 -1
  150. package/dist/cli/commands/workflow-plan-commands.js +1 -1
  151. package/dist/cli/commands/workspace/init-command.js +1 -1
  152. package/dist/cli/commands/workspace/migrate-command.js +1 -1
  153. package/dist/cli/commands/workspace/reconcile-command.js +1 -1
  154. package/dist/cli/commands/worktree-auth-commands.d.ts +29 -0
  155. package/dist/cli/commands/worktree-auth-commands.js +652 -0
  156. package/dist/cli/index.js +58 -13
  157. package/dist/cli/program.d.ts +2 -2
  158. package/dist/cli/program.js +86 -281
  159. package/dist/services/24h-mode/decider.d.ts +103 -0
  160. package/dist/services/24h-mode/decider.js +144 -0
  161. package/dist/services/24h-mode/index.d.ts +12 -0
  162. package/dist/services/24h-mode/index.js +12 -0
  163. package/dist/services/24h-mode/state.d.ts +48 -0
  164. package/dist/services/24h-mode/state.js +51 -0
  165. package/dist/services/24h-mode/store.d.ts +27 -0
  166. package/dist/services/24h-mode/store.js +119 -0
  167. package/dist/services/artifacts/artifact-prerequisites.js +1 -1
  168. package/dist/services/artifacts/request-artifact-service.js +1 -1
  169. package/dist/services/artifacts/workspace-service.js +1 -1
  170. package/dist/services/audit/enforcers/lint-bee-runtime-contract.d.ts +25 -0
  171. package/dist/services/audit/enforcers/lint-bee-runtime-contract.js +91 -0
  172. package/dist/services/audit/enforcers/lint-peaks-code-runtime.d.ts +16 -0
  173. package/dist/services/audit/enforcers/lint-peaks-code-runtime.js +31 -0
  174. package/dist/services/audit/enforcers/lint-peaks-skill-runtime.d.ts +23 -0
  175. package/dist/services/audit/enforcers/lint-peaks-skill-runtime.js +59 -0
  176. package/dist/services/audit/enforcers/lint-peaks-ui-sc-txt-runtime.d.ts +28 -0
  177. package/dist/services/audit/enforcers/lint-peaks-ui-sc-txt-runtime.js +86 -0
  178. package/dist/services/audit/enforcers/lint-prd-artifact-handoff.d.ts +16 -0
  179. package/dist/services/audit/enforcers/lint-prd-artifact-handoff.js +41 -0
  180. package/dist/services/audit/enforcers/lint-prd-source-snapshot.d.ts +27 -0
  181. package/dist/services/audit/enforcers/lint-prd-source-snapshot.js +47 -0
  182. package/dist/services/audit/enforcers/lint-qa-gateguard-and-runtime.d.ts +19 -0
  183. package/dist/services/audit/enforcers/lint-qa-gateguard-and-runtime.js +47 -0
  184. package/dist/services/audit/enforcers/lint-rd-handoff-coverage.d.ts +18 -0
  185. package/dist/services/audit/enforcers/lint-rd-handoff-coverage.js +70 -0
  186. package/dist/services/audit/enforcers/lint-skill-presence-mandatory.d.ts +25 -0
  187. package/dist/services/audit/enforcers/lint-skill-presence-mandatory.js +53 -0
  188. package/dist/services/audit/red-line-catalog-p2-a.d.ts +0 -6
  189. package/dist/services/audit/red-line-catalog-p2-a.js +230 -1
  190. package/dist/services/audit/static-service.d.ts +32 -25
  191. package/dist/services/audit/static-service.js +30 -109
  192. package/dist/services/audit-independent/index.d.ts +2 -0
  193. package/dist/services/audit-independent/index.js +2 -0
  194. package/dist/services/autonomous-swarm/autonomous-swarm-service.d.ts +127 -0
  195. package/dist/services/autonomous-swarm/autonomous-swarm-service.js +446 -0
  196. package/dist/services/changeset/changeset-check-service.d.ts +22 -0
  197. package/dist/services/changeset/changeset-check-service.js +47 -0
  198. package/dist/services/code/auto-compact-modes.d.ts +30 -0
  199. package/dist/services/code/auto-compact-modes.js +38 -0
  200. package/dist/services/code/auto-compact-orchestrator.d.ts +43 -5
  201. package/dist/services/code/auto-compact-orchestrator.js +101 -21
  202. package/dist/services/code/dag-orchestrator.d.ts +30 -1
  203. package/dist/services/code/dag-orchestrator.js +106 -1
  204. package/dist/services/code/status-line-renderer.d.ts +2 -0
  205. package/dist/services/code/status-line-renderer.js +21 -3
  206. package/dist/services/code-review/ocr-service.d.ts +1 -1
  207. package/dist/services/code-review/ocr-service.js +6 -3
  208. package/dist/services/compact-history/compact-history-service.d.ts +41 -0
  209. package/dist/services/compact-history/compact-history-service.js +62 -0
  210. package/dist/services/compact-statusline/compact-statusline-service.d.ts +16 -0
  211. package/dist/services/compact-statusline/compact-statusline-service.js +83 -0
  212. package/dist/services/config/config-service.d.ts +1 -12
  213. package/dist/services/config/config-service.js +3 -72
  214. package/dist/services/config/config-types.d.ts +2 -4
  215. package/dist/services/config/config-types.js +1 -1
  216. package/dist/services/container/container-lease.d.ts +67 -0
  217. package/dist/services/container/container-lease.js +135 -0
  218. package/dist/services/context/auto-compact-dispatcher.d.ts +40 -5
  219. package/dist/services/context/auto-compact-dispatcher.js +32 -102
  220. package/dist/services/context/auto-compact-reader.js +1 -1
  221. package/dist/services/context/auto-compact-types.d.ts +27 -2
  222. package/dist/services/context/auto-compact-types.js +8 -1
  223. package/dist/services/context/build-dispatch-system-prompt.d.ts +75 -0
  224. package/dist/services/context/build-dispatch-system-prompt.js +117 -0
  225. package/dist/services/context/collector.d.ts +2 -2
  226. package/dist/services/context/context-builder.d.ts +4 -4
  227. package/dist/services/context/context-schema.d.ts +48 -48
  228. package/dist/services/context/ide-detect.d.ts +4 -0
  229. package/dist/services/context/ide-detect.js +24 -0
  230. package/dist/services/context/main-session-monitor.d.ts +1 -4
  231. package/dist/services/context/main-session-monitor.js +1 -24
  232. package/dist/services/context/memory-index-reader.d.ts +8 -0
  233. package/dist/services/context/memory-index-reader.js +57 -0
  234. package/dist/services/context/memory-lru-cache.d.ts +12 -0
  235. package/dist/services/context/memory-lru-cache.js +60 -0
  236. package/dist/services/context/memory-preflight-config.d.ts +19 -0
  237. package/dist/services/context/memory-preflight-config.js +25 -0
  238. package/dist/services/context/memory-preflight-service.d.ts +19 -0
  239. package/dist/services/context/memory-preflight-service.js +120 -0
  240. package/dist/services/context/spillover-store.d.ts +23 -0
  241. package/dist/services/context/spillover-store.js +155 -0
  242. package/dist/services/context/spillover-types.d.ts +18 -0
  243. package/dist/services/context/spillover-types.js +1 -0
  244. package/dist/services/crystallization/crystallization-service.d.ts +22 -5
  245. package/dist/services/crystallization/crystallization-service.js +8 -14
  246. package/dist/services/crystallization/crystallization-types.d.ts +6 -6
  247. package/dist/services/crystallization/evidence-brief-builder.d.ts +1 -1
  248. package/dist/services/crystallization/index.d.ts +13 -0
  249. package/dist/services/crystallization/index.js +13 -0
  250. package/dist/services/dashboard/project-dashboard-service.js +2 -2
  251. package/dist/services/dispatch/await-batch.d.ts +70 -0
  252. package/dist/services/dispatch/await-batch.js +272 -0
  253. package/dist/services/dispatch/batch-counter.js +1 -1
  254. package/dist/services/dispatch/dispatch-record-writer.d.ts +126 -4
  255. package/dist/services/dispatch/dispatch-record-writer.js +239 -9
  256. package/dist/services/dispatch/slice-dag.d.ts +46 -0
  257. package/dist/services/dispatch/slice-dag.js +6 -0
  258. package/dist/services/dispatch/stage-enum.d.ts +27 -0
  259. package/dist/services/dispatch/stage-enum.js +48 -0
  260. package/dist/services/dispatch/startup-timeout.d.ts +86 -0
  261. package/dist/services/dispatch/startup-timeout.js +97 -0
  262. package/dist/services/dispatch/sub-agent-dispatcher.js +40 -89
  263. package/dist/services/dispatch/test-tool-detection.d.ts +25 -1
  264. package/dist/services/dispatch/test-tool-detection.js +80 -0
  265. package/dist/services/doctor/doctor-service/checks/check-id-schema.d.ts +18 -0
  266. package/dist/services/doctor/doctor-service/checks/check-id-schema.js +64 -0
  267. package/dist/services/doctor/doctor-service/checks/codegraph-capability.d.ts +14 -0
  268. package/dist/services/doctor/doctor-service/checks/codegraph-capability.js +69 -0
  269. package/dist/services/doctor/doctor-service/checks/dist-source-version.d.ts +32 -0
  270. package/dist/services/doctor/doctor-service/checks/dist-source-version.js +110 -0
  271. package/dist/services/doctor/doctor-service/checks/gateguard-conflict.d.ts +24 -0
  272. package/dist/services/doctor/doctor-service/checks/gateguard-conflict.js +164 -0
  273. package/dist/services/doctor/doctor-service/checks/l3-memory-health.d.ts +16 -0
  274. package/dist/services/doctor/doctor-service/checks/l3-memory-health.js +57 -0
  275. package/dist/services/doctor/doctor-service/checks/l3-orphan-sessions.d.ts +19 -0
  276. package/dist/services/doctor/doctor-service/checks/l3-orphan-sessions.js +66 -0
  277. package/dist/services/doctor/doctor-service/checks/schema-validity.d.ts +10 -0
  278. package/dist/services/doctor/doctor-service/checks/schema-validity.js +33 -0
  279. package/dist/services/doctor/doctor-service/checks/skill-apply-note.d.ts +20 -0
  280. package/dist/services/doctor/doctor-service/checks/skill-apply-note.js +85 -0
  281. package/dist/services/doctor/doctor-service/checks/skill-existence.d.ts +13 -0
  282. package/dist/services/doctor/doctor-service/checks/skill-existence.js +30 -0
  283. package/dist/services/doctor/doctor-service/checks/skill-name-match.d.ts +10 -0
  284. package/dist/services/doctor/doctor-service/checks/skill-name-match.js +25 -0
  285. package/dist/services/doctor/doctor-service/checks/skill-parse.d.ts +10 -0
  286. package/dist/services/doctor/doctor-service/checks/skill-parse.js +19 -0
  287. package/dist/services/doctor/doctor-service/checks/skill-presence.d.ts +21 -0
  288. package/dist/services/doctor/doctor-service/checks/skill-presence.js +75 -0
  289. package/dist/services/doctor/doctor-service/checks/skill-runbook.d.ts +14 -0
  290. package/dist/services/doctor/doctor-service/checks/skill-runbook.js +47 -0
  291. package/dist/services/doctor/doctor-service/checks/statusline-install.d.ts +14 -0
  292. package/dist/services/doctor/doctor-service/checks/statusline-install.js +32 -0
  293. package/dist/services/doctor/doctor-service/checks/statusline-runtime.d.ts +13 -0
  294. package/dist/services/doctor/doctor-service/checks/statusline-runtime.js +30 -0
  295. package/dist/services/doctor/doctor-service/checks/user-config.d.ts +11 -0
  296. package/dist/services/doctor/doctor-service/checks/user-config.js +27 -0
  297. package/dist/services/doctor/doctor-service/checks/workspace-init.d.ts +16 -0
  298. package/dist/services/doctor/doctor-service/checks/workspace-init.js +34 -0
  299. package/dist/services/doctor/doctor-service/checks/workspace-layout.d.ts +33 -0
  300. package/dist/services/doctor/doctor-service/checks/workspace-layout.js +180 -0
  301. package/dist/services/doctor/doctor-service/index.d.ts +48 -0
  302. package/dist/services/doctor/doctor-service/index.js +254 -0
  303. package/dist/services/doctor/doctor-service/plugin-registry.d.ts +41 -0
  304. package/dist/services/doctor/doctor-service/plugin-registry.js +77 -0
  305. package/dist/services/doctor/doctor-service/report/final-summary.d.ts +20 -0
  306. package/dist/services/doctor/doctor-service/report/final-summary.js +29 -0
  307. package/dist/services/doctor/doctor-service/types.d.ts +245 -0
  308. package/dist/services/doctor/doctor-service/types.js +15 -0
  309. package/dist/services/doctor/doctor-service.d.ts +15 -146
  310. package/dist/services/doctor/doctor-service.js +22 -926
  311. package/dist/services/doctor/index.d.ts +22 -0
  312. package/dist/services/doctor/index.js +22 -0
  313. package/dist/services/env/shell-probe.d.ts +71 -0
  314. package/dist/services/env/shell-probe.js +161 -0
  315. package/dist/services/evolution/evolution-types.d.ts +39 -39
  316. package/dist/services/final-review/final-review-service.d.ts +11 -1
  317. package/dist/services/final-review/index.d.ts +2 -0
  318. package/dist/services/final-review/index.js +1 -0
  319. package/dist/services/hooks/auto-compact-hook-install.d.ts +4 -5
  320. package/dist/services/hooks/auto-compact-hook-install.js +4 -5
  321. package/dist/services/hooks/worktree-authorization-gate.d.ts +205 -0
  322. package/dist/services/hooks/worktree-authorization-gate.js +492 -0
  323. package/dist/services/ide/adapters/claude-code-adapter.js +2 -2
  324. package/dist/services/ide/adapters/qoder-adapter.d.ts +25 -0
  325. package/dist/services/ide/adapters/qoder-adapter.js +57 -0
  326. package/dist/services/ide/adapters/tongyi-lingma-adapter.d.ts +16 -0
  327. package/dist/services/ide/adapters/tongyi-lingma-adapter.js +45 -0
  328. package/dist/services/ide/ide-registry.js +6 -0
  329. package/dist/services/ide/ide-types.d.ts +1 -1
  330. package/dist/services/job/job-types.d.ts +56 -56
  331. package/dist/services/job-snapshot/index.d.ts +8 -0
  332. package/dist/services/job-snapshot/index.js +7 -0
  333. package/dist/services/{job/job-resource-snapshot.d.ts → job-snapshot/snapshot.d.ts} +1 -1
  334. package/dist/services/job-snapshot/types.d.ts +7 -0
  335. package/dist/services/job-snapshot/types.js +1 -0
  336. package/dist/services/karpathy-cost/karpathy-cost-check-service.d.ts +67 -0
  337. package/dist/services/karpathy-cost/karpathy-cost-check-service.js +108 -0
  338. package/dist/services/log/retention.d.ts +16 -0
  339. package/dist/services/log/retention.js +17 -0
  340. package/dist/services/loop/loop-bee-relation-types.d.ts +6 -6
  341. package/dist/services/loop/loop-release-types.d.ts +24 -24
  342. package/dist/services/loop/monotonic-runner.d.ts +17 -11
  343. package/dist/services/loop/monotonic-runner.js +118 -79
  344. package/dist/services/memory/project-memory-service/index/kind-dispatch.d.ts +8 -0
  345. package/dist/services/memory/project-memory-service/index/kind-dispatch.js +253 -0
  346. package/dist/services/memory/project-memory-service/index/ranking.d.ts +6 -0
  347. package/dist/services/memory/project-memory-service/index/ranking.js +171 -0
  348. package/dist/services/memory/project-memory-service/index/search.d.ts +34 -0
  349. package/dist/services/memory/project-memory-service/index/search.js +194 -0
  350. package/dist/services/memory/project-memory-service/index.d.ts +9 -0
  351. package/dist/services/memory/project-memory-service/index.js +24 -0
  352. package/dist/services/memory/project-memory-service/parsers/frontmatter.d.ts +9 -0
  353. package/dist/services/memory/project-memory-service/parsers/frontmatter.js +106 -0
  354. package/dist/services/memory/project-memory-service/parsers/markdown-pure.d.ts +7 -0
  355. package/dist/services/memory/project-memory-service/parsers/markdown-pure.js +96 -0
  356. package/dist/services/memory/project-memory-service/store/atomic-write.d.ts +5 -0
  357. package/dist/services/memory/project-memory-service/store/atomic-write.js +56 -0
  358. package/dist/services/memory/project-memory-service/store/paths.d.ts +8 -0
  359. package/dist/services/memory/project-memory-service/store/paths.js +116 -0
  360. package/dist/services/memory/project-memory-service/types.d.ts +128 -0
  361. package/dist/services/memory/project-memory-service/types.js +9 -0
  362. package/dist/services/memory/project-memory-service.d.ts +1 -167
  363. package/dist/services/memory/project-memory-service.js +19 -816
  364. package/dist/services/migrate-skill-name/schema.d.ts +2 -2
  365. package/dist/services/observability/aggregation.d.ts +27 -0
  366. package/dist/services/observability/aggregation.js +72 -0
  367. package/dist/services/observability/observability-service.d.ts +73 -7
  368. package/dist/services/observability/observability-service.js +87 -1
  369. package/dist/services/openspec/artifact-boundary.d.ts +138 -0
  370. package/dist/services/openspec/artifact-boundary.js +150 -0
  371. package/dist/services/openspec/coverage-evidence-reader.d.ts +191 -0
  372. package/dist/services/openspec/coverage-evidence-reader.js +386 -0
  373. package/dist/services/openspec/openspec-archive-service.d.ts +70 -0
  374. package/dist/services/openspec/openspec-archive-service.js +320 -8
  375. package/dist/services/openspec/openspec-bridge-service.js +1 -1
  376. package/dist/services/openspec/openspec-init-service.js +1 -1
  377. package/dist/services/openspec/openspec-propose-from-doctor-service.js +1 -1
  378. package/dist/services/openspec/openspec-render-service.js +7 -4
  379. package/dist/services/openspec/openspec-scan-service.js +1 -1
  380. package/dist/services/openspec/openspec-validate-service.js +5 -4
  381. package/dist/services/preferences/preferences-service.js +10 -0
  382. package/dist/services/preferences/preferences-types.d.ts +13 -0
  383. package/dist/services/preferences/preferences-types.js +11 -0
  384. package/dist/services/qa/screenshot-archive-service.d.ts +51 -0
  385. package/dist/services/qa/screenshot-archive-service.js +134 -0
  386. package/dist/services/rd/rd-service.js +10 -11
  387. package/dist/services/rd/types.d.ts +32 -32
  388. package/dist/services/rd-swarm/rd-swarm-service.d.ts +60 -0
  389. package/dist/services/rd-swarm/rd-swarm-service.js +93 -0
  390. package/dist/services/recommendations/capability-seed-items.js +0 -1
  391. package/dist/services/recommendations/capability-seed-mappings.js +0 -1
  392. package/dist/services/recommendations/capability-seed-sources.js +0 -1
  393. package/dist/services/release/version-precheck-service.d.ts +51 -0
  394. package/dist/services/release/version-precheck-service.js +257 -0
  395. package/dist/services/scan/acceptance-coverage-service.js +1 -1
  396. package/dist/services/scan/archetype-service.js +1 -1
  397. package/dist/services/scan/existing-system-service.js +1 -1
  398. package/dist/services/scan/libraries-service.js +1 -1
  399. package/dist/services/sediment/json-schema.d.ts +40 -40
  400. package/dist/services/share/bundle-types.d.ts +12 -12
  401. package/dist/services/share/run-state-contract.d.ts +2 -2
  402. package/dist/services/skill/skill-search-service.d.ts +12 -7
  403. package/dist/services/skill/skill-search-service.js +8 -4
  404. package/dist/services/skillhub/migrations/001-initial.sql +71 -0
  405. package/dist/services/skillhub/migrations/002-loop-release.sql +32 -0
  406. package/dist/services/skillhub/migrations/003-loop-bee-relation.sql +35 -0
  407. package/dist/services/skillhub/migrations/004-loop-bee-extension.sql +65 -0
  408. package/dist/services/skillhub/migrations/005-evolution-evaluation.sql +81 -0
  409. package/dist/services/skillhub/migrations/006-crystallization-event.sql +92 -0
  410. package/dist/services/skills/hooks-settings-service.d.ts +75 -0
  411. package/dist/services/skills/hooks-settings-service.js +230 -2
  412. package/dist/services/skills/skill-registry.d.ts +1 -0
  413. package/dist/services/skills/skill-registry.js +6 -4
  414. package/dist/services/skills/skill-runbook-service.js +1 -1
  415. package/dist/services/slice/slice-check-service.js +1 -1
  416. package/dist/services/standards/main-session-monitor-ban-hook.d.ts +14 -0
  417. package/dist/services/standards/main-session-monitor-ban-hook.js +19 -0
  418. package/dist/services/standards/missing-standards-detector.d.ts +25 -0
  419. package/dist/services/standards/missing-standards-detector.js +43 -12
  420. package/dist/services/tech/tech-change-id-service.d.ts +82 -0
  421. package/dist/services/tech/tech-change-id-service.js +117 -0
  422. package/dist/services/understand/understand-hybrid-service.js +1 -1
  423. package/dist/services/understand/understand-scan-service.js +2 -2
  424. package/dist/services/upgrade/upgrade-service.js +4 -3
  425. package/dist/services/verdict/envelopes.d.ts +2 -2
  426. package/dist/services/verdict/envelopes.js +2 -2
  427. package/dist/services/verdict/verdict-aggregator.d.ts +3 -3
  428. package/dist/services/vm/vm-lease.d.ts +40 -0
  429. package/dist/services/vm/vm-lease.js +137 -0
  430. package/dist/services/workflow/autonomous-resume-writer.js +1 -1
  431. package/dist/services/workflow/pipeline-verify-gate-support.d.ts +47 -0
  432. package/dist/services/workflow/pipeline-verify-gate-support.js +194 -0
  433. package/dist/services/workflow/pipeline-verify-service.d.ts +17 -81
  434. package/dist/services/workflow/pipeline-verify-service.js +42 -218
  435. package/dist/services/workflow/pipeline-verify-types.d.ts +90 -0
  436. package/dist/services/workflow/pipeline-verify-types.js +10 -0
  437. package/dist/services/workflow/plan-reader.d.ts +1 -1
  438. package/dist/services/workflow/plan-reader.js +1 -1
  439. package/dist/services/workflow/plan-refresher.d.ts +1 -1
  440. package/dist/services/workflow/plan-refresher.js +1 -1
  441. package/dist/services/workflow/plan-trigger-detector.d.ts +1 -1
  442. package/dist/services/workflow/plan-trigger-detector.js +1 -1
  443. package/dist/services/workflow/workflow-autonomous-resume-helpers.d.ts +1 -1
  444. package/dist/services/workflow/workflow-autonomous-service.d.ts +2 -98
  445. package/dist/services/workflow/workflow-autonomous-types.d.ts +114 -0
  446. package/dist/services/workflow/workflow-autonomous-types.js +21 -0
  447. package/dist/services/workflow/workflow-router-service.js +18 -16
  448. package/dist/services/workflow/workflow-spec-lint.d.ts +13 -0
  449. package/dist/services/workflow/workflow-spec-lint.js +75 -0
  450. package/dist/services/workflow/workflow-spec-types.d.ts +100 -0
  451. package/dist/services/workflow/workflow-spec-types.js +13 -0
  452. package/dist/services/workflow/workflow-spec-yaml.d.ts +17 -0
  453. package/dist/services/workflow/workflow-spec-yaml.js +88 -0
  454. package/dist/services/workflow/workflow-spec.d.ts +11 -91
  455. package/dist/services/workflow/workflow-spec.js +16 -145
  456. package/dist/services/workspace/migrate-service.js +1 -1
  457. package/dist/services/workspace/workspace-service.js +1 -1
  458. package/dist/services/worktree/worktree-lease.d.ts +170 -0
  459. package/dist/services/worktree/worktree-lease.js +242 -0
  460. package/package.json +91 -51
  461. package/scripts/clean-dist.mjs +31 -1
  462. package/scripts/copy-templates.mjs +16 -0
  463. package/scripts/sync-version.mjs +53 -2
  464. package/skills/bee/peaks-perf-audit/SKILL.md +17 -0
  465. package/skills/bee/peaks-prd/SKILL.md +16 -0
  466. package/skills/bee/peaks-prd/test-prompts.json +12 -0
  467. package/skills/bee/peaks-qa/SKILL.md +16 -1
  468. package/skills/bee/peaks-qa/references/qa-sub-agent-dispatch.md +22 -0
  469. package/skills/bee/peaks-qa/test-prompts.json +12 -0
  470. package/skills/bee/peaks-rd/SKILL.md +29 -20
  471. package/skills/bee/peaks-rd/references/rd-sub-agent-dispatch.md +39 -0
  472. package/skills/bee/peaks-rd/test-prompts.json +12 -0
  473. package/skills/bee/peaks-reviewer/SKILL.md +17 -0
  474. package/skills/bee/peaks-sc/SKILL.md +16 -0
  475. package/skills/bee/peaks-security-audit/SKILL.md +17 -0
  476. package/skills/bee/peaks-txt/SKILL.md +16 -0
  477. package/skills/bee/peaks-txt/test-prompts.json +12 -0
  478. package/skills/bee/peaks-ui/SKILL.md +49 -43
  479. package/skills/bee/peaks-ui/test-prompts.json +12 -0
  480. package/skills/peaks-code/SKILL.md +54 -109
  481. package/skills/peaks-code/references/boundaries.md +15 -1
  482. package/skills/peaks-code/references/cron-scheduler-deployment.md +313 -0
  483. package/skills/peaks-code/references/external-skill-invocation.md +27 -0
  484. package/skills/peaks-code/references/lease-dashboard.html +224 -0
  485. package/skills/peaks-code/references/lease-stats.sample.json +26 -0
  486. package/skills/peaks-code/references/peaks-worktree-l2-enforcers.md +208 -0
  487. package/skills/peaks-code/references/periodic-checkpoint.md +4 -4
  488. package/skills/peaks-code/references/runbook.md +63 -1
  489. package/skills/peaks-code/references/startup-sequence.md +110 -0
  490. package/skills/peaks-code/references/step-0-8-gate.md +1 -1
  491. package/skills/peaks-code/references/sub-agent-dispatch.md +92 -1
  492. package/skills/peaks-code/references/worktree-governance.md +123 -0
  493. package/skills/peaks-code/test-prompts.json +12 -0
  494. package/skills/peaks-doctor/SKILL.md +1 -1
  495. package/skills/peaks-ide/SKILL.md +1 -1
  496. package/skills/peaks-solo/SKILL.md +21 -0
  497. package/skills/peaks-solo/references/triage-decision-table.md +6 -0
  498. package/skills/peaks-sop/test-prompts.json +17 -0
  499. package/dist/cli/commands/agent-commands.d.ts +0 -20
  500. package/dist/cli/commands/agent-commands.js +0 -48
  501. package/dist/cli/commands/classify-classify-commands.d.ts +0 -19
  502. package/dist/cli/commands/classify-classify-commands.js +0 -151
  503. package/dist/cli/commands/contract-commands.d.ts +0 -26
  504. package/dist/cli/commands/contract-commands.js +0 -114
  505. package/dist/cli/commands/session-auto-compact-hook-command.d.ts +0 -37
  506. package/dist/cli/commands/session-auto-compact-hook-command.js +0 -127
  507. package/dist/cli/commands/worker-commands.d.ts +0 -3
  508. package/dist/cli/commands/worker-commands.js +0 -52
  509. package/dist/services/agent/ecc-agent-service.d.ts +0 -47
  510. package/dist/services/agent/ecc-agent-service.js +0 -143
  511. package/dist/services/config/provider-service.d.ts +0 -48
  512. package/dist/services/config/provider-service.js +0 -143
  513. package/dist/services/context/dispatch-context-guard.d.ts +0 -27
  514. package/dist/services/context/dispatch-context-guard.js +0 -192
  515. package/dist/services/context/shared-channel.d.ts +0 -93
  516. package/dist/services/context/shared-channel.js +0 -308
  517. package/dist/services/filesystem/file-lock.d.ts +0 -11
  518. package/dist/services/filesystem/file-lock.js +0 -152
  519. package/dist/services/mut/assert-scanner.d.ts +0 -6
  520. package/dist/services/mut/assert-scanner.js +0 -116
  521. package/dist/services/mut/index.d.ts +0 -8
  522. package/dist/services/mut/index.js +0 -7
  523. package/dist/services/mut/mut-runner.d.ts +0 -39
  524. package/dist/services/mut/mut-runner.js +0 -29
  525. package/dist/services/mut/production-stryker.d.ts +0 -2
  526. package/dist/services/mut/production-stryker.js +0 -75
  527. package/dist/services/mut/report-builder.d.ts +0 -11
  528. package/dist/services/mut/report-builder.js +0 -110
  529. package/dist/services/mut/report-loader.d.ts +0 -31
  530. package/dist/services/mut/report-loader.js +0 -78
  531. package/dist/services/mut/thresholds.d.ts +0 -21
  532. package/dist/services/mut/thresholds.js +0 -22
  533. package/dist/services/mut/types.d.ts +0 -336
  534. package/dist/services/mut/types.js +0 -59
  535. package/dist/services/providers/minimax-provider-service.d.ts +0 -24
  536. package/dist/services/providers/minimax-provider-service.js +0 -143
  537. package/dist/services/providers/minimax-worker-service.d.ts +0 -21
  538. package/dist/services/providers/minimax-worker-service.js +0 -83
  539. package/dist/shared/fs.d.ts +0 -4
  540. package/dist/shared/fs.js +0 -26
  541. package/dist/shared/paths.d.ts +0 -6
  542. package/dist/shared/paths.js +0 -50
  543. package/dist/shared/result.d.ts +0 -22
  544. package/dist/shared/result.js +0 -46
  545. package/dist/shared/version.d.ts +0 -1
  546. package/dist/shared/version.js +0 -1
  547. package/examples/video-demo/README.md +0 -142
  548. package/examples/video-demo/out/en-closing-960.png +0 -0
  549. package/examples/video-demo/out/zh-closing-960.png +0 -0
  550. package/examples/video-demo/preview/peaks-loop-demo-en.mp4 +0 -0
  551. package/examples/video-demo/preview/peaks-loop-demo.mp4 +0 -0
  552. /package/dist/services/{job/job-resource-snapshot.js → job-snapshot/snapshot.js} +0 -0
@@ -0,0 +1,272 @@
1
+ /**
2
+ * Slice 2026-07-29-dispatch-stall-governance / S4 — unified batch
3
+ * awaiter.
4
+ *
5
+ * Pre-S4, `awaitClaudeCodeBatch` and `pollDispatchRecords` were two
6
+ * near-identical poll loops with two subtle differences:
7
+ * - awaitClaudeCodeBatch clamped with `Math.min(deadline, 120_000)`
8
+ * - pollDispatchRecords clamped with
9
+ * `Math.min(Math.max(deadline, 0), 120_000)`
10
+ * and different default-fallback sources. The PRD R4 records the
11
+ * resulting failure shape: a fix applied to one path did not
12
+ * propagate to the other (per
13
+ * .peaks/memory/2026-07-26-peaks-code-concurrent-subagent-coordination.md).
14
+ *
15
+ * This file is the single implementation. Both `awaitClaudeCodeBatch`
16
+ * and `pollDispatchRecords` (kept exported for back-compat with the
17
+ * existing tests) thin-wrap this.
18
+ *
19
+ * S4 also closes the silent-timeout return:
20
+ * - the result shape now includes a typed `outcome` field that is
21
+ * one of 'completed' | 'timed-out' | 'clamped' | 'no-progress'.
22
+ * A caller that asks for `timeoutMs: 600_000` and the loop clamps
23
+ * to the hard cap sees `outcome: 'clamped'` and the requested /
24
+ * effective budgets on the result.
25
+ * - the loop no longer returns a success-shaped result on full
26
+ * timeout. A timed-out slot still appears in the per-dispatch
27
+ * results array, but the *batch* outcome is `timed-out`.
28
+ * - the no-progress watchdog (a new option) raises the `no-progress`
29
+ * outcome before the full deadline elapses if a bounded window
30
+ * passes with no observable progress (e.g. a slot's `lastBeatAt`
31
+ * has not advanced).
32
+ *
33
+ * The de-escalation flag is `PEAKS_DISPATCH_DISABLE_FAILFAST` (read
34
+ * from process.env at module load). When set, the loop falls back to
35
+ * the pre-S4 silent return so a stuck session can be unblocked by
36
+ * flipping the env var rather than rebuilding.
37
+ */
38
+ import { existsSync, readFileSync } from 'node:fs';
39
+ const DEFAULT_HARD_CAP_MS = 120_000;
40
+ const DEFAULT_NO_PROGRESS_MS = 60_000;
41
+ const DEFAULT_POLL_INTERVAL_MS = 50;
42
+ /**
43
+ * Fail-fast de-escalation: the env var is read once at module load
44
+ * (matches the pre-S4 env-var-loading semantics for `peaks`
45
+ * debug). Setting it falls back to the silent-return behavior so a
46
+ * stuck session can be unblocked without a rebuild.
47
+ */
48
+ const FAILFAST_DISABLED = (() => {
49
+ const v = process.env.PEAKS_DISPATCH_DISABLE_FAILFAST;
50
+ return v === '1' || v === 'true';
51
+ })();
52
+ /**
53
+ * Run one awaitBatch. Pure (no module-level state); the two
54
+ * back-compat wrappers in sub-agent-dispatcher.ts call this.
55
+ */
56
+ export async function awaitBatch(dispatchCount, recordPaths, timeoutMs, options = { defaultTimeoutMs: 60_000 }) {
57
+ if (dispatchCount <= 0 || recordPaths.length === 0) {
58
+ const requested = timeoutMs ?? options.defaultTimeoutMs;
59
+ return {
60
+ results: [],
61
+ outcome: 'completed',
62
+ requestedTimeoutMs: requested,
63
+ effectiveTimeoutMs: 0,
64
+ hardCapMs: options.hardCapMs ?? DEFAULT_HARD_CAP_MS
65
+ };
66
+ }
67
+ const hardCap = options.hardCapMs ?? DEFAULT_HARD_CAP_MS;
68
+ const requested = timeoutMs ?? options.defaultTimeoutMs;
69
+ // S4 (AC-3.2) — surface the clamp. A caller-supplied timeout above
70
+ // the hard cap is reported as `clamped`; the effective budget is
71
+ // what the loop actually waited.
72
+ const requestedClamped = requested > hardCap;
73
+ const effective = Math.min(Math.max(requested, 0), hardCap);
74
+ const noProgressBudget = options.noProgressMs ?? DEFAULT_NO_PROGRESS_MS;
75
+ const now = options.now ?? (() => Date.now());
76
+ const schedule = options.schedule ?? ((cb, ms) => {
77
+ const t = setTimeout(cb, ms);
78
+ t.unref?.();
79
+ return t;
80
+ });
81
+ const readOutcome = options.readOutcome ?? ((p) => defaultReadOutcome(p).status);
82
+ const readRecord = options.readRecord ?? defaultReadOutcome;
83
+ const startedAt = now();
84
+ const slots = new Map();
85
+ for (let i = 0; i < recordPaths.length; i += 1) {
86
+ const recordPath = recordPaths[i] ?? '';
87
+ slots.set(i, {
88
+ recordPath,
89
+ status: 'timeout',
90
+ note: null,
91
+ finishedAt: null,
92
+ lastProgress: 0
93
+ });
94
+ }
95
+ // Track last observed progress per slot to power the no-progress
96
+ // watchdog. The watchdog advances on any per-tick observation
97
+ // change in the slot's progress hint (read from the file's
98
+ // `progress` field when available, else from the `heartbeats`
99
+ // array's last entry).
100
+ const lastProgressAt = new Map();
101
+ for (const [idx] of slots) {
102
+ lastProgressAt.set(idx, startedAt);
103
+ }
104
+ let batchOutcome = 'completed';
105
+ while (slots.size > 0 && now() - startedAt < effective) {
106
+ let allDone = true;
107
+ for (const [idx, slot] of slots) {
108
+ if (slot.finishedAt !== null)
109
+ continue;
110
+ const outcome = readOutcome(slot.recordPath);
111
+ if (outcome === null) {
112
+ allDone = false;
113
+ continue;
114
+ }
115
+ // The default readOutcome returns the on-disk `status`. We map
116
+ // a small set of values to the per-dispatch status union.
117
+ // Slice 2026-07-30-nightshift: also capture the optional
118
+ // `outcome` field so the per-IDE note can surface the human
119
+ // reason (e.g. "mock failure at leaf-2"). The `outcome` is read
120
+ // alongside the `status` via `readRecord` and surfaced into
121
+ // `slot.note` for failed dispatches; for done/cancelled the
122
+ // note is left null (matches the pre-nightshift contract).
123
+ // `stale` is mapped to `timeout` so the per-IDE note preserves
124
+ // the human-readable reason (cursor / claude-code both surface
125
+ // `stale` on the wire but the BatchResult.status union only
126
+ // knows `timeout`).
127
+ const record = readRecord(slot.recordPath);
128
+ if (outcome === 'done' || outcome === 'success') {
129
+ slot.status = 'done';
130
+ slot.note = null;
131
+ slot.finishedAt = now();
132
+ lastProgressAt.set(idx, now());
133
+ }
134
+ else if (outcome === 'failed') {
135
+ slot.status = 'failed';
136
+ slot.note = record.outcome ?? null;
137
+ slot.finishedAt = now();
138
+ lastProgressAt.set(idx, now());
139
+ }
140
+ else if (outcome === 'cancelled') {
141
+ slot.status = 'cancelled';
142
+ slot.note = null;
143
+ slot.finishedAt = now();
144
+ lastProgressAt.set(idx, now());
145
+ }
146
+ else if (outcome === 'stale') {
147
+ slot.status = 'timeout';
148
+ slot.note = 'stale';
149
+ slot.finishedAt = now();
150
+ lastProgressAt.set(idx, now());
151
+ }
152
+ else {
153
+ // Any other status (queued / running / finalizing /
154
+ // never-started / unreadable) means the dispatch has not
155
+ // reached a terminal state yet.
156
+ allDone = false;
157
+ }
158
+ }
159
+ if (allDone)
160
+ break;
161
+ // No-progress watchdog: if every slot has been without observable
162
+ // progress for `noProgressBudget`, escalate.
163
+ if (now() - startedAt < effective) {
164
+ const allStalled = Array.from(slots.entries()).every(([idx, slot]) => slot.finishedAt !== null || (now() - (lastProgressAt.get(idx) ?? startedAt)) >= noProgressBudget);
165
+ if (allStalled && slots.size > 0) {
166
+ batchOutcome = 'no-progress';
167
+ break;
168
+ }
169
+ }
170
+ // Sleep a tick.
171
+ await new Promise((resolveSleep) => schedule(() => resolveSleep(), DEFAULT_POLL_INTERVAL_MS));
172
+ }
173
+ // Post-loop batch outcome:
174
+ // - `completed` — every slot reached a terminal state
175
+ // - `timed-out` — at least one slot is still pending and the
176
+ // effective budget elapsed
177
+ // - `clamped` — the caller's `requestedTimeoutMs` exceeded the
178
+ // hard cap (AC-3.2). The loop still ran the effective budget;
179
+ // `clamped` takes precedence over `timed-out` because the
180
+ // caller specifically asked for more than the cap and the
181
+ // caller needs to know the cap was applied (the timeout is
182
+ // secondary information).
183
+ // - `no-progress` — the watchdog fired (AC-3.4)
184
+ if (batchOutcome === 'completed' && slots.size > 0) {
185
+ const allReached = Array.from(slots.values()).every((s) => s.finishedAt !== null);
186
+ if (!allReached) {
187
+ batchOutcome = requestedClamped ? 'clamped' : 'timed-out';
188
+ }
189
+ }
190
+ if (batchOutcome === 'completed' && requestedClamped) {
191
+ batchOutcome = 'clamped';
192
+ }
193
+ // Build the per-dispatch results in dispatchIndex order.
194
+ // Slice 2026-07-30-nightshift: the per-IDE note construction is
195
+ // rewritten to match the 1.4 dogfood contract:
196
+ // - claude-code (no notePrefix): note = slot.note (the raw
197
+ // outcome, or null when done/cancelled)
198
+ // - other IDEs (notePrefix set):
199
+ // - on timeout: `${notePrefix} (timeout)`
200
+ // - on failed (with outcome): `${notePrefix} — ${outcome}`
201
+ // - on failed (no outcome): `${notePrefix}`
202
+ // - on done / cancelled: `${notePrefix}`
203
+ const results = Array.from(slots.entries())
204
+ .sort(([a], [b]) => a - b)
205
+ .map(([idx, slot]) => {
206
+ const finishedAt = slot.finishedAt ?? startedAt + effective;
207
+ const baseNote = options.notePrefix ?? null;
208
+ let note;
209
+ if (baseNote === null) {
210
+ // Claude-Code path: surface the raw outcome (no per-IDE prefix).
211
+ note = slot.note;
212
+ }
213
+ else if (slot.finishedAt === null) {
214
+ // Timed-out slot: keep the legacy ` (timeout)` suffix.
215
+ note = `${baseNote} (timeout)`;
216
+ }
217
+ else if (slot.status === 'failed' && slot.note !== null && slot.note.length > 0) {
218
+ // Failed with a human reason: `${notePrefix} — ${outcome}`.
219
+ note = `${baseNote} — ${slot.note}`;
220
+ }
221
+ else if (slot.note !== null && slot.note.length > 0) {
222
+ // Non-failed terminal slot with a non-null note (e.g. cursor /
223
+ // claude-code `stale` → status=timeout, note='stale'):
224
+ // `${notePrefix} — ${note}` so the human reason is surfaced.
225
+ // Slice 2026-07-30-nightshift: previously this branch dropped
226
+ // the slot's note entirely (the bare-prefix else swallowed
227
+ // it). The 1.4 dogfood for `stale` flips the contract.
228
+ note = `${baseNote} — ${slot.note}`;
229
+ }
230
+ else {
231
+ // Done / cancelled / failed-without-reason: bare prefix.
232
+ note = baseNote;
233
+ }
234
+ return {
235
+ dispatchIndex: idx,
236
+ recordPath: slot.recordPath,
237
+ status: slot.status,
238
+ durationMs: finishedAt - startedAt,
239
+ note
240
+ };
241
+ });
242
+ // Fail-fast de-escalation: when the env var is set, surface the
243
+ // typed outcome but do not let it influence the per-dispatch
244
+ // results. This preserves the pre-S4 silent-return shape so a
245
+ // stuck session can be unblocked by flipping the flag.
246
+ if (FAILFAST_DISABLED && (batchOutcome === 'timed-out' || batchOutcome === 'no-progress' || batchOutcome === 'clamped')) {
247
+ batchOutcome = 'completed';
248
+ }
249
+ return {
250
+ results,
251
+ outcome: batchOutcome,
252
+ requestedTimeoutMs: requested,
253
+ effectiveTimeoutMs: effective,
254
+ hardCapMs: hardCap
255
+ };
256
+ }
257
+ function defaultReadOutcome(recordPath) {
258
+ if (!recordPath)
259
+ return { status: null, outcome: null };
260
+ try {
261
+ if (!existsSync(recordPath))
262
+ return { status: null, outcome: null };
263
+ const raw = readFileSync(recordPath, 'utf8');
264
+ const obj = JSON.parse(raw);
265
+ const status = typeof obj.status === 'string' ? obj.status : null;
266
+ const outcome = typeof obj.outcome === 'string' ? obj.outcome : null;
267
+ return { status, outcome };
268
+ }
269
+ catch {
270
+ return { status: null, outcome: null };
271
+ }
272
+ }
@@ -23,7 +23,7 @@
23
23
  */
24
24
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
25
25
  import { dirname, resolve } from 'node:path';
26
- import { withFileLockSync } from '../filesystem/file-lock.js';
26
+ import { withFileLockSync } from 'peaks-loop-shared-channel';
27
27
  export const BATCH_LIMIT = 6;
28
28
  export const BATCH_OVER_LIMIT_CODE = 'BATCH_OVER_LIMIT';
29
29
  /** Build the per-batch counter file path. */
@@ -1,4 +1,5 @@
1
1
  import type { SubAgentToolCall } from './sub-agent-dispatcher.js';
2
+ import { type StageLabel } from './stage-enum.js';
2
3
  /** G6.3 Heartbeat entry — single update written by a running sub-agent. */
3
4
  export interface Heartbeat {
4
5
  readonly at: string;
@@ -6,12 +7,43 @@ export interface Heartbeat {
6
7
  readonly progress: number;
7
8
  readonly note: string | null;
8
9
  }
9
- export type HeartbeatStatus = 'queued' | 'running' | 'finalizing' | 'done' | 'failed' | 'stale';
10
- export type DispatchRecordStatus = 'queued' | 'running' | 'finalizing' | 'done' | 'failed' | 'cancelled' | 'no-execution' | 'stale';
10
+ export type HeartbeatStatus = 'queued' | 'running' | 'finalizing' | 'done' | 'failed' | 'stale' | 'cancelled' | 'no-execution' | 'never-started' | 'unreadable';
11
+ export type DispatchRecordStatus = 'queued' | 'running' | 'finalizing' | 'done' | 'failed' | 'cancelled' | 'no-execution' | 'stale' | 'never-started' | 'unreadable';
11
12
  export type DispatchOutcome = 'success' | 'failed' | 'timeout' | 'cancelled' | 'no-execution';
12
13
  /** G2+G5+G6 dispatch record schema (AC-26 + AC-34). */
13
14
  export interface DispatchRecord {
14
- readonly version: 2;
15
+ /**
16
+ * Slice 2026-07-29-worktree-l2-extended Part 4.C: schema v3 makes
17
+ * `leaseId` a structurally required field (was `leaseId?: string | null`
18
+ * in v2). The v3 upgrade is a "fill in" migration: every dispatch
19
+ * writer knows its lease id at construction time (Part 2.C's
20
+ * --isolation worktree spawns it; non-isolation dispatches stamp
21
+ * `null`). Readers tolerate both v2 and v3 on disk (see
22
+ * `upgradeRecord`); the `?` was a Part 4.A ergonomic concession
23
+ * to keep 4 unit-test literal sites from breaking the build. v3
24
+ * moves the optional off the type and adds the field to the
25
+ * 4 literal sites in one pass.
26
+ *
27
+ * Slice 2026-07-29-worktree-l2-extended Part 7: schema v3.1 adds
28
+ * `isolationStartedAt: string | null` for the L4 isolation
29
+ * bridge (Part 8 container POC). It's the ISO timestamp of
30
+ * when the isolation mode was set up (e.g. when the worktree
31
+ * was spawned). `null` means the dispatch did not request
32
+ * isolation. The `version` field stays at 3 because the
33
+ * v3 → v3.1 transition is additive; the new field is
34
+ * defaulted to `null` on read so v3 records upgrade cleanly.
35
+ */
36
+ /**
37
+ * Slice 2026-07-29-rid-prose-only-sweep Part 34: schema v3.1
38
+ * is the explicit minor bump that records the
39
+ * `isolationStartedAt` (Part 7) and `leaseId` (Part 3.A.1 +
40
+ * Part 4.C) fields as part of the canonical schema. v3
41
+ * records on disk upgrade transparently — see `upgradeRecord`
42
+ * in this file. The literal type ('3.1') is the source of
43
+ * truth for "this record is v3.1-form"; readers check
44
+ * `version === '3.1'` for forward-compatible dispatching.
45
+ */
46
+ readonly version: '3.1';
15
47
  readonly createdAt: string;
16
48
  readonly completedAt: string | null;
17
49
  readonly outcome: DispatchOutcome;
@@ -29,6 +61,35 @@ export interface DispatchRecord {
29
61
  readonly heartbeats: readonly Heartbeat[];
30
62
  readonly lastBeatAt: string | null;
31
63
  readonly status: DispatchRecordStatus;
64
+ readonly stage: string | null;
65
+ /**
66
+ * Slice 2026-07-29-worktree-l2-extended Part 3.A + Part 4.C: the
67
+ * worktree lease id stamped on this dispatch (via `peaks sub-agent
68
+ * dispatch --isolation worktree`). The release hook (see
69
+ * markCompleted + `peaks sub-agent heartbeat --status done`)
70
+ * reads this field to auto-call `peaks worktree release` when
71
+ * the sub-agent finalizes. `null` means the dispatch did not
72
+ * request isolation and no release will fire. Persisted for
73
+ * audit + idempotency so a re-read of an old record still
74
+ * surfaces the lease id even if the on-disk lease file has since
75
+ * been gc'd.
76
+ *
77
+ * v3 (Part 4.C) makes this structurally required. v2 records
78
+ * missing the field upgrade to `null` on read (see
79
+ * `upgradeRecord`).
80
+ */
81
+ readonly leaseId: string | null;
82
+ /**
83
+ * Slice 2026-07-29-worktree-l2-extended Part 7: ISO timestamp of
84
+ * when the isolation mode was set up. For `--isolation worktree`
85
+ * this is the moment `peaks worktree spawn` returned; for
86
+ * `--isolation container` (Part 8) it's when the container
87
+ * runtime reported the container as running. `null` when the
88
+ * dispatch did not request isolation. Lets the dashboard
89
+ * compute isolation duration (now - isolationStartedAt) without
90
+ * cross-referencing the metrics stream.
91
+ */
92
+ readonly isolationStartedAt: string | null;
32
93
  }
33
94
  /** Input for the initial write. */
34
95
  export type WriteInitialDispatchInput = {
@@ -41,6 +102,22 @@ export type WriteInitialDispatchInput = {
41
102
  batchId: string;
42
103
  /** Override the timestamp (testing). */
43
104
  now?: () => Date;
105
+ /**
106
+ * Slice 2026-07-29-worktree-l2-extended Part 3.A: the worktree
107
+ * lease id this dispatch owns (set by `peaks sub-agent dispatch
108
+ * --isolation worktree`). Persisted so the finalize-time release
109
+ * hook in `markCompleted` can fire even after the dispatch
110
+ * process exits. Optional; absent when the dispatch did not
111
+ * request isolation.
112
+ */
113
+ leaseId?: string | null;
114
+ /**
115
+ * Slice 2026-07-29-worktree-l2-extended Part 7: ISO timestamp
116
+ * when the isolation mode was set up. Optional on the input
117
+ * (defaults to `null`); dispatch-commands.ts passes the spawn
118
+ * time when `--isolation` is requested.
119
+ */
120
+ isolationStartedAt?: string | null;
44
121
  };
45
122
  /** Heartbeat write input. */
46
123
  export type AppendHeartbeatInput = {
@@ -82,7 +159,7 @@ export interface ActiveDispatchEntry {
82
159
  readonly role: string;
83
160
  readonly batchId: string;
84
161
  readonly createdAt: string;
85
- readonly status: 'queued' | 'running' | 'finalizing' | 'done' | 'failed' | 'cancelled' | 'stale' | 'no-execution';
162
+ readonly status: 'queued' | 'running' | 'finalizing' | 'done' | 'failed' | 'cancelled' | 'stale' | 'no-execution' | 'never-started' | 'unreadable';
86
163
  }
87
164
  /**
88
165
  * Slice 2026-06-23-audit-4th #A4: read the active-dispatches index
@@ -118,6 +195,34 @@ export declare function applyTruncation(entries: readonly Heartbeat[]): {
118
195
  heartbeats: Heartbeat[];
119
196
  truncated: boolean;
120
197
  };
198
+ /**
199
+ * Slice 2026-07-29-worktree-l2-extended Part 3.A: fire-and-forget
200
+ * auto-release for the lease owned by a dispatch. Called from
201
+ * `markCompleted` (terminal status) and from the heartbeat CLI
202
+ * (`--status done`).
203
+ *
204
+ * Design:
205
+ * - The release subprocess is spawned ASYNC and detached. The
206
+ * finalize-time caller (heartbeat / share / dispatch reducer)
207
+ * does NOT await it; the caller's job is to record the
208
+ * finalization, not to wait for the lease cleanup.
209
+ * - Failures are swallowed (best-effort, same as `git worktree
210
+ * remove` inside `peaks worktree release` itself). The next
211
+ * `peaks worktree gc` pass is the safety net.
212
+ * - Idempotent: re-calling with the same leaseId is a no-op on
213
+ * the release side (the CLI refuses to re-release an already-
214
+ * released lease; see Part 1 release command).
215
+ * - The leaseId MUST be 16-hex (same regex the gate uses). Any
216
+ * other value is silently ignored — we never shell out to
217
+ * `peaks worktree release` with attacker-controlled input.
218
+ */
219
+ export declare function tryAutoReleaseLease(args: {
220
+ projectRoot: string;
221
+ sessionId: string;
222
+ leaseId: string;
223
+ /** Best-effort logging hook (e.g. logger.writeLogEntry). Returns null on failure. */
224
+ logger?: (line: string) => void;
225
+ }): void;
121
226
  /** Mark a record as completed (success / failed / cancelled / no-execution). */
122
227
  export declare function markCompleted(input: LifecycleInput): {
123
228
  record: DispatchRecord;
@@ -126,6 +231,23 @@ export declare function markCompleted(input: LifecycleInput): {
126
231
  export declare function markDisposed(recordPath: string, now?: () => Date): {
127
232
  record: DispatchRecord;
128
233
  };
234
+ /**
235
+ * Slice 2026-07-29-dispatch-stall-governance / S5 (AC-5.1) — promote
236
+ * the record's `stage` field. Rejects unknown values with
237
+ * `INVALID_STAGE`; the LLM-side runner surfaces the error so the
238
+ * sub-agent can pick from the bounded enum in ./stage-enum.ts.
239
+ *
240
+ * Atomic via the same `withFileLockSync` lock as `appendHeartbeat` /
241
+ * `markCompleted`. `null` is a valid argument ("clear the stage")
242
+ * but unknown strings are not.
243
+ */
244
+ export declare function setStage(input: {
245
+ recordPath: string;
246
+ stage: StageLabel | null;
247
+ now?: () => Date;
248
+ }): {
249
+ record: DispatchRecord;
250
+ };
129
251
  /**
130
252
  * Read a dispatch record with backward-compat defaults. Old records
131
253
  * missing G5 / G6 fields are upgraded on read (no error, no overwrite).