humanish 0.107.0 → 0.109.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 +73 -69
- package/CHANGELOG.md +27 -0
- package/CONTEXT.md +51 -44
- package/README.md +148 -175
- 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-trace.js +2 -1
- package/dist/actors/codex/app-server-ui.js +1 -1
- package/dist/actors/codex/codex-admission.d.ts +91 -0
- package/dist/actors/codex/codex-admission.js +150 -0
- package/dist/actors/codex/restricted-executable.d.ts +4 -4
- package/dist/actors/codex/restricted-executable.js +8 -8
- package/dist/actors/codex/restricted-launch.d.ts +2 -1
- package/dist/actors/codex/restricted-launch.js +1 -1
- package/dist/actors/codex/restricted-participant.js +20 -18
- package/dist/actors/codex/restricted-policy.d.ts +2 -2
- package/dist/actors/codex/restricted-policy.js +2 -2
- package/dist/actors/codex/restricted-session.d.ts +3 -3
- package/dist/actors/codex/restricted-session.js +10 -5
- package/dist/actors/computer-use/actor.d.ts +18 -18
- package/dist/actors/computer-use/actor.js +4 -4
- package/dist/actors/computer-use/admission-limit.d.ts +3 -3
- package/dist/actors/computer-use/admission-limit.js +4 -4
- package/dist/actors/computer-use/executor-error.d.ts +2 -2
- package/dist/actors/computer-use/executor-error.js +3 -3
- package/dist/actors/computer-use/loop/actions.d.ts +3 -3
- package/dist/actors/computer-use/loop/actions.js +15 -15
- package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
- package/dist/actors/computer-use/loop/backstop.js +14 -12
- package/dist/actors/computer-use/loop/debrief.js +2 -2
- package/dist/actors/computer-use/loop/ending.d.ts +6 -6
- package/dist/actors/computer-use/loop/ending.js +18 -17
- package/dist/actors/computer-use/loop/observation.d.ts +2 -2
- package/dist/actors/computer-use/loop/observation.js +15 -14
- package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
- package/dist/actors/computer-use/loop/provider-call.js +12 -12
- package/dist/actors/computer-use/loop/session.d.ts +4 -4
- package/dist/actors/computer-use/loop/session.js +4 -4
- package/dist/actors/computer-use/loop/spend.d.ts +1 -1
- package/dist/actors/computer-use/loop/spend.js +1 -1
- package/dist/actors/computer-use/loop/trace.js +11 -9
- package/dist/actors/computer-use/loop/types.d.ts +47 -45
- package/dist/actors/computer-use/loop/usage.d.ts +2 -2
- package/dist/actors/computer-use/loop/usage.js +2 -2
- package/dist/actors/computer-use/loop.d.ts +6 -1
- package/dist/actors/computer-use/loop.js +26 -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 +13 -10
- package/dist/actors/computer-use/openai-provider.js +52 -41
- 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/computer-use/provider-error.d.ts +4 -4
- package/dist/actors/computer-use/provider-error.js +6 -6
- package/dist/actors/contract.d.ts +82 -47
- package/dist/actors/contract.js +30 -24
- package/dist/actors/local-agent/claude-session.d.ts +1 -1
- package/dist/actors/local-agent/claude-session.js +13 -12
- package/dist/actors/local-agent/cli.d.ts +9 -7
- 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 +8 -8
- package/dist/actors/registry.d.ts +12 -12
- package/dist/actors/registry.js +21 -20
- package/dist/actors/scripted-browser/actor.d.ts +10 -10
- package/dist/actors/scripted-browser/actor.js +17 -17
- package/dist/actors/scripted-browser/browser-command.js +1 -1
- package/dist/actors/scripted-browser/steps.js +1 -1
- package/dist/actors/scripted-browser/types.d.ts +1 -1
- package/dist/actors/stop-conditions.d.ts +1 -1
- package/dist/analysis/automatic-completion.d.ts +7 -7
- package/dist/analysis/automatic-completion.js +1 -1
- package/dist/analysis/automatic-config.d.ts +6 -6
- package/dist/analysis/automatic-config.js +1 -1
- package/dist/analysis/codex-config.d.ts +6 -2
- package/dist/analysis/codex-config.js +22 -14
- package/dist/analysis/execute.d.ts +1 -1
- package/dist/analysis/execute.js +1 -1
- package/dist/analysis/service.js +5 -5
- package/dist/analysis/types.d.ts +6 -0
- package/dist/browser-control/client.js +16 -16
- package/dist/browser-control/dispatcher.js +4 -4
- package/dist/browser-control/protocol.js +14 -14
- package/dist/browser-control/recording-transfer.js +4 -4
- package/dist/browser-control/transport.js +7 -7
- package/dist/cli/commands/analysis-signals.d.ts +2 -2
- package/dist/cli/commands/analyze.js +19 -16
- package/dist/cli/commands/codex.js +9 -9
- package/dist/cli/commands/comms.js +48 -35
- package/dist/cli/commands/feedback.js +20 -21
- package/dist/cli/commands/migrate.d.ts +4 -0
- package/dist/cli/commands/migrate.js +65 -0
- package/dist/cli/commands/observe.d.ts +0 -1
- package/dist/cli/commands/observe.js +136 -112
- package/dist/cli/commands/run-command.d.ts +10 -0
- package/dist/cli/commands/run-command.js +85 -0
- package/dist/cli/commands/runs.js +136 -139
- package/dist/cli/commands/setup.d.ts +2 -2
- package/dist/cli/commands/setup.js +27 -24
- package/dist/cli/commands/study-format.d.ts +9 -0
- package/dist/cli/commands/{lab-format.js → study-format.js} +39 -27
- package/dist/cli/commands/{lab-route-computer-use.d.ts → study-route-computer-use.d.ts} +6 -6
- package/dist/cli/commands/{lab-route-computer-use.js → study-route-computer-use.js} +17 -18
- package/dist/cli/commands/{lab-route-open.d.ts → study-route-open.d.ts} +4 -4
- package/dist/cli/commands/{lab-route-open.js → study-route-open.js} +2 -2
- package/dist/cli/commands/{lab-route-preview.d.ts → study-route-preview.d.ts} +7 -7
- package/dist/cli/commands/{lab-route-preview.js → study-route-preview.js} +7 -6
- package/dist/cli/commands/study-route-run.d.ts +19 -0
- package/dist/cli/commands/{lab-route-run.js → study-route-run.js} +6 -6
- package/dist/cli/commands/study-route-scripted.d.ts +17 -0
- package/dist/cli/commands/{lab-route-scripted.js → study-route-scripted.js} +4 -4
- package/dist/cli/commands/{lab-route-shared-world.d.ts → study-route-shared-world.d.ts} +5 -5
- package/dist/cli/commands/{lab-route-shared-world.js → study-route-shared-world.js} +10 -10
- package/dist/cli/commands/study-route-terminal.d.ts +17 -0
- package/dist/cli/commands/{lab-route-terminal.js → study-route-terminal.js} +4 -4
- package/dist/cli/commands/study-run.d.ts +9 -0
- package/dist/cli/commands/{lab-run.js → study-run.js} +44 -45
- package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +7 -7
- package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +2 -2
- package/dist/cli/commands/study.d.ts +3 -0
- package/dist/cli/commands/study.js +146 -0
- package/dist/cli/commands/tui.d.ts +4 -4
- package/dist/cli/commands/tui.js +31 -31
- package/dist/cli/commands/watch.js +71 -121
- package/dist/cli/deprecations.d.ts +6 -0
- package/dist/cli/deprecations.js +18 -0
- package/dist/cli/doctor.d.ts +18 -8
- package/dist/cli/doctor.js +114 -59
- package/dist/cli/first-run-path.d.ts +15 -13
- package/dist/cli/first-run-path.js +35 -33
- package/dist/cli/io.d.ts +44 -9
- package/dist/cli/io.js +98 -23
- package/dist/cli/observer-follow.d.ts +3 -3
- package/dist/cli/observer-follow.js +6 -7
- package/dist/cli/orientation.d.ts +10 -7
- package/dist/cli/orientation.js +89 -47
- 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 +111 -43
- package/dist/cli/telemetry.d.ts +16 -16
- package/dist/cli/telemetry.js +46 -44
- package/dist/cli.js +1 -1
- package/dist/comms/capture-surface.d.ts +13 -12
- package/dist/comms/capture-surface.js +23 -22
- package/dist/comms/catch-host.d.ts +7 -7
- package/dist/comms/catch-host.js +17 -17
- package/dist/comms/connections.d.ts +1 -1
- package/dist/comms/connections.js +2 -2
- package/dist/comms/email-catch.d.ts +3 -3
- package/dist/comms/email-catch.js +8 -8
- package/dist/comms/external-evidence.d.ts +5 -5
- package/dist/comms/external-evidence.js +5 -4
- package/dist/comms/extract.js +2 -2
- package/dist/comms/fake-inbox.d.ts +3 -3
- package/dist/comms/fake-inbox.js +3 -3
- package/dist/comms/receiving-render.d.ts +1 -1
- package/dist/comms/receiving-render.js +2 -2
- package/dist/comms/receiving-runtime.d.ts +4 -4
- 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 +38 -39
- package/dist/comms/sandbox-catch.js +36 -37
- package/dist/comms/setup.d.ts +2 -2
- package/dist/comms/setup.js +56 -25
- package/dist/comms/thread-evidence.d.ts +1 -1
- package/dist/comms/thread-evidence.js +6 -6
- package/dist/comms/types.d.ts +6 -6
- package/dist/comms/types.js +3 -3
- package/dist/evidence/frame-signature.d.ts +1 -1
- package/dist/evidence/frame-signature.js +4 -4
- package/dist/evidence/redaction.d.ts +3 -3
- package/dist/evidence/redaction.js +4 -4
- package/dist/feedback/draft.js +38 -80
- package/dist/feedback/export-bundle.js +1 -1
- package/dist/feedback/export.d.ts +5 -1
- package/dist/feedback/export.js +10 -10
- package/dist/feedback/feedback.d.ts +2 -2
- package/dist/feedback/feedback.js +21 -3
- package/dist/feedback/proof.d.ts +1 -1
- package/dist/feedback/proof.js +2 -2
- package/dist/guest/bootstrap.js +6 -6
- package/dist/guest/browser-tools.js +8 -8
- package/dist/guest/chromium-text.js +19 -19
- package/dist/guest/desktop-executor.d.ts +2 -2
- package/dist/guest/desktop-executor.js +20 -20
- package/dist/guest/desktop-keys.js +4 -4
- package/dist/guest/desktop-media.d.ts +2 -2
- package/dist/guest/desktop-media.js +16 -16
- package/dist/guest/desktop-native.d.ts +1 -1
- package/dist/guest/desktop-native.js +10 -10
- package/dist/guest/runtime-desktop.js +2 -2
- package/dist/guest/runtime-processes.d.ts +2 -2
- package/dist/guest/runtime-processes.js +2 -2
- package/dist/guest/runtime.js +6 -6
- package/dist/index.d.ts +14 -14
- package/dist/index.js +8 -8
- package/dist/keys/key-resolution.d.ts +5 -5
- package/dist/keys/key-resolution.js +23 -23
- package/dist/observer/artifact.d.ts +2 -2
- package/dist/observer/artifact.js +7 -7
- package/dist/observer/data.d.ts +6 -6
- package/dist/observer/data.js +5 -4
- package/dist/observer/exposure.d.ts +1 -1
- package/dist/observer/exposure.js +11 -11
- package/dist/observer/http.js +1 -1
- package/dist/observer/library.d.ts +3 -1
- package/dist/observer/library.js +8 -3
- package/dist/observer/listen.js +5 -4
- package/dist/observer/render.d.ts +1 -1
- package/dist/observer/render.js +17 -6
- package/dist/observer/run-routes.d.ts +4 -3
- package/dist/observer/run-routes.js +38 -13
- package/dist/observer/serve.d.ts +1 -1
- package/dist/observer/serve.js +7 -3
- package/dist/observer/tunnel.js +1 -1
- package/dist/observer-app.html +4 -4
- package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
- package/dist/routes/computer-use/bundle-parts.js +18 -17
- package/dist/routes/computer-use/bundle.d.ts +2 -2
- package/dist/routes/computer-use/bundle.js +10 -9
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +6 -6
- package/dist/routes/computer-use/e2b-desktop/comms.js +18 -17
- package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +5 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
- package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/prepare.js +10 -10
- package/dist/routes/computer-use/e2b-desktop/start.js +7 -7
- package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
- package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -2
- package/dist/routes/computer-use/external-comms.d.ts +4 -4
- package/dist/routes/computer-use/external-comms.js +1 -1
- package/dist/routes/computer-use/fanout-bundle.js +27 -26
- package/dist/routes/computer-use/fanout-records.js +12 -13
- package/dist/routes/computer-use/live-flush.d.ts +4 -4
- package/dist/routes/computer-use/live-flush.js +6 -6
- package/dist/routes/computer-use/live-phase.d.ts +5 -4
- package/dist/routes/computer-use/live-phase.js +8 -8
- package/dist/routes/computer-use/local-tree-pack.d.ts +5 -5
- package/dist/routes/computer-use/local-tree-pack.js +1 -1
- package/dist/routes/computer-use/local-vm.d.ts +8 -8
- package/dist/routes/computer-use/local-vm.js +3 -3
- package/dist/routes/computer-use/participant-desktop.d.ts +7 -7
- package/dist/routes/computer-use/participant-desktop.js +5 -5
- package/dist/routes/computer-use/participant-execution.d.ts +4 -4
- package/dist/routes/computer-use/participant-execution.js +10 -10
- package/dist/routes/computer-use/participant-model.d.ts +6 -0
- package/dist/routes/computer-use/participant-model.js +33 -15
- package/dist/routes/computer-use/participant-prompt.d.ts +15 -15
- package/dist/routes/computer-use/participant-prompt.js +9 -9
- package/dist/routes/computer-use/participant-runs.d.ts +16 -16
- package/dist/routes/computer-use/participant-runs.js +26 -25
- package/dist/routes/computer-use/plan.d.ts +12 -12
- package/dist/routes/computer-use/plan.js +42 -42
- package/dist/routes/computer-use/preflight.d.ts +5 -5
- package/dist/routes/computer-use/preflight.js +25 -25
- package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
- package/dist/routes/computer-use/rerun-selection.js +4 -3
- package/dist/routes/computer-use/result.d.ts +4 -4
- package/dist/routes/computer-use/result.js +22 -21
- package/dist/routes/computer-use/route.d.ts +12 -11
- package/dist/routes/computer-use/route.js +31 -30
- package/dist/routes/computer-use/self-report.d.ts +7 -7
- package/dist/routes/computer-use/self-report.js +32 -32
- package/dist/routes/computer-use/setup.d.ts +23 -23
- package/dist/routes/computer-use/setup.js +28 -29
- package/dist/routes/computer-use/single-bundle.d.ts +11 -11
- package/dist/routes/computer-use/single-bundle.js +40 -41
- package/dist/routes/computer-use/subject-projection.d.ts +4 -4
- package/dist/routes/computer-use/subject-projection.js +6 -6
- package/dist/routes/computer-use/types.d.ts +71 -73
- package/dist/routes/computer-use/types.js +12 -12
- package/dist/routes/preview.d.ts +13 -7
- package/dist/routes/preview.js +11 -7
- package/dist/routes/scripted/bundle.d.ts +7 -7
- package/dist/routes/scripted/bundle.js +20 -18
- package/dist/routes/scripted/plan.d.ts +8 -8
- package/dist/routes/scripted/plan.js +13 -13
- package/dist/routes/scripted/result.d.ts +3 -3
- package/dist/routes/scripted/result.js +13 -13
- package/dist/routes/scripted/route.d.ts +9 -9
- package/dist/routes/scripted/route.js +15 -16
- package/dist/routes/scripted/scenario.d.ts +1 -1
- package/dist/routes/scripted/scenario.js +5 -5
- package/dist/routes/scripted/setup.d.ts +6 -6
- package/dist/routes/scripted/setup.js +8 -8
- package/dist/routes/scripted/subject.d.ts +5 -5
- package/dist/routes/scripted/subject.js +4 -4
- package/dist/routes/scripted/surface-records.d.ts +1 -1
- package/dist/routes/scripted/surface-records.js +4 -4
- package/dist/routes/scripted/surface-sessions.d.ts +3 -3
- package/dist/routes/scripted/types.d.ts +18 -20
- package/dist/routes/scripted/types.js +2 -2
- package/dist/routes/shared-world/bundle-records.js +11 -10
- package/dist/routes/shared-world/bundle.d.ts +5 -5
- package/dist/routes/shared-world/bundle.js +46 -43
- package/dist/routes/shared-world/checkpoints.d.ts +4 -4
- package/dist/routes/shared-world/checkpoints.js +2 -2
- package/dist/routes/shared-world/comms.d.ts +14 -14
- package/dist/routes/shared-world/comms.js +19 -18
- package/dist/routes/shared-world/external-public.d.ts +4 -3
- package/dist/routes/shared-world/external-public.js +16 -12
- package/dist/routes/shared-world/handoff.d.ts +7 -6
- package/dist/routes/shared-world/handoff.js +65 -57
- package/dist/routes/shared-world/lobby-code.d.ts +2 -2
- package/dist/routes/shared-world/lobby-code.js +9 -9
- package/dist/routes/shared-world/participant-specs.d.ts +10 -9
- package/dist/routes/shared-world/participant-specs.js +38 -31
- package/dist/routes/shared-world/plan.d.ts +9 -9
- package/dist/routes/shared-world/plan.js +16 -16
- package/dist/routes/shared-world/provenance.d.ts +2 -2
- package/dist/routes/shared-world/provenance.js +2 -2
- package/dist/routes/shared-world/provisioned.d.ts +8 -8
- package/dist/routes/shared-world/provisioned.js +18 -17
- package/dist/routes/shared-world/result.d.ts +6 -6
- package/dist/routes/shared-world/result.js +29 -29
- package/dist/routes/shared-world/route.d.ts +11 -11
- package/dist/routes/shared-world/route.js +40 -39
- package/dist/routes/shared-world/setup.d.ts +16 -16
- package/dist/routes/shared-world/setup.js +23 -23
- package/dist/routes/shared-world/types.d.ts +55 -53
- package/dist/routes/shared-world/types.js +4 -4
- package/dist/routes/terminal/adapter.d.ts +5 -5
- package/dist/routes/terminal/adapter.js +9 -9
- package/dist/routes/terminal/bundle.d.ts +13 -13
- package/dist/routes/terminal/bundle.js +28 -27
- package/dist/routes/terminal/credentials.d.ts +8 -8
- package/dist/routes/terminal/credentials.js +12 -12
- package/dist/routes/terminal/dry-run.d.ts +4 -4
- package/dist/routes/terminal/dry-run.js +12 -12
- package/dist/routes/terminal/encoding.js +2 -2
- package/dist/routes/terminal/ledger.d.ts +5 -5
- package/dist/routes/terminal/ledger.js +14 -14
- package/dist/routes/terminal/lifetime.d.ts +1 -1
- package/dist/routes/terminal/lifetime.js +1 -1
- package/dist/routes/terminal/live-finish.d.ts +2 -2
- package/dist/routes/terminal/live-finish.js +10 -10
- package/dist/routes/terminal/live-sandbox.d.ts +2 -2
- package/dist/routes/terminal/live-sandbox.js +15 -15
- package/dist/routes/terminal/participant-text.js +2 -1
- package/dist/routes/terminal/persona.d.ts +2 -2
- package/dist/routes/terminal/persona.js +3 -3
- package/dist/routes/terminal/plan.d.ts +7 -7
- package/dist/routes/terminal/plan.js +15 -15
- package/dist/routes/terminal/recorder.js +2 -2
- package/dist/routes/terminal/result.d.ts +5 -5
- package/dist/routes/terminal/result.js +14 -14
- package/dist/routes/terminal/route.d.ts +9 -9
- package/dist/routes/terminal/route.js +19 -20
- package/dist/routes/terminal/sandbox.d.ts +1 -1
- package/dist/routes/terminal/sandbox.js +1 -1
- package/dist/routes/terminal/session.d.ts +5 -5
- package/dist/routes/terminal/session.js +14 -13
- package/dist/routes/terminal/token-usage.d.ts +1 -1
- package/dist/routes/terminal/token-usage.js +7 -8
- package/dist/routes/terminal/trace.d.ts +4 -4
- package/dist/routes/terminal/trace.js +2 -2
- package/dist/routes/terminal/types.d.ts +48 -50
- package/dist/routes/terminal/types.js +5 -5
- package/dist/run/bundle-shape.js +3 -3
- package/dist/run/bundle.d.ts +49 -49
- package/dist/run/bundle.js +3 -2
- package/dist/run/cost-summary.js +3 -3
- package/dist/run/costs.d.ts +23 -0
- package/dist/run/costs.js +79 -44
- package/dist/run/detail.d.ts +6 -6
- package/dist/run/detail.js +4 -4
- package/dist/run/dry-run-inputs.d.ts +1 -1
- package/dist/run/dry-run-inputs.js +2 -2
- package/dist/run/dry-run.js +20 -20
- package/dist/run/judge.d.ts +19 -13
- package/dist/run/judge.js +18 -8
- package/dist/run/outcomes.d.ts +1 -1
- package/dist/run/participant.d.ts +1 -1
- package/dist/run/paths.d.ts +1 -1
- package/dist/run/paths.js +1 -1
- package/dist/run/preflight-receipts.js +1 -1
- package/dist/run/pricing.d.ts +11 -6
- package/dist/run/pricing.js +22 -15
- package/dist/run/projection.d.ts +46 -46
- package/dist/run/projection.js +57 -57
- package/dist/run/reclaim.d.ts +1 -1
- package/dist/run/reclaim.js +3 -3
- package/dist/run/results.d.ts +5 -5
- package/dist/run/run-cost.d.ts +53 -0
- package/dist/run/run-cost.js +105 -0
- package/dist/run/run-index-analysis.d.ts +15 -0
- package/dist/run/run-index-analysis.js +77 -0
- package/dist/run/run-index.d.ts +19 -7
- package/dist/run/run-index.js +77 -64
- 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 +6 -5
- package/dist/run/run.js +3 -3
- package/dist/run/sandbox-receipts.d.ts +2 -2
- package/dist/run/sandbox-receipts.js +3 -3
- package/dist/run/shared-world-evidence.d.ts +37 -36
- package/dist/run/shared-world-evidence.js +4 -4
- package/dist/run/shared-world-shape.d.ts +1 -1
- package/dist/run/shared-world-shape.js +7 -7
- package/dist/run/stats.d.ts +14 -8
- package/dist/run/stats.js +121 -63
- package/dist/run/status.d.ts +16 -29
- package/dist/run/status.js +10 -29
- package/dist/run/stored-runs.js +2 -1
- package/dist/run/stream-shape.js +1 -1
- package/dist/run/streams.d.ts +7 -7
- package/dist/run/study-provenance.d.ts +49 -0
- package/dist/run/study-provenance.js +66 -0
- package/dist/run/study-result.d.ts +11 -0
- package/dist/run/study-result.js +9 -0
- package/dist/run/text.d.ts +2 -0
- package/dist/run/text.js +4 -0
- package/dist/run-study.d.ts +112 -0
- package/dist/{run-lab.js → run-study.js} +52 -47
- package/dist/{lab → study}/adapter-extension.d.ts +15 -27
- package/dist/{lab → study}/adapter-extension.js +10 -45
- package/dist/{lab → study}/adapter-scorer-loader.d.ts +17 -17
- package/dist/{lab → study}/adapter-scorer-loader.js +34 -34
- package/dist/study/composition-rules.d.ts +7 -0
- package/dist/{lab → study}/composition-rules.js +53 -53
- package/dist/study/config.d.ts +15 -0
- package/dist/{lab → study}/config.js +98 -41
- package/dist/study/convert.d.ts +33 -0
- package/dist/study/convert.js +432 -0
- package/dist/{lab → study}/device-presets.d.ts +10 -10
- package/dist/{lab → study}/device-presets.js +11 -11
- package/dist/study/discover.d.ts +75 -0
- package/dist/{lab → study}/discover.js +134 -95
- package/dist/{lab → study}/doctor.d.ts +19 -12
- package/dist/{lab → study}/doctor.js +58 -20
- 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 +44 -0
- package/dist/{lab → study}/init-templates.d.ts +2 -2
- package/dist/study/init-templates.js +421 -0
- package/dist/{lab → study}/init.d.ts +2 -2
- package/dist/{lab → study}/init.js +46 -11
- package/dist/study/keys.d.ts +4 -0
- package/dist/{lab → study}/keys.js +46 -12
- 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/{lab → study}/parse/actors.d.ts +5 -5
- package/dist/{lab → study}/parse/actors.js +14 -14
- package/dist/study/parse/comms.d.ts +12 -0
- package/dist/{lab → study}/parse/comms.js +5 -5
- package/dist/study/parse/execution.d.ts +19 -0
- package/dist/{lab → study}/parse/execution.js +13 -13
- package/dist/study/parse/study-v3.d.ts +21 -0
- package/dist/study/parse/study-v3.js +259 -0
- package/dist/study/parse/subject-state.d.ts +30 -0
- package/dist/{lab → study}/parse/subject-state.js +19 -19
- package/dist/{lab → study}/parse/subject.d.ts +3 -3
- package/dist/{lab → study}/parse/subject.js +34 -34
- package/dist/{lab → study}/parse/values.d.ts +3 -3
- package/dist/{lab → study}/parse/values.js +3 -3
- package/dist/{lab → study}/persona-resolve.d.ts +8 -8
- package/dist/{lab → study}/persona-resolve.js +6 -6
- package/dist/{lab → study}/plan-base.d.ts +7 -7
- package/dist/{lab → study}/plan-base.js +1 -1
- package/dist/{lab → study}/plan-participants.d.ts +12 -12
- package/dist/{lab → study}/plan-participants.js +4 -4
- package/dist/{lab → study}/plan-types.d.ts +31 -31
- package/dist/{lab → study}/plan-types.js +2 -2
- package/dist/study/plan.d.ts +13 -0
- package/dist/study/plan.js +101 -0
- package/dist/study/preflight-probes.d.ts +3 -0
- package/dist/{lab → study}/preflight-probes.js +20 -19
- package/dist/study/preflight-result.d.ts +8 -0
- package/dist/{lab → study}/preflight-result.js +5 -4
- package/dist/study/preflight.d.ts +94 -0
- package/dist/{lab → study}/preflight.js +12 -12
- package/dist/{lab → study}/requirements.d.ts +3 -3
- package/dist/{lab → study}/requirements.js +1 -1
- package/dist/study/route-inputs.d.ts +28 -0
- package/dist/{lab → study}/route-inputs.js +1 -1
- package/dist/{lab → study}/routing.d.ts +39 -33
- package/dist/{lab → study}/routing.js +60 -29
- package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -13
- package/dist/{lab/run-lab-events.js → study/run-study-events.js} +3 -9
- package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +21 -18
- package/dist/{lab/run-lab-homes.js → study/run-study-homes.js} +1 -1
- package/dist/study/run-study-options.d.ts +28 -0
- package/dist/{lab/run-lab-options.js → study/run-study-options.js} +29 -25
- package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +8 -13
- package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
- package/dist/{lab → study}/summary.d.ts +16 -15
- package/dist/{lab → study}/summary.js +21 -21
- package/dist/{lab → study}/tasks.d.ts +18 -18
- package/dist/{lab → study}/tasks.js +14 -14
- package/dist/{lab → study}/types.d.ts +202 -196
- package/dist/{lab → study}/types.js +3 -1
- package/dist/{lab → study}/validation.d.ts +27 -27
- package/dist/{lab → study}/validation.js +53 -51
- package/dist/study/warnings.d.ts +12 -0
- package/dist/{lab → study}/warnings.js +62 -34
- package/dist/subject/clone.d.ts +7 -7
- package/dist/subject/clone.js +2 -2
- package/dist/subject/desktop-cli.d.ts +1 -1
- package/dist/subject/desktop-cli.js +2 -2
- package/dist/subject/local-tree-archive.d.ts +2 -2
- package/dist/subject/local-tree-archive.js +4 -4
- package/dist/subject/local-tree.d.ts +4 -4
- package/dist/subject/node-bootstrap.js +1 -1
- package/dist/subject/runtime.js +9 -10
- package/dist/subject/serve.d.ts +5 -5
- package/dist/subject/serve.js +3 -3
- package/dist/subject/state.d.ts +4 -4
- package/dist/subject/state.js +1 -1
- package/dist/subject/steps.d.ts +6 -6
- package/dist/subject/steps.js +5 -5
- package/dist/substrates/command-failure.d.ts +3 -3
- package/dist/substrates/command-failure.js +3 -3
- package/dist/substrates/desktop-session.js +2 -2
- package/dist/substrates/detached.d.ts +6 -6
- package/dist/substrates/detached.js +7 -7
- package/dist/substrates/e2b/cdp-probe.d.ts +9 -9
- package/dist/substrates/e2b/cdp-probe.js +14 -17
- package/dist/substrates/e2b/desktop-browser.d.ts +6 -6
- package/dist/substrates/e2b/desktop-browser.js +9 -9
- package/dist/substrates/e2b/desktop-cdp.d.ts +10 -10
- package/dist/substrates/e2b/desktop-cdp.js +9 -9
- package/dist/substrates/e2b/desktop-executor.d.ts +2 -2
- package/dist/substrates/e2b/desktop-executor.js +13 -13
- package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
- package/dist/substrates/e2b/desktop-geometry.js +8 -8
- package/dist/substrates/e2b/desktop-media.d.ts +4 -4
- package/dist/substrates/e2b/desktop-media.js +1 -1
- package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
- package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
- package/dist/substrates/e2b/lifetime.js +1 -1
- package/dist/substrates/e2b/sandbox.d.ts +4 -4
- package/dist/substrates/e2b/sandbox.js +2 -2
- package/dist/substrates/e2b/sdk.d.ts +12 -12
- package/dist/substrates/e2b/sdk.js +7 -7
- package/dist/substrates/local/runtime-config.d.ts +4 -4
- package/dist/substrates/local/runtime-config.js +4 -4
- package/dist/tui/actions.d.ts +1 -1
- package/dist/tui/actions.js +13 -13
- package/dist/tui/contract.d.ts +23 -23
- package/dist/tui/contract.js +11 -11
- package/dist/tui/launch.d.ts +7 -7
- package/dist/tui/launch.js +36 -31
- package/dist/tui/project.js +5 -5
- package/dist/tui-app.js +139 -139
- package/dist/verify/actor.d.ts +8 -8
- package/dist/verify/actor.js +36 -36
- package/dist/verify/artifacts.d.ts +2 -2
- package/dist/verify/artifacts.js +3 -3
- package/dist/verify/context-growth.d.ts +9 -0
- package/dist/verify/context-growth.js +62 -0
- package/dist/verify/costs.d.ts +6 -6
- package/dist/verify/costs.js +8 -8
- package/dist/verify/shared-world-concurrent.d.ts +2 -2
- package/dist/verify/shared-world-concurrent.js +79 -76
- package/dist/verify/shared-world.d.ts +2 -2
- package/dist/verify/shared-world.js +16 -16
- package/dist/verify/subject.d.ts +5 -5
- package/dist/verify/subject.js +19 -19
- package/dist/verify/verify.js +94 -44
- package/docs/README.md +25 -32
- package/docs/architecture/actor-contract.md +60 -91
- package/docs/architecture/browser-control.md +1 -1
- package/docs/architecture/desktop-sessions.md +7 -7
- package/docs/architecture/external-public-shared-world.md +68 -65
- package/docs/architecture/github-feedback-loop.md +2 -5
- package/docs/architecture/guest-desktop.md +2 -2
- package/docs/architecture/observer.md +34 -34
- package/docs/architecture/restricted-codex-analysis.md +34 -28
- package/docs/architecture/serve.md +34 -37
- package/docs/architecture/state-driven-executor.md +55 -58
- package/docs/architecture/task-protocol-support.md +6 -6
- package/docs/architecture/terminal-product-route.md +70 -110
- package/docs/contracts/README.md +24 -0
- package/docs/contracts/adapter-admission.md +3 -3
- package/docs/contracts/adapter-fixtures.md +4 -7
- 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 +42 -44
- package/docs/contracts/schemas.md +446 -368
- package/docs/contracts/study-analysis.md +7 -4
- package/docs/contracts/study-costs.md +28 -9
- package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
- package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
- package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
- package/docs/principles/actor-fidelity.md +4 -4
- package/docs/principles/engineering.md +3 -3
- package/docs/principles/invariants-and-defaults.md +38 -38
- package/docs/principles/self-driving-harness.md +1 -5
- package/docs/principles/three-roles.md +1 -1
- package/docs/product/automatic-analysis.md +7 -7
- package/examples/README.md +1 -1
- 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/examples/scorer/scorer.mjs +3 -3
- package/package.json +16 -17
- package/skills/humanish/SKILL.md +64 -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 -72
- package/dist/actors/codex/qualified-versions.js +0 -132
- package/dist/cli/commands/lab-format.d.ts +0 -8
- package/dist/cli/commands/lab-route-run.d.ts +0 -19
- package/dist/cli/commands/lab-route-scripted.d.ts +0 -17
- package/dist/cli/commands/lab-route-terminal.d.ts +0 -17
- package/dist/cli/commands/lab-run.d.ts +0 -9
- package/dist/cli/commands/lab.d.ts +0 -3
- package/dist/cli/commands/lab.js +0 -199
- package/dist/cli/renamed-options.d.ts +0 -11
- package/dist/cli/renamed-options.js +0 -18
- package/dist/lab/composition-rules.d.ts +0 -7
- package/dist/lab/config.d.ts +0 -7
- package/dist/lab/discover.d.ts +0 -65
- package/dist/lab/init-templates.js +0 -416
- package/dist/lab/keys.d.ts +0 -2
- package/dist/lab/parse/comms.d.ts +0 -12
- package/dist/lab/parse/execution.d.ts +0 -19
- package/dist/lab/parse/subject-state.d.ts +0 -30
- package/dist/lab/plan.d.ts +0 -19
- package/dist/lab/plan.js +0 -132
- package/dist/lab/preflight-probes.d.ts +0 -3
- package/dist/lab/preflight-result.d.ts +0 -7
- package/dist/lab/preflight.d.ts +0 -92
- package/dist/lab/route-inputs.d.ts +0 -28
- package/dist/lab/run-lab-options.d.ts +0 -28
- package/dist/lab/warnings.d.ts +0 -2
- package/dist/observer/static.d.ts +0 -39
- package/dist/observer/static.js +0 -369
- package/dist/run-lab.d.ts +0 -112
- package/docs/architecture/comms-inbox.md +0 -122
- package/docs/architecture/desktop-recording.md +0 -80
- package/docs/architecture/local-browser-runtime.md +0 -178
- package/docs/architecture/observer-review.md +0 -144
- package/docs/architecture/participant-media.md +0 -90
- package/docs/architecture/project-layout.md +0 -62
- package/docs/architecture/real-email-receiving.md +0 -136
- package/docs/assets/humanish-drawdb-hero.png +0 -0
- package/docs/assets/humanish-observer-hero.png +0 -0
- package/docs/goals/current.md +0 -207
- package/docs/product/lobby-trivia-3player-external-public.md +0 -77
- package/docs/product/open-source-install-experience.md +0 -240
- package/docs/ramp/README.md +0 -295
- package/docs/release/open-source-readiness.md +0 -222
- package/docs/release/public-readiness-standard.md +0 -210
- package/docs/roadmap/world-class-open-source-v0.md +0 -311
- /package/dist/{lab → study}/init-paths.d.ts +0 -0
- /package/dist/{lab → study}/init-paths.js +0 -0
- /package/dist/{lab → study}/init-plan.d.ts +0 -0
- /package/dist/{lab → study}/init-plan.js +0 -0
- /package/dist/{lab → study}/participant-assignment.d.ts +0 -0
- /package/dist/{lab → study}/participant-assignment.js +0 -0
- /package/dist/{lab → study}/persona.d.ts +0 -0
- /package/dist/{lab → study}/persona.js +0 -0
|
@@ -1,27 +1,28 @@
|
|
|
1
1
|
import { redactText } from "../../evidence/redaction.js";
|
|
2
|
-
import { participantAssignment } from "../../
|
|
2
|
+
import { participantAssignment } from "../../study/participant-assignment.js";
|
|
3
3
|
import { REVIEW_SCHEMA, bundleArtifacts, bundleHead, } from "../../run/bundle.js";
|
|
4
|
+
import { verdictText } from "../../run/judge.js";
|
|
4
5
|
import {} from "../../run/streams.js";
|
|
5
6
|
import { participantEvent, participantIds, participantRecord, participantStream, } from "../../run/participant-records.js";
|
|
6
7
|
import { TERMINAL_EVENTS_ARTIFACT, TERMINAL_LEDGERS_ARTIFACT, TERMINAL_TRANSCRIPT_ARTIFACT, } from "../../run/terminal-contract.js";
|
|
7
8
|
import { describeMeasuredSpend, noSpendLineMeasured, noSpendNotEstablished } from "./ledger.js";
|
|
8
9
|
/**
|
|
9
|
-
* Project the terminal-product
|
|
10
|
-
* producer only).
|
|
10
|
+
* Project the terminal-product run into a humanish.run-bundle.v1 (no schema change: a new
|
|
11
|
+
* producer only). Dry run: a contract bundle. The terminal stream is a contract placeholder
|
|
11
12
|
* (stdin disabled, no captured tail, because nothing ran), the subject is declared unpinned, and
|
|
12
13
|
* the caps/policies/runtime-auth declarations are recorded without pretending that live ledgers
|
|
13
14
|
* exist. The shipped live builder fills the same evidence contract. Exported for tests.
|
|
14
15
|
*/
|
|
15
16
|
export function buildTerminalProductBundle(args) {
|
|
16
|
-
const reason = "
|
|
17
|
+
const reason = "Dry run: the terminal-product study was declared without creating an E2B sandbox, injecting any key, or spending. This run did not execute an agent or prove live behavior.";
|
|
17
18
|
// The terminal stream is a contract placeholder on the dry-run path: stdin is disabled and no
|
|
18
19
|
// exec output was captured, so the tail is empty and transport stays "snapshot", never "pty"
|
|
19
|
-
// (captured non-interactive exec output is never an interactive PTY
|
|
20
|
-
//
|
|
20
|
+
// (captured non-interactive exec output is never an interactive PTY). The shipped live builder
|
|
21
|
+
// fills terminal.tail from redacted exec-stream capture.
|
|
21
22
|
const { simulation, stream } = terminalParticipant(args, {
|
|
22
23
|
status: "contract_proof_only",
|
|
23
24
|
reason,
|
|
24
|
-
summary: `
|
|
25
|
+
summary: `Dry-run participant for the terminal agent (${args.actorId}) studying ${args.productName} from public surfaces.`,
|
|
25
26
|
updatedAt: args.run.createdAt,
|
|
26
27
|
stdin: args.stdin,
|
|
27
28
|
tail: "",
|
|
@@ -38,24 +39,24 @@ export function buildTerminalProductBundle(args) {
|
|
|
38
39
|
at: args.run.createdAt,
|
|
39
40
|
level: "info",
|
|
40
41
|
type: "terminal-lab.run.created",
|
|
41
|
-
message: `Created terminal-product
|
|
42
|
+
message: `Created a terminal-product run for ${args.studyId} (actor ${args.actorId}, product ${args.productName}).`,
|
|
42
43
|
},
|
|
43
44
|
participantEvent(TERMINAL_IDS, {
|
|
44
45
|
id: "event-001-subject",
|
|
45
46
|
at: args.run.createdAt,
|
|
46
47
|
level: "info",
|
|
47
48
|
type: "terminal-lab.subject.declared",
|
|
48
|
-
//
|
|
49
|
+
// Provenance is recorded or its absence declared. The agent drives public surfaces
|
|
49
50
|
// and nothing is cloned, so the subject provenance is explicitly unpinned; evidence binds to the
|
|
50
51
|
// composed-prompt digest. Public surfaces are recorded (they are public by declaration).
|
|
51
|
-
message: `Subject product declared: ${args.productName}; public surfaces: ${args.publicSurfaces.join(", ")}.
|
|
52
|
+
message: `Subject product declared: ${args.productName}; public surfaces: ${args.publicSurfaces.join(", ")}. humanish did not provision or clone the product, so its provenance is unpinned: a study of public pages has no commit to pin. The evidence is tied to the prompt digest ${args.persona.promptDigest}.`,
|
|
52
53
|
}),
|
|
53
54
|
participantEvent(TERMINAL_IDS, {
|
|
54
55
|
id: "event-002-credentials",
|
|
55
56
|
at: args.run.createdAt,
|
|
56
57
|
level: "info",
|
|
57
58
|
type: "terminal-lab.credentials.declared",
|
|
58
|
-
// Names-only evidence
|
|
59
|
+
// Names-only evidence: the runtime-auth channel is declared; no value is ever
|
|
59
60
|
// recorded. The deny-by-default policies are recorded so the credential posture is auditable.
|
|
60
61
|
message: `Runtime auth channel: ${args.runtimeAuth ?? "none declared"} (names only; values never persist; the live engine applies the selected key placement, while this dry-run performs no injection). Credential policies (deny-by-default): allowPrivateRepoAccess=${args.policies.allowPrivateRepoAccess}, allowProviderCredentials=${args.policies.allowProviderCredentials}, allowPaymentCredentials=${args.policies.allowPaymentCredentials}, allowGitHubMutation=${args.policies.allowGitHubMutation}.`,
|
|
61
62
|
}),
|
|
@@ -64,14 +65,14 @@ export function buildTerminalProductBundle(args) {
|
|
|
64
65
|
at: args.run.createdAt,
|
|
65
66
|
level: "info",
|
|
66
67
|
type: "terminal-lab.caps.declared",
|
|
67
|
-
message: `Spend
|
|
68
|
+
message: `Spend, job and time caps: ${capsText}. A live run uses the runtime key only while a cap is in force, and derives its no-spend proof from the recorded cost ledger. This dry run spends $0: it makes no model request.`,
|
|
68
69
|
}),
|
|
69
70
|
participantEvent(TERMINAL_IDS, {
|
|
70
71
|
id: "event-004-contract",
|
|
71
72
|
at: args.run.createdAt,
|
|
72
73
|
level: "info",
|
|
73
74
|
type: "terminal-lab.contract.ready",
|
|
74
|
-
message: "Dry-run
|
|
75
|
+
message: "Dry-run bundle ready. Switch scenario.mode to live with the required runtime auth and caps to exercise the in-sandbox agent route, captured exec stream, and declared runtime-auth placement.",
|
|
75
76
|
}),
|
|
76
77
|
];
|
|
77
78
|
const review = {
|
|
@@ -79,7 +80,7 @@ export function buildTerminalProductBundle(args) {
|
|
|
79
80
|
verdict: args.verdict,
|
|
80
81
|
summary: reason,
|
|
81
82
|
gaps: [
|
|
82
|
-
"This dry
|
|
83
|
+
"This dry run did not execute the live in-sandbox agent route; it checks the evidence shape only, not live behavior, scale, or adoption.",
|
|
83
84
|
"No exec-stream, transcript, substrate, cost, or cleanup artifacts were produced because no live session ran; live verification requires those artifacts.",
|
|
84
85
|
],
|
|
85
86
|
};
|
|
@@ -88,13 +89,13 @@ export function buildTerminalProductBundle(args) {
|
|
|
88
89
|
{
|
|
89
90
|
at: args.run.createdAt,
|
|
90
91
|
event: "terminal-lab.run.created",
|
|
91
|
-
message: `Created terminal-product
|
|
92
|
+
message: `Created a terminal-product run with one in-sandbox agent participant (actor ${args.actorId}, product ${args.productName}).`,
|
|
92
93
|
},
|
|
93
94
|
],
|
|
94
95
|
simulation,
|
|
95
96
|
stream,
|
|
96
97
|
events,
|
|
97
|
-
redactionNotes: "Dry-run
|
|
98
|
+
redactionNotes: "Dry-run bundle: no sandbox ran, no key was injected, no exec output was captured. The author mission is public-safe committed study text (redacted defensively); the composed prompt is bound by digest. The shipped live path applies scrubKnownValues then redactText at the capture source before persistence.",
|
|
98
99
|
review,
|
|
99
100
|
});
|
|
100
101
|
}
|
|
@@ -167,8 +168,8 @@ export function buildLiveTerminalProductBundle(args) {
|
|
|
167
168
|
? []
|
|
168
169
|
: [`Agent session ended ${args.trace.status}: ${args.sessionReason}`]),
|
|
169
170
|
...(args.capFailure === undefined ? [] : [args.capFailure]),
|
|
170
|
-
//
|
|
171
|
-
// green run never silently over-claims a fully-proven $0.
|
|
171
|
+
// Measurement gap: the no-spend proof always declares which spend lines it could not measure,
|
|
172
|
+
// so a green run never silently over-claims a fully-proven $0.
|
|
172
173
|
...(noSpend.unmeasuredLines.length > 0
|
|
173
174
|
? [
|
|
174
175
|
`${noSpendLineMeasured(noSpend) ? noSpendNotEstablished(noSpend.maxUsd ?? 0) : "No-spend proof is partial."} ${describeMeasuredSpend(args.ledgers.cost, args.trace.tokenUsage)} An adapter may supply the missing signals through costProbe.`,
|
|
@@ -185,7 +186,7 @@ export function buildLiveTerminalProductBundle(args) {
|
|
|
185
186
|
simulation,
|
|
186
187
|
stream,
|
|
187
188
|
events: lifecycleEvents,
|
|
188
|
-
redactionNotes: `Live terminal-product run: the in-sandbox agent's output was captured via commands.run onStdout/onStderr and
|
|
189
|
+
redactionNotes: `Live terminal-product run: the in-sandbox agent's output was captured via commands.run onStdout/onStderr and had known values (including the runtime key) scrubbed, then shape patterns redacted, before anything was stored. ${args.runtimeAuth === "openai-egress" ? `Runtime auth openai-egress: the raw key from ${args.runtimeAuthKeyName} is reserved for E2B's external api.openai.com HTTPS header transform. ${args.ledgers.commandLog.some((command) => command.label === "codex-exec") ? "Codex received an inert CODEX_API_KEY placeholder." : "Codex was not launched."} Any created sandbox retains a spendable OpenAI proxy capability until teardown; additional provider calls may not appear in the Codex usage ledger.` : `Runtime auth openai-env: the runtime key (${args.runtimeAuthKeyName}) was passed only to the codex command, never to sandbox-wide environment variables or metadata; only its name appears in evidence.`} Subject provenance is unpinned (a study of public pages).`,
|
|
189
190
|
review,
|
|
190
191
|
...(args.cost === undefined ? {} : { cost: args.cost }),
|
|
191
192
|
});
|
|
@@ -196,7 +197,7 @@ const TERMINAL_IDS = participantIds(0);
|
|
|
196
197
|
function terminalParticipant(args, session) {
|
|
197
198
|
const simulation = participantRecord(TERMINAL_IDS, 1, {
|
|
198
199
|
personaId: args.persona.id,
|
|
199
|
-
scenarioId: `terminal-${args.
|
|
200
|
+
scenarioId: `terminal-${args.studyId}`,
|
|
200
201
|
status: session.status,
|
|
201
202
|
streamKind: "terminal",
|
|
202
203
|
mode: "cli-sim",
|
|
@@ -209,7 +210,7 @@ function terminalParticipant(args, session) {
|
|
|
209
210
|
const stream = participantStream(TERMINAL_IDS, {
|
|
210
211
|
assignment: participantAssignment({ mission: args.mission }),
|
|
211
212
|
kind: "terminal",
|
|
212
|
-
label: `Terminal agent
|
|
213
|
+
label: `Terminal agent · ${args.studyId}`,
|
|
213
214
|
status: session.status,
|
|
214
215
|
transport: "snapshot",
|
|
215
216
|
updatedAt: session.updatedAt,
|
|
@@ -236,17 +237,17 @@ function terminalRunBundle(args, parts) {
|
|
|
236
237
|
persona: {
|
|
237
238
|
id: args.persona.id,
|
|
238
239
|
name: `Autonomous terminal agent (${args.persona.id})`,
|
|
239
|
-
source: `
|
|
240
|
+
source: `study:${args.studyId}`,
|
|
240
241
|
sourceDigest: args.persona.promptDigest,
|
|
241
242
|
},
|
|
242
243
|
scenario: {
|
|
243
|
-
id: `terminal-${args.
|
|
244
|
-
title: args.
|
|
245
|
-
// The author mission is public-safe committed
|
|
244
|
+
id: `terminal-${args.studyId}`,
|
|
245
|
+
title: args.studyTitle ?? `Terminal-product run: ${args.studyId}`,
|
|
246
|
+
// The author mission is public-safe committed study text. It is recorded plaintext as the goal,
|
|
246
247
|
// redacted defensively before persisting (it never carries a secret, but the harness never
|
|
247
248
|
// trusts that). The full composed prompt is bound by digest, not text.
|
|
248
249
|
goal: redactText(args.mission),
|
|
249
|
-
source: `
|
|
250
|
+
source: `study:${args.studyId}`,
|
|
250
251
|
sourceDigest: args.persona.promptDigest,
|
|
251
252
|
},
|
|
252
253
|
lifecycle: parts.lifecycle,
|
|
@@ -281,7 +282,7 @@ export function renderTerminalReviewMarkdown(bundle) {
|
|
|
281
282
|
"",
|
|
282
283
|
`- run: ${bundle.runId}`,
|
|
283
284
|
`- mode: ${bundle.mode}`,
|
|
284
|
-
`- verdict: ${bundle.review.verdict}`,
|
|
285
|
+
`- verdict: ${verdictText(bundle.review.verdict, bundle.mode)}`,
|
|
285
286
|
`- summary: ${bundle.review.summary}`,
|
|
286
287
|
`- mission: ${bundle.scenario.goal}`,
|
|
287
288
|
...(subject ? [`- subject: ${subject.message}`] : []),
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { StudyRuntimeAuth } from "../../study/types.js";
|
|
2
2
|
/**
|
|
3
3
|
* Resolve the runtime key on the host. Legacy openai-env passes it command-scoped; openai-egress
|
|
4
4
|
* returns an inert command env while retaining the actual value for the external transform and
|
|
@@ -7,28 +7,28 @@ import type { LabRuntimeAuth } from "../../lab/types.js";
|
|
|
7
7
|
*/
|
|
8
8
|
export declare function buildRuntimeAuth(args: {
|
|
9
9
|
/** Undefined retains the historical openai-env default. */
|
|
10
|
-
runtimeAuth:
|
|
10
|
+
runtimeAuth: StudyRuntimeAuth | undefined;
|
|
11
11
|
/** The operator environment the key value is read from (process.env or a test fake). */
|
|
12
12
|
env: Record<string, string | undefined>;
|
|
13
13
|
}): {
|
|
14
14
|
ok: true;
|
|
15
|
-
mode:
|
|
15
|
+
mode: StudyRuntimeAuth;
|
|
16
16
|
envs: Record<string, string>;
|
|
17
17
|
keyName: string;
|
|
18
18
|
keyValue: string;
|
|
19
19
|
} | {
|
|
20
20
|
ok: false;
|
|
21
|
-
code: "
|
|
21
|
+
code: "HUMANISH_TERMINAL_RUNTIME_AUTH_MISSING" | "HUMANISH_TERMINAL_CREDENTIAL_DENIED";
|
|
22
22
|
message: string;
|
|
23
23
|
};
|
|
24
24
|
/**
|
|
25
|
-
* Build the sandbox metadata from a positive allowlist
|
|
26
|
-
* way metadata is set on the terminal route
|
|
25
|
+
* Build the sandbox metadata from a positive allowlist. This is the only
|
|
26
|
+
* way metadata is set on the terminal route. It carries solely non-secret labels and rejects any
|
|
27
27
|
* value that is not a plain short label. A verifier check asserts the persisted metadata has no
|
|
28
28
|
* prompt/token/secret shapes; this builder makes that true by construction.
|
|
29
29
|
*/
|
|
30
30
|
export declare function buildSandboxMetadata(allowlist: {
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
studyId: string;
|
|
32
|
+
recordId: string;
|
|
33
33
|
runId: string;
|
|
34
34
|
}): Record<string, string>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { E2B_SYSTEM_CA_BUNDLE, OPENAI_EGRESS_PLACEHOLDER } from "./runtime-auth.js";
|
|
2
|
-
import {
|
|
2
|
+
import { TERMINAL_PRODUCT_STUDY_PROVIDER_METADATA } from "./types.js";
|
|
3
3
|
/**
|
|
4
4
|
* Resolve the runtime key on the host. Legacy openai-env passes it command-scoped; openai-egress
|
|
5
5
|
* returns an inert command env while retaining the actual value for the external transform and
|
|
@@ -12,13 +12,13 @@ export function buildRuntimeAuth(args) {
|
|
|
12
12
|
// (developers.openai.com/codex/noninteractive) document it as the channel for a single codex exec
|
|
13
13
|
// invocation, which is exactly this route's shape (no persisted auth.json/CODEX_HOME, per-command
|
|
14
14
|
// envs only). A dated in-repo receipt
|
|
15
|
-
// (docs/goals/humanish-recursive-proof-critical-point/receipts/actor-required-attempt.md) shows a
|
|
15
|
+
// (docs/history/goals/humanish-recursive-proof-critical-point/receipts/actor-required-attempt.md) shows a
|
|
16
16
|
// job-wide OPENAI_API_KEY alone failing bearer auth for this same pinned-exec pattern. When the
|
|
17
17
|
// operator only exported OPENAI_API_KEY, its value is also injected under CODEX_API_KEY below, so
|
|
18
18
|
// the documented exec auth channel is always populated regardless of which name the operator
|
|
19
19
|
// used. The allowlist is exactly these two names; everything else is denied by construction.
|
|
20
20
|
const ALLOWED_RUNTIME_KEY_NAMES = ["CODEX_API_KEY", "OPENAI_API_KEY"];
|
|
21
|
-
// Tripwire (
|
|
21
|
+
// Tripwire (deny-by-default credentials): if a future widening of ALLOWED_RUNTIME_KEY_NAMES ever
|
|
22
22
|
// added a clearly-non-runtime credential (a GitHub/payment/deploy/db secret), fail closed. The
|
|
23
23
|
// generic `*_KEY` shape is deliberately left out of the tripwire, since a runtime key legitimately
|
|
24
24
|
// ends in _KEY (CODEX_API_KEY/OPENAI_API_KEY), so testing it against the generic shape would
|
|
@@ -29,7 +29,7 @@ export function buildRuntimeAuth(args) {
|
|
|
29
29
|
if (ALLOWED_RUNTIME_KEY_NAMES.some((name) => isNonRuntimeCredentialName(name))) {
|
|
30
30
|
return {
|
|
31
31
|
ok: false,
|
|
32
|
-
code: "
|
|
32
|
+
code: "HUMANISH_TERMINAL_CREDENTIAL_DENIED",
|
|
33
33
|
message: "Internal invariant violated: a runtime-key allowlist entry is a non-runtime credential (GitHub/payment/deploy/db).",
|
|
34
34
|
};
|
|
35
35
|
}
|
|
@@ -37,8 +37,8 @@ export function buildRuntimeAuth(args) {
|
|
|
37
37
|
if (!keyName) {
|
|
38
38
|
return {
|
|
39
39
|
ok: false,
|
|
40
|
-
code: "
|
|
41
|
-
message: `Live terminal-product
|
|
40
|
+
code: "HUMANISH_TERMINAL_RUNTIME_AUTH_MISSING",
|
|
41
|
+
message: `Live terminal-product studies declare runtimeAuth "${String(args.runtimeAuth)}" and need ${ALLOWED_RUNTIME_KEY_NAMES.join(" or ")} in the environment (pass via --env-file; the selected auth mode places the value in command-scoped env or an external E2B header transform; the value is never persisted).`,
|
|
42
42
|
};
|
|
43
43
|
}
|
|
44
44
|
const keyValue = args.env[keyName];
|
|
@@ -84,18 +84,18 @@ function isNonRuntimeCredentialName(name) {
|
|
|
84
84
|
return NON_RUNTIME_CREDENTIAL_NAME_PATTERNS.some((pattern) => pattern.test(name));
|
|
85
85
|
}
|
|
86
86
|
/**
|
|
87
|
-
* Build the sandbox metadata from a positive allowlist
|
|
88
|
-
* way metadata is set on the terminal route
|
|
87
|
+
* Build the sandbox metadata from a positive allowlist. This is the only
|
|
88
|
+
* way metadata is set on the terminal route. It carries solely non-secret labels and rejects any
|
|
89
89
|
* value that is not a plain short label. A verifier check asserts the persisted metadata has no
|
|
90
90
|
* prompt/token/secret shapes; this builder makes that true by construction.
|
|
91
91
|
*/
|
|
92
92
|
export function buildSandboxMetadata(allowlist) {
|
|
93
93
|
return {
|
|
94
|
-
mode:
|
|
95
|
-
tool:
|
|
94
|
+
mode: TERMINAL_PRODUCT_STUDY_PROVIDER_METADATA.mode,
|
|
95
|
+
tool: TERMINAL_PRODUCT_STUDY_PROVIDER_METADATA.tool,
|
|
96
96
|
provider: "codex",
|
|
97
|
-
labId: allowlist.
|
|
98
|
-
|
|
97
|
+
labId: allowlist.studyId,
|
|
98
|
+
recordId: allowlist.recordId,
|
|
99
99
|
// The run id is a harness-minted token (terminal-<ts>-<hex>), not user data.
|
|
100
100
|
runId: allowlist.runId,
|
|
101
101
|
};
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import type { TerminalPlan } from "../../
|
|
1
|
+
import type { TerminalPlan } from "../../study/plan-types.js";
|
|
2
2
|
import type { RunScope } from "../../run/run.js";
|
|
3
|
-
import { type RunLiveTerminalSessionArgs, type
|
|
3
|
+
import { type RunLiveTerminalSessionArgs, type TerminalProductStudyResult, type TerminalRunInput } from "./types.js";
|
|
4
4
|
/**
|
|
5
5
|
* The dry-run path: a contract bundle with the persona and prompt digest bound, published through
|
|
6
6
|
* the run scope with no sandbox, key or spend.
|
|
7
7
|
*/
|
|
8
|
-
export declare function
|
|
8
|
+
export declare function runDryTerminalStudy(args: {
|
|
9
9
|
plan: Extract<TerminalPlan, {
|
|
10
10
|
readonly dryRun: true;
|
|
11
11
|
}>;
|
|
@@ -14,7 +14,7 @@ export declare function runDryTerminalLab(args: {
|
|
|
14
14
|
warnings: string[];
|
|
15
15
|
failed: RunLiveTerminalSessionArgs["failed"];
|
|
16
16
|
scope: RunScope;
|
|
17
|
-
}): Promise<
|
|
17
|
+
}): Promise<TerminalProductStudyResult>;
|
|
18
18
|
/** Compose the full prompt the agent would run. Bound to evidence by digest only. */
|
|
19
19
|
export declare function composePrompt(args: {
|
|
20
20
|
mission: string;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// The terminal route's dry run: a contract-only bundle with the persona and prompt digest bound,
|
|
2
2
|
// published through the run scope with no sandbox, key or spend. session.ts holds the live path.
|
|
3
3
|
import { digestText, redactText, scrubLiterals } from "../../evidence/redaction.js";
|
|
4
|
-
import { participantAssignment } from "../../
|
|
4
|
+
import { participantAssignment } from "../../study/participant-assignment.js";
|
|
5
5
|
import { buildRunSource } from "../../run/bundle.js";
|
|
6
6
|
import { judgeExecution, judgeTerminal, OUTCOME_POLICIES, resultOk } from "../../run/judge.js";
|
|
7
7
|
import { validatePreparedRunArtifactPaths } from "../../run/paths.js";
|
|
@@ -9,12 +9,13 @@ import { buildTerminalProductBundle, renderTerminalReviewMarkdown } from "./bund
|
|
|
9
9
|
import { resolveTerminalPersona, terminalPersonaRef } from "./persona.js";
|
|
10
10
|
import { declaredRuntimeProvenance } from "./runtime.js";
|
|
11
11
|
import { defaultMission, makeTerminalRunId } from "./session.js";
|
|
12
|
-
import {
|
|
12
|
+
import {} from "./types.js";
|
|
13
|
+
import { studyResultIdentity } from "../../run/study-result.js";
|
|
13
14
|
/**
|
|
14
15
|
* The dry-run path: a contract bundle with the persona and prompt digest bound, published through
|
|
15
16
|
* the run scope with no sandbox, key or spend.
|
|
16
17
|
*/
|
|
17
|
-
export async function
|
|
18
|
+
export async function runDryTerminalStudy(args) {
|
|
18
19
|
const { plan, input, cwd, warnings, failed, scope } = args;
|
|
19
20
|
const { product } = plan;
|
|
20
21
|
const { evidenceMission, physicalCwd, persona } = await prepareDryPersona({
|
|
@@ -28,7 +29,7 @@ export async function runDryTerminalLab(args) {
|
|
|
28
29
|
runId: input.runId,
|
|
29
30
|
mintRunId: makeTerminalRunId,
|
|
30
31
|
mode: "dry-run",
|
|
31
|
-
|
|
32
|
+
study: plan.study,
|
|
32
33
|
renderReview: renderTerminalReviewMarkdown,
|
|
33
34
|
observer: { open: input.open === true, render: input.deps?.renderObserver },
|
|
34
35
|
});
|
|
@@ -48,8 +49,8 @@ export async function runDryTerminalLab(args) {
|
|
|
48
49
|
run,
|
|
49
50
|
actorId: plan.actor,
|
|
50
51
|
dryRun: true,
|
|
51
|
-
|
|
52
|
-
...(plan.title ? {
|
|
52
|
+
studyId: plan.studyId,
|
|
53
|
+
...(plan.title ? { studyTitle: plan.title } : {}),
|
|
53
54
|
mission: evidenceMission,
|
|
54
55
|
persona,
|
|
55
56
|
productName: product.name,
|
|
@@ -76,16 +77,15 @@ export async function runDryTerminalLab(args) {
|
|
|
76
77
|
: [
|
|
77
78
|
{
|
|
78
79
|
kind: "evidence",
|
|
79
|
-
message: observer.error?.message ?? "Observer failed for the terminal-product
|
|
80
|
+
message: observer.error?.message ?? "Observer failed for the terminal-product run.",
|
|
80
81
|
},
|
|
81
82
|
], policy);
|
|
82
83
|
const ok = resultOk({ judgment, execution, scorerFailures: [], policy });
|
|
83
84
|
await finished.recordOutcome({ ok, execution });
|
|
84
85
|
return {
|
|
85
|
-
|
|
86
|
+
...studyResultIdentity("terminal", plan.studyId),
|
|
86
87
|
ok,
|
|
87
88
|
cwd,
|
|
88
|
-
labId: plan.labId,
|
|
89
89
|
actor: plan.actor,
|
|
90
90
|
product: product.name,
|
|
91
91
|
dryRun: true,
|
|
@@ -96,8 +96,8 @@ export async function runDryTerminalLab(args) {
|
|
|
96
96
|
? {}
|
|
97
97
|
: {
|
|
98
98
|
error: {
|
|
99
|
-
code: "
|
|
100
|
-
message: observer.error?.message ?? "Observer failed for the terminal-product
|
|
99
|
+
code: "HUMANISH_TERMINAL_FAILED",
|
|
100
|
+
message: observer.error?.message ?? "Observer failed for the terminal-product run.",
|
|
101
101
|
},
|
|
102
102
|
}),
|
|
103
103
|
};
|
|
@@ -116,7 +116,7 @@ async function prepareDryPersona(args) {
|
|
|
116
116
|
const evidenceMission = participantAssignment({ mission }, scrubLiterals(knownSecretValues)).mission;
|
|
117
117
|
const terminalPersona = await resolveTerminalPersona({ plan, cwd, warnings });
|
|
118
118
|
// The composed prompt = mission + persona + public-surface manifest. Only the author mission
|
|
119
|
-
// goes plaintext into evidence (it is public-safe committed
|
|
119
|
+
// goes plaintext into evidence (it is public-safe committed study text); the full composed prompt
|
|
120
120
|
// is recorded as a digest (the safety contract's mission ruling).
|
|
121
121
|
const composedPrompt = composePrompt({
|
|
122
122
|
mission,
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
// as a replacement glyph. Every ASCII character on the same screen was fine, which is exactly the
|
|
7
7
|
// signature.
|
|
8
8
|
//
|
|
9
|
-
// The
|
|
9
|
+
// The fix is not "stop using em dashes". It is to ask what the terminal can render and mean
|
|
10
10
|
// it. A surface that emits characters its own terminal cannot decode is not being expressive, it is
|
|
11
11
|
// producing garbage that reads as a bug in the tool.
|
|
12
12
|
const UTF8 = /utf-?8/i;
|
|
@@ -23,7 +23,7 @@ export function terminalRendersUnicode(env = process.env) {
|
|
|
23
23
|
const declared = env.LC_ALL ?? env.LC_CTYPE ?? env.LANG;
|
|
24
24
|
if (declared === undefined || declared.trim().length === 0) {
|
|
25
25
|
// Nothing declared at all. A bare login shell on a stock image lands here, and that is the
|
|
26
|
-
// case the participant hit
|
|
26
|
+
// case the participant hit. Assume it cannot, because the failure is silent and ugly while
|
|
27
27
|
// the fallback is merely plainer.
|
|
28
28
|
return false;
|
|
29
29
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { ActorTokenUsage } from "../../actors/contract.js";
|
|
2
|
-
import type {
|
|
2
|
+
import type { StudyScenarioCaps } from "../../study/types.js";
|
|
3
3
|
import { type CostCategory } from "../../run/terminal-contract.js";
|
|
4
4
|
import type { CostLine, NoSpendProof, TerminalCostLedger } from "./types.js";
|
|
5
5
|
/**
|
|
6
|
-
* Build the spend ledger from the captured session. The null discipline
|
|
6
|
+
* Build the spend ledger from the captured session. The null discipline:
|
|
7
7
|
* - The `provider` line is populated from the actor trace's tokenUsage.costUsd when the trace
|
|
8
8
|
* carries it (a measured value, incl. a measured 0). When the trace carries no costUsd, the
|
|
9
9
|
* provider line is `null` = not measured (never guessed to 0 just because no-spend was intended).
|
|
@@ -14,7 +14,7 @@ import type { CostLine, NoSpendProof, TerminalCostLedger } from "./types.js";
|
|
|
14
14
|
*/
|
|
15
15
|
export declare function buildCostLedger(args: {
|
|
16
16
|
tokenCostUsd?: number;
|
|
17
|
-
/** Measured token counts, when the run produced them but no rate could price them
|
|
17
|
+
/** Measured token counts, when the run produced them but no rate could price them. */
|
|
18
18
|
tokenUsage?: ActorTokenUsage;
|
|
19
19
|
injectedLines?: Partial<Record<CostCategory, CostLine>>;
|
|
20
20
|
}): TerminalCostLedger;
|
|
@@ -32,7 +32,7 @@ export declare function noSpendNotEstablished(maxUsd: number): string;
|
|
|
32
32
|
*/
|
|
33
33
|
export declare function describeMeasuredSpend(ledger: TerminalCostLedger, tokenUsage?: ActorTokenUsage): string;
|
|
34
34
|
/** Derive the no-spend proof from the ledger. It vouches for known-zero lines and
|
|
35
|
-
* explicitly lists the unmeasured (null) lines it cannot vouch for
|
|
35
|
+
* explicitly lists the unmeasured (null) lines it cannot vouch for. It never claims zero on null. */
|
|
36
36
|
export declare function buildNoSpendProof(ledger: TerminalCostLedger, maxUsd: number | null, tokenUsage?: ActorTokenUsage): NoSpendProof;
|
|
37
37
|
/**
|
|
38
38
|
* Fail-closed caps enforcement. Returns a structured violation when a known
|
|
@@ -41,7 +41,7 @@ export declare function buildNoSpendProof(ledger: TerminalCostLedger, maxUsd: nu
|
|
|
41
41
|
* grant a green pass: the no-spend proof reports them as unmeasured. maxMinutes is wall-clock and is
|
|
42
42
|
* enforced separately (runWithWallClock); it is not a ledger-derived cap.
|
|
43
43
|
*/
|
|
44
|
-
export declare function evaluateCapsAgainstLedger(ledger: TerminalCostLedger, caps:
|
|
44
|
+
export declare function evaluateCapsAgainstLedger(ledger: TerminalCostLedger, caps: StudyScenarioCaps): {
|
|
45
45
|
ok: true;
|
|
46
46
|
} | {
|
|
47
47
|
ok: false;
|
|
@@ -2,7 +2,7 @@ import { describeTokenUsage } from "./token-usage.js";
|
|
|
2
2
|
import { round6 } from "../../run/pricing.js";
|
|
3
3
|
import { COST_CATEGORIES } from "../../run/terminal-contract.js";
|
|
4
4
|
/**
|
|
5
|
-
* Build the spend ledger from the captured session. The null discipline
|
|
5
|
+
* Build the spend ledger from the captured session. The null discipline:
|
|
6
6
|
* - The `provider` line is populated from the actor trace's tokenUsage.costUsd when the trace
|
|
7
7
|
* carries it (a measured value, incl. a measured 0). When the trace carries no costUsd, the
|
|
8
8
|
* provider line is `null` = not measured (never guessed to 0 just because no-spend was intended).
|
|
@@ -22,24 +22,24 @@ export function buildCostLedger(args) {
|
|
|
22
22
|
? {
|
|
23
23
|
// Tokens counted, no rate to price them. This stays `usd: null` because a guessed
|
|
24
24
|
// dollar figure would be worse than none, but the note carries the measured fact so a
|
|
25
|
-
// reader never mistakes "no charge recorded" for "nothing was consumed"
|
|
25
|
+
// reader never mistakes "no charge recorded" for "nothing was consumed".
|
|
26
26
|
usd: null,
|
|
27
27
|
source: "unpriced-token-usage",
|
|
28
|
-
note: `Provider spend
|
|
29
|
-
"but the terminal participant records the model as `codex` and
|
|
30
|
-
"
|
|
31
|
-
"
|
|
28
|
+
note: `Provider spend unpriced: the run consumed ${describeTokenUsage(args.tokenUsage)}, ` +
|
|
29
|
+
"but the terminal participant records the model as `codex` and humanish has no rate " +
|
|
30
|
+
"for it, so no dollar figure is given. The token count is measured; the price is " +
|
|
31
|
+
"not known. Recorded as null, never guessed as 0.",
|
|
32
32
|
}
|
|
33
33
|
: {
|
|
34
34
|
usd: null,
|
|
35
35
|
source: "unmeasured",
|
|
36
|
-
note: "Provider spend
|
|
36
|
+
note: "Provider spend not measured: the actor trace carried no tokenUsage.costUsd in this run, so it is recorded as null and not guessed as 0.",
|
|
37
37
|
};
|
|
38
38
|
const unmeasured = (category) => ({
|
|
39
39
|
usd: null,
|
|
40
40
|
count: null,
|
|
41
41
|
source: "unmeasured",
|
|
42
|
-
note: `${category} spend
|
|
42
|
+
note: `${category} spend not measured: humanish has no ${category} spend signal for this run, and an adapter may supply one through costProbe. Recorded as null, never guessed as 0.`,
|
|
43
43
|
});
|
|
44
44
|
const lines = {
|
|
45
45
|
product: args.injectedLines?.product ?? unmeasured("product"),
|
|
@@ -99,7 +99,7 @@ export function describeMeasuredSpend(ledger, tokenUsage) {
|
|
|
99
99
|
.join(" ");
|
|
100
100
|
}
|
|
101
101
|
/** Derive the no-spend proof from the ledger. It vouches for known-zero lines and
|
|
102
|
-
* explicitly lists the unmeasured (null) lines it cannot vouch for
|
|
102
|
+
* explicitly lists the unmeasured (null) lines it cannot vouch for. It never claims zero on null. */
|
|
103
103
|
export function buildNoSpendProof(ledger, maxUsd, tokenUsage) {
|
|
104
104
|
const knownZeroLines = [];
|
|
105
105
|
const knownNonZeroLines = [];
|
|
@@ -115,14 +115,14 @@ export function buildNoSpendProof(ledger, maxUsd, tokenUsage) {
|
|
|
115
115
|
}
|
|
116
116
|
// satisfied only when every known line is within the cap (for a no-spend run, maxUsd 0 => every
|
|
117
117
|
// known line must be exactly 0). Unmeasured lines never make it satisfied; they are reported
|
|
118
|
-
// separately as the proof's
|
|
118
|
+
// separately as the proof's blind spot.
|
|
119
119
|
const cap = maxUsd ?? 0;
|
|
120
120
|
const satisfied = knownNonZeroLines.length === 0 && ledger.knownTotalUsd <= cap;
|
|
121
121
|
const verdict = !satisfied
|
|
122
|
-
? `No-spend proof
|
|
122
|
+
? `No-spend proof not satisfied for maxUsd=${cap}: known spend total ${ledger.knownTotalUsd} USD${knownNonZeroLines.length > 0 ? ` (non-zero: ${knownNonZeroLines.join(", ")})` : ""}.`
|
|
123
123
|
: noSpendLineMeasured({ knownZeroLines, knownNonZeroLines })
|
|
124
124
|
? noSpendNotEstablished(cap)
|
|
125
|
-
: `No-spend proof
|
|
125
|
+
: `No-spend proof satisfied for maxUsd=${cap} on the measured lines (known total ${ledger.knownTotalUsd} USD).`;
|
|
126
126
|
const statement = [verdict, describeMeasuredSpend(ledger, tokenUsage)]
|
|
127
127
|
.filter((part) => part.length > 0)
|
|
128
128
|
.join(" ");
|
|
@@ -149,7 +149,7 @@ export function evaluateCapsAgainstLedger(ledger, caps) {
|
|
|
149
149
|
const overLines = COST_CATEGORIES.filter((c) => ledger.lines[c].usd !== null && ledger.lines[c].usd > 0);
|
|
150
150
|
return {
|
|
151
151
|
ok: false,
|
|
152
|
-
message: `
|
|
152
|
+
message: `Stopped: measured spend ${ledger.knownTotalUsd} USD passed scenario.caps.maxUsd=${caps.maxUsd}${overLines.length > 0 ? ` (non-zero lines: ${overLines.join(", ")})` : ""}. The cap stops the run; it is not a warning.`,
|
|
153
153
|
};
|
|
154
154
|
}
|
|
155
155
|
if (caps.maxJobs !== undefined) {
|
|
@@ -162,7 +162,7 @@ export function evaluateCapsAgainstLedger(ledger, caps) {
|
|
|
162
162
|
if (knownJobs > caps.maxJobs) {
|
|
163
163
|
return {
|
|
164
164
|
ok: false,
|
|
165
|
-
message: `
|
|
165
|
+
message: `Stopped: ${knownJobs} measured billable jobs passed scenario.caps.maxJobs=${caps.maxJobs}.`,
|
|
166
166
|
};
|
|
167
167
|
}
|
|
168
168
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The most the sandbox runs before the codex command starts: the Node bootstrap, the runtime
|
|
3
|
-
* version check and, when the
|
|
3
|
+
* version check and, when the study declares `subject.product.install`, the product setup.
|
|
4
4
|
*/
|
|
5
5
|
export declare function terminalPreExecBudgetMs(productInstall: boolean): number;
|
|
6
6
|
/** The terminal sandbox's server-side timeout for a codex command bounded at `maxMinutes`. */
|
|
@@ -7,7 +7,7 @@ import { TERMINAL_RUNTIME_VERSION_TIMEOUT_MS } from "./runtime.js";
|
|
|
7
7
|
import { PRODUCT_SETUP_TIMEOUT_MS, TERMINAL_SANDBOX_TIMEOUT_BUFFER_MS } from "./types.js";
|
|
8
8
|
/**
|
|
9
9
|
* The most the sandbox runs before the codex command starts: the Node bootstrap, the runtime
|
|
10
|
-
* version check and, when the
|
|
10
|
+
* version check and, when the study declares `subject.product.install`, the product setup.
|
|
11
11
|
*/
|
|
12
12
|
export function terminalPreExecBudgetMs(productInstall) {
|
|
13
13
|
return (NODE_BOOTSTRAP_TIMEOUT_MS +
|
|
@@ -2,7 +2,7 @@ import type { ActorPersonaRef } from "../../actors/contract.js";
|
|
|
2
2
|
import type { RunBundle } from "../../run/bundle.js";
|
|
3
3
|
import type { RunScope } from "../../run/run.js";
|
|
4
4
|
import type { LiveSandboxInputs, LiveTerminalSandbox } from "./live-sandbox.js";
|
|
5
|
-
import type { RunLiveTerminalSessionArgs,
|
|
5
|
+
import type { RunLiveTerminalSessionArgs, TerminalProductStudyResult } from "./types.js";
|
|
6
6
|
type StartedRun = Extract<Awaited<ReturnType<RunScope["startRun"]>>, {
|
|
7
7
|
ok: true;
|
|
8
8
|
}>["run"];
|
|
@@ -26,5 +26,5 @@ export interface LiveFinishInputs {
|
|
|
26
26
|
/** The session's outcome; a blown cap overrides it. */
|
|
27
27
|
session: LiveTerminalSandbox;
|
|
28
28
|
}
|
|
29
|
-
export declare function finishLiveTerminalSession(inputs: LiveFinishInputs): Promise<
|
|
29
|
+
export declare function finishLiveTerminalSession(inputs: LiveFinishInputs): Promise<TerminalProductStudyResult>;
|
|
30
30
|
export {};
|