harnery 0.30.0 → 0.31.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 (501) hide show
  1. package/README.md +4 -4
  2. package/dist/commander.d.ts +8 -0
  3. package/dist/commander.d.ts.map +1 -1
  4. package/dist/commander.js +14 -13
  5. package/dist/commands/adapter.d.ts +12 -0
  6. package/dist/commands/adapter.d.ts.map +1 -0
  7. package/dist/commands/{harness.js → adapter.js} +35 -35
  8. package/dist/commands/agents.d.ts +3 -2
  9. package/dist/commands/agents.d.ts.map +1 -1
  10. package/dist/commands/agents.js +61 -60
  11. package/dist/commands/artifacts.d.ts +4 -0
  12. package/dist/commands/artifacts.d.ts.map +1 -0
  13. package/dist/commands/artifacts.js +143 -0
  14. package/dist/commands/backup.d.ts +1 -1
  15. package/dist/commands/backup.d.ts.map +1 -1
  16. package/dist/commands/backup.js +5 -2
  17. package/dist/commands/browse.d.ts.map +1 -1
  18. package/dist/commands/browse.js +310 -7
  19. package/dist/commands/checkpoint.d.ts +12 -0
  20. package/dist/commands/checkpoint.d.ts.map +1 -0
  21. package/dist/commands/checkpoint.js +162 -0
  22. package/dist/commands/context.d.ts +2 -2
  23. package/dist/commands/context.d.ts.map +1 -1
  24. package/dist/commands/context.js +3 -151
  25. package/dist/commands/decision.d.ts.map +1 -1
  26. package/dist/commands/decision.js +31 -7
  27. package/dist/commands/deinit.d.ts +2 -2
  28. package/dist/commands/deinit.js +15 -15
  29. package/dist/commands/doctor.js +23 -23
  30. package/dist/commands/governor.d.ts +4 -0
  31. package/dist/commands/governor.d.ts.map +1 -0
  32. package/dist/commands/{supervisor.js → governor.js} +133 -108
  33. package/dist/commands/init.d.ts +12 -12
  34. package/dist/commands/init.d.ts.map +1 -1
  35. package/dist/commands/init.js +44 -30
  36. package/dist/commands/{session.d.ts → journal.d.ts} +2 -2
  37. package/dist/commands/journal.d.ts.map +1 -0
  38. package/dist/commands/{scratch.js → journal.js} +47 -47
  39. package/dist/commands/policy.js +1 -1
  40. package/dist/commands/presence.js +2 -2
  41. package/dist/commands/sync.d.ts +1 -1
  42. package/dist/commands/sync.js +3 -3
  43. package/dist/commands/tunnel.d.ts +16 -0
  44. package/dist/commands/tunnel.d.ts.map +1 -1
  45. package/dist/commands/tunnel.js +193 -23
  46. package/dist/commands/web-fetch.js +1 -1
  47. package/dist/commands/web.d.ts +19 -0
  48. package/dist/commands/web.d.ts.map +1 -1
  49. package/dist/commands/web.js +51 -0
  50. package/dist/commands/work.d.ts.map +1 -1
  51. package/dist/commands/work.js +38 -22
  52. package/dist/commands/workflow.d.ts.map +1 -1
  53. package/dist/commands/workflow.js +35 -28
  54. package/dist/core/{harnesses → adapters}/attest-projection.d.ts +2 -2
  55. package/dist/core/adapters/attest-projection.d.ts.map +1 -0
  56. package/dist/core/{harnesses → adapters}/attest.d.ts +16 -16
  57. package/dist/core/adapters/attest.d.ts.map +1 -0
  58. package/dist/core/{harnesses → adapters}/attest.js +9 -9
  59. package/dist/core/{harnesses → adapters}/attestation.d.ts +16 -16
  60. package/dist/core/adapters/attestation.d.ts.map +1 -0
  61. package/dist/core/{harnesses → adapters}/attestation.js +20 -20
  62. package/dist/core/{harnesses → adapters}/bench.d.ts +12 -12
  63. package/dist/core/adapters/bench.d.ts.map +1 -0
  64. package/dist/core/{harnesses → adapters}/bench.js +12 -12
  65. package/dist/core/adapters/index.d.ts +13 -0
  66. package/dist/core/adapters/index.d.ts.map +1 -0
  67. package/dist/core/adapters/index.js +6 -0
  68. package/dist/core/{harnesses → adapters}/profiles.d.ts +11 -11
  69. package/dist/core/adapters/profiles.d.ts.map +1 -0
  70. package/dist/core/{harnesses → adapters}/profiles.js +11 -11
  71. package/dist/core/adapters/registry.d.ts +15 -0
  72. package/dist/core/adapters/registry.d.ts.map +1 -0
  73. package/dist/core/{harnesses → adapters}/registry.js +11 -11
  74. package/dist/core/{harnesses → adapters}/types.d.ts +23 -23
  75. package/dist/core/adapters/types.d.ts.map +1 -0
  76. package/dist/core/{harnesses → adapters}/types.js +1 -1
  77. package/dist/core/agents/canonical-emit.d.ts +4 -4
  78. package/dist/core/agents/canonical-emit.js +5 -5
  79. package/dist/core/agents/cli-emit.js +1 -1
  80. package/dist/core/agents/cli.js +30 -26
  81. package/dist/core/agents/codex-replay.d.ts +1 -1
  82. package/dist/core/agents/codex-replay.js +6 -6
  83. package/dist/core/agents/coord-client.d.ts +21 -2
  84. package/dist/core/agents/coord-client.d.ts.map +1 -1
  85. package/dist/core/agents/coord-client.js +122 -27
  86. package/dist/core/agents/events/consume.d.ts +1 -1
  87. package/dist/core/agents/events/emit.d.ts +5 -6
  88. package/dist/core/agents/events/emit.d.ts.map +1 -1
  89. package/dist/core/agents/events/emit.js +2 -2
  90. package/dist/core/agents/render/prompt-context.d.ts +21 -9
  91. package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
  92. package/dist/core/agents/render/prompt-context.js +82 -30
  93. package/dist/core/agents/render/session-context.d.ts +1 -1
  94. package/dist/core/agents/render/session-context.js +5 -5
  95. package/dist/core/agents/rules/claim-conflict.d.ts +2 -6
  96. package/dist/core/agents/rules/claim-conflict.d.ts.map +1 -1
  97. package/dist/core/agents/rules/claim-conflict.js +1 -1
  98. package/dist/core/agents/rules/commit-conflict.js +98 -22
  99. package/dist/core/agents/rules/stop-hook.d.ts +9 -9
  100. package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
  101. package/dist/core/agents/rules/stop-hook.js +23 -5
  102. package/dist/core/agents/rules/verdict.d.ts +14 -0
  103. package/dist/core/agents/rules/verdict.d.ts.map +1 -0
  104. package/dist/core/agents/rules/verdict.js +1 -0
  105. package/dist/core/agents/session-events.js +3 -3
  106. package/dist/core/agents/state/council.d.ts +1 -1
  107. package/dist/core/agents/state/council.js +1 -1
  108. package/dist/core/agents/state/heartbeat-projector.d.ts +3 -2
  109. package/dist/core/agents/state/heartbeat-projector.d.ts.map +1 -1
  110. package/dist/core/agents/state/heartbeat-projector.js +14 -10
  111. package/dist/core/agents/state/heartbeat-writer.d.ts +1 -1
  112. package/dist/core/agents/state/heartbeat-writer.js +12 -12
  113. package/dist/core/agents/state/{scratch.d.ts → journal.d.ts} +7 -7
  114. package/dist/core/agents/state/{scratch.d.ts.map → journal.d.ts.map} +1 -1
  115. package/dist/core/agents/state/{scratch.js → journal.js} +12 -12
  116. package/dist/core/agents/state/pidmap.d.ts +28 -4
  117. package/dist/core/agents/state/pidmap.d.ts.map +1 -1
  118. package/dist/core/agents/state/pidmap.js +130 -15
  119. package/dist/core/agents/state/proc-start.d.ts +95 -0
  120. package/dist/core/agents/state/proc-start.d.ts.map +1 -0
  121. package/dist/core/agents/state/proc-start.js +199 -0
  122. package/dist/core/agents/state/shell-mutation.d.ts +1 -1
  123. package/dist/core/agents/state/shell-mutation.js +1 -1
  124. package/dist/core/agents/state/stale-sweep.js +7 -7
  125. package/dist/core/artifacts/index.d.ts +86 -0
  126. package/dist/core/artifacts/index.d.ts.map +1 -0
  127. package/dist/core/artifacts/index.js +421 -0
  128. package/dist/core/config.d.ts +9 -2
  129. package/dist/core/config.d.ts.map +1 -1
  130. package/dist/core/config.js +26 -2
  131. package/dist/core/context/index.d.ts +12 -12
  132. package/dist/core/context/index.js +10 -10
  133. package/dist/core/governor/adapter-spread.d.ts +52 -0
  134. package/dist/core/governor/adapter-spread.d.ts.map +1 -0
  135. package/dist/core/governor/adapter-spread.js +52 -0
  136. package/dist/core/governor/index.d.ts +7 -0
  137. package/dist/core/governor/index.d.ts.map +1 -0
  138. package/dist/core/governor/index.js +6 -0
  139. package/dist/core/governor/plan-api.d.ts +38 -0
  140. package/dist/core/governor/plan-api.d.ts.map +1 -0
  141. package/dist/core/governor/plan-api.js +83 -0
  142. package/dist/core/governor/plan-read.d.ts +5 -0
  143. package/dist/core/governor/plan-read.d.ts.map +1 -0
  144. package/dist/core/{supervisor → governor}/plan-read.js +66 -52
  145. package/dist/core/{supervisor → governor}/plan-types.d.ts +57 -56
  146. package/dist/core/governor/plan-types.d.ts.map +1 -0
  147. package/dist/core/{supervisor → governor}/plan-types.js +4 -4
  148. package/dist/core/governor/planning.d.ts +48 -0
  149. package/dist/core/governor/planning.d.ts.map +1 -0
  150. package/dist/core/{supervisor → governor}/planning.js +125 -94
  151. package/dist/core/governor/read.d.ts +6 -0
  152. package/dist/core/governor/read.d.ts.map +1 -0
  153. package/dist/core/governor/read.js +4 -0
  154. package/dist/core/governor/runner.d.ts +37 -0
  155. package/dist/core/governor/runner.d.ts.map +1 -0
  156. package/dist/core/{supervisor → governor}/runner.js +15 -15
  157. package/dist/core/governor/service-read.d.ts +6 -0
  158. package/dist/core/governor/service-read.d.ts.map +1 -0
  159. package/dist/core/{supervisor → governor}/service-read.js +12 -12
  160. package/dist/core/governor/service.d.ts +114 -0
  161. package/dist/core/governor/service.d.ts.map +1 -0
  162. package/dist/core/{supervisor → governor}/service.js +57 -57
  163. package/dist/core/governor/state.d.ts +116 -0
  164. package/dist/core/governor/state.d.ts.map +1 -0
  165. package/dist/core/{supervisor → governor}/state.js +228 -108
  166. package/dist/core/hooks/adapter/detect.d.ts +9 -0
  167. package/dist/core/hooks/{harness → adapter}/detect.d.ts.map +1 -1
  168. package/dist/core/hooks/{harness → adapter}/detect.js +8 -8
  169. package/dist/core/hooks/{harness → adapter}/events.d.ts +15 -14
  170. package/dist/core/hooks/adapter/events.d.ts.map +1 -0
  171. package/dist/core/hooks/{harness → adapter}/events.js +5 -5
  172. package/dist/core/hooks/{harness → adapter}/output.d.ts +20 -14
  173. package/dist/core/hooks/adapter/output.d.ts.map +1 -0
  174. package/dist/core/hooks/{harness → adapter}/output.js +30 -22
  175. package/dist/core/hooks/{harness → adapter}/parse.d.ts +5 -5
  176. package/dist/core/hooks/{harness → adapter}/parse.d.ts.map +1 -1
  177. package/dist/core/hooks/{harness → adapter}/parse.js +4 -4
  178. package/dist/core/hooks/{harness → adapter}/wiring.d.ts +15 -15
  179. package/dist/core/hooks/{harness → adapter}/wiring.d.ts.map +1 -1
  180. package/dist/core/hooks/{harness → adapter}/wiring.js +13 -13
  181. package/dist/core/hooks/cli.d.ts +3 -3
  182. package/dist/core/hooks/cli.js +175 -151
  183. package/dist/core/hooks/effects/image-capture.d.ts +5 -5
  184. package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
  185. package/dist/core/hooks/effects/image-capture.js +3 -3
  186. package/dist/core/hooks/effects/index.d.ts +12 -12
  187. package/dist/core/hooks/effects/index.d.ts.map +1 -1
  188. package/dist/core/hooks/effects/index.js +17 -17
  189. package/dist/core/hooks/events/emit.d.ts +2 -2
  190. package/dist/core/hooks/events/emit.d.ts.map +1 -1
  191. package/dist/core/hooks/events/emit.js +1 -1
  192. package/dist/core/hooks/events/rotate.js +1 -1
  193. package/dist/core/hooks/events/schema.d.ts +13 -5
  194. package/dist/core/hooks/events/schema.d.ts.map +1 -1
  195. package/dist/core/hooks/guard-path.d.ts +2 -2
  196. package/dist/core/hooks/guard-path.js +2 -2
  197. package/dist/core/hooks/index.d.ts +1 -1
  198. package/dist/core/hooks/index.d.ts.map +1 -1
  199. package/dist/core/hooks/resolve/anchor.d.ts +14 -5
  200. package/dist/core/hooks/resolve/anchor.d.ts.map +1 -1
  201. package/dist/core/hooks/resolve/anchor.js +64 -7
  202. package/dist/core/hooks/resolve/coord-root.d.ts +3 -3
  203. package/dist/core/hooks/resolve/coord-root.js +4 -4
  204. package/dist/core/hooks/resolve/intent.js +1 -1
  205. package/dist/core/hooks/resolve/owner.d.ts +1 -1
  206. package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
  207. package/dist/core/hooks/resolve/owner.js +11 -5
  208. package/dist/core/{scratch → journal}/index.d.ts +25 -25
  209. package/dist/core/{scratch → journal}/index.d.ts.map +1 -1
  210. package/dist/core/{scratch → journal}/index.js +38 -38
  211. package/dist/core/policy/evaluate.d.ts +1 -1
  212. package/dist/core/policy/evaluate.d.ts.map +1 -1
  213. package/dist/core/policy/evaluate.js +7 -7
  214. package/dist/core/policy/types.d.ts +3 -3
  215. package/dist/core/policy/types.d.ts.map +1 -1
  216. package/dist/core/work/state.d.ts +12 -4
  217. package/dist/core/work/state.d.ts.map +1 -1
  218. package/dist/core/work/state.js +50 -17
  219. package/dist/core/workflow/adapters.d.ts +17 -0
  220. package/dist/core/workflow/adapters.d.ts.map +1 -0
  221. package/dist/core/workflow/adapters.js +21 -0
  222. package/dist/core/workflow/approvals.js +6 -6
  223. package/dist/core/workflow/billing.d.ts +9 -9
  224. package/dist/core/workflow/billing.js +9 -9
  225. package/dist/core/workflow/child-env.d.ts +10 -2
  226. package/dist/core/workflow/child-env.d.ts.map +1 -1
  227. package/dist/core/workflow/child-env.js +12 -4
  228. package/dist/core/workflow/engine.d.ts +15 -5
  229. package/dist/core/workflow/engine.d.ts.map +1 -1
  230. package/dist/core/workflow/engine.js +138 -83
  231. package/dist/core/workflow/evidence-preflight.d.ts +24 -0
  232. package/dist/core/workflow/evidence-preflight.d.ts.map +1 -0
  233. package/dist/core/workflow/evidence-preflight.js +134 -0
  234. package/dist/core/workflow/index.d.ts +1 -1
  235. package/dist/core/workflow/index.d.ts.map +1 -1
  236. package/dist/core/workflow/proof.d.ts +11 -5
  237. package/dist/core/workflow/proof.d.ts.map +1 -1
  238. package/dist/core/workflow/proof.js +45 -36
  239. package/dist/core/workflow/run-state.d.ts +1 -1
  240. package/dist/core/workflow/run-state.js +7 -7
  241. package/dist/core/workflow/sandbox-projection.d.ts +6 -6
  242. package/dist/core/workflow/sandbox-projection.d.ts.map +1 -1
  243. package/dist/core/workflow/sandbox-projection.js +11 -11
  244. package/dist/core/workflow/spawn-claude.d.ts +3 -3
  245. package/dist/core/workflow/spawn-claude.d.ts.map +1 -1
  246. package/dist/core/workflow/spawn-claude.js +9 -6
  247. package/dist/core/workflow/spawn-codex.d.ts +4 -4
  248. package/dist/core/workflow/spawn-codex.d.ts.map +1 -1
  249. package/dist/core/workflow/spawn-codex.js +9 -6
  250. package/dist/core/workflow/spawn-cursor.d.ts +4 -4
  251. package/dist/core/workflow/spawn-cursor.d.ts.map +1 -1
  252. package/dist/core/workflow/spawn-cursor.js +9 -6
  253. package/dist/core/workflow/spawn-failure.d.ts +1 -1
  254. package/dist/core/workflow/spawn-failure.js +1 -1
  255. package/dist/core/workflow/specialists.js +2 -2
  256. package/dist/core/workflow/{journal.d.ts → transcript.d.ts} +8 -8
  257. package/dist/core/workflow/transcript.d.ts.map +1 -0
  258. package/dist/core/workflow/{journal.js → transcript.js} +14 -14
  259. package/dist/core/workflow/types.d.ts +98 -51
  260. package/dist/core/workflow/types.d.ts.map +1 -1
  261. package/dist/core/workflow/types.js +11 -1
  262. package/dist/core/workflow/validate.d.ts +1 -1
  263. package/dist/core/workflow/validate.js +1 -1
  264. package/dist/core/workflow/workspaces/cancellation.js +2 -2
  265. package/dist/core/workflow/workspaces/cleanup.js +2 -2
  266. package/dist/core/workflow/workspaces/execution.js +6 -6
  267. package/dist/core/workflow/workspaces/inspect.js +9 -9
  268. package/dist/core/workflow/workspaces/integration.js +14 -14
  269. package/dist/core/workflow/workspaces/lifecycle.d.ts +1 -1
  270. package/dist/core/workflow/workspaces/lifecycle.d.ts.map +1 -1
  271. package/dist/core/workflow/workspaces/lifecycle.js +9 -9
  272. package/dist/core/workflow/workspaces/local-git.d.ts.map +1 -1
  273. package/dist/core/workflow/workspaces/local-git.js +39 -5
  274. package/dist/core/workflow/workspaces/recovery.js +3 -3
  275. package/dist/core/workflow/workspaces/state.d.ts +1 -1
  276. package/dist/core/workflow/workspaces/state.d.ts.map +1 -1
  277. package/dist/core/workflow/workspaces/state.js +3 -3
  278. package/dist/core/workflow/workspaces/types.d.ts +1 -1
  279. package/dist/core/workflow/workspaces/types.d.ts.map +1 -1
  280. package/dist/lib/browser/asserts.d.ts +28 -0
  281. package/dist/lib/browser/asserts.d.ts.map +1 -0
  282. package/dist/lib/browser/asserts.js +152 -0
  283. package/dist/lib/browser/client.d.ts +49 -0
  284. package/dist/lib/browser/client.d.ts.map +1 -1
  285. package/dist/lib/browser/client.js +155 -14
  286. package/dist/lib/browser/content-checks.d.ts +108 -0
  287. package/dist/lib/browser/content-checks.d.ts.map +1 -0
  288. package/dist/lib/browser/content-checks.js +474 -0
  289. package/dist/lib/browser/critique.d.ts +91 -0
  290. package/dist/lib/browser/critique.d.ts.map +1 -0
  291. package/dist/lib/browser/critique.js +167 -0
  292. package/dist/lib/browser/geometry.d.ts +32 -0
  293. package/dist/lib/browser/geometry.d.ts.map +1 -1
  294. package/dist/lib/browser/geometry.js +244 -1
  295. package/dist/lib/browser/index.d.ts +4 -1
  296. package/dist/lib/browser/index.d.ts.map +1 -1
  297. package/dist/lib/browser/index.js +2 -0
  298. package/dist/lib/claude-desktop.d.ts.map +1 -1
  299. package/dist/lib/claude-desktop.js +4 -1
  300. package/dist/lib/council/index.d.ts +6 -6
  301. package/dist/lib/council/index.d.ts.map +1 -1
  302. package/dist/lib/council/index.js +8 -8
  303. package/dist/lib/identities/assume.d.ts +2 -2
  304. package/dist/lib/identities/assume.js +7 -7
  305. package/dist/lib/instructions/apply.d.ts +3 -3
  306. package/dist/lib/instructions/apply.d.ts.map +1 -1
  307. package/dist/lib/instructions/apply.js +75 -27
  308. package/dist/lib/instructions/host-addendum.d.ts +54 -0
  309. package/dist/lib/instructions/host-addendum.d.ts.map +1 -0
  310. package/dist/lib/instructions/host-addendum.js +107 -0
  311. package/dist/lib/instructions/templates.d.ts +10 -3
  312. package/dist/lib/instructions/templates.d.ts.map +1 -1
  313. package/dist/lib/instructions/templates.js +41 -12
  314. package/dist/lib/machine.d.ts +2 -2
  315. package/dist/lib/machine.js +2 -2
  316. package/package.json +26 -21
  317. package/schemas/config.schema.json +26 -1
  318. package/src/commander.ts +22 -13
  319. package/src/commands/{harness.ts → adapter.ts} +46 -46
  320. package/src/commands/agents.ts +71 -64
  321. package/src/commands/artifacts.ts +168 -0
  322. package/src/commands/backup.ts +47 -33
  323. package/src/commands/browse.ts +438 -2
  324. package/src/commands/checkpoint.ts +196 -0
  325. package/src/commands/context.ts +3 -176
  326. package/src/commands/decision.ts +41 -7
  327. package/src/commands/deinit.ts +16 -16
  328. package/src/commands/doctor.ts +28 -28
  329. package/src/commands/{supervisor.ts → governor.ts} +184 -154
  330. package/src/commands/init.ts +50 -34
  331. package/src/commands/{scratch.ts → journal.ts} +60 -60
  332. package/src/commands/policy.ts +1 -1
  333. package/src/commands/presence.ts +2 -2
  334. package/src/commands/sync.ts +3 -3
  335. package/src/commands/tunnel.ts +237 -34
  336. package/src/commands/web-fetch.ts +1 -1
  337. package/src/commands/web.ts +56 -1
  338. package/src/commands/work.ts +50 -35
  339. package/src/commands/workflow.ts +43 -34
  340. package/src/core/{harnesses → adapters}/attest-projection.ts +2 -2
  341. package/src/core/{harnesses → adapters}/attest.ts +27 -27
  342. package/src/core/{harnesses → adapters}/attestation.ts +41 -41
  343. package/src/core/{harnesses → adapters}/bench.ts +34 -43
  344. package/src/core/adapters/index.ts +56 -0
  345. package/src/core/{harnesses → adapters}/profiles.ts +16 -16
  346. package/src/core/{harnesses → adapters}/registry.ts +23 -23
  347. package/src/core/{harnesses → adapters}/types.ts +23 -23
  348. package/src/core/agents/canonical-emit.ts +6 -6
  349. package/src/core/agents/cli-emit.ts +1 -1
  350. package/src/core/agents/cli.ts +30 -28
  351. package/src/core/agents/codex-replay.ts +6 -6
  352. package/src/core/agents/coord-client.ts +119 -28
  353. package/src/core/agents/events/consume.ts +1 -1
  354. package/src/core/agents/events/emit.ts +7 -6
  355. package/src/core/agents/render/prompt-context.ts +107 -31
  356. package/src/core/agents/render/session-context.ts +6 -6
  357. package/src/core/agents/rules/claim-conflict.ts +4 -7
  358. package/src/core/agents/rules/commit-conflict.ts +103 -22
  359. package/src/core/agents/rules/stop-hook.ts +33 -17
  360. package/src/core/agents/rules/verdict.ts +13 -0
  361. package/src/core/agents/session-events.ts +4 -4
  362. package/src/core/agents/state/council.ts +1 -1
  363. package/src/core/agents/state/heartbeat-projector.ts +16 -12
  364. package/src/core/agents/state/heartbeat-writer.ts +12 -12
  365. package/src/core/agents/state/{scratch.ts → journal.ts} +12 -12
  366. package/src/core/agents/state/pidmap.ts +130 -15
  367. package/src/core/agents/state/proc-start.ts +208 -0
  368. package/src/core/agents/state/shell-mutation.ts +1 -1
  369. package/src/core/agents/state/stale-sweep.ts +7 -7
  370. package/src/core/artifacts/index.ts +557 -0
  371. package/src/core/config.ts +30 -2
  372. package/src/core/context/index.ts +15 -15
  373. package/src/core/governor/adapter-spread.ts +82 -0
  374. package/src/core/governor/index.ts +91 -0
  375. package/src/core/governor/plan-api.ts +115 -0
  376. package/src/core/{supervisor → governor}/plan-read.ts +112 -97
  377. package/src/core/{supervisor → governor}/plan-types.ts +59 -56
  378. package/src/core/{supervisor → governor}/planning.ts +223 -192
  379. package/src/core/governor/read.ts +59 -0
  380. package/src/core/{supervisor → governor}/runner.ts +39 -39
  381. package/src/core/{supervisor → governor}/service-read.ts +22 -22
  382. package/src/core/{supervisor → governor}/service.ts +117 -119
  383. package/src/core/{supervisor → governor}/state.ts +325 -167
  384. package/src/core/hooks/adapter/detect.ts +30 -0
  385. package/src/core/hooks/{harness → adapter}/events.ts +16 -14
  386. package/src/core/hooks/{harness → adapter}/output.ts +31 -23
  387. package/src/core/hooks/{harness → adapter}/parse.ts +5 -5
  388. package/src/core/hooks/{harness → adapter}/wiring.ts +21 -21
  389. package/src/core/hooks/cli.ts +185 -162
  390. package/src/core/hooks/effects/image-capture.ts +6 -6
  391. package/src/core/hooks/effects/index.ts +17 -17
  392. package/src/core/hooks/events/emit.ts +3 -3
  393. package/src/core/hooks/events/rotate.ts +1 -1
  394. package/src/core/hooks/events/schema.ts +15 -7
  395. package/src/core/hooks/guard-path.ts +2 -2
  396. package/src/core/hooks/index.ts +1 -1
  397. package/src/core/hooks/resolve/anchor.ts +63 -8
  398. package/src/core/hooks/resolve/coord-root.ts +4 -4
  399. package/src/core/hooks/resolve/intent.ts +1 -1
  400. package/src/core/hooks/resolve/owner.ts +11 -5
  401. package/src/core/{scratch → journal}/index.ts +53 -53
  402. package/src/core/policy/evaluate.ts +8 -8
  403. package/src/core/policy/types.ts +3 -3
  404. package/src/core/work/state.ts +65 -23
  405. package/src/core/workflow/adapters.ts +33 -0
  406. package/src/core/workflow/approvals.ts +7 -7
  407. package/src/core/workflow/billing.ts +12 -12
  408. package/src/core/workflow/child-env.ts +13 -4
  409. package/src/core/workflow/engine.ts +155 -90
  410. package/src/core/workflow/evidence-preflight.ts +165 -0
  411. package/src/core/workflow/index.ts +3 -3
  412. package/src/core/workflow/proof.ts +60 -50
  413. package/src/core/workflow/run-state.ts +7 -7
  414. package/src/core/workflow/sandbox-projection.ts +16 -16
  415. package/src/core/workflow/spawn-claude.ts +13 -10
  416. package/src/core/workflow/spawn-codex.ts +13 -10
  417. package/src/core/workflow/spawn-cursor.ts +13 -10
  418. package/src/core/workflow/spawn-failure.ts +1 -1
  419. package/src/core/workflow/specialists.ts +2 -2
  420. package/src/core/workflow/{journal.ts → transcript.ts} +16 -16
  421. package/src/core/workflow/types.ts +108 -51
  422. package/src/core/workflow/validate.ts +1 -1
  423. package/src/core/workflow/workspaces/cancellation.ts +2 -2
  424. package/src/core/workflow/workspaces/cleanup.ts +2 -2
  425. package/src/core/workflow/workspaces/execution.ts +6 -6
  426. package/src/core/workflow/workspaces/inspect.ts +14 -11
  427. package/src/core/workflow/workspaces/integration.ts +18 -14
  428. package/src/core/workflow/workspaces/lifecycle.ts +10 -10
  429. package/src/core/workflow/workspaces/local-git.ts +47 -5
  430. package/src/core/workflow/workspaces/recovery.ts +3 -3
  431. package/src/core/workflow/workspaces/state.ts +4 -3
  432. package/src/core/workflow/workspaces/types.ts +1 -1
  433. package/src/lib/browser/asserts.ts +177 -0
  434. package/src/lib/browser/client.ts +189 -14
  435. package/src/lib/browser/content-checks.ts +571 -0
  436. package/src/lib/browser/critique.ts +231 -0
  437. package/src/lib/browser/geometry.ts +297 -1
  438. package/src/lib/browser/index.ts +34 -0
  439. package/src/lib/claude-desktop.ts +4 -1
  440. package/src/lib/council/index.ts +9 -9
  441. package/src/lib/identities/assume.ts +7 -7
  442. package/src/lib/instructions/apply.ts +87 -25
  443. package/src/lib/instructions/host-addendum.ts +126 -0
  444. package/src/lib/instructions/templates.ts +44 -15
  445. package/src/lib/machine.ts +2 -2
  446. package/dist/commands/harness.d.ts +0 -12
  447. package/dist/commands/harness.d.ts.map +0 -1
  448. package/dist/commands/scratch.d.ts +0 -4
  449. package/dist/commands/scratch.d.ts.map +0 -1
  450. package/dist/commands/session.d.ts.map +0 -1
  451. package/dist/commands/session.js +0 -162
  452. package/dist/commands/supervisor.d.ts +0 -4
  453. package/dist/commands/supervisor.d.ts.map +0 -1
  454. package/dist/core/harnesses/attest-projection.d.ts.map +0 -1
  455. package/dist/core/harnesses/attest.d.ts.map +0 -1
  456. package/dist/core/harnesses/attestation.d.ts.map +0 -1
  457. package/dist/core/harnesses/bench.d.ts.map +0 -1
  458. package/dist/core/harnesses/index.d.ts +0 -13
  459. package/dist/core/harnesses/index.d.ts.map +0 -1
  460. package/dist/core/harnesses/index.js +0 -6
  461. package/dist/core/harnesses/profiles.d.ts.map +0 -1
  462. package/dist/core/harnesses/registry.d.ts +0 -15
  463. package/dist/core/harnesses/registry.d.ts.map +0 -1
  464. package/dist/core/harnesses/types.d.ts.map +0 -1
  465. package/dist/core/hooks/harness/detect.d.ts +0 -9
  466. package/dist/core/hooks/harness/events.d.ts.map +0 -1
  467. package/dist/core/hooks/harness/output.d.ts.map +0 -1
  468. package/dist/core/supervisor/index.d.ts +0 -7
  469. package/dist/core/supervisor/index.d.ts.map +0 -1
  470. package/dist/core/supervisor/index.js +0 -6
  471. package/dist/core/supervisor/plan-api.d.ts +0 -23
  472. package/dist/core/supervisor/plan-api.d.ts.map +0 -1
  473. package/dist/core/supervisor/plan-api.js +0 -50
  474. package/dist/core/supervisor/plan-read.d.ts +0 -5
  475. package/dist/core/supervisor/plan-read.d.ts.map +0 -1
  476. package/dist/core/supervisor/plan-types.d.ts.map +0 -1
  477. package/dist/core/supervisor/planning.d.ts +0 -33
  478. package/dist/core/supervisor/planning.d.ts.map +0 -1
  479. package/dist/core/supervisor/read.d.ts +0 -6
  480. package/dist/core/supervisor/read.d.ts.map +0 -1
  481. package/dist/core/supervisor/read.js +0 -4
  482. package/dist/core/supervisor/runner.d.ts +0 -37
  483. package/dist/core/supervisor/runner.d.ts.map +0 -1
  484. package/dist/core/supervisor/service-read.d.ts +0 -6
  485. package/dist/core/supervisor/service-read.d.ts.map +0 -1
  486. package/dist/core/supervisor/service.d.ts +0 -114
  487. package/dist/core/supervisor/service.d.ts.map +0 -1
  488. package/dist/core/supervisor/state.d.ts +0 -95
  489. package/dist/core/supervisor/state.d.ts.map +0 -1
  490. package/dist/core/workflow/harnesses.d.ts +0 -17
  491. package/dist/core/workflow/harnesses.d.ts.map +0 -1
  492. package/dist/core/workflow/harnesses.js +0 -21
  493. package/dist/core/workflow/journal.d.ts.map +0 -1
  494. package/src/commands/session.ts +0 -187
  495. package/src/core/harnesses/index.ts +0 -56
  496. package/src/core/hooks/harness/detect.ts +0 -30
  497. package/src/core/supervisor/index.ts +0 -89
  498. package/src/core/supervisor/plan-api.ts +0 -73
  499. package/src/core/supervisor/read.ts +0 -59
  500. package/src/core/workflow/harnesses.ts +0 -33
  501. /package/dist/core/{harnesses → adapters}/attest-projection.js +0 -0
