humanish 0.106.1 → 0.108.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +38 -32
- package/CHANGELOG.md +28 -0
- package/CONTEXT.md +51 -41
- package/README.md +152 -174
- package/SECURITY.md +16 -26
- package/TELEMETRY.md +8 -6
- package/dist/actors/affordance.d.ts +4 -4
- package/dist/actors/affordance.js +12 -12
- package/dist/actors/agent-session.d.ts +2 -2
- package/dist/actors/agent-session.js +7 -7
- package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
- package/dist/actors/codex/app-server-actor-trace.js +1 -1
- package/dist/actors/codex/app-server-client.js +2 -1
- package/dist/actors/codex/app-server-trace.d.ts +0 -1
- package/dist/actors/codex/app-server-trace.js +1 -3
- package/dist/actors/codex/app-server-ui.js +1 -1
- package/dist/actors/codex/app-server.js +2 -1
- package/dist/actors/codex/codex-admission.d.ts +91 -0
- package/dist/actors/codex/codex-admission.js +150 -0
- package/dist/actors/codex/protocol-compat.d.ts +27 -0
- package/dist/actors/codex/protocol-compat.js +357 -0
- package/dist/actors/codex/protocol-contract.d.ts +61 -0
- package/dist/actors/codex/protocol-contract.js +471 -0
- package/dist/actors/codex/restricted-executable.d.ts +28 -4
- package/dist/actors/codex/restricted-executable.js +104 -29
- package/dist/actors/codex/restricted-launch.d.ts +9 -2
- package/dist/actors/codex/restricted-launch.js +43 -4
- package/dist/actors/codex/restricted-notifications.d.ts +101 -0
- package/dist/actors/codex/restricted-notifications.js +277 -0
- package/dist/actors/codex/restricted-participant.d.ts +30 -0
- package/dist/actors/codex/restricted-participant.js +66 -6
- package/dist/actors/codex/restricted-policy.d.ts +11 -3
- package/dist/actors/codex/restricted-policy.js +2 -2
- package/dist/actors/codex/restricted-session.d.ts +16 -3
- package/dist/actors/codex/restricted-session.js +60 -22
- package/dist/actors/codex/restricted-transport.d.ts +29 -0
- package/dist/actors/codex/restricted-transport.js +139 -27
- package/dist/actors/codex/restricted-turn.d.ts +19 -4
- package/dist/actors/codex/restricted-turn.js +43 -30
- package/dist/actors/computer-use/actor.d.ts +17 -17
- package/dist/actors/computer-use/actor.js +6 -6
- package/dist/actors/computer-use/admission-limit.d.ts +1 -1
- package/dist/actors/computer-use/admission-limit.js +1 -1
- package/dist/actors/computer-use/loop/actions.d.ts +3 -3
- package/dist/actors/computer-use/loop/actions.js +10 -10
- package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
- package/dist/actors/computer-use/loop/backstop.js +15 -13
- package/dist/actors/computer-use/loop/ending.d.ts +7 -7
- package/dist/actors/computer-use/loop/ending.js +9 -9
- package/dist/actors/computer-use/loop/observation.d.ts +2 -2
- package/dist/actors/computer-use/loop/observation.js +9 -9
- package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
- package/dist/actors/computer-use/loop/provider-call.js +1 -1
- package/dist/actors/computer-use/loop/session.js +3 -3
- package/dist/actors/computer-use/loop/spend.d.ts +2 -2
- package/dist/actors/computer-use/loop/spend.js +4 -4
- package/dist/actors/computer-use/loop/trace.js +11 -10
- package/dist/actors/computer-use/loop/types.d.ts +37 -26
- package/dist/actors/computer-use/loop/usage.js +2 -2
- package/dist/actors/computer-use/loop.js +4 -4
- package/dist/actors/computer-use/openai-context.d.ts +37 -0
- package/dist/actors/computer-use/openai-context.js +214 -0
- package/dist/actors/computer-use/openai-provider.d.ts +12 -9
- package/dist/actors/computer-use/openai-provider.js +47 -36
- package/dist/actors/computer-use/openai-requests.d.ts +36 -10
- package/dist/actors/computer-use/openai-requests.js +82 -15
- package/dist/actors/computer-use/openai-wire.d.ts +19 -7
- package/dist/actors/computer-use/openai-wire.js +36 -34
- package/dist/actors/contract.d.ts +86 -49
- package/dist/actors/contract.js +29 -23
- package/dist/actors/local-agent/claude-session.d.ts +1 -1
- package/dist/actors/local-agent/claude-session.js +10 -9
- package/dist/actors/local-agent/cli.d.ts +8 -6
- package/dist/actors/local-agent/cli.js +24 -28
- package/dist/actors/local-agent/readiness.d.ts +2 -2
- package/dist/actors/local-agent/readiness.js +4 -4
- package/dist/actors/reasoning-effort.js +6 -6
- package/dist/actors/registry.d.ts +10 -10
- package/dist/actors/registry.js +18 -17
- package/dist/actors/scripted-browser/actor.d.ts +8 -8
- package/dist/actors/scripted-browser/actor.js +16 -16
- package/dist/actors/scripted-browser/browser-command.js +1 -1
- package/dist/actors/scripted-browser/journey.js +15 -4
- package/dist/actors/scripted-browser/steps.js +19 -1
- package/dist/actors/scripted-browser/types.d.ts +12 -2
- package/dist/actors/stop-conditions.d.ts +1 -1
- package/dist/actors/stop-conditions.js +1 -3
- package/dist/analysis/automatic-completion.d.ts +13 -8
- package/dist/analysis/automatic-completion.js +14 -8
- package/dist/analysis/automatic-config.d.ts +1 -1
- package/dist/analysis/automatic-config.js +2 -2
- package/dist/analysis/automatic.d.ts +10 -4
- package/dist/analysis/automatic.js +17 -13
- package/dist/analysis/codex-config.d.ts +6 -2
- package/dist/analysis/codex-config.js +22 -14
- package/dist/analysis/diagnostics.d.ts +23 -0
- package/dist/analysis/diagnostics.js +112 -0
- package/dist/analysis/evidence-sources.js +2 -2
- package/dist/analysis/evidence.js +6 -6
- package/dist/analysis/execute.d.ts +7 -1
- package/dist/analysis/execute.js +39 -12
- package/dist/analysis/job.d.ts +8 -5
- package/dist/analysis/job.js +15 -14
- package/dist/analysis/load.d.ts +1 -1
- package/dist/analysis/load.js +5 -5
- package/dist/analysis/provider.d.ts +9 -1
- package/dist/analysis/restricted-codex.d.ts +2 -0
- package/dist/analysis/restricted-codex.js +10 -1
- package/dist/analysis/service.d.ts +2 -0
- package/dist/analysis/service.js +35 -16
- package/dist/analysis/sharing.d.ts +2 -2
- package/dist/analysis/sharing.js +5 -5
- package/dist/analysis/store-executions.d.ts +5 -5
- package/dist/analysis/store-executions.js +12 -12
- package/dist/analysis/store.d.ts +4 -4
- package/dist/analysis/store.js +13 -13
- package/dist/cli/commands/analysis-signals.d.ts +2 -1
- package/dist/cli/commands/analysis-signals.js +4 -1
- package/dist/cli/commands/analyze.js +23 -18
- package/dist/cli/commands/codex.js +9 -9
- package/dist/cli/commands/comms.js +62 -34
- package/dist/cli/commands/feedback.js +20 -21
- package/dist/cli/commands/lab-format.d.ts +5 -4
- package/dist/cli/commands/lab-format.js +35 -23
- package/dist/cli/commands/lab-route-computer-use.d.ts +0 -2
- package/dist/cli/commands/lab-route-computer-use.js +32 -21
- package/dist/cli/commands/lab-route-preview.d.ts +1 -3
- package/dist/cli/commands/lab-route-preview.js +7 -7
- package/dist/cli/commands/lab-route-run.d.ts +6 -4
- package/dist/cli/commands/lab-route-run.js +6 -2
- package/dist/cli/commands/lab-route-scripted.d.ts +0 -2
- package/dist/cli/commands/lab-route-scripted.js +0 -1
- package/dist/cli/commands/lab-route-shared-world.d.ts +0 -2
- package/dist/cli/commands/lab-route-shared-world.js +3 -4
- package/dist/cli/commands/lab-route-terminal.d.ts +0 -2
- package/dist/cli/commands/lab-route-terminal.js +0 -1
- package/dist/cli/commands/lab-run.js +84 -54
- package/dist/cli/commands/lab-scorer.d.ts +2 -4
- package/dist/cli/commands/lab-scorer.js +1 -1
- package/dist/cli/commands/migrate.d.ts +4 -0
- package/dist/cli/commands/migrate.js +65 -0
- package/dist/cli/commands/observe.js +168 -107
- package/dist/cli/commands/run-command.d.ts +10 -0
- package/dist/cli/commands/run-command.js +85 -0
- package/dist/cli/commands/run-signals.d.ts +30 -0
- package/dist/cli/commands/run-signals.js +146 -0
- package/dist/cli/commands/runs.js +137 -136
- package/dist/cli/commands/setup.d.ts +2 -2
- package/dist/cli/commands/setup.js +26 -21
- package/dist/cli/commands/study.d.ts +3 -0
- package/dist/cli/commands/study.js +182 -0
- package/dist/cli/commands/tui.d.ts +4 -4
- package/dist/cli/commands/tui.js +21 -21
- package/dist/cli/commands/watch.js +64 -77
- package/dist/cli/deprecations.d.ts +18 -0
- package/dist/cli/deprecations.js +48 -0
- package/dist/cli/doctor.d.ts +18 -5
- package/dist/cli/doctor.js +111 -48
- package/dist/cli/first-run-path.d.ts +12 -10
- package/dist/cli/first-run-path.js +30 -28
- package/dist/cli/io.d.ts +46 -10
- package/dist/cli/io.js +109 -30
- package/dist/cli/observer-follow.d.ts +2 -2
- package/dist/cli/observer-follow.js +5 -6
- package/dist/cli/orientation.d.ts +6 -3
- package/dist/cli/orientation.js +43 -39
- package/dist/cli/product-sentence.d.ts +6 -0
- package/dist/cli/product-sentence.js +6 -0
- package/dist/cli/program.d.ts +6 -1
- package/dist/cli/program.js +112 -43
- package/dist/cli/telemetry.d.ts +17 -17
- package/dist/cli/telemetry.js +49 -41
- package/dist/cli.js +1 -1
- package/dist/comms/capture-surface.d.ts +14 -13
- package/dist/comms/capture-surface.js +23 -22
- package/dist/comms/catch-host.d.ts +8 -8
- package/dist/comms/catch-host.js +14 -14
- package/dist/comms/connections.js +4 -4
- package/dist/comms/email-catch.d.ts +3 -3
- package/dist/comms/email-catch.js +8 -8
- package/dist/comms/external-evidence.d.ts +27 -0
- package/dist/comms/external-evidence.js +93 -0
- package/dist/comms/extract.js +2 -2
- package/dist/comms/fake-inbox.d.ts +2 -2
- package/dist/comms/fake-inbox.js +2 -2
- package/dist/comms/lease-store.js +7 -7
- package/dist/comms/receiving-render.d.ts +1 -1
- package/dist/comms/receiving-render.js +2 -2
- package/dist/comms/sandbox-catch-script.d.ts +6 -6
- package/dist/comms/sandbox-catch-script.js +6 -6
- package/dist/comms/sandbox-catch.d.ts +36 -37
- package/dist/comms/sandbox-catch.js +34 -35
- package/dist/comms/setup.js +42 -8
- package/dist/comms/thread-evidence.d.ts +1 -1
- package/dist/comms/thread-evidence.js +6 -6
- package/dist/comms/types.d.ts +6 -6
- package/dist/comms/types.js +4 -4
- package/dist/evidence/browser-hygiene.d.ts +1 -1
- package/dist/evidence/browser-hygiene.js +1 -1
- package/dist/evidence/frame-signature.d.ts +1 -1
- package/dist/evidence/frame-signature.js +4 -4
- package/dist/evidence/redaction.d.ts +3 -3
- package/dist/evidence/redaction.js +5 -5
- package/dist/evidence/secret-scrub.d.ts +9 -0
- package/dist/evidence/secret-scrub.js +96 -0
- package/dist/feedback/draft.js +41 -85
- package/dist/feedback/export-bundle.js +5 -5
- package/dist/feedback/export.d.ts +5 -1
- package/dist/feedback/export.js +16 -17
- package/dist/feedback/feedback.d.ts +3 -3
- package/dist/feedback/feedback.js +21 -3
- package/dist/guest/chromium-text.js +2 -2
- package/dist/guest/desktop-native.d.ts +1 -1
- package/dist/guest/runtime.js +1 -1
- package/dist/index.d.ts +14 -15
- package/dist/index.js +10 -11
- package/dist/keys/key-resolution.d.ts +7 -5
- package/dist/keys/key-resolution.js +40 -38
- package/dist/lab/adapter-extension.d.ts +35 -13
- package/dist/lab/adapter-extension.js +50 -134
- package/dist/lab/adapter-scorer-loader.d.ts +32 -12
- package/dist/lab/adapter-scorer-loader.js +56 -32
- package/dist/lab/composition-rules.js +58 -58
- package/dist/lab/config.js +85 -43
- package/dist/lab/deprecated-fields.d.ts +10 -0
- package/dist/lab/deprecated-fields.js +24 -0
- package/dist/lab/device-presets.d.ts +10 -10
- package/dist/lab/device-presets.js +11 -11
- package/dist/lab/discover.d.ts +13 -9
- package/dist/lab/discover.js +118 -60
- package/dist/lab/doctor.d.ts +53 -11
- package/dist/lab/doctor.js +193 -47
- package/dist/lab/init-plan.js +1 -3
- package/dist/lab/init-templates.js +147 -147
- package/dist/lab/init.d.ts +1 -1
- package/dist/lab/init.js +41 -9
- package/dist/lab/keys.d.ts +2 -0
- package/dist/lab/keys.js +43 -9
- package/dist/lab/lab-deps.d.ts +80 -0
- package/dist/lab/lab-deps.js +4 -0
- package/dist/lab/parse/actors.js +17 -16
- package/dist/lab/parse/comms.js +8 -7
- package/dist/lab/parse/execution.js +15 -14
- package/dist/lab/parse/study-v3.d.ts +23 -0
- package/dist/lab/parse/study-v3.js +259 -0
- package/dist/lab/parse/subject-state.d.ts +7 -7
- package/dist/lab/parse/subject-state.js +18 -17
- package/dist/lab/parse/subject.js +30 -29
- package/dist/lab/parse/values.d.ts +1 -2
- package/dist/lab/parse/values.js +3 -6
- package/dist/lab/persona-resolve.d.ts +7 -7
- package/dist/lab/persona-resolve.js +8 -8
- package/dist/lab/persona.js +1 -3
- package/dist/lab/plan-base.d.ts +0 -2
- package/dist/lab/plan-base.js +6 -4
- package/dist/lab/plan-participants.d.ts +7 -7
- package/dist/lab/plan-participants.js +2 -2
- package/dist/lab/plan-types.d.ts +26 -8
- package/dist/lab/plan.d.ts +4 -18
- package/dist/lab/plan.js +24 -79
- package/dist/lab/preflight-probes.js +11 -11
- package/dist/lab/preflight-result.d.ts +2 -1
- package/dist/lab/preflight-result.js +5 -6
- package/dist/lab/preflight.d.ts +7 -8
- package/dist/lab/preflight.js +6 -6
- package/dist/lab/requirements.d.ts +20 -0
- package/dist/lab/requirements.js +54 -0
- package/dist/lab/route-inputs.d.ts +23 -12
- package/dist/lab/route-inputs.js +48 -51
- package/dist/lab/routing.d.ts +42 -41
- package/dist/lab/routing.js +66 -68
- package/dist/lab/run-lab-events.d.ts +3 -11
- package/dist/lab/run-lab-events.js +2 -16
- package/dist/lab/run-lab-homes.d.ts +76 -0
- package/dist/lab/run-lab-homes.js +7 -0
- package/dist/lab/run-lab-options.d.ts +12 -66
- package/dist/lab/run-lab-options.js +58 -285
- package/dist/lab/summary.d.ts +15 -9
- package/dist/lab/summary.js +24 -17
- package/dist/lab/tasks.d.ts +15 -15
- package/dist/lab/tasks.js +14 -14
- package/dist/lab/types.d.ts +201 -195
- package/dist/lab/types.js +2 -0
- package/dist/lab/validation.d.ts +21 -21
- package/dist/lab/validation.js +61 -59
- package/dist/lab/warnings.d.ts +10 -0
- package/dist/lab/warnings.js +70 -41
- package/dist/library-aliases.d.ts +56 -0
- package/dist/library-aliases.js +22 -0
- package/dist/observer/artifact.d.ts +2 -2
- package/dist/observer/artifact.js +9 -9
- package/dist/observer/data.d.ts +6 -6
- package/dist/observer/data.js +7 -6
- package/dist/observer/exposure.d.ts +1 -1
- package/dist/observer/exposure.js +11 -11
- package/dist/observer/http.js +1 -1
- package/dist/observer/library.d.ts +1 -1
- package/dist/observer/library.js +4 -2
- package/dist/observer/listen.js +5 -4
- package/dist/observer/render.d.ts +1 -1
- package/dist/observer/render.js +12 -7
- package/dist/observer/run-routes.d.ts +4 -4
- package/dist/observer/run-routes.js +6 -6
- package/dist/observer/serve.d.ts +17 -0
- package/dist/observer/serve.js +41 -6
- package/dist/observer/tunnel.js +1 -1
- package/dist/observer-app.html +4 -4
- package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
- package/dist/routes/computer-use/bundle-parts.js +24 -17
- package/dist/routes/computer-use/bundle.d.ts +4 -11
- package/dist/routes/computer-use/bundle.js +12 -18
- package/dist/routes/computer-use/diagnostics.d.ts +1 -1
- package/dist/routes/computer-use/diagnostics.js +1 -1
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +11 -11
- package/dist/routes/computer-use/e2b-desktop/comms.js +24 -27
- package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
- package/dist/routes/computer-use/e2b-desktop/desktop.js +8 -11
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +16 -15
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +20 -19
- package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
- package/dist/routes/computer-use/e2b-desktop/prepare.js +40 -43
- package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/start.js +32 -30
- package/dist/routes/computer-use/e2b-desktop/state.d.ts +5 -4
- package/dist/routes/computer-use/e2b-desktop/state.js +5 -3
- package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/teardown.js +33 -20
- package/dist/routes/computer-use/external-comms.d.ts +4 -4
- package/dist/routes/computer-use/external-comms.js +19 -43
- package/dist/routes/computer-use/fanout-bundle.d.ts +3 -3
- package/dist/routes/computer-use/fanout-bundle.js +38 -42
- package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +33 -28
- package/dist/routes/computer-use/in-process-desktop.d.ts +3 -10
- package/dist/routes/computer-use/in-process-desktop.js +3 -9
- package/dist/routes/computer-use/live-flush.d.ts +7 -5
- package/dist/routes/computer-use/live-flush.js +20 -28
- package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +4 -2
- package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +17 -16
- package/dist/routes/computer-use/local-tree-pack.d.ts +3 -3
- package/dist/routes/computer-use/local-tree-pack.js +4 -5
- package/dist/routes/computer-use/local-vm.d.ts +11 -8
- package/dist/routes/computer-use/local-vm.js +40 -67
- package/dist/routes/computer-use/participant-desktop.d.ts +8 -23
- package/dist/routes/computer-use/participant-desktop.js +5 -25
- package/dist/routes/computer-use/{lanes.d.ts → participant-execution.d.ts} +11 -11
- package/dist/routes/computer-use/{lanes.js → participant-execution.js} +39 -26
- package/dist/routes/computer-use/participant-facts.d.ts +7 -1
- package/dist/routes/computer-use/participant-facts.js +12 -1
- package/dist/routes/computer-use/participant-model.d.ts +25 -11
- package/dist/routes/computer-use/participant-model.js +76 -34
- package/dist/routes/computer-use/participant-prompt.d.ts +13 -13
- package/dist/routes/computer-use/participant-prompt.js +8 -8
- package/dist/routes/computer-use/participant-runs.d.ts +11 -11
- package/dist/routes/computer-use/participant-runs.js +18 -18
- package/dist/routes/computer-use/plan.d.ts +21 -29
- package/dist/routes/computer-use/plan.js +70 -78
- package/dist/routes/computer-use/preflight.d.ts +3 -5
- package/dist/routes/computer-use/preflight.js +40 -36
- package/dist/routes/computer-use/rerun-selection.js +11 -7
- package/dist/routes/computer-use/result.d.ts +1 -1
- package/dist/routes/computer-use/result.js +48 -38
- package/dist/routes/computer-use/route.d.ts +5 -5
- package/dist/routes/computer-use/route.js +36 -33
- package/dist/routes/computer-use/self-report.d.ts +8 -8
- package/dist/routes/computer-use/self-report.js +33 -33
- package/dist/routes/computer-use/setup.d.ts +9 -15
- package/dist/routes/computer-use/setup.js +106 -83
- package/dist/routes/computer-use/single-bundle.d.ts +13 -16
- package/dist/routes/computer-use/single-bundle.js +46 -53
- package/dist/routes/computer-use/subject-projection.d.ts +6 -8
- package/dist/routes/computer-use/subject-projection.js +24 -23
- package/dist/routes/computer-use/types.d.ts +195 -238
- package/dist/routes/computer-use/types.js +21 -13
- package/dist/routes/preview.d.ts +8 -2
- package/dist/routes/preview.js +8 -5
- package/dist/routes/scripted/bundle.d.ts +5 -8
- package/dist/routes/scripted/bundle.js +23 -27
- package/dist/routes/scripted/plan.d.ts +6 -8
- package/dist/routes/scripted/plan.js +15 -13
- package/dist/routes/scripted/result.d.ts +4 -1
- package/dist/routes/scripted/result.js +15 -11
- package/dist/routes/scripted/route.js +15 -17
- package/dist/routes/scripted/scenario.d.ts +1 -1
- package/dist/routes/scripted/scenario.js +3 -3
- package/dist/routes/scripted/setup.d.ts +3 -2
- package/dist/routes/scripted/setup.js +27 -26
- package/dist/routes/scripted/subject.d.ts +8 -3
- package/dist/routes/scripted/subject.js +10 -6
- package/dist/routes/scripted/surface-records.js +4 -4
- package/dist/routes/scripted/surface-sessions.d.ts +2 -2
- package/dist/routes/scripted/surface-sessions.js +4 -4
- package/dist/routes/scripted/types.d.ts +21 -40
- package/dist/routes/scripted/types.js +2 -3
- package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +17 -16
- package/dist/routes/shared-world/bundle.d.ts +7 -7
- package/dist/routes/shared-world/bundle.js +60 -62
- package/dist/routes/shared-world/checkpoints.d.ts +5 -5
- package/dist/routes/shared-world/checkpoints.js +5 -5
- package/dist/routes/shared-world/comms.d.ts +8 -7
- package/dist/routes/shared-world/comms.js +38 -51
- package/dist/routes/shared-world/external-public.d.ts +6 -5
- package/dist/routes/shared-world/external-public.js +28 -25
- package/dist/routes/shared-world/handoff.d.ts +10 -9
- package/dist/routes/shared-world/handoff.js +89 -81
- package/dist/routes/shared-world/lobby-code.d.ts +7 -7
- package/dist/routes/shared-world/lobby-code.js +22 -22
- package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +15 -12
- package/dist/routes/shared-world/{seats.js → participant-specs.js} +65 -63
- package/dist/routes/shared-world/plan.d.ts +2 -6
- package/dist/routes/shared-world/plan.js +8 -9
- package/dist/routes/shared-world/provenance.d.ts +4 -4
- package/dist/routes/shared-world/provenance.js +4 -4
- package/dist/routes/shared-world/provisioned.d.ts +3 -2
- package/dist/routes/shared-world/provisioned.js +55 -48
- package/dist/routes/shared-world/result.js +47 -36
- package/dist/routes/shared-world/route.js +54 -57
- package/dist/routes/shared-world/setup.d.ts +6 -5
- package/dist/routes/shared-world/setup.js +16 -18
- package/dist/routes/shared-world/types.d.ts +70 -141
- package/dist/routes/shared-world/types.js +5 -5
- package/dist/routes/terminal/adapter.d.ts +10 -10
- package/dist/routes/terminal/adapter.js +32 -129
- package/dist/routes/terminal/bundle.d.ts +10 -15
- package/dist/routes/terminal/bundle.js +43 -52
- package/dist/routes/terminal/credentials.d.ts +4 -4
- package/dist/routes/terminal/credentials.js +20 -20
- package/dist/routes/terminal/dry-run.d.ts +1 -1
- package/dist/routes/terminal/dry-run.js +13 -15
- package/dist/routes/terminal/encoding.d.ts +1 -1
- package/dist/routes/terminal/encoding.js +4 -4
- package/dist/routes/terminal/ledger.d.ts +8 -8
- package/dist/routes/terminal/ledger.js +22 -22
- package/dist/routes/terminal/live-finish.d.ts +1 -2
- package/dist/routes/terminal/live-finish.js +24 -23
- package/dist/routes/terminal/live-sandbox.d.ts +3 -2
- package/dist/routes/terminal/live-sandbox.js +31 -32
- package/dist/routes/terminal/participant-text.d.ts +23 -0
- package/dist/routes/terminal/participant-text.js +165 -0
- package/dist/routes/terminal/persona.js +1 -1
- package/dist/routes/terminal/plan.d.ts +2 -6
- package/dist/routes/terminal/plan.js +23 -19
- package/dist/routes/terminal/recorder.d.ts +6 -1
- package/dist/routes/terminal/recorder.js +12 -4
- package/dist/routes/terminal/result.js +12 -12
- package/dist/routes/terminal/route.js +30 -31
- package/dist/routes/terminal/runtime.d.ts +3 -2
- package/dist/routes/terminal/runtime.js +3 -3
- package/dist/routes/terminal/sandbox.d.ts +4 -4
- package/dist/routes/terminal/sandbox.js +10 -10
- package/dist/routes/terminal/session.js +22 -19
- package/dist/routes/terminal/token-usage.d.ts +1 -1
- package/dist/routes/terminal/token-usage.js +10 -11
- package/dist/routes/terminal/trace.d.ts +7 -10
- package/dist/routes/terminal/trace.js +11 -66
- package/dist/routes/terminal/types.d.ts +104 -114
- package/dist/routes/terminal/types.js +12 -7
- package/dist/run/active-runs.d.ts +13 -0
- package/dist/run/active-runs.js +12 -0
- package/dist/run/bundle-shape.d.ts +2 -1
- package/dist/run/bundle-shape.js +7 -7
- package/dist/run/bundle.d.ts +99 -92
- package/dist/run/bundle.js +10 -8
- package/dist/run/cost-summary.js +6 -5
- package/dist/run/costs.d.ts +6 -6
- package/dist/run/costs.js +17 -11
- package/dist/run/detail.d.ts +9 -9
- package/dist/run/detail.js +10 -10
- package/dist/run/dry-run-inputs.js +1 -1
- package/dist/run/dry-run.js +23 -30
- package/dist/run/{study-files.d.ts → evidence-files.d.ts} +4 -4
- package/dist/run/{study-files.js → evidence-files.js} +5 -5
- package/dist/run/feedback-shape.js +1 -1
- package/dist/run/judge.d.ts +34 -16
- package/dist/run/judge.js +41 -14
- package/dist/run/locate.d.ts +2 -0
- package/dist/run/locate.js +3 -1
- package/dist/run/outcomes.d.ts +3 -3
- package/dist/run/outcomes.js +3 -3
- package/dist/run/participant-records.d.ts +2 -2
- package/dist/run/participant-records.js +2 -2
- package/dist/run/paths.d.ts +1 -1
- package/dist/run/paths.js +2 -2
- package/dist/run/pricing.d.ts +30 -15
- package/dist/run/pricing.js +49 -30
- package/dist/run/projection.d.ts +27 -27
- package/dist/run/projection.js +23 -23
- package/dist/run/reclaim.d.ts +6 -0
- package/dist/run/reclaim.js +15 -5
- package/dist/run/results.d.ts +5 -5
- package/dist/run/run-index.d.ts +9 -7
- package/dist/run/run-index.js +24 -25
- package/dist/run/run-not-found.d.ts +5 -0
- package/dist/run/run-not-found.js +15 -0
- package/dist/run/run.d.ts +7 -4
- package/dist/run/run.js +10 -6
- package/dist/run/sandbox-receipts.d.ts +5 -5
- package/dist/run/sandbox-receipts.js +6 -6
- package/dist/run/shared-world-evidence.d.ts +67 -66
- package/dist/run/shared-world-evidence.js +4 -4
- package/dist/run/shared-world-shape.d.ts +3 -3
- package/dist/run/shared-world-shape.js +16 -16
- package/dist/run/stats.d.ts +17 -11
- package/dist/run/stats.js +124 -66
- package/dist/run/status.d.ts +21 -32
- package/dist/run/status.js +34 -33
- package/dist/run/stored-runs.js +2 -1
- package/dist/run/stream-shape.js +1 -1
- package/dist/run/streams.d.ts +29 -22
- package/dist/run/study-provenance.d.ts +47 -0
- package/dist/run/study-provenance.js +63 -0
- package/dist/run/study-result.d.ts +16 -0
- package/dist/run/study-result.js +9 -0
- package/dist/run/terminal-contract.d.ts +5 -5
- package/dist/run/terminal-contract.js +4 -4
- package/dist/run/text.d.ts +2 -0
- package/dist/run/text.js +4 -0
- package/dist/run/transient-comms-secrets.d.ts +5 -0
- package/dist/run/transient-comms-secrets.js +12 -0
- package/dist/run-lab.d.ts +40 -38
- package/dist/run-lab.js +42 -40
- package/dist/study/convert.d.ts +33 -0
- package/dist/study/convert.js +432 -0
- package/dist/study/field-paths.d.ts +12 -0
- package/dist/study/field-paths.js +126 -0
- package/dist/study/files.d.ts +26 -0
- package/dist/study/files.js +43 -0
- package/dist/study/migrate.d.ts +48 -0
- package/dist/study/migrate.js +408 -0
- package/dist/study/owned-files.d.ts +38 -0
- package/dist/study/owned-files.js +182 -0
- package/dist/subject/clone.d.ts +1 -1
- package/dist/subject/desktop-cli.d.ts +2 -2
- package/dist/subject/desktop-cli.js +3 -3
- package/dist/subject/local-tree-archive.d.ts +1 -1
- package/dist/subject/local-tree-archive.js +5 -5
- package/dist/subject/local-tree.d.ts +3 -3
- package/dist/subject/local-tree.js +1 -1
- package/dist/subject/node-bootstrap.d.ts +1 -1
- package/dist/subject/node-bootstrap.js +4 -4
- package/dist/subject/runtime.js +10 -11
- package/dist/subject/serve.d.ts +1 -1
- package/dist/subject/serve.js +4 -4
- package/dist/subject/state.d.ts +1 -1
- package/dist/subject/steps.d.ts +8 -8
- package/dist/subject/steps.js +7 -7
- package/dist/substrates/command-failure.d.ts +3 -3
- package/dist/substrates/command-failure.js +3 -3
- package/dist/substrates/detached.d.ts +6 -6
- package/dist/substrates/detached.js +7 -7
- package/dist/substrates/e2b/cdp-probe.d.ts +11 -11
- package/dist/substrates/e2b/cdp-probe.js +15 -18
- package/dist/substrates/e2b/desktop-browser.d.ts +5 -5
- package/dist/substrates/e2b/desktop-browser.js +12 -12
- package/dist/substrates/e2b/desktop-cdp.d.ts +15 -15
- package/dist/substrates/e2b/desktop-cdp.js +11 -11
- package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
- package/dist/substrates/e2b/desktop-executor.js +1 -1
- package/dist/substrates/e2b/desktop-geometry.d.ts +6 -6
- package/dist/substrates/e2b/desktop-geometry.js +9 -9
- package/dist/substrates/e2b/desktop-media.d.ts +1 -1
- package/dist/substrates/e2b/desktop-media.js +3 -3
- package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
- package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
- package/dist/substrates/e2b/sandbox.d.ts +1 -1
- package/dist/substrates/e2b/sandbox.js +2 -2
- package/dist/substrates/e2b/sdk.d.ts +11 -11
- package/dist/substrates/e2b/sdk.js +8 -8
- package/dist/substrates/local/runtime-host.d.ts +2 -0
- package/dist/substrates/local/runtime-host.js +6 -0
- package/dist/tui/actions.d.ts +8 -6
- package/dist/tui/actions.js +31 -22
- package/dist/tui/contract.d.ts +16 -16
- package/dist/tui/contract.js +10 -10
- package/dist/tui/launch.d.ts +4 -4
- package/dist/tui/launch.js +18 -19
- package/dist/tui/project.js +5 -5
- package/dist/tui-app.js +83 -83
- package/dist/verify/actor.d.ts +14 -14
- package/dist/verify/actor.js +45 -45
- package/dist/verify/artifacts.d.ts +3 -3
- package/dist/verify/artifacts.js +6 -6
- package/dist/verify/context-growth.d.ts +9 -0
- package/dist/verify/context-growth.js +62 -0
- package/dist/verify/costs.d.ts +7 -7
- package/dist/verify/costs.js +9 -9
- package/dist/verify/liveness.d.ts +1 -1
- package/dist/verify/liveness.js +4 -1
- package/dist/verify/rerun.d.ts +1 -1
- package/dist/verify/rerun.js +1 -1
- package/dist/verify/shared-world-concurrent.d.ts +2 -2
- package/dist/verify/shared-world-concurrent.js +79 -76
- package/dist/verify/shared-world.d.ts +2 -2
- package/dist/verify/shared-world.js +18 -18
- package/dist/verify/subject.d.ts +4 -4
- package/dist/verify/subject.js +18 -18
- package/dist/verify/verify.js +98 -49
- package/docs/README.md +26 -33
- package/docs/architecture/actor-contract.md +105 -98
- package/docs/architecture/desktop-sessions.md +14 -14
- package/docs/architecture/external-public-shared-world.md +66 -59
- package/docs/architecture/github-feedback-loop.md +1 -4
- package/docs/architecture/guest-desktop.md +2 -2
- package/docs/architecture/observer.md +37 -37
- package/docs/architecture/restricted-codex-analysis.md +70 -30
- package/docs/architecture/serve.md +34 -37
- package/docs/architecture/state-driven-executor.md +55 -59
- package/docs/architecture/task-protocol-support.md +7 -9
- package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +83 -115
- package/docs/contracts/README.md +24 -0
- package/docs/contracts/adapter-admission.md +3 -3
- package/docs/contracts/adapter-fixtures.md +2 -5
- package/docs/contracts/core.md +1 -3
- package/docs/contracts/errors.md +62 -0
- package/docs/contracts/feedback.md +8 -9
- package/docs/contracts/policy.md +7 -12
- package/docs/contracts/run-bundle.md +54 -51
- package/docs/contracts/schemas.md +505 -390
- package/docs/contracts/study-analysis.md +26 -2
- package/docs/contracts/study-costs.md +11 -7
- package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
- package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
- package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
- package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
- package/docs/principles/actor-fidelity.md +4 -4
- package/docs/principles/engineering.md +3 -3
- package/docs/principles/invariants-and-defaults.md +38 -38
- package/docs/principles/self-driving-harness.md +1 -5
- package/docs/principles/three-roles.md +1 -1
- package/docs/product/automatic-analysis.md +8 -7
- package/examples/participant/README.md +5 -5
- package/examples/participant/run.mjs +11 -10
- package/examples/scorer/README.md +3 -3
- package/examples/scorer/run.mjs +11 -12
- package/package.json +16 -17
- package/skills/humanish/SKILL.md +63 -60
- package/skills/humanish/agents/openai.yaml +1 -1
- package/AGENTS.md +0 -99
- package/CONTRIBUTING.md +0 -148
- package/dist/actors/codex/qualified-versions.d.ts +0 -45
- package/dist/actors/codex/qualified-versions.js +0 -87
- package/dist/cli/commands/lab.d.ts +0 -3
- package/dist/cli/commands/lab.js +0 -193
- package/dist/deprecated.d.ts +0 -90
- package/dist/deprecated.js +0 -106
- package/dist/lab/bag-overrides.d.ts +0 -18
- package/dist/lab/bag-overrides.js +0 -121
- package/dist/observer/static.d.ts +0 -39
- package/dist/observer/static.js +0 -369
- package/dist/routes/computer-use/legacy-lane-spec.d.ts +0 -62
- package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
- package/docs/architecture/comms-inbox.md +0 -122
- package/docs/architecture/desktop-recording.md +0 -80
- package/docs/architecture/local-browser-runtime.md +0 -178
- package/docs/architecture/observer-review.md +0 -144
- package/docs/architecture/participant-media.md +0 -90
- package/docs/architecture/project-layout.md +0 -62
- package/docs/architecture/real-email-receiving.md +0 -136
- package/docs/assets/humanish-drawdb-hero.png +0 -0
- package/docs/assets/humanish-observer-hero.png +0 -0
- package/docs/goals/current.md +0 -207
- package/docs/product/lobby-trivia-3player-external-public.md +0 -77
- package/docs/product/open-source-install-experience.md +0 -240
- package/docs/ramp/README.md +0 -294
- package/docs/release/open-source-readiness.md +0 -222
- package/docs/release/public-readiness-standard.md +0 -210
- package/docs/roadmap/world-class-open-source-v0.md +0 -311
- /package/dist/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
- /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
|
@@ -1,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/lab/routing.ts`):
|
|
13
|
+
an actor that declares no screenshots cannot run on the computer-use or scripted-browser route.
|
|
14
|
+
Decision 6's capture-time screenshot stance was recanted in 0.6.0; see the inline notes and the
|
|
18
15
|
capture-vs-publish rule in
|
|
19
16
|
[`docs/principles/invariants-and-defaults.md`](../principles/invariants-and-defaults.md).
|
|
20
17
|
|
|
21
|
-
`codex-exec` is a real dispatch key for terminal-product
|
|
18
|
+
`codex-exec` is a real dispatch key for terminal-product studies, but the exported
|
|
22
19
|
descriptor `runSession` is a fail-closed compatibility entry. Live execution is
|
|
23
20
|
owned by `runTerminalProductLab`, which coordinates sandbox creation,
|
|
24
21
|
command-scoped runtime auth, evidence, caps, and by-id cleanup.
|
|
25
22
|
|
|
26
23
|
The `pi-agent-core` and `claude-agent-sdk` descriptors, the `app` run kind and the
|
|
27
|
-
`in-process-sdk` protocol were removed. No
|
|
28
|
-
|
|
29
|
-
through `local-agent`, which plugs into the provider-neutral `
|
|
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,13 +61,24 @@ 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
|
|
68
|
-
|
|
69
|
-
2. **One normalized evidence schema: `humanish.actor-trace.v1`.**
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
64
|
+
route, and was removed.
|
|
65
|
+
|
|
66
|
+
2. **One normalized evidence schema: `humanish.actor-trace.v1`.** Four producers map
|
|
67
|
+
their records onto one `ActorTrace` with a typed `items[]`:
|
|
68
|
+
- Codex app-server `item/*` events, protocol `json-rpc`: `codexResultToActorTrace`
|
|
69
|
+
(`src/actors/codex/app-server-actor-trace.ts`).
|
|
70
|
+
- Computer-use loop turns, protocol `cua-loop`, whether the provider returned an OpenAI
|
|
71
|
+
`computer_call` or a local agent's JSON actions: `loopResult`
|
|
72
|
+
(`src/actors/computer-use/loop/trace.ts`).
|
|
73
|
+
- Scripted-browser steps, protocol `scripted-steps`: `projectScriptedActorTrace`
|
|
74
|
+
(`src/actors/scripted-browser/actor.ts`).
|
|
75
|
+
- The terminal route's command log and terminal events, protocol `terminal-exec`:
|
|
76
|
+
`buildTerminalActorTrace` (`src/routes/terminal/trace.ts`).
|
|
77
|
+
|
|
78
|
+
The Codex app-server still writes its own `humanish.codex-app-server-trace.v1` record
|
|
79
|
+
(`CodexAppServerTrace` in `src/actors/codex/app-server-trace.ts`), which
|
|
80
|
+
`codexResultToActorTrace` converts. The Claude Agent SDK `ToolUse`/`ToolResult` and pi
|
|
81
|
+
`tool_execution_*` mappers were removed with their adapters.
|
|
74
82
|
|
|
75
83
|
3. **A run is multi-turn within one trace; it stops on goal, abandonment, unrecoverable
|
|
76
84
|
failure, or a wall-clock safety timeout, never on a turn cap.** Turn count is explicitly
|
|
@@ -85,7 +93,7 @@ API surface.
|
|
|
85
93
|
4. **Redaction is injected once, never re-implemented per adapter.** Every
|
|
86
94
|
adapter receives `RedactionHooks` (the shared secret/path/prompt-digest
|
|
87
95
|
redaction, plus screenshot redaction) and must route all persisted evidence
|
|
88
|
-
through it.
|
|
96
|
+
through it.
|
|
89
97
|
|
|
90
98
|
5. **The registry refuses capability mismatches.** Each adapter declares
|
|
91
99
|
`ActorCapabilities`. A scenario that needs `producesScreenshots` (a GUI
|
|
@@ -260,7 +268,13 @@ export interface Actor {
|
|
|
260
268
|
run-bundle wiring is provider-agnostic. The artifact names differ by route: the Codex
|
|
261
269
|
app-server adapter writes `events.ndjson`, `summary.json` and `transcript.txt`; a
|
|
262
270
|
computer-use participant writes its trace to `actor.json` or `actors/<streamId>.json`; the
|
|
263
|
-
terminal route writes `terminal-events.ndjson` and `terminal-transcript.txt`.
|
|
271
|
+
terminal route writes `terminal-events.ndjson` and `terminal-transcript.txt`. Analysis quotes
|
|
272
|
+
only `message` and `reasoning` items, so they carry the participant's own words. The terminal
|
|
273
|
+
route reads them from the Codex `agent_message` and `reasoning` items in the raw exec JSON
|
|
274
|
+
stream, in memory, before source redaction can break a line's JSON. It removes verdict marker
|
|
275
|
+
lines, then scrubs and redacts the decoded text. The trace keeps the last 200 items within
|
|
276
|
+
128 KiB and adds a `notice` item when it leaves older ones out. The stream's last 2000
|
|
277
|
+
characters stay in the `command` item's `outputTail`.
|
|
264
278
|
- **Approvals.** Call `approval.onRequest`; never embed adapter-local decline
|
|
265
279
|
strings. Every call is recorded as an `items[kind=approval]`.
|
|
266
280
|
- **Redaction.** Use the injected `RedactionHooks`. Never re-implement redaction
|
|
@@ -270,27 +284,27 @@ export interface Actor {
|
|
|
270
284
|
public-safe: redacted message, coarse loop phase, last normalized UI action,
|
|
271
285
|
and last screenshot reference only. Do not persist raw stacks, env values,
|
|
272
286
|
target URLs, or unredacted provider payloads in the trace.
|
|
273
|
-
- **Capabilities.** Declare
|
|
287
|
+
- **Capabilities.** Declare only what the actor does. Routing refuses an actor whose `lanes` or
|
|
274
288
|
`producesScreenshots` do not fit the route; the other capabilities are not checked.
|
|
275
|
-
- **Cost (estimate vs. charge).** `tokenUsage.costUsd` stays
|
|
289
|
+
- **Cost (estimate vs. charge).** `tokenUsage.costUsd` stays reserved for a
|
|
276
290
|
real, provider-returned charge (the codex path); a bare `costUsd`
|
|
277
291
|
always means "the provider billed this". The optional `estimatedCost`
|
|
278
|
-
(`humanish.actor-estimated-cost.v1`) is a
|
|
292
|
+
(`humanish.actor-estimated-cost.v1`) is a separate, differently-named field: a
|
|
279
293
|
token-derived rate-table multiply from the operator-editable `src/run/pricing.ts`,
|
|
280
|
-
labeled
|
|
294
|
+
labeled as an estimate and projected up into `RunBundle.cost` (see
|
|
281
295
|
[`../contracts/schemas.md`](../contracts/schemas.md) → Run Cost Summary And
|
|
282
|
-
Estimated Actor Cost). The CUA
|
|
283
|
-
|
|
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
|
|
284
298
|
depends on the pricing table. An unknown model yields
|
|
285
299
|
`estimatedCostUsd: null` + a `reason`, never a guessed charge.
|
|
286
300
|
|
|
287
|
-
## The scripted-browser route
|
|
301
|
+
## The scripted-browser route
|
|
288
302
|
|
|
289
303
|
`scripted-browser` is the deterministic, model-free browser-actuation route, distinct from
|
|
290
304
|
`computer-use` (raw pixels + a model deciding actions). The registered
|
|
291
305
|
`scripted-browser` actor (`src/actors/scripted-browser/`) replays a committed scenario's
|
|
292
|
-
browser steps with playwright against a loopback app; the steps
|
|
293
|
-
`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
|
|
294
308
|
$0 declaration that is true by mechanism (no provider client is importable from that code
|
|
295
309
|
path). Its trace keeps the concrete driver name `provider: "browser-persona"` (matching the
|
|
296
310
|
native `humanish.browser-persona-trace.v1` it also emits) with `protocol: "scripted-steps"`.
|
|
@@ -305,16 +319,16 @@ has no persona patience and no approvals.
|
|
|
305
319
|
|
|
306
320
|
### The time budget vs. a stuck timeout (`budget_reached`)
|
|
307
321
|
|
|
308
|
-
`execution.timeoutMs` is a
|
|
322
|
+
`execution.timeoutMs` is a generous wall-clock safety cap, not a goal. An open-ended
|
|
309
323
|
"watch it play" session has no success predicate, because productive play is the outcome. So
|
|
310
324
|
the computer-use loop distinguishes two ways to hit the cap:
|
|
311
325
|
|
|
312
|
-
- **`budget_reached`**: the deadline was reached
|
|
326
|
+
- **`budget_reached`**: the deadline was reached after at least one material (non-idle)
|
|
313
327
|
action, or a spend, adapter or token limit ended the session. This maps to `ActorStatus:
|
|
314
328
|
"incomplete"`: the participant did not reach the goal, and the harness did not fail.
|
|
315
329
|
`participantOutcomeOk` is false, the verdict is `fail`, and the CLI exits `2`. The trace
|
|
316
330
|
`reason` and optional `stopCause` say which limit ended the session.
|
|
317
|
-
- **`timed_out`**: the deadline was reached with
|
|
331
|
+
- **`timed_out`**: the deadline was reached with zero material actions (a hung provider, an
|
|
318
332
|
idle-only stall). This maps to `ActorStatus: "timed_out"`, `participantOutcomeOk` is false, the
|
|
319
333
|
verdict is `timed_out`, and the CLI exits `2`.
|
|
320
334
|
|
|
@@ -325,7 +339,7 @@ switch with no default, so a new completion reason forces a compile-time decisio
|
|
|
325
339
|
status. ~30 min (`1_800_000`) is a reasonable default for open-ended watch; the persona
|
|
326
340
|
still stops early on `goal_satisfied`/`gave_up`/`stopWhen`.
|
|
327
341
|
|
|
328
|
-
Actuation-vs-spend gate: on the scripted
|
|
342
|
+
Actuation-vs-spend gate: on the scripted route `mode: live` is still required
|
|
329
343
|
even though provider spend is $0 by mechanism. The gate's justification there is actuation,
|
|
330
344
|
not cost: a live scripted run drives a real browser against a real running app
|
|
331
345
|
(state-mutating effects on the operator's app), which deserves the same affirmative
|
|
@@ -334,8 +348,8 @@ this paragraph is the record of that decision.
|
|
|
334
348
|
|
|
335
349
|
## Optional closing report
|
|
336
350
|
|
|
337
|
-
`
|
|
338
|
-
`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
|
|
339
353
|
`summary` and `frictionReports`; an empty friction list is valid. The loop rejects
|
|
340
354
|
actions, pending safety checks, and invalid report shapes. It redacts accepted
|
|
341
355
|
reports, records them in `ActorTrace.debrief`, and projects one readable message
|
|
@@ -350,39 +364,40 @@ from interaction turns, and reported usage contributes to aggregate cost.
|
|
|
350
364
|
|
|
351
365
|
The OpenAI implementation makes one request with tools disabled and structured
|
|
352
366
|
output; no HTTP or policy retries. Stateless/ZDR mode does not offer retrospective
|
|
353
|
-
reporting
|
|
354
|
-
|
|
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)
|
|
355
370
|
records both report recovery and control failures in the separate legacy parser.
|
|
356
371
|
|
|
357
|
-
## The state-driven executor seam
|
|
372
|
+
## The state-driven executor seam
|
|
358
373
|
|
|
359
|
-
The `
|
|
374
|
+
The `ComputerUseExecutor` / `ComputerUseProvider` ports are the concrete realization of the "plural harnesses /
|
|
360
375
|
transport-agnostic" intent above: the computer-use loop does not require a screen or a vision
|
|
361
376
|
model. A library caller can drive an **already-running local app** through its in-process JS
|
|
362
|
-
contract (`window.app.getState()` etc.) with a custom `
|
|
363
|
-
`appState` as the progress signal) paired with a **non-vision** `
|
|
364
|
-
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
|
|
365
380
|
[`state-driven-executor.md`](./state-driven-executor.md) for the port, both entry points
|
|
366
|
-
(`runComputerUseLoop` and `
|
|
381
|
+
(`runComputerUseLoop` and `runStudy` + `inProcess`/`createProvider`), the `subject.source:
|
|
367
382
|
local-app` config surface, the `requiresFrame` provider-authoring contract, and the
|
|
368
383
|
appState-is-runtime-only stance.
|
|
369
384
|
|
|
370
|
-
## The product-adapter extension seam
|
|
385
|
+
## The product-adapter extension seam
|
|
371
386
|
|
|
372
|
-
The terminal-product route
|
|
373
|
-
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
|
|
374
389
|
core. The seam is exported contract types (`RunBundle`, `RunFeedbackCandidate`,
|
|
375
390
|
`RunAdapterScore`, `ActorTrace`, `AdapterScorerModule` and the terminal-route
|
|
376
|
-
`TerminalProductScoringContext`) plus a registrable scorer module, `
|
|
377
|
-
with optional `score` and `deriveFeedback`. The older `
|
|
378
|
-
|
|
379
|
-
under an adapter-
|
|
391
|
+
`TerminalProductScoringContext`) plus a registrable scorer module, `RunStudyOptions.scorer`,
|
|
392
|
+
with optional `score` and `deriveFeedback`. The older `terminalHooks` and `cuaHooks` bags were
|
|
393
|
+
removed from `RunStudyOptions`. The adapter records its product nouns only
|
|
394
|
+
under an adapter-namespaced block (`RunFeedbackCandidate.adapter` /
|
|
380
395
|
`RunAdapterScore.{namespace,data}`), so core's enums stay product-agnostic: no adopter noun
|
|
381
396
|
is hardcoded into a core enum. Default (no hook) behavior is unchanged. See
|
|
382
|
-
[`terminal-product-
|
|
397
|
+
[`terminal-product-route.md`](./terminal-product-route.md#the-product-adapter-extension-seam)
|
|
383
398
|
for the full seam and the thin-adapter conformance proof.
|
|
384
399
|
|
|
385
|
-
## Making personas
|
|
400
|
+
## Making personas change the actor's behavior
|
|
386
401
|
|
|
387
402
|
The original bug, now fixed: `loadDryRunInputs` (`src/run/dry-run-inputs.ts`) parsed
|
|
388
403
|
persona YAML down to `{ id, name, source, sourceDigest }` and discarded `summary`,
|
|
@@ -419,12 +434,33 @@ traits: { patience, skill, accessibilityNeeds? }, constraints[], sourceDigest }`
|
|
|
419
434
|
toward the success predicate) and annotates the abandonment friction as a feedback
|
|
420
435
|
candidate. The harness imposes no turn cap; its hard stops are the wall-clock
|
|
421
436
|
`timeoutMs` and declared spend caps.
|
|
422
|
-
4. **Bind the same directives per harness
|
|
423
|
-
`
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
437
|
+
4. **Bind the same directives per harness.** `renderPersonaPromptSection`
|
|
438
|
+
(`src/lab/persona.ts`) renders the directives as one prompt section, and each harness puts
|
|
439
|
+
that section where its model reads standing instructions:
|
|
440
|
+
- Computer use: `composeParticipantInstructions`
|
|
441
|
+
(`src/routes/computer-use/participant-prompt.ts`) opens the participant instructions
|
|
442
|
+
with it. `openai-computer-use` sends those instructions as each Responses request's
|
|
443
|
+
`instructions`. A local-agent Codex runs as a restricted app-server participant and
|
|
444
|
+
receives them as thread/start `baseInstructions` (`threadStartParams` in
|
|
445
|
+
`src/actors/codex/restricted-launch.ts`), on an ephemeral read-only thread whose only
|
|
446
|
+
dynamic tool is `humanish_ui`. A local-agent Claude Code runs one `claude -p`
|
|
447
|
+
stream-json session with `--allowedTools Read`; the instructions open its first user
|
|
448
|
+
message (`promptFor` in `src/actors/local-agent/cli.ts`), and later turns rely on the
|
|
449
|
+
session's memory. `HUMANISH_LOCAL_AGENT_ONE_SHOT` instead spawns one `claude -p` per
|
|
450
|
+
turn, which resends the instructions every turn.
|
|
451
|
+
- Terminal: the section opens the `codex exec` prompt (`composeLivePrompt` in
|
|
452
|
+
`src/routes/terminal/session.ts`).
|
|
453
|
+
- The scripted-browser route replays declared steps with no model, so it binds no
|
|
454
|
+
directives and records an empty `traitsApplied`. The Codex app-server session behind
|
|
455
|
+
`humanish codex app-server` and the `codex-app-server` registry descriptor binds none
|
|
456
|
+
either: it sends the operator's prompt to turn/start as given.
|
|
457
|
+
- Stagehand remains roadmap. This rule once planned a pi binding (`systemPrompt` +
|
|
458
|
+
`beforeToolCall`) and a Claude Agent SDK one (`systemPrompt` + `allowedTools`). pi
|
|
459
|
+
shipped only as a trace mapper, the Claude Agent SDK descriptor never had a route, and
|
|
460
|
+
both were removed.
|
|
461
|
+
|
|
462
|
+
None of these uses a `max_turns`-style cap as the persona stop condition.
|
|
463
|
+
|
|
428
464
|
5. **Prove it.** `ActorTrace.persona.traitsApplied` lists the injected directives; a
|
|
429
465
|
`persona-fidelity` verify check asserts that the friction and accessibility directives
|
|
430
466
|
reached the actor input and that a `gave_up` run cites a concrete friction reason (not a
|
|
@@ -475,7 +511,7 @@ Non-obvious tradeoffs to revisit with real-run data:
|
|
|
475
511
|
- `persona-fidelity` treats a `gave_up` with no cited friction as a fidelity
|
|
476
512
|
failure, not an accepted stop, so the model cannot quietly quit for no reason.
|
|
477
513
|
|
|
478
|
-
|
|
514
|
+
So patience decides when a run stops, reproducibly, without ever using elapsed
|
|
479
515
|
turns as a stop signal.
|
|
480
516
|
|
|
481
517
|
## Capability matrix (target adapters)
|
|
@@ -487,41 +523,12 @@ turns as a stop signal.
|
|
|
487
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 |
|
|
488
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 |
|
|
489
525
|
|
|
490
|
-
## Sequencing
|
|
491
|
-
|
|
492
|
-
1. This document.
|
|
493
|
-
2. Shared `RedactionHooks` module (completes the remaining #107 criterion) plus
|
|
494
|
-
the `Actor` contract types, with the Codex integration refactored to implement
|
|
495
|
-
`Actor` and emit `ActorTrace` behind the back-compat alias. Add an
|
|
496
|
-
`actorRegistry`; generalize `RunStream.codex` to `RunStream.actor`.
|
|
497
|
-
3. Personas load-bearing: `ResolvedPersona`, `personaToDirectives`, harness turn
|
|
498
|
-
budget, and the `persona-fidelity` verify check.
|
|
499
|
-
4. `pi-agent-core` adapter (proves the contract against a non-Codex protocol;
|
|
500
|
-
local-model dogfood for ~$0). Landed in two slices: first the pure
|
|
501
|
-
`piSessionToActorTrace` mapper + registry generalization (discriminated
|
|
502
|
-
`ActorDescriptor` union + `getActor` overloads) + a fixture conformance test,
|
|
503
|
-
with no pi dependency and no model key required (proves the evidence contract
|
|
504
|
-
is provider-neutral); then a follow-up live SDK shim behind a DI seam, deferred
|
|
505
|
-
until the package identity (`@earendil-works/pi-agent-core` vs
|
|
506
|
-
`@mariozechner/pi-coding-agent`) and the Node `>=22.19` vs engines `>=20` gap
|
|
507
|
-
are pinned against an installed build. The live shim never landed, and the
|
|
508
|
-
mapper-only descriptor was removed because no route dispatched it.
|
|
509
|
-
5. `claude-agent-sdk` adapter (the `app` run kind). It shipped as a descriptor with
|
|
510
|
-
a live session but no route, and was removed along with the `app` run kind.
|
|
511
|
-
6. Computer-use route. (Shipped as `openai-computer-use`: registered 0.3.0,
|
|
512
|
-
lab-dispatched 0.4.0; `stagehand-cua` as a multi-provider front remains
|
|
513
|
-
not-yet-shipped roadmap.)
|
|
514
|
-
7. Cross-harness conformance test: one persona x scenario through every adapter,
|
|
515
|
-
asserting identical trace shape, completion vocabulary, and redaction status.
|
|
516
|
-
8. The proof point: run the harness-plural loop against popular OSS repos and turn
|
|
517
|
-
real, merged issues into the receipt.
|
|
518
|
-
|
|
519
526
|
## Risks
|
|
520
527
|
|
|
521
528
|
- Protocol/version drift across four moving harnesses. Pin every binary/SDK and
|
|
522
529
|
assert the init handshake; the registry refuses an actor whose declared
|
|
523
530
|
capabilities do not satisfy the scenario.
|
|
524
|
-
- Screenshot PII in the computer-use route. Redaction binds the
|
|
531
|
+
- Screenshot PII in the computer-use route. Redaction binds the publish
|
|
525
532
|
boundary, not capture (0.6.0): raw frames stay local in gitignored
|
|
526
533
|
`.humanish/` and are never emitted by a publish command (this repo's CI
|
|
527
534
|
binary-asset scan also blocks them from commit);
|
|
@@ -540,4 +547,4 @@ turns as a stop signal.
|
|
|
540
547
|
|
|
541
548
|
- Self-driving harness principles: `docs/principles/self-driving-harness.md`.
|
|
542
549
|
- Observer architecture: `docs/architecture/observer.md`.
|
|
543
|
-
-
|
|
550
|
+
- Open issue: [a PII/PHI detector for the redaction gate](https://github.com/danielgwilson/humanish/issues/108).
|
|
@@ -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,17 +62,17 @@ 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
|
-
Firecracker
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
bypasses CLI admission checks.
|
|
71
|
+
Firecracker run supplies its desktops through the computer-use run's `localVm`
|
|
72
|
+
input (`LocalVmInput` in `src/routes/computer-use/types.ts`). runStudy builds that
|
|
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 study with
|
|
75
|
+
`execution.target: local`. Neither bypasses CLI admission checks.
|
|
76
76
|
|
|
77
77
|
Final evidence errors cannot skip desktop release. Existing bundle fields and
|
|
78
78
|
desktop lifetime accounting retain their meanings; unconfirmed or retained
|
|
@@ -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
|
-
normal `CuaActorSessionOptions` executor or delegate to
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
executor now goes through `
|
|
92
|
-
|
|
88
|
+
normal `CuaActorSessionOptions` executor or delegate to the internal
|
|
89
|
+
`runCuaActorSession`. The `runCuaActorSession` export was removed in 0.107.0; a
|
|
90
|
+
library caller uses `runComputerUseLoop`. A custom in-process
|
|
91
|
+
executor now goes through `RunStudyOptions.inProcess`, which replaces the
|
|
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,35 +8,35 @@ 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
|
|
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
34
|
(`concurrentSharedWorldValidationReason` in `src/lab/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
|
|
39
|
+
neither provisioned nor exposed has neither property, so the gate's hazard does not exist there. The
|
|
40
40
|
app-url branch is validated by `externalPublicSharedWorldValidationReason` (`src/lab/validation.ts`)
|
|
41
41
|
and is reached before the getHost gate; a snapshot regression test pins the getHost path
|
|
42
42
|
byte-unchanged.
|
|
@@ -48,14 +48,20 @@ 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, `CuaLoopOptions.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).
|
|
60
|
+
|
|
61
|
+
`onObservedUrl`, `onMessage` and `onScreenshot` are deprecated on `CuaLoopOptions`, and the next
|
|
62
|
+
minor removes them. A `runComputerUseLoop` caller that used them wraps the executor's `observe`
|
|
63
|
+
(for `url` and `screenshot`) or the provider's `nextTurn` (for `reasoning` and `message`). The
|
|
64
|
+
handoff still passes all three.
|
|
59
65
|
|
|
60
66
|
Flow, a host-first barrier inside `runConcurrentSharedWorld`'s fan-out:
|
|
61
67
|
|
|
@@ -66,71 +72,72 @@ Flow, a host-first barrier inside `runConcurrentSharedWorld`'s fan-out:
|
|
|
66
72
|
`/\/lobby\/([A-Z2-9]{6})(?:$|[/?#])/` (a locale prefix `/en/lobby/CODE` and a query/hash suffix
|
|
67
73
|
are tolerated), a lobby code in its narration (`extractLobbyCodeFromNarration`), or a vision read
|
|
68
74
|
of its screenshot (`readLobbyCodeFromFrame`). The vision reads are out-of-band OpenAI calls, at
|
|
69
|
-
most 30 per participant, and are not counted against `
|
|
75
|
+
most 30 per participant, and are not counted against `caps.maxUsd`. The host keeps playing
|
|
70
76
|
after resolving, so its window overlaps the followers'.
|
|
71
|
-
3. **Barrier.** Follower participants (`host` absent) do
|
|
72
|
-
the latch resolves or the handoff deadline passes. On resolve,
|
|
73
|
-
follower's mission (
|
|
77
|
+
3. **Barrier.** Follower participants (`host` absent) do not compose a mission or open their target until
|
|
78
|
+
the latch resolves or the handoff deadline passes. On resolve, code is threaded into each
|
|
79
|
+
follower's mission (`…choose Join, enter lobby code {CODE}…`). It is not a raw URL navigation,
|
|
74
80
|
because a direct `/lobby/CODE` visit does not auto-join a non-member (lobby-trivia's lobby page
|
|
75
81
|
redirects unknown/non-member sessions home); the follower goes through the real Join flow.
|
|
76
82
|
4. **Convergence confirmation.** Each follower's own `onObservedUrl`, or a vision read of its own
|
|
77
83
|
frame, confirms it reached `/lobby/CODE`; this observed convergence becomes the
|
|
78
|
-
`lobbyConvergenceDigest`, the pass signal that the
|
|
79
|
-
|
|
84
|
+
`lobbyConvergenceDigest`, the pass signal that the followers reached the lobby. An instruction to
|
|
85
|
+
join does not set it. It is recorded only when every participant converged on one code.
|
|
80
86
|
5. **Fail-closed timeout.** If the host never yields a `/lobby/CODE` within the handoff deadline
|
|
81
87
|
(`min(execution.timeoutMs, max(120 s, 40% of execution.timeoutMs))`; injectable in tests), the
|
|
82
|
-
latch rejects; every follower fails closed
|
|
83
|
-
home page); the run returns `
|
|
88
|
+
latch rejects; every follower fails closed without opening (no wasted turns against a codeless
|
|
89
|
+
home page); the run returns `HUMANISH_SHARED_WORLD_HANDOFF_TIMEOUT` and the bundle
|
|
84
90
|
records the host window + a handoff-failed outcome for followers. If the host participant ends without a
|
|
85
91
|
code before the deadline, `releaseFollowersIfUnlatched` releases the followers at once and the
|
|
86
|
-
run returns `
|
|
87
|
-
reaches the lobby but whose followers fail to
|
|
88
|
-
concurrency-on-pass gate then simply won't see ≥2 overlap, and the verdict stays non-pass,
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
> **Temporary shim
|
|
92
|
-
>
|
|
93
|
-
>
|
|
94
|
-
>
|
|
95
|
-
>
|
|
92
|
+
run returns `HUMANISH_SHARED_WORLD_FAILED` with the host's reason. A host that
|
|
93
|
+
reaches the lobby but whose followers fail to join is a normal per-participant non-pass (the
|
|
94
|
+
concurrency-on-pass gate then simply won't see ≥2 overlap, and the verdict stays non-pass),
|
|
95
|
+
not a whole-run abort.
|
|
96
|
+
|
|
97
|
+
> **Temporary shim.** This CDP URL-relay handoff reads the host's `/lobby/CODE` off its own browser
|
|
98
|
+
> and threads it into the follower missions.
|
|
99
|
+
> [An open issue](https://github.com/danielgwilson/humanish/issues/296) tracks replacing it with the
|
|
100
|
+
> [actor message bus](https://github.com/danielgwilson/humanish/issues/297), where the host sends an
|
|
101
|
+
> SMS or email invite link and the followers receive and tap it. The orchestrator then no longer
|
|
102
|
+
> relays the code out of band.
|
|
96
103
|
|
|
97
104
|
## Observed-origin convergence (not declared)
|
|
98
105
|
|
|
99
|
-
The convergence proof is about what the participants
|
|
100
|
-
is the sha256-16 of the
|
|
106
|
+
The convergence proof is about what the participants observed, not what was declared. `plane.publicOriginDigest`
|
|
107
|
+
is the sha256-16 of the one origin the participants' CDP-observed final URLs converged on; verify requires every
|
|
101
108
|
`laneWindow.routeHostDigest` to agree on it. A normal cross-origin redirect (apex→www, http→https;
|
|
102
|
-
lobby-trivia.example.test 307-redirects) makes the
|
|
103
|
-
is
|
|
104
|
-
`plane.declaredOriginDigest` for reference and is
|
|
105
|
-
|
|
106
|
-
digest equality. Verify fails closed only when the participants did not converge on a single
|
|
109
|
+
lobby-trivia.example.test 307-redirects) makes the observed origin differ from the declared `subject.appUrl`, which
|
|
110
|
+
is expected and must never fail the run. So the declared origin is recorded separately as
|
|
111
|
+
`plane.declaredOriginDigest` for reference and is never asserted equal to the observed one. Operator
|
|
112
|
+
ownership rests on the `subject.publicTarget.authorized` attestation + the declared `appUrl`, not on
|
|
113
|
+
digest equality. Verify fails closed only when the participants did not converge on a single observed origin
|
|
107
114
|
(it then lists the distinct observed origin digests).
|
|
108
115
|
|
|
109
116
|
## Hygiene
|
|
110
117
|
|
|
111
|
-
The runtime `location.href` (and the 6-char
|
|
112
|
-
runtime-only; the threaded
|
|
113
|
-
field) and is scrubbed from all narration once latched; the shared origin and lobby path persist
|
|
118
|
+
The runtime `location.href` (and the 6-char code inside it) is never persisted raw: `onObservedUrl` is
|
|
119
|
+
runtime-only; the threaded code flows only into the follower's composed prompt (never a raw bundle
|
|
120
|
+
field) and is scrubbed from all narration once latched; the shared origin and lobby path persist only
|
|
114
121
|
as sha256-16 digests (`publicOriginDigest`, `lobbyConvergenceDigest`). This matches the existing
|
|
115
122
|
e2b-URL / host-digest redaction discipline.
|
|
116
123
|
|
|
117
124
|
## Mobile fidelity caveat
|
|
118
125
|
|
|
119
|
-
The example roster runs mobile-
|
|
120
|
-
the E2B-desktop route the rendered
|
|
121
|
-
Chrome refuses a narrower window and a narrower X screen
|
|
122
|
-
presets render at 500 wide and are identical in layout; only
|
|
126
|
+
The example roster runs mobile-layout participants (`device: mobile` 414×896, `small-mobile` 360×740). On
|
|
127
|
+
the E2B-desktop route the rendered width is floored to `MIN_DESKTOP_RENDER_WIDTH` (500) because
|
|
128
|
+
Chrome refuses a narrower window and a narrower X screen clips the page, so both
|
|
129
|
+
presets render at 500 wide and are identical in layout; only height renders as declared.
|
|
123
130
|
`desktopGeometry.screen.verified` compares the floored number with itself, so it does not attest the
|
|
124
|
-
preset width. There is
|
|
125
|
-
only via the CDP geometry path). "3 mobile personas" = 3 mobile-
|
|
131
|
+
preset width. There is no touch input, and `isMobile`/DPR are prompt-signal + metadata (DPR renders
|
|
132
|
+
only via the CDP geometry path). "3 mobile personas" = 3 mobile-layout desktop-Chromium participants, not
|
|
126
133
|
touch devices. Do not over-read the results as true mobile-device coverage. That describes the
|
|
127
|
-
default. With `execution.desktop.fidelity.mobileEmulation: true
|
|
134
|
+
default. With `execution.desktop.fidelity.mobileEmulation: true`, Chromium participants on a mobile
|
|
128
135
|
preset get a DevTools device-metrics override at the preset width, plus DPR, touch emulation and a
|
|
129
136
|
mobile user agent. That is still not physical-device fidelity.
|
|
130
137
|
|
|
131
138
|
## Watch-from-phone
|
|
132
139
|
|
|
133
140
|
Native live-desktop `--expose` is not supported on the concurrent path; only the computer-use
|
|
134
|
-
|
|
141
|
+
route live-serves a run (`src/cli/io.ts`). Today, watch it from a phone via `humanish observe --all
|
|
135
142
|
--expose --tunnel … --oauth …` against the run directory's Observer (the concurrent path writes
|
|
136
143
|
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
|
|