humanish 0.107.0 → 0.108.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 (521) hide show
  1. package/ARCHITECTURE.md +22 -17
  2. package/CHANGELOG.md +14 -0
  3. package/CONTEXT.md +51 -44
  4. package/README.md +145 -172
  5. package/SECURITY.md +16 -26
  6. package/TELEMETRY.md +8 -6
  7. package/dist/actors/affordance.d.ts +4 -4
  8. package/dist/actors/affordance.js +12 -12
  9. package/dist/actors/agent-session.d.ts +2 -2
  10. package/dist/actors/agent-session.js +7 -7
  11. package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
  12. package/dist/actors/codex/app-server-actor-trace.js +1 -1
  13. package/dist/actors/codex/app-server-ui.js +1 -1
  14. package/dist/actors/codex/codex-admission.d.ts +91 -0
  15. package/dist/actors/codex/codex-admission.js +150 -0
  16. package/dist/actors/codex/restricted-executable.d.ts +4 -4
  17. package/dist/actors/codex/restricted-executable.js +8 -8
  18. package/dist/actors/codex/restricted-launch.d.ts +2 -1
  19. package/dist/actors/codex/restricted-launch.js +1 -1
  20. package/dist/actors/codex/restricted-participant.js +8 -6
  21. package/dist/actors/codex/restricted-policy.d.ts +2 -2
  22. package/dist/actors/codex/restricted-policy.js +2 -2
  23. package/dist/actors/codex/restricted-session.d.ts +2 -2
  24. package/dist/actors/codex/restricted-session.js +10 -5
  25. package/dist/actors/computer-use/actor.d.ts +16 -16
  26. package/dist/actors/computer-use/actor.js +2 -2
  27. package/dist/actors/computer-use/admission-limit.d.ts +1 -1
  28. package/dist/actors/computer-use/admission-limit.js +1 -1
  29. package/dist/actors/computer-use/loop/actions.d.ts +3 -3
  30. package/dist/actors/computer-use/loop/actions.js +10 -10
  31. package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
  32. package/dist/actors/computer-use/loop/backstop.js +14 -12
  33. package/dist/actors/computer-use/loop/ending.d.ts +5 -5
  34. package/dist/actors/computer-use/loop/ending.js +7 -7
  35. package/dist/actors/computer-use/loop/observation.d.ts +2 -2
  36. package/dist/actors/computer-use/loop/observation.js +9 -9
  37. package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
  38. package/dist/actors/computer-use/loop/provider-call.js +1 -1
  39. package/dist/actors/computer-use/loop/session.js +3 -3
  40. package/dist/actors/computer-use/loop/spend.d.ts +1 -1
  41. package/dist/actors/computer-use/loop/spend.js +1 -1
  42. package/dist/actors/computer-use/loop/trace.js +9 -8
  43. package/dist/actors/computer-use/loop/types.d.ts +25 -23
  44. package/dist/actors/computer-use/loop/usage.js +2 -2
  45. package/dist/actors/computer-use/openai-context.d.ts +37 -0
  46. package/dist/actors/computer-use/openai-context.js +214 -0
  47. package/dist/actors/computer-use/openai-provider.d.ts +11 -8
  48. package/dist/actors/computer-use/openai-provider.js +45 -34
  49. package/dist/actors/computer-use/openai-requests.d.ts +36 -10
  50. package/dist/actors/computer-use/openai-requests.js +82 -15
  51. package/dist/actors/computer-use/openai-wire.d.ts +19 -7
  52. package/dist/actors/computer-use/openai-wire.js +36 -34
  53. package/dist/actors/contract.d.ts +78 -43
  54. package/dist/actors/contract.js +29 -23
  55. package/dist/actors/local-agent/claude-session.d.ts +1 -1
  56. package/dist/actors/local-agent/claude-session.js +10 -9
  57. package/dist/actors/local-agent/cli.d.ts +8 -6
  58. package/dist/actors/local-agent/cli.js +24 -28
  59. package/dist/actors/local-agent/readiness.d.ts +2 -2
  60. package/dist/actors/local-agent/readiness.js +4 -4
  61. package/dist/actors/reasoning-effort.js +6 -6
  62. package/dist/actors/registry.d.ts +10 -10
  63. package/dist/actors/registry.js +18 -17
  64. package/dist/actors/scripted-browser/actor.d.ts +8 -8
  65. package/dist/actors/scripted-browser/actor.js +16 -16
  66. package/dist/actors/scripted-browser/browser-command.js +1 -1
  67. package/dist/actors/scripted-browser/steps.js +1 -1
  68. package/dist/actors/scripted-browser/types.d.ts +1 -1
  69. package/dist/actors/stop-conditions.d.ts +1 -1
  70. package/dist/analysis/codex-config.d.ts +6 -2
  71. package/dist/analysis/codex-config.js +22 -14
  72. package/dist/analysis/service.js +5 -5
  73. package/dist/cli/commands/analyze.js +19 -16
  74. package/dist/cli/commands/codex.js +9 -9
  75. package/dist/cli/commands/comms.js +54 -33
  76. package/dist/cli/commands/feedback.js +20 -21
  77. package/dist/cli/commands/lab-format.d.ts +5 -4
  78. package/dist/cli/commands/lab-format.js +35 -23
  79. package/dist/cli/commands/lab-route-computer-use.js +6 -7
  80. package/dist/cli/commands/lab-route-preview.js +4 -3
  81. package/dist/cli/commands/lab-route-shared-world.js +3 -3
  82. package/dist/cli/commands/lab-run.js +10 -11
  83. package/dist/cli/commands/lab-scorer.d.ts +2 -2
  84. package/dist/cli/commands/lab-scorer.js +1 -1
  85. package/dist/cli/commands/migrate.d.ts +4 -0
  86. package/dist/cli/commands/migrate.js +65 -0
  87. package/dist/cli/commands/observe.js +147 -108
  88. package/dist/cli/commands/run-command.d.ts +10 -0
  89. package/dist/cli/commands/run-command.js +85 -0
  90. package/dist/cli/commands/runs.js +137 -138
  91. package/dist/cli/commands/setup.d.ts +2 -2
  92. package/dist/cli/commands/setup.js +26 -21
  93. package/dist/cli/commands/study.d.ts +3 -0
  94. package/dist/cli/commands/study.js +182 -0
  95. package/dist/cli/commands/tui.d.ts +4 -4
  96. package/dist/cli/commands/tui.js +21 -21
  97. package/dist/cli/commands/watch.js +60 -75
  98. package/dist/cli/deprecations.d.ts +18 -0
  99. package/dist/cli/deprecations.js +48 -0
  100. package/dist/cli/doctor.d.ts +15 -5
  101. package/dist/cli/doctor.js +103 -48
  102. package/dist/cli/first-run-path.d.ts +12 -10
  103. package/dist/cli/first-run-path.js +30 -28
  104. package/dist/cli/io.d.ts +41 -6
  105. package/dist/cli/io.js +97 -22
  106. package/dist/cli/observer-follow.d.ts +2 -2
  107. package/dist/cli/observer-follow.js +5 -6
  108. package/dist/cli/orientation.d.ts +6 -3
  109. package/dist/cli/orientation.js +43 -39
  110. package/dist/cli/product-sentence.d.ts +6 -0
  111. package/dist/cli/product-sentence.js +6 -0
  112. package/dist/cli/program.d.ts +6 -1
  113. package/dist/cli/program.js +109 -40
  114. package/dist/cli/telemetry.d.ts +15 -15
  115. package/dist/cli/telemetry.js +48 -40
  116. package/dist/cli.js +1 -1
  117. package/dist/comms/capture-surface.d.ts +13 -12
  118. package/dist/comms/capture-surface.js +23 -22
  119. package/dist/comms/catch-host.d.ts +7 -7
  120. package/dist/comms/catch-host.js +14 -14
  121. package/dist/comms/email-catch.d.ts +3 -3
  122. package/dist/comms/email-catch.js +8 -8
  123. package/dist/comms/external-evidence.js +2 -2
  124. package/dist/comms/extract.js +2 -2
  125. package/dist/comms/fake-inbox.d.ts +2 -2
  126. package/dist/comms/fake-inbox.js +2 -2
  127. package/dist/comms/receiving-render.d.ts +1 -1
  128. package/dist/comms/receiving-render.js +2 -2
  129. package/dist/comms/sandbox-catch-script.d.ts +6 -6
  130. package/dist/comms/sandbox-catch-script.js +6 -6
  131. package/dist/comms/sandbox-catch.d.ts +36 -37
  132. package/dist/comms/sandbox-catch.js +34 -35
  133. package/dist/comms/setup.js +42 -8
  134. package/dist/comms/thread-evidence.d.ts +1 -1
  135. package/dist/comms/thread-evidence.js +6 -6
  136. package/dist/comms/types.d.ts +6 -6
  137. package/dist/comms/types.js +3 -3
  138. package/dist/evidence/frame-signature.d.ts +1 -1
  139. package/dist/evidence/frame-signature.js +4 -4
  140. package/dist/evidence/redaction.d.ts +3 -3
  141. package/dist/evidence/redaction.js +4 -4
  142. package/dist/feedback/draft.js +36 -78
  143. package/dist/feedback/export-bundle.js +1 -1
  144. package/dist/feedback/export.d.ts +5 -1
  145. package/dist/feedback/export.js +7 -8
  146. package/dist/feedback/feedback.d.ts +2 -2
  147. package/dist/feedback/feedback.js +21 -3
  148. package/dist/guest/chromium-text.js +2 -2
  149. package/dist/guest/desktop-native.d.ts +1 -1
  150. package/dist/guest/runtime.js +1 -1
  151. package/dist/index.d.ts +12 -10
  152. package/dist/index.js +8 -6
  153. package/dist/keys/key-resolution.d.ts +5 -5
  154. package/dist/keys/key-resolution.js +23 -23
  155. package/dist/lab/adapter-extension.d.ts +7 -7
  156. package/dist/lab/adapter-extension.js +13 -36
  157. package/dist/lab/adapter-scorer-loader.d.ts +7 -7
  158. package/dist/lab/adapter-scorer-loader.js +32 -32
  159. package/dist/lab/composition-rules.js +42 -42
  160. package/dist/lab/config.js +65 -25
  161. package/dist/lab/deprecated-fields.d.ts +10 -0
  162. package/dist/lab/deprecated-fields.js +24 -0
  163. package/dist/lab/device-presets.d.ts +8 -8
  164. package/dist/lab/device-presets.js +11 -11
  165. package/dist/lab/discover.d.ts +13 -9
  166. package/dist/lab/discover.js +117 -57
  167. package/dist/lab/doctor.d.ts +10 -3
  168. package/dist/lab/doctor.js +47 -9
  169. package/dist/lab/init-templates.js +147 -147
  170. package/dist/lab/init.d.ts +1 -1
  171. package/dist/lab/init.js +41 -9
  172. package/dist/lab/keys.d.ts +2 -0
  173. package/dist/lab/keys.js +42 -8
  174. package/dist/lab/lab-deps.d.ts +7 -12
  175. package/dist/lab/parse/actors.js +9 -9
  176. package/dist/lab/parse/comms.js +5 -5
  177. package/dist/lab/parse/execution.js +13 -13
  178. package/dist/lab/parse/study-v3.d.ts +23 -0
  179. package/dist/lab/parse/study-v3.js +259 -0
  180. package/dist/lab/parse/subject-state.d.ts +7 -7
  181. package/dist/lab/parse/subject-state.js +16 -16
  182. package/dist/lab/parse/subject.js +28 -28
  183. package/dist/lab/parse/values.d.ts +1 -1
  184. package/dist/lab/parse/values.js +3 -3
  185. package/dist/lab/persona-resolve.d.ts +4 -4
  186. package/dist/lab/persona-resolve.js +4 -4
  187. package/dist/lab/plan-participants.d.ts +2 -2
  188. package/dist/lab/plan-types.d.ts +4 -4
  189. package/dist/lab/plan.d.ts +1 -7
  190. package/dist/lab/plan.js +10 -41
  191. package/dist/lab/preflight-probes.js +11 -11
  192. package/dist/lab/preflight-result.d.ts +2 -1
  193. package/dist/lab/preflight-result.js +5 -4
  194. package/dist/lab/preflight.d.ts +7 -5
  195. package/dist/lab/preflight.js +5 -5
  196. package/dist/lab/routing.d.ts +31 -25
  197. package/dist/lab/routing.js +60 -29
  198. package/dist/lab/run-lab-events.d.ts +0 -3
  199. package/dist/lab/run-lab-events.js +0 -6
  200. package/dist/lab/run-lab-homes.d.ts +22 -10
  201. package/dist/lab/run-lab-homes.js +5 -1
  202. package/dist/lab/run-lab-options.d.ts +1 -1
  203. package/dist/lab/run-lab-options.js +16 -13
  204. package/dist/lab/summary.d.ts +7 -6
  205. package/dist/lab/summary.js +10 -10
  206. package/dist/lab/tasks.d.ts +15 -15
  207. package/dist/lab/tasks.js +14 -14
  208. package/dist/lab/types.d.ts +101 -95
  209. package/dist/lab/types.js +2 -0
  210. package/dist/lab/validation.d.ts +13 -13
  211. package/dist/lab/validation.js +44 -42
  212. package/dist/lab/warnings.d.ts +10 -0
  213. package/dist/lab/warnings.js +61 -33
  214. package/dist/library-aliases.d.ts +56 -0
  215. package/dist/library-aliases.js +22 -0
  216. package/dist/observer/artifact.d.ts +1 -1
  217. package/dist/observer/artifact.js +6 -6
  218. package/dist/observer/data.d.ts +6 -6
  219. package/dist/observer/data.js +5 -4
  220. package/dist/observer/exposure.d.ts +1 -1
  221. package/dist/observer/exposure.js +11 -11
  222. package/dist/observer/http.js +1 -1
  223. package/dist/observer/library.d.ts +1 -1
  224. package/dist/observer/library.js +4 -2
  225. package/dist/observer/listen.js +5 -4
  226. package/dist/observer/render.d.ts +1 -1
  227. package/dist/observer/render.js +10 -5
  228. package/dist/observer/run-routes.d.ts +3 -3
  229. package/dist/observer/run-routes.js +1 -1
  230. package/dist/observer/serve.js +7 -3
  231. package/dist/observer/tunnel.js +1 -1
  232. package/dist/observer-app.html +4 -4
  233. package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
  234. package/dist/routes/computer-use/bundle-parts.js +15 -15
  235. package/dist/routes/computer-use/bundle.js +3 -3
  236. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +1 -1
  237. package/dist/routes/computer-use/e2b-desktop/comms.js +14 -14
  238. package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
  239. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +4 -3
  240. package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
  241. package/dist/routes/computer-use/e2b-desktop/prepare.js +7 -7
  242. package/dist/routes/computer-use/e2b-desktop/start.js +9 -8
  243. package/dist/routes/computer-use/e2b-desktop/teardown.js +5 -4
  244. package/dist/routes/computer-use/external-comms.d.ts +1 -1
  245. package/dist/routes/computer-use/external-comms.js +1 -1
  246. package/dist/routes/computer-use/fanout-bundle.js +18 -18
  247. package/dist/routes/computer-use/fanout-records.js +10 -11
  248. package/dist/routes/computer-use/live-flush.d.ts +1 -1
  249. package/dist/routes/computer-use/live-flush.js +6 -6
  250. package/dist/routes/computer-use/live-phase.d.ts +4 -2
  251. package/dist/routes/computer-use/live-phase.js +6 -6
  252. package/dist/routes/computer-use/local-vm.js +1 -1
  253. package/dist/routes/computer-use/participant-desktop.d.ts +4 -4
  254. package/dist/routes/computer-use/participant-desktop.js +4 -4
  255. package/dist/routes/computer-use/participant-execution.d.ts +4 -4
  256. package/dist/routes/computer-use/participant-execution.js +9 -9
  257. package/dist/routes/computer-use/participant-model.d.ts +6 -0
  258. package/dist/routes/computer-use/participant-model.js +31 -13
  259. package/dist/routes/computer-use/participant-prompt.d.ts +11 -11
  260. package/dist/routes/computer-use/participant-prompt.js +6 -6
  261. package/dist/routes/computer-use/participant-runs.d.ts +7 -7
  262. package/dist/routes/computer-use/participant-runs.js +13 -13
  263. package/dist/routes/computer-use/plan.js +22 -22
  264. package/dist/routes/computer-use/preflight.js +21 -21
  265. package/dist/routes/computer-use/rerun-selection.js +1 -1
  266. package/dist/routes/computer-use/result.js +11 -11
  267. package/dist/routes/computer-use/route.d.ts +2 -1
  268. package/dist/routes/computer-use/route.js +15 -14
  269. package/dist/routes/computer-use/self-report.d.ts +7 -7
  270. package/dist/routes/computer-use/self-report.js +31 -31
  271. package/dist/routes/computer-use/setup.d.ts +1 -1
  272. package/dist/routes/computer-use/setup.js +17 -18
  273. package/dist/routes/computer-use/single-bundle.d.ts +7 -7
  274. package/dist/routes/computer-use/single-bundle.js +28 -30
  275. package/dist/routes/computer-use/subject-projection.d.ts +1 -1
  276. package/dist/routes/computer-use/subject-projection.js +6 -6
  277. package/dist/routes/computer-use/types.d.ts +40 -42
  278. package/dist/routes/computer-use/types.js +10 -10
  279. package/dist/routes/preview.d.ts +8 -2
  280. package/dist/routes/preview.js +8 -4
  281. package/dist/routes/scripted/bundle.d.ts +2 -2
  282. package/dist/routes/scripted/bundle.js +13 -12
  283. package/dist/routes/scripted/plan.d.ts +1 -1
  284. package/dist/routes/scripted/plan.js +9 -9
  285. package/dist/routes/scripted/result.js +5 -5
  286. package/dist/routes/scripted/route.js +5 -6
  287. package/dist/routes/scripted/scenario.js +2 -2
  288. package/dist/routes/scripted/setup.js +7 -7
  289. package/dist/routes/scripted/subject.js +1 -1
  290. package/dist/routes/scripted/surface-records.js +3 -3
  291. package/dist/routes/scripted/types.d.ts +3 -5
  292. package/dist/routes/scripted/types.js +1 -1
  293. package/dist/routes/shared-world/bundle-records.js +9 -8
  294. package/dist/routes/shared-world/bundle.d.ts +5 -5
  295. package/dist/routes/shared-world/bundle.js +40 -38
  296. package/dist/routes/shared-world/checkpoints.d.ts +1 -1
  297. package/dist/routes/shared-world/checkpoints.js +1 -1
  298. package/dist/routes/shared-world/comms.d.ts +5 -5
  299. package/dist/routes/shared-world/comms.js +14 -14
  300. package/dist/routes/shared-world/external-public.d.ts +4 -3
  301. package/dist/routes/shared-world/external-public.js +16 -12
  302. package/dist/routes/shared-world/handoff.d.ts +7 -6
  303. package/dist/routes/shared-world/handoff.js +65 -57
  304. package/dist/routes/shared-world/lobby-code.d.ts +2 -2
  305. package/dist/routes/shared-world/lobby-code.js +9 -9
  306. package/dist/routes/shared-world/participant-specs.d.ts +7 -6
  307. package/dist/routes/shared-world/participant-specs.js +31 -24
  308. package/dist/routes/shared-world/plan.js +7 -7
  309. package/dist/routes/shared-world/provenance.d.ts +2 -2
  310. package/dist/routes/shared-world/provenance.js +2 -2
  311. package/dist/routes/shared-world/provisioned.js +14 -13
  312. package/dist/routes/shared-world/result.js +20 -21
  313. package/dist/routes/shared-world/route.js +23 -22
  314. package/dist/routes/shared-world/setup.d.ts +3 -3
  315. package/dist/routes/shared-world/setup.js +4 -4
  316. package/dist/routes/shared-world/types.d.ts +30 -28
  317. package/dist/routes/shared-world/types.js +4 -4
  318. package/dist/routes/terminal/adapter.d.ts +3 -3
  319. package/dist/routes/terminal/adapter.js +5 -5
  320. package/dist/routes/terminal/bundle.d.ts +3 -3
  321. package/dist/routes/terminal/bundle.js +22 -21
  322. package/dist/routes/terminal/credentials.d.ts +4 -4
  323. package/dist/routes/terminal/credentials.js +7 -7
  324. package/dist/routes/terminal/dry-run.js +4 -4
  325. package/dist/routes/terminal/encoding.js +2 -2
  326. package/dist/routes/terminal/ledger.d.ts +3 -3
  327. package/dist/routes/terminal/ledger.js +14 -14
  328. package/dist/routes/terminal/live-finish.js +3 -3
  329. package/dist/routes/terminal/live-sandbox.js +12 -13
  330. package/dist/routes/terminal/persona.js +1 -1
  331. package/dist/routes/terminal/plan.js +11 -11
  332. package/dist/routes/terminal/recorder.js +2 -2
  333. package/dist/routes/terminal/result.js +8 -8
  334. package/dist/routes/terminal/route.js +6 -7
  335. package/dist/routes/terminal/sandbox.d.ts +1 -1
  336. package/dist/routes/terminal/sandbox.js +1 -1
  337. package/dist/routes/terminal/session.js +8 -7
  338. package/dist/routes/terminal/token-usage.d.ts +1 -1
  339. package/dist/routes/terminal/token-usage.js +7 -8
  340. package/dist/routes/terminal/trace.d.ts +2 -2
  341. package/dist/routes/terminal/trace.js +2 -2
  342. package/dist/routes/terminal/types.d.ts +26 -28
  343. package/dist/routes/terminal/types.js +3 -3
  344. package/dist/run/bundle-shape.js +3 -3
  345. package/dist/run/bundle.d.ts +46 -46
  346. package/dist/run/bundle.js +2 -1
  347. package/dist/run/cost-summary.js +3 -3
  348. package/dist/run/costs.js +7 -1
  349. package/dist/run/detail.d.ts +6 -6
  350. package/dist/run/detail.js +4 -4
  351. package/dist/run/dry-run-inputs.js +1 -1
  352. package/dist/run/dry-run.js +18 -18
  353. package/dist/run/judge.d.ts +19 -13
  354. package/dist/run/judge.js +18 -8
  355. package/dist/run/paths.d.ts +1 -1
  356. package/dist/run/paths.js +1 -1
  357. package/dist/run/pricing.d.ts +11 -6
  358. package/dist/run/pricing.js +20 -13
  359. package/dist/run/projection.d.ts +14 -14
  360. package/dist/run/projection.js +15 -15
  361. package/dist/run/reclaim.js +2 -2
  362. package/dist/run/results.d.ts +5 -5
  363. package/dist/run/run-index.d.ts +8 -6
  364. package/dist/run/run-index.js +15 -16
  365. package/dist/run/run-not-found.d.ts +5 -0
  366. package/dist/run/run-not-found.js +15 -0
  367. package/dist/run/run.d.ts +5 -4
  368. package/dist/run/run.js +1 -1
  369. package/dist/run/sandbox-receipts.d.ts +2 -2
  370. package/dist/run/sandbox-receipts.js +3 -3
  371. package/dist/run/shared-world-evidence.d.ts +36 -35
  372. package/dist/run/shared-world-evidence.js +4 -4
  373. package/dist/run/shared-world-shape.d.ts +1 -1
  374. package/dist/run/shared-world-shape.js +6 -6
  375. package/dist/run/stats.d.ts +12 -6
  376. package/dist/run/stats.js +116 -58
  377. package/dist/run/status.d.ts +8 -29
  378. package/dist/run/status.js +5 -27
  379. package/dist/run/stored-runs.js +2 -1
  380. package/dist/run/stream-shape.js +1 -1
  381. package/dist/run/streams.d.ts +6 -6
  382. package/dist/run/study-provenance.d.ts +47 -0
  383. package/dist/run/study-provenance.js +63 -0
  384. package/dist/run/study-result.d.ts +16 -0
  385. package/dist/run/study-result.js +9 -0
  386. package/dist/run/text.d.ts +2 -0
  387. package/dist/run/text.js +4 -0
  388. package/dist/run-lab.d.ts +7 -7
  389. package/dist/run-lab.js +1 -3
  390. package/dist/study/convert.d.ts +33 -0
  391. package/dist/study/convert.js +432 -0
  392. package/dist/study/field-paths.d.ts +12 -0
  393. package/dist/study/field-paths.js +126 -0
  394. package/dist/study/files.d.ts +26 -0
  395. package/dist/study/files.js +43 -0
  396. package/dist/study/migrate.d.ts +48 -0
  397. package/dist/study/migrate.js +408 -0
  398. package/dist/study/owned-files.d.ts +38 -0
  399. package/dist/study/owned-files.js +182 -0
  400. package/dist/subject/clone.d.ts +1 -1
  401. package/dist/subject/desktop-cli.d.ts +1 -1
  402. package/dist/subject/desktop-cli.js +2 -2
  403. package/dist/subject/local-tree-archive.js +1 -1
  404. package/dist/subject/local-tree.d.ts +1 -1
  405. package/dist/subject/node-bootstrap.js +1 -1
  406. package/dist/subject/runtime.js +8 -9
  407. package/dist/subject/serve.d.ts +1 -1
  408. package/dist/subject/serve.js +3 -3
  409. package/dist/subject/state.d.ts +1 -1
  410. package/dist/subject/steps.d.ts +5 -5
  411. package/dist/subject/steps.js +4 -4
  412. package/dist/substrates/command-failure.d.ts +3 -3
  413. package/dist/substrates/command-failure.js +3 -3
  414. package/dist/substrates/detached.d.ts +6 -6
  415. package/dist/substrates/detached.js +7 -7
  416. package/dist/substrates/e2b/cdp-probe.d.ts +9 -9
  417. package/dist/substrates/e2b/cdp-probe.js +14 -17
  418. package/dist/substrates/e2b/desktop-browser.d.ts +2 -2
  419. package/dist/substrates/e2b/desktop-browser.js +8 -8
  420. package/dist/substrates/e2b/desktop-cdp.d.ts +9 -9
  421. package/dist/substrates/e2b/desktop-cdp.js +8 -8
  422. package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
  423. package/dist/substrates/e2b/desktop-executor.js +1 -1
  424. package/dist/substrates/e2b/desktop-geometry.d.ts +3 -3
  425. package/dist/substrates/e2b/desktop-geometry.js +7 -7
  426. package/dist/substrates/e2b/desktop-media.d.ts +1 -1
  427. package/dist/substrates/e2b/desktop-media.js +1 -1
  428. package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
  429. package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
  430. package/dist/substrates/e2b/sandbox.d.ts +1 -1
  431. package/dist/substrates/e2b/sandbox.js +1 -1
  432. package/dist/substrates/e2b/sdk.d.ts +11 -11
  433. package/dist/substrates/e2b/sdk.js +6 -6
  434. package/dist/tui/actions.d.ts +1 -1
  435. package/dist/tui/actions.js +13 -13
  436. package/dist/tui/contract.d.ts +16 -16
  437. package/dist/tui/contract.js +10 -10
  438. package/dist/tui/launch.d.ts +4 -4
  439. package/dist/tui/launch.js +18 -19
  440. package/dist/tui/project.js +5 -5
  441. package/dist/tui-app.js +82 -82
  442. package/dist/verify/actor.d.ts +8 -8
  443. package/dist/verify/actor.js +36 -36
  444. package/dist/verify/artifacts.d.ts +2 -2
  445. package/dist/verify/artifacts.js +3 -3
  446. package/dist/verify/context-growth.d.ts +9 -0
  447. package/dist/verify/context-growth.js +62 -0
  448. package/dist/verify/costs.d.ts +6 -6
  449. package/dist/verify/costs.js +8 -8
  450. package/dist/verify/shared-world-concurrent.d.ts +2 -2
  451. package/dist/verify/shared-world-concurrent.js +79 -76
  452. package/dist/verify/shared-world.d.ts +2 -2
  453. package/dist/verify/shared-world.js +16 -16
  454. package/dist/verify/subject.d.ts +4 -4
  455. package/dist/verify/subject.js +18 -18
  456. package/dist/verify/verify.js +92 -43
  457. package/docs/README.md +25 -32
  458. package/docs/architecture/actor-contract.md +56 -87
  459. package/docs/architecture/desktop-sessions.md +7 -7
  460. package/docs/architecture/external-public-shared-world.md +61 -59
  461. package/docs/architecture/github-feedback-loop.md +1 -4
  462. package/docs/architecture/guest-desktop.md +2 -2
  463. package/docs/architecture/observer.md +34 -34
  464. package/docs/architecture/restricted-codex-analysis.md +34 -28
  465. package/docs/architecture/serve.md +34 -37
  466. package/docs/architecture/state-driven-executor.md +55 -58
  467. package/docs/architecture/task-protocol-support.md +5 -5
  468. package/docs/architecture/terminal-product-route.md +67 -107
  469. package/docs/contracts/README.md +24 -0
  470. package/docs/contracts/adapter-admission.md +3 -3
  471. package/docs/contracts/adapter-fixtures.md +2 -5
  472. package/docs/contracts/core.md +1 -3
  473. package/docs/contracts/errors.md +62 -0
  474. package/docs/contracts/feedback.md +8 -9
  475. package/docs/contracts/policy.md +7 -12
  476. package/docs/contracts/run-bundle.md +45 -44
  477. package/docs/contracts/schemas.md +421 -362
  478. package/docs/contracts/study-analysis.md +3 -3
  479. package/docs/contracts/study-costs.md +11 -7
  480. package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
  481. package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
  482. package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
  483. package/docs/principles/actor-fidelity.md +4 -4
  484. package/docs/principles/engineering.md +3 -3
  485. package/docs/principles/invariants-and-defaults.md +38 -38
  486. package/docs/principles/self-driving-harness.md +1 -5
  487. package/docs/principles/three-roles.md +1 -1
  488. package/docs/product/automatic-analysis.md +7 -7
  489. package/examples/participant/README.md +5 -5
  490. package/examples/participant/run.mjs +11 -10
  491. package/examples/scorer/README.md +3 -3
  492. package/examples/scorer/run.mjs +11 -12
  493. package/package.json +16 -17
  494. package/skills/humanish/SKILL.md +60 -58
  495. package/skills/humanish/agents/openai.yaml +1 -1
  496. package/AGENTS.md +0 -99
  497. package/CONTRIBUTING.md +0 -148
  498. package/dist/actors/codex/qualified-versions.d.ts +0 -72
  499. package/dist/actors/codex/qualified-versions.js +0 -132
  500. package/dist/cli/commands/lab.d.ts +0 -3
  501. package/dist/cli/commands/lab.js +0 -199
  502. package/dist/cli/renamed-options.d.ts +0 -11
  503. package/dist/cli/renamed-options.js +0 -18
  504. package/dist/observer/static.d.ts +0 -39
  505. package/dist/observer/static.js +0 -369
  506. package/docs/architecture/comms-inbox.md +0 -122
  507. package/docs/architecture/desktop-recording.md +0 -80
  508. package/docs/architecture/local-browser-runtime.md +0 -178
  509. package/docs/architecture/observer-review.md +0 -144
  510. package/docs/architecture/participant-media.md +0 -90
  511. package/docs/architecture/project-layout.md +0 -62
  512. package/docs/architecture/real-email-receiving.md +0 -136
  513. package/docs/assets/humanish-drawdb-hero.png +0 -0
  514. package/docs/assets/humanish-observer-hero.png +0 -0
  515. package/docs/goals/current.md +0 -207
  516. package/docs/product/lobby-trivia-3player-external-public.md +0 -77
  517. package/docs/product/open-source-install-experience.md +0 -240
  518. package/docs/ramp/README.md +0 -295
  519. package/docs/release/open-source-readiness.md +0 -222
  520. package/docs/release/public-readiness-standard.md +0 -210
  521. package/docs/roadmap/world-class-open-source-v0.md +0 -311
