humanish 0.106.1 → 0.108.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +38 -32
- package/CHANGELOG.md +28 -0
- package/CONTEXT.md +51 -41
- package/README.md +152 -174
- package/SECURITY.md +16 -26
- package/TELEMETRY.md +8 -6
- package/dist/actors/affordance.d.ts +4 -4
- package/dist/actors/affordance.js +12 -12
- package/dist/actors/agent-session.d.ts +2 -2
- package/dist/actors/agent-session.js +7 -7
- package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
- package/dist/actors/codex/app-server-actor-trace.js +1 -1
- package/dist/actors/codex/app-server-client.js +2 -1
- package/dist/actors/codex/app-server-trace.d.ts +0 -1
- package/dist/actors/codex/app-server-trace.js +1 -3
- package/dist/actors/codex/app-server-ui.js +1 -1
- package/dist/actors/codex/app-server.js +2 -1
- package/dist/actors/codex/codex-admission.d.ts +91 -0
- package/dist/actors/codex/codex-admission.js +150 -0
- package/dist/actors/codex/protocol-compat.d.ts +27 -0
- package/dist/actors/codex/protocol-compat.js +357 -0
- package/dist/actors/codex/protocol-contract.d.ts +61 -0
- package/dist/actors/codex/protocol-contract.js +471 -0
- package/dist/actors/codex/restricted-executable.d.ts +28 -4
- package/dist/actors/codex/restricted-executable.js +104 -29
- package/dist/actors/codex/restricted-launch.d.ts +9 -2
- package/dist/actors/codex/restricted-launch.js +43 -4
- package/dist/actors/codex/restricted-notifications.d.ts +101 -0
- package/dist/actors/codex/restricted-notifications.js +277 -0
- package/dist/actors/codex/restricted-participant.d.ts +30 -0
- package/dist/actors/codex/restricted-participant.js +66 -6
- package/dist/actors/codex/restricted-policy.d.ts +11 -3
- package/dist/actors/codex/restricted-policy.js +2 -2
- package/dist/actors/codex/restricted-session.d.ts +16 -3
- package/dist/actors/codex/restricted-session.js +60 -22
- package/dist/actors/codex/restricted-transport.d.ts +29 -0
- package/dist/actors/codex/restricted-transport.js +139 -27
- package/dist/actors/codex/restricted-turn.d.ts +19 -4
- package/dist/actors/codex/restricted-turn.js +43 -30
- package/dist/actors/computer-use/actor.d.ts +17 -17
- package/dist/actors/computer-use/actor.js +6 -6
- package/dist/actors/computer-use/admission-limit.d.ts +1 -1
- package/dist/actors/computer-use/admission-limit.js +1 -1
- package/dist/actors/computer-use/loop/actions.d.ts +3 -3
- package/dist/actors/computer-use/loop/actions.js +10 -10
- package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
- package/dist/actors/computer-use/loop/backstop.js +15 -13
- package/dist/actors/computer-use/loop/ending.d.ts +7 -7
- package/dist/actors/computer-use/loop/ending.js +9 -9
- package/dist/actors/computer-use/loop/observation.d.ts +2 -2
- package/dist/actors/computer-use/loop/observation.js +9 -9
- package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
- package/dist/actors/computer-use/loop/provider-call.js +1 -1
- package/dist/actors/computer-use/loop/session.js +3 -3
- package/dist/actors/computer-use/loop/spend.d.ts +2 -2
- package/dist/actors/computer-use/loop/spend.js +4 -4
- package/dist/actors/computer-use/loop/trace.js +11 -10
- package/dist/actors/computer-use/loop/types.d.ts +37 -26
- package/dist/actors/computer-use/loop/usage.js +2 -2
- package/dist/actors/computer-use/loop.js +4 -4
- package/dist/actors/computer-use/openai-context.d.ts +37 -0
- package/dist/actors/computer-use/openai-context.js +214 -0
- package/dist/actors/computer-use/openai-provider.d.ts +12 -9
- package/dist/actors/computer-use/openai-provider.js +47 -36
- package/dist/actors/computer-use/openai-requests.d.ts +36 -10
- package/dist/actors/computer-use/openai-requests.js +82 -15
- package/dist/actors/computer-use/openai-wire.d.ts +19 -7
- package/dist/actors/computer-use/openai-wire.js +36 -34
- package/dist/actors/contract.d.ts +86 -49
- package/dist/actors/contract.js +29 -23
- package/dist/actors/local-agent/claude-session.d.ts +1 -1
- package/dist/actors/local-agent/claude-session.js +10 -9
- package/dist/actors/local-agent/cli.d.ts +8 -6
- package/dist/actors/local-agent/cli.js +24 -28
- package/dist/actors/local-agent/readiness.d.ts +2 -2
- package/dist/actors/local-agent/readiness.js +4 -4
- package/dist/actors/reasoning-effort.js +6 -6
- package/dist/actors/registry.d.ts +10 -10
- package/dist/actors/registry.js +18 -17
- package/dist/actors/scripted-browser/actor.d.ts +8 -8
- package/dist/actors/scripted-browser/actor.js +16 -16
- package/dist/actors/scripted-browser/browser-command.js +1 -1
- package/dist/actors/scripted-browser/journey.js +15 -4
- package/dist/actors/scripted-browser/steps.js +19 -1
- package/dist/actors/scripted-browser/types.d.ts +12 -2
- package/dist/actors/stop-conditions.d.ts +1 -1
- package/dist/actors/stop-conditions.js +1 -3
- package/dist/analysis/automatic-completion.d.ts +13 -8
- package/dist/analysis/automatic-completion.js +14 -8
- package/dist/analysis/automatic-config.d.ts +1 -1
- package/dist/analysis/automatic-config.js +2 -2
- package/dist/analysis/automatic.d.ts +10 -4
- package/dist/analysis/automatic.js +17 -13
- package/dist/analysis/codex-config.d.ts +6 -2
- package/dist/analysis/codex-config.js +22 -14
- package/dist/analysis/diagnostics.d.ts +23 -0
- package/dist/analysis/diagnostics.js +112 -0
- package/dist/analysis/evidence-sources.js +2 -2
- package/dist/analysis/evidence.js +6 -6
- package/dist/analysis/execute.d.ts +7 -1
- package/dist/analysis/execute.js +39 -12
- package/dist/analysis/job.d.ts +8 -5
- package/dist/analysis/job.js +15 -14
- package/dist/analysis/load.d.ts +1 -1
- package/dist/analysis/load.js +5 -5
- package/dist/analysis/provider.d.ts +9 -1
- package/dist/analysis/restricted-codex.d.ts +2 -0
- package/dist/analysis/restricted-codex.js +10 -1
- package/dist/analysis/service.d.ts +2 -0
- package/dist/analysis/service.js +35 -16
- package/dist/analysis/sharing.d.ts +2 -2
- package/dist/analysis/sharing.js +5 -5
- package/dist/analysis/store-executions.d.ts +5 -5
- package/dist/analysis/store-executions.js +12 -12
- package/dist/analysis/store.d.ts +4 -4
- package/dist/analysis/store.js +13 -13
- package/dist/cli/commands/analysis-signals.d.ts +2 -1
- package/dist/cli/commands/analysis-signals.js +4 -1
- package/dist/cli/commands/analyze.js +23 -18
- package/dist/cli/commands/codex.js +9 -9
- package/dist/cli/commands/comms.js +62 -34
- package/dist/cli/commands/feedback.js +20 -21
- package/dist/cli/commands/lab-format.d.ts +5 -4
- package/dist/cli/commands/lab-format.js +35 -23
- package/dist/cli/commands/lab-route-computer-use.d.ts +0 -2
- package/dist/cli/commands/lab-route-computer-use.js +32 -21
- package/dist/cli/commands/lab-route-preview.d.ts +1 -3
- package/dist/cli/commands/lab-route-preview.js +7 -7
- package/dist/cli/commands/lab-route-run.d.ts +6 -4
- package/dist/cli/commands/lab-route-run.js +6 -2
- package/dist/cli/commands/lab-route-scripted.d.ts +0 -2
- package/dist/cli/commands/lab-route-scripted.js +0 -1
- package/dist/cli/commands/lab-route-shared-world.d.ts +0 -2
- package/dist/cli/commands/lab-route-shared-world.js +3 -4
- package/dist/cli/commands/lab-route-terminal.d.ts +0 -2
- package/dist/cli/commands/lab-route-terminal.js +0 -1
- package/dist/cli/commands/lab-run.js +84 -54
- package/dist/cli/commands/lab-scorer.d.ts +2 -4
- package/dist/cli/commands/lab-scorer.js +1 -1
- package/dist/cli/commands/migrate.d.ts +4 -0
- package/dist/cli/commands/migrate.js +65 -0
- package/dist/cli/commands/observe.js +168 -107
- package/dist/cli/commands/run-command.d.ts +10 -0
- package/dist/cli/commands/run-command.js +85 -0
- package/dist/cli/commands/run-signals.d.ts +30 -0
- package/dist/cli/commands/run-signals.js +146 -0
- package/dist/cli/commands/runs.js +137 -136
- package/dist/cli/commands/setup.d.ts +2 -2
- package/dist/cli/commands/setup.js +26 -21
- package/dist/cli/commands/study.d.ts +3 -0
- package/dist/cli/commands/study.js +182 -0
- package/dist/cli/commands/tui.d.ts +4 -4
- package/dist/cli/commands/tui.js +21 -21
- package/dist/cli/commands/watch.js +64 -77
- package/dist/cli/deprecations.d.ts +18 -0
- package/dist/cli/deprecations.js +48 -0
- package/dist/cli/doctor.d.ts +18 -5
- package/dist/cli/doctor.js +111 -48
- package/dist/cli/first-run-path.d.ts +12 -10
- package/dist/cli/first-run-path.js +30 -28
- package/dist/cli/io.d.ts +46 -10
- package/dist/cli/io.js +109 -30
- package/dist/cli/observer-follow.d.ts +2 -2
- package/dist/cli/observer-follow.js +5 -6
- package/dist/cli/orientation.d.ts +6 -3
- package/dist/cli/orientation.js +43 -39
- package/dist/cli/product-sentence.d.ts +6 -0
- package/dist/cli/product-sentence.js +6 -0
- package/dist/cli/program.d.ts +6 -1
- package/dist/cli/program.js +112 -43
- package/dist/cli/telemetry.d.ts +17 -17
- package/dist/cli/telemetry.js +49 -41
- package/dist/cli.js +1 -1
- package/dist/comms/capture-surface.d.ts +14 -13
- package/dist/comms/capture-surface.js +23 -22
- package/dist/comms/catch-host.d.ts +8 -8
- package/dist/comms/catch-host.js +14 -14
- package/dist/comms/connections.js +4 -4
- package/dist/comms/email-catch.d.ts +3 -3
- package/dist/comms/email-catch.js +8 -8
- package/dist/comms/external-evidence.d.ts +27 -0
- package/dist/comms/external-evidence.js +93 -0
- package/dist/comms/extract.js +2 -2
- package/dist/comms/fake-inbox.d.ts +2 -2
- package/dist/comms/fake-inbox.js +2 -2
- package/dist/comms/lease-store.js +7 -7
- package/dist/comms/receiving-render.d.ts +1 -1
- package/dist/comms/receiving-render.js +2 -2
- package/dist/comms/sandbox-catch-script.d.ts +6 -6
- package/dist/comms/sandbox-catch-script.js +6 -6
- package/dist/comms/sandbox-catch.d.ts +36 -37
- package/dist/comms/sandbox-catch.js +34 -35
- package/dist/comms/setup.js +42 -8
- package/dist/comms/thread-evidence.d.ts +1 -1
- package/dist/comms/thread-evidence.js +6 -6
- package/dist/comms/types.d.ts +6 -6
- package/dist/comms/types.js +4 -4
- package/dist/evidence/browser-hygiene.d.ts +1 -1
- package/dist/evidence/browser-hygiene.js +1 -1
- package/dist/evidence/frame-signature.d.ts +1 -1
- package/dist/evidence/frame-signature.js +4 -4
- package/dist/evidence/redaction.d.ts +3 -3
- package/dist/evidence/redaction.js +5 -5
- package/dist/evidence/secret-scrub.d.ts +9 -0
- package/dist/evidence/secret-scrub.js +96 -0
- package/dist/feedback/draft.js +41 -85
- package/dist/feedback/export-bundle.js +5 -5
- package/dist/feedback/export.d.ts +5 -1
- package/dist/feedback/export.js +16 -17
- package/dist/feedback/feedback.d.ts +3 -3
- package/dist/feedback/feedback.js +21 -3
- package/dist/guest/chromium-text.js +2 -2
- package/dist/guest/desktop-native.d.ts +1 -1
- package/dist/guest/runtime.js +1 -1
- package/dist/index.d.ts +14 -15
- package/dist/index.js +10 -11
- package/dist/keys/key-resolution.d.ts +7 -5
- package/dist/keys/key-resolution.js +40 -38
- package/dist/lab/adapter-extension.d.ts +35 -13
- package/dist/lab/adapter-extension.js +50 -134
- package/dist/lab/adapter-scorer-loader.d.ts +32 -12
- package/dist/lab/adapter-scorer-loader.js +56 -32
- package/dist/lab/composition-rules.js +58 -58
- package/dist/lab/config.js +85 -43
- package/dist/lab/deprecated-fields.d.ts +10 -0
- package/dist/lab/deprecated-fields.js +24 -0
- package/dist/lab/device-presets.d.ts +10 -10
- package/dist/lab/device-presets.js +11 -11
- package/dist/lab/discover.d.ts +13 -9
- package/dist/lab/discover.js +118 -60
- package/dist/lab/doctor.d.ts +53 -11
- package/dist/lab/doctor.js +193 -47
- package/dist/lab/init-plan.js +1 -3
- package/dist/lab/init-templates.js +147 -147
- package/dist/lab/init.d.ts +1 -1
- package/dist/lab/init.js +41 -9
- package/dist/lab/keys.d.ts +2 -0
- package/dist/lab/keys.js +43 -9
- package/dist/lab/lab-deps.d.ts +80 -0
- package/dist/lab/lab-deps.js +4 -0
- package/dist/lab/parse/actors.js +17 -16
- package/dist/lab/parse/comms.js +8 -7
- package/dist/lab/parse/execution.js +15 -14
- package/dist/lab/parse/study-v3.d.ts +23 -0
- package/dist/lab/parse/study-v3.js +259 -0
- package/dist/lab/parse/subject-state.d.ts +7 -7
- package/dist/lab/parse/subject-state.js +18 -17
- package/dist/lab/parse/subject.js +30 -29
- package/dist/lab/parse/values.d.ts +1 -2
- package/dist/lab/parse/values.js +3 -6
- package/dist/lab/persona-resolve.d.ts +7 -7
- package/dist/lab/persona-resolve.js +8 -8
- package/dist/lab/persona.js +1 -3
- package/dist/lab/plan-base.d.ts +0 -2
- package/dist/lab/plan-base.js +6 -4
- package/dist/lab/plan-participants.d.ts +7 -7
- package/dist/lab/plan-participants.js +2 -2
- package/dist/lab/plan-types.d.ts +26 -8
- package/dist/lab/plan.d.ts +4 -18
- package/dist/lab/plan.js +24 -79
- package/dist/lab/preflight-probes.js +11 -11
- package/dist/lab/preflight-result.d.ts +2 -1
- package/dist/lab/preflight-result.js +5 -6
- package/dist/lab/preflight.d.ts +7 -8
- package/dist/lab/preflight.js +6 -6
- package/dist/lab/requirements.d.ts +20 -0
- package/dist/lab/requirements.js +54 -0
- package/dist/lab/route-inputs.d.ts +23 -12
- package/dist/lab/route-inputs.js +48 -51
- package/dist/lab/routing.d.ts +42 -41
- package/dist/lab/routing.js +66 -68
- package/dist/lab/run-lab-events.d.ts +3 -11
- package/dist/lab/run-lab-events.js +2 -16
- package/dist/lab/run-lab-homes.d.ts +76 -0
- package/dist/lab/run-lab-homes.js +7 -0
- package/dist/lab/run-lab-options.d.ts +12 -66
- package/dist/lab/run-lab-options.js +58 -285
- package/dist/lab/summary.d.ts +15 -9
- package/dist/lab/summary.js +24 -17
- package/dist/lab/tasks.d.ts +15 -15
- package/dist/lab/tasks.js +14 -14
- package/dist/lab/types.d.ts +201 -195
- package/dist/lab/types.js +2 -0
- package/dist/lab/validation.d.ts +21 -21
- package/dist/lab/validation.js +61 -59
- package/dist/lab/warnings.d.ts +10 -0
- package/dist/lab/warnings.js +70 -41
- package/dist/library-aliases.d.ts +56 -0
- package/dist/library-aliases.js +22 -0
- package/dist/observer/artifact.d.ts +2 -2
- package/dist/observer/artifact.js +9 -9
- package/dist/observer/data.d.ts +6 -6
- package/dist/observer/data.js +7 -6
- package/dist/observer/exposure.d.ts +1 -1
- package/dist/observer/exposure.js +11 -11
- package/dist/observer/http.js +1 -1
- package/dist/observer/library.d.ts +1 -1
- package/dist/observer/library.js +4 -2
- package/dist/observer/listen.js +5 -4
- package/dist/observer/render.d.ts +1 -1
- package/dist/observer/render.js +12 -7
- package/dist/observer/run-routes.d.ts +4 -4
- package/dist/observer/run-routes.js +6 -6
- package/dist/observer/serve.d.ts +17 -0
- package/dist/observer/serve.js +41 -6
- package/dist/observer/tunnel.js +1 -1
- package/dist/observer-app.html +4 -4
- package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
- package/dist/routes/computer-use/bundle-parts.js +24 -17
- package/dist/routes/computer-use/bundle.d.ts +4 -11
- package/dist/routes/computer-use/bundle.js +12 -18
- package/dist/routes/computer-use/diagnostics.d.ts +1 -1
- package/dist/routes/computer-use/diagnostics.js +1 -1
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +11 -11
- package/dist/routes/computer-use/e2b-desktop/comms.js +24 -27
- package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
- package/dist/routes/computer-use/e2b-desktop/desktop.js +8 -11
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +16 -15
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +20 -19
- package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
- package/dist/routes/computer-use/e2b-desktop/prepare.js +40 -43
- package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/start.js +32 -30
- package/dist/routes/computer-use/e2b-desktop/state.d.ts +5 -4
- package/dist/routes/computer-use/e2b-desktop/state.js +5 -3
- package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/teardown.js +33 -20
- package/dist/routes/computer-use/external-comms.d.ts +4 -4
- package/dist/routes/computer-use/external-comms.js +19 -43
- package/dist/routes/computer-use/fanout-bundle.d.ts +3 -3
- package/dist/routes/computer-use/fanout-bundle.js +38 -42
- package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +33 -28
- package/dist/routes/computer-use/in-process-desktop.d.ts +3 -10
- package/dist/routes/computer-use/in-process-desktop.js +3 -9
- package/dist/routes/computer-use/live-flush.d.ts +7 -5
- package/dist/routes/computer-use/live-flush.js +20 -28
- package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +4 -2
- package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +17 -16
- package/dist/routes/computer-use/local-tree-pack.d.ts +3 -3
- package/dist/routes/computer-use/local-tree-pack.js +4 -5
- package/dist/routes/computer-use/local-vm.d.ts +11 -8
- package/dist/routes/computer-use/local-vm.js +40 -67
- package/dist/routes/computer-use/participant-desktop.d.ts +8 -23
- package/dist/routes/computer-use/participant-desktop.js +5 -25
- package/dist/routes/computer-use/{lanes.d.ts → participant-execution.d.ts} +11 -11
- package/dist/routes/computer-use/{lanes.js → participant-execution.js} +39 -26
- package/dist/routes/computer-use/participant-facts.d.ts +7 -1
- package/dist/routes/computer-use/participant-facts.js +12 -1
- package/dist/routes/computer-use/participant-model.d.ts +25 -11
- package/dist/routes/computer-use/participant-model.js +76 -34
- package/dist/routes/computer-use/participant-prompt.d.ts +13 -13
- package/dist/routes/computer-use/participant-prompt.js +8 -8
- package/dist/routes/computer-use/participant-runs.d.ts +11 -11
- package/dist/routes/computer-use/participant-runs.js +18 -18
- package/dist/routes/computer-use/plan.d.ts +21 -29
- package/dist/routes/computer-use/plan.js +70 -78
- package/dist/routes/computer-use/preflight.d.ts +3 -5
- package/dist/routes/computer-use/preflight.js +40 -36
- package/dist/routes/computer-use/rerun-selection.js +11 -7
- package/dist/routes/computer-use/result.d.ts +1 -1
- package/dist/routes/computer-use/result.js +48 -38
- package/dist/routes/computer-use/route.d.ts +5 -5
- package/dist/routes/computer-use/route.js +36 -33
- package/dist/routes/computer-use/self-report.d.ts +8 -8
- package/dist/routes/computer-use/self-report.js +33 -33
- package/dist/routes/computer-use/setup.d.ts +9 -15
- package/dist/routes/computer-use/setup.js +106 -83
- package/dist/routes/computer-use/single-bundle.d.ts +13 -16
- package/dist/routes/computer-use/single-bundle.js +46 -53
- package/dist/routes/computer-use/subject-projection.d.ts +6 -8
- package/dist/routes/computer-use/subject-projection.js +24 -23
- package/dist/routes/computer-use/types.d.ts +195 -238
- package/dist/routes/computer-use/types.js +21 -13
- package/dist/routes/preview.d.ts +8 -2
- package/dist/routes/preview.js +8 -5
- package/dist/routes/scripted/bundle.d.ts +5 -8
- package/dist/routes/scripted/bundle.js +23 -27
- package/dist/routes/scripted/plan.d.ts +6 -8
- package/dist/routes/scripted/plan.js +15 -13
- package/dist/routes/scripted/result.d.ts +4 -1
- package/dist/routes/scripted/result.js +15 -11
- package/dist/routes/scripted/route.js +15 -17
- package/dist/routes/scripted/scenario.d.ts +1 -1
- package/dist/routes/scripted/scenario.js +3 -3
- package/dist/routes/scripted/setup.d.ts +3 -2
- package/dist/routes/scripted/setup.js +27 -26
- package/dist/routes/scripted/subject.d.ts +8 -3
- package/dist/routes/scripted/subject.js +10 -6
- package/dist/routes/scripted/surface-records.js +4 -4
- package/dist/routes/scripted/surface-sessions.d.ts +2 -2
- package/dist/routes/scripted/surface-sessions.js +4 -4
- package/dist/routes/scripted/types.d.ts +21 -40
- package/dist/routes/scripted/types.js +2 -3
- package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +17 -16
- package/dist/routes/shared-world/bundle.d.ts +7 -7
- package/dist/routes/shared-world/bundle.js +60 -62
- package/dist/routes/shared-world/checkpoints.d.ts +5 -5
- package/dist/routes/shared-world/checkpoints.js +5 -5
- package/dist/routes/shared-world/comms.d.ts +8 -7
- package/dist/routes/shared-world/comms.js +38 -51
- package/dist/routes/shared-world/external-public.d.ts +6 -5
- package/dist/routes/shared-world/external-public.js +28 -25
- package/dist/routes/shared-world/handoff.d.ts +10 -9
- package/dist/routes/shared-world/handoff.js +89 -81
- package/dist/routes/shared-world/lobby-code.d.ts +7 -7
- package/dist/routes/shared-world/lobby-code.js +22 -22
- package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +15 -12
- package/dist/routes/shared-world/{seats.js → participant-specs.js} +65 -63
- package/dist/routes/shared-world/plan.d.ts +2 -6
- package/dist/routes/shared-world/plan.js +8 -9
- package/dist/routes/shared-world/provenance.d.ts +4 -4
- package/dist/routes/shared-world/provenance.js +4 -4
- package/dist/routes/shared-world/provisioned.d.ts +3 -2
- package/dist/routes/shared-world/provisioned.js +55 -48
- package/dist/routes/shared-world/result.js +47 -36
- package/dist/routes/shared-world/route.js +54 -57
- package/dist/routes/shared-world/setup.d.ts +6 -5
- package/dist/routes/shared-world/setup.js +16 -18
- package/dist/routes/shared-world/types.d.ts +70 -141
- package/dist/routes/shared-world/types.js +5 -5
- package/dist/routes/terminal/adapter.d.ts +10 -10
- package/dist/routes/terminal/adapter.js +32 -129
- package/dist/routes/terminal/bundle.d.ts +10 -15
- package/dist/routes/terminal/bundle.js +43 -52
- package/dist/routes/terminal/credentials.d.ts +4 -4
- package/dist/routes/terminal/credentials.js +20 -20
- package/dist/routes/terminal/dry-run.d.ts +1 -1
- package/dist/routes/terminal/dry-run.js +13 -15
- package/dist/routes/terminal/encoding.d.ts +1 -1
- package/dist/routes/terminal/encoding.js +4 -4
- package/dist/routes/terminal/ledger.d.ts +8 -8
- package/dist/routes/terminal/ledger.js +22 -22
- package/dist/routes/terminal/live-finish.d.ts +1 -2
- package/dist/routes/terminal/live-finish.js +24 -23
- package/dist/routes/terminal/live-sandbox.d.ts +3 -2
- package/dist/routes/terminal/live-sandbox.js +31 -32
- package/dist/routes/terminal/participant-text.d.ts +23 -0
- package/dist/routes/terminal/participant-text.js +165 -0
- package/dist/routes/terminal/persona.js +1 -1
- package/dist/routes/terminal/plan.d.ts +2 -6
- package/dist/routes/terminal/plan.js +23 -19
- package/dist/routes/terminal/recorder.d.ts +6 -1
- package/dist/routes/terminal/recorder.js +12 -4
- package/dist/routes/terminal/result.js +12 -12
- package/dist/routes/terminal/route.js +30 -31
- package/dist/routes/terminal/runtime.d.ts +3 -2
- package/dist/routes/terminal/runtime.js +3 -3
- package/dist/routes/terminal/sandbox.d.ts +4 -4
- package/dist/routes/terminal/sandbox.js +10 -10
- package/dist/routes/terminal/session.js +22 -19
- package/dist/routes/terminal/token-usage.d.ts +1 -1
- package/dist/routes/terminal/token-usage.js +10 -11
- package/dist/routes/terminal/trace.d.ts +7 -10
- package/dist/routes/terminal/trace.js +11 -66
- package/dist/routes/terminal/types.d.ts +104 -114
- package/dist/routes/terminal/types.js +12 -7
- package/dist/run/active-runs.d.ts +13 -0
- package/dist/run/active-runs.js +12 -0
- package/dist/run/bundle-shape.d.ts +2 -1
- package/dist/run/bundle-shape.js +7 -7
- package/dist/run/bundle.d.ts +99 -92
- package/dist/run/bundle.js +10 -8
- package/dist/run/cost-summary.js +6 -5
- package/dist/run/costs.d.ts +6 -6
- package/dist/run/costs.js +17 -11
- package/dist/run/detail.d.ts +9 -9
- package/dist/run/detail.js +10 -10
- package/dist/run/dry-run-inputs.js +1 -1
- package/dist/run/dry-run.js +23 -30
- package/dist/run/{study-files.d.ts → evidence-files.d.ts} +4 -4
- package/dist/run/{study-files.js → evidence-files.js} +5 -5
- package/dist/run/feedback-shape.js +1 -1
- package/dist/run/judge.d.ts +34 -16
- package/dist/run/judge.js +41 -14
- package/dist/run/locate.d.ts +2 -0
- package/dist/run/locate.js +3 -1
- package/dist/run/outcomes.d.ts +3 -3
- package/dist/run/outcomes.js +3 -3
- package/dist/run/participant-records.d.ts +2 -2
- package/dist/run/participant-records.js +2 -2
- package/dist/run/paths.d.ts +1 -1
- package/dist/run/paths.js +2 -2
- package/dist/run/pricing.d.ts +30 -15
- package/dist/run/pricing.js +49 -30
- package/dist/run/projection.d.ts +27 -27
- package/dist/run/projection.js +23 -23
- package/dist/run/reclaim.d.ts +6 -0
- package/dist/run/reclaim.js +15 -5
- package/dist/run/results.d.ts +5 -5
- package/dist/run/run-index.d.ts +9 -7
- package/dist/run/run-index.js +24 -25
- package/dist/run/run-not-found.d.ts +5 -0
- package/dist/run/run-not-found.js +15 -0
- package/dist/run/run.d.ts +7 -4
- package/dist/run/run.js +10 -6
- package/dist/run/sandbox-receipts.d.ts +5 -5
- package/dist/run/sandbox-receipts.js +6 -6
- package/dist/run/shared-world-evidence.d.ts +67 -66
- package/dist/run/shared-world-evidence.js +4 -4
- package/dist/run/shared-world-shape.d.ts +3 -3
- package/dist/run/shared-world-shape.js +16 -16
- package/dist/run/stats.d.ts +17 -11
- package/dist/run/stats.js +124 -66
- package/dist/run/status.d.ts +21 -32
- package/dist/run/status.js +34 -33
- package/dist/run/stored-runs.js +2 -1
- package/dist/run/stream-shape.js +1 -1
- package/dist/run/streams.d.ts +29 -22
- package/dist/run/study-provenance.d.ts +47 -0
- package/dist/run/study-provenance.js +63 -0
- package/dist/run/study-result.d.ts +16 -0
- package/dist/run/study-result.js +9 -0
- package/dist/run/terminal-contract.d.ts +5 -5
- package/dist/run/terminal-contract.js +4 -4
- package/dist/run/text.d.ts +2 -0
- package/dist/run/text.js +4 -0
- package/dist/run/transient-comms-secrets.d.ts +5 -0
- package/dist/run/transient-comms-secrets.js +12 -0
- package/dist/run-lab.d.ts +40 -38
- package/dist/run-lab.js +42 -40
- package/dist/study/convert.d.ts +33 -0
- package/dist/study/convert.js +432 -0
- package/dist/study/field-paths.d.ts +12 -0
- package/dist/study/field-paths.js +126 -0
- package/dist/study/files.d.ts +26 -0
- package/dist/study/files.js +43 -0
- package/dist/study/migrate.d.ts +48 -0
- package/dist/study/migrate.js +408 -0
- package/dist/study/owned-files.d.ts +38 -0
- package/dist/study/owned-files.js +182 -0
- package/dist/subject/clone.d.ts +1 -1
- package/dist/subject/desktop-cli.d.ts +2 -2
- package/dist/subject/desktop-cli.js +3 -3
- package/dist/subject/local-tree-archive.d.ts +1 -1
- package/dist/subject/local-tree-archive.js +5 -5
- package/dist/subject/local-tree.d.ts +3 -3
- package/dist/subject/local-tree.js +1 -1
- package/dist/subject/node-bootstrap.d.ts +1 -1
- package/dist/subject/node-bootstrap.js +4 -4
- package/dist/subject/runtime.js +10 -11
- package/dist/subject/serve.d.ts +1 -1
- package/dist/subject/serve.js +4 -4
- package/dist/subject/state.d.ts +1 -1
- package/dist/subject/steps.d.ts +8 -8
- package/dist/subject/steps.js +7 -7
- package/dist/substrates/command-failure.d.ts +3 -3
- package/dist/substrates/command-failure.js +3 -3
- package/dist/substrates/detached.d.ts +6 -6
- package/dist/substrates/detached.js +7 -7
- package/dist/substrates/e2b/cdp-probe.d.ts +11 -11
- package/dist/substrates/e2b/cdp-probe.js +15 -18
- package/dist/substrates/e2b/desktop-browser.d.ts +5 -5
- package/dist/substrates/e2b/desktop-browser.js +12 -12
- package/dist/substrates/e2b/desktop-cdp.d.ts +15 -15
- package/dist/substrates/e2b/desktop-cdp.js +11 -11
- package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
- package/dist/substrates/e2b/desktop-executor.js +1 -1
- package/dist/substrates/e2b/desktop-geometry.d.ts +6 -6
- package/dist/substrates/e2b/desktop-geometry.js +9 -9
- package/dist/substrates/e2b/desktop-media.d.ts +1 -1
- package/dist/substrates/e2b/desktop-media.js +3 -3
- package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
- package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
- package/dist/substrates/e2b/sandbox.d.ts +1 -1
- package/dist/substrates/e2b/sandbox.js +2 -2
- package/dist/substrates/e2b/sdk.d.ts +11 -11
- package/dist/substrates/e2b/sdk.js +8 -8
- package/dist/substrates/local/runtime-host.d.ts +2 -0
- package/dist/substrates/local/runtime-host.js +6 -0
- package/dist/tui/actions.d.ts +8 -6
- package/dist/tui/actions.js +31 -22
- package/dist/tui/contract.d.ts +16 -16
- package/dist/tui/contract.js +10 -10
- package/dist/tui/launch.d.ts +4 -4
- package/dist/tui/launch.js +18 -19
- package/dist/tui/project.js +5 -5
- package/dist/tui-app.js +83 -83
- package/dist/verify/actor.d.ts +14 -14
- package/dist/verify/actor.js +45 -45
- package/dist/verify/artifacts.d.ts +3 -3
- package/dist/verify/artifacts.js +6 -6
- package/dist/verify/context-growth.d.ts +9 -0
- package/dist/verify/context-growth.js +62 -0
- package/dist/verify/costs.d.ts +7 -7
- package/dist/verify/costs.js +9 -9
- package/dist/verify/liveness.d.ts +1 -1
- package/dist/verify/liveness.js +4 -1
- package/dist/verify/rerun.d.ts +1 -1
- package/dist/verify/rerun.js +1 -1
- package/dist/verify/shared-world-concurrent.d.ts +2 -2
- package/dist/verify/shared-world-concurrent.js +79 -76
- package/dist/verify/shared-world.d.ts +2 -2
- package/dist/verify/shared-world.js +18 -18
- package/dist/verify/subject.d.ts +4 -4
- package/dist/verify/subject.js +18 -18
- package/dist/verify/verify.js +98 -49
- package/docs/README.md +26 -33
- package/docs/architecture/actor-contract.md +105 -98
- package/docs/architecture/desktop-sessions.md +14 -14
- package/docs/architecture/external-public-shared-world.md +66 -59
- package/docs/architecture/github-feedback-loop.md +1 -4
- package/docs/architecture/guest-desktop.md +2 -2
- package/docs/architecture/observer.md +37 -37
- package/docs/architecture/restricted-codex-analysis.md +70 -30
- package/docs/architecture/serve.md +34 -37
- package/docs/architecture/state-driven-executor.md +55 -59
- package/docs/architecture/task-protocol-support.md +7 -9
- package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +83 -115
- package/docs/contracts/README.md +24 -0
- package/docs/contracts/adapter-admission.md +3 -3
- package/docs/contracts/adapter-fixtures.md +2 -5
- package/docs/contracts/core.md +1 -3
- package/docs/contracts/errors.md +62 -0
- package/docs/contracts/feedback.md +8 -9
- package/docs/contracts/policy.md +7 -12
- package/docs/contracts/run-bundle.md +54 -51
- package/docs/contracts/schemas.md +505 -390
- package/docs/contracts/study-analysis.md +26 -2
- package/docs/contracts/study-costs.md +11 -7
- package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
- package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
- package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
- package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
- package/docs/principles/actor-fidelity.md +4 -4
- package/docs/principles/engineering.md +3 -3
- package/docs/principles/invariants-and-defaults.md +38 -38
- package/docs/principles/self-driving-harness.md +1 -5
- package/docs/principles/three-roles.md +1 -1
- package/docs/product/automatic-analysis.md +8 -7
- package/examples/participant/README.md +5 -5
- package/examples/participant/run.mjs +11 -10
- package/examples/scorer/README.md +3 -3
- package/examples/scorer/run.mjs +11 -12
- package/package.json +16 -17
- package/skills/humanish/SKILL.md +63 -60
- package/skills/humanish/agents/openai.yaml +1 -1
- package/AGENTS.md +0 -99
- package/CONTRIBUTING.md +0 -148
- package/dist/actors/codex/qualified-versions.d.ts +0 -45
- package/dist/actors/codex/qualified-versions.js +0 -87
- package/dist/cli/commands/lab.d.ts +0 -3
- package/dist/cli/commands/lab.js +0 -193
- package/dist/deprecated.d.ts +0 -90
- package/dist/deprecated.js +0 -106
- package/dist/lab/bag-overrides.d.ts +0 -18
- package/dist/lab/bag-overrides.js +0 -121
- package/dist/observer/static.d.ts +0 -39
- package/dist/observer/static.js +0 -369
- package/dist/routes/computer-use/legacy-lane-spec.d.ts +0 -62
- package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
- package/docs/architecture/comms-inbox.md +0 -122
- package/docs/architecture/desktop-recording.md +0 -80
- package/docs/architecture/local-browser-runtime.md +0 -178
- package/docs/architecture/observer-review.md +0 -144
- package/docs/architecture/participant-media.md +0 -90
- package/docs/architecture/project-layout.md +0 -62
- package/docs/architecture/real-email-receiving.md +0 -136
- package/docs/assets/humanish-drawdb-hero.png +0 -0
- package/docs/assets/humanish-observer-hero.png +0 -0
- package/docs/goals/current.md +0 -207
- package/docs/product/lobby-trivia-3player-external-public.md +0 -77
- package/docs/product/open-source-install-experience.md +0 -240
- package/docs/ramp/README.md +0 -294
- package/docs/release/open-source-readiness.md +0 -222
- package/docs/release/public-readiness-standard.md +0 -210
- package/docs/roadmap/world-class-open-source-v0.md +0 -311
- /package/dist/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
- /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import type { ActorPersonaRef } from "../../actors/contract.js";
|
|
2
|
-
import type { ReasoningEffort } from "../../actors/reasoning-effort.js";
|
|
3
|
-
import type { DwellWindow, StopWhen } from "../../actors/stop-conditions.js";
|
|
4
|
-
import type { DevicePreset } from "../../lab/device-presets.js";
|
|
5
|
-
import type { LabTask } from "../../lab/tasks.js";
|
|
6
|
-
import type { RunStream } from "../../run/streams.js";
|
|
7
|
-
import type { DesktopParticipantRun } from "./types.js";
|
|
8
|
-
/**
|
|
9
|
-
* A lane as the deprecated cuaHooks.buildProvider and cuaHooks.createDesktopLane receive it: a flat
|
|
10
|
-
* copy of a DesktopParticipantRun.
|
|
11
|
-
* @deprecated Use RunLabOptions.createProvider, which receives a ParticipantRef. Removed with the
|
|
12
|
-
* compatibility section in the next minor.
|
|
13
|
-
*/
|
|
14
|
-
export interface CuaLaneSpec {
|
|
15
|
-
laneId: string;
|
|
16
|
-
actorType?: string;
|
|
17
|
-
surface?: string;
|
|
18
|
-
caseGroup?: string;
|
|
19
|
-
/** 0-based. */
|
|
20
|
-
laneIndex: number;
|
|
21
|
-
simId: string;
|
|
22
|
-
streamId: string;
|
|
23
|
-
persona: ActorPersonaRef;
|
|
24
|
-
instructions: string;
|
|
25
|
-
/** Redacted original composed prompt for legacy study context; execution uses instructions. */
|
|
26
|
-
evidenceInstructions?: string;
|
|
27
|
-
/** Original declarative assignment, separate from runtime-composed instructions. */
|
|
28
|
-
assignment?: RunStream["assignment"];
|
|
29
|
-
/** App-url fan-out only: this lane's explicit browser target; absent falls back to deps.appUrl. */
|
|
30
|
-
targetUrl?: string;
|
|
31
|
-
/** Deterministic harness-owned completion guard. Lane-level override, else actor default. */
|
|
32
|
-
stopWhen?: StopWhen;
|
|
33
|
-
/** A declared observation window (#510). Lane-level override, else actor default. */
|
|
34
|
-
dwell?: DwellWindow;
|
|
35
|
-
/**
|
|
36
|
-
* How hard this lane's model is asked to think. Lane-level override, else the actor default,
|
|
37
|
-
* else absent — and absent means the provider's own default, which the trace records as the
|
|
38
|
-
* resolved value rather than as nothing (#497).
|
|
39
|
-
*/
|
|
40
|
-
reasoningEffort?: ReasoningEffort;
|
|
41
|
-
maxOutputTokens?: number;
|
|
42
|
-
/** The lab's declared protocol (#414). Every lane runs the SAME protocol — that is what makes the
|
|
43
|
-
* per-task rates comparable across participants. Goals are already composed into `instructions`;
|
|
44
|
-
* this carries the full tasks so the loop can corroborate completion, and the criteria never
|
|
45
|
-
* reach the prompt. */
|
|
46
|
-
tasks?: readonly LabTask[];
|
|
47
|
-
/** Per-lane override of the CUA idle backstop (consecutive screenshot/wait turns before gave_up).
|
|
48
|
-
* Absent falls back to the loop default. Raised for a lane whose job includes a long LEGITIMATE
|
|
49
|
-
* wait (e.g. a shared-world HOST idling in the waiting room while followers provision + join). */
|
|
50
|
-
idleSteps?: number;
|
|
51
|
-
/** Per-lane override of the non-idle no-progress backstop; see idleSteps. */
|
|
52
|
-
noProgressSteps?: number;
|
|
53
|
-
deviceName: string;
|
|
54
|
-
devicePreset: DevicePreset;
|
|
55
|
-
resolution: [number, number];
|
|
56
|
-
/** "" for N=1 (screenshots/<name>); the laneId for N>1 (screenshots/<laneId>/<name>). */
|
|
57
|
-
screenshotDir: string;
|
|
58
|
-
/** "actor.json" for N=1; "actors/<streamId>.json" for N>1. */
|
|
59
|
-
traceArtifactPath: string;
|
|
60
|
-
}
|
|
61
|
-
/** The flat hook view of one participant run. Called only where a caller's hook receives a lane. */
|
|
62
|
-
export declare function legacyHookSpecOf(run: DesktopParticipantRun): CuaLaneSpec;
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
// Translation module: legacy lane spellings stay only in modules like this one, so the rest of the
|
|
2
|
-
// route reads participants. CuaActorLabHooks is public API in the deprecated compatibility section, and two of its hooks,
|
|
3
|
-
// buildProvider and createDesktopLane, receive a lane. They keep receiving this flat record until
|
|
4
|
-
// the next minor removes the section. Internally a lane is a DesktopParticipantRun.
|
|
5
|
-
/** The flat hook view of one participant run. Called only where a caller's hook receives a lane. */
|
|
6
|
-
export function legacyHookSpecOf(run) {
|
|
7
|
-
const { planned } = run;
|
|
8
|
-
const { labels, limits, device } = planned;
|
|
9
|
-
return {
|
|
10
|
-
laneId: planned.id,
|
|
11
|
-
...(labels.actorType === undefined ? {} : { actorType: labels.actorType }),
|
|
12
|
-
...(labels.surface === undefined ? {} : { surface: labels.surface }),
|
|
13
|
-
...(labels.caseGroup === undefined ? {} : { caseGroup: labels.caseGroup }),
|
|
14
|
-
laneIndex: planned.index,
|
|
15
|
-
simId: run.recordId,
|
|
16
|
-
streamId: run.streamId,
|
|
17
|
-
persona: run.persona,
|
|
18
|
-
instructions: run.instructions,
|
|
19
|
-
...(run.evidenceInstructions === undefined
|
|
20
|
-
? {}
|
|
21
|
-
: { evidenceInstructions: run.evidenceInstructions }),
|
|
22
|
-
...(run.evidenceAssignment === undefined ? {} : { assignment: run.evidenceAssignment }),
|
|
23
|
-
...(planned.targetUrl === undefined ? {} : { targetUrl: planned.targetUrl }),
|
|
24
|
-
...(limits.stopWhen === undefined ? {} : { stopWhen: limits.stopWhen }),
|
|
25
|
-
...(limits.dwell === undefined ? {} : { dwell: limits.dwell }),
|
|
26
|
-
...(limits.reasoningEffort === undefined ? {} : { reasoningEffort: limits.reasoningEffort }),
|
|
27
|
-
...(limits.maxOutputTokens === undefined ? {} : { maxOutputTokens: limits.maxOutputTokens }),
|
|
28
|
-
...(planned.tasks === undefined ? {} : { tasks: planned.tasks }),
|
|
29
|
-
...(run.backstop?.idleSteps === undefined ? {} : { idleSteps: run.backstop.idleSteps }),
|
|
30
|
-
...(run.backstop?.noProgressSteps === undefined
|
|
31
|
-
? {}
|
|
32
|
-
: { noProgressSteps: run.backstop.noProgressSteps }),
|
|
33
|
-
deviceName: device.name,
|
|
34
|
-
devicePreset: device.preset,
|
|
35
|
-
resolution: device.resolution,
|
|
36
|
-
screenshotDir: run.screenshotDir,
|
|
37
|
-
traceArtifactPath: run.traceArtifactPath,
|
|
38
|
-
};
|
|
39
|
-
}
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
# Participant inboxes
|
|
2
|
-
|
|
3
|
-
This page describes local capture. For fresh hosted inboxes, see
|
|
4
|
-
[real email receiving](real-email-receiving.md); that route has a separate
|
|
5
|
-
parsed renderer, strict remote-asset blocking and private lease lifecycle.
|
|
6
|
-
|
|
7
|
-
The catch captures application mail without sending it to an external recipient.
|
|
8
|
-
humanish gives each participant an address and a matching
|
|
9
|
-
`/inbox/for/<address-digest>` URL. The same address scope applies to list, message,
|
|
10
|
-
plain view, latest-message and JSON routes. Going back from a missing message
|
|
11
|
-
stays in that scope. An unknown scope is empty; it never falls back to all mail.
|
|
12
|
-
A participant without an assigned address receives no inbox instruction.
|
|
13
|
-
|
|
14
|
-
This works with separate participant worlds, shared worlds, and an external catch.
|
|
15
|
-
Sharing an application world does not require sharing an inbox. If a lab deliberately
|
|
16
|
-
assigns the same address to two participants, both see that address's mail. Generated
|
|
17
|
-
addresses that collide after normalization are made distinct. A message addressed
|
|
18
|
-
to several participants appears in each recipient's inbox and retains its actual
|
|
19
|
-
To field.
|
|
20
|
-
|
|
21
|
-
`/inbox` remains available and is labeled **Shared operator inbox**. Address digests
|
|
22
|
-
are routing identifiers, not authentication credentials. The catch is study
|
|
23
|
-
infrastructure, not a mailbox service with hostile-tenant isolation. Keep its network
|
|
24
|
-
exposure appropriate for test mail. The read-only listener cannot expose the private
|
|
25
|
-
`/deliveries` drain, even when supplied a valid drain token. The capture listener
|
|
26
|
-
retains its existing optional bearer-token protection for that endpoint.
|
|
27
|
-
|
|
28
|
-
A standalone catch tracks its generated files. Reusing its directory with a changed
|
|
29
|
-
`--recipient` roster or an emptied delivery log removes obsolete message, latest and
|
|
30
|
-
recipient routes; unrelated files are untouched.
|
|
31
|
-
|
|
32
|
-
## Local browser studies
|
|
33
|
-
|
|
34
|
-
Run a catch on the same host as the local study:
|
|
35
|
-
|
|
36
|
-
```bash
|
|
37
|
-
humanish comms catch --port 8025 --dir .humanish/mail-catch
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
Configure your **app's** email transport to send to `http://127.0.0.1:8025`
|
|
41
|
-
using its supported HTTP send configuration, or add `--smtp-port 1025` and
|
|
42
|
-
point its SMTP transport at `127.0.0.1:1025`. humanish does not change an
|
|
43
|
-
already-running app's environment. No real mailbox-provider credentials are
|
|
44
|
-
needed. This captures mail sent by that app; it does not receive arbitrary
|
|
45
|
-
internet email.
|
|
46
|
-
|
|
47
|
-
Add this to an existing local `app-url` lab:
|
|
48
|
-
|
|
49
|
-
```yaml
|
|
50
|
-
comms:
|
|
51
|
-
email:
|
|
52
|
-
external:
|
|
53
|
-
catchBaseUrl: http://127.0.0.1:8025
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
Then run `humanish doctor --lab <lab>` and `humanish run <lab>`. Omit
|
|
57
|
-
`recipients` to assign an address per participant automatically, or declare explicit
|
|
58
|
-
`{ lane, address }` entries for an existing roster. The participant receives its
|
|
59
|
-
address and inbox URL in its mission. Verification links keep their original
|
|
60
|
-
app origin; ensure they target the loopback app port selected by the lab.
|
|
61
|
-
|
|
62
|
-
Each local desktop forwards a separate host-owned read-only proxy for its
|
|
63
|
-
assigned recipient. Other recipient routes, the operator inbox, mail sends and
|
|
64
|
-
the private delivery drain are unavailable through that proxy. The study closes
|
|
65
|
-
these proxies with its desktops and leaves your catch running. Host-side
|
|
66
|
-
collection uses the existing digest-only comms evidence. Supported captured
|
|
67
|
-
images and explicit unavailable-image placeholders work as described below.
|
|
68
|
-
|
|
69
|
-
The local path supports captured email only. Provider-backed real receiving
|
|
70
|
-
retains its separate hosted-route and management-credential requirements.
|
|
71
|
-
|
|
72
|
-
## Existing external catches
|
|
73
|
-
|
|
74
|
-
Upgrade the humanish installation that runs `humanish comms catch` and **restart that
|
|
75
|
-
catch process**, as well as upgrading the installation that starts the study. Updating
|
|
76
|
-
only the study client leaves an older catch without participant routes.
|
|
77
|
-
|
|
78
|
-
Before allocating participants, the client checks `/health` on both `catchBaseUrl`
|
|
79
|
-
and a distinct `inboxBaseUrl`. Each must return the normal service marker and
|
|
80
|
-
`capabilities: ["recipient-inbox-v1", ...]`. Missing, malformed or older responses
|
|
81
|
-
fail admission with an upgrade/restart instruction. Existing email capture endpoints
|
|
82
|
-
and unscoped operator URLs remain available; their payload contracts are unchanged.
|
|
83
|
-
|
|
84
|
-
## Captured and remote images
|
|
85
|
-
|
|
86
|
-
The SMTP catch preserves MIME parts with a Content-ID when they contain PNG, JPEG,
|
|
87
|
-
GIF or WebP bytes. The generic `/emails` payload can also carry runtime-only
|
|
88
|
-
`inlineImages` entries with `contentId`, `contentType` and `base64`. Provider-specific
|
|
89
|
-
attachment fields are not converted; unsupported or missing CID references show an
|
|
90
|
-
explicit unavailable-image placeholder instead of pretending capture succeeded.
|
|
91
|
-
|
|
92
|
-
Captured images are limited to 12 entries, 1 MiB each and 2 MiB total. The renderer
|
|
93
|
-
checks canonical base64 and the declared raster format's signature before creating a
|
|
94
|
-
data URL. This is not a full image decoder; malformed raster content can still fail
|
|
95
|
-
in the browser. Inline data URLs receive the same per-image checks. SVG, arbitrary
|
|
96
|
-
attachment URLs and local paths are not fetched or converted.
|
|
97
|
-
|
|
98
|
-
HTTP(S) images remain browser loads with `no-referrer`. humanish does not fetch or
|
|
99
|
-
proxy them server-side. Relative image URLs use the existing declared origin-rewrite
|
|
100
|
-
map when available; otherwise they receive an explicit placeholder. Remote URLs that
|
|
101
|
-
return errors retain the browser's alt-text fallback. The renderer does not claim to
|
|
102
|
-
repair a dead URL. The inbox retains `script-src 'none'` and the existing HTML
|
|
103
|
-
neutralization and origin-rewrite protections.
|
|
104
|
-
|
|
105
|
-
Raw mail and image bytes remain runtime catch data. Persisted comms evidence remains
|
|
106
|
-
digest-only; adding image capture does not add raw attachments to the run artifact.
|
|
107
|
-
|
|
108
|
-
## Reproduce the contract
|
|
109
|
-
|
|
110
|
-
```bash
|
|
111
|
-
pnpm exec vitest run tests/comms/ tests/substrates/local/captured-inbox.test.ts
|
|
112
|
-
pnpm exec tsx scripts/comms-inbox-proof.ts
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
The browser proof starts owned loopback HTTP, read-only inbox and SMTP listeners,
|
|
116
|
-
sends fictional multipart mail through the real MIME parser, and renders two recipient
|
|
117
|
-
inboxes in Chromium at desktop and phone sizes. It checks decoded CID/data/remote
|
|
118
|
-
images, unavailable sources, a genuine remote 404, recipient isolation across HTML
|
|
119
|
-
and JSON, navigation, script blocking, referrer suppression, directory reuse and drain
|
|
120
|
-
access. Screenshots and a machine-readable receipt are saved under the ignored
|
|
121
|
-
`.humanish/comms-inbox-proof/` directory. It uses no external email delivery, paid model
|
|
122
|
-
calls or hosted desktop, and makes no claim about those providers.
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
# Optional desktop recording
|
|
2
|
-
|
|
3
|
-
humanish keeps screenshots, actions, participant feedback and analysis by default.
|
|
4
|
-
For continuous playback, opt into a desktop video:
|
|
5
|
-
|
|
6
|
-
```yaml
|
|
7
|
-
execution:
|
|
8
|
-
desktop:
|
|
9
|
-
recording: { audio: true }
|
|
10
|
-
```
|
|
11
|
-
|
|
12
|
-
Set `audio: false` for screen-only video. Omit `recording` to keep the lightweight
|
|
13
|
-
snapshot recording. This applies to independent computer-use desktop participants on
|
|
14
|
-
local Firecracker and E2B; scripted-browser, shared-world and in-process executors
|
|
15
|
-
do not consume this setting and reject it before execution.
|
|
16
|
-
|
|
17
|
-
Recording does not enable a camera, speech synthesis or speech recognition.
|
|
18
|
-
Those remain separate [participant media](participant-media.md) options. With
|
|
19
|
-
audio enabled, microphone input and speaker output are mixed into one AAC track.
|
|
20
|
-
`audioSources` identifies the capture points feeding that mix, not separate
|
|
21
|
-
retained tracks. The microphone can be silent when speech is not configured.
|
|
22
|
-
A recorded microphone signal proves what was offered to the browser, not what
|
|
23
|
-
another person received. Confirm reciprocal delivery from the other
|
|
24
|
-
participant's evidence.
|
|
25
|
-
|
|
26
|
-
## Capture and playback
|
|
27
|
-
|
|
28
|
-
The desktop runs FFmpeg against its X display. MP4 carries H.264 video and optional
|
|
29
|
-
AAC audio. Recording stops and streams to the run directory before desktop cleanup.
|
|
30
|
-
Both providers use the same encoding settings and artifact metadata. Video encoding
|
|
31
|
-
uses the capture input’s microsecond time base, preserving closely spaced captures
|
|
32
|
-
and their offsets rather than rounding them to the nominal frame interval.
|
|
33
|
-
Explicit variable-frame-rate output preserves gaps without filling them with
|
|
34
|
-
duplicate frames across the supported FFmpeg versions. The recording
|
|
35
|
-
mix disables playback rewinds to avoid the null sink's initial two-second buffer. The local
|
|
36
|
-
runtime transfers one bounded file over its existing owner connection; E2B uses
|
|
37
|
-
the SDK's streaming file download. Participant tools cannot request arbitrary files.
|
|
38
|
-
|
|
39
|
-
Local recording uses the existing optional media runtime archive. This keeps the
|
|
40
|
-
browser-only download unchanged, but the optional archive also contains speech
|
|
41
|
-
assets even when speech is disabled. Recording alone does not start Whisper or
|
|
42
|
-
text-to-speech. E2B's stock desktop already has the recording dependencies; a custom
|
|
43
|
-
template must provide compatible FFmpeg, X11 and, for audio, PulseAudio tools.
|
|
44
|
-
|
|
45
|
-
Observer uses the existing study clock to play the selected participant's video.
|
|
46
|
-
Scrubbing, opening a participant and returning to the grid preserve study time.
|
|
47
|
-
The grid continues to show lightweight captures; only the selected participant
|
|
48
|
-
has audible playback. Outside the retained media interval, Observer shows that
|
|
49
|
-
video is unavailable rather than extending its coverage. Old screenshot-only runs
|
|
50
|
-
continue to work.
|
|
51
|
-
|
|
52
|
-
Capture still begins after device and transport startup. An audio track can contain
|
|
53
|
-
silence before a cold source delivers sound; early dispatch of speech or playback
|
|
54
|
-
does not itself prove audible capture. Preserve these offsets when reviewing early
|
|
55
|
-
events. The startup correction does not reconstruct missing frames or audio in
|
|
56
|
-
existing files. Variable guest execution stalls can still leave frame gaps; the
|
|
57
|
-
recorded timestamps preserve those gaps. A regularly timestamped video can also
|
|
58
|
-
show an unchanged screen while the application stalls. Visual/audio event timing
|
|
59
|
-
depends on source delivery and guest execution; timestamp precision does not
|
|
60
|
-
guarantee simultaneous delivery. See #854 for the remaining investigation.
|
|
61
|
-
|
|
62
|
-
The file and its measured interval are recorded in `streams[].recording` and a
|
|
63
|
-
`recording` artifact entry. A recorder failure warns and preserves screenshots,
|
|
64
|
-
actions and feedback; it does not fail an otherwise useful participant. Incomplete
|
|
65
|
-
but playable media is labeled partial. Forced VM loss may leave no retrievable
|
|
66
|
-
video. Analysis continues to use the existing screenshot and text evidence; it
|
|
67
|
-
does not inspect the MP4.
|
|
68
|
-
|
|
69
|
-
## Local evidence and exports
|
|
70
|
-
|
|
71
|
-
Video and audio are raw local evidence. `policies.redactScreenshots` does not redact
|
|
72
|
-
them, and verification keeps a run with continuous media `local_only`. The recorder
|
|
73
|
-
has a 128 MiB per-participant file limit; a retained size-limited recording is partial.
|
|
74
|
-
Encoding consumes additional CPU, memory and disk, so snapshots remain the default.
|
|
75
|
-
|
|
76
|
-
`humanish export --local-only` produces the existing portable HTML with screenshots
|
|
77
|
-
and text, excludes continuous media and displays that exclusion. Open the original
|
|
78
|
-
run through `humanish watch` or `humanish serve` to play its video. Redacted bundle
|
|
79
|
-
export does not redact video/audio and rejects these runs. There is no new portable
|
|
80
|
-
video format or automatic audio/video redaction in this feature.
|
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
# Local browser studies
|
|
2
|
-
|
|
3
|
-
Linux x64 and supported Apple Silicon Mac users can run isolated Firecracker
|
|
4
|
-
browser participants from the installed CLI or TUI. Docker manages their
|
|
5
|
-
containers and private state volumes; the normal study runner supplies
|
|
6
|
-
scheduling, recordings, Observer and findings.
|
|
7
|
-
No separate host service is installed.
|
|
8
|
-
|
|
9
|
-
## Start a study
|
|
10
|
-
|
|
11
|
-
Both platforms need a signed-in, supported Codex CLI. Linux needs a local,
|
|
12
|
-
rootful Docker Engine, KVM (`/dev/kvm`) and TUN (`/dev/net/tun`). Macs need an
|
|
13
|
-
M3-or-newer chip, native ARM64 Node, Lima 2.2+ (`brew install lima`) and a macOS
|
|
14
|
-
version supporting nested virtualization; see [Mac setup](#apple-silicon-macs).
|
|
15
|
-
Docker Desktop is unnecessary. See
|
|
16
|
-
[Codex account setup](restricted-codex-analysis.md) for the qualified version
|
|
17
|
-
and account restrictions. Docker access is an administrative capability.
|
|
18
|
-
humanish does not install Docker on Linux or change host permissions. On Mac,
|
|
19
|
-
setup installs Docker only inside the dedicated Lima host.
|
|
20
|
-
|
|
21
|
-
Configure the starter while initializing the project, then start your app on
|
|
22
|
-
the same loopback URL:
|
|
23
|
-
|
|
24
|
-
```sh
|
|
25
|
-
npx humanish init --yes \
|
|
26
|
-
--local-browser http://127.0.0.1:3000 \
|
|
27
|
-
--local-mission "Create a note and explain anything confusing about saving it"
|
|
28
|
-
npx humanish doctor --lab local-browser
|
|
29
|
-
npx humanish run local-browser
|
|
30
|
-
npx humanish verify
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
`verify` checks the saved run bundle, and its share-safety line says whether the evidence can be
|
|
34
|
-
shared as-is. `init` also adds `humanish:*` scripts to `package.json`; `humanish:run` among them
|
|
35
|
-
is `humanish run --dry-run`, a contract-proof dry run rather than this live study. `init` also
|
|
36
|
-
writes `humanish/labs/local-browser.yaml` with safe defaults when the two options are omitted.
|
|
37
|
-
The options provide the normal setup path for the app URL and mission on first setup. If the
|
|
38
|
-
file already exists, `init` preserves it and warns that these options were skipped; edit the
|
|
39
|
-
existing manifest to change its URL or mission. The commands above write this lab (its
|
|
40
|
-
`description` is omitted here):
|
|
41
|
-
|
|
42
|
-
```yaml
|
|
43
|
-
schema: humanish.lab.v2
|
|
44
|
-
id: local-browser
|
|
45
|
-
title: Local browser · your app · Codex account
|
|
46
|
-
subject:
|
|
47
|
-
source: app-url
|
|
48
|
-
appUrl: "http://127.0.0.1:3000"
|
|
49
|
-
actors:
|
|
50
|
-
- type: local-agent
|
|
51
|
-
localAgent: codex
|
|
52
|
-
persona: synthetic-new-user
|
|
53
|
-
mission: "Create a note and explain anything confusing about saving it"
|
|
54
|
-
execution:
|
|
55
|
-
target: local
|
|
56
|
-
concurrency: 1
|
|
57
|
-
timeoutMs: 120000
|
|
58
|
-
scenario:
|
|
59
|
-
mode: live
|
|
60
|
-
defaults:
|
|
61
|
-
open: true
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
```sh
|
|
65
|
-
npx humanish runtime status --json
|
|
66
|
-
npx humanish doctor --lab local-browser --json
|
|
67
|
-
npx humanish run local-browser
|
|
68
|
-
npx humanish verify
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
The first live run downloads the pinned runtime archive (about 569 MiB on x64 or
|
|
72
|
-
556 MiB on ARM64), verifies its exact size and SHA-256, and loads it into Docker.
|
|
73
|
-
Later runs reuse the image.
|
|
74
|
-
`humanish runtime setup` prepares it in advance. Status, doctor and dry-run never
|
|
75
|
-
download an image or launch a participant. Preparation does not consume the
|
|
76
|
-
participant's task-time budget. The TUI lists the same lab and runtime readiness;
|
|
77
|
-
starting it uses the same preparation and execution path.
|
|
78
|
-
|
|
79
|
-
This configuration needs neither an E2B key nor an OpenAI API key. Participants
|
|
80
|
-
and the separate post-run analyst use Codex account quota and **remote model
|
|
81
|
-
inference**. It is not an offline model. The restricted participant has no host
|
|
82
|
-
shell, checkout mount or credential files. Account dollar cost and output-token
|
|
83
|
-
ceilings are unknown; numeric dollar/token caps are rejected. Set
|
|
84
|
-
`review.analysis: false` to skip analysis.
|
|
85
|
-
|
|
86
|
-
For API billing and its supported caps, use `type: openai-computer-use`, remove
|
|
87
|
-
`localAgent`, and provide `OPENAI_API_KEY`. Its analysis retains the existing API
|
|
88
|
-
default. Neither path silently falls back to another provider or hosted desktop.
|
|
89
|
-
Existing labs without `execution.target: local` retain their previous behavior.
|
|
90
|
-
|
|
91
|
-
Before handing the desktop to the participant, the guest opens the
|
|
92
|
-
selected app and waits up to 30 seconds for the initial document's
|
|
93
|
-
`DOMContentLoaded` event, then allows a bounded paint. It does not wait for app
|
|
94
|
-
data, images or network idle: the app's own loading screen remains observable.
|
|
95
|
-
Navigation failures and timeouts fail startup and release the owned desktop.
|
|
96
|
-
Later participant actions and observations do not use this startup wait.
|
|
97
|
-
|
|
98
|
-
## Current limits
|
|
99
|
-
|
|
100
|
-
- Linux x64 or M3-or-newer Mac with native ARM64 Node and Lima. Linux ARM64 is
|
|
101
|
-
refused: the local participant, the restricted Codex participant, runs only on
|
|
102
|
-
Linux x64 and Apple-silicon macOS. The installed Mac setup was tested on an M5
|
|
103
|
-
Max; smaller machines are not capacity-qualified.
|
|
104
|
-
- On Linux, a local Docker Engine; remote contexts, rootless Docker and Docker
|
|
105
|
-
Desktop are unsupported. The Mac adapter uses Docker inside its own Lima host.
|
|
106
|
-
- Loopback HTTP(S) app URLs on explicit ports above 1023. Each participant can
|
|
107
|
-
reach its selected app port, its assigned captured inbox when declared, and public destinations over ordinary TCP/UDP.
|
|
108
|
-
Other private host/LAN destinations and cloud metadata are blocked.
|
|
109
|
-
- Chromium at 960×720, 2 vCPUs and 2 GiB guest RAM per participant. Docker's
|
|
110
|
-
enclosing memory limit is 3 GiB. Start with a small concurrency for your host;
|
|
111
|
-
these allocations are not a promise of measured peak memory or capacity.
|
|
112
|
-
- Browser-only by default. [Optional camera and spoken conversation](participant-media.md)
|
|
113
|
-
use a separate media image and the same study loop.
|
|
114
|
-
- [Captured inboxes](comms-inbox.md#local-browser-studies) use an operator-run mail catch.
|
|
115
|
-
Real email receiving remains unsupported on the local route.
|
|
116
|
-
- A 20-minute default and maximum participant session budget, within the runtime
|
|
117
|
-
image's 30-minute process lifetime. A shorter `execution.timeoutMs` is supported.
|
|
118
|
-
- Codex participants currently use `gpt-6-astra` at low effort. Hosted templates,
|
|
119
|
-
device presets and hosted sandbox timeouts do not apply.
|
|
120
|
-
|
|
121
|
-
Normal close and cooperative startup cancellation remove the owned container
|
|
122
|
-
and its private state volume. After a desktop connects, controller death
|
|
123
|
-
disconnects the guest, which reboots; Firecracker exits and Docker removes both.
|
|
124
|
-
A small host socket directory can remain after abrupt death.
|
|
125
|
-
Run evidence remains in `.humanish/` under the normal local capture and sharing
|
|
126
|
-
rules. An unconfirmed release is reported as such.
|
|
127
|
-
|
|
128
|
-
## Runtime maintenance
|
|
129
|
-
|
|
130
|
-
The npm build pins a release URL, byte count, SHA-256 and immutable Docker image
|
|
131
|
-
ID in `src/substrates/local/runtime-release.ts`. It has no moving `latest` image dependency.
|
|
132
|
-
Runtime releases include source archives and notices separately; study users do
|
|
133
|
-
not download those archives. Updating a runtime requires a reviewed catalog
|
|
134
|
-
change and a new CLI release.
|
|
135
|
-
|
|
136
|
-
Source builders can use the
|
|
137
|
-
[maintained recipes](https://github.com/danielgwilson/humanish/blob/main/runtime/local-firecracker/README.md) and set
|
|
138
|
-
`HUMANISH_LOCAL_RUNTIME_IMAGE` to an already-built compatible local image. An
|
|
139
|
-
invalid override fails; it does not cause an implicit registry pull.
|
|
140
|
-
|
|
141
|
-
## Apple Silicon Macs
|
|
142
|
-
|
|
143
|
-
The Mac adapter uses a dedicated `humanish-runtime` Lima/VZ host on M3 or
|
|
144
|
-
newer Macs, with Lima 2.2+ and macOS supporting nested virtualization. Docker
|
|
145
|
-
runs inside that host; Docker Desktop is unnecessary. Setup creates the host
|
|
146
|
-
with 6 CPUs, 8 GiB RAM and an 80 GiB growable disk. It mounts no Mac directories.
|
|
147
|
-
Start with two participants; larger concurrency has not been qualified by this
|
|
148
|
-
integration. Use Lima's normal resource configuration for subsequent capacity
|
|
149
|
-
experiments, without changing study concurrency behind the user's back.
|
|
150
|
-
|
|
151
|
-
The scheduler and study loop remain shared. Standard OpenSSH forwards the
|
|
152
|
-
browser-control Unix socket to the Mac, and the selected app port back into the
|
|
153
|
-
Linux host. It preserves HTTP(S)/WebSocket bytes without parsing them. Codex
|
|
154
|
-
runs on the Mac and retains the same separate participant/analyst profiles and
|
|
155
|
-
file-backed login requirement. Keychain-only authentication is not supported.
|
|
156
|
-
|
|
157
|
-
The installed CLI passed first-attempt public image setup and two-participant
|
|
158
|
-
studies on an M5 Max: distinct app-side saves, overlapping participants,
|
|
159
|
-
verified recordings and automatic account analysis. A fresh Lima instance used
|
|
160
|
-
the public ARM64 catalog without a development image override. The separately
|
|
161
|
-
available source archives match that native build. The manually dispatched ARM64
|
|
162
|
-
job in `browser-appliance-proof.yml` builds images and sources; compilation alone
|
|
163
|
-
does not establish Mac execution.
|
|
164
|
-
|
|
165
|
-
Status and doctor do not create or start Lima. Explicit setup/first live use
|
|
166
|
-
starts the owned host; closing a study removes its participant containers and
|
|
167
|
-
volumes, but keeps the reusable Lima host running. Stop it with
|
|
168
|
-
`limactl stop humanish-runtime` when no studies are running. An interrupted
|
|
169
|
-
first provision remains inspectable through Lima and can be retried. humanish
|
|
170
|
-
does not replace a conflicting instance or stop unrelated instances.
|
|
171
|
-
|
|
172
|
-
Normal close, cancellation and controller death were exercised on established
|
|
173
|
-
Mac desktops. Shared startup cancellation and interrupted create-reply recovery
|
|
174
|
-
were exercised against real Linux Docker/Firecracker, with a separate regression
|
|
175
|
-
check for Lima cleanup. Forced controller death during startup, full-study
|
|
176
|
-
cancellation, host sleep/wake and higher concurrency remain unqualified. A forced
|
|
177
|
-
kill before a desktop connects can leave resources requiring inspection; this
|
|
178
|
-
adapter adds no suspend detector that unconditionally destroys a study.
|
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
# Watching and reviewing evidence
|
|
2
|
-
|
|
3
|
-
Observer shows a study's participants, their recorded screens, and the events
|
|
4
|
-
that explain those screens. The grid, player and exported HTML use the same
|
|
5
|
-
current renderer. Screens fit their actual aspect ratio; a portrait capture is
|
|
6
|
-
never cropped to fill a wide tile.
|
|
7
|
-
|
|
8
|
-
## Choose the right entry point
|
|
9
|
-
|
|
10
|
-
`humanish watch <lab>` starts a study and keeps its viewer attached. The process
|
|
11
|
-
that owns a hosted desktop can offer its live stream while it runs. `--no-open`
|
|
12
|
-
keeps that attachment without launching a browser. `--json` is the machine-result
|
|
13
|
-
path and does not keep an interactive stream server attached.
|
|
14
|
-
|
|
15
|
-
`humanish observe --run <id>` opens an existing study without starting another. The
|
|
16
|
-
TUI's **Open in Observer** action does the same through its session-owned loopback
|
|
17
|
-
library. These entry points follow saved captures; they cannot recover live desktop
|
|
18
|
-
credentials owned by another process. Keep the owning CLI or TUI open while using its
|
|
19
|
-
viewer. Exported HTML is an independent offline recording.
|
|
20
|
-
|
|
21
|
-
## Read status without guessing
|
|
22
|
-
|
|
23
|
-
The top band separates the run's current status from evidence freshness. A
|
|
24
|
-
finished study never uses its execution mode (`live`, as opposed to `dry-run`)
|
|
25
|
-
as a claim that it is still running. When updates fail, the last usable evidence
|
|
26
|
-
stays visible, the band reports the failure, and **Retry** requests another
|
|
27
|
-
snapshot. A stale process heartbeat does not prove that the process died.
|
|
28
|
-
|
|
29
|
-
A player's **Live desktop** label identifies what it displays. An iframe loading
|
|
30
|
-
is not a connection-health signal: the provider owns that connection. **Reload
|
|
31
|
-
stream** reloads the desktop viewer without restarting a participant. **Latest capture**
|
|
32
|
-
follows the latest saved screenshot without a desktop stream. **Replay** means
|
|
33
|
-
the researcher has chosen a recorded moment. Offline exports say so explicitly.
|
|
34
|
-
|
|
35
|
-
Freshness uses recorded activity and capture timestamps, not the time the server
|
|
36
|
-
reserialized the same data. Browser tabs poll less frequently while hidden and
|
|
37
|
-
refresh when visible again. Requests are serialized, bounded by a timeout and
|
|
38
|
-
cancelled when the viewer closes.
|
|
39
|
-
|
|
40
|
-
## Work through a study
|
|
41
|
-
|
|
42
|
-
Previews share a height and wrap into rows; desktop cards are wider and portrait
|
|
43
|
-
cards narrower. Complete screens remain contained when the available width is
|
|
44
|
-
smaller than a preview. Sparse rows keep their chosen size. Open **View and filter
|
|
45
|
-
participants** in the top right to search, change **Preview size**, or enter
|
|
46
|
-
**Monitor** for a larger evidence area. **Exit monitor** stays beside the run status.
|
|
47
|
-
Open a card's **Participant details** to **Pin** it at the beginning. Ordering changes only
|
|
48
|
-
when the researcher changes it. Large studies have reachable participant pages.
|
|
49
|
-
At most four desktop previews attach in the grid; allocation prioritizes screens
|
|
50
|
-
that are actually visible, with the hovered or keyboard-focused participant taking
|
|
51
|
-
priority. Other cards show their latest saved capture.
|
|
52
|
-
|
|
53
|
-
Each card follows its screen's aspect ratio without a minimum width that adds
|
|
54
|
-
portrait gutters. Its 44px caption holds the participant name, a short preview
|
|
55
|
-
source (**Live**, **Capture**, or **Snapshot**) or finished outcome, and a stable
|
|
56
|
-
**Participant details** button. Labels and controls never cover captured pixels.
|
|
57
|
-
Details contains labeled **Pin** and **Compare** toggles, the full source and
|
|
58
|
-
freshness, final messages, recorded notices, duration and dimensions. Historical
|
|
59
|
-
notices do not turn the details control into a warning; exceptional outcomes
|
|
60
|
-
remain in the caption. Comparison permits three participants and explains the
|
|
61
|
-
limit while keeping selected participants removable.
|
|
62
|
-
|
|
63
|
-
Icon buttons use Lucide glyphs, accessible names, hover/focus hints and visible
|
|
64
|
-
keyboard focus. Touch targets expand to 44px. Popovers have explicit close buttons;
|
|
65
|
-
Escape dismisses a hint without moving the player. These conventions follow
|
|
66
|
-
[Carbon icon usage](https://carbondesignsystem.com/elements/icons/usage/),
|
|
67
|
-
[ARIA toggle-button semantics](https://www.w3.org/WAI/ARIA/apg/patterns/button/),
|
|
68
|
-
and [WCAG target sizing](https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html).
|
|
69
|
-
The bookmark icon in the top bar opens **Saved moments**; recalling an available
|
|
70
|
-
moment closes the popover, while an unavailable moment leaves the error visible.
|
|
71
|
-
|
|
72
|
-
Opening a participant provides elapsed-time seeking, the original frame number,
|
|
73
|
-
playback speed, **Fit**, **Actual size**, zoom/pan and fullscreen. The inspector can
|
|
74
|
-
be hidden or resized. Click markers use the recorded desktop coordinate system
|
|
75
|
-
and the image's rendered rectangle, including at zoomed sizes.
|
|
76
|
-
|
|
77
|
-
Arrow keys, mouse controls, same-participant links, browser navigation and reload
|
|
78
|
-
agree about the selected moment. Seeking leaves live mode. Pausing on the newest
|
|
79
|
-
frame stays paused when new evidence arrives; **Go live** explicitly resumes
|
|
80
|
-
following. A missing addressed moment is reported instead of silently replaced.
|
|
81
|
-
|
|
82
|
-
Screenshot playback is sparse evidence, not a video recording. Capture gaps stay
|
|
83
|
-
visible. **Skip waits** compresses intervals associated with recorded waits and
|
|
84
|
-
reports the skipped duration. **Next action**, **Next flagged frame**, activity
|
|
85
|
-
filters and grouped waits make long traces easier to inspect without deleting events.
|
|
86
|
-
Older unstamped recordings use labeled estimated pacing. Long feeds, filmstrips,
|
|
87
|
-
terminal output and event lists stay bounded while earlier/later content remains
|
|
88
|
-
reachable.
|
|
89
|
-
|
|
90
|
-
**Copy moment link** creates a frame address; denied clipboard access exposes a
|
|
91
|
-
selectable link. **Original frame** opens/downloads the captured raster. **Saved
|
|
92
|
-
moments** keeps bounded run/participant/frame identifiers in this browser. It does
|
|
93
|
-
not save credentials, publish annotations or change the evidence bundle. Storage
|
|
94
|
-
failure leaves the controls usable for the current visit.
|
|
95
|
-
|
|
96
|
-
## Compare recorded evidence
|
|
97
|
-
|
|
98
|
-
Select participants and open **Compare selected**. Capture-time alignment chooses
|
|
99
|
-
the latest frame at or before the cursor, never a future frame. Before/after
|
|
100
|
-
coverage and each frame's age are explicit. Clock differences between desktops
|
|
101
|
-
remain an uncertainty; matching timestamps alone do not establish causality.
|
|
102
|
-
|
|
103
|
-
Elapsed-time alignment starts each participant at its first capture and compares
|
|
104
|
-
progress rather than simultaneous events. Missing or descending timestamps cannot
|
|
105
|
-
be used as a shared clock. Another run can be loaded from the available library
|
|
106
|
-
as recorded evidence. The address retains the chosen runs, participants, clock
|
|
107
|
-
and cursor so reopening it restores the comparison.
|
|
108
|
-
|
|
109
|
-
## Boundaries and checks
|
|
110
|
-
|
|
111
|
-
Only the attached process can grant a desktop iframe its own origin for provider
|
|
112
|
-
module loading. Stored grants are removed, exports contain no runtime grants,
|
|
113
|
-
and every local viewer response refuses to be framed. Generic imported embeds
|
|
114
|
-
retain an opaque sandbox. Artifact and history links cannot introduce arbitrary
|
|
115
|
-
URL schemes or traverse outside their evidence roots.
|
|
116
|
-
|
|
117
|
-
`pnpm observer:browser:proof` exercises generated synthetic evidence in the
|
|
118
|
-
production artifact. `pnpm observer:iframe:proof`, after `pnpm build`, checks the
|
|
119
|
-
actual serving boundary against direct, redirected and scripted iframe attacks.
|
|
120
|
-
CI retains their screenshots and JSON receipts. These Chromium checks do not
|
|
121
|
-
claim physical-device or non-Chromium coverage. Actual provider checks and their
|
|
122
|
-
resource-cleanup receipts are separate acceptance evidence.
|
|
123
|
-
|
|
124
|
-
Interaction references rechecked September 8, 2026:
|
|
125
|
-
[Base UI popover](https://base-ui.com/react/components/popover),
|
|
126
|
-
[React state structure](https://react.dev/learn/choosing-the-state-structure),
|
|
127
|
-
[WAI-ARIA tabs](https://www.w3.org/WAI/ARIA/apg/patterns/tabs/),
|
|
128
|
-
[iframe sandboxing](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/iframe),
|
|
129
|
-
[Playwright Trace Viewer](https://playwright.dev/docs/trace-viewer), and
|
|
130
|
-
[PostHog recording controls](https://posthog.com/docs/session-replay/how-to-watch-recordings).
|
|
131
|
-
|
|
132
|
-
### Moving between review views
|
|
133
|
-
|
|
134
|
-
The library button opens a drawer while reviewing a participant or comparison,
|
|
135
|
-
including on desktop. Comparison panels use the same participant names as the
|
|
136
|
-
grid. **Open frame** opens the displayed capture in the player, where it can be
|
|
137
|
-
saved; **Back to comparison** restores that comparison's selection, alignment and
|
|
138
|
-
cursor. Browser Back also returns to the addressed comparison. Comparing another
|
|
139
|
-
run needs a free slot within the three-participant limit.
|
|
140
|
-
|
|
141
|
-
**Reported thinking** is an explicit filter; the Thinking checkbox controls only
|
|
142
|
-
All evidence. **Warnings & findings** includes a separate Run and setup notices
|
|
143
|
-
section. These recorded operational notices retain their source timestamps and
|
|
144
|
-
are not assigned invented screenshot positions or counted as participant findings.
|