humanish 0.15.2 → 0.15.3

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.
Files changed (40) hide show
  1. package/README.md +9 -4
  2. package/dist/actor-contract.d.ts +2 -3
  3. package/dist/actor-contract.js +6 -7
  4. package/dist/actor-contract.js.map +1 -1
  5. package/dist/actor-registry.d.ts +4 -4
  6. package/dist/actor-registry.js +8 -7
  7. package/dist/actor-registry.js.map +1 -1
  8. package/dist/artifact-reference.js +1 -1
  9. package/dist/artifact-reference.js.map +1 -1
  10. package/dist/concurrent-shared-world-lab.js +4 -4
  11. package/dist/concurrent-shared-world-lab.js.map +1 -1
  12. package/dist/e2b-terminal-lab.d.ts +18 -20
  13. package/dist/e2b-terminal-lab.js +28 -28
  14. package/dist/e2b-terminal-lab.js.map +1 -1
  15. package/dist/lab-config.d.ts +25 -26
  16. package/dist/lab-config.js +6 -6
  17. package/dist/lab-config.js.map +1 -1
  18. package/dist/lab-engine.d.ts +1 -1
  19. package/dist/lab-engine.js +8 -10
  20. package/dist/lab-engine.js.map +1 -1
  21. package/dist/program.js +1 -1
  22. package/dist/program.js.map +1 -1
  23. package/dist/terminal-agent-actor.d.ts +12 -7
  24. package/dist/terminal-agent-actor.js +18 -16
  25. package/dist/terminal-agent-actor.js.map +1 -1
  26. package/docs/architecture/actor-contract.md +32 -21
  27. package/docs/architecture/observer.md +15 -9
  28. package/docs/architecture/state-driven-executor.md +3 -3
  29. package/docs/architecture/terminal-product-lane.md +29 -25
  30. package/docs/contracts/adapter-fixtures.md +4 -2
  31. package/docs/contracts/core.md +9 -4
  32. package/docs/contracts/feedback.md +4 -2
  33. package/docs/contracts/policy.md +5 -3
  34. package/docs/contracts/run-bundle.md +5 -3
  35. package/docs/contracts/schemas.md +34 -23
  36. package/docs/goals/current.md +67 -18
  37. package/docs/ramp/README.md +32 -13
  38. package/docs/release/open-source-readiness.md +5 -4
  39. package/docs/release/public-readiness-standard.md +6 -1
  40. package/package.json +1 -1
@@ -1,27 +1,34 @@
1
1
  # Actor Contract
2
2
 
3
- Date: 2026-06-06 (updated 2026-06-11)
4
-
5
- Status: accepted design, partially implemented. Shipped: the evidence schema
6
- `humanish.actor-trace.v1` (`src/actor-contract.ts`) and a registry of five
7
- actors (`src/actor-registry.ts`: `codex-app-server`, `pi-agent-core`,
8
- `claude-agent-sdk`, `openai-computer-use`, `scripted-browser`), with
9
- `actors[0].type` a real dispatch key on the computer-use and scripted-browser
10
- lab routes. Not yet shipped (roadmap, not near-term claims): the full
11
- `Actor.run(input)` interface, `RedactionHooks` injection, `ApprovalPolicy`,
12
- `StagehandCuaActor`, and the `persona-fidelity` verify check. Decision 6's
13
- capture-time screenshot stance was recanted in 0.6.0; see the inline notes and
14
- the capture-vs-publish rule in
3
+ Date: 2026-06-06 (current-state note updated 2026-07-14)
4
+
5
+ Status: accepted contract with a partially open extension surface. Shipped:
6
+ the evidence schema `humanish.actor-trace.v1` (`src/actor-contract.ts`) and a
7
+ closed first-party registry of six descriptors (`src/actor-registry.ts`:
8
+ `codex-app-server`, `pi-agent-core`, `claude-agent-sdk`,
9
+ `openai-computer-use`, `scripted-browser`, `codex-exec`). `actors[0].type` is a
10
+ real dispatch key on the computer-use, scripted-browser, and terminal-product
11
+ routes. Product scoring, feedback, and artifact hooks are extension seams, but
12
+ public out-of-tree actor registration and its conformance certification are not
13
+ shipped. Also not shipped: the full `Actor.run(input)` interface,
14
+ `RedactionHooks` injection, `ApprovalPolicy`, `StagehandCuaActor`, and the
15
+ `persona-fidelity` verify check. Decision 6's capture-time screenshot stance
16
+ was recanted in 0.6.0; see the inline notes and the capture-vs-publish rule in
15
17
  [`docs/principles/invariants-and-defaults.md`](../principles/invariants-and-defaults.md).
16
18
 
19
+ `codex-exec` is a real dispatch key for terminal-product labs, but the exported
20
+ descriptor `runSession` is a fail-closed compatibility entry. Live execution is
21
+ owned by `runTerminalProductLab`, which coordinates sandbox creation,
22
+ command-scoped runtime auth, evidence, caps, and by-id cleanup.
23
+
17
24
  ## Context
