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
@@ -8,8 +8,10 @@ import { RUN_BUNDLE_FILE, RUN_BUNDLE_SCHEMA } from "../run/bundle.js";
8
8
  import { isCleanupResult, isRunBundle } from "../run/bundle-shape.js";
9
9
  import { readRunJsonIfExists, readRunTextIfExists, resolveRunPath } from "../run/locate.js";
10
10
  import { isRecord } from "../run/type-guards.js";
11
+ import { runNotFoundMessage } from "../run/run-not-found.js";
11
12
  import { actorVerdictConsistencyFindings, noEngagementActorFindings, validateCodexAppServerEvidence, validateTerminalProductEvidence, } from "./actor.js";
12
13
  import { invalidRunEvidenceReferences, MAX_REPORTED_FINDINGS, missingLocalEvidenceArtifacts, rawScreenshotPostureWarnings, rawScreenshotStreamIds, redactedShapeFramePaths, scanRunPublicSafetyArtifacts, streamScreenshotPaths, } from "./artifacts.js";
14
+ import { flatContextWarnings } from "./context-growth.js";
13
15
  import { runNotFinishedWarnings } from "./liveness.js";
14
16
  import { costAndReceiptFindings } from "./costs.js";
15
17
  import { rerunLineageFindings } from "./rerun.js";
