humanish 0.33.0 → 0.35.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.
@@ -2,7 +2,7 @@
2
2
 
3
3
  Status: public-safe contributor and agent ramp.
4
4
 
5
- Package/source version in this tree: `0.33.0` (2026-08-05). The containment boundary introduced in
5
+ Package/source version in this tree: `0.35.0` (2026-08-05). The containment boundary introduced in
6
6
  `0.15.1` remains in force: managed run and output paths bind to validated
7
7
  physical filesystem identities, and stored provider IDs are evidence, not
8
8
  cleanup authority. The bundled OSS meta-lab is dry-run only until
@@ -17,7 +17,7 @@ context.
17
17
  Read these in order:
18
18
 
19
19
  1. [`AGENTS.md`](../../AGENTS.md) for public boundary and engineering rules.
20
- 2. [`docs/principles/invariants-and-defaults.md`](../principles/invariants-and-defaults.md) — the constitution: which rules are invariants and which are overridable defaults.
20
+ 2. [`docs/principles/invariants-and-defaults.md`](../principles/invariants-and-defaults.md) — which rules are invariants and which are overridable defaults, each with the reason it exists and the check that enforces it. (The enforcement is what makes a rule real here — when a doc sentence and a test disagree, trust the test and say so.)
21
21
  3. [`README.md`](../../README.md) for install, commands, and package shape.
22
22
  4. [`docs/goals/current.md`](../goals/current.md) for the active product goal.
