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
|
@@ -5,7 +5,7 @@ import { participantAssignment } from "../../lab/participant-assignment.js";
|
|
|
5
5
|
import { participantEvent, participantRecord, participantStream, } from "../../run/participant-records.js";
|
|
6
6
|
import { declaredScreenForRender } from "../../substrates/e2b/desktop-geometry.js";
|
|
7
7
|
import { publicSafeRouteLabel } from "./provenance.js";
|
|
8
|
-
import { participantTaxonomyLabel } from "./
|
|
8
|
+
import { participantTaxonomyLabel } from "./participant-specs.js";
|
|
9
9
|
function participantView(ctx, spec, index) {
|
|
10
10
|
const { args, external, inProgress } = ctx;
|
|
11
11
|
const taxonomy = participantTaxonomyLabel(spec.planned.labels);
|
|
@@ -14,7 +14,8 @@ function participantView(ctx, spec, index) {
|
|
|
14
14
|
const session = outcome?.session;
|
|
15
15
|
const screenshots = outcome?.screenshots ?? [];
|
|
16
16
|
const lastScreenshot = screenshots[screenshots.length - 1];
|
|
17
|
-
// public-safe (origin redacted): external-public
|
|
17
|
+
// public-safe (origin redacted): external-public participants open the public plane; getHost
|
|
18
|
+
// participants open their own path.
|
|
18
19
|
const route = external
|
|
19
20
|
? "[external-public-plane]"
|
|
20
21
|
: publicSafeRouteLabel(args.plan.plane.participants[index]?.entry);
|
|
@@ -29,10 +30,10 @@ function participantView(ctx, spec, index) {
|
|
|
29
30
|
outcome?.sessionError ??
|
|
30
31
|
(inProgress
|
|
31
32
|
? "Actor desktop is running; the attached Observer hydrates the runtime stream URL without persisting it."
|
|
32
|
-
: "
|
|
33
|
+
: "Dry run: the evidence shape was written without launching a desktop or spending provider tokens.");
|
|
33
34
|
const traceScreenshotMode = session?.trace.redaction.screenshots;
|
|
34
|
-
// Include `declared` on the no-outcome fallback too (dry-run, skipped
|
|
35
|
-
//
|
|
35
|
+
// Include `declared` on the no-outcome fallback too (dry-run, skipped participant): otherwise an
|
|
36
|
+
// absent `declared` means either "the preset rendered faithfully" or "there was no live
|
|
36
37
|
// outcome", and a dry-run bundle keeps the self-confirming shape this field exists to kill.
|
|
37
38
|
const fallbackDeclared = declaredScreenForRender(spec.planned.device.preset, spec.planned.device.name, spec.planned.device.resolution);
|
|
38
39
|
const desktopGeometry = outcome?.desktopGeometry ?? {
|
|
@@ -79,9 +80,9 @@ function sharedWorldSimulation(ctx, spec, index, view) {
|
|
|
79
80
|
? `Persona ${spec.planned.id}${taxonomy} failed before a terminal session verdict: ${outcome.sessionError}`
|
|
80
81
|
: inProgress
|
|
81
82
|
? `Persona ${spec.planned.id}${taxonomy} (${spec.persona.id}) is running against the shared plane.`
|
|
82
|
-
: `
|
|
83
|
-
startedAt: args.createdAt,
|
|
84
|
-
updatedAt: args.createdAt,
|
|
83
|
+
: `Persona ${spec.planned.id}${taxonomy} (${spec.persona.id}) for ${args.descriptor.id} against the shared plane at ${ctx.appUrl}; no session ran.`,
|
|
84
|
+
startedAt: args.run.createdAt,
|
|
85
|
+
updatedAt: args.run.createdAt,
|
|
85
86
|
});
|
|
86
87
|
}
|
|
87
88
|
function sharedWorldStream(ctx, spec, index, view) {
|
|
@@ -92,10 +93,10 @@ function sharedWorldStream(ctx, spec, index, view) {
|
|
|
92
93
|
? {}
|
|
93
94
|
: { assignment: participantAssignment(spec.evidenceAssignment) }),
|
|
94
95
|
kind: "browser",
|
|
95
|
-
label: `Concurrent persona ${spec.planned.id}${taxonomy}
|
|
96
|
+
label: `Concurrent persona ${spec.planned.id}${taxonomy} · ${args.plan.labId}`,
|
|
96
97
|
status: view.status,
|
|
97
98
|
transport: "snapshot",
|
|
98
|
-
updatedAt: args.createdAt,
|
|
99
|
+
updatedAt: args.run.createdAt,
|
|
99
100
|
embed: lastScreenshot
|
|
100
101
|
? {
|
|
101
102
|
kind: "screenshot",
|
|
@@ -116,7 +117,7 @@ function sharedWorldStream(ctx, spec, index, view) {
|
|
|
116
117
|
desktopGeometry,
|
|
117
118
|
ui: {
|
|
118
119
|
route: view.route,
|
|
119
|
-
intent: `Watch persona ${spec.planned.id}${taxonomy} (${spec.persona.id})
|
|
120
|
+
intent: `Watch persona ${spec.planned.id}${taxonomy} (${spec.persona.id}) use the shared app at the same time as the other personas.`,
|
|
120
121
|
state: view.reason,
|
|
121
122
|
...(session ? { actorStatus: session.status } : {}),
|
|
122
123
|
...(lastScreenshot ? { screenshotUrl: lastScreenshot } : {}),
|
|
@@ -135,9 +136,9 @@ function sharedWorldStream(ctx, spec, index, view) {
|
|
|
135
136
|
},
|
|
136
137
|
]
|
|
137
138
|
: []),
|
|
138
|
-
// Run-level comms evidence belongs to the
|
|
139
|
+
// Run-level comms evidence belongs to the one shared app, and to no persona: register it once, on
|
|
139
140
|
// the first stream, so the bundle's existence-verify + public-safety scan cover it without
|
|
140
|
-
// double-counting across
|
|
141
|
+
// double-counting across participants.
|
|
141
142
|
...(index === 0 && args.commsArtifactPath
|
|
142
143
|
? [{ label: "comms thread", path: args.commsArtifactPath, kind: "log" }]
|
|
143
144
|
: []),
|
|
@@ -151,7 +152,7 @@ function sharedWorldStream(ctx, spec, index, view) {
|
|
|
151
152
|
}
|
|
152
153
|
function sharedWorldEvents(ctx, spec, view) {
|
|
153
154
|
const { args, inProgress, nextEventId } = ctx;
|
|
154
|
-
const createdAt = args.createdAt;
|
|
155
|
+
const createdAt = args.run.createdAt;
|
|
155
156
|
const { outcome, session } = view;
|
|
156
157
|
const events = [];
|
|
157
158
|
const record = (event) => events.push(participantEvent(spec, event));
|
|
@@ -170,7 +171,7 @@ function sharedWorldEvents(ctx, spec, view) {
|
|
|
170
171
|
at: createdAt,
|
|
171
172
|
level: session.status === "passed" ? "info" : "warn",
|
|
172
173
|
type: `concurrent-shared-world.session.${session.completionReason}`,
|
|
173
|
-
message: `Persona ${spec.planned.id}: ${session.status}
|
|
174
|
+
message: `Persona ${spec.planned.id}: ${session.status} (${session.reason})`,
|
|
174
175
|
});
|
|
175
176
|
}
|
|
176
177
|
else if (outcome?.sessionError !== undefined) {
|
|
@@ -197,7 +198,7 @@ function sharedWorldEvents(ctx, spec, view) {
|
|
|
197
198
|
at: createdAt,
|
|
198
199
|
level: "info",
|
|
199
200
|
type: "concurrent-shared-world.contract.ready",
|
|
200
|
-
message: `Persona ${spec.planned.id}: dry-run
|
|
201
|
+
message: `Persona ${spec.planned.id}: dry-run actor ready; switch scenario.mode to live for a real concurrent session.`,
|
|
201
202
|
});
|
|
202
203
|
}
|
|
203
204
|
return events;
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import { type RunBundle } from "../../run/bundle.js";
|
|
2
2
|
import { type SharedWorldJudgment } from "../../run/judge.js";
|
|
3
3
|
import { type ActorRunResult, type ConcurrentBundleArgs } from "./types.js";
|
|
4
|
-
/** Max windows live at the same instant (sweep over start/end points). The
|
|
5
|
-
* count:
|
|
4
|
+
/** Max windows live at the same instant (sweep over start/end points). The simultaneity
|
|
5
|
+
* count: the participant count says how many existed; this says how many ever ran at once. */
|
|
6
6
|
export declare function maxSimultaneousWindows(windows: Array<{
|
|
7
7
|
startedAt: number;
|
|
8
8
|
endedAt: number;
|
|
9
9
|
}>): number;
|
|
10
10
|
/**
|
|
11
|
-
* The judgment for a shared-world bundle's inputs: how each
|
|
12
|
-
* about its world: overlap, a state change under overlap on the provisioned plane, and
|
|
13
|
-
* convergence on the external-public plane. The bundle's verdict and the
|
|
14
|
-
* it.
|
|
11
|
+
* The judgment for a shared-world bundle's inputs: how each participant ended, plus what the run
|
|
12
|
+
* observed about its world: overlap, a state change under overlap on the provisioned plane, and
|
|
13
|
+
* lobby convergence on the external-public plane. The bundle's verdict and the study result's ok
|
|
14
|
+
* both read it.
|
|
15
15
|
*/
|
|
16
16
|
export declare function judgeSharedWorldRun(args: Omit<ConcurrentBundleArgs, "judgment">): SharedWorldJudgment;
|
|
17
17
|
export declare function actorRunPassed(result: ActorRunResult | undefined): boolean;
|
|
18
|
-
/** Project the concurrent run into a humanish.run-bundle.v1 with the
|
|
18
|
+
/** Project the concurrent run into a humanish.run-bundle.v1 with the concurrent shared-world block. */
|
|
19
19
|
export declare function buildConcurrentSharedWorldBundle(args: ConcurrentBundleArgs): RunBundle;
|
|
20
20
|
export declare function renderConcurrentReviewMarkdown(bundle: RunBundle): string;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Builds the run bundle for a concurrent shared-world run: per-
|
|
1
|
+
// Builds the run bundle for a concurrent shared-world run: per-participant simulations, streams and
|
|
2
2
|
// events, the sharedWorld evidence block and the review summary.
|
|
3
3
|
import { receivingPublication } from "../../comms/receiving-runtime.js";
|
|
4
4
|
import { redactText } from "../../evidence/redaction.js";
|
|
@@ -8,14 +8,14 @@ import { SHARED_WORLD_SCHEMA, concurrencyFacts, sharedWorldParticipantKeys, } fr
|
|
|
8
8
|
import { commandDigestOf } from "../../subject/state.js";
|
|
9
9
|
import { buildRunCostSummary, desktopSpanToMinutes } from "../../run/cost-summary.js";
|
|
10
10
|
import { participantFactsOf } from "../computer-use/participant-facts.js";
|
|
11
|
-
import { judgeSharedWorld, participantPassed, sharedWorldShortfall, } from "../../run/judge.js";
|
|
11
|
+
import { judgeSharedWorld, participantPassed, sharedWorldShortfall, verdictText, } from "../../run/judge.js";
|
|
12
12
|
import { combineCheckpointDigest } from "./checkpoints.js";
|
|
13
13
|
import { hostOriginDigest } from "./provenance.js";
|
|
14
14
|
import { participantEvent, participantIds } from "../../run/participant-records.js";
|
|
15
|
-
import { sharedWorldParticipantRecords } from "./
|
|
15
|
+
import { sharedWorldParticipantRecords } from "./bundle-records.js";
|
|
16
16
|
import { CONCURRENT_ATTRIBUTION_LIMITS, EXTERNAL_PUBLIC_ATTRIBUTION_LIMITS, } from "./types.js";
|
|
17
|
-
/** Max windows live at the same instant (sweep over start/end points). The
|
|
18
|
-
* count:
|
|
17
|
+
/** Max windows live at the same instant (sweep over start/end points). The simultaneity
|
|
18
|
+
* count: the participant count says how many existed; this says how many ever ran at once. */
|
|
19
19
|
export function maxSimultaneousWindows(windows) {
|
|
20
20
|
const points = windows
|
|
21
21
|
.filter((w) => w.endedAt > w.startedAt)
|
|
@@ -34,10 +34,10 @@ export function maxSimultaneousWindows(windows) {
|
|
|
34
34
|
return max;
|
|
35
35
|
}
|
|
36
36
|
/**
|
|
37
|
-
* The judgment for a shared-world bundle's inputs: how each
|
|
38
|
-
* about its world: overlap, a state change under overlap on the provisioned plane, and
|
|
39
|
-
* convergence on the external-public plane. The bundle's verdict and the
|
|
40
|
-
* it.
|
|
37
|
+
* The judgment for a shared-world bundle's inputs: how each participant ended, plus what the run
|
|
38
|
+
* observed about its world: overlap, a state change under overlap on the provisioned plane, and
|
|
39
|
+
* lobby convergence on the external-public plane. The bundle's verdict and the study result's ok
|
|
40
|
+
* both read it.
|
|
41
41
|
*/
|
|
42
42
|
export function judgeSharedWorldRun(args) {
|
|
43
43
|
const external = (args.planeClass ?? "provisioned-getHost") === "external-public";
|
|
@@ -68,7 +68,7 @@ export function actorRunPassed(result) {
|
|
|
68
68
|
*
|
|
69
69
|
* None of those is adopter-scored proof that the mission text was completed. In particular, a
|
|
70
70
|
* productive `budget_reached` session can coexist with lobby convergence without becoming a
|
|
71
|
-
* `goal_satisfied` result
|
|
71
|
+
* `goal_satisfied` result.
|
|
72
72
|
*/
|
|
73
73
|
function formatSharedWorldActorOutcomes(outcomes, expectedCount) {
|
|
74
74
|
const passedSessions = outcomes.filter((outcome) => outcome.ok).length;
|
|
@@ -90,14 +90,14 @@ function formatSharedWorldActorOutcomes(outcomes, expectedCount) {
|
|
|
90
90
|
}
|
|
91
91
|
/** The run's first two events: its creation and the shared plane's provenance. */
|
|
92
92
|
function planeEvents(args, external) {
|
|
93
|
-
const { plan, descriptor, createdAt, dryRun, actorSpecs } = args;
|
|
93
|
+
const { plan, descriptor, run: { createdAt }, dryRun, actorSpecs, } = args;
|
|
94
94
|
const events = [];
|
|
95
95
|
events.push({
|
|
96
96
|
id: "event-000-created",
|
|
97
97
|
at: createdAt,
|
|
98
98
|
level: "info",
|
|
99
99
|
type: "concurrent-shared-world.run.created",
|
|
100
|
-
message: `Created
|
|
100
|
+
message: `Created a concurrent shared-world run for ${plan.labId} (actor ${descriptor.id}, ${actorSpecs.length} persona(s) on one shared app, at most ${plan.concurrency} at once).`,
|
|
101
101
|
});
|
|
102
102
|
// Human-readable plane label, byte-stable for the clone route. local-tree has no repo slug: it
|
|
103
103
|
// labels the packed archive instead (archiveSha256 + dirty/clean when the packed root was a git
|
|
@@ -108,8 +108,8 @@ function planeEvents(args, external) {
|
|
|
108
108
|
? `packed working tree (archiveSha256 ${args.subject.archiveSha256}${args.subject.dirty === true ? ", dirty working tree" : args.subject.dirty === false ? ", clean working tree" : ""})`
|
|
109
109
|
: "packed working tree (archive digest unresolved; provisioning failed before resolution)"
|
|
110
110
|
: `clone of ${args.subject.repo}${args.subjectCommit ? `@${args.subjectCommit}` : ""}`;
|
|
111
|
-
// External-public plane provenance
|
|
112
|
-
//
|
|
111
|
+
// External-public plane provenance differs: an operator-declared, operator-owned public
|
|
112
|
+
// deployment humanish neither provisioned nor seeded, with no getHost, no clone and no synthetic
|
|
113
113
|
// attestation (claiming synthetic on a real site is a lie). The origin persists digest-only.
|
|
114
114
|
// planSharedWorldLab refuses an external-public plane without a declared owner; the fallback
|
|
115
115
|
// says so rather than naming one.
|
|
@@ -120,19 +120,21 @@ function planeEvents(args, external) {
|
|
|
120
120
|
level: "info",
|
|
121
121
|
type: "concurrent-shared-world.plane.provenance",
|
|
122
122
|
message: external
|
|
123
|
-
? `Shared
|
|
123
|
+
? `Shared app: a public deployment the operator declares they own (${externalPlaneOwner}, authorized), used as it is, with no sandbox, clone or seed. humanish observed that each participant reached the declared origin (publicOriginDigest); it did not create or control the app. Ownership is the lab's declaration, and the data is not claimed to be synthetic.`
|
|
124
124
|
: dryRun
|
|
125
|
-
? `Shared
|
|
126
|
-
: `Shared
|
|
125
|
+
? `Shared app declared: ${dryRunPlaneLabel}, to be served in the sandbox at a public sandbox URL (dry run: nothing ${args.subject.source === "local-tree" ? "packed" : "cloned"}). Seed recipe ${args.seedDigest}; synthetic subject, as the study declares; env names: ${args.subject.envNames?.join(", ") || "none"} (values never stored).`
|
|
126
|
+
: `Shared app: ${livePlaneLabel}, served at a public sandbox URL humanish created; seed recipe ${args.seedDigest}; synthetic subject, as the study declares; env names: ${args.subject.envNames?.join(", ") || "none"} (values never stored).`,
|
|
127
127
|
}));
|
|
128
128
|
return events;
|
|
129
129
|
}
|
|
130
|
-
/** The sharedWorld block:
|
|
130
|
+
/** The sharedWorld block: participant windows, the state series, participant outcomes and the
|
|
131
|
+
* plane. */
|
|
131
132
|
function sharedWorldEvidence(args, external, inProgress, planeCommit) {
|
|
132
133
|
const { plan, dryRun, actorSpecs, actorResults } = args;
|
|
133
|
-
// Build the concurrent shared-world evidence block. routeHostDigest is sha256-16 of the
|
|
134
|
-
//
|
|
135
|
-
// external-public the
|
|
134
|
+
// Build the concurrent shared-world evidence block. routeHostDigest is sha256-16 of the origin each
|
|
135
|
+
// participant reached: on getHost the participant URL the actor drove (verify confirms ==
|
|
136
|
+
// plane.hostDigest); on external-public the participant's CDP-observed URL origin (verify
|
|
137
|
+
// confirms == plane.publicOriginDigest).
|
|
136
138
|
const fallbackHostDigest = external
|
|
137
139
|
? (args.publicOriginDigest ?? commandDigestOf("[external-public-plane]"))
|
|
138
140
|
: (args.hostDigest ?? commandDigestOf("[provisioned-subject]"));
|
|
@@ -156,7 +158,7 @@ function sharedWorldEvidence(args, external, inProgress, planeCommit) {
|
|
|
156
158
|
seedDigest: args.seedDigest,
|
|
157
159
|
};
|
|
158
160
|
});
|
|
159
|
-
// Option A (external-public):
|
|
161
|
+
// Option A (external-public): no authoritative shared-state proof, so stateSeries is omitted (there
|
|
160
162
|
// is no in-sandbox filesystem to digest; concurrency is proven by temporal co-occupancy + lobby
|
|
161
163
|
// convergence). The provisioned-getHost plane keeps its authoritative in-sandbox checkpoint series.
|
|
162
164
|
const stateSeries = external
|
|
@@ -182,14 +184,14 @@ function sharedWorldEvidence(args, external, inProgress, planeCommit) {
|
|
|
182
184
|
};
|
|
183
185
|
});
|
|
184
186
|
// The plane block is plane-class-specific. getHost: harness-minted hostDigest + synthetic
|
|
185
|
-
// attestation. external-public: operator-declared publicOriginDigest,
|
|
186
|
-
// (claiming synthetic on a real site would be
|
|
187
|
+
// attestation. external-public: operator-declared publicOriginDigest, no hostDigest, no exposure
|
|
188
|
+
// (claiming synthetic on a real site would be false; verify asserts both are absent there).
|
|
187
189
|
const plane = external
|
|
188
190
|
? {
|
|
189
191
|
seedDigest: args.seedDigest,
|
|
190
192
|
envNames: [],
|
|
191
|
-
// publicOriginDigest is the
|
|
192
|
-
// operator-declared origin for reference (a redirect makes them differ
|
|
193
|
+
// publicOriginDigest is the observed convergence origin; declaredOriginDigest records the
|
|
194
|
+
// operator-declared origin for reference (a redirect that makes them differ is no failure).
|
|
193
195
|
...(args.publicOriginDigest === undefined
|
|
194
196
|
? {}
|
|
195
197
|
: { publicOriginDigest: args.publicOriginDigest }),
|
|
@@ -216,7 +218,7 @@ function sharedWorldEvidence(args, external, inProgress, planeCommit) {
|
|
|
216
218
|
? [...EXTERNAL_PUBLIC_ATTRIBUTION_LIMITS]
|
|
217
219
|
: [...CONCURRENT_ATTRIBUTION_LIMITS],
|
|
218
220
|
laneWindows: windows,
|
|
219
|
-
// Option A: external-public carries
|
|
221
|
+
// Option A: external-public carries no stateSeries.
|
|
220
222
|
...(stateSeries === undefined ? {} : { stateSeries }),
|
|
221
223
|
outcomes,
|
|
222
224
|
...(args.lobbyConvergenceDigest === undefined
|
|
@@ -226,8 +228,8 @@ function sharedWorldEvidence(args, external, inProgress, planeCommit) {
|
|
|
226
228
|
return { sharedWorld, windows, stateSeries, outcomes };
|
|
227
229
|
}
|
|
228
230
|
/**
|
|
229
|
-
* A finished run's gaps: each
|
|
230
|
-
* shortfall that failed the run.
|
|
231
|
+
* A finished run's gaps: each participant that did not pass, or, when every participant passed, the
|
|
232
|
+
* world shortfall that failed the run.
|
|
231
233
|
*/
|
|
232
234
|
function finishedGaps(actorResults, shortfall) {
|
|
233
235
|
const participantGaps = actorResults
|
|
@@ -241,7 +243,7 @@ function finishedGaps(actorResults, shortfall) {
|
|
|
241
243
|
}
|
|
242
244
|
/** Records the concurrency event and returns the review. */
|
|
243
245
|
function concurrencyReview(args, external, inProgress, evidence, events, nextEventId) {
|
|
244
|
-
const { plan, descriptor, createdAt, dryRun, actorSpecs, actorResults } = args;
|
|
246
|
+
const { plan, descriptor, run: { createdAt }, dryRun, actorSpecs, actorResults, } = args;
|
|
245
247
|
const { sharedWorld, windows, stateSeries, outcomes } = evidence;
|
|
246
248
|
const overlaps = args.judgment.world.overlap;
|
|
247
249
|
const deltas = (stateSeries ?? []).filter((snapshot, i) => i > 0 && snapshot.digest !== (stateSeries ?? [])[i - 1].digest).length;
|
|
@@ -249,10 +251,10 @@ function concurrencyReview(args, external, inProgress, evidence, events, nextEve
|
|
|
249
251
|
? "stateSeries omitted (no authoritative shared-state proof on the external-public plane)"
|
|
250
252
|
: `stateSeries ${(stateSeries ?? []).length} snapshot(s), ${deltas} delta(s)`;
|
|
251
253
|
const convergenceLabel = external
|
|
252
|
-
? `; lobby convergence ${args.lobbyConvergenceDigest ? "
|
|
254
|
+
? `; lobby convergence ${args.lobbyConvergenceDigest ? "shown (all participants reached one /lobby/CODE)" : "not observed"}`
|
|
253
255
|
: "";
|
|
254
|
-
// The count that matters is how many
|
|
255
|
-
// 6-
|
|
256
|
+
// The count that matters is how many participants were live at once, which can be fewer than exist:
|
|
257
|
+
// a 6-participant run capped at 3 must never read as 6-wide concurrency.
|
|
256
258
|
const capForReport = plan.concurrency;
|
|
257
259
|
const maxLive = maxSimultaneousWindows(windows);
|
|
258
260
|
events.push({
|
|
@@ -260,31 +262,31 @@ function concurrencyReview(args, external, inProgress, evidence, events, nextEve
|
|
|
260
262
|
at: createdAt,
|
|
261
263
|
level: "info",
|
|
262
264
|
type: "concurrent-shared-world.concurrency",
|
|
263
|
-
message: `Concurrency: ${windows.length} participant(s)${dryRun ? " (dry
|
|
265
|
+
message: `Concurrency: ${windows.length} participant(s)${dryRun ? " (dry run; $0)" : `, up to ${maxLive} live at once (cap ${capForReport}), overlap ${overlaps ? "shown" : "not observed"}`}; ${stateSeriesLabel}${convergenceLabel}. Attribution ceiling: ${sharedWorld.attributionLimits.join(", ")}. ${dryRun ? "This dry run proves nothing about live concurrency, scale, or adoption." : "This run reports only its own observed overlap and state changes; it does not prove scale, repeatability, or adopter-harness replacement."}`,
|
|
264
266
|
});
|
|
265
|
-
// The judge's verdict (judgeSharedWorld): every
|
|
266
|
-
// Mission endpoint and completion reasons are reported separately below; `outcomes[].ok`
|
|
267
|
-
// renamed into mission success
|
|
267
|
+
// The judge's verdict (judgeSharedWorld): every participant produced a terminal, engaged, passed
|
|
268
|
+
// session. Mission endpoint and completion reasons are reported separately below; `outcomes[].ok`
|
|
269
|
+
// is not renamed into mission success.
|
|
268
270
|
const verdict = args.judgment.verdict;
|
|
269
271
|
const actorOutcomeSummary = formatSharedWorldActorOutcomes(outcomes, actorSpecs.length);
|
|
270
272
|
const review = {
|
|
271
273
|
schema: REVIEW_SCHEMA,
|
|
272
274
|
verdict,
|
|
273
|
-
// Plane-class-aware: the external-public plane has
|
|
275
|
+
// Plane-class-aware: the external-public plane has no getHost/clone/seed and carries no
|
|
274
276
|
// authoritative state series, so its summary must not claim a getHost-exposed plane (dry-run) nor
|
|
275
|
-
// report "state delta(s) under load" (live)
|
|
277
|
+
// report "state delta(s) under load" (live). It reports lobby convergence instead.
|
|
276
278
|
summary: dryRun
|
|
277
279
|
? external
|
|
278
|
-
? `
|
|
279
|
-
: `
|
|
280
|
+
? `Concurrent shared-world dry run: ${actorSpecs.length} persona(s) declared against one public deployment, used as it is (no sandbox, clone or seed); no sandboxes launched, $0 spent.`
|
|
281
|
+
: `Concurrent shared-world dry run: ${actorSpecs.length} persona(s) declared against one app served at a public sandbox URL (${descriptor.id}); no sandboxes launched, $0 spent.`
|
|
280
282
|
: inProgress
|
|
281
|
-
? `In-progress concurrent shared-world Observer snapshot: ${actorSpecs.length} persona(s) running against
|
|
283
|
+
? `In-progress concurrent shared-world Observer snapshot: ${actorSpecs.length} persona(s) running against one shared app; final verification is pending.`
|
|
282
284
|
: external
|
|
283
|
-
? `Concurrent shared-world (
|
|
284
|
-
: `Concurrent shared-world (
|
|
285
|
+
? `Concurrent shared-world (one public deployment, ${actorSpecs.length} personas at once): swarm ${verdict === "pass" ? "ran coherently" : "did not run coherently"}; ${actorOutcomeSummary}; overlap ${overlaps ? "proven" : "not observed"}; ${args.lobbyConvergenceDigest ? `${actorSpecs.length} participants converged on one lobby` : "lobby convergence not observed"}.`
|
|
286
|
+
: `Concurrent shared-world (one shared app, ${actorSpecs.length} personas at once): swarm ${verdict === "pass" ? "ran coherently" : "did not run coherently"}; ${actorOutcomeSummary}; overlap ${overlaps ? "proven" : "not observed"}; ${deltas} state delta(s) under load.`,
|
|
285
287
|
gaps: dryRun
|
|
286
288
|
? [
|
|
287
|
-
"This dry
|
|
289
|
+
"This dry run launched no concurrent shared-world session; it checks the evidence shape only, not live behavior, scale, or adopter-harness replacement.",
|
|
288
290
|
]
|
|
289
291
|
: inProgress
|
|
290
292
|
? [
|
|
@@ -294,15 +296,15 @@ function concurrencyReview(args, external, inProgress, evidence, events, nextEve
|
|
|
294
296
|
};
|
|
295
297
|
return review;
|
|
296
298
|
}
|
|
297
|
-
/** Project the concurrent run into a humanish.run-bundle.v1 with the
|
|
299
|
+
/** Project the concurrent run into a humanish.run-bundle.v1 with the concurrent shared-world block. */
|
|
298
300
|
export function buildConcurrentSharedWorldBundle(args) {
|
|
299
|
-
const { plan, descriptor, createdAt, dryRun, actorSpecs, actorResults } = args;
|
|
301
|
+
const { plan, descriptor, run: { createdAt }, dryRun, actorSpecs, actorResults, } = args;
|
|
300
302
|
const inProgress = args.inProgress === true;
|
|
301
303
|
const external = (args.planeClass ?? "provisioned-getHost") === "external-public";
|
|
302
304
|
const simulations = [];
|
|
303
305
|
const streams = [];
|
|
304
|
-
// Public-safe label only
|
|
305
|
-
// (external-public) lands in the bundle. The plane identity is a
|
|
306
|
+
// Public-safe label only: neither the raw getHost URL (provisioned) nor the raw public origin
|
|
307
|
+
// (external-public) lands in the bundle. The plane identity is a digest (plane.hostDigest on
|
|
306
308
|
// getHost; plane.publicOriginDigest on external-public).
|
|
307
309
|
const appUrl = external ? "[external-public-plane]" : "[provisioned-subject]";
|
|
308
310
|
const planeCommit = external ? undefined : dryRun ? undefined : args.subjectCommit;
|
|
@@ -323,19 +325,15 @@ export function buildConcurrentSharedWorldBundle(args) {
|
|
|
323
325
|
const ranLive = actorResults.some((result) => result.outcome.session !== undefined || result.outcome.sessionError !== undefined);
|
|
324
326
|
const cost = concurrentCostSummary(args, inProgress);
|
|
325
327
|
return {
|
|
326
|
-
...bundleHead({
|
|
328
|
+
...bundleHead(args.run, {
|
|
327
329
|
...receivingPublication(plan.residual, args.dryRun),
|
|
328
|
-
runId: args.runId,
|
|
329
|
-
mode: dryRun ? "dry-run" : "live",
|
|
330
330
|
participants: actorSpecs.length,
|
|
331
|
-
createdAt,
|
|
332
|
-
...(args.lab === undefined ? {} : { lab: args.lab }),
|
|
333
331
|
source: args.source,
|
|
334
332
|
}),
|
|
335
333
|
persona: {
|
|
336
334
|
id: actorSpecs[0]?.persona.id ?? "concurrent-persona",
|
|
337
335
|
name: `Concurrent shared-world swarm (${actorSpecs.length} personas)`,
|
|
338
|
-
source: `
|
|
336
|
+
source: `study:${plan.labId}`,
|
|
339
337
|
sourceDigest: actorSpecs[0]?.persona.promptDigest ?? args.seedDigest,
|
|
340
338
|
},
|
|
341
339
|
scenario: {
|
|
@@ -344,14 +342,14 @@ export function buildConcurrentSharedWorldBundle(args) {
|
|
|
344
342
|
goal: redactText(actorSpecs[0]?.evidenceInstructions ??
|
|
345
343
|
actorSpecs[0]?.instructions ??
|
|
346
344
|
"Concurrent shared-world interaction."),
|
|
347
|
-
source: `
|
|
345
|
+
source: `study:${plan.labId}`,
|
|
348
346
|
sourceDigest: actorSpecs[0]?.persona.promptDigest ?? args.seedDigest,
|
|
349
347
|
},
|
|
350
348
|
lifecycle: [
|
|
351
349
|
{
|
|
352
350
|
at: createdAt,
|
|
353
351
|
event: "concurrent-shared-world.run.created",
|
|
354
|
-
message: `Created concurrent shared-world run with
|
|
352
|
+
message: `Created a concurrent shared-world run with one shared app and ${actorSpecs.length} participants at once (actor ${descriptor.id}).`,
|
|
355
353
|
},
|
|
356
354
|
],
|
|
357
355
|
simulations,
|
|
@@ -361,11 +359,11 @@ export function buildConcurrentSharedWorldBundle(args) {
|
|
|
361
359
|
status: "passed",
|
|
362
360
|
notes: ranLive
|
|
363
361
|
? anyRaw
|
|
364
|
-
? "Typed text recorded as length only and reasoning
|
|
362
|
+
? "Typed text is recorded as its length only, and reasoning and messages pass through text redaction. Some personas captured unblurred screenshots, kept for local use and not redacted for publishing. Set policies.redactScreenshots: true to blur screenshots in a bundle you plan to share. stateSeries stores digests only."
|
|
365
363
|
: "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. stateSeries persists digest-only."
|
|
366
364
|
: inProgress
|
|
367
365
|
? "In-progress live Observer snapshot: runtime stream auth URLs are process-local only and are not persisted. Final typed text, traces, and screenshots are pending. stateSeries persists digest-only."
|
|
368
|
-
: "
|
|
366
|
+
: "Concurrent shared-world dry-run bundle: no sandboxes launched and no screenshots captured. Typed text is recorded as length only and reasoning/messages pass through text redaction whenever a session runs. stateSeries persists digest-only.",
|
|
369
367
|
},
|
|
370
368
|
artifacts: bundleArtifacts(),
|
|
371
369
|
review,
|
|
@@ -381,7 +379,7 @@ export function buildConcurrentSharedWorldBundle(args) {
|
|
|
381
379
|
};
|
|
382
380
|
}
|
|
383
381
|
/**
|
|
384
|
-
* Priced like per-lane
|
|
382
|
+
* Priced like `per-lane-worlds`: each participant's model tokens and desktop, plus the provisioned plane's
|
|
385
383
|
* desktop. Absent when nothing ran, so dry runs and in-progress snapshots stay byte-stable.
|
|
386
384
|
*/
|
|
387
385
|
function concurrentCostSummary(args, inProgress) {
|
|
@@ -416,7 +414,7 @@ function concurrentCostSummary(args, inProgress) {
|
|
|
416
414
|
],
|
|
417
415
|
});
|
|
418
416
|
}
|
|
419
|
-
/** The declared (dry-run) state digest: the probe
|
|
417
|
+
/** The declared (dry-run) state digest: the probe recipe (command digests), no run. */
|
|
420
418
|
function declaredStateDigest(state) {
|
|
421
419
|
const probes = state?.checkpoint ?? [];
|
|
422
420
|
return combineCheckpointDigest(probes.map((probe) => `${probe.name}=${commandDigestOf(probe.command)}`));
|
|
@@ -433,7 +431,7 @@ export function renderConcurrentReviewMarkdown(bundle) {
|
|
|
433
431
|
`- attribution class: ${bundle.attributionClass ?? "isolated"}`,
|
|
434
432
|
`- topology: ${sw?.topology ?? "(none)"} / ${sw?.topologyMode ?? "(none)"}`,
|
|
435
433
|
`- personas: ${sw?.roleCount ?? 0}`,
|
|
436
|
-
`- verdict: ${bundle.review.verdict}`,
|
|
434
|
+
`- verdict: ${verdictText(bundle.review.verdict, bundle.mode)}`,
|
|
437
435
|
`- summary: ${bundle.review.summary}`,
|
|
438
436
|
...(plane ? [`- plane: ${plane.message}`] : []),
|
|
439
437
|
...(concurrency ? [`- concurrency: ${concurrency.message}`] : []),
|
|
@@ -2,13 +2,13 @@ import type { Shell } from "../../substrates/shell.js";
|
|
|
2
2
|
import { type DetachedTimers } from "../../substrates/detached.js";
|
|
3
3
|
import { type LabSubjectState, type LabSubjectStateCheckpoint } from "../../lab/types.js";
|
|
4
4
|
import { type SharedWorldCheckpoint } from "../../run/shared-world-evidence.js";
|
|
5
|
-
/** Combine a snapshot's per-probe digests into
|
|
5
|
+
/** Combine a snapshot's per-probe digests into one sha256-16 (digest-only; no raw value). */
|
|
6
6
|
export declare function combineCheckpointDigest(parts: string[]): string;
|
|
7
7
|
/**
|
|
8
|
-
* Run
|
|
8
|
+
* Run one checkpoint snapshot live: each declared probe runs read-only via the detached
|
|
9
9
|
* primitive; its stdout is literal-scrubbed (provisioned values + the probe's declared redact
|
|
10
|
-
* literals, folded into `scrub`) then pattern-redacted, then digested. Only the
|
|
11
|
-
* persists
|
|
10
|
+
* literals, folded into `scrub`) then pattern-redacted, then digested. Only the combined digest
|
|
11
|
+
* persists, never the raw value (the seed-step lockdown). Unique step names per snapshot prevent
|
|
12
12
|
* stale-status reuse across snapshots.
|
|
13
13
|
*/
|
|
14
14
|
export declare function runCheckpointSnapshot(args: {
|
|
@@ -21,5 +21,5 @@ export declare function runCheckpointSnapshot(args: {
|
|
|
21
21
|
requestTimeoutMs: number;
|
|
22
22
|
timers: DetachedTimers;
|
|
23
23
|
}): Promise<SharedWorldCheckpoint>;
|
|
24
|
-
/** sha256-16 over the ordered seed-step command digests
|
|
24
|
+
/** sha256-16 over the ordered seed-step command digests: the seeded-state recipe identity. */
|
|
25
25
|
export declare function seedRecipeDigest(state: LabSubjectState | undefined): string;
|
|
@@ -6,15 +6,15 @@ import { redactText } from "../../evidence/redaction.js";
|
|
|
6
6
|
import {} from "../../run/shared-world-evidence.js";
|
|
7
7
|
// Per-checkpoint probe budget (read-only aggregate probes are fast).
|
|
8
8
|
const CHECKPOINT_TIMEOUT_MS = 60_000;
|
|
9
|
-
/** Combine a snapshot's per-probe digests into
|
|
9
|
+
/** Combine a snapshot's per-probe digests into one sha256-16 (digest-only; no raw value). */
|
|
10
10
|
export function combineCheckpointDigest(parts) {
|
|
11
11
|
return commandDigestOf(parts.join("\n"));
|
|
12
12
|
}
|
|
13
13
|
/**
|
|
14
|
-
* Run
|
|
14
|
+
* Run one checkpoint snapshot live: each declared probe runs read-only via the detached
|
|
15
15
|
* primitive; its stdout is literal-scrubbed (provisioned values + the probe's declared redact
|
|
16
|
-
* literals, folded into `scrub`) then pattern-redacted, then digested. Only the
|
|
17
|
-
* persists
|
|
16
|
+
* literals, folded into `scrub`) then pattern-redacted, then digested. Only the combined digest
|
|
17
|
+
* persists, never the raw value (the seed-step lockdown). Unique step names per snapshot prevent
|
|
18
18
|
* stale-status reuse across snapshots.
|
|
19
19
|
*/
|
|
20
20
|
export async function runCheckpointSnapshot(args) {
|
|
@@ -39,7 +39,7 @@ export async function runCheckpointSnapshot(args) {
|
|
|
39
39
|
deltaFromPrev: args.prevDigest !== undefined && digest !== args.prevDigest,
|
|
40
40
|
};
|
|
41
41
|
}
|
|
42
|
-
/** sha256-16 over the ordered seed-step command digests
|
|
42
|
+
/** sha256-16 over the ordered seed-step command digests: the seeded-state recipe identity. */
|
|
43
43
|
export function seedRecipeDigest(state) {
|
|
44
44
|
const seed = state?.seed ?? [];
|
|
45
45
|
return commandDigestOf(seed.map((step) => `${step.name}:${commandDigestOf(step.command)}`).join("\n"));
|
|
@@ -14,31 +14,32 @@ export interface SubjectComms {
|
|
|
14
14
|
}
|
|
15
15
|
export declare function subjectCommsOf(config: Pick<LabConfig, "comms">, planeClass: ConcurrentSharedWorldPlaneClass): SubjectComms;
|
|
16
16
|
/**
|
|
17
|
-
*
|
|
18
|
-
* it cannot host a catch
|
|
17
|
+
* Adopter-hosted ingress: on the external-public plane the harness provisions nothing, so
|
|
18
|
+
* it cannot host a catch. The operator can, and then humanish still does every other part of
|
|
19
19
|
* the funnel: it tells each persona its address and inbox URL, drains the declared catch over
|
|
20
20
|
* HTTP at teardown, and writes the same digest-only evidence. Declaring `external` is what turns
|
|
21
21
|
* the previously-inert block into a working one. Returns an error message when the declared catch
|
|
22
22
|
* does not answer as a humanish catch.
|
|
23
23
|
*/
|
|
24
|
-
export declare function prepareExternalComms(config: Pick<LabConfig, "comms">, planeClass: ConcurrentSharedWorldPlaneClass, dryRun: boolean, warnings: string[]): Promise<{
|
|
24
|
+
export declare function prepareExternalComms(config: Pick<LabConfig, "comms">, planeClass: ConcurrentSharedWorldPlaneClass, dryRun: boolean, warnings: string[], env: Record<string, string | undefined>): Promise<{
|
|
25
25
|
ok: true;
|
|
26
26
|
wiring: ExternalCommsWiring | undefined;
|
|
27
27
|
} | {
|
|
28
28
|
ok: false;
|
|
29
|
+
code: "HUMANISH_SHARED_WORLD_COMMS_TOKEN_INVALID" | "HUMANISH_SHARED_WORLD_COMMS_CATCH_UNREACHABLE";
|
|
29
30
|
message: string;
|
|
30
31
|
}>;
|
|
31
32
|
/**
|
|
32
|
-
* Off-app comms evidence
|
|
33
|
+
* Off-app comms evidence: drain everything the in-sandbox catch captured, route it into a
|
|
33
34
|
* host fake inbox addressed to the declared recipients, and write the run-level digest-only thread
|
|
34
|
-
* artifact
|
|
35
|
+
* artifact while the subject is still alive, before it is killed. Wrapped so a drain error
|
|
35
36
|
* never blocks teardown (invariant: all sandboxes torn down by id in the plane's finally). Returns
|
|
36
37
|
* the thread's path when one was written.
|
|
37
38
|
*/
|
|
38
39
|
export declare function drainSubjectComms(ctx: PlaneContext, commsEmail: LabCommsEmail, subjectShell: Shell, deployedComms: DeployedCommsCatch): Promise<string | undefined>;
|
|
39
40
|
/**
|
|
40
|
-
* Adopter-hosted drain
|
|
41
|
-
* catch
|
|
41
|
+
* Adopter-hosted drain: same routing and digest-only artifact as the in-sandbox
|
|
42
|
+
* catch. Only the transport differs (HTTP GET /deliveries against the catch the operator
|
|
42
43
|
* runs). Called in the plane's finally so the evidence survives a failed run; a drain error never
|
|
43
44
|
* masks the run's own outcome. Returns the thread's path when one was written.
|
|
44
45
|
*/
|