@@ -57,26 +59,16 @@ export function invalidRunStorageVerifyResult(cwd, runInput) {
57
59
  export async function verifyResolvedRun(cwd, runInput, runPaths) {
58
60
  const checks = [];
59
61
  if (!runPaths) {
62
+ const message = await runNotFoundMessage(cwd, runInput);
60
63
  return {
61
64
  schema: VERIFY_SCHEMA,
62
65
  ok: false,
63
66
  cwd,
64
67
  run: runInput,
65
68
  checks,
66
- shareSafety: {
67
- status: "blocked",
68
- reasons: [
69
- {
70
- code: "VERIFY_FAILED",
71
- message: `Run not found: ${runInput}`,
72
- },
73
- ],
74
- },
69
+ shareSafety: { status: "blocked", reasons: [{ code: "VERIFY_FAILED", message }] },
75
70
  warnings: [],
76
- error: {
77
- code: "HUMANISH_RUN_NOT_FOUND",
78
- message: `Run not found: ${runInput}`,
79
- },
71
+ error: { code: "HUMANISH_RUN_NOT_FOUND", message },
80
72
  };
81
73
  }
82
74
  const bundlePath = path.join(runPaths.absoluteRunRoot, RUN_BUNDLE_FILE);
@@ -84,7 +76,10 @@ export async function verifyResolvedRun(cwd, runInput, runPaths) {
84
76
  const cleanupJson = await readRunJsonIfExists(runPaths, "cleanup.json");
85
77
  const reviewJson = await readRunJsonIfExists(runPaths, "review.json");
86
78
  const reviewMarkdown = await readRunTextIfExists(runPaths, "review.md");
87
- checks.push(...bundlePresenceChecks(bundle, reviewJson !== null && reviewMarkdown !== null));
79
+ checks.push(...bundlePresenceChecks(bundle, {
80
+ json: reviewJson !== null,
81
+ markdown: reviewMarkdown !== null,
82
+ }));
88
83
  const derivedPublicSafetyFindings = [];
89
84
  const unscannedArtifacts = [];
90
85
  const publicSafetyFindings = await scanRunPublicSafetyArtifacts(runPaths, derivedPublicSafetyFindings, {
@@ -104,7 +99,7 @@ export async function verifyResolvedRun(cwd, runInput, runPaths) {
104
99
  name: "public-safety scan",
105
100
  ok: publicSafetyFindings.length === 0,
106
101
  message: publicSafetyFindings.length === 0
107
- ? "run text artifacts and public-proof paths must not match known secret or browser-profile patterns"
102
+ ? "no run text artifact or public-proof path matches a known secret or browser-profile pattern"
108
103
  : `public-safety findings: ${publicSafetyFindings.slice(0, 5).join(", ")}`,
109
104
  });
110
105
  const missingEvidenceArtifacts = isRunBundle(bundle)
@@ -118,7 +113,9 @@ export async function verifyResolvedRun(cwd, runInput, runPaths) {
118
113
  name: "local evidence artifacts exist",
119
114
  ok: missingEvidenceArtifacts.length === 0 && invalidEvidenceReferences.length === 0,
120
115
  message: missingEvidenceArtifacts.length === 0 && invalidEvidenceReferences.length === 0
121
- ? "referenced local screenshot/trace/log/filesystem artifacts are present"
116
+ ? isRunBundle(bundle)
117
+ ? "every referenced screenshot, trace, log and filesystem artifact is present"
118
+ : SHAPE_UNCHECKED
122
119
  : invalidEvidenceReferences.length > 0
123
120
  ? `invalid evidence artifact references: ${invalidEvidenceReferences.join(", ")}`
124
121
  : `missing local evidence artifacts: ${missingEvidenceArtifacts.join(", ")}`,
@@ -137,6 +134,7 @@ export async function verifyResolvedRun(cwd, runInput, runPaths) {
137
134
  ...rawScreenshotPostureWarnings(bundle, redactedShapeFrames),
138
135
  ...undeclaredSubjectStateWarnings(bundle),
139
136
  ...desktopGeometryWarnings(bundle),
137
+ ...flatContextWarnings(bundle),
140
138
  ...(await runNotFinishedWarnings(runPaths, bundle)),
141
139
  ]
142
140
  : [];
@@ -189,33 +187,76 @@ export async function verifyRunPrepared(cwdInput, runInput, runPaths) {
189
187
  }
190
188
  return verifyResolvedRun(cwd, runInput, runPaths);
191
189
  }
192
- /** Whether run.json, its schema, shape and redaction, and the review artifacts are present. */
193
- function bundlePresenceChecks(bundle, reviewArtifactsExist) {
190
+ /** The top-level run.json sections the shape guard requires. */
191
+ const REQUIRED_SECTIONS = [
192
+ "source",
193
+ "persona",
194
+ "scenario",
195
+ "lifecycle",
196
+ "simulations",
197
+ "streams",
198
+ "events",
199
+ "artifacts",
200
+ "review",
201
+ "redaction",
202
+ "feedbackCandidates",
203
+ ];
204
+ /**
205
+ * Whether run.json, its schema, shape and redaction, and the review artifacts are present. Each
206
+ * check says what it found, so a failing row never prints the rule it enforces.
207
+ */
208
+ function bundlePresenceChecks(bundle, review) {
209
+ const record = isRecord(bundle) ? bundle : undefined;
210
+ const schema = record?.schema;
211
+ const schemaOk = schema === RUN_BUNDLE_SCHEMA;
212
+ const redactionRecord = record?.redaction;
213
+ const redaction = isRecord(redactionRecord) ? redactionRecord.status : undefined;
214
+ const missingSections = REQUIRED_SECTIONS.filter((key) => record?.[key] === undefined);
215
+ const missingReview = [
216
+ ...(review.json ? [] : ["review.json is missing or not valid JSON"]),
217
+ ...(review.markdown ? [] : ["review.md is missing"]),
218
+ ];
194
219
  return [
195
220
  {
196
221
  name: "run.json exists",
197
222
  ok: bundle !== null,
198
- message: bundle === null ? "run.json missing" : "run.json present",
223
+ message: bundle === null ? "run.json is missing or not valid JSON" : "run.json is present",
199
224
  },
200
225
  {
201
226
  name: "run schema",
202
- ok: isRecord(bundle) && bundle.schema === RUN_BUNDLE_SCHEMA,
203
- message: "run bundle schema is humanish.run-bundle.v1",
227
+ ok: schemaOk,
228
+ message: schemaOk
229
+ ? `run.json declares ${RUN_BUNDLE_SCHEMA}`
230
+ : record === undefined
231
+ ? "no readable run.json, so no schema"
232
+ : `run.json declares ${typeof schema === "string" ? schema : "no schema"}; verify reads ${RUN_BUNDLE_SCHEMA}`,
204
233
  },
205
234
  {
206
235
  name: "run bundle shape",
207
236
  ok: isRunBundle(bundle),
208
- message: "run bundle must include source, persona, scenario, lifecycle, simulations, streams, events, artifacts, review, and feedback candidates",
237
+ message: isRunBundle(bundle)
238
+ ? "run.json has every required section"
239
+ : record === undefined
240
+ ? "no readable run.json, so no sections"
241
+ : missingSections.length > 0
242
+ ? `run.json is missing ${missingSections.join(", ")}`
243
+ : schemaOk
244
+ ? "one or more run.json sections have the wrong shape"
245
+ : "sections not checked, because the schema differs",
209
246
  },
210
247
  {
211
248
  name: "redaction passed",
212
- ok: isRecord(bundle) && isRecord(bundle.redaction) && bundle.redaction.status === "passed",
213
- message: "redaction status must be passed",
249
+ ok: redaction === "passed",
250
+ message: redaction === "passed"
251
+ ? "redaction passed"
252
+ : `redaction did not pass (status: ${typeof redaction === "string" ? redaction : "missing"})`,
214
253
  },
215
254
  {
216
255
  name: "review artifacts exist",
217
- ok: reviewArtifactsExist,
218
- message: "review.json and review.md must exist",
256
+ ok: missingReview.length === 0,
257
+ message: missingReview.length === 0
258
+ ? "review.json and review.md are present"
259
+ : missingReview.join("; "),
219
260
  },
220
261
  ];
221
262
  }
@@ -242,38 +283,46 @@ async function applyAnalysisSharing(runPaths, warnings, shareSafety) {
242
283
  shareSafety.status = "local_only";
243
284
  }
244
285
  /** Passes when `findings` is empty; otherwise lists them after `failLabel`. */
245
- function findingsCheck(name, findings, okMessage, failLabel, failSuffix = "") {
286
+ function findingsCheck(name, findings, okMessage, failLabel) {
246
287
  return {
247
288
  name,
248
289
  ok: findings.length === 0,
249
- message: findings.length === 0 ? okMessage : `${failLabel}: ${findings.join(", ")}${failSuffix}`,
290
+ message: findings.length === 0 ? okMessage : `${failLabel}: ${findings.join(", ")}`,
250
291
  };
251
292
  }
293
+ /**
294
+ * The pass message of a check that reads bundle content when run.json failed its shape guard. The
295
+ * check has no findings and stays ok; the shape check is the failure.
296
+ */
297
+ const SHAPE_UNCHECKED = "not checked, because run.json failed the shape check";
252
298
  /** The bundle-content checks, in report order. A bundle that fails its shape guard has no findings. */
253
299
  async function evidenceChecks(runPaths, bundle, cleanupJson) {
254
300
  const valid = isRunBundle(bundle) ? bundle : null;
301
+ const pass = (message) => (valid ? message : SHAPE_UNCHECKED);
255
302
  const checks = [
256
- findingsCheck("terminal-product evidence", valid ? await validateTerminalProductEvidence(runPaths, valid) : [], "live terminal-product streams either are absent or carry the substrate/cleanup/interventions/cost ledgers + a ledger-derived no-spend proof + redacted terminal evidence, with proven teardown and known spend within the declared cap", "terminal-product findings"),
257
- findingsCheck("codex app-server evidence", valid ? await validateCodexAppServerEvidence(runPaths, valid) : [], "live Codex app-server streams either are absent or include valid redacted trace evidence", "codex app-server findings"),
258
- findingsCheck("actor engagement", valid ? noEngagementActorFindings(valid) : [], "live actor traces that claim goal_satisfied carry at least one action or message", "no-engagement findings", " — a hollow run is not credible evidence"),
259
- findingsCheck("actor verdict consistency", valid ? actorVerdictConsistencyFindings(valid) : [], "live pass verdicts do not hide failed, blocked, or timed-out actor traces", "actor verdict findings"),
260
- findingsCheck("subject state provenance", valid ? subjectStateFindings(valid) : [], "subject state claims match the recorded seed/external evidence (or the subject block is honestly absent)", "subject state findings"),
261
- findingsCheck("shared-world evidence", valid ? sharedWorldEvidenceFindings(valid) : [], "live shared-world runs either are absent or carry well-formed evidence for their mode (concurrent participant windows, state series and outcomes covering every role, or an older run's sequential timeline), single-plane provenance, digest-only checkpoints and the mandatory attributionLimits", "shared-world findings"),
303
+ findingsCheck("terminal-product evidence", valid ? await validateTerminalProductEvidence(runPaths, valid) : [], pass("live terminal-product evidence is complete (ledgers, redacted output, proven teardown, known spend within the cap), or the run has none"), "terminal-product findings"),
304
+ findingsCheck("codex app-server evidence", valid ? await validateCodexAppServerEvidence(runPaths, valid) : [], pass("live Codex app-server traces are valid and redacted, or the run has none"), "codex app-server findings"),
305
+ findingsCheck("actor engagement", valid ? noEngagementActorFindings(valid) : [], pass("every live actor that claims its goal took at least one action or sent a message"), "no-engagement findings"),
306
+ findingsCheck("actor verdict consistency", valid ? actorVerdictConsistencyFindings(valid) : [], pass("no live pass verdict hides a failed, blocked or timed-out actor"), "actor verdict findings"),
307
+ findingsCheck("subject state provenance", valid ? subjectStateFindings(valid) : [], pass("subject state claims match the recorded seed and external evidence, or the run makes none"), "subject state findings"),
308
+ findingsCheck("shared-world evidence", valid ? sharedWorldEvidenceFindings(valid) : [], pass("live shared-world evidence is well formed for its mode, with single-plane provenance, digest-only checkpoints and attributionLimits, or the run has none"), "shared-world findings"),
262
309
  {
263
310
  name: "cleanup receipt",
264
311
  ok: cleanupJson === null || (isCleanupResult(cleanupJson) && cleanupJson.ok),
265
312
  message: cleanupJson === null
266
- ? "cleanup receipt not present; cleanup was not requested"
267
- : isCleanupResult(cleanupJson) && cleanupJson.ok
268
- ? "cleanup receipt is present and successful"
269
- : "cleanup receipt is present but malformed or failed",
313
+ ? "no cleanup.json; cleanup was not requested"
314
+ : !isCleanupResult(cleanupJson)
315
+ ? "cleanup.json is malformed"
316
+ : cleanupJson.ok
317
+ ? "cleanup.json records a successful cleanup"
318
+ : "cleanup.json records a failed cleanup",
270
319
  },
271
- findingsCheck("rerun lineage", valid ? rerunLineageFindings(valid) : [], "rerun bundles either are absent or link selected participants to their prior status and a fan-out rerun event", "rerun lineage findings"),
272
- // Cost is ADVISORY on magnitude, FAIL-CLOSED on labeling/provenance (claims match mechanism).
273
- // Absence PASSES (fail-open on display); a claimed dollar figure without its ratesAsOf date +
274
- // source, or a total that does not match its known lines, FAILS. Magnitude is never inspected —
320
+ findingsCheck("rerun lineage", valid ? rerunLineageFindings(valid) : [], pass("rerun participants link to their prior status and a fan-out rerun event, or this run is not a rerun"), "rerun lineage findings"),
321
+ // Cost is advisory on magnitude and fail-closed on labeling/provenance (claims match mechanism).
322
+ // Absence passes (fail-open on display); a claimed dollar figure without its ratesAsOf date +
323
+ // source, or a total that does not match its known lines, fails. Magnitude is never inspected:
275
324
  // a correctly-labeled huge estimate still passes.
276
- findingsCheck("cost estimate labeling", valid ? costAndReceiptFindings(valid) : [], "cost figures are absent, or every claimed estimate carries its ratesAsOf date + source and the total matches its known lines (estimates never presented as exact)", "cost labeling findings"),
325
+ findingsCheck("cost estimate labeling", valid ? costAndReceiptFindings(valid) : [], pass("every cost estimate carries its ratesAsOf date and source and the total matches its lines, or the run claims no cost"), "cost labeling findings"),
277
326
  ];
278
327
  return checks;
279
328
  }
package/docs/README.md CHANGED
@@ -1,31 +1,17 @@
1
1
  # Find the right doc
2
2
 
3
- Start with the reading order in [CONTRIBUTING.md](../CONTRIBUTING.md#read-these-in-order). This page
4
- sorts everything under `docs/` by what it is for. Nothing here moves files; a folder that holds more
5
- than one kind is split file by file.
3
+ User guides live at [humanish.dev/docs](https://humanish.dev/docs). This page sorts the contributor
4
+ reference under `docs/` by what it is for. To make a first change, start with
5
+ [CONTRIBUTING.md](https://github.com/danielgwilson/humanish/blob/main/CONTRIBUTING.md#make-your-first-change).
6
6
 
7
7
  ## Follow a guide to do a task
8
8
 
9
- - [ramp/README.md](ramp/README.md): current state, how to pick work and the quality bar.
10
- - [architecture/local-browser-runtime.md](architecture/local-browser-runtime.md): run a study in a
11
- local Firecracker browser.
12
- - [architecture/real-email-receiving.md](architecture/real-email-receiving.md) and
13
- [architecture/comms-inbox.md](architecture/comms-inbox.md): give participants real or captured
14
- inboxes.
15
- - [architecture/participant-media.md](architecture/participant-media.md) and
16
- [architecture/desktop-recording.md](architecture/desktop-recording.md): add a camera, speech or
17
- a desktop video.
18
- - [architecture/observer-review.md](architecture/observer-review.md): watch and review a study.
19
- - [architecture/project-layout.md](architecture/project-layout.md): the `humanish/` and
20
- `.humanish/` folders `init` creates.
21
- - [product/lobby-trivia-3player-external-public.md](product/lobby-trivia-3player-external-public.md):
22
- a worked example of the external-public shared-world lab.
23
- - [release/open-source-readiness.md](release/open-source-readiness.md): the release gates and the
24
- publish procedure. Its opening audit is a dated snapshot.
9
+ - [ramp/README.md](https://github.com/danielgwilson/humanish/blob/main/docs/ramp/README.md): current state, how to pick work and the quality bar.
10
+ - [release/publish.md](https://github.com/danielgwilson/humanish/blob/main/docs/release/publish.md): check a release candidate, tag it and publish it.
25
11
 
26
12
  ## Look up what the code does now
27
13
 
28
- - [contracts/](contracts/schemas.md): bundle, lab, policy, feedback, analysis and cost contracts.
14
+ - [contracts/](contracts/README.md): bundle, study, policy, feedback, analysis and cost contracts.
29
15
  Documented fields are API. [contracts/schemas.md](contracts/schemas.md) indexes every schema.
30
16
  - [architecture/observer.md](architecture/observer.md), [architecture/serve.md](architecture/serve.md):
31
17
  the Observer and the run library server.
@@ -33,35 +19,42 @@ than one kind is split file by file.
33
19
  [architecture/browser-control.md](architecture/browser-control.md),
34
20
  [architecture/guest-desktop.md](architecture/guest-desktop.md): hosted desktops, the browser
35
21
  control protocol and the guest runtime.
36
- - [architecture/state-driven-executor.md](architecture/state-driven-executor.md): the `CuaExecutor`
22
+ - [architecture/state-driven-executor.md](architecture/state-driven-executor.md): the `ComputerUseExecutor`
37
23
  library path.
38
24
  - [architecture/task-protocol-support.md](architecture/task-protocol-support.md): which routes
39
- accept `actors[0].tasks`.
25
+ accept `actor.tasks`.
40
26
  - [architecture/external-public-shared-world.md](architecture/external-public-shared-world.md) and
41
27
  [architecture/terminal-product-route.md](architecture/terminal-product-route.md): two routes in
42
- depth. Both keep dated slice notes beside the current rules.
28
+ depth.
43
29
  - [architecture/restricted-codex-analysis.md](architecture/restricted-codex-analysis.md) and
44
30
  [product/automatic-analysis.md](product/automatic-analysis.md): study analysis.
45
- - [release/public-readiness-standard.md](release/public-readiness-standard.md): what may appear in
31
+ - [release/public-readiness-standard.md](https://github.com/danielgwilson/humanish/blob/main/docs/release/public-readiness-standard.md): what may appear in
46
32
  the public repository and the npm package.
47
33
 
48
34
  ## Read why the code is shaped this way
49
35
 
50
- - [principles/](principles/engineering.md): engineering, invariants and defaults, actor fidelity,
51
- the three roles and the self-driving harness.
36
+ - [principles/engineering.md](principles/engineering.md),
37
+ [principles/invariants-and-defaults.md](principles/invariants-and-defaults.md),
38
+ [principles/actor-fidelity.md](principles/actor-fidelity.md),
39
+ [principles/three-roles.md](principles/three-roles.md) and
40
+ [principles/self-driving-harness.md](principles/self-driving-harness.md): engineering,
41
+ invariants and defaults, actor fidelity, the three roles and the self-driving harness.
52
42
  - [decisions/](decisions/README.md): one record per decision, each naming the code or test that
53
43
  enforces it.
54
44
  - [architecture/actor-contract.md](architecture/actor-contract.md) and
55
45
  [architecture/github-feedback-loop.md](architecture/github-feedback-loop.md): design records with
56
46
  their context and open items.
57
- - [product/open-source-install-experience.md](product/open-source-install-experience.md): the
58
- product target for install and first run.
59
47
 
60
- ## Treat these folders as history
48
+ ## Check the current state and the evidence behind it
61
49
 
62
- `goals/`, `plans/` and `roadmap/` hold dated plans, status logs and receipts. They may name files
50
+ - [status.md](https://github.com/danielgwilson/humanish/blob/main/docs/status.md): what ships today, by surface, and the work that is gated.
51
+ - [evidence/](https://github.com/danielgwilson/humanish/blob/main/docs/evidence/README.md): dated study records that the README, the site and these pages
52
+ cite. `docs:check` covers them.
53
+
54
+ ## Treat history as history
55
+
56
+ [history/](https://github.com/danielgwilson/humanish/blob/main/docs/history/README.md) holds dated goal packets, plans and the roadmap. They may name files
63
57
  that have since moved, so `docs:check` skips them (`HISTORY_DIRECTORIES` in
64
- [scripts/lib/doc-paths.ts](../scripts/lib/doc-paths.ts)). One file there is current:
65
- [goals/current.md](goals/current.md), the live status page.
58
+ [scripts/lib/doc-paths.ts](https://github.com/danielgwilson/humanish/blob/main/scripts/lib/doc-paths.ts)).
66
59
 
67
60
  `assets/` holds images that ship in the npm package, such as the README hero.
@@ -1,32 +1,29 @@
1
1
  # Actor Contract
2
2
 
3
- Date: 2026-06-06 (current-state note updated 2026-09-30)
4
-
5
- Status: accepted contract with a partially open extension surface. Shipped: the evidence
6
- schema `humanish.actor-trace.v1` (`src/actors/contract.ts`) and a closed first-party
7
- registry of five descriptors (`src/actors/registry.ts`: `codex-app-server`,
8
- `openai-computer-use`, `local-agent`, `scripted-browser`, `codex-exec`). `actors[0].type`
9
- is a real dispatch key on the computer-use, scripted-browser, and terminal-product routes.
10
- Product scoring, feedback, and artifact hooks are extension seams, but public out-of-tree
11
- actor registration and its conformance certification are not shipped. Also not shipped: the
12
- full `Actor.run(input)` interface, `ApprovalPolicy`, `StagehandCuaActor`, and the
13
- `persona-fidelity` verify check. `RedactionHooks` ships in `src/evidence/redaction.ts`, and
14
- the computer-use loop takes it; the other adapters do not take it yet. Of the capabilities,
15
- routing checks `lanes` and `producesScreenshots` (`src/lab/routing.ts`): an actor that
16
- declares no screenshots cannot run on the computer-use or scripted-browser route. Decision
17
- 6's capture-time screenshot stance was recanted in 0.6.0; see the inline notes and the
3
+ Part of this contract ships and part is still open. Shipped: the evidence schema
4
+ `humanish.actor-trace.v1` (`src/actors/contract.ts`) and a closed first-party registry of five
5
+ descriptors (`src/actors/registry.ts`: `codex-app-server`, `openai-computer-use`, `local-agent`,
6
+ `scripted-browser`, `codex-exec`). `actor.type` is a real dispatch key on the computer-use,
7
+ scripted-browser, and terminal-product routes. Product scoring, feedback, and artifact hooks are
8
+ extension seams, but public out-of-tree actor registration and its conformance certification are not
9
+ shipped. Also not shipped: the full `Actor.run(input)` interface, `ApprovalPolicy`,
10
+ `StagehandCuaActor`, and the `persona-fidelity` verify check. `RedactionHooks` ships in
11
+ `src/evidence/redaction.ts`, and the computer-use loop takes it; the other adapters do not take it
12
+ yet. Of the capabilities, routing checks `lanes` and `producesScreenshots` (`src/lab/routing.ts`):
13
+ an actor that declares no screenshots cannot run on the computer-use or scripted-browser route.
14
+ Decision 6's capture-time screenshot stance was recanted in 0.6.0; see the inline notes and the
18
15
  capture-vs-publish rule in
19
16
  [`docs/principles/invariants-and-defaults.md`](../principles/invariants-and-defaults.md).
20
17
 
21
- `codex-exec` is a real dispatch key for terminal-product labs, but the exported
18
+ `codex-exec` is a real dispatch key for terminal-product studies, but the exported
22
19
  descriptor `runSession` is a fail-closed compatibility entry. Live execution is
23
20
  owned by `runTerminalProductLab`, which coordinates sandbox creation,
24
21
  command-scoped runtime auth, evidence, caps, and by-id cleanup.
25
22
 
26
- #955 removed the `pi-agent-core` and `claude-agent-sdk` descriptors, the `app` run kind and
27
- the `in-process-sdk` protocol. No lab route dispatched either descriptor, and a
28
- lab that names one now fails to parse. A signed-in Claude Code drives computer-use studies
29
- through `local-agent`, which plugs into the provider-neutral `CuaProvider` port
23
+ The `pi-agent-core` and `claude-agent-sdk` descriptors, the `app` run kind and the
24
+ `in-process-sdk` protocol were removed. No study route dispatched either descriptor, and a
25
+ study that names one now fails to parse. A signed-in Claude Code drives computer-use studies
26
+ through `local-agent`, which plugs into the provider-neutral `ComputerUseProvider` port
30
27
  (`src/actors/computer-use/loop/types.ts`, re-exported from `loop.ts`).
31
28
 
32
29
  ## Context
@@ -64,7 +61,7 @@ API surface.
64
61
  Agent SDK, Stagehand). The existing Codex app-server integration is the
65
62
  reference adapter. `pi-agent-core` was planned as the first in-process-SDK
66
63
  adapter to prove both shapes early; it shipped only as a trace mapper with no
67
- route, and #955 removed it.
64
+ route, and was removed.
68
65
 
69
66
  2. **One normalized evidence schema: `humanish.actor-trace.v1`.** Four producers map
70
67
  their records onto one `ActorTrace` with a typed `items[]`:
@@ -81,7 +78,7 @@ API surface.
81
78
  The Codex app-server still writes its own `humanish.codex-app-server-trace.v1` record
82
79
  (`CodexAppServerTrace` in `src/actors/codex/app-server-trace.ts`), which
83
80
  `codexResultToActorTrace` converts. The Claude Agent SDK `ToolUse`/`ToolResult` and pi
84
- `tool_execution_*` mappers went with their adapters in #955.
81
+ `tool_execution_*` mappers were removed with their adapters.
85
82
 
86
83
  3. **A run is multi-turn within one trace; it stops on goal, abandonment, unrecoverable
87
84
  failure, or a wall-clock safety timeout, never on a turn cap.** Turn count is explicitly
@@ -96,7 +93,7 @@ API surface.
96
93
  4. **Redaction is injected once, never re-implemented per adapter.** Every
97
94
  adapter receives `RedactionHooks` (the shared secret/path/prompt-digest
98
95
  redaction, plus screenshot redaction) and must route all persisted evidence
99
- through it. This is also where the remaining consolidation of #107 lands.
96
+ through it.
100
97
 
101
98
  5. **The registry refuses capability mismatches.** Each adapter declares
102
99
  `ActorCapabilities`. A scenario that needs `producesScreenshots` (a GUI
@@ -287,27 +284,27 @@ export interface Actor {
287
284
  public-safe: redacted message, coarse loop phase, last normalized UI action,
288
285
  and last screenshot reference only. Do not persist raw stacks, env values,
289
286
  target URLs, or unredacted provider payloads in the trace.
290
- - **Capabilities.** Declare them honestly. Routing refuses an actor whose `lanes` or
287
+ - **Capabilities.** Declare only what the actor does. Routing refuses an actor whose `lanes` or
291
288
  `producesScreenshots` do not fit the route; the other capabilities are not checked.
292
- - **Cost (estimate vs. charge).** `tokenUsage.costUsd` stays RESERVED for a
289
+ - **Cost (estimate vs. charge).** `tokenUsage.costUsd` stays reserved for a
293
290
  real, provider-returned charge (the codex path); a bare `costUsd`
294
291
  always means "the provider billed this". The optional `estimatedCost`
295
- (`humanish.actor-estimated-cost.v1`) is a SEPARATE, differently-named field: a
292
+ (`humanish.actor-estimated-cost.v1`) is a separate, differently-named field: a
296
293
  token-derived rate-table multiply from the operator-editable `src/run/pricing.ts`,
297
- labeled honestly as an estimate and projected up into `RunBundle.cost` (see
294
+ labeled as an estimate and projected up into `RunBundle.cost` (see
298
295
  [`../contracts/schemas.md`](../contracts/schemas.md) → Run Cost Summary And
299
- Estimated Actor Cost). The CUA lab computes and attaches `estimatedCost` at the
300
- lab boundary before persisting the trace, so the pure computer-use loop never
296
+ Estimated Actor Cost). The CUA study computes and attaches `estimatedCost` at the
297
+ study boundary before persisting the trace, so the pure computer-use loop never
301
298
  depends on the pricing table. An unknown model yields
302
299
  `estimatedCostUsd: null` + a `reason`, never a guessed charge.
303
300
 
304
- ## The scripted-browser route (shipped)
301
+ ## The scripted-browser route
305
302
 
306
303
  `scripted-browser` is the deterministic, model-free browser-actuation route, distinct from
307
304
  `computer-use` (raw pixels + a model deciding actions). The registered
308
305
  `scripted-browser` actor (`src/actors/scripted-browser/`) replays a committed scenario's
309
- browser steps with playwright against a loopback app; the steps ARE the behavior, so
310
- `byoModel: false` means there is NO model, and `tokenUsage` records zeros as an affirmative
306
+ browser steps with playwright against a loopback app; the steps are the behavior, so
307
+ `byoModel: false` means there is no model, and `tokenUsage` records zeros as an affirmative
311
308
  $0 declaration that is true by mechanism (no provider client is importable from that code
312
309
  path). Its trace keeps the concrete driver name `provider: "browser-persona"` (matching the
313
310
  native `humanish.browser-persona-trace.v1` it also emits) with `protocol: "scripted-steps"`.
@@ -322,16 +319,16 @@ has no persona patience and no approvals.
322
319
 
323
320
  ### The time budget vs. a stuck timeout (`budget_reached`)
324
321
 
325
- `execution.timeoutMs` is a GENEROUS wall-clock SAFETY cap, not a goal. An open-ended
322
+ `execution.timeoutMs` is a generous wall-clock safety cap, not a goal. An open-ended
326
323
  "watch it play" session has no success predicate, because productive play is the outcome. So
327
324
  the computer-use loop distinguishes two ways to hit the cap:
328
325
 
329
- - **`budget_reached`**: the deadline was reached AFTER at least one material (non-idle)
326
+ - **`budget_reached`**: the deadline was reached after at least one material (non-idle)
330
327
  action, or a spend, adapter or token limit ended the session. This maps to `ActorStatus:
331
328
  "incomplete"`: the participant did not reach the goal, and the harness did not fail.
332
329
  `participantOutcomeOk` is false, the verdict is `fail`, and the CLI exits `2`. The trace
333
330
  `reason` and optional `stopCause` say which limit ended the session.
334
- - **`timed_out`**: the deadline was reached with ZERO material actions (a hung provider, an
331
+ - **`timed_out`**: the deadline was reached with zero material actions (a hung provider, an
335
332
  idle-only stall). This maps to `ActorStatus: "timed_out"`, `participantOutcomeOk` is false, the
336
333
  verdict is `timed_out`, and the CLI exits `2`.
337
334
 
@@ -342,7 +339,7 @@ switch with no default, so a new completion reason forces a compile-time decisio
342
339
  status. ~30 min (`1_800_000`) is a reasonable default for open-ended watch; the persona
343
340
  still stops early on `goal_satisfied`/`gave_up`/`stopWhen`.
344
341
 
345
- Actuation-vs-spend gate: on the scripted lab route `scenario.mode: live` is still required
342
+ Actuation-vs-spend gate: on the scripted route `mode: live` is still required
346
343
  even though provider spend is $0 by mechanism. The gate's justification there is actuation,
347
344
  not cost: a live scripted run drives a real browser against a real running app
348
345
  (state-mutating effects on the operator's app), which deserves the same affirmative
@@ -351,8 +348,8 @@ this paragraph is the record of that decision.
351
348
 
352
349
  ## Optional closing report
353
350
 
354
- `CuaProvider.debrief` is an optional read-only request after a structured
355
- `stopWhen` or dwell stop. It returns a `CuaTurn` with `closingReport` containing
351
+ `ComputerUseProvider.debrief` is an optional read-only request after a structured
352
+ `stopWhen` or dwell stop. It returns a `ComputerUseTurn` with `closingReport` containing
356
353
  `summary` and `frictionReports`; an empty friction list is valid. The loop rejects
357
354
  actions, pending safety checks, and invalid report shapes. It redacts accepted
358
355
  reports, records them in `ActorTrace.debrief`, and projects one readable message
@@ -367,39 +364,40 @@ from interaction turns, and reported usage contributes to aggregate cost.
367
364
 
368
365
  The OpenAI implementation makes one request with tools disabled and structured
369
366
  output; no HTTP or policy retries. Stateless/ZDR mode does not offer retrospective
370
- reporting because it does not retain the required session history. The
371
- [paired live receipt](https://github.com/danielgwilson/humanish/blob/main/docs/goals/computer-use-actor/receipts/structured-closing-report-2026-09-05.md)
367
+ reporting: its client-carried conversation summarizes its oldest turns past a token
368
+ budget, so it may not hold the whole session a retrospective report needs. The
369
+ [paired live receipt](https://github.com/danielgwilson/humanish/blob/main/docs/evidence/computer-use/structured-closing-report-2026-09-05.md)
372
370
  records both report recovery and control failures in the separate legacy parser.
373
371
 
374
- ## The state-driven executor seam (shipped)
372
+ ## The state-driven executor seam
375
373
 
376
- The `CuaExecutor` / `CuaProvider` ports are the concrete realization of the "plural harnesses /
374
+ The `ComputerUseExecutor` / `ComputerUseProvider` ports are the concrete realization of the "plural harnesses /
377
375
  transport-agnostic" intent above: the computer-use loop does not require a screen or a vision
378
376
  model. A library caller can drive an **already-running local app** through its in-process JS
379
- contract (`window.app.getState()` etc.) with a custom `CuaExecutor` (screenshot optional,
380
- `appState` as the progress signal) paired with a **non-vision** `CuaProvider` (`requiresFrame`
381
- falsey), keeping the whole lab composition with NO E2B desktop and NO clone. See
377
+ contract (`window.app.getState()` etc.) with a custom `ComputerUseExecutor` (screenshot optional,
378
+ `appState` as the progress signal) paired with a **non-vision** `ComputerUseProvider` (`requiresFrame`
379
+ falsey), keeping the whole study composition with no E2B desktop and no clone. See
382
380
  [`state-driven-executor.md`](./state-driven-executor.md) for the port, both entry points
383
- (`runComputerUseLoop` and `runLab` + `inProcess`/`createProvider`), the `subject.source:
381
+ (`runComputerUseLoop` and `runStudy` + `inProcess`/`createProvider`), the `subject.source:
384
382
  local-app` config surface, the `requiresFrame` provider-authoring contract, and the
385
383
  appState-is-runtime-only stance.
386
384
 
387
- ## The product-adapter extension seam (shipped in the terminal-product route, layer 6)
385
+ ## The product-adapter extension seam
388
386
 
389
- The terminal-product route carries the proof-roadmap layer-6 deliverable: a product adopter
390
- attaches product-specific scoring + feedback as a THIN in-repo extension WITHOUT forking
387
+ The terminal-product route has a product-adapter extension seam: a product adopter
388
+ attaches product-specific scoring + feedback as a thin in-repo extension without forking
391
389
  core. The seam is exported contract types (`RunBundle`, `RunFeedbackCandidate`,
392
390
  `RunAdapterScore`, `ActorTrace`, `AdapterScorerModule` and the terminal-route
393
- `TerminalProductScoringContext`) plus a registrable scorer module, `RunLabOptions.scorer`,
391
+ `TerminalProductScoringContext`) plus a registrable scorer module, `RunStudyOptions.scorer`,
394
392
  with optional `score` and `deriveFeedback`. The older `terminalHooks` and `cuaHooks` bags were
395
- removed from `RunLabOptions`. The adapter records its product nouns ONLY
396
- under an adapter-NAMESPACED block (`RunFeedbackCandidate.adapter` /
393
+ removed from `RunStudyOptions`. The adapter records its product nouns only
394
+ under an adapter-namespaced block (`RunFeedbackCandidate.adapter` /
397
395
  `RunAdapterScore.{namespace,data}`), so core's enums stay product-agnostic: no adopter noun
398
396
  is hardcoded into a core enum. Default (no hook) behavior is unchanged. See
399
- [`terminal-product-route.md`](./terminal-product-route.md#slice-4-the-product-adapter-extension-seam-layer-6)
397
+ [`terminal-product-route.md`](./terminal-product-route.md#the-product-adapter-extension-seam)
400
398
  for the full seam and the thin-adapter conformance proof.
401
399
 
402
- ## Making personas load-bearing
400
+ ## Making personas change the actor's behavior
403
401
 
404
402
  The original bug, now fixed: `loadDryRunInputs` (`src/run/dry-run-inputs.ts`) parsed
405
403
  persona YAML down to `{ id, name, source, sourceDigest }` and discarded `summary`,
@@ -459,7 +457,7 @@ traits: { patience, skill, accessibilityNeeds? }, constraints[], sourceDigest }`
459
457
  - Stagehand remains roadmap. This rule once planned a pi binding (`systemPrompt` +
460
458
  `beforeToolCall`) and a Claude Agent SDK one (`systemPrompt` + `allowedTools`). pi
461
459
  shipped only as a trace mapper, the Claude Agent SDK descriptor never had a route, and
462
- #955 removed both.
460
+ both were removed.
463
461
 
464
462
  None of these uses a `max_turns`-style cap as the persona stop condition.
465
463
 
@@ -513,7 +511,7 @@ Non-obvious tradeoffs to revisit with real-run data:
513
511
  - `persona-fidelity` treats a `gave_up` with no cited friction as a fidelity
514
512
  failure, not an accepted stop, so the model cannot quietly quit for no reason.
515
513
 
516
- This keeps patience load-bearing and reproducible without ever using elapsed
514
+ So patience decides when a run stops, reproducibly, without ever using elapsed
517
515
  turns as a stop signal.
518
516
 
519
517
  ## Capability matrix (target adapters)
@@ -525,41 +523,12 @@ turns as a stop signal.
525
523
  | claude-agent-sdk (removed) | yes (SDK + `-p` stream-json) | typed ToolUse/ToolResult + cost | OS sandbox + dontAsk/allowedTools | Anthropic-centric | SDK MIT (CLI proprietary) | code, app |
526
524
  | stagehand-cua (roadmap, not shipped; `openai-computer-use` is the shipped computer-use actor) | yes (SDK, mode:'cua') | structured results + replay | Playwright/Browserbase isolation | OpenAI/Anthropic/Google | MIT | computer-use |
527
525
 
528
- ## Sequencing
529
-
530
- 1. This document.
531
- 2. Shared `RedactionHooks` module (completes the remaining #107 criterion) plus
532
- the `Actor` contract types, with the Codex integration refactored to implement
533
- `Actor` and emit `ActorTrace` behind the back-compat alias. Add an
534
- `actorRegistry`; generalize `RunStream.codex` to `RunStream.actor`.
535
- 3. Personas load-bearing: `ResolvedPersona`, `personaToDirectives`, harness turn
536
- budget, and the `persona-fidelity` verify check.
537
- 4. `pi-agent-core` adapter (proves the contract against a non-Codex protocol;
538
- local-model dogfood for ~$0). Landed in two slices: first the pure
539
- `piSessionToActorTrace` mapper + registry generalization (discriminated
540
- `ActorDescriptor` union + `getActor` overloads) + a fixture conformance test,
541
- with no pi dependency and no model key required (proves the evidence contract
542
- is provider-neutral); then a follow-up live SDK shim behind a DI seam, deferred
543
- until the package identity (`@earendil-works/pi-agent-core` vs
544
- `@mariozechner/pi-coding-agent`) and the Node `>=22.19` vs engines `>=20` gap
545
- are pinned against an installed build. The live shim never landed, and #955
546
- removed the mapper-only descriptor because no route dispatched it.
547
- 5. `claude-agent-sdk` adapter (the `app` run kind). It shipped as a descriptor with
548
- a live session but no route, and #955 removed it along with the `app` run kind.
549
- 6. Computer-use route. (Shipped as `openai-computer-use`: registered 0.3.0,
550
- lab-dispatched 0.4.0; `stagehand-cua` as a multi-provider front remains
551
- not-yet-shipped roadmap.)
552
- 7. Cross-harness conformance test: one persona x scenario through every adapter,
553
- asserting identical trace shape, completion vocabulary, and redaction status.
554
- 8. The proof point: run the harness-plural loop against popular OSS repos and turn
555
- real, merged issues into the receipt.
556
-
557
526
  ## Risks
558
527
 
559
528
  - Protocol/version drift across four moving harnesses. Pin every binary/SDK and
560
529
  assert the init handshake; the registry refuses an actor whose declared
561
530
  capabilities do not satisfy the scenario.
562
- - Screenshot PII in the computer-use route. Redaction binds the PUBLISH
531
+ - Screenshot PII in the computer-use route. Redaction binds the publish
563
532
  boundary, not capture (0.6.0): raw frames stay local in gitignored
564
533
  `.humanish/` and are never emitted by a publish command (this repo's CI
565
534
  binary-asset scan also blocks them from commit);
@@ -578,4 +547,4 @@ turns as a stop signal.
578
547
 
579
548
  - Self-driving harness principles: `docs/principles/self-driving-harness.md`.
580
549
  - Observer architecture: `docs/architecture/observer.md`.
581
- - Related issues: shared redaction module (#107), PII/PHI detector (#108).
550
+ - Open issue: [a PII/PHI detector for the redaction gate](https://github.com/danielgwilson/humanish/issues/108).