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
|
@@ -57,7 +57,7 @@ humanish analyze --run latest --provider codex --dry-run --json
|
|
|
57
57
|
humanish analyze --run latest --provider codex --json
|
|
58
58
|
```
|
|
59
59
|
|
|
60
|
-
This branch
|
|
60
|
+
This branch runs on Linux x64 and Apple Silicon macOS with any stable Codex CLI release `src/actors/codex/codex-admission.ts` admits (0.154.0 on, except refused releases), a file-backed
|
|
61
61
|
ChatGPT account login, and `gpt-6-astra` with low reasoning effort. The participant conversation
|
|
62
62
|
is never reused. Selected text and screenshots still go to remote inference;
|
|
63
63
|
this is account authentication, not local inference. No API-key, alternate model
|
|
@@ -76,7 +76,7 @@ remain null. Interrupted token observations remain explicitly incomplete.
|
|
|
76
76
|
|
|
77
77
|
The dry-run validates only local evidence and configuration. It does not check
|
|
78
78
|
the CLI, login, model access or quota and does not start a provider request.
|
|
79
|
-
`doctor --
|
|
79
|
+
`doctor --study <study>` checks the selected analyst setup without a model call.
|
|
80
80
|
Failures leave the recording available; inspect `analyze show` and the attempt's
|
|
81
81
|
accounting before an explicit `analyze --provider codex --rerun`.
|
|
82
82
|
|
|
@@ -194,7 +194,7 @@ validation exception keeps nothing.
|
|
|
194
194
|
|
|
195
195
|
The directory sits outside every run directory, and export, verify and the
|
|
196
196
|
Observer read only run directories. `humanish analyze` returns the file's path as
|
|
197
|
-
`rejectedOutputPath` and prints it, and so does a
|
|
197
|
+
`rejectedOutputPath` and prints it, and so does a run's automatic analysis.
|
|
198
198
|
Each write removes all but the newest 20 records across runs. It removes a
|
|
199
199
|
record only while its directory is still the listed one, so a directory
|
|
200
200
|
replaced by a symlink after listing is left alone. The record's
|
|
@@ -229,7 +229,10 @@ This presentation does not rewrite the saved analysis or reviewer corrections.
|
|
|
229
229
|
The frozen `humanish.observer-data.v1` schema is unchanged. A companion
|
|
230
230
|
`humanish.study-analysis.v1` artifact records source/config/input hashes,
|
|
231
231
|
participant context, evidence manifest, coverage, provider/model/prompt version,
|
|
232
|
-
status, usage and validated findings
|
|
232
|
+
status, usage and validated findings. The Observer's projection of it,
|
|
233
|
+
`observer/study-analysis.json`, also carries `spend`: what every analysis
|
|
234
|
+
request of the run cost, as [study costs](study-costs.md#one-runs-cost)
|
|
235
|
+
describes:
|
|
233
236
|
|
|
234
237
|
```text
|
|
235
238
|
.humanish/runs/<run>/
|
|
@@ -7,28 +7,44 @@ All amounts are estimates from retained rate-table accounting, not provider bill
|
|
|
7
7
|
|
|
8
8
|
```bash
|
|
9
9
|
humanish stats
|
|
10
|
-
humanish stats --
|
|
10
|
+
humanish stats --study sample-study --since 2026-09-01 --json
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
The filters select runs by
|
|
13
|
+
The filters select runs by study and run start date. All later analysis reruns
|
|
14
14
|
belong to their source run for filtering and daily grouping. This is study-cost
|
|
15
15
|
attribution, not a calendar of provider charges.
|
|
16
16
|
|
|
17
17
|
With no filters, a directory whose source metadata is unreadable can still
|
|
18
|
-
contribute valid analysis receipts under `(no
|
|
18
|
+
contribute valid analysis receipts under `(no study)` and `(undated)`. Study/date
|
|
19
19
|
filters exclude such unattributable directories; they remain named in
|
|
20
|
-
`unreadable`. The command does not guess their date or
|
|
20
|
+
`unreadable`. The command does not guess their date or study from an analysis.
|
|
21
21
|
|
|
22
22
|
## Additive JSON contract
|
|
23
23
|
|
|
24
|
-
The envelope
|
|
25
|
-
`
|
|
24
|
+
The envelope is `humanish.stats.v2`, which says `study` and `studies` where `humanish.stats.v1`
|
|
25
|
+
said `lab` and `labs`. Its fields keep their meanings: `totals.estimatedSpendUsd`,
|
|
26
|
+
`days[].estimatedSpendUsd`, each study's `medianCostUsd`,
|
|
26
27
|
`costSamples` and `unpricedRuns` describe participant/desktop run estimates.
|
|
27
28
|
They do not suddenly include a separate analysis request. The bundle's
|
|
28
|
-
`cost.estimatedTotalUsd` and the
|
|
29
|
-
|
|
29
|
+
`cost.estimatedTotalUsd`, `status.json`'s `outcome.estimatedCostUsd` and the run
|
|
30
|
+
index's `estimatedCostUsd` stay participants and desktops only.
|
|
30
31
|
|
|
31
|
-
|
|
32
|
+
## One run's cost
|
|
33
|
+
|
|
34
|
+
A run's analysis spend has one reader, `readAnalysisAccounting` in
|
|
35
|
+
`src/run/costs.ts`. Stats calls it for `costs.analysisEstimatedUsd`, and the
|
|
36
|
+
surfaces that show one run's cost read it too: the run index's `analysisCost`,
|
|
37
|
+
and the `spend` field of the Observer's companion `observer/study-analysis.json`.
|
|
38
|
+
It counts every distinct attempt the way stats does, so a run analyzed twice
|
|
39
|
+
shows two analyses. `src/run/run-cost.ts` adds that spend to the run's
|
|
40
|
+
participants-and-desktops figure, and the Observer's cost line, the Observer
|
|
41
|
+
library row's `costLabel` and the terminal UI all format the result through it.
|
|
42
|
+
The total is a lower bound, shown as `est. ~$X plus unpriced usage`, while any
|
|
43
|
+
part has an unpriced or incomplete figure. A Codex-account analysis has no
|
|
44
|
+
dollar price and reads "dollar cost unknown". An analysis that sent no request
|
|
45
|
+
adds nothing.
|
|
46
|
+
|
|
47
|
+
The new `costs` object appears on totals, each study and each day. `costsByRun`
|
|
32
48
|
contains the same accounting per selected run with stable warning codes.
|
|
33
49
|
|
|
34
50
|
| Field | Meaning |
|
|
@@ -57,6 +73,9 @@ its report was published, its findings are current, or the original recording
|
|
|
57
73
|
later changed. The receipt and report with the same run/analysis ID count once;
|
|
58
74
|
new IDs from explicit reruns count separately. Reusing a prior result adds no
|
|
59
75
|
attempt or expense. Conflicting accounting for the same ID stays unresolved.
|
|
76
|
+
A dry run with no recorded cost counts as a known $0, because it makes no model
|
|
77
|
+
request and creates no desktop. A dry run that records an unknown figure stays
|
|
78
|
+
unknown.
|
|
60
79
|
|
|
61
80
|
Older reports without receipts contribute their strictly validated accounting
|
|
62
81
|
metadata with a legacy warning. Provider requests that left no durable record
|
|
@@ -4,7 +4,7 @@ Accepted.
|
|
|
4
4
|
|
|
5
5
|
## Context
|
|
6
6
|
|
|
7
|
-
Several surfaces read a finished or running study: the Observer, `humanish tui`, `
|
|
7
|
+
Several surfaces read a finished or running study: the Observer, `humanish tui`, `observe --all`,
|
|
8
8
|
`export`, feedback drafts and study analysis. Each of them wants a smaller, faster view than the
|
|
9
9
|
full bundle, and a view that can drift from the evidence would let a surface show a result the
|
|
10
10
|
evidence does not support.
|
|
@@ -12,7 +12,7 @@ exactly those cases.
|
|
|
12
12
|
|
|
13
13
|
The `observer/` workspace builds with Vite into a single HTML file with fonts inlined and no
|
|
14
14
|
network references. The root build copies it to `dist/observer-app.html`. `renderObserverHtml`
|
|
15
|
-
is the one path every surface (observe,
|
|
15
|
+
is the one path every surface (observe, observe --all, watch, studies) uses; it injects the run's
|
|
16
16
|
`humanish.observer-data.v1` snapshot into that file. There is no second renderer and no feature
|
|
17
17
|
flag; rolling back means pinning an older package version.
|
|
18
18
|
|
|
@@ -21,7 +21,7 @@ flag; rolling back means pinning an older package version.
|
|
|
21
21
|
- An Observer page opens from disk, and an exported bundle carries its own viewer.
|
|
22
22
|
- Every dependency the Observer adds ships inside each rendered page, so page weight is a cost
|
|
23
23
|
reviewers check.
|
|
24
|
-
- Live views (`watch`, `
|
|
24
|
+
- Live views (`watch`, `observe --all`) use the same file and poll for new snapshots.
|
|
25
25
|
|
|
26
26
|
## Enforced by
|
|
27
27
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 0003: Managed paths bind to physical identities; cleanup uses create-time receipts
|
|
2
2
|
|
|
3
|
-
Accepted in 0.15.1
|
|
3
|
+
Accepted in 0.15.1, extended in 0.36.0 (`humanish reclaim`).
|
|
4
4
|
|
|
5
5
|
## Context
|
|
6
6
|
|
|
@@ -11,7 +11,7 @@ Separately, an account-wide provider operation once destroyed unrelated infrastr
|
|
|
11
11
|
|
|
12
12
|
## Decision
|
|
13
13
|
|
|
14
|
-
- Managed run, Observer, feedback,
|
|
14
|
+
- Managed run, Observer, feedback, study, actor-output, git-metadata and source-archive paths bind
|
|
15
15
|
to validated physical filesystem identities. Traversal-shaped ids, unsafe links, special files
|
|
16
16
|
and root retargeting are rejected before any write.
|
|
17
17
|
- Provider ids in `run.json` are evidence. Nothing mutates a provider resource because of them.
|
|
@@ -32,4 +32,4 @@ Separately, an account-wide provider operation once destroyed unrelated infrastr
|
|
|
32
32
|
- `src/run/paths.ts` and `src/run/contained-output.ts`, with `tests/run/path-containment.test.ts`.
|
|
33
33
|
- `src/run/git-workspace.ts`, with `tests/run/git-state.test.ts`.
|
|
34
34
|
- `src/run/reclaim.ts`, with `tests/run/reclaim.test.ts`.
|
|
35
|
-
-
|
|
35
|
+
- Reclamation by exact created id, in [invariants and defaults](../principles/invariants-and-defaults.md).
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Actor Fidelity: whose behavior is this evidence about?
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
harnesses
|
|
3
|
+
This page is a research digest and a design position. Its sources are public papers and
|
|
4
|
+
open-source harnesses, and each claim carries its citation so a reader can check it.
|
|
5
5
|
|
|
6
6
|
## The question
|
|
7
7
|
|
|
@@ -21,7 +21,7 @@ Whether that is a defect depends entirely on a question the harness never asked:
|
|
|
21
21
|
finding about how legible the surface is to its actual users.
|
|
22
22
|
|
|
23
23
|
The proof roadmap already anticipated this: its strongest evidence class,
|
|
24
|
-
`user-census`, is defined as "the users of the product
|
|
24
|
+
`user-census`, is defined as "the users of the product are agents, and the study runs
|
|
25
25
|
real production harnesses." This page is the layer that makes the distinction
|
|
26
26
|
operable.
|
|
27
27
|
|
|
@@ -104,7 +104,7 @@ a green run proves nothing.
|
|
|
104
104
|
|
|
105
105
|
**Declare, record, and let the adopter judge.**
|
|
106
106
|
|
|
107
|
-
1. **Declared population is a property of a persona, not of a
|
|
107
|
+
1. **Declared population is a property of a persona, not of a study.** One study program
|
|
108
108
|
can legitimately run agents and people against the same surface; the comparison
|
|
109
109
|
between them is itself a finding. Prior art runs both populations
|
|
110
110
|
through one instrument and reports the difference
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Engineering principles
|
|
2
2
|
|
|
3
|
-
These are the judgment calls behind the rules in [AGENTS.md](
|
|
3
|
+
These are the judgment calls behind the rules in [AGENTS.md](https://github.com/danielgwilson/humanish/blob/main/AGENTS.md). Read them
|
|
4
4
|
before adding a service, mode, dependency or new boundary.
|
|
5
5
|
|
|
6
6
|
## Engineering Judgment
|
|
@@ -48,7 +48,7 @@ low maintenance cost, alongside correctness, privacy and security.
|
|
|
48
48
|
|
|
49
49
|
## Working And Resuming
|
|
50
50
|
|
|
51
|
-
- Read the [ramp](
|
|
51
|
+
- Read the [ramp](https://github.com/danielgwilson/humanish/blob/main/docs/ramp/README.md), current task and relevant component
|
|
52
52
|
instructions. Read detailed contracts for the boundary being changed, not every
|
|
53
53
|
historical roadmap. Consult the invariants for security/evidence changes and the
|
|
54
54
|
release procedure before publishing.
|
|
@@ -58,7 +58,7 @@ low maintenance cost, alongside correctness, privacy and security.
|
|
|
58
58
|
treat an old plan as authorization to resume paused or rejected work.
|
|
59
59
|
- When granted autonomous shipping authority, push, open the PR, address reviews
|
|
60
60
|
and required checks, merge when green, fast-forward main and clean up the task
|
|
61
|
-
worktree/branch. Follow [release
|
|
61
|
+
worktree/branch. Follow [the release procedure](https://github.com/danielgwilson/humanish/blob/main/docs/release/publish.md)
|
|
62
62
|
when a release is authorized; do not add new approval steps on your own.
|
|
63
63
|
- Stay on `0.x` until the maintainer explicitly chooses 1.0. The next minor
|
|
64
64
|
after `0.99.0` is `0.100.0`; routine shipping authority does not authorize 1.0.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Invariants and Defaults
|
|
2
2
|
|
|
3
|
-
humanish's safety and
|
|
3
|
+
humanish's safety and evidence rules come in exactly two strengths. Confusing them causes
|
|
4
4
|
two failures: a route-scoped default gets written down as if it held on every route, then the
|
|
5
5
|
next legitimate use case looks like a violation and either gets blocked (capability loss) or
|
|
6
6
|
waved through ad hoc (safety loss). This page draws the line between the two.
|
|
@@ -11,7 +11,7 @@ True on every route, enforced in code, never overridable by config. A feature th
|
|
|
11
11
|
satisfy these does not ship; a third-party extension that cannot satisfy these does not
|
|
12
12
|
certify (see the conformance suite).
|
|
13
13
|
|
|
14
|
-
1. **Secret values never reach
|
|
14
|
+
1. **Secret values never reach published evidence.** No key, token, credential value, or
|
|
15
15
|
session-secret may appear in any artifact that leaves the operator's machine: a committed
|
|
16
16
|
file, a shared bundle, a feedback issue. Names of provisioned environment variables are
|
|
17
17
|
evidence; their values never are. Harness-level errors pass through redaction before
|
|
@@ -27,8 +27,8 @@ certify (see the conformance suite).
|
|
|
27
27
|
separately verified copy while preserving readable local evidence. (See "the
|
|
28
28
|
capture-vs-publish rule" below: blurring frames at _capture_ was a default mistaken for
|
|
29
29
|
this invariant.)
|
|
30
|
-
- Scope note: the literal scrub of
|
|
31
|
-
errors,
|
|
30
|
+
- Scope note: the literal scrub of known provisioned values runs on harness log-tails,
|
|
31
|
+
errors, and model-authored narration (reasoning/message) before it persists; secret-shaped
|
|
32
32
|
values are caught everywhere by pattern redaction. The text artifacts are local
|
|
33
33
|
(gitignored) regardless.
|
|
34
34
|
2. **Actors only drive harness-minted URLs.** A model with input control (mouse, keyboard,
|
|
@@ -47,35 +47,35 @@ certify (see the conformance suite).
|
|
|
47
47
|
5. **Provenance is recorded or its absence is declared.** Every bundle states what the
|
|
48
48
|
subject was (commit, image, fixture, or an explicit "unpinned" marker). Evidence that
|
|
49
49
|
cannot say what it measured cannot support a decision.
|
|
50
|
-
- External-public plane class
|
|
51
|
-
deployment is used
|
|
52
|
-
`
|
|
53
|
-
marker `external-public`; humanish neither provisioned nor seeded it, so it is
|
|
54
|
-
and
|
|
55
|
-
claim
|
|
56
|
-
is
|
|
50
|
+
- External-public plane class: when a real operator-owned public
|
|
51
|
+
deployment is used directly as a concurrent shared-world plane (`source: app-url` +
|
|
52
|
+
`route: shared-world` + `allowPublicTargets` + `concurrency > 1`), provenance is the
|
|
53
|
+
marker `external-public`; humanish neither provisioned nor seeded it, so it is not `seeded`
|
|
54
|
+
and not `unpinned`. Attribution stays `shared-world` (N participants, one plane), but every strength
|
|
55
|
+
claim is downgraded and asserted-absent, never silently dropped: a synthetic attestation
|
|
56
|
+
is forbidden (you cannot claim synthetic on a real site; its real-site counterpart is the
|
|
57
57
|
operator-ownership attestation `subject.publicTarget`, author-trust and unverifiable); plane
|
|
58
58
|
control is "operator-attested, observed-only" (`plane.publicOriginDigest`) not
|
|
59
|
-
"harness-controlled" (`plane.hostDigest`); there is
|
|
59
|
+
"harness-controlled" (`plane.hostDigest`); there is no authoritative shared-state proof
|
|
60
60
|
(`stateSeries` omitted); and concurrency is proven by temporal co-occupancy + observed lobby
|
|
61
|
-
convergence only. Verify
|
|
61
|
+
convergence only. Verify fails closed if any external-public disclosure limit is missing or if a
|
|
62
62
|
getHost-only claim (`exposure: synthetic`, `hostDigest`, a `seeded`/`synthetic` limit) appears
|
|
63
63
|
on this class. The getHost synthetic gate is deliberately unreachable here. It exists because
|
|
64
|
-
getHost is internet-reachable
|
|
64
|
+
getHost is internet-reachable and harness-owned; a public site the harness neither provisioned
|
|
65
65
|
nor exposed is neither.
|
|
66
66
|
6. **Claims match mechanism.** A config field that is parsed but not consumed warns; a
|
|
67
67
|
document that overstates behavior is a defect; an evidence artifact never claims a
|
|
68
68
|
stronger evidence class than its actor and scenario can support.
|
|
69
69
|
7. **Reclamation is by exact created id, never account-wide enumeration.** A route that
|
|
70
70
|
creates a provider resource (an E2B sandbox, for example) tracks the exact id it created and
|
|
71
|
-
reclaims and
|
|
71
|
+
reclaims and proves cleanup against that id alone (a returned found-and-killed boolean, a
|
|
72
72
|
getInfo-by-id NotFound check). No route ever calls a provider's list-everything endpoint to
|
|
73
73
|
discover or verify its own cleanup, because that endpoint enumerates the whole account/team,
|
|
74
74
|
including resources humanish did not create. This is what makes a single shared operator key
|
|
75
75
|
safe: humanish only ever reaches a resource it created, never anything else the key's owner
|
|
76
76
|
is running.
|
|
77
77
|
The one narrow exception is an explicit, maintainer-run orphan sweep (never a default, never
|
|
78
|
-
reachable by a normal
|
|
78
|
+
reachable by a normal run) that is itself opt-in gated (an explicit flag or env var) and
|
|
79
79
|
documented as such at its call site.
|
|
80
80
|
|
|
81
81
|
## Defaults
|
|
@@ -84,20 +84,20 @@ Right most of the time, overridable with declared friction (an explicit config f
|
|
|
84
84
|
env gate, a warning in the run output). Overriding a default is a supported use case;
|
|
85
85
|
silently drifting from one is not.
|
|
86
86
|
|
|
87
|
-
| Default | Why it is the default | Legitimate override
|
|
88
|
-
| ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
89
|
-
| Dry-run | Spend safety (
|
|
90
|
-
| Post-run analysis on supported live studies | Findings accompany the recording; a separate $3 admission estimate limit is visible before execution | `review.analysis: false` disables it; an explicit mapping sets another analysis budget. Dry-run and unsupported routes never dispatch; missing default credentials produce a recorded skip
|
|
91
|
-
| Separate worlds (`per-lane-worlds`) | Isolation, attribution, reproducibility | `
|
|
92
|
-
| External key placement | Smallest blast radius: when the keyed process (e.g. a computer-use provider loop) runs outside the sandbox, its key never enters | In-sandbox placement when the keyed process runs inside (an agent harness under test); declared per actor type, with a spend budget
|
|
93
|
-
| Loopback entry URLs | Public-safety: never drive third-party sites unbidden | `policies.allowPublicTargets` for an owner-declared deployment/preview (a Vercel preview of your own app). Multi-participant public/preview fan-out needs explicit `
|
|
94
|
-
| Full-fidelity screenshots, local | The common case is watching a run of your
|
|
95
|
-
| Synthetic, seeded state | Pinned provenance; no real user data in evidence paths | Declared external state, recorded as
|
|
96
|
-
| Single participant | Cost + evidence simplicity | Declared fan-out where the
|
|
97
|
-
| Stock `desktop` template | The stock E2B desktop image is right for most subjects; absent `execution.desktop.template` keeps `Sandbox.create(opts)` byte-stable | `execution.desktop.template` names a custom E2B desktop image (any name/id, no allowlist) for a subject needing baked-in runtimes the stock image lacks (e.g. node/bun/a local Postgres); it is threaded to `Sandbox.create(template, opts)` on every desktop-creating route and recorded in the bundle as `desktopTemplate` (public-safe)
|
|
98
|
-
| Desktop default URL opener | Preserve the route/image's historical browser/default opener behavior when unset | `execution.desktop.browser` set to `chrome`, `chromium` or `firefox` makes the hosted CUA/shared-world browser choice explicit, fail-closed, and recorded as `desktopBrowser` in the run bundle
|
|
99
|
-
| Loopback-only observer serving | Run bundles are local by default (public-safety plank 3); the serve/watch surfaces bind `127.0.0.1` unconditionally, and exposing them is publishing-adjacent, so exposure is fail-closed and carries declared friction | `humanish
|
|
100
|
-
| Generous wall-clock safety cap | `execution.timeoutMs` bounds runaway spend, not a goal; ~30 min is reasonable for open-ended "watch it play" | A session that reaches the cap
|
|
87
|
+
| Default | Why it is the default | Legitimate override |
|
|
88
|
+
| ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
89
|
+
| Dry-run | Spend safety (the live-spend rule sets the floor; dry-run keeps it far away) | `mode: live` |
|
|
90
|
+
| Post-run analysis on supported live studies | Findings accompany the recording; a separate $3 admission estimate limit is visible before execution | `review.analysis: false` disables it; an explicit mapping sets another analysis budget. Dry-run and unsupported routes never dispatch; missing default credentials produce a recorded skip |
|
|
91
|
+
| Separate worlds (`per-lane-worlds`) | Isolation, attribution, reproducibility | `route: shared-world`: N participants against one mutable plane for scenarios that are about interaction between participants. Every participant runs at once: `execution.concurrency` must be two or more, and an omitted value fills to the number of participants. The plane is one getHost-exposed subject sandbox with synthetic seeded data, or an operator-owned public deployment (external-public), driven by N actor sandboxes. The bundle declares the weaker `attributionClass: shared-world` and a verify-enforced `attributionLimits` ceiling (`best-effort-causal-attribution` and the rest of the concurrent set). Sequential turns at `execution.concurrency: 1` were removed in 0.106.0. |
|
|
92
|
+
| External key placement | Smallest blast radius: when the keyed process (e.g. a computer-use provider loop) runs outside the sandbox, its key never enters | In-sandbox placement when the keyed process runs inside (an agent harness under test); declared per actor type, with a spend budget |
|
|
93
|
+
| Loopback entry URLs | Public-safety: never drive third-party sites unbidden | `policies.allowPublicTargets` for an owner-declared deployment/preview (a Vercel preview of your own app). Multi-participant public/preview fan-out needs explicit `participants[].target` for every participant, so the adapter-owned topology is declared rather than inferred. Provisioned clone subjects always serve in-sandbox on loopback |
|
|
94
|
+
| Full-fidelity screenshots, local | The common case is watching a run of your own app locally; blur destroys the deliverable. Raw frames live in gitignored `.humanish/` (this repo's CI adds a binary-asset commit scan; downstream projects rely on the scaffolded `.gitignore` and their own review) | `policies.redactScreenshots: true` blurs at capture; `export --format bundle --redact-screenshots` produces a separate verified copy of a completed run |
|
|
95
|
+
| Synthetic, seeded state | Pinned provenance; no real user data in evidence paths | Declared external state, recorded as unpinned in provenance |
|
|
96
|
+
| Single participant | Cost + evidence simplicity | Declared fan-out where the route supports it: `participants: N` (homogeneous), an explicit `participants` list (differentiated persona/device/instruction), or list entries with a `count` that expand into one entry per participant on the computer-use E2B route (separate worlds, cap 16; `execution.concurrency` bounds concurrent paid participants) |
|
|
97
|
+
| Stock `desktop` template | The stock E2B desktop image is right for most subjects; absent `execution.desktop.template` keeps `Sandbox.create(opts)` byte-stable | `execution.desktop.template` names a custom E2B desktop image (any name/id, no allowlist) for a subject needing baked-in runtimes the stock image lacks (e.g. node/bun/a local Postgres); it is threaded to `Sandbox.create(template, opts)` on every desktop-creating route and recorded in the bundle as `desktopTemplate` (public-safe) |
|
|
98
|
+
| Desktop default URL opener | Preserve the route/image's historical browser/default opener behavior when unset | `execution.desktop.browser` set to `chrome`, `chromium` or `firefox` makes the hosted CUA/shared-world browser choice explicit, fail-closed, and recorded as `desktopBrowser` in the run bundle |
|
|
99
|
+
| Loopback-only observer serving | Run bundles are local by default (public-safety plank 3); the serve/watch surfaces bind `127.0.0.1` unconditionally, and exposing them is publishing-adjacent, so exposure is fail-closed and carries declared friction | `humanish observe --all --expose` behind tunnel-edge auth (ngrok `--oauth google` with `--allow-email`/`--allow-domain` allow rules, or an operator `--public-url` you secure), or `--expose --safe` (open, gated on verify-`share_ready` runs only). `watch --expose` streams a live run behind edge auth (a live run is never `share_ready`, so `--safe` alone is refused). humanish carries no in-process auth; both print computed warnings naming exactly what became reachable |
|
|
100
|
+
| Generous wall-clock safety cap | `execution.timeoutMs` bounds runaway spend, not a goal; ~30 min is reasonable for open-ended "watch it play" | A session that reaches the cap after productive activity is recorded as `budget_reached` (status `passed`, a non-failure completion, exit `0`), distinct from a zero-progress `timed_out` (a failure, exit `2`). Goal-directed studies set a tight `timeoutMs` and read `completionReason` to confirm the goal, not the cap |
|
|
101
101
|
|
|
102
102
|
## The placement rule (worked example)
|
|
103
103
|
|
|
@@ -105,7 +105,7 @@ silently drifting from one is not.
|
|
|
105
105
|
external-placement _default_ as instantiated on the computer-use route, where the
|
|
106
106
|
model's brain runs outside the sandbox. The underlying invariant-level principle is:
|
|
107
107
|
|
|
108
|
-
> **Keys live where the keyed process runs
|
|
108
|
+
> **Keys live where the keyed process runs, and nowhere else. Names go in evidence; values
|
|
109
109
|
> never. Blast radius is bounded by key scoping and budgets, not by hoping.**
|
|
110
110
|
|
|
111
111
|
Consequences:
|
|
@@ -113,7 +113,7 @@ Consequences:
|
|
|
113
113
|
- A computer-use provider loop runs outside → forwarding env into its sandbox is rejected.
|
|
114
114
|
- A subject app (a real web app under test) runs inside → its declared env names are
|
|
115
115
|
provisioned in, values never persisted.
|
|
116
|
-
- An agent harness under test runs inside with real keys → that is the point of the
|
|
116
|
+
- An agent harness under test runs inside with real keys → that is the point of the study;
|
|
117
117
|
the keys are presumed exfiltratable by the agent (key scoping and spend budgets protect
|
|
118
118
|
them; sandboxing does not), and the participant carries a budget/ledger.
|
|
119
119
|
|
|
@@ -121,27 +121,27 @@ Placement is registry metadata per actor type, and the engine enforces it.
|
|
|
121
121
|
|
|
122
122
|
Two corollaries:
|
|
123
123
|
|
|
124
|
-
- **Serve commands are author-trusted.** A
|
|
124
|
+
- **Serve commands are author-trusted.** A study's `serve` steps execute inside the disposable
|
|
125
125
|
sandbox with the declared subject env present, in the same trust class as the repo's own
|
|
126
|
-
package.json scripts. Run only
|
|
126
|
+
package.json scripts. Run only study configs you trust; declare only the env names the
|
|
127
127
|
subject genuinely needs.
|
|
128
128
|
- **Pattern redaction is not enough for provisioned values.** A provisioned value (a database
|
|
129
129
|
password, an arbitrary token) has no detectable "shape," so the harness scrubs every value
|
|
130
|
-
it provisioned by
|
|
130
|
+
it provisioned by literal match before any log tail or error can persist. Pattern-based
|
|
131
131
|
redaction is the second pass.
|
|
132
132
|
|
|
133
133
|
## The capture-vs-publish rule (worked example)
|
|
134
134
|
|
|
135
135
|
"Every screenshot is blurred to a 128px thumbnail" was once enforced at _capture_: the
|
|
136
136
|
loop never retained a usable frame. That destroyed the core deliverable for the common case
|
|
137
|
-
(a developer watching a run of their
|
|
137
|
+
(a developer watching a run of their own app locally) to defend against a leak that can only
|
|
138
138
|
happen at _publish_. The proof it was a default, not an invariant: the same product already
|
|
139
139
|
shipped raw full-resolution frames on the meta route (since removed) with only a "do not publish" warning +
|
|
140
140
|
the `.humanish/` gitignore + the binary-asset scan. Two routes, opposite policies, identical
|
|
141
141
|
threat. The corrected principle:
|
|
142
142
|
|
|
143
|
-
> **A default's enforcement point belongs at the
|
|
144
|
-
>
|
|
143
|
+
> **A default's enforcement point belongs at the publish/verify boundary, never at
|
|
144
|
+
> capture/runtime, unless capture-time is the only physically possible point.**
|
|
145
145
|
|
|
146
146
|
Consequences:
|
|
147
147
|
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
# Self-Driving Harness Principles
|
|
2
2
|
|
|
3
|
-
Date: 2026-06-01
|
|
4
|
-
|
|
5
|
-
Status: initial principles for `humanish`.
|
|
6
|
-
|
|
7
3
|
## Thesis
|
|
8
4
|
|
|
9
5
|
`humanish` should be a closed-loop product simulation system. Launching agents
|
|
@@ -27,7 +23,7 @@ context.
|
|
|
27
23
|
|
|
28
24
|
## Public Boundary
|
|
29
25
|
|
|
30
|
-
This
|
|
26
|
+
This repository is public.
|
|
31
27
|
|
|
32
28
|
No PII, PHI, secrets, keys, tokens, raw private transcripts, real patient data,
|
|
33
29
|
real customer data, or private product artifacts belong here. Examples,
|
|
@@ -14,7 +14,7 @@ They care about rigor and control, and they need output they can reason over and
|
|
|
14
14
|
adjust.
|
|
15
15
|
|
|
16
16
|
**The stakeholder** watches. In a real study they sit behind the glass in the
|
|
17
|
-
viewing room; here they open Observer, `watch`, or `
|
|
17
|
+
viewing room; here they open Observer, `watch`, or `observe --all`. They want none of the
|
|
18
18
|
protocol. They want to know what happened, where people got stuck, how bad it is,
|
|
19
19
|
and whether anyone succeeded: moments, severity, and the denominator.
|
|
20
20
|
|
|
@@ -32,7 +32,7 @@ includes reasoning as well as the report; exhausting it does not produce a usabl
|
|
|
32
32
|
report and never starts an automatic retry. Analysis
|
|
33
33
|
sends selected retained text and captures to OpenAI using `OPENAI_API_KEY`.
|
|
34
34
|
Analysis runs in the humanish runner using its credentials. This setting adds no
|
|
35
|
-
credential channel to the target application; each participant
|
|
35
|
+
credential channel to the target application; each participant's route keeps
|
|
36
36
|
its existing authentication boundary. Review the separate analysis budget before running a manifest live; an actor's
|
|
37
37
|
zero-dollar cap does not cap post-run analysis. The bundled first-contact
|
|
38
38
|
zero-spend product fixture explicitly disables analysis.
|
|
@@ -47,19 +47,19 @@ review:
|
|
|
47
47
|
timeoutMs: 600000
|
|
48
48
|
```
|
|
49
49
|
|
|
50
|
-
This requires Linux x64, a Codex CLI release
|
|
50
|
+
This requires Linux x64, a stable Codex CLI release from 0.154.0 on (`src/actors/codex/codex-admission.ts`), and a file-backed ChatGPT account login; the analyst
|
|
51
51
|
uses low reasoning effort and remote inference. Dollar cost and a provider
|
|
52
52
|
enforced output-token ceiling are unknown, so omit `maxCostUsd` and
|
|
53
53
|
`maxOutputTokens`. Numeric values are rejected before participant resources are
|
|
54
54
|
allocated. There is no API fallback. Missing or unsupported account setup leaves
|
|
55
55
|
an explicit failed analysis state and the original recording intact. Use
|
|
56
|
-
`humanish doctor --
|
|
56
|
+
`humanish doctor --study <study>` for setup checks; account allowance and model access
|
|
57
57
|
remain untested until a request. An omitted provider still means OpenAI, including
|
|
58
58
|
hosted studies whose participant uses a local Codex or Claude login. This setting
|
|
59
59
|
does not enable managed local desktops.
|
|
60
60
|
|
|
61
|
-
The same configuration works through `humanish run <
|
|
62
|
-
`watch <
|
|
61
|
+
The same configuration works through `humanish run <study>`,
|
|
62
|
+
`watch <study>`, and TUI live starts. Direct library calls to the five recording
|
|
63
63
|
producers honor it too. Supported routes are computer-use, scripted-browser,
|
|
64
64
|
terminal-product and shared-world. The synthetic route
|
|
65
65
|
never enables analysis by default and rejects an explicit analysis mapping
|
|
@@ -75,7 +75,7 @@ with no retained participant activity. A desktop startup failure does not start
|
|
|
75
75
|
an analysis request. The original failure remains visible.
|
|
76
76
|
|
|
77
77
|
CLI live starts disclose the selected analyst and its separate admission estimate limit or unknown account dollars before execution.
|
|
78
|
-
`humanish
|
|
78
|
+
`humanish study check <study> --json` and the TUI study screen also expose the
|
|
79
79
|
resolved budget without dispatching analysis. Library callers can inspect
|
|
80
80
|
`resolveAutomaticAnalysis` or `automaticAnalysisBudget` before running.
|
|
81
81
|
|
|
@@ -96,7 +96,7 @@ action writes a cancellation request for that recording; it does not signal the
|
|
|
96
96
|
finished participant process. Cancelling cannot undo provider work already
|
|
97
97
|
accepted. Known usage is retained; missing usage remains unknown.
|
|
98
98
|
|
|
99
|
-
The CLI's JSON keeps `runOk` for the
|
|
99
|
+
The CLI's JSON keeps `runOk` for the route's own result, `automaticAnalysis`
|
|
100
100
|
for post-run analysis, and `ok` for the overall request. Failed, cancelled or
|
|
101
101
|
unknown analysis produces exit code 2 without discarding the recording. A missing
|
|
102
102
|
`OPENAI_API_KEY` skips default analysis and preserves a successful run exit;
|
package/examples/README.md
CHANGED
|
@@ -5,7 +5,7 @@ one from `node_modules/humanish/examples/`. Both need Node.js 22.19 or newer, an
|
|
|
5
5
|
key. `pnpm api:proof`, part of `pnpm release:check`, runs both against the packed package.
|
|
6
6
|
|
|
7
7
|
- [participant/](participant/README.md): bring your own participant. A synthetic loopback app is
|
|
8
|
-
driven through its state contract by a `
|
|
8
|
+
driven through its state contract by a `ComputerUseExecutor` and a deterministic provider, with no
|
|
9
9
|
browser, screenshots or E2B.
|
|
10
10
|
- [scorer/](scorer/README.md): score a run with your own rubric. One scorer module is attached to a
|
|
11
11
|
dry run from a library caller and from the CLI, with no desktop or running app.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# Bring your own participant: a local app through its state contract
|
|
2
2
|
|
|
3
3
|
This complete library example starts a synthetic loopback HTTP app, reads its
|
|
4
|
-
state with a `
|
|
5
|
-
verifies the resulting humanish run. It uses a deterministic `
|
|
4
|
+
state with a `ComputerUseExecutor`, sends a greeting through its action endpoint, and
|
|
5
|
+
verifies the resulting humanish run. It uses a deterministic `ComputerUseProvider` with
|
|
6
6
|
no model calls, API keys, browser, screenshots or E2B resources. It demonstrates
|
|
7
7
|
the integration; it does not test persona behavior or the quality of an app's UI.
|
|
8
8
|
|
|
@@ -56,9 +56,9 @@ provider. Your replacement owns its model credentials and costs. The
|
|
|
56
56
|
`openai-computer-use` actor id selects the registered CUA route; `createProvider`
|
|
57
57
|
chooses the actual provider, so this example never invokes OpenAI.
|
|
58
58
|
|
|
59
|
-
The runner shows both required discriminant checks: `
|
|
60
|
-
an object containing `schema:
|
|
61
|
-
`
|
|
59
|
+
The runner shows both required discriminant checks: `parseStudy` receives
|
|
60
|
+
an object containing `schema: STUDY_SCHEMA` and is narrowed on `.ok`;
|
|
61
|
+
`runStudy` is narrowed on `route === "computer-use"` before inspecting its result.
|
|
62
62
|
Supplying `inProcess.executor` and `createProvider` selects the library-assisted
|
|
63
63
|
route. It is not a config-only CLI actor or an out-of-tree actor registration API.
|
|
64
64
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// @ts-check
|
|
2
|
-
import {
|
|
2
|
+
import { STUDY_SCHEMA, parseStudy, runStudy, stableProgressKey, verifyRun } from "humanish";
|
|
3
3
|
import { startLocalApp } from "./app.mjs";
|
|
4
4
|
|
|
5
|
-
/** @param {string} appUrl @returns {import("humanish").
|
|
5
|
+
/** @param {string} appUrl @returns {import("humanish").ComputerUseExecutor} */
|
|
6
6
|
function createAppContractExecutor(appUrl) {
|
|
7
7
|
return {
|
|
8
8
|
async observe() {
|
|
@@ -29,7 +29,7 @@ function createAppContractExecutor(appUrl) {
|
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
// A deterministic rule, not an AI participant: no model SDK, requests or credentials.
|
|
32
|
-
/** @type {import("humanish").
|
|
32
|
+
/** @type {import("humanish").ComputerUseProvider} */
|
|
33
33
|
const provider = {
|
|
34
34
|
id: "local-app-deterministic-example",
|
|
35
35
|
version: "1.0.0",
|
|
@@ -59,20 +59,21 @@ const provider = {
|
|
|
59
59
|
|
|
60
60
|
const app = await startLocalApp();
|
|
61
61
|
try {
|
|
62
|
-
//
|
|
63
|
-
const parsed =
|
|
64
|
-
schema:
|
|
62
|
+
// parseStudy accepts a decoded object, not a YAML string.
|
|
63
|
+
const parsed = parseStudy({
|
|
64
|
+
schema: STUDY_SCHEMA,
|
|
65
65
|
id: "participant-example",
|
|
66
66
|
title: "Deterministic local-app integration example",
|
|
67
|
+
route: "computer-use",
|
|
68
|
+
mode: "live",
|
|
67
69
|
subject: { source: "local-app", appUrl: app.appUrl },
|
|
68
|
-
// This registry id selects the
|
|
69
|
-
|
|
70
|
-
scenario: { mode: "live" },
|
|
70
|
+
// This registry id selects the computer-use loop. createProvider supplies the actual provider.
|
|
71
|
+
actor: { type: "openai-computer-use", persona: "pixel-pat", mission: "Greet the app." },
|
|
71
72
|
review: { analysis: false }, // Keep this deterministic example free of provider requests.
|
|
72
73
|
execution: { timeoutMs: 15_000 },
|
|
73
74
|
});
|
|
74
75
|
if (!parsed.ok) throw new Error(parsed.error.message);
|
|
75
|
-
const outcome = await
|
|
76
|
+
const outcome = await runStudy(parsed.config, {
|
|
76
77
|
cwd: process.cwd(),
|
|
77
78
|
dryRun: false,
|
|
78
79
|
// An in-process executor returns app state, not a screenshot, so it needs a provider that
|
|
@@ -5,10 +5,10 @@ evidence of a computer-use, shared-world or terminal run and stores the result a
|
|
|
5
5
|
`bundle.adapterScore`, under your namespace. A module may also export `deriveFeedback` and
|
|
6
6
|
`deriveArtifacts`; the `AdapterScorerModule` type describes all three.
|
|
7
7
|
|
|
8
|
-
[run.mjs](run.mjs) attaches the same module to a dry run of one computer-use
|
|
8
|
+
[run.mjs](run.mjs) attaches the same module to a dry run of one computer-use study in two ways:
|
|
9
9
|
|
|
10
|
-
- from a library caller, as `
|
|
11
|
-
- from the CLI, as `humanish
|
|
10
|
+
- from a library caller, as `runStudy(config, { scorer: { score } })`;
|
|
11
|
+
- from the CLI, as `humanish run study.yaml --dry-run --scorer scorer.mjs`.
|
|
12
12
|
|
|
13
13
|
A dry run needs no keys, desktop or running app. Each run's bundle carries the score, and
|
|
14
14
|
`verifyRun` checks it. The CLI run also records which module it loaded, as
|