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/verify/verify.js
CHANGED
|
@@ -8,8 +8,10 @@ import { RUN_BUNDLE_FILE, RUN_BUNDLE_SCHEMA } from "../run/bundle.js";
|
|
|
8
8
|
import { isCleanupResult, isRunBundle } from "../run/bundle-shape.js";
|
|
9
9
|
import { readRunJsonIfExists, readRunTextIfExists, resolveRunPath } from "../run/locate.js";
|
|
10
10
|
import { isRecord } from "../run/type-guards.js";
|
|
11
|
+
import { runNotFoundMessage } from "../run/run-not-found.js";
|
|
11
12
|
import { actorVerdictConsistencyFindings, noEngagementActorFindings, validateCodexAppServerEvidence, validateTerminalProductEvidence, } from "./actor.js";
|
|
12
13
|
import { invalidRunEvidenceReferences, MAX_REPORTED_FINDINGS, missingLocalEvidenceArtifacts, rawScreenshotPostureWarnings, rawScreenshotStreamIds, redactedShapeFramePaths, scanRunPublicSafetyArtifacts, streamScreenshotPaths, } from "./artifacts.js";
|
|
14
|
+
import { flatContextWarnings } from "./context-growth.js";
|
|
13
15
|
import { runNotFinishedWarnings } from "./liveness.js";
|
|
14
16
|
import { costAndReceiptFindings } from "./costs.js";
|
|
15
17
|
import { rerunLineageFindings } from "./rerun.js";
|
|
@@ -57,26 +59,16 @@ export function invalidRunStorageVerifyResult(cwd, runInput) {
|
|
|
57
59
|
export async function verifyResolvedRun(cwd, runInput, runPaths) {
|
|
58
60
|
const checks = [];
|
|
59
61
|
if (!runPaths) {
|
|
62
|
+
const message = await runNotFoundMessage(cwd, runInput);
|
|
60
63
|
return {
|
|
61
64
|
schema: VERIFY_SCHEMA,
|
|
62
65
|
ok: false,
|
|
63
66
|
cwd,
|
|
64
67
|
run: runInput,
|
|
65
68
|
checks,
|
|
66
|
-
shareSafety: {
|
|
67
|
-
status: "blocked",
|
|
68
|
-
reasons: [
|
|
69
|
-
{
|
|
70
|
-
code: "VERIFY_FAILED",
|
|
71
|
-
message: `Run not found: ${runInput}`,
|
|
72
|
-
},
|
|
73
|
-
],
|
|
74
|
-
},
|
|
69
|
+
shareSafety: { status: "blocked", reasons: [{ code: "VERIFY_FAILED", message }] },
|
|
75
70
|
warnings: [],
|
|
76
|
-
error: {
|
|
77
|
-
code: "HUMANISH_RUN_NOT_FOUND",
|
|
78
|
-
message: `Run not found: ${runInput}`,
|
|
79
|
-
},
|
|
71
|
+
error: { code: "HUMANISH_RUN_NOT_FOUND", message },
|
|
80
72
|
};
|
|
81
73
|
}
|
|
82
74
|
const bundlePath = path.join(runPaths.absoluteRunRoot, RUN_BUNDLE_FILE);
|
|
@@ -84,7 +76,10 @@ export async function verifyResolvedRun(cwd, runInput, runPaths) {
|
|
|
84
76
|
const cleanupJson = await readRunJsonIfExists(runPaths, "cleanup.json");
|
|
85
77
|
const reviewJson = await readRunJsonIfExists(runPaths, "review.json");
|
|
86
78
|
const reviewMarkdown = await readRunTextIfExists(runPaths, "review.md");
|
|
87
|
-
checks.push(...bundlePresenceChecks(bundle,
|
|
79
|
+
checks.push(...bundlePresenceChecks(bundle, {
|
|
80
|
+
json: reviewJson !== null,
|
|
81
|
+
markdown: reviewMarkdown !== null,
|
|
82
|
+
}));
|
|
88
83
|
const derivedPublicSafetyFindings = [];
|
|
89
84
|
const unscannedArtifacts = [];
|
|
90
85
|
const publicSafetyFindings = await scanRunPublicSafetyArtifacts(runPaths, derivedPublicSafetyFindings, {
|
|
@@ -104,7 +99,7 @@ export async function verifyResolvedRun(cwd, runInput, runPaths) {
|
|
|
104
99
|
name: "public-safety scan",
|
|
105
100
|
ok: publicSafetyFindings.length === 0,
|
|
106
101
|
message: publicSafetyFindings.length === 0
|
|
107
|
-
? "run text
|
|
102
|
+
? "no run text artifact or public-proof path matches a known secret or browser-profile pattern"
|
|
108
103
|
: `public-safety findings: ${publicSafetyFindings.slice(0, 5).join(", ")}`,
|
|
109
104
|
});
|
|
110
105
|
const missingEvidenceArtifacts = isRunBundle(bundle)
|
|
@@ -118,7 +113,9 @@ export async function verifyResolvedRun(cwd, runInput, runPaths) {
|
|
|
118
113
|
name: "local evidence artifacts exist",
|
|
119
114
|
ok: missingEvidenceArtifacts.length === 0 && invalidEvidenceReferences.length === 0,
|
|
120
115
|
message: missingEvidenceArtifacts.length === 0 && invalidEvidenceReferences.length === 0
|
|
121
|
-
?
|
|
116
|
+
? isRunBundle(bundle)
|
|
117
|
+
? "every referenced screenshot, trace, log and filesystem artifact is present"
|
|
118
|
+
: SHAPE_UNCHECKED
|
|
122
119
|
: invalidEvidenceReferences.length > 0
|
|
123
120
|
? `invalid evidence artifact references: ${invalidEvidenceReferences.join(", ")}`
|
|
124
121
|
: `missing local evidence artifacts: ${missingEvidenceArtifacts.join(", ")}`,
|
|
@@ -137,6 +134,7 @@ export async function verifyResolvedRun(cwd, runInput, runPaths) {
|
|
|
137
134
|
...rawScreenshotPostureWarnings(bundle, redactedShapeFrames),
|
|
138
135
|
...undeclaredSubjectStateWarnings(bundle),
|
|
139
136
|
...desktopGeometryWarnings(bundle),
|
|
137
|
+
...flatContextWarnings(bundle),
|
|
140
138
|
...(await runNotFinishedWarnings(runPaths, bundle)),
|
|
141
139
|
]
|
|
142
140
|
: [];
|
|
@@ -189,33 +187,76 @@ export async function verifyRunPrepared(cwdInput, runInput, runPaths) {
|
|
|
189
187
|
}
|
|
190
188
|
return verifyResolvedRun(cwd, runInput, runPaths);
|
|
191
189
|
}
|
|
192
|
-
/**
|
|
193
|
-
|
|
190
|
+
/** The top-level run.json sections the shape guard requires. */
|
|
191
|
+
const REQUIRED_SECTIONS = [
|
|
192
|
+
"source",
|
|
193
|
+
"persona",
|
|
194
|
+
"scenario",
|
|
195
|
+
"lifecycle",
|
|
196
|
+
"simulations",
|
|
197
|
+
"streams",
|
|
198
|
+
"events",
|
|
199
|
+
"artifacts",
|
|
200
|
+
"review",
|
|
201
|
+
"redaction",
|
|
202
|
+
"feedbackCandidates",
|
|
203
|
+
];
|
|
204
|
+
/**
|
|
205
|
+
* Whether run.json, its schema, shape and redaction, and the review artifacts are present. Each
|
|
206
|
+
* check says what it found, so a failing row never prints the rule it enforces.
|
|
207
|
+
*/
|
|
208
|
+
function bundlePresenceChecks(bundle, review) {
|
|
209
|
+
const record = isRecord(bundle) ? bundle : undefined;
|
|
210
|
+
const schema = record?.schema;
|
|
211
|
+
const schemaOk = schema === RUN_BUNDLE_SCHEMA;
|
|
212
|
+
const redactionRecord = record?.redaction;
|
|
213
|
+
const redaction = isRecord(redactionRecord) ? redactionRecord.status : undefined;
|
|
214
|
+
const missingSections = REQUIRED_SECTIONS.filter((key) => record?.[key] === undefined);
|
|
215
|
+
const missingReview = [
|
|
216
|
+
...(review.json ? [] : ["review.json is missing or not valid JSON"]),
|
|
217
|
+
...(review.markdown ? [] : ["review.md is missing"]),
|
|
218
|
+
];
|
|
194
219
|
return [
|
|
195
220
|
{
|
|
196
221
|
name: "run.json exists",
|
|
197
222
|
ok: bundle !== null,
|
|
198
|
-
message: bundle === null ? "run.json missing" : "run.json present",
|
|
223
|
+
message: bundle === null ? "run.json is missing or not valid JSON" : "run.json is present",
|
|
199
224
|
},
|
|
200
225
|
{
|
|
201
226
|
name: "run schema",
|
|
202
|
-
ok:
|
|
203
|
-
message:
|
|
227
|
+
ok: schemaOk,
|
|
228
|
+
message: schemaOk
|
|
229
|
+
? `run.json declares ${RUN_BUNDLE_SCHEMA}`
|
|
230
|
+
: record === undefined
|
|
231
|
+
? "no readable run.json, so no schema"
|
|
232
|
+
: `run.json declares ${typeof schema === "string" ? schema : "no schema"}; verify reads ${RUN_BUNDLE_SCHEMA}`,
|
|
204
233
|
},
|
|
205
234
|
{
|
|
206
235
|
name: "run bundle shape",
|
|
207
236
|
ok: isRunBundle(bundle),
|
|
208
|
-
message:
|
|
237
|
+
message: isRunBundle(bundle)
|
|
238
|
+
? "run.json has every required section"
|
|
239
|
+
: record === undefined
|
|
240
|
+
? "no readable run.json, so no sections"
|
|
241
|
+
: missingSections.length > 0
|
|
242
|
+
? `run.json is missing ${missingSections.join(", ")}`
|
|
243
|
+
: schemaOk
|
|
244
|
+
? "one or more run.json sections have the wrong shape"
|
|
245
|
+
: "sections not checked, because the schema differs",
|
|
209
246
|
},
|
|
210
247
|
{
|
|
211
248
|
name: "redaction passed",
|
|
212
|
-
ok:
|
|
213
|
-
message:
|
|
249
|
+
ok: redaction === "passed",
|
|
250
|
+
message: redaction === "passed"
|
|
251
|
+
? "redaction passed"
|
|
252
|
+
: `redaction did not pass (status: ${typeof redaction === "string" ? redaction : "missing"})`,
|
|
214
253
|
},
|
|
215
254
|
{
|
|
216
255
|
name: "review artifacts exist",
|
|
217
|
-
ok:
|
|
218
|
-
message:
|
|
256
|
+
ok: missingReview.length === 0,
|
|
257
|
+
message: missingReview.length === 0
|
|
258
|
+
? "review.json and review.md are present"
|
|
259
|
+
: missingReview.join("; "),
|
|
219
260
|
},
|
|
220
261
|
];
|
|
221
262
|
}
|
|
@@ -242,38 +283,46 @@ async function applyAnalysisSharing(runPaths, warnings, shareSafety) {
|
|
|
242
283
|
shareSafety.status = "local_only";
|
|
243
284
|
}
|
|
244
285
|
/** Passes when `findings` is empty; otherwise lists them after `failLabel`. */
|
|
245
|
-
function findingsCheck(name, findings, okMessage, failLabel
|
|
286
|
+
function findingsCheck(name, findings, okMessage, failLabel) {
|
|
246
287
|
return {
|
|
247
288
|
name,
|
|
248
289
|
ok: findings.length === 0,
|
|
249
|
-
message: findings.length === 0 ? okMessage : `${failLabel}: ${findings.join(", ")}
|
|
290
|
+
message: findings.length === 0 ? okMessage : `${failLabel}: ${findings.join(", ")}`,
|
|
250
291
|
};
|
|
251
292
|
}
|
|
293
|
+
/**
|
|
294
|
+
* The pass message of a check that reads bundle content when run.json failed its shape guard. The
|
|
295
|
+
* check has no findings and stays ok; the shape check is the failure.
|
|
296
|
+
*/
|
|
297
|
+
const SHAPE_UNCHECKED = "not checked, because run.json failed the shape check";
|
|
252
298
|
/** The bundle-content checks, in report order. A bundle that fails its shape guard has no findings. */
|
|
253
299
|
async function evidenceChecks(runPaths, bundle, cleanupJson) {
|
|
254
300
|
const valid = isRunBundle(bundle) ? bundle : null;
|
|
301
|
+
const pass = (message) => (valid ? message : SHAPE_UNCHECKED);
|
|
255
302
|
const checks = [
|
|
256
|
-
findingsCheck("terminal-product evidence", valid ? await validateTerminalProductEvidence(runPaths, valid) : [], "live terminal-product
|
|
257
|
-
findingsCheck("codex app-server evidence", valid ? await validateCodexAppServerEvidence(runPaths, valid) : [], "live Codex app-server
|
|
258
|
-
findingsCheck("actor engagement", valid ? noEngagementActorFindings(valid) : [], "live actor
|
|
259
|
-
findingsCheck("actor verdict consistency", valid ? actorVerdictConsistencyFindings(valid) : [], "live pass
|
|
260
|
-
findingsCheck("subject state provenance", valid ? subjectStateFindings(valid) : [], "subject state claims match the recorded seed
|
|
261
|
-
findingsCheck("shared-world evidence", valid ? sharedWorldEvidenceFindings(valid) : [], "live shared-world
|
|
303
|
+
findingsCheck("terminal-product evidence", valid ? await validateTerminalProductEvidence(runPaths, valid) : [], pass("live terminal-product evidence is complete (ledgers, redacted output, proven teardown, known spend within the cap), or the run has none"), "terminal-product findings"),
|
|
304
|
+
findingsCheck("codex app-server evidence", valid ? await validateCodexAppServerEvidence(runPaths, valid) : [], pass("live Codex app-server traces are valid and redacted, or the run has none"), "codex app-server findings"),
|
|
305
|
+
findingsCheck("actor engagement", valid ? noEngagementActorFindings(valid) : [], pass("every live actor that claims its goal took at least one action or sent a message"), "no-engagement findings"),
|
|
306
|
+
findingsCheck("actor verdict consistency", valid ? actorVerdictConsistencyFindings(valid) : [], pass("no live pass verdict hides a failed, blocked or timed-out actor"), "actor verdict findings"),
|
|
307
|
+
findingsCheck("subject state provenance", valid ? subjectStateFindings(valid) : [], pass("subject state claims match the recorded seed and external evidence, or the run makes none"), "subject state findings"),
|
|
308
|
+
findingsCheck("shared-world evidence", valid ? sharedWorldEvidenceFindings(valid) : [], pass("live shared-world evidence is well formed for its mode, with single-plane provenance, digest-only checkpoints and attributionLimits, or the run has none"), "shared-world findings"),
|
|
262
309
|
{
|
|
263
310
|
name: "cleanup receipt",
|
|
264
311
|
ok: cleanupJson === null || (isCleanupResult(cleanupJson) && cleanupJson.ok),
|
|
265
312
|
message: cleanupJson === null
|
|
266
|
-
? "cleanup
|
|
267
|
-
: isCleanupResult(cleanupJson)
|
|
268
|
-
? "cleanup
|
|
269
|
-
:
|
|
313
|
+
? "no cleanup.json; cleanup was not requested"
|
|
314
|
+
: !isCleanupResult(cleanupJson)
|
|
315
|
+
? "cleanup.json is malformed"
|
|
316
|
+
: cleanupJson.ok
|
|
317
|
+
? "cleanup.json records a successful cleanup"
|
|
318
|
+
: "cleanup.json records a failed cleanup",
|
|
270
319
|
},
|
|
271
|
-
findingsCheck("rerun lineage", valid ? rerunLineageFindings(valid) : [], "rerun
|
|
272
|
-
// Cost is
|
|
273
|
-
// Absence
|
|
274
|
-
// source, or a total that does not match its known lines,
|
|
320
|
+
findingsCheck("rerun lineage", valid ? rerunLineageFindings(valid) : [], pass("rerun participants link to their prior status and a fan-out rerun event, or this run is not a rerun"), "rerun lineage findings"),
|
|
321
|
+
// Cost is advisory on magnitude and fail-closed on labeling/provenance (claims match mechanism).
|
|
322
|
+
// Absence passes (fail-open on display); a claimed dollar figure without its ratesAsOf date +
|
|
323
|
+
// source, or a total that does not match its known lines, fails. Magnitude is never inspected:
|
|
275
324
|
// a correctly-labeled huge estimate still passes.
|
|
276
|
-
findingsCheck("cost estimate labeling", valid ? costAndReceiptFindings(valid) : [], "
|
|
325
|
+
findingsCheck("cost estimate labeling", valid ? costAndReceiptFindings(valid) : [], pass("every cost estimate carries its ratesAsOf date and source and the total matches its lines, or the run claims no cost"), "cost labeling findings"),
|
|
277
326
|
];
|
|
278
327
|
return checks;
|
|
279
328
|
}
|
package/docs/README.md
CHANGED
|
@@ -1,31 +1,17 @@
|
|
|
1
1
|
# Find the right doc
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
User guides live at [humanish.dev/docs](https://humanish.dev/docs). This page sorts the contributor
|
|
4
|
+
reference under `docs/` by what it is for. To make a first change, start with
|
|
5
|
+
[CONTRIBUTING.md](https://github.com/danielgwilson/humanish/blob/main/CONTRIBUTING.md#make-your-first-change).
|
|
6
6
|
|
|
7
7
|
## Follow a guide to do a task
|
|
8
8
|
|
|
9
|
-
- [ramp/README.md](ramp/README.md): current state, how to pick work and the quality bar.
|
|
10
|
-
- [
|
|
11
|
-
local Firecracker browser.
|
|
12
|
-
- [architecture/real-email-receiving.md](architecture/real-email-receiving.md) and
|
|
13
|
-
[architecture/comms-inbox.md](architecture/comms-inbox.md): give participants real or captured
|
|
14
|
-
inboxes.
|
|
15
|
-
- [architecture/participant-media.md](architecture/participant-media.md) and
|
|
16
|
-
[architecture/desktop-recording.md](architecture/desktop-recording.md): add a camera, speech or
|
|
17
|
-
a desktop video.
|
|
18
|
-
- [architecture/observer-review.md](architecture/observer-review.md): watch and review a study.
|
|
19
|
-
- [architecture/project-layout.md](architecture/project-layout.md): the `humanish/` and
|
|
20
|
-
`.humanish/` folders `init` creates.
|
|
21
|
-
- [product/lobby-trivia-3player-external-public.md](product/lobby-trivia-3player-external-public.md):
|
|
22
|
-
a worked example of the external-public shared-world lab.
|
|
23
|
-
- [release/open-source-readiness.md](release/open-source-readiness.md): the release gates and the
|
|
24
|
-
publish procedure. Its opening audit is a dated snapshot.
|
|
9
|
+
- [ramp/README.md](https://github.com/danielgwilson/humanish/blob/main/docs/ramp/README.md): current state, how to pick work and the quality bar.
|
|
10
|
+
- [release/publish.md](https://github.com/danielgwilson/humanish/blob/main/docs/release/publish.md): check a release candidate, tag it and publish it.
|
|
25
11
|
|
|
26
12
|
## Look up what the code does now
|
|
27
13
|
|
|
28
|
-
- [contracts/](contracts/
|
|
14
|
+
- [contracts/](contracts/README.md): bundle, study, policy, feedback, analysis and cost contracts.
|
|
29
15
|
Documented fields are API. [contracts/schemas.md](contracts/schemas.md) indexes every schema.
|
|
30
16
|
- [architecture/observer.md](architecture/observer.md), [architecture/serve.md](architecture/serve.md):
|
|
31
17
|
the Observer and the run library server.
|
|
@@ -33,35 +19,42 @@ than one kind is split file by file.
|
|
|
33
19
|
[architecture/browser-control.md](architecture/browser-control.md),
|
|
34
20
|
[architecture/guest-desktop.md](architecture/guest-desktop.md): hosted desktops, the browser
|
|
35
21
|
control protocol and the guest runtime.
|
|
36
|
-
- [architecture/state-driven-executor.md](architecture/state-driven-executor.md): the `
|
|
22
|
+
- [architecture/state-driven-executor.md](architecture/state-driven-executor.md): the `ComputerUseExecutor`
|
|
37
23
|
library path.
|
|
38
24
|
- [architecture/task-protocol-support.md](architecture/task-protocol-support.md): which routes
|
|
39
|
-
accept `
|
|
25
|
+
accept `actor.tasks`.
|
|
40
26
|
- [architecture/external-public-shared-world.md](architecture/external-public-shared-world.md) and
|
|
41
27
|
[architecture/terminal-product-route.md](architecture/terminal-product-route.md): two routes in
|
|
42
|
-
depth.
|
|
28
|
+
depth.
|
|
43
29
|
- [architecture/restricted-codex-analysis.md](architecture/restricted-codex-analysis.md) and
|
|
44
30
|
[product/automatic-analysis.md](product/automatic-analysis.md): study analysis.
|
|
45
|
-
- [release/public-readiness-standard.md](release/public-readiness-standard.md): what may appear in
|
|
31
|
+
- [release/public-readiness-standard.md](https://github.com/danielgwilson/humanish/blob/main/docs/release/public-readiness-standard.md): what may appear in
|
|
46
32
|
the public repository and the npm package.
|
|
47
33
|
|
|
48
34
|
## Read why the code is shaped this way
|
|
49
35
|
|
|
50
|
-
- [principles/](principles/engineering.md)
|
|
51
|
-
|
|
36
|
+
- [principles/engineering.md](principles/engineering.md),
|
|
37
|
+
[principles/invariants-and-defaults.md](principles/invariants-and-defaults.md),
|
|
38
|
+
[principles/actor-fidelity.md](principles/actor-fidelity.md),
|
|
39
|
+
[principles/three-roles.md](principles/three-roles.md) and
|
|
40
|
+
[principles/self-driving-harness.md](principles/self-driving-harness.md): engineering,
|
|
41
|
+
invariants and defaults, actor fidelity, the three roles and the self-driving harness.
|
|
52
42
|
- [decisions/](decisions/README.md): one record per decision, each naming the code or test that
|
|
53
43
|
enforces it.
|
|
54
44
|
- [architecture/actor-contract.md](architecture/actor-contract.md) and
|
|
55
45
|
[architecture/github-feedback-loop.md](architecture/github-feedback-loop.md): design records with
|
|
56
46
|
their context and open items.
|
|
57
|
-
- [product/open-source-install-experience.md](product/open-source-install-experience.md): the
|
|
58
|
-
product target for install and first run.
|
|
59
47
|
|
|
60
|
-
##
|
|
48
|
+
## Check the current state and the evidence behind it
|
|
61
49
|
|
|
62
|
-
|
|
50
|
+
- [status.md](https://github.com/danielgwilson/humanish/blob/main/docs/status.md): what ships today, by surface, and the work that is gated.
|
|
51
|
+
- [evidence/](https://github.com/danielgwilson/humanish/blob/main/docs/evidence/README.md): dated study records that the README, the site and these pages
|
|
52
|
+
cite. `docs:check` covers them.
|
|
53
|
+
|
|
54
|
+
## Treat history as history
|
|
55
|
+
|
|
56
|
+
[history/](https://github.com/danielgwilson/humanish/blob/main/docs/history/README.md) holds dated goal packets, plans and the roadmap. They may name files
|
|
63
57
|
that have since moved, so `docs:check` skips them (`HISTORY_DIRECTORIES` in
|
|
64
|
-
[scripts/lib/doc-paths.ts](
|
|
65
|
-
[goals/current.md](goals/current.md), the live status page.
|
|
58
|
+
[scripts/lib/doc-paths.ts](https://github.com/danielgwilson/humanish/blob/main/scripts/lib/doc-paths.ts)).
|
|
66
59
|
|
|
67
60
|
`assets/` holds images that ship in the npm package, such as the README hero.
|
|
@@ -1,32 +1,29 @@
|
|
|
1
1
|
# Actor Contract
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
routing checks `lanes` and `producesScreenshots` (`src/lab/routing.ts`): an actor that
|
|
16
|
-
declares no screenshots cannot run on the computer-use or scripted-browser route. Decision
|
|
17
|
-
6's capture-time screenshot stance was recanted in 0.6.0; see the inline notes and the
|
|
3
|
+
Part of this contract ships and part is still open. Shipped: the evidence schema
|
|
4
|
+
`humanish.actor-trace.v1` (`src/actors/contract.ts`) and a closed first-party registry of five
|
|
5
|
+
descriptors (`src/actors/registry.ts`: `codex-app-server`, `openai-computer-use`, `local-agent`,
|
|
6
|
+
`scripted-browser`, `codex-exec`). `actor.type` is a real dispatch key on the computer-use,
|
|
7
|
+
scripted-browser, and terminal-product routes. Product scoring, feedback, and artifact hooks are
|
|
8
|
+
extension seams, but public out-of-tree actor registration and its conformance certification are not
|
|
9
|
+
shipped. Also not shipped: the full `Actor.run(input)` interface, `ApprovalPolicy`,
|
|
10
|
+
`StagehandCuaActor`, and the `persona-fidelity` verify check. `RedactionHooks` ships in
|
|
11
|
+
`src/evidence/redaction.ts`, and the computer-use loop takes it; the other adapters do not take it
|
|
12
|
+
yet. Of the capabilities, routing checks `lanes` and `producesScreenshots` (`src/lab/routing.ts`):
|
|
13
|
+
an actor that declares no screenshots cannot run on the computer-use or scripted-browser route.
|
|
14
|
+
Decision 6's capture-time screenshot stance was recanted in 0.6.0; see the inline notes and the
|
|
18
15
|
capture-vs-publish rule in
|
|
19
16
|
[`docs/principles/invariants-and-defaults.md`](../principles/invariants-and-defaults.md).
|
|
20
17
|
|
|
21
|
-
`codex-exec` is a real dispatch key for terminal-product
|
|
18
|
+
`codex-exec` is a real dispatch key for terminal-product studies, but the exported
|
|
22
19
|
descriptor `runSession` is a fail-closed compatibility entry. Live execution is
|
|
23
20
|
owned by `runTerminalProductLab`, which coordinates sandbox creation,
|
|
24
21
|
command-scoped runtime auth, evidence, caps, and by-id cleanup.
|
|
25
22
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
through `local-agent`, which plugs into the provider-neutral `
|
|
23
|
+
The `pi-agent-core` and `claude-agent-sdk` descriptors, the `app` run kind and the
|
|
24
|
+
`in-process-sdk` protocol were removed. No study route dispatched either descriptor, and a
|
|
25
|
+
study that names one now fails to parse. A signed-in Claude Code drives computer-use studies
|
|
26
|
+
through `local-agent`, which plugs into the provider-neutral `ComputerUseProvider` port
|
|
30
27
|
(`src/actors/computer-use/loop/types.ts`, re-exported from `loop.ts`).
|
|
31
28
|
|
|
32
29
|
## Context
|
|
@@ -64,7 +61,7 @@ API surface.
|
|
|
64
61
|
Agent SDK, Stagehand). The existing Codex app-server integration is the
|
|
65
62
|
reference adapter. `pi-agent-core` was planned as the first in-process-SDK
|
|
66
63
|
adapter to prove both shapes early; it shipped only as a trace mapper with no
|
|
67
|
-
route, and
|
|
64
|
+
route, and was removed.
|
|
68
65
|
|
|
69
66
|
2. **One normalized evidence schema: `humanish.actor-trace.v1`.** Four producers map
|
|
70
67
|
their records onto one `ActorTrace` with a typed `items[]`:
|
|
@@ -81,7 +78,7 @@ API surface.
|
|
|
81
78
|
The Codex app-server still writes its own `humanish.codex-app-server-trace.v1` record
|
|
82
79
|
(`CodexAppServerTrace` in `src/actors/codex/app-server-trace.ts`), which
|
|
83
80
|
`codexResultToActorTrace` converts. The Claude Agent SDK `ToolUse`/`ToolResult` and pi
|
|
84
|
-
`tool_execution_*` mappers
|
|
81
|
+
`tool_execution_*` mappers were removed with their adapters.
|
|
85
82
|
|
|
86
83
|
3. **A run is multi-turn within one trace; it stops on goal, abandonment, unrecoverable
|
|
87
84
|
failure, or a wall-clock safety timeout, never on a turn cap.** Turn count is explicitly
|
|
@@ -96,7 +93,7 @@ API surface.
|
|
|
96
93
|
4. **Redaction is injected once, never re-implemented per adapter.** Every
|
|
97
94
|
adapter receives `RedactionHooks` (the shared secret/path/prompt-digest
|
|
98
95
|
redaction, plus screenshot redaction) and must route all persisted evidence
|
|
99
|
-
through it.
|
|
96
|
+
through it.
|
|
100
97
|
|
|
101
98
|
5. **The registry refuses capability mismatches.** Each adapter declares
|
|
102
99
|
`ActorCapabilities`. A scenario that needs `producesScreenshots` (a GUI
|
|
@@ -287,27 +284,27 @@ export interface Actor {
|
|
|
287
284
|
public-safe: redacted message, coarse loop phase, last normalized UI action,
|
|
288
285
|
and last screenshot reference only. Do not persist raw stacks, env values,
|
|
289
286
|
target URLs, or unredacted provider payloads in the trace.
|
|
290
|
-
- **Capabilities.** Declare
|
|
287
|
+
- **Capabilities.** Declare only what the actor does. Routing refuses an actor whose `lanes` or
|
|
291
288
|
`producesScreenshots` do not fit the route; the other capabilities are not checked.
|
|
292
|
-
- **Cost (estimate vs. charge).** `tokenUsage.costUsd` stays
|
|
289
|
+
- **Cost (estimate vs. charge).** `tokenUsage.costUsd` stays reserved for a
|
|
293
290
|
real, provider-returned charge (the codex path); a bare `costUsd`
|
|
294
291
|
always means "the provider billed this". The optional `estimatedCost`
|
|
295
|
-
(`humanish.actor-estimated-cost.v1`) is a
|
|
292
|
+
(`humanish.actor-estimated-cost.v1`) is a separate, differently-named field: a
|
|
296
293
|
token-derived rate-table multiply from the operator-editable `src/run/pricing.ts`,
|
|
297
|
-
labeled
|
|
294
|
+
labeled as an estimate and projected up into `RunBundle.cost` (see
|
|
298
295
|
[`../contracts/schemas.md`](../contracts/schemas.md) → Run Cost Summary And
|
|
299
|
-
Estimated Actor Cost). The CUA
|
|
300
|
-
|
|
296
|
+
Estimated Actor Cost). The CUA study computes and attaches `estimatedCost` at the
|
|
297
|
+
study boundary before persisting the trace, so the pure computer-use loop never
|
|
301
298
|
depends on the pricing table. An unknown model yields
|
|
302
299
|
`estimatedCostUsd: null` + a `reason`, never a guessed charge.
|
|
303
300
|
|
|
304
|
-
## The scripted-browser route
|
|
301
|
+
## The scripted-browser route
|
|
305
302
|
|
|
306
303
|
`scripted-browser` is the deterministic, model-free browser-actuation route, distinct from
|
|
307
304
|
`computer-use` (raw pixels + a model deciding actions). The registered
|
|
308
305
|
`scripted-browser` actor (`src/actors/scripted-browser/`) replays a committed scenario's
|
|
309
|
-
browser steps with playwright against a loopback app; the steps
|
|
310
|
-
`byoModel: false` means there is
|
|
306
|
+
browser steps with playwright against a loopback app; the steps are the behavior, so
|
|
307
|
+
`byoModel: false` means there is no model, and `tokenUsage` records zeros as an affirmative
|
|
311
308
|
$0 declaration that is true by mechanism (no provider client is importable from that code
|
|
312
309
|
path). Its trace keeps the concrete driver name `provider: "browser-persona"` (matching the
|
|
313
310
|
native `humanish.browser-persona-trace.v1` it also emits) with `protocol: "scripted-steps"`.
|
|
@@ -322,16 +319,16 @@ has no persona patience and no approvals.
|
|
|
322
319
|
|
|
323
320
|
### The time budget vs. a stuck timeout (`budget_reached`)
|
|
324
321
|
|
|
325
|
-
`execution.timeoutMs` is a
|
|
322
|
+
`execution.timeoutMs` is a generous wall-clock safety cap, not a goal. An open-ended
|
|
326
323
|
"watch it play" session has no success predicate, because productive play is the outcome. So
|
|
327
324
|
the computer-use loop distinguishes two ways to hit the cap:
|
|
328
325
|
|
|
329
|
-
- **`budget_reached`**: the deadline was reached
|
|
326
|
+
- **`budget_reached`**: the deadline was reached after at least one material (non-idle)
|
|
330
327
|
action, or a spend, adapter or token limit ended the session. This maps to `ActorStatus:
|
|
331
328
|
"incomplete"`: the participant did not reach the goal, and the harness did not fail.
|
|
332
329
|
`participantOutcomeOk` is false, the verdict is `fail`, and the CLI exits `2`. The trace
|
|
333
330
|
`reason` and optional `stopCause` say which limit ended the session.
|
|
334
|
-
- **`timed_out`**: the deadline was reached with
|
|
331
|
+
- **`timed_out`**: the deadline was reached with zero material actions (a hung provider, an
|
|
335
332
|
idle-only stall). This maps to `ActorStatus: "timed_out"`, `participantOutcomeOk` is false, the
|
|
336
333
|
verdict is `timed_out`, and the CLI exits `2`.
|
|
337
334
|
|
|
@@ -342,7 +339,7 @@ switch with no default, so a new completion reason forces a compile-time decisio
|
|
|
342
339
|
status. ~30 min (`1_800_000`) is a reasonable default for open-ended watch; the persona
|
|
343
340
|
still stops early on `goal_satisfied`/`gave_up`/`stopWhen`.
|
|
344
341
|
|
|
345
|
-
Actuation-vs-spend gate: on the scripted
|
|
342
|
+
Actuation-vs-spend gate: on the scripted route `mode: live` is still required
|
|
346
343
|
even though provider spend is $0 by mechanism. The gate's justification there is actuation,
|
|
347
344
|
not cost: a live scripted run drives a real browser against a real running app
|
|
348
345
|
(state-mutating effects on the operator's app), which deserves the same affirmative
|
|
@@ -351,8 +348,8 @@ this paragraph is the record of that decision.
|
|
|
351
348
|
|
|
352
349
|
## Optional closing report
|
|
353
350
|
|
|
354
|
-
`
|
|
355
|
-
`stopWhen` or dwell stop. It returns a `
|
|
351
|
+
`ComputerUseProvider.debrief` is an optional read-only request after a structured
|
|
352
|
+
`stopWhen` or dwell stop. It returns a `ComputerUseTurn` with `closingReport` containing
|
|
356
353
|
`summary` and `frictionReports`; an empty friction list is valid. The loop rejects
|
|
357
354
|
actions, pending safety checks, and invalid report shapes. It redacts accepted
|
|
358
355
|
reports, records them in `ActorTrace.debrief`, and projects one readable message
|
|
@@ -367,39 +364,40 @@ from interaction turns, and reported usage contributes to aggregate cost.
|
|
|
367
364
|
|
|
368
365
|
The OpenAI implementation makes one request with tools disabled and structured
|
|
369
366
|
output; no HTTP or policy retries. Stateless/ZDR mode does not offer retrospective
|
|
370
|
-
reporting
|
|
371
|
-
|
|
367
|
+
reporting: its client-carried conversation summarizes its oldest turns past a token
|
|
368
|
+
budget, so it may not hold the whole session a retrospective report needs. The
|
|
369
|
+
[paired live receipt](https://github.com/danielgwilson/humanish/blob/main/docs/evidence/computer-use/structured-closing-report-2026-09-05.md)
|
|
372
370
|
records both report recovery and control failures in the separate legacy parser.
|
|
373
371
|
|
|
374
|
-
## The state-driven executor seam
|
|
372
|
+
## The state-driven executor seam
|
|
375
373
|
|
|
376
|
-
The `
|
|
374
|
+
The `ComputerUseExecutor` / `ComputerUseProvider` ports are the concrete realization of the "plural harnesses /
|
|
377
375
|
transport-agnostic" intent above: the computer-use loop does not require a screen or a vision
|
|
378
376
|
model. A library caller can drive an **already-running local app** through its in-process JS
|
|
379
|
-
contract (`window.app.getState()` etc.) with a custom `
|
|
380
|
-
`appState` as the progress signal) paired with a **non-vision** `
|
|
381
|
-
falsey), keeping the whole
|
|
377
|
+
contract (`window.app.getState()` etc.) with a custom `ComputerUseExecutor` (screenshot optional,
|
|
378
|
+
`appState` as the progress signal) paired with a **non-vision** `ComputerUseProvider` (`requiresFrame`
|
|
379
|
+
falsey), keeping the whole study composition with no E2B desktop and no clone. See
|
|
382
380
|
[`state-driven-executor.md`](./state-driven-executor.md) for the port, both entry points
|
|
383
|
-
(`runComputerUseLoop` and `
|
|
381
|
+
(`runComputerUseLoop` and `runStudy` + `inProcess`/`createProvider`), the `subject.source:
|
|
384
382
|
local-app` config surface, the `requiresFrame` provider-authoring contract, and the
|
|
385
383
|
appState-is-runtime-only stance.
|
|
386
384
|
|
|
387
|
-
## The product-adapter extension seam
|
|
385
|
+
## The product-adapter extension seam
|
|
388
386
|
|
|
389
|
-
The terminal-product route
|
|
390
|
-
attaches product-specific scoring + feedback as a
|
|
387
|
+
The terminal-product route has a product-adapter extension seam: a product adopter
|
|
388
|
+
attaches product-specific scoring + feedback as a thin in-repo extension without forking
|
|
391
389
|
core. The seam is exported contract types (`RunBundle`, `RunFeedbackCandidate`,
|
|
392
390
|
`RunAdapterScore`, `ActorTrace`, `AdapterScorerModule` and the terminal-route
|
|
393
|
-
`TerminalProductScoringContext`) plus a registrable scorer module, `
|
|
391
|
+
`TerminalProductScoringContext`) plus a registrable scorer module, `RunStudyOptions.scorer`,
|
|
394
392
|
with optional `score` and `deriveFeedback`. The older `terminalHooks` and `cuaHooks` bags were
|
|
395
|
-
removed from `
|
|
396
|
-
under an adapter-
|
|
393
|
+
removed from `RunStudyOptions`. The adapter records its product nouns only
|
|
394
|
+
under an adapter-namespaced block (`RunFeedbackCandidate.adapter` /
|
|
397
395
|
`RunAdapterScore.{namespace,data}`), so core's enums stay product-agnostic: no adopter noun
|
|
398
396
|
is hardcoded into a core enum. Default (no hook) behavior is unchanged. See
|
|
399
|
-
[`terminal-product-route.md`](./terminal-product-route.md#
|
|
397
|
+
[`terminal-product-route.md`](./terminal-product-route.md#the-product-adapter-extension-seam)
|
|
400
398
|
for the full seam and the thin-adapter conformance proof.
|
|
401
399
|
|
|
402
|
-
## Making personas
|
|
400
|
+
## Making personas change the actor's behavior
|
|
403
401
|
|
|
404
402
|
The original bug, now fixed: `loadDryRunInputs` (`src/run/dry-run-inputs.ts`) parsed
|
|
405
403
|
persona YAML down to `{ id, name, source, sourceDigest }` and discarded `summary`,
|
|
@@ -459,7 +457,7 @@ traits: { patience, skill, accessibilityNeeds? }, constraints[], sourceDigest }`
|
|
|
459
457
|
- Stagehand remains roadmap. This rule once planned a pi binding (`systemPrompt` +
|
|
460
458
|
`beforeToolCall`) and a Claude Agent SDK one (`systemPrompt` + `allowedTools`). pi
|
|
461
459
|
shipped only as a trace mapper, the Claude Agent SDK descriptor never had a route, and
|
|
462
|
-
|
|
460
|
+
both were removed.
|
|
463
461
|
|
|
464
462
|
None of these uses a `max_turns`-style cap as the persona stop condition.
|
|
465
463
|
|
|
@@ -513,7 +511,7 @@ Non-obvious tradeoffs to revisit with real-run data:
|
|
|
513
511
|
- `persona-fidelity` treats a `gave_up` with no cited friction as a fidelity
|
|
514
512
|
failure, not an accepted stop, so the model cannot quietly quit for no reason.
|
|
515
513
|
|
|
516
|
-
|
|
514
|
+
So patience decides when a run stops, reproducibly, without ever using elapsed
|
|
517
515
|
turns as a stop signal.
|
|
518
516
|
|
|
519
517
|
## Capability matrix (target adapters)
|
|
@@ -525,41 +523,12 @@ turns as a stop signal.
|
|
|
525
523
|
| claude-agent-sdk (removed) | yes (SDK + `-p` stream-json) | typed ToolUse/ToolResult + cost | OS sandbox + dontAsk/allowedTools | Anthropic-centric | SDK MIT (CLI proprietary) | code, app |
|
|
526
524
|
| stagehand-cua (roadmap, not shipped; `openai-computer-use` is the shipped computer-use actor) | yes (SDK, mode:'cua') | structured results + replay | Playwright/Browserbase isolation | OpenAI/Anthropic/Google | MIT | computer-use |
|
|
527
525
|
|
|
528
|
-
## Sequencing
|
|
529
|
-
|
|
530
|
-
1. This document.
|
|
531
|
-
2. Shared `RedactionHooks` module (completes the remaining #107 criterion) plus
|
|
532
|
-
the `Actor` contract types, with the Codex integration refactored to implement
|
|
533
|
-
`Actor` and emit `ActorTrace` behind the back-compat alias. Add an
|
|
534
|
-
`actorRegistry`; generalize `RunStream.codex` to `RunStream.actor`.
|
|
535
|
-
3. Personas load-bearing: `ResolvedPersona`, `personaToDirectives`, harness turn
|
|
536
|
-
budget, and the `persona-fidelity` verify check.
|
|
537
|
-
4. `pi-agent-core` adapter (proves the contract against a non-Codex protocol;
|
|
538
|
-
local-model dogfood for ~$0). Landed in two slices: first the pure
|
|
539
|
-
`piSessionToActorTrace` mapper + registry generalization (discriminated
|
|
540
|
-
`ActorDescriptor` union + `getActor` overloads) + a fixture conformance test,
|
|
541
|
-
with no pi dependency and no model key required (proves the evidence contract
|
|
542
|
-
is provider-neutral); then a follow-up live SDK shim behind a DI seam, deferred
|
|
543
|
-
until the package identity (`@earendil-works/pi-agent-core` vs
|
|
544
|
-
`@mariozechner/pi-coding-agent`) and the Node `>=22.19` vs engines `>=20` gap
|
|
545
|
-
are pinned against an installed build. The live shim never landed, and #955
|
|
546
|
-
removed the mapper-only descriptor because no route dispatched it.
|
|
547
|
-
5. `claude-agent-sdk` adapter (the `app` run kind). It shipped as a descriptor with
|
|
548
|
-
a live session but no route, and #955 removed it along with the `app` run kind.
|
|
549
|
-
6. Computer-use route. (Shipped as `openai-computer-use`: registered 0.3.0,
|
|
550
|
-
lab-dispatched 0.4.0; `stagehand-cua` as a multi-provider front remains
|
|
551
|
-
not-yet-shipped roadmap.)
|
|
552
|
-
7. Cross-harness conformance test: one persona x scenario through every adapter,
|
|
553
|
-
asserting identical trace shape, completion vocabulary, and redaction status.
|
|
554
|
-
8. The proof point: run the harness-plural loop against popular OSS repos and turn
|
|
555
|
-
real, merged issues into the receipt.
|
|
556
|
-
|
|
557
526
|
## Risks
|
|
558
527
|
|
|
559
528
|
- Protocol/version drift across four moving harnesses. Pin every binary/SDK and
|
|
560
529
|
assert the init handshake; the registry refuses an actor whose declared
|
|
561
530
|
capabilities do not satisfy the scenario.
|
|
562
|
-
- Screenshot PII in the computer-use route. Redaction binds the
|
|
531
|
+
- Screenshot PII in the computer-use route. Redaction binds the publish
|
|
563
532
|
boundary, not capture (0.6.0): raw frames stay local in gitignored
|
|
564
533
|
`.humanish/` and are never emitted by a publish command (this repo's CI
|
|
565
534
|
binary-asset scan also blocks them from commit);
|
|
@@ -578,4 +547,4 @@ turns as a stop signal.
|
|
|
578
547
|
|
|
579
548
|
- Self-driving harness principles: `docs/principles/self-driving-harness.md`.
|
|
580
549
|
- Observer architecture: `docs/architecture/observer.md`.
|
|
581
|
-
-
|
|
550
|
+
- Open issue: [a PII/PHI detector for the redaction gate](https://github.com/danielgwilson/humanish/issues/108).
|