humanish 0.107.0 → 0.109.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +73 -69
- package/CHANGELOG.md +27 -0
- package/CONTEXT.md +51 -44
- package/README.md +148 -175
- package/SECURITY.md +16 -26
- package/TELEMETRY.md +8 -6
- package/dist/actors/affordance.d.ts +4 -4
- package/dist/actors/affordance.js +12 -12
- package/dist/actors/agent-session.d.ts +2 -2
- package/dist/actors/agent-session.js +7 -7
- package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
- package/dist/actors/codex/app-server-actor-trace.js +1 -1
- package/dist/actors/codex/app-server-trace.js +2 -1
- package/dist/actors/codex/app-server-ui.js +1 -1
- package/dist/actors/codex/codex-admission.d.ts +91 -0
- package/dist/actors/codex/codex-admission.js +150 -0
- package/dist/actors/codex/restricted-executable.d.ts +4 -4
- package/dist/actors/codex/restricted-executable.js +8 -8
- package/dist/actors/codex/restricted-launch.d.ts +2 -1
- package/dist/actors/codex/restricted-launch.js +1 -1
- package/dist/actors/codex/restricted-participant.js +20 -18
- package/dist/actors/codex/restricted-policy.d.ts +2 -2
- package/dist/actors/codex/restricted-policy.js +2 -2
- package/dist/actors/codex/restricted-session.d.ts +3 -3
- package/dist/actors/codex/restricted-session.js +10 -5
- package/dist/actors/computer-use/actor.d.ts +18 -18
- package/dist/actors/computer-use/actor.js +4 -4
- package/dist/actors/computer-use/admission-limit.d.ts +3 -3
- package/dist/actors/computer-use/admission-limit.js +4 -4
- package/dist/actors/computer-use/executor-error.d.ts +2 -2
- package/dist/actors/computer-use/executor-error.js +3 -3
- package/dist/actors/computer-use/loop/actions.d.ts +3 -3
- package/dist/actors/computer-use/loop/actions.js +15 -15
- package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
- package/dist/actors/computer-use/loop/backstop.js +14 -12
- package/dist/actors/computer-use/loop/debrief.js +2 -2
- package/dist/actors/computer-use/loop/ending.d.ts +6 -6
- package/dist/actors/computer-use/loop/ending.js +18 -17
- package/dist/actors/computer-use/loop/observation.d.ts +2 -2
- package/dist/actors/computer-use/loop/observation.js +15 -14
- package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
- package/dist/actors/computer-use/loop/provider-call.js +12 -12
- package/dist/actors/computer-use/loop/session.d.ts +4 -4
- package/dist/actors/computer-use/loop/session.js +4 -4
- package/dist/actors/computer-use/loop/spend.d.ts +1 -1
- package/dist/actors/computer-use/loop/spend.js +1 -1
- package/dist/actors/computer-use/loop/trace.js +11 -9
- package/dist/actors/computer-use/loop/types.d.ts +47 -45
- package/dist/actors/computer-use/loop/usage.d.ts +2 -2
- package/dist/actors/computer-use/loop/usage.js +2 -2
- package/dist/actors/computer-use/loop.d.ts +6 -1
- package/dist/actors/computer-use/loop.js +26 -4
- package/dist/actors/computer-use/openai-context.d.ts +37 -0
- package/dist/actors/computer-use/openai-context.js +214 -0
- package/dist/actors/computer-use/openai-provider.d.ts +13 -10
- package/dist/actors/computer-use/openai-provider.js +52 -41
- package/dist/actors/computer-use/openai-requests.d.ts +36 -10
- package/dist/actors/computer-use/openai-requests.js +82 -15
- package/dist/actors/computer-use/openai-wire.d.ts +19 -7
- package/dist/actors/computer-use/openai-wire.js +36 -34
- package/dist/actors/computer-use/provider-error.d.ts +4 -4
- package/dist/actors/computer-use/provider-error.js +6 -6
- package/dist/actors/contract.d.ts +82 -47
- package/dist/actors/contract.js +30 -24
- package/dist/actors/local-agent/claude-session.d.ts +1 -1
- package/dist/actors/local-agent/claude-session.js +13 -12
- package/dist/actors/local-agent/cli.d.ts +9 -7
- package/dist/actors/local-agent/cli.js +24 -28
- package/dist/actors/local-agent/readiness.d.ts +2 -2
- package/dist/actors/local-agent/readiness.js +4 -4
- package/dist/actors/reasoning-effort.js +8 -8
- package/dist/actors/registry.d.ts +12 -12
- package/dist/actors/registry.js +21 -20
- package/dist/actors/scripted-browser/actor.d.ts +10 -10
- package/dist/actors/scripted-browser/actor.js +17 -17
- package/dist/actors/scripted-browser/browser-command.js +1 -1
- package/dist/actors/scripted-browser/steps.js +1 -1
- package/dist/actors/scripted-browser/types.d.ts +1 -1
- package/dist/actors/stop-conditions.d.ts +1 -1
- package/dist/analysis/automatic-completion.d.ts +7 -7
- package/dist/analysis/automatic-completion.js +1 -1
- package/dist/analysis/automatic-config.d.ts +6 -6
- package/dist/analysis/automatic-config.js +1 -1
- package/dist/analysis/codex-config.d.ts +6 -2
- package/dist/analysis/codex-config.js +22 -14
- package/dist/analysis/execute.d.ts +1 -1
- package/dist/analysis/execute.js +1 -1
- package/dist/analysis/service.js +5 -5
- package/dist/analysis/types.d.ts +6 -0
- package/dist/browser-control/client.js +16 -16
- package/dist/browser-control/dispatcher.js +4 -4
- package/dist/browser-control/protocol.js +14 -14
- package/dist/browser-control/recording-transfer.js +4 -4
- package/dist/browser-control/transport.js +7 -7
- package/dist/cli/commands/analysis-signals.d.ts +2 -2
- package/dist/cli/commands/analyze.js +19 -16
- package/dist/cli/commands/codex.js +9 -9
- package/dist/cli/commands/comms.js +48 -35
- package/dist/cli/commands/feedback.js +20 -21
- package/dist/cli/commands/migrate.d.ts +4 -0
- package/dist/cli/commands/migrate.js +65 -0
- package/dist/cli/commands/observe.d.ts +0 -1
- package/dist/cli/commands/observe.js +136 -112
- package/dist/cli/commands/run-command.d.ts +10 -0
- package/dist/cli/commands/run-command.js +85 -0
- package/dist/cli/commands/runs.js +136 -139
- package/dist/cli/commands/setup.d.ts +2 -2
- package/dist/cli/commands/setup.js +27 -24
- package/dist/cli/commands/study-format.d.ts +9 -0
- package/dist/cli/commands/{lab-format.js → study-format.js} +39 -27
- package/dist/cli/commands/{lab-route-computer-use.d.ts → study-route-computer-use.d.ts} +6 -6
- package/dist/cli/commands/{lab-route-computer-use.js → study-route-computer-use.js} +17 -18
- package/dist/cli/commands/{lab-route-open.d.ts → study-route-open.d.ts} +4 -4
- package/dist/cli/commands/{lab-route-open.js → study-route-open.js} +2 -2
- package/dist/cli/commands/{lab-route-preview.d.ts → study-route-preview.d.ts} +7 -7
- package/dist/cli/commands/{lab-route-preview.js → study-route-preview.js} +7 -6
- package/dist/cli/commands/study-route-run.d.ts +19 -0
- package/dist/cli/commands/{lab-route-run.js → study-route-run.js} +6 -6
- package/dist/cli/commands/study-route-scripted.d.ts +17 -0
- package/dist/cli/commands/{lab-route-scripted.js → study-route-scripted.js} +4 -4
- package/dist/cli/commands/{lab-route-shared-world.d.ts → study-route-shared-world.d.ts} +5 -5
- package/dist/cli/commands/{lab-route-shared-world.js → study-route-shared-world.js} +10 -10
- package/dist/cli/commands/study-route-terminal.d.ts +17 -0
- package/dist/cli/commands/{lab-route-terminal.js → study-route-terminal.js} +4 -4
- package/dist/cli/commands/study-run.d.ts +9 -0
- package/dist/cli/commands/{lab-run.js → study-run.js} +44 -45
- package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +7 -7
- package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +2 -2
- package/dist/cli/commands/study.d.ts +3 -0
- package/dist/cli/commands/study.js +146 -0
- package/dist/cli/commands/tui.d.ts +4 -4
- package/dist/cli/commands/tui.js +31 -31
- package/dist/cli/commands/watch.js +71 -121
- package/dist/cli/deprecations.d.ts +6 -0
- package/dist/cli/deprecations.js +18 -0
- package/dist/cli/doctor.d.ts +18 -8
- package/dist/cli/doctor.js +114 -59
- package/dist/cli/first-run-path.d.ts +15 -13
- package/dist/cli/first-run-path.js +35 -33
- package/dist/cli/io.d.ts +44 -9
- package/dist/cli/io.js +98 -23
- package/dist/cli/observer-follow.d.ts +3 -3
- package/dist/cli/observer-follow.js +6 -7
- package/dist/cli/orientation.d.ts +10 -7
- package/dist/cli/orientation.js +89 -47
- package/dist/cli/product-sentence.d.ts +6 -0
- package/dist/cli/product-sentence.js +6 -0
- package/dist/cli/program.d.ts +6 -1
- package/dist/cli/program.js +111 -43
- package/dist/cli/telemetry.d.ts +16 -16
- package/dist/cli/telemetry.js +46 -44
- package/dist/cli.js +1 -1
- package/dist/comms/capture-surface.d.ts +13 -12
- package/dist/comms/capture-surface.js +23 -22
- package/dist/comms/catch-host.d.ts +7 -7
- package/dist/comms/catch-host.js +17 -17
- package/dist/comms/connections.d.ts +1 -1
- package/dist/comms/connections.js +2 -2
- package/dist/comms/email-catch.d.ts +3 -3
- package/dist/comms/email-catch.js +8 -8
- package/dist/comms/external-evidence.d.ts +5 -5
- package/dist/comms/external-evidence.js +5 -4
- package/dist/comms/extract.js +2 -2
- package/dist/comms/fake-inbox.d.ts +3 -3
- package/dist/comms/fake-inbox.js +3 -3
- package/dist/comms/receiving-render.d.ts +1 -1
- package/dist/comms/receiving-render.js +2 -2
- package/dist/comms/receiving-runtime.d.ts +4 -4
- package/dist/comms/sandbox-catch-script.d.ts +6 -6
- package/dist/comms/sandbox-catch-script.js +6 -6
- package/dist/comms/sandbox-catch.d.ts +38 -39
- package/dist/comms/sandbox-catch.js +36 -37
- package/dist/comms/setup.d.ts +2 -2
- package/dist/comms/setup.js +56 -25
- package/dist/comms/thread-evidence.d.ts +1 -1
- package/dist/comms/thread-evidence.js +6 -6
- package/dist/comms/types.d.ts +6 -6
- package/dist/comms/types.js +3 -3
- package/dist/evidence/frame-signature.d.ts +1 -1
- package/dist/evidence/frame-signature.js +4 -4
- package/dist/evidence/redaction.d.ts +3 -3
- package/dist/evidence/redaction.js +4 -4
- package/dist/feedback/draft.js +38 -80
- package/dist/feedback/export-bundle.js +1 -1
- package/dist/feedback/export.d.ts +5 -1
- package/dist/feedback/export.js +10 -10
- package/dist/feedback/feedback.d.ts +2 -2
- package/dist/feedback/feedback.js +21 -3
- package/dist/feedback/proof.d.ts +1 -1
- package/dist/feedback/proof.js +2 -2
- package/dist/guest/bootstrap.js +6 -6
- package/dist/guest/browser-tools.js +8 -8
- package/dist/guest/chromium-text.js +19 -19
- package/dist/guest/desktop-executor.d.ts +2 -2
- package/dist/guest/desktop-executor.js +20 -20
- package/dist/guest/desktop-keys.js +4 -4
- package/dist/guest/desktop-media.d.ts +2 -2
- package/dist/guest/desktop-media.js +16 -16
- package/dist/guest/desktop-native.d.ts +1 -1
- package/dist/guest/desktop-native.js +10 -10
- package/dist/guest/runtime-desktop.js +2 -2
- package/dist/guest/runtime-processes.d.ts +2 -2
- package/dist/guest/runtime-processes.js +2 -2
- package/dist/guest/runtime.js +6 -6
- package/dist/index.d.ts +14 -14
- package/dist/index.js +8 -8
- package/dist/keys/key-resolution.d.ts +5 -5
- package/dist/keys/key-resolution.js +23 -23
- package/dist/observer/artifact.d.ts +2 -2
- package/dist/observer/artifact.js +7 -7
- package/dist/observer/data.d.ts +6 -6
- package/dist/observer/data.js +5 -4
- package/dist/observer/exposure.d.ts +1 -1
- package/dist/observer/exposure.js +11 -11
- package/dist/observer/http.js +1 -1
- package/dist/observer/library.d.ts +3 -1
- package/dist/observer/library.js +8 -3
- package/dist/observer/listen.js +5 -4
- package/dist/observer/render.d.ts +1 -1
- package/dist/observer/render.js +17 -6
- package/dist/observer/run-routes.d.ts +4 -3
- package/dist/observer/run-routes.js +38 -13
- package/dist/observer/serve.d.ts +1 -1
- package/dist/observer/serve.js +7 -3
- package/dist/observer/tunnel.js +1 -1
- package/dist/observer-app.html +4 -4
- package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
- package/dist/routes/computer-use/bundle-parts.js +18 -17
- package/dist/routes/computer-use/bundle.d.ts +2 -2
- package/dist/routes/computer-use/bundle.js +10 -9
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +6 -6
- package/dist/routes/computer-use/e2b-desktop/comms.js +18 -17
- package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +5 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
- package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/prepare.js +10 -10
- package/dist/routes/computer-use/e2b-desktop/start.js +7 -7
- package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
- package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -2
- package/dist/routes/computer-use/external-comms.d.ts +4 -4
- package/dist/routes/computer-use/external-comms.js +1 -1
- package/dist/routes/computer-use/fanout-bundle.js +27 -26
- package/dist/routes/computer-use/fanout-records.js +12 -13
- package/dist/routes/computer-use/live-flush.d.ts +4 -4
- package/dist/routes/computer-use/live-flush.js +6 -6
- package/dist/routes/computer-use/live-phase.d.ts +5 -4
- package/dist/routes/computer-use/live-phase.js +8 -8
- package/dist/routes/computer-use/local-tree-pack.d.ts +5 -5
- package/dist/routes/computer-use/local-tree-pack.js +1 -1
- package/dist/routes/computer-use/local-vm.d.ts +8 -8
- package/dist/routes/computer-use/local-vm.js +3 -3
- package/dist/routes/computer-use/participant-desktop.d.ts +7 -7
- package/dist/routes/computer-use/participant-desktop.js +5 -5
- package/dist/routes/computer-use/participant-execution.d.ts +4 -4
- package/dist/routes/computer-use/participant-execution.js +10 -10
- package/dist/routes/computer-use/participant-model.d.ts +6 -0
- package/dist/routes/computer-use/participant-model.js +33 -15
- package/dist/routes/computer-use/participant-prompt.d.ts +15 -15
- package/dist/routes/computer-use/participant-prompt.js +9 -9
- package/dist/routes/computer-use/participant-runs.d.ts +16 -16
- package/dist/routes/computer-use/participant-runs.js +26 -25
- package/dist/routes/computer-use/plan.d.ts +12 -12
- package/dist/routes/computer-use/plan.js +42 -42
- package/dist/routes/computer-use/preflight.d.ts +5 -5
- package/dist/routes/computer-use/preflight.js +25 -25
- package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
- package/dist/routes/computer-use/rerun-selection.js +4 -3
- package/dist/routes/computer-use/result.d.ts +4 -4
- package/dist/routes/computer-use/result.js +22 -21
- package/dist/routes/computer-use/route.d.ts +12 -11
- package/dist/routes/computer-use/route.js +31 -30
- package/dist/routes/computer-use/self-report.d.ts +7 -7
- package/dist/routes/computer-use/self-report.js +32 -32
- package/dist/routes/computer-use/setup.d.ts +23 -23
- package/dist/routes/computer-use/setup.js +28 -29
- package/dist/routes/computer-use/single-bundle.d.ts +11 -11
- package/dist/routes/computer-use/single-bundle.js +40 -41
- package/dist/routes/computer-use/subject-projection.d.ts +4 -4
- package/dist/routes/computer-use/subject-projection.js +6 -6
- package/dist/routes/computer-use/types.d.ts +71 -73
- package/dist/routes/computer-use/types.js +12 -12
- package/dist/routes/preview.d.ts +13 -7
- package/dist/routes/preview.js +11 -7
- package/dist/routes/scripted/bundle.d.ts +7 -7
- package/dist/routes/scripted/bundle.js +20 -18
- package/dist/routes/scripted/plan.d.ts +8 -8
- package/dist/routes/scripted/plan.js +13 -13
- package/dist/routes/scripted/result.d.ts +3 -3
- package/dist/routes/scripted/result.js +13 -13
- package/dist/routes/scripted/route.d.ts +9 -9
- package/dist/routes/scripted/route.js +15 -16
- package/dist/routes/scripted/scenario.d.ts +1 -1
- package/dist/routes/scripted/scenario.js +5 -5
- package/dist/routes/scripted/setup.d.ts +6 -6
- package/dist/routes/scripted/setup.js +8 -8
- package/dist/routes/scripted/subject.d.ts +5 -5
- package/dist/routes/scripted/subject.js +4 -4
- package/dist/routes/scripted/surface-records.d.ts +1 -1
- package/dist/routes/scripted/surface-records.js +4 -4
- package/dist/routes/scripted/surface-sessions.d.ts +3 -3
- package/dist/routes/scripted/types.d.ts +18 -20
- package/dist/routes/scripted/types.js +2 -2
- package/dist/routes/shared-world/bundle-records.js +11 -10
- package/dist/routes/shared-world/bundle.d.ts +5 -5
- package/dist/routes/shared-world/bundle.js +46 -43
- package/dist/routes/shared-world/checkpoints.d.ts +4 -4
- package/dist/routes/shared-world/checkpoints.js +2 -2
- package/dist/routes/shared-world/comms.d.ts +14 -14
- package/dist/routes/shared-world/comms.js +19 -18
- package/dist/routes/shared-world/external-public.d.ts +4 -3
- package/dist/routes/shared-world/external-public.js +16 -12
- package/dist/routes/shared-world/handoff.d.ts +7 -6
- package/dist/routes/shared-world/handoff.js +65 -57
- package/dist/routes/shared-world/lobby-code.d.ts +2 -2
- package/dist/routes/shared-world/lobby-code.js +9 -9
- package/dist/routes/shared-world/participant-specs.d.ts +10 -9
- package/dist/routes/shared-world/participant-specs.js +38 -31
- package/dist/routes/shared-world/plan.d.ts +9 -9
- package/dist/routes/shared-world/plan.js +16 -16
- package/dist/routes/shared-world/provenance.d.ts +2 -2
- package/dist/routes/shared-world/provenance.js +2 -2
- package/dist/routes/shared-world/provisioned.d.ts +8 -8
- package/dist/routes/shared-world/provisioned.js +18 -17
- package/dist/routes/shared-world/result.d.ts +6 -6
- package/dist/routes/shared-world/result.js +29 -29
- package/dist/routes/shared-world/route.d.ts +11 -11
- package/dist/routes/shared-world/route.js +40 -39
- package/dist/routes/shared-world/setup.d.ts +16 -16
- package/dist/routes/shared-world/setup.js +23 -23
- package/dist/routes/shared-world/types.d.ts +55 -53
- package/dist/routes/shared-world/types.js +4 -4
- package/dist/routes/terminal/adapter.d.ts +5 -5
- package/dist/routes/terminal/adapter.js +9 -9
- package/dist/routes/terminal/bundle.d.ts +13 -13
- package/dist/routes/terminal/bundle.js +28 -27
- package/dist/routes/terminal/credentials.d.ts +8 -8
- package/dist/routes/terminal/credentials.js +12 -12
- package/dist/routes/terminal/dry-run.d.ts +4 -4
- package/dist/routes/terminal/dry-run.js +12 -12
- package/dist/routes/terminal/encoding.js +2 -2
- package/dist/routes/terminal/ledger.d.ts +5 -5
- package/dist/routes/terminal/ledger.js +14 -14
- package/dist/routes/terminal/lifetime.d.ts +1 -1
- package/dist/routes/terminal/lifetime.js +1 -1
- package/dist/routes/terminal/live-finish.d.ts +2 -2
- package/dist/routes/terminal/live-finish.js +10 -10
- package/dist/routes/terminal/live-sandbox.d.ts +2 -2
- package/dist/routes/terminal/live-sandbox.js +15 -15
- package/dist/routes/terminal/participant-text.js +2 -1
- package/dist/routes/terminal/persona.d.ts +2 -2
- package/dist/routes/terminal/persona.js +3 -3
- package/dist/routes/terminal/plan.d.ts +7 -7
- package/dist/routes/terminal/plan.js +15 -15
- package/dist/routes/terminal/recorder.js +2 -2
- package/dist/routes/terminal/result.d.ts +5 -5
- package/dist/routes/terminal/result.js +14 -14
- package/dist/routes/terminal/route.d.ts +9 -9
- package/dist/routes/terminal/route.js +19 -20
- package/dist/routes/terminal/sandbox.d.ts +1 -1
- package/dist/routes/terminal/sandbox.js +1 -1
- package/dist/routes/terminal/session.d.ts +5 -5
- package/dist/routes/terminal/session.js +14 -13
- package/dist/routes/terminal/token-usage.d.ts +1 -1
- package/dist/routes/terminal/token-usage.js +7 -8
- package/dist/routes/terminal/trace.d.ts +4 -4
- package/dist/routes/terminal/trace.js +2 -2
- package/dist/routes/terminal/types.d.ts +48 -50
- package/dist/routes/terminal/types.js +5 -5
- package/dist/run/bundle-shape.js +3 -3
- package/dist/run/bundle.d.ts +49 -49
- package/dist/run/bundle.js +3 -2
- package/dist/run/cost-summary.js +3 -3
- package/dist/run/costs.d.ts +23 -0
- package/dist/run/costs.js +79 -44
- package/dist/run/detail.d.ts +6 -6
- package/dist/run/detail.js +4 -4
- package/dist/run/dry-run-inputs.d.ts +1 -1
- package/dist/run/dry-run-inputs.js +2 -2
- package/dist/run/dry-run.js +20 -20
- package/dist/run/judge.d.ts +19 -13
- package/dist/run/judge.js +18 -8
- package/dist/run/outcomes.d.ts +1 -1
- package/dist/run/participant.d.ts +1 -1
- package/dist/run/paths.d.ts +1 -1
- package/dist/run/paths.js +1 -1
- package/dist/run/preflight-receipts.js +1 -1
- package/dist/run/pricing.d.ts +11 -6
- package/dist/run/pricing.js +22 -15
- package/dist/run/projection.d.ts +46 -46
- package/dist/run/projection.js +57 -57
- package/dist/run/reclaim.d.ts +1 -1
- package/dist/run/reclaim.js +3 -3
- package/dist/run/results.d.ts +5 -5
- package/dist/run/run-cost.d.ts +53 -0
- package/dist/run/run-cost.js +105 -0
- package/dist/run/run-index-analysis.d.ts +15 -0
- package/dist/run/run-index-analysis.js +77 -0
- package/dist/run/run-index.d.ts +19 -7
- package/dist/run/run-index.js +77 -64
- package/dist/run/run-not-found.d.ts +5 -0
- package/dist/run/run-not-found.js +15 -0
- package/dist/run/run.d.ts +6 -5
- package/dist/run/run.js +3 -3
- package/dist/run/sandbox-receipts.d.ts +2 -2
- package/dist/run/sandbox-receipts.js +3 -3
- package/dist/run/shared-world-evidence.d.ts +37 -36
- package/dist/run/shared-world-evidence.js +4 -4
- package/dist/run/shared-world-shape.d.ts +1 -1
- package/dist/run/shared-world-shape.js +7 -7
- package/dist/run/stats.d.ts +14 -8
- package/dist/run/stats.js +121 -63
- package/dist/run/status.d.ts +16 -29
- package/dist/run/status.js +10 -29
- package/dist/run/stored-runs.js +2 -1
- package/dist/run/stream-shape.js +1 -1
- package/dist/run/streams.d.ts +7 -7
- package/dist/run/study-provenance.d.ts +49 -0
- package/dist/run/study-provenance.js +66 -0
- package/dist/run/study-result.d.ts +11 -0
- package/dist/run/study-result.js +9 -0
- package/dist/run/text.d.ts +2 -0
- package/dist/run/text.js +4 -0
- package/dist/run-study.d.ts +112 -0
- package/dist/{run-lab.js → run-study.js} +52 -47
- package/dist/{lab → study}/adapter-extension.d.ts +15 -27
- package/dist/{lab → study}/adapter-extension.js +10 -45
- package/dist/{lab → study}/adapter-scorer-loader.d.ts +17 -17
- package/dist/{lab → study}/adapter-scorer-loader.js +34 -34
- package/dist/study/composition-rules.d.ts +7 -0
- package/dist/{lab → study}/composition-rules.js +53 -53
- package/dist/study/config.d.ts +15 -0
- package/dist/{lab → study}/config.js +98 -41
- package/dist/study/convert.d.ts +33 -0
- package/dist/study/convert.js +432 -0
- package/dist/{lab → study}/device-presets.d.ts +10 -10
- package/dist/{lab → study}/device-presets.js +11 -11
- package/dist/study/discover.d.ts +75 -0
- package/dist/{lab → study}/discover.js +134 -95
- package/dist/{lab → study}/doctor.d.ts +19 -12
- package/dist/{lab → study}/doctor.js +58 -20
- package/dist/study/field-paths.d.ts +12 -0
- package/dist/study/field-paths.js +126 -0
- package/dist/study/files.d.ts +26 -0
- package/dist/study/files.js +44 -0
- package/dist/{lab → study}/init-templates.d.ts +2 -2
- package/dist/study/init-templates.js +421 -0
- package/dist/{lab → study}/init.d.ts +2 -2
- package/dist/{lab → study}/init.js +46 -11
- package/dist/study/keys.d.ts +4 -0
- package/dist/{lab → study}/keys.js +46 -12
- package/dist/study/migrate.d.ts +48 -0
- package/dist/study/migrate.js +408 -0
- package/dist/study/owned-files.d.ts +38 -0
- package/dist/study/owned-files.js +182 -0
- package/dist/{lab → study}/parse/actors.d.ts +5 -5
- package/dist/{lab → study}/parse/actors.js +14 -14
- package/dist/study/parse/comms.d.ts +12 -0
- package/dist/{lab → study}/parse/comms.js +5 -5
- package/dist/study/parse/execution.d.ts +19 -0
- package/dist/{lab → study}/parse/execution.js +13 -13
- package/dist/study/parse/study-v3.d.ts +21 -0
- package/dist/study/parse/study-v3.js +259 -0
- package/dist/study/parse/subject-state.d.ts +30 -0
- package/dist/{lab → study}/parse/subject-state.js +19 -19
- package/dist/{lab → study}/parse/subject.d.ts +3 -3
- package/dist/{lab → study}/parse/subject.js +34 -34
- package/dist/{lab → study}/parse/values.d.ts +3 -3
- package/dist/{lab → study}/parse/values.js +3 -3
- package/dist/{lab → study}/persona-resolve.d.ts +8 -8
- package/dist/{lab → study}/persona-resolve.js +6 -6
- package/dist/{lab → study}/plan-base.d.ts +7 -7
- package/dist/{lab → study}/plan-base.js +1 -1
- package/dist/{lab → study}/plan-participants.d.ts +12 -12
- package/dist/{lab → study}/plan-participants.js +4 -4
- package/dist/{lab → study}/plan-types.d.ts +31 -31
- package/dist/{lab → study}/plan-types.js +2 -2
- package/dist/study/plan.d.ts +13 -0
- package/dist/study/plan.js +101 -0
- package/dist/study/preflight-probes.d.ts +3 -0
- package/dist/{lab → study}/preflight-probes.js +20 -19
- package/dist/study/preflight-result.d.ts +8 -0
- package/dist/{lab → study}/preflight-result.js +5 -4
- package/dist/study/preflight.d.ts +94 -0
- package/dist/{lab → study}/preflight.js +12 -12
- package/dist/{lab → study}/requirements.d.ts +3 -3
- package/dist/{lab → study}/requirements.js +1 -1
- package/dist/study/route-inputs.d.ts +28 -0
- package/dist/{lab → study}/route-inputs.js +1 -1
- package/dist/{lab → study}/routing.d.ts +39 -33
- package/dist/{lab → study}/routing.js +60 -29
- package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -13
- package/dist/{lab/run-lab-events.js → study/run-study-events.js} +3 -9
- package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +21 -18
- package/dist/{lab/run-lab-homes.js → study/run-study-homes.js} +1 -1
- package/dist/study/run-study-options.d.ts +28 -0
- package/dist/{lab/run-lab-options.js → study/run-study-options.js} +29 -25
- package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +8 -13
- package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
- package/dist/{lab → study}/summary.d.ts +16 -15
- package/dist/{lab → study}/summary.js +21 -21
- package/dist/{lab → study}/tasks.d.ts +18 -18
- package/dist/{lab → study}/tasks.js +14 -14
- package/dist/{lab → study}/types.d.ts +202 -196
- package/dist/{lab → study}/types.js +3 -1
- package/dist/{lab → study}/validation.d.ts +27 -27
- package/dist/{lab → study}/validation.js +53 -51
- package/dist/study/warnings.d.ts +12 -0
- package/dist/{lab → study}/warnings.js +62 -34
- package/dist/subject/clone.d.ts +7 -7
- package/dist/subject/clone.js +2 -2
- package/dist/subject/desktop-cli.d.ts +1 -1
- package/dist/subject/desktop-cli.js +2 -2
- package/dist/subject/local-tree-archive.d.ts +2 -2
- package/dist/subject/local-tree-archive.js +4 -4
- package/dist/subject/local-tree.d.ts +4 -4
- package/dist/subject/node-bootstrap.js +1 -1
- package/dist/subject/runtime.js +9 -10
- package/dist/subject/serve.d.ts +5 -5
- package/dist/subject/serve.js +3 -3
- package/dist/subject/state.d.ts +4 -4
- package/dist/subject/state.js +1 -1
- package/dist/subject/steps.d.ts +6 -6
- package/dist/subject/steps.js +5 -5
- package/dist/substrates/command-failure.d.ts +3 -3
- package/dist/substrates/command-failure.js +3 -3
- package/dist/substrates/desktop-session.js +2 -2
- package/dist/substrates/detached.d.ts +6 -6
- package/dist/substrates/detached.js +7 -7
- package/dist/substrates/e2b/cdp-probe.d.ts +9 -9
- package/dist/substrates/e2b/cdp-probe.js +14 -17
- package/dist/substrates/e2b/desktop-browser.d.ts +6 -6
- package/dist/substrates/e2b/desktop-browser.js +9 -9
- package/dist/substrates/e2b/desktop-cdp.d.ts +10 -10
- package/dist/substrates/e2b/desktop-cdp.js +9 -9
- package/dist/substrates/e2b/desktop-executor.d.ts +2 -2
- package/dist/substrates/e2b/desktop-executor.js +13 -13
- package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
- package/dist/substrates/e2b/desktop-geometry.js +8 -8
- package/dist/substrates/e2b/desktop-media.d.ts +4 -4
- package/dist/substrates/e2b/desktop-media.js +1 -1
- package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
- package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
- package/dist/substrates/e2b/lifetime.js +1 -1
- package/dist/substrates/e2b/sandbox.d.ts +4 -4
- package/dist/substrates/e2b/sandbox.js +2 -2
- package/dist/substrates/e2b/sdk.d.ts +12 -12
- package/dist/substrates/e2b/sdk.js +7 -7
- package/dist/substrates/local/runtime-config.d.ts +4 -4
- package/dist/substrates/local/runtime-config.js +4 -4
- package/dist/tui/actions.d.ts +1 -1
- package/dist/tui/actions.js +13 -13
- package/dist/tui/contract.d.ts +23 -23
- package/dist/tui/contract.js +11 -11
- package/dist/tui/launch.d.ts +7 -7
- package/dist/tui/launch.js +36 -31
- package/dist/tui/project.js +5 -5
- package/dist/tui-app.js +139 -139
- package/dist/verify/actor.d.ts +8 -8
- package/dist/verify/actor.js +36 -36
- package/dist/verify/artifacts.d.ts +2 -2
- package/dist/verify/artifacts.js +3 -3
- package/dist/verify/context-growth.d.ts +9 -0
- package/dist/verify/context-growth.js +62 -0
- package/dist/verify/costs.d.ts +6 -6
- package/dist/verify/costs.js +8 -8
- package/dist/verify/shared-world-concurrent.d.ts +2 -2
- package/dist/verify/shared-world-concurrent.js +79 -76
- package/dist/verify/shared-world.d.ts +2 -2
- package/dist/verify/shared-world.js +16 -16
- package/dist/verify/subject.d.ts +5 -5
- package/dist/verify/subject.js +19 -19
- package/dist/verify/verify.js +94 -44
- package/docs/README.md +25 -32
- package/docs/architecture/actor-contract.md +60 -91
- package/docs/architecture/browser-control.md +1 -1
- package/docs/architecture/desktop-sessions.md +7 -7
- package/docs/architecture/external-public-shared-world.md +68 -65
- package/docs/architecture/github-feedback-loop.md +2 -5
- package/docs/architecture/guest-desktop.md +2 -2
- package/docs/architecture/observer.md +34 -34
- package/docs/architecture/restricted-codex-analysis.md +34 -28
- package/docs/architecture/serve.md +34 -37
- package/docs/architecture/state-driven-executor.md +55 -58
- package/docs/architecture/task-protocol-support.md +6 -6
- package/docs/architecture/terminal-product-route.md +70 -110
- package/docs/contracts/README.md +24 -0
- package/docs/contracts/adapter-admission.md +3 -3
- package/docs/contracts/adapter-fixtures.md +4 -7
- package/docs/contracts/core.md +1 -3
- package/docs/contracts/errors.md +62 -0
- package/docs/contracts/feedback.md +8 -9
- package/docs/contracts/policy.md +7 -12
- package/docs/contracts/run-bundle.md +42 -44
- package/docs/contracts/schemas.md +446 -368
- package/docs/contracts/study-analysis.md +7 -4
- package/docs/contracts/study-costs.md +28 -9
- package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
- package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
- package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
- package/docs/principles/actor-fidelity.md +4 -4
- package/docs/principles/engineering.md +3 -3
- package/docs/principles/invariants-and-defaults.md +38 -38
- package/docs/principles/self-driving-harness.md +1 -5
- package/docs/principles/three-roles.md +1 -1
- package/docs/product/automatic-analysis.md +7 -7
- package/examples/README.md +1 -1
- package/examples/participant/README.md +5 -5
- package/examples/participant/run.mjs +11 -10
- package/examples/scorer/README.md +3 -3
- package/examples/scorer/run.mjs +11 -12
- package/examples/scorer/scorer.mjs +3 -3
- package/package.json +16 -17
- package/skills/humanish/SKILL.md +64 -60
- package/skills/humanish/agents/openai.yaml +1 -1
- package/AGENTS.md +0 -99
- package/CONTRIBUTING.md +0 -148
- package/dist/actors/codex/qualified-versions.d.ts +0 -72
- package/dist/actors/codex/qualified-versions.js +0 -132
- package/dist/cli/commands/lab-format.d.ts +0 -8
- package/dist/cli/commands/lab-route-run.d.ts +0 -19
- package/dist/cli/commands/lab-route-scripted.d.ts +0 -17
- package/dist/cli/commands/lab-route-terminal.d.ts +0 -17
- package/dist/cli/commands/lab-run.d.ts +0 -9
- package/dist/cli/commands/lab.d.ts +0 -3
- package/dist/cli/commands/lab.js +0 -199
- package/dist/cli/renamed-options.d.ts +0 -11
- package/dist/cli/renamed-options.js +0 -18
- package/dist/lab/composition-rules.d.ts +0 -7
- package/dist/lab/config.d.ts +0 -7
- package/dist/lab/discover.d.ts +0 -65
- package/dist/lab/init-templates.js +0 -416
- package/dist/lab/keys.d.ts +0 -2
- package/dist/lab/parse/comms.d.ts +0 -12
- package/dist/lab/parse/execution.d.ts +0 -19
- package/dist/lab/parse/subject-state.d.ts +0 -30
- package/dist/lab/plan.d.ts +0 -19
- package/dist/lab/plan.js +0 -132
- package/dist/lab/preflight-probes.d.ts +0 -3
- package/dist/lab/preflight-result.d.ts +0 -7
- package/dist/lab/preflight.d.ts +0 -92
- package/dist/lab/route-inputs.d.ts +0 -28
- package/dist/lab/run-lab-options.d.ts +0 -28
- package/dist/lab/warnings.d.ts +0 -2
- package/dist/observer/static.d.ts +0 -39
- package/dist/observer/static.js +0 -369
- package/dist/run-lab.d.ts +0 -112
- package/docs/architecture/comms-inbox.md +0 -122
- package/docs/architecture/desktop-recording.md +0 -80
- package/docs/architecture/local-browser-runtime.md +0 -178
- package/docs/architecture/observer-review.md +0 -144
- package/docs/architecture/participant-media.md +0 -90
- package/docs/architecture/project-layout.md +0 -62
- package/docs/architecture/real-email-receiving.md +0 -136
- package/docs/assets/humanish-drawdb-hero.png +0 -0
- package/docs/assets/humanish-observer-hero.png +0 -0
- package/docs/goals/current.md +0 -207
- package/docs/product/lobby-trivia-3player-external-public.md +0 -77
- package/docs/product/open-source-install-experience.md +0 -240
- package/docs/ramp/README.md +0 -295
- package/docs/release/open-source-readiness.md +0 -222
- package/docs/release/public-readiness-standard.md +0 -210
- package/docs/roadmap/world-class-open-source-v0.md +0 -311
- /package/dist/{lab → study}/init-paths.d.ts +0 -0
- /package/dist/{lab → study}/init-paths.js +0 -0
- /package/dist/{lab → study}/init-plan.d.ts +0 -0
- /package/dist/{lab → study}/init-plan.js +0 -0
- /package/dist/{lab → study}/participant-assignment.d.ts +0 -0
- /package/dist/{lab → study}/participant-assignment.js +0 -0
- /package/dist/{lab → study}/persona.d.ts +0 -0
- /package/dist/{lab → study}/persona.js +0 -0
|
@@ -1,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:
|
|
@@ -1,33 +1,28 @@
|
|
|
1
1
|
# Serve: the run library surface
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
`src/observer/http.ts`, `src/observer/exposure.ts` and `src/observer/tunnel.ts`,
|
|
8
|
-
with per-run routes and the history index in `src/observer/run-routes.ts` and the
|
|
9
|
-
loopback bind in `src/observer/listen.ts`. The CLI wiring is in
|
|
3
|
+
The `loopback`, `exposed` (edge-authed) and `share-safe-open` modes live in
|
|
4
|
+
`src/observer/serve.ts`, `src/observer/library.ts`, `src/observer/http.ts`,
|
|
5
|
+
`src/observer/exposure.ts` and `src/observer/tunnel.ts`, with per-run routes and the history
|
|
6
|
+
index in `src/observer/run-routes.ts` and the loopback bind in `src/observer/listen.ts`. The CLI wiring is in
|
|
10
7
|
`src/cli/commands/observe.ts`. The `/_humanish/api/*` control-plane namespace is
|
|
11
8
|
reserved and answers `501`; no mutating route ships.
|
|
12
9
|
|
|
13
|
-
Exposure auth
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
operator-secured `--public-url` (Cloudflare Access, Tailscale, a reverse proxy
|
|
19
|
-
you own).
|
|
10
|
+
Exposure auth happens only at the tunnel edge. humanish has had no in-process auth since 0.18.0,
|
|
11
|
+
which removed the capability link (cookie, token and TTL), its auth module and the
|
|
12
|
+
`serve --auth link|none` flags. The gate is ngrok `--oauth google` with `--allow-email` or
|
|
13
|
+
`--allow-domain` rules, or an operator-secured `--public-url` (Cloudflare Access, Tailscale or a
|
|
14
|
+
reverse proxy you own).
|
|
20
15
|
|
|
21
16
|
## What serve is
|
|
22
17
|
|
|
23
|
-
`humanish
|
|
24
|
-
the
|
|
18
|
+
`humanish observe --all` is the third observer surface, and the first whose subject is
|
|
19
|
+
the library rather than a run:
|
|
25
20
|
|
|
26
21
|
- `humanish watch` serves one attached run: the process that created the run
|
|
27
22
|
serves it and may inject runtime stream URLs for live following (see the
|
|
28
23
|
stream-URL rules below and `watch --expose`);
|
|
29
24
|
- `humanish observe` re-serves one finished run read-only;
|
|
30
|
-
- `humanish
|
|
25
|
+
- `humanish observe --all` serves the whole local library under `.humanish/runs/`: a
|
|
31
26
|
library index, per-run Observer pages, `/_humanish/history.json` polling, and
|
|
32
27
|
optional edge-authenticated exposure beyond the machine.
|
|
33
28
|
|
|
@@ -39,11 +34,11 @@ authenticated edge (or `--safe`, see the fail-closed matrix).
|
|
|
39
34
|
## Fail-closed exposure matrix
|
|
40
35
|
|
|
41
36
|
One shared validator (`validateExposure` in `src/observer/exposure.ts`) governs
|
|
42
|
-
both `
|
|
37
|
+
both `observe --all` and `watch`. `--expose` must always resolve to a reachable public
|
|
43
38
|
origin (a `--tunnel` or a `--public-url`), even under `--safe`, since an
|
|
44
39
|
origin-less exposed server is an unreachable loopback no-op. With an origin
|
|
45
|
-
present, exposure requires
|
|
46
|
-
`--public-url` you secure)
|
|
40
|
+
present, exposure requires either edge auth (`--oauth` on the ngrok edge, or a
|
|
41
|
+
`--public-url` you secure) or `--safe` (share_ready runs only). A tunnel with
|
|
47
42
|
neither is a wide-open public URL to local bundles and is refused.
|
|
48
43
|
|
|
49
44
|
| `--expose` | `--tunnel` | `--oauth` | `--public-url` | `--safe` | Outcome |
|
|
@@ -51,11 +46,11 @@ neither is a wide-open public URL to local bundles and is refused.
|
|
|
51
46
|
| no | no | no | no | any | `loopback` (no exposure) |
|
|
52
47
|
| yes | yes | yes | no | any | OK → `exposed` (edge-authed; all runs unless `--safe`) |
|
|
53
48
|
| yes | yes | no | no | yes | OK → `share-safe-open` (public, share_ready only) |
|
|
54
|
-
| yes | yes | no | no | no | **
|
|
49
|
+
| yes | yes | no | no | no | **refused** `HUMANISH_SERVE_EXPOSE_REQUIRES_EDGE_AUTH_OR_SAFE` |
|
|
55
50
|
| yes | no | no | yes | any | OK → `exposed` (operator-secured edge) |
|
|
56
|
-
| yes | no | no | no | any | **
|
|
57
|
-
| yes | no | yes | no | any | **
|
|
58
|
-
| yes | yes | yes | yes | any | **
|
|
51
|
+
| yes | no | no | no | any | **refused** `HUMANISH_SERVE_EXPOSE_REQUIRES_ORIGIN` (no reachable origin, even with `--safe`) |
|
|
52
|
+
| yes | no | yes | no | any | **refused** `HUMANISH_SERVE_OAUTH_REQUIRES_TUNNEL` |
|
|
53
|
+
| yes | yes | yes | yes | any | **refused** `HUMANISH_SERVE_OPTION_CONFLICT` (tunnel + public-url) |
|
|
59
54
|
|
|
60
55
|
Guard order (all before any bind/spawn): `--allow-email`/`--allow-domain` without
|
|
61
56
|
`--oauth` → `HUMANISH_SERVE_ALLOW_REQUIRES_OAUTH`; `--oauth` without `--tunnel` →
|
|
@@ -66,8 +61,8 @@ http(s) origin → conflict; a tunnel/public-url without `--expose` →
|
|
|
66
61
|
no `--public-url` (even under `--safe`) →
|
|
67
62
|
`HUMANISH_SERVE_EXPOSE_REQUIRES_ORIGIN`; `--expose` with an origin but without
|
|
68
63
|
edge auth and without `--safe` →
|
|
69
|
-
`HUMANISH_SERVE_EXPOSE_REQUIRES_EDGE_AUTH_OR_SAFE`. `--oauth google` with
|
|
70
|
-
allow rule is
|
|
64
|
+
`HUMANISH_SERVE_EXPOSE_REQUIRES_EDGE_AUTH_OR_SAFE`. `--oauth google` with no
|
|
65
|
+
allow rule is allowed (any Google account authenticates) but pushes a prominent
|
|
71
66
|
warning recommending at least one `--allow-email`/`--allow-domain`.
|
|
72
67
|
|
|
73
68
|
The `watch` surface reuses the same validator but is stricter: a live,
|
|
@@ -77,7 +72,7 @@ therefore refused outright with `HUMANISH_WATCH_SAFE_NOT_APPLICABLE` (exit 2), s
|
|
|
77
72
|
never silently ignored.
|
|
78
73
|
`watch --expose` always requires edge auth (`--tunnel --oauth` or `--public-url`),
|
|
79
74
|
and is also refused with `--dry-run`/`--detach`/`--json` (no live desktop / no
|
|
80
|
-
attached follow). An exposed watch serves
|
|
75
|
+
attached follow). An exposed watch serves only the attached live run: its
|
|
81
76
|
`/_humanish/history.json` lists just that run and every other run id 404s
|
|
82
77
|
byte-identically to a nonexistent one, so a remote viewer can never enumerate or
|
|
83
78
|
reach any prior run's raw evidence (loopback watch still serves the full library).
|
|
@@ -122,14 +117,14 @@ which adds `sandbox allow-scripts` to that policy.
|
|
|
122
117
|
|
|
123
118
|
| Mode | Invocation | Boundary class |
|
|
124
119
|
| ----------------- | ------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
125
|
-
| `loopback` | `humanish
|
|
120
|
+
| `loopback` | `humanish observe --all` | Capture-side trust: readable only by whoever can already read gitignored `.humanish/` on this machine; no new boundary is crossed. |
|
|
126
121
|
| `exposed` | `--expose --tunnel ngrok --oauth google …`, or `--expose --public-url <origin>` | Edge-authed exposure: only viewers who clear the edge OAuth (or the operator's own edge) reach the loopback server, which then serves everything it grants unless `--safe` composes in. The gate is the edge, not humanish. |
|
|
127
122
|
| `share-safe-open` | `--expose --safe --tunnel ngrok` (no `--oauth`) | Genuine publishing behind the feedback-grade `share_ready` gate: only runs that pass verify are served. Each request walks the run, and any added, removed or changed file re-verifies it first; a file is read only while its inode, size, mtime and ctime match the walk verify covered, and its bytes are served only when their sha256 matches the hash taken at admission. Everything else is absent, 404ing byte-identically to a nonexistent run (no existence oracle). |
|
|
128
123
|
|
|
129
124
|
## Keep stream URLs off the library surface
|
|
130
125
|
|
|
131
126
|
Live desktop stream URLs (auth-bearing hosted-VNC links) are never served by the
|
|
132
|
-
|
|
127
|
+
library surface, in any mode, and the guarantee is layered:
|
|
133
128
|
|
|
134
129
|
- **Structural:** runtime stream URLs live in a `WeakMap` keyed by the watch
|
|
135
130
|
process's in-memory `ObserverResult` (`src/observer/render.ts`) and are never
|
|
@@ -149,12 +144,14 @@ disk). See observer.md.
|
|
|
149
144
|
|
|
150
145
|
## Know what `share_ready` checks
|
|
151
146
|
|
|
152
|
-
`share_ready` was designed as the bar for
|
|
147
|
+
`share_ready` was designed as the bar for feedback payloads: evidence eligible
|
|
153
148
|
to leave the machine inside a public issue draft. Serve's `share-safe-open` mode
|
|
154
|
-
extends that same gate to arbitrary-audience
|
|
155
|
-
exposure of the same artifacts. The
|
|
149
|
+
extends that same gate to arbitrary-audience browsing, which is a broader
|
|
150
|
+
exposure of the same artifacts. The same caveat carries over:
|
|
156
151
|
`humanish verify` does not yet detect free-form PII/PHI (names, emails, medical
|
|
157
|
-
identifiers; see
|
|
152
|
+
identifiers; see
|
|
153
|
+
[Share evidence safely](../../README.md#share-evidence-safely) and the
|
|
154
|
+
[open detector issue](https://github.com/danielgwilson/humanish/issues/108)), so
|
|
158
155
|
`share_ready` means the automated secret/path scan passed, not that a human would
|
|
159
156
|
publish every pixel. Maintainers should treat open mode accordingly: synthetic
|
|
160
157
|
data upstream, review before exposing, and treat `--safe` without edge auth as
|
|
@@ -173,13 +170,13 @@ any mutating route ships, the contract is:
|
|
|
173
170
|
- an operator identity distinct from a viewer, sourced from the edge/control
|
|
174
171
|
plane, not from a humanish-minted cookie;
|
|
175
172
|
- mutating routes require CSRF defenses appropriate to the chosen edge session;
|
|
176
|
-
- the spend rule
|
|
173
|
+
- the live-spend rule applies to remote hands too: a phone-initiated live
|
|
177
174
|
run needs its own affirmative declaration at serve startup (an explicit opt-in
|
|
178
|
-
naming the
|
|
175
|
+
naming the study and budget), never a default the viewer UI can reach.
|
|
179
176
|
|
|
180
177
|
## Why not Better Auth here
|
|
181
178
|
|
|
182
|
-
Better Auth is a strong TypeScript auth framework, but it is deliberately
|
|
179
|
+
Better Auth is a strong TypeScript auth framework, but it is deliberately not
|
|
183
180
|
used for this CLI serve surface: serve is an ephemeral, no-database,
|
|
184
181
|
per-invocation loopback server whose only job is to hand persisted evidence to an
|
|
185
182
|
already-authenticated edge. A password/session/social-login framework with a
|
|
@@ -193,6 +190,6 @@ where accounts, org membership, and durable sessions actually exist.
|
|
|
193
190
|
- **Traffic Policy for ngrok.** Migrate off the deprecated `--oauth*` flags to a
|
|
194
191
|
generated Traffic Policy YAML once ngrok requires it (the `yaml` dep is already
|
|
195
192
|
available); pin the behavior in `tests/observer/tunnel.test.ts` first.
|
|
196
|
-
- **Shipped in 0.18.0: `watch --expose`.** Remote
|
|
193
|
+
- **Shipped in 0.18.0: `watch --expose`.** Remote live following of a run,
|
|
197
194
|
including its live E2B desktop stream, behind the same edge auth. It is the one
|
|
198
195
|
surface that deliberately serves runtime stream URLs. See observer.md.
|