humanish 0.80.0 → 0.82.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.
Files changed (69) hide show
  1. package/README.md +121 -615
  2. package/dist/actor-contract.d.ts +30 -0
  3. package/dist/actor-contract.js.map +1 -1
  4. package/dist/chrome-cdp-probe.js +13 -0
  5. package/dist/chrome-cdp-probe.js.map +1 -1
  6. package/dist/computer-use.d.ts +13 -3
  7. package/dist/computer-use.js +179 -15
  8. package/dist/computer-use.js.map +1 -1
  9. package/dist/cua-actor-lab.d.ts +20 -8
  10. package/dist/cua-actor-lab.js +154 -49
  11. package/dist/cua-actor-lab.js.map +1 -1
  12. package/dist/e2b-desktop-executor.d.ts +9 -1
  13. package/dist/e2b-desktop-executor.js +67 -4
  14. package/dist/e2b-desktop-executor.js.map +1 -1
  15. package/dist/e2b-desktop-launch.d.ts +36 -1
  16. package/dist/e2b-desktop-launch.js +88 -1
  17. package/dist/e2b-desktop-launch.js.map +1 -1
  18. package/dist/e2b-desktop-resources.d.ts +11 -0
  19. package/dist/e2b-desktop-resources.js +33 -0
  20. package/dist/e2b-desktop-resources.js.map +1 -0
  21. package/dist/e2b-desktop-screenshot-cleanup.d.ts +15 -0
  22. package/dist/e2b-desktop-screenshot-cleanup.js +67 -0
  23. package/dist/e2b-desktop-screenshot-cleanup.js.map +1 -0
  24. package/dist/e2b-terminal-lab.d.ts +5 -2
  25. package/dist/e2b-terminal-lab.js +238 -86
  26. package/dist/e2b-terminal-lab.js.map +1 -1
  27. package/dist/first-run-path.js +2 -2
  28. package/dist/first-run-path.js.map +1 -1
  29. package/dist/index.d.ts +3 -3
  30. package/dist/index.js +1 -1
  31. package/dist/index.js.map +1 -1
  32. package/dist/lab-config.d.ts +15 -14
  33. package/dist/lab-config.js +11 -2
  34. package/dist/lab-config.js.map +1 -1
  35. package/dist/observer-data.d.ts +2 -0
  36. package/dist/observer-data.js +10 -1
  37. package/dist/observer-data.js.map +1 -1
  38. package/dist/openai-responses-cu.js +76 -49
  39. package/dist/openai-responses-cu.js.map +1 -1
  40. package/dist/pricing.d.ts +19 -1
  41. package/dist/pricing.js +43 -10
  42. package/dist/pricing.js.map +1 -1
  43. package/dist/program.js +17 -8
  44. package/dist/program.js.map +1 -1
  45. package/dist/redaction.js +9 -2
  46. package/dist/redaction.js.map +1 -1
  47. package/dist/run.d.ts +14 -2
  48. package/dist/run.js.map +1 -1
  49. package/dist/terminal-node-bootstrap.d.ts +4 -0
  50. package/dist/terminal-node-bootstrap.js +58 -0
  51. package/dist/terminal-node-bootstrap.js.map +1 -0
  52. package/dist/terminal-runtime-auth.d.ts +13 -0
  53. package/dist/terminal-runtime-auth.js +24 -0
  54. package/dist/terminal-runtime-auth.js.map +1 -0
  55. package/dist/terminal-runtime.d.ts +16 -0
  56. package/dist/terminal-runtime.js +42 -0
  57. package/dist/terminal-runtime.js.map +1 -0
  58. package/dist/terminal-token-usage.d.ts +2 -1
  59. package/dist/terminal-token-usage.js +3 -2
  60. package/dist/terminal-token-usage.js.map +1 -1
  61. package/docs/architecture/actor-contract.md +22 -0
  62. package/docs/architecture/state-driven-executor.md +10 -1
  63. package/docs/architecture/terminal-product-lane.md +142 -6
  64. package/docs/contracts/feedback.md +14 -0
  65. package/docs/contracts/run-bundle.md +5 -1
  66. package/docs/contracts/schemas.md +17 -8
  67. package/docs/goals/current.md +61 -13
  68. package/docs/ramp/README.md +1 -1
  69. package/package.json +4 -2
package/README.md CHANGED
@@ -21,141 +21,78 @@ local checkout. Every lane is a real computer-use session on a hosted desktop;
21
21
  the captions are each persona's own final report. drawDB is the application
22
22
  studied; it is not a Humanish adopter or endorser.
23
23
 
