harnery 0.35.0 → 0.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (843) hide show
  1. package/dist/commander.d.ts +30 -5
  2. package/dist/commander.d.ts.map +1 -1
  3. package/dist/commander.js +128 -96
  4. package/dist/commands/agents.d.ts +23 -3
  5. package/dist/commands/agents.d.ts.map +1 -1
  6. package/dist/commands/agents.js +464 -242
  7. package/dist/commands/artifacts.d.ts.map +1 -1
  8. package/dist/commands/artifacts.js +26 -1
  9. package/dist/commands/backup.d.ts.map +1 -1
  10. package/dist/commands/backup.js +10 -10
  11. package/dist/commands/browse-session.d.ts.map +1 -1
  12. package/dist/commands/browse-session.js +12 -0
  13. package/dist/commands/browse.d.ts +1 -1
  14. package/dist/commands/browse.d.ts.map +1 -1
  15. package/dist/commands/browse.js +16 -4
  16. package/dist/commands/conversations.d.ts +10 -0
  17. package/dist/commands/conversations.d.ts.map +1 -0
  18. package/dist/commands/conversations.js +201 -0
  19. package/dist/commands/deinit.d.ts.map +1 -1
  20. package/dist/commands/deinit.js +5 -0
  21. package/dist/commands/diagnostics.d.ts +4 -0
  22. package/dist/commands/diagnostics.d.ts.map +1 -0
  23. package/dist/commands/diagnostics.js +229 -0
  24. package/dist/commands/docs.d.ts.map +1 -1
  25. package/dist/commands/docs.js +13 -2
  26. package/dist/commands/doctor.d.ts +5 -0
  27. package/dist/commands/doctor.d.ts.map +1 -1
  28. package/dist/commands/doctor.js +51 -7
  29. package/dist/commands/fetch.js +6 -5
  30. package/dist/commands/files.d.ts +34 -0
  31. package/dist/commands/files.d.ts.map +1 -0
  32. package/dist/commands/files.js +166 -0
  33. package/dist/commands/governor.d.ts.map +1 -1
  34. package/dist/commands/governor.js +18 -12
  35. package/dist/commands/inbox.d.ts +5 -0
  36. package/dist/commands/inbox.d.ts.map +1 -0
  37. package/dist/commands/inbox.js +57 -0
  38. package/dist/commands/init.d.ts +4 -5
  39. package/dist/commands/init.d.ts.map +1 -1
  40. package/dist/commands/init.js +63 -13
  41. package/dist/commands/ledger-v3.d.ts.map +1 -1
  42. package/dist/commands/ledger-v3.js +417 -2
  43. package/dist/commands/logs.d.ts +4 -0
  44. package/dist/commands/logs.d.ts.map +1 -0
  45. package/dist/commands/logs.js +169 -0
  46. package/dist/commands/messages.d.ts +5 -0
  47. package/dist/commands/messages.d.ts.map +1 -0
  48. package/dist/commands/messages.js +45 -0
  49. package/dist/commands/outline.d.ts +1 -1
  50. package/dist/commands/outline.d.ts.map +1 -1
  51. package/dist/commands/outline.js +2 -2
  52. package/dist/commands/qa-run.d.ts +4 -0
  53. package/dist/commands/qa-run.d.ts.map +1 -0
  54. package/dist/commands/qa-run.js +141 -0
  55. package/dist/commands/read.d.ts +1 -1
  56. package/dist/commands/read.d.ts.map +1 -1
  57. package/dist/commands/read.js +2 -2
  58. package/dist/commands/resources.d.ts +4 -0
  59. package/dist/commands/resources.d.ts.map +1 -0
  60. package/dist/commands/resources.js +29 -0
  61. package/dist/commands/semantic.d.ts.map +1 -1
  62. package/dist/commands/semantic.js +54 -2
  63. package/dist/commands/storage.d.ts +4 -0
  64. package/dist/commands/storage.d.ts.map +1 -0
  65. package/dist/commands/storage.js +238 -0
  66. package/dist/commands/supervisor.d.ts +4 -0
  67. package/dist/commands/supervisor.d.ts.map +1 -0
  68. package/dist/commands/supervisor.js +101 -0
  69. package/dist/commands/tunnel.d.ts +5 -1
  70. package/dist/commands/tunnel.d.ts.map +1 -1
  71. package/dist/commands/tunnel.js +44 -31
  72. package/dist/commands/web.d.ts +3 -0
  73. package/dist/commands/web.d.ts.map +1 -1
  74. package/dist/commands/web.js +84 -7
  75. package/dist/commands/work.js +3 -3
  76. package/dist/commands/workflow.d.ts.map +1 -1
  77. package/dist/commands/workflow.js +17 -13
  78. package/dist/core/adapters/profiles.d.ts +1 -1
  79. package/dist/core/agents/cli.js +215 -41
  80. package/dist/core/agents/health.d.ts +17 -0
  81. package/dist/core/agents/health.d.ts.map +1 -0
  82. package/dist/core/agents/health.js +109 -0
  83. package/dist/core/agents/live-authority-v3.d.ts +47 -1
  84. package/dist/core/agents/live-authority-v3.d.ts.map +1 -1
  85. package/dist/core/agents/live-authority-v3.js +244 -10
  86. package/dist/core/agents/live-lifecycle-v3.js +6 -1
  87. package/dist/core/agents/live-observation-v3.d.ts.map +1 -1
  88. package/dist/core/agents/live-observation-v3.js +6 -1
  89. package/dist/core/agents/mailbox.d.ts +92 -0
  90. package/dist/core/agents/mailbox.d.ts.map +1 -0
  91. package/dist/core/agents/mailbox.js +325 -0
  92. package/dist/core/agents/reconcile-coordination-v3.d.ts +44 -0
  93. package/dist/core/agents/reconcile-coordination-v3.d.ts.map +1 -0
  94. package/dist/core/agents/reconcile-coordination-v3.js +58 -0
  95. package/dist/core/agents/render/prompt-context.d.ts +14 -3
  96. package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
  97. package/dist/core/agents/render/prompt-context.js +54 -16
  98. package/dist/core/agents/render/session-context.d.ts +8 -0
  99. package/dist/core/agents/render/session-context.d.ts.map +1 -1
  100. package/dist/core/agents/render/session-context.js +34 -3
  101. package/dist/core/agents/rules/commit-conflict.d.ts.map +1 -1
  102. package/dist/core/agents/rules/commit-conflict.js +50 -1
  103. package/dist/core/agents/rules/stop-hook.d.ts +2 -0
  104. package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
  105. package/dist/core/agents/rules/stop-hook.js +93 -16
  106. package/dist/core/agents/rules/verdict.d.ts +1 -0
  107. package/dist/core/agents/rules/verdict.d.ts.map +1 -1
  108. package/dist/core/agents/session-events.d.ts.map +1 -1
  109. package/dist/core/agents/session-events.js +4 -0
  110. package/dist/core/agents/session-finalization-state-v3.js +1 -1
  111. package/dist/core/agents/session-finalizer-v3.js +9 -2
  112. package/dist/core/agents/state/activity-log.d.ts +3 -0
  113. package/dist/core/agents/state/activity-log.d.ts.map +1 -1
  114. package/dist/core/agents/state/activity-log.js +6 -3
  115. package/dist/core/agents/state/heartbeat-writer.d.ts +6 -0
  116. package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
  117. package/dist/core/agents/state/heartbeat-writer.js +18 -0
  118. package/dist/core/agents/state/live-coordination-view.d.ts +5 -7
  119. package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -1
  120. package/dist/core/agents/state/live-coordination-view.js +15 -90
  121. package/dist/core/agents/state/live-coordination-writer.d.ts +12 -0
  122. package/dist/core/agents/state/live-coordination-writer.d.ts.map +1 -0
  123. package/dist/core/agents/state/live-coordination-writer.js +92 -0
  124. package/dist/core/artifacts/index.d.ts +47 -1
  125. package/dist/core/artifacts/index.d.ts.map +1 -1
  126. package/dist/core/artifacts/index.js +191 -6
  127. package/dist/core/config.d.ts +74 -4
  128. package/dist/core/config.d.ts.map +1 -1
  129. package/dist/core/config.js +141 -4
  130. package/dist/core/conversations/archive.d.ts +49 -0
  131. package/dist/core/conversations/archive.d.ts.map +1 -0
  132. package/dist/core/conversations/archive.js +136 -0
  133. package/dist/core/conversations/catalog.d.ts +10 -0
  134. package/dist/core/conversations/catalog.d.ts.map +1 -0
  135. package/dist/core/conversations/catalog.js +72 -0
  136. package/dist/core/conversations/context-pack.d.ts +6 -0
  137. package/dist/core/conversations/context-pack.d.ts.map +1 -0
  138. package/dist/core/conversations/context-pack.js +60 -0
  139. package/dist/core/conversations/contract.d.ts +155 -0
  140. package/dist/core/conversations/contract.d.ts.map +1 -0
  141. package/dist/core/conversations/contract.js +1 -0
  142. package/dist/core/conversations/evaluation.d.ts +16 -0
  143. package/dist/core/conversations/evaluation.d.ts.map +1 -0
  144. package/dist/core/conversations/evaluation.js +9 -0
  145. package/dist/core/conversations/index.d.ts +10 -0
  146. package/dist/core/conversations/index.d.ts.map +1 -0
  147. package/dist/core/conversations/index.js +9 -0
  148. package/dist/core/conversations/lifecycle.d.ts +28 -0
  149. package/dist/core/conversations/lifecycle.d.ts.map +1 -0
  150. package/dist/core/conversations/lifecycle.js +29 -0
  151. package/dist/core/conversations/normalize.d.ts +14 -0
  152. package/dist/core/conversations/normalize.d.ts.map +1 -0
  153. package/dist/core/conversations/normalize.js +82 -0
  154. package/dist/core/conversations/query.d.ts +8 -0
  155. package/dist/core/conversations/query.d.ts.map +1 -0
  156. package/dist/core/conversations/query.js +280 -0
  157. package/dist/core/conversations/search-index.d.ts +9 -0
  158. package/dist/core/conversations/search-index.d.ts.map +1 -0
  159. package/dist/core/conversations/search-index.js +29 -0
  160. package/dist/core/diagnostics/advice.d.ts +9 -0
  161. package/dist/core/diagnostics/advice.d.ts.map +1 -0
  162. package/dist/core/diagnostics/advice.js +112 -0
  163. package/dist/core/diagnostics/bundle.d.ts +35 -0
  164. package/dist/core/diagnostics/bundle.d.ts.map +1 -0
  165. package/dist/core/diagnostics/bundle.js +874 -0
  166. package/dist/core/diagnostics/comparison.d.ts +5 -0
  167. package/dist/core/diagnostics/comparison.d.ts.map +1 -0
  168. package/dist/core/diagnostics/comparison.js +444 -0
  169. package/dist/core/diagnostics/contract.d.ts +245 -0
  170. package/dist/core/diagnostics/contract.d.ts.map +1 -0
  171. package/dist/core/diagnostics/contract.js +18 -0
  172. package/dist/core/diagnostics/identity.d.ts +3 -0
  173. package/dist/core/diagnostics/identity.d.ts.map +1 -0
  174. package/dist/core/diagnostics/identity.js +10 -0
  175. package/dist/core/diagnostics/index.d.ts +8 -0
  176. package/dist/core/diagnostics/index.d.ts.map +1 -0
  177. package/dist/core/diagnostics/index.js +7 -0
  178. package/dist/core/diagnostics/replay.d.ts +8 -0
  179. package/dist/core/diagnostics/replay.d.ts.map +1 -0
  180. package/dist/core/diagnostics/replay.js +213 -0
  181. package/dist/core/diagnostics/sanitize.d.ts +9 -0
  182. package/dist/core/diagnostics/sanitize.d.ts.map +1 -0
  183. package/dist/core/diagnostics/sanitize.js +84 -0
  184. package/dist/core/events/legacy-storage/canary.d.ts +18 -0
  185. package/dist/core/events/legacy-storage/canary.d.ts.map +1 -0
  186. package/dist/core/events/legacy-storage/canary.js +150 -0
  187. package/dist/core/events/legacy-storage/compression.d.ts +13 -0
  188. package/dist/core/events/legacy-storage/compression.d.ts.map +1 -0
  189. package/dist/core/events/legacy-storage/compression.js +107 -0
  190. package/dist/core/events/legacy-storage/fence.d.ts +15 -0
  191. package/dist/core/events/legacy-storage/fence.d.ts.map +1 -0
  192. package/dist/core/events/legacy-storage/fence.js +115 -0
  193. package/dist/core/events/legacy-storage/index.d.ts +7 -0
  194. package/dist/core/events/legacy-storage/index.d.ts.map +1 -0
  195. package/dist/core/events/legacy-storage/index.js +6 -0
  196. package/dist/core/events/legacy-storage/inventory.d.ts +10 -0
  197. package/dist/core/events/legacy-storage/inventory.d.ts.map +1 -0
  198. package/dist/core/events/legacy-storage/inventory.js +40 -0
  199. package/dist/core/events/legacy-storage/manifest.d.ts +23 -0
  200. package/dist/core/events/legacy-storage/manifest.d.ts.map +1 -0
  201. package/dist/core/events/legacy-storage/manifest.js +108 -0
  202. package/dist/core/events/legacy-storage/reader.d.ts +15 -0
  203. package/dist/core/events/legacy-storage/reader.d.ts.map +1 -0
  204. package/dist/core/events/legacy-storage/reader.js +154 -0
  205. package/dist/core/events/v3/archive-retention.d.ts +33 -0
  206. package/dist/core/events/v3/archive-retention.d.ts.map +1 -0
  207. package/dist/core/events/v3/archive-retention.js +195 -0
  208. package/dist/core/events/v3/authority-outbox.d.ts +7 -2
  209. package/dist/core/events/v3/authority-outbox.d.ts.map +1 -1
  210. package/dist/core/events/v3/authority-outbox.js +16 -3
  211. package/dist/core/events/v3/base-contract.d.ts +81 -41
  212. package/dist/core/events/v3/base-contract.d.ts.map +1 -1
  213. package/dist/core/events/v3/base-contract.js +17 -7
  214. package/dist/core/events/v3/bootstrap.d.ts +39 -0
  215. package/dist/core/events/v3/bootstrap.d.ts.map +1 -1
  216. package/dist/core/events/v3/bootstrap.js +167 -3
  217. package/dist/core/events/v3/capabilities.d.ts +1 -1
  218. package/dist/core/events/v3/capabilities.d.ts.map +1 -1
  219. package/dist/core/events/v3/capabilities.js +4 -3
  220. package/dist/core/events/v3/control-witness.d.ts +44 -0
  221. package/dist/core/events/v3/control-witness.d.ts.map +1 -0
  222. package/dist/core/events/v3/control-witness.js +233 -0
  223. package/dist/core/events/v3/control-writer.d.ts +4 -0
  224. package/dist/core/events/v3/control-writer.d.ts.map +1 -0
  225. package/dist/core/events/v3/control-writer.js +16 -0
  226. package/dist/core/events/v3/control.d.ts +8 -2
  227. package/dist/core/events/v3/control.d.ts.map +1 -1
  228. package/dist/core/events/v3/control.js +46 -18
  229. package/dist/core/events/v3/coordination-transaction-recovery.d.ts +42 -0
  230. package/dist/core/events/v3/coordination-transaction-recovery.d.ts.map +1 -0
  231. package/dist/core/events/v3/coordination-transaction-recovery.js +342 -0
  232. package/dist/core/events/v3/coordination-view.d.ts.map +1 -1
  233. package/dist/core/events/v3/coordination-view.js +16 -1
  234. package/dist/core/events/v3/generated.d.ts +1 -1
  235. package/dist/core/events/v3/generated.js +1 -1
  236. package/dist/core/events/v3/index.d.ts +5 -2
  237. package/dist/core/events/v3/index.d.ts.map +1 -1
  238. package/dist/core/events/v3/index.js +4 -1
  239. package/dist/core/events/v3/live-route-observer.d.ts +31 -0
  240. package/dist/core/events/v3/live-route-observer.d.ts.map +1 -0
  241. package/dist/core/events/v3/live-route-observer.js +58 -0
  242. package/dist/core/events/v3/live-routing.d.ts +13 -21
  243. package/dist/core/events/v3/live-routing.d.ts.map +1 -1
  244. package/dist/core/events/v3/live-routing.js +46 -41
  245. package/dist/core/events/v3/producers/coordination-recorder.d.ts +11 -1
  246. package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -1
  247. package/dist/core/events/v3/producers/coordination-recorder.js +76 -10
  248. package/dist/core/events/v3/producers/diagnostic-summaries.d.ts +129 -0
  249. package/dist/core/events/v3/producers/diagnostic-summaries.d.ts.map +1 -0
  250. package/dist/core/events/v3/producers/diagnostic-summaries.js +499 -0
  251. package/dist/core/events/v3/producers/hook-base.d.ts +1 -1
  252. package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -1
  253. package/dist/core/events/v3/producers/hook-base.js +14 -3
  254. package/dist/core/events/v3/producers/intake.d.ts +7 -0
  255. package/dist/core/events/v3/producers/intake.d.ts.map +1 -1
  256. package/dist/core/events/v3/producers/intake.js +26 -2
  257. package/dist/core/events/v3/producers/producer-state-observer.d.ts +8 -0
  258. package/dist/core/events/v3/producers/producer-state-observer.d.ts.map +1 -0
  259. package/dist/core/events/v3/producers/producer-state-observer.js +45 -0
  260. package/dist/core/events/v3/producers/recorder.d.ts +71 -1
  261. package/dist/core/events/v3/producers/recorder.d.ts.map +1 -1
  262. package/dist/core/events/v3/producers/recorder.js +441 -25
  263. package/dist/core/events/v3/reader.d.ts +51 -0
  264. package/dist/core/events/v3/reader.d.ts.map +1 -1
  265. package/dist/core/events/v3/reader.js +181 -1
  266. package/dist/core/events/v3/rotation-config.d.ts +9 -0
  267. package/dist/core/events/v3/rotation-config.d.ts.map +1 -0
  268. package/dist/core/events/v3/rotation-config.js +91 -0
  269. package/dist/core/events/v3/runtime-build.d.ts +11 -0
  270. package/dist/core/events/v3/runtime-build.d.ts.map +1 -0
  271. package/dist/core/events/v3/runtime-build.js +39 -0
  272. package/dist/core/events/v3/runtime-identity.d.ts +5 -0
  273. package/dist/core/events/v3/runtime-identity.d.ts.map +1 -0
  274. package/dist/core/events/v3/runtime-identity.js +18 -0
  275. package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts +6 -5
  276. package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts.map +1 -1
  277. package/dist/core/events/v3/runtime-telemetry-capabilities.js +1 -1
  278. package/dist/core/events/v3/support-storage/classify.d.ts +46 -0
  279. package/dist/core/events/v3/support-storage/classify.d.ts.map +1 -0
  280. package/dist/core/events/v3/support-storage/classify.js +149 -0
  281. package/dist/core/events/v3/support-storage/eligibility.d.ts +29 -0
  282. package/dist/core/events/v3/support-storage/eligibility.d.ts.map +1 -0
  283. package/dist/core/events/v3/support-storage/eligibility.js +35 -0
  284. package/dist/core/events/v3/support-storage/index.d.ts +10 -0
  285. package/dist/core/events/v3/support-storage/index.d.ts.map +1 -0
  286. package/dist/core/events/v3/support-storage/index.js +9 -0
  287. package/dist/core/events/v3/support-storage/inventory.d.ts +30 -0
  288. package/dist/core/events/v3/support-storage/inventory.d.ts.map +1 -0
  289. package/dist/core/events/v3/support-storage/inventory.js +94 -0
  290. package/dist/core/events/v3/support-storage/logical-authority.d.ts +14 -0
  291. package/dist/core/events/v3/support-storage/logical-authority.d.ts.map +1 -0
  292. package/dist/core/events/v3/support-storage/logical-authority.js +104 -0
  293. package/dist/core/events/v3/support-storage/maintenance.d.ts +98 -0
  294. package/dist/core/events/v3/support-storage/maintenance.d.ts.map +1 -0
  295. package/dist/core/events/v3/support-storage/maintenance.js +352 -0
  296. package/dist/core/events/v3/support-storage/pack-contract.d.ts +59 -0
  297. package/dist/core/events/v3/support-storage/pack-contract.d.ts.map +1 -0
  298. package/dist/core/events/v3/support-storage/pack-contract.js +249 -0
  299. package/dist/core/events/v3/support-storage/pack-reader.d.ts +34 -0
  300. package/dist/core/events/v3/support-storage/pack-reader.d.ts.map +1 -0
  301. package/dist/core/events/v3/support-storage/pack-reader.js +258 -0
  302. package/dist/core/events/v3/support-storage/pack-writer.d.ts +30 -0
  303. package/dist/core/events/v3/support-storage/pack-writer.d.ts.map +1 -0
  304. package/dist/core/events/v3/support-storage/pack-writer.js +268 -0
  305. package/dist/core/events/v3/support-storage/recovery.d.ts +15 -0
  306. package/dist/core/events/v3/support-storage/recovery.d.ts.map +1 -0
  307. package/dist/core/events/v3/support-storage/recovery.js +22 -0
  308. package/dist/core/events/v3/turn-telemetry.d.ts +14 -8
  309. package/dist/core/events/v3/turn-telemetry.d.ts.map +1 -1
  310. package/dist/core/events/v3/turn-telemetry.js +32 -2
  311. package/dist/core/events/v3/writer.d.ts +13 -1
  312. package/dist/core/events/v3/writer.d.ts.map +1 -1
  313. package/dist/core/events/v3/writer.js +126 -12
  314. package/dist/core/governor/plan-read.d.ts.map +1 -1
  315. package/dist/core/governor/plan-read.js +5 -21
  316. package/dist/core/governor/planning.js +6 -8
  317. package/dist/core/governor/service-read.d.ts +12 -0
  318. package/dist/core/governor/service-read.d.ts.map +1 -1
  319. package/dist/core/governor/service-read.js +266 -2
  320. package/dist/core/governor/service.d.ts +1 -0
  321. package/dist/core/governor/service.d.ts.map +1 -1
  322. package/dist/core/governor/service.js +53 -18
  323. package/dist/core/guard/evidence-v3.d.ts.map +1 -1
  324. package/dist/core/guard/evidence-v3.js +2 -0
  325. package/dist/core/hooks/adapter/events.d.ts.map +1 -1
  326. package/dist/core/hooks/adapter/events.js +1 -0
  327. package/dist/core/hooks/adapter/output.d.ts +12 -2
  328. package/dist/core/hooks/adapter/output.d.ts.map +1 -1
  329. package/dist/core/hooks/adapter/output.js +23 -5
  330. package/dist/core/hooks/adapter/runtime-telemetry.d.ts +27 -4
  331. package/dist/core/hooks/adapter/runtime-telemetry.d.ts.map +1 -1
  332. package/dist/core/hooks/adapter/runtime-telemetry.js +307 -6
  333. package/dist/core/hooks/cli.js +380 -207
  334. package/dist/core/hooks/effects/image-capture.d.ts +1 -1
  335. package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
  336. package/dist/core/hooks/effects/image-capture.js +4 -2
  337. package/dist/core/hooks/health.d.ts +59 -0
  338. package/dist/core/hooks/health.d.ts.map +1 -0
  339. package/dist/core/hooks/health.js +84 -0
  340. package/dist/core/hooks/remediation-cap.d.ts +8 -3
  341. package/dist/core/hooks/remediation-cap.d.ts.map +1 -1
  342. package/dist/core/hooks/remediation-cap.js +3 -11
  343. package/dist/core/hooks/resolve/coord-root.d.ts +22 -9
  344. package/dist/core/hooks/resolve/coord-root.d.ts.map +1 -1
  345. package/dist/core/hooks/resolve/coord-root.js +92 -11
  346. package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
  347. package/dist/core/hooks/resolve/owner.js +5 -0
  348. package/dist/core/hooks/resolve/transcript.d.ts +8 -0
  349. package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
  350. package/dist/core/hooks/resolve/transcript.js +11 -0
  351. package/dist/core/inbox/contract.d.ts +64 -0
  352. package/dist/core/inbox/contract.d.ts.map +1 -0
  353. package/dist/core/inbox/contract.js +13 -0
  354. package/dist/core/inbox/index.d.ts +5 -0
  355. package/dist/core/inbox/index.d.ts.map +1 -0
  356. package/dist/core/inbox/index.js +4 -0
  357. package/dist/core/inbox/lifecycle.d.ts +22 -0
  358. package/dist/core/inbox/lifecycle.d.ts.map +1 -0
  359. package/dist/core/inbox/lifecycle.js +41 -0
  360. package/dist/core/inbox/service.d.ts +36 -0
  361. package/dist/core/inbox/service.d.ts.map +1 -0
  362. package/dist/core/inbox/service.js +210 -0
  363. package/dist/core/inbox/watcher.d.ts +7 -0
  364. package/dist/core/inbox/watcher.d.ts.map +1 -0
  365. package/dist/core/inbox/watcher.js +26 -0
  366. package/dist/core/presence/codec-digest.d.ts.map +1 -1
  367. package/dist/core/presence/codec-digest.js +14 -3
  368. package/dist/core/presence/relay-client.d.ts +1 -0
  369. package/dist/core/presence/relay-client.d.ts.map +1 -1
  370. package/dist/core/presence/relay-client.js +52 -8
  371. package/dist/core/resources/contract.d.ts +90 -0
  372. package/dist/core/resources/contract.d.ts.map +1 -0
  373. package/dist/core/resources/contract.js +2 -0
  374. package/dist/core/resources/index.d.ts +6 -0
  375. package/dist/core/resources/index.d.ts.map +1 -0
  376. package/dist/core/resources/index.js +5 -0
  377. package/dist/core/resources/sampler.d.ts +27 -0
  378. package/dist/core/resources/sampler.d.ts.map +1 -0
  379. package/dist/core/resources/sampler.js +357 -0
  380. package/dist/core/resources/service-status.d.ts +3 -0
  381. package/dist/core/resources/service-status.d.ts.map +1 -0
  382. package/dist/core/resources/service-status.js +48 -0
  383. package/dist/core/resources/service.d.ts +26 -0
  384. package/dist/core/resources/service.d.ts.map +1 -0
  385. package/dist/core/resources/service.js +292 -0
  386. package/dist/core/resources/storage.d.ts +13 -0
  387. package/dist/core/resources/storage.d.ts.map +1 -0
  388. package/dist/core/resources/storage.js +30 -0
  389. package/dist/core/semantic/adapters.d.ts +11 -8
  390. package/dist/core/semantic/adapters.d.ts.map +1 -1
  391. package/dist/core/semantic/adapters.js +169 -31
  392. package/dist/core/semantic/contract.d.ts +532 -48
  393. package/dist/core/semantic/contract.d.ts.map +1 -1
  394. package/dist/core/semantic/contract.js +104 -3
  395. package/dist/core/semantic/index.d.ts +7 -3
  396. package/dist/core/semantic/index.d.ts.map +1 -1
  397. package/dist/core/semantic/index.js +7 -3
  398. package/dist/core/semantic/once.d.ts +6 -1
  399. package/dist/core/semantic/once.d.ts.map +1 -1
  400. package/dist/core/semantic/once.js +80 -9
  401. package/dist/core/semantic/prompt.d.ts.map +1 -1
  402. package/dist/core/semantic/prompt.js +14 -1
  403. package/dist/core/semantic/review.d.ts +144 -0
  404. package/dist/core/semantic/review.d.ts.map +1 -0
  405. package/dist/core/semantic/review.js +544 -0
  406. package/dist/core/semantic/routes.d.ts +10 -0
  407. package/dist/core/semantic/routes.d.ts.map +1 -0
  408. package/dist/core/semantic/routes.js +21 -0
  409. package/dist/core/semantic/scheduler.d.ts +14 -3
  410. package/dist/core/semantic/scheduler.d.ts.map +1 -1
  411. package/dist/core/semantic/scheduler.js +30 -6
  412. package/dist/core/semantic/service-status.d.ts +20 -0
  413. package/dist/core/semantic/service-status.d.ts.map +1 -1
  414. package/dist/core/semantic/service-status.js +60 -4
  415. package/dist/core/semantic/service.d.ts +1 -0
  416. package/dist/core/semantic/service.d.ts.map +1 -1
  417. package/dist/core/semantic/service.js +104 -15
  418. package/dist/core/semantic/soak.d.ts +75 -0
  419. package/dist/core/semantic/soak.d.ts.map +1 -0
  420. package/dist/core/semantic/soak.js +476 -0
  421. package/dist/core/semantic/storage.d.ts +11 -1
  422. package/dist/core/semantic/storage.d.ts.map +1 -1
  423. package/dist/core/semantic/storage.js +4 -3
  424. package/dist/core/semantic/usage.d.ts +43 -0
  425. package/dist/core/semantic/usage.d.ts.map +1 -0
  426. package/dist/core/semantic/usage.js +193 -0
  427. package/dist/core/semantic/validate.d.ts +3 -1
  428. package/dist/core/semantic/validate.d.ts.map +1 -1
  429. package/dist/core/semantic/validate.js +34 -1
  430. package/dist/core/storage/atomic-json.d.ts +3 -0
  431. package/dist/core/storage/atomic-json.d.ts.map +1 -0
  432. package/dist/core/storage/atomic-json.js +15 -0
  433. package/dist/core/storage/buffer.d.ts +28 -0
  434. package/dist/core/storage/buffer.d.ts.map +1 -0
  435. package/dist/core/storage/buffer.js +101 -0
  436. package/dist/core/storage/builtins.d.ts +3 -0
  437. package/dist/core/storage/builtins.d.ts.map +1 -0
  438. package/dist/core/storage/builtins.js +722 -0
  439. package/dist/core/storage/catalog.d.ts +19 -0
  440. package/dist/core/storage/catalog.d.ts.map +1 -0
  441. package/dist/core/storage/catalog.js +365 -0
  442. package/dist/core/storage/config.d.ts +16 -0
  443. package/dist/core/storage/config.d.ts.map +1 -0
  444. package/dist/core/storage/config.js +311 -0
  445. package/dist/core/storage/contract.d.ts +275 -0
  446. package/dist/core/storage/contract.d.ts.map +1 -0
  447. package/dist/core/storage/contract.js +3 -0
  448. package/dist/core/storage/durable-history.d.ts +36 -0
  449. package/dist/core/storage/durable-history.d.ts.map +1 -0
  450. package/dist/core/storage/durable-history.js +606 -0
  451. package/dist/core/storage/health.d.ts +4 -0
  452. package/dist/core/storage/health.d.ts.map +1 -0
  453. package/dist/core/storage/health.js +65 -0
  454. package/dist/core/storage/index.d.ts +16 -0
  455. package/dist/core/storage/index.d.ts.map +1 -0
  456. package/dist/core/storage/index.js +15 -0
  457. package/dist/core/storage/inventory.d.ts +25 -0
  458. package/dist/core/storage/inventory.d.ts.map +1 -0
  459. package/dist/core/storage/inventory.js +666 -0
  460. package/dist/core/storage/jsonl.d.ts +52 -0
  461. package/dist/core/storage/jsonl.d.ts.map +1 -0
  462. package/dist/core/storage/jsonl.js +156 -0
  463. package/dist/core/storage/log-retention.d.ts +52 -0
  464. package/dist/core/storage/log-retention.d.ts.map +1 -0
  465. package/dist/core/storage/log-retention.js +419 -0
  466. package/dist/core/storage/logger.d.ts +84 -0
  467. package/dist/core/storage/logger.d.ts.map +1 -0
  468. package/dist/core/storage/logger.js +413 -0
  469. package/dist/core/storage/maintenance-providers.d.ts +26 -0
  470. package/dist/core/storage/maintenance-providers.d.ts.map +1 -0
  471. package/dist/core/storage/maintenance-providers.js +141 -0
  472. package/dist/core/storage/maintenance.d.ts +125 -0
  473. package/dist/core/storage/maintenance.d.ts.map +1 -0
  474. package/dist/core/storage/maintenance.js +609 -0
  475. package/dist/core/storage/metrics.d.ts +60 -0
  476. package/dist/core/storage/metrics.d.ts.map +1 -0
  477. package/dist/core/storage/metrics.js +134 -0
  478. package/dist/core/storage/policy.d.ts +7 -0
  479. package/dist/core/storage/policy.d.ts.map +1 -0
  480. package/dist/core/storage/policy.js +110 -0
  481. package/dist/core/storage/process-log.d.ts +38 -0
  482. package/dist/core/storage/process-log.d.ts.map +1 -0
  483. package/dist/core/storage/process-log.js +165 -0
  484. package/dist/core/storage/query.d.ts +48 -0
  485. package/dist/core/storage/query.d.ts.map +1 -0
  486. package/dist/core/storage/query.js +346 -0
  487. package/dist/core/storage/receipts.d.ts +23 -0
  488. package/dist/core/storage/receipts.d.ts.map +1 -0
  489. package/dist/core/storage/receipts.js +117 -0
  490. package/dist/core/storage/segments.d.ts +84 -0
  491. package/dist/core/storage/segments.d.ts.map +1 -0
  492. package/dist/core/storage/segments.js +542 -0
  493. package/dist/core/storage/sink-graph.d.ts +65 -0
  494. package/dist/core/storage/sink-graph.d.ts.map +1 -0
  495. package/dist/core/storage/sink-graph.js +213 -0
  496. package/dist/core/storage/storm-control.d.ts +23 -0
  497. package/dist/core/storage/storm-control.d.ts.map +1 -0
  498. package/dist/core/storage/storm-control.js +59 -0
  499. package/dist/core/supervisor/activity.d.ts +4 -0
  500. package/dist/core/supervisor/activity.d.ts.map +1 -0
  501. package/dist/core/supervisor/activity.js +141 -0
  502. package/dist/core/supervisor/contract.d.ts +268 -0
  503. package/dist/core/supervisor/contract.d.ts.map +1 -0
  504. package/dist/core/supervisor/contract.js +35 -0
  505. package/dist/core/supervisor/explanations.d.ts +4 -0
  506. package/dist/core/supervisor/explanations.d.ts.map +1 -0
  507. package/dist/core/supervisor/explanations.js +71 -0
  508. package/dist/core/supervisor/findings.d.ts +20 -0
  509. package/dist/core/supervisor/findings.d.ts.map +1 -0
  510. package/dist/core/supervisor/findings.js +399 -0
  511. package/dist/core/supervisor/history.d.ts +9 -0
  512. package/dist/core/supervisor/history.d.ts.map +1 -0
  513. package/dist/core/supervisor/history.js +46 -0
  514. package/dist/core/supervisor/hook-health-alerts.d.ts +14 -0
  515. package/dist/core/supervisor/hook-health-alerts.d.ts.map +1 -0
  516. package/dist/core/supervisor/hook-health-alerts.js +70 -0
  517. package/dist/core/supervisor/hook-health-storage.d.ts +5 -0
  518. package/dist/core/supervisor/hook-health-storage.d.ts.map +1 -0
  519. package/dist/core/supervisor/hook-health-storage.js +24 -0
  520. package/dist/core/supervisor/hook-health.d.ts +72 -0
  521. package/dist/core/supervisor/hook-health.d.ts.map +1 -0
  522. package/dist/core/supervisor/hook-health.js +203 -0
  523. package/dist/core/supervisor/hooks.d.ts +10 -0
  524. package/dist/core/supervisor/hooks.d.ts.map +1 -0
  525. package/dist/core/supervisor/hooks.js +28 -0
  526. package/dist/core/supervisor/index.d.ts +15 -0
  527. package/dist/core/supervisor/index.d.ts.map +1 -0
  528. package/dist/core/supervisor/index.js +14 -0
  529. package/dist/core/supervisor/log-feed.d.ts +9 -0
  530. package/dist/core/supervisor/log-feed.d.ts.map +1 -0
  531. package/dist/core/supervisor/log-feed.js +103 -0
  532. package/dist/core/supervisor/service.d.ts +29 -0
  533. package/dist/core/supervisor/service.d.ts.map +1 -0
  534. package/dist/core/supervisor/service.js +450 -0
  535. package/dist/core/supervisor/services.d.ts +11 -0
  536. package/dist/core/supervisor/services.d.ts.map +1 -0
  537. package/dist/core/supervisor/services.js +155 -0
  538. package/dist/core/supervisor/status.d.ts +3 -0
  539. package/dist/core/supervisor/status.d.ts.map +1 -0
  540. package/dist/core/supervisor/status.js +48 -0
  541. package/dist/core/supervisor/storage.d.ts +30 -0
  542. package/dist/core/supervisor/storage.d.ts.map +1 -0
  543. package/dist/core/supervisor/storage.js +73 -0
  544. package/dist/core/supervisor/timeline.d.ts +3 -0
  545. package/dist/core/supervisor/timeline.d.ts.map +1 -0
  546. package/dist/core/supervisor/timeline.js +87 -0
  547. package/dist/core/work/state.d.ts.map +1 -1
  548. package/dist/core/work/state.js +10 -14
  549. package/dist/core/workflow/admission.d.ts +23 -0
  550. package/dist/core/workflow/admission.d.ts.map +1 -0
  551. package/dist/core/workflow/admission.js +136 -0
  552. package/dist/core/workflow/engine.d.ts.map +1 -1
  553. package/dist/core/workflow/engine.js +77 -2
  554. package/dist/core/workflow/index.d.ts +3 -2
  555. package/dist/core/workflow/index.d.ts.map +1 -1
  556. package/dist/core/workflow/index.js +2 -1
  557. package/dist/core/workflow/live-session-v3.d.ts.map +1 -1
  558. package/dist/core/workflow/live-session-v3.js +2 -1
  559. package/dist/core/workflow/proof.d.ts +2 -1
  560. package/dist/core/workflow/proof.d.ts.map +1 -1
  561. package/dist/core/workflow/proof.js +39 -1
  562. package/dist/core/workflow/run-state.d.ts +3 -2
  563. package/dist/core/workflow/run-state.d.ts.map +1 -1
  564. package/dist/core/workflow/run-state.js +8 -1
  565. package/dist/core/workflow/types.d.ts +33 -1
  566. package/dist/core/workflow/types.d.ts.map +1 -1
  567. package/dist/core/workflow/types.js +2 -1
  568. package/dist/index.d.ts +2 -0
  569. package/dist/index.d.ts.map +1 -1
  570. package/dist/index.js +2 -0
  571. package/dist/lazy-commands.d.ts +26 -0
  572. package/dist/lazy-commands.d.ts.map +1 -0
  573. package/dist/lazy-commands.js +210 -0
  574. package/dist/lib/browser/client.d.ts +5 -0
  575. package/dist/lib/browser/client.d.ts.map +1 -1
  576. package/dist/lib/browser/client.js +1 -0
  577. package/dist/lib/browser/index.d.ts +2 -0
  578. package/dist/lib/browser/index.d.ts.map +1 -1
  579. package/dist/lib/browser/index.js +2 -0
  580. package/dist/lib/browser/qa-run-contracts.d.ts +173 -0
  581. package/dist/lib/browser/qa-run-contracts.d.ts.map +1 -0
  582. package/dist/lib/browser/qa-run-contracts.js +226 -0
  583. package/dist/lib/browser/qa-run.d.ts +51 -0
  584. package/dist/lib/browser/qa-run.d.ts.map +1 -0
  585. package/dist/lib/browser/qa-run.js +684 -0
  586. package/dist/lib/coord-root-id.d.ts +9 -0
  587. package/dist/lib/coord-root-id.d.ts.map +1 -0
  588. package/dist/lib/coord-root-id.js +17 -0
  589. package/dist/lib/docs-lint.d.ts +2 -0
  590. package/dist/lib/docs-lint.d.ts.map +1 -1
  591. package/dist/lib/docs-lint.js +45 -80
  592. package/dist/lib/docs-metadata-audit.d.ts +3 -0
  593. package/dist/lib/docs-metadata-audit.d.ts.map +1 -1
  594. package/dist/lib/docs-metadata-audit.js +13 -23
  595. package/dist/lib/docs-metadata-sync.d.ts +1 -0
  596. package/dist/lib/docs-metadata-sync.d.ts.map +1 -1
  597. package/dist/lib/docs-metadata-sync.js +28 -10
  598. package/dist/lib/docs-repository-view.d.ts +22 -0
  599. package/dist/lib/docs-repository-view.d.ts.map +1 -0
  600. package/dist/lib/docs-repository-view.js +185 -0
  601. package/dist/lib/http/client.d.ts +11 -5
  602. package/dist/lib/http/client.d.ts.map +1 -1
  603. package/dist/lib/http/client.js +22 -4
  604. package/dist/lib/http/index.d.ts +1 -1
  605. package/dist/lib/http/index.d.ts.map +1 -1
  606. package/dist/lib/http/index.js +1 -1
  607. package/dist/lib/indexer-exclusions.d.ts +27 -0
  608. package/dist/lib/indexer-exclusions.d.ts.map +1 -0
  609. package/dist/lib/indexer-exclusions.js +176 -0
  610. package/dist/lib/instructions/apply.d.ts +3 -1
  611. package/dist/lib/instructions/apply.d.ts.map +1 -1
  612. package/dist/lib/instructions/apply.js +74 -3
  613. package/dist/lib/instructions/templates.d.ts.map +1 -1
  614. package/dist/lib/instructions/templates.js +11 -0
  615. package/dist/lib/local-file-url.d.ts +9 -0
  616. package/dist/lib/local-file-url.d.ts.map +1 -0
  617. package/dist/lib/local-file-url.js +20 -0
  618. package/dist/lib/web-performance.d.ts +118 -0
  619. package/dist/lib/web-performance.d.ts.map +1 -0
  620. package/dist/lib/web-performance.js +192 -0
  621. package/package.json +40 -2
  622. package/schemas/config.schema.json +58 -0
  623. package/schemas/event-v3.schema.json +324 -112
  624. package/src/commander.ts +488 -95
  625. package/src/commands/agents.ts +617 -237
  626. package/src/commands/artifacts.ts +40 -2
  627. package/src/commands/backup.ts +18 -14
  628. package/src/commands/browse-session.ts +12 -0
  629. package/src/commands/browse.ts +21 -7
  630. package/src/commands/conversations.ts +279 -0
  631. package/src/commands/deinit.ts +6 -0
  632. package/src/commands/diagnostics.ts +271 -0
  633. package/src/commands/docs.ts +25 -6
  634. package/src/commands/doctor.ts +75 -9
  635. package/src/commands/fetch.ts +7 -6
  636. package/src/commands/files.ts +243 -0
  637. package/src/commands/governor.ts +21 -12
  638. package/src/commands/inbox.ts +61 -0
  639. package/src/commands/init.ts +78 -16
  640. package/src/commands/ledger-v3.ts +503 -1
  641. package/src/commands/logs.ts +224 -0
  642. package/src/commands/messages.ts +61 -0
  643. package/src/commands/outline.ts +6 -2
  644. package/src/commands/qa-run.ts +184 -0
  645. package/src/commands/read.ts +6 -2
  646. package/src/commands/resources.ts +38 -0
  647. package/src/commands/semantic.ts +66 -1
  648. package/src/commands/storage.ts +310 -0
  649. package/src/commands/supervisor.ts +141 -0
  650. package/src/commands/tunnel.ts +66 -52
  651. package/src/commands/web.ts +96 -7
  652. package/src/commands/work.ts +3 -3
  653. package/src/commands/workflow.ts +21 -13
  654. package/src/core/agents/cli.ts +265 -55
  655. package/src/core/agents/health.ts +142 -0
  656. package/src/core/agents/live-authority-v3.ts +341 -10
  657. package/src/core/agents/live-lifecycle-v3.ts +6 -1
  658. package/src/core/agents/live-observation-v3.ts +6 -1
  659. package/src/core/agents/mailbox.ts +373 -0
  660. package/src/core/agents/reconcile-coordination-v3.ts +77 -0
  661. package/src/core/agents/render/prompt-context.ts +66 -15
  662. package/src/core/agents/render/session-context.ts +37 -3
  663. package/src/core/agents/rules/commit-conflict.ts +58 -1
  664. package/src/core/agents/rules/stop-hook.ts +105 -20
  665. package/src/core/agents/rules/verdict.ts +1 -0
  666. package/src/core/agents/session-events.ts +4 -0
  667. package/src/core/agents/session-finalization-state-v3.ts +1 -1
  668. package/src/core/agents/session-finalizer-v3.ts +8 -2
  669. package/src/core/agents/state/activity-log.ts +7 -2
  670. package/src/core/agents/state/heartbeat-writer.ts +27 -0
  671. package/src/core/agents/state/live-coordination-view.ts +16 -105
  672. package/src/core/agents/state/live-coordination-writer.ts +141 -0
  673. package/src/core/artifacts/index.ts +260 -11
  674. package/src/core/config.ts +235 -5
  675. package/src/core/conversations/archive.ts +237 -0
  676. package/src/core/conversations/catalog.ts +79 -0
  677. package/src/core/conversations/context-pack.ts +72 -0
  678. package/src/core/conversations/contract.ts +178 -0
  679. package/src/core/conversations/evaluation.ts +30 -0
  680. package/src/core/conversations/index.ts +9 -0
  681. package/src/core/conversations/lifecycle.ts +63 -0
  682. package/src/core/conversations/normalize.ts +105 -0
  683. package/src/core/conversations/query.ts +318 -0
  684. package/src/core/conversations/search-index.ts +48 -0
  685. package/src/core/diagnostics/advice.ts +147 -0
  686. package/src/core/diagnostics/bundle.ts +1142 -0
  687. package/src/core/diagnostics/comparison.ts +565 -0
  688. package/src/core/diagnostics/contract.ts +311 -0
  689. package/src/core/diagnostics/identity.ts +11 -0
  690. package/src/core/diagnostics/index.ts +7 -0
  691. package/src/core/diagnostics/replay.ts +314 -0
  692. package/src/core/diagnostics/sanitize.ts +97 -0
  693. package/src/core/events/legacy-storage/canary.ts +177 -0
  694. package/src/core/events/legacy-storage/compression.ts +130 -0
  695. package/src/core/events/legacy-storage/fence.ts +129 -0
  696. package/src/core/events/legacy-storage/index.ts +6 -0
  697. package/src/core/events/legacy-storage/inventory.ts +51 -0
  698. package/src/core/events/legacy-storage/manifest.ts +136 -0
  699. package/src/core/events/legacy-storage/reader.ts +178 -0
  700. package/src/core/events/v3/archive-retention.ts +251 -0
  701. package/src/core/events/v3/authority-outbox.ts +22 -1
  702. package/src/core/events/v3/base-contract.ts +17 -7
  703. package/src/core/events/v3/bootstrap.ts +195 -2
  704. package/src/core/events/v3/capabilities.ts +5 -3
  705. package/src/core/events/v3/control-witness.ts +339 -0
  706. package/src/core/events/v3/control-writer.ts +16 -0
  707. package/src/core/events/v3/control.ts +54 -18
  708. package/src/core/events/v3/coordination-transaction-recovery.ts +477 -0
  709. package/src/core/events/v3/coordination-view.ts +17 -1
  710. package/src/core/events/v3/generated.ts +1 -1
  711. package/src/core/events/v3/index.ts +14 -2
  712. package/src/core/events/v3/live-route-observer.ts +80 -0
  713. package/src/core/events/v3/live-routing.ts +65 -46
  714. package/src/core/events/v3/producers/coordination-recorder.ts +95 -10
  715. package/src/core/events/v3/producers/diagnostic-summaries.ts +593 -0
  716. package/src/core/events/v3/producers/hook-base.ts +15 -3
  717. package/src/core/events/v3/producers/intake.ts +31 -2
  718. package/src/core/events/v3/producers/producer-state-observer.ts +52 -0
  719. package/src/core/events/v3/producers/recorder.ts +681 -34
  720. package/src/core/events/v3/reader.ts +243 -2
  721. package/src/core/events/v3/rotation-config.ts +98 -0
  722. package/src/core/events/v3/runtime-build.ts +41 -0
  723. package/src/core/events/v3/runtime-identity.ts +16 -0
  724. package/src/core/events/v3/runtime-telemetry-capabilities.ts +14 -8
  725. package/src/core/events/v3/support-storage/classify.ts +209 -0
  726. package/src/core/events/v3/support-storage/eligibility.ts +58 -0
  727. package/src/core/events/v3/support-storage/index.ts +9 -0
  728. package/src/core/events/v3/support-storage/inventory.ts +135 -0
  729. package/src/core/events/v3/support-storage/logical-authority.ts +117 -0
  730. package/src/core/events/v3/support-storage/maintenance.ts +501 -0
  731. package/src/core/events/v3/support-storage/pack-contract.ts +337 -0
  732. package/src/core/events/v3/support-storage/pack-reader.ts +346 -0
  733. package/src/core/events/v3/support-storage/pack-writer.ts +352 -0
  734. package/src/core/events/v3/support-storage/recovery.ts +43 -0
  735. package/src/core/events/v3/turn-telemetry.ts +58 -7
  736. package/src/core/events/v3/writer.ts +168 -16
  737. package/src/core/governor/plan-read.ts +5 -18
  738. package/src/core/governor/planning.ts +5 -8
  739. package/src/core/governor/service-read.ts +320 -2
  740. package/src/core/governor/service.ts +49 -22
  741. package/src/core/guard/evidence-v3.ts +1 -0
  742. package/src/core/hooks/adapter/events.ts +1 -0
  743. package/src/core/hooks/adapter/output.ts +23 -5
  744. package/src/core/hooks/adapter/runtime-telemetry.ts +408 -13
  745. package/src/core/hooks/cli.ts +404 -233
  746. package/src/core/hooks/effects/image-capture.ts +4 -1
  747. package/src/core/hooks/health.ts +146 -0
  748. package/src/core/hooks/remediation-cap.ts +12 -6
  749. package/src/core/hooks/resolve/coord-root.ts +91 -11
  750. package/src/core/hooks/resolve/owner.ts +4 -0
  751. package/src/core/hooks/resolve/transcript.ts +18 -0
  752. package/src/core/inbox/contract.ts +81 -0
  753. package/src/core/inbox/index.ts +4 -0
  754. package/src/core/inbox/lifecycle.ts +104 -0
  755. package/src/core/inbox/service.ts +305 -0
  756. package/src/core/inbox/watcher.ts +36 -0
  757. package/src/core/presence/codec-digest.ts +15 -9
  758. package/src/core/presence/relay-client.ts +55 -7
  759. package/src/core/resources/contract.ts +98 -0
  760. package/src/core/resources/index.ts +5 -0
  761. package/src/core/resources/sampler.ts +458 -0
  762. package/src/core/resources/service-status.ts +62 -0
  763. package/src/core/resources/service.ts +337 -0
  764. package/src/core/resources/storage.ts +44 -0
  765. package/src/core/semantic/adapters.ts +200 -41
  766. package/src/core/semantic/contract.ts +135 -3
  767. package/src/core/semantic/index.ts +76 -2
  768. package/src/core/semantic/once.ts +93 -7
  769. package/src/core/semantic/prompt.ts +13 -1
  770. package/src/core/semantic/review.ts +803 -0
  771. package/src/core/semantic/routes.ts +30 -0
  772. package/src/core/semantic/scheduler.ts +49 -5
  773. package/src/core/semantic/service-status.ts +99 -5
  774. package/src/core/semantic/service.ts +116 -15
  775. package/src/core/semantic/soak.ts +638 -0
  776. package/src/core/semantic/storage.ts +20 -6
  777. package/src/core/semantic/usage.ts +272 -0
  778. package/src/core/semantic/validate.ts +31 -0
  779. package/src/core/storage/atomic-json.ts +15 -0
  780. package/src/core/storage/buffer.ts +124 -0
  781. package/src/core/storage/builtins.ts +972 -0
  782. package/src/core/storage/catalog.ts +467 -0
  783. package/src/core/storage/config.ts +423 -0
  784. package/src/core/storage/contract.ts +342 -0
  785. package/src/core/storage/durable-history.ts +738 -0
  786. package/src/core/storage/health.ts +76 -0
  787. package/src/core/storage/index.ts +15 -0
  788. package/src/core/storage/inventory.ts +859 -0
  789. package/src/core/storage/jsonl.ts +213 -0
  790. package/src/core/storage/log-retention.ts +555 -0
  791. package/src/core/storage/logger.ts +548 -0
  792. package/src/core/storage/maintenance-providers.ts +200 -0
  793. package/src/core/storage/maintenance.ts +929 -0
  794. package/src/core/storage/metrics.ts +199 -0
  795. package/src/core/storage/policy.ts +141 -0
  796. package/src/core/storage/process-log.ts +203 -0
  797. package/src/core/storage/query.ts +418 -0
  798. package/src/core/storage/receipts.ts +162 -0
  799. package/src/core/storage/segments.ts +721 -0
  800. package/src/core/storage/sink-graph.ts +343 -0
  801. package/src/core/storage/storm-control.ts +91 -0
  802. package/src/core/supervisor/activity.ts +193 -0
  803. package/src/core/supervisor/contract.ts +312 -0
  804. package/src/core/supervisor/explanations.ts +104 -0
  805. package/src/core/supervisor/findings.ts +788 -0
  806. package/src/core/supervisor/history.ts +61 -0
  807. package/src/core/supervisor/hook-health-alerts.ts +108 -0
  808. package/src/core/supervisor/hook-health-storage.ts +25 -0
  809. package/src/core/supervisor/hook-health.ts +301 -0
  810. package/src/core/supervisor/hooks.ts +35 -0
  811. package/src/core/supervisor/index.ts +14 -0
  812. package/src/core/supervisor/log-feed.ts +131 -0
  813. package/src/core/supervisor/service.ts +511 -0
  814. package/src/core/supervisor/services.ts +203 -0
  815. package/src/core/supervisor/status.ts +59 -0
  816. package/src/core/supervisor/storage.ts +126 -0
  817. package/src/core/supervisor/timeline.ts +133 -0
  818. package/src/core/work/state.ts +12 -21
  819. package/src/core/workflow/admission.ts +215 -0
  820. package/src/core/workflow/engine.ts +93 -1
  821. package/src/core/workflow/index.ts +10 -0
  822. package/src/core/workflow/live-session-v3.ts +2 -4
  823. package/src/core/workflow/proof.ts +54 -1
  824. package/src/core/workflow/run-state.ts +13 -1
  825. package/src/core/workflow/types.ts +39 -1
  826. package/src/index.ts +2 -0
  827. package/src/lazy-commands.ts +294 -0
  828. package/src/lib/browser/client.ts +6 -0
  829. package/src/lib/browser/index.ts +29 -0
  830. package/src/lib/browser/qa-run-contracts.ts +380 -0
  831. package/src/lib/browser/qa-run.ts +784 -0
  832. package/src/lib/coord-root-id.ts +23 -0
  833. package/src/lib/docs-lint.ts +58 -77
  834. package/src/lib/docs-metadata-audit.ts +26 -21
  835. package/src/lib/docs-metadata-sync.ts +32 -9
  836. package/src/lib/docs-repository-view.ts +220 -0
  837. package/src/lib/http/client.ts +44 -8
  838. package/src/lib/http/index.ts +6 -1
  839. package/src/lib/indexer-exclusions.ts +173 -0
  840. package/src/lib/instructions/apply.ts +81 -2
  841. package/src/lib/instructions/templates.ts +11 -0
  842. package/src/lib/local-file-url.ts +31 -0
  843. package/src/lib/web-performance.ts +335 -0