@@ -2,13 +2,13 @@ import {} from "../../run/bundle.js";
2
2
  import { isRunAdapterScore } from "../../run/bundle-shape.js";
3
3
  import { adapterScoreFailureMessage, declaredScorerThrew, DECLARED_SCORER_MALFORMED, frozenBundleView, isAdapterFeedbackCandidate, } from "../../lab/adapter-extension.js";
4
4
  /**
5
- * Run the layer-6 product-adapter extension seam (issue #154 acceptance #8) over the assembled
5
+ * Run the product-adapter extension seam over the assembled
6
6
  * evidence and attach its results to the bundle in place, without core knowing any product noun.
7
7
  * The review is not touched here: the returned failures are folded into it by the caller.
8
8
  *
9
9
  * - `score`: when present, the returned namespaced `RunAdapterScore` lands on `bundle.adapterScore`.
10
10
  * For a library caller (no `scorerProvenance`), the adapter score is additive and never a
11
- * failure. For a config-declared scorer (#316; `scorerProvenance` present), a status:"fail" is a
11
+ * failure. For a config-declared scorer (`scorerProvenance` present), a status:"fail" is a
12
12
  * failure (the keystone route is the product's own definition of pass/fail), and so is a scorer
13
13
  * that throws or returns a malformed value, so a crashed declared gate is never a silent green.
14
14
  * - `deriveFeedback`: when present, the returned candidates are appended to
@@ -28,10 +28,10 @@ export async function applyAdapterExtensionSeam(args) {
28
28
  // still loaded and attempted).
29
29
  if (scorerProvenance)
30
30
  bundle.scorerProvenance = scorerProvenance;
31
- // The scorer sees a READ-ONLY view of the bundle so it cannot mutate noSpend/cost/review in place to
31
+ // The scorer sees a read-only view of the bundle so it cannot mutate noSpend/cost/review in place to
32
32
  // launder a verdict (a tamper attempt throws and is caught as a hook failure below). The seam stamps
33
33
  // the real bundle. The transcript is the same normalized, source-scrubbed text the run persists as
34
- // terminal-transcript.txt — no new exposure beyond what disk already holds (#341).
34
+ // terminal-transcript.txt, so the scorer sees nothing beyond what disk already holds.
35
35
  const ctx = {
36
36
  bundle: frozenBundleView(bundle),
37
37
  trace,
@@ -59,7 +59,7 @@ export async function applyAdapterExtensionSeam(args) {
59
59
  const cleaned = scrubValue(score);
60
60
  if (isRunAdapterScore(cleaned)) {
61
61
  bundle.adapterScore = cleaned;
62
- // A CONFIG-DECLARED terminal scorer owns the product verdict: a status:"fail" fails the
62
+ // A config-declared terminal scorer owns the product verdict: a status:"fail" fails the
63
63
  // review and the run result. A library caller keeps the additive no-fail behavior.
64
64
  const message = declared ? adapterScoreFailureMessage(bundle) : undefined;
65
65
  if (message !== undefined)
@@ -1,11 +1,11 @@
1
1
  import type { ActorPersonaRef, ActorTrace } from "../../actors/contract.js";
2
2
  import type { LabScenarioCaps, LabRuntimeAuth } from "../../lab/types.js";
3
3
  import { type RunBundle, type RunCostSummary, type BundleRun } from "../../run/bundle.js";
4
- import type { Verdict } from "../../run/judge.js";
4
+ import { type Verdict } from "../../run/judge.js";
5
5
  import type { TerminalLedgers } from "./types.js";
6
6
  /**
7
- * Project the terminal-product lab run into a humanish.run-bundle.v1 (no schema change — a new
8
- * producer only). DRY-RUN: a contract bundle. The terminal stream is a contract placeholder
7
+ * Project the terminal-product lab run into a humanish.run-bundle.v1 (no schema change: a new
8
+ * producer only). Dry run: a contract bundle. The terminal stream is a contract placeholder
9
9
  * (stdin disabled, no captured tail, because nothing ran), the subject is declared unpinned, and
10
10
  * the caps/policies/runtime-auth declarations are recorded without pretending that live ledgers
11
11
  * exist. The shipped live builder fills the same evidence contract. Exported for tests.
@@ -1,27 +1,28 @@
1
1
  import { redactText } from "../../evidence/redaction.js";
2
2
  import { participantAssignment } from "../../lab/participant-assignment.js";
3
3
  import { REVIEW_SCHEMA, bundleArtifacts, bundleHead, } from "../../run/bundle.js";
4
+ import { verdictText } from "../../run/judge.js";
4
5
  import {} from "../../run/streams.js";
5
6
  import { participantEvent, participantIds, participantRecord, participantStream, } from "../../run/participant-records.js";
6
7
  import { TERMINAL_EVENTS_ARTIFACT, TERMINAL_LEDGERS_ARTIFACT, TERMINAL_TRANSCRIPT_ARTIFACT, } from "../../run/terminal-contract.js";
7
8
  import { describeMeasuredSpend, noSpendLineMeasured, noSpendNotEstablished } from "./ledger.js";
8
9
  /**
9
- * Project the terminal-product lab run into a humanish.run-bundle.v1 (no schema change — a new
10
- * producer only). DRY-RUN: a contract bundle. The terminal stream is a contract placeholder
10
+ * Project the terminal-product lab run into a humanish.run-bundle.v1 (no schema change: a new
11
+ * producer only). Dry run: a contract bundle. The terminal stream is a contract placeholder
11
12
  * (stdin disabled, no captured tail, because nothing ran), the subject is declared unpinned, and
12
13
  * the caps/policies/runtime-auth declarations are recorded without pretending that live ledgers
13
14
  * exist. The shipped live builder fills the same evidence contract. Exported for tests.
14
15
  */
