humanish 0.106.1 → 0.108.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +38 -32
- package/CHANGELOG.md +28 -0
- package/CONTEXT.md +51 -41
- package/README.md +152 -174
- package/SECURITY.md +16 -26
- package/TELEMETRY.md +8 -6
- package/dist/actors/affordance.d.ts +4 -4
- package/dist/actors/affordance.js +12 -12
- package/dist/actors/agent-session.d.ts +2 -2
- package/dist/actors/agent-session.js +7 -7
- package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
- package/dist/actors/codex/app-server-actor-trace.js +1 -1
- package/dist/actors/codex/app-server-client.js +2 -1
- package/dist/actors/codex/app-server-trace.d.ts +0 -1
- package/dist/actors/codex/app-server-trace.js +1 -3
- package/dist/actors/codex/app-server-ui.js +1 -1
- package/dist/actors/codex/app-server.js +2 -1
- package/dist/actors/codex/codex-admission.d.ts +91 -0
- package/dist/actors/codex/codex-admission.js +150 -0
- package/dist/actors/codex/protocol-compat.d.ts +27 -0
- package/dist/actors/codex/protocol-compat.js +357 -0
- package/dist/actors/codex/protocol-contract.d.ts +61 -0
- package/dist/actors/codex/protocol-contract.js +471 -0
- package/dist/actors/codex/restricted-executable.d.ts +28 -4
- package/dist/actors/codex/restricted-executable.js +104 -29
- package/dist/actors/codex/restricted-launch.d.ts +9 -2
- package/dist/actors/codex/restricted-launch.js +43 -4
- package/dist/actors/codex/restricted-notifications.d.ts +101 -0
- package/dist/actors/codex/restricted-notifications.js +277 -0
- package/dist/actors/codex/restricted-participant.d.ts +30 -0
- package/dist/actors/codex/restricted-participant.js +66 -6
- package/dist/actors/codex/restricted-policy.d.ts +11 -3
- package/dist/actors/codex/restricted-policy.js +2 -2
- package/dist/actors/codex/restricted-session.d.ts +16 -3
- package/dist/actors/codex/restricted-session.js +60 -22
- package/dist/actors/codex/restricted-transport.d.ts +29 -0
- package/dist/actors/codex/restricted-transport.js +139 -27
- package/dist/actors/codex/restricted-turn.d.ts +19 -4
- package/dist/actors/codex/restricted-turn.js +43 -30
- package/dist/actors/computer-use/actor.d.ts +17 -17
- package/dist/actors/computer-use/actor.js +6 -6
- package/dist/actors/computer-use/admission-limit.d.ts +1 -1
- package/dist/actors/computer-use/admission-limit.js +1 -1
- package/dist/actors/computer-use/loop/actions.d.ts +3 -3
- package/dist/actors/computer-use/loop/actions.js +10 -10
- package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
- package/dist/actors/computer-use/loop/backstop.js +15 -13
- package/dist/actors/computer-use/loop/ending.d.ts +7 -7
- package/dist/actors/computer-use/loop/ending.js +9 -9
- package/dist/actors/computer-use/loop/observation.d.ts +2 -2
- package/dist/actors/computer-use/loop/observation.js +9 -9
- package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
- package/dist/actors/computer-use/loop/provider-call.js +1 -1
- package/dist/actors/computer-use/loop/session.js +3 -3
- package/dist/actors/computer-use/loop/spend.d.ts +2 -2
- package/dist/actors/computer-use/loop/spend.js +4 -4
- package/dist/actors/computer-use/loop/trace.js +11 -10
- package/dist/actors/computer-use/loop/types.d.ts +37 -26
- package/dist/actors/computer-use/loop/usage.js +2 -2
- package/dist/actors/computer-use/loop.js +4 -4
- package/dist/actors/computer-use/openai-context.d.ts +37 -0
- package/dist/actors/computer-use/openai-context.js +214 -0
- package/dist/actors/computer-use/openai-provider.d.ts +12 -9
- package/dist/actors/computer-use/openai-provider.js +47 -36
- package/dist/actors/computer-use/openai-requests.d.ts +36 -10
- package/dist/actors/computer-use/openai-requests.js +82 -15
- package/dist/actors/computer-use/openai-wire.d.ts +19 -7
- package/dist/actors/computer-use/openai-wire.js +36 -34
- package/dist/actors/contract.d.ts +86 -49
- package/dist/actors/contract.js +29 -23
- package/dist/actors/local-agent/claude-session.d.ts +1 -1
- package/dist/actors/local-agent/claude-session.js +10 -9
- package/dist/actors/local-agent/cli.d.ts +8 -6
- package/dist/actors/local-agent/cli.js +24 -28
- package/dist/actors/local-agent/readiness.d.ts +2 -2
- package/dist/actors/local-agent/readiness.js +4 -4
- package/dist/actors/reasoning-effort.js +6 -6
- package/dist/actors/registry.d.ts +10 -10
- package/dist/actors/registry.js +18 -17
- package/dist/actors/scripted-browser/actor.d.ts +8 -8
- package/dist/actors/scripted-browser/actor.js +16 -16
- package/dist/actors/scripted-browser/browser-command.js +1 -1
- package/dist/actors/scripted-browser/journey.js +15 -4
- package/dist/actors/scripted-browser/steps.js +19 -1
- package/dist/actors/scripted-browser/types.d.ts +12 -2
- package/dist/actors/stop-conditions.d.ts +1 -1
- package/dist/actors/stop-conditions.js +1 -3
- package/dist/analysis/automatic-completion.d.ts +13 -8
- package/dist/analysis/automatic-completion.js +14 -8
- package/dist/analysis/automatic-config.d.ts +1 -1
- package/dist/analysis/automatic-config.js +2 -2
- package/dist/analysis/automatic.d.ts +10 -4
- package/dist/analysis/automatic.js +17 -13
- package/dist/analysis/codex-config.d.ts +6 -2
- package/dist/analysis/codex-config.js +22 -14
- package/dist/analysis/diagnostics.d.ts +23 -0
- package/dist/analysis/diagnostics.js +112 -0
- package/dist/analysis/evidence-sources.js +2 -2
- package/dist/analysis/evidence.js +6 -6
- package/dist/analysis/execute.d.ts +7 -1
- package/dist/analysis/execute.js +39 -12
- package/dist/analysis/job.d.ts +8 -5
- package/dist/analysis/job.js +15 -14
- package/dist/analysis/load.d.ts +1 -1
- package/dist/analysis/load.js +5 -5
- package/dist/analysis/provider.d.ts +9 -1
- package/dist/analysis/restricted-codex.d.ts +2 -0
- package/dist/analysis/restricted-codex.js +10 -1
- package/dist/analysis/service.d.ts +2 -0
- package/dist/analysis/service.js +35 -16
- package/dist/analysis/sharing.d.ts +2 -2
- package/dist/analysis/sharing.js +5 -5
- package/dist/analysis/store-executions.d.ts +5 -5
- package/dist/analysis/store-executions.js +12 -12
- package/dist/analysis/store.d.ts +4 -4
- package/dist/analysis/store.js +13 -13
- package/dist/cli/commands/analysis-signals.d.ts +2 -1
- package/dist/cli/commands/analysis-signals.js +4 -1
- package/dist/cli/commands/analyze.js +23 -18
- package/dist/cli/commands/codex.js +9 -9
- package/dist/cli/commands/comms.js +62 -34
- package/dist/cli/commands/feedback.js +20 -21
- package/dist/cli/commands/lab-format.d.ts +5 -4
- package/dist/cli/commands/lab-format.js +35 -23
- package/dist/cli/commands/lab-route-computer-use.d.ts +0 -2
- package/dist/cli/commands/lab-route-computer-use.js +32 -21
- package/dist/cli/commands/lab-route-preview.d.ts +1 -3
- package/dist/cli/commands/lab-route-preview.js +7 -7
- package/dist/cli/commands/lab-route-run.d.ts +6 -4
- package/dist/cli/commands/lab-route-run.js +6 -2
- package/dist/cli/commands/lab-route-scripted.d.ts +0 -2
- package/dist/cli/commands/lab-route-scripted.js +0 -1
- package/dist/cli/commands/lab-route-shared-world.d.ts +0 -2
- package/dist/cli/commands/lab-route-shared-world.js +3 -4
- package/dist/cli/commands/lab-route-terminal.d.ts +0 -2
- package/dist/cli/commands/lab-route-terminal.js +0 -1
- package/dist/cli/commands/lab-run.js +84 -54
- package/dist/cli/commands/lab-scorer.d.ts +2 -4
- package/dist/cli/commands/lab-scorer.js +1 -1
- package/dist/cli/commands/migrate.d.ts +4 -0
- package/dist/cli/commands/migrate.js +65 -0
- package/dist/cli/commands/observe.js +168 -107
- package/dist/cli/commands/run-command.d.ts +10 -0
- package/dist/cli/commands/run-command.js +85 -0
- package/dist/cli/commands/run-signals.d.ts +30 -0
- package/dist/cli/commands/run-signals.js +146 -0
- package/dist/cli/commands/runs.js +137 -136
- package/dist/cli/commands/setup.d.ts +2 -2
- package/dist/cli/commands/setup.js +26 -21
- package/dist/cli/commands/study.d.ts +3 -0
- package/dist/cli/commands/study.js +182 -0
- package/dist/cli/commands/tui.d.ts +4 -4
- package/dist/cli/commands/tui.js +21 -21
- package/dist/cli/commands/watch.js +64 -77
- package/dist/cli/deprecations.d.ts +18 -0
- package/dist/cli/deprecations.js +48 -0
- package/dist/cli/doctor.d.ts +18 -5
- package/dist/cli/doctor.js +111 -48
- package/dist/cli/first-run-path.d.ts +12 -10
- package/dist/cli/first-run-path.js +30 -28
- package/dist/cli/io.d.ts +46 -10
- package/dist/cli/io.js +109 -30
- package/dist/cli/observer-follow.d.ts +2 -2
- package/dist/cli/observer-follow.js +5 -6
- package/dist/cli/orientation.d.ts +6 -3
- package/dist/cli/orientation.js +43 -39
- package/dist/cli/product-sentence.d.ts +6 -0
- package/dist/cli/product-sentence.js +6 -0
- package/dist/cli/program.d.ts +6 -1
- package/dist/cli/program.js +112 -43
- package/dist/cli/telemetry.d.ts +17 -17
- package/dist/cli/telemetry.js +49 -41
- package/dist/cli.js +1 -1
- package/dist/comms/capture-surface.d.ts +14 -13
- package/dist/comms/capture-surface.js +23 -22
- package/dist/comms/catch-host.d.ts +8 -8
- package/dist/comms/catch-host.js +14 -14
- package/dist/comms/connections.js +4 -4
- package/dist/comms/email-catch.d.ts +3 -3
- package/dist/comms/email-catch.js +8 -8
- package/dist/comms/external-evidence.d.ts +27 -0
- package/dist/comms/external-evidence.js +93 -0
- package/dist/comms/extract.js +2 -2
- package/dist/comms/fake-inbox.d.ts +2 -2
- package/dist/comms/fake-inbox.js +2 -2
- package/dist/comms/lease-store.js +7 -7
- package/dist/comms/receiving-render.d.ts +1 -1
- package/dist/comms/receiving-render.js +2 -2
- package/dist/comms/sandbox-catch-script.d.ts +6 -6
- package/dist/comms/sandbox-catch-script.js +6 -6
- package/dist/comms/sandbox-catch.d.ts +36 -37
- package/dist/comms/sandbox-catch.js +34 -35
- package/dist/comms/setup.js +42 -8
- package/dist/comms/thread-evidence.d.ts +1 -1
- package/dist/comms/thread-evidence.js +6 -6
- package/dist/comms/types.d.ts +6 -6
- package/dist/comms/types.js +4 -4
- package/dist/evidence/browser-hygiene.d.ts +1 -1
- package/dist/evidence/browser-hygiene.js +1 -1
- package/dist/evidence/frame-signature.d.ts +1 -1
- package/dist/evidence/frame-signature.js +4 -4
- package/dist/evidence/redaction.d.ts +3 -3
- package/dist/evidence/redaction.js +5 -5
- package/dist/evidence/secret-scrub.d.ts +9 -0
- package/dist/evidence/secret-scrub.js +96 -0
- package/dist/feedback/draft.js +41 -85
- package/dist/feedback/export-bundle.js +5 -5
- package/dist/feedback/export.d.ts +5 -1
- package/dist/feedback/export.js +16 -17
- package/dist/feedback/feedback.d.ts +3 -3
- package/dist/feedback/feedback.js +21 -3
- package/dist/guest/chromium-text.js +2 -2
- package/dist/guest/desktop-native.d.ts +1 -1
- package/dist/guest/runtime.js +1 -1
- package/dist/index.d.ts +14 -15
- package/dist/index.js +10 -11
- package/dist/keys/key-resolution.d.ts +7 -5
- package/dist/keys/key-resolution.js +40 -38
- package/dist/lab/adapter-extension.d.ts +35 -13
- package/dist/lab/adapter-extension.js +50 -134
- package/dist/lab/adapter-scorer-loader.d.ts +32 -12
- package/dist/lab/adapter-scorer-loader.js +56 -32
- package/dist/lab/composition-rules.js +58 -58
- package/dist/lab/config.js +85 -43
- package/dist/lab/deprecated-fields.d.ts +10 -0
- package/dist/lab/deprecated-fields.js +24 -0
- package/dist/lab/device-presets.d.ts +10 -10
- package/dist/lab/device-presets.js +11 -11
- package/dist/lab/discover.d.ts +13 -9
- package/dist/lab/discover.js +118 -60
- package/dist/lab/doctor.d.ts +53 -11
- package/dist/lab/doctor.js +193 -47
- package/dist/lab/init-plan.js +1 -3
- package/dist/lab/init-templates.js +147 -147
- package/dist/lab/init.d.ts +1 -1
- package/dist/lab/init.js +41 -9
- package/dist/lab/keys.d.ts +2 -0
- package/dist/lab/keys.js +43 -9
- package/dist/lab/lab-deps.d.ts +80 -0
- package/dist/lab/lab-deps.js +4 -0
- package/dist/lab/parse/actors.js +17 -16
- package/dist/lab/parse/comms.js +8 -7
- package/dist/lab/parse/execution.js +15 -14
- package/dist/lab/parse/study-v3.d.ts +23 -0
- package/dist/lab/parse/study-v3.js +259 -0
- package/dist/lab/parse/subject-state.d.ts +7 -7
- package/dist/lab/parse/subject-state.js +18 -17
- package/dist/lab/parse/subject.js +30 -29
- package/dist/lab/parse/values.d.ts +1 -2
- package/dist/lab/parse/values.js +3 -6
- package/dist/lab/persona-resolve.d.ts +7 -7
- package/dist/lab/persona-resolve.js +8 -8
- package/dist/lab/persona.js +1 -3
- package/dist/lab/plan-base.d.ts +0 -2
- package/dist/lab/plan-base.js +6 -4
- package/dist/lab/plan-participants.d.ts +7 -7
- package/dist/lab/plan-participants.js +2 -2
- package/dist/lab/plan-types.d.ts +26 -8
- package/dist/lab/plan.d.ts +4 -18
- package/dist/lab/plan.js +24 -79
- package/dist/lab/preflight-probes.js +11 -11
- package/dist/lab/preflight-result.d.ts +2 -1
- package/dist/lab/preflight-result.js +5 -6
- package/dist/lab/preflight.d.ts +7 -8
- package/dist/lab/preflight.js +6 -6
- package/dist/lab/requirements.d.ts +20 -0
- package/dist/lab/requirements.js +54 -0
- package/dist/lab/route-inputs.d.ts +23 -12
- package/dist/lab/route-inputs.js +48 -51
- package/dist/lab/routing.d.ts +42 -41
- package/dist/lab/routing.js +66 -68
- package/dist/lab/run-lab-events.d.ts +3 -11
- package/dist/lab/run-lab-events.js +2 -16
- package/dist/lab/run-lab-homes.d.ts +76 -0
- package/dist/lab/run-lab-homes.js +7 -0
- package/dist/lab/run-lab-options.d.ts +12 -66
- package/dist/lab/run-lab-options.js +58 -285
- package/dist/lab/summary.d.ts +15 -9
- package/dist/lab/summary.js +24 -17
- package/dist/lab/tasks.d.ts +15 -15
- package/dist/lab/tasks.js +14 -14
- package/dist/lab/types.d.ts +201 -195
- package/dist/lab/types.js +2 -0
- package/dist/lab/validation.d.ts +21 -21
- package/dist/lab/validation.js +61 -59
- package/dist/lab/warnings.d.ts +10 -0
- package/dist/lab/warnings.js +70 -41
- package/dist/library-aliases.d.ts +56 -0
- package/dist/library-aliases.js +22 -0
- package/dist/observer/artifact.d.ts +2 -2
- package/dist/observer/artifact.js +9 -9
- package/dist/observer/data.d.ts +6 -6
- package/dist/observer/data.js +7 -6
- package/dist/observer/exposure.d.ts +1 -1
- package/dist/observer/exposure.js +11 -11
- package/dist/observer/http.js +1 -1
- package/dist/observer/library.d.ts +1 -1
- package/dist/observer/library.js +4 -2
- package/dist/observer/listen.js +5 -4
- package/dist/observer/render.d.ts +1 -1
- package/dist/observer/render.js +12 -7
- package/dist/observer/run-routes.d.ts +4 -4
- package/dist/observer/run-routes.js +6 -6
- package/dist/observer/serve.d.ts +17 -0
- package/dist/observer/serve.js +41 -6
- package/dist/observer/tunnel.js +1 -1
- package/dist/observer-app.html +4 -4
- package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
- package/dist/routes/computer-use/bundle-parts.js +24 -17
- package/dist/routes/computer-use/bundle.d.ts +4 -11
- package/dist/routes/computer-use/bundle.js +12 -18
- package/dist/routes/computer-use/diagnostics.d.ts +1 -1
- package/dist/routes/computer-use/diagnostics.js +1 -1
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +11 -11
- package/dist/routes/computer-use/e2b-desktop/comms.js +24 -27
- package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
- package/dist/routes/computer-use/e2b-desktop/desktop.js +8 -11
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +16 -15
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +20 -19
- package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
- package/dist/routes/computer-use/e2b-desktop/prepare.js +40 -43
- package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/start.js +32 -30
- package/dist/routes/computer-use/e2b-desktop/state.d.ts +5 -4
- package/dist/routes/computer-use/e2b-desktop/state.js +5 -3
- package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/teardown.js +33 -20
- package/dist/routes/computer-use/external-comms.d.ts +4 -4
- package/dist/routes/computer-use/external-comms.js +19 -43
- package/dist/routes/computer-use/fanout-bundle.d.ts +3 -3
- package/dist/routes/computer-use/fanout-bundle.js +38 -42
- package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +33 -28
- package/dist/routes/computer-use/in-process-desktop.d.ts +3 -10
- package/dist/routes/computer-use/in-process-desktop.js +3 -9
- package/dist/routes/computer-use/live-flush.d.ts +7 -5
- package/dist/routes/computer-use/live-flush.js +20 -28
- package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +4 -2
- package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +17 -16
- package/dist/routes/computer-use/local-tree-pack.d.ts +3 -3
- package/dist/routes/computer-use/local-tree-pack.js +4 -5
- package/dist/routes/computer-use/local-vm.d.ts +11 -8
- package/dist/routes/computer-use/local-vm.js +40 -67
- package/dist/routes/computer-use/participant-desktop.d.ts +8 -23
- package/dist/routes/computer-use/participant-desktop.js +5 -25
- package/dist/routes/computer-use/{lanes.d.ts → participant-execution.d.ts} +11 -11
- package/dist/routes/computer-use/{lanes.js → participant-execution.js} +39 -26
- package/dist/routes/computer-use/participant-facts.d.ts +7 -1
- package/dist/routes/computer-use/participant-facts.js +12 -1
- package/dist/routes/computer-use/participant-model.d.ts +25 -11
- package/dist/routes/computer-use/participant-model.js +76 -34
- package/dist/routes/computer-use/participant-prompt.d.ts +13 -13
- package/dist/routes/computer-use/participant-prompt.js +8 -8
- package/dist/routes/computer-use/participant-runs.d.ts +11 -11
- package/dist/routes/computer-use/participant-runs.js +18 -18
- package/dist/routes/computer-use/plan.d.ts +21 -29
- package/dist/routes/computer-use/plan.js +70 -78
- package/dist/routes/computer-use/preflight.d.ts +3 -5
- package/dist/routes/computer-use/preflight.js +40 -36
- package/dist/routes/computer-use/rerun-selection.js +11 -7
- package/dist/routes/computer-use/result.d.ts +1 -1
- package/dist/routes/computer-use/result.js +48 -38
- package/dist/routes/computer-use/route.d.ts +5 -5
- package/dist/routes/computer-use/route.js +36 -33
- package/dist/routes/computer-use/self-report.d.ts +8 -8
- package/dist/routes/computer-use/self-report.js +33 -33
- package/dist/routes/computer-use/setup.d.ts +9 -15
- package/dist/routes/computer-use/setup.js +106 -83
- package/dist/routes/computer-use/single-bundle.d.ts +13 -16
- package/dist/routes/computer-use/single-bundle.js +46 -53
- package/dist/routes/computer-use/subject-projection.d.ts +6 -8
- package/dist/routes/computer-use/subject-projection.js +24 -23
- package/dist/routes/computer-use/types.d.ts +195 -238
- package/dist/routes/computer-use/types.js +21 -13
- package/dist/routes/preview.d.ts +8 -2
- package/dist/routes/preview.js +8 -5
- package/dist/routes/scripted/bundle.d.ts +5 -8
- package/dist/routes/scripted/bundle.js +23 -27
- package/dist/routes/scripted/plan.d.ts +6 -8
- package/dist/routes/scripted/plan.js +15 -13
- package/dist/routes/scripted/result.d.ts +4 -1
- package/dist/routes/scripted/result.js +15 -11
- package/dist/routes/scripted/route.js +15 -17
- package/dist/routes/scripted/scenario.d.ts +1 -1
- package/dist/routes/scripted/scenario.js +3 -3
- package/dist/routes/scripted/setup.d.ts +3 -2
- package/dist/routes/scripted/setup.js +27 -26
- package/dist/routes/scripted/subject.d.ts +8 -3
- package/dist/routes/scripted/subject.js +10 -6
- package/dist/routes/scripted/surface-records.js +4 -4
- package/dist/routes/scripted/surface-sessions.d.ts +2 -2
- package/dist/routes/scripted/surface-sessions.js +4 -4
- package/dist/routes/scripted/types.d.ts +21 -40
- package/dist/routes/scripted/types.js +2 -3
- package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +17 -16
- package/dist/routes/shared-world/bundle.d.ts +7 -7
- package/dist/routes/shared-world/bundle.js +60 -62
- package/dist/routes/shared-world/checkpoints.d.ts +5 -5
- package/dist/routes/shared-world/checkpoints.js +5 -5
- package/dist/routes/shared-world/comms.d.ts +8 -7
- package/dist/routes/shared-world/comms.js +38 -51
- package/dist/routes/shared-world/external-public.d.ts +6 -5
- package/dist/routes/shared-world/external-public.js +28 -25
- package/dist/routes/shared-world/handoff.d.ts +10 -9
- package/dist/routes/shared-world/handoff.js +89 -81
- package/dist/routes/shared-world/lobby-code.d.ts +7 -7
- package/dist/routes/shared-world/lobby-code.js +22 -22
- package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +15 -12
- package/dist/routes/shared-world/{seats.js → participant-specs.js} +65 -63
- package/dist/routes/shared-world/plan.d.ts +2 -6
- package/dist/routes/shared-world/plan.js +8 -9
- package/dist/routes/shared-world/provenance.d.ts +4 -4
- package/dist/routes/shared-world/provenance.js +4 -4
- package/dist/routes/shared-world/provisioned.d.ts +3 -2
- package/dist/routes/shared-world/provisioned.js +55 -48
- package/dist/routes/shared-world/result.js +47 -36
- package/dist/routes/shared-world/route.js +54 -57
- package/dist/routes/shared-world/setup.d.ts +6 -5
- package/dist/routes/shared-world/setup.js +16 -18
- package/dist/routes/shared-world/types.d.ts +70 -141
- package/dist/routes/shared-world/types.js +5 -5
- package/dist/routes/terminal/adapter.d.ts +10 -10
- package/dist/routes/terminal/adapter.js +32 -129
- package/dist/routes/terminal/bundle.d.ts +10 -15
- package/dist/routes/terminal/bundle.js +43 -52
- package/dist/routes/terminal/credentials.d.ts +4 -4
- package/dist/routes/terminal/credentials.js +20 -20
- package/dist/routes/terminal/dry-run.d.ts +1 -1
- package/dist/routes/terminal/dry-run.js +13 -15
- package/dist/routes/terminal/encoding.d.ts +1 -1
- package/dist/routes/terminal/encoding.js +4 -4
- package/dist/routes/terminal/ledger.d.ts +8 -8
- package/dist/routes/terminal/ledger.js +22 -22
- package/dist/routes/terminal/live-finish.d.ts +1 -2
- package/dist/routes/terminal/live-finish.js +24 -23
- package/dist/routes/terminal/live-sandbox.d.ts +3 -2
- package/dist/routes/terminal/live-sandbox.js +31 -32
- package/dist/routes/terminal/participant-text.d.ts +23 -0
- package/dist/routes/terminal/participant-text.js +165 -0
- package/dist/routes/terminal/persona.js +1 -1
- package/dist/routes/terminal/plan.d.ts +2 -6
- package/dist/routes/terminal/plan.js +23 -19
- package/dist/routes/terminal/recorder.d.ts +6 -1
- package/dist/routes/terminal/recorder.js +12 -4
- package/dist/routes/terminal/result.js +12 -12
- package/dist/routes/terminal/route.js +30 -31
- package/dist/routes/terminal/runtime.d.ts +3 -2
- package/dist/routes/terminal/runtime.js +3 -3
- package/dist/routes/terminal/sandbox.d.ts +4 -4
- package/dist/routes/terminal/sandbox.js +10 -10
- package/dist/routes/terminal/session.js +22 -19
- package/dist/routes/terminal/token-usage.d.ts +1 -1
- package/dist/routes/terminal/token-usage.js +10 -11
- package/dist/routes/terminal/trace.d.ts +7 -10
- package/dist/routes/terminal/trace.js +11 -66
- package/dist/routes/terminal/types.d.ts +104 -114
- package/dist/routes/terminal/types.js +12 -7
- package/dist/run/active-runs.d.ts +13 -0
- package/dist/run/active-runs.js +12 -0
- package/dist/run/bundle-shape.d.ts +2 -1
- package/dist/run/bundle-shape.js +7 -7
- package/dist/run/bundle.d.ts +99 -92
- package/dist/run/bundle.js +10 -8
- package/dist/run/cost-summary.js +6 -5
- package/dist/run/costs.d.ts +6 -6
- package/dist/run/costs.js +17 -11
- package/dist/run/detail.d.ts +9 -9
- package/dist/run/detail.js +10 -10
- package/dist/run/dry-run-inputs.js +1 -1
- package/dist/run/dry-run.js +23 -30
- package/dist/run/{study-files.d.ts → evidence-files.d.ts} +4 -4
- package/dist/run/{study-files.js → evidence-files.js} +5 -5
- package/dist/run/feedback-shape.js +1 -1
- package/dist/run/judge.d.ts +34 -16
- package/dist/run/judge.js +41 -14
- package/dist/run/locate.d.ts +2 -0
- package/dist/run/locate.js +3 -1
- package/dist/run/outcomes.d.ts +3 -3
- package/dist/run/outcomes.js +3 -3
- package/dist/run/participant-records.d.ts +2 -2
- package/dist/run/participant-records.js +2 -2
- package/dist/run/paths.d.ts +1 -1
- package/dist/run/paths.js +2 -2
- package/dist/run/pricing.d.ts +30 -15
- package/dist/run/pricing.js +49 -30
- package/dist/run/projection.d.ts +27 -27
- package/dist/run/projection.js +23 -23
- package/dist/run/reclaim.d.ts +6 -0
- package/dist/run/reclaim.js +15 -5
- package/dist/run/results.d.ts +5 -5
- package/dist/run/run-index.d.ts +9 -7
- package/dist/run/run-index.js +24 -25
- package/dist/run/run-not-found.d.ts +5 -0
- package/dist/run/run-not-found.js +15 -0
- package/dist/run/run.d.ts +7 -4
- package/dist/run/run.js +10 -6
- package/dist/run/sandbox-receipts.d.ts +5 -5
- package/dist/run/sandbox-receipts.js +6 -6
- package/dist/run/shared-world-evidence.d.ts +67 -66
- package/dist/run/shared-world-evidence.js +4 -4
- package/dist/run/shared-world-shape.d.ts +3 -3
- package/dist/run/shared-world-shape.js +16 -16
- package/dist/run/stats.d.ts +17 -11
- package/dist/run/stats.js +124 -66
- package/dist/run/status.d.ts +21 -32
- package/dist/run/status.js +34 -33
- package/dist/run/stored-runs.js +2 -1
- package/dist/run/stream-shape.js +1 -1
- package/dist/run/streams.d.ts +29 -22
- package/dist/run/study-provenance.d.ts +47 -0
- package/dist/run/study-provenance.js +63 -0
- package/dist/run/study-result.d.ts +16 -0
- package/dist/run/study-result.js +9 -0
- package/dist/run/terminal-contract.d.ts +5 -5
- package/dist/run/terminal-contract.js +4 -4
- package/dist/run/text.d.ts +2 -0
- package/dist/run/text.js +4 -0
- package/dist/run/transient-comms-secrets.d.ts +5 -0
- package/dist/run/transient-comms-secrets.js +12 -0
- package/dist/run-lab.d.ts +40 -38
- package/dist/run-lab.js +42 -40
- package/dist/study/convert.d.ts +33 -0
- package/dist/study/convert.js +432 -0
- package/dist/study/field-paths.d.ts +12 -0
- package/dist/study/field-paths.js +126 -0
- package/dist/study/files.d.ts +26 -0
- package/dist/study/files.js +43 -0
- package/dist/study/migrate.d.ts +48 -0
- package/dist/study/migrate.js +408 -0
- package/dist/study/owned-files.d.ts +38 -0
- package/dist/study/owned-files.js +182 -0
- package/dist/subject/clone.d.ts +1 -1
- package/dist/subject/desktop-cli.d.ts +2 -2
- package/dist/subject/desktop-cli.js +3 -3
- package/dist/subject/local-tree-archive.d.ts +1 -1
- package/dist/subject/local-tree-archive.js +5 -5
- package/dist/subject/local-tree.d.ts +3 -3
- package/dist/subject/local-tree.js +1 -1
- package/dist/subject/node-bootstrap.d.ts +1 -1
- package/dist/subject/node-bootstrap.js +4 -4
- package/dist/subject/runtime.js +10 -11
- package/dist/subject/serve.d.ts +1 -1
- package/dist/subject/serve.js +4 -4
- package/dist/subject/state.d.ts +1 -1
- package/dist/subject/steps.d.ts +8 -8
- package/dist/subject/steps.js +7 -7
- package/dist/substrates/command-failure.d.ts +3 -3
- package/dist/substrates/command-failure.js +3 -3
- package/dist/substrates/detached.d.ts +6 -6
- package/dist/substrates/detached.js +7 -7
- package/dist/substrates/e2b/cdp-probe.d.ts +11 -11
- package/dist/substrates/e2b/cdp-probe.js +15 -18
- package/dist/substrates/e2b/desktop-browser.d.ts +5 -5
- package/dist/substrates/e2b/desktop-browser.js +12 -12
- package/dist/substrates/e2b/desktop-cdp.d.ts +15 -15
- package/dist/substrates/e2b/desktop-cdp.js +11 -11
- package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
- package/dist/substrates/e2b/desktop-executor.js +1 -1
- package/dist/substrates/e2b/desktop-geometry.d.ts +6 -6
- package/dist/substrates/e2b/desktop-geometry.js +9 -9
- package/dist/substrates/e2b/desktop-media.d.ts +1 -1
- package/dist/substrates/e2b/desktop-media.js +3 -3
- package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
- package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
- package/dist/substrates/e2b/sandbox.d.ts +1 -1
- package/dist/substrates/e2b/sandbox.js +2 -2
- package/dist/substrates/e2b/sdk.d.ts +11 -11
- package/dist/substrates/e2b/sdk.js +8 -8
- package/dist/substrates/local/runtime-host.d.ts +2 -0
- package/dist/substrates/local/runtime-host.js +6 -0
- package/dist/tui/actions.d.ts +8 -6
- package/dist/tui/actions.js +31 -22
- package/dist/tui/contract.d.ts +16 -16
- package/dist/tui/contract.js +10 -10
- package/dist/tui/launch.d.ts +4 -4
- package/dist/tui/launch.js +18 -19
- package/dist/tui/project.js +5 -5
- package/dist/tui-app.js +83 -83
- package/dist/verify/actor.d.ts +14 -14
- package/dist/verify/actor.js +45 -45
- package/dist/verify/artifacts.d.ts +3 -3
- package/dist/verify/artifacts.js +6 -6
- package/dist/verify/context-growth.d.ts +9 -0
- package/dist/verify/context-growth.js +62 -0
- package/dist/verify/costs.d.ts +7 -7
- package/dist/verify/costs.js +9 -9
- package/dist/verify/liveness.d.ts +1 -1
- package/dist/verify/liveness.js +4 -1
- package/dist/verify/rerun.d.ts +1 -1
- package/dist/verify/rerun.js +1 -1
- package/dist/verify/shared-world-concurrent.d.ts +2 -2
- package/dist/verify/shared-world-concurrent.js +79 -76
- package/dist/verify/shared-world.d.ts +2 -2
- package/dist/verify/shared-world.js +18 -18
- package/dist/verify/subject.d.ts +4 -4
- package/dist/verify/subject.js +18 -18
- package/dist/verify/verify.js +98 -49
- package/docs/README.md +26 -33
- package/docs/architecture/actor-contract.md +105 -98
- package/docs/architecture/desktop-sessions.md +14 -14
- package/docs/architecture/external-public-shared-world.md +66 -59
- package/docs/architecture/github-feedback-loop.md +1 -4
- package/docs/architecture/guest-desktop.md +2 -2
- package/docs/architecture/observer.md +37 -37
- package/docs/architecture/restricted-codex-analysis.md +70 -30
- package/docs/architecture/serve.md +34 -37
- package/docs/architecture/state-driven-executor.md +55 -59
- package/docs/architecture/task-protocol-support.md +7 -9
- package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +83 -115
- package/docs/contracts/README.md +24 -0
- package/docs/contracts/adapter-admission.md +3 -3
- package/docs/contracts/adapter-fixtures.md +2 -5
- package/docs/contracts/core.md +1 -3
- package/docs/contracts/errors.md +62 -0
- package/docs/contracts/feedback.md +8 -9
- package/docs/contracts/policy.md +7 -12
- package/docs/contracts/run-bundle.md +54 -51
- package/docs/contracts/schemas.md +505 -390
- package/docs/contracts/study-analysis.md +26 -2
- package/docs/contracts/study-costs.md +11 -7
- package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
- package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
- package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
- package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
- package/docs/principles/actor-fidelity.md +4 -4
- package/docs/principles/engineering.md +3 -3
- package/docs/principles/invariants-and-defaults.md +38 -38
- package/docs/principles/self-driving-harness.md +1 -5
- package/docs/principles/three-roles.md +1 -1
- package/docs/product/automatic-analysis.md +8 -7
- package/examples/participant/README.md +5 -5
- package/examples/participant/run.mjs +11 -10
- package/examples/scorer/README.md +3 -3
- package/examples/scorer/run.mjs +11 -12
- package/package.json +16 -17
- package/skills/humanish/SKILL.md +63 -60
- package/skills/humanish/agents/openai.yaml +1 -1
- package/AGENTS.md +0 -99
- package/CONTRIBUTING.md +0 -148
- package/dist/actors/codex/qualified-versions.d.ts +0 -45
- package/dist/actors/codex/qualified-versions.js +0 -87
- package/dist/cli/commands/lab.d.ts +0 -3
- package/dist/cli/commands/lab.js +0 -193
- package/dist/deprecated.d.ts +0 -90
- package/dist/deprecated.js +0 -106
- package/dist/lab/bag-overrides.d.ts +0 -18
- package/dist/lab/bag-overrides.js +0 -121
- package/dist/observer/static.d.ts +0 -39
- package/dist/observer/static.js +0 -369
- package/dist/routes/computer-use/legacy-lane-spec.d.ts +0 -62
- package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
- package/docs/architecture/comms-inbox.md +0 -122
- package/docs/architecture/desktop-recording.md +0 -80
- package/docs/architecture/local-browser-runtime.md +0 -178
- package/docs/architecture/observer-review.md +0 -144
- package/docs/architecture/participant-media.md +0 -90
- package/docs/architecture/project-layout.md +0 -62
- package/docs/architecture/real-email-receiving.md +0 -136
- package/docs/assets/humanish-drawdb-hero.png +0 -0
- package/docs/assets/humanish-observer-hero.png +0 -0
- package/docs/goals/current.md +0 -207
- package/docs/product/lobby-trivia-3player-external-public.md +0 -77
- package/docs/product/open-source-install-experience.md +0 -240
- package/docs/ramp/README.md +0 -294
- package/docs/release/open-source-readiness.md +0 -222
- package/docs/release/public-readiness-standard.md +0 -210
- package/docs/roadmap/world-class-open-source-v0.md +0 -311
- /package/dist/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
- /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
|
@@ -1,18 +1,15 @@
|
|
|
1
|
-
# State-driven executor (the `
|
|
1
|
+
# State-driven executor (the `ComputerUseExecutor` port)
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
non-vision provider, driven through the lab with NO E2B and NO vision) is
|
|
7
|
-
implemented and proven. A config-only deterministic route and a
|
|
8
|
-
`subject.contract.ref` JS-module loader are deferred (see "Deferred", below).
|
|
3
|
+
The library path ships: a custom executor and a non-vision provider, driven through a study with
|
|
4
|
+
no E2B desktop and no vision model. A config-only deterministic route and a `subject.contract.ref`
|
|
5
|
+
module loader are not built (see Not built, below).
|
|
9
6
|
|
|
10
7
|
## What this is
|
|
11
8
|
|
|
12
9
|
The computer-use (CUA) loop in
|
|
13
10
|
[`src/actors/computer-use/loop.ts`](https://github.com/danielgwilson/humanish/blob/main/src/actors/computer-use/loop.ts) is provider- and
|
|
14
|
-
substrate-agnostic by design: the model lives behind a `
|
|
15
|
-
being driven lives behind a `
|
|
11
|
+
substrate-agnostic by design: the model lives behind a `ComputerUseProvider` port and the thing
|
|
12
|
+
being driven lives behind a `ComputerUseExecutor` port. Both ports are declared in
|
|
16
13
|
`src/actors/computer-use/loop/types.ts`. You do not have to drive a screen with a vision
|
|
17
14
|
model. You can point the loop at **an already-running local app** and drive it through that
|
|
18
15
|
app's **in-process JavaScript automation contract** (e.g. `window.app.getState()`,
|
|
@@ -27,12 +24,12 @@ This is the "plural harnesses / transport-agnostic" intent of
|
|
|
27
24
|
## The port
|
|
28
25
|
|
|
29
26
|
```ts
|
|
30
|
-
interface
|
|
31
|
-
observe(): Promise<
|
|
32
|
-
execute(action:
|
|
27
|
+
interface ComputerUseExecutor {
|
|
28
|
+
observe(): Promise<ComputerUseObservation>; // capture current state
|
|
29
|
+
execute(action: ComputerUseAction, signal?: AbortSignal): Promise<void>; // perform one action
|
|
33
30
|
}
|
|
34
31
|
|
|
35
|
-
interface
|
|
32
|
+
interface ComputerUseObservation {
|
|
36
33
|
screenshot?: Buffer; // OPTIONAL — a state executor omits it
|
|
37
34
|
stateSignature: string; // REQUIRED — the fallback progress key
|
|
38
35
|
appState?: Record<string, unknown>; // structured state; preferred for progress
|
|
@@ -71,9 +68,9 @@ graphically dense (pixel-art) UI. `stableProgressKey(appState)`:
|
|
|
71
68
|
- sorts object keys, so key order never counts as progress;
|
|
72
69
|
- caps depth, key count, array length, string length, and total output;
|
|
73
70
|
- never throws on a cyclic or huge `appState`; it degrades to a bounded value
|
|
74
|
-
(cycles become `"[Circular]"`, over-cap nodes become markers).
|
|
75
|
-
correctness
|
|
76
|
-
|
|
71
|
+
(cycles become `"[Circular]"`, over-cap nodes become markers). The loop's
|
|
72
|
+
correctness depends on this: a hostile or merely large state blob cannot crash
|
|
73
|
+
it.
|
|
77
74
|
|
|
78
75
|
## A single desktop command failure is a recoverable skipped action
|
|
79
76
|
|
|
@@ -102,7 +99,7 @@ skipped: desktop command failed`, text = the public-safe action label + exit cod
|
|
|
102
99
|
and any genuine non-`CommandExitError` adapter fault as `actor_error`.
|
|
103
100
|
- **No infinite loop.** A skipped action changes nothing on screen, so it is not
|
|
104
101
|
progress. A run that keeps failing every action makes no progress and still
|
|
105
|
-
terminates
|
|
102
|
+
terminates through the existing idle / no-progress backstop
|
|
106
103
|
(`gave_up`). The resilience only converts a _single flaky command_ from fatal
|
|
107
104
|
to survivable; it never masks a genuinely stuck run.
|
|
108
105
|
|
|
@@ -112,7 +109,7 @@ whitespace-collapsed) and a numeric exit code, and is still run through the loop
|
|
|
112
109
|
values, and machine paths never appear. The action label comes from
|
|
113
110
|
`describeCuaAction`, which never includes typed text.
|
|
114
111
|
|
|
115
|
-
## You need a
|
|
112
|
+
## You need a non-vision provider too
|
|
116
113
|
|
|
117
114
|
Swapping the executor is not enough. The default OpenAI computer-use provider is
|
|
118
115
|
**vision-based**: it sends the screenshot as the `computer_call_output`, so a
|
|
@@ -122,7 +119,7 @@ reasons over app state).
|
|
|
122
119
|
|
|
123
120
|
**Provider-authoring contract:**
|
|
124
121
|
|
|
125
|
-
- A **vision** provider
|
|
122
|
+
- A **vision** provider must set `requiresFrame: true` (the OpenAI provider does). When a
|
|
126
123
|
`requiresFrame: true` provider is handed a screenshot-less observation, the loop ends the
|
|
127
124
|
session with a structured `harness_error` (`missingFrame` in
|
|
128
125
|
`src/actors/computer-use/loop/ending.ts`). It neither crashes silently nor passes falsely.
|
|
@@ -131,10 +128,10 @@ reasons over app state).
|
|
|
131
128
|
|
|
132
129
|
`requiresFrame` defaulting to falsey is a known third-party-author footgun (a vision
|
|
133
130
|
provider that forgets to set it would get a blank-frame crash instead of a clean verdict).
|
|
134
|
-
|
|
131
|
+
The loop accepts it because every in-tree vision provider sets it: OpenAI computer use,
|
|
135
132
|
the local-agent Codex and Claude sessions, and the restricted Codex participant.
|
|
136
133
|
|
|
137
|
-
## `appState` is
|
|
134
|
+
## `appState` is runtime-only
|
|
138
135
|
|
|
139
136
|
`appState` is an in-memory progress-comparison input, exactly like
|
|
140
137
|
`stateSignature` (which is itself never written as text). It is **never** copied
|
|
@@ -144,35 +141,35 @@ trace. Only the derived progress key is computed in-memory and discarded.
|
|
|
144
141
|
Why: the published-evidence scan catches only secret-_shaped_ patterns. A
|
|
145
142
|
structured app blob (ids, free-form state, possibly user chat or shapeless
|
|
146
143
|
tokens) is exactly the "value has no shape" gap that pattern redaction cannot
|
|
147
|
-
close. So
|
|
144
|
+
close. So `appState` is not an evidence surface at all.
|
|
148
145
|
|
|
149
|
-
The bundle
|
|
146
|
+
The bundle says so: when a state executor
|
|
150
147
|
surfaces `appState`, the trace's `redaction.notes` declares that app state was
|
|
151
|
-
observed each turn to drive progress detection and was
|
|
148
|
+
observed each turn to drive progress detection and was not written to the trace.
|
|
152
149
|
|
|
153
|
-
A future
|
|
154
|
-
`redaction.redactText` (and the
|
|
150
|
+
A future change that puts `appState` in evidence must route a stringified projection through
|
|
151
|
+
`redaction.redactText` (and the study's `scrubText`) and cap / whitelist fields
|
|
155
152
|
before persisting. Pattern + literal redaction alone cannot sanitize an
|
|
156
153
|
arbitrary blob.
|
|
157
154
|
|
|
158
|
-
## Provenance is
|
|
155
|
+
## Provenance is declared unpinned
|
|
159
156
|
|
|
160
157
|
An already-running local dev server cannot be commit-pinned. The bundle does not
|
|
161
158
|
silently omit a subject block. It declares the absence: `subject.source:
|
|
162
159
|
app-url` with `state.provenance: "undeclared"` (the app-url "absence declared"
|
|
163
160
|
marker), and a `cua-lab.subject.declared` event that states the entry is a local
|
|
164
|
-
dev server driven in-process, caller-provisioned and
|
|
161
|
+
dev server driven in-process, caller-provisioned and unpinned, with no E2B
|
|
165
162
|
desktop created.
|
|
166
163
|
|
|
167
164
|
## Two entry points
|
|
168
165
|
|
|
169
166
|
### 1. Bare `runComputerUseLoop` (lowest level)
|
|
170
167
|
|
|
171
|
-
Implement `
|
|
172
|
-
from your own state, pair it with a non-vision `
|
|
168
|
+
Implement `ComputerUseExecutor.observe()/execute()`, derive `stateSignature`/`appState`
|
|
169
|
+
from your own state, pair it with a non-vision `ComputerUseProvider`, and call
|
|
173
170
|
`runComputerUseLoop`. You own the bundle/redaction wiring.
|
|
174
171
|
|
|
175
|
-
### 2. `
|
|
172
|
+
### 2. `runStudy` + `inProcess` / `createProvider` (keeps the composition)
|
|
176
173
|
|
|
177
174
|
The supported library path keeps personas, the Observer, the evidence bundle,
|
|
178
175
|
redaction, and the friction loop, while skipping E2B entirely. Start with the
|
|
@@ -185,48 +182,47 @@ node node_modules/humanish/examples/participant/run.mjs
|
|
|
185
182
|
```
|
|
186
183
|
|
|
187
184
|
The example includes a real loopback app, HTTP state/action bridge, full config
|
|
188
|
-
object (`schema:
|
|
189
|
-
`stableProgressKey`, `
|
|
185
|
+
object (`schema: STUDY_SCHEMA`), deterministic non-vision provider,
|
|
186
|
+
`stableProgressKey`, `runStudy`, verification, a printed report and `finally`
|
|
190
187
|
cleanup. It makes no model calls and does not demonstrate persona efficacy.
|
|
191
|
-
`
|
|
192
|
-
on `.ok`, then narrow `
|
|
193
|
-
the
|
|
194
|
-
|
|
188
|
+
`parseStudy` accepts a decoded object, not a YAML string; narrow its result
|
|
189
|
+
on `.ok`, then narrow `runStudy`'s result on `route === "computer-use"` before
|
|
190
|
+
reading the computer-use result. The example defines all helpers, so a consumer does not
|
|
191
|
+
reconstruct them.
|
|
195
192
|
|
|
196
|
-
Pass `inProcess: { executor }` and `createProvider` in `
|
|
193
|
+
Pass `inProcess: { executor }` and `createProvider` in `RunStudyOptions`. The type requires
|
|
197
194
|
`createProvider` beside `inProcess`: a state executor returns no frame, so it needs a non-vision
|
|
198
|
-
provider. With `inProcess` set,
|
|
195
|
+
provider. With `inProcess` set, the computer-use route takes a branch that never
|
|
199
196
|
loads the E2B module, creates a sandbox, runs `prepareDesktop`, provisions a
|
|
200
197
|
clone, opens a browser, or starts a stream. `sandboxId`/`streamUrl` stay
|
|
201
198
|
undefined, so `result.sandbox` is omitted. That omission is the verifiable
|
|
202
199
|
"no E2B SDK call" proof.
|
|
203
200
|
|
|
204
|
-
Fail-closed guards, all
|
|
205
|
-
`
|
|
201
|
+
Fail-closed guards, all before any key check, so a CLI invocation never sees a misleading
|
|
202
|
+
`HUMANISH_COMPUTER_USE_KEYS_MISSING` first:
|
|
206
203
|
|
|
207
|
-
- `
|
|
204
|
+
- `HUMANISH_STUDY_OPTION_UNSUPPORTED`: `inProcess` without `createProvider` (from JavaScript,
|
|
208
205
|
where the type does not stop it), or on a subject other than `app-url` or `local-app`.
|
|
209
206
|
`createProvider` alone is allowed; that is a model swap on the normal E2B route.
|
|
210
|
-
- `
|
|
211
|
-
with more than one participant. The planner refuses it, because fan-out gives each participant
|
|
207
|
+
- `HUMANISH_COMPUTER_USE_FANOUT_INVALID`: `inProcess` with more than one participant. The planner refuses it, because fan-out gives each participant
|
|
212
208
|
its own E2B desktop and the in-process route has none.
|
|
213
|
-
- `
|
|
209
|
+
- `HUMANISH_COMPUTER_USE_LOCAL_APP_NO_EXECUTOR`: a `subject.source: local-app` config run
|
|
214
210
|
without `inProcess` (there is no built-in in-process driver yet). A structured error,
|
|
215
211
|
never a desktop attempt.
|
|
216
|
-
- `
|
|
217
|
-
and no local desktop. `
|
|
218
|
-
call or an in-process executor on the same
|
|
219
|
-
- `
|
|
220
|
-
`
|
|
212
|
+
- `HUMANISH_COMPUTER_USE_LOCAL_DESKTOP_MISSING`: an `app-url` study with `execution.target: local`
|
|
213
|
+
and no local desktop. `runStudy` gives a local browser study its desktop; a direct route
|
|
214
|
+
call or an in-process executor on the same study has none.
|
|
215
|
+
- `HUMANISH_COMPUTER_USE_EXECUTOR_NO_PROVIDER`: the route's internal executor hook without its
|
|
216
|
+
provider hook. A package caller gets `HUMANISH_STUDY_OPTION_UNSUPPORTED` above instead.
|
|
221
217
|
|
|
222
|
-
Key gating is route-aware: the in-process route uses the caller's
|
|
218
|
+
Key gating is route-aware: the in-process route uses the caller's own model and
|
|
223
219
|
executor, so no `OPENAI_API_KEY`/`E2B_API_KEY` is required.
|
|
224
220
|
|
|
225
221
|
## A note on `appState` typing
|
|
226
222
|
|
|
227
|
-
`
|
|
223
|
+
`ComputerUseObservation.appState` is `Record<string, unknown> | undefined` under the
|
|
228
224
|
repo's strict flags (`exactOptionalPropertyTypes`, `noUncheckedIndexedAccess`).
|
|
229
|
-
A value typed as an `interface` does
|
|
225
|
+
A value typed as an `interface` does not satisfy `Record<string, unknown>`
|
|
230
226
|
(interfaces have no implicit index signature), and a direct `as Record<...>` cast
|
|
231
227
|
on an interface-typed value is rejected. Use one of:
|
|
232
228
|
|
|
@@ -237,15 +233,15 @@ on an interface-typed value is rejected. Use one of:
|
|
|
237
233
|
Read every optional field defensively, and spread-omit optional fields
|
|
238
234
|
(`...(x === undefined ? {} : { x })`) rather than assigning `undefined`.
|
|
239
235
|
|
|
240
|
-
##
|
|
236
|
+
## Not built
|
|
241
237
|
|
|
242
|
-
- **
|
|
238
|
+
- **A config-only deterministic `state-contract` route.** A registered,
|
|
243
239
|
model-free route driving a built-in `window.app.*` bridge over the existing
|
|
244
|
-
`ScriptedPageLike.evaluate` primitive + a YAML step program, `
|
|
245
|
-
|
|
240
|
+
`ScriptedPageLike.evaluate` primitive + a YAML step program, `mode: live`
|
|
241
|
+
gating actuation. It would be deterministic step replay, not
|
|
246
242
|
`runComputerUseLoop`, and must not overclaim friction-loop reuse.
|
|
247
|
-
- **
|
|
248
|
-
loaded and run in-process with full harness privileges is a genuinely
|
|
243
|
+
- **A `subject.contract.ref` JS-module loader.** A config-referenced module
|
|
244
|
+
loaded and run in-process with full harness privileges is a genuinely new trust
|
|
249
245
|
surface with no precedent in this repo (the scripted route loads only declarative
|
|
250
246
|
YAML; serve commands run isolated inside the disposable E2B sandbox). It earns
|
|
251
247
|
its place only behind its own clamping / trust / digest-pinning design.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Task protocol support
|
|
2
2
|
|
|
3
|
-
`
|
|
3
|
+
`actor.tasks` adds a participant protocol to the mission. Goals reach the
|
|
4
4
|
participant; hidden success criteria go only to the observation tracker. A route
|
|
5
5
|
that cannot carry both halves refuses the declaration before execution. Removing
|
|
6
6
|
`tasks` is an explicit choice to run a mission-only study, not an automatic fallback.
|
|
@@ -14,7 +14,7 @@ that cannot carry both halves refuses the declaration before execution. Removing
|
|
|
14
14
|
| Shared-world, provisioned or external-public | Rejected | Actor specs omit the protocol before CUA session dispatch |
|
|
15
15
|
| Terminal-product | Rejected | Terminal prompt and result contract do not implement tasks |
|
|
16
16
|
| Scripted-browser, local or provisioned | Rejected | Scenario steps drive the participant; no task protocol is consumed |
|
|
17
|
-
| Synthetic (`this-repo`) | Rejected |
|
|
17
|
+
| Synthetic (`this-repo`) | Rejected | Study dispatch does not pass task declarations to the dry-run engine |
|
|
18
18
|
| Any second or later `actors[]` entry | Rejected | Current runners consume only the first actor; declare every participant under the first actor |
|
|
19
19
|
|
|
20
20
|
Both registered CUA actors (`openai-computer-use` and `local-agent`) share the CUA
|
|
@@ -22,14 +22,12 @@ session loop. Their task support does not depend on which provider chooses actio
|
|
|
22
22
|
Custom session hooks remain caller-owned implementations of that same contract;
|
|
23
23
|
this preflight does not certify arbitrary hook behavior.
|
|
24
24
|
|
|
25
|
-
The parser reports `
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
The parser reports `HUMANISH_STUDY_INVALID` with the unsupported field path. `runStudy`
|
|
26
|
+
reports `HUMANISH_STUDY_TASKS_UNSUPPORTED` in the route's failure envelope, from
|
|
27
|
+
`planLab` (`src/lab/plan.ts`) and each route's plan.
|
|
28
28
|
Refusal precedes run storage, source preparation, user hooks, local processes,
|
|
29
|
-
sandbox allocation, and model calls. No task content appears in the error.
|
|
30
|
-
deprecated synthetic API, `runDryRun`, accepts no lab config or tasks. Its lab
|
|
31
|
-
declaration boundary is `runLab`.
|
|
29
|
+
sandbox allocation, and model calls. No task content appears in the error.
|
|
32
30
|
|
|
33
31
|
A future route gains support only after proving participant goals, hidden criteria,
|
|
34
|
-
observation-backed completion,
|
|
32
|
+
observation-backed completion, explicit missing-input handling, and per-participant
|
|
35
33
|
bundle evidence together. Appending goals to a prompt alone is insufficient.
|
|
@@ -1,20 +1,14 @@
|
|
|
1
|
-
# Terminal-product
|
|
1
|
+
# Terminal-product route
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
the kept 2026-07-09 live receipt verifies 15/15 checks and `share_ready` at a
|
|
9
|
-
`$0` cap. That capability receipt is not adopter replacement: no deletion
|
|
10
|
-
branch has yet removed the reference adopter's bespoke generic study harness.
|
|
11
|
-
See the goal packet
|
|
12
|
-
([`docs/goals/terminal-product-lane/goal.md`](https://github.com/danielgwilson/humanish/blob/main/docs/goals/terminal-product-lane/goal.md))
|
|
13
|
-
for the full slice plan and the safety contract.
|
|
3
|
+
The live terminal-product route has shipped since `0.8.0`, with the in-sandbox runtime,
|
|
4
|
+
command-scoped credential placement, exact-id cleanup proof, an interventions ledger, a cost and
|
|
5
|
+
no-spend ledger, caps, and product scoring and feedback hooks. The
|
|
6
|
+
[original plan](https://github.com/danielgwilson/humanish/blob/main/docs/history/goals/terminal-product-lane/goal.md)
|
|
7
|
+
holds the build order and the safety contract.
|
|
14
8
|
|
|
15
9
|
## What this is
|
|
16
10
|
|
|
17
|
-
A
|
|
11
|
+
A study route for **terminal-product real-agent studies**: a real autonomous coding
|
|
18
12
|
agent (Codex) discovering and using a CLI/product from its **public surfaces
|
|
19
13
|
only**, running **inside an E2B shell** with declared runtime-auth placement and
|
|
20
14
|
spend/time caps, emitting durable terminal/substrate/cost/no-spend/cleanup/
|
|
@@ -23,38 +17,39 @@ routes. It tests whether an autonomous agent can discover and use a CLI/product
|
|
|
23
17
|
surface from public materials. It does not test whether a browser can click a
|
|
24
18
|
local web app.
|
|
25
19
|
|
|
26
|
-
It
|
|
27
|
-
|
|
28
|
-
|
|
20
|
+
It follows the pattern the scripted-browser and local-app routes added: a new
|
|
21
|
+
`subject.source` × `execution.target` pairing, a `terminal` case in `routeOf(config)`
|
|
22
|
+
and its dispatch, a registered actor that declares the run kind in its capabilities,
|
|
29
23
|
fail-closed cross-validation, and forward-declared warnings.
|
|
30
24
|
|
|
31
25
|
## The composition
|
|
32
26
|
|
|
33
|
-
| Axis
|
|
34
|
-
|
|
|
35
|
-
| `subject.source`
|
|
36
|
-
| `subject.product`
|
|
37
|
-
| `execution.target`
|
|
38
|
-
| `execution.terminal`
|
|
39
|
-
| `execution.runtimeAuth`
|
|
40
|
-
| `execution.runtime.version`
|
|
41
|
-
| `
|
|
42
|
-
| `
|
|
43
|
-
| `policies`
|
|
44
|
-
| `
|
|
45
|
-
|
|
|
27
|
+
| Axis | Value |
|
|
28
|
+
| --------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
29
|
+
| `subject.source` | `terminal-product` |
|
|
30
|
+
| `subject.product` | `{ name, publicSurfaces[], install?, workdir?, upload? }`: the only world the agent sees |
|
|
31
|
+
| `execution.target` | `e2b-terminal` (or absent → implied) |
|
|
32
|
+
| `execution.terminal` | `{ transport: exec-stream, stdin: disabled }` |
|
|
33
|
+
| `execution.runtimeAuth` | `openai-env` (default) or opt-in `openai-egress`; names-only durable evidence |
|
|
34
|
+
| `execution.runtime.version` | Optional exact `@openai/codex` version; observed before keyed execution |
|
|
35
|
+
| `actor.model` / `reasoningEffort` | Passed to Codex as `--model` (default `gpt-5.6-sol`) and `-c model_reasoning_effort`; declarations, not observed provider identity |
|
|
36
|
+
| `caps` | `{ maxUsd, maxJobs, maxMinutes }`: the blast-radius budget; `maxUsd > 0` is refused unless a `costProbe` measures spend |
|
|
37
|
+
| `policies` | `allowPrivateRepoAccess` / `allowProviderCredentials` / `allowPaymentCredentials` / `allowGitHubMutation`, all default false |
|
|
38
|
+
| `actor.type` | `codex-exec`: a registered terminal actor (`keyPlacement: in-sandbox-command-scoped`) |
|
|
39
|
+
| route | `terminal` → `runTerminalProductLab` ([`src/routes/terminal/route.ts`](https://github.com/danielgwilson/humanish/blob/main/src/routes/terminal/route.ts)) |
|
|
46
40
|
|
|
47
41
|
Routing is `routeOf` (`src/lab/plan.ts`). It sends every `terminal-product` subject to
|
|
48
42
|
this route, even with an unregistered actor, so this route refuses the actor.
|
|
49
|
-
`
|
|
43
|
+
`isTerminalProductComposition(config)` (`src/lab/routing.ts`) also feeds the forward-declared
|
|
44
|
+
warnings.
|
|
50
45
|
|
|
51
46
|
## Repeating a terminal study with the same runtime
|
|
52
47
|
|
|
53
48
|
```yaml
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
49
|
+
actor:
|
|
50
|
+
type: codex-exec
|
|
51
|
+
model: gpt-5.6-sol
|
|
52
|
+
reasoningEffort: low
|
|
58
53
|
execution:
|
|
59
54
|
target: e2b-terminal
|
|
60
55
|
runtime:
|
|
@@ -70,16 +65,24 @@ and reclaims its owned sandbox. When the version is omitted, the probe resolves
|
|
|
70
65
|
|
|
71
66
|
`actor.json`, the bundle's terminal actor, and `terminal-ledgers.json` retain
|
|
72
67
|
`humanish.actor-runtime.v1`: requested and observed versions, verification status,
|
|
73
|
-
declared
|
|
74
|
-
also appears as `providerVersion`.
|
|
75
|
-
|
|
68
|
+
the requested model and where it came from, declared effort, and the usage granularity.
|
|
69
|
+
The observed executable version also appears as `providerVersion`.
|
|
70
|
+
|
|
71
|
+
Codex's `--json` stream does not name the model it used, and its built-in default can change
|
|
72
|
+
with any release. So the route always passes `--model`: the study's `actor.model`
|
|
73
|
+
(`modelStatus: declared`), or humanish's participant default `gpt-5.6-sol`
|
|
74
|
+
(`modelStatus: humanish_default`). Bundles written before 0.107.0 record
|
|
75
|
+
`runtime_default_unobserved` with no requested model.
|
|
76
76
|
Dry runs record declarations only, in a `terminal-lab.runtime.declared` event.
|
|
77
77
|
|
|
78
78
|
These settings make a study's request reproducible, but do not attest the actual
|
|
79
|
-
provider model or add a provider spending limit.
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
79
|
+
provider model or add a provider spending limit. humanish prices the agent's tokens from the
|
|
80
|
+
requested model. Codex `turn.completed` usage sums every request in a turn, so no request's own
|
|
81
|
+
size is known and no per-request long-context tier can be applied. The estimate prices every token
|
|
82
|
+
at the base tier, with cached input at the cached rate, and says so with
|
|
83
|
+
`basis: aggregated_turns_base_rate`. It is an estimate, not a measurement. The cost ledger
|
|
84
|
+
checked against `caps.maxUsd` keeps the provider line unmeasured, and the studied
|
|
85
|
+
product's no-spend boundary still needs separate interpretation.
|
|
83
86
|
|
|
84
87
|
## Runtime auth: raw-key placement and remaining provider access
|
|
85
88
|
|
|
@@ -122,11 +125,11 @@ make authenticated requests to that host from sandbox creation until teardown,
|
|
|
122
125
|
including bootstrap/setup commands and commands launched outside Codex. Calls
|
|
123
126
|
made outside Codex may be absent from its usage ledger. This mode does not impose
|
|
124
127
|
a provider-side spending limit, restrict models/API paths, or make
|
|
125
|
-
`
|
|
128
|
+
`caps.maxUsd` a preventive provider budget. A hard provider budget needs
|
|
126
129
|
a separately enforced control; do not infer zero spend from an unmeasured ledger
|
|
127
130
|
line.
|
|
128
131
|
|
|
129
|
-
Public internet discovery stays unrestricted unless the
|
|
132
|
+
Public internet discovery stays unrestricted unless the study already declares
|
|
130
133
|
`execution.egressAllow`. The mode preserves that allowlist and its deny-all
|
|
131
134
|
fallback without adding hosts. If an allowlist omits `api.openai.com`, provider
|
|
132
135
|
requests can fail. E2B domain allowlists are routing controls rather than strict
|
|
@@ -146,7 +149,7 @@ and [E2B's CA installer](https://github.com/e2b-dev/infra/blob/main/packages/env
|
|
|
146
149
|
E2B's installed
|
|
147
150
|
SDK documents that transformed headers override request headers. Deterministic
|
|
148
151
|
request/redaction tests do not establish live wire behavior. The [2026-09-05
|
|
149
|
-
transport receipt](https://github.com/danielgwilson/humanish/blob/main/docs/
|
|
152
|
+
transport receipt](https://github.com/danielgwilson/humanish/blob/main/docs/evidence/terminal-product/2026-09-05-runtime-egress-auth.md)
|
|
150
153
|
records the controlled live header/auth checks and their scope.
|
|
151
154
|
|
|
152
155
|
## Runtime prerequisite
|
|
@@ -171,7 +174,7 @@ checks Node/npm in both ordinary and sudo shells after installation. The existin
|
|
|
171
174
|
runtime fast path preserves user-specific installations; a later sudo product
|
|
172
175
|
install can still fail if that installation is absent from sudo's PATH.
|
|
173
176
|
|
|
174
|
-
The [global executable receipt](https://github.com/danielgwilson/humanish/blob/main/docs/
|
|
177
|
+
The [global executable receipt](https://github.com/danielgwilson/humanish/blob/main/docs/evidence/terminal-product/2026-09-05-global-npm-prefix.md)
|
|
175
178
|
records the regression found after the initial runtime-only proof and its stock
|
|
176
179
|
desktop checks. npm documents [global executable locations](https://docs.npmjs.com/cli/v10/configuring-npm/folders#executables)
|
|
177
180
|
and the [distribution built-in configuration](https://docs.npmjs.com/cli/v10/configuring-npm/npmrc#built-in-config-file).
|
|
@@ -203,100 +206,65 @@ blast radius is bounded by key scoping and budgets, not by hoping._
|
|
|
203
206
|
|
|
204
207
|
The inversion is declared as registry metadata, not a code convention: the
|
|
205
208
|
terminal actor's capabilities carry `keyPlacement: "in-sandbox-command-scoped"`.
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
plaintext);
|
|
223
|
-
- the caps / deny-by-default policies / runtime-auth channel recorded as
|
|
224
|
-
declarations (names only; invariant 1);
|
|
225
|
-
- a terminal-kind stream that is an honest **contract placeholder**: stdin
|
|
226
|
-
disabled, empty tail, `transport: snapshot`, **not** `pty` (captured
|
|
227
|
-
non-interactive exec output is never an interactive PTY; invariant 6 + the
|
|
228
|
-
goal packet's PTY ruling). SLICE 2 later added redacted exec-stream capture;
|
|
229
|
-
- empty/placeholder ledgers (substrate lifecycle, command log, terminal event
|
|
230
|
-
stream, interventions, cost) that SLICE 2/3 later filled.
|
|
231
|
-
|
|
232
|
-
The dry-run bundle passed the existing `verifyRun`. Terminal-specific verifier
|
|
233
|
-
checks (terminal/transcript presence, lifecycle, cleanup, interventions,
|
|
234
|
-
metadata allowlist, no-credential-in-artifacts, no-spend) landed in SLICE 2/3.
|
|
235
|
-
|
|
236
|
-
At SLICE 1, a non-dry-run call returned a structured
|
|
237
|
-
`HUMANISH_TERMINAL_AGENT_NOT_IMPLEMENTED` failure before launch or spend.
|
|
238
|
-
SLICE 2 implemented the real session.
|
|
239
|
-
|
|
240
|
-
SLICE 1 declared the DI seams SLICE 2 needed (`loadModule`, `buildSandbox`,
|
|
241
|
-
`runtimeAuthEnv`, `detachedTimers`) on `TerminalProductLabHooks`; only the dry-run
|
|
242
|
-
path was implemented in that slice. The hook bag now carries `loadModule`, `env`,
|
|
243
|
-
`renderObserverFn`, `now`, `costProbe`, `score` and `deriveFeedback`
|
|
244
|
-
(`src/routes/terminal/types.ts`), and `TerminalProductLabHooks` itself is deprecated
|
|
245
|
-
in favor of `RunLabOptions`.
|
|
246
|
-
|
|
247
|
-
## SLICE 4: the product-adapter extension seam (layer 6)
|
|
248
|
-
|
|
249
|
-
This route is proof-roadmap **layer 6**: an adopter attaches product-specific
|
|
250
|
-
scoring + feedback as a THIN in-repo extension WITHOUT forking core. SLICE 4
|
|
251
|
-
ships the SEAM. Core ships no built-in product scorer; the adopter's scorecard
|
|
252
|
-
lives in the adopter's repo:
|
|
209
|
+
The route keys off that capability and injects the key only into the per-command
|
|
210
|
+
`envs` of the `codex` invocation, never `Sandbox.create({envs})`. The route also
|
|
211
|
+
has a deny-by-default credential allowlist, positive-allowlist sandbox metadata,
|
|
212
|
+
the cleanup proof, the interventions ledger and a minimal fail-closed cap.
|
|
213
|
+
|
|
214
|
+
## Test seams
|
|
215
|
+
|
|
216
|
+
The route reads `env` and `scorer` from its options (`src/routes/terminal/types.ts`), and a test
|
|
217
|
+
passes its seams (`desktopModule`, `renderObserver`, `now`, `costProbe`) as `LabDeps`
|
|
218
|
+
(`src/lab/lab-deps.ts`).
|
|
219
|
+
|
|
220
|
+
## The product-adapter extension seam
|
|
221
|
+
|
|
222
|
+
An adopter attaches product-specific scoring and feedback as a thin in-repo extension, without
|
|
223
|
+
forking core. Core ships the seam and no built-in product scorer; the adopter's scorecard lives in
|
|
224
|
+
the adopter's repo:
|
|
253
225
|
|
|
254
226
|
- **Exported contract types** a thin adapter types against from the package barrel
|
|
255
227
|
(`humanish`) alone, never through a deep `src/` import: `RunBundle`,
|
|
256
228
|
`RunFeedbackCandidate`, `RunAdapterScore`, `RunAdapterArtifact`, `ActorTrace`,
|
|
257
229
|
`AdapterScorerModule` and `TerminalProductScoringContext`. The ledger, cost and
|
|
258
230
|
no-spend shapes are reached through that context's fields, as
|
|
259
|
-
`TerminalProductScoringContext["ledgers"]`.
|
|
260
|
-
|
|
261
|
-
the gap issue #154 acceptance #8 names.
|
|
262
|
-
- **A registrable scorer / feedback module**, `RunLabOptions.scorer` (an
|
|
231
|
+
`TerminalProductScoringContext["ledgers"]`.
|
|
232
|
+
- **A registrable scorer / feedback module**, `RunStudyOptions.scorer` (an
|
|
263
233
|
`AdapterScorerModule`): `score?(ctx) => RunAdapterScore | Promise<…>` and
|
|
264
234
|
`deriveFeedback?(ctx) => RunFeedbackCandidate[] | Promise<…>`, where this route's
|
|
265
235
|
`ctx` is a `TerminalProductScoringContext`. The older `terminalHooks.score` and
|
|
266
|
-
`terminalHooks.deriveFeedback`
|
|
267
|
-
hooks over the
|
|
268
|
-
(`bundle.adapterScore`, appended `bundle.feedbackCandidates`)
|
|
236
|
+
`terminalHooks.deriveFeedback` were removed with the bag. The route calls the
|
|
237
|
+
hooks over the fully-assembled, redacted evidence and attaches the results
|
|
238
|
+
(`bundle.adapterScore`, appended `bundle.feedbackCandidates`) without core knowing
|
|
269
239
|
any product noun. Default (no hook) behavior is unchanged: the mission-based verdict
|
|
270
240
|
stands alone.
|
|
271
241
|
- **Adapter-namespaced product nouns.** Product-specific concepts (public
|
|
272
242
|
CLI/product command observed, hosted product success-or-blocker, feedback
|
|
273
243
|
id/draft, media/job/asset ids, no-media/no-provider-spend proof,
|
|
274
|
-
defection/friction risk) ride
|
|
244
|
+
defection/friction risk) ride only under a single namespaced field
|
|
275
245
|
(`RunFeedbackCandidate.adapter: { namespace, data }` and
|
|
276
246
|
`RunAdapterScore.{namespace, data}`) so core's enums stay product-agnostic and
|
|
277
247
|
a future inert-field audit never misfires. No adopter noun is hardcoded into a
|
|
278
248
|
core enum (avoiding closed-taxonomy rot); `e2b-terminal` is added to the
|
|
279
|
-
substrate enum so a terminal-agent candidate names
|
|
249
|
+
substrate enum so a terminal-agent candidate names the substrate it ran on.
|
|
280
250
|
|
|
281
|
-
The seam is fail-closed: the route scrubs+redacts the returned payloads and
|
|
251
|
+
The seam is fail-closed: the route scrubs+redacts the returned payloads and drops
|
|
282
252
|
any malformed score/candidate with a warning, and `verifyRun` re-checks the
|
|
283
253
|
surviving shapes, so a bad extension never poisons a verifiable bundle. Proven by
|
|
284
254
|
`tests/routes/terminal/product-adapter-seam.test.ts` (a thin in-repo example adapter
|
|
285
255
|
typing against the barrel only, registering a scorer, attaching namespaced nouns,
|
|
286
|
-
emitting a candidate; the bundle verifies).
|
|
287
|
-
|
|
288
|
-
note.
|
|
256
|
+
emitting a candidate; the bundle verifies). That test is a contract proof; the
|
|
257
|
+
live end-to-end route receipt is linked from the status note.
|
|
289
258
|
|
|
290
|
-
The adopter's real scorecard is its
|
|
291
|
-
live receipt is kept under the terminal-product goal
|
|
292
|
-
|
|
259
|
+
The adopter's real scorecard is its own thin extension. The end-to-end route's
|
|
260
|
+
live receipt is kept under the terminal-product goal. Duplex PTY replay is not
|
|
261
|
+
built.
|
|
293
262
|
|
|
294
263
|
## The reference adopter (codename-neutral)
|
|
295
264
|
|
|
296
|
-
The requesting adopter is a public creative-CLI product
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
(
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
issue, never in scanned committed text.
|
|
265
|
+
The requesting adopter is a public creative-CLI product. Committed source and docs here
|
|
266
|
+
stay codename-neutral per the public-surface scan; the committed CI fixture
|
|
267
|
+
([`humanish/studies/terminal-product-demo.yaml`](https://github.com/danielgwilson/humanish/blob/main/humanish/studies/terminal-product-demo.yaml))
|
|
268
|
+
uses a fictional mock CLI (`widgetsmith-cli`) with `example.com` surfaces. The adopter's
|
|
269
|
+
real public surfaces appear only in operator-run docs and a GitHub issue, never in
|
|
270
|
+
scanned committed text.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Contracts
|
|
2
|
+
|
|
3
|
+
Each page describes a shape that code outside humanish can depend on. A documented field is API;
|
|
4
|
+
the types, parsers and validators in `src/` are the source of truth when a page and the code
|
|
5
|
+
disagree.
|
|
6
|
+
|
|
7
|
+
- [schemas.md](schemas.md): every `humanish.*` schema id, the study manifest, the library options
|
|
8
|
+
(`RunStudyOptions`) and the exports removed in 0.107.0.
|
|
9
|
+
- [core.md](core.md): the records a run writes under `.humanish/runs/<id>/` and how each route
|
|
10
|
+
starts a run.
|
|
11
|
+
- [run-bundle.md](run-bundle.md): `humanish.run-bundle.v1`, the evidence contract that `verify`
|
|
12
|
+
checks.
|
|
13
|
+
- [policy.md](policy.md): credential, network, spend, redaction, sharing and assisted-run
|
|
14
|
+
boundaries.
|
|
15
|
+
- [feedback.md](feedback.md): feedback candidates, drafts and issue URLs, which never mutate
|
|
16
|
+
GitHub.
|
|
17
|
+
- [study-analysis.md](study-analysis.md): post-run analysis of retained participant evidence.
|
|
18
|
+
- [study-costs.md](study-costs.md): what `humanish stats` counts as spend.
|
|
19
|
+
- [errors.md](errors.md): the error code families, where each code appears, and the human
|
|
20
|
+
error shape on stderr.
|
|
21
|
+
- [adapter-admission.md](adapter-admission.md): the admission limit a custom provider can raise
|
|
22
|
+
before a request is sent.
|
|
23
|
+
- [adapter-fixtures.md](adapter-fixtures.md): the committed adapter fixtures and the parity checks
|
|
24
|
+
over them.
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
# Adapter admission limits
|
|
2
2
|
|
|
3
|
-
Library callers can throw `
|
|
3
|
+
Library callers can throw `ComputerUseAdmissionLimitError` from a custom `ComputerUseProvider`
|
|
4
4
|
or the `fetchFn` supplied to `createOpenAiResponsesProvider` when a configured
|
|
5
5
|
local control limit refuses a request **before provider dispatch**:
|
|
6
6
|
|
|
7
7
|
```ts
|
|
8
|
-
import {
|
|
8
|
+
import { ComputerUseAdmissionLimitError, createOpenAiResponsesProvider } from "humanish";
|
|
9
9
|
|
|
10
10
|
const provider = createOpenAiResponsesProvider({
|
|
11
11
|
apiKey,
|
|
12
12
|
fetchFn: async (url, init) => {
|
|
13
13
|
if (localLimitReached()) {
|
|
14
14
|
await recordLocalAdmissionRefusal();
|
|
15
|
-
throw new
|
|
15
|
+
throw new ComputerUseAdmissionLimitError();
|
|
16
16
|
}
|
|
17
17
|
return transport(url, init);
|
|
18
18
|
},
|