humanish 0.105.0 → 0.106.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.
- package/AGENTS.md +89 -94
- package/ARCHITECTURE.md +146 -0
- package/CHANGELOG.md +502 -0
- package/CONTEXT.md +51 -0
- package/CONTRIBUTING.md +111 -9
- package/README.md +213 -124
- package/SECURITY.md +1 -1
- package/TELEMETRY.md +112 -0
- package/dist/actors/affordance.d.ts +56 -0
- package/dist/actors/affordance.js +155 -0
- package/dist/actors/agent-session.js +42 -0
- package/dist/actors/codex/app-server-actor-trace.d.ts +11 -0
- package/dist/actors/codex/app-server-actor-trace.js +211 -0
- package/dist/actors/codex/app-server-client.d.ts +39 -0
- package/dist/actors/codex/app-server-client.js +116 -0
- package/dist/actors/codex/app-server-trace.d.ts +154 -0
- package/dist/actors/codex/app-server-trace.js +424 -0
- package/dist/actors/codex/app-server-ui.d.ts +40 -0
- package/dist/actors/codex/app-server-ui.js +328 -0
- package/dist/actors/codex/app-server.d.ts +44 -0
- package/dist/actors/codex/app-server.js +268 -0
- package/dist/actors/codex/qualified-versions.d.ts +45 -0
- package/dist/actors/codex/qualified-versions.js +87 -0
- package/dist/actors/codex/restricted-executable.d.ts +17 -0
- package/dist/actors/codex/restricted-executable.js +147 -0
- package/dist/actors/codex/restricted-launch.d.ts +116 -0
- package/dist/actors/codex/restricted-launch.js +222 -0
- package/dist/actors/codex/restricted-participant-policy.d.ts +46 -0
- package/dist/actors/codex/restricted-participant-policy.js +82 -0
- package/dist/actors/codex/restricted-participant.d.ts +20 -0
- package/dist/actors/codex/restricted-participant.js +432 -0
- package/dist/actors/codex/restricted-policy.d.ts +70 -0
- package/dist/actors/codex/restricted-policy.js +326 -0
- package/dist/actors/codex/restricted-session.d.ts +65 -0
- package/dist/actors/codex/restricted-session.js +432 -0
- package/dist/actors/codex/restricted-transport.d.ts +73 -0
- package/dist/actors/codex/restricted-transport.js +335 -0
- package/dist/actors/codex/restricted-turn.d.ts +62 -0
- package/dist/actors/codex/restricted-turn.js +284 -0
- package/dist/actors/computer-use/actor.d.ts +77 -0
- package/dist/actors/computer-use/actor.js +78 -0
- package/dist/actors/computer-use/admission-limit.d.ts +12 -0
- package/dist/actors/computer-use/admission-limit.js +19 -0
- package/dist/actors/computer-use/executor-error.js +48 -0
- package/dist/actors/computer-use/loop/actions.d.ts +26 -0
- package/dist/actors/computer-use/loop/actions.js +245 -0
- package/dist/actors/computer-use/loop/backstop.d.ts +42 -0
- package/dist/actors/computer-use/loop/backstop.js +202 -0
- package/dist/actors/computer-use/loop/debrief.d.ts +19 -0
- package/dist/actors/computer-use/loop/debrief.js +164 -0
- package/dist/actors/computer-use/loop/ending.d.ts +86 -0
- package/dist/actors/computer-use/loop/ending.js +316 -0
- package/dist/actors/computer-use/loop/observation.d.ts +55 -0
- package/dist/actors/computer-use/loop/observation.js +246 -0
- package/dist/actors/computer-use/loop/output-limit.d.ts +11 -0
- package/dist/actors/computer-use/loop/output-limit.js +21 -0
- package/dist/actors/computer-use/loop/provider-call.d.ts +19 -0
- package/dist/actors/computer-use/loop/provider-call.js +208 -0
- package/dist/actors/computer-use/loop/race.d.ts +34 -0
- package/dist/actors/computer-use/loop/race.js +79 -0
- package/dist/actors/computer-use/loop/session.d.ts +77 -0
- package/dist/actors/computer-use/loop/session.js +135 -0
- package/dist/actors/computer-use/loop/spend.d.ts +30 -0
- package/dist/actors/computer-use/loop/spend.js +85 -0
- package/dist/actors/computer-use/loop/trace.d.ts +35 -0
- package/dist/actors/computer-use/loop/trace.js +140 -0
- package/dist/actors/computer-use/loop/types.d.ts +404 -0
- package/dist/actors/computer-use/loop/types.js +1 -0
- package/dist/actors/computer-use/loop/usage.d.ts +102 -0
- package/dist/actors/computer-use/loop/usage.js +355 -0
- package/dist/actors/computer-use/loop.d.ts +11 -0
- package/dist/actors/computer-use/loop.js +248 -0
- package/dist/actors/computer-use/openai-provider.d.ts +107 -0
- package/dist/actors/computer-use/openai-provider.js +472 -0
- package/dist/actors/computer-use/openai-requests.d.ts +35 -0
- package/dist/actors/computer-use/openai-requests.js +74 -0
- package/dist/actors/computer-use/openai-wire.d.ts +67 -0
- package/dist/actors/computer-use/openai-wire.js +365 -0
- package/dist/actors/computer-use/provider-error.d.ts +27 -0
- package/dist/actors/computer-use/provider-error.js +86 -0
- package/dist/actors/computer-use/speech.js +6 -0
- package/dist/actors/contract.d.ts +315 -0
- package/dist/actors/contract.js +201 -0
- package/dist/actors/goal-source.js +38 -0
- package/dist/actors/local-agent/claude-session.d.ts +43 -0
- package/dist/actors/local-agent/claude-session.js +370 -0
- package/dist/actors/local-agent/cli.d.ts +115 -0
- package/dist/actors/local-agent/cli.js +413 -0
- package/dist/actors/local-agent/readiness.d.ts +31 -0
- package/dist/actors/local-agent/readiness.js +45 -0
- package/dist/actors/openai-endpoint.d.ts +2 -0
- package/dist/actors/openai-endpoint.js +2 -0
- package/dist/actors/output-token-limit.js +4 -0
- package/dist/actors/reasoning-effort.js +33 -0
- package/dist/actors/registry.d.ts +59 -0
- package/dist/actors/registry.js +89 -0
- package/dist/actors/scripted-browser/actor.d.ts +49 -0
- package/dist/actors/scripted-browser/actor.js +428 -0
- package/dist/actors/scripted-browser/browser-command.d.ts +1 -0
- package/dist/actors/scripted-browser/browser-command.js +48 -0
- package/dist/actors/scripted-browser/journey.d.ts +9 -0
- package/dist/actors/scripted-browser/journey.js +171 -0
- package/dist/actors/scripted-browser/steps.d.ts +60 -0
- package/dist/actors/scripted-browser/steps.js +384 -0
- package/dist/actors/scripted-browser/types.d.ts +135 -0
- package/dist/actors/scripted-browser/types.js +26 -0
- package/dist/actors/stop-cause.d.ts +9 -0
- package/dist/actors/stop-cause.js +42 -0
- package/dist/actors/stop-conditions.d.ts +40 -0
- package/dist/actors/stop-conditions.js +65 -0
- package/dist/analysis/automatic-completion.d.ts +38 -0
- package/dist/analysis/automatic-completion.js +90 -0
- package/dist/analysis/automatic-config.d.ts +41 -0
- package/dist/analysis/automatic-config.js +135 -0
- package/dist/analysis/automatic.d.ts +17 -0
- package/dist/analysis/automatic.js +279 -0
- package/dist/analysis/codex-config.d.ts +8 -0
- package/dist/analysis/codex-config.js +69 -0
- package/dist/analysis/evidence-sources.d.ts +23 -0
- package/dist/analysis/evidence-sources.js +251 -0
- package/dist/analysis/evidence.d.ts +18 -0
- package/dist/analysis/evidence.js +482 -0
- package/dist/analysis/execute.d.ts +52 -0
- package/dist/analysis/execute.js +504 -0
- package/dist/analysis/image-tokens.d.ts +1 -0
- package/dist/analysis/image-tokens.js +41 -0
- package/dist/analysis/job.d.ts +97 -0
- package/dist/analysis/job.js +311 -0
- package/dist/analysis/load.d.ts +3 -0
- package/dist/analysis/load.js +11 -0
- package/dist/analysis/provider.d.ts +57 -0
- package/dist/analysis/provider.js +227 -0
- package/dist/analysis/restricted-codex.d.ts +19 -0
- package/dist/analysis/restricted-codex.js +23 -0
- package/dist/analysis/service.d.ts +72 -0
- package/dist/analysis/service.js +399 -0
- package/dist/analysis/sharing.d.ts +11 -0
- package/dist/analysis/sharing.js +44 -0
- package/dist/analysis/store-executions.d.ts +27 -0
- package/dist/analysis/store-executions.js +224 -0
- package/dist/analysis/store.d.ts +31 -0
- package/dist/analysis/store.js +315 -0
- package/dist/analysis/types.d.ts +217 -0
- package/dist/analysis/types.js +12 -0
- package/dist/analysis/validation.d.ts +225 -0
- package/dist/analysis/validation.js +562 -0
- package/dist/browser-control/client.d.ts +18 -0
- package/dist/browser-control/client.js +239 -0
- package/dist/browser-control/dispatcher.d.ts +19 -0
- package/dist/browser-control/dispatcher.js +221 -0
- package/dist/browser-control/protocol.d.ts +492 -0
- package/dist/browser-control/protocol.js +360 -0
- package/dist/browser-control/recording-transfer.d.ts +3 -0
- package/dist/browser-control/recording-transfer.js +48 -0
- package/dist/browser-control/transport.d.ts +27 -0
- package/dist/browser-control/transport.js +189 -0
- package/dist/cli/commands/analysis-signals.d.ts +7 -0
- package/dist/cli/commands/analysis-signals.js +25 -0
- package/dist/cli/commands/analyze.d.ts +3 -0
- package/dist/cli/commands/analyze.js +212 -0
- package/dist/cli/commands/codex.d.ts +3 -0
- package/dist/cli/commands/codex.js +145 -0
- package/dist/cli/commands/comms.d.ts +3 -0
- package/dist/cli/commands/comms.js +225 -0
- package/dist/cli/commands/feedback.d.ts +3 -0
- package/dist/cli/commands/feedback.js +138 -0
- package/dist/cli/commands/lab-format.d.ts +8 -0
- package/dist/cli/commands/lab-format.js +105 -0
- package/dist/cli/commands/lab-route-computer-use.d.ts +20 -0
- package/dist/cli/commands/lab-route-computer-use.js +251 -0
- package/dist/cli/commands/lab-route-open.d.ts +27 -0
- package/dist/cli/commands/lab-route-open.js +37 -0
- package/dist/cli/commands/lab-route-preview.d.ts +20 -0
- package/dist/cli/commands/lab-route-preview.js +74 -0
- package/dist/cli/commands/lab-route-run.d.ts +17 -0
- package/dist/cli/commands/lab-route-run.js +31 -0
- package/dist/cli/commands/lab-route-scripted.d.ts +19 -0
- package/dist/cli/commands/lab-route-scripted.js +50 -0
- package/dist/cli/commands/lab-route-shared-world.d.ts +20 -0
- package/dist/cli/commands/lab-route-shared-world.js +135 -0
- package/dist/cli/commands/lab-route-terminal.d.ts +19 -0
- package/dist/cli/commands/lab-route-terminal.js +49 -0
- package/dist/cli/commands/lab-run.d.ts +9 -0
- package/dist/cli/commands/lab-run.js +166 -0
- package/dist/cli/commands/lab-scorer.d.ts +30 -0
- package/dist/cli/commands/lab-scorer.js +17 -0
- package/dist/cli/commands/lab.d.ts +3 -0
- package/dist/cli/commands/lab.js +193 -0
- package/dist/cli/commands/observe.d.ts +4 -0
- package/dist/cli/commands/observe.js +345 -0
- package/dist/cli/commands/runs.d.ts +11 -0
- package/dist/cli/commands/runs.js +314 -0
- package/dist/cli/commands/setup.d.ts +11 -0
- package/dist/cli/commands/setup.js +325 -0
- package/dist/cli/commands/tui.d.ts +32 -0
- package/dist/cli/commands/tui.js +305 -0
- package/dist/cli/commands/watch.d.ts +3 -0
- package/dist/cli/commands/watch.js +245 -0
- package/dist/cli/doctor.d.ts +39 -0
- package/dist/cli/doctor.js +263 -0
- package/dist/cli/first-run-path.d.ts +67 -0
- package/dist/cli/first-run-path.js +150 -0
- package/dist/cli/io.d.ts +85 -0
- package/dist/cli/io.js +232 -0
- package/dist/cli/observer-follow.d.ts +56 -0
- package/dist/cli/observer-follow.js +160 -0
- package/dist/cli/orientation.d.ts +30 -0
- package/dist/cli/orientation.js +114 -0
- package/dist/cli/program.d.ts +15 -0
- package/dist/cli/program.js +338 -0
- package/dist/cli/secret-prompt.js +39 -0
- package/dist/cli/telemetry.js +351 -0
- package/dist/cli.js +2 -4
- package/dist/comms/agentmail.d.ts +29 -0
- package/dist/comms/agentmail.js +568 -0
- package/dist/comms/capture-surface.d.ts +54 -0
- package/dist/comms/capture-surface.js +468 -0
- package/dist/comms/catch-host.d.ts +52 -0
- package/dist/comms/catch-host.js +192 -0
- package/dist/comms/connections.d.ts +20 -0
- package/dist/comms/connections.js +116 -0
- package/dist/comms/email-catch.d.ts +49 -0
- package/dist/comms/email-catch.js +236 -0
- package/dist/comms/extract.d.ts +7 -0
- package/dist/comms/extract.js +65 -0
- package/dist/comms/fake-inbox.d.ts +39 -0
- package/dist/comms/fake-inbox.js +136 -0
- package/dist/comms/images.d.ts +7 -0
- package/dist/comms/images.js +53 -0
- package/dist/comms/lease-store.d.ts +91 -0
- package/dist/comms/lease-store.js +600 -0
- package/dist/comms/providers.d.ts +30 -0
- package/dist/comms/providers.js +24 -0
- package/dist/comms/receiving-common.d.ts +17 -0
- package/dist/comms/receiving-common.js +82 -0
- package/dist/comms/receiving-evidence.d.ts +4 -0
- package/dist/comms/receiving-evidence.js +59 -0
- package/dist/comms/receiving-recovery.d.ts +22 -0
- package/dist/comms/receiving-recovery.js +100 -0
- package/dist/comms/receiving-render.d.ts +16 -0
- package/dist/comms/receiving-render.js +409 -0
- package/dist/comms/receiving-runtime.d.ts +41 -0
- package/dist/comms/receiving-runtime.js +66 -0
- package/dist/comms/receiving-surface.d.ts +8 -0
- package/dist/comms/receiving-surface.js +156 -0
- package/dist/comms/receiving-types.d.ts +122 -0
- package/dist/comms/receiving-types.js +3 -0
- package/dist/comms/receiving.d.ts +33 -0
- package/dist/comms/receiving.js +508 -0
- package/dist/comms/sandbox-catch-script.d.ts +16 -0
- package/dist/comms/sandbox-catch-script.js +331 -0
- package/dist/comms/sandbox-catch.d.ts +214 -0
- package/dist/comms/sandbox-catch.js +451 -0
- package/dist/comms/setup.d.ts +65 -0
- package/dist/comms/setup.js +259 -0
- package/dist/comms/thread-evidence.d.ts +28 -0
- package/dist/comms/thread-evidence.js +30 -0
- package/dist/comms/types.d.ts +76 -0
- package/dist/comms/types.js +8 -0
- package/dist/deprecated.d.ts +90 -0
- package/dist/deprecated.js +106 -0
- package/dist/evidence/browser-hygiene.js +42 -0
- package/dist/evidence/desktop-recorder.d.ts +39 -0
- package/dist/evidence/desktop-recorder.js +340 -0
- package/dist/evidence/desktop-recording-artifact.d.ts +5 -0
- package/dist/evidence/desktop-recording-artifact.js +53 -0
- package/dist/evidence/desktop-recording-types.d.ts +27 -0
- package/dist/evidence/desktop-recording-types.js +16 -0
- package/dist/evidence/encoded-text.d.ts +27 -0
- package/dist/evidence/encoded-text.js +243 -0
- package/dist/evidence/frame-signature.d.ts +17 -0
- package/dist/evidence/frame-signature.js +111 -0
- package/dist/evidence/image.d.ts +24 -0
- package/dist/evidence/image.js +170 -0
- package/dist/evidence/plain-text.d.ts +8 -0
- package/dist/evidence/plain-text.js +16 -0
- package/dist/evidence/redaction.d.ts +110 -0
- package/dist/evidence/redaction.js +329 -0
- package/dist/feedback/draft.d.ts +58 -0
- package/dist/feedback/draft.js +309 -0
- package/dist/feedback/export-bundle.d.ts +6 -0
- package/dist/feedback/export-bundle.js +585 -0
- package/dist/feedback/export.d.ts +50 -0
- package/dist/feedback/export.js +392 -0
- package/dist/feedback/feedback.d.ts +37 -0
- package/dist/feedback/feedback.js +282 -0
- package/dist/feedback/proof.d.ts +8 -0
- package/dist/feedback/proof.js +56 -0
- package/dist/guest/bootstrap.d.ts +55 -0
- package/dist/guest/bootstrap.js +348 -0
- package/dist/guest/browser-tools.d.ts +8 -0
- package/dist/guest/browser-tools.js +72 -0
- package/dist/guest/chromium-text.d.ts +62 -0
- package/dist/guest/chromium-text.js +386 -0
- package/dist/guest/desktop-executor.d.ts +57 -0
- package/dist/guest/desktop-executor.js +256 -0
- package/dist/guest/desktop-keys.d.ts +8 -0
- package/dist/guest/desktop-keys.js +89 -0
- package/dist/guest/desktop-media.d.ts +70 -0
- package/dist/guest/desktop-media.js +385 -0
- package/dist/guest/desktop-native.d.ts +14 -0
- package/dist/guest/desktop-native.js +156 -0
- package/dist/guest/media-config.d.ts +15 -0
- package/dist/guest/media-config.js +16 -0
- package/dist/guest/runtime-desktop.d.ts +45 -0
- package/dist/guest/runtime-desktop.js +420 -0
- package/dist/guest/runtime-processes.d.ts +28 -0
- package/dist/guest/runtime-processes.js +94 -0
- package/dist/guest/runtime.d.ts +31 -0
- package/dist/guest/runtime.js +124 -0
- package/dist/guest-media-worker.js +184 -48
- package/dist/guest-runtime-main.js +23 -10
- package/dist/guest-runtime-revision.js +1 -1
- package/dist/index.d.ts +32 -83
- package/dist/index.js +21 -42
- package/dist/keys/env-file.d.ts +15 -0
- package/dist/keys/env-file.js +109 -0
- package/dist/keys/key-resolution.d.ts +58 -0
- package/dist/keys/key-resolution.js +389 -0
- package/dist/lab/adapter-extension.d.ts +75 -0
- package/dist/lab/adapter-extension.js +253 -0
- package/dist/lab/adapter-scorer-loader.d.ts +43 -0
- package/dist/lab/adapter-scorer-loader.js +130 -0
- package/dist/lab/bag-overrides.d.ts +18 -0
- package/dist/lab/bag-overrides.js +121 -0
- package/dist/lab/composition-rules.d.ts +5 -0
- package/dist/lab/composition-rules.js +283 -0
- package/dist/lab/config.d.ts +7 -0
- package/dist/lab/config.js +208 -0
- package/dist/lab/device-presets.d.ts +97 -0
- package/dist/lab/device-presets.js +87 -0
- package/dist/lab/discover.d.ts +65 -0
- package/dist/lab/discover.js +422 -0
- package/dist/lab/doctor.d.ts +39 -0
- package/dist/lab/doctor.js +233 -0
- package/dist/lab/init-paths.d.ts +5 -0
- package/dist/lab/init-paths.js +89 -0
- package/dist/lab/init-plan.d.ts +20 -0
- package/dist/lab/init-plan.js +163 -0
- package/dist/lab/init-templates.d.ts +28 -0
- package/dist/lab/init-templates.js +416 -0
- package/dist/lab/init.d.ts +39 -0
- package/dist/lab/init.js +287 -0
- package/dist/lab/keys.d.ts +2 -0
- package/dist/lab/keys.js +264 -0
- package/dist/lab/parse/actors.d.ts +14 -0
- package/dist/lab/parse/actors.js +453 -0
- package/dist/lab/parse/comms.d.ts +12 -0
- package/dist/lab/parse/comms.js +246 -0
- package/dist/lab/parse/execution.d.ts +19 -0
- package/dist/lab/parse/execution.js +356 -0
- package/dist/lab/parse/subject-state.d.ts +30 -0
- package/dist/lab/parse/subject-state.js +179 -0
- package/dist/lab/parse/subject.d.ts +9 -0
- package/dist/lab/parse/subject.js +420 -0
- package/dist/lab/parse/values.d.ts +17 -0
- package/dist/lab/parse/values.js +65 -0
- package/dist/lab/participant-assignment.d.ts +12 -0
- package/dist/lab/participant-assignment.js +19 -0
- package/dist/lab/persona-resolve.d.ts +39 -0
- package/dist/lab/persona-resolve.js +118 -0
- package/dist/lab/persona.d.ts +39 -0
- package/dist/lab/persona.js +192 -0
- package/dist/lab/plan-base.d.ts +24 -0
- package/dist/lab/plan-base.js +113 -0
- package/dist/lab/plan-participants.d.ts +81 -0
- package/dist/lab/plan-participants.js +92 -0
- package/dist/lab/plan-types.d.ts +269 -0
- package/dist/lab/plan-types.js +5 -0
- package/dist/lab/plan.d.ts +27 -0
- package/dist/lab/plan.js +156 -0
- package/dist/lab/preflight-probes.d.ts +3 -0
- package/dist/lab/preflight-probes.js +312 -0
- package/dist/lab/preflight-result.d.ts +7 -0
- package/dist/lab/preflight-result.js +43 -0
- package/dist/lab/preflight.d.ts +95 -0
- package/dist/lab/preflight.js +117 -0
- package/dist/lab/route-inputs.d.ts +17 -0
- package/dist/lab/route-inputs.js +95 -0
- package/dist/lab/routing.d.ts +81 -0
- package/dist/lab/routing.js +214 -0
- package/dist/lab/run-lab-events.d.ts +69 -0
- package/dist/lab/run-lab-events.js +95 -0
- package/dist/lab/run-lab-options.d.ts +82 -0
- package/dist/lab/run-lab-options.js +399 -0
- package/dist/lab/summary.d.ts +60 -0
- package/dist/lab/summary.js +168 -0
- package/dist/lab/tasks.d.ts +91 -0
- package/dist/lab/tasks.js +139 -0
- package/dist/lab/types.d.ts +813 -0
- package/dist/lab/types.js +6 -0
- package/dist/lab/validation.d.ts +67 -0
- package/dist/lab/validation.js +387 -0
- package/dist/lab/warnings.d.ts +2 -0
- package/dist/lab/warnings.js +338 -0
- package/dist/observer/artifact.d.ts +23 -0
- package/dist/observer/artifact.js +235 -0
- package/dist/observer/data.d.ts +115 -0
- package/dist/observer/data.js +258 -0
- package/dist/observer/exposure.d.ts +64 -0
- package/dist/observer/exposure.js +143 -0
- package/dist/observer/http.js +50 -0
- package/dist/observer/library.js +190 -0
- package/dist/observer/listen.js +85 -0
- package/dist/observer/live.d.ts +9 -0
- package/dist/observer/live.js +25 -0
- package/dist/observer/pinned-files.d.ts +30 -0
- package/dist/observer/pinned-files.js +160 -0
- package/dist/observer/render.d.ts +69 -0
- package/dist/observer/render.js +350 -0
- package/dist/observer/run-inventory.d.ts +35 -0
- package/dist/observer/run-inventory.js +95 -0
- package/dist/observer/run-routes.d.ts +37 -0
- package/dist/observer/run-routes.js +373 -0
- package/dist/observer/serve.d.ts +97 -0
- package/dist/observer/serve.js +305 -0
- package/dist/observer/static.js +369 -0
- package/dist/observer/tunnel.js +112 -0
- package/dist/observer-app.html +9 -20
- package/dist/routes/computer-use/bundle-parts.d.ts +50 -0
- package/dist/routes/computer-use/bundle-parts.js +177 -0
- package/dist/routes/computer-use/bundle.d.ts +56 -0
- package/dist/routes/computer-use/bundle.js +184 -0
- package/dist/routes/computer-use/diagnostics.d.ts +38 -0
- package/dist/routes/computer-use/diagnostics.js +94 -0
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +65 -0
- package/dist/routes/computer-use/e2b-desktop/comms.js +225 -0
- package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +3 -0
- package/dist/routes/computer-use/e2b-desktop/desktop.js +91 -0
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +65 -0
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +156 -0
- package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +18 -0
- package/dist/routes/computer-use/e2b-desktop/prepare.js +198 -0
- package/dist/routes/computer-use/e2b-desktop/start.d.ts +14 -0
- package/dist/routes/computer-use/e2b-desktop/start.js +193 -0
- package/dist/routes/computer-use/e2b-desktop/state.d.ts +65 -0
- package/dist/routes/computer-use/e2b-desktop/state.js +69 -0
- package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +6 -0
- package/dist/routes/computer-use/e2b-desktop/teardown.js +152 -0
- package/dist/routes/computer-use/external-comms.d.ts +20 -0
- package/dist/routes/computer-use/external-comms.js +55 -0
- package/dist/routes/computer-use/fanout-bundle.d.ts +11 -0
- package/dist/routes/computer-use/fanout-bundle.js +274 -0
- package/dist/routes/computer-use/fanout-lanes.d.ts +15 -0
- package/dist/routes/computer-use/fanout-lanes.js +302 -0
- package/dist/routes/computer-use/in-process-desktop.d.ts +17 -0
- package/dist/routes/computer-use/in-process-desktop.js +40 -0
- package/dist/routes/computer-use/lanes.d.ts +35 -0
- package/dist/routes/computer-use/lanes.js +321 -0
- package/dist/routes/computer-use/legacy-lane-spec.d.ts +62 -0
- package/dist/routes/computer-use/legacy-lane-spec.js +39 -0
- package/dist/routes/computer-use/live-flush.d.ts +42 -0
- package/dist/routes/computer-use/live-flush.js +154 -0
- package/dist/routes/computer-use/local-tree-pack.d.ts +27 -0
- package/dist/routes/computer-use/local-tree-pack.js +47 -0
- package/dist/routes/computer-use/local-vm.d.ts +20 -0
- package/dist/routes/computer-use/local-vm.js +218 -0
- package/dist/routes/computer-use/participant-desktop.d.ts +63 -0
- package/dist/routes/computer-use/participant-desktop.js +33 -0
- package/dist/routes/computer-use/participant-facts.d.ts +6 -0
- package/dist/routes/computer-use/participant-facts.js +22 -0
- package/dist/routes/computer-use/participant-model.d.ts +30 -0
- package/dist/routes/computer-use/participant-model.js +222 -0
- package/dist/routes/computer-use/participant-prompt.d.ts +53 -0
- package/dist/routes/computer-use/participant-prompt.js +87 -0
- package/dist/routes/computer-use/participant-runs.d.ts +67 -0
- package/dist/routes/computer-use/participant-runs.js +255 -0
- package/dist/routes/computer-use/plan.d.ts +56 -0
- package/dist/routes/computer-use/plan.js +308 -0
- package/dist/routes/computer-use/preflight.d.ts +26 -0
- package/dist/routes/computer-use/preflight.js +85 -0
- package/dist/routes/computer-use/rerun-selection.d.ts +19 -0
- package/dist/routes/computer-use/rerun-selection.js +121 -0
- package/dist/routes/computer-use/result.d.ts +7 -0
- package/dist/routes/computer-use/result.js +292 -0
- package/dist/routes/computer-use/route.d.ts +33 -0
- package/dist/routes/computer-use/route.js +145 -0
- package/dist/routes/computer-use/run-lanes.d.ts +59 -0
- package/dist/routes/computer-use/run-lanes.js +135 -0
- package/dist/routes/computer-use/self-report.d.ts +21 -0
- package/dist/routes/computer-use/self-report.js +231 -0
- package/dist/routes/computer-use/setup.d.ts +136 -0
- package/dist/routes/computer-use/setup.js +371 -0
- package/dist/routes/computer-use/single-bundle.d.ts +97 -0
- package/dist/routes/computer-use/single-bundle.js +393 -0
- package/dist/routes/computer-use/subject-projection.d.ts +51 -0
- package/dist/routes/computer-use/subject-projection.js +159 -0
- package/dist/routes/computer-use/types.d.ts +539 -0
- package/dist/routes/computer-use/types.js +37 -0
- package/dist/routes/preview.d.ts +13 -0
- package/dist/routes/preview.js +36 -0
- package/dist/routes/scripted/bundle.d.ts +47 -0
- package/dist/routes/scripted/bundle.js +195 -0
- package/dist/routes/scripted/plan.d.ts +30 -0
- package/dist/routes/scripted/plan.js +95 -0
- package/dist/routes/scripted/result.d.ts +48 -0
- package/dist/routes/scripted/result.js +176 -0
- package/dist/routes/scripted/route.d.ts +28 -0
- package/dist/routes/scripted/route.js +218 -0
- package/dist/routes/scripted/scenario.d.ts +21 -0
- package/dist/routes/scripted/scenario.js +102 -0
- package/dist/routes/scripted/session-result.d.ts +8 -0
- package/dist/routes/scripted/session-result.js +60 -0
- package/dist/routes/scripted/setup.d.ts +45 -0
- package/dist/routes/scripted/setup.js +126 -0
- package/dist/routes/scripted/subject.d.ts +49 -0
- package/dist/routes/scripted/subject.js +156 -0
- package/dist/routes/scripted/surface-records.d.ts +26 -0
- package/dist/routes/scripted/surface-records.js +88 -0
- package/dist/routes/scripted/surface-sessions.d.ts +13 -0
- package/dist/routes/scripted/surface-sessions.js +40 -0
- package/dist/routes/scripted/types.d.ts +88 -0
- package/dist/routes/scripted/types.js +3 -0
- package/dist/routes/shared-world/bundle.d.ts +20 -0
- package/dist/routes/shared-world/bundle.js +446 -0
- package/dist/routes/shared-world/checkpoints.d.ts +25 -0
- package/dist/routes/shared-world/checkpoints.js +46 -0
- package/dist/routes/shared-world/comms.d.ts +68 -0
- package/dist/routes/shared-world/comms.js +176 -0
- package/dist/routes/shared-world/external-public.d.ts +21 -0
- package/dist/routes/shared-world/external-public.js +130 -0
- package/dist/routes/shared-world/handoff.d.ts +62 -0
- package/dist/routes/shared-world/handoff.js +348 -0
- package/dist/routes/shared-world/lobby-code.d.ts +25 -0
- package/dist/routes/shared-world/lobby-code.js +152 -0
- package/dist/routes/shared-world/plan.d.ts +27 -0
- package/dist/routes/shared-world/plan.js +174 -0
- package/dist/routes/shared-world/provenance.d.ts +27 -0
- package/dist/routes/shared-world/provenance.js +65 -0
- package/dist/routes/shared-world/provisioned.d.ts +57 -0
- package/dist/routes/shared-world/provisioned.js +505 -0
- package/dist/routes/shared-world/result.d.ts +18 -0
- package/dist/routes/shared-world/result.js +327 -0
- package/dist/routes/shared-world/route.d.ts +21 -0
- package/dist/routes/shared-world/route.js +277 -0
- package/dist/routes/shared-world/seat-records.d.ts +20 -0
- package/dist/routes/shared-world/seat-records.js +213 -0
- package/dist/routes/shared-world/seats.d.ts +38 -0
- package/dist/routes/shared-world/seats.js +208 -0
- package/dist/routes/shared-world/setup.d.ts +48 -0
- package/dist/routes/shared-world/setup.js +200 -0
- package/dist/routes/shared-world/types.d.ts +354 -0
- package/dist/routes/shared-world/types.js +29 -0
- package/dist/routes/terminal/adapter.d.ts +37 -0
- package/dist/routes/terminal/adapter.js +201 -0
- package/dist/routes/terminal/bundle.d.ts +79 -0
- package/dist/routes/terminal/bundle.js +305 -0
- package/dist/routes/terminal/credentials.d.ts +34 -0
- package/dist/routes/terminal/credentials.js +102 -0
- package/dist/routes/terminal/dry-run.d.ts +24 -0
- package/dist/routes/terminal/dry-run.js +157 -0
- package/dist/routes/terminal/encoding.js +79 -0
- package/dist/routes/terminal/ledger.d.ts +49 -0
- package/dist/routes/terminal/ledger.js +170 -0
- package/dist/routes/terminal/lifetime.d.ts +10 -0
- package/dist/routes/terminal/lifetime.js +22 -0
- package/dist/routes/terminal/live-finish.d.ts +31 -0
- package/dist/routes/terminal/live-finish.js +215 -0
- package/dist/routes/terminal/live-sandbox.d.ts +69 -0
- package/dist/routes/terminal/live-sandbox.js +452 -0
- package/dist/routes/terminal/persona.d.ts +20 -0
- package/dist/routes/terminal/persona.js +34 -0
- package/dist/routes/terminal/plan.d.ts +21 -0
- package/dist/routes/terminal/plan.js +115 -0
- package/dist/routes/terminal/recorder.d.ts +23 -0
- package/dist/routes/terminal/recorder.js +77 -0
- package/dist/routes/terminal/result.d.ts +47 -0
- package/dist/routes/terminal/result.js +114 -0
- package/dist/routes/terminal/route.d.ts +23 -0
- package/dist/routes/terminal/route.js +170 -0
- package/dist/routes/terminal/runtime-auth.d.ts +12 -0
- package/dist/routes/terminal/runtime-auth.js +23 -0
- package/dist/routes/terminal/runtime.d.ts +14 -0
- package/dist/routes/terminal/runtime.js +47 -0
- package/dist/routes/terminal/sandbox.d.ts +35 -0
- package/dist/routes/terminal/sandbox.js +126 -0
- package/dist/routes/terminal/session.d.ts +25 -0
- package/dist/routes/terminal/session.js +199 -0
- package/dist/routes/terminal/token-usage.d.ts +15 -0
- package/dist/routes/terminal/token-usage.js +93 -0
- package/dist/routes/terminal/trace.d.ts +40 -0
- package/dist/routes/terminal/trace.js +172 -0
- package/dist/routes/terminal/types.d.ts +342 -0
- package/dist/routes/terminal/types.js +31 -0
- package/dist/run/bundle-shape.d.ts +7 -0
- package/dist/run/bundle-shape.js +369 -0
- package/dist/run/bundle.d.ts +547 -0
- package/dist/run/bundle.js +44 -0
- package/dist/run/concurrency.js +24 -0
- package/dist/run/contained-output.d.ts +50 -0
- package/dist/run/contained-output.js +351 -0
- package/dist/run/cost-summary.d.ts +28 -0
- package/dist/run/cost-summary.js +213 -0
- package/dist/run/costs.js +140 -0
- package/dist/run/detail.d.ts +62 -0
- package/dist/run/detail.js +139 -0
- package/dist/run/dry-run-inputs.d.ts +9 -0
- package/dist/run/dry-run-inputs.js +90 -0
- package/dist/run/dry-run.d.ts +6 -0
- package/dist/run/dry-run.js +362 -0
- package/dist/run/feedback-shape.d.ts +7 -0
- package/dist/run/feedback-shape.js +89 -0
- package/dist/run/git-state.d.ts +35 -0
- package/dist/run/git-state.js +316 -0
- package/dist/run/git-workspace.d.ts +32 -0
- package/dist/run/git-workspace.js +450 -0
- package/dist/run/judge.d.ts +210 -0
- package/dist/run/judge.js +240 -0
- package/dist/run/locate.d.ts +22 -0
- package/dist/run/locate.js +122 -0
- package/dist/run/outcomes.d.ts +31 -0
- package/dist/run/outcomes.js +210 -0
- package/dist/run/participant-records.d.ts +28 -0
- package/dist/run/participant-records.js +63 -0
- package/dist/run/participant.d.ts +29 -0
- package/dist/run/participant.js +12 -0
- package/dist/run/paths.d.ts +79 -0
- package/dist/run/paths.js +356 -0
- package/dist/run/preflight-receipts.d.ts +46 -0
- package/dist/run/preflight-receipts.js +173 -0
- package/dist/run/pricing.d.ts +124 -0
- package/dist/run/pricing.js +298 -0
- package/dist/run/project.d.ts +8 -0
- package/dist/run/project.js +103 -0
- package/dist/run/projection.d.ts +184 -0
- package/dist/run/projection.js +356 -0
- package/dist/run/reclaim.d.ts +41 -0
- package/dist/run/reclaim.js +183 -0
- package/dist/run/results.d.ts +88 -0
- package/dist/run/results.js +3 -0
- package/dist/run/run-index.d.ts +107 -0
- package/dist/run/run-index.js +243 -0
- package/dist/run/run.d.ts +103 -0
- package/dist/run/run.js +199 -0
- package/dist/run/sandbox-receipts.d.ts +31 -0
- package/dist/run/sandbox-receipts.js +49 -0
- package/dist/run/shared-world-evidence.d.ts +220 -0
- package/dist/run/shared-world-evidence.js +49 -0
- package/dist/run/shared-world-shape.d.ts +26 -0
- package/dist/run/shared-world-shape.js +181 -0
- package/dist/run/stats.d.ts +82 -0
- package/dist/run/stats.js +258 -0
- package/dist/run/status.d.ts +111 -0
- package/dist/run/status.js +176 -0
- package/dist/run/stored-runs.d.ts +38 -0
- package/dist/run/stored-runs.js +273 -0
- package/dist/run/stream-shape.d.ts +4 -0
- package/dist/run/stream-shape.js +160 -0
- package/dist/run/streams.d.ts +257 -0
- package/dist/run/streams.js +12 -0
- package/dist/run/study-files.d.ts +35 -0
- package/dist/run/study-files.js +164 -0
- package/dist/run/terminal-contract.d.ts +25 -0
- package/dist/run/terminal-contract.js +47 -0
- package/dist/run/text.d.ts +2 -0
- package/dist/run/text.js +4 -0
- package/dist/run/transient-comms-secrets.js +72 -0
- package/dist/run/type-guards.d.ts +6 -0
- package/dist/run/type-guards.js +18 -0
- package/dist/run-lab.d.ts +110 -0
- package/dist/run-lab.js +148 -0
- package/dist/subject/clone.d.ts +37 -0
- package/dist/subject/clone.js +62 -0
- package/dist/subject/desktop-cli.d.ts +17 -0
- package/dist/subject/desktop-cli.js +51 -0
- package/dist/subject/local-tree-archive.d.ts +82 -0
- package/dist/subject/local-tree-archive.js +431 -0
- package/dist/subject/local-tree.d.ts +28 -0
- package/dist/subject/local-tree.js +58 -0
- package/dist/subject/node-bootstrap.d.ts +12 -0
- package/dist/subject/node-bootstrap.js +66 -0
- package/dist/subject/runtime.d.ts +13 -0
- package/dist/subject/runtime.js +50 -0
- package/dist/subject/serve.d.ts +39 -0
- package/dist/subject/serve.js +249 -0
- package/dist/subject/state.d.ts +23 -0
- package/dist/subject/state.js +58 -0
- package/dist/subject/steps.d.ts +37 -0
- package/dist/subject/steps.js +39 -0
- package/dist/substrates/command-failure.d.ts +23 -0
- package/dist/substrates/command-failure.js +45 -0
- package/dist/substrates/desktop-session.d.ts +41 -0
- package/dist/substrates/desktop-session.js +59 -0
- package/dist/substrates/detached.d.ts +55 -0
- package/dist/substrates/detached.js +139 -0
- package/dist/substrates/e2b/cdp-probe.d.ts +99 -0
- package/dist/substrates/e2b/cdp-probe.js +556 -0
- package/dist/substrates/e2b/desktop-browser.d.ts +81 -0
- package/dist/substrates/e2b/desktop-browser.js +410 -0
- package/dist/substrates/e2b/desktop-cdp.d.ts +77 -0
- package/dist/substrates/e2b/desktop-cdp.js +211 -0
- package/dist/substrates/e2b/desktop-executor.d.ts +92 -0
- package/dist/substrates/e2b/desktop-executor.js +302 -0
- package/dist/substrates/e2b/desktop-geometry.d.ts +83 -0
- package/dist/substrates/e2b/desktop-geometry.js +331 -0
- package/dist/substrates/e2b/desktop-media.d.ts +29 -0
- package/dist/substrates/e2b/desktop-media.js +151 -0
- package/dist/substrates/e2b/desktop-recording.d.ts +18 -0
- package/dist/substrates/e2b/desktop-recording.js +238 -0
- package/dist/substrates/e2b/desktop-resources.d.ts +11 -0
- package/dist/substrates/e2b/desktop-resources.js +35 -0
- package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +15 -0
- package/dist/substrates/e2b/desktop-screenshot-cleanup.js +66 -0
- package/dist/substrates/e2b/lifetime.d.ts +12 -0
- package/dist/substrates/e2b/lifetime.js +18 -0
- package/dist/substrates/e2b/sandbox.d.ts +102 -0
- package/dist/substrates/e2b/sandbox.js +202 -0
- package/dist/substrates/e2b/sdk.d.ts +194 -0
- package/dist/substrates/e2b/sdk.js +168 -0
- package/dist/substrates/e2b/shell.d.ts +10 -0
- package/dist/substrates/e2b/shell.js +61 -0
- package/dist/substrates/local/captured-inbox.d.ts +6 -0
- package/dist/substrates/local/captured-inbox.js +87 -0
- package/dist/substrates/local/firecracker-desktop.d.ts +25 -0
- package/dist/substrates/local/firecracker-desktop.js +315 -0
- package/dist/substrates/local/runtime-config.d.ts +6 -0
- package/dist/substrates/local/runtime-config.js +91 -0
- package/dist/substrates/local/runtime-host.d.ts +30 -0
- package/dist/substrates/local/runtime-host.js +143 -0
- package/dist/substrates/local/runtime-release.d.ts +5 -0
- package/dist/substrates/local/runtime-release.js +32 -0
- package/dist/substrates/local/runtime-ssh.d.ts +9 -0
- package/dist/substrates/local/runtime-ssh.js +129 -0
- package/dist/substrates/local/runtime.d.ts +25 -0
- package/dist/substrates/local/runtime.js +190 -0
- package/dist/substrates/shell.d.ts +44 -0
- package/dist/substrates/shell.js +22 -0
- package/dist/tui/actions.d.ts +39 -0
- package/dist/tui/actions.js +203 -0
- package/dist/tui/contract.d.ts +144 -0
- package/dist/tui/contract.js +52 -0
- package/dist/tui/launch.js +172 -0
- package/dist/tui/project.d.ts +10 -0
- package/dist/tui/project.js +17 -0
- package/dist/tui-app.js +125 -125
- package/dist/verify/actor.d.ts +27 -0
- package/dist/verify/actor.js +292 -0
- package/dist/verify/artifacts.d.ts +47 -0
- package/dist/verify/artifacts.js +373 -0
- package/dist/verify/costs.d.ts +30 -0
- package/dist/verify/costs.js +129 -0
- package/dist/verify/liveness.d.ts +7 -0
- package/dist/verify/liveness.js +72 -0
- package/dist/verify/rerun.d.ts +3 -0
- package/dist/verify/rerun.js +46 -0
- package/dist/verify/shared-world-concurrent.d.ts +11 -0
- package/dist/verify/shared-world-concurrent.js +346 -0
- package/dist/verify/shared-world.d.ts +8 -0
- package/dist/verify/shared-world.js +295 -0
- package/dist/verify/subject.d.ts +17 -0
- package/dist/verify/subject.js +123 -0
- package/dist/verify/verify.d.ts +34 -0
- package/dist/verify/verify.js +333 -0
- package/docs/README.md +67 -0
- package/docs/architecture/actor-contract.md +215 -174
- package/docs/architecture/browser-control.md +51 -37
- package/docs/architecture/comms-inbox.md +8 -8
- package/docs/architecture/desktop-recording.md +2 -2
- package/docs/architecture/desktop-sessions.md +33 -21
- package/docs/architecture/external-public-shared-world.md +80 -64
- package/docs/architecture/github-feedback-loop.md +40 -27
- package/docs/architecture/guest-desktop.md +22 -10
- package/docs/architecture/local-browser-runtime.md +30 -21
- package/docs/architecture/observer-review.md +9 -9
- package/docs/architecture/observer.md +53 -57
- package/docs/architecture/participant-media.md +3 -3
- package/docs/architecture/project-layout.md +33 -137
- package/docs/architecture/real-email-receiving.md +7 -6
- package/docs/architecture/restricted-codex-analysis.md +211 -25
- package/docs/architecture/serve.md +89 -87
- package/docs/architecture/state-driven-executor.md +79 -64
- package/docs/architecture/task-protocol-support.md +18 -18
- package/docs/architecture/terminal-product-lane.md +92 -86
- package/docs/contracts/adapter-admission.md +8 -4
- package/docs/contracts/adapter-fixtures.md +6 -6
- package/docs/contracts/core.md +22 -24
- package/docs/contracts/feedback.md +33 -23
- package/docs/contracts/policy.md +28 -31
- package/docs/contracts/run-bundle.md +168 -82
- package/docs/contracts/schemas.md +563 -379
- package/docs/contracts/study-analysis.md +2 -2
- package/docs/contracts/study-costs.md +12 -12
- package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +36 -0
- package/docs/decisions/0002-observer-is-one-self-contained-file.md +30 -0
- package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +35 -0
- package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +31 -0
- package/docs/decisions/README.md +16 -0
- package/docs/goals/current.md +22 -50
- package/docs/principles/actor-fidelity.md +37 -40
- package/docs/principles/engineering.md +81 -0
- package/docs/principles/invariants-and-defaults.md +48 -45
- package/docs/principles/self-driving-harness.md +11 -10
- package/docs/principles/three-roles.md +12 -13
- package/docs/product/automatic-analysis.md +39 -9
- package/docs/product/lobby-trivia-3player-external-public.md +14 -13
- package/docs/product/open-source-install-experience.md +34 -38
- package/docs/ramp/README.md +91 -218
- package/docs/release/open-source-readiness.md +5 -2
- package/docs/release/public-readiness-standard.md +1 -1
- package/examples/README.md +11 -0
- package/examples/participant/README.md +80 -0
- package/examples/participant/app.mjs +55 -0
- package/examples/participant/run.mjs +116 -0
- package/examples/scorer/README.md +29 -0
- package/examples/scorer/run.mjs +63 -0
- package/examples/scorer/scorer.mjs +20 -0
- package/package.json +61 -57
- package/skills/humanish/SKILL.md +72 -60
- package/skills/humanish/agents/openai.yaml +2 -2
- package/dist/actor-contract.d.ts +0 -296
- package/dist/actor-contract.js +0 -340
- package/dist/actor-contract.js.map +0 -1
- package/dist/actor-goal-source.js +0 -32
- package/dist/actor-goal-source.js.map +0 -1
- package/dist/actor-registry.d.ts +0 -77
- package/dist/actor-registry.js +0 -106
- package/dist/actor-registry.js.map +0 -1
- package/dist/actor-stop-cause.d.ts +0 -9
- package/dist/actor-stop-cause.js +0 -42
- package/dist/actor-stop-cause.js.map +0 -1
- package/dist/adapter-extension.d.ts +0 -76
- package/dist/adapter-extension.js +0 -273
- package/dist/adapter-extension.js.map +0 -1
- package/dist/adapter-scorer-loader.d.ts +0 -42
- package/dist/adapter-scorer-loader.js +0 -129
- package/dist/adapter-scorer-loader.js.map +0 -1
- package/dist/affordance.d.ts +0 -53
- package/dist/affordance.js +0 -145
- package/dist/affordance.js.map +0 -1
- package/dist/agent-session.js +0 -43
- package/dist/agent-session.js.map +0 -1
- package/dist/argv.d.ts +0 -1
- package/dist/argv.js +0 -8
- package/dist/argv.js.map +0 -1
- package/dist/artifact-reference.d.ts +0 -22
- package/dist/artifact-reference.js +0 -47
- package/dist/artifact-reference.js.map +0 -1
- package/dist/automatic-analysis-completion.d.ts +0 -25
- package/dist/automatic-analysis-completion.js +0 -56
- package/dist/automatic-analysis-completion.js.map +0 -1
- package/dist/automatic-analysis-config.d.ts +0 -38
- package/dist/automatic-analysis-config.js +0 -68
- package/dist/automatic-analysis-config.js.map +0 -1
- package/dist/automatic-study-analysis.d.ts +0 -17
- package/dist/automatic-study-analysis.js +0 -195
- package/dist/automatic-study-analysis.js.map +0 -1
- package/dist/browser-control-client.d.ts +0 -18
- package/dist/browser-control-client.js +0 -176
- package/dist/browser-control-client.js.map +0 -1
- package/dist/browser-control-dispatcher.d.ts +0 -19
- package/dist/browser-control-dispatcher.js +0 -147
- package/dist/browser-control-dispatcher.js.map +0 -1
- package/dist/browser-control-protocol.d.ts +0 -472
- package/dist/browser-control-protocol.js +0 -185
- package/dist/browser-control-protocol.js.map +0 -1
- package/dist/browser-control-recording-transfer.d.ts +0 -4
- package/dist/browser-control-recording-transfer.js +0 -42
- package/dist/browser-control-recording-transfer.js.map +0 -1
- package/dist/browser-control-transport.d.ts +0 -27
- package/dist/browser-control-transport.js +0 -177
- package/dist/browser-control-transport.js.map +0 -1
- package/dist/browser-evidence-hygiene.js +0 -43
- package/dist/browser-evidence-hygiene.js.map +0 -1
- package/dist/chrome-cdp-probe.d.ts +0 -97
- package/dist/chrome-cdp-probe.js +0 -536
- package/dist/chrome-cdp-probe.js.map +0 -1
- package/dist/claude-agent-sdk.d.ts +0 -94
- package/dist/claude-agent-sdk.js +0 -367
- package/dist/claude-agent-sdk.js.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/codex-app-server-ui.d.ts +0 -39
- package/dist/codex-app-server-ui.js +0 -357
- package/dist/codex-app-server-ui.js.map +0 -1
- package/dist/codex-app-server.d.ts +0 -144
- package/dist/codex-app-server.js +0 -754
- package/dist/codex-app-server.js.map +0 -1
- package/dist/command-failure.d.ts +0 -43
- package/dist/command-failure.js +0 -73
- package/dist/command-failure.js.map +0 -1
- package/dist/comms-agentmail.d.ts +0 -25
- package/dist/comms-agentmail.js +0 -418
- package/dist/comms-agentmail.js.map +0 -1
- package/dist/comms-catch-host.d.ts +0 -52
- package/dist/comms-catch-host.js +0 -178
- package/dist/comms-catch-host.js.map +0 -1
- package/dist/comms-connections.d.ts +0 -52
- package/dist/comms-connections.js +0 -123
- package/dist/comms-connections.js.map +0 -1
- package/dist/comms-email-catch.d.ts +0 -54
- package/dist/comms-email-catch.js +0 -212
- package/dist/comms-email-catch.js.map +0 -1
- package/dist/comms-evidence.d.ts +0 -27
- package/dist/comms-evidence.js +0 -31
- package/dist/comms-evidence.js.map +0 -1
- package/dist/comms-fake-inbox.d.ts +0 -45
- package/dist/comms-fake-inbox.js +0 -184
- package/dist/comms-fake-inbox.js.map +0 -1
- package/dist/comms-images.d.ts +0 -7
- package/dist/comms-images.js +0 -39
- package/dist/comms-images.js.map +0 -1
- package/dist/comms-inbox.d.ts +0 -66
- package/dist/comms-inbox.js +0 -389
- package/dist/comms-inbox.js.map +0 -1
- package/dist/comms-lease-store.d.ts +0 -91
- package/dist/comms-lease-store.js +0 -495
- package/dist/comms-lease-store.js.map +0 -1
- package/dist/comms-receiving-evidence.d.ts +0 -46
- package/dist/comms-receiving-evidence.js +0 -35
- package/dist/comms-receiving-evidence.js.map +0 -1
- package/dist/comms-receiving-inbox.d.ts +0 -16
- package/dist/comms-receiving-inbox.js +0 -410
- package/dist/comms-receiving-inbox.js.map +0 -1
- package/dist/comms-receiving-runtime.d.ts +0 -25
- package/dist/comms-receiving-runtime.js +0 -45
- package/dist/comms-receiving-runtime.js.map +0 -1
- package/dist/comms-receiving-types.d.ts +0 -98
- package/dist/comms-receiving-types.js +0 -2
- package/dist/comms-receiving-types.js.map +0 -1
- package/dist/comms-receiving.d.ts +0 -58
- package/dist/comms-receiving.js +0 -554
- package/dist/comms-receiving.js.map +0 -1
- package/dist/comms-sandbox-catch.d.ts +0 -229
- package/dist/comms-sandbox-catch.js +0 -737
- package/dist/comms-sandbox-catch.js.map +0 -1
- package/dist/comms-setup.d.ts +0 -40
- package/dist/comms-setup.js +0 -121
- package/dist/comms-setup.js.map +0 -1
- package/dist/comms-types.d.ts +0 -72
- package/dist/comms-types.js +0 -10
- package/dist/comms-types.js.map +0 -1
- package/dist/computer-use-actor.d.ts +0 -76
- package/dist/computer-use-actor.js +0 -68
- package/dist/computer-use-actor.js.map +0 -1
- package/dist/computer-use.d.ts +0 -429
- package/dist/computer-use.js +0 -1751
- package/dist/computer-use.js.map +0 -1
- package/dist/concurrency.js +0 -27
- package/dist/concurrency.js.map +0 -1
- package/dist/concurrent-shared-world-lab.d.ts +0 -186
- package/dist/concurrent-shared-world-lab.js +0 -2181
- package/dist/concurrent-shared-world-lab.js.map +0 -1
- package/dist/core/git-state.d.ts +0 -33
- package/dist/core/git-state.js +0 -277
- package/dist/core/git-state.js.map +0 -1
- package/dist/core/git-workspace.d.ts +0 -31
- package/dist/core/git-workspace.js +0 -447
- package/dist/core/git-workspace.js.map +0 -1
- package/dist/core/index.d.ts +0 -4
- package/dist/core/index.js +0 -3
- package/dist/core/index.js.map +0 -1
- package/dist/core/run-primitives.d.ts +0 -66
- package/dist/core/run-primitives.js +0 -120
- package/dist/core/run-primitives.js.map +0 -1
- package/dist/cua-actor-lab.d.ts +0 -855
- package/dist/cua-actor-lab.js +0 -3543
- package/dist/cua-actor-lab.js.map +0 -1
- package/dist/cua-admission-limit.d.ts +0 -12
- package/dist/cua-admission-limit.js +0 -20
- package/dist/cua-admission-limit.js.map +0 -1
- package/dist/cua-desktop-lane.d.ts +0 -35
- package/dist/cua-desktop-lane.js +0 -13
- package/dist/cua-desktop-lane.js.map +0 -1
- package/dist/cua-diagnostics.d.ts +0 -38
- package/dist/cua-diagnostics.js +0 -68
- package/dist/cua-diagnostics.js.map +0 -1
- package/dist/cua-executor-error.js +0 -48
- package/dist/cua-executor-error.js.map +0 -1
- package/dist/cua-provider-error.d.ts +0 -16
- package/dist/cua-provider-error.js +0 -35
- package/dist/cua-provider-error.js.map +0 -1
- package/dist/cua-speech.js +0 -2
- package/dist/cua-speech.js.map +0 -1
- package/dist/desktop-recorder.d.ts +0 -39
- package/dist/desktop-recorder.js +0 -226
- package/dist/desktop-recorder.js.map +0 -1
- package/dist/desktop-recording-artifact.d.ts +0 -5
- package/dist/desktop-recording-artifact.js +0 -54
- package/dist/desktop-recording-artifact.js.map +0 -1
- package/dist/desktop-recording-types.d.ts +0 -24
- package/dist/desktop-recording-types.js +0 -14
- package/dist/desktop-recording-types.js.map +0 -1
- package/dist/desktop-session.d.ts +0 -41
- package/dist/desktop-session.js +0 -47
- package/dist/desktop-session.js.map +0 -1
- package/dist/device-presets.d.ts +0 -67
- package/dist/device-presets.js +0 -55
- package/dist/device-presets.js.map +0 -1
- package/dist/doctor-lab.d.ts +0 -38
- package/dist/doctor-lab.js +0 -126
- package/dist/doctor-lab.js.map +0 -1
- package/dist/e2b-cua-desktop.d.ts +0 -3
- package/dist/e2b-cua-desktop.js +0 -708
- package/dist/e2b-cua-desktop.js.map +0 -1
- package/dist/e2b-cua-provisioning.d.ts +0 -314
- package/dist/e2b-cua-provisioning.js +0 -1219
- package/dist/e2b-cua-provisioning.js.map +0 -1
- package/dist/e2b-desktop-executor.d.ts +0 -101
- package/dist/e2b-desktop-executor.js +0 -297
- package/dist/e2b-desktop-executor.js.map +0 -1
- package/dist/e2b-desktop-launch.d.ts +0 -243
- package/dist/e2b-desktop-launch.js +0 -234
- package/dist/e2b-desktop-launch.js.map +0 -1
- package/dist/e2b-desktop-media.d.ts +0 -14
- package/dist/e2b-desktop-media.js +0 -58
- package/dist/e2b-desktop-media.js.map +0 -1
- package/dist/e2b-desktop-recording.d.ts +0 -16
- package/dist/e2b-desktop-recording.js +0 -162
- package/dist/e2b-desktop-recording.js.map +0 -1
- package/dist/e2b-desktop-resources.d.ts +0 -11
- package/dist/e2b-desktop-resources.js +0 -33
- package/dist/e2b-desktop-resources.js.map +0 -1
- package/dist/e2b-desktop-screenshot-cleanup.d.ts +0 -15
- package/dist/e2b-desktop-screenshot-cleanup.js +0 -67
- package/dist/e2b-desktop-screenshot-cleanup.js.map +0 -1
- package/dist/e2b-desktop-session.d.ts +0 -7
- package/dist/e2b-desktop-session.js +0 -29
- package/dist/e2b-desktop-session.js.map +0 -1
- package/dist/e2b-detached.d.ts +0 -53
- package/dist/e2b-detached.js +0 -130
- package/dist/e2b-detached.js.map +0 -1
- package/dist/e2b-terminal-lab.d.ts +0 -383
- package/dist/e2b-terminal-lab.js +0 -2000
- package/dist/e2b-terminal-lab.js.map +0 -1
- package/dist/env-file.d.ts +0 -14
- package/dist/env-file.js +0 -108
- package/dist/env-file.js.map +0 -1
- package/dist/export-bundle.d.ts +0 -7
- package/dist/export-bundle.js +0 -441
- package/dist/export-bundle.js.map +0 -1
- package/dist/export.d.ts +0 -49
- package/dist/export.js +0 -308
- package/dist/export.js.map +0 -1
- package/dist/feedback-proof.d.ts +0 -8
- package/dist/feedback-proof.js +0 -44
- package/dist/feedback-proof.js.map +0 -1
- package/dist/feedback.d.ts +0 -76
- package/dist/feedback.js +0 -496
- package/dist/feedback.js.map +0 -1
- package/dist/first-run-path.d.ts +0 -55
- package/dist/first-run-path.js +0 -136
- package/dist/first-run-path.js.map +0 -1
- package/dist/frame-signature.d.ts +0 -24
- package/dist/frame-signature.js +0 -128
- package/dist/frame-signature.js.map +0 -1
- package/dist/guest-bootstrap.d.ts +0 -55
- package/dist/guest-bootstrap.js +0 -285
- package/dist/guest-bootstrap.js.map +0 -1
- package/dist/guest-browser-tools.d.ts +0 -8
- package/dist/guest-browser-tools.js +0 -66
- package/dist/guest-browser-tools.js.map +0 -1
- package/dist/guest-chromium-text.d.ts +0 -27
- package/dist/guest-chromium-text.js +0 -281
- package/dist/guest-chromium-text.js.map +0 -1
- package/dist/guest-desktop-executor.d.ts +0 -22
- package/dist/guest-desktop-executor.js +0 -178
- package/dist/guest-desktop-executor.js.map +0 -1
- package/dist/guest-desktop-media.d.ts +0 -33
- package/dist/guest-desktop-media.js +0 -281
- package/dist/guest-desktop-media.js.map +0 -1
- package/dist/guest-desktop-native.d.ts +0 -14
- package/dist/guest-desktop-native.js +0 -131
- package/dist/guest-desktop-native.js.map +0 -1
- package/dist/guest-media-config.d.ts +0 -15
- package/dist/guest-media-config.js +0 -8
- package/dist/guest-media-config.js.map +0 -1
- package/dist/guest-media-worker.js.map +0 -1
- package/dist/guest-runtime-desktop.d.ts +0 -42
- package/dist/guest-runtime-desktop.js +0 -314
- package/dist/guest-runtime-desktop.js.map +0 -1
- package/dist/guest-runtime-main.js.map +0 -1
- package/dist/guest-runtime-revision.js.map +0 -1
- package/dist/guest-runtime.d.ts +0 -31
- package/dist/guest-runtime.js +0 -99
- package/dist/guest-runtime.js.map +0 -1
- package/dist/image-evidence.d.ts +0 -2
- package/dist/image-evidence.js +0 -47
- package/dist/image-evidence.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/init-templates.d.ts +0 -25
- package/dist/init-templates.js +0 -541
- package/dist/init-templates.js.map +0 -1
- package/dist/init.d.ts +0 -38
- package/dist/init.js +0 -532
- package/dist/init.js.map +0 -1
- package/dist/key-resolution.d.ts +0 -67
- package/dist/key-resolution.js +0 -375
- package/dist/key-resolution.js.map +0 -1
- package/dist/lab-app-runner.d.ts +0 -78
- package/dist/lab-app-runner.js +0 -403
- package/dist/lab-app-runner.js.map +0 -1
- package/dist/lab-config.d.ts +0 -968
- package/dist/lab-config.js +0 -2714
- package/dist/lab-config.js.map +0 -1
- package/dist/lab-engine.d.ts +0 -97
- package/dist/lab-engine.js +0 -285
- package/dist/lab-engine.js.map +0 -1
- package/dist/lab-preflight.d.ts +0 -70
- package/dist/lab-preflight.js +0 -388
- package/dist/lab-preflight.js.map +0 -1
- package/dist/lab-summary.d.ts +0 -57
- package/dist/lab-summary.js +0 -126
- package/dist/lab-summary.js.map +0 -1
- package/dist/labs.d.ts +0 -66
- package/dist/labs.js +0 -401
- package/dist/labs.js.map +0 -1
- package/dist/listen.js +0 -84
- package/dist/listen.js.map +0 -1
- package/dist/local-agent-claude-session.d.ts +0 -45
- package/dist/local-agent-claude-session.js +0 -203
- package/dist/local-agent-claude-session.js.map +0 -1
- package/dist/local-agent-cli.d.ts +0 -121
- package/dist/local-agent-cli.js +0 -427
- package/dist/local-agent-cli.js.map +0 -1
- package/dist/local-captured-inbox.d.ts +0 -6
- package/dist/local-captured-inbox.js +0 -65
- package/dist/local-captured-inbox.js.map +0 -1
- package/dist/local-firecracker-desktop.d.ts +0 -23
- package/dist/local-firecracker-desktop.js +0 -191
- package/dist/local-firecracker-desktop.js.map +0 -1
- package/dist/local-firecracker-study.d.ts +0 -9
- package/dist/local-firecracker-study.js +0 -135
- package/dist/local-firecracker-study.js.map +0 -1
- package/dist/local-runtime-config.d.ts +0 -6
- package/dist/local-runtime-config.js +0 -60
- package/dist/local-runtime-config.js.map +0 -1
- package/dist/local-runtime-host.d.ts +0 -31
- package/dist/local-runtime-host.js +0 -128
- package/dist/local-runtime-host.js.map +0 -1
- package/dist/local-runtime-release.d.ts +0 -7
- package/dist/local-runtime-release.js +0 -33
- package/dist/local-runtime-release.js.map +0 -1
- package/dist/local-runtime-ssh.d.ts +0 -27
- package/dist/local-runtime-ssh.js +0 -91
- package/dist/local-runtime-ssh.js.map +0 -1
- package/dist/local-runtime.d.ts +0 -25
- package/dist/local-runtime.js +0 -133
- package/dist/local-runtime.js.map +0 -1
- package/dist/observer-data.d.ts +0 -114
- package/dist/observer-data.js +0 -224
- package/dist/observer-data.js.map +0 -1
- package/dist/observer-library.js +0 -191
- package/dist/observer-library.js.map +0 -1
- package/dist/observer-serve.d.ts +0 -99
- package/dist/observer-serve.js +0 -284
- package/dist/observer-serve.js.map +0 -1
- package/dist/observer-static.js +0 -357
- package/dist/observer-static.js.map +0 -1
- package/dist/observer.d.ts +0 -118
- package/dist/observer.js +0 -947
- package/dist/observer.js.map +0 -1
- package/dist/openai-responses-cu.d.ts +0 -158
- package/dist/openai-responses-cu.js +0 -714
- package/dist/openai-responses-cu.js.map +0 -1
- package/dist/orientation.d.ts +0 -29
- package/dist/orientation.js +0 -95
- package/dist/orientation.js.map +0 -1
- package/dist/oss-lab.d.ts +0 -55
- package/dist/oss-lab.js +0 -344
- package/dist/oss-lab.js.map +0 -1
- package/dist/oss-meta-lab-scoring.d.ts +0 -15
- package/dist/oss-meta-lab-scoring.js +0 -145
- package/dist/oss-meta-lab-scoring.js.map +0 -1
- package/dist/oss-meta-lab.d.ts +0 -287
- package/dist/oss-meta-lab.js +0 -4551
- package/dist/oss-meta-lab.js.map +0 -1
- package/dist/oss-remote-telemetry.d.ts +0 -77
- package/dist/oss-remote-telemetry.js +0 -403
- package/dist/oss-remote-telemetry.js.map +0 -1
- package/dist/output-token-limit.js +0 -5
- package/dist/output-token-limit.js.map +0 -1
- package/dist/participant-assignment.d.ts +0 -12
- package/dist/participant-assignment.js +0 -15
- package/dist/participant-assignment.js.map +0 -1
- package/dist/persona-resolve.d.ts +0 -44
- package/dist/persona-resolve.js +0 -99
- package/dist/persona-resolve.js.map +0 -1
- package/dist/persona.d.ts +0 -39
- package/dist/persona.js +0 -144
- package/dist/persona.js.map +0 -1
- package/dist/pi-agent-core.d.ts +0 -77
- package/dist/pi-agent-core.js +0 -207
- package/dist/pi-agent-core.js.map +0 -1
- package/dist/pricing.d.ts +0 -145
- package/dist/pricing.js +0 -277
- package/dist/pricing.js.map +0 -1
- package/dist/program.d.ts +0 -96
- package/dist/program.js +0 -4030
- package/dist/program.js.map +0 -1
- package/dist/reasoning-effort.js +0 -26
- package/dist/reasoning-effort.js.map +0 -1
- package/dist/reclaim.d.ts +0 -31
- package/dist/reclaim.js +0 -90
- package/dist/reclaim.js.map +0 -1
- package/dist/redaction.d.ts +0 -90
- package/dist/redaction.js +0 -294
- package/dist/redaction.js.map +0 -1
- package/dist/restricted-codex-analysis.d.ts +0 -15
- package/dist/restricted-codex-analysis.js +0 -13
- package/dist/restricted-codex-analysis.js.map +0 -1
- package/dist/restricted-codex-participant-policy.d.ts +0 -44
- package/dist/restricted-codex-participant-policy.js +0 -43
- package/dist/restricted-codex-participant-policy.js.map +0 -1
- package/dist/restricted-codex-participant-run.d.ts +0 -20
- package/dist/restricted-codex-participant-run.js +0 -79
- package/dist/restricted-codex-participant-run.js.map +0 -1
- package/dist/restricted-codex-participant.d.ts +0 -20
- package/dist/restricted-codex-participant.js +0 -250
- package/dist/restricted-codex-participant.js.map +0 -1
- package/dist/restricted-codex-policy.d.ts +0 -64
- package/dist/restricted-codex-policy.js +0 -176
- package/dist/restricted-codex-policy.js.map +0 -1
- package/dist/restricted-codex-session.d.ts +0 -44
- package/dist/restricted-codex-session.js +0 -657
- package/dist/restricted-codex-session.js.map +0 -1
- package/dist/restricted-codex-transport.d.ts +0 -69
- package/dist/restricted-codex-transport.js +0 -296
- package/dist/restricted-codex-transport.js.map +0 -1
- package/dist/run-detail.d.ts +0 -61
- package/dist/run-detail.js +0 -137
- package/dist/run-detail.js.map +0 -1
- package/dist/run-index.d.ts +0 -71
- package/dist/run-index.js +0 -206
- package/dist/run-index.js.map +0 -1
- package/dist/run-narration-secrets.js +0 -68
- package/dist/run-narration-secrets.js.map +0 -1
- package/dist/run-paths.d.ts +0 -56
- package/dist/run-paths.js +0 -355
- package/dist/run-paths.js.map +0 -1
- package/dist/run-projection.d.ts +0 -186
- package/dist/run-projection.js +0 -350
- package/dist/run-projection.js.map +0 -1
- package/dist/run-status.d.ts +0 -139
- package/dist/run-status.js +0 -218
- package/dist/run-status.js.map +0 -1
- package/dist/run.d.ts +0 -1255
- package/dist/run.js +0 -5949
- package/dist/run.js.map +0 -1
- package/dist/sandbox-receipts.d.ts +0 -19
- package/dist/sandbox-receipts.js +0 -51
- package/dist/sandbox-receipts.js.map +0 -1
- package/dist/screenshot-image.d.ts +0 -11
- package/dist/screenshot-image.js +0 -26
- package/dist/screenshot-image.js.map +0 -1
- package/dist/scripted-browser-actor.d.ts +0 -297
- package/dist/scripted-browser-actor.js +0 -1399
- package/dist/scripted-browser-actor.js.map +0 -1
- package/dist/scripted-browser-lab.d.ts +0 -121
- package/dist/scripted-browser-lab.js +0 -852
- package/dist/scripted-browser-lab.js.map +0 -1
- package/dist/secret-prompt.js +0 -36
- package/dist/secret-prompt.js.map +0 -1
- package/dist/selected-output-paths.d.ts +0 -52
- package/dist/selected-output-paths.js +0 -366
- package/dist/selected-output-paths.js.map +0 -1
- package/dist/serve-exposure.d.ts +0 -62
- package/dist/serve-exposure.js +0 -129
- package/dist/serve-exposure.js.map +0 -1
- package/dist/serve-http.js +0 -45
- package/dist/serve-http.js.map +0 -1
- package/dist/serve-tunnel.js +0 -113
- package/dist/serve-tunnel.js.map +0 -1
- package/dist/shared-world-lab.d.ts +0 -269
- package/dist/shared-world-lab.js +0 -1424
- package/dist/shared-world-lab.js.map +0 -1
- package/dist/source-archive.d.ts +0 -82
- package/dist/source-archive.js +0 -408
- package/dist/source-archive.js.map +0 -1
- package/dist/stats.d.ts +0 -82
- package/dist/stats.js +0 -219
- package/dist/stats.js.map +0 -1
- package/dist/stop-conditions.d.ts +0 -39
- package/dist/stop-conditions.js +0 -66
- package/dist/stop-conditions.js.map +0 -1
- package/dist/study-analysis-codex-config.d.ts +0 -11
- package/dist/study-analysis-codex-config.js +0 -34
- package/dist/study-analysis-codex-config.js.map +0 -1
- package/dist/study-analysis-engine.d.ts +0 -47
- package/dist/study-analysis-engine.js +0 -327
- package/dist/study-analysis-engine.js.map +0 -1
- package/dist/study-analysis-evidence.d.ts +0 -27
- package/dist/study-analysis-evidence.js +0 -660
- package/dist/study-analysis-evidence.js.map +0 -1
- package/dist/study-analysis-job.d.ts +0 -97
- package/dist/study-analysis-job.js +0 -214
- package/dist/study-analysis-job.js.map +0 -1
- package/dist/study-analysis-provider.d.ts +0 -40
- package/dist/study-analysis-provider.js +0 -170
- package/dist/study-analysis-provider.js.map +0 -1
- package/dist/study-analysis-service.d.ts +0 -59
- package/dist/study-analysis-service.js +0 -257
- package/dist/study-analysis-service.js.map +0 -1
- package/dist/study-analysis-sharing.d.ts +0 -11
- package/dist/study-analysis-sharing.js +0 -35
- package/dist/study-analysis-sharing.js.map +0 -1
- package/dist/study-analysis-store.d.ts +0 -47
- package/dist/study-analysis-store.js +0 -493
- package/dist/study-analysis-store.js.map +0 -1
- package/dist/study-analysis-validation.d.ts +0 -618
- package/dist/study-analysis-validation.js +0 -384
- package/dist/study-analysis-validation.js.map +0 -1
- package/dist/study-analysis.d.ts +0 -206
- package/dist/study-analysis.js +0 -4
- package/dist/study-analysis.js.map +0 -1
- package/dist/study-costs.js +0 -114
- package/dist/study-costs.js.map +0 -1
- package/dist/subject-runtime.d.ts +0 -23
- package/dist/subject-runtime.js +0 -70
- package/dist/subject-runtime.js.map +0 -1
- package/dist/tasks.d.ts +0 -90
- package/dist/tasks.js +0 -144
- package/dist/tasks.js.map +0 -1
- package/dist/telemetry.js +0 -324
- package/dist/telemetry.js.map +0 -1
- package/dist/terminal-agent-actor.d.ts +0 -41
- package/dist/terminal-agent-actor.js +0 -25
- package/dist/terminal-agent-actor.js.map +0 -1
- package/dist/terminal-encoding.js +0 -80
- package/dist/terminal-encoding.js.map +0 -1
- package/dist/terminal-node-bootstrap.d.ts +0 -4
- package/dist/terminal-node-bootstrap.js +0 -58
- package/dist/terminal-node-bootstrap.js.map +0 -1
- package/dist/terminal-participant-activity.d.ts +0 -6
- package/dist/terminal-participant-activity.js +0 -34
- package/dist/terminal-participant-activity.js.map +0 -1
- package/dist/terminal-runtime-auth.d.ts +0 -13
- package/dist/terminal-runtime-auth.js +0 -24
- package/dist/terminal-runtime-auth.js.map +0 -1
- package/dist/terminal-runtime.d.ts +0 -16
- package/dist/terminal-runtime.js +0 -42
- package/dist/terminal-runtime.js.map +0 -1
- package/dist/terminal-token-usage.d.ts +0 -15
- package/dist/terminal-token-usage.js +0 -94
- package/dist/terminal-token-usage.js.map +0 -1
- package/dist/tui-actions.d.ts +0 -39
- package/dist/tui-actions.js +0 -178
- package/dist/tui-actions.js.map +0 -1
- package/dist/tui-contract.d.ts +0 -141
- package/dist/tui-contract.js +0 -54
- package/dist/tui-contract.js.map +0 -1
- package/dist/tui-launch.js +0 -167
- package/dist/tui-launch.js.map +0 -1
- package/dist/tui-project.d.ts +0 -9
- package/dist/tui-project.js +0 -18
- package/dist/tui-project.js.map +0 -1
- package/docs/architecture/examples/state-driven-local-app/README.md +0 -80
- package/docs/architecture/examples/state-driven-local-app/app.mjs +0 -48
- package/docs/architecture/examples/state-driven-local-app/runner.mjs +0 -105
- package/docs/architecture/local-codex-tui-actor.md +0 -213
- package/docs/architecture/oss-lab-poc.md +0 -250
- package/docs/architecture/runtime-broker-core.md +0 -30
- package/docs/release/0.100.0-local-setup.md +0 -31
- package/docs/release/0.100.1-participant-continuity.md +0 -20
- package/docs/release/0.101.0-codex-ui-tools.md +0 -28
- package/docs/release/0.102.0-participant-media.md +0 -43
- package/docs/release/0.103.0-desktop-recording.md +0 -29
- package/docs/release/0.103.1-analysis-capture-allocation.md +0 -18
- package/docs/release/0.103.2-analysis-ending-context.md +0 -21
- package/docs/release/0.104.0-local-captured-inboxes.md +0 -29
- package/docs/release/0.104.1-recording-startup.md +0 -24
- package/docs/release/0.104.2-recording-timestamps.md +0 -32
- package/docs/release/0.104.3-local-smtp-catch.md +0 -15
- package/docs/release/0.105.0-participant-backgrounds.md +0 -50
- package/docs/release/0.20.0-external-public-shared-world.md +0 -43
- package/docs/release/0.84.0-redacted-evidence.md +0 -42
- package/docs/release/0.84.1-portable-feedback.md +0 -20
- package/docs/release/0.85.0-observer-review.md +0 -56
- package/docs/release/0.85.1-observer-continuity.md +0 -20
- package/docs/release/0.86.0-participant-evidence.md +0 -50
- package/docs/release/0.86.1-task-preflight-saved-recordings.md +0 -40
- package/docs/release/0.87.0-participant-endings-and-phone-review.md +0 -64
- package/docs/release/0.88.0-study-diagnostics.md +0 -43
- package/docs/release/0.88.1-completion-evidence-and-local-app.md +0 -79
- package/docs/release/0.88.2-sequential-study-budgets.md +0 -57
- package/docs/release/0.89.0-study-findings.md +0 -79
- package/docs/release/0.89.1-analysis-finished-notice.md +0 -24
- package/docs/release/0.90.0-automatic-analysis.md +0 -21
- package/docs/release/0.91.0-analysis-quality-and-defaults.md +0 -33
- package/docs/release/0.91.1-study-review-polish.md +0 -28
- package/docs/release/0.92.0-grid-playback.md +0 -22
- package/docs/release/0.93.0-global-playback.md +0 -26
- package/docs/release/0.93.1-observer-review-controls.md +0 -24
- package/docs/release/0.94.0-reliability.md +0 -48
- package/docs/release/0.95.0-connections-setup.md +0 -38
- package/docs/release/0.96.0-real-email-receiving.md +0 -47
- package/docs/release/0.96.1-browser-navigation.md +0 -22
- package/docs/release/0.97.0-codex-account-analysis.md +0 -45
- package/docs/release/0.98.0-local-browser-studies.md +0 -31
- package/docs/release/0.99.0-local-browser-mac.md +0 -34
- package/docs/release/0.99.1-action-recovery.md +0 -19
- /package/dist/{agent-session.d.ts → actors/agent-session.d.ts} +0 -0
- /package/dist/{cua-executor-error.d.ts → actors/computer-use/executor-error.d.ts} +0 -0
- /package/dist/{cua-speech.d.ts → actors/computer-use/speech.d.ts} +0 -0
- /package/dist/{actor-goal-source.d.ts → actors/goal-source.d.ts} +0 -0
- /package/dist/{output-token-limit.d.ts → actors/output-token-limit.d.ts} +0 -0
- /package/dist/{reasoning-effort.d.ts → actors/reasoning-effort.d.ts} +0 -0
- /package/dist/{secret-prompt.d.ts → cli/secret-prompt.d.ts} +0 -0
- /package/dist/{telemetry.d.ts → cli/telemetry.d.ts} +0 -0
- /package/dist/{browser-evidence-hygiene.d.ts → evidence/browser-hygiene.d.ts} +0 -0
- /package/dist/{serve-http.d.ts → observer/http.d.ts} +0 -0
- /package/dist/{observer-library.d.ts → observer/library.d.ts} +0 -0
- /package/dist/{listen.d.ts → observer/listen.d.ts} +0 -0
- /package/dist/{observer-static.d.ts → observer/static.d.ts} +0 -0
- /package/dist/{serve-tunnel.d.ts → observer/tunnel.d.ts} +0 -0
- /package/dist/{terminal-encoding.d.ts → routes/terminal/encoding.d.ts} +0 -0
- /package/dist/{concurrency.d.ts → run/concurrency.d.ts} +0 -0
- /package/dist/{study-costs.d.ts → run/costs.d.ts} +0 -0
- /package/dist/{run-narration-secrets.d.ts → run/transient-comms-secrets.d.ts} +0 -0
- /package/dist/{tui-launch.d.ts → tui/launch.d.ts} +0 -0
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
Date: 2026-06-02 (current-state note updated 2026-07-14)
|
|
4
4
|
|
|
5
5
|
Status: reference map for the major contracts shipped through source version
|
|
6
|
-
`0.
|
|
6
|
+
`0.106.0`; it is not an exhaustive inventory of command/result envelopes. Exported types,
|
|
7
7
|
schema constants, parsers, and validators in `src/` are authoritative. Rows
|
|
8
|
-
marked "reserved" name layering intent only
|
|
8
|
+
marked "reserved" name layering intent only; no code emits or validates them
|
|
9
9
|
yet. Do not emit a reserved schema.
|
|
10
10
|
|
|
11
11
|
## Purpose
|
|
12
12
|
|
|
13
|
-
This document names the core
|
|
13
|
+
This document names the core humanish contracts before more implementation
|
|
14
14
|
lands. It is intentionally public-safe: examples use synthetic ids, local
|
|
15
15
|
relative artifact paths, env var names without values, and redacted evidence
|
|
16
16
|
notes.
|
|
@@ -20,65 +20,66 @@ workflow without leaking private upstream truth into core.
|
|
|
20
20
|
|
|
21
21
|
## Ownership Rule
|
|
22
22
|
|
|
23
|
-
| Layer
|
|
24
|
-
|
|
|
25
|
-
| Core
|
|
26
|
-
| Adapter | Product routes, scenario/persona choices, app topology, env var names, network allowlists, coverage vocabulary, milestones, fixture data, target-specific proof expectations.
|
|
23
|
+
| Layer | Owns | Does not own |
|
|
24
|
+
| ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
|
|
25
|
+
| Core | Schema versions, run ids, artifact layout, lifecycle events, actor/substrate status, evidence shape, review, verification, redaction, feedback mechanics, latest/history indexes. | Product routes, real customer data, private screenshots, private transcripts, credential values, target-specific acceptance language. |
|
|
26
|
+
| Adapter | Product routes, scenario/persona choices, app topology, env var names, network allowlists, coverage vocabulary, milestones, fixture data, target-specific proof expectations. | Generic run bundle schema, public-safety gates, provider secret values, raw private artifacts, GitHub mutation authority. |
|
|
27
27
|
|
|
28
28
|
## Contract Index
|
|
29
29
|
|
|
30
|
-
| Contract
|
|
31
|
-
|
|
|
32
|
-
| Run bundle
|
|
33
|
-
| Adapter
|
|
34
|
-
| Lab
|
|
35
|
-
| Persona
|
|
36
|
-
| Scenario
|
|
37
|
-
| Actor trace
|
|
38
|
-
| Substrate
|
|
39
|
-
| Evidence stream
|
|
40
|
-
| Review
|
|
41
|
-
| Study analysis
|
|
42
|
-
| Study analysis correction
|
|
43
|
-
| Analysis execution receipt
|
|
44
|
-
| Analysis execution start
|
|
45
|
-
| Verification
|
|
46
|
-
| Policy
|
|
47
|
-
| Feedback
|
|
48
|
-
| Terminal cost ledger
|
|
49
|
-
| Terminal no-spend proof
|
|
50
|
-
| Pricing (operator-editable rates) | `humanish.pricing.v1` (`src/pricing.ts`; dated per-model + E2B desktop rates)
|
|
51
|
-
| Run cost summary
|
|
52
|
-
| Estimated actor cost
|
|
53
|
-
| Model settings
|
|
54
|
-
| Affordance use
|
|
55
|
-
| Adapter score
|
|
56
|
-
| Adapter artifact
|
|
57
|
-
| Shared-world evidence
|
|
58
|
-
| Comms thread
|
|
59
|
-
| Serve result
|
|
60
|
-
| Serve control plane
|
|
30
|
+
| Contract | Schema | Public-safe fixture |
|
|
31
|
+
| --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------- |
|
|
32
|
+
| Run bundle | `humanish.run-bundle.v1` | `synthetic-run-bundle` |
|
|
33
|
+
| Adapter | `humanish.adapter.v1` | `synthetic-cli-adapter` |
|
|
34
|
+
| Lab | `humanish.lab.v2` | `first-run` |
|
|
35
|
+
| Persona | `humanish.persona.v1` | `synthetic-maintainer` |
|
|
36
|
+
| Scenario | `humanish.scenario.v1` | `first-run-smoke` |
|
|
37
|
+
| Actor trace | `humanish.actor-trace.v1` | `synthetic-actor-trace` |
|
|
38
|
+
| Substrate | reserved (never shipped) | none |
|
|
39
|
+
| Evidence stream | reserved (streams live inside the run bundle) | see [`run-bundle.md`](run-bundle.md) |
|
|
40
|
+
| Review | `humanish.review.v1` | `contract-proof-review` |
|
|
41
|
+
| Study analysis | `humanish.study-analysis.v1` | see [study analysis](study-analysis.md) and synthetic analysis fixtures in `tests/` |
|
|
42
|
+
| Study analysis correction | `humanish.study-analysis-correction.v1` | see [study analysis](study-analysis.md#human-review-and-sharing) |
|
|
43
|
+
| Analysis execution receipt | `humanish.analysis-execution.v1` | see [study analysis](study-analysis.md#durable-records) |
|
|
44
|
+
| Analysis execution start | `humanish.analysis-execution-start.v1` | see [study analysis](study-analysis.md#durable-records) |
|
|
45
|
+
| Verification | `humanish.verify-result.v1` | `five-check-verify` |
|
|
46
|
+
| Policy | `humanish.policy.v1` (fixture-only; not engine-validated) | `public-safety-policy` |
|
|
47
|
+
| Feedback | `humanish.feedback.v1` | `public-safe-feedback` |
|
|
48
|
+
| Terminal cost ledger | `humanish.terminal-cost-ledger.v1` | see Terminal Cost Ledger below |
|
|
49
|
+
| Terminal no-spend proof | `humanish.terminal-no-spend-proof.v1` | see Terminal Cost Ledger below |
|
|
50
|
+
| Pricing (operator-editable rates) | `humanish.pricing.v1` (`src/run/pricing.ts`; dated per-model + E2B desktop rates) | see Run Cost Summary And Estimated Actor Cost below |
|
|
51
|
+
| Run cost summary | `humanish.run-cost-summary.v1` (additive `RunBundle.cost`; estimate, never a charge) | see Run Cost Summary And Estimated Actor Cost below |
|
|
52
|
+
| Estimated actor cost | `humanish.actor-estimated-cost.v1` (additive `ActorTrace.estimatedCost`) | see Run Cost Summary And Estimated Actor Cost below |
|
|
53
|
+
| Model settings | `humanish.model-settings.v1` (additive `ActorTrace.modelSettings`; the reasoning effort the request carried) | see Actor Trace below |
|
|
54
|
+
| Affordance use | `humanish.affordance-use.v1` (additive `ActorTrace.affordanceUse`; per-class counts of the routes an actor took) | see Affordance Use below |
|
|
55
|
+
| Adapter score | `humanish.adapter-score.v1` (`RunBundle.adapterScore`; namespaced; route-specific acceptance semantics) | see Product-Adapter Extension Seam below |
|
|
56
|
+
| Adapter artifact | `humanish.adapter-artifact.v1` (`RunBundle.adapterArtifacts[]`; namespaced; local relative proof references) | see Product-Adapter Extension Seam below |
|
|
57
|
+
| Shared-world evidence | `humanish.shared-world.v1` (additive `RunBundle.sharedWorld` + `RunBundle.attributionClass`; `topologyMode: sequential \| concurrent`) | see Shared-World Evidence below |
|
|
58
|
+
| Comms thread | `humanish.comms-thread.v1` (off-app email/SMS the app sent, captured; a `kind: log` run-dir artifact of DIGESTS only — from/to/subject/link digests + an OTP count, never raw) | see `comms` under Lab Manifest |
|
|
59
|
+
| Serve result | `humanish.serve-result.v1` (`src/observer/serve.ts` is authoritative) | none (command result envelope; see Serve Result below) |
|
|
60
|
+
| Serve control plane | reserved (`/_humanish/api/*` answers `501` `HUMANISH_SERVE_CONTROL_PLANE_DISABLED` in v1) | none |
|
|
61
61
|
|
|
62
62
|
## Lab Manifest
|
|
63
63
|
|
|
64
|
-
Schema: `humanish.lab.v2` (`src/lab
|
|
65
|
-
compatibility: v1 (`kind`, top-level `sims`) had zero real users and was
|
|
64
|
+
Schema: `humanish.lab.v2` (types in `src/lab/types.ts`, parsed by `src/lab/config.ts`). There
|
|
65
|
+
is deliberately no v1 compatibility: v1 (`kind`, top-level `sims`) had zero real users and was
|
|
66
66
|
deleted when labs became config.
|
|
67
67
|
|
|
68
68
|
A lab is a composition over code primitives, not a hardcoded kind:
|
|
69
69
|
|
|
70
|
-
- `subject`: what the run acts on
|
|
70
|
+
- `subject`: what the run acts on: `this-repo`, `clone` (owner/repo slugs,
|
|
71
71
|
optional in-sandbox `serve` + env var names + `state`), `local-tree` (the
|
|
72
72
|
operator's own working tree, packed on the host and provisioned in-sandbox
|
|
73
73
|
in place of a clone; see below), `app-url`
|
|
74
74
|
(loopback unless `policies.allowPublicTargets` declares an owned deployment),
|
|
75
75
|
`local-app` (an already-running LOCAL dev server driven IN-PROCESS via a
|
|
76
|
-
custom `CuaExecutor`, NO clone and NO E2B desktop
|
|
76
|
+
custom `CuaExecutor`, NO clone and NO E2B desktop, always loopback),
|
|
77
77
|
`terminal-product` (a CLI/product a real autonomous terminal agent studies
|
|
78
|
-
from PUBLIC surfaces only
|
|
78
|
+
from PUBLIC surfaces only; see below), or `desktop-cli` (a computer-use
|
|
79
|
+
participant using a CLI in a terminal on a hosted desktop). A
|
|
79
80
|
`local-app` subject pairs a computer-use actor with `execution.target: local`
|
|
80
81
|
(or absent) and is library-assisted: the caller supplies
|
|
81
|
-
`
|
|
82
|
+
`RunLabOptions.inProcess.executor` + `createProvider`; with neither the engine fails
|
|
82
83
|
closed (`HUMANISH_CUA_LAB_LOCAL_APP_NO_EXECUTOR`), never a desktop attempt. See
|
|
83
84
|
[`docs/architecture/state-driven-executor.md`](../architecture/state-driven-executor.md);
|
|
84
85
|
- `subject.localTree` (`local-tree` subjects, computer-use route): pack/upload
|
|
@@ -86,7 +87,7 @@ A lab is a composition over code primitives, not a hardcoded kind:
|
|
|
86
87
|
top of the always-on denylist; entries match as a repo-relative path
|
|
87
88
|
prefix or an exact basename, absolute paths and glob syntax are rejected
|
|
88
89
|
at parse time, and leading `./` / trailing `/` are normalized), `keep`
|
|
89
|
-
(preserve the sandbox on a failed
|
|
90
|
+
(preserve the sandbox on a failed participant for debugging, mirroring
|
|
90
91
|
`subject.clone.keep`; a kept local-tree sandbox holds the packed working
|
|
91
92
|
tree, including any file that survived the denylist), and
|
|
92
93
|
`maxArchiveBytes` (upload size cap override; default 256 MiB). Routing requires `execution.target: e2b-desktop` and a
|
|
@@ -98,19 +99,20 @@ A lab is a composition over code primitives, not a hardcoded kind:
|
|
|
98
99
|
is a git work tree (`git ls-files --cached --others --exclude-standard`,
|
|
99
100
|
honoring `.gitignore`) or a denylist-only recursive walk otherwise; an
|
|
100
101
|
always-on denylist (`.git`, `node_modules`, `.humanish`, `.env*`, key/cert
|
|
101
|
-
file patterns, and common credential-shaped names; the authoritative
|
|
102
|
-
|
|
102
|
+
file patterns, and common credential-shaped names; the authoritative lists
|
|
103
|
+
are `LOCAL_TREE_DENYLIST_PATH_SEGMENTS` and `LOCAL_TREE_DENYLIST_BASENAME_PATTERNS` in
|
|
104
|
+
`src/subject/local-tree-archive.ts`)
|
|
103
105
|
applies in both modes and is not overridable. The denylist matches names,
|
|
104
106
|
not contents; a secret in a file it does not name packs like any other
|
|
105
107
|
file, so review the pack summary line and use `localTree.exclude`. The lab packs
|
|
106
|
-
ONCE per run and uploads the identical archive to every fan-out
|
|
108
|
+
ONCE per run and uploads the identical archive to every fan-out participant. The
|
|
107
109
|
in-sandbox commit refresh clone subjects use is skipped: `.git` is never
|
|
108
110
|
uploaded, so identity comes from the host-side archive digest instead. See
|
|
109
|
-
[`docs/goals/local-tree-subject/goal.md`](
|
|
111
|
+
[`docs/goals/local-tree-subject/goal.md`](https://github.com/danielgwilson/humanish/blob/main/docs/goals/local-tree-subject/goal.md);
|
|
110
112
|
- `subject.product` (terminal-product subjects): the product the agent studies.
|
|
111
113
|
`product.name` is a public-safe token (committed fixtures use a NEUTRAL mock
|
|
112
114
|
name); `product.publicSurfaces[]` is the list of http(s) URLs (docs, llms.txt,
|
|
113
|
-
skill manifest) that are the ONLY world the agent sees
|
|
115
|
+
skill manifest) that are the ONLY world the agent sees. The lab does not
|
|
114
116
|
clone/provision the product, so its provenance is recorded UNPINNED
|
|
115
117
|
(invariant 5). `serve`/`clone`/`state`/`repos`/`appUrl` are rejected on a
|
|
116
118
|
terminal-product subject (a field that cannot act on the route is a parse
|
|
@@ -119,108 +121,114 @@ A lab is a composition over code primitives, not a hardcoded kind:
|
|
|
119
121
|
- `subject.state` (clone or local-tree subjects, computer-use route): the
|
|
120
122
|
subject's state story. `state.seed[]` declares ordered, bounded
|
|
121
123
|
seed/migration/fixture steps (`{ name, command, when: before-build |
|
|
122
|
-
|
|
124
|
+
before-start | after-ready, timeoutMs }`) executed in-sandbox around the
|
|
123
125
|
serve sequence; `state.external[]` declares env var NAMES (each must also
|
|
124
126
|
appear in `subject.env`) pointing at state the lab does not control,
|
|
125
127
|
recorded as UNPINNED in provenance. Commands persist in evidence as
|
|
126
128
|
sha256-16 digests only, never as text;
|
|
127
129
|
- `actors`: who drives it. On computer-use (including shared-world),
|
|
128
130
|
scripted-browser, and terminal-product routes, `actors[0].type` is a real
|
|
129
|
-
dispatch key resolved against the actor registry. On synthetic
|
|
130
|
-
|
|
131
|
+
dispatch key resolved against the actor registry. On the synthetic route it
|
|
132
|
+
remains a descriptive label (e.g. `synthetic-persona`). The
|
|
131
133
|
`codex-exec` descriptor's direct `runSession` member is a fail-closed
|
|
132
134
|
compatibility entry, not the live runner; the terminal-product lab route
|
|
133
135
|
owns the live sandbox, auth, cap, evidence, and cleanup lifecycle.
|
|
134
|
-
`actors[0].count` carries route-specific meanings: synthetic route
|
|
136
|
+
`actors[0].count` carries route-specific meanings: synthetic route participant
|
|
135
137
|
count (simCount); scripted-browser route surface roster (1 = desktop,
|
|
136
138
|
2 = desktop + mobile, default 1); computer-use **E2B** route the HOMOGENEOUS
|
|
137
|
-
fan-out
|
|
139
|
+
fan-out participant count (N identical participants, each its own E2B desktop: separate
|
|
138
140
|
worlds, cap 16). The in-process/local-app computer-use route stays single
|
|
139
|
-
|
|
141
|
+
participant (no E2B to fan out);
|
|
140
142
|
- `actors[0].lanes[]` (computer-use E2B route): a DIFFERENTIATED fan-out roster,
|
|
141
143
|
each `{ id?, actorType?, surface?, caseGroup?, persona?, device?,
|
|
142
|
-
|
|
143
|
-
shared-world routes, one
|
|
144
|
+
instruction?, target?, entry?, host?, reasoningEffort?, stopWhen?, dwell? }` becoming one independent E2B desktop (or, on the
|
|
145
|
+
shared-world routes, one participant against the shared plane). `actorType`,
|
|
144
146
|
`surface`, and `caseGroup` are adapter-owned public-safe labels for grouping
|
|
145
147
|
simulated users; they are not core enums, and `actorType` is deliberately
|
|
146
148
|
separate from the execution dispatch key `actors[0].type`. `lanes` is XOR with
|
|
147
149
|
`count` (declare a roster OR a homogeneous count) and XOR with
|
|
148
|
-
`actors[0].laneFocus` (a roster's per-
|
|
149
|
-
`lanes[].device` is XOR with a raw `execution.desktop.resolution`.
|
|
150
|
-
default `lane-01`..`lane-NN
|
|
151
|
-
(`actors/<streamId>.json`, `screenshots/<laneId>/`). Cap 16
|
|
152
|
-
|
|
153
|
-
the cua
|
|
154
|
-
|
|
150
|
+
`actors[0].laneFocus` (a roster's per-participant `instruction` is the steer);
|
|
151
|
+
`lanes[].device` is XOR with a raw `execution.desktop.resolution`. Participant ids
|
|
152
|
+
default `lane-01`..`lane-NN` (`role-01`..`role-NN` for shared-world participants), must be unique, and name per-participant evidence paths
|
|
153
|
+
(`actors/<streamId>.json`, `screenshots/<laneId>/`). Cap 16 participants. On other
|
|
154
|
+
routes `lanes` is inert (warned), except the scripted-browser route, which rejects it. `subject.clone.fanout` is REJECTED on
|
|
155
|
+
the cua, shared-world and scripted-browser routes (declare fan-out via
|
|
156
|
+
`count`/`lanes`). No current route reads `clone.fanout`;
|
|
155
157
|
- `actors[0].lanes[].target` (app-url × computer-use E2B route only): an
|
|
156
|
-
absolute browser URL that
|
|
158
|
+
absolute browser URL that participant opens instead of `subject.appUrl`. This is the
|
|
157
159
|
setup-produced-target handoff for crawler/swarm labs: an adapter may start any
|
|
158
160
|
topology it needs, then declare exactly which target each actor should drive.
|
|
159
|
-
If any
|
|
161
|
+
If any participant declares `target`, every participant in that roster must declare one.
|
|
160
162
|
Public/non-loopback targets still require `policies.allowPublicTargets: true`.
|
|
161
163
|
`target` is mutually exclusive with `entry`: `target` is an absolute app-url
|
|
162
|
-
browser target; `entry` is a shared-world same-origin
|
|
164
|
+
browser target; `entry` is a shared-world participant's same-origin path;
|
|
163
165
|
- `actors[0].roster[]` (computer-use E2B route): compact authoring sugar for
|
|
164
|
-
repeated
|
|
165
|
-
|
|
166
|
+
repeated participant groups, each `{ id, count, actorType?, surface?, caseGroup?,
|
|
167
|
+
persona?, device?, instruction?, target?, entry?, host?, reasoningEffort?, stopWhen?,
|
|
168
|
+
dwell? }`. The parser expands it into
|
|
166
169
|
deterministic `lanes[]` before the engine runs (`viewer-01`, `viewer-02`,
|
|
167
|
-
...), so the runtime and run bundle keep one normalized
|
|
170
|
+
...), so the runtime and run bundle keep one normalized participant shape. `roster`
|
|
168
171
|
is XOR with explicit `lanes`, homogeneous `count`, and `laneFocus`;
|
|
169
172
|
- `execution.concurrency` (computer-use E2B routes, including shared-world): a
|
|
170
|
-
CAP on
|
|
171
|
-
simultaneously
|
|
172
|
-
|
|
173
|
-
|
|
173
|
+
CAP on participants in flight at once. When omitted, every participant runs
|
|
174
|
+
simultaneously: independent participants resolve it from the final participant count,
|
|
175
|
+
after any `--count` override, and the parser fills `concurrency = laneCount`
|
|
176
|
+
for multi-participant shared-world labs. Total sessions and spend are identical either way; only wall-clock
|
|
177
|
+
and simultaneity differ. Declaring a value below the participant count runs participants in
|
|
174
178
|
waves and emits a warning saying so, because a green waved run is otherwise
|
|
175
|
-
indistinguishable from the all-live run the author meant.
|
|
176
|
-
|
|
177
|
-
is the sequential turn-taking
|
|
178
|
-
|
|
179
|
+
indistinguishable from the all-live run the author meant. Shared-world labs
|
|
180
|
+
need at least 2 (the host and a follower are live together); `concurrency: 1`
|
|
181
|
+
there is refused at parse, since the sequential turn-taking route was removed
|
|
182
|
+
in 0.106.0. The env override
|
|
179
183
|
`HUMANISH_CUA_MAX_CONCURRENCY` may only LOWER the effective bound, never
|
|
180
184
|
raise concurrent paid desktops (invariant 3), and a lowering is recorded on
|
|
181
185
|
the plan (`envLoweredConcurrencyFrom`). Inert (warned) on other routes.
|
|
182
|
-
`execution.timeoutMs` is the PER-
|
|
186
|
+
`execution.timeoutMs` is the PER-PARTICIPANT session budget on this route (semantics
|
|
183
187
|
change: it was the single-session budget pre-fan-out); there is no run-level
|
|
184
188
|
wall clock. `policies.allowPublicTargets` cannot combine with N>1 against one
|
|
185
189
|
implicit public `subject.appUrl` (ambiguous shared-world-ish topology); it may
|
|
186
190
|
combine with N>1 only when the roster declares explicit `lanes[].target` for
|
|
187
|
-
every
|
|
191
|
+
every participant, OR when `subject.topology: shared-world` is ALSO declared. That
|
|
188
192
|
routes N>1 against one public target to the EXTERNAL-PUBLIC shared-world plane
|
|
189
|
-
(see Shared-World Evidence below), not
|
|
193
|
+
(see Shared-World Evidence below), not separate worlds;
|
|
190
194
|
- `subject.publicTarget: { owner, authorized: true }` (external-public shared-world
|
|
191
195
|
route ONLY): the operator's REQUIRED ownership attestation when a real PUBLIC
|
|
192
196
|
deployment (`source: app-url` + `topology: shared-world` + `allowPublicTargets` +
|
|
193
197
|
`concurrency > 1`) is used directly as the shared plane. The harness neither
|
|
194
198
|
provisions nor exposes the target, so it cannot attest synthetic data; the operator
|
|
195
|
-
MUST attest they own/operate it. Author-trust (unverifiable); rejected on
|
|
196
|
-
|
|
197
|
-
- `subject.appUrl`: a loopback http(s) URL a computer-use actor drives, OR
|
|
198
|
-
external-public shared-world route
|
|
199
|
+
MUST attest they own/operate it. Author-trust (unverifiable); rejected on non-app-url
|
|
200
|
+
subjects and inert (warned) on other app-url routes. `actors[0].lanes[].host: true` marks the single designated host participant there;
|
|
201
|
+
- `subject.appUrl`: a loopback http(s) URL a computer-use actor drives, OR (on the
|
|
202
|
+
external-public shared-world route) the non-loopback public deployment used as the
|
|
199
203
|
shared plane (with `publicTarget` + `allowPublicTargets`);
|
|
200
|
-
- `execution`: where it runs
|
|
204
|
+
- `execution`: where it runs (`local`, `e2b-desktop`, or `e2b-terminal`), plus
|
|
201
205
|
desktop device/resolution and timeouts. app-url subjects pair `e2b-desktop`
|
|
202
|
-
with a computer-use actor, or `local` (or absent) with a
|
|
203
|
-
actor; terminal-product subjects pair `e2b-terminal` (or absent → implied)
|
|
204
|
-
with a registered terminal actor
|
|
205
|
-
|
|
206
|
-
|
|
206
|
+
or `local` with a computer-use actor, or `local` (or absent) with a
|
|
207
|
+
scripted-browser actor; terminal-product subjects pair `e2b-terminal` (or absent → implied)
|
|
208
|
+
with a registered terminal actor. clone and local-tree subjects require an
|
|
209
|
+
explicit `e2b-desktop`: any other target, or none, fails to parse, and the
|
|
210
|
+
computer-use and scripted-browser routes refuse it when a library caller skips
|
|
211
|
+
the parser;
|
|
212
|
+
- `execution.desktop.template` (e2b-desktop computer-use and clone scripted-browser routes): a custom E2B
|
|
213
|
+
desktop TEMPLATE (image) NAME or ID the run launches on, for a subject that
|
|
207
214
|
needs runtimes the stock `desktop` image lacks (e.g. node/bun/a local Postgres
|
|
208
215
|
baked into an adopter-maintained image). Any non-empty string is a valid
|
|
209
216
|
name/id (no allowlist); a blank/whitespace value is rejected. Threaded to the
|
|
210
217
|
SDK's `Sandbox.create(template, opts)` on EVERY desktop-creating route (the
|
|
211
|
-
single-
|
|
212
|
-
|
|
218
|
+
single-participant and fan-out cua participants, and the shared-world subject AND every actor
|
|
219
|
+
sandbox); when absent the call
|
|
213
220
|
stays the byte-stable `Sandbox.create(opts)` default (the stock template). The
|
|
214
221
|
template actually used is recorded in the run bundle as `desktopTemplate`
|
|
215
|
-
(public-safe
|
|
216
|
-
that creates no desktop, incl. the in-process `local-app` cua route
|
|
217
|
-
|
|
218
|
-
Desktop SDK's `xdotool` input support
|
|
219
|
-
|
|
220
|
-
|
|
222
|
+
(public-safe, since a template name is not a secret). Inert (warned) on every route
|
|
223
|
+
that creates no desktop, incl. the in-process `local-app` cua route, so it is
|
|
224
|
+
never silently ignored (invariant 6). Custom images need the
|
|
225
|
+
Desktop SDK's `xdotool` input support, `mktemp`, and the `C.UTF-8` locale:
|
|
226
|
+
every typed text is written to a private 0600 file and typed with
|
|
227
|
+
`LC_ALL=C.UTF-8 xdotool type --file` in one attempt. Without that locale a
|
|
228
|
+
type action with non-ASCII text fails with `text-command`; a dry-run does not
|
|
221
229
|
inspect the image's installed tools;
|
|
222
230
|
- `execution.desktop.browser` (e2b-desktop computer-use/fan-out routes, plus
|
|
223
|
-
|
|
231
|
+
shared-world participants): optional browser family
|
|
224
232
|
preference: `default`, `chrome`, `chromium`, or `firefox`. Absent/default
|
|
225
233
|
preserves the historical desktop opener behavior. A concrete value means
|
|
226
234
|
launch that browser or fail closed; when configured, the bundle records
|
|
@@ -230,86 +238,99 @@ A lab is a composition over code primitives, not a hardcoded kind:
|
|
|
230
238
|
when known. Inert (warned) where this route-specific browser launcher is not
|
|
231
239
|
used;
|
|
232
240
|
- `execution.terminal` + `execution.runtimeAuth` (terminal-product route):
|
|
233
|
-
`terminal.transport` is `exec-stream
|
|
241
|
+
`terminal.transport` is `exec-stream`: captured NON-interactive exec output
|
|
234
242
|
(stdin disabled); `pty` is rejected because labeling captured exec output as
|
|
235
243
|
an interactive PTY would overstate the mechanism (invariant 6; a true duplex
|
|
236
244
|
PTY transport does not ship). `terminal.stdin` defaults to `disabled`
|
|
237
245
|
(`sent`/assisted input is rejected until the interventions ledger + a
|
|
238
|
-
non-comparable marker exist). `runtimeAuth
|
|
239
|
-
runtime-auth channel
|
|
246
|
+
non-comparable marker exist). `runtimeAuth` (`openai-env`, the default, or `openai-egress`)
|
|
247
|
+
declares the agent's runtime-auth channel, recorded as NAMES ONLY. On a live run, the engine
|
|
240
248
|
resolves the registered terminal descriptor and requires
|
|
241
|
-
`keyPlacement: in-sandbox-command-scoped` before creating a sandbox.
|
|
242
|
-
is passed only to the agent command, never to `Sandbox.create` or
|
|
243
|
-
|
|
249
|
+
`keyPlacement: in-sandbox-command-scoped` before creating a sandbox. With `openai-env`
|
|
250
|
+
the key is passed only to the agent command, never to `Sandbox.create` or
|
|
251
|
+
metadata; with `openai-egress` it stays in the host-side E2B header transform
|
|
252
|
+
set at sandbox creation, and the agent gets a placeholder. A dry-run neither
|
|
253
|
+
reads nor injects it;
|
|
244
254
|
- `scenario`: `mode: dry-run` (contract evidence, no spend) or `live`.
|
|
245
255
|
`scenario.ref` is CONSUMED (and REQUIRED) on the scripted-browser route: it
|
|
246
256
|
resolves a committed scenario (`humanish/scenarios/<ref>.yaml` or a repo
|
|
247
257
|
path) whose `browser.steps` ARE what the actor executes, digest-pinned into
|
|
248
258
|
bundle provenance; on other routes `ref`/`inline` stay forward-declared
|
|
249
259
|
warnings. On the scripted route `live` gates real browser ACTUATION against
|
|
250
|
-
the declared app
|
|
260
|
+
the declared app. Provider spend stays $0 by mechanism (no model runs);
|
|
251
261
|
- `scenario.caps` (terminal-product route): `{ maxUsd, maxJobs, maxMinutes }`,
|
|
252
|
-
all non-negative numbers (0 = no-spend, the default).
|
|
253
|
-
|
|
254
|
-
|
|
262
|
+
all non-negative numbers (0 = no-spend, the default). This budget bounds the
|
|
263
|
+
in-sandbox live key by mechanism: the live key is never exercised without a
|
|
264
|
+
fail-closed cap in force. `maxMinutes` is the
|
|
255
265
|
wall-clock kill; `maxUsd`/`maxJobs` are enforced fail-closed against the cost
|
|
256
|
-
ledger (a run whose KNOWN spend exceeds the cap fails closed,
|
|
257
|
-
`HUMANISH_TERMINAL_LAB_CAPS_EXCEEDED`).
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
266
|
+
ledger after the session (a run whose KNOWN spend exceeds the cap fails closed,
|
|
267
|
+
`HUMANISH_TERMINAL_LAB_CAPS_EXCEEDED`). Core records Codex provider spend as
|
|
268
|
+
unpriced tokens, so without a cost probe no line can trip a positive `maxUsd`:
|
|
269
|
+
a live run refuses `maxUsd > 0` before creating a sandbox
|
|
270
|
+
(`HUMANISH_TERMINAL_LAB_UNPRICED_CAP`) unless the caller passes a `costProbe`
|
|
271
|
+
hook. The sandbox's server-side timeout is the steps before the
|
|
272
|
+
codex command (Node bootstrap, runtime version check, and product setup when
|
|
273
|
+
`subject.product.install` is declared) plus `maxMinutes` plus a 5-minute
|
|
274
|
+
teardown buffer; a live run refuses a `maxMinutes` that would take it past
|
|
275
|
+
E2B's one-hour limit (`HUMANISH_TERMINAL_LAB_CAPS_INVALID`). The no-spend proof is derived from that real ledger, never asserted (see
|
|
276
|
+
Terminal Cost Ledger And No-Spend Proof).
|
|
277
|
+
Inert (warned) on every other route, except that a positive
|
|
278
|
+
`scenario.caps.maxUsd` or `scenario.caps.maxTotalUsd` on a computer-use lab
|
|
279
|
+
is a parse error naming the matching `execution.caps` field, which is what
|
|
280
|
+
that route enforces;
|
|
281
|
+
- `policies`: `redactRepos`, `redactScreenshots`, `allowPublicTargets`,
|
|
282
|
+
`mediaPermission` (`prompt` | `granted`), and the
|
|
261
283
|
terminal-product credential-boundary booleans `allowPrivateRepoAccess`,
|
|
262
284
|
`allowProviderCredentials`, `allowPaymentCredentials`, `allowGitHubMutation`
|
|
263
|
-
(all DEFAULT FALSE
|
|
285
|
+
(all DEFAULT FALSE, deny-by-default; only the runtime LLM key enters, and
|
|
264
286
|
only command-scoped). The scripted-browser route is loopback-only and rejects
|
|
265
287
|
`redactScreenshots: true` (blur unimplemented there) and
|
|
266
288
|
`allowPublicTargets: true` fail-closed rather than ignoring them.
|
|
267
|
-
- `comms` (#297; hosted on the clone/local-tree computer-use
|
|
268
|
-
|
|
269
|
-
app-url/operator-provided subjects
|
|
270
|
-
shared worlds): off-app
|
|
289
|
+
- `comms` (#297; hosted on the clone/local-tree computer-use route and the
|
|
290
|
+
shared-world getHost plane, or connected to an external catch on
|
|
291
|
+
app-url/operator-provided subjects): off-app
|
|
271
292
|
email the app itself sends, made a persona-driven testable surface. Lab
|
|
272
293
|
configuration rejects `comms.sms` and unknown channel names; message-bus SMS
|
|
273
294
|
types do not imply a supported SMS execution route. SMTP capture is supported
|
|
274
|
-
on
|
|
275
|
-
`comms.email` = `{ kind: fake, injectEnv?, port?, recipients?, linkOrigin?, external? }`.
|
|
295
|
+
on provisioned routes with separate worlds and rejected for shared-world studies.
|
|
296
|
+
`comms.email` = `{ kind: fake, injectEnv?, port?, smtp?, recipients?, linkOrigin?, external? }`.
|
|
276
297
|
`injectEnv` is the ADOPTER-NAMED env var the app reads for its email-API base
|
|
277
298
|
URL (e.g. `RESEND_API_URL`); the harness sets it to an in-sandbox catch (so it
|
|
278
299
|
is NOT declared in `subject.env`) that captures the app's sends without touching
|
|
279
|
-
the internet
|
|
300
|
+
the internet. Verify the app actually reads that variable, because a run whose
|
|
280
301
|
catch captured zero sends warns at teardown for exactly that. `kind` must be
|
|
281
|
-
`fake
|
|
302
|
+
`fake`; a real inbox names a saved `comms.email.connection` instead; `port` ≤ 65534
|
|
282
303
|
(the catch reserves `port+1` for the read-only inbox listener the shared-world
|
|
283
304
|
route getHost-exposes). `recipients[]` = `{ lane, address? }`: OMIT the list
|
|
284
|
-
and the parser fills one deterministic address per
|
|
285
|
-
(`<laneId>@example.test`) so every
|
|
286
|
-
`lane` must be one of the lab's real
|
|
287
|
-
`lane-01..lane-NN` under `count`)
|
|
288
|
-
listing them, zero addressed
|
|
289
|
-
with the uncovered
|
|
305
|
+
and the parser fills one deterministic address per participant
|
|
306
|
+
(`<laneId>@example.test`) so every participant can do email (#351). When declared, a
|
|
307
|
+
`lane` must be one of the lab's real participant ids (roster ids, or the generated
|
|
308
|
+
`lane-01..lane-NN` under `count`). An unknown participant id is a hard parse error
|
|
309
|
+
listing them, zero addressed participants is a hard error, partial coverage warns
|
|
310
|
+
with the uncovered participants. Each addressed participant's actor prompt is extended with
|
|
290
311
|
the full handoff: its address ("enter exactly that"), the inbox URL, and the
|
|
291
312
|
wait steering ("waiting for an email is normal, not a blocker").
|
|
292
313
|
`external` (#328) switches the funnel to an ADOPTER-HOSTED catch, which is what
|
|
293
314
|
makes comms work on planes humanish does not provision (app-url /
|
|
294
315
|
operator-provisioned): `{ catchBaseUrl, inboxBaseUrl?, authTokenEnv? }`. The
|
|
295
|
-
operator runs the catch
|
|
296
|
-
humanish
|
|
297
|
-
|
|
298
|
-
|
|
316
|
+
operator runs the catch and points their own app's email-API base URL at it.
|
|
317
|
+
`humanish comms catch` runs the same implementation humanish deploys
|
|
318
|
+
in-sandbox, so the capture shape, inbox surface, and drain contract cannot
|
|
319
|
+
drift between the two planes. `injectEnv` is then absent and meaningless, since
|
|
299
320
|
there is no subject env for humanish to inject. humanish keeps every other
|
|
300
|
-
part: per-
|
|
321
|
+
part: per-participant addresses, the injected inbox handoff, a fail-closed readiness
|
|
301
322
|
probe before any actor spend (GET /health must return the
|
|
302
323
|
`humanish-comms-catch` marker, so a proxy answering 200 for everything cannot
|
|
303
324
|
pass for a catch), the teardown drain over `GET /deliveries`, and the same
|
|
304
325
|
digest-only evidence. `authTokenEnv` names an env var holding a bearer token
|
|
305
|
-
for the drain read
|
|
326
|
+
for the drain read. The NAME is recorded as evidence; the value never
|
|
306
327
|
persists. Declaring `external` on a harness-provisioned subject warns: two
|
|
307
328
|
catches would exist and the app would point at humanish's own. `linkOrigin`
|
|
308
329
|
is an optional operator-declared origin the app bakes into links when it
|
|
309
330
|
differs from the serve origin; the harness rewrites captured links through it
|
|
310
331
|
so a clicked link resolves to a reachable host. Captured mail is drained into a
|
|
311
332
|
digest-only `humanish.comms-thread.v1` artifact (from/to/subject/link DIGESTS +
|
|
312
|
-
an OTP COUNT
|
|
333
|
+
an OTP COUNT; no raw address/link/code persists). The READABLE proof a
|
|
313
334
|
persona saw the email is its screenshots of the inbox page. Requires `python3`
|
|
314
335
|
in the subject sandbox (the stock E2B desktop template has it).
|
|
315
336
|
|
|
@@ -356,28 +377,30 @@ run local-only regardless of screenshot redaction. See the
|
|
|
356
377
|
[receiving contract](../architecture/real-email-receiving.md).
|
|
357
378
|
|
|
358
379
|
Lab backends report results in their own schemas (`humanish.run-result.v1`,
|
|
359
|
-
`humanish.oss-lab-result.v1`, `humanish.oss-meta-lab-result.v1`,
|
|
360
380
|
`humanish.cua-lab-result.v2`, `humanish.scripted-lab-result.v1`,
|
|
361
|
-
`humanish.terminal-lab-result.v1
|
|
381
|
+
`humanish.terminal-lab-result.v1`,
|
|
382
|
+
`humanish.concurrent-shared-world-lab-result.v1`); the evidence record stays
|
|
362
383
|
`humanish.run-bundle.v1` in every case. The computer-use result bumped to v2 for
|
|
363
|
-
fan-out: it carries `plan` (the pre-flight
|
|
364
|
-
per-
|
|
365
|
-
length 1 at N=1; per-
|
|
366
|
-
(passed/skipped/
|
|
367
|
-
mirror the first
|
|
368
|
-
(omitted with a divergence warning when
|
|
384
|
+
fan-out: it carries `plan` (the pre-flight participant table: concurrency, waves,
|
|
385
|
+
per-participant session budget, worst-case sandbox-minutes), `lanes[]` (ALWAYS present,
|
|
386
|
+
length 1 at N=1; per-participant status/session/sandbox/subject), and `laneSummary`
|
|
387
|
+
(passed/skipped/harnessErrors/hollow counts). The top-level `session`/`sandbox`
|
|
388
|
+
mirror the first participant and `subject.commit` is unanimity-gated across participants
|
|
389
|
+
(omitted with a divergence warning when participants resolve different commits). At N=1
|
|
369
390
|
the run bundle is byte-stable with the pre-fan-out output; only the result
|
|
370
391
|
projection changed. A fan-out run records a `cua-lab.fanout.plan` bundle event
|
|
371
|
-
(and a `cua-lab.fanout.fail-fast` event when a harness error skips queued
|
|
372
|
-
`ok = observer.ok ∧
|
|
373
|
-
|
|
392
|
+
(and a `cua-lab.fanout.fail-fast` event when a harness error skips queued participants);
|
|
393
|
+
`ok = observer.ok ∧ every participant ok ∧ no failed adapter or declared-scorer verdict`,
|
|
394
|
+
where a dry-run participant is ok as contract evidence and a live participant must pass
|
|
395
|
+
`participantPassed` (`src/run/judge.ts`): not skipped, status `passed`, no harness
|
|
396
|
+
error, engaged, and no self-reported blocker.
|
|
374
397
|
|
|
375
|
-
Explicit failed-
|
|
398
|
+
Explicit failed-participant reruns are supported on the CUA fan-out route via
|
|
376
399
|
`humanish lab run <lab> --rerun-failed-from <run-id> [--lanes lane-a,lane-b]`.
|
|
377
|
-
The source run must be a live CUA fan-out bundle.
|
|
378
|
-
the selected failed/blocked/timed-out/hollow
|
|
400
|
+
The source run must be a live CUA fan-out bundle. humanish creates a NEW run for
|
|
401
|
+
the selected failed/blocked/timed-out/hollow participants (or explicit participant ids), leaves
|
|
379
402
|
the source verdict unchanged, and records lineage as `run.rerun` plus a
|
|
380
|
-
`cua-lab.fanout.rerun` event: source run id, selected
|
|
403
|
+
`cua-lab.fanout.rerun` event: source run id, selected participant ids, and previous participant
|
|
381
404
|
statuses/reasons. This is intentionally not automatic retry; a passing rerun is a
|
|
382
405
|
nondeterminism candidate for human/product scoring, not a rewrite of the old run.
|
|
383
406
|
|
|
@@ -407,8 +430,9 @@ defaults:
|
|
|
407
430
|
|
|
408
431
|
## Run Bundle
|
|
409
432
|
|
|
410
|
-
Run bundles are the
|
|
411
|
-
|
|
433
|
+
Run bundles are the evidence record. Observer data, review Markdown, feedback
|
|
434
|
+
drafts, and issue text are projections from the bundle
|
|
435
|
+
([decision 0001](../decisions/0001-run-bundle-is-the-source-of-truth.md)).
|
|
412
436
|
|
|
413
437
|
Core-owned fields:
|
|
414
438
|
|
|
@@ -417,6 +441,7 @@ Core-owned fields:
|
|
|
417
441
|
- `mode`
|
|
418
442
|
- `simCount`
|
|
419
443
|
- `createdAt`
|
|
444
|
+
- `cwd` (always `[target-cwd]`)
|
|
420
445
|
- `artifactRoot`
|
|
421
446
|
- `source.git`
|
|
422
447
|
- `lifecycle`
|
|
@@ -427,40 +452,41 @@ Core-owned fields:
|
|
|
427
452
|
- `artifacts`
|
|
428
453
|
- `review`
|
|
429
454
|
- `feedbackCandidates`
|
|
430
|
-
- `lab` (optional, additive): which manifest produced the run
|
|
455
|
+
- `lab` (optional, additive): which manifest produced the run,
|
|
431
456
|
`{ id, path?, origin? }`, where `origin` is `committed` (humanish/labs),
|
|
432
457
|
`ignored` (a local overlay), or `explicit` (a path the operator passed).
|
|
433
458
|
Absent on bundles written before this contract and on library callers who
|
|
434
|
-
hand a `LabConfig` directly
|
|
435
|
-
|
|
459
|
+
hand a `LabConfig` directly. Such a run has no lab, and nothing guesses
|
|
460
|
+
one. Readers wanting attribution for an older bundle may fall back to
|
|
436
461
|
`inferLegacyLabId`, which reads only the historical
|
|
437
462
|
`persona.source = "lab:<id>"` convention and nothing else.
|
|
438
|
-
- `subject` (optional, additive): structured subject provenance
|
|
463
|
+
- `subject` (optional, additive): structured subject provenance,
|
|
439
464
|
`{ source: clone | app-url | local-tree, repo?, commit?, archiveSha256?,
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
465
|
+
dirty?, envNames?, state }` where `state` is `{ provenance: seeded |
|
|
466
|
+
unpinned | declared-not-run | undeclared | external-public, seed?: [{ name, when,
|
|
467
|
+
commandDigest, ok?, exitCode?, timedOut?, durationMs? }], externalEnvNames?
|
|
468
|
+
}`. Emitted by the computer-use and shared-world backends and the clone
|
|
469
|
+
scripted-browser route; absent on pre-existing and other bundles. `repo`/`commit` are clone-route fields; `archiveSha256`
|
|
445
470
|
(64-hex sha256, the local-tree provenance pin) and `dirty` (host git
|
|
446
471
|
porcelain status at pack time) are local-tree-route fields, additive under
|
|
447
472
|
`humanish.run-bundle.v1`: a dirty working tree cannot be commit-pinned, so
|
|
448
473
|
the archive content digest stands in for it. `commandDigest` is the
|
|
449
|
-
sha256-16 of the exact seed command
|
|
474
|
+
sha256-16 of the exact seed command; command text and env values never
|
|
450
475
|
appear. `humanish verify` fails closed when a LIVE `local-tree` bundle carries
|
|
451
476
|
no well-formed `archiveSha256`, in addition to the existing `subject state
|
|
452
|
-
|
|
477
|
+
provenance` check.
|
|
453
478
|
- `desktopTemplate` (optional, additive): the custom E2B desktop TEMPLATE (image)
|
|
454
|
-
the run's sandbox(es) launched on, from `execution.desktop.template
|
|
479
|
+
the run's sandbox(es) launched on, from `execution.desktop.template`, so the
|
|
455
480
|
evidence shows WHICH image ran. Present only when a template was configured;
|
|
456
481
|
absent == the stock `desktop` template, so every pre-existing bundle is
|
|
457
482
|
byte-stable. Public-safe (a template name is not a secret).
|
|
458
483
|
- `attributionClass` (optional, additive): `isolated | shared-world`. Absent ==
|
|
459
|
-
`isolated`, so every existing bundle is byte-stable.
|
|
460
|
-
|
|
461
|
-
to `shared-world` by the shared-world backend, paired
|
|
484
|
+
`isolated`, so every existing bundle is byte-stable. It is the
|
|
485
|
+
interaction-attribution axis (#164), independent of the persona-sampling
|
|
486
|
+
evidence classes. Set to `shared-world` by the shared-world backend, paired
|
|
487
|
+
with `sharedWorld`.
|
|
462
488
|
- `sharedWorld` (optional, additive): the shared-world evidence block
|
|
463
|
-
(`humanish.shared-world.v1`)
|
|
489
|
+
(`humanish.shared-world.v1`); see [Shared-World Evidence](#shared-world-evidence)
|
|
464
490
|
below. Present only on shared-world runs; verified fail-closed by the
|
|
465
491
|
`shared-world evidence` check in `humanish verify`.
|
|
466
492
|
|
|
@@ -472,7 +498,7 @@ Adapter-owned fields:
|
|
|
472
498
|
- `scenario`
|
|
473
499
|
- target-specific stream labels and public-safe summaries
|
|
474
500
|
|
|
475
|
-
|
|
501
|
+
Abbreviated synthetic fixture (omits `cwd`, `simulations`, `streams` and `events`):
|
|
476
502
|
|
|
477
503
|
```yaml
|
|
478
504
|
schema: humanish.run-bundle.v1
|
|
@@ -531,80 +557,89 @@ feedbackCandidates: []
|
|
|
531
557
|
|
|
532
558
|
## Shared-World Evidence
|
|
533
559
|
|
|
534
|
-
The shared-world topology (#164) is the DECLARED override of the per-lane-worlds
|
|
560
|
+
The shared-world topology (#164) is the DECLARED override of the `per-lane-worlds`
|
|
535
561
|
default: N distinct actor ROLES drive ONE provisioned, mutable service plane (one
|
|
536
562
|
app + one seeded DB) so their actions interact through shared state. The ONE
|
|
537
563
|
subject plane is provisioned via `subject.source: clone` (a fresh `git clone`) or
|
|
538
564
|
`subject.source: local-tree` (the operator's own working tree, packed on the host
|
|
539
565
|
and provisioned in-sandbox in place of a clone - see `subject.localTree` above);
|
|
540
|
-
both sources are accepted on the
|
|
541
|
-
|
|
566
|
+
both sources are accepted on the shared-world route.
|
|
567
|
+
|
|
568
|
+
Current runs write only the CONCURRENT shape below. The SEQUENTIAL shape came from the
|
|
569
|
+
sequential shared-world route, which 0.106.0 removed. Only bundles written before
|
|
570
|
+
0.106.0 carry it, and `humanish verify` still checks them
|
|
571
|
+
(`tests/run/legacy-sequential-shared-world.test.ts`). The SEQUENTIAL rules below apply
|
|
572
|
+
to those bundles.
|
|
573
|
+
|
|
574
|
+
A shared-world bundle adds TWO additive, optional fields to `humanish.run-bundle.v1`
|
|
542
575
|
(absent on every other bundle, so they stay byte-stable):
|
|
543
576
|
|
|
544
|
-
- `attributionClass: isolated | shared-world
|
|
577
|
+
- `attributionClass: isolated | shared-world`: a separate attribution axis
|
|
545
578
|
("how well did the run attribute INTERACTION?"), distinct from the persona-sampling
|
|
546
579
|
evidence classes ("how representative is the actor?"). Absent == `isolated`.
|
|
547
580
|
- `sharedWorld` (`humanish.shared-world.v1`): TWO variants discriminated by
|
|
548
|
-
`topologyMode: "sequential" | "concurrent"` (
|
|
581
|
+
`topologyMode: "sequential" | "concurrent"` (`sharedWorldEvidenceFindings` in `src/verify/shared-world.ts` branches on
|
|
549
582
|
it FIRST; unknown/missing or a mismatched shape fails closed). Common fields:
|
|
550
583
|
- `topology: shared-world`
|
|
551
584
|
- `topologyMode: sequential | concurrent`
|
|
552
|
-
- `roleCount
|
|
553
|
-
- `plane: { commit?, seedDigest, envNames, hostDigest?, exposure?, publicOriginDigest? }
|
|
585
|
+
- `roleCount`: the DECLARED number of participants.
|
|
586
|
+
- `plane: { commit?, seedDigest, envNames, hostDigest?, exposure?, publicOriginDigest?, declaredOriginDigest? }`: the ONE
|
|
554
587
|
shared-plane provenance. `seedDigest` is the sha256-16 of the ordered seed-step
|
|
555
588
|
command digests (the seed RECIPE identity, not the runtime state); `envNames` are
|
|
556
589
|
NAMES only. `hostDigest`/`exposure` are CONCURRENT provisioned-getHost-only, and
|
|
557
590
|
`publicOriginDigest` is CONCURRENT external-public-only (below).
|
|
558
591
|
- `planeClass?: provisioned-getHost | external-public` and `lobbyConvergenceDigest?` are
|
|
559
592
|
CONCURRENT-only (below); both absent on the sequential shape.
|
|
560
|
-
- `attributionLimits: [...]
|
|
593
|
+
- `attributionLimits: [...]`: the verify-enforced attribution ceiling (the set
|
|
561
594
|
differs per `topologyMode`, below).
|
|
562
595
|
|
|
563
|
-
SEQUENTIAL shape (`topologyMode: sequential`, #164 PR1
|
|
564
|
-
|
|
565
|
-
- `
|
|
566
|
-
|
|
596
|
+
SEQUENTIAL shape (`topologyMode: sequential`, #164 PR1; only in bundles written before
|
|
597
|
+
0.106.0):
|
|
598
|
+
- `sequence: [roleId, …]`: the role ids that actually took a turn, in declared order.
|
|
599
|
+
- `skippedTail` (optional, live sequential only): `{ afterRoleId, roles,
|
|
600
|
+
cause, maxTotalUsd?, estimatedTotalUsd? }`. Each ordered `roles` entry names
|
|
567
601
|
`{ roleId, simId, streamId }` for an unstarted participant. Together with the
|
|
568
602
|
executed prefix it must account for the full declared denominator. The
|
|
569
603
|
predecessor must have a matching `harness_error`, explicit `session_error`,
|
|
570
604
|
`usage_unreported`, or measured `study_spend_limit`. Only the last cause
|
|
571
605
|
carries budget figures, using the same per-participant estimates as the
|
|
572
|
-
tracker. Blocked
|
|
606
|
+
tracker. Blocked participants need matching simulation, stream and blocked-event
|
|
573
607
|
evidence, with no actor, trace, screenshot or invented timeline turn.
|
|
574
608
|
Historical bundles without this field still require every role in the timeline.
|
|
575
|
-
- `timeline: (checkpoint | turn)[]
|
|
609
|
+
- `timeline: (checkpoint | turn)[]`: a harness-clocked, strictly alternating
|
|
576
610
|
timeline that starts `cp-baseline`, alternates checkpoint → turn → checkpoint,
|
|
577
611
|
and ends on a checkpoint:
|
|
578
|
-
- checkpoint = `{ kind: checkpoint, name, digest, deltaFromPrev }
|
|
612
|
+
- checkpoint = `{ kind: checkpoint, name, digest, deltaFromPrev }`; `digest` is
|
|
579
613
|
sha256-16(scrub+redact(probe stdout)); the record is DIGEST-ONLY (no
|
|
580
614
|
value-shaped field). `deltaFromPrev` is true when the observed state changed
|
|
581
615
|
across the intervening turn.
|
|
582
|
-
- turn = `{ kind: turn, roleId, simId, streamId, commit?, seedDigest }`
|
|
583
|
-
a real
|
|
584
|
-
|
|
616
|
+
- turn = `{ kind: turn, roleId, simId, streamId, commit?, seedDigest }` references
|
|
617
|
+
a real `RunBundle["simulations"][number]` and `RunBundle["streams"][number]`; carries the
|
|
618
|
+
plane provenance it observed
|
|
619
|
+
(identical across turns by construction; this is the single-plane proof).
|
|
585
620
|
- Sequential `attributionLimits` MUST contain `sequential-only`, `no-concurrent-races`,
|
|
586
621
|
and `delta-attributed-to-turn-not-action`.
|
|
587
622
|
|
|
588
|
-
CONCURRENT shape (`topologyMode: concurrent`, #164 phase 2
|
|
623
|
+
CONCURRENT shape (`topologyMode: concurrent`, #164 phase 2: N personas drive ONE
|
|
589
624
|
getHost-exposed plane AT ONCE; NO `timeline`/`sequence`):
|
|
590
|
-
- `plane.hostDigest
|
|
591
|
-
drove (a first-class provisioned-subject target
|
|
625
|
+
- `plane.hostDigest`: sha256-16 of the harness-minted `getHost` ORIGIN every actor
|
|
626
|
+
drove (a first-class provisioned-subject target; invariant 2). A DIGEST, not the raw
|
|
592
627
|
URL: a getHost URL embeds the live sandbox id and matches the publish-safety e2b-URL
|
|
593
628
|
redaction, so it never lands raw in a published bundle (the raw tokenless URL is
|
|
594
629
|
surfaced only on the ephemeral lab result). The orchestrator confirms the URL is
|
|
595
|
-
TOKENLESS (no authKey
|
|
596
|
-
- `plane.exposure: synthetic
|
|
630
|
+
TOKENLESS (no authKey; invariant 1) before digesting.
|
|
631
|
+
- `plane.exposure: synthetic`: the REQUIRED author attestation that the subject behind
|
|
597
632
|
the internet-reachable getHost URL is synthetic seeded data (author-trust + a
|
|
598
633
|
provenance gate, NOT a no-real-data guarantee).
|
|
599
634
|
- `laneWindows: [{ roleId, simId, streamId, startedAt, endedAt, verdict, routeHostDigest,
|
|
600
|
-
|
|
635
|
+
commit?, seedDigest }]`: one harness-clocked window per actor; OVERLAPPING windows
|
|
601
636
|
prove ≥2 personas were active simultaneously. `routeHostDigest` == `plane.hostDigest`
|
|
602
637
|
(every actor drove exactly the harness-minted host).
|
|
603
|
-
- `stateSeries: [{ timestamp, digest }]
|
|
638
|
+
- `stateSeries: [{ timestamp, digest }]`: cadence digests of the shared world under
|
|
604
639
|
load (baseline + periodic + final). DIGEST-ONLY: the allowed-keys tripwire permits
|
|
605
|
-
ONLY `timestamp` + `digest` (no per-delta→actor field
|
|
606
|
-
structurally inexpressible).
|
|
607
|
-
- `outcomes: [{ roleId, simId, streamId, status, completionReason?, ok }]
|
|
640
|
+
ONLY `timestamp` + `digest` (no per-delta→actor field, because causation under concurrency
|
|
641
|
+
is structurally inexpressible).
|
|
642
|
+
- `outcomes: [{ roleId, simId, streamId, status, completionReason?, ok }]`: per-persona
|
|
608
643
|
OUTCOME (the "M of N succeeded" headline).
|
|
609
644
|
- Concurrent `attributionLimits` MUST contain `concurrent`,
|
|
610
645
|
`best-effort-causal-attribution`, `non-deterministic-shared-state`,
|
|
@@ -619,12 +654,12 @@ end on a checkpoint, turn order == sequence, sequence length == roleCount == tur
|
|
|
619
654
|
count, no `laneWindows`); every turn's simId/streamId resolves; every checkpoint digest
|
|
620
655
|
is sha256-16 with NO value-shaped field; all turns share ONE plane provenance; the
|
|
621
656
|
mandatory limits are present; and a PASSED run shows ≥1 checkpoint `deltaFromPrev` (the
|
|
622
|
-
delta-on-pass gate). CONCURRENT: no `timeline`; laneWindows
|
|
623
|
-
cover exactly roleCount; the required limits are present AND the forbidden ones absent;
|
|
657
|
+
delta-on-pass gate). CONCURRENT: no `timeline`; laneWindows and outcomes each
|
|
658
|
+
cover exactly roleCount and stateSeries is present; the required limits are present AND the forbidden ones absent;
|
|
624
659
|
`plane.hostDigest` present and every `routeHostDigest` equals it (invariant 2);
|
|
625
660
|
`plane.exposure == synthetic` AND `subject.state.provenance == seeded` (the
|
|
626
661
|
synthetic-subject gate); stateSeries snapshots are digest-only (allowed-keys tripwire);
|
|
627
|
-
all laneWindows share ONE plane provenance; and the CONCURRENCY-ON-PASS gate
|
|
662
|
+
all laneWindows share ONE plane provenance; and the CONCURRENCY-ON-PASS gate: a PASSED
|
|
628
663
|
run MUST show ≥2 overlapping laneWindows AND a stateSeries delta whose timestamp is
|
|
629
664
|
AT/AFTER an overlap interval start (otherwise it was not actually concurrent, or the
|
|
630
665
|
world never changed under load). The per-role no-engagement guard applies to both.
|
|
@@ -633,8 +668,8 @@ detector lands.
|
|
|
633
668
|
|
|
634
669
|
WHAT THE BUNDLE CAN / CANNOT CLAIM. SEQUENTIAL: each role's own behavior at full
|
|
635
670
|
fidelity; the OBSERVED system outcome as an ordered DIGEST sequence; and the
|
|
636
|
-
SEQUENCED-INTERACTION proof (role B entered a world already containing role A's mutation
|
|
637
|
-
|
|
671
|
+
SEQUENCED-INTERACTION proof (role B entered a world already containing role A's mutation;
|
|
672
|
+
the checkpoint after A strictly precedes B's turn). It CANNOT claim action-granular
|
|
638
673
|
causation, concurrency/races (sequential-only), or exact-state determinism. CONCURRENT:
|
|
639
674
|
each persona's own behavior at full fidelity; per-persona OUTCOME against the contended
|
|
640
675
|
world ("M of N"); PROVEN CONCURRENCY (overlapping windows); and system-state evolution
|
|
@@ -653,31 +688,33 @@ The CONCURRENT shape carries a PLANE-class discriminator, `sharedWorld.planeClas
|
|
|
653
688
|
concurrent bundle byte-stable). It gates EVERY getHost-specific verify assertion, so a getHost
|
|
654
689
|
claim can never leak onto the external-public class (or vice versa).
|
|
655
690
|
|
|
656
|
-
- `provisioned-getHost
|
|
691
|
+
- `provisioned-getHost`: the historical plane described above: a `clone`/`local-tree` subject the
|
|
657
692
|
harness serves + getHost-exposes in-sandbox. The harness MINTED the host, so it asserts the
|
|
658
693
|
synthetic-seeded attestation (`plane.exposure: synthetic` + `subject.state.provenance == seeded`),
|
|
659
694
|
the harness-minted host identity (`plane.hostDigest`, every `routeHostDigest == it`), and an
|
|
660
695
|
authoritative in-sandbox checkpoint `stateSeries` with a delta-on-pass.
|
|
661
696
|
|
|
662
|
-
- `external-public
|
|
697
|
+
- `external-public`: a real, operator-OWNED public deployment used DIRECTLY as the shared plane
|
|
663
698
|
(`subject.source: app-url` + `topology: shared-world` + `policies.allowPublicTargets: true` +
|
|
664
699
|
`execution.concurrency > 1`). NO getHost, NO clone, NO subject sandbox, NO seed. The subject
|
|
665
|
-
carries the ownership attestation `subject.publicTarget: { owner, authorized: true }` (the
|
|
666
|
-
analog of `exposure: synthetic
|
|
700
|
+
carries the ownership attestation `subject.publicTarget: { owner, authorized: true }` (the
|
|
701
|
+
analog of `exposure: synthetic`: you cannot attest synthetic on a real site, but you MUST attest
|
|
667
702
|
you own/operate it; author-trust, unverifiable by the harness). Evidence deltas, all
|
|
668
703
|
asserted-absent (never silently dropped):
|
|
669
|
-
- `plane.publicOriginDigest
|
|
670
|
-
`laneWindow.routeHostDigest` (computed from that
|
|
671
|
-
|
|
704
|
+
- `plane.publicOriginDigest`: sha256-16 of the one OBSERVED origin the participants converged on. Every
|
|
705
|
+
`laneWindow.routeHostDigest` (computed from that participant's CDP-OBSERVED final-URL origin) equals it.
|
|
706
|
+
`plane.declaredOriginDigest` records the operator-declared origin as evidence only; a redirect
|
|
707
|
+
can make the two differ. This proves inter-participant CONVERGENCE on one origin, NOT harness control of the plane
|
|
672
708
|
(WEAKER than getHost's `hostDigest`, and disclosed).
|
|
673
|
-
- `plane.exposure` is ABSENT (verify fails closed if `synthetic` appears
|
|
709
|
+
- `plane.exposure` is ABSENT (verify fails closed if `synthetic` appears, since that
|
|
710
|
+
attestation would be false on a real site);
|
|
674
711
|
`plane.hostDigest` is ABSENT (the harness minted no host).
|
|
675
|
-
- `subject.state.provenance == "external-public"`
|
|
712
|
+
- `subject.state.provenance == "external-public"` (never `seeded`, `unpinned` or `undeclared`).
|
|
676
713
|
- `stateSeries` is OMITTED (Option A): no in-sandbox filesystem to authoritatively digest, so there
|
|
677
714
|
is NO authoritative shared-state proof. Concurrency-on-pass is RELAXED to temporal co-occupancy
|
|
678
715
|
ONLY (≥2 overlapping `laneWindows`); there is no state-delta requirement.
|
|
679
|
-
- `lobbyConvergenceDigest` (optional, strong, cheap)
|
|
680
|
-
all
|
|
716
|
+
- `lobbyConvergenceDigest` (optional, strong, cheap): sha256-16 of the shared `/lobby/CODE` PATH
|
|
717
|
+
all participants' CDP URLs converged on; present only when every participant converged on ONE code. Digest-only
|
|
681
718
|
(the raw 6-char code and full URLs are runtime-only and never land).
|
|
682
719
|
- `attributionLimits` MUST contain the concurrent family PLUS `external-public-plane`,
|
|
683
720
|
`operator-attested-target-not-harness-controlled`, `no-synthetic-attestation`,
|
|
@@ -687,7 +724,7 @@ claim can never leak onto the external-public class (or vice versa).
|
|
|
687
724
|
The getHost synthetic gate is deliberately NOT reachable from the app-url branch, and why: that gate
|
|
688
725
|
exists because getHost is internet-reachable AND harness-owned (real data behind a harness-exposed
|
|
689
726
|
URL is the hazard). A public site the harness neither provisioned nor exposed has neither property,
|
|
690
|
-
so the gate's hazard does not exist there. Attribution stays `shared-world` (N
|
|
727
|
+
so the gate's hazard does not exist there. Attribution stays `shared-world` (N participants, ONE plane); the
|
|
691
728
|
plane-control claim degrades from "harness-controlled" to "operator-attested, observed-only".
|
|
692
729
|
|
|
693
730
|
## Adapter
|
|
@@ -807,50 +844,56 @@ separate dispatch, usage, or cleanup evidence, and does not establish the cause
|
|
|
807
844
|
of a timeout. Participant outcome text includes the phase when available.
|
|
808
845
|
|
|
809
846
|
Actors execute or simulate the trial. Actor evidence is the provider-neutral
|
|
810
|
-
`humanish.actor-trace.v1` (`src/
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
`
|
|
815
|
-
`
|
|
816
|
-
|
|
847
|
+
`humanish.actor-trace.v1` (`src/actors/contract.ts`): Codex app-server items,
|
|
848
|
+
computer-use cycles, scripted browser steps, and in-sandbox terminal-agent exec
|
|
849
|
+
output all map onto one `ActorTrace`. Registered actors live in
|
|
850
|
+
`src/actors/registry.ts` (`codex-app-server`, `openai-computer-use`,
|
|
851
|
+
`local-agent`, `scripted-browser`, `codex-exec`). A lab that names
|
|
852
|
+
`pi-agent-core` or `claude-agent-sdk` fails to parse. There is no
|
|
853
|
+
`humanish.actor.v1`; that name never shipped.
|
|
817
854
|
|
|
818
855
|
Core-owned fields:
|
|
819
856
|
|
|
820
857
|
- `schema`
|
|
821
858
|
- `provider` / `providerVersion`
|
|
822
|
-
- `protocol` (`json-rpc` | `json-stream` | `
|
|
823
|
-
`
|
|
824
|
-
- `lane` (`code` | `
|
|
859
|
+
- `protocol` (`json-rpc` | `json-stream` | `cua-loop` | `scripted-steps` |
|
|
860
|
+
`terminal-exec`)
|
|
861
|
+
- `lane` (`code` | `computer-use` | `scripted-browser` | `terminal`)
|
|
825
862
|
- `persona` (`id`, `traitsApplied`, `promptDigest`)
|
|
826
863
|
- `capabilities.keyPlacement` (`external` | `in-sandbox-command-scoped`): WHERE
|
|
827
|
-
the actor's runtime key lives
|
|
864
|
+
the actor's runtime key lives. It is registry metadata the engine enforces. The
|
|
828
865
|
terminal agent declares `in-sandbox-command-scoped` (the agent-under-test runs
|
|
829
866
|
inside the sandbox); every other actor is `external` (absent === external).
|
|
830
867
|
- `redaction` (`status`, `screenshots: n/a|raw|blurred|ocr_scrubbed`, `notes`)
|
|
831
868
|
- `startedAt` / `completedAt` / `durationMs`
|
|
832
869
|
- `status` / `completionReason` / `reason` (`completionReason` includes
|
|
833
|
-
`step_failed`: a deterministic scripted step/expectation evaluated false
|
|
834
|
-
the subject failed the script while the harness executed faithfully; and
|
|
835
|
-
`budget_reached`: a computer-use session
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
870
|
+
`step_failed`: a deterministic scripted step/expectation evaluated false,
|
|
871
|
+
meaning the subject failed the script while the harness executed faithfully; and
|
|
872
|
+
`budget_reached`: a computer-use session ended by a limit. The loop
|
|
873
|
+
(`src/actors/computer-use/loop/ending.ts`) emits it when the time budget runs
|
|
874
|
+
out after at least one material action, when `execution.caps.maxUsd` or the
|
|
875
|
+
study's shared spend threshold is crossed, when the adapter reports a local
|
|
876
|
+
admission limit, or when the provider hits its output or context token limit.
|
|
877
|
+
Every `budget_reached` session has status `incomplete`
|
|
878
|
+
(`statusForCompletionReason` in `src/actors/computer-use/loop/trace.ts`), and
|
|
879
|
+
`stopCause` names the limit. Other incomplete provider responses end as
|
|
880
|
+
`harness_error`. None of these establishes that the goal was reached.
|
|
881
|
+
`timed_out` remains the zero-progress wall-clock deadline outcome)
|
|
839
882
|
- `ids`, `counts`, `items[]`, optional `tokenUsage`, `capabilities`. `tokenUsage`
|
|
840
883
|
may carry `cacheWriteInput` (tokens billed at the provider's cache-write rate,
|
|
841
884
|
OpenAI 5.6+) and `turns[]` (per provider-request usage, the recorded fact
|
|
842
|
-
long-context tier pricing needs)
|
|
885
|
+
long-context tier pricing needs). Both are additive and absent on
|
|
843
886
|
producers that do not report them (#334). Items may
|
|
844
887
|
carry `at` (ISO-8601 recording stamp from the loop's clock) and, on
|
|
845
|
-
click-like `ui_action` items, structured `coord` (`x`/`y`)
|
|
888
|
+
click-like `ui_action` items, structured `coord` (`x`/`y`). Both are additive
|
|
846
889
|
(#441): absent on older bundles and non-stamping producers, and absence means
|
|
847
890
|
"timing/position unrecorded", never zero
|
|
848
891
|
- optional `modelSettings` (`humanish.model-settings.v1`, #497): HOW the model was
|
|
849
892
|
asked to run, alongside `ids.model` which says which model it was.
|
|
850
893
|
`reasoningEffort` records the value the request ACTUALLY carried,
|
|
851
|
-
including the provider default when a lab declared nothing
|
|
852
|
-
value is what produced the trace,
|
|
853
|
-
|
|
894
|
+
including the provider default when a lab declared nothing. The resolved
|
|
895
|
+
value is what produced the trace, and recording "unset" would misdescribe
|
|
896
|
+
the run. Absent when a provider declares no settings and on every
|
|
854
897
|
pre-existing bundle; tolerated by verify. It exists because effort was
|
|
855
898
|
unreachable from a lab, which made every run take the default silently. Effort
|
|
856
899
|
is part of WHO the participant was rather than of how the instrument was tuned
|
|
@@ -858,19 +901,28 @@ Core-owned fields:
|
|
|
858
901
|
half its sample description
|
|
859
902
|
- optional `modelSettings.maxOutputTokens`: the declared positive integer
|
|
860
903
|
`actors[0].maxOutputTokens`, passed to every first-party OpenAI CUA response
|
|
861
|
-
request, including reasoning output. Absent when undeclared
|
|
862
|
-
|
|
863
|
-
|
|
904
|
+
request, including reasoning output. Absent when undeclared. The first request
|
|
905
|
+
of a session and closing reports use `min(maxOutputTokens, 1024)`, or 1024 when
|
|
906
|
+
undeclared; the first request also carries the opening screenshot as an
|
|
907
|
+
`input_image` after the instructions. Unsupported routes,
|
|
908
|
+
custom provider/session hooks, and per-participant overrides fail before allocation.
|
|
864
909
|
This is an output-token limit, not an input-token, request-count or billing cap.
|
|
910
|
+
A reply cut off by it runs no action. The first-party OpenAI provider sets that
|
|
911
|
+
reply aside, and the loop sends the same request once more after booking the
|
|
912
|
+
cut-off reply's usage and checking the spend caps; the trace records a
|
|
913
|
+
“provider reply cut off by the output limit; asking again” notice. A second
|
|
914
|
+
cut-off reply to the same request ends the session with
|
|
915
|
+
`stopCause: provider_output_limit`.
|
|
865
916
|
- optional `affordanceUse` (`humanish.affordance-use.v1`): which KIND of route this
|
|
866
917
|
actor took (see Affordance Use below)
|
|
867
918
|
- optional `estimatedCost` (`humanish.actor-estimated-cost.v1`): a token-derived
|
|
868
|
-
cost ESTIMATE for this
|
|
919
|
+
cost ESTIMATE for this participant (see Run Cost Summary And Estimated Actor Cost).
|
|
869
920
|
It is deliberately a DIFFERENT field from `tokenUsage.costUsd`: a bare
|
|
870
921
|
`costUsd` is RESERVED for a real provider-returned charge, while
|
|
871
922
|
`estimatedCost.estimatedCostUsd` is a rate-table multiply, named honestly as
|
|
872
923
|
an estimate so a reader can never confuse the two (invariant 6). Absent on
|
|
873
|
-
|
|
924
|
+
the Codex app-server and scripted routes and on every pre-existing bundle; the
|
|
925
|
+
terminal route records a `null` estimate. A `null`
|
|
874
926
|
`estimatedCostUsd` is DECLARED ABSENT (unknown rate / no usage), never 0.
|
|
875
927
|
|
|
876
928
|
Unexpected actor-loop diagnostics live inside `items[]` as
|
|
@@ -881,10 +933,10 @@ values, target URLs, or unredacted provider payloads.
|
|
|
881
933
|
|
|
882
934
|
Adapter-owned fields:
|
|
883
935
|
|
|
884
|
-
- the prompt, mission, persona text, and
|
|
936
|
+
- the prompt, mission, persona text, and participant focus that produced the trace
|
|
885
937
|
- product-specific acceptance notes
|
|
886
938
|
|
|
887
|
-
Synthetic fixture (abridged; see `src/
|
|
939
|
+
Synthetic fixture (abridged; see `src/actors/contract.ts` for the full type):
|
|
888
940
|
|
|
889
941
|
```yaml
|
|
890
942
|
schema: humanish.actor-trace.v1
|
|
@@ -913,28 +965,28 @@ items: []
|
|
|
913
965
|
## Substrate
|
|
914
966
|
|
|
915
967
|
Reserved: `humanish.substrate.v1` is named here for layering intent but has
|
|
916
|
-
never shipped
|
|
968
|
+
never shipped; no code emits or validates it. Substrate truth today lives
|
|
917
969
|
inside run bundles (per-stream transport and status) and lab execution config
|
|
918
|
-
(`execution.target: local | e2b-desktop`). Do not emit this schema.
|
|
970
|
+
(`execution.target: local | e2b-desktop | e2b-terminal`). Do not emit this schema.
|
|
919
971
|
|
|
920
972
|
## Serve Result And Reserved Control-Plane Namespace
|
|
921
973
|
|
|
922
974
|
`humanish serve` reports `humanish.serve-result.v1`. The exported `ServeResult`
|
|
923
|
-
type and `SERVE_SCHEMA` constant in `src/observer
|
|
975
|
+
type and `SERVE_SCHEMA` constant in `src/observer/serve.ts` are authoritative:
|
|
924
976
|
mode (`loopback | exposed | share-safe-open`), the loopback host/port,
|
|
925
977
|
`publicUrl`, the `tunnel` provider/url, an `oauth` echo (`provider`,
|
|
926
|
-
`allowEmails`, `allowDomains
|
|
978
|
+
`allowEmails`, `allowDomains`: operator-supplied allow rules, public-safe to
|
|
927
979
|
echo to the operator's own stdout, never persisted into any bundle), runs
|
|
928
980
|
listed, computed warnings, and the `ServeErrorCode` union. Exposure auth is
|
|
929
|
-
tunnel-edge only
|
|
981
|
+
tunnel-edge only. As of 0.20.0 there are no `capabilityUrl`/`publicCapabilityUrl`
|
|
930
982
|
/`ttlMinutes` fields, no `--auth`/`--ttl` flags, and no `capability-link` mode
|
|
931
|
-
(the in-process
|
|
983
|
+
(the in-process capability-link auth was removed as a pre-1.0
|
|
932
984
|
breaking change).
|
|
933
985
|
|
|
934
986
|
Reserved: `/_humanish/api/*` is the serve control-plane namespace. Any request
|
|
935
987
|
under it answers `501` with error code `HUMANISH_SERVE_CONTROL_PLANE_DISABLED`.
|
|
936
988
|
Because the in-process auth gate is gone, a request that clears the edge (or a
|
|
937
|
-
loopback caller) reaches the `501` directly
|
|
989
|
+
loopback caller) reaches the `501` directly; no `401` comes first.
|
|
938
990
|
The typed `ServeControlPlane` parameter exists in the handler options and is
|
|
939
991
|
always `undefined` in v1; no code dispatches into it yet. Do not build against
|
|
940
992
|
the namespace; the reservation guarantees only that no run artifact or observer
|
|
@@ -944,29 +996,36 @@ contract.
|
|
|
944
996
|
|
|
945
997
|
## Terminal Cost Ledger And No-Spend Proof
|
|
946
998
|
|
|
947
|
-
The terminal-product
|
|
948
|
-
only to the in-sandbox agent
|
|
949
|
-
|
|
999
|
+
The terminal-product route (`src/routes/terminal/route.ts`), under the default
|
|
1000
|
+
`runtimeAuth: openai-env`, passes a real provider key only to the in-sandbox agent
|
|
1001
|
+
command; `openai-egress` gives the command a placeholder and keeps the key in an
|
|
1002
|
+
external E2B header transform. Neither mode puts it in sandbox-global env or
|
|
1003
|
+
metadata, so the no-spend claim must be derived from a ledger, never asserted. The
|
|
950
1004
|
live run writes both to `terminal-ledgers.json` (a `cost` block + a
|
|
951
1005
|
`noSpendProof` block, additive to `humanish.terminal-ledgers.v1`).
|
|
952
1006
|
|
|
953
|
-
The cost ledger (`humanish.terminal-cost-ledger.v1`) has one line per category
|
|
954
|
-
`product`, `media`, `payment`, `provider`
|
|
1007
|
+
The cost ledger (`humanish.terminal-cost-ledger.v1`) has one line per category
|
|
1008
|
+
(`product`, `media`, `payment`, `provider`) and follows a strict **null
|
|
955
1009
|
discipline** that distinguishes three states and never conflates them:
|
|
956
1010
|
|
|
957
|
-
- `usd: 0`
|
|
958
|
-
- `usd: null`
|
|
1011
|
+
- `usd: 0` is **known zero**: the category was metered and billed nothing.
|
|
1012
|
+
- `usd: null` is **not measured**: no spend signal exists for the category on
|
|
959
1013
|
this run. `null` is written explicitly (never `undefined`-omitted, never guessed
|
|
960
1014
|
to `0`). A line with `null` says "this category exists but we did not measure
|
|
961
1015
|
it"; the no-spend proof reports it as unmeasured and does NOT claim it is zero.
|
|
962
|
-
-
|
|
1016
|
+
- an **absent** line is **not applicable** (n/a) to the participant or run.
|
|
963
1017
|
|
|
964
1018
|
`knownTotalUsd` sums ONLY the non-null lines (a `null` line contributes nothing
|
|
965
1019
|
and is never coerced to `0`); `fullyMeasured` is true only when no line is null.
|
|
966
1020
|
Core meters only the `provider` line, populated from the actor trace's
|
|
967
1021
|
`tokenUsage.costUsd` when present (else `null`); `product`/`media`/`payment`
|
|
968
1022
|
remain `null` unless an adapter supplies those signals through the shipped
|
|
969
|
-
cost-probe seam.
|
|
1023
|
+
cost-probe seam. The terminal route records the model as `codex` and does not pin Codex's
|
|
1024
|
+
model, so a measured token count stays `usd: null` with `source: unpriced-token-usage`, and
|
|
1025
|
+
`knownTotalUsd: 0` with `fullyMeasured: false` means no line of this ledger was priced. E2B
|
|
1026
|
+
time for the terminal sandbox is not a line of this ledger, whose lines are checked against
|
|
1027
|
+
`scenario.caps.maxUsd`. The run bundle's `cost` summary prices it as a `desktop-minutes`
|
|
1028
|
+
line (see Run Cost Summary And Estimated Actor Cost below).
|
|
970
1029
|
|
|
971
1030
|
```yaml
|
|
972
1031
|
schema: humanish.terminal-cost-ledger.v1
|
|
@@ -984,9 +1043,13 @@ The no-spend proof (`humanish.terminal-no-spend-proof.v1`) is DERIVED from the
|
|
|
984
1043
|
ledger. It vouches only for what it measured: `knownZeroLines` (proven zero),
|
|
985
1044
|
`knownNonZeroLines` (break `satisfied`), and `unmeasuredLines` (the `null` lines
|
|
986
1045
|
it explicitly CANNOT vouch for). `satisfied` is true only when every KNOWN line
|
|
987
|
-
is within `maxUsd` (for a no-spend run, `maxUsd: 0` ⇒ every known line is `0`)
|
|
988
|
-
|
|
989
|
-
|
|
1046
|
+
is within `maxUsd` (for a no-spend run, `maxUsd: 0` ⇒ every known line is `0`).
|
|
1047
|
+
Unmeasured lines never break it, so a ledger whose lines are all `null` is
|
|
1048
|
+
`satisfied` with nothing proven. The `statement` says which case applies: it
|
|
1049
|
+
names the measured lines and their dollars, provider tokens that were counted
|
|
1050
|
+
but unpriced (with the counts), and the lines with no signal; when no line was
|
|
1051
|
+
measured it says the proof was not established. A proof never claims zero on a
|
|
1052
|
+
`null` line; verification fails closed if it does.
|
|
990
1053
|
|
|
991
1054
|
```yaml
|
|
992
1055
|
schema: humanish.terminal-no-spend-proof.v1
|
|
@@ -996,7 +1059,7 @@ knownZeroLines: []
|
|
|
996
1059
|
knownNonZeroLines: []
|
|
997
1060
|
unmeasuredLines: [product, media, payment, provider]
|
|
998
1061
|
knownTotalUsd: 0
|
|
999
|
-
statement: "No-spend proof
|
|
1062
|
+
statement: "No-spend proof not established for maxUsd=0: no spend line was measured. …"
|
|
1000
1063
|
```
|
|
1001
1064
|
|
|
1002
1065
|
**Full caps enforcement (fail-closed, not advisory).** `scenario.caps.maxUsd`
|
|
@@ -1010,13 +1073,20 @@ proof claims zero on a `null` line, or when known spend exceeds the declared cap
|
|
|
1010
1073
|
|
|
1011
1074
|
## Run Status (identity + liveness index)
|
|
1012
1075
|
|
|
1013
|
-
`humanish.run-status.v1`
|
|
1076
|
+
`humanish.run-status.v1` is `status.json`, written inside each run directory by
|
|
1014
1077
|
every backend at run start, refreshed on a fixed cadence while the run is
|
|
1015
1078
|
alive, and finalized when it ends: `{ schema, runId, state: running |
|
|
1016
1079
|
finished, mode, lab?, pid, startedAt, updatedAt, completedAt?, outcome? }`.
|
|
1080
|
+
`outcome` carries the bundle's `verdict`, `participants` and `estimatedCostUsd`
|
|
1081
|
+
when the run finishes, then the result's `ok` and `execution: { succeeded,
|
|
1082
|
+
failures: [{ kind, message }] }` once the Observer has rendered. The verdict is
|
|
1083
|
+
what the participants experienced; `execution` is whether the run worked as an
|
|
1084
|
+
execution (`kind` is `harness`, `provider-cleanup`, `sandbox-cleanup`,
|
|
1085
|
+
`evidence`, `cap` or `run`), and `ok` reads both under the route's policy
|
|
1086
|
+
(`OUTCOME_POLICIES` in `src/run/judge.ts`).
|
|
1017
1087
|
|
|
1018
1088
|
It answers two questions the filesystem could not answer before: **which lab**
|
|
1019
|
-
a run belongs to, and **whether it is still alive
|
|
1089
|
+
a run belongs to, and **whether it is still alive**, including for runs an
|
|
1020
1090
|
agent launched (`lab run --json`) or that were detached, which previously wrote
|
|
1021
1091
|
nothing at all until they completed.
|
|
1022
1092
|
|
|
@@ -1024,9 +1094,9 @@ It is a DERIVED INDEX, not evidence. `run.json` remains the evidence-of-record;
|
|
|
1024
1094
|
`verify` never gates on `status.json`, nothing in it is a claim about what a
|
|
1025
1095
|
participant did, and when the two disagree the bundle wins and the record is
|
|
1026
1096
|
rebuildable from it. A `running` record whose `updatedAt` is older than three
|
|
1027
|
-
touch intervals is INTERRUPTED, not alive
|
|
1028
|
-
terminal leaves exactly that shape,
|
|
1029
|
-
|
|
1097
|
+
touch intervals is INTERRUPTED, not alive. A dropped connection or a killed
|
|
1098
|
+
terminal leaves exactly that shape, so the record reads as interrupted
|
|
1099
|
+
(`classifyRunStatus` is the one shared definition). Fields are
|
|
1030
1100
|
public-safe by construction: no hostname and no user paths, because a run
|
|
1031
1101
|
directory may be shared.
|
|
1032
1102
|
|
|
@@ -1037,7 +1107,7 @@ runs without opening evidence for all of them. None is authoritative: `run.json`
|
|
|
1037
1107
|
remains the evidence-of-record, `verify` gates on none of these, and nothing in
|
|
1038
1108
|
them is a claim about what a participant did.
|
|
1039
1109
|
|
|
1040
|
-
`humanish.run-index.v1`
|
|
1110
|
+
`humanish.run-index.v1` is the listing projection. One entry per run, read
|
|
1041
1111
|
cheapest-source-first: the `status.json` record, else the bundle, else the run
|
|
1042
1112
|
directory alone. `{ runId, derivedFrom: status | bundle | directory, liveness,
|
|
1043
1113
|
mode?, pid?, lab?, startedAt?, updatedAt?, completedAt?, verdict?,
|
|
@@ -1046,30 +1116,29 @@ every run tree and parsing every bundle measured 167ms on a 25-run project,
|
|
|
1046
1116
|
against 16ms cold and 2.8ms warm here, which is what makes a surface that
|
|
1047
1117
|
refreshes on a cadence affordable. `derivedFrom` is reported so a surprising row
|
|
1048
1118
|
can be traced to the file it came from. A run with receipts and no outcome is
|
|
1049
|
-
`interrupted`
|
|
1050
|
-
IN-PROGRESS bundle reached without a status record
|
|
1051
|
-
|
|
1052
|
-
honest reading.
|
|
1119
|
+
`interrupted` (the shape a dropped connection leaves), and so is an
|
|
1120
|
+
IN-PROGRESS bundle reached without a status record: there is no freshness to
|
|
1121
|
+
judge, and nothing in it says the run finished.
|
|
1053
1122
|
|
|
1054
|
-
`humanish.run-detail.v1`
|
|
1123
|
+
`humanish.run-detail.v1` is the watching projection, for ONE run. Who is in it
|
|
1055
1124
|
and what they are thinking: `{ runId, participants: [{ id, label, personaId?,
|
|
1056
1125
|
traits, status?, completionReason?, thought?, turns?, actions?, thoughts?,
|
|
1057
|
-
estimatedCostUsd? }], observerPath? }`. It reads the actor trace from
|
|
1126
|
+
estimatedCostUsd? }], observerPath?, automaticAnalysis? }`. It reads the actor trace from
|
|
1058
1127
|
`stream.liveActor` while a run is in flight and `stream.actor` once it has
|
|
1059
1128
|
finished, preferring the live one, so a single screen renders a run the whole
|
|
1060
1129
|
way through. A reasoning item still being written is skipped rather than quoted
|
|
1061
|
-
half-finished, and the text is carried verbatim
|
|
1062
|
-
paraphrases it. Unlike the index this DOES open the bundle, which is affordable
|
|
1130
|
+
half-finished, and the text is carried verbatim: a surface may wrap it, and
|
|
1131
|
+
nothing paraphrases it. Unlike the index this DOES open the bundle, which is affordable
|
|
1063
1132
|
only because it is asked for the one run being watched.
|
|
1064
1133
|
|
|
1065
|
-
`humanish.tui-result.v1`
|
|
1134
|
+
`humanish.tui-result.v1` is what `humanish tui` emits when it refuses:
|
|
1066
1135
|
`{ schema, ok: false, error: { code, message } }` with `HUMANISH_TUI_REQUIRES_TTY`,
|
|
1067
1136
|
`HUMANISH_TUI_AGENT_SESSION`, `HUMANISH_TUI_UNSUPPORTED_NODE`, or
|
|
1068
1137
|
`HUMANISH_TUI_BUNDLE_MISSING`. `HUMANISH_TUI_AGENT_SESSION` is the one a TTY
|
|
1069
1138
|
check could not catch: `codex exec` allocates a PTY for the commands it runs, so
|
|
1070
|
-
both streams are terminals and the surface used to open
|
|
1071
|
-
agent
|
|
1072
|
-
(labs/handed-a-human-surface.yaml). The refusal names the environment variable
|
|
1139
|
+
both streams are terminals and the surface used to open. A study watched an
|
|
1140
|
+
agent move through the labs list and start a run it did not mean to start
|
|
1141
|
+
(humanish/labs/handed-a-human-surface.yaml). The refusal names the environment variable
|
|
1073
1142
|
that identified the runner, so the reader can check the claim, and `--force` is
|
|
1074
1143
|
the escape for a person who really is at that keyboard. Every other
|
|
1075
1144
|
command is built for an agent to drive; this one takes the screen and waits for
|
|
@@ -1078,141 +1147,189 @@ that DO answer the question rather than rendering escape codes into a pipe.
|
|
|
1078
1147
|
|
|
1079
1148
|
## Run Cost Summary And Estimated Actor Cost
|
|
1080
1149
|
|
|
1081
|
-
The computer-use (CUA)
|
|
1150
|
+
The computer-use (CUA) route surfaces an ADVISORY, additive cost ESTIMATE. It is
|
|
1082
1151
|
never authoritative: every dollar figure is a rate-table multiply, labeled
|
|
1083
1152
|
"estimated (rates as of `<date>`)", and is NEVER presented as a provider charge
|
|
1084
1153
|
(invariant 6). Three new `.v1` schema tags ship, all additive and optional so
|
|
1085
1154
|
`humanish.run-bundle.v1` stays v1 and every pre-existing bundle is byte-stable:
|
|
1086
1155
|
|
|
1087
|
-
- `humanish.pricing.v1
|
|
1156
|
+
- `humanish.pricing.v1`: the OPERATOR-EDITABLE rate table in `src/run/pricing.ts`:
|
|
1088
1157
|
dated per-model input/output USD-per-token rates and E2B CPU/GiB-second
|
|
1089
1158
|
rates, each with a public pricing-page `source` and an `asOf`
|
|
1090
1159
|
date. A prominent banner says these are estimates to update when providers
|
|
1091
1160
|
change pricing. Model rates may carry a `cacheWriteUsdPerToken` (OpenAI 5.6+
|
|
1092
1161
|
bills cache writes at 1.25x input as the total rate for written tokens) and a
|
|
1093
1162
|
`longContext` tier (a per-request input threshold that re-prices the whole
|
|
1094
|
-
request; priced exactly only from the trace's per-request `turns` ledger
|
|
1095
|
-
totals alone never re-tier, which
|
|
1163
|
+
request; priced exactly only from the trace's per-request `turns` ledger;
|
|
1164
|
+
totals alone never re-tier, which errs toward under-estimating). Some
|
|
1096
1165
|
entries are `placeholder: true` stand-ins (the legacy desktop helper's
|
|
1097
|
-
8-vCPU/8-GiB planning assumption)
|
|
1166
|
+
8-vCPU/8-GiB planning assumption); an operator MUST confirm them before trusting
|
|
1098
1167
|
the magnitude; the flag propagates into every estimate so a stand-in is never
|
|
1099
1168
|
mistaken for a live rate. An UNKNOWN model/desktop rate is DECLARED ABSENT
|
|
1100
1169
|
(`estimatedCostUsd: null` + a `reason`), never guessed.
|
|
1101
|
-
- `humanish.actor-estimated-cost.v1`
|
|
1170
|
+
- `humanish.actor-estimated-cost.v1` (`ActorTrace.estimatedCost`): one participant's
|
|
1102
1171
|
token-derived model cost, with `estimatedCostUsd` (or `null` + `reason`
|
|
1103
|
-
`no_rate_for_model`/`no_token_usage`), `ratesAsOf`, `source`, `modelId`,
|
|
1172
|
+
`no_rate_for_model`/`no_token_usage`/`account_billing_unknown`), `ratesAsOf`, `source`, `modelId`,
|
|
1104
1173
|
optional `placeholder`, and a `breakdown`.
|
|
1105
|
-
- `humanish.run-cost-summary.v1`
|
|
1174
|
+
- `humanish.run-cost-summary.v1` (`RunBundle.cost`): the sum of every participant's
|
|
1106
1175
|
`model-tokens` lines PLUS `desktop-minutes` lines. New independent CUA runs
|
|
1107
|
-
price each owned desktop separately;
|
|
1176
|
+
price each owned desktop separately; concurrent shared-world runs add one line per participant
|
|
1177
|
+
and a `laneId: subject` desktop line for a provisioned plane; older single aggregate
|
|
1178
|
+
lines remain readable.
|
|
1108
1179
|
A desktop line's optional `desktop` object records `minutes`,
|
|
1109
1180
|
`durationBasis: host-acquired-to-cleanup`, observed `resources` (`cpuCount`,
|
|
1110
1181
|
`memoryMiB`), `resourceSource: e2b.getInfo`, and `usdPerSecond` when priceable.
|
|
1111
1182
|
Failed metadata reads record `resourceUnavailableReason`; no resource guess is used.
|
|
1112
1183
|
Resource metadata and missing/unsupported rates produce a null line. A kept or
|
|
1113
1184
|
unconfirmed allocation adds `desktop_lifetime_incomplete` as a second null line.
|
|
1185
|
+
Live terminal-product runs emit the same summary: one `desktop-minutes` line for
|
|
1186
|
+
the E2B shell sandbox (its acquired-to-cleanup span and `e2b.getInfo` size) and
|
|
1187
|
+
one `model-tokens` line for the Codex participant, which stays `null` with
|
|
1188
|
+
`no_rate_for_model` (model `codex`) or `no_token_usage`. The terminal trace
|
|
1189
|
+
records that same null `estimatedCost`. The sandbox line is not part of the
|
|
1190
|
+
terminal cost ledger, whose lines are checked against `scenario.caps.maxUsd`.
|
|
1114
1191
|
|
|
1115
1192
|
The summary follows the SAME null discipline as the terminal cost ledger above.
|
|
1116
1193
|
`estimatedTotalUsd` sums ONLY the non-null `breakdown` lines and is `null` iff
|
|
1117
1194
|
EVERY line is null (never coerced to `0`); a present-but-unpriceable line stays
|
|
1118
1195
|
in `breakdown` with `estimatedCostUsd: null` + a `reason` (it records that we
|
|
1119
1196
|
tried and could not price it) and contributes nothing. `fullyEstimated` is
|
|
1120
|
-
`false` when any applicable line is null (the total is then a lower bound)
|
|
1197
|
+
`false` when any applicable line is null (the total is then a lower bound). A spend-free
|
|
1198
|
+
live run has no lines and records `estimatedTotalUsd: 0` with `ratesAsOf: null`; verify
|
|
1199
|
+
asks for a rates date only when a line is priced.
|
|
1121
1200
|
`placeholder` is true when any contributing rate is a stand-in; `ratesAsOf` is
|
|
1122
|
-
the MIN (oldest) `asOf` across contributing rates
|
|
1201
|
+
the MIN (oldest) `asOf` across contributing rates. An aggregate is only as fresh
|
|
1123
1202
|
as its stalest input, so MAX would overclaim freshness (each `breakdown` line
|
|
1124
1203
|
keeps its own true `asOf`). `desktopMinutes` is a HOST-SIDE
|
|
1125
1204
|
acquired-handle→cleanup span, excluding allocation/startup before handle acquisition.
|
|
1126
1205
|
It approximates E2B's server-side billed lifetime. Plan fees, credits, and negotiated
|
|
1127
1206
|
prices are excluded; unknown remaining lifetime makes `fullyEstimated` false.
|
|
1128
|
-
|
|
1207
|
+
Scripted-browser runs add a `laneId: subject` line for a provisioned clone.
|
|
1129
1208
|
|
|
1130
1209
|
```yaml
|
|
1131
1210
|
schema: humanish.run-cost-summary.v1
|
|
1132
1211
|
currency: usd
|
|
1133
|
-
estimatedTotalUsd: 11.60167
|
|
1212
|
+
estimatedTotalUsd: 11.60167 # sum of KNOWN lines only; null iff every line null
|
|
1134
1213
|
ratesAsOf: "2026-08-01"
|
|
1135
|
-
fullyEstimated: true
|
|
1136
|
-
placeholder: true
|
|
1214
|
+
fullyEstimated: true # both breakdown lines are priced (no null line)
|
|
1215
|
+
placeholder: true # a stand-in rate contributed
|
|
1137
1216
|
breakdown:
|
|
1138
|
-
- {
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1217
|
+
- {
|
|
1218
|
+
kind: model-tokens,
|
|
1219
|
+
laneId: lane-01,
|
|
1220
|
+
modelId: computer-use-preview,
|
|
1221
|
+
estimatedCostUsd: 11.60,
|
|
1222
|
+
ratesAsOf: "2026-08-01",
|
|
1223
|
+
source: "openai.com/api/pricing",
|
|
1224
|
+
}
|
|
1225
|
+
- {
|
|
1226
|
+
kind: desktop-minutes,
|
|
1227
|
+
estimatedCostUsd: 0.00167,
|
|
1228
|
+
ratesAsOf: "2026-08-01",
|
|
1229
|
+
source: "…e2b.dev/pricing",
|
|
1230
|
+
placeholder: true,
|
|
1231
|
+
}
|
|
1142
1232
|
tokenUsage: { input: 3843523, output: 5869, total: 3849392 }
|
|
1143
1233
|
desktopMinutes: 1
|
|
1144
1234
|
note: "Estimated 11.60167 USD total…"
|
|
1145
1235
|
```
|
|
1146
1236
|
|
|
1147
1237
|
`verifyRun` asserts LABELING/provenance, never MAGNITUDE. Absence PASSES
|
|
1148
|
-
(fail-open on display): a bundle with no cost, a null estimate
|
|
1149
|
-
`estimatedCost` verifies fine. A CLAIMED number FAILS closed when it lacks its
|
|
1238
|
+
(fail-open on display): a bundle with no cost, a null estimate that carries a
|
|
1239
|
+
`reason` and a null `ratesAsOf`, or a participant without `estimatedCost` verifies fine. A CLAIMED number FAILS closed when it lacks its
|
|
1150
1240
|
`ratesAsOf` date or `source`, or when `estimatedTotalUsd` does not equal the
|
|
1151
1241
|
rounded sum of its non-null lines (a null line coerced to 0 is a mechanism
|
|
1152
1242
|
mismatch). A correctly-labeled huge estimate still passes. Cost is neither a
|
|
1153
|
-
secret nor a share-blocker
|
|
1243
|
+
secret nor a share-blocker: its magnitude never affects `shareSafety`. A labeling
|
|
1244
|
+
failure fails verify, which blocks sharing like any other failed check.
|
|
1154
1245
|
|
|
1155
1246
|
**Computer-use spend thresholds.** `execution.caps.maxUsd` applies independently
|
|
1156
|
-
to each
|
|
1157
|
-
across the study's
|
|
1158
|
-
shared threshold, N
|
|
1247
|
+
to each participant. `execution.caps.maxTotalUsd` shares an estimated model-spend ledger
|
|
1248
|
+
across the study's participants. Either, both, or neither may be declared. Without a
|
|
1249
|
+
shared threshold, N participants each have their own `maxUsd`; N × `maxUsd` is the sum
|
|
1159
1250
|
of those thresholds, not a guaranteed total spending ceiling.
|
|
1160
1251
|
|
|
1161
1252
|
The loop checks reported usage after a model response, before dispatching that
|
|
1162
1253
|
response's actions or requesting another turn. It does not reserve the next
|
|
1163
|
-
request's worst-case cost. In-flight requests
|
|
1164
|
-
|
|
1165
|
-
|
|
1254
|
+
request's worst-case cost. In-flight requests and concurrent participants can exceed
|
|
1255
|
+
these estimates. These thresholds are not hard provider billing caps and
|
|
1256
|
+
exclude desktop and target-app charges.
|
|
1257
|
+
|
|
1258
|
+
A capped session sends a further request only while every earlier request's
|
|
1259
|
+
usage is known or bounded:
|
|
1260
|
+
|
|
1261
|
+
- A reply without complete usage, or a provider that reports a dispatch whose
|
|
1262
|
+
usage it could not return (`interactionUsageIncomplete`), stops the session
|
|
1263
|
+
before its next request with `harness_error`, `stopCause: usage_unreported`,
|
|
1264
|
+
and the label “provider usage unavailable”. The reply's own actions still
|
|
1265
|
+
run, and a reply that ends the session ends it normally.
|
|
1266
|
+
- A request lost without a reply (it stalled, or the OpenAI provider's
|
|
1267
|
+
transport threw) is booked at its worst case before it is sent again: the
|
|
1268
|
+
latest reported request's input at the model's highest input rate plus
|
|
1269
|
+
`actors[].maxOutputTokens` at its output rate, both from `src/run/pricing.ts`.
|
|
1270
|
+
The reply to the resent request replaces that input with its own. The
|
|
1271
|
+
request is sent again only when the estimate with that charge stays within
|
|
1272
|
+
`maxUsd` and the study budget. Otherwise the session ends `budget_reached`
|
|
1273
|
+
with the crossed threshold, and the reason counts the booked worst case.
|
|
1274
|
+
- Without `maxOutputTokens` a lost request has no bound, so it is not sent
|
|
1275
|
+
again: the session stops with `stopCause: usage_unreported`.
|
|
1276
|
+
|
|
1277
|
+
The trace records `interactionUsageIncomplete: true` whenever a request's usage
|
|
1278
|
+
is unknown, booked or not. The booked worst case counts toward the thresholds
|
|
1279
|
+
only; `tokenUsage` and the cost summary keep the reported usage.
|
|
1166
1280
|
|
|
1167
1281
|
Crossing `maxUsd` ends `budget_reached` / `incomplete`, including when no
|
|
1168
1282
|
material action has executed. The recorded reason distinguishes prior progress
|
|
1169
1283
|
from no material progress; a harness budget stop is not participant abandonment.
|
|
1170
1284
|
Crossing the shared study threshold ends `budget_reached` / `incomplete`, with
|
|
1171
|
-
sibling
|
|
1285
|
+
sibling participants stopping when their next post-response check sees it. Reaching a
|
|
1172
1286
|
threshold is not proof of task completion.
|
|
1173
1287
|
|
|
1174
1288
|
An absent threshold is uncapped. A zero threshold can still permit a paid model
|
|
1175
1289
|
request before reported usage trips it; `maxUsd: 0` is not a no-provider-call
|
|
1176
1290
|
mode. Use the keyless `humanish run first-run` preview or an explicit
|
|
1177
1291
|
`humanish lab run <lab> --dry-run` for a path without provider calls. A declared
|
|
1178
|
-
threshold on a model `src/pricing.ts` cannot price is refused at preflight
|
|
1179
|
-
(`HUMANISH_CUA_LAB_UNPRICED_CAP
|
|
1292
|
+
threshold on a model `src/run/pricing.ts` cannot price is refused at preflight
|
|
1293
|
+
(`HUMANISH_CUA_LAB_UNPRICED_CAP`, or `HUMANISH_CONCURRENT_SHARED_WORLD_LAB_UNPRICED_CAP` on a
|
|
1294
|
+
shared-world lab) before sandbox allocation. This rate-availability
|
|
1180
1295
|
check is separate from the post-response spend check.
|
|
1181
1296
|
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1297
|
+
Library callers can make a capped session stricter by composing it from the loop and the default
|
|
1298
|
+
provider:
|
|
1299
|
+
|
|
1300
|
+
```ts
|
|
1301
|
+
import { createOpenAiResponsesProvider, defaultRedactionHooks, runComputerUseLoop } from "humanish";
|
|
1302
|
+
|
|
1303
|
+
const result = await runComputerUseLoop({
|
|
1304
|
+
instructions,
|
|
1305
|
+
persona,
|
|
1306
|
+
executor,
|
|
1307
|
+
timeoutMs,
|
|
1308
|
+
// Without singleDispatch the provider may resend a request whose spend is unknown.
|
|
1309
|
+
provider: createOpenAiResponsesProvider({ apiKey, model, singleDispatch: true }),
|
|
1310
|
+
redaction: defaultRedactionHooks,
|
|
1311
|
+
now: Date.now,
|
|
1312
|
+
maxUsd,
|
|
1313
|
+
estimateTurnCostUsd,
|
|
1314
|
+
requireReportedUsageForSpendCap: true,
|
|
1315
|
+
});
|
|
1316
|
+
```
|
|
1317
|
+
|
|
1318
|
+
`requireReportedUsageForSpendCap` applies together with `maxUsd` or `overRunBudget`. No built-in
|
|
1319
|
+
route enables this policy. With it, a reply that returns missing or partial usage is not acted
|
|
1320
|
+
on, and any failed or stalled request stops the session; both stop with `harness_error`,
|
|
1321
|
+
`stopCause: usage_unreported`, and the label “provider usage unavailable.” It is not recorded as a
|
|
1322
|
+
crossed threshold. `singleDispatch: true` disables the OpenAI adapter's HTTP and
|
|
1323
|
+
policy-negotiation retries, so each turn makes at most one request.
|
|
1324
|
+
`runCuaActorSession({ requireReportedUsageForSpendCap: true })` sets `singleDispatch` itself and
|
|
1325
|
+
is deprecated in this minor. It also attaches `trace.estimatedCost` for an injected
|
|
1326
|
+
account-billed provider, which the composition does not. The loop cancels its owned request signal when a
|
|
1197
1327
|
request ends or its timeout wins; injected providers must honor cancellation
|
|
1198
|
-
and remain responsible for their own internal dispatch. Known usage remains in
|
|
1199
|
-
trace alongside an explicit unknown
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
explicitly incomplete provider response retains its original interruption cause
|
|
1204
|
-
first, with any missing usage still recorded as unknown.
|
|
1205
|
-
|
|
1206
|
-
Sequential traces persist dated model estimates. Their run cost summary marks
|
|
1207
|
-
desktop compute as unmeasured, so the displayed model subtotal is a lower bound.
|
|
1208
|
-
The sequential route does not provide a running Observer usage stream; its final
|
|
1209
|
-
CLI and Observer projections read these persisted estimates.
|
|
1210
|
-
|
|
1211
|
-
A capped custom session must return the declared model identity on its trace.
|
|
1212
|
-
A mismatch fails orchestration and blocks later participants while preserving
|
|
1213
|
-
the participant's original outcome and the estimate for its returned model.
|
|
1214
|
-
This check does not establish which model an arbitrary custom runner actually
|
|
1215
|
-
called or retrospectively enforce a runner that ignored its cap options.
|
|
1328
|
+
and remain responsible for their own internal dispatch. Known usage remains in
|
|
1329
|
+
the trace alongside an explicit unknown. Reported zero input and output counts
|
|
1330
|
+
remain valid zero usage. An explicitly incomplete provider response retains its
|
|
1331
|
+
original interruption cause first, with any missing usage still recorded as
|
|
1332
|
+
unknown.
|
|
1216
1333
|
|
|
1217
1334
|
These computer-use rules do not replace the terminal route's separate
|
|
1218
1335
|
`scenario.caps` cost-ledger and product-spend rules described above.
|
|
@@ -1222,15 +1339,16 @@ These computer-use rules do not replace the terminal route's separate
|
|
|
1222
1339
|
`humanish.affordance-use.v1` (additive `ActorTrace.affordanceUse`) records WHICH
|
|
1223
1340
|
KIND of route an actor took, per dispatched action, as counts by class:
|
|
1224
1341
|
|
|
1225
|
-
| Class
|
|
1226
|
-
|
|
|
1227
|
-
| `pointer`
|
|
1228
|
-
| `keyboard`
|
|
1229
|
-
| `
|
|
1230
|
-
| `
|
|
1231
|
-
| `
|
|
1232
|
-
| `
|
|
1233
|
-
| `
|
|
1342
|
+
| Class | What it covers |
|
|
1343
|
+
| ------------------ | ------------------------------------------------------------------------------------------------------------- |
|
|
1344
|
+
| `pointer` | click, double-click, drag, scroll: interaction with what is rendered |
|
|
1345
|
+
| `keyboard` | typed text and key presses into the page |
|
|
1346
|
+
| `speech` | spoken input from a `speak` action |
|
|
1347
|
+
| `url-navigation` | typing a URL (the `nav` subset); a HUMAN affordance, see below |
|
|
1348
|
+
| `script-execution` | a `javascript:` or `data:` URL; not a human affordance |
|
|
1349
|
+
| `devtools` | developer tooling opened by keyboard chord |
|
|
1350
|
+
| `browser-internal` | `chrome://`, `about:`, `view-source:`, `devtools:`, `file:`, `edge:`, `brave:` (the browser, not the product) |
|
|
1351
|
+
| `observation` | screenshots, waits, bare pointer moves: the actor looking rather than acting |
|
|
1234
1352
|
|
|
1235
1353
|
`counts` omits classes that never occurred; `total` is the denominator for any
|
|
1236
1354
|
rate; `shortcutTotal` rolls up `script-execution` + `devtools` +
|
|
@@ -1240,47 +1358,109 @@ absence.
|
|
|
1240
1358
|
Direct URL navigation is deliberately its OWN class and is grouped with the
|
|
1241
1359
|
naturalistic classes, not with script execution: `load(url)` appears in 99.4% of
|
|
1242
1360
|
2,337 real human web demonstrations, so address-bar use is ordinary human
|
|
1243
|
-
behavior and classifying it as a shortcut would make an ordinary human
|
|
1361
|
+
behavior and classifying it as a shortcut would make an ordinary human participant look
|
|
1244
1362
|
unfaithful. See [`docs/principles/actor-fidelity.md`](../principles/actor-fidelity.md)
|
|
1245
1363
|
for the evidence and the scoping of what a fidelity claim can mean.
|
|
1246
1364
|
|
|
1247
1365
|
The record carries a CLASS and at most a scheme-shaped signal (`javascript:`,
|
|
1248
|
-
`https:`, a devtools chord)
|
|
1366
|
+
`https:`, a devtools chord), never the typed text, which can be a password, a
|
|
1249
1367
|
session token, or an identifying URL path. Classification runs at dispatch
|
|
1250
1368
|
because the text exists only there: the trace's own action label deliberately
|
|
1251
1369
|
renders `type [N chars]`.
|
|
1252
1370
|
|
|
1253
1371
|
The harness states NO verdict about a class. Whether an affordance invalidates a
|
|
1254
1372
|
study depends on the population that study declares, which is product semantics
|
|
1255
|
-
and belongs to the adopter's scorer
|
|
1256
|
-
`affordanceUse` needs no extra wiring to reach it. Present on computer-use
|
|
1373
|
+
and belongs to the adopter's scorer. That scorer already receives the full trace,
|
|
1374
|
+
so `affordanceUse` needs no extra wiring to reach it. Present on computer-use participants
|
|
1257
1375
|
that dispatched at least one action; absent elsewhere and on every pre-existing
|
|
1258
1376
|
bundle, and its absence is tolerated by verify.
|
|
1259
1377
|
|
|
1378
|
+
## Library options (`RunLabOptions`)
|
|
1379
|
+
|
|
1380
|
+
`runLab(config, options)` checks its options against the lab's route before anything runs. A
|
|
1381
|
+
refusal comes back in the route's own result envelope, with no run directory, receipt or sandbox.
|
|
1382
|
+
|
|
1383
|
+
| Option | What it does | Routes |
|
|
1384
|
+
| ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
1385
|
+
| `env` | Keys and subject env for the run. Defaults to `process.env` | all |
|
|
1386
|
+
| `scorer` | An `AdapterScorerModule` (`score`, `deriveFeedback`, and `deriveArtifacts` on browser routes) over the finished evidence | computer use, shared world, terminal |
|
|
1387
|
+
| `createProvider(ctx)` | The participant's brain. `ctx` is `ProviderContext`: `config`, `participant { id, index, count }` and `executor` | computer use: E2B, local VM or in process |
|
|
1388
|
+
| `inProcess.executor({ config, appUrl })` | Drives an `app-url` or `local-app` subject in process, one participant. Requires `createProvider` | computer use |
|
|
1389
|
+
| `prepareDesktop(desktop, target)` | Runs on an E2B sandbox before provisioning. `target` is `{ kind: "subject" }` or `{ kind: "participant", participant }` | computer use on E2B (each participant); shared world (provisioned: the subject, then each participant; external-public: each participant); scripted clone (the subject) |
|
|
1390
|
+
| `onEvent(event)` | Observes `LabEvent`s, below | all |
|
|
1391
|
+
| `onStream(event)` | Awaited. `ready` after a participant's live stream starts; its `url` carries an auth key and must never be persisted. `ended` after the participant's sandbox is gone. A rejected `ready` becomes a run warning; an `ended` rejection is swallowed | computer use and shared world on E2B |
|
|
1392
|
+
| `analysisSignal` | Cancels post-run analysis only | routes with post-run analysis |
|
|
1393
|
+
| `onObserverReady(observer)` | Awaited before any participant desktop exists | live computer use; live shared world, where the provisioned subject sandbox is already billed |
|
|
1394
|
+
| `rerun.participantIds` | Participants to rerun from `rerun.sourceRunId` | computer use |
|
|
1395
|
+
|
|
1396
|
+
`LabEvent` has four types:
|
|
1397
|
+
|
|
1398
|
+
- `plan`: the participants (`id`, `persona`, `device`, `instructionDigest`) before any sandbox
|
|
1399
|
+
or provider call. Computer use only; the other routes gain it later.
|
|
1400
|
+
- `subject-phase`: a provisioning boundary with `target`, `name`, `message`, `at`, and `ok` and
|
|
1401
|
+
`durationMs` on completed phases. Computer use sends a participant target, shared world the
|
|
1402
|
+
subject.
|
|
1403
|
+
- `analysis-started` and `analysis-finished`, around post-run analysis. `analysis-finished`
|
|
1404
|
+
fires after success, failure and cancellation.
|
|
1405
|
+
|
|
1406
|
+
`onEvent` is never awaited, and it changes no output: subject phases still print to stderr. A
|
|
1407
|
+
throw or a rejected promise becomes a redacted run warning.
|
|
1408
|
+
|
|
1409
|
+
Refusals:
|
|
1410
|
+
|
|
1411
|
+
- `HUMANISH_LAB_OPTION_UNSUPPORTED`: the route cannot honor the option, for example `scorer` on
|
|
1412
|
+
a preview or scripted lab, `createProvider` off computer use, or `prepareDesktop` where no E2B
|
|
1413
|
+
desktop exists. The message names the option and the route.
|
|
1414
|
+
- `HUMANISH_LAB_OPTION_CONFLICT`: a new option is set together with the older field it replaces.
|
|
1415
|
+
|
|
1416
|
+
The older route hook bags (`cuaHooks`, `scriptedHooks`, `terminalHooks`, `sharedWorldHooks`) and
|
|
1417
|
+
`rerun.laneIds` keep their behavior in this minor and are removed in the next. Each old field in
|
|
1418
|
+
use emits one `DeprecationWarning` (code `HUMANISH_RUN_LAB_OPTION_DEPRECATED`) per process:
|
|
1419
|
+
|
|
1420
|
+
| Old field | New home |
|
|
1421
|
+
| -------------------------------------------------------------------------------------------------- | ---------------------- |
|
|
1422
|
+
| `score`, `deriveFeedback` on `cuaHooks`, `sharedWorldHooks` or `terminalHooks` | `scorer` |
|
|
1423
|
+
| `deriveArtifacts` on `cuaHooks` or `sharedWorldHooks` | `scorer` |
|
|
1424
|
+
| `cuaHooks.buildProvider` | `createProvider` |
|
|
1425
|
+
| `cuaHooks.buildExecutor` | `inProcess.executor` |
|
|
1426
|
+
| `prepareDesktop` on `cuaHooks`, `scriptedHooks` or `sharedWorldHooks` | `prepareDesktop` |
|
|
1427
|
+
| `cuaHooks.onPreflight`; `onPhase` on `cuaHooks` or `sharedWorldHooks`; `automaticAnalysis.onStart` | `onEvent` |
|
|
1428
|
+
| `onRuntimeStreamReady`, `onRuntimeStreamEnded` on `cuaHooks` or `sharedWorldHooks` | `onStream` |
|
|
1429
|
+
| `automaticAnalysis.deps.signal` | `analysisSignal` |
|
|
1430
|
+
| `env` on any bag | `env` |
|
|
1431
|
+
| `rerun.laneIds` | `rerun.participantIds` |
|
|
1432
|
+
| `cuaHooks.createDesktopLane` | none |
|
|
1433
|
+
|
|
1434
|
+
`cuaHooks.createDesktopLane` warns and goes in the next minor with no replacement: a run's desktop
|
|
1435
|
+
is E2B, the local VM or in process. The bags' other fields are test seams with no public
|
|
1436
|
+
replacement, and they do not warn. A
|
|
1437
|
+
`scorer` passed through `RunLabOptions` behaves exactly like the same functions in the old bag,
|
|
1438
|
+
including the route-specific verdict rules in the next section.
|
|
1439
|
+
|
|
1260
1440
|
## Product-Adapter Extension Seam
|
|
1261
1441
|
|
|
1262
|
-
The terminal-product and browser/computer-use
|
|
1442
|
+
The terminal-product and browser/computer-use routes let an adopter attach
|
|
1263
1443
|
product-specific scoring + feedback as a THIN in-repo extension WITHOUT forking
|
|
1264
|
-
core. The seam is
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1444
|
+
core. The seam is `RunLabOptions.scorer`, an `AdapterScorerModule`, for terminal-product,
|
|
1445
|
+
computer-use and shared-world runs; the CLI loads the same module with `--scorer`. The older
|
|
1446
|
+
`TerminalProductLabHooks`, `CuaActorLabHooks` and `SharedWorldLabHooks` fields still accept the
|
|
1447
|
+
same functions in this minor. This is never a built-in product scorer (the adopter's scorecard
|
|
1448
|
+
lives in the adopter's repo).
|
|
1269
1449
|
|
|
1270
1450
|
Three product-agnostic carriers keep core's nouns closed while letting the adapter
|
|
1271
1451
|
record its own:
|
|
1272
1452
|
|
|
1273
1453
|
- **Adapter score** (`humanish.adapter-score.v1`, `RunBundle.adapterScore`).
|
|
1274
1454
|
A namespaced summary the adapter's `score` hook returns: `{ schema, namespace,
|
|
1275
|
-
|
|
1276
|
-
component rubric rides
|
|
1455
|
+
status, score, summary, data? }`. Core never reads `data`, where the adopter's
|
|
1456
|
+
component rubric rides; `namespace` (an adopter slug) scopes the whole
|
|
1277
1457
|
record so a future inert-field audit never misfires.
|
|
1278
1458
|
- **Namespaced product-noun block** (`RunFeedbackCandidate.adapter`). The
|
|
1279
1459
|
adapter's `deriveFeedback` hook returns feedback candidates that satisfy core's
|
|
1280
1460
|
feedback-candidate shape; product-specific concepts (public CLI/product command
|
|
1281
1461
|
observed, hosted product success-or-blocker, feedback id/draft, media/job/asset
|
|
1282
1462
|
ids, explicit no-media/no-provider-spend proof, defection/friction risk) are
|
|
1283
|
-
recorded ONLY under `adapter: { namespace, data }
|
|
1463
|
+
recorded ONLY under `adapter: { namespace, data }`, never as core enums. Core
|
|
1284
1464
|
validates the SHAPE (a non-empty `namespace` + a `data` record); the keys inside
|
|
1285
1465
|
`data` are the adapter's.
|
|
1286
1466
|
- **Adapter artifacts** (`humanish.adapter-artifact.v1`,
|
|
@@ -1325,8 +1505,11 @@ adapter:
|
|
|
1325
1505
|
|
|
1326
1506
|
Acceptance semantics are route-specific:
|
|
1327
1507
|
|
|
1328
|
-
- Terminal-product runs keep the mission-based `review` verdict unchanged
|
|
1329
|
-
adapter score is additive
|
|
1508
|
+
- Terminal-product runs keep the mission-based `review` verdict unchanged for a
|
|
1509
|
+
library `scorer`; the adapter score is additive. A config-declared scorer
|
|
1510
|
+
(`--scorer` or the lab's `review.scorer.ref`) that returns `status: fail`,
|
|
1511
|
+
throws, or returns a malformed score turns a pass-like verdict into `fail` and
|
|
1512
|
+
fails the run result.
|
|
1330
1513
|
- Browser/computer-use runs treat `adapterScore.status: fail` as product-red:
|
|
1331
1514
|
the bundle keeps the adapter score, `review.verdict` becomes `fail` when it
|
|
1332
1515
|
was pass-like, a generic adapter gap is appended, and the route result returns
|
|
@@ -1336,13 +1519,13 @@ Acceptance semantics are route-specific:
|
|
|
1336
1519
|
|
|
1337
1520
|
The `e2b-terminal` substrate is added to `RunFeedbackCandidate.substrate` so a
|
|
1338
1521
|
terminal-agent candidate names its substrate honestly; browser candidates use
|
|
1339
|
-
the existing `e2b-desktop` substrate.
|
|
1522
|
+
the existing `e2b-desktop` substrate. The routes invoke hooks over FULLY-ASSEMBLED,
|
|
1340
1523
|
redacted evidence (`TerminalProductScoringContext` or
|
|
1341
1524
|
`BrowserLabScoringContext`: `bundle`, runtime-only `runDir`, run identifiers,
|
|
1342
1525
|
actor/backend metadata; all exported public types), scrub+redact returned
|
|
1343
1526
|
payloads, and DROP any malformed score, candidate, or artifact reference with a
|
|
1344
1527
|
warning so a bad extension never poisons a verifiable bundle. On the terminal
|
|
1345
|
-
route the context also carries `transcript
|
|
1528
|
+
route the context also carries `transcript`: the FULL normalized session
|
|
1346
1529
|
transcript, source-scrubbed then shape-redacted and byte-identical to the
|
|
1347
1530
|
persisted `terminal-transcript.txt` (the trace's `transcriptTail` is a ~2KB
|
|
1348
1531
|
projection of it), so an adopter rubric can find command-tier evidence anywhere
|
|
@@ -1355,7 +1538,7 @@ including existence for referenced adapter artifacts.
|
|
|
1355
1538
|
Reserved: `humanish.evidence-stream.v1` has never shipped as a standalone
|
|
1356
1539
|
schema, and streams are not standalone artifacts. They are the `streams` array
|
|
1357
1540
|
inside `humanish.run-bundle.v1`, normalizing UI, browser, terminal, TUI,
|
|
1358
|
-
code-agent UI, artifact, and summary
|
|
1541
|
+
code-agent UI, artifact, and summary streams, each with transport, terminal
|
|
1359
1542
|
tail, completion, meaningful-use verdicts, and artifact pointers. See
|
|
1360
1543
|
[`run-bundle.md`](run-bundle.md#completion-and-meaningful-use-verdicts) for
|
|
1361
1544
|
the stream shape, the meaningful-use rubric, and hard-failure rules.
|
|
@@ -1411,7 +1594,9 @@ Core-owned fields:
|
|
|
1411
1594
|
- `bundlePath`
|
|
1412
1595
|
- check names
|
|
1413
1596
|
- check booleans
|
|
1414
|
-
- `warnings` (advisory postures, e.g. raw screenshots; never flip `ok`)
|
|
1597
|
+
- `warnings` (advisory postures, e.g. raw screenshots; never flip `ok`). An
|
|
1598
|
+
entry starting with `RUN_NOT_FINISHED` means the run did not finish; see
|
|
1599
|
+
[run-bundle.md](run-bundle.md#verify-result-share-safety).
|
|
1415
1600
|
- machine-readable error codes
|
|
1416
1601
|
|
|
1417
1602
|
Adapter-owned fields:
|
|
@@ -1443,9 +1628,8 @@ shareSafety:
|
|
|
1443
1628
|
|
|
1444
1629
|
Policy names boundaries before an actor runs or feedback is promoted.
|
|
1445
1630
|
`humanish.policy.v1` exists today only as an adapter fixture shape
|
|
1446
|
-
(`adapters/fixtures/`); the engine does not validate it.
|
|
1447
|
-
|
|
1448
|
-
`humanish.network-policy.v1`, and `humanish.credentials-policy.v1`.
|
|
1631
|
+
(`adapters/fixtures/`); the engine does not validate it. `humanish init`
|
|
1632
|
+
scaffolds no policy files.
|
|
1449
1633
|
|
|
1450
1634
|
Core-owned fields:
|
|
1451
1635
|
|