15
16
  export function buildTerminalProductBundle(args) {
16
- const reason = "Contract bundle only: dry-run declared the terminal-product study contract without creating an E2B sandbox, injecting any key, or spending. This run did not execute an agent or prove live behavior.";
17
+ const reason = "Dry run: the terminal-product study was declared without creating an E2B sandbox, injecting any key, or spending. This run did not execute an agent or prove live behavior.";
17
18
  // The terminal stream is a contract placeholder on the dry-run path: stdin is disabled and no
18
19
  // exec output was captured, so the tail is empty and transport stays "snapshot", never "pty"
19
- // (captured non-interactive exec output is never an interactive PTY; invariant 6 + the PTY
20
- // ruling). The shipped live builder fills terminal.tail from redacted exec-stream capture.
20
+ // (captured non-interactive exec output is never an interactive PTY). The shipped live builder
21
+ // fills terminal.tail from redacted exec-stream capture.
21
22
  const { simulation, stream } = terminalParticipant(args, {
22
23
  status: "contract_proof_only",
23
24
  reason,
24
- summary: `Contract participant for the terminal agent (${args.actorId}) studying ${args.productName} from public surfaces.`,
25
+ summary: `Dry-run participant for the terminal agent (${args.actorId}) studying ${args.productName} from public surfaces.`,
25
26
  updatedAt: args.run.createdAt,
26
27
  stdin: args.stdin,
27
28
  tail: "",
@@ -45,17 +46,17 @@ export function buildTerminalProductBundle(args) {
45
46
  at: args.run.createdAt,
46
47
  level: "info",
47
48
  type: "terminal-lab.subject.declared",
48
- // Invariant 5: provenance recorded or its absence declared. The agent drives public surfaces
49
+ // Provenance is recorded or its absence declared. The agent drives public surfaces
49
50
  // and nothing is cloned, so the subject provenance is explicitly unpinned; evidence binds to the
50
51
  // composed-prompt digest. Public surfaces are recorded (they are public by declaration).
51
- message: `Subject product declared: ${args.productName}; public surfaces: ${args.publicSurfaces.join(", ")}. The lab did not provision/clone the product — subject provenance is UNPINNED (a public-surface study cannot be commit-pinned); evidence binds to the composed-prompt digest ${args.persona.promptDigest}.`,
52
+ message: `Subject product declared: ${args.productName}; public surfaces: ${args.publicSurfaces.join(", ")}. humanish did not provision or clone the product, so its provenance is unpinned: a study of public pages has no commit to pin. The evidence is tied to the prompt digest ${args.persona.promptDigest}.`,
52
53
  }),
53
54
  participantEvent(TERMINAL_IDS, {
54
55
  id: "event-002-credentials",
55
56
  at: args.run.createdAt,
56
57
  level: "info",
57
58
  type: "terminal-lab.credentials.declared",
58
- // Names-only evidence (invariant 1): the runtime-auth channel is declared; no value is ever
59
+ // Names-only evidence: the runtime-auth channel is declared; no value is ever
59
60
  // recorded. The deny-by-default policies are recorded so the credential posture is auditable.
60
61
  message: `Runtime auth channel: ${args.runtimeAuth ?? "none declared"} (names only; values never persist; the live engine applies the selected key placement, while this dry-run performs no injection). Credential policies (deny-by-default): allowPrivateRepoAccess=${args.policies.allowPrivateRepoAccess}, allowProviderCredentials=${args.policies.allowProviderCredentials}, allowPaymentCredentials=${args.policies.allowPaymentCredentials}, allowGitHubMutation=${args.policies.allowGitHubMutation}.`,
61
62
  }),
@@ -64,14 +65,14 @@ export function buildTerminalProductBundle(args) {
64
65
  at: args.run.createdAt,
65
66
  level: "info",
66
67
  type: "terminal-lab.caps.declared",
67
- message: `Spend/job/time caps: ${capsText}. A live run never exercises the runtime key without a fail-closed cap; its no-spend proof is derived from the persisted cost ledger. This dry-run spends $0 by mechanism.`,
68
+ message: `Spend, job and time caps: ${capsText}. A live run uses the runtime key only while a cap is in force, and derives its no-spend proof from the recorded cost ledger. This dry run spends $0: it makes no model request.`,
68
69
  }),
69
70
  participantEvent(TERMINAL_IDS, {
70
71
  id: "event-004-contract",
71
72
  at: args.run.createdAt,
72
73
  level: "info",
73
74
  type: "terminal-lab.contract.ready",
74
- message: "Dry-run contract bundle ready. Switch scenario.mode to live with the required runtime auth and caps to exercise the in-sandbox agent route, captured exec stream, and declared runtime-auth placement.",
75
+ message: "Dry-run bundle ready. Switch scenario.mode to live with the required runtime auth and caps to exercise the in-sandbox agent route, captured exec stream, and declared runtime-auth placement.",
75
76
  }),
76
77
  ];