24
- ## Three Roles
25
-
26
- Every design decision in humanish is checked against the three people a study
27
- actually involves ([docs/principles/three-roles.md](docs/principles/three-roles.md)):
28
-
29
- - **The researcher** (usually a coding agent driving the CLI) declares the
30
- protocol: personas, discrete tasks with success criteria the participant
31
- never sees, and a budget set once at the study level, the way recruiting
32
- decisions are made.
33
- - **The stakeholder** watches through Observer, drives from `humanish tui`, and
34
- reads results that carry their denominator: `2/2 reached the goal, 1 reported
35
- friction; tasks: reach-signup 2/2 · read-verification-mail 2/2`.
36
- - **The participant** is the persona: the subject of the study, never its
37
- instrument. A participant abandoning a task is a finding about the product,
38
- not a harness failure.
39
-
40
- In practice: a two-participant study of an email-gated signup on a public
41
- open-source document app completed end to end (signup, verification mail read
42
- in a captured inbox, signed-in dashboard), and the keyboard-first participant
43
- reported, unprompted, that the signature step could not be completed without a
44
- mouse. The panel cost about $1.50 and the receipts are committed under
45
- [docs/goals/email-gated-signup/receipts/](docs/goals/email-gated-signup/receipts/).
24
+ [Quickstart](https://humanish.dev/docs) · [Study your app](https://humanish.dev/docs/your-app) · [CLI reference](https://humanish.dev/docs/cli) · [Limits and evidence](https://humanish.dev/failure-modes)
46
25
 
47
26
  ## Install
48
27
 
28
+ Use **Node.js 20 or newer**, in a project directory:
29
+
49
30
  ```bash
50
- npm i -D humanish
51
- npx humanish init --yes # sets up, then tells you the next command for THIS machine
52
- npx humanish run first-run # a study with no keys and no spend — about a minute
53
- npx humanish run try-live # a REAL study on a hosted desktop, capped at $2
31
+ npm install --save-dev humanish @e2b/desktop
32
+ npx humanish init --yes
54
33
  ```
55
34
 
56
- **What it finds, measured (2026-09-01 to 09-04, receipts in `bench/` and `docs/goals/`):** 58 of
57
- 60 planted defects over four benchmark runs on an app we wrote, none invented in 15 clean runs, and
58
- 14 of 15 with a second brain (the operator's own Claude Code as the participant, 0 invented in 3 more); on
59
- two apps we did not write, 16 of 18 distinct findings confirmed against the source and 0 invented,
60
- across 14 participants; a drawDB modal reported by 5 of 5 keyboard-first participants (3 stopped
61
- there) and never mentioned by 5 mouse-driving newcomers; a TodoMVC rename that blocked 6 of 6
62
- keyboard-first participants and none of the others; and, on a phone-sized desktop, a drawDB
63
- relationship drag intercepted by a popover that both phone participants hit (one stopped) and no
64
- desktop participant reported; under mobile emulation with touch, TodoMVC's double-click rename
65
- stopped 4 of 4 phone participants while 4 of 4 desktop newcomers finished, and Excalidraw read
66
- 12 of 12. Each file states its own caveats.
67
-
68
- `try-live` studies a real public app so that your first live run works without
69
- configuring anything; point its `subject` at your own app once you have seen it
70
- run. It needs `E2B_API_KEY`, and a model: either a provider key or a coding
71
- agent you are already signed in to (see below). Measured on 2026-09-01 from
72
- three fresh directories against the published 0.65.0: 3 of 3 reached the goal,
73
- 108 to 111 s each, about $0.16 each, and all three reported the same two
74
- frictions in the demo app
75
- ([receipt](docs/goals/computer-use-actor/receipts/cold-install-try-live-2026-09-01.md)).
76
-
77
- **Install it, do not one-shot it.** A live run needs the optional peer
78
- `@e2b/desktop`, and Node resolves that relative to humanish itself, so a
79
- one-shot `npx humanish@latest` can never find it, no matter what your project
80
- has installed. `npm i -D humanish @e2b/desktop` once, then `npx humanish …`
81
- resolves the local copy and works. The dry-run path (`humanish run first-run`)
82
- needs none of this.
83
-
84
- The package is `humanish`; the installed binary is `humanish`. For a one-shot
85
- command before installation, use `npx --package humanish humanish ...` to
86
- guarantee the binary comes from the `humanish` registry package rather than a
87
- same-named command already on your PATH.
88
-
89
- For coding agents, install the repo skill first:
35
+ `@e2b/desktop` is the optional peer for live hosted desktops. Install it alongside
36
+ Humanish so the CLI can resolve it; a one-shot `npx humanish@latest` can miss the
37
+ peer. The keyless preview needs only `humanish`.
38
+
39
+ **Run a live study.** Set the desktop and model keys with hidden prompts, then
40
+ send one synthetic participant into the included drawDB study:
90
41
 
91
42
  ```bash
92
- npx skills add danielgwilson/humanish --skill humanish
43
+ npx humanish keys set e2b
44
+ npx humanish keys set openai
45
+ npx humanish doctor
46
+ npx humanish lab preflight try-live
47
+ npx humanish run try-live
48
+ npx humanish observe --run latest --open
93
49
  ```
94
50
 
95
- The skill lives at [`skills/humanish/SKILL.md`](skills/humanish/SKILL.md)
96
- for skills.sh discovery.
51
+ Existing `E2B_API_KEY` and `OPENAI_API_KEY` environment variables also work.
52
+ `try-live` clones and studies drawDB, not your project. Its **$2 cap covers
53
+ estimated model spend**; hosted desktop time is additional. Caps are checked
54
+ between turns and are not provider billing ceilings. Allow a few minutes for
55
+ the app to build and the participant to work. See [budgets and privacy](https://humanish.dev/docs/budgets-and-privacy).
97
56
 
98
- ## A First Live Run Without a Provider API Key
99
-
100
- A live study normally needs a provider API key. If you already have a coding
101
- agent signed in (Codex on a ChatGPT plan, Claude Code on a Max plan), humanish
102
- can use it as the participant's brain instead, and then the only credential it
103
- needs is `E2B_API_KEY`.
57
+ **Preview without keys.** To see the evidence format before connecting providers:
104
58
 
105
59
  ```bash
106
- humanish doctor # says which local agents are installed and signed in
60
+ npx humanish run first-run
61
+ npx humanish observe --run latest --open
107
62
  ```
108
63
 
109
- ```yaml
110
- actors:
111
- - type: local-agent # instead of openai-computer-use
112
- persona: synthetic-new-user
113
- mission: >-
114
- ...
64
+ This generates an evidence preview with no provider spend. It does not open
65
+ your app, run an actor, or validate product behavior. To study your own product,
66
+ follow the complete [own-app lab](https://humanish.dev/docs/your-app).
67
+
68
+ For coding agents, install the companion skill:
69
+
70
+ ```bash
71
+ npx skills add danielgwilson/humanish --skill humanish
115
72
  ```
116
73
 
117
- humanish never reads those credentials. It checks that the credential file
118
- **exists**, spawns the CLI tool-restricted (`--sandbox read-only` for Codex,
119
- `--allowedTools Read` for Claude Code) in a scratch directory, and hands it one
120
- screenshot per turn. The agent only **decides**; humanish performs the action
121
- inside the E2B sandbox, so nothing the persona chooses ever runs on your machine.
122
-
123
- Three things to know before you rely on it:
124
-
125
- - **It is not free.** Subscription usage consumes your own plan. Runs driven this
126
- way record `estimatedCostUsd: null` with `reason: "no_token_usage"` rather than
127
- `$0`, because `$0` would be untrue. Rate limits on those plans are built for
128
- interactive coding; humanish fails closed with the CLI's own message and does
129
- not retry into them.
130
- - **It is slower.** Roughly 9 seconds per turn against about 3 for a direct API
131
- call, so give the lane a longer `execution.timeoutMs` than you would otherwise.
132
- - **The evidence says which brain ran it.** The trace records
133
- `ids.model: "codex app-server (local, operator-authenticated)"` or
134
- `"claude (local, operator-authenticated, one session per run)"`, so a
135
- local-agent run is never silently compared against an API one.
136
- - **Both agents keep one conversation for the whole run.** Codex through an
137
- app-server thread, Claude Code through one `claude -p` stream-json session.
138
- A participant that starts every turn cold cannot remember trying the menu
139
- and tries it again; measured on one lab, that was 188 actions over 90 turns
140
- and no finish against 21 actions over 8 turns. `HUMANISH_LOCAL_AGENT_ONE_SHOT=1`
141
- keeps the cold-start path for the Claude agent as a measurement switch, so
142
- "remembers" can be compared against "does not" on your own lab; the trace's
143
- `ids.model` says which ran.
74
+ Source: [`skills/humanish/SKILL.md`](skills/humanish/SKILL.md).
144
75
 
145
- ## Telemetry
76
+ ## How It Works
77
+
78
+ ```text
79
+ humanish/ committed labs, personas, scenarios, policy, adapters
80
+ .humanish/ ignored run evidence, Observer output, reviews, local state
81
+ ```
146
82
 
147
- humanish collects anonymous usage data by default (which command ran, whether it
148
- worked, roughly how long it took) so the maintainers can tell whether anyone
149
- reaches a working first run. It never sends your labs, subjects, personas, paths,
150
- or evidence, and there is no field in the payload that could.
83
+ After a run, read its findings and verification grade:
151
84
 
152
85
  ```bash
153
- humanish telemetry status # the exact document that would be sent
154
- humanish telemetry disable # or set DO_NOT_TRACK=1
86
+ npx humanish runs --json
87
+ npx humanish review --run latest --json
88
+ npx humanish verify --run latest --json
89
+ npx humanish feedback issue --run latest --repo owner/repo --format markdown
155
90
  ```
156
91
 
157
- Full detail, including why it exists and everything it cannot contain:
158
- [TELEMETRY.md](TELEMETRY.md).
92
+ `feedback issue` prints a draft and requires `share_ready` evidence. A live run
93
+ with raw screenshots can be valid local evidence and still fail that sharing
94
+ gate. [Read results](https://humanish.dev/docs/read-results) explains the
95
+ participant's report, task outcomes, costs, and how to turn a finding into an issue.
159
96
 
160
97
  ## Public-Safety Boundary
161
98
 
@@ -168,12 +105,13 @@ allowlist, over both tracked files and the packed npm payload) plus a
168
105
  full-history gitleaks scan. That protects what we ship; it does not scan your
169
106
  repo.
170
107
 
171
- **2. The harness never persists secret values into run artifacts.** On every
172
- route, values it provisioned are scrubbed by literal match (they have no shape
173
- for patterns to catch) and secret-shaped content is pattern-redacted before any
174
- log tail, harness error, or model narration lands on disk. Env var names are
175
- evidence; values never are. Pixels are the exception: a raw screenshot shows
176
- whatever was on screen, which is why plank 3 exists.
108
+ **2. Persisted text is scrubbed for known values and secret patterns.** Humanish
109
+ uses literal matching for provisioned secret values and pattern redaction for
110
+ secret-shaped text in logs, errors, and model narration. Environment provenance
111
+ records variable names. These checks have coverage limits: unknown values,
112
+ unrecognized formats, and implementation defects can escape them. Raw
113
+ screenshots contain whatever was on screen. Use synthetic data, verify the
114
+ bundle, and review the actual text and pixels before sharing.
177
115
 
178
116
  **3. Run bundles are local by default.** Evidence lands under gitignored
179
117
  `.humanish/`, and no command publishes it for you. Sharing evidence (committing
@@ -200,158 +138,24 @@ certified free of PII or PHI. A first-class PII/PHI detector is on the roadmap
200
138
  Feedback commands require `share_ready`. A valid local run can still be
201
139
  reviewed in Observer without being promoted into a public issue draft.
202
140
 
203
- ## How It Works
204
-
205
- ```text
206
- humanish/ committed source plane: labs, personas, scenarios, policy, adapters
207
- .humanish/ ignored runtime plane: runs, Observer output, reviews, local state
208
- ```
209
-
210
- The first-run path does not require credentials:
211
-
212
- ```bash
213
- npx humanish doctor
214
- npx humanish watch
215
- npx humanish verify --run latest --json
216
- npx humanish feedback issue --run latest --repo owner/repo --format markdown
217
- ```
218
-
219
- `humanish watch` starts a fresh four-lane synthetic run, renders the Observer,
220
- opens it in the browser, serves it over localhost, and keeps the shell attached.
221
- After `humanish init`, named lab manifests can be run the same way:
222
-
223
- ```bash
224
- npx humanish watch first-run
225
- npx humanish lab list
226
- npx humanish lab inspect first-run
227
- npx humanish lab preflight first-run
228
- ```
229
-
230
- The CI-safe equivalent is:
231
-
232
- ```bash
233
- npx humanish watch --json --no-open
234
- ```
235
-
236
- ## The Terminal Surface
237
-
238
- Every other humanish command is built so an agent can drive it. `humanish tui`
239
- takes the screen and waits for a person.
240
-
241
- ```bash
242
- npx humanish tui
243
- ```
244
-
245
- Arrow keys move, `enter` opens, `esc` goes back, `q` quits. There are three
246
- screens, and you move between objects rather than between states: the set of
247
- labs, one lab, one run. A run's lifecycle
248
- renders in place, so a run you are watching changes from running to its verdict
249
- without the screen moving under you.
250
-
251
- - **labs**: every lab in the project, whether or not it has ever run. Labs with
252
- something running now sort first. Each row carries what to expect from a live
253
- run of it; a lab with no live history says `no live runs yet` and does not
254
- quote a median from dry runs, which spend nothing and take no time.
255
- - **lab**: that lab's history, and two ways to start it. A dry run starts on one
256
- keypress because it cannot cost anything; a live run is armed by the first
257
- `enter` and committed by the second, restating the cost in between.
258
- - **run**: who is in the run, what they are currently thinking, and how far they
259
- have got, with time and money underneath. A terminal cannot show screenshots,
260
- so the run's self-contained Observer artifact is named for you to open.
261
-
262
- A run you start from the surface is detached: it keeps going if you quit the
263
- TUI, and it survives losing the SSH session you started it over. The surface
264
- follows it by reading `.humanish/runs/<id>/status.json`, holding no handle on
265
- it, so you can quit mid-run, reopen, and find it still there.
266
-
267
- Requires an interactive terminal and Node 22 or newer. It refuses anything else
268
- with a structured error rather than rendering escape codes into a pipe:
269
-
270
- ```console
271
- $ humanish tui --json < /dev/null
272
- {
273
- "schema": "humanish.tui-result.v1",
274
- "ok": false,
275
- "error": {
276
- "code": "HUMANISH_TUI_REQUIRES_TTY",
277
- "message": "humanish tui needs an interactive terminal. For scripted or agent use, `humanish runs --json` lists the same runs and `humanish lab run --json` starts one."
278
- }
279
- }
280
- ```
281
-
282
- Every other command still works on Node 20; only this surface needs 22.
283
-
284
- ## Serve the Library
285
-
286
- `humanish watch` follows one attached run; `humanish serve` serves the whole
287
- local run library under `.humanish/runs/`, a library index plus every run's
288
- Observer page:
289
-
290
- ```bash
291
- npx humanish serve
292
- npx humanish serve --expose --tunnel ngrok --oauth google --allow-email you@example.com
293
- npx humanish serve --safe --expose --tunnel ngrok
294
- npx humanish serve --expose --public-url https://observer.example.com
295
- ```
296
-
297
- The first serves the library on loopback only. The second is the phone path:
298
- ngrok's edge authenticates viewers with Google OAuth (restricted to your
299
- `--allow-email`/`--allow-domain` allow rules) before any request reaches the
300
- loopback server; humanish carries no in-process auth. The third is a secretless
301
- safe observer: no login, but only runs whose `humanish verify` shareSafety is
302
- `share_ready` exist at all; everything else is absent and 404s. The fourth
303
- trusts an edge you already secure (Cloudflare Access, Tailscale, a proxy you own)
304
- and just binds loopback behind it.
305
-
306
- In every mode the server binds `127.0.0.1`; exposure only ever happens through
307
- an authenticated edge forwarding to the loopback port. Exposure is fail-closed:
308
- `--expose` always needs a reachable public origin (a `--tunnel` or a `--public-url`,
309
- even under `--safe`), and then requires either edge auth (`--oauth` on the tunnel,
310
- or a `--public-url` you secure) or `--safe`. `--oauth google` with no allow rule
311
- lets any Google account in and warns loudly.
312
-
313
- ### Watch a live run from your phone
314
-
315
- `humanish watch <cua-lab> --expose --tunnel ngrok --oauth google --allow-email
316
- you@example.com` streams the live desktop of a computer-use run to an
317
- edge-authenticated remote viewer while it plays. The attached server comes up
318
- during the run and survives a timed-out/failed run, so you can inspect a failed
319
- run's evidence too. A live run is never `share_ready`, so `watch --expose` always
320
- requires edge auth; `--safe` is a `serve` library filter and is rejected on watch
321
- (`HUMANISH_WATCH_SAFE_NOT_APPLICABLE`). An exposed watch serves only the attached
322
- run (its history lists just that run and every other run id 404s), so a remote
323
- viewer can never reach your other runs' raw evidence.
324
-
325
- Live E2B desktop stream URLs are served only on `watch --expose`, and only behind
326
- edge auth; `serve` never injects them (remote viewers of the library see only
327
- persisted evidence: screenshots, events, terminal tails). See
328
- [Serve architecture](docs/architecture/serve.md).
329
-
330
141
  ## Commands
331
142
 
143
+ Use `npx humanish` from your project. Full arguments and options are generated
144
+ from the shipped CLI in the [command reference](https://humanish.dev/docs/cli).
145
+
332
146
  | Command | Purpose |
333
147
  | --- | --- |
334
- | `humanish init` | Scaffold committed `humanish/` source and ignored `.humanish/` runtime state. |
335
- | `humanish doctor` | Explain readiness and missing setup. |
336
- | `humanish tui` | Interactive terminal surface for browsing labs and runs and starting a run. Humans only; it refuses a non-interactive stdin or stdout. |
337
- | `humanish run --dry-run` | Generate a synthetic run bundle without browser, keys, or provider spend. |
338
- | `humanish run --app-url http://127.0.0.1:<port>` | Capture live desktop/mobile browser evidence against a running local app. |
339
- | `humanish watch [lab]` | Run sims or a named lab, open Observer, and keep watching. |
340
- | `humanish serve` | Serve the local run library over loopback; optional tunnel-edge authenticated or share-safe exposure. |
341
- | `humanish lab list` | List committed and ignored lab manifests. |
342
- | `humanish lab inspect <lab>` | Show the source manifest for a lab without running it. |
343
- | `humanish lab preflight <lab>` | Check lab routing and optional target reachability before actor/model spend. |
344
- | `humanish lab run <lab>` | Run a lab manifest in human or JSON mode. |
345
- | `humanish verify` | Validate a run bundle and public-safety gates. |
346
- | `humanish cleanup` | Inspect recorded resource evidence and write `cleanup.json`; stored IDs do not authorize provider mutation. |
347
- | `humanish review` | Read review evidence for a run. |
348
- | `humanish runs` | List local runs and latest pointers. |
349
- | `humanish export` | One self-contained `.html` of a run's Observer with screenshots inlined; verify and the share_ready gate run inside, `--local-only` watermarks a raw-screenshot bundle. |
350
- | `humanish stats` | Cost, outcome, and duration roll-ups across run history; `--lab`, `--since`. Estimates stay labelled; unknown costs count as unknown. |
351
- | `humanish feedback list` | List a run's draft state and every feedback candidate (one per participant finding), with the ids `--candidate` takes. |
352
- | `humanish feedback issue` | Print a public-safe GitHub issue draft without API mutation. `--candidate <id>` chooses which finding; default is the first. |
353
- | `humanish lab run oss` | Repo-maintainer contract example: dry-run Observer-of-Observers for authorized repo selections. |
354
- | `humanish lab run oss-smoke` | Repo-maintainer dogfood example: disposable clone smoke test against public OSS repos. |
148
+ | `humanish init --yes` | Scaffold study source and ignored runtime state. |
149
+ | `humanish doctor --json` | Check setup without exposing key values. |
150
+ | `humanish lab list --json` | List available labs. |
151
+ | `humanish lab inspect <lab> --json` | Read a lab before running it. |
152
+ | `humanish lab preflight <lab> --json` | Check configuration and route warnings. |
153
+ | `humanish run <lab>` | Run the named preview or live study. |
154
+ | `humanish watch <lab>` | Run a lab with an attached Observer. |
155
+ | `humanish runs --json` | List local run history. |
156
+ | `humanish review --run latest --json` | Read an existing run's evidence. |
157
+ | `humanish verify --run latest --json` | Check evidence and share-safety gates. |
158
+ | `humanish feedback issue --run latest --repo owner/repo` | Print an eligible feedback draft. |
355
159
 
356
160
  ## Exit Codes
357
161
 
@@ -362,360 +166,72 @@ persisted evidence: screenshots, events, terminal tails). See
362
166
  | `2` | Humanish domain or validation failure. Check the JSON envelope's `error.code` for detail. |
363
167
  | `128+N` | Terminated by signal `N`: `130` for SIGINT, `143` for SIGTERM, `129` for SIGHUP. |
364
168
 
365
- ## Lab Manifests
366
-
367
- Labs are authored as `.yaml` source:
368
-
369
- ```text
370
- humanish/labs/*.yaml committed public-safe labs
371
- .humanish/labs/*.yaml ignored local labs
372
- .humanish/local/labs/*.yaml ignored private or machine-specific labs
373
- ```
374
-
375
- Committed labs should be useful to anyone who clones the project. Private repo
376
- targets, token-backed provider settings, and local-only dogfood variants belong
377
- in ignored `.humanish/` lab manifests and can be run explicitly:
378
-
379
- ```bash
380
- npx humanish watch .humanish/labs/local-dogfood.yaml --env-file .humanish/local/provider.env
381
- npx humanish lab run .humanish/labs/local-dogfood.yaml --json --no-open
382
- ```
383
-
384
- `--env-file` loads values for the current process only. Humanish reports loaded
385
- env var names, never values, and does not persist those values into run bundles
386
- or Observer data.
387
-
388
- ### Computer-Use Labs
169
+ ## The Terminal Surface
389
170
 
390
- A computer-use lab dispatches a **registered computer-use actor** (`actors[0].type`,
391
- resolved against the actor registry, e.g. `openai-computer-use`) to drive an app in
392
- a hosted E2B desktop browser and emit an evidence bundle under gitignored
393
- `.humanish/` (full-fidelity screenshots by default, see below; length-only typed
394
- text; provider-neutral `humanish.actor-trace.v1` on the stream). Two subjects route
395
- here:
396
-
397
- - **`subject.source: clone`** (+ `execution.target: e2b-desktop` + a computer-use
398
- actor): the lab clones your repo into the sandbox, runs your declared
399
- `serve.install`/`serve.build`/`serve.start` commands (detached, with readiness
400
- probing), and drives the served app at `serve.url`. Subject env var names declared
401
- in `subject.env` are provisioned from `--env-file` (names land in evidence; values
402
- never do). The bundle records provenance: repo, cloned commit, env names.
403
- - **`subject.source: app-url`**: you (a library caller) provision the app yourself
404
- via the `prepareDesktop` hook (`runLab(config, { cuaHooks: { prepareDesktop } })`)
405
- and the actor drives the URL you declared.
406
-
407
- ```yaml
408
- subject:
409
- source: clone
410
- repos: [example-org/example-app]
411
- serve:
412
- install: pnpm install --frozen-lockfile
413
- build: pnpm build
414
- start: pnpm start
415
- url: http://127.0.0.1:3000/
416
- actors:
417
- - type: openai-computer-use
418
- mission: Explore the app as a first-time visitor and complete its primary flow.
419
- execution: { target: e2b-desktop }
420
- scenario: { mode: live }
421
- ```
171
+ `humanish tui` is for a person browsing labs and runs. It needs Node 22+ and an
172
+ interactive stdin/stdout, and refuses detected coding-agent sessions even with
173
+ a TTY. Agents should use `lab list --json`, `lab inspect <lab> --json`, and
174
+ `runs --json`. Read [TUI behavior and JSON alternatives](https://humanish.dev/docs/review-surfaces#for-coding-agents-and-scripts).
422
175
 
423
- ```bash
424
- npx humanish lab run cua-browser # dry-run contract bundle (no spend)
425
- ```
426
-
427
- Live runs (`scenario.mode: live`) need `OPENAI_API_KEY` + `E2B_API_KEY` (pass via
428
- `--env-file`) and the optional peer dependency: `npm i -D @e2b/desktop`. A cloned
429
- subject is served **inside** the sandbox on loopback; to instead drive a deployment
430
- you own (a Vercel preview, staging), use an `app-url` subject with
431
- `policies.allowPublicTargets: true`. The actor's API key never enters the sandbox;
432
- only declared subject env names do. `humanish init` scaffolds an example at
433
- `humanish/labs/cua-browser.yaml`.
434
-
435
- **Off-app email/SMS verification (`comms`).** When a flow is gated behind an email or
436
- SMS the app itself sends (a signup verification link, a one-time code, a magic link),
437
- add a `comms:` block to the lab. Humanish redirects the app's email-API sends (via
438
- one adopter-named env var: with the official Resend SDK it is `RESEND_BASE_URL`,
439
- which the SDK reads on its own, so nothing in the app has to change; other providers
440
- need the app to actually pass the env through, and a run whose catch captures zero
441
- sends warns at teardown) into a catch **inside** the sandbox, so nothing leaves the
442
- machine. Every lane gets a deterministic inbox address automatically, and each
443
- persona's prompt carries the full handoff: the address to sign up with, the inbox URL
444
- to open, and that waiting for an email is a next step, not a blocker. The run bundle
445
- gets a digest-only `humanish.comms-thread.v1` artifact (from/to/subject/link
446
- digests + an OTP count; no raw address, link, or code persists); the readable proof a
447
- persona saw the email is its inbox-page screenshots. Hosted on the clone/local-tree
448
- computer-use lanes and the concurrent shared-world route (warned inert elsewhere),
449
- vendor-neutral (Resend/SendGrid shaped, or a custom profile).
450
- See `docs/contracts/schemas.md` for the full `comms:` shape.
451
-
452
- **Screenshots are full-fidelity by default.** Run bundles live in gitignored
453
- `.humanish/`, so the Observer shows exactly what the persona saw. Set
454
- `policies.redactScreenshots: true` to persist blurred thumbnails at capture instead
455
- (for unowned subjects, or bundles you intend to share as-is). Raw bundles stay local
456
- in gitignored `.humanish/`; nothing scans the pixels, so review them before sharing
457
- anywhere. A redact-on-export step is planned. The frame sent to the model is always
458
- full-resolution regardless. (Doctrine: `docs/principles/invariants-and-defaults.md`.
459
- Redaction binds the publish boundary, not capture.) `humanish verify` reports
460
- raw-screenshot bundles as `shareSafety.status: local_only`; `humanish feedback issue`
461
- refuses them until the run is share-ready.
462
-
463
- **Device presets.** `execution.desktop.device` picks the hosted desktop screen size:
464
- `mobile` (414×896), `small-mobile` (360×740), `narrow-mobile` (320×700), `tablet`
465
- (820×1180), `desktop` (1440×950, default), or `wide` (1920×1080). The values are copied
466
- from the mature in-house sims. **Honest fidelity:** on the computer-use / E2B-desktop
467
- route width/height size the virtual display and browser outer window. The actual page
468
- viewport is smaller because browser chrome occupies space; Chromium-family live bundles
469
- measure it through CDP and record it separately from requested/verified screen geometry.
470
- Browsers without that measurement seam omit the viewport rather than guessing. A
471
- site's width-based responsive CSS still fires, and the model is *told* its device in the
472
- prompt, matching how those sims run organic mobile lanes. Without the block below there is no
473
- touch input, the device-pixel-ratio isn't rendered, and the user-agent stays desktop on this
474
- route. Device is run-wide today; per-*persona* device (N personas × devices) lands with fan-out.
475
- `execution.desktop.resolution` is a raw escape hatch that overrides the preset.
476
-
477
- **Mobile emulation.** `execution.desktop.fidelity: { mobileEmulation: true }` turns every hosted
478
- Chrome/Chromium computer-use lane on a mobile preset (`mobile`, `small-mobile`, `narrow-mobile`)
479
- into a mobile-emulated browser before the participant arrives, and leaves desktop, tablet and
480
- wide lanes in the same run untouched: the lane's preset width/height become the CSS viewport (414 px for `mobile`, where the
481
- X screen itself cannot go below 500), the preset's device pixel ratio applies (`deviceScaleFactor`
482
- overrides it), touch events are on (`touch: false` turns them off) and the browser presents a
483
- mobile user agent (`userAgent` replaces the default iPhone Safari string). The run bundle records
484
- `desktopGeometry.fidelity` with `tier: mobile-emulated`, the request, the CDP methods applied,
485
- and `resolved`: what the page itself reported afterwards (`navigator.userAgent`,
486
- `devicePixelRatio`, `innerWidth`, `maxTouchPoints`, coarse pointer). A page without a viewport
487
- meta lays out at 980 px, as it would on a phone, and the bundle says so. Firefox cannot be
488
- emulated, so the lane fails closed instead of shipping a desktop run labelled mobile. The
489
- viewport and DPR override cover the launch tab (the user agent and touch flags are browser-wide);
490
- if an observation reads a tab the participant opened later, the lane records one warning saying
491
- so, because that tab laid out at the window width. A bundle without a `fidelity` block is a
492
- responsive-viewport study whatever its preset is called.
493
-
494
- **Desktop browser choice.** Hosted computer-use lanes and shared-world actor seats use the
495
- route's historical opener unless you set `execution.desktop.browser` to `chrome`, `chromium`,
496
- or `firefox`. A concrete value means "launch this browser or fail"; it never silently
497
- falls back to whatever the image prefers. When configured, run bundles record the requested
498
- browser and the resolved in-sandbox command as `desktopBrowser`.
499
-
500
- **Deterministic stop conditions.** Freeform computer-use actors can keep acting after the
501
- app has already reached the state you care about. Add `stopWhen` to the actor or a lane to
502
- stop immediately after a deterministic browser observation matches. Conditions inside one
503
- rule are ANDed together; rules under `any` are ORed. Lane-level `stopWhen` overrides the
504
- actor default.
505
-
506
- ```yaml
507
- actors:
508
- - type: openai-computer-use
509
- mission: Complete the assigned browser task.
510
- stopWhen:
511
- any:
512
- - id: dashboard-visible
513
- urlPathEquals: /dashboard
514
- textIncludes: Dashboard
515
- lanes:
516
- - id: reviewer
517
- entry: /items/123
518
- instruction: Review the item and return to the queue.
519
- stopWhen:
520
- any:
521
- - id: returned-to-queue
522
- urlPathEquals: /items
523
- textIncludes: Queue
524
- ```
176
+ ## Serve the Library
525
177
 