18
25
 
19
- > 2026-06-11: this section describes the world as it stood when the design was
20
- > accepted (one real actor, hardcoded dispatch). That ceiling has since been
21
- > removed the registry now holds the four actors listed in the status note.
26
+ > Historical context: this section describes the world as it stood when the
27
+ > design was accepted (one real actor, hardcoded dispatch). The current state is
28
+ > the six-descriptor first-party registry described in the status note above.
22
29
 
23
- An actor is the thing that drives a persona scenario and produces evidence. Today
24
- Humanish has exactly one real actor: the local Codex integration in
30
+ An actor is the thing that drives a persona scenario and produces evidence. At
31
+ design time Humanish had exactly one real actor: the local Codex integration in
25
32
  `src/codex-app-server.ts` (plus the `codex-exec` and `codex-tui` variants in
26
33
  `src/run.ts`). The actor selection is a hardcoded `if (actor === ...)` dispatch,
27
34
  `RunStream.codex` is Codex-shaped, and the evidence schema is
@@ -91,6 +98,9 @@ API surface.
91
98
 
92
99
  ## The contract
93
100
 
101
+ The excerpt below shows the central contract fields; exported source types are
102
+ authoritative.
103
+
94
104
  ```ts
95
105
  export const ACTOR_TRACE_SCHEMA = "humanish.actor-trace.v1";
96
106
 
@@ -127,20 +137,21 @@ export interface ActorTraceItem {
127
137
  export interface ActorCapabilities {
128
138
  headless: boolean;
129
139
  structuredTrace: boolean;
130
- lanes: Array<"code" | "app" | "computer-use" | "scripted-browser">;
140
+ lanes: Array<"code" | "app" | "computer-use" | "scripted-browser" | "terminal">;
131
141
  producesScreenshots: boolean;
132
142
  byoModel: boolean;
133
143
  preGrantableApprovals: boolean; // can run unattended without a human prompt
134
144
  inProcessTools: boolean; // can inject product tools without a subprocess
135
145
  license: "open" | "source-available" | "proprietary";
146
+ keyPlacement?: "external" | "in-sandbox-command-scoped";
136
147
  }
137
148
 
138
149
  export interface ActorTrace {
139
150
  schema: typeof ACTOR_TRACE_SCHEMA;
140
- provider: string; // "codex-app-server" | "pi-agent-core" | "claude-agent-sdk" | "openai-responses-cu" | "browser-persona"
151
+ provider: string; // e.g. "codex-app-server" | "pi-agent-core" | "claude-agent-sdk" | "openai-responses-cu" | "browser-persona" | "codex"
141
152
  providerVersion?: string;
142
- protocol: "json-rpc" | "json-stream" | "in-process-sdk" | "cua-loop" | "scripted-steps";
143
- lane: "code" | "app" | "computer-use" | "scripted-browser";
153
+ protocol: "json-rpc" | "json-stream" | "in-process-sdk" | "cua-loop" | "scripted-steps" | "terminal-exec";
154
+ lane: "code" | "app" | "computer-use" | "scripted-browser" | "terminal";
144
155
  persona: { id: string; traitsApplied: string[]; promptDigest: string }; // proves traits were threaded
145
156
  // "raw" = full-fidelity frames retained (valid for LOCAL use; redact before
146
157
  // publishing); "blurred"/"ocr_scrubbed" = publish-safe; "n/a" = none captured.
@@ -1,16 +1,22 @@
1
1
  # Observer Architecture
2
2
 
3
- Date: 2026-06-01
3
+ Date: 2026-06-01 (current-state note updated 2026-07-14)
4
4
 
5
- Status: implemented for synthetic stream contracts and local `codex-exec`
6
- active-run Observer snapshots; broader live actor adapters next.
5
+ Status: implemented for synthetic streams and persisted live browser,
6
+ terminal-product, fan-out, and sequential/concurrent shared-world evidence.
7
+ Plain computer-use and shared-world runs can publish an in-progress bundle to
8
+ an attached loopback Observer without persisting runtime stream-auth URLs. The
9
+ version-pinned README image is a synthetic technical sample, not real-application
10
+ proof.
7
11
 
8
12
  ## Decision
9
13
 
10
14
  The Observer is a mission-control surface over durable run artifacts, not a
11
15
  static report page.
12
16
 
13
- Every run writes immutable local evidence under `.humanish/runs/<run-id>/`:
17
+ Every run writes durable local evidence under `.humanish/runs/<run-id>/`. Active
18
+ runs refresh their bundle and Observer projection; later review, feedback, or
19
+ Observer commands may add derived artifacts:
14
20
 
15
21
  ```text
16
22
  .humanish/runs/<run-id>/
@@ -25,7 +31,7 @@ Every run writes immutable local evidence under `.humanish/runs/<run-id>/`:
25
31
 
26
32
  `run.json` remains the source bundle. `observer/observer-data.json` is the
