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,7 +1,8 @@
|
|
|
1
1
|
import {} from "../../analysis/automatic-completion.js";
|
|
2
2
|
import {} from "../../run/bundle.js";
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
import {} from "../../run/study-result.js";
|
|
4
|
+
/** Provider-neutral metadata constant: the route's non-secret tag (mirrors CUA_ACTOR_STUDY_PROVIDER_METADATA). */
|
|
5
|
+
export const TERMINAL_PRODUCT_STUDY_PROVIDER_METADATA = {
|
|
5
6
|
mode: "terminal-product-lab",
|
|
6
7
|
tool: "humanish",
|
|
7
8
|
};
|
|
@@ -13,7 +14,7 @@ export const UPLOAD_MAX_BYTES = 64 * 1024 * 1024;
|
|
|
13
14
|
/**
|
|
14
15
|
* Server-side reclamation buffer past the codex command's own wall-clock (caps.maxMinutes) kill.
|
|
15
16
|
* Shorter than the desktop routes' SANDBOX_TIMEOUT_BUFFER_MS (src/substrates/e2b/lifetime.ts):
|
|
16
|
-
* when
|
|
17
|
+
* when this buffer was set, the terminal sandbox ran nothing but the codex command, and after its kill only
|
|
17
18
|
* teardown remained.
|
|
18
19
|
*/
|
|
19
20
|
export const TERMINAL_SANDBOX_TIMEOUT_BUFFER_MS = 5 * 60_000;
|
|
@@ -31,6 +32,5 @@ export const TEXT_ITEMS_BYTES = 128 * 1024;
|
|
|
31
32
|
// The longest stdout line the participant reader holds while waiting for its newline.
|
|
32
33
|
export const PENDING_LINE_CHARS = 1024 * 1024;
|
|
33
34
|
// Hard cap on the retained event-stream + transcript size, so a runaway agent cannot balloon the
|
|
34
|
-
// bundle. Redaction runs
|
|
35
|
+
// bundle. Redaction runs pre-truncation so a cut can never split a secret past the scrubber.
|
|
35
36
|
export const MAX_TRANSCRIPT_BYTES = 512 * 1024;
|
|
36
|
-
export const TERMINAL_PRODUCT_LAB_SCHEMA = "humanish.terminal-lab-result.v1";
|
package/dist/run/bundle-shape.js
CHANGED
|
@@ -156,9 +156,9 @@ function isDesktopBrowserEvidence(value) {
|
|
|
156
156
|
}
|
|
157
157
|
/** Short lowercase-hex content digest (digestText default is 12 chars; tolerate longer future digests). */
|
|
158
158
|
const SCORER_DIGEST_PATTERN = /^[a-f0-9]{12,64}$/;
|
|
159
|
-
/** Shape guard for RunScorerProvenance
|
|
159
|
+
/** Shape guard for RunScorerProvenance, mirroring isRunSubjectProvenance: tolerated-absent in
|
|
160
160
|
* isRunBundle, well-shaped when present. Semantics (does the digest still match the file) are not a
|
|
161
|
-
* verify concern
|
|
161
|
+
* verify concern: the block is core-stamped evidence of what was loaded and proves no re-execution. */
|
|
162
162
|
function isRunScorerProvenance(value) {
|
|
163
163
|
return (isRecord(value) &&
|
|
164
164
|
value.schema === "humanish.scorer-provenance.v1" &&
|
|
@@ -183,7 +183,7 @@ export function isRunAdapterScore(value) {
|
|
|
183
183
|
(value.data === undefined || isRecord(value.data)));
|
|
184
184
|
}
|
|
185
185
|
// The local-tree archive content pin: sha256 hex, full 64 chars (unlike the repo's 16-char
|
|
186
|
-
// display-digest convention
|
|
186
|
+
// display-digest convention; this value is the provenance pin itself, persisted in full).
|
|
187
187
|
export const ARCHIVE_SHA256_PATTERN = /^[a-f0-9]{64}$/;
|
|
188
188
|
function isRunSubjectProvenance(value) {
|
|
189
189
|
if (!isRecord(value))
|
package/dist/run/bundle.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { CommsReceivingEvidence } from "../comms/receiving-types.js";
|
|
2
2
|
import { type CapturedGitState } from "./git-state.js";
|
|
3
3
|
import type { SharedWorldEvidence } from "./shared-world-evidence.js";
|
|
4
|
-
import type
|
|
4
|
+
import { type RunStudyProvenance } from "./study-provenance.js";
|
|
5
5
|
import type { RunSimulationStatus, RunStream, RunStreamKind } from "./streams.js";
|
|
6
6
|
export declare const RUN_BUNDLE_SCHEMA = "humanish.run-bundle.v1";
|
|
7
7
|
/** The run bundle file, relative to the run directory. */
|
|
@@ -10,8 +10,8 @@ export declare const REVIEW_SCHEMA = "humanish.review.v1";
|
|
|
10
10
|
export declare const PUBLIC_TARGET_CWD = "[target-cwd]";
|
|
11
11
|
/**
|
|
12
12
|
* A namespaced, product-agnostic score a thin adapter attaches to the bundle via a route's `score`
|
|
13
|
-
* hook, on terminal-product or a browser route (the
|
|
14
|
-
*
|
|
13
|
+
* hook, on terminal-product or a browser route (the adapter extension seam).
|
|
14
|
+
* Core never reads its `data` and knows none of the adopter's nouns: the `namespace` (e.g.
|
|
15
15
|
* `"acme-pixelforge"`) scopes the whole record so core schemas stay product-agnostic and a future
|
|
16
16
|
* inert-field audit does not misfire on a noun core never owned. The adopter's real scorecard
|
|
17
17
|
* (component weights, product rubric) lives in the adopter's repo and is summarized into the generic
|
|
@@ -20,7 +20,7 @@ export declare const PUBLIC_TARGET_CWD = "[target-cwd]";
|
|
|
20
20
|
*/
|
|
21
21
|
export interface RunAdapterScore {
|
|
22
22
|
schema: "humanish.adapter-score.v1";
|
|
23
|
-
/** The adapter's namespace
|
|
23
|
+
/** The adapter's namespace: non-core, product-scoped (e.g. an adopter slug). Required + non-empty. */
|
|
24
24
|
namespace: string;
|
|
25
25
|
status: "pass" | "partial" | "fail";
|
|
26
26
|
/** A 0-100 summary the adapter derived from its own (off-core) rubric. */
|
|
@@ -56,9 +56,8 @@ export interface RunFeedbackCandidate {
|
|
|
56
56
|
proposed_next_state: "watch" | "adapter-hardening" | "target-app-setup" | "actor-auth" | "setup-quality-review" | "study-quality-review";
|
|
57
57
|
acceptance_proof: string[];
|
|
58
58
|
/**
|
|
59
|
-
* Optional, adapter-namespaced product-noun block (the
|
|
60
|
-
*
|
|
61
|
-
* records product-specific concepts — public CLI/product command observed, hosted product
|
|
59
|
+
* Optional, adapter-namespaced product-noun block (the adapter extension seam). A thin adapter
|
|
60
|
+
* records product-specific concepts: public CLI/product command observed, hosted product
|
|
62
61
|
* success-or-blocker, feedback id/draft observed, media/job/asset ids, explicit
|
|
63
62
|
* no-media/no-provider-spend proof, defection/friction risk, without making any of them core
|
|
64
63
|
* primitives. They ride under a single namespaced field so core's feedback enums
|
|
@@ -69,7 +68,7 @@ export interface RunFeedbackCandidate {
|
|
|
69
68
|
adapter?: {
|
|
70
69
|
/** Non-core, product-scoped namespace (e.g. an adopter slug). Required + non-empty. */
|
|
71
70
|
namespace: string;
|
|
72
|
-
/** The adapter's product nouns. Core never reads these keys
|
|
71
|
+
/** The adapter's product nouns. Core never reads these keys, so it stays product-agnostic. */
|
|
73
72
|
data: Record<string, unknown>;
|
|
74
73
|
};
|
|
75
74
|
}
|
|
@@ -87,11 +86,11 @@ export interface RunAdapterArtifact {
|
|
|
87
86
|
note: string;
|
|
88
87
|
}
|
|
89
88
|
/**
|
|
90
|
-
* Provenance for a
|
|
91
|
-
* of its
|
|
89
|
+
* Provenance for a config-declared adopter scorer: the repo-relative entry path and a digest
|
|
90
|
+
* of its entry-module bytes, recorded so a `review.scorer.ref`/`--scorer` run states which
|
|
92
91
|
* out-of-tree judgment it attached. Core-computed (path + digest), never adopter-supplied. A library
|
|
93
|
-
* caller (hooks passed directly through
|
|
94
|
-
* provenance, so this block is absent there and every
|
|
92
|
+
* caller (hooks passed directly through RunStudyOptions) has implicit provenance, because its code is its
|
|
93
|
+
* provenance, so this block is absent there and every older bundle stays byte-stable + verifiable.
|
|
95
94
|
*
|
|
96
95
|
* The digest pins the entry file's identity only; modules it loads are outside it: a `export { score } from
|
|
97
96
|
* "../outside.mjs"` re-export is not captured, and `import()` re-opens the path (a benign same-author
|
|
@@ -136,7 +135,7 @@ export interface RunEvent {
|
|
|
136
135
|
* One executed (or declared) subject-state seed step. Live records carry execution fields
|
|
137
136
|
* (ok/exitCode/timedOut/durationMs); dry-run "declared, not run" records carry only the
|
|
138
137
|
* declaration (name, phase, command digest). The command itself never persists; the digest
|
|
139
|
-
* pins "same recipe" across bundles while the
|
|
138
|
+
* pins "same recipe" across bundles while the study YAML in the consumer's repo stays the
|
|
140
139
|
* plaintext source of truth (publish-safe by construction).
|
|
141
140
|
*/
|
|
142
141
|
export interface RunSubjectStateStepRecord {
|
|
@@ -151,7 +150,7 @@ export interface RunSubjectStateStepRecord {
|
|
|
151
150
|
durationMs?: number;
|
|
152
151
|
}
|
|
153
152
|
/**
|
|
154
|
-
* Structured subject provenance
|
|
153
|
+
* Structured subject provenance: what the subject was, as a code pin (repo/commit,
|
|
155
154
|
* or a local-tree archive digest) and state story. Optional additive field on
|
|
156
155
|
* humanish.run-bundle.v1; absent on bundles from backends that have not adopted it (and on all
|
|
157
156
|
* pre-existing bundles).
|
|
@@ -179,16 +178,16 @@ export interface RunSubjectProvenance {
|
|
|
179
178
|
state: {
|
|
180
179
|
/**
|
|
181
180
|
* seeded: live run, steps declared, all ran ok, no external state declared.
|
|
182
|
-
* unpinned: external state declared (seed records, if any, still attached
|
|
181
|
+
* unpinned: external state declared (seed records, if any, still attached; migrating
|
|
183
182
|
* an external DB is still unpinned overall).
|
|
184
|
-
* declared-not-run: steps declared but not (all) executed ok
|
|
183
|
+
* declared-not-run: steps declared but not (all) executed ok: dry-run contract bundles
|
|
185
184
|
* and failed live provisioning.
|
|
186
|
-
* undeclared: no subject.state block (stateless apps, app-url subjects)
|
|
187
|
-
* "absence declared" marker
|
|
188
|
-
* external-public:
|
|
189
|
-
* directly as the shared plane
|
|
185
|
+
* undeclared: no subject.state block (stateless apps, app-url subjects), the explicit
|
|
186
|
+
* "absence declared" marker that provenance requires when there is none.
|
|
187
|
+
* external-public: an operator-declared, operator-owned public deployment used
|
|
188
|
+
* directly as the shared plane; humanish neither provisioned nor seeded it (no getHost, no
|
|
190
189
|
* clone, no in-sandbox filesystem). It is not "seeded" (nothing was seeded) and not "unpinned" (this is
|
|
191
|
-
* an owned target, not an uncontrolled external DB). The
|
|
190
|
+
* an owned target, not an uncontrolled external DB). The marker for the external-public
|
|
192
191
|
* plane class; verify asserts it in place of the getHost seeded gate.
|
|
193
192
|
*/
|
|
194
193
|
provenance: "seeded" | "unpinned" | "declared-not-run" | "undeclared" | "external-public";
|
|
@@ -197,7 +196,7 @@ export interface RunSubjectProvenance {
|
|
|
197
196
|
};
|
|
198
197
|
}
|
|
199
198
|
/**
|
|
200
|
-
* How well a run attributed interaction between actors: a separate
|
|
199
|
+
* How well a run attributed interaction between actors: a separate evidence axis, orthogonal to the
|
|
201
200
|
* persona-sampling evidence classes (which answer "how representative is the actor?"). Absent ==
|
|
202
201
|
* `isolated` (every existing bundle byte-stable). `shared-world` means N participants drove one
|
|
203
202
|
* mutable plane and their per-participant attribution is weaker (its ceiling is pinned in `sharedWorld.attributionLimits`).
|
|
@@ -254,7 +253,7 @@ export interface RunBundle {
|
|
|
254
253
|
};
|
|
255
254
|
review: ReviewSummary;
|
|
256
255
|
feedbackCandidates: RunFeedbackCandidate[];
|
|
257
|
-
/** Structured subject provenance
|
|
256
|
+
/** Structured subject provenance. Optional and additive: emitted by the
|
|
258
257
|
* computer-use and shared-world backends and the clone scripted-browser route; tolerated absent
|
|
259
258
|
* everywhere else. */
|
|
260
259
|
subject?: RunSubjectProvenance;
|
|
@@ -275,7 +274,7 @@ export interface RunBundle {
|
|
|
275
274
|
requested: "default" | "chrome" | "chromium" | "firefox";
|
|
276
275
|
resolved?: string;
|
|
277
276
|
/**
|
|
278
|
-
* Synthetic media devices the browser was launched with
|
|
277
|
+
* Synthetic media devices the browser was launched with: the camera feed's origin and
|
|
279
278
|
* in-sandbox path, how the permission dialog is answered, and the exact flags.
|
|
280
279
|
*/
|
|
281
280
|
media?: {
|
|
@@ -297,7 +296,7 @@ export interface RunBundle {
|
|
|
297
296
|
*/
|
|
298
297
|
rerun?: RunRerunLineage;
|
|
299
298
|
/**
|
|
300
|
-
* The interaction-attribution
|
|
299
|
+
* The interaction-attribution evidence axis. Absent == `isolated` (every existing bundle
|
|
301
300
|
* byte-stable). Set to `shared-world` by the shared-world backend, paired with `sharedWorld`.
|
|
302
301
|
*/
|
|
303
302
|
attributionClass?: RunAttributionClass;
|
|
@@ -307,15 +306,15 @@ export interface RunBundle {
|
|
|
307
306
|
*/
|
|
308
307
|
sharedWorld?: SharedWorldEvidence;
|
|
309
308
|
/**
|
|
310
|
-
* Optional, adapter-namespaced product score (the
|
|
311
|
-
*
|
|
309
|
+
* Optional, adapter-namespaced product score (the adapter extension seam).
|
|
310
|
+
* A thin adapter's `score` hook returns a `RunAdapterScore`; the route attaches it here
|
|
312
311
|
* without core knowing any product noun (the score is namespaced + its breakdown lives in `data`).
|
|
313
312
|
* The default mission-based verdict (`review`) is unchanged when no scorer hook is given.
|
|
314
313
|
*/
|
|
315
314
|
adapterScore?: RunAdapterScore;
|
|
316
315
|
/**
|
|
317
|
-
* Optional provenance for a config-declared scorer
|
|
318
|
-
* from `review.scorer.ref` / `--scorer`; absent for library callers and every
|
|
316
|
+
* Optional provenance for a config-declared scorer. Present only when the scorer was loaded
|
|
317
|
+
* from `review.scorer.ref` / `--scorer`; absent for library callers and every older bundle
|
|
319
318
|
* (tolerated-absent in isRunBundle so those still verify). Evidence, not a gate.
|
|
320
319
|
*/
|
|
321
320
|
scorerProvenance?: RunScorerProvenance;
|
|
@@ -332,12 +331,13 @@ export interface RunBundle {
|
|
|
332
331
|
*/
|
|
333
332
|
providerResources?: RunProviderResource[];
|
|
334
333
|
/**
|
|
335
|
-
* Which
|
|
336
|
-
*
|
|
337
|
-
*
|
|
338
|
-
* `inferLegacyLabId`, which reads only the historical `persona.source = "lab:<id>"` convention.
|
|
334
|
+
* Which study file produced this run. Absent on a bundle written before this field and on a
|
|
335
|
+
* library caller's run (the run then has no study id rather than a guessed one). Read it, and
|
|
336
|
+
* `lab` and the source convention of older bundles, through studyProvenanceOf.
|
|
339
337
|
*/
|
|
340
|
-
|
|
338
|
+
study?: RunStudyProvenance;
|
|
339
|
+
/** `study`'s value, as runs saved by 0.108 and earlier wrote it. humanish no longer writes it. */
|
|
340
|
+
lab?: RunStudyProvenance;
|
|
341
341
|
/**
|
|
342
342
|
* Optional, additive run-level cost estimate (humanish.run-cost-summary.v1): the sum of every
|
|
343
343
|
* participant's model-token estimate plus the E2B desktop-minute estimate, carrying the same
|
|
@@ -350,7 +350,7 @@ export interface RunBundle {
|
|
|
350
350
|
/**
|
|
351
351
|
* One contributing cost line of a RunCostSummary. A line is present even when it cannot be priced
|
|
352
352
|
* (it records that we tried and could not): an unpriceable line carries estimatedCostUsd: null + a
|
|
353
|
-
* `reason` and contributes nothing to the summary total
|
|
353
|
+
* `reason` and contributes nothing to the summary total. `estimatedCostUsd` is never
|
|
354
354
|
* coerced to 0.
|
|
355
355
|
*/
|
|
356
356
|
export interface RunCostLine {
|
|
@@ -406,7 +406,7 @@ export interface RunCostSummary {
|
|
|
406
406
|
};
|
|
407
407
|
/** Host-side create->teardown span in minutes; null when no sandbox was created. */
|
|
408
408
|
desktopMinutes: number | null;
|
|
409
|
-
/**
|
|
409
|
+
/** The "estimated; <x> unmeasured" statement. */
|
|
410
410
|
note: string;
|
|
411
411
|
}
|
|
412
412
|
export interface RunProviderResource {
|
|
@@ -440,7 +440,7 @@ export interface RunRerunLineage {
|
|
|
440
440
|
/**
|
|
441
441
|
* What happened to the participants in a study, with the denominator attached.
|
|
442
442
|
*
|
|
443
|
-
* A stakeholder watching through the glass forms conclusions from vivid moments
|
|
443
|
+
* A stakeholder watching through the glass forms conclusions from vivid moments. That is the
|
|
444
444
|
* classic failure of the viewing room, and it is why researchers synthesize rather than letting the
|
|
445
445
|
* room decide. So anything shown to a stakeholder carries its count, or it becomes a machine for
|
|
446
446
|
* manufacturing certainty from n=1 (docs/principles/three-roles.md).
|
|
@@ -450,7 +450,7 @@ export interface RunRerunLineage {
|
|
|
450
450
|
* product, is what went wrong.
|
|
451
451
|
*/
|
|
452
452
|
export interface ParticipantOutcomes {
|
|
453
|
-
/** Participants whose sessions reached a terminal state
|
|
453
|
+
/** Participants whose sessions reached a terminal state: the denominator for every count below. */
|
|
454
454
|
total: number;
|
|
455
455
|
/** Recorded successful sessions; completion provenance depends on the actor and its evidence. */
|
|
456
456
|
reachedGoal: number;
|
|
@@ -482,14 +482,14 @@ export interface ReviewSummary {
|
|
|
482
482
|
* The study result, separate from the verdict above.
|
|
483
483
|
*
|
|
484
484
|
* `verdict` answers a gate-shaped question and has to collapse a run to one word. This answers
|
|
485
|
-
* the research question
|
|
485
|
+
* the research question (what happened to the people in the study) and does not collapse: a run
|
|
486
486
|
* where two of three participants finished is not usefully "fail", and a run where the harness
|
|
487
487
|
* broke is a different thing from one where a persona gave up. Absent on a dry-run contract
|
|
488
488
|
* bundle, which has no participants.
|
|
489
489
|
*/
|
|
490
490
|
participants?: ParticipantOutcomes;
|
|
491
491
|
/**
|
|
492
|
-
* The study's per-task completion rates
|
|
492
|
+
* The study's per-task completion rates, present only when the study declared a protocol
|
|
493
493
|
* and at least one session produced a funnel. Absent means no protocol was measured, never that
|
|
494
494
|
* everyone finished.
|
|
495
495
|
*/
|
|
@@ -497,27 +497,27 @@ export interface ReviewSummary {
|
|
|
497
497
|
}
|
|
498
498
|
/**
|
|
499
499
|
* The study's task funnel: for each declared task, how many participants completed it, out of how
|
|
500
|
-
* many sessions produced a funnel. This is "where did people get stuck" as data
|
|
501
|
-
* researcher reads first
|
|
500
|
+
* many sessions produced a funnel. This is "where did people get stuck" as data, the number a
|
|
501
|
+
* researcher reads first, where the per-participant funnels answer it one journey at a time.
|
|
502
502
|
*
|
|
503
503
|
* Aggregated by task id in declaration order. Every participant in a run shares the actor's protocol, so
|
|
504
504
|
* ids line up across participants; a funnel missing a task id (a future mixed-protocol route)
|
|
505
505
|
* simply does not count toward that task's denominator.
|
|
506
506
|
*/
|
|
507
507
|
export interface RunTaskFunnel {
|
|
508
|
-
/** Sessions that produced a funnel
|
|
508
|
+
/** Sessions that produced a funnel: the denominator for every count below. */
|
|
509
509
|
sessions: number;
|
|
510
510
|
tasks: Array<{
|
|
511
511
|
id: string;
|
|
512
512
|
/** Participants whose sessions corroborated this task complete. */
|
|
513
513
|
completed: number;
|
|
514
|
-
/** Sessions whose protocol declared this task
|
|
514
|
+
/** Sessions whose protocol declared this task: its denominator. */
|
|
515
515
|
sessions: number;
|
|
516
516
|
/** False when the task declared no success criterion: asked for, never measurable. */
|
|
517
517
|
observable: boolean;
|
|
518
518
|
/** Sessions where this task's criteria were never evaluated, because the observations they
|
|
519
519
|
* read never arrived. Counted apart from failures: "0/3 completed" with 3 unmeasured is a
|
|
520
|
-
* statement about our instrument, not about the participants
|
|
520
|
+
* statement about our instrument, not about the participants. */
|
|
521
521
|
unmeasured: number;
|
|
522
522
|
}>;
|
|
523
523
|
}
|
|
@@ -526,12 +526,12 @@ export interface BundleRun {
|
|
|
526
526
|
readonly runId: string;
|
|
527
527
|
readonly mode: RunBundle["mode"];
|
|
528
528
|
readonly createdAt: string;
|
|
529
|
-
/** The manifest the run came from
|
|
530
|
-
readonly
|
|
529
|
+
/** The manifest the run came from, as the plan carried it to startRun. */
|
|
530
|
+
readonly study?: RunStudyProvenance | undefined;
|
|
531
531
|
}
|
|
532
532
|
/**
|
|
533
533
|
* The fields every run bundle starts with, in the saved order. The run supplies its id, mode,
|
|
534
|
-
* start time and
|
|
534
|
+
* start time and study; the route passes the participant count and source. The public target cwd
|
|
535
535
|
* and the run's own artifact root are the defaults.
|
|
536
536
|
*/
|
|
537
537
|
export declare function bundleHead(run: BundleRun, args: {
|
|
@@ -541,7 +541,7 @@ export declare function bundleHead(run: BundleRun, args: {
|
|
|
541
541
|
cwd?: string;
|
|
542
542
|
artifactRoot?: string;
|
|
543
543
|
source: RunBundle["source"];
|
|
544
|
-
}): Pick<RunBundle, "schema" | "publication" | "runId" | "mode" | "simCount" | "createdAt" | "cwd" | "artifactRoot" | "
|
|
544
|
+
}): Pick<RunBundle, "schema" | "publication" | "runId" | "mode" | "simCount" | "createdAt" | "cwd" | "artifactRoot" | "study" | "source">;
|
|
545
545
|
/** The files every run directory holds, as the bundle names them. */
|
|
546
546
|
export declare function bundleArtifacts(): RunBundle["artifacts"];
|
|
547
547
|
export declare function buildRunSource(args: {
|
package/dist/run/bundle.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
2
|
import { captureGitState } from "./git-state.js";
|
|
3
|
+
import { studyFields } from "./study-provenance.js";
|
|
3
4
|
export const RUN_BUNDLE_SCHEMA = "humanish.run-bundle.v1";
|
|
4
5
|
/** The run bundle file, relative to the run directory. */
|
|
5
6
|
export const RUN_BUNDLE_FILE = "run.json";
|
|
@@ -7,7 +8,7 @@ export const REVIEW_SCHEMA = "humanish.review.v1";
|
|
|
7
8
|
export const PUBLIC_TARGET_CWD = "[target-cwd]";
|
|
8
9
|
/**
|
|
9
10
|
* The fields every run bundle starts with, in the saved order. The run supplies its id, mode,
|
|
10
|
-
* start time and
|
|
11
|
+
* start time and study; the route passes the participant count and source. The public target cwd
|
|
11
12
|
* and the run's own artifact root are the defaults.
|
|
12
13
|
*/
|
|
13
14
|
export function bundleHead(run, args) {
|
|
@@ -20,7 +21,7 @@ export function bundleHead(run, args) {
|
|
|
20
21
|
createdAt: run.createdAt,
|
|
21
22
|
cwd: args.cwd ?? PUBLIC_TARGET_CWD,
|
|
22
23
|
artifactRoot: args.artifactRoot ?? path.join(".humanish", "runs", run.runId),
|
|
23
|
-
...(run.
|
|
24
|
+
...studyFields(run.study),
|
|
24
25
|
source: args.source,
|
|
25
26
|
};
|
|
26
27
|
}
|
package/dist/run/cost-summary.js
CHANGED
|
@@ -152,8 +152,8 @@ function costTotals(breakdown) {
|
|
|
152
152
|
function costNote(args, totals) {
|
|
153
153
|
const { estimatedTotalUsd, anyNull, placeholder, minRatesAsOf } = totals;
|
|
154
154
|
const estimateNote = estimatedTotalUsd === null
|
|
155
|
-
? `No
|
|
156
|
-
: `Estimated ${estimatedTotalUsd} USD total${anyNull ? " (
|
|
155
|
+
? `No cost line in this run has a price: each lacks a rate, usage or a duration, and none is guessed. ${args.participants.some((participant) => participant.trace.executionProfile?.billing === "account-unknown") ? "Account billing remains unknown; API prices do not measure account spend." : "Each line's reason says what is missing."}`
|
|
156
|
+
: `Estimated ${estimatedTotalUsd} USD total${anyNull ? " (a lower bound: some lines are unmeasured or unpriced)" : ""}${placeholder ? "; it uses a placeholder rate, so confirm the rate before relying on the amount" : ""}. Every figure multiplies usage by a rate table (rates as of ${minRatesAsOf}, the oldest rate used), so it is an estimate and not the provider's charge.`;
|
|
157
157
|
return (estimateNote +
|
|
158
158
|
((args.desktops?.length ?? 0) > 0
|
|
159
159
|
? args.desktops.some((usage) => usage.observation !== undefined && "resources" in usage.observation)
|
|
@@ -205,7 +205,7 @@ export function spendFreeCostSummary() {
|
|
|
205
205
|
breakdown: [],
|
|
206
206
|
tokenUsage: { input: 0, output: 0, total: 0 },
|
|
207
207
|
desktopMinutes: null,
|
|
208
|
-
note: "
|
|
208
|
+
note: "This run made no model request and used no hosted desktop, so it cost $0.",
|
|
209
209
|
};
|
|
210
210
|
}
|
|
211
211
|
// Convert a host-side desktop span (ms) into billed minutes, or undefined when no sandbox ran.
|
package/dist/run/costs.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type PreparedRunArtifactPaths } from "./paths.js";
|
|
1
2
|
import type { RunIndexEntry } from "./run-index.js";
|
|
2
3
|
/** Additive accounting for retained attempts. Null means no estimate, never an invented zero. */
|
|
3
4
|
export interface CostTotals {
|
|
@@ -25,3 +26,25 @@ export declare function emptyCostTotals(): CostTotals;
|
|
|
25
26
|
export declare function addCostTotals(into: CostTotals, next: CostTotals): void;
|
|
26
27
|
/** A read-only, bounded accounting pass. Never validates findings, dispatches, repairs or writes. */
|
|
27
28
|
export declare function readCostTotals(cwd: string, entry: RunIndexEntry): Promise<CostRow>;
|
|
29
|
+
/** One run's analysis history, every distinct attempt counted once. */
|
|
30
|
+
export interface AnalysisAccounting {
|
|
31
|
+
attempts: number;
|
|
32
|
+
/** Attempts that sent a request and recorded its usage. */
|
|
33
|
+
dispatched: number;
|
|
34
|
+
notDispatched: number;
|
|
35
|
+
/** Dispatched or possibly dispatched attempts without a complete price. */
|
|
36
|
+
unpriced: number;
|
|
37
|
+
/** A dispatch marker survives with no usable final accounting. */
|
|
38
|
+
unresolved: number;
|
|
39
|
+
/** The known estimates of the dispatched attempts; 0 when every attempt sent nothing. */
|
|
40
|
+
estimatedUsd: number | null;
|
|
41
|
+
/** Who billed the dispatched attempts. */
|
|
42
|
+
providers: Array<"openai" | "codex">;
|
|
43
|
+
/** History that could not be read whole; ANALYSIS_HISTORY_NOT_RECORDED when there is none. */
|
|
44
|
+
warnings: string[];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* The single reader of a run's analysis spend. Stats totals and every surface that shows one
|
|
48
|
+
* run's cost read it, so they cannot disagree. Receipts are read without opening evidence.
|
|
49
|
+
*/
|
|
50
|
+
export declare function readAnalysisAccounting(prepared: PreparedRunArtifactPaths): Promise<AnalysisAccounting>;
|
package/dist/run/costs.js
CHANGED
|
@@ -47,7 +47,13 @@ export async function readCostTotals(cwd, entry) {
|
|
|
47
47
|
// uncertain, whatever a run-cost warning is named.
|
|
48
48
|
const runWarnings = [];
|
|
49
49
|
const analysisWarnings = [];
|
|
50
|
-
|
|
50
|
+
// A dry run makes no model request and creates no desktop, so with no figure it costs $0. A
|
|
51
|
+
// recorded unknown (null) figure stays unknown.
|
|
52
|
+
costs.runEstimatedUsd = isKnownUsd(entry.estimatedCostUsd)
|
|
53
|
+
? entry.estimatedCostUsd
|
|
54
|
+
: entry.estimatedCostUsd === undefined && entry.mode === "dry-run"
|
|
55
|
+
? 0
|
|
56
|
+
: null;
|
|
51
57
|
try {
|
|
52
58
|
const prepared = await bindExistingRunArtifactPaths(cwd, entry.runId);
|
|
53
59
|
const bytes = await readBoundedFile(prepared, RUN_BUNDLE_FILE, EVIDENCE_LIMITS.sourceBytes);
|
|
@@ -81,49 +87,14 @@ export async function readCostTotals(cwd, entry) {
|
|
|
81
87
|
costs.incompleteRunEstimates = 1;
|
|
82
88
|
runWarnings.push("RUN_COST_COMPLETENESS_UNKNOWN");
|
|
83
89
|
}
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
else if (automatic) {
|
|
93
|
-
if (automatic.uncertain)
|
|
94
|
-
analysisWarnings.push("AUTOMATIC_ANALYSIS_ACCOUNTING_UNKNOWN");
|
|
95
|
-
const id = automatic.reused ? automatic.analysisId : automatic.attemptId;
|
|
96
|
-
if (id && (automatic.started || automatic.analysisId !== null) && !records.has(id)) {
|
|
97
|
-
records.set(id, { id, receipt: null, start: null, legacy: false });
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
for (const record of records.values()) {
|
|
101
|
-
costs.analysisAttempts += 1;
|
|
102
|
-
if (record.legacy)
|
|
103
|
-
analysisWarnings.push("ANALYSIS_LEGACY_REPORT_ACCOUNTING");
|
|
104
|
-
const usage = record.receipt?.usage;
|
|
105
|
-
if (!usage) {
|
|
106
|
-
costs.analysisUnpricedAttempts += 1;
|
|
107
|
-
costs.analysisUnresolvedAttempts += 1;
|
|
108
|
-
continue;
|
|
109
|
-
}
|
|
110
|
-
if (!usage.dispatched) {
|
|
111
|
-
costs.analysisNotDispatchedAttempts += 1;
|
|
112
|
-
costs.analysisEstimatedUsd = sumKnown(costs.analysisEstimatedUsd, 0);
|
|
113
|
-
}
|
|
114
|
-
else {
|
|
115
|
-
costs.analysisDispatchedAttempts += 1;
|
|
116
|
-
if (isKnownUsd(usage.estimatedCostUsd)) {
|
|
117
|
-
costs.analysisEstimatedUsd = sumKnown(costs.analysisEstimatedUsd, usage.estimatedCostUsd);
|
|
118
|
-
}
|
|
119
|
-
if (!isKnownUsd(usage.estimatedCostUsd) || !usage.usageComplete)
|
|
120
|
-
costs.analysisUnpricedAttempts += 1;
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
// A skipped/queued automatic job says nothing about historical manual requests.
|
|
124
|
-
// Only final no-dispatch receipts contribute a supported zero to recorded attempts.
|
|
125
|
-
if (records.size === 0)
|
|
126
|
-
analysisWarnings.push("ANALYSIS_HISTORY_NOT_RECORDED");
|
|
90
|
+
const analysis = await readAnalysisAccounting(prepared);
|
|
91
|
+
analysisWarnings.push(...analysis.warnings);
|
|
92
|
+
costs.analysisAttempts = analysis.attempts;
|
|
93
|
+
costs.analysisDispatchedAttempts = analysis.dispatched;
|
|
94
|
+
costs.analysisNotDispatchedAttempts = analysis.notDispatched;
|
|
95
|
+
costs.analysisUnpricedAttempts = analysis.unpriced;
|
|
96
|
+
costs.analysisUnresolvedAttempts = analysis.unresolved;
|
|
97
|
+
costs.analysisEstimatedUsd = analysis.estimatedUsd;
|
|
127
98
|
costs.analysisHistoryUncertainRuns = analysisWarnings.length > 0 ? 1 : 0;
|
|
128
99
|
}
|
|
129
100
|
catch {
|
|
@@ -138,3 +109,67 @@ export async function readCostTotals(cwd, entry) {
|
|
|
138
109
|
warnings: [...new Set([...runWarnings, ...analysisWarnings])],
|
|
139
110
|
};
|
|
140
111
|
}
|
|
112
|
+
/**
|
|
113
|
+
* The single reader of a run's analysis spend. Stats totals and every surface that shows one
|
|
114
|
+
* run's cost read it, so they cannot disagree. Receipts are read without opening evidence.
|
|
115
|
+
*/
|
|
116
|
+
export async function readAnalysisAccounting(prepared) {
|
|
117
|
+
const accounting = {
|
|
118
|
+
attempts: 0,
|
|
119
|
+
dispatched: 0,
|
|
120
|
+
notDispatched: 0,
|
|
121
|
+
unpriced: 0,
|
|
122
|
+
unresolved: 0,
|
|
123
|
+
estimatedUsd: null,
|
|
124
|
+
providers: [],
|
|
125
|
+
warnings: [],
|
|
126
|
+
};
|
|
127
|
+
const [history, automatic] = await Promise.all([
|
|
128
|
+
readAnalysisAccountingRecords(prepared),
|
|
129
|
+
readAutomaticAnalysisAccounting(prepared),
|
|
130
|
+
]);
|
|
131
|
+
accounting.warnings.push(...history.warnings);
|
|
132
|
+
const records = new Map(history.records.map((record) => [record.id, record]));
|
|
133
|
+
if (automatic === "unknown")
|
|
134
|
+
accounting.warnings.push("AUTOMATIC_ANALYSIS_ACCOUNTING_UNKNOWN");
|
|
135
|
+
else if (automatic) {
|
|
136
|
+
if (automatic.uncertain)
|
|
137
|
+
accounting.warnings.push("AUTOMATIC_ANALYSIS_ACCOUNTING_UNKNOWN");
|
|
138
|
+
const id = automatic.reused ? automatic.analysisId : automatic.attemptId;
|
|
139
|
+
if (id && (automatic.started || automatic.analysisId !== null) && !records.has(id)) {
|
|
140
|
+
records.set(id, { id, receipt: null, start: null, legacy: false });
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const providers = new Set();
|
|
144
|
+
for (const record of records.values()) {
|
|
145
|
+
accounting.attempts += 1;
|
|
146
|
+
if (record.legacy)
|
|
147
|
+
accounting.warnings.push("ANALYSIS_LEGACY_REPORT_ACCOUNTING");
|
|
148
|
+
const usage = record.receipt?.usage;
|
|
149
|
+
if (!usage) {
|
|
150
|
+
accounting.unpriced += 1;
|
|
151
|
+
accounting.unresolved += 1;
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
if (!usage.dispatched) {
|
|
155
|
+
accounting.notDispatched += 1;
|
|
156
|
+
accounting.estimatedUsd = sumKnown(accounting.estimatedUsd, 0);
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
accounting.dispatched += 1;
|
|
160
|
+
if (record.receipt)
|
|
161
|
+
providers.add(record.receipt.provider);
|
|
162
|
+
if (isKnownUsd(usage.estimatedCostUsd)) {
|
|
163
|
+
accounting.estimatedUsd = sumKnown(accounting.estimatedUsd, usage.estimatedCostUsd);
|
|
164
|
+
}
|
|
165
|
+
if (!isKnownUsd(usage.estimatedCostUsd) || !usage.usageComplete)
|
|
166
|
+
accounting.unpriced += 1;
|
|
167
|
+
}
|
|
168
|
+
// A skipped or queued automatic job says nothing about earlier manual requests. Only final
|
|
169
|
+
// no-dispatch receipts contribute a supported zero.
|
|
170
|
+
if (records.size === 0)
|
|
171
|
+
accounting.warnings.push("ANALYSIS_HISTORY_NOT_RECORDED");
|
|
172
|
+
accounting.providers = [...providers].sort();
|
|
173
|
+
accounting.warnings = [...new Set(accounting.warnings)];
|
|
174
|
+
return accounting;
|
|
175
|
+
}
|
package/dist/run/detail.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ interface RunThought {
|
|
|
9
9
|
at?: string;
|
|
10
10
|
}
|
|
11
11
|
export interface RunParticipant {
|
|
12
|
-
/** Stream id
|
|
12
|
+
/** Stream id: stable within a run, and what distinguishes participants of one study. */
|
|
13
13
|
id: string;
|
|
14
14
|
/** What to call them on screen: the participant's own label, else the persona id. */
|
|
15
15
|
label: string;
|
|
@@ -17,11 +17,11 @@ export interface RunParticipant {
|
|
|
17
17
|
personaId?: string;
|
|
18
18
|
/**
|
|
19
19
|
* The persona's declared traits (`patience:medium`, `skill:medium`, …). This is the abbreviated
|
|
20
|
-
* persona a reader actually wants beside a live thought
|
|
20
|
+
* persona a reader actually wants beside a live thought. It says who is struggling, which a
|
|
21
21
|
* name alone does not.
|
|
22
22
|
*/
|
|
23
23
|
traits: string[];
|
|
24
|
-
/** `running`, `passed`, `failed`, `contract_proof_only
|
|
24
|
+
/** `running`, `passed`, `failed`, `contract_proof_only`: the participant's own word for itself. */
|
|
25
25
|
status?: string;
|
|
26
26
|
/** Why the actor stopped, when it has. */
|
|
27
27
|
completionReason?: string;
|
|
@@ -30,7 +30,7 @@ export interface RunParticipant {
|
|
|
30
30
|
actions?: number;
|
|
31
31
|
/**
|
|
32
32
|
* Thoughts recorded so far. The mid-run flush carries the trace items but not the `counts` block,
|
|
33
|
-
* so a live participant has no turn count to show
|
|
33
|
+
* so a live participant has no turn count to show, but the thoughts can be counted directly, and
|
|
34
34
|
* "8 thoughts" is a true statement about progress rather than an inferred turn number.
|
|
35
35
|
*/
|
|
36
36
|
thoughts?: number;
|
|
@@ -49,13 +49,13 @@ export interface RunDetail {
|
|
|
49
49
|
observerPath?: string;
|
|
50
50
|
}
|
|
51
51
|
/**
|
|
52
|
-
* Read one run's participants. Returns null when the run has no readable bundle yet
|
|
52
|
+
* Read one run's participants. Returns null when the run has no readable bundle yet, an ordinary
|
|
53
53
|
* state for a run that has just started, not a failure.
|
|
54
54
|
*
|
|
55
55
|
* Reads the bundle narrowly rather than through `loadRunBundle`, which applies the strict
|
|
56
56
|
* evidence-of-record guard. That guard is right for verification and wrong here: a mid-run flush is
|
|
57
57
|
* a partial document by definition, so validating it as a complete bundle would make the live view
|
|
58
|
-
*
|
|
58
|
+
* (the only view that needs this) the one case that never renders. Nothing read here is treated
|
|
59
59
|
* as a claim about what a participant did; it is what to put on a screen.
|
|
60
60
|
*/
|
|
61
61
|
export declare function readRunDetail(cwdInput: string, runId: string): Promise<RunDetail | null>;
|
package/dist/run/detail.js
CHANGED
|
@@ -20,7 +20,7 @@ const RUN_DETAIL_SCHEMA = "humanish.run-detail.v1";
|
|
|
20
20
|
*
|
|
21
21
|
* Takes the last reasoning item rather than the newest by timestamp: the trace is append-ordered by
|
|
22
22
|
* construction, and half of a live flush may not carry `at` yet. An item still in flight is skipped
|
|
23
|
-
*
|
|
23
|
+
* because a partial thought read mid-write would be quoted as though the participant had finished it.
|
|
24
24
|
*/
|
|
25
25
|
function latestThought(trace) {
|
|
26
26
|
const items = trace.items ?? [];
|
|
@@ -70,7 +70,7 @@ function participantFrom(stream, index) {
|
|
|
70
70
|
*
|
|
71
71
|
* A finished trace carries its own `estimatedCost`. A live one carries the running usage and the
|
|
72
72
|
* model it prices at, so the same estimator gives a figure mid-run instead of the screen reporting
|
|
73
|
-
* the cost as unknown until the moment the run ends
|
|
73
|
+
* the cost as unknown until the moment the run ends. That is the half of a run where knowing what
|
|
74
74
|
* it is costing actually changes what you do.
|
|
75
75
|
*/
|
|
76
76
|
function costOf(trace) {
|
|
@@ -95,13 +95,13 @@ function costOf(trace) {
|
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
97
|
/**
|
|
98
|
-
* Read one run's participants. Returns null when the run has no readable bundle yet
|
|
98
|
+
* Read one run's participants. Returns null when the run has no readable bundle yet, an ordinary
|
|
99
99
|
* state for a run that has just started, not a failure.
|
|
100
100
|
*
|
|
101
101
|
* Reads the bundle narrowly rather than through `loadRunBundle`, which applies the strict
|
|
102
102
|
* evidence-of-record guard. That guard is right for verification and wrong here: a mid-run flush is
|
|
103
103
|
* a partial document by definition, so validating it as a complete bundle would make the live view
|
|
104
|
-
*
|
|
104
|
+
* (the only view that needs this) the one case that never renders. Nothing read here is treated
|
|
105
105
|
* as a claim about what a participant did; it is what to put on a screen.
|
|
106
106
|
*/
|
|
107
107
|
export async function readRunDetail(cwdInput, runId) {
|