77
78
  const review = {
@@ -79,7 +80,7 @@ export function buildTerminalProductBundle(args) {
79
80
  verdict: args.verdict,
80
81
  summary: reason,
81
82
  gaps: [
82
- "This dry-run did not execute the live in-sandbox agent route; it proves contract shape only, not live behavior, scale, or adoption.",
83
+ "This dry run did not execute the live in-sandbox agent route; it checks the evidence shape only, not live behavior, scale, or adoption.",
83
84
  "No exec-stream, transcript, substrate, cost, or cleanup artifacts were produced because no live session ran; live verification requires those artifacts.",
84
85
  ],
85
86
  };
@@ -94,7 +95,7 @@ export function buildTerminalProductBundle(args) {
94
95
  simulation,
95
96
  stream,
96
97
  events,
97
- redactionNotes: "Dry-run contract bundle: no sandbox ran, no key was injected, no exec output was captured. The author mission is public-safe committed lab text (redacted defensively); the composed prompt is bound by digest. The shipped live path applies scrubKnownValues then redactText at the capture source before persistence.",
98
+ redactionNotes: "Dry-run bundle: no sandbox ran, no key was injected, no exec output was captured. The author mission is public-safe committed lab text (redacted defensively); the composed prompt is bound by digest. The shipped live path applies scrubKnownValues then redactText at the capture source before persistence.",
98
99
  review,
99
100
  });