23
23
  5. [`docs/goals/proof-roadmap/goal.md`](https://github.com/danielgwilson/humanish/blob/main/docs/goals/proof-roadmap/goal.md) for the ratified proof architecture (repo-only; not shipped in the npm package, hence the absolute link).
@@ -91,6 +91,18 @@ Implemented:
91
91
  and clicks through, and a digest-only `humanish.comms-thread.v1` artifact
92
92
  records the thread with no raw address, link, or code — wired into the
93
93
  computer-use and shared-world routes and live-proven on computer-use;
94
+ - resolved-persona directives that actually shape the actor prompt on the
95
+ terminal-product route (traits are applied and recorded in the actor trace, not
96
+ decorative), reusing the same `persona.ts` compiler as the computer-use lane;
97
+ - a CLI-loadable adopter scorer seam (`review.scorer.ref` in the lab manifest, or
98
+ a `--scorer <path>` override): a config-declared `.mjs` supplies
99
+ `{score, deriveFeedback, deriveArtifacts}`, resolved with the same containment
100
+ as `scenario.ref` and digest-pinned in the bundle
101
+ (`humanish.scorer-provenance.v1`); a config-declared scorer that fails to render
102
+ a pass fails the run on the scorer-capable routes, while library callers keep
103
+ the additive behavior (`costProbe` stays library-only); on the terminal route
104
+ the scoring context carries the FULL normalized transcript (byte-identical to
105
+ the persisted `terminal-transcript.txt`), not only the ~2KB tail projection;
94
106
  - containment checks for managed run storage, Observer and feedback reads,
95
107
  actor artifacts, lab discovery, Git metadata, and source archives;
96
108
  - an OSS meta-lab dry-run contract and a separate disposable public-repo OSS
@@ -101,8 +113,9 @@ Implemented:
101
113
  Still not good enough:
102
114
 
103
115
  The [current proof-roadmap checkpoint](https://github.com/danielgwilson/humanish/blob/main/docs/goals/proof-roadmap/README.md)
104
- supersedes implementation-status phrases in the immutable 2026-06-10 roadmap
105
- packet without changing its success standard.
116
+ supersedes implementation-status phrases in the 2026-06-10 roadmap packet
117
+ (kept as written — it is a dated record; its README carries current status)
118
+ without changing its success standard.
106
119
 
107
120
  - capability receipts are not adopter replacement: no first-party deletion
108
121
  branch has yet removed a bespoke generic harness while preserving
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "humanish",
3
- "version": "0.33.0",
3
+ "version": "0.35.0",
4
4
  "description": "Open-source-safe CLI for persona simulation, observer review, and public-safe feedback drafts.",
5
5
  "author": "Daniel G Wilson <daniel@danielgwilson.com>",
6
6
  "keywords": [
@@ -151,6 +151,24 @@ A lab is a composition (`subject` × `actors` × `execution` × `scenario` ×
151
151
  `npx humanish lab inspect <lab>` to see how a manifest parses, including
152
152
  warnings for fields the engine does not consume yet.
153
153
 
154
+ ### Many actors at once (fan-out, shared worlds, concurrency)
155
+
156
+ - **Every declared seat runs live at once by default.** A 6-lane roster is 6
157
+ simultaneous actors; total sessions and spend are the same either way, only
158
+ wall-clock and simultaneity differ. `execution.concurrency` is a CAP, not a
159
+ mode: declare it only to bound simultaneous paid desktops, and expect a parse
160
+ warning when the cap makes seats run in waves (a green waved run looks
161
+ identical to the all-live run you meant, so the harness says so up front).
162
+ - **Per-lane worlds vs one shared world.** A plain multi-lane computer-use lab
163
+ gives each actor its OWN app instance (independent studies in parallel). Add
164
+ `subject.topology: shared-world` for N actors in ONE world (a lobby, a shared
165
+ DB, actors seeing each other's changes). `execution.concurrency: 1` on a
166
+ shared-world lab is the sequential turn-taking variant — one actor at a time,
167
+ and note comms/email has no wiring there.
168
+ - **Watching it:** each live lane is its own Observer tile/stream; lanes beyond
169
+ a declared cap start when a slot frees, which on a capped run looks like idle
170
+ tiles — another reason to leave the cap out unless you need it.
171
+
154
172
  Use committed `humanish/labs/*.yaml` for public-safe, reproducible labs. Use
155
173
  ignored `.humanish/labs/*.yaml` or `.humanish/local/labs/*.yaml` for private repo
156
174
  targets, local-only dogfood, or machine-specific settings. Never commit private
@@ -179,19 +197,45 @@ the app sent it to finish a step.
179
197
  ```yaml
180
198
  comms:
181
199
  email:
182
- injectEnv: RESEND_API_URL # adopter-named: whatever env var YOUR app reads for its
183
- # email-API base URL. The harness sets it to the in-sandbox
184
- # catch — do NOT also list it in subject.env.
200
+ injectEnv: RESEND_API_URL # adopter-named: whatever env var YOUR app reads for its
201
+ # email-API base URL. The harness sets it to the in-sandbox catch — do NOT also
202
+ # list it in subject.env. VERIFY the app actually reads this variable: a stock
203
+ # email SDK does not honor a base-URL env unless the app passes it through, and
204
+ # an app that ignores it sends real mail (or throws) while the inbox stays empty.
205
+ # A run where the catch captured zero sends warns at teardown for exactly this.
206
+ ```
207
+
208
+ That is the whole block for the common case. Every lane automatically gets a
209
+ deterministic inbox address (`<laneId>@example.test`), and each actor's prompt is
210
+ extended with the full handoff: its address ("when the app asks for an email
211
+ address, enter exactly that"), the inbox URL to open, and the wait steering
212
+ ("waiting for an email is normal, not a blocker"). Declare `recipients` only to
213
+ customize addresses or limit which lanes do email:
214
+
215
+ ```yaml
185
216
  recipients:
186
- - lane: lane-01 # the actor lane that signs up
187
- address: user@example.test # the literal address the app emails (what the persona uses)
217
+ - lane: signup-01 # this lab's REAL lane id a roster lane's `id`, or the
218
+ # generated lane-01..lane-NN names when you use `count`. An unknown lane
219
+ # is a hard parse error listing the lab's actual lane ids (a mismatch
220
+ # would silently disable the funnel for that seat, which is how a
221
+ # 6-actor field run lost every inbox at once). Lanes you leave out get
222
+ # no inbox and are never told one exists — the parser warns which.
223
+ address: user@example.test # what the actor signs up with; the evidence
224
+ # drain matches captured mail against it.
188
225
  ```
189
226
 
190
227
  The app keeps calling its email API normally (Resend/SendGrid-shaped, or a custom
191
- profile); only the base URL is redirected. Works on the clone/local-tree route and
192
- the concurrent shared-world route. It needs `python3` in the subject sandbox (the
193
- stock E2B desktop has it). See `docs/contracts/schemas.md` for the full `comms:`
194
- shape and `humanish <cmd> --help` for run flags this skill does not restate them.
228
+ profile); only the base URL is redirected. Route support: the clone/local-tree
229
+ computer-use route (inbox on the sandbox's own loopback) and the CONCURRENT
230
+ shared-world route (inbox getHost-exposed from the subject sandbox; the default
231
+ since every seat now runs live at once). Declared anywhere else app-url /
232
+ operator-provided subjects, or a sequential `concurrency: 1` shared world — it is
233
+ warned inert at parse: no catch exists there and no actor hears about an inbox.
234
+ It needs `python3` in the subject sandbox (the stock E2B desktop has it).
235
+ Evidence is digest-only (`humanish.comms-thread.v1` — counts and digests, never
236
+ raw mail); the *readable* proof a persona saw the email is its screenshots of the
237
+ inbox page. See `docs/contracts/schemas.md` for the full `comms:` shape and
238
+ `humanish <cmd> --help` for run flags — this skill does not restate them.
195
239
 
196
240
  ## First Proof Run
197
241