27
33
  normalized view model consumed by the Observer. `events.ndjson` is the appendable
28
- event stream contract that live adapters will update while a run is active.
34
+ event stream contract that live adapters update while a run is active.
29
35
 
30
36
  ## Stream Model
31
37
 
@@ -95,12 +101,12 @@ A host adapter may provide:
95
101
  If no embed URL exists, the Observer still renders the Codex-style timeline and
96
102
  session contract instead of failing the lane.
97
103
 
98
- ## Current Gaps
104
+ ## Historical slice and remaining gaps
99
105
 
100
- This slice implemented the Observer substrate, synthetic stream contracts, and
101
- active-run Observer snapshots for local `codex-exec`.
106
+ The original 2026-06-01 slice implemented the Observer substrate and synthetic
107
+ stream contracts; local `codex-exec` active-run snapshots followed.
102
108
 
103
- Since shipped (updated 2026-06-11):
109
+ Subsequent additions through 2026-06-11 included:
104
110
 
105
111
  - Playwright-backed browser proof with scripted, app-specific
106
112
  `browser.steps` authored in `humanish/scenarios/*.yaml` (`src/run.ts`);
@@ -134,9 +134,9 @@ import { runLab, parseLabConfig, type CuaExecutor, type CuaProvider } from "huma
134
134
 
135
135
  // local-app YAML (shareable; fails closed without hooks):
136
136
  // schema: humanish.lab.v2
137
- // id: pixel-bae-state
137
+ // id: downstream-local-app-state
138
138
  // subject: { source: local-app, appUrl: http://localhost:5173 }
139
- // actors: [{ type: openai-computer-use, persona: pixel-pat, mission: "…" }]
139
+ // actors: [{ type: openai-computer-use, persona: curious-tester, mission: "…" }]
140
140
  // scenario: { mode: live }
141
141
  const parsed = parseLabConfig(yaml);
142
142
  if (!parsed.ok) throw new Error(parsed.error.message);
@@ -199,5 +199,5 @@ Read every optional field defensively, and spread-omit optional fields
199
199
  surface with no precedent in this repo (the scripted lane loads only declarative
200
200
  YAML; serve commands run isolated inside the disposable E2B sandbox). It earns
201
201
  its place only behind its own clamping / trust / digest-pinning design.
202
- pixel-bae does not need it: a library caller builds the bridge in their own
202
+ the validated library consumer does not need it: a caller builds the bridge in its own
203
203
  trusted code (entry point 2 above).
@@ -1,11 +1,14 @@
1
1
  # Terminal-product real-agent lane (issue #154)
2
2
 
3
- Date: 2026-06-16
4
-
5
- Status: SLICE 1 shipped the config + routing skeleton, DRY-RUN only. The live
6
- in-sandbox backend, the command-scoped credential boundary, cleanup,
7
- interventions, the cost/no-spend ledger, and the product-adapter extension seam
8
- are later slices. See the ratified goal packet
3
+ Date: 2026-06-16 (current-state note updated 2026-07-14)
4
+
5
+ Status: live terminal-product route shipped in `0.8.0`. The in-sandbox backend,
6
+ command-scoped credential placement, exact-id cleanup proof, an interventions ledger,
7
+ cost/no-spend ledger, caps, and product scoring/feedback hooks are implemented;
8
+ the kept 2026-07-09 live receipt verifies 15/15 checks and `share_ready` at a
9
+ `$0` cap. That capability receipt is not adopter replacement: no deletion
10
+ branch has yet removed the reference adopter's bespoke generic study harness.
11
+ See the ratified goal packet
9
12
  ([`docs/goals/terminal-product-lane/goal.md`](../goals/terminal-product-lane/goal.md))
10
13
  for the full slice plan and the safety contract.
11
14
 
@@ -33,7 +36,7 @@ fail-closed cross-validation, and forward-declared warnings.
33
36
  | `subject.product` | `{ name, publicSurfaces[] }` — the only world the agent sees |
34
37
  | `execution.target` | `e2b-terminal` (or absent → implied) |
35
38
  | `execution.terminal` | `{ transport: exec-stream, stdin: disabled }` |
36
- | `execution.runtimeAuth` | `openai-env` (names-only evidence this slice) |
39
+ | `execution.runtimeAuth` | `openai-env` (names-only durable evidence) |
37
40
  | `scenario.caps` | `{ maxUsd, maxJobs, maxMinutes }` — the blast-radius budget |
38
41
  | `policies` | `allowPrivateRepoAccess` / `allowProviderCredentials` / `allowPaymentCredentials` / `allowGitHubMutation`, all DEFAULT FALSE |
39
42
  | `actors[0].type` | `codex-exec` — a registered terminal actor (`keyPlacement: in-sandbox-command-scoped`) |
@@ -54,16 +57,16 @@ blast radius is bounded by key scoping and budgets, not by hoping.*
54
57
 
55
58
  The inversion is declared as registry metadata, not a code convention: the