526
- **A participant with a camera.** `execution.desktop.media.camera: { source: synthetic }` gives a
527
- hosted Chrome lane a capture device: an ffmpeg test pattern generated in the sandbox (or a
528
- `.y4m` file of yours, uploaded). The browser's own permission dialog stays in the way by default
529
- (`policies.mediaPermission: prompt`), because the gate is where a real person hesitates or
530
- refuses; `granted` bypasses it for studies about what happens after. The bundle records the
531
- feed and the exact launch flags under `desktopBrowser.media`. A microphone needs an image with
532
- an audio stack (`execution.desktop.template`); the stock desktop has none, so a declared
533
- microphone without a template is refused before any spend.
534
- **A declared observation window.** Some findings are "time passed and nothing broke": a call
535
- both participants stay on, an import that finishes, a dashboard that updates. A freeform
536
- participant with nothing to do keeps acting, so `dwell` lets the study hold instead. Once
537
- `when` matches (or after the first observation, when there is no `when`), the harness holds the
538
- page for `ms`, captures a frame every `everyMs` (default 10 s), takes no action and requests no
539
- model turn, then hands control back (`then: continue`, the default) or ends the session
540
- (`then: stop`). The window is recorded in the trace as deliberate, and it never outlasts the
541
- session budget. Lane-level `dwell` overrides the actor default.
542
-
543
- ```yaml
544
- actors:
545
- - type: openai-computer-use
546
- mission: Join the room, stay a while, then leave.
547
- dwell:
548
- when:
549
- any:
550
- - id: in-room
551
- urlIncludes: /room/
552
- ms: 120000
553
- everyMs: 10000
554
- then: continue
555
- ```
178
+ `humanish serve` serves your run library on loopback. The [Observer and terminal guide](https://humanish.dev/docs/review-surfaces#serve-the-run-library)
179
+ covers local viewing, authenticated remote access, and share-safe public exposure.
556
180
 
557
- Supported primitives are `urlIncludes`, `urlPathEquals`, `textIncludes`, and
558
- `appStatePathEquals`. URL and text observations are runtime-only and are not persisted into
559
- the run bundle; the trace stores only the matched rule id and primitive names. Browser URL
560
- and text observation requires a Chrome/Chromium CDP session in the desktop. For deterministic
561
- browser-observed stops, set `execution.desktop.browser: chrome` or `chromium`.
562
-
563
- **Cost tracking (estimated).** Computer-use run bundles carry an advisory `cost` block: a
564
- per-lane token-derived model estimate plus one aggregate E2B desktop-minute estimate. Every
565
- dollar figure is an estimate, never a provider charge. It is a rate-table multiply, always
566
- surfaced as "~$X estimated (rates as of `<date>`)" in the Observer and the run library, and it
567
- carries the pricing date + source so a token-derived number is never mistaken for an
568
- authoritative bill. Unknown model/rate is declared absent (`null` + a reason), never guessed or
569
- silently zeroed; dry-runs invent no spend. The rates live in
570
- [`src/pricing.ts`](src/pricing.ts) as **operator-editable, dated estimates**. The E2B desktop
571
- rate is still a `placeholder` stand-in; update the numbers and the `asOf` date when providers
572
- change pricing. On models that bill prompt-cache writes and long-context requests at their own
573
- rates (OpenAI's 5.6 family), the estimate prices both exactly from the trace's per-request
574
- usage ledger.
575
-
576
- **Choosing the model.** Computer-use lanes default to `gpt-5.6-sol` (the 5.6-generation
577
- flagship; `gpt-5.6` is OpenAI's alias for the same model). Configure it per lab with
578
- `actors[0].model`. Any id in the rate table prices cleanly (`gpt-5.6-terra` and
579
- `gpt-5.6-luna` are the cheaper tiers; `gpt-5.5` stays priced for pinned labs). A run with a
580
- spend cap (`execution.caps`) refuses an unpriced model at preflight, so add a dated rate to
581
- `src/pricing.ts` before capping a model the table does not know.
582
-
583
- **Fail-closed spend cap.** Set `execution.caps.maxUsd` on a computer-use lab to abort a session
584
- the moment its running estimated spend crosses the cap, a runaway-retry guard that mirrors the
585
- terminal lane's `scenario.caps.maxUsd`. It is a **per-lane** cap: enforced inside each lane's loop,
586
- so an N-lane fan-out can spend up to N × `maxUsd` before any lane aborts (the run bundle warns with
587
- the true ~N × cap ceiling; a shared run-level budget is future work). A lane that did real work then
588
- hits its cap passes (`budget_reached`); a zero-action runaway that crosses it fails (`gave_up`).
589
- Absent = uncapped (the historical CUA behavior); `maxUsd: 0` = no-spend. A cap on a model
590
- `src/pricing.ts` cannot price is refused at preflight (`HUMANISH_CUA_LAB_UNPRICED_CAP`)
591
- rather than run uncapped: an unenforceable cap is more dangerous than none, so add a rate
592
- or drop the cap.
593
-
594
- **Failed-lane reruns.** Multi-lane CUA fan-out can be rerun surgically without mutating
595
- the source run:
181
+ ### Watch a live run from your phone
596
182
 
597
- ```bash
598
- npx humanish lab run cua-browser --rerun-failed-from latest --json --no-open
599
- npx humanish lab run cua-browser --rerun-failed-from <run-id> --lanes lane-02,lane-04
600
- ```
183
+ See [authenticated live viewing](https://humanish.dev/docs/review-surfaces#watch-a-live-run-from-your-phone).
601
184
 
602
- This creates a new linked run containing only the failed/blocked/timed-out/hollow lanes
603
- (or the explicit `--lanes` selection). The new `run.json` records `rerun.sourceRunId`,
604
- selected lane ids, and previous lane statuses; the source run's verdict is left unchanged.
605
- This is intentionally not automatic retry; a passing rerun is evidence of a
606
- nondeterminism candidate and does not license erasing the original red lane.
185
+ ## Lab Manifests
607
186
 
608
- **Run-owned cleanup.** Live providers can record resource evidence in `run.json`.
609
- Stored bundle IDs are mutable evidence and do not authorize provider mutation. The
610
- cleanup command writes a durable inspection receipt until Humanish has a
611
- verified resource-lease contract. Resources already recorded as killed become
612
- `already_clean`; recorded live or unknown resources become `failed`, which
613
- makes cleanup and verification fail closed:
187
+ See the [lab manifest reference](https://humanish.dev/docs/lab-manifests) for
188
+ source directories, route selection, and ignored private labs.
614
189
 
615
- ```bash
616
- npx humanish cleanup --run latest
617
- npx humanish verify --run latest
618
- ```
190
+ ### Computer-Use Labs
619
191
 
620
- Humanish does not enumerate or bulk-delete provider accounts from this command.
621
- Same-process teardown uses trusted in-memory provider handles. The separate OSS
622
- orphan sweep is maintainer-only, opt-in, and verifies provider metadata before
623
- calling provider cleanup.
192
+ The [computer-use reference](https://humanish.dev/docs/computer-use) covers
193
+ subjects, screenshots, devices, mobile emulation, stop rules, dwell windows,
194
+ and failed-lane reruns. The [cost model](https://humanish.dev/docs/budgets-and-privacy#how-cost-estimates-work)
195
+ explains model selection, dated estimates, and study/per-participant caps.
624
196
 
625
- Trust note: `serve` commands run inside the disposable sandbox with the declared
626
- subject env provisioned, the same trust class as a repo's package.json scripts.
627
- Only run lab configs you trust, and declare only the env names that the subject
628
- genuinely needs. (Since 0.5.0, a clone × e2b-desktop lab whose actor is a
629
- registered computer-use actor routes here and requires `serve`; on earlier
630
- versions that shape routed to the meta lab.)
197
+ Mobile viewport and touch flags do not certify gesture equivalence. The
198
+ [2026-09-05 input-conformance correction](docs/goals/computer-use-actor/receipts/mobile-input-conformance-2026-09-05.md)
199
+ qualifies the historical phone-lane results: they describe Humanish's measured input path,
200
+ not established physical-device app behavior.
631
201
 
632
202
  #### Adapters: drive a local app via its JS state contract (no E2B, no vision)
633
203
 
634
- The computer-use loop is provider- and substrate-agnostic. You can point a lab at an
635
- **already-running local dev server** (`subject.source: local-app`) and drive it
636
- through its in-process JS contract (`window.app.getState()` etc.) with a custom
637
- `CuaExecutor` (screenshot optional, `appState` as the progress signal) paired with a
638
- **non-vision** `CuaProvider` (`requiresFrame` falsey), keeping personas, the
639
- Observer, the evidence bundle, redaction, and the friction loop, with **no E2B
640
- desktop and no clone**. Supply `cuaHooks.buildExecutor` + `buildProvider` to
641
- `runLab` (a config-only run with no hooks fails closed with a structured error). See
642
- [State-driven executor](docs/architecture/state-driven-executor.md).
204
+ See [state-driven local adapters](https://humanish.dev/docs/computer-use#state-driven-local-adapters).
643
205
 
644
206
  ## Browser Scenario Manifests
645
207
 
646
- `humanish run --app-url http://127.0.0.1:<port>` looks for executable browser
647
- steps in committed `humanish/scenarios/*.yaml`. If none are present, Humanish
648
- falls back to the built-in two-step browser persona proof. Browser steps are
649
- public-safe source, so use synthetic fixture values and committed relative app
650
- paths only.
651
-
652
- ```yaml
653
- schema: humanish.scenario.v1
654
- id: todo-onboarding
655
- title: Todo onboarding
656
- persona: synthetic-new-user
657
- goal: Create the first synthetic todo and verify the list updates.
658
- mode: browser
659
- browser:
660
- startPath: /
661
- steps:
662
- - id: open-home
663
- label: Open the todo app
664
- action: goto
665
- path: /
666
- expect:
667
- text: Add todo
668
- - id: enter-todo
669
- label: Enter synthetic todo text
670
- action: fill
671
- selector: input[name="todo"]
672
- value: Synthetic onboarding task
673
- - id: create-todo
674
- label: Create the todo
675
- action: click
676
- selector: button[type="submit"]
677
- expect:
678
- text: Synthetic onboarding task
679
- stateChanged: true
680
- ```
681
-
682
- Supported actions are `goto`, `fill`, `click`, `assertText`, `waitForText`,
683
- and `waitForSelector`. Supported expectations are `text`, `selectorVisible`,
684
- `urlIncludes`, and `stateChanged`. Generated traces are stored as JSON under
685
- `.humanish/runs/<run>/traces/` and summarized in the Observer.
208
+ See [scripted browser scenarios](https://humanish.dev/docs/lab-manifests#scripted-browser-scenarios)
209
+ for executable steps against a running local app.
686
210
 
687
- ## Maintainer OSS Meta-Lab Example
211
+ ## A First Live Run Without a Provider API Key
688
212
 
689
- This repository includes a contract-only authorized-repo dogfood lab:
213
+ A [signed-in local Codex or Claude Code](https://humanish.dev/docs/local-agents)
214
+ can supply the participant's model. It consumes your existing plan; E2B still
215
+ requires a key and bills for desktops.
690
216
 
691
- ```bash
692
- pnpm humanish -- watch oss
693
- pnpm humanish -- lab run oss --dry-run --repos CorentinTh/it-tools,drawdb-io/drawdb,maciekt07/TodoApp,lissy93/dashy
694
- ```
217
+ ## Three Roles
695
218
 
696
- Default lab targets are intentionally app/tool-like repos with visible,
697
- locally runnable user surfaces. Avoid libraries and frameworks for public
698
- dogfood unless the scenario is explicitly testing developer experience.
219
+ The researcher declares the study, the participant tries the product, and the
220
+ stakeholder reads what happened. [Three roles](docs/principles/three-roles.md)
221
+ explains the design; the [email-gated signup receipts](docs/goals/email-gated-signup/receipts/)
222
+ show a completed two-participant study and a reported keyboard-accessibility finding.
699
223
 
700
- The bundled manifest defaults to dry-run and creates contract evidence without
701
- cloning repos, launching a provider sandbox, or forwarding credentials. Use:
224
+ ## Maintainer OSS Meta-Lab Example
702
225
 
703
- ```bash
704
- pnpm humanish -- lab run oss --dry-run --json --no-open
705
- ```
226
+ The bundled `oss` lab is a dry-run contract. Live OSS meta-lab execution is
227
+ unavailable until repository instructions have an isolated credential boundary.
228
+ See the [maintainer reference](https://humanish.dev/docs/lab-manifests#maintainer-oss-meta-lab-example).
706
229
 
707
- Live OSS meta-lab execution is unavailable until repository-derived instructions
708
- have an isolated credential boundary. A live manifest fails closed with
709
- `HUMANISH_OSS_META_LIVE_ISOLATION_REQUIRED` before callbacks, filesystem writes,
710
- network access, or provider launch.
230
+ ## Telemetry
711
231
 
712
- The `oss` lab accepts GitHub `owner/repo` slugs. A CLI `--repos` override redacts
713
- repo labels in durable artifacts by default; pass `--no-redact-repos` only for a
714
- public-safe selection. Dry-run does not access or clone repositories and does
715
- not need or use private-repository credentials. Private-repository execution
716
- remains unavailable while the live lane is disabled. Local bundles remain
717
- ignored under `.humanish/`; do not publish private screenshots, logs, or
718
- upstream details.
232
+ Humanish collects anonymous command usage by default, excluding labs, subjects,
233
+ personas, paths, and evidence. `humanish telemetry disable` or `DO_NOT_TRACK=1`
234
+ turns it off. See [TELEMETRY.md](TELEMETRY.md) for the exact fields.
719
235
 
720
236
  ## Development
721
237
 
@@ -737,27 +253,17 @@ pnpm humanish:lab:list
737
253
 
738
254
  ## Docs
739
255
 
740
- Start with the current safety and capability state. Dated design documents may
741
- preserve historical mechanisms and carry explicit amendments near the top.
742
-
256
+ - [User guides and generated CLI reference](https://humanish.dev/docs)
743
257
  - [Current safety state and goals](docs/goals/current.md)
744
- - [Ramp for future contributors and agents](docs/ramp/README.md)
745
- - [Project layout](docs/architecture/project-layout.md)
746
- - [Observer architecture](docs/architecture/observer.md)
747
- - [Serve: the run library surface](docs/architecture/serve.md)
748
- - [Actor contract (first-party registry and extension direction)](docs/architecture/actor-contract.md)
749
- - [State-driven executor (drive a local app, no E2B/vision)](docs/architecture/state-driven-executor.md)
750
- - [OSS lab design record (historical; see its current safety amendment)](docs/architecture/oss-lab-poc.md)
258
+ - [Contributor and agent ramp](docs/ramp/README.md)
259
+ - [Project layout and architecture](docs/architecture/project-layout.md)
751
260
  - [Feedback contract](docs/contracts/feedback.md)
752
- - [Open-source install experience](docs/product/open-source-install-experience.md)
753
- - [Three roles: researcher, stakeholder, participant](docs/principles/three-roles.md)
754
- - [Self-driving harness principles](docs/principles/self-driving-harness.md)
755
- - [World-class open-source v0 roadmap](docs/roadmap/world-class-open-source-v0.md)
756
- - [Open-source release readiness](docs/release/open-source-readiness.md)
757
- - [Public readiness standard](docs/release/public-readiness-standard.md)
261
+ - [Release readiness and gates](docs/release/open-source-readiness.md)
262
+
263
+ Dated design documents may preserve historical mechanisms. Start with the
264
+ current goals and the executable CLI when checking what is supported.
758
265
 
759
266
  ## Release Status
760
267
 
761
- The package is published on npm. Every future publication remains a human
762
- release action: do not run `npm publish` or create a release tag unless the
763
- maintainer explicitly approves it in the current context.
268
+ The package is published on npm. Publishing a new version requires explicit
269
+ maintainer authorization; see the [release procedure](docs/release/open-source-readiness.md#publish-procedure).