humanish 0.107.0 → 0.108.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +22 -17
- package/CHANGELOG.md +14 -0
- package/CONTEXT.md +51 -44
- package/README.md +145 -172
- package/SECURITY.md +16 -26
- package/TELEMETRY.md +8 -6
- package/dist/actors/affordance.d.ts +4 -4
- package/dist/actors/affordance.js +12 -12
- package/dist/actors/agent-session.d.ts +2 -2
- package/dist/actors/agent-session.js +7 -7
- package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
- package/dist/actors/codex/app-server-actor-trace.js +1 -1
- package/dist/actors/codex/app-server-ui.js +1 -1
- package/dist/actors/codex/codex-admission.d.ts +91 -0
- package/dist/actors/codex/codex-admission.js +150 -0
- package/dist/actors/codex/restricted-executable.d.ts +4 -4
- package/dist/actors/codex/restricted-executable.js +8 -8
- package/dist/actors/codex/restricted-launch.d.ts +2 -1
- package/dist/actors/codex/restricted-launch.js +1 -1
- package/dist/actors/codex/restricted-participant.js +8 -6
- package/dist/actors/codex/restricted-policy.d.ts +2 -2
- package/dist/actors/codex/restricted-policy.js +2 -2
- package/dist/actors/codex/restricted-session.d.ts +2 -2
- package/dist/actors/codex/restricted-session.js +10 -5
- package/dist/actors/computer-use/actor.d.ts +16 -16
- package/dist/actors/computer-use/actor.js +2 -2
- package/dist/actors/computer-use/admission-limit.d.ts +1 -1
- package/dist/actors/computer-use/admission-limit.js +1 -1
- package/dist/actors/computer-use/loop/actions.d.ts +3 -3
- package/dist/actors/computer-use/loop/actions.js +10 -10
- package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
- package/dist/actors/computer-use/loop/backstop.js +14 -12
- package/dist/actors/computer-use/loop/ending.d.ts +5 -5
- package/dist/actors/computer-use/loop/ending.js +7 -7
- package/dist/actors/computer-use/loop/observation.d.ts +2 -2
- package/dist/actors/computer-use/loop/observation.js +9 -9
- package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
- package/dist/actors/computer-use/loop/provider-call.js +1 -1
- package/dist/actors/computer-use/loop/session.js +3 -3
- package/dist/actors/computer-use/loop/spend.d.ts +1 -1
- package/dist/actors/computer-use/loop/spend.js +1 -1
- package/dist/actors/computer-use/loop/trace.js +9 -8
- package/dist/actors/computer-use/loop/types.d.ts +25 -23
- package/dist/actors/computer-use/loop/usage.js +2 -2
- package/dist/actors/computer-use/openai-context.d.ts +37 -0
- package/dist/actors/computer-use/openai-context.js +214 -0
- package/dist/actors/computer-use/openai-provider.d.ts +11 -8
- package/dist/actors/computer-use/openai-provider.js +45 -34
- package/dist/actors/computer-use/openai-requests.d.ts +36 -10
- package/dist/actors/computer-use/openai-requests.js +82 -15
- package/dist/actors/computer-use/openai-wire.d.ts +19 -7
- package/dist/actors/computer-use/openai-wire.js +36 -34
- package/dist/actors/contract.d.ts +78 -43
- package/dist/actors/contract.js +29 -23
- package/dist/actors/local-agent/claude-session.d.ts +1 -1
- package/dist/actors/local-agent/claude-session.js +10 -9
- package/dist/actors/local-agent/cli.d.ts +8 -6
- package/dist/actors/local-agent/cli.js +24 -28
- package/dist/actors/local-agent/readiness.d.ts +2 -2
- package/dist/actors/local-agent/readiness.js +4 -4
- package/dist/actors/reasoning-effort.js +6 -6
- package/dist/actors/registry.d.ts +10 -10
- package/dist/actors/registry.js +18 -17
- package/dist/actors/scripted-browser/actor.d.ts +8 -8
- package/dist/actors/scripted-browser/actor.js +16 -16
- package/dist/actors/scripted-browser/browser-command.js +1 -1
- package/dist/actors/scripted-browser/steps.js +1 -1
- package/dist/actors/scripted-browser/types.d.ts +1 -1
- package/dist/actors/stop-conditions.d.ts +1 -1
- package/dist/analysis/codex-config.d.ts +6 -2
- package/dist/analysis/codex-config.js +22 -14
- package/dist/analysis/service.js +5 -5
- package/dist/cli/commands/analyze.js +19 -16
- package/dist/cli/commands/codex.js +9 -9
- package/dist/cli/commands/comms.js +54 -33
- package/dist/cli/commands/feedback.js +20 -21
- package/dist/cli/commands/lab-format.d.ts +5 -4
- package/dist/cli/commands/lab-format.js +35 -23
- package/dist/cli/commands/lab-route-computer-use.js +6 -7
- package/dist/cli/commands/lab-route-preview.js +4 -3
- package/dist/cli/commands/lab-route-shared-world.js +3 -3
- package/dist/cli/commands/lab-run.js +10 -11
- package/dist/cli/commands/lab-scorer.d.ts +2 -2
- package/dist/cli/commands/lab-scorer.js +1 -1
- package/dist/cli/commands/migrate.d.ts +4 -0
- package/dist/cli/commands/migrate.js +65 -0
- package/dist/cli/commands/observe.js +147 -108
- package/dist/cli/commands/run-command.d.ts +10 -0
- package/dist/cli/commands/run-command.js +85 -0
- package/dist/cli/commands/runs.js +137 -138
- package/dist/cli/commands/setup.d.ts +2 -2
- package/dist/cli/commands/setup.js +26 -21
- package/dist/cli/commands/study.d.ts +3 -0
- package/dist/cli/commands/study.js +182 -0
- package/dist/cli/commands/tui.d.ts +4 -4
- package/dist/cli/commands/tui.js +21 -21
- package/dist/cli/commands/watch.js +60 -75
- package/dist/cli/deprecations.d.ts +18 -0
- package/dist/cli/deprecations.js +48 -0
- package/dist/cli/doctor.d.ts +15 -5
- package/dist/cli/doctor.js +103 -48
- package/dist/cli/first-run-path.d.ts +12 -10
- package/dist/cli/first-run-path.js +30 -28
- package/dist/cli/io.d.ts +41 -6
- package/dist/cli/io.js +97 -22
- package/dist/cli/observer-follow.d.ts +2 -2
- package/dist/cli/observer-follow.js +5 -6
- package/dist/cli/orientation.d.ts +6 -3
- package/dist/cli/orientation.js +43 -39
- package/dist/cli/product-sentence.d.ts +6 -0
- package/dist/cli/product-sentence.js +6 -0
- package/dist/cli/program.d.ts +6 -1
- package/dist/cli/program.js +109 -40
- package/dist/cli/telemetry.d.ts +15 -15
- package/dist/cli/telemetry.js +48 -40
- package/dist/cli.js +1 -1
- package/dist/comms/capture-surface.d.ts +13 -12
- package/dist/comms/capture-surface.js +23 -22
- package/dist/comms/catch-host.d.ts +7 -7
- package/dist/comms/catch-host.js +14 -14
- package/dist/comms/email-catch.d.ts +3 -3
- package/dist/comms/email-catch.js +8 -8
- package/dist/comms/external-evidence.js +2 -2
- package/dist/comms/extract.js +2 -2
- package/dist/comms/fake-inbox.d.ts +2 -2
- package/dist/comms/fake-inbox.js +2 -2
- package/dist/comms/receiving-render.d.ts +1 -1
- package/dist/comms/receiving-render.js +2 -2
- package/dist/comms/sandbox-catch-script.d.ts +6 -6
- package/dist/comms/sandbox-catch-script.js +6 -6
- package/dist/comms/sandbox-catch.d.ts +36 -37
- package/dist/comms/sandbox-catch.js +34 -35
- package/dist/comms/setup.js +42 -8
- package/dist/comms/thread-evidence.d.ts +1 -1
- package/dist/comms/thread-evidence.js +6 -6
- package/dist/comms/types.d.ts +6 -6
- package/dist/comms/types.js +3 -3
- package/dist/evidence/frame-signature.d.ts +1 -1
- package/dist/evidence/frame-signature.js +4 -4
- package/dist/evidence/redaction.d.ts +3 -3
- package/dist/evidence/redaction.js +4 -4
- package/dist/feedback/draft.js +36 -78
- package/dist/feedback/export-bundle.js +1 -1
- package/dist/feedback/export.d.ts +5 -1
- package/dist/feedback/export.js +7 -8
- package/dist/feedback/feedback.d.ts +2 -2
- package/dist/feedback/feedback.js +21 -3
- package/dist/guest/chromium-text.js +2 -2
- package/dist/guest/desktop-native.d.ts +1 -1
- package/dist/guest/runtime.js +1 -1
- package/dist/index.d.ts +12 -10
- package/dist/index.js +8 -6
- package/dist/keys/key-resolution.d.ts +5 -5
- package/dist/keys/key-resolution.js +23 -23
- package/dist/lab/adapter-extension.d.ts +7 -7
- package/dist/lab/adapter-extension.js +13 -36
- package/dist/lab/adapter-scorer-loader.d.ts +7 -7
- package/dist/lab/adapter-scorer-loader.js +32 -32
- package/dist/lab/composition-rules.js +42 -42
- package/dist/lab/config.js +65 -25
- package/dist/lab/deprecated-fields.d.ts +10 -0
- package/dist/lab/deprecated-fields.js +24 -0
- package/dist/lab/device-presets.d.ts +8 -8
- package/dist/lab/device-presets.js +11 -11
- package/dist/lab/discover.d.ts +13 -9
- package/dist/lab/discover.js +117 -57
- package/dist/lab/doctor.d.ts +10 -3
- package/dist/lab/doctor.js +47 -9
- package/dist/lab/init-templates.js +147 -147
- package/dist/lab/init.d.ts +1 -1
- package/dist/lab/init.js +41 -9
- package/dist/lab/keys.d.ts +2 -0
- package/dist/lab/keys.js +42 -8
- package/dist/lab/lab-deps.d.ts +7 -12
- package/dist/lab/parse/actors.js +9 -9
- package/dist/lab/parse/comms.js +5 -5
- package/dist/lab/parse/execution.js +13 -13
- package/dist/lab/parse/study-v3.d.ts +23 -0
- package/dist/lab/parse/study-v3.js +259 -0
- package/dist/lab/parse/subject-state.d.ts +7 -7
- package/dist/lab/parse/subject-state.js +16 -16
- package/dist/lab/parse/subject.js +28 -28
- package/dist/lab/parse/values.d.ts +1 -1
- package/dist/lab/parse/values.js +3 -3
- package/dist/lab/persona-resolve.d.ts +4 -4
- package/dist/lab/persona-resolve.js +4 -4
- package/dist/lab/plan-participants.d.ts +2 -2
- package/dist/lab/plan-types.d.ts +4 -4
- package/dist/lab/plan.d.ts +1 -7
- package/dist/lab/plan.js +10 -41
- package/dist/lab/preflight-probes.js +11 -11
- package/dist/lab/preflight-result.d.ts +2 -1
- package/dist/lab/preflight-result.js +5 -4
- package/dist/lab/preflight.d.ts +7 -5
- package/dist/lab/preflight.js +5 -5
- package/dist/lab/routing.d.ts +31 -25
- package/dist/lab/routing.js +60 -29
- package/dist/lab/run-lab-events.d.ts +0 -3
- package/dist/lab/run-lab-events.js +0 -6
- package/dist/lab/run-lab-homes.d.ts +22 -10
- package/dist/lab/run-lab-homes.js +5 -1
- package/dist/lab/run-lab-options.d.ts +1 -1
- package/dist/lab/run-lab-options.js +16 -13
- package/dist/lab/summary.d.ts +7 -6
- package/dist/lab/summary.js +10 -10
- package/dist/lab/tasks.d.ts +15 -15
- package/dist/lab/tasks.js +14 -14
- package/dist/lab/types.d.ts +101 -95
- package/dist/lab/types.js +2 -0
- package/dist/lab/validation.d.ts +13 -13
- package/dist/lab/validation.js +44 -42
- package/dist/lab/warnings.d.ts +10 -0
- package/dist/lab/warnings.js +61 -33
- package/dist/library-aliases.d.ts +56 -0
- package/dist/library-aliases.js +22 -0
- package/dist/observer/artifact.d.ts +1 -1
- package/dist/observer/artifact.js +6 -6
- package/dist/observer/data.d.ts +6 -6
- package/dist/observer/data.js +5 -4
- package/dist/observer/exposure.d.ts +1 -1
- package/dist/observer/exposure.js +11 -11
- package/dist/observer/http.js +1 -1
- package/dist/observer/library.d.ts +1 -1
- package/dist/observer/library.js +4 -2
- package/dist/observer/listen.js +5 -4
- package/dist/observer/render.d.ts +1 -1
- package/dist/observer/render.js +10 -5
- package/dist/observer/run-routes.d.ts +3 -3
- package/dist/observer/run-routes.js +1 -1
- package/dist/observer/serve.js +7 -3
- package/dist/observer/tunnel.js +1 -1
- package/dist/observer-app.html +4 -4
- package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
- package/dist/routes/computer-use/bundle-parts.js +15 -15
- package/dist/routes/computer-use/bundle.js +3 -3
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/comms.js +14 -14
- package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +4 -3
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
- package/dist/routes/computer-use/e2b-desktop/prepare.js +7 -7
- package/dist/routes/computer-use/e2b-desktop/start.js +9 -8
- package/dist/routes/computer-use/e2b-desktop/teardown.js +5 -4
- package/dist/routes/computer-use/external-comms.d.ts +1 -1
- package/dist/routes/computer-use/external-comms.js +1 -1
- package/dist/routes/computer-use/fanout-bundle.js +18 -18
- package/dist/routes/computer-use/fanout-records.js +10 -11
- package/dist/routes/computer-use/live-flush.d.ts +1 -1
- package/dist/routes/computer-use/live-flush.js +6 -6
- package/dist/routes/computer-use/live-phase.d.ts +4 -2
- package/dist/routes/computer-use/live-phase.js +6 -6
- package/dist/routes/computer-use/local-vm.js +1 -1
- package/dist/routes/computer-use/participant-desktop.d.ts +4 -4
- package/dist/routes/computer-use/participant-desktop.js +4 -4
- package/dist/routes/computer-use/participant-execution.d.ts +4 -4
- package/dist/routes/computer-use/participant-execution.js +9 -9
- package/dist/routes/computer-use/participant-model.d.ts +6 -0
- package/dist/routes/computer-use/participant-model.js +31 -13
- package/dist/routes/computer-use/participant-prompt.d.ts +11 -11
- package/dist/routes/computer-use/participant-prompt.js +6 -6
- package/dist/routes/computer-use/participant-runs.d.ts +7 -7
- package/dist/routes/computer-use/participant-runs.js +13 -13
- package/dist/routes/computer-use/plan.js +22 -22
- package/dist/routes/computer-use/preflight.js +21 -21
- package/dist/routes/computer-use/rerun-selection.js +1 -1
- package/dist/routes/computer-use/result.js +11 -11
- package/dist/routes/computer-use/route.d.ts +2 -1
- package/dist/routes/computer-use/route.js +15 -14
- package/dist/routes/computer-use/self-report.d.ts +7 -7
- package/dist/routes/computer-use/self-report.js +31 -31
- package/dist/routes/computer-use/setup.d.ts +1 -1
- package/dist/routes/computer-use/setup.js +17 -18
- package/dist/routes/computer-use/single-bundle.d.ts +7 -7
- package/dist/routes/computer-use/single-bundle.js +28 -30
- package/dist/routes/computer-use/subject-projection.d.ts +1 -1
- package/dist/routes/computer-use/subject-projection.js +6 -6
- package/dist/routes/computer-use/types.d.ts +40 -42
- package/dist/routes/computer-use/types.js +10 -10
- package/dist/routes/preview.d.ts +8 -2
- package/dist/routes/preview.js +8 -4
- package/dist/routes/scripted/bundle.d.ts +2 -2
- package/dist/routes/scripted/bundle.js +13 -12
- package/dist/routes/scripted/plan.d.ts +1 -1
- package/dist/routes/scripted/plan.js +9 -9
- package/dist/routes/scripted/result.js +5 -5
- package/dist/routes/scripted/route.js +5 -6
- package/dist/routes/scripted/scenario.js +2 -2
- package/dist/routes/scripted/setup.js +7 -7
- package/dist/routes/scripted/subject.js +1 -1
- package/dist/routes/scripted/surface-records.js +3 -3
- package/dist/routes/scripted/types.d.ts +3 -5
- package/dist/routes/scripted/types.js +1 -1
- package/dist/routes/shared-world/bundle-records.js +9 -8
- package/dist/routes/shared-world/bundle.d.ts +5 -5
- package/dist/routes/shared-world/bundle.js +40 -38
- package/dist/routes/shared-world/checkpoints.d.ts +1 -1
- package/dist/routes/shared-world/checkpoints.js +1 -1
- package/dist/routes/shared-world/comms.d.ts +5 -5
- package/dist/routes/shared-world/comms.js +14 -14
- package/dist/routes/shared-world/external-public.d.ts +4 -3
- package/dist/routes/shared-world/external-public.js +16 -12
- package/dist/routes/shared-world/handoff.d.ts +7 -6
- package/dist/routes/shared-world/handoff.js +65 -57
- package/dist/routes/shared-world/lobby-code.d.ts +2 -2
- package/dist/routes/shared-world/lobby-code.js +9 -9
- package/dist/routes/shared-world/participant-specs.d.ts +7 -6
- package/dist/routes/shared-world/participant-specs.js +31 -24
- package/dist/routes/shared-world/plan.js +7 -7
- package/dist/routes/shared-world/provenance.d.ts +2 -2
- package/dist/routes/shared-world/provenance.js +2 -2
- package/dist/routes/shared-world/provisioned.js +14 -13
- package/dist/routes/shared-world/result.js +20 -21
- package/dist/routes/shared-world/route.js +23 -22
- package/dist/routes/shared-world/setup.d.ts +3 -3
- package/dist/routes/shared-world/setup.js +4 -4
- package/dist/routes/shared-world/types.d.ts +30 -28
- package/dist/routes/shared-world/types.js +4 -4
- package/dist/routes/terminal/adapter.d.ts +3 -3
- package/dist/routes/terminal/adapter.js +5 -5
- package/dist/routes/terminal/bundle.d.ts +3 -3
- package/dist/routes/terminal/bundle.js +22 -21
- package/dist/routes/terminal/credentials.d.ts +4 -4
- package/dist/routes/terminal/credentials.js +7 -7
- package/dist/routes/terminal/dry-run.js +4 -4
- package/dist/routes/terminal/encoding.js +2 -2
- package/dist/routes/terminal/ledger.d.ts +3 -3
- package/dist/routes/terminal/ledger.js +14 -14
- package/dist/routes/terminal/live-finish.js +3 -3
- package/dist/routes/terminal/live-sandbox.js +12 -13
- package/dist/routes/terminal/persona.js +1 -1
- package/dist/routes/terminal/plan.js +11 -11
- package/dist/routes/terminal/recorder.js +2 -2
- package/dist/routes/terminal/result.js +8 -8
- package/dist/routes/terminal/route.js +6 -7
- package/dist/routes/terminal/sandbox.d.ts +1 -1
- package/dist/routes/terminal/sandbox.js +1 -1
- package/dist/routes/terminal/session.js +8 -7
- package/dist/routes/terminal/token-usage.d.ts +1 -1
- package/dist/routes/terminal/token-usage.js +7 -8
- package/dist/routes/terminal/trace.d.ts +2 -2
- package/dist/routes/terminal/trace.js +2 -2
- package/dist/routes/terminal/types.d.ts +26 -28
- package/dist/routes/terminal/types.js +3 -3
- package/dist/run/bundle-shape.js +3 -3
- package/dist/run/bundle.d.ts +46 -46
- package/dist/run/bundle.js +2 -1
- package/dist/run/cost-summary.js +3 -3
- package/dist/run/costs.js +7 -1
- package/dist/run/detail.d.ts +6 -6
- package/dist/run/detail.js +4 -4
- package/dist/run/dry-run-inputs.js +1 -1
- package/dist/run/dry-run.js +18 -18
- package/dist/run/judge.d.ts +19 -13
- package/dist/run/judge.js +18 -8
- package/dist/run/paths.d.ts +1 -1
- package/dist/run/paths.js +1 -1
- package/dist/run/pricing.d.ts +11 -6
- package/dist/run/pricing.js +20 -13
- package/dist/run/projection.d.ts +14 -14
- package/dist/run/projection.js +15 -15
- package/dist/run/reclaim.js +2 -2
- package/dist/run/results.d.ts +5 -5
- package/dist/run/run-index.d.ts +8 -6
- package/dist/run/run-index.js +15 -16
- package/dist/run/run-not-found.d.ts +5 -0
- package/dist/run/run-not-found.js +15 -0
- package/dist/run/run.d.ts +5 -4
- package/dist/run/run.js +1 -1
- package/dist/run/sandbox-receipts.d.ts +2 -2
- package/dist/run/sandbox-receipts.js +3 -3
- package/dist/run/shared-world-evidence.d.ts +36 -35
- package/dist/run/shared-world-evidence.js +4 -4
- package/dist/run/shared-world-shape.d.ts +1 -1
- package/dist/run/shared-world-shape.js +6 -6
- package/dist/run/stats.d.ts +12 -6
- package/dist/run/stats.js +116 -58
- package/dist/run/status.d.ts +8 -29
- package/dist/run/status.js +5 -27
- package/dist/run/stored-runs.js +2 -1
- package/dist/run/stream-shape.js +1 -1
- package/dist/run/streams.d.ts +6 -6
- package/dist/run/study-provenance.d.ts +47 -0
- package/dist/run/study-provenance.js +63 -0
- package/dist/run/study-result.d.ts +16 -0
- package/dist/run/study-result.js +9 -0
- package/dist/run/text.d.ts +2 -0
- package/dist/run/text.js +4 -0
- package/dist/run-lab.d.ts +7 -7
- package/dist/run-lab.js +1 -3
- package/dist/study/convert.d.ts +33 -0
- package/dist/study/convert.js +432 -0
- package/dist/study/field-paths.d.ts +12 -0
- package/dist/study/field-paths.js +126 -0
- package/dist/study/files.d.ts +26 -0
- package/dist/study/files.js +43 -0
- package/dist/study/migrate.d.ts +48 -0
- package/dist/study/migrate.js +408 -0
- package/dist/study/owned-files.d.ts +38 -0
- package/dist/study/owned-files.js +182 -0
- package/dist/subject/clone.d.ts +1 -1
- package/dist/subject/desktop-cli.d.ts +1 -1
- package/dist/subject/desktop-cli.js +2 -2
- package/dist/subject/local-tree-archive.js +1 -1
- package/dist/subject/local-tree.d.ts +1 -1
- package/dist/subject/node-bootstrap.js +1 -1
- package/dist/subject/runtime.js +8 -9
- package/dist/subject/serve.d.ts +1 -1
- package/dist/subject/serve.js +3 -3
- package/dist/subject/state.d.ts +1 -1
- package/dist/subject/steps.d.ts +5 -5
- package/dist/subject/steps.js +4 -4
- package/dist/substrates/command-failure.d.ts +3 -3
- package/dist/substrates/command-failure.js +3 -3
- package/dist/substrates/detached.d.ts +6 -6
- package/dist/substrates/detached.js +7 -7
- package/dist/substrates/e2b/cdp-probe.d.ts +9 -9
- package/dist/substrates/e2b/cdp-probe.js +14 -17
- package/dist/substrates/e2b/desktop-browser.d.ts +2 -2
- package/dist/substrates/e2b/desktop-browser.js +8 -8
- package/dist/substrates/e2b/desktop-cdp.d.ts +9 -9
- package/dist/substrates/e2b/desktop-cdp.js +8 -8
- package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
- package/dist/substrates/e2b/desktop-executor.js +1 -1
- package/dist/substrates/e2b/desktop-geometry.d.ts +3 -3
- package/dist/substrates/e2b/desktop-geometry.js +7 -7
- package/dist/substrates/e2b/desktop-media.d.ts +1 -1
- package/dist/substrates/e2b/desktop-media.js +1 -1
- package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
- package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
- package/dist/substrates/e2b/sandbox.d.ts +1 -1
- package/dist/substrates/e2b/sandbox.js +1 -1
- package/dist/substrates/e2b/sdk.d.ts +11 -11
- package/dist/substrates/e2b/sdk.js +6 -6
- package/dist/tui/actions.d.ts +1 -1
- package/dist/tui/actions.js +13 -13
- package/dist/tui/contract.d.ts +16 -16
- package/dist/tui/contract.js +10 -10
- package/dist/tui/launch.d.ts +4 -4
- package/dist/tui/launch.js +18 -19
- package/dist/tui/project.js +5 -5
- package/dist/tui-app.js +82 -82
- package/dist/verify/actor.d.ts +8 -8
- package/dist/verify/actor.js +36 -36
- package/dist/verify/artifacts.d.ts +2 -2
- package/dist/verify/artifacts.js +3 -3
- package/dist/verify/context-growth.d.ts +9 -0
- package/dist/verify/context-growth.js +62 -0
- package/dist/verify/costs.d.ts +6 -6
- package/dist/verify/costs.js +8 -8
- package/dist/verify/shared-world-concurrent.d.ts +2 -2
- package/dist/verify/shared-world-concurrent.js +79 -76
- package/dist/verify/shared-world.d.ts +2 -2
- package/dist/verify/shared-world.js +16 -16
- package/dist/verify/subject.d.ts +4 -4
- package/dist/verify/subject.js +18 -18
- package/dist/verify/verify.js +92 -43
- package/docs/README.md +25 -32
- package/docs/architecture/actor-contract.md +56 -87
- package/docs/architecture/desktop-sessions.md +7 -7
- package/docs/architecture/external-public-shared-world.md +61 -59
- package/docs/architecture/github-feedback-loop.md +1 -4
- package/docs/architecture/guest-desktop.md +2 -2
- package/docs/architecture/observer.md +34 -34
- package/docs/architecture/restricted-codex-analysis.md +34 -28
- package/docs/architecture/serve.md +34 -37
- package/docs/architecture/state-driven-executor.md +55 -58
- package/docs/architecture/task-protocol-support.md +5 -5
- package/docs/architecture/terminal-product-route.md +67 -107
- package/docs/contracts/README.md +24 -0
- package/docs/contracts/adapter-admission.md +3 -3
- package/docs/contracts/adapter-fixtures.md +2 -5
- package/docs/contracts/core.md +1 -3
- package/docs/contracts/errors.md +62 -0
- package/docs/contracts/feedback.md +8 -9
- package/docs/contracts/policy.md +7 -12
- package/docs/contracts/run-bundle.md +45 -44
- package/docs/contracts/schemas.md +421 -362
- package/docs/contracts/study-analysis.md +3 -3
- package/docs/contracts/study-costs.md +11 -7
- package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
- package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
- package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
- package/docs/principles/actor-fidelity.md +4 -4
- package/docs/principles/engineering.md +3 -3
- package/docs/principles/invariants-and-defaults.md +38 -38
- package/docs/principles/self-driving-harness.md +1 -5
- package/docs/principles/three-roles.md +1 -1
- package/docs/product/automatic-analysis.md +7 -7
- package/examples/participant/README.md +5 -5
- package/examples/participant/run.mjs +11 -10
- package/examples/scorer/README.md +3 -3
- package/examples/scorer/run.mjs +11 -12
- package/package.json +16 -17
- package/skills/humanish/SKILL.md +60 -58
- package/skills/humanish/agents/openai.yaml +1 -1
- package/AGENTS.md +0 -99
- package/CONTRIBUTING.md +0 -148
- package/dist/actors/codex/qualified-versions.d.ts +0 -72
- package/dist/actors/codex/qualified-versions.js +0 -132
- package/dist/cli/commands/lab.d.ts +0 -3
- package/dist/cli/commands/lab.js +0 -199
- package/dist/cli/renamed-options.d.ts +0 -11
- package/dist/cli/renamed-options.js +0 -18
- package/dist/observer/static.d.ts +0 -39
- package/dist/observer/static.js +0 -369
- package/docs/architecture/comms-inbox.md +0 -122
- package/docs/architecture/desktop-recording.md +0 -80
- package/docs/architecture/local-browser-runtime.md +0 -178
- package/docs/architecture/observer-review.md +0 -144
- package/docs/architecture/participant-media.md +0 -90
- package/docs/architecture/project-layout.md +0 -62
- package/docs/architecture/real-email-receiving.md +0 -136
- package/docs/assets/humanish-drawdb-hero.png +0 -0
- package/docs/assets/humanish-observer-hero.png +0 -0
- package/docs/goals/current.md +0 -207
- package/docs/product/lobby-trivia-3player-external-public.md +0 -77
- package/docs/product/open-source-install-experience.md +0 -240
- package/docs/ramp/README.md +0 -295
- package/docs/release/open-source-readiness.md +0 -222
- package/docs/release/public-readiness-standard.md +0 -210
- package/docs/roadmap/world-class-open-source-v0.md +0 -311
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { selfReportedBlocker } from "../../run/judge.js";
|
|
2
|
-
// "can't" followed by a
|
|
2
|
+
// "can't" followed by a perception verb describes what the screen showed, not an inability to
|
|
3
3
|
// proceed: "the canvas truncates it so you can't even read the whole thing", "I can't tell from
|
|
4
4
|
// the screen whether the rename is persisted", "so I could not read its full description". Five
|
|
5
5
|
// of five completed live runs on 2026-09-01 (two on drawDB, three on the planted benchmark app)
|
|
6
6
|
// were refused as "not a credible pass" on exactly these sentences, every one a defect report
|
|
7
|
-
// written
|
|
8
|
-
// display defect, the more likely the scan was to refuse the run
|
|
9
|
-
//
|
|
7
|
+
// written after the participant reached the goal. The more precisely a participant describes a
|
|
8
|
+
// display defect, the more likely the scan was to refuse the run: the incentive inversion the
|
|
9
|
+
// resolved-arc rule fixed, back in a new shape. "could not complete", "could not connect",
|
|
10
10
|
// "unable to get focus" still count: those name an inability to act.
|
|
11
11
|
const PERCEPTION_AFTER_MODAL = /\b(can'?t|cannot|could ?not|couldn'?t|unable to|wasn'?t able to)\s+(even\s+|quite\s+|really\s+|fully\s+)?(read|see|tell|view|make out|verify|confirm|be sure|be certain|judge|know)\b/g;
|
|
12
12
|
function hasBlockerLanguage(text) {
|
|
@@ -15,17 +15,17 @@ function hasBlockerLanguage(text) {
|
|
|
15
15
|
/\berror[:.]/.test(text) ||
|
|
16
16
|
/what would you like me to do|please tell me|need (the )?(task|credentials|instructions)/.test(text));
|
|
17
17
|
}
|
|
18
|
-
/** The friction scan (inclusive): does the narrative report
|
|
18
|
+
/** The friction scan (inclusive): does the narrative report any blocker-shaped language,
|
|
19
19
|
* resolved or not? Feeds the participants `reportedFriction` tally and feedback candidates. */
|
|
20
|
-
// Report-shaped language: what a participant writes when it finished
|
|
20
|
+
// Report-shaped language: what a participant writes when it finished and has something to say.
|
|
21
21
|
// Every one of the day's eleven drawDB reports (2026-09-01) opened a section "What confused me"
|
|
22
22
|
// or "Accessibility defects:"; none contained a blocker word, so none became a feedback candidate
|
|
23
23
|
// and a participant that had just replicated a keyboard-accessibility defect three times drafted "Live
|
|
24
|
-
// study completed without a participant-reported finding". Friction is the
|
|
24
|
+
// study completed without a participant-reported finding". Friction is the inclusive scan; a
|
|
25
25
|
// false positive here adds a candidate a person then reads, which is the cheap direction.
|
|
26
26
|
const REPORTED_DEFECT_LANGUAGE = /\b(defects?|bugs?|accessibilit(y|ies)|inaccessible|not (keyboard|screen.?reader)[- ]?accessible|confus(ed|ing)|hesitat(ed|ion)|unexpected(ly)?|unclear|hard to (find|tell|see|read|reach)|no (visible )?focus|overlap(ped|ping|s)?|truncat(ed|es|ion)|cut off|did nothing|nothing happened|no effect)\b/;
|
|
27
|
-
// The friction scan's own negations
|
|
28
|
-
// are what a participant writes when it has
|
|
27
|
+
// The friction scan's own negations. "Nothing was confusing", "no defects", "not unclear"
|
|
28
|
+
// are what a participant writes when it has nothing to report, and until 2026-09-03 each of them
|
|
29
29
|
// counted as reported friction and became a feedback candidate whose "actual" was a sentence
|
|
30
30
|
// reporting no problem. Only the report-shaped adjectives are negatable here: "no visible focus",
|
|
31
31
|
// "not keyboard-accessible" and "did nothing" are defects and stay.
|
|
@@ -80,25 +80,25 @@ function interimMessageReportsFriction(message) {
|
|
|
80
80
|
});
|
|
81
81
|
}
|
|
82
82
|
/** The verdict scan (strict): like the friction scan, but resolved-arc segments are stripped
|
|
83
|
-
* first
|
|
84
|
-
*
|
|
83
|
+
* first: failure narration the participant itself reports as overcome counts as friction and
|
|
84
|
+
* never as a blocker. */
|
|
85
85
|
function completionReasonBlocksVerdict(reason) {
|
|
86
|
-
// Perception phrases are stripped for the
|
|
86
|
+
// Perception phrases are stripped for the verdict only: "I could not read the full description"
|
|
87
87
|
// is friction worth a tally count and a feedback candidate (the friction scan above keeps it),
|
|
88
88
|
// and it is not a reason to refuse the pass.
|
|
89
89
|
return hasBlockerLanguage(stripResolvedArcSegments(stripQuotedSpans(stripNegatedNonBlockerPhrases(reason.toLowerCase()))).replace(PERCEPTION_AFTER_MODAL, ""));
|
|
90
90
|
}
|
|
91
91
|
// A failure segment counts as a resolved arc when the recovery is self-reported either in the
|
|
92
|
-
//
|
|
93
|
-
// immediately
|
|
92
|
+
// same segment ("the import failed but then went through") or, in the common report shape, in the
|
|
93
|
+
// immediately following segment as a retry/alternative that succeeded ("my first import failed
|
|
94
94
|
// with a parser error. A simpler SQL import succeeded."). The lookahead demands the retry flavor
|
|
95
95
|
// on purpose: unrelated praise ("Separately, the search box worked") must never launder an
|
|
96
96
|
// unresolved failure. "Login failed so I gave up" has no recovery anywhere and stays a blocker.
|
|
97
|
-
// (
|
|
97
|
+
// (Without this, a defect report after demonstrated success failed the participant:
|
|
98
98
|
// an incentive inversion against exactly the participant behavior a study wants most.)
|
|
99
99
|
const RESOLUTION_TERMS = /\b(succeed(?:ed|s)?|success(?:ful|fully)?|worked|works around|then worked|now works?|resolved|fixed|recovered|got it working|went through)\b/;
|
|
100
100
|
const RETRY_RESOLUTION = /\b(simpler|simplified|retry(?:ing)?|retried|second (?:attempt|try)|another (?:attempt|try|approach)|different (?:approach|way|route)|instead|then|eventually|after that)\b[^.!?\n]{0,80}\b(succeed(?:ed|s)?|success(?:ful|fully)?|worked|went through|completed|passed)\b/;
|
|
101
|
-
/** Drop sentence/bullet segments whose failure language is part of a self-reported
|
|
101
|
+
/** Drop sentence/bullet segments whose failure language is part of a self-reported resolved arc. */
|
|
102
102
|
function stripResolvedArcSegments(text) {
|
|
103
103
|
const segments = text.split(/(?<=[.!?])\s+|\n+/);
|
|
104
104
|
return segments
|
|
@@ -112,15 +112,15 @@ function stripResolvedArcSegments(text) {
|
|
|
112
112
|
})
|
|
113
113
|
.join(" ");
|
|
114
114
|
}
|
|
115
|
-
// Negations that
|
|
115
|
+
// Negations that describe a defect rather than deny one. Kept out of every clause drop below.
|
|
116
116
|
const DEFECT_SHAPED_NEGATION = /\bno\s+(?:visible\s+)?focus\b|\bno\s+(?:keyboard|screen.?reader)[- ]?(?:access|path|route|way|alternative|equivalent)|\bnot\s+(?:keyboard|screen.?reader)[- ]?accessible\b|\bno\s+(?:effect|feedback|response)\b|\b(?:did|does)\s+nothing\b|\bnothing\s+happened\b/;
|
|
117
117
|
function stripNegatedNonBlockerPhrases(text) {
|
|
118
118
|
return (text
|
|
119
|
-
//
|
|
119
|
+
// First, before the narrower rules eat the "no blockers" and leave "encountered ... error"
|
|
120
120
|
// behind: "I encountered no blockers or unclear error output." refused a clean passing run on
|
|
121
121
|
// 2026-09-01. A verb of encounter followed by "no" negates the whole clause, so drop the clause.
|
|
122
|
-
// ... unless the clause names a
|
|
123
|
-
// finding, and the verb it happens to use must not decide whether it counts
|
|
122
|
+
// ... unless the clause names a defect: "the delete control had no visible focus" is a
|
|
123
|
+
// finding, and the verb it happens to use must not decide whether it counts.
|
|
124
124
|
.replace(/\b(?:encountered|hit|saw|found|met|had|got|ran into)\s+no\s+[^.!?\n]*/g, (clause) => (DEFECT_SHAPED_NEGATION.test(clause) ? clause : " "))
|
|
125
125
|
.replace(/\bno\s+(?:real\s+|remaining\s+|actual\s+)?(?:blocker|blockers|blocking issue|blocking issues|error|errors|failure|failures)\s+(?:was\s+|were\s+)?(?:encountered|observed|found|hit|seen|reported|detected)\b/g, "")
|
|
126
126
|
.replace(/\bwithout\s+(?:a\s+|any\s+)?(?:real\s+|remaining\s+|actual\s+)?(?:blocker|blockers|blocking issue|blocking issues|error|errors|failure|failures)\b/g, "")
|
|
@@ -134,9 +134,9 @@ function stripNegatedNonBlockerPhrases(text) {
|
|
|
134
134
|
}
|
|
135
135
|
/**
|
|
136
136
|
* Remove double-quoted spans and markdown blockquote lines before the blocker scan, so a persona
|
|
137
|
-
* that faithfully
|
|
138
|
-
* not misread as the actor reporting its
|
|
139
|
-
* `>` blockquotes are stripped
|
|
137
|
+
* that faithfully quotes the subject app's own copy (e.g. a banner reading "cannot be undone") is
|
|
138
|
+
* not misread as the actor reporting its own blocker. Only double quotes (straight and smart) and
|
|
139
|
+
* `>` blockquotes are stripped, never single quotes, which would mangle contractions like `can't`.
|
|
140
140
|
*/
|
|
141
141
|
function stripQuotedSpans(text) {
|
|
142
142
|
return text
|
|
@@ -148,15 +148,15 @@ function traceHasStopWhenMatch(session) {
|
|
|
148
148
|
return session.trace.items.some((item) => item.kind === "notice" &&
|
|
149
149
|
item.status === "matched" &&
|
|
150
150
|
// A dwell window that ended the session (then: stop) is the same class of harness-owned,
|
|
151
|
-
// structured completion as a matched stopWhen
|
|
151
|
+
// structured completion as a matched stopWhen.
|
|
152
152
|
(item.title.startsWith("stopWhen matched") || item.title === "dwell window complete"));
|
|
153
153
|
}
|
|
154
154
|
/**
|
|
155
|
-
* A goal_satisfied participant counts as a self-reported blocker
|
|
156
|
-
* the goal
|
|
157
|
-
* structured completion evidence, so it overrides a text scan of the free-form narrative
|
|
158
|
-
* otherwise trip on the subject app's
|
|
159
|
-
* Resolved-arc segments never block the verdict
|
|
155
|
+
* A goal_satisfied participant counts as a self-reported blocker only when its final narrative contradicts
|
|
156
|
+
* the goal and the run's own stop predicate did not fire. A matched stopWhen is independent,
|
|
157
|
+
* structured completion evidence, so it overrides a text scan of the free-form narrative, which can
|
|
158
|
+
* otherwise trip on the subject app's own quoted copy (e.g. a relayed "cannot be undone" banner).
|
|
159
|
+
* Resolved-arc segments never block the verdict. Returns the offending reason, or undefined
|
|
160
160
|
* when the participant is a clean pass. Exported for testing.
|
|
161
161
|
*/
|
|
162
162
|
export function resolveSelfReportedBlocker(session) {
|
|
@@ -187,10 +187,10 @@ export function sessionEnding(session) {
|
|
|
187
187
|
};
|
|
188
188
|
}
|
|
189
189
|
/**
|
|
190
|
-
* Friction is independent of how a completed session ended
|
|
190
|
+
* Friction is independent of how a completed session ended. Read the participant's
|
|
191
191
|
* redacted messages, including earlier reports, rather than the harness-owned reason that
|
|
192
192
|
* stopWhen/dwell writes. Reasoning, observations, and notices are not participant reports.
|
|
193
|
-
* Resolved arcs still count
|
|
193
|
+
* Resolved arcs still count; quoted copy and negated reports still do not. This read
|
|
194
194
|
* never changes the verdict. Exported for testing.
|
|
195
195
|
*/
|
|
196
196
|
export function resolveSelfReportedFriction(session) {
|
|
@@ -106,7 +106,7 @@ export declare function admitCuaRun(plan: ComputerUsePlan, input: ComputerUseRun
|
|
|
106
106
|
result: CuaActorLabResult;
|
|
107
107
|
};
|
|
108
108
|
descriptor: CuaActorDescriptor;
|
|
109
|
-
runSession: (options: import("../../actors/computer-use/actor.js").CuaActorSessionOptions) => Promise<import("../../index.js").
|
|
109
|
+
runSession: (options: import("../../actors/computer-use/actor.js").CuaActorSessionOptions) => Promise<import("../../index.js").ComputerUseLoopResult>;
|
|
110
110
|
externalCommsConfig: LabCommsExternal | undefined;
|
|
111
111
|
externalCommsEmail: LabCommsEmail | undefined;
|
|
112
112
|
participantRuns: DesktopParticipantRun[];
|
|
@@ -17,13 +17,14 @@ import { e2bRequestTimeoutMs } from "../../substrates/e2b/lifetime.js";
|
|
|
17
17
|
import { liveCuaRejection } from "./preflight.js";
|
|
18
18
|
import { cuaDescriptorOf, declaredAppUrl, plannedAppUrl } from "./plan.js";
|
|
19
19
|
import { trackRuntimeStreams } from "./live-flush.js";
|
|
20
|
-
import {
|
|
20
|
+
import { phaseEvent, planEvent } from "../../lab/run-lab-events.js";
|
|
21
21
|
import { defaultSubjectPhaseSink } from "../../subject/steps.js";
|
|
22
22
|
import {} from "./bundle.js";
|
|
23
23
|
import { packRunLocalTree } from "./local-tree-pack.js";
|
|
24
24
|
import { projectParticipantSubjects, subjectProvenanceArg } from "./subject-projection.js";
|
|
25
|
-
import {
|
|
25
|
+
import { participantSubjectEnv, } from "./types.js";
|
|
26
26
|
import { labPersonaIds } from "../../lab/persona-resolve.js";
|
|
27
|
+
import { studyResultIdentity } from "../../run/study-result.js";
|
|
27
28
|
/** The physical project, bound before any caller hook runs. */
|
|
28
29
|
async function bindProject(cwd) {
|
|
29
30
|
// Capture the physical project before reading or invoking any caller hook. A supported
|
|
@@ -43,10 +44,9 @@ export async function refuseCuaLab(options, refusal) {
|
|
|
43
44
|
if (refusal.stage === "after-personas")
|
|
44
45
|
await compileParticipantPersonas(projectRoot, labPersonaIds(config));
|
|
45
46
|
return {
|
|
46
|
-
|
|
47
|
+
...studyResultIdentity("computer-use", config.id),
|
|
47
48
|
ok: false,
|
|
48
49
|
cwd: projectRoot.physicalPath,
|
|
49
|
-
labId: config.id,
|
|
50
50
|
actor: refusal.actor ?? config.actors[0]?.type ?? "",
|
|
51
51
|
appUrl: declaredAppUrl(config),
|
|
52
52
|
dryRun,
|
|
@@ -74,10 +74,9 @@ export async function admitCuaRun(plan, input, config) {
|
|
|
74
74
|
const appUrl = plannedAppUrl(subject);
|
|
75
75
|
const subjectEnvNames = [...participantSubjectEnv(subject)];
|
|
76
76
|
const fail = (code, message, actorLabel) => ({
|
|
77
|
-
|
|
77
|
+
...studyResultIdentity("computer-use", plan.labId),
|
|
78
78
|
ok: false,
|
|
79
79
|
cwd,
|
|
80
|
-
labId: plan.labId,
|
|
81
80
|
actor: actorLabel ?? plan.actor,
|
|
82
81
|
appUrl,
|
|
83
82
|
dryRun,
|
|
@@ -96,7 +95,7 @@ export async function admitCuaRun(plan, input, config) {
|
|
|
96
95
|
if (config.subject.source === "app-url" &&
|
|
97
96
|
config.execution?.target === "local" &&
|
|
98
97
|
input.localVm === undefined)
|
|
99
|
-
return refuse("
|
|
98
|
+
return refuse("HUMANISH_COMPUTER_USE_LOCAL_DESKTOP_MISSING", "An app-url lab with execution.target: local needs a local desktop. runLab starts one; a direct route call or an in-process executor does not.");
|
|
100
99
|
const descriptor = cuaDescriptorOf(plan.actor);
|
|
101
100
|
const baseRunSession = seams.runSession ?? descriptor.runSession;
|
|
102
101
|
// A local VM study's sessions abort on its signal.
|
|
@@ -104,11 +103,11 @@ export async function admitCuaRun(plan, input, config) {
|
|
|
104
103
|
const runSession = localVmSignal === undefined
|
|
105
104
|
? baseRunSession
|
|
106
105
|
: (options) => baseRunSession({ ...options, signal: localVmSignal });
|
|
107
|
-
// Adopter-hosted comms plane on the app-url route
|
|
108
|
-
// so it cannot host a catch
|
|
106
|
+
// Adopter-hosted comms plane on the app-url route: humanish provisions no subject here,
|
|
107
|
+
// so it cannot host a catch. The operator runs one, and humanish still does every other part
|
|
109
108
|
// of the funnel: tells each persona its address and inbox URL, drains the catch over HTTP after
|
|
110
109
|
// the participants, and writes the same digest-only evidence. Declaring `external` previously did
|
|
111
|
-
// nothing on this route (
|
|
110
|
+
// nothing on this route (or on any other) while its docs said otherwise.
|
|
112
111
|
const comms = plan.residual.comms;
|
|
113
112
|
const externalCommsConfig = subject.kind !== "clone" && subject.kind !== "local-tree" && !inProcess
|
|
114
113
|
? comms?.email?.external
|
|
@@ -120,7 +119,7 @@ export async function admitCuaRun(plan, input, config) {
|
|
|
120
119
|
}
|
|
121
120
|
const { participantRuns, participantPlan, rerunLineage } = participants;
|
|
122
121
|
const participantCount = participantRuns.length;
|
|
123
|
-
// Pre-flight plan:
|
|
122
|
+
// Pre-flight plan: before any sandbox or provider call (dry-run and live). onEvent gets it for
|
|
124
123
|
// every N; the stderr table prints for fan-out (N>1) so single-participant runs stay as quiet as they
|
|
125
124
|
// always were.
|
|
126
125
|
if (participantCount > 1) {
|
|
@@ -141,7 +140,7 @@ export async function admitCuaRun(plan, input, config) {
|
|
|
141
140
|
sanitizeParticipantRuns(participantRuns, scrubKnownValues);
|
|
142
141
|
const redactRepoLabel = plan.residual.policies?.redactRepos ?? subjectEnvNames.includes("GITHUB_TOKEN");
|
|
143
142
|
const publicRepo = subject.kind === "clone" ? (redactRepoLabel ? "repo-01" : subject.repo) : undefined;
|
|
144
|
-
// Key-gating is route-aware: the in-process route uses the caller's
|
|
143
|
+
// Key-gating is route-aware: the in-process route uses the caller's own model + executor, and
|
|
145
144
|
// the local-agent route uses a CLI the operator has already signed in to.
|
|
146
145
|
if (!dryRun && !inProcess) {
|
|
147
146
|
const rejection = await liveCuaRejection({
|
|
@@ -154,8 +153,8 @@ export async function admitCuaRun(plan, input, config) {
|
|
|
154
153
|
if (rejection)
|
|
155
154
|
return refuse(rejection.code, rejection.message, descriptor.id);
|
|
156
155
|
}
|
|
157
|
-
// Pack the working tree
|
|
158
|
-
// fan-out participant below uploads this
|
|
156
|
+
// Pack the working tree once per run, on the host, before any sandbox or provider call: every
|
|
157
|
+
// fan-out participant below uploads this same archive, so one archiveSha256 describes every
|
|
159
158
|
// participant's digest. Dry-run packs nothing (no fs side effects; the contract bundle carries no
|
|
160
159
|
// archiveSha256). A packing failure fails the run closed here, before any sandbox is
|
|
161
160
|
// created and before the run directory exists.
|
|
@@ -168,7 +167,7 @@ export async function admitCuaRun(plan, input, config) {
|
|
|
168
167
|
localTreeArchiveBuffer = packed.buffer;
|
|
169
168
|
}
|
|
170
169
|
catch (error) {
|
|
171
|
-
return refuse("
|
|
170
|
+
return refuse("HUMANISH_COMPUTER_USE_SUBJECT_INVALID", `local-tree packing failed: ${redactText(scrubKnownValues(toErrorMessage(error)))}`, descriptor.id);
|
|
172
171
|
}
|
|
173
172
|
}
|
|
174
173
|
return {
|
|
@@ -229,7 +228,7 @@ export async function startCuaRun(plan, input, admitted, scope) {
|
|
|
229
228
|
humanishSource: "present",
|
|
230
229
|
packageName: "humanish",
|
|
231
230
|
});
|
|
232
|
-
// Live-trace flush seam
|
|
231
|
+
// Live-trace flush seam: runLabParticipants fills it when a live run has an in-progress bundle
|
|
233
232
|
// to grow; participants call it through deps.onTrace. It exists before deps so deps can reference it as
|
|
234
233
|
// a stable indirection.
|
|
235
234
|
const liveTrace = {};
|
|
@@ -334,7 +333,7 @@ function cuaParticipantDeps(plan, input, admitted, run) {
|
|
|
334
333
|
redactScreenshots,
|
|
335
334
|
scrubKnownValues,
|
|
336
335
|
runSession,
|
|
337
|
-
// The study-level ledger exists once per
|
|
336
|
+
// The study-level ledger exists once per run, shared by every participant. Dry runs never
|
|
338
337
|
// spend, so they carry none.
|
|
339
338
|
...(dryRun || plan.caps.maxTotalUsd === undefined
|
|
340
339
|
? {}
|
|
@@ -374,7 +373,7 @@ function subjectPhaseReporter(input) {
|
|
|
374
373
|
const sink = input.deps?.subjectPhaseSink ?? defaultSubjectPhaseSink;
|
|
375
374
|
return (event, participant) => {
|
|
376
375
|
sink(event, participant);
|
|
377
|
-
input.emit?.(phaseEvent(event, { kind: "participant", participant
|
|
376
|
+
input.emit?.(phaseEvent(event, { kind: "participant", participant }));
|
|
378
377
|
};
|
|
379
378
|
}
|
|
380
379
|
function makeCuaRunId() {
|
|
@@ -49,15 +49,15 @@ export declare function buildSingleParticipantBundle(args: {
|
|
|
49
49
|
/**
|
|
50
50
|
* Capture-time screenshot policy ("blurred" when policies.redactScreenshots, else "raw").
|
|
51
51
|
* When a session ran, its trace's `redaction.screenshots` is the evidence-of-record and
|
|
52
|
-
* wins; this fallback
|
|
53
|
-
* (no trace exists to testify then). Defaults to "raw"
|
|
52
|
+
* wins; this fallback labels the frames written before a mid-session failure
|
|
53
|
+
* (no trace exists to testify then). Defaults to "raw", the engine default.
|
|
54
54
|
*/
|
|
55
55
|
captureRedaction?: "raw" | "blurred";
|
|
56
56
|
session?: CuaLoopResult;
|
|
57
57
|
sessionError?: string;
|
|
58
58
|
/**
|
|
59
|
-
* The route's own credibility read of a goal_satisfied session
|
|
60
|
-
* evidence of what it
|
|
59
|
+
* The route's own credibility read of a goal_satisfied session. The actor's status is
|
|
60
|
+
* evidence of what it claimed; whether the harness counts the claim is decided by the route
|
|
61
61
|
* (zero engagement, a final message that describes a blocker). The review has to say the same
|
|
62
62
|
* thing the participant's exit code says, or the durable bundle reports a participant reaching the
|
|
63
63
|
* goal on a run the harness refused to count.
|
|
@@ -72,9 +72,9 @@ export declare function buildSingleParticipantBundle(args: {
|
|
|
72
72
|
* + digests only, never values or command text), including the subject's state story. */
|
|
73
73
|
subjectProvenance?: CuaSubjectProvenanceArg;
|
|
74
74
|
/**
|
|
75
|
-
* Entry kind for the non-clone subject.declared event
|
|
76
|
-
*
|
|
77
|
-
* declared
|
|
75
|
+
* Entry kind for the non-clone subject.declared event, which declares what the subject
|
|
76
|
+
* was. "local-app": an already-running local dev server driven in-process, un-pinnable, and
|
|
77
|
+
* declared as caller-provisioned/unpinned with no E2B. Absent: a plain app-url entry.
|
|
78
78
|
*/
|
|
79
79
|
entryKind?: "local-app";
|
|
80
80
|
/** The custom E2B desktop template (image) this participant launched on, when configured (provenance). */
|
|
@@ -24,7 +24,7 @@ function browserPlace(args) {
|
|
|
24
24
|
return "in a hosted desktop browser";
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
|
-
/** Run-level cost
|
|
27
|
+
/** Run-level cost estimate (advisory; omitted when nothing was priced and no sandbox ran). */
|
|
28
28
|
function runCost(args) {
|
|
29
29
|
return buildRunCostSummary({
|
|
30
30
|
participants: args.session
|
|
@@ -52,15 +52,15 @@ function participantView(args, publicAppUrl) {
|
|
|
52
52
|
? "Live computer-use session is running; stream auth URL is available only through the attached Observer server."
|
|
53
53
|
: (args.session?.reason ??
|
|
54
54
|
args.sessionError ??
|
|
55
|
-
"
|
|
55
|
+
"Dry run: the evidence shape was written without launching a desktop or spending provider tokens.");
|
|
56
56
|
const lastScreenshot = args.screenshots[args.screenshots.length - 1];
|
|
57
57
|
const desktopGeometry = args.desktopRoute === false
|
|
58
58
|
? undefined
|
|
59
59
|
: (args.desktopGeometry ?? {
|
|
60
60
|
screen: { requested: { width: args.resolution[0], height: args.resolution[1] } },
|
|
61
61
|
});
|
|
62
|
-
//
|
|
63
|
-
// run's
|
|
62
|
+
// Claims match mechanism: every screenshot label names the
|
|
63
|
+
// run's actual mode. The session trace is the evidence-of-record; the capture policy covers
|
|
64
64
|
// frames written before a mid-session failure produced a trace.
|
|
65
65
|
const traceScreenshotMode = args.session?.trace.redaction.screenshots;
|
|
66
66
|
const screenshotMode = traceScreenshotMode === "raw" || traceScreenshotMode === "blurred"
|
|
@@ -92,7 +92,7 @@ function singleSimulation(args, view) {
|
|
|
92
92
|
? `Computer-use actor (${args.actorId}) is driving the subject app ${browserPlace(args)}.`
|
|
93
93
|
: args.sessionError !== undefined
|
|
94
94
|
? `Computer-use lab failed before a terminal session verdict: ${args.sessionError}`
|
|
95
|
-
: `
|
|
95
|
+
: `Computer-use actor (${args.actorId}) against ${publicAppUrl}; no session ran.`,
|
|
96
96
|
startedAt: args.run.createdAt,
|
|
97
97
|
updatedAt: args.run.createdAt,
|
|
98
98
|
});
|
|
@@ -107,13 +107,13 @@ function singleStream(args, view) {
|
|
|
107
107
|
...(args.surface === undefined ? {} : { surface: args.surface }),
|
|
108
108
|
...(args.caseGroup === undefined ? {} : { caseGroup: args.caseGroup }),
|
|
109
109
|
kind: "browser",
|
|
110
|
-
label:
|
|
110
|
+
label: `${args.participantId ?? "lane-01"} · browser`,
|
|
111
111
|
status,
|
|
112
112
|
transport: "snapshot",
|
|
113
113
|
updatedAt: args.run.createdAt,
|
|
114
114
|
embed: lastScreenshot
|
|
115
|
-
? { kind: "screenshot", url: lastScreenshot, title: `
|
|
116
|
-
: { kind: "placeholder", title: "
|
|
115
|
+
? { kind: "screenshot", url: lastScreenshot, title: `Desktop (${screenshotMode})` }
|
|
116
|
+
: { kind: "placeholder", title: "Desktop" },
|
|
117
117
|
...(desktopGeometry?.viewport === undefined
|
|
118
118
|
? {}
|
|
119
119
|
: {
|
|
@@ -172,7 +172,7 @@ function singleEvents(args, view) {
|
|
|
172
172
|
at: args.run.createdAt,
|
|
173
173
|
level: "info",
|
|
174
174
|
type: "cua-lab.subject.provenance",
|
|
175
|
-
//
|
|
175
|
+
// Claim "cloned/packed and served" only when it actually happened.
|
|
176
176
|
message: `${subjectProvenanceMessage(args.subjectProvenance, publicAppUrl, args.dryRun, args.session !== undefined)} (subject env names: ${args.subjectProvenance.envNames.length > 0 ? args.subjectProvenance.envNames.join(", ") : "none"}; values never persisted); state: ${describeSubjectState(args.subjectProvenance.state, args.dryRun)}.`,
|
|
177
177
|
})
|
|
178
178
|
: participantEvent(SINGLE, {
|
|
@@ -180,13 +180,13 @@ function singleEvents(args, view) {
|
|
|
180
180
|
at: args.run.createdAt,
|
|
181
181
|
level: "info",
|
|
182
182
|
type: "cua-lab.subject.declared",
|
|
183
|
-
//
|
|
184
|
-
// local-app / in-process subject is an already-running
|
|
185
|
-
// provisioned; it cannot be commit-pinned, so its provenance is
|
|
183
|
+
// Declare what the subject was, including the absence of a pin. A
|
|
184
|
+
// local-app / in-process subject is an already-running local dev server the caller
|
|
185
|
+
// provisioned; it cannot be commit-pinned, so its provenance is unpinned and
|
|
186
186
|
// no E2B desktop was created. A plain app-url entry runs inside the desktop sandbox, or,
|
|
187
187
|
// on the local VM, reaches the host's loopback from the VM's browser.
|
|
188
188
|
message: args.entryKind === "local-app"
|
|
189
|
-
? `Subject app declared at ${publicAppUrl}
|
|
189
|
+
? `Subject app declared at ${publicAppUrl}: a running local dev server driven in this process, with no clone and no E2B desktop. Provenance: provided by the caller and unpinned, because a running dev server has no commit to pin.`
|
|
190
190
|
: runnerSubstrate(args) === "local-desktop"
|
|
191
191
|
? `Subject app declared at ${publicAppUrl} (the host's loopback, opened from a browser on a local VM).`
|
|
192
192
|
: `Subject app declared at ${publicAppUrl} (loopback inside the desktop sandbox).`,
|
|
@@ -220,12 +220,12 @@ function singleEvents(args, view) {
|
|
|
220
220
|
at: args.run.createdAt,
|
|
221
221
|
level: "info",
|
|
222
222
|
type: "cua-lab.contract.ready",
|
|
223
|
-
message: "Dry-run
|
|
223
|
+
message: "Dry-run bundle ready; switch scenario.mode to live for a real desktop session.",
|
|
224
224
|
}),
|
|
225
225
|
];
|
|
226
226
|
const record = (event) => events.push(participantEvent(SINGLE, event));
|
|
227
227
|
// Persisted phase trail (real boot timing, not just a coarse provenance sentence): one
|
|
228
|
-
// RunEvent per
|
|
228
|
+
// RunEvent per completed phase boundary (started events never persist here; they carry no
|
|
229
229
|
// durationMs). ok:false phases warn rather than error, since the failing phase's own thrown
|
|
230
230
|
// error already becomes the terminal cua-lab.session.error event above.
|
|
231
231
|
let phaseEventSeq = 3;
|
|
@@ -251,17 +251,15 @@ function singleEvents(args, view) {
|
|
|
251
251
|
}
|
|
252
252
|
function singleReview(args, view, stream) {
|
|
253
253
|
const { reason } = view;
|
|
254
|
-
// A funnel with a denominator of one is still the funnel
|
|
254
|
+
// A funnel with a denominator of one is still the funnel, and its absence stays recorded: no
|
|
255
255
|
// declared protocol (or a dry run) means no `tasks` field, never an empty one.
|
|
256
256
|
const singleRunTasks = args.inProgress !== true && args.session?.trace.taskFunnel !== undefined
|
|
257
257
|
? aggregateTaskFunnels([args.session.trace.taskFunnel])
|
|
258
258
|
: undefined;
|
|
259
|
-
// What happened to the participant, as the route judged it
|
|
260
|
-
// applies (
|
|
261
|
-
// run the route refused as "not a credible pass"
|
|
262
|
-
//
|
|
263
|
-
// repeated it. Found on a real drawDB run whose participant wrote "Blocked after partial
|
|
264
|
-
// completion".
|
|
259
|
+
// What happened to the participant, as the route judged it: the same rule the fan-out roll-up
|
|
260
|
+
// applies (participantStatus in src/run/judge.ts). Reading the actor's own status instead would write up
|
|
261
|
+
// a run the route refused as "not a credible pass" as verdict pass, 1/1 reached the goal, and
|
|
262
|
+
// every projection of the bundle (Observer tally, `runs`, the status index) would repeat it.
|
|
265
263
|
const participantStatus = args.session === undefined
|
|
266
264
|
? undefined
|
|
267
265
|
: participantStatusFor(args.session.status, args.credibility);
|
|
@@ -286,7 +284,7 @@ function singleReview(args, view, stream) {
|
|
|
286
284
|
? []
|
|
287
285
|
: args.inProgress === true
|
|
288
286
|
? ["Live desktop session is still running."]
|
|
289
|
-
: ["Live desktop session not yet run (dry
|
|
287
|
+
: ["Live desktop session not yet run (dry run only)."],
|
|
290
288
|
}, [stream]);
|
|
291
289
|
return review;
|
|
292
290
|
}
|
|
@@ -314,14 +312,14 @@ export function buildSingleParticipantBundle(args) {
|
|
|
314
312
|
persona: {
|
|
315
313
|
id: args.persona.id,
|
|
316
314
|
name: `Computer-use operator (${args.persona.id})`,
|
|
317
|
-
source: `
|
|
315
|
+
source: `study:${args.labId}`,
|
|
318
316
|
sourceDigest: args.persona.promptDigest,
|
|
319
317
|
},
|
|
320
318
|
scenario: {
|
|
321
319
|
id: `cua-${args.labId}`,
|
|
322
320
|
title: args.labTitle ?? `Computer-use lab: ${args.labId}`,
|
|
323
321
|
goal: redactText(args.mission),
|
|
324
|
-
source: `
|
|
322
|
+
source: `study:${args.labId}`,
|
|
325
323
|
sourceDigest: args.persona.promptDigest,
|
|
326
324
|
},
|
|
327
325
|
lifecycle: [
|
|
@@ -337,7 +335,7 @@ export function buildSingleParticipantBundle(args) {
|
|
|
337
335
|
redaction: {
|
|
338
336
|
status: "passed",
|
|
339
337
|
notes: traceScreenshotMode === "raw"
|
|
340
|
-
? "Typed text recorded as length only and reasoning
|
|
338
|
+
? "Typed text is recorded as its length only, and reasoning and messages pass through text redaction. Screenshots are unblurred and kept for local use; they are not redacted for publishing. Set policies.redactScreenshots: true to blur screenshots in a bundle you plan to share."
|
|
341
339
|
: traceScreenshotMode === "blurred"
|
|
342
340
|
? "Typed text recorded as length only and reasoning/messages pass through text redaction. Screenshots are blurred at capture (policies.redactScreenshots: true) for a share-as-is bundle."
|
|
343
341
|
: args.screenshots.length > 0
|
|
@@ -346,8 +344,8 @@ export function buildSingleParticipantBundle(args) {
|
|
|
346
344
|
},
|
|
347
345
|
artifacts: bundleArtifacts(),
|
|
348
346
|
review,
|
|
349
|
-
// What the participant reported, when it reported anything
|
|
350
|
-
// bundles carry none
|
|
347
|
+
// What the participant reported, when it reported anything. Dry-run and in-progress
|
|
348
|
+
// bundles carry none: there is no participant yet to quote.
|
|
351
349
|
feedbackCandidates: args.dryRun || args.inProgress === true
|
|
352
350
|
? []
|
|
353
351
|
: participantFeedbackCandidates({
|
|
@@ -378,8 +376,8 @@ export function buildSingleParticipantBundle(args) {
|
|
|
378
376
|
...(args.providerResources === undefined || args.providerResources.length === 0
|
|
379
377
|
? {}
|
|
380
378
|
: { providerResources: args.providerResources }),
|
|
381
|
-
// Structured subject provenance
|
|
382
|
-
//
|
|
379
|
+
// Structured subject provenance: code pin + state story. Uniform, and
|
|
380
|
+
// stated on app-url bundles too: the caller minted the URL, its state is the caller's.
|
|
383
381
|
// CuaSubjectProvenanceArg's two variants (clone, local-tree) are already RunSubjectProvenance-
|
|
384
382
|
// shaped, so no reconstruction is needed beyond the app-url fallback.
|
|
385
383
|
subject: args.subjectProvenance ?? { source: "app-url", state: { provenance: "undeclared" } },
|
|
@@ -18,7 +18,7 @@ export declare function projectParticipantSubjects(args: {
|
|
|
18
18
|
}): CuaSubjectProjection[];
|
|
19
19
|
/**
|
|
20
20
|
* Resolve the bundle's state marker from the declaration and what actually ran.
|
|
21
|
-
* Precedence: external declared → "unpinned" (seed records, if any, stay attached
|
|
21
|
+
* Precedence: external declared → "unpinned" (seed records, if any, stay attached; a
|
|
22
22
|
* migrated external DB is still unpinned overall); else seed declared → "seeded" only when
|
|
23
23
|
* every declared step executed ok on a live run, otherwise "declared-not-run" (dry-run
|
|
24
24
|
* contract bundles and failed live provisioning); no declaration → "undeclared".
|
|
@@ -36,7 +36,7 @@ export function projectParticipantSubjects(args) {
|
|
|
36
36
|
}
|
|
37
37
|
/**
|
|
38
38
|
* Resolve the bundle's state marker from the declaration and what actually ran.
|
|
39
|
-
* Precedence: external declared → "unpinned" (seed records, if any, stay attached
|
|
39
|
+
* Precedence: external declared → "unpinned" (seed records, if any, stay attached; a
|
|
40
40
|
* migrated external DB is still unpinned overall); else seed declared → "seeded" only when
|
|
41
41
|
* every declared step executed ok on a live run, otherwise "declared-not-run" (dry-run
|
|
42
42
|
* contract bundles and failed live provisioning); no declaration → "undeclared".
|
|
@@ -48,8 +48,8 @@ export function resolveSubjectState(args) {
|
|
|
48
48
|
}
|
|
49
49
|
const declaredSeed = declared.seed ?? [];
|
|
50
50
|
const external = declared.external ?? [];
|
|
51
|
-
// Dry-run: nothing executes (no sandbox)
|
|
52
|
-
// command digest only, with
|
|
51
|
+
// Dry-run: nothing executes (no sandbox), so record the declared recipe: name, phase, and
|
|
52
|
+
// command digest only, with no execution fields.
|
|
53
53
|
const seed = args.dryRun
|
|
54
54
|
? declaredSeed.map((step) => ({
|
|
55
55
|
name: step.name,
|
|
@@ -74,8 +74,8 @@ export function resolveSubjectState(args) {
|
|
|
74
74
|
...(external.length > 0 ? { externalEnvNames: external } : {}),
|
|
75
75
|
};
|
|
76
76
|
}
|
|
77
|
-
/** Build the per-participant subject projection
|
|
78
|
-
*
|
|
77
|
+
/** Build the per-participant subject projection. Local-tree participants all share
|
|
78
|
+
* one host-packed archive, so every participant's projection carries the identical archiveSha256/
|
|
79
79
|
* commit/dirty (no divergence is possible, unlike the clone route's per-participant
|
|
80
80
|
* in-sandbox commit). */
|
|
81
81
|
function participantSubjectProjection(args) {
|
|
@@ -144,7 +144,7 @@ export function aggregateCuaSubject(args) {
|
|
|
144
144
|
const unanimous = !dryRun && commits.length === participantCount && new Set(commits).size === 1;
|
|
145
145
|
const warnings = !dryRun && participantCount > 1 && new Set(commits).size > 1
|
|
146
146
|
? [
|
|
147
|
-
"
|
|
147
|
+
"Participants resolved different subject commits, so the top-level subject.commit is omitted; each participant's provenance in result.lanes has its pinned commit.",
|
|
148
148
|
]
|
|
149
149
|
: [];
|
|
150
150
|
return {
|