56
59
  terminal actor's capabilities carry `keyPlacement: "in-sandbox-command-scoped"`.
57
- SLICE 1 ships the DECLARED field + value (the contract is honest about where the
58
- key would go); SLICE 2's engine enforces command-scoped injection (only into the
60
+ SLICE 1 shipped the DECLARED field + value (the contract was honest about where
61
+ the key would go); SLICE 2's engine added command-scoped injection (only into the
59
62
  per-command `envs` of the `codex` invocation, never `Sandbox.create({envs})`)
60
63
  keyed off that capability, plus the deny-by-default credential allowlist, the
61
64
  positive-allowlist sandbox metadata, the cleanup proof, the interventions ledger,
62
65
  and a minimal fail-closed cap.
63
66
 
64
- ## SLICE 1 scope (DRY-RUN only what is honest now)
67
+ ## Historical SLICE 1 scope (DRY-RUN only when shipped)
65
68
 
66
- `runTerminalProductLab` implements ONLY the dry-run path: it builds a valid
69
+ At SLICE 1, `runTerminalProductLab` implemented only the dry-run path: it built a valid
67
70
  `humanish.run-bundle.v1` contract bundle, honestly labeled contract-only, with:
68
71
 
69
72
  - the subject declared as a terminal-product with its public surfaces, provenance
@@ -76,22 +79,22 @@ and a minimal fail-closed cap.
76
79
  - a terminal-kind stream that is an honest **contract placeholder**: stdin
77
80
  disabled, empty tail, `transport: snapshot` — **not** `pty` (captured
78
81
  non-interactive exec output is never an interactive PTY; invariant 6 + the
79
- goal packet's PTY ruling). SLICE 2 fills the redacted exec-stream capture;
82
+ goal packet's PTY ruling). SLICE 2 later added redacted exec-stream capture;
80
83
  - empty/placeholder ledgers (substrate lifecycle, command log, terminal event
81
- stream, interventions, cost) that SLICE 2/3 fill.
84
+ stream, interventions, cost) that SLICE 2/3 later filled.
82
85
 
83
- The dry-run bundle passes the EXISTING `verifyRun`. Terminal-specific verifier
86
+ The dry-run bundle passed the existing `verifyRun`. Terminal-specific verifier
84
87
  checks (terminal/transcript presence, lifecycle, cleanup, interventions,
85
- metadata allowlist, no-credential-in-artifacts, no-spend) are SLICE 2/3.
88
+ metadata allowlist, no-credential-in-artifacts, no-spend) landed in SLICE 2/3.
86
89
 
87
- A non-dry-run (live) call returns a structured `HUMANISH_TERMINAL_AGENT_NOT_IMPLEMENTED`
88
- failure (fail-closed, clear code) — it never creates a sandbox, never injects a
89
- key, never spends. SLICE 2 implements the real session.
90
+ At SLICE 1, a non-dry-run call returned a structured
91
+ `HUMANISH_TERMINAL_AGENT_NOT_IMPLEMENTED` failure before launch or spend.
92
+ SLICE 2 implemented the real session.
90
93
 
91
94
  The DI seams SLICE 2 needs (`loadModule`, `buildSandbox`, `runtimeAuthEnv`,
92
95
  `detachedTimers`) are declared on `TerminalProductLabHooks` and threaded through
93
- `RunLabOptions.terminalHooks`, mirroring `cuaHooks` / `scriptedHooks` but only
94
- the dry-run path is implemented this slice.
96
+ `RunLabOptions.terminalHooks`, mirroring `cuaHooks` / `scriptedHooks`; only the
97
+ dry-run path was implemented in that slice.
95
98
 
96
99
  ## SLICE 4 — the product-adapter extension seam (layer 6)
97
100
 
@@ -130,12 +133,13 @@ any malformed score/candidate with a warning, and `verifyRun` re-checks the
130
133
  surviving shapes — a bad extension never poisons a verifiable bundle. Proven by
131
134
  `tests/terminal-product-adapter-seam.test.ts` (a thin in-repo example adapter
132
135
  typing against the barrel only, registering a scorer, attaching namespaced nouns,
133
- emitting a candidate; the bundle verifies). No live rung the seam is contract,
134
- not spend.
136
+ emitting a candidate; the bundle verifies). At SLICE 4 this was contract proof,
137
+ not a live rung; the later end-to-end lane receipt is linked from the status
138
+ note.
135
139
 
136
- The adopter's real scorecard is its OWN thin extension; the live receipt for the
137
- end-to-end lane is tracked under #159, and true duplex PTY replay is deferred to
138
- SLICE 5.
140
+ The adopter's real scorecard is its OWN thin extension. The end-to-end lane's
141
+ live receipt is kept under the terminal-product goal, and true duplex PTY replay
142
+ is deferred to SLICE 5.
139
143
 
140
144
  ## The reference adopter (codename-neutral)
141
145
 
@@ -1,8 +1,10 @@
1
1
  # Adapter Fixture Parity Contract
