humanish 0.107.0 → 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 +22 -17
- package/CHANGELOG.md +14 -0
- package/CONTEXT.md +51 -44
- package/README.md +145 -172
- 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-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 +8 -6
- 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 +2 -2
- package/dist/actors/codex/restricted-session.js +10 -5
- package/dist/actors/computer-use/actor.d.ts +16 -16
- package/dist/actors/computer-use/actor.js +2 -2
- 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 +14 -12
- package/dist/actors/computer-use/loop/ending.d.ts +5 -5
- package/dist/actors/computer-use/loop/ending.js +7 -7
- 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 +1 -1
- package/dist/actors/computer-use/loop/spend.js +1 -1
- package/dist/actors/computer-use/loop/trace.js +9 -8
- package/dist/actors/computer-use/loop/types.d.ts +25 -23
- package/dist/actors/computer-use/loop/usage.js +2 -2
- 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 +11 -8
- package/dist/actors/computer-use/openai-provider.js +45 -34
- 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 +78 -43
- 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/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/codex-config.d.ts +6 -2
- package/dist/analysis/codex-config.js +22 -14
- package/dist/analysis/service.js +5 -5
- package/dist/cli/commands/analyze.js +19 -16
- package/dist/cli/commands/codex.js +9 -9
- package/dist/cli/commands/comms.js +54 -33
- 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.js +6 -7
- package/dist/cli/commands/lab-route-preview.js +4 -3
- package/dist/cli/commands/lab-route-shared-world.js +3 -3
- package/dist/cli/commands/lab-run.js +10 -11
- package/dist/cli/commands/lab-scorer.d.ts +2 -2
- 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 +147 -108
- 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 +137 -138
- 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 +60 -75
- package/dist/cli/deprecations.d.ts +18 -0
- package/dist/cli/deprecations.js +48 -0
- package/dist/cli/doctor.d.ts +15 -5
- package/dist/cli/doctor.js +103 -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 +41 -6
- package/dist/cli/io.js +97 -22
- 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 +109 -40
- package/dist/cli/telemetry.d.ts +15 -15
- package/dist/cli/telemetry.js +48 -40
- 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 +14 -14
- package/dist/comms/email-catch.d.ts +3 -3
- package/dist/comms/email-catch.js +8 -8
- package/dist/comms/external-evidence.js +2 -2
- 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/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 +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 +36 -78
- package/dist/feedback/export-bundle.js +1 -1
- package/dist/feedback/export.d.ts +5 -1
- package/dist/feedback/export.js +7 -8
- package/dist/feedback/feedback.d.ts +2 -2
- 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 +12 -10
- package/dist/index.js +8 -6
- package/dist/keys/key-resolution.d.ts +5 -5
- package/dist/keys/key-resolution.js +23 -23
- package/dist/lab/adapter-extension.d.ts +7 -7
- package/dist/lab/adapter-extension.js +13 -36
- package/dist/lab/adapter-scorer-loader.d.ts +7 -7
- package/dist/lab/adapter-scorer-loader.js +32 -32
- package/dist/lab/composition-rules.js +42 -42
- package/dist/lab/config.js +65 -25
- package/dist/lab/deprecated-fields.d.ts +10 -0
- package/dist/lab/deprecated-fields.js +24 -0
- package/dist/lab/device-presets.d.ts +8 -8
- package/dist/lab/device-presets.js +11 -11
- package/dist/lab/discover.d.ts +13 -9
- package/dist/lab/discover.js +117 -57
- package/dist/lab/doctor.d.ts +10 -3
- package/dist/lab/doctor.js +47 -9
- 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 +42 -8
- package/dist/lab/lab-deps.d.ts +7 -12
- package/dist/lab/parse/actors.js +9 -9
- package/dist/lab/parse/comms.js +5 -5
- package/dist/lab/parse/execution.js +13 -13
- 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 +16 -16
- package/dist/lab/parse/subject.js +28 -28
- package/dist/lab/parse/values.d.ts +1 -1
- package/dist/lab/parse/values.js +3 -3
- package/dist/lab/persona-resolve.d.ts +4 -4
- package/dist/lab/persona-resolve.js +4 -4
- package/dist/lab/plan-participants.d.ts +2 -2
- package/dist/lab/plan-types.d.ts +4 -4
- package/dist/lab/plan.d.ts +1 -7
- package/dist/lab/plan.js +10 -41
- package/dist/lab/preflight-probes.js +11 -11
- package/dist/lab/preflight-result.d.ts +2 -1
- package/dist/lab/preflight-result.js +5 -4
- package/dist/lab/preflight.d.ts +7 -5
- package/dist/lab/preflight.js +5 -5
- package/dist/lab/routing.d.ts +31 -25
- package/dist/lab/routing.js +60 -29
- package/dist/lab/run-lab-events.d.ts +0 -3
- package/dist/lab/run-lab-events.js +0 -6
- package/dist/lab/run-lab-homes.d.ts +22 -10
- package/dist/lab/run-lab-homes.js +5 -1
- package/dist/lab/run-lab-options.d.ts +1 -1
- package/dist/lab/run-lab-options.js +16 -13
- package/dist/lab/summary.d.ts +7 -6
- package/dist/lab/summary.js +10 -10
- package/dist/lab/tasks.d.ts +15 -15
- package/dist/lab/tasks.js +14 -14
- package/dist/lab/types.d.ts +101 -95
- package/dist/lab/types.js +2 -0
- package/dist/lab/validation.d.ts +13 -13
- package/dist/lab/validation.js +44 -42
- package/dist/lab/warnings.d.ts +10 -0
- package/dist/lab/warnings.js +61 -33
- package/dist/library-aliases.d.ts +56 -0
- package/dist/library-aliases.js +22 -0
- package/dist/observer/artifact.d.ts +1 -1
- package/dist/observer/artifact.js +6 -6
- 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 +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 +10 -5
- package/dist/observer/run-routes.d.ts +3 -3
- package/dist/observer/run-routes.js +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 +15 -15
- package/dist/routes/computer-use/bundle.js +3 -3
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/comms.js +14 -14
- package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +4 -3
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
- package/dist/routes/computer-use/e2b-desktop/prepare.js +7 -7
- package/dist/routes/computer-use/e2b-desktop/start.js +9 -8
- package/dist/routes/computer-use/e2b-desktop/teardown.js +5 -4
- package/dist/routes/computer-use/external-comms.d.ts +1 -1
- package/dist/routes/computer-use/external-comms.js +1 -1
- package/dist/routes/computer-use/fanout-bundle.js +18 -18
- package/dist/routes/computer-use/fanout-records.js +10 -11
- package/dist/routes/computer-use/live-flush.d.ts +1 -1
- package/dist/routes/computer-use/live-flush.js +6 -6
- package/dist/routes/computer-use/live-phase.d.ts +4 -2
- package/dist/routes/computer-use/live-phase.js +6 -6
- package/dist/routes/computer-use/local-vm.js +1 -1
- package/dist/routes/computer-use/participant-desktop.d.ts +4 -4
- package/dist/routes/computer-use/participant-desktop.js +4 -4
- package/dist/routes/computer-use/participant-execution.d.ts +4 -4
- package/dist/routes/computer-use/participant-execution.js +9 -9
- package/dist/routes/computer-use/participant-model.d.ts +6 -0
- package/dist/routes/computer-use/participant-model.js +31 -13
- package/dist/routes/computer-use/participant-prompt.d.ts +11 -11
- package/dist/routes/computer-use/participant-prompt.js +6 -6
- package/dist/routes/computer-use/participant-runs.d.ts +7 -7
- package/dist/routes/computer-use/participant-runs.js +13 -13
- package/dist/routes/computer-use/plan.js +22 -22
- package/dist/routes/computer-use/preflight.js +21 -21
- package/dist/routes/computer-use/rerun-selection.js +1 -1
- package/dist/routes/computer-use/result.js +11 -11
- package/dist/routes/computer-use/route.d.ts +2 -1
- package/dist/routes/computer-use/route.js +15 -14
- package/dist/routes/computer-use/self-report.d.ts +7 -7
- package/dist/routes/computer-use/self-report.js +31 -31
- package/dist/routes/computer-use/setup.d.ts +1 -1
- package/dist/routes/computer-use/setup.js +17 -18
- package/dist/routes/computer-use/single-bundle.d.ts +7 -7
- package/dist/routes/computer-use/single-bundle.js +28 -30
- package/dist/routes/computer-use/subject-projection.d.ts +1 -1
- package/dist/routes/computer-use/subject-projection.js +6 -6
- package/dist/routes/computer-use/types.d.ts +40 -42
- package/dist/routes/computer-use/types.js +10 -10
- package/dist/routes/preview.d.ts +8 -2
- package/dist/routes/preview.js +8 -4
- package/dist/routes/scripted/bundle.d.ts +2 -2
- package/dist/routes/scripted/bundle.js +13 -12
- package/dist/routes/scripted/plan.d.ts +1 -1
- package/dist/routes/scripted/plan.js +9 -9
- package/dist/routes/scripted/result.js +5 -5
- package/dist/routes/scripted/route.js +5 -6
- package/dist/routes/scripted/scenario.js +2 -2
- package/dist/routes/scripted/setup.js +7 -7
- package/dist/routes/scripted/subject.js +1 -1
- package/dist/routes/scripted/surface-records.js +3 -3
- package/dist/routes/scripted/types.d.ts +3 -5
- package/dist/routes/scripted/types.js +1 -1
- package/dist/routes/shared-world/bundle-records.js +9 -8
- package/dist/routes/shared-world/bundle.d.ts +5 -5
- package/dist/routes/shared-world/bundle.js +40 -38
- package/dist/routes/shared-world/checkpoints.d.ts +1 -1
- package/dist/routes/shared-world/checkpoints.js +1 -1
- package/dist/routes/shared-world/comms.d.ts +5 -5
- package/dist/routes/shared-world/comms.js +14 -14
- 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 +7 -6
- package/dist/routes/shared-world/participant-specs.js +31 -24
- package/dist/routes/shared-world/plan.js +7 -7
- 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.js +14 -13
- package/dist/routes/shared-world/result.js +20 -21
- package/dist/routes/shared-world/route.js +23 -22
- package/dist/routes/shared-world/setup.d.ts +3 -3
- package/dist/routes/shared-world/setup.js +4 -4
- package/dist/routes/shared-world/types.d.ts +30 -28
- package/dist/routes/shared-world/types.js +4 -4
- package/dist/routes/terminal/adapter.d.ts +3 -3
- package/dist/routes/terminal/adapter.js +5 -5
- package/dist/routes/terminal/bundle.d.ts +3 -3
- package/dist/routes/terminal/bundle.js +22 -21
- package/dist/routes/terminal/credentials.d.ts +4 -4
- package/dist/routes/terminal/credentials.js +7 -7
- package/dist/routes/terminal/dry-run.js +4 -4
- package/dist/routes/terminal/encoding.js +2 -2
- package/dist/routes/terminal/ledger.d.ts +3 -3
- package/dist/routes/terminal/ledger.js +14 -14
- package/dist/routes/terminal/live-finish.js +3 -3
- package/dist/routes/terminal/live-sandbox.js +12 -13
- package/dist/routes/terminal/persona.js +1 -1
- package/dist/routes/terminal/plan.js +11 -11
- package/dist/routes/terminal/recorder.js +2 -2
- package/dist/routes/terminal/result.js +8 -8
- package/dist/routes/terminal/route.js +6 -7
- package/dist/routes/terminal/sandbox.d.ts +1 -1
- package/dist/routes/terminal/sandbox.js +1 -1
- package/dist/routes/terminal/session.js +8 -7
- 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 +2 -2
- package/dist/routes/terminal/trace.js +2 -2
- package/dist/routes/terminal/types.d.ts +26 -28
- package/dist/routes/terminal/types.js +3 -3
- package/dist/run/bundle-shape.js +3 -3
- package/dist/run/bundle.d.ts +46 -46
- package/dist/run/bundle.js +2 -1
- package/dist/run/cost-summary.js +3 -3
- package/dist/run/costs.js +7 -1
- package/dist/run/detail.d.ts +6 -6
- package/dist/run/detail.js +4 -4
- package/dist/run/dry-run-inputs.js +1 -1
- package/dist/run/dry-run.js +18 -18
- package/dist/run/judge.d.ts +19 -13
- package/dist/run/judge.js +18 -8
- package/dist/run/paths.d.ts +1 -1
- package/dist/run/paths.js +1 -1
- package/dist/run/pricing.d.ts +11 -6
- package/dist/run/pricing.js +20 -13
- package/dist/run/projection.d.ts +14 -14
- package/dist/run/projection.js +15 -15
- package/dist/run/reclaim.js +2 -2
- package/dist/run/results.d.ts +5 -5
- package/dist/run/run-index.d.ts +8 -6
- package/dist/run/run-index.js +15 -16
- 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 +5 -4
- package/dist/run/run.js +1 -1
- 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 +36 -35
- 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 +6 -6
- package/dist/run/stats.d.ts +12 -6
- package/dist/run/stats.js +116 -58
- package/dist/run/status.d.ts +8 -29
- package/dist/run/status.js +5 -27
- package/dist/run/stored-runs.js +2 -1
- package/dist/run/stream-shape.js +1 -1
- package/dist/run/streams.d.ts +6 -6
- 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/text.d.ts +2 -0
- package/dist/run/text.js +4 -0
- package/dist/run-lab.d.ts +7 -7
- package/dist/run-lab.js +1 -3
- 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 +1 -1
- package/dist/subject/desktop-cli.js +2 -2
- package/dist/subject/local-tree-archive.js +1 -1
- package/dist/subject/local-tree.d.ts +1 -1
- package/dist/subject/node-bootstrap.js +1 -1
- package/dist/subject/runtime.js +8 -9
- package/dist/subject/serve.d.ts +1 -1
- package/dist/subject/serve.js +3 -3
- package/dist/subject/state.d.ts +1 -1
- package/dist/subject/steps.d.ts +5 -5
- package/dist/subject/steps.js +4 -4
- 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 +9 -9
- package/dist/substrates/e2b/cdp-probe.js +14 -17
- package/dist/substrates/e2b/desktop-browser.d.ts +2 -2
- package/dist/substrates/e2b/desktop-browser.js +8 -8
- package/dist/substrates/e2b/desktop-cdp.d.ts +9 -9
- package/dist/substrates/e2b/desktop-cdp.js +8 -8
- 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 +3 -3
- package/dist/substrates/e2b/desktop-geometry.js +7 -7
- package/dist/substrates/e2b/desktop-media.d.ts +1 -1
- 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/sandbox.d.ts +1 -1
- package/dist/substrates/e2b/sandbox.js +1 -1
- package/dist/substrates/e2b/sdk.d.ts +11 -11
- package/dist/substrates/e2b/sdk.js +6 -6
- package/dist/tui/actions.d.ts +1 -1
- package/dist/tui/actions.js +13 -13
- 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 +82 -82
- 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 +4 -4
- package/dist/verify/subject.js +18 -18
- package/dist/verify/verify.js +92 -43
- package/docs/README.md +25 -32
- package/docs/architecture/actor-contract.md +56 -87
- package/docs/architecture/desktop-sessions.md +7 -7
- package/docs/architecture/external-public-shared-world.md +61 -59
- package/docs/architecture/github-feedback-loop.md +1 -4
- 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 +5 -5
- package/docs/architecture/terminal-product-route.md +67 -107
- 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 +45 -44
- package/docs/contracts/schemas.md +421 -362
- package/docs/contracts/study-analysis.md +3 -3
- 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/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/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 +60 -58
- 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.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/observer/static.d.ts +0 -39
- package/dist/observer/static.js +0 -369
- 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
|
@@ -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,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,15 @@ 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).
|
|
59
60
|
|
|
60
61
|
`onObservedUrl`, `onMessage` and `onScreenshot` are deprecated on `CuaLoopOptions`, and the next
|
|
61
62
|
minor removes them. A `runComputerUseLoop` caller that used them wraps the executor's `observe`
|
|
@@ -71,71 +72,72 @@ Flow, a host-first barrier inside `runConcurrentSharedWorld`'s fan-out:
|
|
|
71
72
|
`/\/lobby\/([A-Z2-9]{6})(?:$|[/?#])/` (a locale prefix `/en/lobby/CODE` and a query/hash suffix
|
|
72
73
|
are tolerated), a lobby code in its narration (`extractLobbyCodeFromNarration`), or a vision read
|
|
73
74
|
of its screenshot (`readLobbyCodeFromFrame`). The vision reads are out-of-band OpenAI calls, at
|
|
74
|
-
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
|
|
75
76
|
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 (
|
|
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,
|
|
79
80
|
because a direct `/lobby/CODE` visit does not auto-join a non-member (lobby-trivia's lobby page
|
|
80
81
|
redirects unknown/non-member sessions home); the follower goes through the real Join flow.
|
|
81
82
|
4. **Convergence confirmation.** Each follower's own `onObservedUrl`, or a vision read of its own
|
|
82
83
|
frame, confirms it reached `/lobby/CODE`; this observed convergence becomes the
|
|
83
|
-
`lobbyConvergenceDigest`, the pass signal that the
|
|
84
|
-
|
|
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.
|
|
85
86
|
5. **Fail-closed timeout.** If the host never yields a `/lobby/CODE` within the handoff deadline
|
|
86
87
|
(`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 `
|
|
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
|
|
89
90
|
records the host window + a handoff-failed outcome for followers. If the host participant ends without a
|
|
90
91
|
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
|
-
>
|
|
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.
|
|
101
103
|
|
|
102
104
|
## Observed-origin convergence (not declared)
|
|
103
105
|
|
|
104
|
-
The convergence proof is about what the participants
|
|
105
|
-
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
|
|
106
108
|
`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
|
|
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
|
|
112
114
|
(it then lists the distinct observed origin digests).
|
|
113
115
|
|
|
114
116
|
## Hygiene
|
|
115
117
|
|
|
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
|
|
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
|
|
119
121
|
as sha256-16 digests (`publicOriginDigest`, `lobbyConvergenceDigest`). This matches the existing
|
|
120
122
|
e2b-URL / host-digest redaction discipline.
|
|
121
123
|
|
|
122
124
|
## Mobile fidelity caveat
|
|
123
125
|
|
|
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
|
|
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.
|
|
128
130
|
`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-
|
|
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
|
|
131
133
|
touch devices. Do not over-read the results as true mobile-device coverage. That describes the
|
|
132
|
-
default. With `execution.desktop.fidelity.mobileEmulation: true
|
|
134
|
+
default. With `execution.desktop.fidelity.mobileEmulation: true`, Chromium participants on a mobile
|
|
133
135
|
preset get a DevTools device-metrics override at the preset width, plus DPR, touch emulation and a
|
|
134
136
|
mobile user agent. That is still not physical-device fidelity.
|
|
135
137
|
|
|
136
138
|
## Watch-from-phone
|
|
137
139
|
|
|
138
140
|
Native live-desktop `--expose` is not supported on the concurrent path; only the computer-use
|
|
139
|
-
|
|
141
|
+
route live-serves a run (`src/cli/io.ts`). Today, watch it from a phone via `humanish observe --all
|
|
140
142
|
--expose --tunnel … --oauth …` against the run directory's Observer (the concurrent path writes
|
|
141
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
|
|
|
@@ -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).
|
|
@@ -1,13 +1,8 @@
|
|
|
1
1
|
# Observer Architecture
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
terminal-product, fan-out, and shared-world evidence.
|
|
7
|
-
Plain computer-use and shared-world runs can publish an in-progress bundle to
|
|
8
|
-
an attached loopback Observer without persisting runtime stream-auth URLs. The
|
|
9
|
-
version-pinned README image is a synthetic technical sample, not real-application
|
|
10
|
-
proof.
|
|
3
|
+
The Observer renders synthetic streams and saved live browser, terminal-product, fan-out and
|
|
4
|
+
shared-world evidence. A computer-use or shared-world run can publish its in-progress bundle to an
|
|
5
|
+
attached loopback Observer without saving runtime stream-auth URLs.
|
|
11
6
|
|
|
12
7
|
## Decision
|
|
13
8
|
|
|
@@ -80,7 +75,7 @@ forwarding, and only contained run paths in the TUI's project are accepted.
|
|
|
80
75
|
| `watch` during a study | Saved evidence and available in-memory desktop streams | Until the attached command exits |
|
|
81
76
|
| `observe --run <id>` | Saved evidence from the selected run | Until the command exits |
|
|
82
77
|
| TUI Open in Observer | Saved evidence in the selected run; shares the project's evidence library | Until the TUI exits |
|
|
83
|
-
| `
|
|
78
|
+
| `observe --all` | Saved evidence across the project's library | Until the server command exits |
|
|
84
79
|
| Static HTML or `file://` | The exported snapshot | Independent of a server |
|
|
85
80
|
|
|
86
81
|
`observe` uses the same current-data projection as the attached viewer, scoped
|
|
@@ -103,7 +98,7 @@ mismatched records omit the observation. A stale heartbeat alone does not prove
|
|
|
103
98
|
interruption, and stored PIDs are neither probed nor returned. Static rendering
|
|
104
99
|
and export do not create this served-only observation.
|
|
105
100
|
|
|
106
|
-
Watch is deliberately distinct from `humanish
|
|
101
|
+
Watch is deliberately distinct from `humanish observe --all`. Watch serves one
|
|
107
102
|
attached run, and the process that created it may inject runtime stream URLs
|
|
108
103
|
(live hosted-desktop viewers) into the observer data it serves. Serve is the
|
|
109
104
|
library surface (every run under `.humanish/runs/`) and never serves runtime
|
|
@@ -123,23 +118,23 @@ Misdirected Request` otherwise) and the shared `buildServeSecurityHeaders()` on
|
|
|
123
118
|
every response (both live in `src/observer/http.ts`, shared without a module cycle).
|
|
124
119
|
The Host allowlist applies in exposed mode; frame-denial headers apply in both modes.
|
|
125
120
|
|
|
126
|
-
Exposed mode also
|
|
121
|
+
Exposed mode also scopes the surface to the attached live run (`result.run`): the
|
|
127
122
|
`/_humanish/history.json` index is filtered to that one run, and `/_humanish/runs/<id>/…`
|
|
128
123
|
404s byte-identically to a nonexistent run for any other id. A remote viewer who
|
|
129
124
|
clears the edge auth can therefore see only the run being watched. They can never
|
|
130
125
|
enumerate or fetch a prior run's raw, unverified evidence. Loopback keeps the full cross-run
|
|
131
126
|
library (history + any run by id) exactly as before.
|
|
132
127
|
|
|
133
|
-
`watch --expose` is the
|
|
128
|
+
`watch --expose` is the one surface that deliberately streams the live E2B
|
|
134
129
|
desktop to a remote viewer: the attached watch process genuinely holds the
|
|
135
130
|
runtime stream URLs (in the in-memory `WeakMap`, never persisted), and watching
|
|
136
131
|
from a phone needs them. It is safe only because the
|
|
137
132
|
ngrok edge (Google OAuth + allow rules) or an operator `--public-url` edge
|
|
138
133
|
authenticates the viewer first, so `watch --expose` always requires edge
|
|
139
134
|
auth (a live run is never `share_ready`, so `--safe` alone cannot gate it). The
|
|
140
|
-
attached server comes up
|
|
135
|
+
attached server comes up during the run and survives a `timed_out`/`failed` run
|
|
141
136
|
(serving is not gated on pass/fail), so a failed run's evidence stays inspectable
|
|
142
|
-
to Ctrl-C. `
|
|
137
|
+
to Ctrl-C. `observe --all` still never injects stream URLs. See
|
|
143
138
|
[Serve: the run library surface](serve.md).
|
|
144
139
|
|
|
145
140
|
### Live desktop iframe authority
|
|
@@ -178,8 +173,9 @@ between an active study and its provisional evidence outcome.
|
|
|
178
173
|
|
|
179
174
|
## UI Shape
|
|
180
175
|
|
|
181
|
-
|
|
182
|
-
|
|
176
|
+
[Watch and review in the Observer](https://humanish.dev/docs/review-surfaces#watch-and-review-in-the-observer)
|
|
177
|
+
describes the current controls, entry points and timing limits for users;
|
|
178
|
+
[Browser checks](#browser-checks) below covers the proofs that pin them.
|
|
183
179
|
|
|
184
180
|
The Observer shell has:
|
|
185
181
|
|
|
@@ -198,7 +194,7 @@ the frozen Observer data schema or start provider requests. Analysis polling has
|
|
|
198
194
|
an independent lifecycle, so a delayed companion does not stall recording updates.
|
|
199
195
|
Invalid or stale interpretation never overwrites original participant outcomes.
|
|
200
196
|
Recording navigation retains its originating view, and nonvisual citations open
|
|
201
|
-
the source event
|
|
197
|
+
the source event with no invented playback frame.
|
|
202
198
|
|
|
203
199
|
The participant grid uses equal-height previews whose widths follow each screen's
|
|
204
200
|
aspect ratio. A 44px identity/source/outcome caption sits below the captured pixels;
|
|
@@ -230,29 +226,16 @@ A host adapter may provide:
|
|
|
230
226
|
If no embed URL exists, the Observer still renders the Codex-style timeline and
|
|
231
227
|
session contract instead of failing the stream.
|
|
232
228
|
|
|
233
|
-
##
|
|
234
|
-
|
|
235
|
-
The original 2026-06-01 slice implemented the Observer substrate and synthetic
|
|
236
|
-
stream contracts; local `codex-exec` active-run snapshots followed.
|
|
237
|
-
|
|
238
|
-
Subsequent additions through 2026-06-11 included:
|
|
229
|
+
## Remaining gaps
|
|
239
230
|
|
|
240
|
-
|
|
241
|
-
`browser.steps` authored in `humanish/scenarios/*.yaml` (`src/actors/scripted-browser/`);
|
|
242
|
-
- native Codex app-server session adapter (`src/actors/codex/app-server.ts`,
|
|
243
|
-
registered in `src/actors/registry.ts`);
|
|
244
|
-
- E2B desktop participants on the computer-use and shared-world routes;
|
|
245
|
-
- computer-use bundles persist a `screenshots/` directory and the Observer
|
|
246
|
-
renders the frames (`src/routes/computer-use/participant-execution.ts` writes them).
|
|
247
|
-
|
|
248
|
-
Intentionally still adapter work:
|
|
231
|
+
These remain adapter work:
|
|
249
232
|
|
|
250
233
|
- local PTY capture;
|
|
251
234
|
- Codex TUI live follow after workspace trust bootstrap;
|
|
252
235
|
- richer screenshot/trace galleries across multi-step product journeys;
|
|
253
236
|
- reviewer acceptance gates over real product behavior.
|
|
254
237
|
|
|
255
|
-
## The rendering layer
|
|
238
|
+
## The rendering layer
|
|
256
239
|
|
|
257
240
|
The renderer is the `observer/` workspace: a Vite single-file build on the
|
|
258
241
|
`@humanish` registry tokens, frozen against `humanish.observer-data.v1`
|
|
@@ -260,10 +243,27 @@ The renderer is the `observer/` workspace: a Vite single-file build on the
|
|
|
260
243
|
artifact to `dist/observer-app.html`; in a repo checkout a missing or stale
|
|
261
244
|
artifact auto-builds, and an unconditional preflight at CLI startup makes a
|
|
262
245
|
broken artifact cost seconds, never a completed session. `renderObserverHtml`,
|
|
263
|
-
the one function every surface (observe,
|
|
246
|
+
the one function every surface (observe, observe --all, watch, studies) renders through,
|
|
264
247
|
injects the run's snapshot into the artifact
|
|
265
248
|
(`tests/observer/artifact.test.ts` pins the path, cold, so CI exercises the
|
|
266
249
|
auto-build every run). The legacy string-concat renderer was deleted at
|
|
267
250
|
cutover; there is no flag and no fallback. Rollback is a version pin. The
|
|
268
251
|
workspace's own tests pin the durability constraints (self-contained single
|
|
269
252
|
file, fonts inlined, no network references).
|
|
253
|
+
|
|
254
|
+
## Browser checks
|
|
255
|
+
|
|
256
|
+
`pnpm observer:browser:proof` exercises generated synthetic evidence in the
|
|
257
|
+
production artifact. `pnpm observer:iframe:proof`, after `pnpm build`, checks the
|
|
258
|
+
actual serving boundary against direct, redirected and scripted iframe attacks.
|
|
259
|
+
CI retains their screenshots and JSON receipts. These Chromium checks do not
|
|
260
|
+
claim physical-device or non-Chromium coverage. Actual provider checks and their
|
|
261
|
+
resource-cleanup receipts are separate acceptance evidence.
|
|
262
|
+
|
|
263
|
+
Interaction references rechecked September 8, 2026:
|
|
264
|
+
[Base UI popover](https://base-ui.com/react/components/popover),
|
|
265
|
+
[React state structure](https://react.dev/learn/choosing-the-state-structure),
|
|
266
|
+
[WAI-ARIA tabs](https://www.w3.org/WAI/ARIA/apg/patterns/tabs/),
|
|
267
|
+
[iframe sandboxing](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/iframe),
|
|
268
|
+
[Playwright Trace Viewer](https://playwright.dev/docs/trace-viewer), and
|
|
269
|
+
[PostHog recording controls](https://posthog.com/docs/session-replay/how-to-watch-recordings).
|
|
@@ -5,24 +5,28 @@ execution, with a separate conversation, process and tool authority. It can use
|
|
|
5
5
|
the same host Codex login as a local-agent participant. Existing API analysis
|
|
6
6
|
remains a separate provider.
|
|
7
7
|
|
|
8
|
-
The
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
8
|
+
The launcher profile is **a stable Codex CLI release from 0.154.0 on, Linux x64 or Apple
|
|
9
|
+
Silicon macOS, file-backed ChatGPT login, `gpt-6-astra`, low reasoning effort**.
|
|
10
|
+
[`src/actors/codex/codex-admission.ts`](https://github.com/danielgwilson/humanish/blob/main/src/actors/codex/codex-admission.ts)
|
|
11
|
+
admits every stable `MAJOR.MINOR.PATCH` release from 0.154.0, the oldest known to work, except
|
|
12
|
+
those in `REFUSED_CODEX_CLI_VERSIONS` (none yet). There is no ceiling: a new release runs the
|
|
13
|
+
day it ships, and one that breaks humanish is refused there until humanish handles it.
|
|
14
|
+
Prereleases and older releases are refused, and the refusal names the release and why. Hosted
|
|
15
|
+
participants (operator mode) run the same releases on Linux x64 and arm64 and macOS x64 and
|
|
16
|
+
arm64; a hosted run on a release outside `TESTED_CODEX_CLI_VERSIONS` records a warning that its
|
|
17
|
+
evidence rests on the checks each launch makes. `TESTED_CODEX_CLI_VERSIONS` gates nothing. It
|
|
18
|
+
lists the releases the qualifier passed on Linux x64, and its newest is the default and the
|
|
19
|
+
install target: 0.154.0, 0.157.1
|
|
20
|
+
([receipt](https://github.com/danielgwilson/humanish/blob/main/docs/evidence/computer-use/codex-cli-0.157.1-requalification-2026-09-30.md))
|
|
14
21
|
0.159.2
|
|
15
|
-
([receipt](https://github.com/danielgwilson/humanish/blob/main/docs/
|
|
22
|
+
([receipt](https://github.com/danielgwilson/humanish/blob/main/docs/evidence/computer-use/codex-cli-0.159.2-qualification-2026-09-30.md))
|
|
16
23
|
0.159.3
|
|
17
|
-
([receipt](https://github.com/danielgwilson/humanish/blob/main/docs/
|
|
24
|
+
([receipt](https://github.com/danielgwilson/humanish/blob/main/docs/evidence/computer-use/codex-cli-0.159.3-qualification-2026-10-01.md))
|
|
18
25
|
and 0.160.0
|
|
19
|
-
([receipt](https://github.com/danielgwilson/humanish/blob/main/docs/
|
|
20
|
-
Apple Silicon
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
listed separately in `PREEXISTING_CODEX_CLI_ADMISSIONS`: it is what they ran before per-host
|
|
24
|
-
lists existed, not a qualification, and no later release is admitted there. Other releases and
|
|
25
|
-
platforms, keychain-only logins and API-key Codex logins are refused before a model turn.
|
|
26
|
+
([receipt](https://github.com/danielgwilson/humanish/blob/main/docs/evidence/computer-use/codex-cli-0.160.0-qualification-2026-10-01.md)).
|
|
27
|
+
On Apple Silicon, 0.154.0 passed installed participant/analysis studies and the native dispatch
|
|
28
|
+
restriction check on an M5 Max; no later release has run on a Mac. Other platforms,
|
|
29
|
+
keychain-only logins and API-key Codex logins are refused before a model turn.
|
|
26
30
|
|
|
27
31
|
A release string is a compatibility check, not binary attestation. The launcher compares the
|
|
28
32
|
release that `codex --version`, initialize and thread start report, then executes the same
|
|
@@ -30,8 +34,8 @@ path; it does not pin the executable's contents, and a modified binary can repor
|
|
|
30
34
|
The launcher records the detected release in the participant execution profile and in the
|
|
31
35
|
analysis identity. A recorded release alone is not execution proof: prelaunch and failed
|
|
32
36
|
attempts can carry the declared default, and a request's `dispatched` and `profileVerified`
|
|
33
|
-
receipt shows that the launched release passed its checks. Saved bundles naming any
|
|
34
|
-
release stay readable.
|
|
37
|
+
receipt shows that the launched release passed its checks. Saved bundles naming any stable
|
|
38
|
+
release from 0.154.0 on stay readable, whether or not a launch list names it.
|
|
35
39
|
Readiness validates the installation and effective profile without submitting a
|
|
36
40
|
model turn; it does not guarantee current quota or model access.
|
|
37
41
|
|
|
@@ -159,10 +163,11 @@ not established by that proof. Recovery deliberately fails closed if storage
|
|
|
159
163
|
behaves differently. Keychain/other-platform support and whole-process-tree
|
|
160
164
|
leases require their own qualification.
|
|
161
165
|
|
|
162
|
-
##
|
|
166
|
+
## Testing a Codex CLI release
|
|
163
167
|
|
|
164
|
-
|
|
165
|
-
`docs/
|
|
168
|
+
Admission does not wait for a test. A release enters `TESTED_CODEX_CLI_VERSIONS`, which gates
|
|
169
|
+
nothing, with a dated receipt under `docs/evidence/computer-use/` showing all of
|
|
170
|
+
the following, on Linux x64:
|
|
166
171
|
|
|
167
172
|
1. The release notes since the baseline were read for changes near the tool boundary.
|
|
168
173
|
2. A drift check against a release already qualified on the host found no exec, connection or
|
|
@@ -170,27 +175,28 @@ A release enters a host's list only with a dated receipt under
|
|
|
170
175
|
launches, and the same tool inventory, denials and isolate behavior. `pnpm codex:qualify`
|
|
171
176
|
runs this check; see "The qualifier" below.
|
|
172
177
|
3. One hosted participant study with the candidate first on `PATH` (for example
|
|
173
|
-
`PATH=<evidence>/npm-<version>/node_modules/.bin:$PATH pnpm humanish
|
|
178
|
+
`PATH=<evidence>/npm-<version>/node_modules/.bin:$PATH pnpm humanish run <study>
|
|
174
179
|
--env-file <file with E2B_API_KEY only>`) reached its goal in the final capture, with a
|
|
175
180
|
verified request receipt, `humanish verify --run <id>` passing and the automatic Codex
|
|
176
181
|
analysis recording the release. Keep `OPENAI_API_KEY` out of that environment so the
|
|
177
182
|
participant stays on ChatGPT-account billing.
|
|
178
183
|
|
|
179
184
|
The drift check compares a candidate with a vendor release that has already been qualified. It
|
|
180
|
-
can show that
|
|
185
|
+
can show that a benign new release does nothing new in those scenarios; it cannot show that a
|
|
181
186
|
binary built to evade it is safe. Pair that with the attestation limit above: the launcher
|
|
182
187
|
admits by release string and does not pin the executable.
|
|
183
188
|
|
|
184
|
-
Then commit the release in `
|
|
185
|
-
|
|
186
|
-
(
|
|
187
|
-
(`observer/lib/actor-execution-profile.ts`).
|
|
188
|
-
what differs
|
|
189
|
+
Then commit the release in `TESTED_CODEX_CLI_VERSIONS` (`src/actors/codex/codex-admission.ts`);
|
|
190
|
+
launch admission does not change. Readers need no change: saved
|
|
191
|
+
profiles may name any stable release from `RECORDED_CODEX_CLI_FLOOR` (0.154.0) on, in
|
|
192
|
+
`src/actors/contract.ts` and the Observer's copy (`observer/lib/actor-execution-profile.ts`).
|
|
193
|
+
If any check fails, record what differs; a release that breaks humanish goes in
|
|
194
|
+
`REFUSED_CODEX_CLI_VERSIONS` with its issue.
|
|
189
195
|
|
|
190
196
|
### The qualifier
|
|
191
197
|
|
|
192
198
|
`pnpm codex:qualify` produces the drift evidence step 2 above requires. Its threat model:
|
|
193
|
-
it detects
|
|
199
|
+
it detects a benign new vendor release that, in these scenarios, executes a program, connects
|
|
194
200
|
to a destination or writes a file the baseline release did not, and it fails closed when the
|
|
195
201
|
harness cannot see (a failed trace, sampler read or parse). A binary built to evade it is out of
|
|
196
202
|
scope. Named limits, none of which it inspects:
|