@@ -2,12 +2,12 @@ import { existsSync } from "node:fs";
2
2
  import { join, resolve } from "node:path";
3
3
  import type { Command } from "commander";
4
4
  import type { EmitContext } from "../commander.ts";
5
- import { resolveBinName, workflowSubscriptionOnly } from "../core/config.ts";
6
5
  import {
7
- createBuiltinHarnessRegistry,
8
- harnessProofInputs,
6
+ adapterProofInputs,
7
+ createBuiltinAdapterRegistry,
9
8
  probeBinaryVersion,
10
- } from "../core/harnesses/index.ts";
9
+ } from "../core/adapters/index.ts";
10
+ import { resolveBinName, workflowSubscriptionOnly } from "../core/config.ts";
11
11
  import { findCoordRoot } from "../core/hooks/resolve/coord-root.ts";
12
12
  import type { PolicyIsolation } from "../core/policy/index.ts";
13
13
  import { loadPolicyFile } from "../core/policy/index.ts";
@@ -17,7 +17,7 @@ import type { WorkspaceProvider } from "../core/workflow/index.ts";
17
17
 
18
18
  /**
19
19
  * `workflow run <script>`: execute a workflow script — bounded, schema-gated,
20
- * conditionally-routed stages fanning out to headless harness-CLI subagents.
20
+ * conditionally-routed stages fanning out to headless adapter-CLI subagents.
21
21
  * The script (deterministic code), not a model, decides routing between
22
22
  * stages, and the run terminates when the script returns.
23
23
  *
@@ -29,7 +29,7 @@ interface WorkflowRunOpts {
29
29
  maxAgents?: string;
30
30
  concurrency?: string;
31
31
  cwd?: string;
32
- harness?: string;
32
+ adapter?: string;
33
33
  resumeFrom?: string;
34
34
  subscriptionOnly?: boolean;
35
35
  allowApiBilling?: boolean;
@@ -75,33 +75,42 @@ interface WorkflowReclaimOpts extends WorkflowConfirmedMutationOpts {
75
75
  }
76
76
 
77
77
  export function registerWorkflowCommand(program: Command, emit: EmitContext): void {
78
- const registry = createBuiltinHarnessRegistry();
79
- const harnesses = registry.ids();
78
+ const registry = createBuiltinAdapterRegistry();
79
+ const adapters = registry.ids();
80
80
  const workflow = program
81
- .command("workflow")
82
- .description("Run bounded, schema-gated multi-subagent workflow scripts.");
81
+ .command("run")
82
+ .description(
83
+ "Execute one bounded, schema-gated multi-subagent script. Subagents spawn as headless " +
84
+ "adapter-CLI subprocesses, born coordination-registered.",
85
+ )
86
+ // An option has to bind to whichever command name precedes it, so that a
87
+ // subcommand's own --policy / --json reach the subcommand and not `run`.
88
+ .enablePositionalOptions();
83
89
 
90
+ // Executing a script is `run`'s default, so `harn run ./wf.js` works with no
91
+ // second verb. It has to be a real (hidden) subcommand rather than an action
92
+ // on `run` itself: `run` and several of its subcommands declare the same
93
+ // option names, and a parent-level declaration swallows the child's copy.
84
94
  workflow
85
- .command("run <script>")
95
+ .command("script <script>", { isDefault: true, hidden: true })
86
96
  .description(
87
- "Execute a workflow script (plain JS: `export default async ({agent, parallel, stage, log, evidence, authorize}) => …`). " +
88
- "Subagents spawn as headless harness-CLI subprocesses, coordination-registered.",
97
+ "Workflow script (plain JS: `export default async ({agent, parallel, stage, log, evidence, authorize}) => …`)",
89
98
  )
90
99
  .option("--max-agents <n>", "Total-agent ceiling for the run (default 50)")
91
100
  .option("--concurrency <n>", "Concurrent-subagent cap (default 4)")
92
101
  .option("--cwd <dir>", "Working directory children spawn in (default: coord root)")
93
102
  .option(
94
- "--harness <name>",
95
- `Default harness for agent() calls: ${harnesses.join(" | ")} (default claude-code); scripts can override per agent via opts.harness`,
103
+ "--adapter <name>",
104
+ `Default adapter for agent() calls: ${adapters.join(" | ")} (default claude-code); scripts can override per agent via opts.adapter`,
96
105
  )
97
106
  .option(
98
107
  "--resume-from <run-id>",
99
- "Reuse completed agent results from a prior run's journal; only changed/failed calls re-run",
108
+ "Reuse completed agent results from a prior run's transcript; only changed/failed calls re-run",
100
109
  )
101
110
  .option(
102
111
  "--subscription-only",
103
112
  "Guarantee subscription billing: scrub API-key vars from child envs; fail loud when a " +
104
- "harness has no stored login (repo default via config.jsonc workflow.subscriptionOnly)",
113
+ "adapter has no stored login (repo default via config.jsonc workflow.subscriptionOnly)",
105
114
  )
106
115
  .option(
107
116
  "--allow-api-billing",
@@ -131,10 +140,10 @@ export function registerWorkflowCommand(program: Command, emit: EmitContext): vo
131
140
  });
132
141
  process.exit(1);
133
142
  }
134
- if (opts.harness && !registry.get(opts.harness)) {
143
+ if (opts.adapter && !registry.get(opts.adapter)) {
135
144
  emit.error({
136
- code: "bad_harness",
137
- message: `unknown harness "${opts.harness}" (expected: ${harnesses.join(" | ")})`,
145
+ code: "bad_adapter",
146
+ message: `unknown adapter "${opts.adapter}" (expected: ${adapters.join(" | ")})`,
138
147
  });
139
148
  process.exit(1);
140
149
  }
@@ -179,14 +188,14 @@ export function registerWorkflowCommand(program: Command, emit: EmitContext): vo
179
188
  const report = await runWorkflow(script, {
180
189
  coordRoot,
181
190
  spawners: registry.spawners(),
182
- defaultHarness: opts.harness,
191
+ defaultAdapter: opts.adapter,
183
192
  resumeFrom: opts.resumeFrom,
184
193
  subscriptionOnly,
185
194
  allowApiBilling: opts.allowApiBilling,
186
195
  maxAgents: opts.maxAgents ? Number.parseInt(opts.maxAgents, 10) : undefined,
187
196
  concurrency: opts.concurrency ? Number.parseInt(opts.concurrency, 10) : undefined,
188
197
  cwd: opts.cwd,
189
- ...harnessProofInputs(
198
+ ...adapterProofInputs(
190
199
  registry.list().map((adapter) => adapter.profile),
191
200
  { versionProbe: probeBinaryVersion },
192
201
  ),
@@ -195,7 +204,7 @@ export function registerWorkflowCommand(program: Command, emit: EmitContext): vo
195
204
  approvalAddressee: opts.approvalTo,
196
205
  isolation: opts.isolation,
197
206
  workspace,
198
- // CLI harness subprocesses inherit the host network. A policy that
207
+ // CLI adapter subprocesses inherit the host network. A policy that
199
208
  // forbids network must therefore deny dispatch unless a future host
200
209
  // adapter creates and declares a network-disabled boundary.
201
210
  networkAccess: "enabled",
@@ -207,14 +216,14 @@ export function registerWorkflowCommand(program: Command, emit: EmitContext): vo
207
216
  }
208
217
  const cachedPart = report.agentsCached > 0 ? ` (+${report.agentsCached} cached)` : "";
209
218
  const billingPart = report.billing.length
210
- ? `billing: ${report.billing.map((b) => `${b.harness}=${b.mode}`).join(", ")}\n`
219
+ ? `billing: ${report.billing.map((b) => `${b.adapter}=${b.mode}`).join(", ")}\n`
211
220
  : "";
212
221
  emit.text(
213
222
  `run ${report.runId} (${report.name}) finished: ${report.agentsSpawned} agent(s)${cachedPart}, ` +
214
223
  `$${report.costUsd.toFixed(4)}, ${Math.round(report.durationMs / 1000)}s\n${billingPart}` +
215
224
  `acceptance: ${report.acceptance.satisfied} satisfied, ${report.acceptance.unsatisfied} unsatisfied, ` +
216
225
  `${report.acceptance.unknown} unknown\n` +
217
- `journal: ${report.journalPath}\n` +
226
+ `transcript: ${report.transcriptPath}\n` +
218
227
  `proof: ${report.proofPath}\n` +
219
228
  `result: ${typeof report.result === "string" ? report.result : JSON.stringify(report.result, null, 2)}\n`,
220
229
  );
@@ -226,12 +235,12 @@ export function registerWorkflowCommand(program: Command, emit: EmitContext): vo
226
235
  status: "parked",
227
236
  runId: err.runId,
228
237
  approvalId: err.approvalId,
229
- journalPath: err.journalPath,
238
+ transcriptPath: err.transcriptPath,
230
239
  });
231
240
  } else {
232
241
  emit.text(
233
242
  `run ${err.runId} parked\napproval: ${err.approvalId}\n` +
234
- `journal: ${err.journalPath}\n` +
243
+ `transcript: ${err.transcriptPath}\n` +
235
244
  `resume after resolution: ${resolveBinName()} workflow resume ${err.runId}\n`,
236
245
  );
237
246
  }
@@ -282,7 +291,7 @@ export function registerWorkflowCommand(program: Command, emit: EmitContext): vo
282
291
  writableRoots: [binding.writable_root.configured],
283
292
  }
284
293
  : undefined,
285
- ...harnessProofInputs(
294
+ ...adapterProofInputs(
286
295
  registry.list().map((adapter) => adapter.profile),
287
296
  { versionProbe: probeBinaryVersion },
288
297
  ),
@@ -298,7 +307,7 @@ export function registerWorkflowCommand(program: Command, emit: EmitContext): vo
298
307
  `$${report.costUsd.toFixed(4)}, ${Math.round(report.durationMs / 1000)}s\n` +
299
308
  `acceptance: ${report.acceptance.satisfied} satisfied, ${report.acceptance.unsatisfied} unsatisfied, ` +
300
309
  `${report.acceptance.unknown} unknown\n` +
301
- `journal: ${report.journalPath}\nproof: ${report.proofPath}\n` +
310
+ `transcript: ${report.transcriptPath}\nproof: ${report.proofPath}\n` +
302
311
  `result: ${typeof report.result === "string" ? report.result : JSON.stringify(report.result, null, 2)}\n`,
303
312
  );
304
313
  } catch (err) {
@@ -309,12 +318,12 @@ export function registerWorkflowCommand(program: Command, emit: EmitContext): vo
309
318
  status: "parked",
310
319
  runId: err.runId,
311
320
  approvalId: err.approvalId,
312
- journalPath: err.journalPath,
321
+ transcriptPath: err.transcriptPath,
313
322
  });
314
323
  } else {
315
324
  emit.text(
316
325
  `run ${err.runId} parked again\napproval: ${err.approvalId}\n` +
317
- `journal: ${err.journalPath}\n`,
326
+ `transcript: ${err.transcriptPath}\n`,
318
327
  );
319
328
  }
320
329
  return;
@@ -668,9 +677,9 @@ export function registerWorkflowCommand(program: Command, emit: EmitContext): vo
668
677
  }
669
678
  });
670
679
 
671
- const approvals = workflow
672
- .command("approvals")
673
- .description("Inspect and resolve durable workflow policy approvals.");
680
+ const approvals = program
681
+ .command("approval")
682
+ .description("Inspect and resolve durable run-policy approvals.");
674
683
 
675
684
  approvals
676
685
  .command("list")
@@ -21,7 +21,7 @@ import { existsSync, mkdtempSync, rmSync } from "node:fs";
21
21
  import { tmpdir } from "node:os";
22
22
  import { join } from "node:path";
23
23
  import type { SpawnRequest, SpawnResult } from "../workflow/types.ts";
24
- import type { HarnessAdapter } from "./types.ts";
24
+ import type { Adapter } from "./types.ts";
25
25
 
26
26
  /** Distinct names so a control artifact can never be mistaken for a treatment
27
27
  * one, even if a child writes both or the directory is reused. */