2
2
 
3
- Date: 2026-06-02
3
+ Date: 2026-06-02 (current-state note updated 2026-07-14)
4
4
 
5
- Status: v0 draft contract for public-safe adapter fixture parity.
5
+ Status: committed contract fixtures with passing parity checks. A fixture
6
+ proves that core can carry an adapter-owned evidence shape; it does not prove a
7
+ live adopter integration or satisfy a deletion-branch depth phase.
6
8
 
7
9
  ## Purpose
8
10
 
@@ -1,8 +1,11 @@
1
1
  # Core Contract
2
2
 
3
- Date: 2026-06-02
3
+ Date: 2026-06-02 (current-state note updated 2026-07-14)
4
4
 
5
- Status: v0 draft contract with tested primitive helpers in `src/core`.
5
+ Status: the listed primitives are shipped and tested. This document does not
6
+ claim that every producer already uses one centralized store: run identity,
7
+ history, and provider-resource lifecycle still span route-specific code and
8
+ remain consolidation work.
6
9
 
7
10
  ## Purpose
8
11
 
@@ -19,7 +22,9 @@ setup, or repository-specific proof language.
19
22
  Core records must be safe to include in public run bundles by default:
20
23
 
21
24
  - artifact paths are relative;
22
- - run ids contain only lowercase letters, numbers, and dashes;
25
+ - ids produced by the core run-id builder contain only lowercase letters,
26
+ numbers, and dashes; runtime readers separately accept existing IDs that are
27
+ any safe single path segment;
23
28
  - git state summarizes status without branch names, remotes, file names, file
24
29
  paths, or absolute working directories;
25
30
  - lifecycle and timing records are explicit inputs, not inferred prose;
@@ -29,7 +34,7 @@ Core records must be safe to include in public run bundles by default:
29
34
 
30
35
  | Primitive | Contract |
31
36
  | --- | --- |
32
- | Run id | Deterministic from explicit prefix, timestamp, and entropy; valid ids match `^[a-z0-9][a-z0-9-]{0,127}$`. |
37
+ | Run id | The core builder is deterministic from explicit prefix, timestamp, and entropy, and emits ids matching `^[a-z0-9][a-z0-9-]{0,127}$`. Runtime artifact binding uses the broader compatibility rule in `src/run-paths.ts`: one non-empty segment, excluding `.`, `..`, separators, and NUL. |
33
38
  | Artifact layout | Builds stable relative pointers under `.humanish/runs/<run-id>/` plus `.humanish/runs/latest.json`. |
34
39
  | Latest pointer | `{ schema, runId, path, updatedAt }` using `humanish.latest-run.v1`. |
35
40
  | History entry | `{ schema, runId, createdAt, mode, path }` using `humanish.run-history-entry.v1`. |
@@ -1,8 +1,10 @@
1
1
  # Feedback Contract
2
2
 
3
- Date: 2026-06-01
3
+ Date: 2026-06-01 (current-state note updated 2026-07-14)
4
4
 
5
- Status: v0 local issue draft generation with run-candidate support.
5
+ Status: local feedback candidate, draft, verification, Markdown, and issue-URL
6
+ generation are shipped. These commands do not mutate GitHub, and public output
7
+ fails closed unless the run verifies as `share_ready`.
6
8
 
7
9
  ## Purpose
8
10
 
@@ -1,9 +1,11 @@
1
1
  # Policy Contract
2
2
 
3
- Date: 2026-06-02
3
+ Date: 2026-06-02 (current-state note updated 2026-07-14)
4
4
 
5
- Status: v0 draft contract for credential, network, spend, redaction, and
6
- assisted-run boundaries.
5
+ Status: shipped policy reference for credential, network, spend, redaction,
6
+ sharing, and assisted-run boundaries. Support remains route-specific; the
7
+ parser, route validation, and verifier determine whether a declared field is
8
+ consumed, rejected, or reported as a warning.
7
9
 
8
10
  Safety amendment (2026-07-14): beginning with `0.15.1`, stored provider IDs are
9
11
  evidence and never authorize core provider mutation. The bundled OSS meta-lab
@@ -1,9 +1,11 @@
1
1
  # Run Bundle Contract
2
2
 
3
- Date: 2026-06-02
3
+ Date: 2026-06-02 (current-state note updated 2026-07-14)
4
4
 
5
- Status: v0 draft contract for bundle identity, layout, source state, history,
6
- lifecycle, and timing primitives.
5
+ Status: `humanish.run-bundle.v1` is the shipped evidence contract. The
6
+ TypeScript shape and fail-closed verification in `src/run.ts` are
7
+ authoritative; this document explains the stable public fields and extension
8
+ rules rather than independently versioning the runtime.
7
9
 
8
10
  ## Purpose
9
11
 
@@ -1,10 +1,12 @@
1
1
  # Contract Schema Index
2
2
 
3
- Date: 2026-06-02 (updated 2026-06-24)
3
+ Date: 2026-06-02 (current-state note updated 2026-07-14)
4
4
 
