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
|
@@ -3,8 +3,7 @@ import type { SubjectPhaseEvent } from "../../subject/steps.js";
|
|
|
3
3
|
import type { DesktopBrowserEvidence } from "../../substrates/e2b/desktop-browser.js";
|
|
4
4
|
import type { ActorPersonaRef } from "../../actors/contract.js";
|
|
5
5
|
import type { CuaLoopResult } from "../../actors/computer-use/loop.js";
|
|
6
|
-
import { type
|
|
7
|
-
import { type RunBundle, type RunFeedbackCandidate, type RunProviderResource } from "../../run/bundle.js";
|
|
6
|
+
import { type BundleRun, type RunBundle, type RunFeedbackCandidate, type RunProviderResource } from "../../run/bundle.js";
|
|
8
7
|
import { type RunDesktopGeometry, type RunStream } from "../../run/streams.js";
|
|
9
8
|
import { type Verdict } from "../../run/judge.js";
|
|
10
9
|
import { type DesktopUsage } from "../../run/cost-summary.js";
|
|
@@ -17,8 +16,8 @@ export declare function buildSingleParticipantBundle(args: {
|
|
|
17
16
|
/** The run's verdict, from the judge. */
|
|
18
17
|
verdict: Verdict;
|
|
19
18
|
realEmail?: boolean;
|
|
20
|
-
/**
|
|
21
|
-
|
|
19
|
+
/** The run this bundle belongs to; the bundle head reads its id, mode, start and lab. */
|
|
20
|
+
run: BundleRun;
|
|
22
21
|
actorId: string;
|
|
23
22
|
appUrl: string;
|
|
24
23
|
/** The participant's plan id, saved as the stream's laneId ("lane-01" when absent). */
|
|
@@ -26,7 +25,6 @@ export declare function buildSingleParticipantBundle(args: {
|
|
|
26
25
|
actorType?: string;
|
|
27
26
|
surface?: string;
|
|
28
27
|
caseGroup?: string;
|
|
29
|
-
createdAt: string;
|
|
30
28
|
dryRun: boolean;
|
|
31
29
|
labId: string;
|
|
32
30
|
labTitle?: string;
|
|
@@ -44,7 +42,6 @@ export declare function buildSingleParticipantBundle(args: {
|
|
|
44
42
|
/** Device-preset touch metadata echoed on the measured stream viewport (a prompt signal on
|
|
45
43
|
* this route, never a rendered claim); the measured width/height/DPR stay authoritative. */
|
|
46
44
|
isMobile?: boolean;
|
|
47
|
-
runId: string;
|
|
48
45
|
screenshots: string[];
|
|
49
46
|
/** Relative run-dir path of the digest-only comms-thread evidence artifact (humanish.comms-thread.v1),
|
|
50
47
|
* when a comms lab captured mail; registered as a "log" stream artifact. */
|
|
@@ -52,17 +49,17 @@ export declare function buildSingleParticipantBundle(args: {
|
|
|
52
49
|
/**
|
|
53
50
|
* Capture-time screenshot policy ("blurred" when policies.redactScreenshots, else "raw").
|
|
54
51
|
* When a session ran, its trace's `redaction.screenshots` is the evidence-of-record and
|
|
55
|
-
* wins; this fallback
|
|
56
|
-
* (no trace exists to testify then). Defaults to "raw"
|
|
52
|
+
* wins; this fallback labels the frames written before a mid-session failure
|
|
53
|
+
* (no trace exists to testify then). Defaults to "raw", the engine default.
|
|
57
54
|
*/
|
|
58
55
|
captureRedaction?: "raw" | "blurred";
|
|
59
56
|
session?: CuaLoopResult;
|
|
60
57
|
sessionError?: string;
|
|
61
58
|
/**
|
|
62
|
-
* The
|
|
63
|
-
* evidence of what it
|
|
59
|
+
* The route's own credibility read of a goal_satisfied session. The actor's status is
|
|
60
|
+
* evidence of what it claimed; whether the harness counts the claim is decided by the route
|
|
64
61
|
* (zero engagement, a final message that describes a blocker). The review has to say the same
|
|
65
|
-
* thing the
|
|
62
|
+
* thing the participant's exit code says, or the durable bundle reports a participant reaching the
|
|
66
63
|
* goal on a run the harness refused to count.
|
|
67
64
|
*/
|
|
68
65
|
credibility?: {
|
|
@@ -75,12 +72,12 @@ export declare function buildSingleParticipantBundle(args: {
|
|
|
75
72
|
* + digests only, never values or command text), including the subject's state story. */
|
|
76
73
|
subjectProvenance?: CuaSubjectProvenanceArg;
|
|
77
74
|
/**
|
|
78
|
-
* Entry kind for the non-clone subject.declared event
|
|
79
|
-
*
|
|
80
|
-
* declared
|
|
75
|
+
* Entry kind for the non-clone subject.declared event, which declares what the subject
|
|
76
|
+
* was. "local-app": an already-running local dev server driven in-process, un-pinnable, and
|
|
77
|
+
* declared as caller-provisioned/unpinned with no E2B. Absent: a plain app-url entry.
|
|
81
78
|
*/
|
|
82
79
|
entryKind?: "local-app";
|
|
83
|
-
/** The custom E2B desktop template (image) this
|
|
80
|
+
/** The custom E2B desktop template (image) this participant launched on, when configured (provenance). */
|
|
84
81
|
desktopTemplate?: string;
|
|
85
82
|
/** The configured browser choice and the command that opened, when explicitly configured. */
|
|
86
83
|
desktopBrowser?: DesktopBrowserEvidence;
|
|
@@ -90,7 +87,7 @@ export declare function buildSingleParticipantBundle(args: {
|
|
|
90
87
|
/** Completed subject-phase records (clone/upload/extract/install/build/ready/state groups)
|
|
91
88
|
* to fold into bundle.events, so run.json carries real phase timing after the fact. */
|
|
92
89
|
phaseEvents?: SubjectPhaseEvent[];
|
|
93
|
-
/** Host-side E2B desktop billed span for this
|
|
90
|
+
/** Host-side E2B desktop billed span for this participant, in minutes (from ParticipantRunOutcome
|
|
94
91
|
* desktopDurationMs). Absent when no sandbox ran (in-process/dry-run) → no desktop cost line. */
|
|
95
92
|
desktopMinutes?: number;
|
|
96
93
|
desktopUsage?: DesktopUsage;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { participantAssignment } from "../../lab/participant-assignment.js";
|
|
2
2
|
import { redactText } from "../../evidence/redaction.js";
|
|
3
|
-
import {} from "../../run/status.js";
|
|
4
3
|
import { REVIEW_SCHEMA, bundleArtifacts, bundleHead, } from "../../run/bundle.js";
|
|
5
4
|
import {} from "../../run/streams.js";
|
|
6
5
|
import { aggregateTaskFunnels, tallyParticipantOutcomes, withCuaReviewProvenance, } from "../../run/outcomes.js";
|
|
@@ -25,7 +24,7 @@ function browserPlace(args) {
|
|
|
25
24
|
return "in a hosted desktop browser";
|
|
26
25
|
}
|
|
27
26
|
}
|
|
28
|
-
/** Run-level cost
|
|
27
|
+
/** Run-level cost estimate (advisory; omitted when nothing was priced and no sandbox ran). */
|
|
29
28
|
function runCost(args) {
|
|
30
29
|
return buildRunCostSummary({
|
|
31
30
|
participants: args.session
|
|
@@ -53,15 +52,15 @@ function participantView(args, publicAppUrl) {
|
|
|
53
52
|
? "Live computer-use session is running; stream auth URL is available only through the attached Observer server."
|
|
54
53
|
: (args.session?.reason ??
|
|
55
54
|
args.sessionError ??
|
|
56
|
-
"
|
|
55
|
+
"Dry run: the evidence shape was written without launching a desktop or spending provider tokens.");
|
|
57
56
|
const lastScreenshot = args.screenshots[args.screenshots.length - 1];
|
|
58
57
|
const desktopGeometry = args.desktopRoute === false
|
|
59
58
|
? undefined
|
|
60
59
|
: (args.desktopGeometry ?? {
|
|
61
60
|
screen: { requested: { width: args.resolution[0], height: args.resolution[1] } },
|
|
62
61
|
});
|
|
63
|
-
//
|
|
64
|
-
// run's
|
|
62
|
+
// Claims match mechanism: every screenshot label names the
|
|
63
|
+
// run's actual mode. The session trace is the evidence-of-record; the capture policy covers
|
|
65
64
|
// frames written before a mid-session failure produced a trace.
|
|
66
65
|
const traceScreenshotMode = args.session?.trace.redaction.screenshots;
|
|
67
66
|
const screenshotMode = traceScreenshotMode === "raw" || traceScreenshotMode === "blurred"
|
|
@@ -93,9 +92,9 @@ function singleSimulation(args, view) {
|
|
|
93
92
|
? `Computer-use actor (${args.actorId}) is driving the subject app ${browserPlace(args)}.`
|
|
94
93
|
: args.sessionError !== undefined
|
|
95
94
|
? `Computer-use lab failed before a terminal session verdict: ${args.sessionError}`
|
|
96
|
-
: `
|
|
97
|
-
startedAt: args.createdAt,
|
|
98
|
-
updatedAt: args.createdAt,
|
|
95
|
+
: `Computer-use actor (${args.actorId}) against ${publicAppUrl}; no session ran.`,
|
|
96
|
+
startedAt: args.run.createdAt,
|
|
97
|
+
updatedAt: args.run.createdAt,
|
|
99
98
|
});
|
|
100
99
|
}
|
|
101
100
|
function singleStream(args, view) {
|
|
@@ -108,13 +107,13 @@ function singleStream(args, view) {
|
|
|
108
107
|
...(args.surface === undefined ? {} : { surface: args.surface }),
|
|
109
108
|
...(args.caseGroup === undefined ? {} : { caseGroup: args.caseGroup }),
|
|
110
109
|
kind: "browser",
|
|
111
|
-
label:
|
|
110
|
+
label: `${args.participantId ?? "lane-01"} · browser`,
|
|
112
111
|
status,
|
|
113
112
|
transport: "snapshot",
|
|
114
|
-
updatedAt: args.createdAt,
|
|
113
|
+
updatedAt: args.run.createdAt,
|
|
115
114
|
embed: lastScreenshot
|
|
116
|
-
? { kind: "screenshot", url: lastScreenshot, title: `
|
|
117
|
-
: { kind: "placeholder", title: "
|
|
115
|
+
? { kind: "screenshot", url: lastScreenshot, title: `Desktop (${screenshotMode})` }
|
|
116
|
+
: { kind: "placeholder", title: "Desktop" },
|
|
118
117
|
...(desktopGeometry?.viewport === undefined
|
|
119
118
|
? {}
|
|
120
119
|
: {
|
|
@@ -162,7 +161,7 @@ function singleEvents(args, view) {
|
|
|
162
161
|
const events = [
|
|
163
162
|
{
|
|
164
163
|
id: "event-000-created",
|
|
165
|
-
at: args.createdAt,
|
|
164
|
+
at: args.run.createdAt,
|
|
166
165
|
level: "info",
|
|
167
166
|
type: "cua-lab.run.created",
|
|
168
167
|
message: `Created computer-use lab run for ${args.labId} (actor ${args.actorId}).`,
|
|
@@ -170,24 +169,24 @@ function singleEvents(args, view) {
|
|
|
170
169
|
args.subjectProvenance
|
|
171
170
|
? participantEvent(SINGLE, {
|
|
172
171
|
id: "event-001-subject",
|
|
173
|
-
at: args.createdAt,
|
|
172
|
+
at: args.run.createdAt,
|
|
174
173
|
level: "info",
|
|
175
174
|
type: "cua-lab.subject.provenance",
|
|
176
|
-
//
|
|
175
|
+
// Claim "cloned/packed and served" only when it actually happened.
|
|
177
176
|
message: `${subjectProvenanceMessage(args.subjectProvenance, publicAppUrl, args.dryRun, args.session !== undefined)} (subject env names: ${args.subjectProvenance.envNames.length > 0 ? args.subjectProvenance.envNames.join(", ") : "none"}; values never persisted); state: ${describeSubjectState(args.subjectProvenance.state, args.dryRun)}.`,
|
|
178
177
|
})
|
|
179
178
|
: participantEvent(SINGLE, {
|
|
180
179
|
id: "event-001-subject",
|
|
181
|
-
at: args.createdAt,
|
|
180
|
+
at: args.run.createdAt,
|
|
182
181
|
level: "info",
|
|
183
182
|
type: "cua-lab.subject.declared",
|
|
184
|
-
//
|
|
185
|
-
// local-app / in-process subject is an already-running
|
|
186
|
-
// provisioned; it cannot be commit-pinned, so its provenance is
|
|
183
|
+
// Declare what the subject was, including the absence of a pin. A
|
|
184
|
+
// local-app / in-process subject is an already-running local dev server the caller
|
|
185
|
+
// provisioned; it cannot be commit-pinned, so its provenance is unpinned and
|
|
187
186
|
// no E2B desktop was created. A plain app-url entry runs inside the desktop sandbox, or,
|
|
188
187
|
// on the local VM, reaches the host's loopback from the VM's browser.
|
|
189
188
|
message: args.entryKind === "local-app"
|
|
190
|
-
? `Subject app declared at ${publicAppUrl}
|
|
189
|
+
? `Subject app declared at ${publicAppUrl}: a running local dev server driven in this process, with no clone and no E2B desktop. Provenance: provided by the caller and unpinned, because a running dev server has no commit to pin.`
|
|
191
190
|
: runnerSubstrate(args) === "local-desktop"
|
|
192
191
|
? `Subject app declared at ${publicAppUrl} (the host's loopback, opened from a browser on a local VM).`
|
|
193
192
|
: `Subject app declared at ${publicAppUrl} (loopback inside the desktop sandbox).`,
|
|
@@ -195,7 +194,7 @@ function singleEvents(args, view) {
|
|
|
195
194
|
args.session
|
|
196
195
|
? participantEvent(SINGLE, {
|
|
197
196
|
id: "event-002-session",
|
|
198
|
-
at: args.createdAt,
|
|
197
|
+
at: args.run.createdAt,
|
|
199
198
|
level: args.session.status === "passed" ? "info" : "warn",
|
|
200
199
|
type: `cua-lab.session.${args.session.completionReason}`,
|
|
201
200
|
message: `${args.session.status}: ${args.session.reason}`,
|
|
@@ -203,7 +202,7 @@ function singleEvents(args, view) {
|
|
|
203
202
|
: args.inProgress === true
|
|
204
203
|
? participantEvent(SINGLE, {
|
|
205
204
|
id: "event-002-running",
|
|
206
|
-
at: args.createdAt,
|
|
205
|
+
at: args.run.createdAt,
|
|
207
206
|
level: "info",
|
|
208
207
|
type: "cua-lab.session.running",
|
|
209
208
|
message: "Live computer-use session is running; terminal evidence has not been written yet.",
|
|
@@ -211,22 +210,22 @@ function singleEvents(args, view) {
|
|
|
211
210
|
: args.sessionError !== undefined
|
|
212
211
|
? participantEvent(SINGLE, {
|
|
213
212
|
id: "event-002-session",
|
|
214
|
-
at: args.createdAt,
|
|
213
|
+
at: args.run.createdAt,
|
|
215
214
|
level: "error",
|
|
216
215
|
type: "cua-lab.session.error",
|
|
217
216
|
message: args.sessionError,
|
|
218
217
|
})
|
|
219
218
|
: participantEvent(SINGLE, {
|
|
220
219
|
id: "event-002-contract",
|
|
221
|
-
at: args.createdAt,
|
|
220
|
+
at: args.run.createdAt,
|
|
222
221
|
level: "info",
|
|
223
222
|
type: "cua-lab.contract.ready",
|
|
224
|
-
message: "Dry-run
|
|
223
|
+
message: "Dry-run bundle ready; switch scenario.mode to live for a real desktop session.",
|
|
225
224
|
}),
|
|
226
225
|
];
|
|
227
226
|
const record = (event) => events.push(participantEvent(SINGLE, event));
|
|
228
227
|
// Persisted phase trail (real boot timing, not just a coarse provenance sentence): one
|
|
229
|
-
// RunEvent per
|
|
228
|
+
// RunEvent per completed phase boundary (started events never persist here; they carry no
|
|
230
229
|
// durationMs). ok:false phases warn rather than error, since the failing phase's own thrown
|
|
231
230
|
// error already becomes the terminal cua-lab.session.error event above.
|
|
232
231
|
let phaseEventSeq = 3;
|
|
@@ -242,7 +241,7 @@ function singleEvents(args, view) {
|
|
|
242
241
|
for (const warning of desktopGeometry?.warnings ?? []) {
|
|
243
242
|
record({
|
|
244
243
|
id: `event-${String(phaseEventSeq++).padStart(3, "0")}-geometry-warning`,
|
|
245
|
-
at: args.createdAt,
|
|
244
|
+
at: args.run.createdAt,
|
|
246
245
|
level: "warn",
|
|
247
246
|
type: "cua-lab.geometry.warning",
|
|
248
247
|
message: warning,
|
|
@@ -252,17 +251,15 @@ function singleEvents(args, view) {
|
|
|
252
251
|
}
|
|
253
252
|
function singleReview(args, view, stream) {
|
|
254
253
|
const { reason } = view;
|
|
255
|
-
// A funnel with a denominator of one is still the funnel
|
|
254
|
+
// A funnel with a denominator of one is still the funnel, and its absence stays recorded: no
|
|
256
255
|
// declared protocol (or a dry run) means no `tasks` field, never an empty one.
|
|
257
|
-
const
|
|
256
|
+
const singleRunTasks = args.inProgress !== true && args.session?.trace.taskFunnel !== undefined
|
|
258
257
|
? aggregateTaskFunnels([args.session.trace.taskFunnel])
|
|
259
258
|
: undefined;
|
|
260
|
-
// What happened to the participant, as the
|
|
261
|
-
// applies (
|
|
262
|
-
// run the
|
|
263
|
-
//
|
|
264
|
-
// repeated it. Found on a real drawDB run whose participant wrote "Blocked after partial
|
|
265
|
-
// completion".
|
|
259
|
+
// What happened to the participant, as the route judged it: the same rule the fan-out roll-up
|
|
260
|
+
// applies (participantStatus in src/run/judge.ts). Reading the actor's own status instead would write up
|
|
261
|
+
// a run the route refused as "not a credible pass" as verdict pass, 1/1 reached the goal, and
|
|
262
|
+
// every projection of the bundle (Observer tally, `runs`, the status index) would repeat it.
|
|
266
263
|
const participantStatus = args.session === undefined
|
|
267
264
|
? undefined
|
|
268
265
|
: participantStatusFor(args.session.status, args.credibility);
|
|
@@ -274,20 +271,20 @@ function singleReview(args, view, stream) {
|
|
|
274
271
|
const review = withCuaReviewProvenance({
|
|
275
272
|
schema: REVIEW_SCHEMA,
|
|
276
273
|
verdict: args.verdict,
|
|
277
|
-
// One
|
|
278
|
-
// result from being read as though it generalized.
|
|
274
|
+
// One participant is still a study with a denominator of one, and saying so keeps a
|
|
275
|
+
// single-participant result from being read as though it generalized.
|
|
279
276
|
...(participantStatus !== undefined && args.inProgress !== true
|
|
280
277
|
? {
|
|
281
278
|
participants: tallyParticipantOutcomes([participantStatus], [args.credibility?.reportedFriction === true]),
|
|
282
279
|
}
|
|
283
280
|
: {}),
|
|
284
|
-
...(
|
|
281
|
+
...(singleRunTasks === undefined ? {} : { tasks: singleRunTasks }),
|
|
285
282
|
summary: credibilityNote === undefined ? reason : `${credibilityNote} ${reason}`,
|
|
286
283
|
gaps: args.session || args.sessionError !== undefined
|
|
287
284
|
? []
|
|
288
285
|
: args.inProgress === true
|
|
289
286
|
? ["Live desktop session is still running."]
|
|
290
|
-
: ["Live desktop session not yet run (dry
|
|
287
|
+
: ["Live desktop session not yet run (dry run only)."],
|
|
291
288
|
}, [stream]);
|
|
292
289
|
return review;
|
|
293
290
|
}
|
|
@@ -305,33 +302,29 @@ export function buildSingleParticipantBundle(args) {
|
|
|
305
302
|
const events = singleEvents(args, view);
|
|
306
303
|
const review = singleReview(args, view, stream);
|
|
307
304
|
return {
|
|
308
|
-
...bundleHead({
|
|
305
|
+
...bundleHead(args.run, {
|
|
309
306
|
...(args.realEmail && !args.dryRun
|
|
310
307
|
? { publication: { restrictions: ["real-communications"] } }
|
|
311
308
|
: {}),
|
|
312
|
-
runId: args.runId,
|
|
313
|
-
mode: args.dryRun ? "dry-run" : "live",
|
|
314
309
|
participants: 1,
|
|
315
|
-
createdAt: args.createdAt,
|
|
316
|
-
...(args.lab === undefined ? {} : { lab: args.lab }),
|
|
317
310
|
source: args.source,
|
|
318
311
|
}),
|
|
319
312
|
persona: {
|
|
320
313
|
id: args.persona.id,
|
|
321
314
|
name: `Computer-use operator (${args.persona.id})`,
|
|
322
|
-
source: `
|
|
315
|
+
source: `study:${args.labId}`,
|
|
323
316
|
sourceDigest: args.persona.promptDigest,
|
|
324
317
|
},
|
|
325
318
|
scenario: {
|
|
326
319
|
id: `cua-${args.labId}`,
|
|
327
320
|
title: args.labTitle ?? `Computer-use lab: ${args.labId}`,
|
|
328
321
|
goal: redactText(args.mission),
|
|
329
|
-
source: `
|
|
322
|
+
source: `study:${args.labId}`,
|
|
330
323
|
sourceDigest: args.persona.promptDigest,
|
|
331
324
|
},
|
|
332
325
|
lifecycle: [
|
|
333
326
|
{
|
|
334
|
-
at: args.createdAt,
|
|
327
|
+
at: args.run.createdAt,
|
|
335
328
|
event: "cua-lab.run.created",
|
|
336
329
|
message: `Created computer-use lab run with one participant in a desktop browser (actor ${args.actorId}).`,
|
|
337
330
|
},
|
|
@@ -342,7 +335,7 @@ export function buildSingleParticipantBundle(args) {
|
|
|
342
335
|
redaction: {
|
|
343
336
|
status: "passed",
|
|
344
337
|
notes: traceScreenshotMode === "raw"
|
|
345
|
-
? "Typed text recorded as length only and reasoning
|
|
338
|
+
? "Typed text is recorded as its length only, and reasoning and messages pass through text redaction. Screenshots are unblurred and kept for local use; they are not redacted for publishing. Set policies.redactScreenshots: true to blur screenshots in a bundle you plan to share."
|
|
346
339
|
: traceScreenshotMode === "blurred"
|
|
347
340
|
? "Typed text recorded as length only and reasoning/messages pass through text redaction. Screenshots are blurred at capture (policies.redactScreenshots: true) for a share-as-is bundle."
|
|
348
341
|
: args.screenshots.length > 0
|
|
@@ -351,12 +344,12 @@ export function buildSingleParticipantBundle(args) {
|
|
|
351
344
|
},
|
|
352
345
|
artifacts: bundleArtifacts(),
|
|
353
346
|
review,
|
|
354
|
-
// What the participant reported, when it reported anything
|
|
355
|
-
// bundles carry none
|
|
347
|
+
// What the participant reported, when it reported anything. Dry-run and in-progress
|
|
348
|
+
// bundles carry none: there is no participant yet to quote.
|
|
356
349
|
feedbackCandidates: args.dryRun || args.inProgress === true
|
|
357
350
|
? []
|
|
358
351
|
: participantFeedbackCandidates({
|
|
359
|
-
runId: args.runId,
|
|
352
|
+
runId: args.run.runId,
|
|
360
353
|
scenarioId: `cua-${args.labId}`,
|
|
361
354
|
adapterId: args.labId,
|
|
362
355
|
goal: redactText(args.mission),
|
|
@@ -383,8 +376,8 @@ export function buildSingleParticipantBundle(args) {
|
|
|
383
376
|
...(args.providerResources === undefined || args.providerResources.length === 0
|
|
384
377
|
? {}
|
|
385
378
|
: { providerResources: args.providerResources }),
|
|
386
|
-
// Structured subject provenance
|
|
387
|
-
//
|
|
379
|
+
// Structured subject provenance: code pin + state story. Uniform, and
|
|
380
|
+
// stated on app-url bundles too: the caller minted the URL, its state is the caller's.
|
|
388
381
|
// CuaSubjectProvenanceArg's two variants (clone, local-tree) are already RunSubjectProvenance-
|
|
389
382
|
// shaped, so no reconstruction is needed beyond the app-url fallback.
|
|
390
383
|
subject: args.subjectProvenance ?? { source: "app-url", state: { provenance: "undeclared" } },
|
|
@@ -2,16 +2,14 @@ import type { ComputerUsePlan } from "../../lab/plan-types.js";
|
|
|
2
2
|
import type { LabSubjectState } from "../../lab/types.js";
|
|
3
3
|
import { type RunSubjectProvenance, type RunSubjectStateStepRecord } from "../../run/bundle.js";
|
|
4
4
|
import { type LocalTreeArchive } from "../../subject/local-tree-archive.js";
|
|
5
|
-
import { type CuaSubjectRoute } from "./plan.js";
|
|
6
5
|
import { type DesktopParticipantRun, type CuaSubjectProjection, type CuaSubjectProvenanceArg, type ParticipantRunOutcome } from "./types.js";
|
|
7
6
|
/**
|
|
8
|
-
* Each
|
|
7
|
+
* Each participant's subject projection. A participant's outcome adds the subject commit it resolved and the
|
|
9
8
|
* state steps it executed; without outcomes (dry run, or a run still in progress) the declared
|
|
10
9
|
* state is projected as not yet run.
|
|
11
10
|
*/
|
|
12
11
|
export declare function projectParticipantSubjects(args: {
|
|
13
12
|
plan: ComputerUsePlan;
|
|
14
|
-
subjectRoute: CuaSubjectRoute;
|
|
15
13
|
publicRepo?: string;
|
|
16
14
|
localTreeArchive?: LocalTreeArchive;
|
|
17
15
|
runs: readonly DesktopParticipantRun[];
|
|
@@ -20,7 +18,7 @@ export declare function projectParticipantSubjects(args: {
|
|
|
20
18
|
}): CuaSubjectProjection[];
|
|
21
19
|
/**
|
|
22
20
|
* Resolve the bundle's state marker from the declaration and what actually ran.
|
|
23
|
-
* Precedence: external declared → "unpinned" (seed records, if any, stay attached
|
|
21
|
+
* Precedence: external declared → "unpinned" (seed records, if any, stay attached; a
|
|
24
22
|
* migrated external DB is still unpinned overall); else seed declared → "seeded" only when
|
|
25
23
|
* every declared step executed ok on a live run, otherwise "declared-not-run" (dry-run
|
|
26
24
|
* contract bundles and failed live provisioning); no declaration → "undeclared".
|
|
@@ -35,10 +33,10 @@ export declare function resolveSubjectState(args: {
|
|
|
35
33
|
* default branch that builder already handles). */
|
|
36
34
|
export declare function subjectProvenanceArg(subject: CuaSubjectProjection, publicRepo: string | undefined, subjectEnvNames: string[]): CuaSubjectProvenanceArg | undefined;
|
|
37
35
|
/**
|
|
38
|
-
* The run-level subject for the top level and the bundle. Local-tree
|
|
39
|
-
* once-per-run archive, so every
|
|
40
|
-
* the first
|
|
41
|
-
* aggregate carries it only when every
|
|
36
|
+
* The run-level subject for the top level and the bundle. Local-tree participants all pack from the
|
|
37
|
+
* same once-per-run archive, so every participant already carries the identical archiveSha256/commit/dirty and
|
|
38
|
+
* the first participant's projection is the aggregate. Clone participants each resolve their own
|
|
39
|
+
* commit; the aggregate carries it only when every participant agrees, and warns when they diverge.
|
|
42
40
|
*/
|
|
43
41
|
export declare function aggregateCuaSubject(args: {
|
|
44
42
|
subjects: readonly CuaSubjectProjection[];
|
|
@@ -1,32 +1,33 @@
|
|
|
1
|
-
// Each
|
|
2
|
-
// the
|
|
1
|
+
// Each participant's subject projection and the subject-state marker, from the declared subject
|
|
2
|
+
// and what the participants ran; the run-level subject aggregated from them; and the provenance argument the
|
|
3
3
|
// bundle builders take.
|
|
4
4
|
import { commandDigestOf } from "../../subject/state.js";
|
|
5
5
|
import { cuaDeclaredState } from "./plan.js";
|
|
6
6
|
import {} from "../../run/bundle.js";
|
|
7
7
|
import {} from "../../subject/local-tree-archive.js";
|
|
8
|
-
import {} from "./
|
|
9
|
-
import {} from "./types.js";
|
|
8
|
+
import { participantSubjectEnv, } from "./types.js";
|
|
10
9
|
/**
|
|
11
|
-
* Each
|
|
10
|
+
* Each participant's subject projection. A participant's outcome adds the subject commit it resolved and the
|
|
12
11
|
* state steps it executed; without outcomes (dry run, or a run still in progress) the declared
|
|
13
12
|
* state is projected as not yet run.
|
|
14
13
|
*/
|
|
15
14
|
export function projectParticipantSubjects(args) {
|
|
16
|
-
const {
|
|
15
|
+
const { publicRepo, localTreeArchive } = args;
|
|
16
|
+
const { subject } = args.plan.runner;
|
|
17
|
+
const subjectEnvNames = [...participantSubjectEnv(subject)];
|
|
18
|
+
// Only a provisioned subject declares state; cuaDeclaredState is undefined for the others.
|
|
17
19
|
const declaredState = cuaDeclaredState(args.plan);
|
|
18
20
|
return args.runs.map((_spec, index) => {
|
|
19
21
|
const outcome = args.outcomes?.[index];
|
|
20
22
|
const subjectState = resolveSubjectState({
|
|
21
|
-
declared:
|
|
23
|
+
declared: declaredState,
|
|
22
24
|
dryRun: args.dryRun,
|
|
23
25
|
executed: outcome?.stateStepRecords ?? [],
|
|
24
26
|
});
|
|
25
27
|
return participantSubjectProjection({
|
|
26
|
-
|
|
27
|
-
localTreeRoute: subjectRoute.localTreeRoute,
|
|
28
|
+
kind: subject.kind,
|
|
28
29
|
...(publicRepo === undefined ? {} : { publicRepo }),
|
|
29
|
-
subjectEnvNames
|
|
30
|
+
subjectEnvNames,
|
|
30
31
|
...(outcome?.subjectCommit === undefined ? {} : { subjectCommit: outcome.subjectCommit }),
|
|
31
32
|
...(localTreeArchive === undefined ? {} : { localTreeArchive }),
|
|
32
33
|
subjectState,
|
|
@@ -35,7 +36,7 @@ export function projectParticipantSubjects(args) {
|
|
|
35
36
|
}
|
|
36
37
|
/**
|
|
37
38
|
* Resolve the bundle's state marker from the declaration and what actually ran.
|
|
38
|
-
* Precedence: external declared → "unpinned" (seed records, if any, stay attached
|
|
39
|
+
* Precedence: external declared → "unpinned" (seed records, if any, stay attached; a
|
|
39
40
|
* migrated external DB is still unpinned overall); else seed declared → "seeded" only when
|
|
40
41
|
* every declared step executed ok on a live run, otherwise "declared-not-run" (dry-run
|
|
41
42
|
* contract bundles and failed live provisioning); no declaration → "undeclared".
|
|
@@ -47,8 +48,8 @@ export function resolveSubjectState(args) {
|
|
|
47
48
|
}
|
|
48
49
|
const declaredSeed = declared.seed ?? [];
|
|
49
50
|
const external = declared.external ?? [];
|
|
50
|
-
// Dry-run: nothing executes (no sandbox)
|
|
51
|
-
// command digest only, with
|
|
51
|
+
// Dry-run: nothing executes (no sandbox), so record the declared recipe: name, phase, and
|
|
52
|
+
// command digest only, with no execution fields.
|
|
52
53
|
const seed = args.dryRun
|
|
53
54
|
? declaredSeed.map((step) => ({
|
|
54
55
|
name: step.name,
|
|
@@ -73,12 +74,12 @@ export function resolveSubjectState(args) {
|
|
|
73
74
|
...(external.length > 0 ? { externalEnvNames: external } : {}),
|
|
74
75
|
};
|
|
75
76
|
}
|
|
76
|
-
/** Build the per-
|
|
77
|
-
* host-packed archive, so every
|
|
78
|
-
* commit/dirty (no
|
|
77
|
+
/** Build the per-participant subject projection. Local-tree participants all share
|
|
78
|
+
* one host-packed archive, so every participant's projection carries the identical archiveSha256/
|
|
79
|
+
* commit/dirty (no divergence is possible, unlike the clone route's per-participant
|
|
79
80
|
* in-sandbox commit). */
|
|
80
81
|
function participantSubjectProjection(args) {
|
|
81
|
-
if (args.
|
|
82
|
+
if (args.kind === "clone" && args.publicRepo) {
|
|
82
83
|
return {
|
|
83
84
|
source: "clone",
|
|
84
85
|
repo: args.publicRepo,
|
|
@@ -87,7 +88,7 @@ function participantSubjectProjection(args) {
|
|
|
87
88
|
state: args.subjectState,
|
|
88
89
|
};
|
|
89
90
|
}
|
|
90
|
-
if (args.
|
|
91
|
+
if (args.kind === "local-tree") {
|
|
91
92
|
const archive = args.localTreeArchive;
|
|
92
93
|
return {
|
|
93
94
|
source: "local-tree",
|
|
@@ -127,10 +128,10 @@ export function subjectProvenanceArg(subject, publicRepo, subjectEnvNames) {
|
|
|
127
128
|
return undefined;
|
|
128
129
|
}
|
|
129
130
|
/**
|
|
130
|
-
* The run-level subject for the top level and the bundle. Local-tree
|
|
131
|
-
* once-per-run archive, so every
|
|
132
|
-
* the first
|
|
133
|
-
* aggregate carries it only when every
|
|
131
|
+
* The run-level subject for the top level and the bundle. Local-tree participants all pack from the
|
|
132
|
+
* same once-per-run archive, so every participant already carries the identical archiveSha256/commit/dirty and
|
|
133
|
+
* the first participant's projection is the aggregate. Clone participants each resolve their own
|
|
134
|
+
* commit; the aggregate carries it only when every participant agrees, and warns when they diverge.
|
|
134
135
|
*/
|
|
135
136
|
export function aggregateCuaSubject(args) {
|
|
136
137
|
const { subjects, outcomes, participantCount, dryRun } = args;
|
|
@@ -143,7 +144,7 @@ export function aggregateCuaSubject(args) {
|
|
|
143
144
|
const unanimous = !dryRun && commits.length === participantCount && new Set(commits).size === 1;
|
|
144
145
|
const warnings = !dryRun && participantCount > 1 && new Set(commits).size > 1
|
|
145
146
|
? [
|
|
146
|
-
"
|
|
147
|
+
"Participants resolved different subject commits, so the top-level subject.commit is omitted; each participant's provenance in result.lanes has its pinned commit.",
|
|
147
148
|
]
|
|
148
149
|
: [];
|
|
149
150
|
return {
|