humanish 0.107.0 → 0.108.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +22 -17
- package/CHANGELOG.md +14 -0
- package/CONTEXT.md +51 -44
- package/README.md +145 -172
- 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-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 +8 -6
- 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 +2 -2
- package/dist/actors/codex/restricted-session.js +10 -5
- package/dist/actors/computer-use/actor.d.ts +16 -16
- package/dist/actors/computer-use/actor.js +2 -2
- package/dist/actors/computer-use/admission-limit.d.ts +1 -1
- package/dist/actors/computer-use/admission-limit.js +1 -1
- package/dist/actors/computer-use/loop/actions.d.ts +3 -3
- package/dist/actors/computer-use/loop/actions.js +10 -10
- package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
- package/dist/actors/computer-use/loop/backstop.js +14 -12
- package/dist/actors/computer-use/loop/ending.d.ts +5 -5
- package/dist/actors/computer-use/loop/ending.js +7 -7
- package/dist/actors/computer-use/loop/observation.d.ts +2 -2
- package/dist/actors/computer-use/loop/observation.js +9 -9
- package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
- package/dist/actors/computer-use/loop/provider-call.js +1 -1
- package/dist/actors/computer-use/loop/session.js +3 -3
- package/dist/actors/computer-use/loop/spend.d.ts +1 -1
- package/dist/actors/computer-use/loop/spend.js +1 -1
- package/dist/actors/computer-use/loop/trace.js +9 -8
- package/dist/actors/computer-use/loop/types.d.ts +25 -23
- package/dist/actors/computer-use/loop/usage.js +2 -2
- 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 +11 -8
- package/dist/actors/computer-use/openai-provider.js +45 -34
- package/dist/actors/computer-use/openai-requests.d.ts +36 -10
- package/dist/actors/computer-use/openai-requests.js +82 -15
- package/dist/actors/computer-use/openai-wire.d.ts +19 -7
- package/dist/actors/computer-use/openai-wire.js +36 -34
- package/dist/actors/contract.d.ts +78 -43
- package/dist/actors/contract.js +29 -23
- package/dist/actors/local-agent/claude-session.d.ts +1 -1
- package/dist/actors/local-agent/claude-session.js +10 -9
- package/dist/actors/local-agent/cli.d.ts +8 -6
- package/dist/actors/local-agent/cli.js +24 -28
- package/dist/actors/local-agent/readiness.d.ts +2 -2
- package/dist/actors/local-agent/readiness.js +4 -4
- package/dist/actors/reasoning-effort.js +6 -6
- package/dist/actors/registry.d.ts +10 -10
- package/dist/actors/registry.js +18 -17
- package/dist/actors/scripted-browser/actor.d.ts +8 -8
- package/dist/actors/scripted-browser/actor.js +16 -16
- package/dist/actors/scripted-browser/browser-command.js +1 -1
- package/dist/actors/scripted-browser/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/codex-config.d.ts +6 -2
- package/dist/analysis/codex-config.js +22 -14
- package/dist/analysis/service.js +5 -5
- package/dist/cli/commands/analyze.js +19 -16
- package/dist/cli/commands/codex.js +9 -9
- package/dist/cli/commands/comms.js +54 -33
- package/dist/cli/commands/feedback.js +20 -21
- package/dist/cli/commands/lab-format.d.ts +5 -4
- package/dist/cli/commands/lab-format.js +35 -23
- package/dist/cli/commands/lab-route-computer-use.js +6 -7
- package/dist/cli/commands/lab-route-preview.js +4 -3
- package/dist/cli/commands/lab-route-shared-world.js +3 -3
- package/dist/cli/commands/lab-run.js +10 -11
- package/dist/cli/commands/lab-scorer.d.ts +2 -2
- package/dist/cli/commands/lab-scorer.js +1 -1
- package/dist/cli/commands/migrate.d.ts +4 -0
- package/dist/cli/commands/migrate.js +65 -0
- package/dist/cli/commands/observe.js +147 -108
- 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 +137 -138
- package/dist/cli/commands/setup.d.ts +2 -2
- package/dist/cli/commands/setup.js +26 -21
- package/dist/cli/commands/study.d.ts +3 -0
- package/dist/cli/commands/study.js +182 -0
- package/dist/cli/commands/tui.d.ts +4 -4
- package/dist/cli/commands/tui.js +21 -21
- package/dist/cli/commands/watch.js +60 -75
- package/dist/cli/deprecations.d.ts +18 -0
- package/dist/cli/deprecations.js +48 -0
- package/dist/cli/doctor.d.ts +15 -5
- package/dist/cli/doctor.js +103 -48
- package/dist/cli/first-run-path.d.ts +12 -10
- package/dist/cli/first-run-path.js +30 -28
- package/dist/cli/io.d.ts +41 -6
- package/dist/cli/io.js +97 -22
- package/dist/cli/observer-follow.d.ts +2 -2
- package/dist/cli/observer-follow.js +5 -6
- package/dist/cli/orientation.d.ts +6 -3
- package/dist/cli/orientation.js +43 -39
- package/dist/cli/product-sentence.d.ts +6 -0
- package/dist/cli/product-sentence.js +6 -0
- package/dist/cli/program.d.ts +6 -1
- package/dist/cli/program.js +109 -40
- package/dist/cli/telemetry.d.ts +15 -15
- package/dist/cli/telemetry.js +48 -40
- 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 +14 -14
- package/dist/comms/email-catch.d.ts +3 -3
- package/dist/comms/email-catch.js +8 -8
- package/dist/comms/external-evidence.js +2 -2
- package/dist/comms/extract.js +2 -2
- package/dist/comms/fake-inbox.d.ts +2 -2
- package/dist/comms/fake-inbox.js +2 -2
- package/dist/comms/receiving-render.d.ts +1 -1
- package/dist/comms/receiving-render.js +2 -2
- package/dist/comms/sandbox-catch-script.d.ts +6 -6
- package/dist/comms/sandbox-catch-script.js +6 -6
- package/dist/comms/sandbox-catch.d.ts +36 -37
- package/dist/comms/sandbox-catch.js +34 -35
- package/dist/comms/setup.js +42 -8
- package/dist/comms/thread-evidence.d.ts +1 -1
- package/dist/comms/thread-evidence.js +6 -6
- package/dist/comms/types.d.ts +6 -6
- package/dist/comms/types.js +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 +36 -78
- package/dist/feedback/export-bundle.js +1 -1
- package/dist/feedback/export.d.ts +5 -1
- package/dist/feedback/export.js +7 -8
- package/dist/feedback/feedback.d.ts +2 -2
- package/dist/feedback/feedback.js +21 -3
- package/dist/guest/chromium-text.js +2 -2
- package/dist/guest/desktop-native.d.ts +1 -1
- package/dist/guest/runtime.js +1 -1
- package/dist/index.d.ts +12 -10
- package/dist/index.js +8 -6
- package/dist/keys/key-resolution.d.ts +5 -5
- package/dist/keys/key-resolution.js +23 -23
- package/dist/lab/adapter-extension.d.ts +7 -7
- package/dist/lab/adapter-extension.js +13 -36
- package/dist/lab/adapter-scorer-loader.d.ts +7 -7
- package/dist/lab/adapter-scorer-loader.js +32 -32
- package/dist/lab/composition-rules.js +42 -42
- package/dist/lab/config.js +65 -25
- package/dist/lab/deprecated-fields.d.ts +10 -0
- package/dist/lab/deprecated-fields.js +24 -0
- package/dist/lab/device-presets.d.ts +8 -8
- package/dist/lab/device-presets.js +11 -11
- package/dist/lab/discover.d.ts +13 -9
- package/dist/lab/discover.js +117 -57
- package/dist/lab/doctor.d.ts +10 -3
- package/dist/lab/doctor.js +47 -9
- package/dist/lab/init-templates.js +147 -147
- package/dist/lab/init.d.ts +1 -1
- package/dist/lab/init.js +41 -9
- package/dist/lab/keys.d.ts +2 -0
- package/dist/lab/keys.js +42 -8
- package/dist/lab/lab-deps.d.ts +7 -12
- package/dist/lab/parse/actors.js +9 -9
- package/dist/lab/parse/comms.js +5 -5
- package/dist/lab/parse/execution.js +13 -13
- package/dist/lab/parse/study-v3.d.ts +23 -0
- package/dist/lab/parse/study-v3.js +259 -0
- package/dist/lab/parse/subject-state.d.ts +7 -7
- package/dist/lab/parse/subject-state.js +16 -16
- package/dist/lab/parse/subject.js +28 -28
- package/dist/lab/parse/values.d.ts +1 -1
- package/dist/lab/parse/values.js +3 -3
- package/dist/lab/persona-resolve.d.ts +4 -4
- package/dist/lab/persona-resolve.js +4 -4
- package/dist/lab/plan-participants.d.ts +2 -2
- package/dist/lab/plan-types.d.ts +4 -4
- package/dist/lab/plan.d.ts +1 -7
- package/dist/lab/plan.js +10 -41
- package/dist/lab/preflight-probes.js +11 -11
- package/dist/lab/preflight-result.d.ts +2 -1
- package/dist/lab/preflight-result.js +5 -4
- package/dist/lab/preflight.d.ts +7 -5
- package/dist/lab/preflight.js +5 -5
- package/dist/lab/routing.d.ts +31 -25
- package/dist/lab/routing.js +60 -29
- package/dist/lab/run-lab-events.d.ts +0 -3
- package/dist/lab/run-lab-events.js +0 -6
- package/dist/lab/run-lab-homes.d.ts +22 -10
- package/dist/lab/run-lab-homes.js +5 -1
- package/dist/lab/run-lab-options.d.ts +1 -1
- package/dist/lab/run-lab-options.js +16 -13
- package/dist/lab/summary.d.ts +7 -6
- package/dist/lab/summary.js +10 -10
- package/dist/lab/tasks.d.ts +15 -15
- package/dist/lab/tasks.js +14 -14
- package/dist/lab/types.d.ts +101 -95
- package/dist/lab/types.js +2 -0
- package/dist/lab/validation.d.ts +13 -13
- package/dist/lab/validation.js +44 -42
- package/dist/lab/warnings.d.ts +10 -0
- package/dist/lab/warnings.js +61 -33
- package/dist/library-aliases.d.ts +56 -0
- package/dist/library-aliases.js +22 -0
- package/dist/observer/artifact.d.ts +1 -1
- package/dist/observer/artifact.js +6 -6
- 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 +1 -1
- package/dist/observer/library.js +4 -2
- package/dist/observer/listen.js +5 -4
- package/dist/observer/render.d.ts +1 -1
- package/dist/observer/render.js +10 -5
- package/dist/observer/run-routes.d.ts +3 -3
- package/dist/observer/run-routes.js +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 +15 -15
- package/dist/routes/computer-use/bundle.js +3 -3
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/comms.js +14 -14
- package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +4 -3
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
- package/dist/routes/computer-use/e2b-desktop/prepare.js +7 -7
- package/dist/routes/computer-use/e2b-desktop/start.js +9 -8
- package/dist/routes/computer-use/e2b-desktop/teardown.js +5 -4
- package/dist/routes/computer-use/external-comms.d.ts +1 -1
- package/dist/routes/computer-use/external-comms.js +1 -1
- package/dist/routes/computer-use/fanout-bundle.js +18 -18
- package/dist/routes/computer-use/fanout-records.js +10 -11
- package/dist/routes/computer-use/live-flush.d.ts +1 -1
- package/dist/routes/computer-use/live-flush.js +6 -6
- package/dist/routes/computer-use/live-phase.d.ts +4 -2
- package/dist/routes/computer-use/live-phase.js +6 -6
- package/dist/routes/computer-use/local-vm.js +1 -1
- package/dist/routes/computer-use/participant-desktop.d.ts +4 -4
- package/dist/routes/computer-use/participant-desktop.js +4 -4
- package/dist/routes/computer-use/participant-execution.d.ts +4 -4
- package/dist/routes/computer-use/participant-execution.js +9 -9
- package/dist/routes/computer-use/participant-model.d.ts +6 -0
- package/dist/routes/computer-use/participant-model.js +31 -13
- package/dist/routes/computer-use/participant-prompt.d.ts +11 -11
- package/dist/routes/computer-use/participant-prompt.js +6 -6
- package/dist/routes/computer-use/participant-runs.d.ts +7 -7
- package/dist/routes/computer-use/participant-runs.js +13 -13
- package/dist/routes/computer-use/plan.js +22 -22
- package/dist/routes/computer-use/preflight.js +21 -21
- package/dist/routes/computer-use/rerun-selection.js +1 -1
- package/dist/routes/computer-use/result.js +11 -11
- package/dist/routes/computer-use/route.d.ts +2 -1
- package/dist/routes/computer-use/route.js +15 -14
- package/dist/routes/computer-use/self-report.d.ts +7 -7
- package/dist/routes/computer-use/self-report.js +31 -31
- package/dist/routes/computer-use/setup.d.ts +1 -1
- package/dist/routes/computer-use/setup.js +17 -18
- package/dist/routes/computer-use/single-bundle.d.ts +7 -7
- package/dist/routes/computer-use/single-bundle.js +28 -30
- package/dist/routes/computer-use/subject-projection.d.ts +1 -1
- package/dist/routes/computer-use/subject-projection.js +6 -6
- package/dist/routes/computer-use/types.d.ts +40 -42
- package/dist/routes/computer-use/types.js +10 -10
- package/dist/routes/preview.d.ts +8 -2
- package/dist/routes/preview.js +8 -4
- package/dist/routes/scripted/bundle.d.ts +2 -2
- package/dist/routes/scripted/bundle.js +13 -12
- package/dist/routes/scripted/plan.d.ts +1 -1
- package/dist/routes/scripted/plan.js +9 -9
- package/dist/routes/scripted/result.js +5 -5
- package/dist/routes/scripted/route.js +5 -6
- package/dist/routes/scripted/scenario.js +2 -2
- package/dist/routes/scripted/setup.js +7 -7
- package/dist/routes/scripted/subject.js +1 -1
- package/dist/routes/scripted/surface-records.js +3 -3
- package/dist/routes/scripted/types.d.ts +3 -5
- package/dist/routes/scripted/types.js +1 -1
- package/dist/routes/shared-world/bundle-records.js +9 -8
- package/dist/routes/shared-world/bundle.d.ts +5 -5
- package/dist/routes/shared-world/bundle.js +40 -38
- package/dist/routes/shared-world/checkpoints.d.ts +1 -1
- package/dist/routes/shared-world/checkpoints.js +1 -1
- package/dist/routes/shared-world/comms.d.ts +5 -5
- package/dist/routes/shared-world/comms.js +14 -14
- 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 +7 -6
- package/dist/routes/shared-world/participant-specs.js +31 -24
- package/dist/routes/shared-world/plan.js +7 -7
- 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.js +14 -13
- package/dist/routes/shared-world/result.js +20 -21
- package/dist/routes/shared-world/route.js +23 -22
- package/dist/routes/shared-world/setup.d.ts +3 -3
- package/dist/routes/shared-world/setup.js +4 -4
- package/dist/routes/shared-world/types.d.ts +30 -28
- package/dist/routes/shared-world/types.js +4 -4
- package/dist/routes/terminal/adapter.d.ts +3 -3
- package/dist/routes/terminal/adapter.js +5 -5
- package/dist/routes/terminal/bundle.d.ts +3 -3
- package/dist/routes/terminal/bundle.js +22 -21
- package/dist/routes/terminal/credentials.d.ts +4 -4
- package/dist/routes/terminal/credentials.js +7 -7
- package/dist/routes/terminal/dry-run.js +4 -4
- package/dist/routes/terminal/encoding.js +2 -2
- package/dist/routes/terminal/ledger.d.ts +3 -3
- package/dist/routes/terminal/ledger.js +14 -14
- package/dist/routes/terminal/live-finish.js +3 -3
- package/dist/routes/terminal/live-sandbox.js +12 -13
- package/dist/routes/terminal/persona.js +1 -1
- package/dist/routes/terminal/plan.js +11 -11
- package/dist/routes/terminal/recorder.js +2 -2
- package/dist/routes/terminal/result.js +8 -8
- package/dist/routes/terminal/route.js +6 -7
- package/dist/routes/terminal/sandbox.d.ts +1 -1
- package/dist/routes/terminal/sandbox.js +1 -1
- package/dist/routes/terminal/session.js +8 -7
- 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 +2 -2
- package/dist/routes/terminal/trace.js +2 -2
- package/dist/routes/terminal/types.d.ts +26 -28
- package/dist/routes/terminal/types.js +3 -3
- package/dist/run/bundle-shape.js +3 -3
- package/dist/run/bundle.d.ts +46 -46
- package/dist/run/bundle.js +2 -1
- package/dist/run/cost-summary.js +3 -3
- package/dist/run/costs.js +7 -1
- package/dist/run/detail.d.ts +6 -6
- package/dist/run/detail.js +4 -4
- package/dist/run/dry-run-inputs.js +1 -1
- package/dist/run/dry-run.js +18 -18
- package/dist/run/judge.d.ts +19 -13
- package/dist/run/judge.js +18 -8
- package/dist/run/paths.d.ts +1 -1
- package/dist/run/paths.js +1 -1
- package/dist/run/pricing.d.ts +11 -6
- package/dist/run/pricing.js +20 -13
- package/dist/run/projection.d.ts +14 -14
- package/dist/run/projection.js +15 -15
- package/dist/run/reclaim.js +2 -2
- package/dist/run/results.d.ts +5 -5
- package/dist/run/run-index.d.ts +8 -6
- package/dist/run/run-index.js +15 -16
- 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 +5 -4
- package/dist/run/run.js +1 -1
- 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 +36 -35
- 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 +6 -6
- package/dist/run/stats.d.ts +12 -6
- package/dist/run/stats.js +116 -58
- package/dist/run/status.d.ts +8 -29
- package/dist/run/status.js +5 -27
- package/dist/run/stored-runs.js +2 -1
- package/dist/run/stream-shape.js +1 -1
- package/dist/run/streams.d.ts +6 -6
- package/dist/run/study-provenance.d.ts +47 -0
- package/dist/run/study-provenance.js +63 -0
- package/dist/run/study-result.d.ts +16 -0
- package/dist/run/study-result.js +9 -0
- package/dist/run/text.d.ts +2 -0
- package/dist/run/text.js +4 -0
- package/dist/run-lab.d.ts +7 -7
- package/dist/run-lab.js +1 -3
- package/dist/study/convert.d.ts +33 -0
- package/dist/study/convert.js +432 -0
- package/dist/study/field-paths.d.ts +12 -0
- package/dist/study/field-paths.js +126 -0
- package/dist/study/files.d.ts +26 -0
- package/dist/study/files.js +43 -0
- package/dist/study/migrate.d.ts +48 -0
- package/dist/study/migrate.js +408 -0
- package/dist/study/owned-files.d.ts +38 -0
- package/dist/study/owned-files.js +182 -0
- package/dist/subject/clone.d.ts +1 -1
- package/dist/subject/desktop-cli.d.ts +1 -1
- package/dist/subject/desktop-cli.js +2 -2
- package/dist/subject/local-tree-archive.js +1 -1
- package/dist/subject/local-tree.d.ts +1 -1
- package/dist/subject/node-bootstrap.js +1 -1
- package/dist/subject/runtime.js +8 -9
- package/dist/subject/serve.d.ts +1 -1
- package/dist/subject/serve.js +3 -3
- package/dist/subject/state.d.ts +1 -1
- package/dist/subject/steps.d.ts +5 -5
- package/dist/subject/steps.js +4 -4
- package/dist/substrates/command-failure.d.ts +3 -3
- package/dist/substrates/command-failure.js +3 -3
- package/dist/substrates/detached.d.ts +6 -6
- package/dist/substrates/detached.js +7 -7
- package/dist/substrates/e2b/cdp-probe.d.ts +9 -9
- package/dist/substrates/e2b/cdp-probe.js +14 -17
- package/dist/substrates/e2b/desktop-browser.d.ts +2 -2
- package/dist/substrates/e2b/desktop-browser.js +8 -8
- package/dist/substrates/e2b/desktop-cdp.d.ts +9 -9
- package/dist/substrates/e2b/desktop-cdp.js +8 -8
- package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
- package/dist/substrates/e2b/desktop-executor.js +1 -1
- package/dist/substrates/e2b/desktop-geometry.d.ts +3 -3
- package/dist/substrates/e2b/desktop-geometry.js +7 -7
- package/dist/substrates/e2b/desktop-media.d.ts +1 -1
- 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/sandbox.d.ts +1 -1
- package/dist/substrates/e2b/sandbox.js +1 -1
- package/dist/substrates/e2b/sdk.d.ts +11 -11
- package/dist/substrates/e2b/sdk.js +6 -6
- package/dist/tui/actions.d.ts +1 -1
- package/dist/tui/actions.js +13 -13
- package/dist/tui/contract.d.ts +16 -16
- package/dist/tui/contract.js +10 -10
- package/dist/tui/launch.d.ts +4 -4
- package/dist/tui/launch.js +18 -19
- package/dist/tui/project.js +5 -5
- package/dist/tui-app.js +82 -82
- 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 +4 -4
- package/dist/verify/subject.js +18 -18
- package/dist/verify/verify.js +92 -43
- package/docs/README.md +25 -32
- package/docs/architecture/actor-contract.md +56 -87
- package/docs/architecture/desktop-sessions.md +7 -7
- package/docs/architecture/external-public-shared-world.md +61 -59
- package/docs/architecture/github-feedback-loop.md +1 -4
- 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 +5 -5
- package/docs/architecture/terminal-product-route.md +67 -107
- package/docs/contracts/README.md +24 -0
- package/docs/contracts/adapter-admission.md +3 -3
- package/docs/contracts/adapter-fixtures.md +2 -5
- package/docs/contracts/core.md +1 -3
- package/docs/contracts/errors.md +62 -0
- package/docs/contracts/feedback.md +8 -9
- package/docs/contracts/policy.md +7 -12
- package/docs/contracts/run-bundle.md +45 -44
- package/docs/contracts/schemas.md +421 -362
- package/docs/contracts/study-analysis.md +3 -3
- package/docs/contracts/study-costs.md +11 -7
- package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
- package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
- package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
- package/docs/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/participant/README.md +5 -5
- package/examples/participant/run.mjs +11 -10
- package/examples/scorer/README.md +3 -3
- package/examples/scorer/run.mjs +11 -12
- package/package.json +16 -17
- package/skills/humanish/SKILL.md +60 -58
- 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.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/observer/static.d.ts +0 -39
- package/dist/observer/static.js +0 -369
- 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/run/run-index.js
CHANGED
|
@@ -1,21 +1,22 @@
|
|
|
1
|
-
// The run index
|
|
1
|
+
// The run index: list and classify every run in a project without parsing bundles.
|
|
2
2
|
//
|
|
3
|
-
// The existing `listRuns` walks each run tree
|
|
3
|
+
// The existing `listRuns` walks each run tree, screenshots included, validating symlinks and
|
|
4
4
|
// then parses each `run.json`: measured 197ms cold / 152ms warm at 25 runs. That is fine for a
|
|
5
5
|
// command that prints once and exits, and much too hot for a surface that refreshes on a cadence
|
|
6
6
|
// over SSH. This module reads the small `status.json` record each run now writes (586 bytes beside
|
|
7
7
|
// a 92KB bundle) and caches per-run entries keyed on the stat of the file each was derived from.
|
|
8
8
|
//
|
|
9
|
-
//
|
|
9
|
+
// Rules, unchanged from the record itself:
|
|
10
10
|
// - `run.json` is the evidence-of-record. Every field here is a projection for listing and
|
|
11
11
|
// classification; nothing here is a claim about what a participant did.
|
|
12
12
|
// - A run with no status record is not assumed finished. It is classified from what is on disk:
|
|
13
|
-
// a bundle means finished, receipts without a bundle mean interrupted. That is the
|
|
14
|
-
// reading of a run whose process died
|
|
13
|
+
// a bundle means finished, receipts without a bundle mean interrupted. That is the
|
|
14
|
+
// reading of a run whose process died (and, before this contract existed, of every run).
|
|
15
15
|
// - One unreadable run directory degrades that run, never the listing.
|
|
16
16
|
import { readdir, readFile, stat } from "node:fs/promises";
|
|
17
17
|
import path from "node:path";
|
|
18
|
-
import { RUN_STATUS_FILE, classifyRunStatus,
|
|
18
|
+
import { RUN_STATUS_FILE, classifyRunStatus, isRunStatusRecord, } from "./status.js";
|
|
19
|
+
import { studyProvenanceOf } from "./study-provenance.js";
|
|
19
20
|
import { RUN_BUNDLE_FILE } from "./bundle.js";
|
|
20
21
|
const RUN_INDEX_SCHEMA = "humanish.run-index.v1";
|
|
21
22
|
/**
|
|
@@ -78,7 +79,7 @@ function entryFromStatus(record, nowMs) {
|
|
|
78
79
|
liveness: classifyRunStatus(record, nowMs),
|
|
79
80
|
mode: record.mode,
|
|
80
81
|
...(typeof record.pid === "number" ? { pid: record.pid } : {}),
|
|
81
|
-
...(record
|
|
82
|
+
...studyEntry(studyProvenanceOf(record)),
|
|
82
83
|
startedAt: record.startedAt,
|
|
83
84
|
updatedAt: record.updatedAt,
|
|
84
85
|
...(record.completedAt === undefined ? {} : { completedAt: record.completedAt }),
|
|
@@ -98,9 +99,9 @@ function usableStatusRecord(raw, runId) {
|
|
|
98
99
|
}
|
|
99
100
|
/**
|
|
100
101
|
* The bundle-only reading, for a run with no usable status record. A bundle on disk usually means
|
|
101
|
-
* the run reached its final write. But a live run now flushes an
|
|
102
|
+
* the run reached its final write. But a live run now flushes an in-progress bundle as it goes (so
|
|
102
103
|
* anything asking what a participant is doing has something to read), and that bundle marks its
|
|
103
|
-
* simulations `running`. With no status record there is no freshness to judge, and the
|
|
104
|
+
* simulations `running`. With no status record there is no freshness to judge, and the
|
|
104
105
|
* reading of "it started, and nothing here says it finished" is interrupted, not finished.
|
|
105
106
|
*/
|
|
106
107
|
function bundleLiveness(bundle) {
|
|
@@ -117,18 +118,16 @@ export function runLiveness(runId, status, bundle, nowMs) {
|
|
|
117
118
|
? { liveness: classifyRunStatus(status, nowMs), record: status }
|
|
118
119
|
: { liveness: bundleLiveness(bundle) };
|
|
119
120
|
}
|
|
121
|
+
function studyEntry(study) {
|
|
122
|
+
return study === undefined ? {} : { study };
|
|
123
|
+
}
|
|
120
124
|
function entryFromBundle(runId, bundle) {
|
|
121
|
-
const legacyLabId = bundle.lab === undefined ? inferLegacyLabId(bundle) : undefined;
|
|
122
125
|
return {
|
|
123
126
|
runId,
|
|
124
127
|
derivedFrom: "bundle",
|
|
125
128
|
liveness: bundleLiveness(bundle),
|
|
126
129
|
...(bundle.mode === "dry-run" || bundle.mode === "live" ? { mode: bundle.mode } : {}),
|
|
127
|
-
...(bundle
|
|
128
|
-
? { lab: bundle.lab }
|
|
129
|
-
: legacyLabId === undefined
|
|
130
|
-
? {}
|
|
131
|
-
: { lab: { id: legacyLabId } }),
|
|
130
|
+
...studyEntry(studyProvenanceOf(bundle)),
|
|
132
131
|
...(bundle.createdAt === undefined ? {} : { startedAt: bundle.createdAt }),
|
|
133
132
|
...(bundle.review?.verdict === undefined ? {} : { verdict: bundle.review.verdict }),
|
|
134
133
|
...(bundle.review?.participants === undefined
|
|
@@ -210,7 +209,7 @@ export async function readRunIndex(cwdInput, options = {}) {
|
|
|
210
209
|
continue;
|
|
211
210
|
}
|
|
212
211
|
// Neither record nor bundle: receipts without an outcome. That is precisely an interrupted
|
|
213
|
-
// run
|
|
212
|
+
// run (the shape a dropped connection leaves), and saying so is more useful than hiding it.
|
|
214
213
|
runs.push({ runId, derivedFrom: "directory", liveness: "interrupted" });
|
|
215
214
|
}
|
|
216
215
|
cache?.retain(runIds);
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The message for a run that is not there: how to start one when the project has no runs, or how
|
|
3
|
+
* to list them when it has. Only the runs directory's entry names are read.
|
|
4
|
+
*/
|
|
5
|
+
export declare function runNotFoundMessage(cwdInput: string, runInput: string): Promise<string>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { readdir } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { resolveRunsRoot } from "./paths.js";
|
|
4
|
+
/**
|
|
5
|
+
* The message for a run that is not there: how to start one when the project has no runs, or how
|
|
6
|
+
* to list them when it has. Only the runs directory's entry names are read.
|
|
7
|
+
*/
|
|
8
|
+
export async function runNotFoundMessage(cwdInput, runInput) {
|
|
9
|
+
const cwd = path.resolve(cwdInput);
|
|
10
|
+
const entries = await readdir(resolveRunsRoot(cwd)).catch(() => []);
|
|
11
|
+
const hasRun = entries.some((name) => !name.startsWith(".") && !name.endsWith(".json"));
|
|
12
|
+
return hasRun
|
|
13
|
+
? `No run ${runInput}; humanish runs lists them.`
|
|
14
|
+
: `No runs in ${cwd} yet; start one with humanish run first-run.`;
|
|
15
|
+
}
|
package/dist/run/run.d.ts
CHANGED
|
@@ -2,7 +2,8 @@ import { renderObserver, type ObserverResult } from "../observer/render.js";
|
|
|
2
2
|
import { type RunBundle } from "./bundle.js";
|
|
3
3
|
import type { ExecutionOutcome } from "./judge.js";
|
|
4
4
|
import { type PreparedRunArtifactPaths, type RunIdInUse } from "./paths.js";
|
|
5
|
-
import { type
|
|
5
|
+
import { type RunStatusHandle } from "./status.js";
|
|
6
|
+
import type { RunStudyProvenance } from "./study-provenance.js";
|
|
6
7
|
interface StartRunOptions {
|
|
7
8
|
/** Project directory, in the form the route resolved it. */
|
|
8
9
|
cwd: string;
|
|
@@ -10,7 +11,7 @@ interface StartRunOptions {
|
|
|
10
11
|
runId?: string | undefined;
|
|
11
12
|
mintRunId: () => string;
|
|
12
13
|
mode: "dry-run" | "live";
|
|
13
|
-
lab?:
|
|
14
|
+
lab?: RunStudyProvenance | undefined;
|
|
14
15
|
/** review.md for the published bundle. */
|
|
15
16
|
renderReview: (bundle: RunBundle) => string;
|
|
16
17
|
/** Used by `FinishedRun.renderObserver`; `render` is the `LabDeps.renderObserver` seam. */
|
|
@@ -25,8 +26,8 @@ interface Run {
|
|
|
25
26
|
readonly runId: string;
|
|
26
27
|
readonly createdAt: string;
|
|
27
28
|
readonly mode: "dry-run" | "live";
|
|
28
|
-
/** The manifest the run came from
|
|
29
|
-
readonly lab?:
|
|
29
|
+
/** The manifest the run came from; bundleHead copies it into the bundle. */
|
|
30
|
+
readonly lab?: RunStudyProvenance;
|
|
30
31
|
/** Routes write their evidence files through these and hand them to participants. */
|
|
31
32
|
readonly paths: PreparedRunArtifactPaths;
|
|
32
33
|
/**
|
package/dist/run/run.js
CHANGED
|
@@ -9,7 +9,7 @@ import {} from "./results.js";
|
|
|
9
9
|
import { createRunArtifactPaths, validatePreparedRunArtifactPaths, } from "./paths.js";
|
|
10
10
|
import { registerActiveRun } from "./active-runs.js";
|
|
11
11
|
import { writeContainedOutputFile, writePreparedRunLatestPointer } from "./contained-output.js";
|
|
12
|
-
import { beginRunStatus, runStatusOutcome
|
|
12
|
+
import { beginRunStatus, runStatusOutcome } from "./status.js";
|
|
13
13
|
/** An entry point called in a state that does not admit it. */
|
|
14
14
|
class RunLifecycleError extends Error {
|
|
15
15
|
name = "RunLifecycleError";
|
|
@@ -9,7 +9,7 @@ export interface SandboxReceipt {
|
|
|
9
9
|
/** Who allocated the sandbox. Receipts written before this field existed have none. */
|
|
10
10
|
provider?: SandboxProviderId;
|
|
11
11
|
sandboxId: string;
|
|
12
|
-
/** The create-time sandbox TTL (ms), when known
|
|
12
|
+
/** The create-time sandbox TTL (ms), when known: how long the server-side backstop runs. */
|
|
13
13
|
timeoutMs?: number;
|
|
14
14
|
}
|
|
15
15
|
/**
|
|
@@ -22,7 +22,7 @@ export interface ParsedSandboxReceipt extends Omit<SandboxReceipt, "provider"> {
|
|
|
22
22
|
}
|
|
23
23
|
/**
|
|
24
24
|
* Append one receipt. Best-effort by design: the receipt exists to protect the run, so a failed
|
|
25
|
-
* receipt write must never fail the participant
|
|
25
|
+
* receipt write must never fail the participant. The only cost of a miss is that `reclaim` cannot see
|
|
26
26
|
* this id and the TTL backstop covers it instead. Containment is the same prepare step every
|
|
27
27
|
* artifact write uses; append (not atomic-replace) keeps racing participants' receipts intact.
|
|
28
28
|
*/
|
|
@@ -6,7 +6,7 @@ import { prepareContainedOutputFile } from "./contained-output.js";
|
|
|
6
6
|
export const SANDBOX_RECEIPTS_ARTIFACT = "sandbox-receipts.ndjson";
|
|
7
7
|
/**
|
|
8
8
|
* Append one receipt. Best-effort by design: the receipt exists to protect the run, so a failed
|
|
9
|
-
* receipt write must never fail the participant
|
|
9
|
+
* receipt write must never fail the participant. The only cost of a miss is that `reclaim` cannot see
|
|
10
10
|
* this id and the TTL backstop covers it instead. Containment is the same prepare step every
|
|
11
11
|
* artifact write uses; append (not atomic-replace) keeps racing participants' receipts intact.
|
|
12
12
|
*/
|
|
@@ -16,7 +16,7 @@ export async function appendSandboxReceipt(root, receipt) {
|
|
|
16
16
|
await appendFile(filePath, `${JSON.stringify(receipt)}\n`, "utf8");
|
|
17
17
|
}
|
|
18
18
|
catch {
|
|
19
|
-
// Swallowed on purpose
|
|
19
|
+
// Swallowed on purpose; see the contract above.
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
22
|
/** Parse a receipts file leniently: a torn final line (crash mid-append) drops, valid lines keep. */
|
|
@@ -42,7 +42,7 @@ export function parseSandboxReceipts(text) {
|
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
catch {
|
|
45
|
-
// torn line
|
|
45
|
+
// A torn line: skip it.
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
48
|
return receipts;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ParticipantIds } from "./participant-records.js";
|
|
2
2
|
export declare const SHARED_WORLD_SCHEMA = "humanish.shared-world.v1";
|
|
3
|
-
/** The shared service-plane provenance for a shared-world run
|
|
3
|
+
/** The shared service-plane provenance for a shared-world run: single commit + a
|
|
4
4
|
* seed-recipe digest + the provisioned env names (never values). */
|
|
5
5
|
export interface SharedWorldPlane {
|
|
6
6
|
/** The cloned commit SHA of the shared plane (when the clone resolved one). */
|
|
@@ -11,13 +11,13 @@ export interface SharedWorldPlane {
|
|
|
11
11
|
/** Declared env names provisioned for the shared plane (values never surface). */
|
|
12
12
|
envNames: string[];
|
|
13
13
|
/**
|
|
14
|
-
* Concurrent route only
|
|
15
|
-
* (the first-class provisioned-subject target every actor drove
|
|
14
|
+
* Concurrent route only: sha256-16 of the harness-minted `getHost` URL's origin
|
|
15
|
+
* (the first-class provisioned-subject target every actor drove). A digest replaces the
|
|
16
16
|
* raw URL: a getHost URL embeds the (live) sandbox id and matches the publish-safety e2b-URL
|
|
17
|
-
* redaction, so
|
|
17
|
+
* redaction, so, like the stream URL and sandbox ids, it never lands raw in a published
|
|
18
18
|
* bundle (the raw tokenless URL is surfaced only on the ephemeral lab result). The orchestrator
|
|
19
|
-
* confirms the URL is tokenless (no authKey,
|
|
20
|
-
* actor drove this host by digest equality. Absent on the sequential route.
|
|
19
|
+
* confirms the URL is tokenless (no authKey, so no secret reaches the bundle) before digesting.
|
|
20
|
+
* verify proves every actor drove this host by digest equality. Absent on the sequential route.
|
|
21
21
|
*/
|
|
22
22
|
hostDigest?: string;
|
|
23
23
|
/**
|
|
@@ -30,17 +30,17 @@ export interface SharedWorldPlane {
|
|
|
30
30
|
*/
|
|
31
31
|
exposure?: "synthetic";
|
|
32
32
|
/**
|
|
33
|
-
* External-public plane class only
|
|
33
|
+
* External-public plane class only: sha256-16 of the observed origin the participants
|
|
34
34
|
* converged on. It is the counterpart of hostDigest with a weaker, disclosed claim: the harness only
|
|
35
|
-
* observes that each
|
|
36
|
-
*
|
|
37
|
-
* (that
|
|
38
|
-
* origin, not harness control of the plane. A
|
|
39
|
-
* hostDigest hygiene). Absent on getHost.
|
|
35
|
+
* observes that each participant reached this origin and never minted it. It is derived from what
|
|
36
|
+
* the participants actually reached; the declared appUrl does not feed it. verify proves every
|
|
37
|
+
* laneWindow.routeHostDigest (that participant's CDP-observed final URL origin) equals it, which
|
|
38
|
+
* shows cross-participant convergence on one observed origin, not harness control of the plane. A
|
|
39
|
+
* digest, not the raw origin (kept consistent with hostDigest hygiene). Absent on getHost.
|
|
40
40
|
*/
|
|
41
41
|
publicOriginDigest?: string;
|
|
42
42
|
/**
|
|
43
|
-
*
|
|
43
|
+
* External-public plane class only: sha256-16 of the operator-declared origin (from subject.appUrl),
|
|
44
44
|
* recorded for reference/evidence only. It is never asserted equal to publicOriginDigest: a normal
|
|
45
45
|
* cross-origin redirect (apex->www, http->https) makes the observed origin differ from the declared
|
|
46
46
|
* one, which is expected. Operator ownership rests on the subject.publicTarget.authorized attestation
|
|
@@ -49,7 +49,7 @@ export interface SharedWorldPlane {
|
|
|
49
49
|
declaredOriginDigest?: string;
|
|
50
50
|
}
|
|
51
51
|
/**
|
|
52
|
-
* Concurrent shape
|
|
52
|
+
* Concurrent shape: one actor's harness-clocked activity window against the one
|
|
53
53
|
* shared plane. Overlapping windows mechanically prove ≥2 personas were active simultaneously.
|
|
54
54
|
* `laneWindows` and `stateSeries` are independent series. There is deliberately no per-delta→actor
|
|
55
55
|
* field, because under concurrency the evidence cannot say which actor caused a state change.
|
|
@@ -68,9 +68,9 @@ export interface SharedWorldParticipantWindow {
|
|
|
68
68
|
endedAt: number;
|
|
69
69
|
/** The actor's terminal session verdict (per-persona). */
|
|
70
70
|
verdict: string;
|
|
71
|
-
/** sha256-16 of the origin of the getHost
|
|
72
|
-
* plane.hostDigest, so the actor drove exactly the harness-minted host
|
|
73
|
-
*
|
|
71
|
+
/** sha256-16 of the origin of the getHost participant URL this actor drove. verify confirms it
|
|
72
|
+
* equals plane.hostDigest, so the actor drove exactly the harness-minted host. A digest, not the
|
|
73
|
+
* raw URL (a getHost URL is not publish-safe; see SharedWorldPlane.hostDigest). */
|
|
74
74
|
routeHostDigest: string;
|
|
75
75
|
/** The shared plane's commit this actor observed (omitted when unresolved). */
|
|
76
76
|
commit?: string;
|
|
@@ -109,19 +109,19 @@ export declare function sharedWorldParticipantKeys(ids: ParticipantIds, particip
|
|
|
109
109
|
readonly caseGroup?: string;
|
|
110
110
|
}): Pick<SharedWorldOutcome, "roleId" | "actorType" | "surface" | "caseGroup" | "simId" | "streamId">;
|
|
111
111
|
/** A timeline checkpoint: a read-only digest probe of the shared plane at one moment. Persisted
|
|
112
|
-
*
|
|
112
|
+
* digest-only: `digest` is sha256-16(scrub+redact(stdout)); no raw value ever lands. */
|
|
113
113
|
export interface SharedWorldCheckpoint {
|
|
114
114
|
kind: "checkpoint";
|
|
115
115
|
/** "cp-baseline" for the baseline snapshot; "cp-after-<roleId>" after each role's turn. */
|
|
116
116
|
name: string;
|
|
117
117
|
/** sha256-16 of the (scrubbed, redacted) combined probe output at this snapshot. */
|
|
118
118
|
digest: string;
|
|
119
|
-
/** True when this snapshot's digest differs from the previous checkpoint's
|
|
119
|
+
/** True when this snapshot's digest differs from the previous checkpoint's, meaning the observed
|
|
120
120
|
* state changed across the intervening turn (the delta is attributed to the whole turn). */
|
|
121
121
|
deltaFromPrev: boolean;
|
|
122
122
|
}
|
|
123
|
-
/** A timeline turn: one
|
|
124
|
-
* provenance it observed (identical across turns by construction
|
|
123
|
+
/** A timeline turn: one participant's session against the shared plane. Carries the plane
|
|
124
|
+
* provenance it observed (identical across turns by construction: the single-plane proof). */
|
|
125
125
|
interface SharedWorldTurn {
|
|
126
126
|
kind: "turn";
|
|
127
127
|
roleId: string;
|
|
@@ -135,8 +135,8 @@ interface SharedWorldTurn {
|
|
|
135
135
|
seedDigest: string;
|
|
136
136
|
}
|
|
137
137
|
type SharedWorldTimelineEntry = SharedWorldCheckpoint | SharedWorldTurn;
|
|
138
|
-
/** Declared
|
|
139
|
-
* The executed timeline plus this ordered tail must account for every declared sim/stream. */
|
|
138
|
+
/** Declared participants that were never started after one executed sequential role stopped the
|
|
139
|
+
* run. The executed timeline plus this ordered tail must account for every declared sim/stream. */
|
|
140
140
|
interface SharedWorldSkippedTail {
|
|
141
141
|
afterRoleId: string;
|
|
142
142
|
roles: Array<{
|
|
@@ -156,10 +156,10 @@ interface SharedWorldSkippedTail {
|
|
|
156
156
|
* - Sequential (`topologyMode: "sequential"`): `sequence` + an alternating `timeline`
|
|
157
157
|
* (cp-baseline → turn → cp → … → cp); limits `sequential-only` etc. No route writes it since
|
|
158
158
|
* 0.106.0; verify still reads it so older bundles keep verifying.
|
|
159
|
-
* - Concurrent (`topologyMode: "concurrent"
|
|
159
|
+
* - Concurrent (`topologyMode: "concurrent"`): `laneWindows` + `stateSeries` +
|
|
160
160
|
* `outcomes`; limits `concurrent` etc. No `timeline`.
|
|
161
161
|
*
|
|
162
|
-
* Additive + optional on `humanish.run-bundle.v1
|
|
162
|
+
* Additive + optional on `humanish.run-bundle.v1`: absent on every non-shared-world bundle.
|
|
163
163
|
* The mandatory `attributionLimits` are verify-enforced (fail closed on a missing required or a
|
|
164
164
|
* present forbidden limit).
|
|
165
165
|
*/
|
|
@@ -169,26 +169,27 @@ export interface SharedWorldEvidence {
|
|
|
169
169
|
/** The substrate discriminator. Branched on first by sharedWorldEvidenceFindings. */
|
|
170
170
|
topologyMode: "sequential" | "concurrent";
|
|
171
171
|
/**
|
|
172
|
-
* Concurrent route only
|
|
173
|
-
* "provisioned-getHost" plane (a clone/local-tree subject served + getHost-exposed in-sandbox
|
|
172
|
+
* Concurrent route only: the plane-class discriminator. Absent == the historical
|
|
173
|
+
* "provisioned-getHost" plane (a clone/local-tree subject served + getHost-exposed in-sandbox; the
|
|
174
174
|
* harness minted the host; synthetic-seeded attestation + authoritative in-sandbox checkpoint
|
|
175
175
|
* stateSeries). "external-public" == a real operator-owned public deployment used directly as the
|
|
176
176
|
* plane (no getHost/clone/seed; the operator attests it and the harness does not control it; no authoritative
|
|
177
|
-
* shared-state proof
|
|
177
|
+
* shared-state proof: concurrency evidenced by temporal co-occupancy + observed lobby convergence).
|
|
178
178
|
* verify gates every getHost-specific assertion on this discriminator; existing bundles omit it and
|
|
179
179
|
* default to provisioned-getHost, byte-stable.
|
|
180
180
|
*/
|
|
181
181
|
planeClass?: "provisioned-getHost" | "external-public";
|
|
182
|
-
/** The declared number of
|
|
182
|
+
/** The declared number of participants. */
|
|
183
183
|
roleCount: number;
|
|
184
184
|
plane: SharedWorldPlane;
|
|
185
185
|
/** The pinned, verify-enforced attribution ceiling (the set differs per topologyMode/planeClass). */
|
|
186
186
|
attributionLimits: string[];
|
|
187
187
|
/**
|
|
188
|
-
*
|
|
189
|
-
* `/lobby/CODE` path every
|
|
190
|
-
* shared world" proof, observation-derived and needing no subject change. Digest-only (the
|
|
191
|
-
* 6-char lobby code and full URLs are runtime-only and never land). Absent when
|
|
188
|
+
* External-public plane class only (optional-but-strong): sha256-16 of the shared
|
|
189
|
+
* `/lobby/CODE` path every participant's CDP-observed URL converged on: the concrete "they were
|
|
190
|
+
* in one shared world" proof, observation-derived and needing no subject change. Digest-only (the
|
|
191
|
+
* raw 6-char lobby code and full URLs are runtime-only and never land). Absent when participants
|
|
192
|
+
* did not converge.
|
|
192
193
|
*/
|
|
193
194
|
lobbyConvergenceDigest?: string;
|
|
194
195
|
/** The role ids that actually took a turn, in declared order. */
|
|
@@ -210,8 +211,8 @@ interface ParticipantWindow {
|
|
|
210
211
|
}
|
|
211
212
|
/**
|
|
212
213
|
* What a shared-world run shows about concurrency, as verify's pass gate and the judge both read
|
|
213
|
-
* it: whether two or more
|
|
214
|
-
* provisioned plane), whether the state changed at or after the first overlap started.
|
|
214
|
+
* it: whether two or more participants were live at once, and, when the plane keeps a state series
|
|
215
|
+
* (the provisioned plane), whether the state changed at or after the first overlap started.
|
|
215
216
|
*/
|
|
216
217
|
export declare function concurrencyFacts(windows: readonly ParticipantWindow[], stateSeries: readonly SharedWorldStateSnapshot[] | undefined): {
|
|
217
218
|
overlap: boolean;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
// The sharedWorld block of run.json (humanish.shared-world.v1): the one shared plane, each
|
|
2
|
-
// window, state snapshots and the interleaved timeline of checkpoints and turns.
|
|
1
|
+
// The sharedWorld block of run.json (humanish.shared-world.v1): the one shared plane, each
|
|
2
|
+
// participant's window, state snapshots and the interleaved timeline of checkpoints and turns.
|
|
3
3
|
export const SHARED_WORLD_SCHEMA = "humanish.shared-world.v1";
|
|
4
4
|
/**
|
|
5
5
|
* The fields a window and an outcome start with, in the saved order: the participant id saved as
|
|
@@ -30,8 +30,8 @@ function overlapStarts(windows) {
|
|
|
30
30
|
}
|
|
31
31
|
/**
|
|
32
32
|
* What a shared-world run shows about concurrency, as verify's pass gate and the judge both read
|
|
33
|
-
* it: whether two or more
|
|
34
|
-
* provisioned plane), whether the state changed at or after the first overlap started.
|
|
33
|
+
* it: whether two or more participants were live at once, and, when the plane keeps a state series
|
|
34
|
+
* (the provisioned plane), whether the state changed at or after the first overlap started.
|
|
35
35
|
*/
|
|
36
36
|
export function concurrencyFacts(windows, stateSeries) {
|
|
37
37
|
const starts = overlapStarts(windows);
|
|
@@ -18,7 +18,7 @@ export declare function planeProvenanceFindings(items: readonly Record<string, u
|
|
|
18
18
|
/** Common shape findings shared by both topologyMode branches. */
|
|
19
19
|
export declare function sharedWorldCommonFindings(bundle: RunBundle, sw: SharedWorldEvidence): string[];
|
|
20
20
|
/**
|
|
21
|
-
* Tolerant shape guard for the shared-world evidence block
|
|
21
|
+
* Tolerant shape guard for the shared-world evidence block. Validates required fields +
|
|
22
22
|
* types and tolerates extra keys (additive): the strict value-shape/timeline checks are
|
|
23
23
|
* sharedWorldEvidenceFindings' job (an injected value-shaped checkpoint field must pass the shape
|
|
24
24
|
* guard so verify can catch it fail-closed, not silently bounce off isRunBundle).
|
|
@@ -8,14 +8,14 @@ export const COMMAND_DIGEST_PATTERN = /^[0-9a-f]{16}$/;
|
|
|
8
8
|
// must hold names only: a value sneaking into the list trips this check (a free secret tripwire).
|
|
9
9
|
export const SUBJECT_ENV_NAME_PATTERN = /^[A-Z][A-Z0-9_]*$/;
|
|
10
10
|
// Sequential: the three disclosures a sequential shared-world bundle must pin (verify fails closed
|
|
11
|
-
// if any is absent
|
|
11
|
+
// if any is absent, because omission overclaims): sequential turns only, no concurrency/races handled, and
|
|
12
12
|
// a checkpoint delta is attributed to the turn it followed, never a specific action (correlation).
|
|
13
13
|
export const MANDATORY_ATTRIBUTION_LIMITS = [
|
|
14
14
|
"sequential-only",
|
|
15
15
|
"no-concurrent-races",
|
|
16
16
|
"delta-attributed-to-turn-not-action",
|
|
17
17
|
];
|
|
18
|
-
// A shared-world checkpoint record persists
|
|
18
|
+
// A shared-world checkpoint record persists digest-only: exactly these keys, nothing value-shaped.
|
|
19
19
|
export const SHARED_WORLD_CHECKPOINT_KEYS = new Set(["kind", "name", "digest", "deltaFromPrev"]);
|
|
20
20
|
// A concurrent stateSeries record is digest-only too: it permits a numeric timestamp + the
|
|
21
21
|
// sha256-16 digest; any other key is a value-shaped leak / a smuggled per-delta→actor field.
|
|
@@ -30,7 +30,7 @@ export function planeProvenanceFindings(items, plane, labels) {
|
|
|
30
30
|
const findings = [];
|
|
31
31
|
const keys = new Set(items.map((item) => `${text(item.commit)}::${text(item.seedDigest)}`));
|
|
32
32
|
if (keys.size > 1) {
|
|
33
|
-
findings.push(`${labels.items} reference
|
|
33
|
+
findings.push(`${labels.items} reference different plane provenance (commit or seedDigest), but a ${labels.run} run uses one plane`);
|
|
34
34
|
}
|
|
35
35
|
if (!isRecord(plane))
|
|
36
36
|
return findings;
|
|
@@ -63,14 +63,14 @@ export function sharedWorldCommonFindings(bundle, sw) {
|
|
|
63
63
|
for (const name of plane.envNames) {
|
|
64
64
|
if (typeof name !== "string" || !SUBJECT_ENV_NAME_PATTERN.test(name)) {
|
|
65
65
|
// Never echoes the entry: a malformed entry may be a value.
|
|
66
|
-
findings.push("sharedWorld.plane.envNames
|
|
66
|
+
findings.push("sharedWorld.plane.envNames has an entry that is not an environment variable name; evidence may hold names only, never values");
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
70
|
return findings;
|
|
71
71
|
}
|
|
72
72
|
/**
|
|
73
|
-
* Tolerant shape guard for the shared-world evidence block
|
|
73
|
+
* Tolerant shape guard for the shared-world evidence block. Validates required fields +
|
|
74
74
|
* types and tolerates extra keys (additive): the strict value-shape/timeline checks are
|
|
75
75
|
* sharedWorldEvidenceFindings' job (an injected value-shaped checkpoint field must pass the shape
|
|
76
76
|
* guard so verify can catch it fail-closed, not silently bounce off isRunBundle).
|
|
@@ -110,7 +110,7 @@ export function isSharedWorldEvidence(value) {
|
|
|
110
110
|
value.attributionLimits.every((limit) => typeof limit === "string")))
|
|
111
111
|
return false;
|
|
112
112
|
// Tolerant: validate the type of each present field only (the coherence + topologyMode dispatch
|
|
113
|
-
// are the job of sharedWorldEvidenceFindings
|
|
113
|
+
// are the job of sharedWorldEvidenceFindings; an injected value-shaped field must pass this
|
|
114
114
|
// guard so verify catches it fail-closed). A bundle must carry at least one of the two shapes.
|
|
115
115
|
if (value.sequence !== undefined &&
|
|
116
116
|
!(Array.isArray(value.sequence) && value.sequence.every((id) => typeof id === "string")))
|
package/dist/run/stats.d.ts
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { type CostTotals, type CostRow } from "./costs.js";
|
|
2
|
-
declare const STATS_SCHEMA = "humanish.stats.
|
|
2
|
+
declare const STATS_SCHEMA = "humanish.stats.v2";
|
|
3
3
|
interface StatsParticipants {
|
|
4
4
|
total: number;
|
|
5
5
|
reachedGoal: number;
|
|
6
6
|
reportedFriction: number;
|
|
7
7
|
}
|
|
8
8
|
interface StatsLabRow {
|
|
9
|
-
|
|
9
|
+
/** The study's `id`. */
|
|
10
|
+
study: string;
|
|
10
11
|
runs: number;
|
|
11
12
|
live: number;
|
|
12
13
|
dryRun: number;
|
|
@@ -40,7 +41,8 @@ export interface StatsResult {
|
|
|
40
41
|
ok: true;
|
|
41
42
|
cwd: string;
|
|
42
43
|
since?: string;
|
|
43
|
-
|
|
44
|
+
/** The study the stats are limited to, when one was given. */
|
|
45
|
+
study?: string;
|
|
44
46
|
totals: {
|
|
45
47
|
runs: number;
|
|
46
48
|
live: number;
|
|
@@ -53,11 +55,11 @@ export interface StatsResult {
|
|
|
53
55
|
verdicts: Record<string, number>;
|
|
54
56
|
costs: CostTotals;
|
|
55
57
|
};
|
|
56
|
-
|
|
58
|
+
studies: StatsLabRow[];
|
|
57
59
|
days: StatsDayRow[];
|
|
58
60
|
/** Same selected runs; individual accounting gaps are inspectable without reading private evidence. */
|
|
59
61
|
costsByRun: CostRow[];
|
|
60
|
-
/** Directories that could not be read, by name
|
|
62
|
+
/** Directories that could not be read, by name: surfaced, never silently dropped. */
|
|
61
63
|
unreadable: string[];
|
|
62
64
|
note: string;
|
|
63
65
|
}
|
|
@@ -78,5 +80,9 @@ export interface StatsFailure {
|
|
|
78
80
|
};
|
|
79
81
|
}
|
|
80
82
|
export declare function computeStats(cwdInput: string, options?: StatsOptions): Promise<StatsResult | StatsFailure>;
|
|
81
|
-
|
|
83
|
+
/** Human output; a failure is an error the CLI prints on stderr (HumanOutput in src/cli/io.ts). */
|
|
84
|
+
export declare function formatStatsHuman(result: StatsResult): string;
|
|
85
|
+
export declare function formatStatsHuman(result: StatsResult | StatsFailure): string | {
|
|
86
|
+
error: StatsFailure["error"];
|
|
87
|
+
};
|
|
82
88
|
export {};
|