5
- Status: schema map aligned to the shipped v0.6.x surface. Rows marked
6
- "reserved" name layering intent only no code emits or validates them yet.
7
- Do not emit a reserved schema.
5
+ Status: reference map for the major contracts shipped through source version
6
+ `0.15.3`; it is not an exhaustive inventory of command/result envelopes. Exported types,
7
+ schema constants, parsers, and validators in `src/` are authoritative. Rows
8
+ marked "reserved" name layering intent only — no code emits or validates them
9
+ yet. Do not emit a reserved schema.
8
10
 
9
11
  ## Purpose
10
12
 
@@ -110,9 +112,13 @@ A lab is a composition over code primitives, not a hardcoded kind:
110
112
  appear in `subject.env`) pointing at state the lab does not control,
111
113
  recorded as UNPINNED in provenance. Commands persist in evidence as
112
114
  sha256-16 digests only, never as text;
113
- - `actors`: who drives it. On the computer-use and scripted-browser routes
114
- `actors[0].type` is a real dispatch key resolved against the actor registry;
115
- elsewhere it is a descriptive label (e.g. `synthetic-persona`).
115
+ - `actors`: who drives it. On computer-use (including shared-world),
116
+ scripted-browser, and terminal-product routes, `actors[0].type` is a real
117
+ dispatch key resolved against the actor registry. On synthetic and meta-lab
118
+ routes it remains a descriptive label (e.g. `synthetic-persona`). The
119
+ `codex-exec` descriptor's direct `runSession` member is a fail-closed
120
+ compatibility entry, not the live runner; the terminal-product lab route
121
+ owns the live sandbox, auth, cap, evidence, and cleanup lifecycle.
116
122
  `actors[0].count` carries route-specific meanings: synthetic route lane
117
123
  count (simCount); scripted-browser route surface roster (1 = desktop,
118
124
  2 = desktop + mobile, default 1); computer-use **E2B** route the HOMOGENEOUS
@@ -188,12 +194,14 @@ A lab is a composition over code primitives, not a hardcoded kind:
188
194
  `terminal.transport` is `exec-stream` — captured NON-interactive exec output
189
195
  (stdin disabled); `pty` is rejected because labeling captured exec output as
190
196
  an interactive PTY would overstate the mechanism (invariant 6; a true duplex
191
- PTY transport is a deferred slice). `terminal.stdin` defaults to `disabled`
197
+ PTY transport does not ship). `terminal.stdin` defaults to `disabled`
192
198
  (`sent`/assisted input is rejected until the interventions ledger + a
193
199
  non-comparable marker exist). `runtimeAuth: openai-env` declares the agent's
194
- runtime-auth channel — recorded as NAMES ONLY; the command-scoped injection
195
- (`keyPlacement: in-sandbox-command-scoped`) is enforced by the engine in a
196
- later slice;
200
+ runtime-auth channel — recorded as NAMES ONLY. On a live run, the engine
201
+ resolves the registered terminal descriptor and requires
202
+ `keyPlacement: in-sandbox-command-scoped` before creating a sandbox. The key
203
+ is passed only to the agent command, never to `Sandbox.create` or metadata;
204
+ a dry-run neither reads nor injects it;
197
205
  - `scenario`: `mode: dry-run` (contract evidence, no spend) or `live`.
198
206
  `scenario.ref` is CONSUMED (and REQUIRED) on the scripted-browser route: it
199
207
  resolves a committed scenario (`humanish/scenarios/<ref>.yaml` or a repo
@@ -483,9 +491,10 @@ world ("M of N"); PROVEN CONCURRENCY (overlapping windows); and system-state evo
483
491
  under load (the stateSeries) with best-effort temporal correlation. It CANNOT claim
484
492
  strict causal attribution of a delta to an actor (concurrent ⇒ ambiguous), determinism
485
493
  of exact state, per-action granularity, or concurrency-SAFETY (races are OBSERVED, never
486
- PROVEN absent). HONESTY: the deterministic $0 gate proves the plumbing + the attribution
487
- contract; the concurrency CAPABILITY at scale is backed only by a separately-authorized
488
- live receipt.
494
+ PROVEN absent). HONESTY: the deterministic $0 gate proves the plumbing + the
495
+ attribution contract. A kept 2026-06-17 live receipt separately proves one
496
+ bounded three-persona trial against a synthetic plane. Neither the deterministic
497
+ gate nor that receipt proves scale, repeatability, or adopter-harness replacement.
489
498
 
490
499
  ## Adapter
491
500
 
@@ -639,27 +648,29 @@ inside run bundles (per-stream transport and status) and lab execution config
639
648
 
640
649
  ## Terminal Cost Ledger And No-Spend Proof
641
650
 