100
101
  }
@@ -167,8 +168,8 @@ export function buildLiveTerminalProductBundle(args) {
167
168
  ? []
168
169
  : [`Agent session ended ${args.trace.status}: ${args.sessionReason}`]),
169
170
  ...(args.capFailure === undefined ? [] : [args.capFailure]),
170
- // Honesty gap: the no-spend proof always declares which spend lines it could not measure, so a
171
- // green run never silently over-claims a fully-proven $0.
171
+ // Measurement gap: the no-spend proof always declares which spend lines it could not measure,
172
+ // so a green run never silently over-claims a fully-proven $0.
172
173
  ...(noSpend.unmeasuredLines.length > 0
173
174
  ? [
174
175
  `${noSpendLineMeasured(noSpend) ? noSpendNotEstablished(noSpend.maxUsd ?? 0) : "No-spend proof is partial."} ${describeMeasuredSpend(args.ledgers.cost, args.trace.tokenUsage)} An adapter may supply the missing signals through costProbe.`,
@@ -185,7 +186,7 @@ export function buildLiveTerminalProductBundle(args) {
185
186
  simulation,
186
187
  stream,
187
188
  events: lifecycleEvents,
188
- redactionNotes: `Live terminal-product run: the in-sandbox agent's output was captured via commands.run onStdout/onStderr and scrubbed (literal known values incl. the runtime key) THEN redacted (shape patterns) AT THE SOURCE before persisting. ${args.runtimeAuth === "openai-egress" ? `Runtime auth openai-egress: the raw key from ${args.runtimeAuthKeyName} is reserved for E2B's external api.openai.com HTTPS header transform. ${args.ledgers.commandLog.some((command) => command.label === "codex-exec") ? "Codex received an inert CODEX_API_KEY placeholder." : "Codex was not launched."} Any created sandbox retains a spendable OpenAI proxy capability until teardown; additional provider calls may not appear in the Codex usage ledger.` : `Runtime auth openai-env: the runtime key (${args.runtimeAuthKeyName}) was injected ONLY into the command-scoped codex invocation, never sandbox-global env or metadata; only its NAME appears in evidence.`} Subject provenance is UNPINNED (public-surface study).`,
189
+ redactionNotes: `Live terminal-product run: the in-sandbox agent's output was captured via commands.run onStdout/onStderr and had known values (including the runtime key) scrubbed, then shape patterns redacted, before anything was stored. ${args.runtimeAuth === "openai-egress" ? `Runtime auth openai-egress: the raw key from ${args.runtimeAuthKeyName} is reserved for E2B's external api.openai.com HTTPS header transform. ${args.ledgers.commandLog.some((command) => command.label === "codex-exec") ? "Codex received an inert CODEX_API_KEY placeholder." : "Codex was not launched."} Any created sandbox retains a spendable OpenAI proxy capability until teardown; additional provider calls may not appear in the Codex usage ledger.` : `Runtime auth openai-env: the runtime key (${args.runtimeAuthKeyName}) was passed only to the codex command, never to sandbox-wide environment variables or metadata; only its name appears in evidence.`} Subject provenance is unpinned (a study of public pages).`,
189
190
  review,
190
191
  ...(args.cost === undefined ? {} : { cost: args.cost }),
191
192
  });
@@ -209,7 +210,7 @@ function terminalParticipant(args, session) {
209
210
  const stream = participantStream(TERMINAL_IDS, {
210
211
  assignment: participantAssignment({ mission: args.mission }),
211
212
  kind: "terminal",
212
- label: `Terminal agent — ${args.labId}`,
213
+ label: `Terminal agent · ${args.labId}`,
213
214
  status: session.status,
214
215
  transport: "snapshot",
215
216
  updatedAt: session.updatedAt,
@@ -236,17 +237,17 @@ function terminalRunBundle(args, parts) {
236
237
  persona: {
237
238
  id: args.persona.id,
238
239
  name: `Autonomous terminal agent (${args.persona.id})`,
239
- source: `lab:${args.labId}`,
240
+ source: `study:${args.labId}`,
240
241
  sourceDigest: args.persona.promptDigest,
241
242
  },
242
243
  scenario: {
243
244
  id: `terminal-${args.labId}`,
244
245
  title: args.labTitle ?? `Terminal-product lab: ${args.labId}`,
245
- // The author mission is public-safe committed lab text — recorded plaintext as the goal,
246
+ // The author mission is public-safe committed lab text. It is recorded plaintext as the goal,
246
247
  // redacted defensively before persisting (it never carries a secret, but the harness never
247
248
  // trusts that). The full composed prompt is bound by digest, not text.
248
249
  goal: redactText(args.mission),
249
- source: `lab:${args.labId}`,
250
+ source: `study:${args.labId}`,
250
251
  sourceDigest: args.persona.promptDigest,
251
252
  },
252
253
  lifecycle: parts.lifecycle,
@@ -281,7 +282,7 @@ export function renderTerminalReviewMarkdown(bundle) {
281
282
  "",
282
283
  `- run: ${bundle.runId}`,
283
284
  `- mode: ${bundle.mode}`,
284
- `- verdict: ${bundle.review.verdict}`,
285
+ `- verdict: ${verdictText(bundle.review.verdict, bundle.mode)}`,
285
286
  `- summary: ${bundle.review.summary}`,
286
287
  `- mission: ${bundle.scenario.goal}`,
287
288
  ...(subject ? [`- subject: ${subject.message}`] : []),
@@ -18,17 +18,17 @@ export declare function buildRuntimeAuth(args: {
18
18
  keyValue: string;
19
19
  } | {
20
20
  ok: false;
21
- code: "HUMANISH_TERMINAL_LAB_RUNTIME_AUTH_MISSING" | "HUMANISH_TERMINAL_LAB_CREDENTIAL_DENIED";
21
+ code: "HUMANISH_TERMINAL_RUNTIME_AUTH_MISSING" | "HUMANISH_TERMINAL_CREDENTIAL_DENIED";
22
22
  message: string;
23
23
  };
24
24
  /**
25
- * Build the sandbox metadata from a positive allowlist (safety contract item 6). This is the only
26
- * way metadata is set on the terminal route — it carries solely non-secret labels and rejects any
25
+ * Build the sandbox metadata from a positive allowlist. This is the only
26
+ * way metadata is set on the terminal route. It carries solely non-secret labels and rejects any
27
27
  * value that is not a plain short label. A verifier check asserts the persisted metadata has no
28
28
  * prompt/token/secret shapes; this builder makes that true by construction.
29
29
  */
30
30
  export declare function buildSandboxMetadata(allowlist: {
31
31
  labId: string;
32
- simId: string;
32
+ recordId: string;
33
33
  runId: string;
34
34
  }): Record<string, string>;
@@ -12,13 +12,13 @@ export function buildRuntimeAuth(args) {
12
12
  // (developers.openai.com/codex/noninteractive) document it as the channel for a single codex exec
13
13
  // invocation, which is exactly this route's shape (no persisted auth.json/CODEX_HOME, per-command
14
14
  // envs only). A dated in-repo receipt
15
- // (docs/goals/humanish-recursive-proof-critical-point/receipts/actor-required-attempt.md) shows a
15
+ // (docs/history/goals/humanish-recursive-proof-critical-point/receipts/actor-required-attempt.md) shows a
16
16
  // job-wide OPENAI_API_KEY alone failing bearer auth for this same pinned-exec pattern. When the
17
17
  // operator only exported OPENAI_API_KEY, its value is also injected under CODEX_API_KEY below, so
18
18
  // the documented exec auth channel is always populated regardless of which name the operator
19
19
  // used. The allowlist is exactly these two names; everything else is denied by construction.
20
20
  const ALLOWED_RUNTIME_KEY_NAMES = ["CODEX_API_KEY", "OPENAI_API_KEY"];
21
- // Tripwire (safety contract item 4): if a future widening of ALLOWED_RUNTIME_KEY_NAMES ever
21
+ // Tripwire (deny-by-default credentials): if a future widening of ALLOWED_RUNTIME_KEY_NAMES ever
22
22
  // added a clearly-non-runtime credential (a GitHub/payment/deploy/db secret), fail closed. The
23
23
  // generic `*_KEY` shape is deliberately left out of the tripwire, since a runtime key legitimately
24
24
  // ends in _KEY (CODEX_API_KEY/OPENAI_API_KEY), so testing it against the generic shape would
@@ -29,7 +29,7 @@ export function buildRuntimeAuth(args) {
29
29
  if (ALLOWED_RUNTIME_KEY_NAMES.some((name) => isNonRuntimeCredentialName(name))) {
30
30
  return {
31
31
  ok: false,
32
- code: "HUMANISH_TERMINAL_LAB_CREDENTIAL_DENIED",
32
+ code: "HUMANISH_TERMINAL_CREDENTIAL_DENIED",
33
33
  message: "Internal invariant violated: a runtime-key allowlist entry is a non-runtime credential (GitHub/payment/deploy/db).",
34
34
  };
35
35
  }
@@ -37,7 +37,7 @@ export function buildRuntimeAuth(args) {
37
37
  if (!keyName) {
38
38
  return {
39
39
  ok: false,
40
- code: "HUMANISH_TERMINAL_LAB_RUNTIME_AUTH_MISSING",
40
+ code: "HUMANISH_TERMINAL_RUNTIME_AUTH_MISSING",
41
41
  message: `Live terminal-product labs declare runtimeAuth "${String(args.runtimeAuth)}" and need ${ALLOWED_RUNTIME_KEY_NAMES.join(" or ")} in the environment (pass via --env-file; the selected auth mode places the value in command-scoped env or an external E2B header transform; the value is never persisted).`,
42
42
  };
43
43
  }
@@ -84,8 +84,8 @@ function isNonRuntimeCredentialName(name) {
84
84
  return NON_RUNTIME_CREDENTIAL_NAME_PATTERNS.some((pattern) => pattern.test(name));
85
85
  }
86
86
  /**
87
- * Build the sandbox metadata from a positive allowlist (safety contract item 6). This is the only
88
- * way metadata is set on the terminal route — it carries solely non-secret labels and rejects any
87
+ * Build the sandbox metadata from a positive allowlist. This is the only
88
+ * way metadata is set on the terminal route. It carries solely non-secret labels and rejects any
89
89
  * value that is not a plain short label. A verifier check asserts the persisted metadata has no
90
90
  * prompt/token/secret shapes; this builder makes that true by construction.
91
91
  */
@@ -95,7 +95,7 @@ export function buildSandboxMetadata(allowlist) {
95
95
  tool: TERMINAL_PRODUCT_LAB_PROVIDER_METADATA.tool,
96
96
  provider: "codex",
97
97
  labId: allowlist.labId,
98
- simId: allowlist.simId,
98
+ recordId: allowlist.recordId,
99
99
  // The run id is a harness-minted token (terminal-<ts>-<hex>), not user data.
100
100
  runId: allowlist.runId,
101
101
  };
@@ -9,7 +9,8 @@ import { buildTerminalProductBundle, renderTerminalReviewMarkdown } from "./bund
9
9
  import { resolveTerminalPersona, terminalPersonaRef } from "./persona.js";
10
10
  import { declaredRuntimeProvenance } from "./runtime.js";
11
11
  import { defaultMission, makeTerminalRunId } from "./session.js";
12
- import { TERMINAL_PRODUCT_LAB_SCHEMA, } from "./types.js";
12
+ import {} from "./types.js";
13
+ import { studyResultIdentity } from "../../run/study-result.js";
13
14
  /**
14
15
  * The dry-run path: a contract bundle with the persona and prompt digest bound, published through
15
16
  * the run scope with no sandbox, key or spend.
@@ -82,10 +83,9 @@ export async function runDryTerminalLab(args) {
82
83
  const ok = resultOk({ judgment, execution, scorerFailures: [], policy });
83
84
  await finished.recordOutcome({ ok, execution });
84
85
  return {
85
- schema: TERMINAL_PRODUCT_LAB_SCHEMA,
86
+ ...studyResultIdentity("terminal", plan.labId),
86
87
  ok,
87
88
  cwd,
88
- labId: plan.labId,
89
89
  actor: plan.actor,
90
90
  product: product.name,
91
91
  dryRun: true,
@@ -96,7 +96,7 @@ export async function runDryTerminalLab(args) {
96
96
  ? {}
97
97
  : {
98
98
  error: {
99
- code: "HUMANISH_TERMINAL_LAB_FAILED",
99
+ code: "HUMANISH_TERMINAL_FAILED",
100
100
  message: observer.error?.message ?? "Observer failed for the terminal-product lab run.",
101
101
  },
102
102
  }),
@@ -6,7 +6,7 @@
6
6
  // as a replacement glyph. Every ASCII character on the same screen was fine, which is exactly the
7
7
  // signature.
8
8
  //
9
- // The honest fix is not "stop using em dashes" — it is to ask what the terminal can render and mean
9
+ // The fix is not "stop using em dashes". It is to ask what the terminal can render and mean
10
10
  // it. A surface that emits characters its own terminal cannot decode is not being expressive, it is
11
11
  // producing garbage that reads as a bug in the tool.
12
12
  const UTF8 = /utf-?8/i;
@@ -23,7 +23,7 @@ export function terminalRendersUnicode(env = process.env) {
23
23
  const declared = env.LC_ALL ?? env.LC_CTYPE ?? env.LANG;
24
24
  if (declared === undefined || declared.trim().length === 0) {
25
25
  // Nothing declared at all. A bare login shell on a stock image lands here, and that is the
26
- // case the participant hit — assume it cannot, because the failure is silent and ugly while
26
+ // case the participant hit. Assume it cannot, because the failure is silent and ugly while
27
27
  // the fallback is merely plainer.
28
28
  return false;
29
29
  }
@@ -3,7 +3,7 @@ import type { LabScenarioCaps } from "../../lab/types.js";
3
3
  import { type CostCategory } from "../../run/terminal-contract.js";
4
4
  import type { CostLine, NoSpendProof, TerminalCostLedger } from "./types.js";
5
5
  /**
6
- * Build the spend ledger from the captured session. The null discipline (issue #154):
6
+ * Build the spend ledger from the captured session. The null discipline:
7
7
  * - The `provider` line is populated from the actor trace's tokenUsage.costUsd when the trace
8
8
  * carries it (a measured value, incl. a measured 0). When the trace carries no costUsd, the
9
9
  * provider line is `null` = not measured (never guessed to 0 just because no-spend was intended).
@@ -14,7 +14,7 @@ import type { CostLine, NoSpendProof, TerminalCostLedger } from "./types.js";
14
14
  */
15
15
  export declare function buildCostLedger(args: {
16
16
  tokenCostUsd?: number;
17
- /** Measured token counts, when the run produced them but no rate could price them (#531). */
17
+ /** Measured token counts, when the run produced them but no rate could price them. */
18
18
  tokenUsage?: ActorTokenUsage;
19
19
  injectedLines?: Partial<Record<CostCategory, CostLine>>;
20
20
  }): TerminalCostLedger;
@@ -32,7 +32,7 @@ export declare function noSpendNotEstablished(maxUsd: number): string;
32
32
  */
33
33
  export declare function describeMeasuredSpend(ledger: TerminalCostLedger, tokenUsage?: ActorTokenUsage): string;
34
34
  /** Derive the no-spend proof from the ledger. It vouches for known-zero lines and
35
- * explicitly lists the unmeasured (null) lines it cannot vouch for — never claiming zero on null. */
35
+ * explicitly lists the unmeasured (null) lines it cannot vouch for. It never claims zero on null. */
36
36
  export declare function buildNoSpendProof(ledger: TerminalCostLedger, maxUsd: number | null, tokenUsage?: ActorTokenUsage): NoSpendProof;
37
37
  /**
38
38
  * Fail-closed caps enforcement. Returns a structured violation when a known
@@ -2,7 +2,7 @@ import { describeTokenUsage } from "./token-usage.js";
2
2
  import { round6 } from "../../run/pricing.js";
3
3
  import { COST_CATEGORIES } from "../../run/terminal-contract.js";
4
4
  /**
5
- * Build the spend ledger from the captured session. The null discipline (issue #154):
5
+ * Build the spend ledger from the captured session. The null discipline:
6
6
  * - The `provider` line is populated from the actor trace's tokenUsage.costUsd when the trace
7
7
  * carries it (a measured value, incl. a measured 0). When the trace carries no costUsd, the
8
8
  * provider line is `null` = not measured (never guessed to 0 just because no-spend was intended).
@@ -22,24 +22,24 @@ export function buildCostLedger(args) {
22
22
  ? {
23
23
  // Tokens counted, no rate to price them. This stays `usd: null` because a guessed
24
24
  // dollar figure would be worse than none, but the note carries the measured fact so a
25
- // reader never mistakes "no charge recorded" for "nothing was consumed" (#531).
25
+ // reader never mistakes "no charge recorded" for "nothing was consumed".
26
26
  usd: null,
27
27
  source: "unpriced-token-usage",
28
- note: `Provider spend UNPRICED: the run consumed ${describeTokenUsage(args.tokenUsage)}, ` +
29
- "but the terminal participant records the model as `codex` and src/run/pricing.ts carries no " +
30
- "rate for it, so no dollar figure is claimed. Tokens are a MEASURED fact here; the " +
31
- "price is the unknown. Recorded null (never guessed to 0).",
28
+ note: `Provider spend unpriced: the run consumed ${describeTokenUsage(args.tokenUsage)}, ` +
29
+ "but the terminal participant records the model as `codex` and humanish has no rate " +
30
+ "for it, so no dollar figure is given. The token count is measured; the price is " +
31
+ "not known. Recorded as null, never guessed as 0.",
32
32
  }
33
33
  : {
34
34
  usd: null,
35
35
  source: "unmeasured",
36
- note: "Provider spend NOT MEASURED: the actor trace carried no tokenUsage.costUsd this run. Recorded null (not guessed to 0).",
36
+ note: "Provider spend not measured: the actor trace carried no tokenUsage.costUsd in this run, so it is recorded as null and not guessed as 0.",
37
37
  };
38
38
  const unmeasured = (category) => ({
39
39
  usd: null,
40
40
  count: null,
41
41
  source: "unmeasured",
42
- note: `${category} spend NOT MEASURED: core has no ${category}-spend signal for this run; an adapter may supply one through costProbe. Recorded null (never guessed to 0).`,
42
+ note: `${category} spend not measured: humanish has no ${category} spend signal for this run, and an adapter may supply one through costProbe. Recorded as null, never guessed as 0.`,
43
43
  });
44
44
  const lines = {
45
45
  product: args.injectedLines?.product ?? unmeasured("product"),
@@ -99,7 +99,7 @@ export function describeMeasuredSpend(ledger, tokenUsage) {
99
99
  .join(" ");
100
100
  }
101
101
  /** Derive the no-spend proof from the ledger. It vouches for known-zero lines and
102
- * explicitly lists the unmeasured (null) lines it cannot vouch for — never claiming zero on null. */
102
+ * explicitly lists the unmeasured (null) lines it cannot vouch for. It never claims zero on null. */
103
103
  export function buildNoSpendProof(ledger, maxUsd, tokenUsage) {
104
104
  const knownZeroLines = [];
105
105
  const knownNonZeroLines = [];
@@ -115,14 +115,14 @@ export function buildNoSpendProof(ledger, maxUsd, tokenUsage) {
115
115
  }
116
116
  // satisfied only when every known line is within the cap (for a no-spend run, maxUsd 0 => every
117
117
  // known line must be exactly 0). Unmeasured lines never make it satisfied; they are reported
118
- // separately as the proof's honest blind spot.
118
+ // separately as the proof's blind spot.
119
119
  const cap = maxUsd ?? 0;
120
120
  const satisfied = knownNonZeroLines.length === 0 && ledger.knownTotalUsd <= cap;
121
121
  const verdict = !satisfied
122
- ? `No-spend proof NOT satisfied for maxUsd=${cap}: known spend total ${ledger.knownTotalUsd} USD${knownNonZeroLines.length > 0 ? ` (non-zero: ${knownNonZeroLines.join(", ")})` : ""}.`
122
+ ? `No-spend proof not satisfied for maxUsd=${cap}: known spend total ${ledger.knownTotalUsd} USD${knownNonZeroLines.length > 0 ? ` (non-zero: ${knownNonZeroLines.join(", ")})` : ""}.`
123
123
  : noSpendLineMeasured({ knownZeroLines, knownNonZeroLines })
124
124
  ? noSpendNotEstablished(cap)
125
- : `No-spend proof SATISFIED for maxUsd=${cap} on the measured lines (known total ${ledger.knownTotalUsd} USD).`;
125
+ : `No-spend proof satisfied for maxUsd=${cap} on the measured lines (known total ${ledger.knownTotalUsd} USD).`;
126
126
  const statement = [verdict, describeMeasuredSpend(ledger, tokenUsage)]
127
127
  .filter((part) => part.length > 0)
128
128
  .join(" ");
@@ -149,7 +149,7 @@ export function evaluateCapsAgainstLedger(ledger, caps) {
149
149
  const overLines = COST_CATEGORIES.filter((c) => ledger.lines[c].usd !== null && ledger.lines[c].usd > 0);
150
150
  return {
151
151
  ok: false,
152
- message: `Observed KNOWN spend ${ledger.knownTotalUsd} USD exceeds scenario.caps.maxUsd=${caps.maxUsd}${overLines.length > 0 ? ` (non-zero lines: ${overLines.join(", ")})` : ""}. The run fails closed: the cap is a fail-closed mechanism, not an advisory.`,
152
+ message: `Stopped: measured spend ${ledger.knownTotalUsd} USD passed scenario.caps.maxUsd=${caps.maxUsd}${overLines.length > 0 ? ` (non-zero lines: ${overLines.join(", ")})` : ""}. The cap stops the run; it is not a warning.`,
153
153
  };
154
154
  }
155
155
  if (caps.maxJobs !== undefined) {
@@ -162,7 +162,7 @@ export function evaluateCapsAgainstLedger(ledger, caps) {
162
162
  if (knownJobs > caps.maxJobs) {
163
163
  return {
164
164
  ok: false,
165
- message: `Observed KNOWN billable-job count ${knownJobs} exceeds scenario.caps.maxJobs=${caps.maxJobs}. The run fails closed.`,
165
+ message: `Stopped: ${knownJobs} measured billable jobs passed scenario.caps.maxJobs=${caps.maxJobs}.`,
166
166
  };
167
167
  }
168
168
  }
@@ -25,7 +25,7 @@ function buildLiveTrace(inputs) {
25
25
  // Build the actor trace first (the cost ledger reads its tokenUsage).
26
26
  const normalizedTranscript = normalizeLocalActorTranscript(terminalEvents.map((e) => e.chunk).join(""));
27
27
  // Parsed from the full stream: usage records arrive once per turn, and the tail
28
- // would drop all but the last (#531).
28
+ // would drop all but the last.
29
29
  const terminalTokenUsage = parseTerminalTokenUsage(normalizedTranscript);
30
30
  const trace = buildTerminalActorTrace({
31
31
  persona,
@@ -71,14 +71,14 @@ async function settleLiveLedgers(inputs, trace, normalizedTranscript) {
71
71
  });
72
72
  const noSpendProof = buildNoSpendProof(cost, maxUsd ?? null, trace.tokenUsage);
73
73
  const proofVerdict = !noSpendProof.satisfied
74
- ? `No-spend proof NOT satisfied for maxUsd=${maxUsd ?? "null"}.`
74
+ ? `No-spend proof not satisfied for maxUsd=${maxUsd ?? "null"}.`
75
75
  : noSpendLineMeasured(noSpendProof)
76
76
  ? noSpendNotEstablished(maxUsd ?? 0)
77
77
  : `No-spend proof satisfied on the measured lines for maxUsd=${maxUsd ?? "null"}.`;
78
78
  const measuredSpend = describeMeasuredSpend(cost, trace.tokenUsage);
79
79
  recordLifecycle("terminal-lab.cost.measured", `Cost ledger: known total ${cost.knownTotalUsd} USD${cost.fullyMeasured ? " (fully measured)" : " (lower bound)"}.${measuredSpend.length > 0 ? ` ${measuredSpend}` : ""} ${proofVerdict}`);
80
80
  // Fail-closed caps enforcement: if a known spend line exceeds maxUsd (or a
81
- // known job count exceeds maxJobs), the run fails closed — never a green result. Unknowns (null)
81
+ // known job count exceeds maxJobs), the run fails closed with no green result. Unknowns (null)
82
82
  // never trip the cap (we cannot claim a violation we did not measure) but never grant a pass
83
83
  // either (the no-spend proof reports them as unmeasured). maxMinutes is already wall-clock-
84
84
  // enforced above. A blown cap is an execution failure: the agent's own status stays the
@@ -56,7 +56,7 @@ export class LiveTerminalSandbox {
56
56
  const { warnings } = this.inputs;
57
57
  const { recordLifecycle } = this.inputs.recorder;
58
58
  const { requestTimeoutMs, sandboxTimeoutMs } = this;
59
- // Declared egress allowlist, or undefined for the historical unrestricted default (#538).
59
+ // Declared egress allowlist, or undefined for the historical unrestricted default.
60
60
  const egressAllow = plan.egressAllow;
61
61
  const sandboxModule = await (deps.desktopModule ?? loadE2BDesktopModule)();
62
62
  this.module = sandboxModule;
@@ -99,7 +99,7 @@ export class LiveTerminalSandbox {
99
99
  this.sandboxId = sandboxId;
100
100
  this.createdAtMs = now();
101
101
  await validatePreparedRunArtifactPaths(runPaths);
102
- recordLifecycle("terminal-lab.sandbox.created", `E2B shell sandbox ${sandboxId} created with positive-allowlist metadata and kill-on-timeout; NO sandbox-global env.`);
102
+ recordLifecycle("terminal-lab.sandbox.created", `E2B shell sandbox ${sandboxId} created with allowlisted metadata and kill-on-timeout, and with no sandbox-wide environment variables.`);
103
103
  const sandboxResources = await observeDesktopResources(sandbox);
104
104
  this.resources = sandboxResources;
105
105
  if ("reason" in sandboxResources) {
@@ -108,7 +108,7 @@ export class LiveTerminalSandbox {
108
108
  // The allowlist is evidence: a reader of the ledger can see exactly what the participant was
109
109
  // able to reach, without the ledger carrying any secret.
110
110
  recordLifecycle("terminal-lab.egress.policy", egressAllow === undefined
111
- ? "Egress UNRESTRICTED (no execution.egressAllow declared)."
111
+ ? "Egress is unrestricted (no execution.egressAllow declared)."
112
112
  : `Egress routing allowlist: ${egressAllow.length} declared host(s): ${egressAllow.join(", ")}; deny-all fallback. Domain routing is not strict destination isolation on shared infrastructure.`);
113
113
  recordLifecycle("terminal-lab.runtime-auth", runtimeEnv.mode === "openai-egress"
114
114
  ? "Runtime auth openai-egress: raw key remains outside the sandbox in the api.openai.com HTTPS Authorization transform; Codex receives an inert CODEX_API_KEY placeholder and the default OpenAI endpoint. Every sandbox process, including bootstrap/setup, can spend via this proxy; no added routing restriction or provider spending limit."
@@ -131,7 +131,7 @@ export class LiveTerminalSandbox {
131
131
  const { requestTimeoutMs } = this;
132
132
  // --- Runtime bootstrap: no runtime env; openai-egress proxy capability is already available. ---
133
133
  // The stock desktop needs Node/npm on `PATH` before npx can run Codex. Reuse a working
134
- // installation or install the pinned official binary after checksum verification (#674).
134
+ // installation or install the pinned official binary after checksum verification.
135
135
  // No raw runtime key touches this step; the egress proxy, when selected, is already available.
136
136
  const bootstrapStartedAt = now();
137
137
  let bootstrapError;
@@ -149,7 +149,7 @@ export class LiveTerminalSandbox {
149
149
  }
150
150
  const bootstrapDurationMs = Math.max(0, now() - bootstrapStartedAt);
151
151
  recordLifecycle("terminal-lab.runtime.bootstrapped", bootstrapError
152
- ? `Runtime bootstrap FAILED after ${bootstrapDurationMs}ms: ${bootstrapError}. codex exec runs via npx and needs Node/npm present; the participant fails closed rather than attempting an exec with no runtime.`
152
+ ? `Runtime bootstrap failed after ${bootstrapDurationMs}ms: ${bootstrapError}. codex exec runs through npx and needs Node and npm, so the participant stops here instead of starting codex with no runtime.`
153
153
  : `Runtime bootstrap ensured Node/npm present in ${bootstrapDurationMs}ms (codex exec runs via npx).`);
154
154
  if (bootstrapError) {
155
155
  // Fail closed as a structured route status (never a raw throw): no codex exec is attempted
@@ -259,7 +259,7 @@ export class LiveTerminalSandbox {
259
259
  const setup = await this.sandbox.commands.run(`${uploadAssignment}cd ${SANDBOX_WORKDIR} && ${install}`, {
260
260
  // The install step may run the product itself (release:dogfood's does: `humanish init
261
261
  // --yes`); on the 0.67.0 dogfood that one command arrived unmarked while the participant's
262
- // nine others carried the marker (#546).
262
+ // nine others carried the marker.
263
263
  envs: { HUMANISH_STUDY_PARTICIPANT: "1" },
264
264
  requestTimeoutMs,
265
265
  timeoutMs: PRODUCT_SETUP_TIMEOUT_MS,
@@ -272,7 +272,7 @@ export class LiveTerminalSandbox {
272
272
  setupError = toErrorMessage(error);
273
273
  }
274
274
  recordLifecycle("terminal-lab.product.prepared", setupError
275
- ? `Product setup FAILED after ${Math.max(0, now() - setupStartedAt)}ms: ${sanitize(setupError)}`
275
+ ? `Product setup failed after ${Math.max(0, now() - setupStartedAt)}ms: ${sanitize(setupError)}`
276
276
  : `Product setup completed in ${Math.max(0, now() - setupStartedAt)}ms (no runtime env; declared egress auth may already be available).`);
277
277
  if (setupError) {
278
278
  this.status = "failed";
@@ -292,8 +292,8 @@ export class LiveTerminalSandbox {
292
292
  const { requestTimeoutMs, wallClockMs } = this;
293
293
  // --- The keyed run: `codex exec --json` non-interactively (stdin disabled). ---
294
294
  // openai-env passes the real key here; openai-egress passes an inert placeholder. stdin is
295
- // never wired (safety contract item 7) — commands.run takes no stdin channel. The command's
296
- // wall-clock is bounded by maxMinutes (safety contract item 2): commands.run timeoutMs +
295
+ // never wired: commands.run takes no stdin channel. The command's
296
+ // wall-clock is bounded by maxMinutes: commands.run timeoutMs +
297
297
  // an injected-clock guard so a mock/real run that exceeds it is killed and fails closed.
298
298
  const codexCommand = buildCodexExecCommand({
299
299
  workdir: SANDBOX_WORKDIR,
@@ -312,8 +312,7 @@ export class LiveTerminalSandbox {
312
312
  const result = await runWithWallClock(this.sandbox.commands.run(codexCommand, {
313
313
  // The selected command env (raw key or inert placeholder). The participant
314
314
  // marker rides the same command: humanish telemetry from inside a study reads as a new
315
- // adopter otherwise. #546 added the flag and nothing set it; the 0.66.0 dogfood
316
- // participant's twelve commands arrived unmarked.
315
+ // adopter otherwise.
317
316
  envs: { ...runtimeEnv.envs, HUMANISH_STUDY_PARTICIPANT: "1" },
318
317
  requestTimeoutMs,
319
318
  timeoutMs: wallClockMs,
@@ -404,7 +403,7 @@ export class LiveTerminalSandbox {
404
403
  const { now, sanitize, warnings } = this.inputs;
405
404
  const { recordLifecycle } = this.inputs.recorder;
406
405
  const { requestTimeoutMs } = this;
407
- // --- Safety contract item 8: proven cleanup, by exact id, never Sandbox.list. ---
406
+ // --- Proven cleanup, by exact id, never Sandbox.list. ---
408
407
  this.cleanup = await teardownSandbox({
409
408
  allocation: this.allocation,
410
409
  sandboxModule: this.module,
@@ -439,7 +438,7 @@ function buildCodexExecCommand(args) {
439
438
  // the prompt rides as the final positional arg, shell-quoted. codex exec --json runs once and
440
439
  // exits (no interactive loop). --skip-git-repo-check: the workdir is a fresh scratch dir.
441
440
  // Pinned via npx (never an ambient/preinstalled `codex` binary, which the stock @e2b/desktop
442
- // image does not ship, per issue #159); npm_config_update_notifier=false silences npx's own
441
+ // image does not ship); npm_config_update_notifier=false silences npx's own
443
442
  // update check so it cannot leak into the captured stdout the scorer/redactor parse.
444
443
  const quotedPrompt = shellQuote(args.prompt);
445
444
  // --dangerously-bypass-approvals-and-sandbox: codex's own inner sandbox is
@@ -10,7 +10,7 @@ import { prepareSelectedOutputDirectory } from "../../run/contained-output.js";
10
10
  export async function resolveTerminalPersona(args) {
11
11
  const personaId = args.plan.personaId ?? "autonomous-terminal-agent";
12
12
  const physicalCwd = await realpath(args.cwd);
13
- // Resolve the committed persona so its traits actually shape the agent prompt (#308); fail-safe to
13
+ // Resolve the committed persona so its traits actually shape the agent prompt; fail-safe to
14
14
  // the bare persona id (no traits applied) when no persona file is committed.
15
15
  const projectRoot = await prepareSelectedOutputDirectory(path.dirname(physicalCwd), physicalCwd);
16
16
  const { persona, warnings } = await resolveCommittedPersona(projectRoot, personaId);