@@ -61,7 +61,7 @@ export interface ProjectionProbeOptions {
61
61
  * failing the whole attestation sweep.
62
62
  */
63
63
  export async function probeFilesystemProjection(
64
- adapter: HarnessAdapter,
64
+ adapter: Adapter,
65
65
  opts: ProjectionProbeOptions,
66
66
  ): Promise<ProjectionProbeResult> {
67
67
  if (!adapter.profile.sandboxProjection) {
@@ -1,14 +1,14 @@
1
1
  /**
2
2
  * The opt-in live probe that produces an attestation (ADR 0038).
3
3
  *
4
- * One bounded turn per harness, through the same `spawn` the workflow engine
4
+ * One bounded turn per adapter, through the same `spawn` the workflow engine
5
5
  * uses, so what gets attested is the path production takes rather than a
6
6
  * parallel test rig.
7
7
  */
8
8
 
9
9
  import type { SpawnResult } from "../workflow/types.ts";
10
10
  import { probeFilesystemProjection } from "./attest-projection.ts";
11
- import type { AttestableDimension, HarnessAttestation } from "./attestation.ts";
11
+ import type { AdapterAttestation, AttestableDimension } from "./attestation.ts";
12
12
  import {
13
13
  ATTESTATION_SCHEMA_VERSION,
14
14
  profileDigest,
@@ -16,8 +16,8 @@ import {
16
16
  writeAttestation,
17
17
  } from "./attestation.ts";
18
18
  import { probeBinaryVersion } from "./bench.ts";
19
- import type { HarnessRegistry } from "./registry.ts";
20
- import type { CapabilitySupport, HarnessId } from "./types.ts";
19
+ import type { AdapterRegistry } from "./registry.ts";
20
+ import type { AdapterId, CapabilitySupport } from "./types.ts";
21
21
 
22
22
  /** Fixed and content-free, so nothing user-supplied can reach the record and
23
23
  * the turn stays as cheap as a turn can be. */
@@ -46,8 +46,8 @@ function boundedReason(reason: string | undefined): string {
46
46
 
47
47
  export type AttestationOutcome = "recorded" | "skipped" | "unreachable" | "failed";
48
48
 
49
- export interface HarnessAttestationResult {
50
- harness: HarnessId;
49
+ export interface AdapterAttestationResult {
50
+ adapter: AdapterId;
51
51
  outcome: AttestationOutcome;
52
52
  binaryVersion?: string;
53
53
  observations?: Partial<Record<AttestableDimension, CapabilitySupport>>;
@@ -55,18 +55,18 @@ export interface HarnessAttestationResult {
55
55
  note: string;
56
56
  }
57
57
 
58
- export interface HarnessAttestationReport {
58
+ export interface AdapterAttestationReport {
59
59
  generatedAt: string;
60
- harnesses: HarnessId[];
61
- results: HarnessAttestationResult[];
60
+ adapters: AdapterId[];
61
+ results: AdapterAttestationResult[];
62
62
  recorded: number;
63
- /** True when at least one selected harness could not be attested, so a
63
+ /** True when at least one selected adapter could not be attested, so a
64
64
  * caller can tell a partial sweep from a complete one. */
65
65
  incomplete: boolean;
66
66
  }
67
67
 
68
- export interface RunHarnessAttestationOptions {
69
- harnesses?: readonly string[];
68
+ export interface RunAdapterAttestationOptions {
69
+ adapters?: readonly string[];
70
70
  timeoutMs?: number;
71
71
  cwd?: string;
72
72
  coordRoot?: string;
@@ -78,12 +78,12 @@ export interface RunHarnessAttestationOptions {
78
78
  /** Test seam and alternate host probe. A null version means unavailable. */
79
79
  versionProbe?: (binary: string) => string | null;
80
80
  /** Test seam. Defaults to the adapter's production spawner. */
81
- spawn?: (harness: HarnessId, prompt: string, timeoutMs: number) => Promise<SpawnResult>;
81
+ spawn?: (adapter: AdapterId, prompt: string, timeoutMs: number) => Promise<SpawnResult>;
82
82
  /** Test seam. Defaults to writing under the coord root. */
83
- persist?: (record: HarnessAttestation) => void;
83
+ persist?: (record: AdapterAttestation) => void;
84
84
  /**
85
85
  * Also probe `filesystemPolicyProjection` (ADR 0041). Off by default because
86
- * it costs two extra turns per capable harness, against one for everything
86
+ * it costs two extra turns per capable adapter, against one for everything
87
87
  * else: the observation needs a control run to be readable at all.
88
88
  */
89
89
  projection?: boolean;
@@ -92,24 +92,24 @@ export interface RunHarnessAttestationOptions {
92
92
  now?: () => Date;
93
93
  }
94
94
 
95
- export async function runHarnessAttestation(
96
- registry: HarnessRegistry,
97
- opts: RunHarnessAttestationOptions = {},
98
- ): Promise<HarnessAttestationReport> {
99
- const ids = opts.harnesses?.length ? [...opts.harnesses] : registry.ids();
95
+ export async function runAdapterAttestation(
96
+ registry: AdapterRegistry,
97
+ opts: RunAdapterAttestationOptions = {},
98
+ ): Promise<AdapterAttestationReport> {
99
+ const ids = opts.adapters?.length ? [...opts.adapters] : registry.ids();
100
100
  const timeoutMs = opts.timeoutMs ?? DEFAULT_ATTESTATION_TIMEOUT_MS;
101
101
  const cwd = opts.cwd ?? process.cwd();
102
102
  const subscriptionOnly = opts.subscriptionOnly === true;
103
103
  const versionProbe = opts.versionProbe ?? probeBinaryVersion;
104
104
  const now = opts.now ?? (() => new Date());
105
- const results: HarnessAttestationResult[] = [];
105
+ const results: AdapterAttestationResult[] = [];
106
106
 
107
107
  for (const id of ids) {
108
108
  const adapter = registry.require(id);
109
109
  const binaryVersion = versionProbe(adapter.profile.binary);
110
110
  if (!binaryVersion) {
111
111
  results.push({
112
- harness: id,
112
+ adapter: id,
113
113
  outcome: "skipped",
114
114
  note: `${adapter.profile.binary} not found on PATH`,
115
115
  });
@@ -129,7 +129,7 @@ export async function runHarnessAttestation(
129
129
  });
130
130
  } catch (error) {
131
131
  results.push({
132
- harness: id,
132
+ adapter: id,
133
133
  outcome: "failed",
134
134
  binaryVersion,
135
135
  note: `probe threw: ${boundedReason((error as Error).message)}`,
@@ -141,7 +141,7 @@ export async function runHarnessAttestation(
141
141
  // failed turn records nothing at all rather than a page of `unsupported`.
142
142
  if (!result.ok) {
143
143
  results.push({
144
- harness: id,
144
+ adapter: id,
145
145
  outcome: "unreachable",
146
146
  binaryVersion,
147
147
  durationMs: result.durationMs,
@@ -172,7 +172,7 @@ export async function runHarnessAttestation(
172
172
 
173
173
  const record = sealAttestation({
174
174
  schema_version: ATTESTATION_SCHEMA_VERSION,
175
- harness: id,
175
+ adapter: id,
176
176
  binary_version: binaryVersion,
177
177
  profile_digest: profileDigest(adapter.profile),
178
178
  subscription_only: subscriptionOnly,
@@ -184,7 +184,7 @@ export async function runHarnessAttestation(
184
184
  else writeAttestation(record, { coordRoot: opts.coordRoot });
185
185
 
186
186
  results.push({
187
- harness: id,
187
+ adapter: id,
188
188
  outcome: "recorded",
189
189
  binaryVersion,
190
190
  observations,
@@ -195,7 +195,7 @@ export async function runHarnessAttestation(
195
195
 
196
196
  return {
197
197
  generatedAt: now().toISOString(),
198
- harnesses: ids,
198
+ adapters: ids,
199
199
  results,
200
200
  recorded: results.filter((row) => row.outcome === "recorded").length,
201
201
  incomplete: results.some((row) => row.outcome !== "recorded"),
@@ -23,7 +23,7 @@ import {
23
23
  import { resolve } from "node:path";
24
24
  import { monorepoRoot } from "../agents/coord-client.ts";
25
25
  import { stableDigest } from "../workflow/durable-record.ts";
26
- import type { CapabilitySupport, HarnessId, HarnessProfile } from "./types.ts";
26
+ import type { AdapterId, AdapterProfile, CapabilitySupport } from "./types.ts";
27
27
 
28
28
  export const ATTESTATION_SCHEMA_VERSION = 2;
29
29
 
@@ -40,9 +40,9 @@ export const ATTESTABLE_DIMENSIONS = [
40
40
 
41
41
  export type AttestableDimension = (typeof ATTESTABLE_DIMENSIONS)[number];
42
42
 
43
- export interface HarnessAttestation {
43
+ export interface AdapterAttestation {
44
44
  schema_version: number;
45
- harness: HarnessId;
45
+ adapter: AdapterId;
46
46
  /** What the vendor binary reported when this was recorded. Staleness is
47
47
  * keyed on this, so a vendor upgrade invalidates the record automatically. */
48
48
  binary_version: string;
@@ -69,12 +69,12 @@ export interface AttestationStoreOptions {
69
69
  export function attestationsDir(opts: AttestationStoreOptions = {}): string {
70
70
  const root = opts.coordRoot ?? monorepoRoot();
71
71
  if (!root) throw new Error("Not in a coord-aware repo (coord root resolved to null).");
72
- return resolve(root, ".harnery", "harnesses", "attestations");
72
+ return resolve(root, ".harnery", "adapters", "attestations");
73
73
  }
74
74
 
75
75
  /** Stable identity of a declaration, so editing a claim invalidates the
76
76
  * attestation that was recorded against the old one. */
77
- export function profileDigest(profile: HarnessProfile): string {
77
+ export function profileDigest(profile: AdapterProfile): string {
78
78
  return stableDigest({
79
79
  id: profile.id,
80
80
  binary: profile.binary,
@@ -82,31 +82,31 @@ export function profileDigest(profile: HarnessProfile): string {
82
82
  });
83
83
  }
84
84
 
85
- function digestOf(record: Omit<HarnessAttestation, "record_digest">): string {
85
+ function digestOf(record: Omit<AdapterAttestation, "record_digest">): string {
86
86
  return stableDigest(record);
87
87
  }
88
88
 
89
89
  export function sealAttestation(
90
- record: Omit<HarnessAttestation, "record_digest">,
91
- ): HarnessAttestation {
90
+ record: Omit<AdapterAttestation, "record_digest">,
91
+ ): AdapterAttestation {
92
92
  return { ...record, record_digest: digestOf(record) };
93
93
  }
94
94
 
95
- function attestationPath(harness: HarnessId, opts: AttestationStoreOptions): string {
96
- if (!/^[a-z0-9][a-z0-9._-]*$/i.test(harness)) {
97
- throw new Error(`unsafe harness id for an attestation path: ${harness}`);
95
+ function attestationPath(adapter: AdapterId, opts: AttestationStoreOptions): string {
96
+ if (!/^[a-z0-9][a-z0-9._-]*$/i.test(adapter)) {
97
+ throw new Error(`unsafe adapter id for an attestation path: ${adapter}`);
98
98
  }
99
- return resolve(attestationsDir(opts), `${harness}.json`);
99
+ return resolve(attestationsDir(opts), `${adapter}.json`);
100
100
  }
101
101
 
102
102
  /** Replace-in-place write. Unlike a workflow record an attestation is meant to
103
103
  * be re-recorded, so this is a mutable atomic swap rather than an immutable
104
104
  * create. */
105
105
  export function writeAttestation(
106
- record: HarnessAttestation,
106
+ record: AdapterAttestation,
107
107
  opts: AttestationStoreOptions = {},
108
108
  ): string {
109
- const path = attestationPath(record.harness, opts);
109
+ const path = attestationPath(record.adapter, opts);
110
110
  mkdirSync(attestationsDir(opts), { recursive: true, mode: 0o700 });
111
111
  const temporary = `${path}.tmp-${process.pid}`;
112
112
  try {
@@ -130,12 +130,12 @@ export function writeAttestation(
130
130
  * A record that fails its own digest is discarded rather than trusted, because
131
131
  * the whole point of the file is that it was not hand-written. */
132
132
  export function readAttestation(
133
- harness: HarnessId,
133
+ adapter: AdapterId,
134
134
  opts: AttestationStoreOptions = {},
135
- ): HarnessAttestation | null {
135
+ ): AdapterAttestation | null {
136
136
  let raw: string;
137
137
  try {
138
- raw = readFileSync(attestationPath(harness, opts), "utf8");
138
+ raw = readFileSync(attestationPath(adapter, opts), "utf8");
139
139
  } catch {
140
140
  return null;
141
141
  }
@@ -145,17 +145,17 @@ export function readAttestation(
145
145
  } catch {
146
146
  return null;
147
147
  }
148
- return validateAttestation(parsed, harness);
148
+ return validateAttestation(parsed, adapter);
149
149
  }
150
150
 
151
151
  export function validateAttestation(
152
152
  value: unknown,
153
- harness?: HarnessId,
154
- ): HarnessAttestation | null {
153
+ adapter?: AdapterId,
154
+ ): AdapterAttestation | null {
155
155
  if (!value || typeof value !== "object") return null;
156
- const record = value as HarnessAttestation;
156
+ const record = value as AdapterAttestation;
157
157
  if (record.schema_version !== ATTESTATION_SCHEMA_VERSION) return null;
158
- if (typeof record.harness !== "string" || (harness && record.harness !== harness)) return null;
158
+ if (typeof record.adapter !== "string" || (adapter && record.adapter !== adapter)) return null;
159
159
  if (typeof record.binary_version !== "string" || typeof record.profile_digest !== "string") {
160
160
  return null;
161
161
  }
@@ -171,39 +171,39 @@ export function validateAttestation(
171
171
  /** An attestation speaks only for the vendor version and declaration it was
172
172
  * recorded against. */
173
173
  export function isAttestationCurrent(
174
- record: HarnessAttestation | null,
174
+ record: AdapterAttestation | null,
175
175
  binaryVersion: string | null,
176
- profile: HarnessProfile,
176
+ profile: AdapterProfile,
177
177
  subscriptionOnly?: boolean,
178
- ): record is HarnessAttestation {
178
+ ): record is AdapterAttestation {
179
179
  if (!record || !binaryVersion) return false;
180
180
  if (record.binary_version !== binaryVersion) return false;
181
181
  if (subscriptionOnly !== undefined && record.subscription_only !== subscriptionOnly) return false;
182
182
  return record.profile_digest === profileDigest(profile);
183
183
  }
184
184
 
185
- export function listAttestations(opts: AttestationStoreOptions = {}): HarnessAttestation[] {
185
+ export function listAttestations(opts: AttestationStoreOptions = {}): AdapterAttestation[] {
186
186
  let names: string[];
187
187
  try {
188
188
  names = readdirSync(attestationsDir(opts));
189
189
  } catch {
190
190
  return [];
191
191
  }
192
- const records: HarnessAttestation[] = [];
192
+ const records: AdapterAttestation[] = [];
193
193
  for (const name of names) {
194
194
  if (!name.endsWith(".json")) continue;
195
195
  const record = readAttestation(name.slice(0, -".json".length), opts);
196
196
  if (record) records.push(record);
197
197
  }
198
- return records.sort((a, b) => a.harness.localeCompare(b.harness));
198
+ return records.sort((a, b) => a.adapter.localeCompare(b.adapter));
199
199
  }
200
200
 
201
- /** Both harness-derived proof inputs, read once, for a workflow run
201
+ /** Both adapter-derived proof inputs, read once, for a workflow run
202
202
  * (ADR 0038). Callers inject the result so the engine performs no capability
203
- * lookups of its own. A harness with no current attestation simply has no
203
+ * lookups of its own. A adapter with no current attestation simply has no
204
204
  * citation; that absence is not a proof unknown. */
205
- export function harnessProofInputs(
206
- profiles: readonly HarnessProfile[],
205
+ export function adapterProofInputs(
206
+ profiles: readonly AdapterProfile[],
207
207
  opts: AttestationStoreOptions & {
208
208
  versionProbe: (binary: string) => string | null;
209
209
  /** Billing policy this run will use, so a record made under the other mode
@@ -211,24 +211,24 @@ export function harnessProofInputs(
211
211
  subscriptionOnly?: boolean;
212
212
  },
213
213
  ): {
214
- harnessEvidence: Record<string, { toolEvidence: HarnessProfile["capabilities"]["toolEvidence"] }>;
215
- harnessAttestations: Record<
214
+ adapterEvidence: Record<string, { toolEvidence: AdapterProfile["capabilities"]["toolEvidence"] }>;
215
+ adapterAttestations: Record<
216
216
  string,
217
217
  { binary_version: string; observed_at: string; record_digest: string }
218
218
  >;
219
219
  } {
220
- const harnessEvidence: Record<
220
+ const adapterEvidence: Record<
221
221
  string,
222
- { toolEvidence: HarnessProfile["capabilities"]["toolEvidence"] }
222
+ { toolEvidence: AdapterProfile["capabilities"]["toolEvidence"] }
223
223
  > = {};
224
- const harnessAttestations: Record<
224
+ const adapterAttestations: Record<
225
225
  string,
226
226
  { binary_version: string; observed_at: string; record_digest: string }
227
227
  > = {};
228
228
 
229
229
  for (const profile of profiles) {
230
- harnessEvidence[profile.id] = { toolEvidence: profile.capabilities.toolEvidence };
231
- let record: HarnessAttestation | null = null;
230
+ adapterEvidence[profile.id] = { toolEvidence: profile.capabilities.toolEvidence };
231
+ let record: AdapterAttestation | null = null;
232
232
  try {
233
233
  record = readAttestation(profile.id, opts);
234
234
  } catch {
@@ -245,11 +245,11 @@ export function harnessProofInputs(
245
245
  ) {
246
246
  continue;
247
247
  }
248
- harnessAttestations[profile.id] = {
248
+ adapterAttestations[profile.id] = {
249
249
  binary_version: record.binary_version,
250
250
  observed_at: record.observed_at,
251
251
  record_digest: record.record_digest,
252
252
  };
253
253
  }
254
- return { harnessEvidence, harnessAttestations };
254
+ return { adapterEvidence, adapterAttestations };
255
255
  }