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,32 +1,29 @@
|
|
|
1
1
|
# Actor Contract
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
routing checks `lanes` and `producesScreenshots` (`src/lab/routing.ts`): an actor that
|
|
16
|
-
declares no screenshots cannot run on the computer-use or scripted-browser route. Decision
|
|
17
|
-
6's capture-time screenshot stance was recanted in 0.6.0; see the inline notes and the
|
|
3
|
+
Part of this contract ships and part is still open. Shipped: the evidence schema
|
|
4
|
+
`humanish.actor-trace.v1` (`src/actors/contract.ts`) and a closed first-party registry of five
|
|
5
|
+
descriptors (`src/actors/registry.ts`: `codex-app-server`, `openai-computer-use`, `local-agent`,
|
|
6
|
+
`scripted-browser`, `codex-exec`). `actor.type` is a real dispatch key on the computer-use,
|
|
7
|
+
scripted-browser, and terminal-product routes. Product scoring, feedback, and artifact hooks are
|
|
8
|
+
extension seams, but public out-of-tree actor registration and its conformance certification are not
|
|
9
|
+
shipped. Also not shipped: the full `Actor.run(input)` interface, `ApprovalPolicy`,
|
|
10
|
+
`StagehandCuaActor`, and the `persona-fidelity` verify check. `RedactionHooks` ships in
|
|
11
|
+
`src/evidence/redaction.ts`, and the computer-use loop takes it; the other adapters do not take it
|
|
12
|
+
yet. Of the capabilities, routing checks `lanes` and `producesScreenshots` (`src/study/routing.ts`):
|
|
13
|
+
an actor that declares no screenshots cannot run on the computer-use or scripted-browser route.
|
|
14
|
+
Decision 6's capture-time screenshot stance was recanted in 0.6.0; see the inline notes and the
|
|
18
15
|
capture-vs-publish rule in
|
|
19
16
|
[`docs/principles/invariants-and-defaults.md`](../principles/invariants-and-defaults.md).
|
|
20
17
|
|
|
21
|
-
`codex-exec` is a real dispatch key for terminal-product
|
|
18
|
+
`codex-exec` is a real dispatch key for terminal-product studies, but the exported
|
|
22
19
|
descriptor `runSession` is a fail-closed compatibility entry. Live execution is
|
|
23
|
-
owned by `
|
|
20
|
+
owned by `runTerminalProductStudy`, which coordinates sandbox creation,
|
|
24
21
|
command-scoped runtime auth, evidence, caps, and by-id cleanup.
|
|
25
22
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
through `local-agent`, which plugs into the provider-neutral `
|
|
23
|
+
The `pi-agent-core` and `claude-agent-sdk` descriptors, the `app` run kind and the
|
|
24
|
+
`in-process-sdk` protocol were removed. No study route dispatched either descriptor, and a
|
|
25
|
+
study that names one now fails to parse. A signed-in Claude Code drives computer-use studies
|
|
26
|
+
through `local-agent`, which plugs into the provider-neutral `ComputerUseProvider` port
|
|
30
27
|
(`src/actors/computer-use/loop/types.ts`, re-exported from `loop.ts`).
|
|
31
28
|
|
|
32
29
|
## Context
|
|
@@ -64,7 +61,7 @@ API surface.
|
|
|
64
61
|
Agent SDK, Stagehand). The existing Codex app-server integration is the
|
|
65
62
|
reference adapter. `pi-agent-core` was planned as the first in-process-SDK
|
|
66
63
|
adapter to prove both shapes early; it shipped only as a trace mapper with no
|
|
67
|
-
route, and
|
|
64
|
+
route, and was removed.
|
|
68
65
|
|
|
69
66
|
2. **One normalized evidence schema: `humanish.actor-trace.v1`.** Four producers map
|
|
70
67
|
their records onto one `ActorTrace` with a typed `items[]`:
|
|
@@ -81,7 +78,7 @@ API surface.
|
|
|
81
78
|
The Codex app-server still writes its own `humanish.codex-app-server-trace.v1` record
|
|
82
79
|
(`CodexAppServerTrace` in `src/actors/codex/app-server-trace.ts`), which
|
|
83
80
|
`codexResultToActorTrace` converts. The Claude Agent SDK `ToolUse`/`ToolResult` and pi
|
|
84
|
-
`tool_execution_*` mappers
|
|
81
|
+
`tool_execution_*` mappers were removed with their adapters.
|
|
85
82
|
|
|
86
83
|
3. **A run is multi-turn within one trace; it stops on goal, abandonment, unrecoverable
|
|
87
84
|
failure, or a wall-clock safety timeout, never on a turn cap.** Turn count is explicitly
|
|
@@ -96,7 +93,7 @@ API surface.
|
|
|
96
93
|
4. **Redaction is injected once, never re-implemented per adapter.** Every
|
|
97
94
|
adapter receives `RedactionHooks` (the shared secret/path/prompt-digest
|
|
98
95
|
redaction, plus screenshot redaction) and must route all persisted evidence
|
|
99
|
-
through it.
|
|
96
|
+
through it.
|
|
100
97
|
|
|
101
98
|
5. **The registry refuses capability mismatches.** Each adapter declares
|
|
102
99
|
`ActorCapabilities`. A scenario that needs `producesScreenshots` (a GUI
|
|
@@ -287,27 +284,27 @@ export interface Actor {
|
|
|
287
284
|
public-safe: redacted message, coarse loop phase, last normalized UI action,
|
|
288
285
|
and last screenshot reference only. Do not persist raw stacks, env values,
|
|
289
286
|
target URLs, or unredacted provider payloads in the trace.
|
|
290
|
-
- **Capabilities.** Declare
|
|
287
|
+
- **Capabilities.** Declare only what the actor does. Routing refuses an actor whose `lanes` or
|
|
291
288
|
`producesScreenshots` do not fit the route; the other capabilities are not checked.
|
|
292
|
-
- **Cost (estimate vs. charge).** `tokenUsage.costUsd` stays
|
|
289
|
+
- **Cost (estimate vs. charge).** `tokenUsage.costUsd` stays reserved for a
|
|
293
290
|
real, provider-returned charge (the codex path); a bare `costUsd`
|
|
294
291
|
always means "the provider billed this". The optional `estimatedCost`
|
|
295
|
-
(`humanish.actor-estimated-cost.v1`) is a
|
|
292
|
+
(`humanish.actor-estimated-cost.v1`) is a separate, differently-named field: a
|
|
296
293
|
token-derived rate-table multiply from the operator-editable `src/run/pricing.ts`,
|
|
297
|
-
labeled
|
|
294
|
+
labeled as an estimate and projected up into `RunBundle.cost` (see
|
|
298
295
|
[`../contracts/schemas.md`](../contracts/schemas.md) → Run Cost Summary And
|
|
299
|
-
Estimated Actor Cost). The CUA
|
|
300
|
-
|
|
296
|
+
Estimated Actor Cost). The CUA study computes and attaches `estimatedCost` at the
|
|
297
|
+
study boundary before persisting the trace, so the pure computer-use loop never
|
|
301
298
|
depends on the pricing table. An unknown model yields
|
|
302
299
|
`estimatedCostUsd: null` + a `reason`, never a guessed charge.
|
|
303
300
|
|
|
304
|
-
## The scripted-browser route
|
|
301
|
+
## The scripted-browser route
|
|
305
302
|
|
|
306
303
|
`scripted-browser` is the deterministic, model-free browser-actuation route, distinct from
|
|
307
304
|
`computer-use` (raw pixels + a model deciding actions). The registered
|
|
308
305
|
`scripted-browser` actor (`src/actors/scripted-browser/`) replays a committed scenario's
|
|
309
|
-
browser steps with playwright against a loopback app; the steps
|
|
310
|
-
`byoModel: false` means there is
|
|
306
|
+
browser steps with playwright against a loopback app; the steps are the behavior, so
|
|
307
|
+
`byoModel: false` means there is no model, and `tokenUsage` records zeros as an affirmative
|
|
311
308
|
$0 declaration that is true by mechanism (no provider client is importable from that code
|
|
312
309
|
path). Its trace keeps the concrete driver name `provider: "browser-persona"` (matching the
|
|
313
310
|
native `humanish.browser-persona-trace.v1` it also emits) with `protocol: "scripted-steps"`.
|
|
@@ -322,16 +319,16 @@ has no persona patience and no approvals.
|
|
|
322
319
|
|
|
323
320
|
### The time budget vs. a stuck timeout (`budget_reached`)
|
|
324
321
|
|
|
325
|
-
`execution.timeoutMs` is a
|
|
322
|
+
`execution.timeoutMs` is a generous wall-clock safety cap, not a goal. An open-ended
|
|
326
323
|
"watch it play" session has no success predicate, because productive play is the outcome. So
|
|
327
324
|
the computer-use loop distinguishes two ways to hit the cap:
|
|
328
325
|
|
|
329
|
-
- **`budget_reached`**: the deadline was reached
|
|
326
|
+
- **`budget_reached`**: the deadline was reached after at least one material (non-idle)
|
|
330
327
|
action, or a spend, adapter or token limit ended the session. This maps to `ActorStatus:
|
|
331
328
|
"incomplete"`: the participant did not reach the goal, and the harness did not fail.
|
|
332
329
|
`participantOutcomeOk` is false, the verdict is `fail`, and the CLI exits `2`. The trace
|
|
333
330
|
`reason` and optional `stopCause` say which limit ended the session.
|
|
334
|
-
- **`timed_out`**: the deadline was reached with
|
|
331
|
+
- **`timed_out`**: the deadline was reached with zero material actions (a hung provider, an
|
|
335
332
|
idle-only stall). This maps to `ActorStatus: "timed_out"`, `participantOutcomeOk` is false, the
|
|
336
333
|
verdict is `timed_out`, and the CLI exits `2`.
|
|
337
334
|
|
|
@@ -342,7 +339,7 @@ switch with no default, so a new completion reason forces a compile-time decisio
|
|
|
342
339
|
status. ~30 min (`1_800_000`) is a reasonable default for open-ended watch; the persona
|
|
343
340
|
still stops early on `goal_satisfied`/`gave_up`/`stopWhen`.
|
|
344
341
|
|
|
345
|
-
Actuation-vs-spend gate: on the scripted
|
|
342
|
+
Actuation-vs-spend gate: on the scripted route `mode: live` is still required
|
|
346
343
|
even though provider spend is $0 by mechanism. The gate's justification there is actuation,
|
|
347
344
|
not cost: a live scripted run drives a real browser against a real running app
|
|
348
345
|
(state-mutating effects on the operator's app), which deserves the same affirmative
|
|
@@ -351,8 +348,8 @@ this paragraph is the record of that decision.
|
|
|
351
348
|
|
|
352
349
|
## Optional closing report
|
|
353
350
|
|
|
354
|
-
`
|
|
355
|
-
`stopWhen` or dwell stop. It returns a `
|
|
351
|
+
`ComputerUseProvider.debrief` is an optional read-only request after a structured
|
|
352
|
+
`stopWhen` or dwell stop. It returns a `ComputerUseTurn` with `closingReport` containing
|
|
356
353
|
`summary` and `frictionReports`; an empty friction list is valid. The loop rejects
|
|
357
354
|
actions, pending safety checks, and invalid report shapes. It redacts accepted
|
|
358
355
|
reports, records them in `ActorTrace.debrief`, and projects one readable message
|
|
@@ -367,39 +364,40 @@ from interaction turns, and reported usage contributes to aggregate cost.
|
|
|
367
364
|
|
|
368
365
|
The OpenAI implementation makes one request with tools disabled and structured
|
|
369
366
|
output; no HTTP or policy retries. Stateless/ZDR mode does not offer retrospective
|
|
370
|
-
reporting
|
|
371
|
-
|
|
367
|
+
reporting: its client-carried conversation summarizes its oldest turns past a token
|
|
368
|
+
budget, so it may not hold the whole session a retrospective report needs. The
|
|
369
|
+
[paired live receipt](https://github.com/danielgwilson/humanish/blob/main/docs/evidence/computer-use/structured-closing-report-2026-09-05.md)
|
|
372
370
|
records both report recovery and control failures in the separate legacy parser.
|
|
373
371
|
|
|
374
|
-
## The state-driven executor seam
|
|
372
|
+
## The state-driven executor seam
|
|
375
373
|
|
|
376
|
-
The `
|
|
374
|
+
The `ComputerUseExecutor` / `ComputerUseProvider` ports are the concrete realization of the "plural harnesses /
|
|
377
375
|
transport-agnostic" intent above: the computer-use loop does not require a screen or a vision
|
|
378
376
|
model. A library caller can drive an **already-running local app** through its in-process JS
|
|
379
|
-
contract (`window.app.getState()` etc.) with a custom `
|
|
380
|
-
`appState` as the progress signal) paired with a **non-vision** `
|
|
381
|
-
falsey), keeping the whole
|
|
377
|
+
contract (`window.app.getState()` etc.) with a custom `ComputerUseExecutor` (screenshot optional,
|
|
378
|
+
`appState` as the progress signal) paired with a **non-vision** `ComputerUseProvider` (`requiresFrame`
|
|
379
|
+
falsey), keeping the whole study composition with no E2B desktop and no clone. See
|
|
382
380
|
[`state-driven-executor.md`](./state-driven-executor.md) for the port, both entry points
|
|
383
|
-
(`runComputerUseLoop` and `
|
|
381
|
+
(`runComputerUseLoop` and `runStudy` + `inProcess`/`createProvider`), the `subject.source:
|
|
384
382
|
local-app` config surface, the `requiresFrame` provider-authoring contract, and the
|
|
385
383
|
appState-is-runtime-only stance.
|
|
386
384
|
|
|
387
|
-
## The product-adapter extension seam
|
|
385
|
+
## The product-adapter extension seam
|
|
388
386
|
|
|
389
|
-
The terminal-product route
|
|
390
|
-
attaches product-specific scoring + feedback as a
|
|
387
|
+
The terminal-product route has a product-adapter extension seam: a product adopter
|
|
388
|
+
attaches product-specific scoring + feedback as a thin in-repo extension without forking
|
|
391
389
|
core. The seam is exported contract types (`RunBundle`, `RunFeedbackCandidate`,
|
|
392
390
|
`RunAdapterScore`, `ActorTrace`, `AdapterScorerModule` and the terminal-route
|
|
393
|
-
`TerminalProductScoringContext`) plus a registrable scorer module, `
|
|
391
|
+
`TerminalProductScoringContext`) plus a registrable scorer module, `RunStudyOptions.scorer`,
|
|
394
392
|
with optional `score` and `deriveFeedback`. The older `terminalHooks` and `cuaHooks` bags were
|
|
395
|
-
removed from `
|
|
396
|
-
under an adapter-
|
|
393
|
+
removed from `RunStudyOptions`. The adapter records its product nouns only
|
|
394
|
+
under an adapter-namespaced block (`RunFeedbackCandidate.adapter` /
|
|
397
395
|
`RunAdapterScore.{namespace,data}`), so core's enums stay product-agnostic: no adopter noun
|
|
398
396
|
is hardcoded into a core enum. Default (no hook) behavior is unchanged. See
|
|
399
|
-
[`terminal-product-route.md`](./terminal-product-route.md#
|
|
397
|
+
[`terminal-product-route.md`](./terminal-product-route.md#the-product-adapter-extension-seam)
|
|
400
398
|
for the full seam and the thin-adapter conformance proof.
|
|
401
399
|
|
|
402
|
-
## Making personas
|
|
400
|
+
## Making personas change the actor's behavior
|
|
403
401
|
|
|
404
402
|
The original bug, now fixed: `loadDryRunInputs` (`src/run/dry-run-inputs.ts`) parsed
|
|
405
403
|
persona YAML down to `{ id, name, source, sourceDigest }` and discarded `summary`,
|
|
@@ -411,7 +409,7 @@ Plan:
|
|
|
411
409
|
|
|
412
410
|
1. **Parse the whole persona** into a `ResolvedPersona`: `{ id, name, summary, goals[],
|
|
413
411
|
traits: { patience, skill, accessibilityNeeds? }, constraints[], sourceDigest }` (map
|
|
414
|
-
`technical_confidence` to `skill`). The shipped shape in `src/
|
|
412
|
+
`technical_confidence` to `skill`). The shipped shape in `src/study/persona.ts` has no
|
|
415
413
|
`goals`, adds `background`, and makes every trait optional.
|
|
416
414
|
2. **Compile traits into actor-neutral directives**, not prose, via a pure
|
|
417
415
|
`personaToDirectives(p)`:
|
|
@@ -437,7 +435,7 @@ traits: { patience, skill, accessibilityNeeds? }, constraints[], sourceDigest }`
|
|
|
437
435
|
candidate. The harness imposes no turn cap; its hard stops are the wall-clock
|
|
438
436
|
`timeoutMs` and declared spend caps.
|
|
439
437
|
4. **Bind the same directives per harness.** `renderPersonaPromptSection`
|
|
440
|
-
(`src/
|
|
438
|
+
(`src/study/persona.ts`) renders the directives as one prompt section, and each harness puts
|
|
441
439
|
that section where its model reads standing instructions:
|
|
442
440
|
- Computer use: `composeParticipantInstructions`
|
|
443
441
|
(`src/routes/computer-use/participant-prompt.ts`) opens the participant instructions
|
|
@@ -459,7 +457,7 @@ traits: { patience, skill, accessibilityNeeds? }, constraints[], sourceDigest }`
|
|
|
459
457
|
- Stagehand remains roadmap. This rule once planned a pi binding (`systemPrompt` +
|
|
460
458
|
`beforeToolCall`) and a Claude Agent SDK one (`systemPrompt` + `allowedTools`). pi
|
|
461
459
|
shipped only as a trace mapper, the Claude Agent SDK descriptor never had a route, and
|
|
462
|
-
|
|
460
|
+
both were removed.
|
|
463
461
|
|
|
464
462
|
None of these uses a `max_turns`-style cap as the persona stop condition.
|
|
465
463
|
|
|
@@ -467,7 +465,7 @@ traits: { patience, skill, accessibilityNeeds? }, constraints[], sourceDigest }`
|
|
|
467
465
|
`persona-fidelity` verify check asserts that the friction and accessibility directives
|
|
468
466
|
reached the actor input and that a `gave_up` run cites a concrete friction reason (not a
|
|
469
467
|
turn count). "Did the persona drive the run" becomes a verifiable artifact. (Status
|
|
470
|
-
2026-06-11: `personaToDirectives` shipped in `src/
|
|
468
|
+
2026-06-11: `personaToDirectives` shipped in `src/study/persona.ts` and `traitsApplied` is
|
|
471
469
|
threaded on the codex-exec terminal route, but the `persona-fidelity` verify check is
|
|
472
470
|
not-yet-shipped roadmap. The computer-use route records `persona.traitsApplied` from the
|
|
473
471
|
resolved persona in `src/routes/computer-use/participant-prompt.ts`.)
|
|
@@ -513,7 +511,7 @@ Non-obvious tradeoffs to revisit with real-run data:
|
|
|
513
511
|
- `persona-fidelity` treats a `gave_up` with no cited friction as a fidelity
|
|
514
512
|
failure, not an accepted stop, so the model cannot quietly quit for no reason.
|
|
515
513
|
|
|
516
|
-
|
|
514
|
+
So patience decides when a run stops, reproducibly, without ever using elapsed
|
|
517
515
|
turns as a stop signal.
|
|
518
516
|
|
|
519
517
|
## Capability matrix (target adapters)
|
|
@@ -525,41 +523,12 @@ turns as a stop signal.
|
|
|
525
523
|
| claude-agent-sdk (removed) | yes (SDK + `-p` stream-json) | typed ToolUse/ToolResult + cost | OS sandbox + dontAsk/allowedTools | Anthropic-centric | SDK MIT (CLI proprietary) | code, app |
|
|
526
524
|
| stagehand-cua (roadmap, not shipped; `openai-computer-use` is the shipped computer-use actor) | yes (SDK, mode:'cua') | structured results + replay | Playwright/Browserbase isolation | OpenAI/Anthropic/Google | MIT | computer-use |
|
|
527
525
|
|
|
528
|
-
## Sequencing
|
|
529
|
-
|
|
530
|
-
1. This document.
|
|
531
|
-
2. Shared `RedactionHooks` module (completes the remaining #107 criterion) plus
|
|
532
|
-
the `Actor` contract types, with the Codex integration refactored to implement
|
|
533
|
-
`Actor` and emit `ActorTrace` behind the back-compat alias. Add an
|
|
534
|
-
`actorRegistry`; generalize `RunStream.codex` to `RunStream.actor`.
|
|
535
|
-
3. Personas load-bearing: `ResolvedPersona`, `personaToDirectives`, harness turn
|
|
536
|
-
budget, and the `persona-fidelity` verify check.
|
|
537
|
-
4. `pi-agent-core` adapter (proves the contract against a non-Codex protocol;
|
|
538
|
-
local-model dogfood for ~$0). Landed in two slices: first the pure
|
|
539
|
-
`piSessionToActorTrace` mapper + registry generalization (discriminated
|
|
540
|
-
`ActorDescriptor` union + `getActor` overloads) + a fixture conformance test,
|
|
541
|
-
with no pi dependency and no model key required (proves the evidence contract
|
|
542
|
-
is provider-neutral); then a follow-up live SDK shim behind a DI seam, deferred
|
|
543
|
-
until the package identity (`@earendil-works/pi-agent-core` vs
|
|
544
|
-
`@mariozechner/pi-coding-agent`) and the Node `>=22.19` vs engines `>=20` gap
|
|
545
|
-
are pinned against an installed build. The live shim never landed, and #955
|
|
546
|
-
removed the mapper-only descriptor because no route dispatched it.
|
|
547
|
-
5. `claude-agent-sdk` adapter (the `app` run kind). It shipped as a descriptor with
|
|
548
|
-
a live session but no route, and #955 removed it along with the `app` run kind.
|
|
549
|
-
6. Computer-use route. (Shipped as `openai-computer-use`: registered 0.3.0,
|
|
550
|
-
lab-dispatched 0.4.0; `stagehand-cua` as a multi-provider front remains
|
|
551
|
-
not-yet-shipped roadmap.)
|
|
552
|
-
7. Cross-harness conformance test: one persona x scenario through every adapter,
|
|
553
|
-
asserting identical trace shape, completion vocabulary, and redaction status.
|
|
554
|
-
8. The proof point: run the harness-plural loop against popular OSS repos and turn
|
|
555
|
-
real, merged issues into the receipt.
|
|
556
|
-
|
|
557
526
|
## Risks
|
|
558
527
|
|
|
559
528
|
- Protocol/version drift across four moving harnesses. Pin every binary/SDK and
|
|
560
529
|
assert the init handshake; the registry refuses an actor whose declared
|
|
561
530
|
capabilities do not satisfy the scenario.
|
|
562
|
-
- Screenshot PII in the computer-use route. Redaction binds the
|
|
531
|
+
- Screenshot PII in the computer-use route. Redaction binds the publish
|
|
563
532
|
boundary, not capture (0.6.0): raw frames stay local in gitignored
|
|
564
533
|
`.humanish/` and are never emitted by a publish command (this repo's CI
|
|
565
534
|
binary-asset scan also blocks them from commit);
|
|
@@ -578,4 +547,4 @@ turns as a stop signal.
|
|
|
578
547
|
|
|
579
548
|
- Self-driving harness principles: `docs/principles/self-driving-harness.md`.
|
|
580
549
|
- Observer architecture: `docs/architecture/observer.md`.
|
|
581
|
-
-
|
|
550
|
+
- Open issue: [a PII/PHI detector for the redaction gate](https://github.com/danielgwilson/humanish/issues/108).
|
|
@@ -61,7 +61,7 @@ admission. There is no generic CDP, command, file, navigation-management, or
|
|
|
61
61
|
runtime-management method. Initial target navigation remains an adapter-owned
|
|
62
62
|
operation.
|
|
63
63
|
|
|
64
|
-
Replies acknowledge completion or contain a finite `
|
|
64
|
+
Replies acknowledge completion or contain a finite `ComputerUseExecutorError` code and
|
|
65
65
|
`not_dispatched` / `outcome_uncertain` disposition. They never include raw
|
|
66
66
|
exception prose, typed text, page URLs, or browser errors in their error fields.
|
|
67
67
|
A generic driver exception after invocation is uncertain; only a genuine typed
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Independent computer-use participants, on hosted E2B desktops and local Firecracker
|
|
4
4
|
desktops, acquire an owned desktop allocation before subject setup, then bind its
|
|
5
|
-
executor after browser setup. The participant loop still consumes `
|
|
5
|
+
executor after browser setup. The participant loop still consumes `ComputerUseExecutor`;
|
|
6
6
|
provisioning commands stay in the desktop adapter. This internal interface is not
|
|
7
7
|
a public runtime plugin API.
|
|
8
8
|
|
|
@@ -45,7 +45,7 @@ span, not a provider billing measurement.
|
|
|
45
45
|
2. The runner starts its model session and signals the existing hosted pipeline
|
|
46
46
|
gate, preserving the current scheduling order.
|
|
47
47
|
3. `openSession()` measures initial browser geometry, starts the optional live
|
|
48
|
-
stream, and supplies a `
|
|
48
|
+
stream, and supplies a `ComputerUseExecutor` plus any participant inbox location.
|
|
49
49
|
4. The runner executes the participant loop and closes its model session.
|
|
50
50
|
5. `finalize()` collects final evidence and releases the desktop, including after
|
|
51
51
|
preparation or participant failure. Repeated calls share one finalization.
|
|
@@ -62,16 +62,16 @@ its steps in the files beside it; acquisition and release are in
|
|
|
62
62
|
`src/substrates/e2b/desktop-media.ts`. Subject provisioning lives in
|
|
63
63
|
`src/subject/` and reaches the sandbox only through a `Shell`
|
|
64
64
|
(`src/substrates/shell.ts`), which `e2bShell` (`src/substrates/e2b/shell.ts`)
|
|
65
|
-
builds from the sandbox handle. The adapter never imports the
|
|
65
|
+
builds from the sandbox handle. The adapter never imports the study runner at
|
|
66
66
|
runtime.
|
|
67
67
|
|
|
68
68
|
The runner owns instructions, model execution, spend guards, screenshots, trace
|
|
69
69
|
persistence and participant outcome interpretation. It does not invoke desktop
|
|
70
70
|
shell commands or manufacture E2B objects for an alternate executor. A local
|
|
71
71
|
Firecracker run supplies its desktops through the computer-use run's `localVm`
|
|
72
|
-
input (`LocalVmInput` in `src/routes/computer-use/types.ts`).
|
|
72
|
+
input (`LocalVmInput` in `src/routes/computer-use/types.ts`). runStudy builds that
|
|
73
73
|
input with `prepareLocalVmRun` (`src/routes/computer-use/local-vm.ts`), and no
|
|
74
|
-
package caller can set it. Contract tests pass a `localVm` desktop on a
|
|
74
|
+
package caller can set it. Contract tests pass a `localVm` desktop on a study with
|
|
75
75
|
`execution.target: local`. Neither bypasses CLI admission checks.
|
|
76
76
|
|
|
77
77
|
Final evidence errors cannot skip desktop release. Existing bundle fields and
|
|
@@ -81,12 +81,12 @@ adapter cannot establish them.
|
|
|
81
81
|
|
|
82
82
|
Independent hosted browser and terminal participants, local Firecracker participants, and
|
|
83
83
|
shared-world participants that use `runCuaParticipant` use this boundary. Local execution is
|
|
84
|
-
described in [local browser studies](local-browser
|
|
84
|
+
described in [local browser studies](https://humanish.dev/docs/local-browser).
|
|
85
85
|
|
|
86
86
|
The `runSession` testing hook for independent participants now receives a constructed
|
|
87
87
|
`executor` instead of `desktop`/`executorOptions`. A hook should consume the
|
|
88
88
|
normal `CuaActorSessionOptions` executor or delegate to the internal
|
|
89
89
|
`runCuaActorSession`. The `runCuaActorSession` export was removed in 0.107.0; a
|
|
90
90
|
library caller uses `runComputerUseLoop`. A custom in-process
|
|
91
|
-
executor now goes through `
|
|
91
|
+
executor now goes through `RunStudyOptions.inProcess`, which replaces the
|
|
92
92
|
removed `cuaHooks.buildExecutor`.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# External-public shared
|
|
1
|
+
# External-public shared world and the lobby-code handoff
|
|
2
2
|
|
|
3
|
-
The
|
|
3
|
+
The shared-world route has two plane classes. This note documents the new
|
|
4
4
|
`external-public` class and the host-first handoff barrier that makes cross-persona coordination on a
|
|
5
5
|
real public app possible without any persona-to-persona messaging.
|
|
6
6
|
|
|
@@ -8,36 +8,36 @@ real public app possible without any persona-to-persona messaging.
|
|
|
8
8
|
|
|
9
9
|
| | provisioned-getHost (historical) | external-public (new) |
|
|
10
10
|
| ------------------- | -------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
|
|
11
|
-
| Shared plane | a `clone`/`local-tree` subject served + `getHost`-exposed
|
|
12
|
-
| Harness role |
|
|
11
|
+
| Shared plane | a `clone`/`local-tree` subject served + `getHost`-exposed in-sandbox | a real operator-owned public deployment (`source: app-url`) used directly |
|
|
12
|
+
| Harness role | Minted and controls the host URL | Observes that the participants converged on one origin (tolerant of a declared→observed redirect) |
|
|
13
13
|
| Subject sandbox | one (headless service host) + N actor desktops | none; only N actor desktops |
|
|
14
14
|
| Attestation | `subject.exposure: synthetic` (synthetic seeded data) | `subject.publicTarget: { owner, authorized }` (you own/operate it) |
|
|
15
15
|
| Provenance | `subject.state.provenance == seeded` | `subject.state.provenance == external-public` |
|
|
16
16
|
| Plane identity | `plane.hostDigest`; every `routeHostDigest == it` (harness-minted) | `plane.publicOriginDigest`; every CDP-observed `routeHostDigest == it` (observed) |
|
|
17
|
-
| Shared-state proof | authoritative in-sandbox checkpoint `stateSeries` + delta-on-pass | none; `stateSeries`
|
|
18
|
-
| Concurrency-on-pass | ≥2 overlapping windows
|
|
17
|
+
| Shared-state proof | authoritative in-sandbox checkpoint `stateSeries` + delta-on-pass | none; `stateSeries` omitted (Option A) |
|
|
18
|
+
| Concurrency-on-pass | ≥2 overlapping windows and a state delta at/after an overlap start | ≥2 overlapping windows only (temporal co-occupancy) |
|
|
19
19
|
| Extra proof | none | `lobbyConvergenceDigest` (all participants on one `/lobby/CODE`) |
|
|
20
20
|
|
|
21
21
|
The run's own verdict applies the same concurrency-on-pass rule per plane (`judgeSharedWorld` in
|
|
22
|
-
`src/run/judge.ts`), so a run whose participants all passed but missed it reads fail and the
|
|
22
|
+
`src/run/judge.ts`), so a run whose participants all passed but missed it reads fail and the study exits
|
|
23
23
|
non-zero.
|
|
24
24
|
|
|
25
25
|
In short: getHost = harness-minted host + synthetic-seeded attestation + authoritative
|
|
26
|
-
in-sandbox checkpoint `stateSeries`. external-public = operator-attested public origin +
|
|
27
|
-
claim +
|
|
28
|
-
observed lobby-path convergence only). Every downgrade is asserted-
|
|
29
|
-
dropped: `plane.exposure`
|
|
30
|
-
`plane.hostDigest`
|
|
31
|
-
external-public
|
|
32
|
-
|
|
33
|
-
Why the getHost synthetic gate is deliberately
|
|
34
|
-
(`concurrentSharedWorldValidationReason` in `src/
|
|
26
|
+
in-sandbox checkpoint `stateSeries`. external-public = operator-attested public origin + no synthetic
|
|
27
|
+
claim + no authoritative shared-state proof (concurrency evidenced by temporal co-occupancy +
|
|
28
|
+
observed lobby-path convergence only). Every downgrade is asserted-absent by verify, never silently
|
|
29
|
+
dropped: `plane.exposure` must be absent (claiming synthetic on a real site is a lie),
|
|
30
|
+
`plane.hostDigest` must be absent, the `seeded`/`synthetic` attribution limits are forbidden, and the
|
|
31
|
+
external-public disclosure limits are required.
|
|
32
|
+
|
|
33
|
+
Why the getHost synthetic gate is deliberately not reachable from the app-url branch: that gate
|
|
34
|
+
(`concurrentSharedWorldValidationReason` in `src/study/validation.ts` requires `subject.exposure:
|
|
35
35
|
synthetic`, a `0.0.0.0` bind and no `keep`; verify's `getHostPlaneFindings` in
|
|
36
36
|
`src/verify/shared-world-concurrent.ts` then requires `plane.exposure == synthetic` and
|
|
37
|
-
`subject.state.provenance == seeded`) exists because a getHost URL is internet-reachable
|
|
37
|
+
`subject.state.provenance == seeded`) exists because a getHost URL is internet-reachable and
|
|
38
38
|
harness-owned; real data behind a harness-exposed URL is the hazard. A public site the harness
|
|
39
|
-
neither provisioned nor exposed has
|
|
40
|
-
app-url branch is validated by `externalPublicSharedWorldValidationReason` (`src/
|
|
39
|
+
neither provisioned nor exposed has neither property, so the gate's hazard does not exist there. The
|
|
40
|
+
app-url branch is validated by `externalPublicSharedWorldValidationReason` (`src/study/validation.ts`)
|
|
41
41
|
and is reached before the getHost gate; a snapshot regression test pins the getHost path
|
|
42
42
|
byte-unchanged.
|
|
43
43
|
|
|
@@ -48,19 +48,21 @@ Reading a participant's live URL mid-run is already implemented: `makeChromeBrow
|
|
|
48
48
|
(`src/substrates/e2b/cdp-probe.ts`) that resolves the participant's Chrome CDP port, selects the participant's
|
|
49
49
|
page, and sends `Runtime.evaluate({ url: location.href, title, text })` over the page's
|
|
50
50
|
`webSocketDebuggerUrl`. `createE2BDesktopExecutor` stamps `observation.url` from it every turn.
|
|
51
|
-
`CuaObservation.url` is
|
|
51
|
+
`CuaObservation.url` is runtime-only by contract (it drives `stopWhen`/progress but is never
|
|
52
52
|
persisted raw into the trace).
|
|
53
53
|
|
|
54
|
-
The
|
|
55
|
-
after every `executor.observe()` (the initial observe and each loop observe) with
|
|
56
|
-
threaded through `CuaActorSessionOptions` → `CuaParticipantDeps` → the concurrent
|
|
57
|
-
code
|
|
58
|
-
host's code can
|
|
54
|
+
The route reads each participant's URL through one callback, `LoopTaps.onObservedUrl?(url)`,
|
|
55
|
+
invoked right after every `executor.observe()` (the initial observe and each loop observe) with
|
|
56
|
+
`observation.url`, threaded through `CuaActorSessionOptions` → `CuaParticipantDeps` → the concurrent
|
|
57
|
+
orchestrator. It adds no CDP code and needs no change to the lobby-trivia app. The CDP URL read is
|
|
58
|
+
unreliable on E2B desktops, so the host's code can also come from its narration or its screen
|
|
59
|
+
(step 2).
|
|
59
60
|
|
|
60
|
-
`onObservedUrl`, `onMessage` and `onScreenshot` are
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
61
|
+
`onObservedUrl`, `onMessage` and `onScreenshot` are internal `LoopTaps`
|
|
62
|
+
(`src/actors/computer-use/loop/types.ts`): 0.109.0 removed them from `ComputerUseLoopOptions`, and the
|
|
63
|
+
public `runComputerUseLoop` refuses them. The actor passes them through
|
|
64
|
+
`runComputerUseLoopWithTaps`. A library caller wraps the executor's `observe` (for `url` and
|
|
65
|
+
`screenshot`) or the provider's `nextTurn` (for `reasoning` and `message`).
|
|
64
66
|
|
|
65
67
|
Flow, a host-first barrier inside `runConcurrentSharedWorld`'s fan-out:
|
|
66
68
|
|
|
@@ -71,71 +73,72 @@ Flow, a host-first barrier inside `runConcurrentSharedWorld`'s fan-out:
|
|
|
71
73
|
`/\/lobby\/([A-Z2-9]{6})(?:$|[/?#])/` (a locale prefix `/en/lobby/CODE` and a query/hash suffix
|
|
72
74
|
are tolerated), a lobby code in its narration (`extractLobbyCodeFromNarration`), or a vision read
|
|
73
75
|
of its screenshot (`readLobbyCodeFromFrame`). The vision reads are out-of-band OpenAI calls, at
|
|
74
|
-
most 30 per participant, and are not counted against `
|
|
76
|
+
most 30 per participant, and are not counted against `caps.maxUsd`. The host keeps playing
|
|
75
77
|
after resolving, so its window overlaps the followers'.
|
|
76
|
-
3. **Barrier.** Follower participants (`host` absent) do
|
|
77
|
-
the latch resolves or the handoff deadline passes. On resolve,
|
|
78
|
-
follower's mission (
|
|
78
|
+
3. **Barrier.** Follower participants (`host` absent) do not compose a mission or open their target until
|
|
79
|
+
the latch resolves or the handoff deadline passes. On resolve, code is threaded into each
|
|
80
|
+
follower's mission (`…choose Join, enter lobby code {CODE}…`). It is not a raw URL navigation,
|
|
79
81
|
because a direct `/lobby/CODE` visit does not auto-join a non-member (lobby-trivia's lobby page
|
|
80
82
|
redirects unknown/non-member sessions home); the follower goes through the real Join flow.
|
|
81
83
|
4. **Convergence confirmation.** Each follower's own `onObservedUrl`, or a vision read of its own
|
|
82
84
|
frame, confirms it reached `/lobby/CODE`; this observed convergence becomes the
|
|
83
|
-
`lobbyConvergenceDigest`, the pass signal that the
|
|
84
|
-
|
|
85
|
+
`lobbyConvergenceDigest`, the pass signal that the followers reached the lobby. An instruction to
|
|
86
|
+
join does not set it. It is recorded only when every participant converged on one code.
|
|
85
87
|
5. **Fail-closed timeout.** If the host never yields a `/lobby/CODE` within the handoff deadline
|
|
86
88
|
(`min(execution.timeoutMs, max(120 s, 40% of execution.timeoutMs))`; injectable in tests), the
|
|
87
|
-
latch rejects; every follower fails closed
|
|
88
|
-
home page); the run returns `
|
|
89
|
+
latch rejects; every follower fails closed without opening (no wasted turns against a codeless
|
|
90
|
+
home page); the run returns `HUMANISH_SHARED_WORLD_HANDOFF_TIMEOUT` and the bundle
|
|
89
91
|
records the host window + a handoff-failed outcome for followers. If the host participant ends without a
|
|
90
92
|
code before the deadline, `releaseFollowersIfUnlatched` releases the followers at once and the
|
|
91
|
-
run returns `
|
|
92
|
-
reaches the lobby but whose followers fail to
|
|
93
|
-
concurrency-on-pass gate then simply won't see ≥2 overlap, and the verdict stays non-pass,
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
> **Temporary shim
|
|
97
|
-
>
|
|
98
|
-
>
|
|
99
|
-
>
|
|
100
|
-
>
|
|
93
|
+
run returns `HUMANISH_SHARED_WORLD_FAILED` with the host's reason. A host that
|
|
94
|
+
reaches the lobby but whose followers fail to join is a normal per-participant non-pass (the
|
|
95
|
+
concurrency-on-pass gate then simply won't see ≥2 overlap, and the verdict stays non-pass),
|
|
96
|
+
not a whole-run abort.
|
|
97
|
+
|
|
98
|
+
> **Temporary shim.** This CDP URL-relay handoff reads the host's `/lobby/CODE` off its own browser
|
|
99
|
+
> and threads it into the follower missions.
|
|
100
|
+
> [An open issue](https://github.com/danielgwilson/humanish/issues/296) tracks replacing it with the
|
|
101
|
+
> [actor message bus](https://github.com/danielgwilson/humanish/issues/297), where the host sends an
|
|
102
|
+
> SMS or email invite link and the followers receive and tap it. The orchestrator then no longer
|
|
103
|
+
> relays the code out of band.
|
|
101
104
|
|
|
102
105
|
## Observed-origin convergence (not declared)
|
|
103
106
|
|
|
104
|
-
The convergence proof is about what the participants
|
|
105
|
-
is the sha256-16 of the
|
|
107
|
+
The convergence proof is about what the participants observed, not what was declared. `plane.publicOriginDigest`
|
|
108
|
+
is the sha256-16 of the one origin the participants' CDP-observed final URLs converged on; verify requires every
|
|
106
109
|
`laneWindow.routeHostDigest` to agree on it. A normal cross-origin redirect (apex→www, http→https;
|
|
107
|
-
lobby-trivia.example.test 307-redirects) makes the
|
|
108
|
-
is
|
|
109
|
-
`plane.declaredOriginDigest` for reference and is
|
|
110
|
-
|
|
111
|
-
digest equality. Verify fails closed only when the participants did not converge on a single
|
|
110
|
+
lobby-trivia.example.test 307-redirects) makes the observed origin differ from the declared `subject.appUrl`, which
|
|
111
|
+
is expected and must never fail the run. So the declared origin is recorded separately as
|
|
112
|
+
`plane.declaredOriginDigest` for reference and is never asserted equal to the observed one. Operator
|
|
113
|
+
ownership rests on the `subject.publicTarget.authorized` attestation + the declared `appUrl`, not on
|
|
114
|
+
digest equality. Verify fails closed only when the participants did not converge on a single observed origin
|
|
112
115
|
(it then lists the distinct observed origin digests).
|
|
113
116
|
|
|
114
117
|
## Hygiene
|
|
115
118
|
|
|
116
|
-
The runtime `location.href` (and the 6-char
|
|
117
|
-
runtime-only; the threaded
|
|
118
|
-
field) and is scrubbed from all narration once latched; the shared origin and lobby path persist
|
|
119
|
+
The runtime `location.href` (and the 6-char code inside it) is never persisted raw: `onObservedUrl` is
|
|
120
|
+
runtime-only; the threaded code flows only into the follower's composed prompt (never a raw bundle
|
|
121
|
+
field) and is scrubbed from all narration once latched; the shared origin and lobby path persist only
|
|
119
122
|
as sha256-16 digests (`publicOriginDigest`, `lobbyConvergenceDigest`). This matches the existing
|
|
120
123
|
e2b-URL / host-digest redaction discipline.
|
|
121
124
|
|
|
122
125
|
## Mobile fidelity caveat
|
|
123
126
|
|
|
124
|
-
The example roster runs mobile-
|
|
125
|
-
the E2B-desktop route the rendered
|
|
126
|
-
Chrome refuses a narrower window and a narrower X screen
|
|
127
|
-
presets render at 500 wide and are identical in layout; only
|
|
127
|
+
The example roster runs mobile-layout participants (`device: mobile` 414×896, `small-mobile` 360×740). On
|
|
128
|
+
the E2B-desktop route the rendered width is floored to `MIN_DESKTOP_RENDER_WIDTH` (500) because
|
|
129
|
+
Chrome refuses a narrower window and a narrower X screen clips the page, so both
|
|
130
|
+
presets render at 500 wide and are identical in layout; only height renders as declared.
|
|
128
131
|
`desktopGeometry.screen.verified` compares the floored number with itself, so it does not attest the
|
|
129
|
-
preset width. There is
|
|
130
|
-
only via the CDP geometry path). "3 mobile personas" = 3 mobile-
|
|
132
|
+
preset width. There is no touch input, and `isMobile`/DPR are prompt-signal + metadata (DPR renders
|
|
133
|
+
only via the CDP geometry path). "3 mobile personas" = 3 mobile-layout desktop-Chromium participants, not
|
|
131
134
|
touch devices. Do not over-read the results as true mobile-device coverage. That describes the
|
|
132
|
-
default. With `execution.desktop.fidelity.mobileEmulation: true
|
|
135
|
+
default. With `execution.desktop.fidelity.mobileEmulation: true`, Chromium participants on a mobile
|
|
133
136
|
preset get a DevTools device-metrics override at the preset width, plus DPR, touch emulation and a
|
|
134
137
|
mobile user agent. That is still not physical-device fidelity.
|
|
135
138
|
|
|
136
139
|
## Watch-from-phone
|
|
137
140
|
|
|
138
141
|
Native live-desktop `--expose` is not supported on the concurrent path; only the computer-use
|
|
139
|
-
|
|
142
|
+
route live-serves a run (`src/cli/io.ts`). Today, watch it from a phone via `humanish observe --all
|
|
140
143
|
--expose --tunnel … --oauth …` against the run directory's Observer (the concurrent path writes
|
|
141
144
|
artifacts continuously and attaches per-participant runtime stream URLs to the live Observer).
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
# Public GitHub Feedback Loop Architecture
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
Status: design note. The v0 dry-run issue draft path is implemented locally;
|
|
6
|
-
live GitHub mutation remains out of scope.
|
|
3
|
+
This is a design note. The dry-run issue draft path ships; live GitHub mutation is out of scope.
|
|
7
4
|
|
|
8
5
|
## Goal
|
|
9
6
|
|
|
@@ -82,7 +79,7 @@ readiness, uses the labels and the `humanish_swarm` block below.
|
|
|
82
79
|
draft (`src/feedback/draft.ts`).
|
|
83
80
|
- `adapter-hardening`, `target-app-setup`, `actor-auth` and
|
|
84
81
|
`setup-quality-review`: feedback candidates that an adapter adds to the
|
|
85
|
-
bundle. `src/
|
|
82
|
+
bundle. `src/study/adapter-extension.ts` checks the value.
|
|
86
83
|
|
|
87
84
|
## Issue Body Contract
|
|
88
85
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Headed browser guest components
|
|
2
2
|
|
|
3
3
|
These internal components implement native input and full-desktop captures for the browser guest
|
|
4
|
-
that [local browser studies](local-browser
|
|
4
|
+
that [local browser studies](https://humanish.dev/docs/local-browser) run in a Firecracker VM. This page covers
|
|
5
5
|
the guest driver and its container proof; the local browser page covers the VM, its network
|
|
6
6
|
policy and the installed study.
|
|
7
7
|
|
|
@@ -96,4 +96,4 @@ native scrolling and cancellation. CI reruns this proof for changes to the guest
|
|
|
96
96
|
recipe, protocol or dependency lockfile. Its deterministic fixture is not a model participant, a
|
|
97
97
|
run bundle, a host network policy, an independent watchdog or a Linux/Mac installed study. The
|
|
98
98
|
local browser runtime is qualified separately; see [local browser
|
|
99
|
-
studies](local-browser
|
|
99
|
+
studies](https://humanish.dev/docs/local-browser).
|