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
package/dist/lab/types.d.ts
CHANGED
|
@@ -3,32 +3,34 @@ import type { LabTask } from "./tasks.js";
|
|
|
3
3
|
import type { DwellWindow, StopWhen } from "../actors/stop-conditions.js";
|
|
4
4
|
import { type ReasoningEffort } from "../actors/reasoning-effort.js";
|
|
5
5
|
export declare const LAB_CONFIG_SCHEMA = "humanish.lab.v2";
|
|
6
|
+
/** The study format: it declares its route, one actor, its participants and one caps block. */
|
|
7
|
+
export declare const STUDY_SCHEMA = "humanish.study.v3";
|
|
6
8
|
export declare const ID_PATTERN: RegExp;
|
|
7
9
|
/**
|
|
8
10
|
* Where the run acts: the host repo, a fresh clone, a running app a browser actor drives
|
|
9
|
-
* (`app-url`), an already-running
|
|
10
|
-
* CuaExecutor with
|
|
11
|
+
* (`app-url`), an already-running local dev server driven in-process via a custom
|
|
12
|
+
* CuaExecutor with no clone and no E2B desktop (`local-app`), or the operator's own local
|
|
11
13
|
* working tree packed and provisioned in-sandbox in place of a clone (`local-tree`).
|
|
12
|
-
* `local-app` routes to the
|
|
14
|
+
* `local-app` routes to the computer-use route and is library-assisted: a caller supplies
|
|
13
15
|
* `RunLabOptions.inProcess` + `createProvider` (no built-in driver exists yet), and the engine
|
|
14
|
-
* fails closed (
|
|
16
|
+
* fails closed (HUMANISH_COMPUTER_USE_LOCAL_APP_NO_EXECUTOR) when run without them: a structured
|
|
15
17
|
* error, never a desktop attempt. See docs/architecture/state-driven-executor.md.
|
|
16
18
|
*/
|
|
17
19
|
type LabSubjectSource = "this-repo" | "clone" | "app-url" | "local-app" | "terminal-product" | "desktop-cli" | "local-tree";
|
|
18
20
|
/**
|
|
19
|
-
* How a subject's
|
|
20
|
-
* this) is the only fan-out topology the computer-use route ships
|
|
21
|
-
* worlds, isolation + per-
|
|
22
|
-
* mutable service plane that N
|
|
23
|
-
* shared state. Consumed
|
|
21
|
+
* How a subject's world relates across participants. `per-lane-worlds` (the default; absent ==
|
|
22
|
+
* this) is the only fan-out topology the computer-use route ships: N participants, N independent
|
|
23
|
+
* worlds, isolation + per-participant attribution. `shared-world` is the declared override: one
|
|
24
|
+
* mutable service plane that N participants use at the same time, so their actions interact through
|
|
25
|
+
* shared state. Consumed only on the shared-world routes (a provisioned clone plane, or an
|
|
24
26
|
* external-public app-url plane) with a computer-use actor; inert/warned everywhere else
|
|
25
|
-
* (
|
|
27
|
+
* (claims match mechanism).
|
|
26
28
|
*/
|
|
27
29
|
type LabSubjectTopology = "per-lane-worlds" | "shared-world";
|
|
28
30
|
export interface LabSubjectClone {
|
|
29
31
|
/** git clone depth; 1 (shallow) by default. Consumed on the computer-use clone route. */
|
|
30
32
|
depth?: number;
|
|
31
|
-
/** how many
|
|
33
|
+
/** how many participants to fan out, each with its own clone (one sandbox/desktop each). */
|
|
32
34
|
fanout?: number;
|
|
33
35
|
/** keep the disposable clone for debugging instead of discarding. */
|
|
34
36
|
keep?: boolean;
|
|
@@ -51,11 +53,11 @@ export interface LabSubjectServe {
|
|
|
51
53
|
install?: string;
|
|
52
54
|
/** Optional bounded build step. */
|
|
53
55
|
build?: string;
|
|
54
|
-
/** Required long-lived start command
|
|
56
|
+
/** Required long-lived start command, launched detached; the sandbox lifecycle owns it. */
|
|
55
57
|
start: string;
|
|
56
58
|
/** Loopback entry URL: the readiness-probe target and the URL the actor drives. The lab
|
|
57
|
-
* serves the clone
|
|
58
|
-
* allowPublicTargets
|
|
59
|
+
* serves the clone inside the sandbox, so this is always loopback (not subject to
|
|
60
|
+
* allowPublicTargets, which governs app-url subjects, i.e. external deployments). */
|
|
59
61
|
url: string;
|
|
60
62
|
/** Budget for the served app to answer the readiness probe. Default 180000. */
|
|
61
63
|
readyTimeoutMs?: number;
|
|
@@ -69,43 +71,43 @@ export type LabStateStepWhen = "before-build" | "before-start" | "after-ready";
|
|
|
69
71
|
interface LabSubjectStateStep {
|
|
70
72
|
/**
|
|
71
73
|
* [a-z0-9-] step label (must start alphanumeric), <=40 chars, unique across steps; becomes
|
|
72
|
-
* the detached-step name `subject-state-<name>` (interpolates into in-sandbox file paths
|
|
73
|
-
* the shape is
|
|
74
|
+
* the detached-step name `subject-state-<name>` (interpolates into in-sandbox file paths, so
|
|
75
|
+
* the shape is validated at parse and re-enforced in the engine).
|
|
74
76
|
*/
|
|
75
77
|
name: string;
|
|
76
78
|
/**
|
|
77
|
-
* Author-trusted shell command (same trust class as serve.install/build/start
|
|
79
|
+
* Author-trusted shell command (same trust class as serve.install/build/start: the
|
|
78
80
|
* "serve commands are author-trusted" corollary). Runs detached in the subject directory
|
|
79
81
|
* with an atomic status file, kill-on-timeout, and a capped log tail. Persisted in
|
|
80
|
-
* evidence as a sha256-16
|
|
82
|
+
* evidence as a sha256-16 digest only, never as text.
|
|
81
83
|
*/
|
|
82
84
|
command: string;
|
|
83
85
|
/**
|
|
84
|
-
* Phase: before-build (after install
|
|
85
|
-
* before-start (after build, before the server launches
|
|
86
|
-
* an in-sandbox `service postgresql start`), after-ready (after the readiness probe
|
|
87
|
-
* fixtures loaded through the
|
|
86
|
+
* Phase: before-build (after install, for builds that read the DB, e.g. SSG),
|
|
87
|
+
* before-start (after build, before the server launches: migrations, SQL/file fixtures,
|
|
88
|
+
* an in-sandbox `service postgresql start`), after-ready (after the readiness probe:
|
|
89
|
+
* fixtures loaded through the running app's API). Default: before-start.
|
|
88
90
|
*/
|
|
89
91
|
when?: LabStateStepWhen;
|
|
90
92
|
/** Wall-clock budget per step. Default 300000. */
|
|
91
93
|
timeoutMs?: number;
|
|
92
94
|
}
|
|
93
95
|
/**
|
|
94
|
-
* A shared-world state
|
|
96
|
+
* A shared-world state checkpoint: an author-trusted, read-only, aggregate/digest probe command
|
|
95
97
|
* (counts, max-timestamps, hashes) run at baseline and after each role's turn. Reuses the
|
|
96
|
-
* seed-step validation shape (name [a-z0-9-] ≤40, unique; command required). Persisted
|
|
97
|
-
* (only sha256-16(scrub+redact(stdout)) ever lands
|
|
98
|
-
* seed surface. Consumed
|
|
98
|
+
* seed-step validation shape (name [a-z0-9-] ≤40, unique; command required). Persisted digest-only
|
|
99
|
+
* (only sha256-16(scrub+redact(stdout)) ever lands, never the raw value), same lockdown as the
|
|
100
|
+
* seed surface. Consumed only on the shared-world route; inert/warned elsewhere.
|
|
99
101
|
*/
|
|
100
102
|
export interface LabSubjectStateCheckpoint {
|
|
101
103
|
/**
|
|
102
104
|
* [a-z0-9-] probe label (must start alphanumeric), <=40 chars, unique across checkpoints;
|
|
103
|
-
* names the detached step (`checkpoint-<snapshot>-<name>`)
|
|
104
|
-
* parse
|
|
105
|
+
* names the detached step (`checkpoint-<snapshot>-<name>`), a shape validated at
|
|
106
|
+
* parse and re-enforced in the engine.
|
|
105
107
|
*/
|
|
106
108
|
name: string;
|
|
107
109
|
/**
|
|
108
|
-
* Author-trusted
|
|
110
|
+
* Author-trusted read-only shell command (same trust class as serve/seed: the "serve commands
|
|
109
111
|
* are author-trusted" corollary). Its stdout is scrubbed + pattern-redacted, then digested
|
|
110
112
|
* (sha256-16); the raw value never persists.
|
|
111
113
|
*/
|
|
@@ -113,43 +115,43 @@ export interface LabSubjectStateCheckpoint {
|
|
|
113
115
|
/**
|
|
114
116
|
* Optional extra literal values to scrub from this probe's stdout before digesting (author-known
|
|
115
117
|
* values that may appear in the probe output, beyond the harness-provisioned env values which are
|
|
116
|
-
* always scrubbed). Names
|
|
118
|
+
* always scrubbed). Names and values are never persisted; only the digest is.
|
|
117
119
|
*/
|
|
118
120
|
redact?: string[];
|
|
119
121
|
}
|
|
120
|
-
/** The subject's
|
|
122
|
+
/** The subject's state story (clone subjects): seeded in-sandbox, or declared external. */
|
|
121
123
|
export interface LabSubjectState {
|
|
122
124
|
/** Ordered seed/migration/fixture steps. Order within a phase is declaration order. */
|
|
123
125
|
seed?: LabSubjectStateStep[];
|
|
124
126
|
/**
|
|
125
|
-
* Env var
|
|
127
|
+
* Env var names whose values point at state the lab does not control (e.g. a shared dev
|
|
126
128
|
* DB). Must be a subset of subject.env (so the declaration is mechanically backed by a
|
|
127
129
|
* provisioned name, not a vibe). Flips state provenance to "unpinned".
|
|
128
130
|
*/
|
|
129
131
|
external?: string[];
|
|
130
132
|
/**
|
|
131
|
-
* Shared-world state checkpoints
|
|
132
|
-
* role's turn to produce the harness-clocked interaction timeline. Consumed
|
|
133
|
-
* shared-world route; inert/warned elsewhere
|
|
133
|
+
* Shared-world state checkpoints: read-only digest probes run at baseline + after each
|
|
134
|
+
* role's turn to produce the harness-clocked interaction timeline. Consumed only on the
|
|
135
|
+
* shared-world route; inert/warned elsewhere. Shape-validated everywhere.
|
|
134
136
|
*/
|
|
135
137
|
checkpoint?: LabSubjectStateCheckpoint[];
|
|
136
138
|
}
|
|
137
139
|
/**
|
|
138
|
-
* `terminal-product`: the product-under-study a terminal agent must discover and use from
|
|
139
|
-
*
|
|
140
|
-
* the agent drives the declared public surfaces, so provenance is
|
|
141
|
-
* concrete product name + surfaces are operator data; committed fixtures use a
|
|
140
|
+
* `terminal-product`: the product-under-study a terminal agent must discover and use from public
|
|
141
|
+
* surfaces only (the terminal-product route's subject). The subject is not provisioned or cloned:
|
|
142
|
+
* the agent drives the declared public surfaces, so provenance is declared unpinned. The
|
|
143
|
+
* concrete product name + surfaces are operator data; committed fixtures use a neutral mock name.
|
|
142
144
|
*/
|
|
143
145
|
export interface LabSubjectProduct {
|
|
144
146
|
/** Public-safe product label (shape-validated like a lab id; interpolates into evidence). */
|
|
145
147
|
name: string;
|
|
146
148
|
/**
|
|
147
|
-
* How the product gets onto the machine, run
|
|
148
|
-
*
|
|
149
|
+
* How the product gets onto the machine, run with no keys before the participant starts, in the
|
|
150
|
+
* participant's working directory. Consumed on both product routes: `desktop-cli` (a person at a
|
|
149
151
|
* desktop) and `terminal-product` (an agent in a shell).
|
|
150
152
|
*
|
|
151
153
|
* Absent means the participant installs it themselves from the public surfaces, which is a
|
|
152
|
-
* different study
|
|
154
|
+
* different study, one about the install. Present means the study starts
|
|
153
155
|
* where you want it to start: asking a participant what studies a project contains, in an empty
|
|
154
156
|
* directory, measures the lab rather than the product.
|
|
155
157
|
* Both routes prepare Node/npm when install is absent; product installation remains the
|
|
@@ -157,29 +159,29 @@ export interface LabSubjectProduct {
|
|
|
157
159
|
*/
|
|
158
160
|
install?: string;
|
|
159
161
|
/**
|
|
160
|
-
* `desktop-cli`
|
|
161
|
-
* directory. (The terminal-product
|
|
162
|
+
* `desktop-cli` only: the directory the participant's terminal opens in. Absent means the home
|
|
163
|
+
* directory. (The terminal-product route has its own fixed study workdir.)
|
|
162
164
|
*
|
|
163
165
|
* This exists because the first live study failed on it: the participant was asked what studies
|
|
164
166
|
* the project contained, landed in an empty home directory, correctly reported that there was no
|
|
165
167
|
* project, and stopped. The finding was about the lab, not the product. A study of a
|
|
166
|
-
* project-scoped tool has to put the participant
|
|
168
|
+
* project-scoped tool has to put the participant inside a project, the same way an app study opens
|
|
167
169
|
* the app rather than a blank tab.
|
|
168
170
|
*/
|
|
169
171
|
workdir?: string;
|
|
170
172
|
/**
|
|
171
|
-
* The product's
|
|
173
|
+
* The product's public surfaces, the only world the agent sees. Each must be an http(s) URL
|
|
172
174
|
* (e.g. a docs page, an llms.txt, a skill manifest). Validated at parse; recorded in evidence.
|
|
173
175
|
*/
|
|
174
176
|
publicSurfaces: string[];
|
|
175
177
|
/**
|
|
176
|
-
* `terminal-product`
|
|
178
|
+
* `terminal-product` only: a local file uploaded into the sandbox before `install` runs, and
|
|
177
179
|
* exposed to it as `$HUMANISH_PRODUCT_UPLOAD`. A project-relative path; `..` and absolute paths
|
|
178
180
|
* are refused, because this reads a file off the operator's disk and puts it on a machine an
|
|
179
181
|
* autonomous agent is about to drive.
|
|
180
182
|
*
|
|
181
|
-
* It exists so a study can test a build that is
|
|
182
|
-
* the last release, which is exactly the wrong artifact for a pre-release gate
|
|
183
|
+
* It exists so a study can test a build that is not published yet. Installing `@latest` measures
|
|
184
|
+
* the last release, which is exactly the wrong artifact for a pre-release gate. The point is to
|
|
183
185
|
* meet the candidate before anyone else does. Any adopter shipping a CLI wants the same thing.
|
|
184
186
|
*/
|
|
185
187
|
upload?: string;
|
|
@@ -187,33 +189,33 @@ export interface LabSubjectProduct {
|
|
|
187
189
|
export interface LabSubject {
|
|
188
190
|
source: LabSubjectSource;
|
|
189
191
|
/**
|
|
190
|
-
*
|
|
191
|
-
* existing
|
|
192
|
-
*
|
|
193
|
-
* clone or an external-public app-url plane, a computer-use actor, and a roster of ≥2
|
|
194
|
-
* inert/warned elsewhere.
|
|
192
|
+
* World topology across participants. Absent == `per-lane-worlds` (the isolation default; every
|
|
193
|
+
* existing study is byte-stable). `shared-world` is the declared override: one mutable service
|
|
194
|
+
* plane, N participants at once, each in its role. Consumed only on the shared-world routes (a
|
|
195
|
+
* provisioned clone or an external-public app-url plane, a computer-use actor, and a roster of ≥2
|
|
196
|
+
* participants); inert/warned elsewhere.
|
|
195
197
|
*/
|
|
196
198
|
topology?: LabSubjectTopology;
|
|
197
199
|
/**
|
|
198
|
-
*
|
|
199
|
-
* subject behind the internet-reachable `getHost` URL is
|
|
200
|
+
* Concurrent shared-world route only: the author's required attestation that the
|
|
201
|
+
* subject behind the internet-reachable `getHost` URL is synthetic seeded data. The concurrent
|
|
200
202
|
* route exposes the subject on a tokenless public URL for the run's duration, so real/external
|
|
201
203
|
* data must never sit behind it. This is author-trust + a provenance gate (verify also requires
|
|
202
|
-
* `subject.state.provenance == "seeded"`)
|
|
204
|
+
* `subject.state.provenance == "seeded"`). It does not guarantee the data is synthetic. Required when
|
|
203
205
|
* `topology: shared-world` + `execution.concurrency > 1`; inert/warned elsewhere.
|
|
204
206
|
*/
|
|
205
207
|
exposure?: "synthetic";
|
|
206
208
|
/**
|
|
207
|
-
*
|
|
208
|
-
* attestation when a real
|
|
209
|
+
* External-public shared-world route only: the author's required ownership
|
|
210
|
+
* attestation when a real public deployment (`source: app-url` + `topology: shared-world` +
|
|
209
211
|
* `concurrency > 1` + `policies.allowPublicTargets: true`) is used directly as the shared plane.
|
|
210
212
|
* The harness neither provisions nor exposes this target (no getHost, no clone, no seed), so it
|
|
211
|
-
* cannot attest the data is synthetic; instead the operator
|
|
212
|
-
* `owner` is a public-safe operator/repo label; `authorized` must be true. This is author-trust
|
|
213
|
-
* the harness cannot verify ownership
|
|
214
|
-
* external-public branch. On a non-`app-url` subject it is
|
|
215
|
-
* `app-url` config that does not route to external-public shared-world it is
|
|
216
|
-
* (forwardDeclaredWarnings), never silently consumed
|
|
213
|
+
* cannot attest the data is synthetic; instead the operator must attest they own/operate it.
|
|
214
|
+
* `owner` is a public-safe operator/repo label; `authorized` must be true. This is author-trust:
|
|
215
|
+
* the harness cannot verify ownership, and the evidence class says so. Required on the
|
|
216
|
+
* external-public branch. On a non-`app-url` subject it is rejected (parse error); on any other
|
|
217
|
+
* `app-url` config that does not route to external-public shared-world it is ignored with a warning
|
|
218
|
+
* (forwardDeclaredWarnings), never silently consumed, because it is meaningless without that plane.
|
|
217
219
|
*/
|
|
218
220
|
publicTarget?: {
|
|
219
221
|
owner: string;
|
|
@@ -224,44 +226,44 @@ export interface LabSubject {
|
|
|
224
226
|
clone?: LabSubjectClone;
|
|
225
227
|
/**
|
|
226
228
|
* `app-url`: a loopback http(s) URL the computer-use actor drives (127.0.0.1/localhost
|
|
227
|
-
* only
|
|
228
|
-
*
|
|
229
|
-
* For a config-only path use `clone` + `serve
|
|
229
|
+
* only; driving arbitrary public sites is not allowed). The URL must be reachable from
|
|
230
|
+
* inside the desktop sandbox; library callers provision it via the prepareDesktop hook.
|
|
231
|
+
* For a config-only path use `clone` + `serve`: the lab serves the app itself.
|
|
230
232
|
*
|
|
231
|
-
* `local-app`: the loopback http(s) URL of an already-running
|
|
232
|
-
* custom CuaExecutor drives in-process (no sandbox, no public-target option
|
|
233
|
-
* loopback). Passed to `
|
|
233
|
+
* `local-app`: the loopback http(s) URL of an already-running local dev server the caller's
|
|
234
|
+
* custom CuaExecutor drives in-process (no sandbox, no public-target option, always
|
|
235
|
+
* loopback). Passed to `inProcess.executor` so the bridge knows where the app lives.
|
|
234
236
|
*/
|
|
235
237
|
appUrl?: string;
|
|
236
238
|
/** `clone` (computer-use route): how the cloned app is served in-sandbox. */
|
|
237
239
|
serve?: LabSubjectServe;
|
|
238
240
|
/**
|
|
239
|
-
* Env var
|
|
241
|
+
* Env var names the subject app needs, provisioned into the sandbox from the caller's
|
|
240
242
|
* environment (--env-file). Names are recorded in evidence; values never are. Consumed
|
|
241
243
|
* on the computer-use clone route.
|
|
242
244
|
*/
|
|
243
245
|
env?: string[];
|
|
244
246
|
/**
|
|
245
|
-
*
|
|
247
|
+
* Literal, non-secret env values committed alongside the lab: the configuration every real app
|
|
246
248
|
* needs before it will boot: a public base URL, a transport selector, a feature flag. None of that
|
|
247
249
|
* is secret, and routing it through `subject.env` would force an adopter to carry a private env
|
|
248
250
|
* file just to reproduce a public study, which is the opposite of a reproducible lab.
|
|
249
251
|
*
|
|
250
|
-
* These values
|
|
252
|
+
* These values are recorded in evidence, because they are part of how the subject was configured,
|
|
251
253
|
* so a value that looks like a secret or a local path is refused at parse rather than committed to
|
|
252
254
|
* a public repo. Anything genuinely secret belongs in `subject.env`.
|
|
253
255
|
*/
|
|
254
256
|
envValues?: Record<string, string>;
|
|
255
257
|
/**
|
|
256
|
-
* `clone` (computer-use route): the subject's state story
|
|
258
|
+
* `clone` (computer-use route): the subject's state story, as seed/migration/fixture steps
|
|
257
259
|
* executed in-sandbox around the serve sequence, and/or declared external state. Recorded
|
|
258
|
-
* in the run bundle as structured provenance
|
|
259
|
-
*
|
|
260
|
+
* in the run bundle as structured provenance: seeded with command digests,
|
|
261
|
+
* unpinned for external state, declared-not-run for dry-run/failed provisioning.
|
|
260
262
|
*/
|
|
261
263
|
state?: LabSubjectState;
|
|
262
264
|
/**
|
|
263
265
|
* `terminal-product` (terminal route): the product the terminal agent discovers + uses from
|
|
264
|
-
*
|
|
266
|
+
* public surfaces only. Consumed on the terminal route; rejected on every other source.
|
|
265
267
|
*/
|
|
266
268
|
product?: LabSubjectProduct;
|
|
267
269
|
/**
|
|
@@ -276,98 +278,98 @@ export interface LabSubject {
|
|
|
276
278
|
export interface LabParticipantFocus {
|
|
277
279
|
id?: string;
|
|
278
280
|
label?: string;
|
|
279
|
-
/** Per-
|
|
281
|
+
/** Per-participant steer appended to the actor's mission. Consumed on the app-url route. */
|
|
280
282
|
instruction?: string;
|
|
281
283
|
}
|
|
282
284
|
/**
|
|
283
|
-
* One differentiated fan-out
|
|
284
|
-
* becomes an independent E2B desktop sandbox with its own persona/device/starting-steer. All
|
|
285
|
+
* One participant in a differentiated fan-out on the computer-use E2B route (`per-lane-worlds`).
|
|
286
|
+
* Each entry becomes an independent E2B desktop sandbox with its own persona/device/starting-steer. All
|
|
285
287
|
* fields optional: an omitted persona/device/instruction inherits the actor-level default. `id`
|
|
286
|
-
* defaults to `lane-01`..`lane-NN` and must be a public-safe token (it names per-
|
|
287
|
-
* paths). Consumed
|
|
288
|
+
* defaults to `lane-01`..`lane-NN` and must be a public-safe token (it names per-participant evidence
|
|
289
|
+
* paths). Consumed only on the computer-use E2B route (inert/warned elsewhere).
|
|
288
290
|
*/
|
|
289
291
|
export interface LabParticipantEntry {
|
|
290
|
-
/** Public-safe
|
|
292
|
+
/** Public-safe participant id (interpolates into its evidence paths). Default `lane-NN`. */
|
|
291
293
|
id?: string;
|
|
292
294
|
/**
|
|
293
295
|
* App-defined actor type label for grouping simulated users ("operator", "viewer",
|
|
294
|
-
* "maintainer", etc.).
|
|
296
|
+
* "maintainer", etc.). It is separate from the execution actor dispatch key (`actors[0].type`);
|
|
295
297
|
* it is adapter-owned taxonomy for roster/readback.
|
|
296
298
|
*/
|
|
297
299
|
actorType?: string;
|
|
298
|
-
/** App-defined surface label for grouping
|
|
300
|
+
/** App-defined surface label for grouping participants that start from different product areas. */
|
|
299
301
|
surface?: string;
|
|
300
|
-
/** App-defined correlation id tying
|
|
302
|
+
/** App-defined correlation id tying participants to one shared case/account/work item. */
|
|
301
303
|
caseGroup?: string;
|
|
302
|
-
/** Persona id/label threaded into this
|
|
304
|
+
/** Persona id/label threaded into this participant's actor prompt. Default: actors[0].persona. */
|
|
303
305
|
persona?: string;
|
|
304
|
-
/** Named hosted-screen preset for this
|
|
306
|
+
/** Named hosted-screen preset for this participant. XOR raw execution.desktop.resolution. */
|
|
305
307
|
device?: string;
|
|
306
|
-
/**
|
|
308
|
+
/** Steer appended to this participant's mission (the roster's per-participant focus). */
|
|
307
309
|
instruction?: string;
|
|
308
310
|
/**
|
|
309
|
-
* Deterministic
|
|
311
|
+
* Deterministic participant completion guard. When set, this participant stops as soon as the runtime
|
|
310
312
|
* observation matches any declared rule; actor-level stopWhen is used as the default.
|
|
311
313
|
*/
|
|
312
314
|
stopWhen?: StopWhen;
|
|
313
|
-
/** A declared observation window for
|
|
315
|
+
/** A declared observation window for this participant; actor-level dwell is the default. */
|
|
314
316
|
dwell?: DwellWindow;
|
|
315
317
|
/**
|
|
316
|
-
* How hard the model is asked to think
|
|
318
|
+
* How hard the model is asked to think for this participant; actor-level reasoningEffort is the default.
|
|
317
319
|
*
|
|
318
320
|
* The single-run control: same persona, same mission, two efforts, one set of conditions.
|
|
319
321
|
*/
|
|
320
322
|
reasoningEffort?: ReasoningEffort;
|
|
321
323
|
/**
|
|
322
|
-
* App-url computer-use
|
|
324
|
+
* App-url computer-use only: absolute browser URL this participant opens instead of `subject.appUrl`.
|
|
323
325
|
* This is the generic setup-produced-target handoff for crawler/swarm labs: product adapters may
|
|
324
|
-
* start any topology they need, then hand humanish explicit
|
|
326
|
+
* start any topology they need, then hand humanish explicit participant targets. Public/non-loopback
|
|
325
327
|
* targets still require `policies.allowPublicTargets: true`. Inert/rejected on clone, local-app,
|
|
326
328
|
* shared-world, scripted-browser, and terminal routes.
|
|
327
329
|
*/
|
|
328
330
|
target?: string;
|
|
329
331
|
/**
|
|
330
|
-
* Shared-world
|
|
331
|
-
* `subject.serve.url
|
|
332
|
-
* `serve.url + entry`. Validated at parse
|
|
333
|
-
* non-shared-world route (the per-lane-worlds fan-out roster has no per-
|
|
332
|
+
* Shared-world only: this participant's loopback entry route, resolved against
|
|
333
|
+
* `subject.serve.url`. It must be same-origin (loopback) with it, and the participant opens
|
|
334
|
+
* `serve.url + entry`. Validated at parse and re-enforced in the engine. Inert/warned on every
|
|
335
|
+
* non-shared-world route (the per-lane-worlds fan-out roster has no per-participant entry).
|
|
334
336
|
*/
|
|
335
337
|
entry?: string;
|
|
336
338
|
/**
|
|
337
|
-
*
|
|
338
|
-
* creates the shared session (e.g. a multiplayer lobby) that the
|
|
339
|
-
*
|
|
340
|
-
* The orchestrator watches the host
|
|
339
|
+
* External-public shared-world only: marks this participant as the host. It
|
|
340
|
+
* creates the shared session (e.g. a multiplayer lobby) that the followers then join. Exactly
|
|
341
|
+
* one participant in the roster may carry `host: true` (validated in externalPublicSharedWorldValidationReason).
|
|
342
|
+
* The orchestrator watches the host's observed URL for the shared-session code and threads it
|
|
341
343
|
* into the follower missions at a host-first barrier. Inert/warned on every other route.
|
|
342
344
|
*/
|
|
343
345
|
host?: boolean;
|
|
344
346
|
}
|
|
345
347
|
/**
|
|
346
|
-
* Compact authoring sugar for repeated
|
|
348
|
+
* Compact authoring sugar for repeated participant groups. The parser expands each group into concrete
|
|
347
349
|
* `lanes[]` with deterministic ids (`<group.id>-01`, `<group.id>-02`, ...). The runtime never
|
|
348
350
|
* consumes this shape directly; it always sees ordinary `LabActorLane` entries.
|
|
349
351
|
*/
|
|
350
352
|
export interface LabActorRosterGroup extends Omit<LabParticipantEntry, "id"> {
|
|
351
|
-
/** Public-safe group id; prefixes generated
|
|
353
|
+
/** Public-safe group id; prefixes generated participant ids. */
|
|
352
354
|
id: string;
|
|
353
|
-
/** Number of
|
|
355
|
+
/** Number of participants to generate for this group. */
|
|
354
356
|
count: number;
|
|
355
357
|
}
|
|
356
358
|
export interface LabActor {
|
|
357
359
|
/**
|
|
358
360
|
* The actor label. On computer-use (including shared-world), scripted-browser, and
|
|
359
|
-
* terminal-product routes this is a
|
|
361
|
+
* terminal-product routes this is a real dispatch key resolved against the closed first-party
|
|
360
362
|
* actor registry. On the synthetic route it remains a free-form descriptive label (e.g.
|
|
361
363
|
* synthetic-persona). The terminal route owns its live lifecycle after using
|
|
362
364
|
* the descriptor for dispatch and capability enforcement.
|
|
363
365
|
*/
|
|
364
366
|
type: string;
|
|
365
|
-
/**
|
|
367
|
+
/** Participant count, route-specific (see the scope header in config.ts): synthetic simCount; scripted
|
|
366
368
|
* surface roster {1 = desktop, 2 = desktop + mobile, default 1}; computer-use E2B route the
|
|
367
|
-
*
|
|
369
|
+
* homogeneous fan-out participant count (cap 16). XOR `lanes`. */
|
|
368
370
|
count?: number;
|
|
369
|
-
/** Computer-use E2B route: a
|
|
370
|
-
* `roster`, and `laneFocus`. Cap 16
|
|
371
|
+
/** Computer-use E2B route: a differentiated fan-out roster (`per-lane-worlds`). XOR `count`,
|
|
372
|
+
* `roster`, and `laneFocus`. Cap 16 participants. Consumed only on the cua E2B route
|
|
371
373
|
* (inert/warned elsewhere). */
|
|
372
374
|
lanes?: LabParticipantEntry[];
|
|
373
375
|
/** Persona id/label threaded into the actor prompt. Consumed on the app-url route. */
|
|
@@ -375,16 +377,17 @@ export interface LabActor {
|
|
|
375
377
|
/** Consumed on the app-url route (laneFocus.instruction appended to the mission). XOR `lanes`. */
|
|
376
378
|
laneFocus?: LabParticipantFocus;
|
|
377
379
|
/** Free-form mission threaded into the actor prompt. Consumed on the app-url route. A mission on
|
|
378
|
-
* its own is a complete, valid lab
|
|
380
|
+
* its own is a complete, valid lab; `tasks` is additive, never required. */
|
|
379
381
|
mission?: string;
|
|
380
382
|
/**
|
|
381
383
|
* The researcher's protocol: discrete tasks, each with what the participant is asked to do and
|
|
382
384
|
* (optionally) how the researcher measures it. Additive to `mission`, which stays the brief.
|
|
383
385
|
*
|
|
384
386
|
* The two halves belong to different people. `goal` reaches the participant's prompt; `success`
|
|
385
|
-
* never does
|
|
387
|
+
* never does. A moderator does not read the success criterion aloud, because telling someone how
|
|
386
388
|
* they will be judged changes what they do. See src/lab/tasks.ts.
|
|
387
|
-
* Supported only on the first actor of per-
|
|
389
|
+
* Supported only on the first actor of per-participant computer-use routes; other routes fail
|
|
390
|
+
* preflight.
|
|
388
391
|
*/
|
|
389
392
|
tasks?: LabTask[];
|
|
390
393
|
/** Provider model override. Consumed on the app-url route. */
|
|
@@ -392,35 +395,35 @@ export interface LabActor {
|
|
|
392
395
|
/** First-party OpenAI CUA only: per-response output limit including reasoning, not a dollar cap. */
|
|
393
396
|
maxOutputTokens?: number;
|
|
394
397
|
/**
|
|
395
|
-
* `local-agent`
|
|
398
|
+
* `local-agent` only: which locally signed-in coding agent is the brain. Absent = codex.
|
|
396
399
|
*
|
|
397
400
|
* A separate field from `model` on purpose. The first cut of this route overloaded `model` to
|
|
398
|
-
* mean
|
|
401
|
+
* mean both which CLI and which model, which left no way to say "Claude Code, running Opus":
|
|
399
402
|
* two different choices wearing one name.
|
|
400
403
|
*/
|
|
401
404
|
localAgent?: "codex" | "claude";
|
|
402
405
|
/**
|
|
403
|
-
* How hard the model is asked to think, per turn.
|
|
406
|
+
* How hard the model is asked to think, per turn. A `lanes[]` entry's `reasoningEffort` overrides this.
|
|
404
407
|
*
|
|
405
|
-
* Absent means the
|
|
408
|
+
* Absent means the provider's default, and absence is recorded as absence: a run that did not
|
|
406
409
|
* declare an effort does not claim one. Support is model-dependent (see src/actors/reasoning-effort.ts),
|
|
407
410
|
* so a level a model does not accept fails on the first turn rather than being downgraded.
|
|
408
411
|
*
|
|
409
|
-
* This is a recruiting decision
|
|
410
|
-
* way a persona prompt does. Two
|
|
411
|
-
* is therefore a
|
|
412
|
+
* This is a recruiting decision: it changes who the participant is, the same
|
|
413
|
+
* way a persona prompt does. Two participants running the same persona and mission at different efforts
|
|
414
|
+
* is therefore a contrast between two participants. It does not control for an instrument: a participant that
|
|
412
415
|
* abandons at one level and completes at another has reported on both of them. The obligation it
|
|
413
416
|
* creates is to declare and record, never to hold it constant. See
|
|
414
417
|
* docs/principles/actor-fidelity.md.
|
|
415
418
|
*/
|
|
416
419
|
reasoningEffort?: ReasoningEffort;
|
|
417
420
|
/**
|
|
418
|
-
* Deterministic completion guard used as the default for CUA
|
|
421
|
+
* Deterministic completion guard used as the default for CUA participants. A `lanes[]` entry's stopWhen
|
|
419
422
|
* overrides this value.
|
|
420
423
|
*/
|
|
421
424
|
stopWhen?: StopWhen;
|
|
422
425
|
/**
|
|
423
|
-
* A declared observation window
|
|
426
|
+
* A declared observation window, the default for every participant; a `lanes[]` entry's dwell overrides
|
|
424
427
|
* it. `when` is a stopWhen-shaped condition (absent: the window opens after the first
|
|
425
428
|
* observation); `ms` is the hold, `everyMs` the frame cadence (default 10 s), `then` whether
|
|
426
429
|
* the participant continues afterwards (default) or the session ends. The harness takes no
|
|
@@ -429,9 +432,9 @@ export interface LabActor {
|
|
|
429
432
|
dwell?: DwellWindow;
|
|
430
433
|
}
|
|
431
434
|
type LabExecutionTarget = "local" | "e2b-desktop" | "e2b-terminal";
|
|
432
|
-
/** Terminal transport: the captured non-interactive exec stream (stdin disabled).
|
|
433
|
-
* interactive duplex PTY
|
|
434
|
-
* mismatch
|
|
435
|
+
/** Terminal transport: the captured non-interactive exec stream (stdin disabled). It is not an
|
|
436
|
+
* interactive duplex PTY; labeling captured exec output "pty" would be a claim/mechanism
|
|
437
|
+
* mismatch, so this route uses "exec-stream". */
|
|
435
438
|
type LabTerminalTransport = "exec-stream";
|
|
436
439
|
/** Whether operator stdin reaches the in-sandbox agent. Disabled by default (the run is
|
|
437
440
|
* autonomous + comparable to an unassisted baseline). "planned" records intent but sends no
|
|
@@ -457,13 +460,13 @@ export interface LabExecutionDesktop {
|
|
|
457
460
|
* Named device preset (mobile / small-mobile / narrow-mobile / tablet / desktop / wide) the
|
|
458
461
|
* run renders at. Consumed on the computer-use route; default `desktop` (1440x950). On that
|
|
459
462
|
* route only width/height physically render (the X screen is sized to the preset, so
|
|
460
|
-
* width-based responsive CSS fires)
|
|
463
|
+
* width-based responsive CSS fires). Touch/DPR/UA are sim-parity prompt signals and do not render.
|
|
461
464
|
*/
|
|
462
465
|
device?: string;
|
|
463
|
-
/** Raw hosted screen resolution [width, height]
|
|
466
|
+
/** Raw hosted screen resolution [width, height]: an escape hatch that overrides `device`. */
|
|
464
467
|
resolution?: [number, number];
|
|
465
468
|
/**
|
|
466
|
-
* Browser family to launch for hosted desktop
|
|
469
|
+
* Browser family to launch for hosted desktop participants. Absent/default preserves the
|
|
467
470
|
* historical desktop opener behavior. A concrete value means "launch this browser or fail"
|
|
468
471
|
* instead of silently accepting the template's default URL opener.
|
|
469
472
|
*/
|
|
@@ -471,10 +474,10 @@ export interface LabExecutionDesktop {
|
|
|
471
474
|
/** Sandbox server-side timeout. Consumed on the app-url route. */
|
|
472
475
|
sandboxTimeoutMs?: number;
|
|
473
476
|
/**
|
|
474
|
-
* Custom E2B desktop
|
|
477
|
+
* Custom E2B desktop template (image) the run launches on, given as a non-empty template name or ID,
|
|
475
478
|
* instead of the stock `desktop` template. Lets a subject that needs runtimes the stock image
|
|
476
479
|
* lacks (e.g. node/bun/a local Postgres baked into an adopter-maintained image) run as-is. Any
|
|
477
|
-
* string is a valid template name/id (there is no allowlist). Consumed
|
|
480
|
+
* string is a valid template name/id (there is no allowlist). Consumed only on the
|
|
478
481
|
* `execution.target: e2b-desktop` computer-use routes (the cua/shared-world/concurrent backends
|
|
479
482
|
* that call `Sandbox.create`) and the clone scripted-browser route; inert/warned on every route
|
|
480
483
|
* that creates no desktop. Threaded to
|
|
@@ -485,19 +488,19 @@ export interface LabExecutionDesktop {
|
|
|
485
488
|
/** Use the Codex app-server client mode for headed desktop actor surfaces. Consumed (meta). */
|
|
486
489
|
codexAppServer?: boolean;
|
|
487
490
|
/**
|
|
488
|
-
* Mobile fidelity beyond viewport size
|
|
489
|
-
* Chromium computer-use
|
|
491
|
+
* Mobile fidelity beyond viewport size. With `mobileEmulation: true`, every hosted
|
|
492
|
+
* Chromium computer-use participant on a mobile preset (mobile / small-mobile / narrow-mobile) gets
|
|
490
493
|
* CDP device emulation applied to its launch page before the participant arrives; desktop,
|
|
491
|
-
* tablet and wide
|
|
494
|
+
* tablet and wide participants in the same run are untouched and carry no fidelity block. Applied: the participant's device preset width/height as the CSS viewport, the preset's
|
|
492
495
|
* device pixel ratio (or `deviceScaleFactor`), touch events (`touch`, default true) and a mobile
|
|
493
496
|
* user agent (`userAgent`, default an iPhone Safari string). The bundle records what the page
|
|
494
497
|
* then reported about itself under `desktopGeometry.fidelity`; a browser that cannot be
|
|
495
|
-
* emulated (Firefox) fails the
|
|
498
|
+
* emulated (Firefox) fails the participant closed instead of shipping a desktop run labelled mobile.
|
|
496
499
|
* A held CDP session also applies the overrides to later page targets. Their first observed
|
|
497
500
|
* viewport and touch read-back is recorded separately; missing or different values warn.
|
|
498
501
|
*/
|
|
499
502
|
fidelity?: LabDesktopFidelity;
|
|
500
|
-
/** Synthetic media devices behind the browser's own permission prompt
|
|
503
|
+
/** Synthetic media devices behind the browser's own permission prompt. */
|
|
501
504
|
media?: LabDesktopMedia;
|
|
502
505
|
/** Optional retained screen video. Capture is independent of participant media input. */
|
|
503
506
|
recording?: {
|
|
@@ -505,7 +508,7 @@ export interface LabExecutionDesktop {
|
|
|
505
508
|
};
|
|
506
509
|
}
|
|
507
510
|
/**
|
|
508
|
-
* A participant with a camera
|
|
511
|
+
* A participant with a camera: a property of the environment, like the screen preset and
|
|
509
512
|
* the browser, never support for any conferencing product. `camera.source: synthetic` generates
|
|
510
513
|
* a test pattern in the sandbox with the image's own ffmpeg; a `.y4m` path on the host is
|
|
511
514
|
* uploaded instead on hosted desktops. `microphone.source: speech` enables the participant's
|
|
@@ -532,25 +535,26 @@ export interface LabExecution {
|
|
|
532
535
|
target?: LabExecutionTarget;
|
|
533
536
|
/** Actor session wall-clock budget. Consumed on the app-url route. */
|
|
534
537
|
timeoutMs?: number;
|
|
535
|
-
/**
|
|
538
|
+
/** Forward-declared: no route reads it yet, so a set value warns. */
|
|
536
539
|
completionTimeoutMs?: number;
|
|
537
540
|
/**
|
|
538
|
-
* Bounds in-flight fan-out
|
|
541
|
+
* Bounds in-flight fan-out participants on the computer-use route. Shared-world needs at least 2 and
|
|
539
542
|
* defaults to the participant count. Inert (warned) elsewhere.
|
|
540
543
|
*/
|
|
541
544
|
concurrency?: number;
|
|
542
545
|
desktop?: LabExecutionDesktop;
|
|
543
546
|
/**
|
|
544
|
-
* Blast-radius budget for
|
|
545
|
-
* set, is a
|
|
546
|
-
* it (the runaway-retry guard), and a cap on a model src/run/pricing.ts
|
|
547
|
-
* preflight rather than run uncapped. It is a
|
|
548
|
-
* an N-
|
|
549
|
-
*
|
|
550
|
-
*
|
|
551
|
-
* historical CUA behavior); maxUsd: 0
|
|
552
|
-
*
|
|
553
|
-
* `scenario.caps` (not a
|
|
547
|
+
* Blast-radius budget for each computer-use participant. Consumed on the computer-use route:
|
|
548
|
+
* `caps.maxUsd`, when set, is a fail-closed abort: the session stops the moment its running
|
|
549
|
+
* estimated spend crosses it (the runaway-retry guard), and a cap on a model src/run/pricing.ts
|
|
550
|
+
* cannot price is refused at preflight rather than run uncapped. It is a per-participant cap:
|
|
551
|
+
* enforced inside each participant's loop, so an N-participant fan-out can spend up to N × maxUsd
|
|
552
|
+
* before any participant aborts (the run warns with the true ~N × cap ceiling).
|
|
553
|
+
* `caps.maxTotalUsd` is the shared study budget: one ledger across every participant, the knob a
|
|
554
|
+
* researcher actually reasons with. Absent = uncapped (the historical CUA behavior); maxUsd: 0
|
|
555
|
+
* still permits a request before reported usage trips it. Inert (warned) on non-computer-use
|
|
556
|
+
* routes. Reuses the same LabScenarioCaps shape as the terminal route's `scenario.caps` (not a
|
|
557
|
+
* fork).
|
|
554
558
|
*/
|
|
555
559
|
caps?: LabScenarioCaps;
|
|
556
560
|
/** `terminal-product` route: the terminal transport + stdin posture. Consumed on that route. */
|
|
@@ -565,14 +569,14 @@ export interface LabExecution {
|
|
|
565
569
|
/**
|
|
566
570
|
* `terminal-product` route: outbound routing allowlist passed to E2B with a deny-all fallback.
|
|
567
571
|
* Domain filtering is a routing control, not strict destination isolation on shared hosting.
|
|
568
|
-
* It does not constrain spending through an allowed runtime provider
|
|
572
|
+
* It does not constrain spending through an allowed runtime provider, including when
|
|
569
573
|
* openai-egress keeps the raw runtime key outside the sandbox.
|
|
570
574
|
*
|
|
571
575
|
* Absent means unrestricted, which is the historical behavior and stays the default, because a
|
|
572
576
|
* wrong host list fails studies in ways that look like product bugs. Opt in per lab.
|
|
573
577
|
*
|
|
574
578
|
* Domain filtering covers HTTP on :80 (Host header) and TLS on :443 (SNI); anything else needs
|
|
575
|
-
* an IP or CIDR. `*.example.com` matches subdomains at any depth and
|
|
579
|
+
* an IP or CIDR. `*.example.com` matches subdomains at any depth and not the apex, which needs
|
|
576
580
|
* its own entry.
|
|
577
581
|
*/
|
|
578
582
|
egressAllow?: string[];
|
|
@@ -584,20 +588,20 @@ type LabScenarioMode = "dry-run" | "live";
|
|
|
584
588
|
* All values are non-negative numbers (0 is the no-spend default). Live runs require maxUsd and a
|
|
585
589
|
* positive maxMinutes; maxUsd/maxJobs are checked after the session against known ledger signals
|
|
586
590
|
* and maxMinutes is enforced as the command wall clock. Codex tokens are unpriced, so a live run
|
|
587
|
-
* refuses a positive maxUsd unless a costProbe measures spend (
|
|
591
|
+
* refuses a positive maxUsd unless a costProbe measures spend (HUMANISH_TERMINAL_UNPRICED_CAP).
|
|
588
592
|
*/
|
|
589
593
|
export interface LabScenarioCaps {
|
|
590
594
|
/** Max USD the run may spend (provider + product). 0 = no-spend. */
|
|
591
595
|
maxUsd?: number;
|
|
592
596
|
/**
|
|
593
|
-
*
|
|
594
|
-
* study is N participants, roughly $X"
|
|
595
|
-
* made. The computer-use route reads it from `execution.caps.maxTotalUsd` only: every
|
|
596
|
-
* running
|
|
597
|
-
* this, each
|
|
597
|
+
* study-level model-spend budget, the number a researcher actually reasons with: "this
|
|
598
|
+
* study is N participants, roughly $X", decided once, up front, where recruiting decisions are
|
|
599
|
+
* made. The computer-use route reads it from `execution.caps.maxTotalUsd` only: every participant's
|
|
600
|
+
* running estimated model spend feeds one shared ledger, and the moment the run total crosses
|
|
601
|
+
* this, each participant stops at its next turn with `budget_reached` (status `incomplete`:
|
|
598
602
|
* the participant ran out of budget; never `gave_up`, because a study-level stop is not the
|
|
599
|
-
* participant's doing). Estimated
|
|
600
|
-
* not this ledger. Independent of the per-
|
|
603
|
+
* participant's doing). Estimated model spend only; desktop-minutes ride the cost summary but
|
|
604
|
+
* not this ledger. Independent of the per-participant `maxUsd` backstop; either, both, or neither may
|
|
601
605
|
* be set. A positive `scenario.caps.maxTotalUsd` on a computer-use lab is a parse error; on the
|
|
602
606
|
* terminal route it is inert (warned), since the single agent's maxUsd already caps the run.
|
|
603
607
|
*/
|
|
@@ -608,12 +612,12 @@ export interface LabScenarioCaps {
|
|
|
608
612
|
maxMinutes?: number;
|
|
609
613
|
}
|
|
610
614
|
export interface LabScenario {
|
|
611
|
-
/** Reference a committed scenario by id (humanish/scenarios/<ref>.yaml) or path.
|
|
612
|
-
* (and
|
|
615
|
+
/** Reference a committed scenario by id (humanish/scenarios/<ref>.yaml) or path. Consumed
|
|
616
|
+
* (and required) on the scripted-browser route; forward-declared elsewhere. */
|
|
613
617
|
ref?: string;
|
|
614
|
-
/** Or inline the scenario body.
|
|
618
|
+
/** Or inline the scenario body. Forward-declared: no route reads it yet, so a set value warns. */
|
|
615
619
|
inline?: Record<string, unknown>;
|
|
616
|
-
/** dry-run =
|
|
620
|
+
/** dry-run = a synthetic bundle with no provider spend; live = real run. Consumed. */
|
|
617
621
|
mode?: LabScenarioMode;
|
|
618
622
|
/** Spend/job/time caps. Consumed (recorded in the bundle) on the terminal-product route;
|
|
619
623
|
* inert (warned) elsewhere. */
|
|
@@ -622,14 +626,14 @@ export interface LabScenario {
|
|
|
622
626
|
export interface LabPolicies {
|
|
623
627
|
/**
|
|
624
628
|
* Redact target repo labels in durable artifacts. Consumed on the computer-use,
|
|
625
|
-
* scripted-browser and shared-world clone routes (provenance), where it
|
|
629
|
+
* scripted-browser and shared-world clone routes (provenance), where it defaults to true when
|
|
626
630
|
* the clone authenticates via GITHUB_TOKEN (a token-bearing clone is treated as private until
|
|
627
631
|
* declared otherwise).
|
|
628
632
|
*/
|
|
629
633
|
redactRepos?: boolean;
|
|
630
634
|
/**
|
|
631
|
-
* Blur+downscale persisted screenshots on the computer-use route. Default
|
|
632
|
-
* case is watching a sim of your
|
|
635
|
+
* Blur+downscale persisted screenshots on the computer-use route. Default `false`; the common
|
|
636
|
+
* case is watching a sim of your own app locally (gitignored .humanish), where full fidelity is
|
|
633
637
|
* the deliverable. Set true for unowned subjects or bundles meant to be shared as-is. The
|
|
634
638
|
* provider always sees raw frames; this only governs what is persisted. Raw bundles stay
|
|
635
639
|
* local (gitignored, commit-scan-guarded); a redact-on-export step for them is planned.
|
|
@@ -637,12 +641,12 @@ export interface LabPolicies {
|
|
|
637
641
|
redactScreenshots?: boolean;
|
|
638
642
|
/**
|
|
639
643
|
* Allow an app-url subject to point at a non-loopback (public/preview/staging) URL the lab
|
|
640
|
-
* owner declares. Default
|
|
641
|
-
* the owner declared"
|
|
644
|
+
* owner declares. Default `false` (loopback-only). The invariant is "the actor drives a target
|
|
645
|
+
* the owner declared"; setting this is that declaration (e.g. a Vercel preview of your app).
|
|
642
646
|
*/
|
|
643
647
|
allowPublicTargets?: boolean;
|
|
644
648
|
/**
|
|
645
|
-
* How the browser's camera/microphone permission is answered
|
|
649
|
+
* How the browser's camera/microphone permission is answered. `prompt` (default): the
|
|
646
650
|
* participant meets Chrome's real dialog and answers it, which is where a real person hesitates
|
|
647
651
|
* or refuses. `granted`: the dialog is bypassed (`--use-fake-ui-for-media-stream`, which Chrome
|
|
648
652
|
* marks with an "unsupported command-line flag" banner), for studies about what happens after
|
|
@@ -661,17 +665,17 @@ export interface LabPolicies {
|
|
|
661
665
|
export interface LabReview {
|
|
662
666
|
/** Analysis defaults on for eligible live recordings; false disables the separate request. */
|
|
663
667
|
analysis?: LabAnalysis | false;
|
|
664
|
-
/**
|
|
668
|
+
/** Forward-declared: no route reads it yet, so a set value warns. */
|
|
665
669
|
scoring?: string;
|
|
666
|
-
/**
|
|
670
|
+
/** Forward-declared: no route reads it yet, so a set value warns. */
|
|
667
671
|
milestones?: string;
|
|
668
|
-
/**
|
|
672
|
+
/** Forward-declared: no route reads it yet, so a set value warns. */
|
|
669
673
|
vocabulary?: string;
|
|
670
674
|
/**
|
|
671
|
-
*
|
|
672
|
-
* exports any of `{score, deriveFeedback, deriveArtifacts}`.
|
|
675
|
+
* Code escape hatch: a repo-relative path to an adopter scorer module (.mjs recommended) that
|
|
676
|
+
* exports any of `{score, deriveFeedback, deriveArtifacts}`. Consumed on the scorer-capable routes
|
|
673
677
|
* (terminal / computer-use / shared-world); loaded fail-closed (typed error, pre-spend). The entry
|
|
674
|
-
* is executable code
|
|
678
|
+
* is executable code: review a PR that adds one as code.
|
|
675
679
|
*/
|
|
676
680
|
scorer?: {
|
|
677
681
|
ref: string;
|
|
@@ -680,7 +684,7 @@ export interface LabReview {
|
|
|
680
684
|
export interface LabDefaults {
|
|
681
685
|
open?: boolean;
|
|
682
686
|
}
|
|
683
|
-
/** Off-app comms (email/SMS the persona lives in) the harness provides for the run
|
|
687
|
+
/** Off-app comms (email/SMS the persona lives in) the harness provides for the run. */
|
|
684
688
|
export interface LabComms {
|
|
685
689
|
email?: LabCommsEmail;
|
|
686
690
|
}
|
|
@@ -716,15 +720,15 @@ interface LabCommsCaptureEmail {
|
|
|
716
720
|
connection?: never;
|
|
717
721
|
allowedOrigins?: never;
|
|
718
722
|
/** Which implementation backs the inbox (a backend discriminator, distinct from `scenario.mode`):
|
|
719
|
-
* `fake` (default) is an in-harness in-memory inbox in the Fowler test-double sense
|
|
723
|
+
* `fake` (default) is an in-harness in-memory inbox in the Fowler test-double sense: an in-sandbox
|
|
720
724
|
* catch captures the app's sends. Provider-backed receiving uses the separate
|
|
721
725
|
* LabCommsReceivingEmail configuration selected by a saved connection. */
|
|
722
726
|
kind: "fake";
|
|
723
727
|
/**
|
|
724
|
-
* The subject-env var the harness sets to the in-sandbox catch's base URL
|
|
728
|
+
* The subject-env var the harness sets to the in-sandbox catch's base URL. The adopter names it (an app
|
|
725
729
|
* calling Resend's API directly reads `RESEND_API_URL`; an app using the SDK reads `RESEND_BASE_URL`).
|
|
726
|
-
* The value is computed by the harness (a loopback URL), so it is
|
|
727
|
-
*
|
|
730
|
+
* The value is computed by the harness (a loopback URL), so it is not declared in `subject.env`.
|
|
731
|
+
* Required on the provisioned routes; absent (and meaningless) when `external` is declared,
|
|
728
732
|
* because there the adopter runs the catch and points their own app at it.
|
|
729
733
|
*/
|
|
730
734
|
injectEnv?: string;
|
|
@@ -736,7 +740,7 @@ interface LabCommsCaptureEmail {
|
|
|
736
740
|
* into the same captured-send shape the HTTP path produces, so the inbox surface, the drain, and
|
|
737
741
|
* the evidence artifact are identical either way.
|
|
738
742
|
*
|
|
739
|
-
* `hostEnv` and `portEnv` are
|
|
743
|
+
* `hostEnv` and `portEnv` are adopter-named, exactly like `injectEnv`: the harness sets them to
|
|
740
744
|
* its own loopback and the chosen port. Declare the pair your app actually reads.
|
|
741
745
|
*/
|
|
742
746
|
smtp?: LabCommsSmtp;
|
|
@@ -746,19 +750,20 @@ interface LabCommsCaptureEmail {
|
|
|
746
750
|
* prepended to the inbox link-origin rewrite so the persona's clicked link resolves to a reachable
|
|
747
751
|
* host. Omit when the app emits loopback links (the default derivation covers those). */
|
|
748
752
|
linkOrigin?: string;
|
|
749
|
-
/** Each
|
|
753
|
+
/** Each participant's inbox address: the actor is told to sign up with it (the injected inbox
|
|
750
754
|
* instruction carries it) and the teardown drain matches captured mail against it. Omit the
|
|
751
|
-
* whole list and the parser fills one deterministic address per
|
|
752
|
-
* so every
|
|
753
|
-
* does not exist is a hard parse error (a mismatch silently disables the funnel for that
|
|
754
|
-
* zero covered
|
|
755
|
-
* entry without `address` is legal but inert for the funnel
|
|
756
|
-
* and its
|
|
755
|
+
* whole list and the parser fills one deterministic address per participant (`<laneId>@example.test`)
|
|
756
|
+
* so every participant can do email out of the box. When declared: a `lane` naming a participant
|
|
757
|
+
* that does not exist is a hard parse error (a mismatch silently disables the funnel for that
|
|
758
|
+
* participant), zero covered participants is a hard error, and partial coverage warns with the
|
|
759
|
+
* uncovered ones. An entry without `address` is legal but inert for the funnel: the drain does
|
|
760
|
+
* not match it, and its participant gets no inbox instruction; captured mail to an undeclared
|
|
761
|
+
* address is warned,
|
|
757
762
|
* never silently dropped. */
|
|
758
763
|
recipients?: LabCommsRecipient[];
|
|
759
764
|
/**
|
|
760
|
-
*
|
|
761
|
-
* themselves, so humanish neither provisions the subject nor injects `injectEnv
|
|
765
|
+
* adopter-hosted ingress. Declaring this says: the operator runs the catch and the inbox
|
|
766
|
+
* themselves, so humanish neither provisions the subject nor injects `injectEnv`. It points the
|
|
762
767
|
* persona at the declared inbox, drains the declared catch over HTTP at teardown, and writes the
|
|
763
768
|
* same digest-only evidence. This is what makes comms work on the app-url / operator-provisioned
|
|
764
769
|
* plane, where humanish holds no sandbox handle to host a catch in and the block was previously
|
|
@@ -771,25 +776,26 @@ export interface LabCommsExternal {
|
|
|
771
776
|
catchBaseUrl: string;
|
|
772
777
|
/** Where the persona opens its inbox. Defaults to catchBaseUrl (one server serves both). */
|
|
773
778
|
inboxBaseUrl?: string;
|
|
774
|
-
/** Env var
|
|
779
|
+
/** Env var name holding the bearer token for the drain read. The name is recorded as evidence;
|
|
775
780
|
* the value is read at runtime and never persisted (the credential-boundary discipline). */
|
|
776
781
|
authTokenEnv?: string;
|
|
777
782
|
}
|
|
778
783
|
export interface LabCommsRecipient {
|
|
779
784
|
lane: string;
|
|
780
|
-
/** The literal address the app sends to
|
|
785
|
+
/** The literal address the app sends to, which the evidence drain matches. Omit to reserve the participant
|
|
781
786
|
* for the persona surface's default address (not drain-matched). */
|
|
782
787
|
address?: string;
|
|
783
788
|
}
|
|
784
789
|
export interface LabConfig {
|
|
785
|
-
|
|
790
|
+
/** The format the file was written in. Both parse into this one shape. */
|
|
791
|
+
schema: typeof LAB_CONFIG_SCHEMA | typeof STUDY_SCHEMA;
|
|
786
792
|
id: string;
|
|
787
793
|
title?: string;
|
|
788
794
|
description?: string;
|
|
789
795
|
subject: LabSubject;
|
|
790
796
|
actors: LabActor[];
|
|
791
797
|
execution?: LabExecution;
|
|
792
|
-
/**
|
|
798
|
+
/** Forward-declared: no route reads it yet, so a set value warns. */
|
|
793
799
|
personas?: Record<string, unknown>[];
|
|
794
800
|
scenario?: LabScenario;
|
|
795
801
|
policies?: LabPolicies;
|
|
@@ -805,7 +811,7 @@ interface LabConfigParseSuccess {
|
|
|
805
811
|
export interface LabConfigParseFailure {
|
|
806
812
|
ok: false;
|
|
807
813
|
error: {
|
|
808
|
-
code: "
|
|
814
|
+
code: "HUMANISH_STUDY_INVALID";
|
|
809
815
|
message: string;
|
|
810
816
|
};
|
|
811
817
|
}
|