humanish 0.107.0 → 0.109.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 +73 -69
- package/CHANGELOG.md +27 -0
- package/CONTEXT.md +51 -44
- package/README.md +148 -175
- 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-trace.js +2 -1
- package/dist/actors/codex/app-server-ui.js +1 -1
- package/dist/actors/codex/codex-admission.d.ts +91 -0
- package/dist/actors/codex/codex-admission.js +150 -0
- package/dist/actors/codex/restricted-executable.d.ts +4 -4
- package/dist/actors/codex/restricted-executable.js +8 -8
- package/dist/actors/codex/restricted-launch.d.ts +2 -1
- package/dist/actors/codex/restricted-launch.js +1 -1
- package/dist/actors/codex/restricted-participant.js +20 -18
- package/dist/actors/codex/restricted-policy.d.ts +2 -2
- package/dist/actors/codex/restricted-policy.js +2 -2
- package/dist/actors/codex/restricted-session.d.ts +3 -3
- package/dist/actors/codex/restricted-session.js +10 -5
- package/dist/actors/computer-use/actor.d.ts +18 -18
- package/dist/actors/computer-use/actor.js +4 -4
- package/dist/actors/computer-use/admission-limit.d.ts +3 -3
- package/dist/actors/computer-use/admission-limit.js +4 -4
- package/dist/actors/computer-use/executor-error.d.ts +2 -2
- package/dist/actors/computer-use/executor-error.js +3 -3
- package/dist/actors/computer-use/loop/actions.d.ts +3 -3
- package/dist/actors/computer-use/loop/actions.js +15 -15
- package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
- package/dist/actors/computer-use/loop/backstop.js +14 -12
- package/dist/actors/computer-use/loop/debrief.js +2 -2
- package/dist/actors/computer-use/loop/ending.d.ts +6 -6
- package/dist/actors/computer-use/loop/ending.js +18 -17
- package/dist/actors/computer-use/loop/observation.d.ts +2 -2
- package/dist/actors/computer-use/loop/observation.js +15 -14
- package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
- package/dist/actors/computer-use/loop/provider-call.js +12 -12
- package/dist/actors/computer-use/loop/session.d.ts +4 -4
- package/dist/actors/computer-use/loop/session.js +4 -4
- package/dist/actors/computer-use/loop/spend.d.ts +1 -1
- package/dist/actors/computer-use/loop/spend.js +1 -1
- package/dist/actors/computer-use/loop/trace.js +11 -9
- package/dist/actors/computer-use/loop/types.d.ts +47 -45
- package/dist/actors/computer-use/loop/usage.d.ts +2 -2
- package/dist/actors/computer-use/loop/usage.js +2 -2
- package/dist/actors/computer-use/loop.d.ts +6 -1
- package/dist/actors/computer-use/loop.js +26 -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 +13 -10
- package/dist/actors/computer-use/openai-provider.js +52 -41
- 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/computer-use/provider-error.d.ts +4 -4
- package/dist/actors/computer-use/provider-error.js +6 -6
- package/dist/actors/contract.d.ts +82 -47
- package/dist/actors/contract.js +30 -24
- package/dist/actors/local-agent/claude-session.d.ts +1 -1
- package/dist/actors/local-agent/claude-session.js +13 -12
- package/dist/actors/local-agent/cli.d.ts +9 -7
- 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 +8 -8
- package/dist/actors/registry.d.ts +12 -12
- package/dist/actors/registry.js +21 -20
- package/dist/actors/scripted-browser/actor.d.ts +10 -10
- package/dist/actors/scripted-browser/actor.js +17 -17
- package/dist/actors/scripted-browser/browser-command.js +1 -1
- package/dist/actors/scripted-browser/steps.js +1 -1
- package/dist/actors/scripted-browser/types.d.ts +1 -1
- package/dist/actors/stop-conditions.d.ts +1 -1
- package/dist/analysis/automatic-completion.d.ts +7 -7
- package/dist/analysis/automatic-completion.js +1 -1
- package/dist/analysis/automatic-config.d.ts +6 -6
- package/dist/analysis/automatic-config.js +1 -1
- package/dist/analysis/codex-config.d.ts +6 -2
- package/dist/analysis/codex-config.js +22 -14
- package/dist/analysis/execute.d.ts +1 -1
- package/dist/analysis/execute.js +1 -1
- package/dist/analysis/service.js +5 -5
- package/dist/analysis/types.d.ts +6 -0
- package/dist/browser-control/client.js +16 -16
- package/dist/browser-control/dispatcher.js +4 -4
- package/dist/browser-control/protocol.js +14 -14
- package/dist/browser-control/recording-transfer.js +4 -4
- package/dist/browser-control/transport.js +7 -7
- package/dist/cli/commands/analysis-signals.d.ts +2 -2
- package/dist/cli/commands/analyze.js +19 -16
- package/dist/cli/commands/codex.js +9 -9
- package/dist/cli/commands/comms.js +48 -35
- package/dist/cli/commands/feedback.js +20 -21
- package/dist/cli/commands/migrate.d.ts +4 -0
- package/dist/cli/commands/migrate.js +65 -0
- package/dist/cli/commands/observe.d.ts +0 -1
- package/dist/cli/commands/observe.js +136 -112
- package/dist/cli/commands/run-command.d.ts +10 -0
- package/dist/cli/commands/run-command.js +85 -0
- package/dist/cli/commands/runs.js +136 -139
- package/dist/cli/commands/setup.d.ts +2 -2
- package/dist/cli/commands/setup.js +27 -24
- package/dist/cli/commands/study-format.d.ts +9 -0
- package/dist/cli/commands/{lab-format.js → study-format.js} +39 -27
- package/dist/cli/commands/{lab-route-computer-use.d.ts → study-route-computer-use.d.ts} +6 -6
- package/dist/cli/commands/{lab-route-computer-use.js → study-route-computer-use.js} +17 -18
- package/dist/cli/commands/{lab-route-open.d.ts → study-route-open.d.ts} +4 -4
- package/dist/cli/commands/{lab-route-open.js → study-route-open.js} +2 -2
- package/dist/cli/commands/{lab-route-preview.d.ts → study-route-preview.d.ts} +7 -7
- package/dist/cli/commands/{lab-route-preview.js → study-route-preview.js} +7 -6
- package/dist/cli/commands/study-route-run.d.ts +19 -0
- package/dist/cli/commands/{lab-route-run.js → study-route-run.js} +6 -6
- package/dist/cli/commands/study-route-scripted.d.ts +17 -0
- package/dist/cli/commands/{lab-route-scripted.js → study-route-scripted.js} +4 -4
- package/dist/cli/commands/{lab-route-shared-world.d.ts → study-route-shared-world.d.ts} +5 -5
- package/dist/cli/commands/{lab-route-shared-world.js → study-route-shared-world.js} +10 -10
- package/dist/cli/commands/study-route-terminal.d.ts +17 -0
- package/dist/cli/commands/{lab-route-terminal.js → study-route-terminal.js} +4 -4
- package/dist/cli/commands/study-run.d.ts +9 -0
- package/dist/cli/commands/{lab-run.js → study-run.js} +44 -45
- package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +7 -7
- package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +2 -2
- package/dist/cli/commands/study.d.ts +3 -0
- package/dist/cli/commands/study.js +146 -0
- package/dist/cli/commands/tui.d.ts +4 -4
- package/dist/cli/commands/tui.js +31 -31
- package/dist/cli/commands/watch.js +71 -121
- package/dist/cli/deprecations.d.ts +6 -0
- package/dist/cli/deprecations.js +18 -0
- package/dist/cli/doctor.d.ts +18 -8
- package/dist/cli/doctor.js +114 -59
- package/dist/cli/first-run-path.d.ts +15 -13
- package/dist/cli/first-run-path.js +35 -33
- package/dist/cli/io.d.ts +44 -9
- package/dist/cli/io.js +98 -23
- package/dist/cli/observer-follow.d.ts +3 -3
- package/dist/cli/observer-follow.js +6 -7
- package/dist/cli/orientation.d.ts +10 -7
- package/dist/cli/orientation.js +89 -47
- 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 +111 -43
- package/dist/cli/telemetry.d.ts +16 -16
- package/dist/cli/telemetry.js +46 -44
- package/dist/cli.js +1 -1
- package/dist/comms/capture-surface.d.ts +13 -12
- package/dist/comms/capture-surface.js +23 -22
- package/dist/comms/catch-host.d.ts +7 -7
- package/dist/comms/catch-host.js +17 -17
- package/dist/comms/connections.d.ts +1 -1
- package/dist/comms/connections.js +2 -2
- package/dist/comms/email-catch.d.ts +3 -3
- package/dist/comms/email-catch.js +8 -8
- package/dist/comms/external-evidence.d.ts +5 -5
- package/dist/comms/external-evidence.js +5 -4
- package/dist/comms/extract.js +2 -2
- package/dist/comms/fake-inbox.d.ts +3 -3
- package/dist/comms/fake-inbox.js +3 -3
- package/dist/comms/receiving-render.d.ts +1 -1
- package/dist/comms/receiving-render.js +2 -2
- package/dist/comms/receiving-runtime.d.ts +4 -4
- 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 +38 -39
- package/dist/comms/sandbox-catch.js +36 -37
- package/dist/comms/setup.d.ts +2 -2
- package/dist/comms/setup.js +56 -25
- 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 +3 -3
- 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 +4 -4
- package/dist/feedback/draft.js +38 -80
- package/dist/feedback/export-bundle.js +1 -1
- package/dist/feedback/export.d.ts +5 -1
- package/dist/feedback/export.js +10 -10
- package/dist/feedback/feedback.d.ts +2 -2
- package/dist/feedback/feedback.js +21 -3
- package/dist/feedback/proof.d.ts +1 -1
- package/dist/feedback/proof.js +2 -2
- package/dist/guest/bootstrap.js +6 -6
- package/dist/guest/browser-tools.js +8 -8
- package/dist/guest/chromium-text.js +19 -19
- package/dist/guest/desktop-executor.d.ts +2 -2
- package/dist/guest/desktop-executor.js +20 -20
- package/dist/guest/desktop-keys.js +4 -4
- package/dist/guest/desktop-media.d.ts +2 -2
- package/dist/guest/desktop-media.js +16 -16
- package/dist/guest/desktop-native.d.ts +1 -1
- package/dist/guest/desktop-native.js +10 -10
- package/dist/guest/runtime-desktop.js +2 -2
- package/dist/guest/runtime-processes.d.ts +2 -2
- package/dist/guest/runtime-processes.js +2 -2
- package/dist/guest/runtime.js +6 -6
- package/dist/index.d.ts +14 -14
- package/dist/index.js +8 -8
- package/dist/keys/key-resolution.d.ts +5 -5
- package/dist/keys/key-resolution.js +23 -23
- package/dist/observer/artifact.d.ts +2 -2
- package/dist/observer/artifact.js +7 -7
- package/dist/observer/data.d.ts +6 -6
- package/dist/observer/data.js +5 -4
- 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 +3 -1
- package/dist/observer/library.js +8 -3
- package/dist/observer/listen.js +5 -4
- package/dist/observer/render.d.ts +1 -1
- package/dist/observer/render.js +17 -6
- package/dist/observer/run-routes.d.ts +4 -3
- package/dist/observer/run-routes.js +38 -13
- package/dist/observer/serve.d.ts +1 -1
- package/dist/observer/serve.js +7 -3
- 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 +18 -17
- package/dist/routes/computer-use/bundle.d.ts +2 -2
- package/dist/routes/computer-use/bundle.js +10 -9
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +6 -6
- package/dist/routes/computer-use/e2b-desktop/comms.js +18 -17
- package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +5 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
- package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/prepare.js +10 -10
- package/dist/routes/computer-use/e2b-desktop/start.js +7 -7
- package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
- package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -2
- package/dist/routes/computer-use/external-comms.d.ts +4 -4
- package/dist/routes/computer-use/external-comms.js +1 -1
- package/dist/routes/computer-use/fanout-bundle.js +27 -26
- package/dist/routes/computer-use/fanout-records.js +12 -13
- package/dist/routes/computer-use/live-flush.d.ts +4 -4
- package/dist/routes/computer-use/live-flush.js +6 -6
- package/dist/routes/computer-use/live-phase.d.ts +5 -4
- package/dist/routes/computer-use/live-phase.js +8 -8
- package/dist/routes/computer-use/local-tree-pack.d.ts +5 -5
- package/dist/routes/computer-use/local-tree-pack.js +1 -1
- package/dist/routes/computer-use/local-vm.d.ts +8 -8
- package/dist/routes/computer-use/local-vm.js +3 -3
- package/dist/routes/computer-use/participant-desktop.d.ts +7 -7
- package/dist/routes/computer-use/participant-desktop.js +5 -5
- package/dist/routes/computer-use/participant-execution.d.ts +4 -4
- package/dist/routes/computer-use/participant-execution.js +10 -10
- package/dist/routes/computer-use/participant-model.d.ts +6 -0
- package/dist/routes/computer-use/participant-model.js +33 -15
- package/dist/routes/computer-use/participant-prompt.d.ts +15 -15
- package/dist/routes/computer-use/participant-prompt.js +9 -9
- package/dist/routes/computer-use/participant-runs.d.ts +16 -16
- package/dist/routes/computer-use/participant-runs.js +26 -25
- package/dist/routes/computer-use/plan.d.ts +12 -12
- package/dist/routes/computer-use/plan.js +42 -42
- package/dist/routes/computer-use/preflight.d.ts +5 -5
- package/dist/routes/computer-use/preflight.js +25 -25
- package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
- package/dist/routes/computer-use/rerun-selection.js +4 -3
- package/dist/routes/computer-use/result.d.ts +4 -4
- package/dist/routes/computer-use/result.js +22 -21
- package/dist/routes/computer-use/route.d.ts +12 -11
- package/dist/routes/computer-use/route.js +31 -30
- package/dist/routes/computer-use/self-report.d.ts +7 -7
- package/dist/routes/computer-use/self-report.js +32 -32
- package/dist/routes/computer-use/setup.d.ts +23 -23
- package/dist/routes/computer-use/setup.js +28 -29
- package/dist/routes/computer-use/single-bundle.d.ts +11 -11
- package/dist/routes/computer-use/single-bundle.js +40 -41
- package/dist/routes/computer-use/subject-projection.d.ts +4 -4
- package/dist/routes/computer-use/subject-projection.js +6 -6
- package/dist/routes/computer-use/types.d.ts +71 -73
- package/dist/routes/computer-use/types.js +12 -12
- package/dist/routes/preview.d.ts +13 -7
- package/dist/routes/preview.js +11 -7
- package/dist/routes/scripted/bundle.d.ts +7 -7
- package/dist/routes/scripted/bundle.js +20 -18
- package/dist/routes/scripted/plan.d.ts +8 -8
- package/dist/routes/scripted/plan.js +13 -13
- package/dist/routes/scripted/result.d.ts +3 -3
- package/dist/routes/scripted/result.js +13 -13
- package/dist/routes/scripted/route.d.ts +9 -9
- package/dist/routes/scripted/route.js +15 -16
- package/dist/routes/scripted/scenario.d.ts +1 -1
- package/dist/routes/scripted/scenario.js +5 -5
- package/dist/routes/scripted/setup.d.ts +6 -6
- package/dist/routes/scripted/setup.js +8 -8
- package/dist/routes/scripted/subject.d.ts +5 -5
- package/dist/routes/scripted/subject.js +4 -4
- package/dist/routes/scripted/surface-records.d.ts +1 -1
- package/dist/routes/scripted/surface-records.js +4 -4
- package/dist/routes/scripted/surface-sessions.d.ts +3 -3
- package/dist/routes/scripted/types.d.ts +18 -20
- package/dist/routes/scripted/types.js +2 -2
- package/dist/routes/shared-world/bundle-records.js +11 -10
- package/dist/routes/shared-world/bundle.d.ts +5 -5
- package/dist/routes/shared-world/bundle.js +46 -43
- package/dist/routes/shared-world/checkpoints.d.ts +4 -4
- package/dist/routes/shared-world/checkpoints.js +2 -2
- package/dist/routes/shared-world/comms.d.ts +14 -14
- package/dist/routes/shared-world/comms.js +19 -18
- package/dist/routes/shared-world/external-public.d.ts +4 -3
- package/dist/routes/shared-world/external-public.js +16 -12
- package/dist/routes/shared-world/handoff.d.ts +7 -6
- package/dist/routes/shared-world/handoff.js +65 -57
- package/dist/routes/shared-world/lobby-code.d.ts +2 -2
- package/dist/routes/shared-world/lobby-code.js +9 -9
- package/dist/routes/shared-world/participant-specs.d.ts +10 -9
- package/dist/routes/shared-world/participant-specs.js +38 -31
- package/dist/routes/shared-world/plan.d.ts +9 -9
- package/dist/routes/shared-world/plan.js +16 -16
- package/dist/routes/shared-world/provenance.d.ts +2 -2
- package/dist/routes/shared-world/provenance.js +2 -2
- package/dist/routes/shared-world/provisioned.d.ts +8 -8
- package/dist/routes/shared-world/provisioned.js +18 -17
- package/dist/routes/shared-world/result.d.ts +6 -6
- package/dist/routes/shared-world/result.js +29 -29
- package/dist/routes/shared-world/route.d.ts +11 -11
- package/dist/routes/shared-world/route.js +40 -39
- package/dist/routes/shared-world/setup.d.ts +16 -16
- package/dist/routes/shared-world/setup.js +23 -23
- package/dist/routes/shared-world/types.d.ts +55 -53
- package/dist/routes/shared-world/types.js +4 -4
- package/dist/routes/terminal/adapter.d.ts +5 -5
- package/dist/routes/terminal/adapter.js +9 -9
- package/dist/routes/terminal/bundle.d.ts +13 -13
- package/dist/routes/terminal/bundle.js +28 -27
- package/dist/routes/terminal/credentials.d.ts +8 -8
- package/dist/routes/terminal/credentials.js +12 -12
- package/dist/routes/terminal/dry-run.d.ts +4 -4
- package/dist/routes/terminal/dry-run.js +12 -12
- package/dist/routes/terminal/encoding.js +2 -2
- package/dist/routes/terminal/ledger.d.ts +5 -5
- package/dist/routes/terminal/ledger.js +14 -14
- package/dist/routes/terminal/lifetime.d.ts +1 -1
- package/dist/routes/terminal/lifetime.js +1 -1
- package/dist/routes/terminal/live-finish.d.ts +2 -2
- package/dist/routes/terminal/live-finish.js +10 -10
- package/dist/routes/terminal/live-sandbox.d.ts +2 -2
- package/dist/routes/terminal/live-sandbox.js +15 -15
- package/dist/routes/terminal/participant-text.js +2 -1
- package/dist/routes/terminal/persona.d.ts +2 -2
- package/dist/routes/terminal/persona.js +3 -3
- package/dist/routes/terminal/plan.d.ts +7 -7
- package/dist/routes/terminal/plan.js +15 -15
- package/dist/routes/terminal/recorder.js +2 -2
- package/dist/routes/terminal/result.d.ts +5 -5
- package/dist/routes/terminal/result.js +14 -14
- package/dist/routes/terminal/route.d.ts +9 -9
- package/dist/routes/terminal/route.js +19 -20
- package/dist/routes/terminal/sandbox.d.ts +1 -1
- package/dist/routes/terminal/sandbox.js +1 -1
- package/dist/routes/terminal/session.d.ts +5 -5
- package/dist/routes/terminal/session.js +14 -13
- package/dist/routes/terminal/token-usage.d.ts +1 -1
- package/dist/routes/terminal/token-usage.js +7 -8
- package/dist/routes/terminal/trace.d.ts +4 -4
- package/dist/routes/terminal/trace.js +2 -2
- package/dist/routes/terminal/types.d.ts +48 -50
- package/dist/routes/terminal/types.js +5 -5
- package/dist/run/bundle-shape.js +3 -3
- package/dist/run/bundle.d.ts +49 -49
- package/dist/run/bundle.js +3 -2
- package/dist/run/cost-summary.js +3 -3
- package/dist/run/costs.d.ts +23 -0
- package/dist/run/costs.js +79 -44
- package/dist/run/detail.d.ts +6 -6
- package/dist/run/detail.js +4 -4
- package/dist/run/dry-run-inputs.d.ts +1 -1
- package/dist/run/dry-run-inputs.js +2 -2
- package/dist/run/dry-run.js +20 -20
- package/dist/run/judge.d.ts +19 -13
- package/dist/run/judge.js +18 -8
- package/dist/run/outcomes.d.ts +1 -1
- package/dist/run/participant.d.ts +1 -1
- package/dist/run/paths.d.ts +1 -1
- package/dist/run/paths.js +1 -1
- package/dist/run/preflight-receipts.js +1 -1
- package/dist/run/pricing.d.ts +11 -6
- package/dist/run/pricing.js +22 -15
- package/dist/run/projection.d.ts +46 -46
- package/dist/run/projection.js +57 -57
- package/dist/run/reclaim.d.ts +1 -1
- package/dist/run/reclaim.js +3 -3
- package/dist/run/results.d.ts +5 -5
- package/dist/run/run-cost.d.ts +53 -0
- package/dist/run/run-cost.js +105 -0
- package/dist/run/run-index-analysis.d.ts +15 -0
- package/dist/run/run-index-analysis.js +77 -0
- package/dist/run/run-index.d.ts +19 -7
- package/dist/run/run-index.js +77 -64
- 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 +6 -5
- package/dist/run/run.js +3 -3
- package/dist/run/sandbox-receipts.d.ts +2 -2
- package/dist/run/sandbox-receipts.js +3 -3
- package/dist/run/shared-world-evidence.d.ts +37 -36
- package/dist/run/shared-world-evidence.js +4 -4
- package/dist/run/shared-world-shape.d.ts +1 -1
- package/dist/run/shared-world-shape.js +7 -7
- package/dist/run/stats.d.ts +14 -8
- package/dist/run/stats.js +121 -63
- package/dist/run/status.d.ts +16 -29
- package/dist/run/status.js +10 -29
- package/dist/run/stored-runs.js +2 -1
- package/dist/run/stream-shape.js +1 -1
- package/dist/run/streams.d.ts +7 -7
- package/dist/run/study-provenance.d.ts +49 -0
- package/dist/run/study-provenance.js +66 -0
- package/dist/run/study-result.d.ts +11 -0
- package/dist/run/study-result.js +9 -0
- package/dist/run/text.d.ts +2 -0
- package/dist/run/text.js +4 -0
- package/dist/run-study.d.ts +112 -0
- package/dist/{run-lab.js → run-study.js} +52 -47
- package/dist/{lab → study}/adapter-extension.d.ts +15 -27
- package/dist/{lab → study}/adapter-extension.js +10 -45
- package/dist/{lab → study}/adapter-scorer-loader.d.ts +17 -17
- package/dist/{lab → study}/adapter-scorer-loader.js +34 -34
- package/dist/study/composition-rules.d.ts +7 -0
- package/dist/{lab → study}/composition-rules.js +53 -53
- package/dist/study/config.d.ts +15 -0
- package/dist/{lab → study}/config.js +98 -41
- package/dist/study/convert.d.ts +33 -0
- package/dist/study/convert.js +432 -0
- package/dist/{lab → study}/device-presets.d.ts +10 -10
- package/dist/{lab → study}/device-presets.js +11 -11
- package/dist/study/discover.d.ts +75 -0
- package/dist/{lab → study}/discover.js +134 -95
- package/dist/{lab → study}/doctor.d.ts +19 -12
- package/dist/{lab → study}/doctor.js +58 -20
- 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 +44 -0
- package/dist/{lab → study}/init-templates.d.ts +2 -2
- package/dist/study/init-templates.js +421 -0
- package/dist/{lab → study}/init.d.ts +2 -2
- package/dist/{lab → study}/init.js +46 -11
- package/dist/study/keys.d.ts +4 -0
- package/dist/{lab → study}/keys.js +46 -12
- 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/{lab → study}/parse/actors.d.ts +5 -5
- package/dist/{lab → study}/parse/actors.js +14 -14
- package/dist/study/parse/comms.d.ts +12 -0
- package/dist/{lab → study}/parse/comms.js +5 -5
- package/dist/study/parse/execution.d.ts +19 -0
- package/dist/{lab → study}/parse/execution.js +13 -13
- package/dist/study/parse/study-v3.d.ts +21 -0
- package/dist/study/parse/study-v3.js +259 -0
- package/dist/study/parse/subject-state.d.ts +30 -0
- package/dist/{lab → study}/parse/subject-state.js +19 -19
- package/dist/{lab → study}/parse/subject.d.ts +3 -3
- package/dist/{lab → study}/parse/subject.js +34 -34
- package/dist/{lab → study}/parse/values.d.ts +3 -3
- package/dist/{lab → study}/parse/values.js +3 -3
- package/dist/{lab → study}/persona-resolve.d.ts +8 -8
- package/dist/{lab → study}/persona-resolve.js +6 -6
- package/dist/{lab → study}/plan-base.d.ts +7 -7
- package/dist/{lab → study}/plan-base.js +1 -1
- package/dist/{lab → study}/plan-participants.d.ts +12 -12
- package/dist/{lab → study}/plan-participants.js +4 -4
- package/dist/{lab → study}/plan-types.d.ts +31 -31
- package/dist/{lab → study}/plan-types.js +2 -2
- package/dist/study/plan.d.ts +13 -0
- package/dist/study/plan.js +101 -0
- package/dist/study/preflight-probes.d.ts +3 -0
- package/dist/{lab → study}/preflight-probes.js +20 -19
- package/dist/study/preflight-result.d.ts +8 -0
- package/dist/{lab → study}/preflight-result.js +5 -4
- package/dist/study/preflight.d.ts +94 -0
- package/dist/{lab → study}/preflight.js +12 -12
- package/dist/{lab → study}/requirements.d.ts +3 -3
- package/dist/{lab → study}/requirements.js +1 -1
- package/dist/study/route-inputs.d.ts +28 -0
- package/dist/{lab → study}/route-inputs.js +1 -1
- package/dist/{lab → study}/routing.d.ts +39 -33
- package/dist/{lab → study}/routing.js +60 -29
- package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -13
- package/dist/{lab/run-lab-events.js → study/run-study-events.js} +3 -9
- package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +21 -18
- package/dist/{lab/run-lab-homes.js → study/run-study-homes.js} +1 -1
- package/dist/study/run-study-options.d.ts +28 -0
- package/dist/{lab/run-lab-options.js → study/run-study-options.js} +29 -25
- package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +8 -13
- package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
- package/dist/{lab → study}/summary.d.ts +16 -15
- package/dist/{lab → study}/summary.js +21 -21
- package/dist/{lab → study}/tasks.d.ts +18 -18
- package/dist/{lab → study}/tasks.js +14 -14
- package/dist/{lab → study}/types.d.ts +202 -196
- package/dist/{lab → study}/types.js +3 -1
- package/dist/{lab → study}/validation.d.ts +27 -27
- package/dist/{lab → study}/validation.js +53 -51
- package/dist/study/warnings.d.ts +12 -0
- package/dist/{lab → study}/warnings.js +62 -34
- package/dist/subject/clone.d.ts +7 -7
- package/dist/subject/clone.js +2 -2
- package/dist/subject/desktop-cli.d.ts +1 -1
- package/dist/subject/desktop-cli.js +2 -2
- package/dist/subject/local-tree-archive.d.ts +2 -2
- package/dist/subject/local-tree-archive.js +4 -4
- package/dist/subject/local-tree.d.ts +4 -4
- package/dist/subject/node-bootstrap.js +1 -1
- package/dist/subject/runtime.js +9 -10
- package/dist/subject/serve.d.ts +5 -5
- package/dist/subject/serve.js +3 -3
- package/dist/subject/state.d.ts +4 -4
- package/dist/subject/state.js +1 -1
- package/dist/subject/steps.d.ts +6 -6
- package/dist/subject/steps.js +5 -5
- package/dist/substrates/command-failure.d.ts +3 -3
- package/dist/substrates/command-failure.js +3 -3
- package/dist/substrates/desktop-session.js +2 -2
- package/dist/substrates/detached.d.ts +6 -6
- package/dist/substrates/detached.js +7 -7
- package/dist/substrates/e2b/cdp-probe.d.ts +9 -9
- package/dist/substrates/e2b/cdp-probe.js +14 -17
- package/dist/substrates/e2b/desktop-browser.d.ts +6 -6
- package/dist/substrates/e2b/desktop-browser.js +9 -9
- package/dist/substrates/e2b/desktop-cdp.d.ts +10 -10
- package/dist/substrates/e2b/desktop-cdp.js +9 -9
- package/dist/substrates/e2b/desktop-executor.d.ts +2 -2
- package/dist/substrates/e2b/desktop-executor.js +13 -13
- package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
- package/dist/substrates/e2b/desktop-geometry.js +8 -8
- package/dist/substrates/e2b/desktop-media.d.ts +4 -4
- package/dist/substrates/e2b/desktop-media.js +1 -1
- 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/lifetime.js +1 -1
- package/dist/substrates/e2b/sandbox.d.ts +4 -4
- package/dist/substrates/e2b/sandbox.js +2 -2
- package/dist/substrates/e2b/sdk.d.ts +12 -12
- package/dist/substrates/e2b/sdk.js +7 -7
- package/dist/substrates/local/runtime-config.d.ts +4 -4
- package/dist/substrates/local/runtime-config.js +4 -4
- package/dist/tui/actions.d.ts +1 -1
- package/dist/tui/actions.js +13 -13
- package/dist/tui/contract.d.ts +23 -23
- package/dist/tui/contract.js +11 -11
- package/dist/tui/launch.d.ts +7 -7
- package/dist/tui/launch.js +36 -31
- package/dist/tui/project.js +5 -5
- package/dist/tui-app.js +139 -139
- package/dist/verify/actor.d.ts +8 -8
- package/dist/verify/actor.js +36 -36
- package/dist/verify/artifacts.d.ts +2 -2
- package/dist/verify/artifacts.js +3 -3
- package/dist/verify/context-growth.d.ts +9 -0
- package/dist/verify/context-growth.js +62 -0
- package/dist/verify/costs.d.ts +6 -6
- package/dist/verify/costs.js +8 -8
- 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 +16 -16
- package/dist/verify/subject.d.ts +5 -5
- package/dist/verify/subject.js +19 -19
- package/dist/verify/verify.js +94 -44
- package/docs/README.md +25 -32
- package/docs/architecture/actor-contract.md +60 -91
- package/docs/architecture/browser-control.md +1 -1
- package/docs/architecture/desktop-sessions.md +7 -7
- package/docs/architecture/external-public-shared-world.md +68 -65
- package/docs/architecture/github-feedback-loop.md +2 -5
- package/docs/architecture/guest-desktop.md +2 -2
- package/docs/architecture/observer.md +34 -34
- package/docs/architecture/restricted-codex-analysis.md +34 -28
- package/docs/architecture/serve.md +34 -37
- package/docs/architecture/state-driven-executor.md +55 -58
- package/docs/architecture/task-protocol-support.md +6 -6
- package/docs/architecture/terminal-product-route.md +70 -110
- package/docs/contracts/README.md +24 -0
- package/docs/contracts/adapter-admission.md +3 -3
- package/docs/contracts/adapter-fixtures.md +4 -7
- 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 +42 -44
- package/docs/contracts/schemas.md +446 -368
- package/docs/contracts/study-analysis.md +7 -4
- package/docs/contracts/study-costs.md +28 -9
- 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/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 +7 -7
- package/examples/README.md +1 -1
- 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/examples/scorer/scorer.mjs +3 -3
- package/package.json +16 -17
- package/skills/humanish/SKILL.md +64 -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 -72
- package/dist/actors/codex/qualified-versions.js +0 -132
- package/dist/cli/commands/lab-format.d.ts +0 -8
- package/dist/cli/commands/lab-route-run.d.ts +0 -19
- package/dist/cli/commands/lab-route-scripted.d.ts +0 -17
- package/dist/cli/commands/lab-route-terminal.d.ts +0 -17
- package/dist/cli/commands/lab-run.d.ts +0 -9
- package/dist/cli/commands/lab.d.ts +0 -3
- package/dist/cli/commands/lab.js +0 -199
- package/dist/cli/renamed-options.d.ts +0 -11
- package/dist/cli/renamed-options.js +0 -18
- package/dist/lab/composition-rules.d.ts +0 -7
- package/dist/lab/config.d.ts +0 -7
- package/dist/lab/discover.d.ts +0 -65
- package/dist/lab/init-templates.js +0 -416
- package/dist/lab/keys.d.ts +0 -2
- package/dist/lab/parse/comms.d.ts +0 -12
- package/dist/lab/parse/execution.d.ts +0 -19
- package/dist/lab/parse/subject-state.d.ts +0 -30
- package/dist/lab/plan.d.ts +0 -19
- package/dist/lab/plan.js +0 -132
- package/dist/lab/preflight-probes.d.ts +0 -3
- package/dist/lab/preflight-result.d.ts +0 -7
- package/dist/lab/preflight.d.ts +0 -92
- package/dist/lab/route-inputs.d.ts +0 -28
- package/dist/lab/run-lab-options.d.ts +0 -28
- package/dist/lab/warnings.d.ts +0 -2
- package/dist/observer/static.d.ts +0 -39
- package/dist/observer/static.js +0 -369
- package/dist/run-lab.d.ts +0 -112
- 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 -295
- 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/{lab → study}/init-paths.d.ts +0 -0
- /package/dist/{lab → study}/init-paths.js +0 -0
- /package/dist/{lab → study}/init-plan.d.ts +0 -0
- /package/dist/{lab → study}/init-plan.js +0 -0
- /package/dist/{lab → study}/participant-assignment.d.ts +0 -0
- /package/dist/{lab → study}/participant-assignment.js +0 -0
- /package/dist/{lab → study}/persona.d.ts +0 -0
- /package/dist/{lab → study}/persona.js +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,47 +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, the computer-use route takes a branch that
|
|
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
|
-
- `
|
|
207
|
+
- `HUMANISH_COMPUTER_USE_FANOUT_INVALID`: `inProcess` with more than one participant. The planner refuses it, because fan-out gives each participant
|
|
211
208
|
its own E2B desktop and the in-process route has none.
|
|
212
|
-
- `
|
|
209
|
+
- `HUMANISH_COMPUTER_USE_LOCAL_APP_NO_EXECUTOR`: a `subject.source: local-app` config run
|
|
213
210
|
without `inProcess` (there is no built-in in-process driver yet). A structured error,
|
|
214
211
|
never a desktop attempt.
|
|
215
|
-
- `
|
|
216
|
-
and no local desktop. `
|
|
217
|
-
call or an in-process executor on the same
|
|
218
|
-
- `
|
|
219
|
-
provider hook. A package caller gets `
|
|
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.
|
|
220
217
|
|
|
221
|
-
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
|
|
222
219
|
executor, so no `OPENAI_API_KEY`/`E2B_API_KEY` is required.
|
|
223
220
|
|
|
224
221
|
## A note on `appState` typing
|
|
225
222
|
|
|
226
|
-
`
|
|
223
|
+
`ComputerUseObservation.appState` is `Record<string, unknown> | undefined` under the
|
|
227
224
|
repo's strict flags (`exactOptionalPropertyTypes`, `noUncheckedIndexedAccess`).
|
|
228
|
-
A value typed as an `interface` does
|
|
225
|
+
A value typed as an `interface` does not satisfy `Record<string, unknown>`
|
|
229
226
|
(interfaces have no implicit index signature), and a direct `as Record<...>` cast
|
|
230
227
|
on an interface-typed value is rejected. Use one of:
|
|
231
228
|
|
|
@@ -236,15 +233,15 @@ on an interface-typed value is rejected. Use one of:
|
|
|
236
233
|
Read every optional field defensively, and spread-omit optional fields
|
|
237
234
|
(`...(x === undefined ? {} : { x })`) rather than assigning `undefined`.
|
|
238
235
|
|
|
239
|
-
##
|
|
236
|
+
## Not built
|
|
240
237
|
|
|
241
|
-
- **
|
|
238
|
+
- **A config-only deterministic `state-contract` route.** A registered,
|
|
242
239
|
model-free route driving a built-in `window.app.*` bridge over the existing
|
|
243
|
-
`ScriptedPageLike.evaluate` primitive + a YAML step program, `
|
|
244
|
-
|
|
240
|
+
`ScriptedPageLike.evaluate` primitive + a YAML step program, `mode: live`
|
|
241
|
+
gating actuation. It would be deterministic step replay, not
|
|
245
242
|
`runComputerUseLoop`, and must not overclaim friction-loop reuse.
|
|
246
|
-
- **
|
|
247
|
-
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
|
|
248
245
|
surface with no precedent in this repo (the scripted route loads only declarative
|
|
249
246
|
YAML; serve commands run isolated inside the disposable E2B sandbox). It earns
|
|
250
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,12 +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
|
-
reports `
|
|
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
|
+
`planStudy` (`src/study/plan.ts`) and each route's plan.
|
|
28
28
|
Refusal precedes run storage, source preparation, user hooks, local processes,
|
|
29
29
|
sandbox allocation, and model calls. No task content appears in the error.
|
|
30
30
|
|
|
31
31
|
A future route gains support only after proving participant goals, hidden criteria,
|
|
32
|
-
observation-backed completion,
|
|
32
|
+
observation-backed completion, explicit missing-input handling, and per-participant
|
|
33
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,39 +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
|
-
| route
|
|
46
|
-
|
|
47
|
-
Routing is `routeOf` (`src/
|
|
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` → `runTerminalProductStudy` ([`src/routes/terminal/route.ts`](https://github.com/danielgwilson/humanish/blob/main/src/routes/terminal/route.ts)) |
|
|
40
|
+
|
|
41
|
+
Routing is `routeOf` (`src/study/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
|
-
`isTerminalProductComposition(config)` (`src/
|
|
43
|
+
`isTerminalProductComposition(config)` (`src/study/routing.ts`) also feeds the forward-declared
|
|
50
44
|
warnings.
|
|
51
45
|
|
|
52
46
|
## Repeating a terminal study with the same runtime
|
|
53
47
|
|
|
54
48
|
```yaml
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
49
|
+
actor:
|
|
50
|
+
type: codex-exec
|
|
51
|
+
model: gpt-5.6-sol
|
|
52
|
+
reasoningEffort: low
|
|
59
53
|
execution:
|
|
60
54
|
target: e2b-terminal
|
|
61
55
|
runtime:
|
|
@@ -75,7 +69,7 @@ the requested model and where it came from, declared effort, and the usage granu
|
|
|
75
69
|
The observed executable version also appears as `providerVersion`.
|
|
76
70
|
|
|
77
71
|
Codex's `--json` stream does not name the model it used, and its built-in default can change
|
|
78
|
-
with any release. So the route always passes `--model`: the
|
|
72
|
+
with any release. So the route always passes `--model`: the study's `actor.model`
|
|
79
73
|
(`modelStatus: declared`), or humanish's participant default `gpt-5.6-sol`
|
|
80
74
|
(`modelStatus: humanish_default`). Bundles written before 0.107.0 record
|
|
81
75
|
`runtime_default_unobserved` with no requested model.
|
|
@@ -87,7 +81,7 @@ requested model. Codex `turn.completed` usage sums every request in a turn, so n
|
|
|
87
81
|
size is known and no per-request long-context tier can be applied. The estimate prices every token
|
|
88
82
|
at the base tier, with cached input at the cached rate, and says so with
|
|
89
83
|
`basis: aggregated_turns_base_rate`. It is an estimate, not a measurement. The cost ledger
|
|
90
|
-
checked against `
|
|
84
|
+
checked against `caps.maxUsd` keeps the provider line unmeasured, and the studied
|
|
91
85
|
product's no-spend boundary still needs separate interpretation.
|
|
92
86
|
|
|
93
87
|
## Runtime auth: raw-key placement and remaining provider access
|
|
@@ -131,11 +125,11 @@ make authenticated requests to that host from sandbox creation until teardown,
|
|
|
131
125
|
including bootstrap/setup commands and commands launched outside Codex. Calls
|
|
132
126
|
made outside Codex may be absent from its usage ledger. This mode does not impose
|
|
133
127
|
a provider-side spending limit, restrict models/API paths, or make
|
|
134
|
-
`
|
|
128
|
+
`caps.maxUsd` a preventive provider budget. A hard provider budget needs
|
|
135
129
|
a separately enforced control; do not infer zero spend from an unmeasured ledger
|
|
136
130
|
line.
|
|
137
131
|
|
|
138
|
-
Public internet discovery stays unrestricted unless the
|
|
132
|
+
Public internet discovery stays unrestricted unless the study already declares
|
|
139
133
|
`execution.egressAllow`. The mode preserves that allowlist and its deny-all
|
|
140
134
|
fallback without adding hosts. If an allowlist omits `api.openai.com`, provider
|
|
141
135
|
requests can fail. E2B domain allowlists are routing controls rather than strict
|
|
@@ -155,7 +149,7 @@ and [E2B's CA installer](https://github.com/e2b-dev/infra/blob/main/packages/env
|
|
|
155
149
|
E2B's installed
|
|
156
150
|
SDK documents that transformed headers override request headers. Deterministic
|
|
157
151
|
request/redaction tests do not establish live wire behavior. The [2026-09-05
|
|
158
|
-
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)
|
|
159
153
|
records the controlled live header/auth checks and their scope.
|
|
160
154
|
|
|
161
155
|
## Runtime prerequisite
|
|
@@ -180,7 +174,7 @@ checks Node/npm in both ordinary and sudo shells after installation. The existin
|
|
|
180
174
|
runtime fast path preserves user-specific installations; a later sudo product
|
|
181
175
|
install can still fail if that installation is absent from sudo's PATH.
|
|
182
176
|
|
|
183
|
-
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)
|
|
184
178
|
records the regression found after the initial runtime-only proof and its stock
|
|
185
179
|
desktop checks. npm documents [global executable locations](https://docs.npmjs.com/cli/v10/configuring-npm/folders#executables)
|
|
186
180
|
and the [distribution built-in configuration](https://docs.npmjs.com/cli/v10/configuring-npm/npmrc#built-in-config-file).
|
|
@@ -212,99 +206,65 @@ blast radius is bounded by key scoping and budgets, not by hoping._
|
|
|
212
206
|
|
|
213
207
|
The inversion is declared as registry metadata, not a code convention: the
|
|
214
208
|
terminal actor's capabilities carry `keyPlacement: "in-sandbox-command-scoped"`.
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
plaintext);
|
|
232
|
-
- the caps / deny-by-default policies / runtime-auth channel recorded as
|
|
233
|
-
declarations (names only; invariant 1);
|
|
234
|
-
- a terminal-kind stream that is an honest **contract placeholder**: stdin
|
|
235
|
-
disabled, empty tail, `transport: snapshot`, **not** `pty` (captured
|
|
236
|
-
non-interactive exec output is never an interactive PTY; invariant 6 + the
|
|
237
|
-
goal packet's PTY ruling). SLICE 2 later added redacted exec-stream capture;
|
|
238
|
-
- empty/placeholder ledgers (substrate lifecycle, command log, terminal event
|
|
239
|
-
stream, interventions, cost) that SLICE 2/3 later filled.
|
|
240
|
-
|
|
241
|
-
The dry-run bundle passed the existing `verifyRun`. Terminal-specific verifier
|
|
242
|
-
checks (terminal/transcript presence, lifecycle, cleanup, interventions,
|
|
243
|
-
metadata allowlist, no-credential-in-artifacts, no-spend) landed in SLICE 2/3.
|
|
244
|
-
|
|
245
|
-
At SLICE 1, a non-dry-run call returned a structured
|
|
246
|
-
`HUMANISH_TERMINAL_AGENT_NOT_IMPLEMENTED` failure before launch or spend.
|
|
247
|
-
SLICE 2 implemented the real session.
|
|
248
|
-
|
|
249
|
-
SLICE 1 declared the DI seams SLICE 2 needed (`loadModule`, `buildSandbox`,
|
|
250
|
-
`runtimeAuthEnv`, `detachedTimers`) on a terminal hook bag; only the dry-run path was
|
|
251
|
-
implemented in that slice. The bag is gone. The route reads `env` and `scorer` from its
|
|
252
|
-
options (`src/routes/terminal/types.ts`), and a test passes its seams (`desktopModule`,
|
|
253
|
-
`renderObserver`, `now`, `costProbe`) as `LabDeps` (`src/lab/lab-deps.ts`).
|
|
254
|
-
|
|
255
|
-
## SLICE 4: the product-adapter extension seam (layer 6)
|
|
256
|
-
|
|
257
|
-
This route is proof-roadmap **layer 6**: an adopter attaches product-specific
|
|
258
|
-
scoring + feedback as a THIN in-repo extension WITHOUT forking core. SLICE 4
|
|
259
|
-
ships the SEAM. Core ships no built-in product scorer; the adopter's scorecard
|
|
260
|
-
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 `StudyDeps`
|
|
218
|
+
(`src/study/study-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:
|
|
261
225
|
|
|
262
226
|
- **Exported contract types** a thin adapter types against from the package barrel
|
|
263
227
|
(`humanish`) alone, never through a deep `src/` import: `RunBundle`,
|
|
264
228
|
`RunFeedbackCandidate`, `RunAdapterScore`, `RunAdapterArtifact`, `ActorTrace`,
|
|
265
229
|
`AdapterScorerModule` and `TerminalProductScoringContext`. The ledger, cost and
|
|
266
230
|
no-spend shapes are reached through that context's fields, as
|
|
267
|
-
`TerminalProductScoringContext["ledgers"]`.
|
|
268
|
-
|
|
269
|
-
the gap issue #154 acceptance #8 names.
|
|
270
|
-
- **A registrable scorer / feedback module**, `RunLabOptions.scorer` (an
|
|
231
|
+
`TerminalProductScoringContext["ledgers"]`.
|
|
232
|
+
- **A registrable scorer / feedback module**, `RunStudyOptions.scorer` (an
|
|
271
233
|
`AdapterScorerModule`): `score?(ctx) => RunAdapterScore | Promise<…>` and
|
|
272
234
|
`deriveFeedback?(ctx) => RunFeedbackCandidate[] | Promise<…>`, where this route's
|
|
273
235
|
`ctx` is a `TerminalProductScoringContext`. The older `terminalHooks.score` and
|
|
274
236
|
`terminalHooks.deriveFeedback` were removed with the bag. The route calls the
|
|
275
|
-
hooks over the
|
|
276
|
-
(`bundle.adapterScore`, appended `bundle.feedbackCandidates`)
|
|
237
|
+
hooks over the fully-assembled, redacted evidence and attaches the results
|
|
238
|
+
(`bundle.adapterScore`, appended `bundle.feedbackCandidates`) without core knowing
|
|
277
239
|
any product noun. Default (no hook) behavior is unchanged: the mission-based verdict
|
|
278
240
|
stands alone.
|
|
279
241
|
- **Adapter-namespaced product nouns.** Product-specific concepts (public
|
|
280
242
|
CLI/product command observed, hosted product success-or-blocker, feedback
|
|
281
243
|
id/draft, media/job/asset ids, no-media/no-provider-spend proof,
|
|
282
|
-
defection/friction risk) ride
|
|
244
|
+
defection/friction risk) ride only under a single namespaced field
|
|
283
245
|
(`RunFeedbackCandidate.adapter: { namespace, data }` and
|
|
284
246
|
`RunAdapterScore.{namespace, data}`) so core's enums stay product-agnostic and
|
|
285
247
|
a future inert-field audit never misfires. No adopter noun is hardcoded into a
|
|
286
248
|
core enum (avoiding closed-taxonomy rot); `e2b-terminal` is added to the
|
|
287
|
-
substrate enum so a terminal-agent candidate names
|
|
249
|
+
substrate enum so a terminal-agent candidate names the substrate it ran on.
|
|
288
250
|
|
|
289
|
-
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
|
|
290
252
|
any malformed score/candidate with a warning, and `verifyRun` re-checks the
|
|
291
253
|
surviving shapes, so a bad extension never poisons a verifiable bundle. Proven by
|
|
292
254
|
`tests/routes/terminal/product-adapter-seam.test.ts` (a thin in-repo example adapter
|
|
293
255
|
typing against the barrel only, registering a scorer, attaching namespaced nouns,
|
|
294
|
-
emitting a candidate; the bundle verifies).
|
|
295
|
-
|
|
296
|
-
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.
|
|
297
258
|
|
|
298
|
-
The adopter's real scorecard is its
|
|
299
|
-
live receipt is kept under the terminal-product goal
|
|
300
|
-
|
|
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.
|
|
301
262
|
|
|
302
263
|
## The reference adopter (codename-neutral)
|
|
303
264
|
|
|
304
|
-
The requesting adopter is a public creative-CLI product
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
(
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
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
|
},
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
# Adapter Fixture Parity Contract
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
Status: committed contract fixtures with passing parity checks. A fixture
|
|
6
|
-
proves that core can carry an adapter-owned evidence shape; it does not prove a
|
|
7
|
-
live adopter integration or satisfy a deletion-branch depth phase.
|
|
3
|
+
The committed fixtures pass their parity checks. A fixture proves that core can carry an
|
|
4
|
+
adapter-owned evidence shape; it does not prove a live adopter integration.
|
|
8
5
|
|
|
9
6
|
## Purpose
|
|
10
7
|
|
|
@@ -42,7 +39,7 @@ A fixture can be promoted only when:
|
|
|
42
39
|
- credential policy records env var names only, never values;
|
|
43
40
|
- adapter-owned nouns do not appear in core schema docs or core runtime code;
|
|
44
41
|
- public feedback material states that GitHub mutation was not performed;
|
|
45
|
-
- the fixture can be checked with `pnpm test tests/
|
|
42
|
+
- the fixture can be checked with `pnpm test tests/study/adapter-fixtures.test.ts`
|
|
46
43
|
and `pnpm public-surface:scan`.
|
|
47
44
|
|
|
48
45
|
## Dry-Run Web-App Fixture Shape
|
|
@@ -77,6 +74,6 @@ This keeps terminal and feedback parity independent from browser screenshots.
|
|
|
77
74
|
## Proof Commands
|
|
78
75
|
|
|
79
76
|
```bash
|
|
80
|
-
pnpm test tests/
|
|
77
|
+
pnpm test tests/study/adapter-fixtures.test.ts
|
|
81
78
|
pnpm public-surface:scan
|
|
82
79
|
```
|