@@ -17,19 +17,23 @@
17
17
  * adapter flow.
18
18
  */
19
19
 
20
- import { spawnSync } from "node:child_process";
20
+ import { spawn, spawnSync } from "node:child_process";
21
21
  import { appendFileSync, existsSync, mkdirSync, readFileSync } from "node:fs";
22
22
  import { dirname, join } from "node:path";
23
23
  import { coordEnv } from "../../lib/env.ts";
24
24
  import { buildInstructionBundle } from "../../lib/instructions/bundle.ts";
25
25
  import type { Adapter } from "../adapter.ts";
26
- import { coordBinPath } from "../agents/coord-bin.ts";
26
+ import { resolveCoordRoot } from "../agents/coord-client.ts";
27
27
  import {
28
28
  type ClaimFinalizationDecision,
29
29
  type ClaimFinalizationDescriptor,
30
30
  classifyWriteClaimFinalization,
31
31
  formatWriteClaimFinalizationDenial,
32
32
  } from "../agents/finalization.ts";
33
+ import {
34
+ recordLiveClaimChangeV3,
35
+ restoreLiveCoordinationStateAfterEpochV3,
36
+ } from "../agents/live-authority-v3.ts";
33
37
  import { evaluateStopHook, STOP_REMEDIATION_MARKER } from "../agents/rules/stop-hook.ts";