642
- The terminal-product lane (`src/e2b-terminal-lab.ts`) places a real provider key
643
- INSIDE the sandbox, so the no-spend claim must be REAL derived from a ledger,
644
- never asserted. The live run writes both to `terminal-ledgers.json` (a `cost`
645
- block + a `noSpendProof` block, additive to `humanish.terminal-ledgers.v1`).
651
+ The terminal-product lane (`src/e2b-terminal-lab.ts`) passes a real provider key
652
+ only to the in-sandbox agent command, never to sandbox-global env or metadata,
653
+ so the no-spend claim must be REAL derived from a ledger, never asserted. The
654
+ live run writes both to `terminal-ledgers.json` (a `cost` block + a
655
+ `noSpendProof` block, additive to `humanish.terminal-ledgers.v1`).
646
656
 
647
657
  The cost ledger (`humanish.terminal-cost-ledger.v1`) has one line per category —
648
658
  `product`, `media`, `payment`, `provider` — and follows a strict **null
649
659
  discipline** that distinguishes three states and never conflates them:
650
660
 
651
661
  - `usd: 0` — **known zero**: the category was metered and billed nothing.
652
- - `usd: null` — **not measured**: no spend signal exists for the category this
653
- slice. `null` is written explicitly (never `undefined`-omitted, never guessed
662
+ - `usd: null` — **not measured**: no spend signal exists for the category on
663
+ this run. `null` is written explicitly (never `undefined`-omitted, never guessed
654
664
  to `0`). A line with `null` says "this category exists but we did not measure
655
665
  it"; the no-spend proof reports it as unmeasured and does NOT claim it is zero.
656
666
  - line **absent** — **not applicable** (n/a) to the lane/run.
657
667
 
658
668
  `knownTotalUsd` sums ONLY the non-null lines (a `null` line contributes nothing
659
669
  and is never coerced to `0`); `fullyMeasured` is true only when no line is null.
660
- This slice meters only the `provider` line, populated from the actor trace's
661
- `tokenUsage.costUsd` when present (else `null`); `product`/`media`/`payment` are
662
- `null` until the SLICE-4 adapter supplies them.
670
+ Core meters only the `provider` line, populated from the actor trace's
671
+ `tokenUsage.costUsd` when present (else `null`); `product`/`media`/`payment`
672
+ remain `null` unless an adapter supplies those signals through the shipped
673
+ cost-probe seam.
663
674
 
664
675
  ```yaml
665
676
  schema: humanish.terminal-cost-ledger.v1
@@ -1,6 +1,6 @@
1
1
  # Current Goals
2
2
 
3
- Status date: 2026-07-14 (rev 14)
3
+ Status date: 2026-07-14 (rev 15)
4
4
 
5
5
  This page is the current public-safe operating goal for `humanish`. Keep it
6
6
  short enough to reread before a coding session and concrete enough that future
@@ -16,7 +16,39 @@ Humanish should be the open-source CLI that lets a maintainer ask:
16
16
  The answer should be observable, verifiable, public-safe, and easy to turn into
17
17
  actionable feedback.
18
18
 
19
- ## Current Safety State (`0.15.1`)
19
+ ## Current Program Truth (source `0.15.3`)
20
+
21
+ The package source and repository implementation in this tree agree on these
22
+ points:
23
+
24
+ The immutable 2026-06-10 proof-roadmap packet is paired with a
25
+ [current implementation checkpoint](https://github.com/danielgwilson/humanish/blob/main/docs/goals/proof-roadmap/README.md).
26
+
27
+ | Surface | Shipped | Still unproven or unbuilt |
28
+ | --- | --- | --- |
29
+ | Actor execution | Six first-party registry descriptors; computer-use, scripted-browser, and terminal-product dispatch paths | Public out-of-tree actor registration and conformance certification |
30
+ | Persona scale | Bounded per-lane-world fan-out, including differentiated lanes and roster expansion; kept deterministic and live receipts | A completed first-party deletion branch that replaces a bespoke generic harness |
31
+ | Shared state | Sequential and concurrent single-origin shared-world execution; sequential has deterministic proof, concurrent has deterministic and kept live proof | Multi-origin shared-world runtime/schema support; real-adopter deletion proof |
32
+ | Subject sources/routes | Six declared sources: `this-repo`, `clone`, `app-url`, `local-app`, `terminal-product`, and `local-tree`; support is route-specific and `this-repo` remains dry-run-only | One centralized run/resource lifecycle boundary across all routes |
33
+ | Public proof | Version-pinned synthetic Observer sample shipped in the npm payload | A legible Observer hero from one verified real public-application run |
34
+ | OSS meta-lab | Dry-run contract and separate disposable smoke harness | Live meta-lab execution; disabled until repository instructions and actor credentials have an isolated boundary |
35
+
36
+ Capability proof and adopter replacement are different gates. A deterministic
37
+ test or kept live receipt proves that a Humanish mechanism works. The depth-axis
38
+ goal is met only when an adopter produces decision-equivalent evidence on a
39
+ green branch that deletes its bespoke generic harness and retains at most a
40
+ thin product-specific extension. No first-party deletion branch had met that
41
+ bar as of this status date.
42
+
43
+ Multi-origin shared-world has a ratified core-design direction, but the
44
+ implementation gate is still closed. A real adopter must first show a concrete
45
+ cross-origin need that the single-origin path or a downstream facade cannot
46
+ serve cleanly; the implementation packet then requires maintainer review before
47
+ build work starts. The current amendment is
48
+ [`docs/goals/multi-origin-shared-world/README.md`](https://github.com/danielgwilson/humanish/blob/main/docs/goals/multi-origin-shared-world/README.md);
49
+ the dated design packet remains unchanged.
50
+
51
+ ## Current Safety Boundary
20
52
 
21
53
  - Managed run, Observer, feedback, lab, actor-output, and source-archive paths
22
54
  bind to validated physical filesystem identities and fail closed on unsafe
@@ -241,8 +273,9 @@ ONE shared world.
241
273
  host-side commit/dirty when the packed root is a git work tree; local-tree has no repo/publicRepo
242
274
  field. The N actor desktops on the concurrent route still drive the harness-minted getHost URL
243
275
  exactly as before; only the subject's provisioning + provenance source changed. The multi-origin
244
- design (`docs/goals/multi-origin-shared-world/design.md`) remains a separate, still-held
245
- downstream slice. `next patch`
276
+ design (`docs/goals/multi-origin-shared-world/design.md`) remains a separate,
277
+ ratified but implementation-gated downstream slice. It is not part of
278
+ `0.15.3`.
246
279
 
247
280
  Adopter-driven engine features (0.11.0; surfaced by real bespoke-sim migrations):
248
281
 
@@ -302,7 +335,7 @@ Evidence hygiene and readback polish (0.12.16):
302
335
  (`local_only`), while feedback draft/issue commands require `share_ready` and fail
303
336
  closed with structured reasons. `done`
304
337
 
305
- Attached CUA live Observer (next patch):
338
+ Attached CUA live Observer (shipped):
306
339
 
307
340
  - Plain computer-use labs now honor the same attached `onObserverReady` lifecycle as shared-world
308
341
  labs: a live CUA run writes an in-progress bundle before actor sessions complete, loopback
@@ -356,7 +389,7 @@ Minimum acceptance:
356
389
  Make the maintainer `oss` lab report nested lane health back into the
357
390
  top-level Observer instead of relying on a human watching the desktops.
358
391
 
359
- The `0.15.1` safety state above governs this lane. The completed bullets below
392
+ The current safety boundary above governs this lane. The completed bullets below
360
393
  record prior capability and evidence shape; they do not mean the live
361
394
  entrypoint is currently enabled.
362
395
 
@@ -414,15 +447,31 @@ Stop and correct course if:
414
447
 
415
448
  ## Best Next Work
416
449
 
417
- The next most useful engineering slice is repeated agent dogfood against real
418
- apps and tools, while preserving the public-safety boundary:
419
-
420
- - public/open-source fixture proof for publishable examples;
421
- - private maintainer dogfood through the repo-only public-safe packet, which is
422
- intentionally not part of the npm payload, at
423
- [`docs/goals/private-repo-agent-dogfood/goal.md`](https://github.com/danielgwilson/humanish/blob/main/docs/goals/private-repo-agent-dogfood/goal.md);
424
- - then richer provider-backed app-specific browser persona manifests.
425
-
426
- That sequence keeps the package honest: first prove a new maintainer or agent
427
- can start, then prove Humanish can observe real product behavior, then use the
428
- failures to improve the harness.
450
+ After the public-truth reset, take one bounded public-proof side task: capture a
451
+ verified, legible four-lane Observer from a commit-pinned public application.
452
+ That run treats the application as a study subject, not a Humanish adopter, and
453
+ must not imply endorsement. Stop and return to this order if the capture would
454
+ require an Observer redesign or broader architecture work.
455
+
456
+ The next engineering proof slice remains the first depth-axis deletion branch:
457
+ run an existing first-party consumer web-app study through current Humanish,
458
+ compare the decision outputs, and delete the adopter's bespoke generic harness
459
+ while retaining only a thin product extension. The public-application capture
460
+ does not satisfy this depth gate.
461
+
462
+ After that checkpoint, re-evaluate this order rather than treating it as an
463
+ automatic queue:
464
+
465
+ 1. centralize run identity, history, and provider ownership behind tested
466
+ `RunStore` and `ResourceLease` interfaces, and make generated first-run
467
+ source load-bearing or explicitly optional;
468
+ 2. complete the agent-skill deletion branch and use it to force the real
469
+ external extension budget;
470
+ 3. implement multi-origin shared-world only if its adopter gate opens and the
471
+ ratified packet passes maintainer review;
472
+ 4. complete the multi-app adopter deletion branch;
473
+ 5. establish the external stratified panel.
474
+
475
+ The existing version-pinned README hero is a synthetic technical sample. It
476
+ proves package/Observer rendering and public-safe asset delivery, not
477
+ real-application evidence.