34
38
  import {
35
39
  assistantTextStartsWithSessionNameBlock,
@@ -39,11 +43,11 @@ import {
39
43
  sessionNameDisplayRecoveryInstruction,
40
44
  toolResponseMintedSessionName,
41
45
  } from "../agents/session-name-display.ts";
42
- import { stampSessionNameSeen } from "../agents/state/heartbeat-writer.ts";
43
- import {
44
- ensureLiveCoordinationHeartbeat,
45
- readLiveCoordinationRow,
46
- } from "../agents/state/live-coordination-view.ts";
46
+ import type { Heartbeat } from "../agents/state/heartbeat-reader.ts";
47
+ import { readHeartbeat, stampSessionNameSeen } from "../agents/state/heartbeat-writer.ts";
48
+ import { readLiveCoordinationRow } from "../agents/state/live-coordination-view.ts";
49
+ import { ensureLiveCoordinationHeartbeat } from "../agents/state/live-coordination-writer.ts";
50
+ import { assignName } from "../agents/state/names.ts";
47
51
  import { writePidmapRow } from "../agents/state/pidmap.ts";
48
52
  import { agentsRequireGitFinalization, resolveBinName } from "../config.ts";
49
53
  import {
@@ -59,12 +63,14 @@ import {
59
63
  import { tryWriteLiveDisplayV3 } from "../events/v3/live-feed.ts";
60
64
  import {
61
65
  liveHookSignalDefersDrainV3,
66
+ reconcileLivePendingRuntimeContextV3,
62
67
  recordLiveDelegatedChildSessionV3,
63
68
  recordLiveHookSignalV3,
64
69
  resolveLiveEventLedgerRouteV3,
65
70
  } from "../events/v3/live-routing.ts";
66
71
  import { captureSpanClockV3 } from "../events/v3/span-state.ts";
67
- import { fetchPresence } from "../presence/index.ts";
72
+ import { ensureRelayDaemon, fetchPresence, publishPresence } from "../presence/index.ts";
73
+ import { closeProcessLoggers, legacyLogFields, processLogger } from "../storage/logger.ts";
68
74
  import { stableScopeId } from "../workflow/scope-id.ts";
69
75
  import { detectAdapter, shouldSkipHookAdapter } from "./adapter/detect.ts";
70
76
  import {
@@ -97,13 +103,19 @@ import {
97
103
  } from "./effects/index.ts";
98
104
  import { toolInputHash, toolTargetHash } from "./events/input-hash.ts";
99
105
  import { canonicalize } from "./guard-path.ts";
106
+ import {
107
+ beginHookHealth,
108
+ type HookHealthState,
109
+ observeHookDebug,
110
+ observeHookError,
111
+ writeHookHealthCompletion,
112
+ } from "./health.ts";
100
113
  import { adapterPidFromEnv, parsePsChainLine, selectAnchorPid } from "./resolve/anchor.ts";
101
- import { findCoordRoot } from "./resolve/coord-root.ts";
102
114
  import { extractIntentComment, resolveIntent } from "./resolve/intent.ts";
103
115
  import { resolveOwner } from "./resolve/owner.ts";
104
116
  import {
105
117
  inspectSessionNameDisplayImmediately,
106
- scanAssistantTextIncludes,
118
+ scanAssistantStatusBoxPresent,
107
119
  scanSessionNameDisplayedImmediately,
108
120
  scanStatusBoxPresent,
109
121
  scanTranscriptRuntime,
@@ -116,6 +128,8 @@ interface Argv {
116
128
  extra: string[];
117
129
  }
118
130
 
131
+ let hookHealthState: HookHealthState | undefined;
132
+
119
133
  function parseArgv(argv: string[]): Argv {
120
134
  const out: Argv = { eventName: null, extra: [] };
121
135
  for (let i = 0; i < argv.length; i++) {
@@ -134,6 +148,11 @@ function parseArgv(argv: string[]): Argv {
134
148
  return out;
135
149
  }
136
150
 
151
+ function extraArg(extra: string[], name: string): string | undefined {
152
+ const index = extra.indexOf(name);
153
+ return index >= 0 ? extra[index + 1] : undefined;
154
+ }
155
+
137
156
  async function readStdin(): Promise<string> {
138
157
  if (process.stdin.isTTY) return "";
139
158
  try {
@@ -148,17 +167,24 @@ async function readStdin(): Promise<string> {
148
167
  }
149
168
 
150
169
  /**
151
- * Env for child agent-coord spawns, with the coord root pinned. The hook
152
- * process may be running with the session shell's cwd (inside a submodule or
153
- * journal dir), and agent-coord resolves its root from cwd unless overridden —
154
- * without the pin a child could write state to a different .harnery than the
155
- * one this hook resolved.
170
+ * Env for a detached hook retry worker, with the coord root pinned. The hook
171
+ * may run with the session shell's cwd (inside a submodule or journal dir), so
172
+ * the worker must retain the root this process already resolved.
156
173
  */
157
174
  function childEnv(coordRoot: string): NodeJS.ProcessEnv {
158
175
  return { ...process.env, HARNERY_COORD_ROOT_OVERRIDE: coordRoot };
159
176
  }
160
177
 
161
178
  function appendDebug(coordRoot: string, entry: Record<string, unknown>): void {
179
+ observeHookDebug(hookHealthState, entry);
180
+ if (coordEnv("SHARED_LOGS") !== "0") {
181
+ try {
182
+ processLogger(coordRoot, "agent-hook").debug("agent_hook.diagnostic", legacyLogFields(entry));
183
+ return;
184
+ } catch {
185
+ /* fall through to the rollback writer */
186
+ }
187
+ }
162
188
  const path = join(coordRoot, ".harnery", "debug", "agent-hook.ndjson");
163
189
  try {
164
190
  mkdirSync(dirname(path), { recursive: true });
@@ -169,7 +195,20 @@ function appendDebug(coordRoot: string, entry: Record<string, unknown>): void {
169
195
  }
170
196
 
171
197
  function logError(coordRoot: string | null, err: unknown, context: Record<string, unknown>): void {
198
+ observeHookError(hookHealthState, context.phase);
172
199
  if (!coordRoot) return;
200
+ if (coordEnv("SHARED_LOGS") !== "0") {
201
+ try {
202
+ processLogger(coordRoot, "agent-hook").error(
203
+ "agent_hook.error",
204
+ legacyLogFields(context),
205
+ err,
206
+ );
207
+ return;
208
+ } catch {
209
+ /* fall through to the rollback writer */
210
+ }
211
+ }
173
212
  const path = join(coordRoot, ".harnery", "debug", "agent-hook.errors.ndjson");
174
213
  try {
175
214
  mkdirSync(dirname(path), { recursive: true });
@@ -189,38 +228,18 @@ function logError(coordRoot: string | null, err: unknown, context: Record<string
189
228
  }
190
229
 
191
230
  /**
192
- * Spawn `agent-coord assign-name <owner> <kind>` to mint or recover the
193
- * hurricane-style name for this owner. Returns null on any failure so
194
- * session.started emission never breaks the adapter flow.
195
- *
196
- * Lives at agent-hooks side (not agent-coord) to keep emitter/consumer
197
- * separation: we spawn rather than import.
231
+ * Mint or recover the hurricane-style name for this owner in-process. Returns
232
+ * null on any failure so session.started emission never breaks adapter flow.
198
233
  */
199
- function assignNameViaAgentCoord(
234
+ function assignNameInProcess(
200
235
  coordRoot: string,
201
236
  instanceId: string,
202
237
  kind: "session" | "subagent" | "transient",
203
238
  forkedFrom?: string,
204
239
  ): { name: string; kind: string } | null {
205
- const binary = coordBinPath("agent-coord", coordRoot) ?? "";
206
- if (!existsSync(binary)) return null;
207
240
  try {
208
- const args = ["assign-name", instanceId, kind];
209
- if (forkedFrom) args.push("--forked-from", forkedFrom);
210
- const result = spawnSync(binary, args, {
211
- encoding: "utf8",
212
- timeout: 2000,
213
- env: childEnv(coordRoot),
214
- });
215
- if (result.status !== 0 || !result.stdout) return null;
216
- const parsed = JSON.parse(result.stdout.trim()) as {
217
- name?: string;
218
- kind?: string;
219
- };
220
- if (parsed.name && parsed.kind) {
221
- return { name: parsed.name, kind: parsed.kind };
222
- }
223
- return null;
241
+ const name = assignName(coordRoot, instanceId, kind, forkedFrom ? { forkedFrom } : undefined);
242
+ return { name, kind };
224
243
  } catch {
225
244
  return null;
226
245
  }
@@ -294,14 +313,9 @@ function buildEventData(
294
313
  // tool.requested heal path instead. The forkedFrom plumbing below stays
295
314
  // for adapters that DO report a parent at session start.
296
315
  const forkedFrom: string | undefined = undefined;
297
- // Assign (or recover) name + kind via agent-coord. Idempotent: resume
316
+ // Assign (or recover) name + kind in-process. Idempotent: resume
298
317
  // returns the original name; new owner consumes a counter slot.
299
- const assigned = assignNameViaAgentCoord(
300
- ctx.coordRoot,
301
- ctx.instanceId,
302
- "session",
303
- forkedFrom,
304
- );
318
+ const assigned = assignNameInProcess(ctx.coordRoot, ctx.instanceId, "session", forkedFrom);
305
319
  // Write the adapter pid-map row so `harn agents whoami` ppid-walks find
306
320
  // this owner. Prefer the payload pid (the actual claude binary), then the
307
321
  // anchor walk (the `node` ancestor for Cursor, which has no payload pid),
@@ -369,7 +383,7 @@ function buildEventData(
369
383
  ctx.adapter === "cursor" &&
370
384
  !readLiveCoordinationRow(ctx.coordRoot, ctx.instanceId)?.name
371
385
  ) {
372
- assignNameViaAgentCoord(ctx.coordRoot, ctx.instanceId, "session");
386
+ assignNameInProcess(ctx.coordRoot, ctx.instanceId, "session");
373
387
  }
374
388
  const prompt = p?.prompt ?? "";
375
389
  const { value, truncated } = clampString(prompt, 4000);
@@ -408,9 +422,10 @@ function buildEventData(
408
422
  // assistant text only (same window, same scanner as the session-name
409
423
  // detection). The Stop verdict enforces this field; the loose field is
410
424
  // retained as diagnostic telemetry for the measured detector divergence.
411
- status_box_present_strict:
412
- scanAssistantTextIncludes(p?.transcript_path, "┌─ agent-") ||
413
- lastAssistantMessage.includes("┌─ agent-"),
425
+ status_box_present_strict: scanAssistantStatusBoxPresent(
426
+ p?.transcript_path,
427
+ lastAssistantMessage,
428
+ ),
414
429
  // Whether the session's suggested name is satisfied as of this turn,
415
430
  // and which name that refers to. Reported on every stop while a name
416
431
  // exists (the stop-hook.session_name verdict reads it per turn); the
@@ -439,7 +454,7 @@ function buildEventData(
439
454
  // (agent-coord/state/names.ts → kind=transient). Use the call ID as the
440
455
  // instance_id input; assignName falls through to transient.
441
456
  const childInstanceId = subagentCallId ?? ctx.instanceId;
442
- const assigned = assignNameViaAgentCoord(ctx.coordRoot, childInstanceId, "subagent");
457
+ const assigned = assignNameInProcess(ctx.coordRoot, childInstanceId, "subagent");
443
458
  return {
444
459
  agent_type:
445
460
  (p?.raw.agent_type as string | undefined) ??
@@ -569,10 +584,18 @@ function numberField(value: unknown): number | undefined {
569
584
 
570
585
  async function main(): Promise<number> {
571
586
  const hookStartedAt = performance.now();
587
+ const hookStartedRss = process.memoryUsage().rss;
572
588
  const hookClock = captureSpanClockV3();
573
589
  const { eventName, extra } = parseArgv(process.argv.slice(2));
574
590
  const adapter = detectAdapter(process.argv.slice(2));
575
591
  const raw = await readStdin();
592
+ hookHealthState = beginHookHealth({
593
+ started_at_ms: hookStartedAt,
594
+ started_rss_bytes: hookStartedRss,
595
+ event_name: eventName,
596
+ adapter,
597
+ payload_bytes: raw.length,
598
+ });
576
599
 
577
600
  // Cursor executes the Claude Code project hooks too on hosts wired for both
578
601
  // adapters, piping them its own payload (identifiable by the top-level
@@ -582,8 +605,9 @@ async function main(): Promise<number> {
582
605
  // `--adapter cursor` dispatch of the same payload carries the session.
583
606
  if (shouldSkipHookAdapter(adapter, raw)) {
584
607
  if (coordEnv("AGENT_COORD_OFF") !== "1") {
585
- const coordRoot = findCoordRoot(process.cwd());
608
+ const coordRoot = resolveCoordRoot(process.cwd());
586
609
  if (coordRoot) {
610
+ hookHealthState.coord_root = coordRoot;
587
611
  appendDebug(coordRoot, {
588
612
  ts: new Date().toISOString(),
589
613
  event_name: eventName,
@@ -607,7 +631,7 @@ async function main(): Promise<number> {
607
631
  if (adapter === "claude-code" && eventName) {
608
632
  const s = soundForEvent(eventName);
609
633
  if (s) {
610
- const repoRoot = findCoordRoot(process.cwd());
634
+ const repoRoot = resolveCoordRoot(process.cwd());
611
635
  if (repoRoot) {
612
636
  let sid = "";
613
637
  let stopContinuation = false;
@@ -638,8 +662,12 @@ async function main(): Promise<number> {
638
662
  // bypass during incident triage.
639
663
  if (coordEnv("AGENT_COORD_OFF") === "1") return 0;
640
664
 
641
- const coordRoot = findCoordRoot(process.cwd());
665
+ const coordRoot = resolveCoordRoot(process.cwd());
642
666
  if (!coordRoot) return 0;
667
+ hookHealthState.coord_root = coordRoot;
668
+ if (eventName === "runtime-context-retry") {
669
+ return runRuntimeContextRetryWorker(coordRoot, adapter, extra);
670
+ }
643
671
  const ledgerRoute = resolveLiveEventLedgerRouteV3(coordRoot);
644
672
 
645
673
  // Always log a breadcrumb, useful when an event_type maps to null or owner
@@ -661,6 +689,78 @@ async function main(): Promise<number> {
661
689
  return 0;
662
690
  }
663
691
 
692
+ // Cursor's preToolUse `agent_message` is only the current narration before
693
+ // that tool. It is not a transcript and therefore cannot prove that an
694
+ // earlier assistant response omitted the required session-name block.
695
+ // afterAgentResponse is the one native boundary that carries the completed
696
+ // assistant text. Preserve only privacy-safe ritual booleans in the V3
697
+ // producer's open-turn state; Stop consumes them into the authoritative
698
+ // turn.completed event. The response body never enters V3 or heartbeat.
699
+ if (adapter === "cursor" && eventName === "after-agent-response") {
700
+ const payload = parsePayload(raw, adapter);
701
+ const owner = resolveOwner({ payload: payload?.raw ?? null, coordRoot });
702
+ if (!owner) {
703
+ appendDebug(coordRoot, { ...debugBase, skipped: "no-owner-resolved" });
704
+ return 0;
705
+ }
706
+ const name = sessionNameDisplayPending(readLiveCoordinationRow(coordRoot, owner.instance_id));
707
+ const text = typeof payload?.raw.text === "string" ? payload.raw.text : "";
708
+ if (name && assistantTextStartsWithSessionNameBlock(text, name)) {
709
+ stampSessionNameSeen(coordRoot, owner.instance_id, name);
710
+ appendDebug(coordRoot, { ...debugBase, effect: "session-name-display-stamped" });
711
+ } else {
712
+ appendDebug(coordRoot, { ...debugBase, skipped: "no-session-name-sighting" });
713
+ }
714
+ if (ledgerRoute.state === "blocked") {
715
+ appendDebug(coordRoot, {
716
+ ...debugBase,
717
+ skipped: "v3-control-blocked",
718
+ reason: ledgerRoute.reason,
719
+ owner_source: owner.source,
720
+ });
721
+ return 0;
722
+ }
723
+ const statusBoxPresentStrict = scanAssistantStatusBoxPresent(undefined, text);
724
+ // The hook parser needs the completed reply long enough to scan it, but
725
+ // durable hook intake must never retain that body. Keep every other native
726
+ // field so turn correlation remains available to the producer.
727
+ const { text: _completedReply, ...privacySafeRaw } = payload?.raw ?? {};
728
+ const privacySafePayload = payload ? { ...payload, raw: privacySafeRaw } : null;
729
+ const v3Result = recordLiveHookSignalV3({
730
+ coordRoot,
731
+ route: ledgerRoute,
732
+ eventName,
733
+ payload: privacySafePayload,
734
+ adapter,
735
+ instanceId: owner.instance_id,
736
+ hook_name: eventName,
737
+ hook_duration_ms: Math.max(0, Math.floor(performance.now() - hookStartedAt)),
738
+ monotonic_ns: hookClock.monotonic_ns,
739
+ turn_ritual: {
740
+ status_box_present: statusBoxPresentStrict,
741
+ status_box_present_strict: statusBoxPresentStrict,
742
+ session_name_required: name !== undefined,
743
+ session_name_present: name ? assistantTextStartsWithSessionNameBlock(text, name) : false,
744
+ },
745
+ });
746
+ observeHookDebug(hookHealthState, { event_v3_state: v3Result.state });
747
+ appendDebug(coordRoot, {
748
+ ...debugBase,
749
+ effect: "cursor-response-ritual-observed",
750
+ owner_source: owner.source,
751
+ event_v3_state: v3Result.state,
752
+ ...(v3Result.state === "observed"
753
+ ? {
754
+ generation_id: v3Result.generation_id,
755
+ turn_id: v3Result.turn_id,
756
+ response_observed_at: v3Result.observed_at,
757
+ status_box_present_strict: statusBoxPresentStrict,
758
+ }
759
+ : {}),
760
+ });
761
+ return 0;
762
+ }
763
+
664
764
  const norm = normalizeEventName(eventName);
665
765
  if (!norm) {
666
766
  appendDebug(coordRoot, { ...debugBase, skipped: "non-canonical-event" });
@@ -680,8 +780,10 @@ async function main(): Promise<number> {
680
780
  });
681
781
  return 0;
682
782
  }
783
+ hookHealthState.owner_id = owner.instance_id;
683
784
 
684
785
  const sessionId = payload?.session_id ?? payload?.conversation_id ?? owner.instance_id;
786
+ const priorCoordination = readHeartbeat(coordRoot, owner.instance_id);
685
787
 
686
788
  const data = buildEventData(norm.event_type, {
687
789
  coordRoot,
@@ -756,6 +858,27 @@ async function main(): Promise<number> {
756
858
  ...(turnRitual ? { turn_ritual: turnRitual } : {}),
757
859
  ...(deferV3Drain ? { defer_drain: true } : {}),
758
860
  });
861
+ observeHookDebug(hookHealthState, {
862
+ ...(v3Result ? { event_v3_state: v3Result.state } : {}),
863
+ });
864
+ const recordedGenerationId =
865
+ v3Result && "event" in v3Result && "generation_id" in v3Result.event.scope
866
+ ? (v3Result.event.scope.generation_id as `gen_${string}`)
867
+ : undefined;
868
+ if (v3Result?.state === "recorded" || v3Result?.state === "already_started") {
869
+ try {
870
+ restoreLiveCoordinationStateAfterEpochV3({
871
+ coordRoot,
872
+ owner: owner.instance_id,
873
+ nativeSessionId: sessionId,
874
+ adapter,
875
+ prior: priorCoordination,
876
+ currentGenerationId: recordedGenerationId,
877
+ });
878
+ } catch (error) {
879
+ logError(coordRoot, error, { phase: "epoch-coordination-restore" });
880
+ }
881
+ }
759
882
  const v3EventId =
760
883
  v3Result && "event" in v3Result
761
884
  ? v3Result.event.event_id
@@ -795,7 +918,7 @@ async function main(): Promise<number> {
795
918
 
796
919
  if (v3Result?.state === "recorded" && capturedImages.length > 0) {
797
920
  try {
798
- recordImageArtifactsV3(coordRoot, v3Result.event, capturedImages);
921
+ recordImageArtifactsV3(coordRoot, v3Result.event, capturedImages, ledgerRoute.genesis_id);
799
922
  } catch (err) {
800
923
  logError(coordRoot, err, { phase: "image-artifact-observation" });
801
924
  }
@@ -889,6 +1012,44 @@ async function main(): Promise<number> {
889
1012
  // session-start additionalContext inside emitSessionStartSystemMessage.
890
1013
  if (adapter === "claude-code") journalJanitor(coordRoot);
891
1014
  imageJanitor(coordRoot);
1015
+ // Session start is the only caller of the artifact janitor and the storage
1016
+ // maintenance pass, so both load here instead of on every tool call.
1017
+ const { autoCleanArtifacts } = await import("../artifacts/index.ts");
1018
+ const { autoCleanEventV3Archives } = await import("../events/v3/archive-retention.ts");
1019
+ const { createAutomaticMaintenanceComposition, runAutomaticMaintenancePass } = await import(
1020
+ "../storage/maintenance-providers.ts"
1021
+ );
1022
+ // Effect: throttled daily sweep of expired artifact workspaces (guarded,
1023
+ // managed-expired only; see autoCleanArtifacts). Best-effort like every
1024
+ // janitor here: a failure logs and never blocks session start.
1025
+ try {
1026
+ autoCleanArtifacts(coordRoot);
1027
+ } catch (err) {
1028
+ logError(coordRoot, err, { phase: "artifact-auto-clean" });
1029
+ }
1030
+ // Effect: apply the same daily throttle to closed V3 epochs. The newest
1031
+ // recovery epochs remain protected by the archive retention policy.
1032
+ try {
1033
+ autoCleanEventV3Archives(coordRoot);
1034
+ } catch (err) {
1035
+ logError(coordRoot, err, { phase: "event-v3-archive-auto-clean" });
1036
+ }
1037
+ // Plan one bounded, claim-first global slice from cached pressure only.
1038
+ // Existing owner janitors above remain the only active executors until
1039
+ // each provider receives a separate production activation.
1040
+ try {
1041
+ await runAutomaticMaintenancePass(
1042
+ createAutomaticMaintenanceComposition(coordRoot, {
1043
+ journal: () => {
1044
+ if (adapter === "claude-code") journalJanitor(coordRoot);
1045
+ },
1046
+ images: () => imageJanitor(coordRoot),
1047
+ artifacts: () => autoCleanArtifacts(coordRoot),
1048
+ }),
1049
+ );
1050
+ } catch (err) {
1051
+ logError(coordRoot, err, { phase: "storage-maintenance-auto" });
1052
+ }
892
1053
  let recovery: PreparedContextRecovery | null = null;
893
1054
  if (payload?.source === "compact") {
894
1055
  try {
@@ -920,10 +1081,13 @@ async function main(): Promise<number> {
920
1081
  } catch (err) {
921
1082
  logError(coordRoot, err, { phase: "session-start-systemMessage" });
922
1083
  }
923
- // Pull advisory cross-machine presence. V3 never publishes from the
924
- // disposable heartbeat cache.
1084
+ // Cross-machine presence is derived from the authority-safe V3 projection,
1085
+ // not the disposable heartbeat cache. Announce this session, pull peers,
1086
+ // and keep the optional live relay connected.
925
1087
  try {
1088
+ publishPresence(coordRoot);
926
1089
  fetchPresence(coordRoot);
1090
+ ensureRelayDaemon(coordRoot);
927
1091
  } catch (err) {
928
1092
  logError(coordRoot, err, { phase: "session-start-presence" });
929
1093
  }
@@ -933,7 +1097,7 @@ async function main(): Promise<number> {
933
1097
  // agnostic since v0.5.0.
934
1098
  if (norm.event_type === "session.ended") {
935
1099
  try {
936
- cleanupSessionEnd(coordRoot, owner.instance_id, (data.reason as string) ?? "unknown");
1100
+ cleanupSessionEnd(coordRoot, owner.instance_id);
937
1101
  } catch (err) {
938
1102
  logError(coordRoot, err, { phase: "session-end-cleanup" });
939
1103
  }
@@ -943,6 +1107,13 @@ async function main(): Promise<number> {
943
1107
  journalArchive(coordRoot, owner.instance_id);
944
1108
  runSessionSyncExtension(coordRoot, true);
945
1109
  }
1110
+ // Publish the post-cleanup V3 projection so remote machines see this
1111
+ // session disappear without waiting for the stale window.
1112
+ try {
1113
+ publishPresence(coordRoot);
1114
+ } catch (err) {
1115
+ logError(coordRoot, err, { phase: "session-end-presence" });
1116
+ }
946
1117
  }
947
1118
 
948
1119
  // Phase 8: SubagentStart: the child generation was opened above from the
@@ -951,27 +1122,9 @@ async function main(): Promise<number> {
951
1122
  if (norm.event_type === "agent.started") {
952
1123
  try {
953
1124
  const childInstanceId = (data.agent_id as string | undefined) ?? owner.instance_id;
954
- const agentCoordBin = coordBinPath("agent-coord", coordRoot) ?? "";
955
- if (existsSync(agentCoordBin)) {
956
- spawnSync(agentCoordBin, ["project"], {
957
- encoding: "utf8",
958
- timeout: 3000,
959
- env: childEnv(coordRoot),
960
- });
961
- spawnSync(
962
- agentCoordBin,
963
- [
964
- "log",
965
- `SUBAGENT_START agent_type=${(data.agent_type as string) ?? "unknown"} agent_id=${childInstanceId.slice(0, 8)} platform=${adapterPlatform(adapter)}`,
966
- "--instance",
967
- childInstanceId,
968
- ],
969
- { encoding: "utf8", timeout: 2000, env: childEnv(coordRoot) },
970
- );
971
- }
972
- emitSubagentStartContext(coordRoot, childInstanceId, sessionId, data, adapter);
1125
+ await emitSubagentStartContext(coordRoot, childInstanceId, sessionId, data, adapter);
973
1126
  } catch (err) {
974
- logError(coordRoot, err, { phase: "subagent-start-project" });
1127
+ logError(coordRoot, err, { phase: "subagent-start-context" });
975
1128
  }
976
1129
  }
977
1130
 
@@ -979,20 +1132,7 @@ async function main(): Promise<number> {
979
1132
  if (norm.event_type === "agent.completed") {
980
1133
  try {
981
1134
  const childInstanceId = payload?.subagent_id ?? payload?.agent_id ?? owner.instance_id;
982
- cleanupSessionEnd(coordRoot, childInstanceId, (data.reason as string) ?? "unknown");
983
- const agentCoordBin = coordBinPath("agent-coord", coordRoot) ?? "";
984
- if (existsSync(agentCoordBin)) {
985
- spawnSync(
986
- agentCoordBin,
987
- [
988
- "log",
989
- `SUBAGENT_STOP agent_id=${childInstanceId.slice(0, 8)} platform=${adapterPlatform(adapter)}`,
990
- "--instance",
991
- childInstanceId,
992
- ],
993
- { encoding: "utf8", timeout: 2000, env: childEnv(coordRoot) },
994
- );
995
- }
1135
+ cleanupSessionEnd(coordRoot, childInstanceId);
996
1136
  const { reconcileSessionFinalizationV3 } = await import("../agents/session-finalizer-v3.ts");
997
1137
  reconcileSessionFinalizationV3(coordRoot, { archive_observations: [] });
998
1138
  } catch (err) {
@@ -1061,6 +1201,16 @@ async function main(): Promise<number> {
1061
1201
  runSessionSyncExtension(coordRoot, false);
1062
1202
  }
1063
1203
 
1204
+ // Publish after the canonical turn event has landed so the blob carries
1205
+ // current task, activity, and claim state. Re-ensure the relay here because
1206
+ // its daemon intentionally exits when a machine has no live sessions.
1207
+ try {
1208
+ publishPresence(coordRoot);
1209
+ ensureRelayDaemon(coordRoot);
1210
+ } catch (err) {
1211
+ logError(coordRoot, err, { phase: "stop-presence" });
1212
+ }
1213
+
1064
1214
  // Stop verdict (V3 ritual + task/status gate). Direct in-process call: the
1065
1215
  // rule lives in Harnery. agent-hook already emitted this turn.completed
1066
1216
  // with privacy-safe ritual observations, so the evidence is in the stream.
@@ -1069,6 +1219,8 @@ async function main(): Promise<number> {
1069
1219
  instance_id: owner.instance_id,
1070
1220
  session_id: sessionId,
1071
1221
  adapter,
1222
+ stop_hook_active: payload?.stop_hook_active === true,
1223
+ status_box_present_strict: data.status_box_present_strict === true,
1072
1224
  bypass: coordEnv("AGENT_COORD_BYPASS_STOP") === "1",
1073
1225
  workflow_child: coordEnv("WORKFLOW_CHILD") === "1",
1074
1226
  });
@@ -1078,13 +1230,16 @@ async function main(): Promise<number> {
1078
1230
  // `cap` consecutive blocked stops in one cycle, allow the stop instead
1079
1231
  // of bouncing the model forever. Cycle boundaries come from the
1080
1232
  // adapter's continuation flag, so adapters without one are unaffected.
1081
- const { remediationCapExceeded } = await import("./remediation-cap.ts");
1082
- if (remediationCapExceeded(sessionId, payload?.stop_hook_active === true)) {
1233
+ const { recordRemediationBlock } = await import("./remediation-cap.ts");
1234
+ const remediation = recordRemediationBlock(sessionId, payload?.stop_hook_active === true);
1235
+ if (remediation.exceeded) {
1083
1236
  appendDebug(coordRoot, {
1084
1237
  ...debugBase,
1085
1238
  skipped: "stop-remediation-cap-exhausted",
1086
1239
  blocked_rule: verdict.rule,
1240
+ blocked_count: remediation.count,
1087
1241
  session_id: sessionId,
1242
+ remediation_cycle_anchor: verdict.remediation_cycle_anchor,
1088
1243
  });
1089
1244
  } else {
1090
1245
  // Adapter-aware enforcement channel: Claude Code honors exit-2 + stderr
@@ -1113,6 +1268,7 @@ async function main(): Promise<number> {
1113
1268
  } catch (err) {
1114
1269
  logError(coordRoot, err, { phase: "stop-explicit-session-finalization" });
1115
1270
  }
1271
+ if (adapter === "codex") scheduleCodexRuntimeContextRetry(coordRoot, sessionId);
1116
1272
  }
1117
1273
 
1118
1274
  // Phase 7: PreToolUse: heartbeat + pid-map self-heal on every tool call.
@@ -1141,14 +1297,18 @@ async function main(): Promise<number> {
1141
1297
  // runs before a name exists; every later tool waits until the exact block
1142
1298
  // is the first assistant text after the mint result. Cursor supplies
1143
1299
  // agent_message directly; Claude Code and Codex are resolved from their
1144
- // JSONL transcripts. Later commentary must not erase an already-correct
1145
- // display, and an unreadable transcript must not deadlock every tool.
1300
+ // JSONL transcripts. Cursor's current narration can provide positive
1301
+ // evidence, but cannot disprove an earlier response; afterAgentResponse
1302
+ // stamps that durable sighting. Later commentary must not erase an
1303
+ // already-correct display, and unavailable evidence must not deadlock
1304
+ // every tool.
1146
1305
  try {
1147
1306
  const displayAllowed = await enforcePendingSessionNameDisplay(
1148
1307
  coordRoot,
1149
1308
  owner.instance_id,
1150
1309
  adapter,
1151
1310
  payload,
1311
+ generationBoundHeartbeat(readHeartbeat(coordRoot, owner.instance_id), recordedGenerationId),
1152
1312
  );
1153
1313
  if (!displayAllowed) return 0;
1154
1314
  } catch (err) {
@@ -1225,13 +1385,56 @@ async function main(): Promise<number> {
1225
1385
  return 0;
1226
1386
  }
1227
1387
 
1388
+ function scheduleCodexRuntimeContextRetry(coordRoot: string, nativeSessionId: string): void {
1389
+ const modulePath = process.argv[1];
1390
+ if (!modulePath) return;
1391
+ try {
1392
+ const child = spawn(
1393
+ process.execPath,
1394
+ [modulePath, "runtime-context-retry", "--adapter", "codex", "--session-id", nativeSessionId],
1395
+ {
1396
+ cwd: coordRoot,
1397
+ detached: true,
1398
+ stdio: "ignore",
1399
+ env: childEnv(coordRoot),
1400
+ },
1401
+ );
1402
+ child.unref();
1403
+ } catch (err) {
1404
+ logError(coordRoot, err, { phase: "runtime-context-retry-spawn" });
1405
+ }
1406
+ }
1407
+
1408
+ async function runRuntimeContextRetryWorker(
1409
+ coordRoot: string,
1410
+ adapter: Adapter | null,
1411
+ extra: string[],
1412
+ ): Promise<number> {
1413
+ const nativeSessionId = extraArg(extra, "--session-id");
1414
+ if (adapter !== "codex" || !nativeSessionId) return 0;
1415
+ for (const [index, delayMs] of [400, 1_000].entries()) {
1416
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
1417
+ const route = resolveLiveEventLedgerRouteV3(coordRoot);
1418
+ if (route.state !== "v3") return 0;
1419
+ const result = reconcileLivePendingRuntimeContextV3({
1420
+ coordRoot,
1421
+ route,
1422
+ nativeSessionId,
1423
+ finalAttempt: index === 1,
1424
+ });
1425
+ if (result.state !== "pending" && result.state !== "busy") return 0;
1426
+ }
1427
+ return 0;
1428
+ }
1429
+
1228
1430
  async function enforcePendingSessionNameDisplay(
1229
1431
  coordRoot: string,
1230
1432
  instanceId: string,
1231
1433
  adapter: Adapter,
1232
1434
  payload: ParsedPayload | null,
1435
+ coordination: Heartbeat | null,
1233
1436
  ): Promise<boolean> {
1234
- const name = sessionNameDisplayPending(readLiveCoordinationRow(coordRoot, instanceId));
1437
+ const name = sessionNameDisplayPending(coordination);
1235
1438
  if (!name) return true;
1236
1439
 
1237
1440
  const command = extractBashCommand(payload?.tool_name, payload?.tool_input);
@@ -1242,7 +1445,7 @@ async function enforcePendingSessionNameDisplay(
1242
1445
  ? {
1243
1446
  state: assistantTextStartsWithSessionNameBlock(payload.agent_message, name)
1244
1447
  ? ("present" as const)
1245
- : ("absent" as const),
1448
+ : ("unavailable" as const),
1246
1449
  }
1247
1450
  : inspectSessionNameDisplayImmediately(
1248
1451
  // Codex hook payloads omit transcript_path on every event, which
@@ -1275,6 +1478,13 @@ async function enforcePendingSessionNameDisplay(
1275
1478
  return false;
1276
1479
  }
1277
1480
 
1481
+ function generationBoundHeartbeat(
1482
+ heartbeat: Heartbeat | null,
1483
+ generationId: `gen_${string}` | undefined,
1484
+ ): Heartbeat | null {
1485
+ return generationId && heartbeat?.v3_generation_id === generationId ? heartbeat : null;
1486
+ }
1487
+
1278
1488
  async function runPreToolUseGuard(
1279
1489
  coordRoot: string,
1280
1490
  instanceId: string,
@@ -1310,42 +1520,19 @@ async function runPreToolUseGuard(
1310
1520
  }
1311
1521
  if (targets.length === 0) return true;
1312
1522
 
1313
- const agentCoordBin = coordBinPath("agent-coord", coordRoot) ?? "";
1314
- if (!existsSync(agentCoordBin)) {
1315
- if (agentsRequireGitFinalization(coordRoot)) {
1316
- const { emitDeny } = await import("./adapter/output.ts");
1317
- emitDeny(
1318
- adapter,
1319
- "Harnery denied the write before mutation because the claim coordinator is unavailable; repair the project's Harnery installation and retry.",
1320
- );
1321
- return false;
1322
- }
1323
- return true;
1324
- }
1523
+ const { evaluateClaim } = await import("../agents/rules/claim-conflict.ts");
1325
1524
 
1326
1525
  // For apply_patch (multi-file), collect siblings so the deny reason names
1327
1526
  // them. For single-file tools the array has one entry.
1328
1527
  for (const target of targets) {
1329
- const verdictReq = JSON.stringify({
1330
- rule: "claim",
1331
- instance_id: instanceId,
1332
- session_id: sessionId,
1333
- path: target.path,
1334
- });
1335
- const result = spawnSync(agentCoordBin, ["verdict"], {
1336
- input: verdictReq,
1337
- encoding: "utf8",
1338
- timeout: 3000,
1339
- env: childEnv(coordRoot),
1340
- });
1341
- if (result.status !== 0 || !result.stdout) continue;
1342
- let parsed: { allow?: boolean; reason?: string } = {};
1343
1528
  try {
1344
- parsed = JSON.parse(result.stdout.trim());
1345
- } catch {
1346
- continue;
1347
- }
1348
- if (parsed.allow === false) {
1529
+ const parsed = evaluateClaim(coordRoot, {
1530
+ rule: "claim",
1531
+ instance_id: instanceId,
1532
+ session_id: sessionId,
1533
+ path: target.path,
1534
+ });
1535
+ if (parsed.allow !== false) continue;
1349
1536
  let reason =
1350
1537
  parsed.reason ?? `Path ${target.path} is currently being edited by another agent.`;
1351
1538
  if (targets.length > 1) {
@@ -1361,7 +1548,7 @@ async function runPreToolUseGuard(
1361
1548
  const { emitDeny } = await import("./adapter/output.ts");
1362
1549
  emitDeny(adapter, reason);
1363
1550
  return false;
1364
- }
1551
+ } catch {}
1365
1552
  }
1366
1553
  return true;
1367
1554
  }
@@ -1564,16 +1751,23 @@ function releaseClaimOnFailure(
1564
1751
  const row = readLiveCoordinationRow(coordRoot, instanceId);
1565
1752
  if (!row?.files_touched?.includes(canonical)) return;
1566
1753
 
1567
- const agentCoordBin = coordBinPath("agent-coord", coordRoot) ?? "";
1568
- if (!existsSync(agentCoordBin)) return;
1569
- spawnSync(agentCoordBin, ["release-claim", instanceId, canonical], {
1570
- encoding: "utf8",
1571
- timeout: 2000,
1572
- env: childEnv(coordRoot),
1573
- });
1754
+ const before = readHeartbeat(coordRoot, instanceId);
1755
+ try {
1756
+ recordLiveClaimChangeV3({
1757
+ coordRoot,
1758
+ owner: instanceId,
1759
+ nativeSessionId: before?.session_id ?? instanceId,
1760
+ adapter: adapterFromPlatform(before?.platform),
1761
+ operation: "released",
1762
+ path: canonical,
1763
+ access: "write",
1764
+ });
1765
+ } catch {
1766
+ /* best-effort release must not break adapter flow */
1767
+ }
1574
1768
  }
1575
1769
 
1576
- function cleanupSessionEnd(coordRoot: string, instanceId: string, reason: string): void {
1770
+ function cleanupSessionEnd(coordRoot: string, instanceId: string): void {
1577
1771
  // Sweep pid-map entries pointing to this instance
1578
1772
  const pidmapDir = join(coordRoot, ".harnery", "pid-map");
1579
1773
  if (existsSync(pidmapDir)) {
@@ -1595,15 +1789,6 @@ function cleanupSessionEnd(coordRoot: string, instanceId: string, reason: string
1595
1789
  /* swallow */
1596
1790
  }
1597
1791
  }
1598
- // Activity log
1599
- const agentCoordBin = coordBinPath("agent-coord", coordRoot) ?? "";
1600
- if (existsSync(agentCoordBin)) {
1601
- spawnSync(
1602
- agentCoordBin,
1603
- ["log", `SESSION_END reason=${reason}`, "--instance", instanceId],
1604
- { encoding: "utf8", timeout: 2000 },
1605
- );
1606
- }
1607
1792
  }
1608
1793
 
1609
1794
  async function emitUserPromptSubmitSystemMessage(
@@ -1614,27 +1799,18 @@ async function emitUserPromptSubmitSystemMessage(
1614
1799
  workspaceCwd?: string,
1615
1800
  recoveryBriefing = "",
1616
1801
  ): Promise<boolean> {
1617
- const agentCoordBin = coordBinPath("agent-coord", coordRoot) ?? "";
1618
- let additionalContext = "";
1619
-
1620
- if (existsSync(agentCoordBin)) {
1621
- const args = ["prompt-context", "--instance", instanceId, "--session", sessionId];
1622
- // Every human-facing adapter gets the first-session naming reminder from
1623
- // the shared hook path. Cursor + Codex additionally get ongoing set-task
1624
- // staleness nudges; Claude Code enforces those via its Stop transcript.
1625
- // Codex gets a fresh status-footer reminder on every prompt. Its Stop hook
1626
- // stays observe-only, so missing the footer never replaces the answer.
1627
- // Claude Code + Cursor (the Stop-ENFORCING adapters) get a fresh per-turn
1628
- // ritual reminder: satisfying the contract up front is far cheaper than
1629
- // the bounce-and-retry the Stop hook otherwise forces.
1630
- args.push("--session-name-nudge");
1631
- if (adapter === "cursor" || adapter === "codex") args.push("--task-nudge");
1632
- if (adapter === "codex") args.push("--status-footer-nudge");
1633
- if (adapter === "claude-code" || adapter === "cursor")
1634
- args.push("--turn-ritual-nudge", adapter);
1635
- const result = spawnSync(agentCoordBin, args, { encoding: "utf8", timeout: 3000 });
1636
- if (result.status === 0 && result.stdout) additionalContext = result.stdout.trim();
1637
- }
1802
+ const { renderPromptContext } = await import("../agents/render/prompt-context.ts");
1803
+ let additionalContext = renderPromptContext({
1804
+ coordRoot,
1805
+ instanceId,
1806
+ sessionId,
1807
+ adapter,
1808
+ sessionNameNudge: true,
1809
+ taskNudge: adapter === "cursor" || adapter === "codex",
1810
+ hostPromptReminder: adapter === "codex",
1811
+ statusFooterNudge: adapter === "codex",
1812
+ turnRitualNudge: adapter === "claude-code" ? adapter : undefined,
1813
+ }).trim();
1638
1814
  if (adapter === "codex") {
1639
1815
  const fileLinkContext = renderCodexWslFileLinkContext(coordRoot, workspaceCwd);
1640
1816
  if (fileLinkContext) {
@@ -1651,14 +1827,14 @@ async function emitUserPromptSubmitSystemMessage(
1651
1827
  return true;
1652
1828
  }
1653
1829
 
1654
- function emitSubagentStartContext(
1830
+ async function emitSubagentStartContext(
1655
1831
  coordRoot: string,
1656
1832
  instanceId: string,
1657
1833
  sessionId: string,
1658
1834
  data: Record<string, unknown>,
1659
1835
  adapter: Adapter,
1660
- ): void {
1661
- // Look up the subagent's assigned name (just-written by agent-coord assignName
1836
+ ): Promise<void> {
1837
+ // Look up the subagent's assigned name (just-written by the in-process name
1662
1838
  // in session.started data) + the parent's short id for the "you are a subagent
1663
1839
  // of X" framing.
1664
1840
  const subagentName = (data.name as string | undefined) ?? "";
@@ -1671,23 +1847,20 @@ function emitSubagentStartContext(
1671
1847
  // Render peer table inline since the subagent might want to know who else
1672
1848
  // is around. Reuse prompt-context (which dedups against the per-owner hash);
1673
1849
  // first call will always emit.
1674
- const agentCoordBin = coordBinPath("agent-coord", coordRoot) ?? "";
1675
1850
  let combined = message;
1676
- if (existsSync(agentCoordBin)) {
1677
- const result = spawnSync(
1678
- agentCoordBin,
1679
- ["prompt-context", "--instance", instanceId, "--session", sessionId, "--name", subagentName],
1680
- { encoding: "utf8", timeout: 3000 },
1681
- );
1682
- const ctx = (result.stdout ?? "").trim();
1683
- if (ctx) combined = `${message}\n\n${ctx}`;
1684
- }
1851
+ const { renderPromptContext } = await import("../agents/render/prompt-context.ts");
1852
+ const context = renderPromptContext({
1853
+ coordRoot,
1854
+ instanceId,
1855
+ sessionId,
1856
+ agentName: subagentName,
1857
+ }).trim();
1858
+ if (context) combined = `${message}\n\n${context}`;
1685
1859
 
1686
1860
  // Use SubagentStart event-name in CC's hookSpecificOutput shape; cursor's
1687
1861
  // flat `additional_context` works the same way.
1688
- void import("./adapter/output.ts").then(({ emitContext }) => {
1689
- emitContext(adapter, "SubagentStart", combined);
1690
- });
1862
+ const { emitContext } = await import("./adapter/output.ts");
1863
+ emitContext(adapter, "SubagentStart", combined);
1691
1864
  }
1692
1865
 
1693
1866
  function adapterPlatform(adapter: Adapter): string {
@@ -1695,6 +1868,12 @@ function adapterPlatform(adapter: Adapter): string {
1695
1868
  return adapter;
1696
1869
  }
1697
1870
 
1871
+ function adapterFromPlatform(platform: unknown): Adapter {
1872
+ if (platform === "cursor") return "cursor";
1873
+ if (platform === "codex") return "codex";
1874
+ return "claude-code";
1875
+ }
1876
+
1698
1877
  async function emitSessionStartSystemMessage(
1699
1878
  coordRoot: string,
1700
1879
  instanceId: string,
@@ -1703,53 +1882,29 @@ async function emitSessionStartSystemMessage(
1703
1882
  adapter: Adapter,
1704
1883
  recoveryBriefing = "",
1705
1884
  ): Promise<boolean> {
1706
- const agentCoordBin = coordBinPath("agent-coord", coordRoot) ?? "";
1707
1885
  const workflowChild = coordEnv("WORKFLOW_CHILD") === "1";
1708
1886
  let additionalContext = "";
1709
- if (existsSync(agentCoordBin)) {
1710
- // Sync-project so the heartbeat exists for downstream readers (peer table,
1711
- // wiring check, council invites).
1712
- spawnSync(agentCoordBin, ["project"], { encoding: "utf8", timeout: 3000 });
1713
- // Opportunistic reconciliation makes normal session starts a failsafe for
1714
- // archive, idle, cascade, and host lifecycle observations.
1715
- spawnSync(agentCoordBin, ["reconcile-finalization"], {
1716
- encoding: "utf8",
1717
- timeout: 5000,
1718
- env: { ...process.env, HARNERY_COORD_ROOT_OVERRIDE: coordRoot },
1719
- });
1720
-
1721
- // SESSION_START activity log line, fired across all adapters.
1722
- const model = (emittedData.model as string | undefined) ?? "unknown";
1723
- const source = (emittedData.source as string | undefined) ?? "startup";
1724
- const platform = adapterPlatform(adapter);
1725
- spawnSync(
1726
- agentCoordBin,
1727
- [
1728
- "log",
1729
- `SESSION_START model=${model} source=${source} platform=${platform}`,
1730
- "--instance",
1731
- instanceId,
1732
- ],
1733
- { encoding: "utf8", timeout: 2000 },
1734
- );
1735
-
1736
- // Workflow children retain lifecycle/event capture but do not receive
1737
- // operator-facing peer, council, or init-remediation context. Injecting
1738
- // that context can make a bounded child follow housekeeping instructions
1739
- // instead of its assigned prompt.
1740
- if (!workflowChild) {
1741
- const agentName = (emittedData.name as string | undefined) ?? "";
1742
- const args = ["session-context", "--instance", instanceId, "--session", sessionId];
1743
- if (agentName) args.push("--name", agentName);
1744
- // The "You are agent-X." prefix in session-context renders unqualified by
1745
- // default (claude-code-style). For cursor/codex the bash dispatchers add
1746
- // a "(Cursor)" / "(Codex)" suffix; pass it through as --platform-label.
1747
- if (adapter !== "claude-code") {
1748
- args.push("--platform-label", platform === "cursor" ? "Cursor" : "Codex");
1749
- }
1750
- const result = spawnSync(agentCoordBin, args, { encoding: "utf8", timeout: 3000 });
1751
- if (result.status === 0 && result.stdout) additionalContext = result.stdout.trim();
1752
- }
1887
+ // Opportunistic reconciliation makes normal session starts a failsafe for
1888
+ // archive, idle, cascade, and host lifecycle observations. It also runs the
1889
+ // stale cache sweep through the shared ADR 0077 composition.
1890
+ const { reconcileCoordinationV3 } = await import("../agents/reconcile-coordination-v3.ts");
1891
+ reconcileCoordinationV3(coordRoot);
1892
+
1893
+ // Workflow children retain lifecycle/event capture but do not receive
1894
+ // operator-facing peer, council, or init-remediation context. Injecting
1895
+ // that context can make a bounded child follow housekeeping instructions
1896
+ // instead of its assigned prompt.
1897
+ if (!workflowChild) {
1898
+ const agentName = (emittedData.name as string | undefined) ?? "";
1899
+ const { renderSessionContext } = await import("../agents/render/session-context.ts");
1900
+ additionalContext = renderSessionContext({
1901
+ coordRoot,
1902
+ instanceId,
1903
+ sessionId,
1904
+ agentName: agentName || undefined,
1905
+ platformLabel:
1906
+ adapter === "claude-code" ? undefined : adapter === "cursor" ? "Cursor" : "Codex",
1907
+ }).trim();
1753
1908
  }
1754
1909
 
1755
1910
  // Effect (claude-code): merge the journal recovery cue into the session-start
@@ -1796,11 +1951,27 @@ function completeRecoveryInjection(
1796
1951
  }
1797
1952
 
1798
1953
  main()
1799
- .then((code) => process.exit(code))
1800
- .catch((err) => {
1801
- logError(findCoordRoot(process.cwd()), err, {
1954
+ .then(async (code) => {
1955
+ writeHookHealthCompletion(hookHealthState, {
1956
+ finished_at_ms: performance.now(),
1957
+ finished_rss_bytes: process.memoryUsage().rss,
1958
+ pid: process.pid,
1959
+ });
1960
+ await closeProcessLoggers();
1961
+ process.exit(code);
1962
+ })
1963
+ .catch(async (err) => {
1964
+ logError(resolveCoordRoot(process.cwd()), err, {
1802
1965
  argv: process.argv.slice(2),
1803
1966
  pid: process.pid,
1967
+ phase: "top-level",
1968
+ });
1969
+ writeHookHealthCompletion(hookHealthState, {
1970
+ finished_at_ms: performance.now(),
1971
+ finished_rss_bytes: process.memoryUsage().rss,
1972
+ pid: process.pid,
1973
+ faulted: true,
1804
1974
  });
1975
+ await closeProcessLoggers();
1805
1976
  process.exit(0);
1806
1977
  });