humanish 0.36.1 → 0.38.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.
@@ -3,7 +3,7 @@
3
3
  Date: 2026-06-02 (current-state note updated 2026-07-14)
4
4
 
5
5
  Status: reference map for the major contracts shipped through source version
6
- `0.36.1`; it is not an exhaustive inventory of command/result envelopes. Exported types,
6
+ `0.38.0`; it is not an exhaustive inventory of command/result envelopes. Exported types,
7
7
  schema constants, parsers, and validators in `src/` are authoritative. Rows
8
8
  marked "reserved" name layering intent only — no code emits or validates them
9
9
  yet. Do not emit a reserved schema.
@@ -46,6 +46,7 @@ workflow without leaking private upstream truth into core.
46
46
  | Pricing (operator-editable rates) | `humanish.pricing.v1` (`src/pricing.ts`; dated per-model + E2B desktop rates) | see Run Cost Summary And Estimated Actor Cost below |
47
47
  | Run cost summary | `humanish.run-cost-summary.v1` (additive `RunBundle.cost`; estimate, never a charge) | see Run Cost Summary And Estimated Actor Cost below |
48
48
  | Estimated actor cost | `humanish.actor-estimated-cost.v1` (additive `ActorTrace.estimatedCost`) | see Run Cost Summary And Estimated Actor Cost below |
49
+ | Affordance use | `humanish.affordance-use.v1` (additive `ActorTrace.affordanceUse`; per-class counts of the routes an actor took) | see Affordance Use below |
49
50
  | Adapter score | `humanish.adapter-score.v1` (`RunBundle.adapterScore`; namespaced; route-specific acceptance semantics) | see Product-Adapter Extension Seam below |
50
51
  | Adapter artifact | `humanish.adapter-artifact.v1` (`RunBundle.adapterArtifacts[]`; namespaced; local relative proof references) | see Product-Adapter Extension Seam below |
51
52
  | Shared-world evidence | `humanish.shared-world.v1` (additive `RunBundle.sharedWorld` + `RunBundle.attributionClass`; `topologyMode: sequential \| concurrent`) | see Shared-World Evidence below |
@@ -257,7 +258,7 @@ A lab is a composition over code primitives, not a hardcoded kind:
257
258
  including app-url/operator-provided subjects and the sequential
258
259
  `concurrency: 1` shared world, neither of which has a catch to host): off-app
259
260
  email/SMS the app itself SENDS, made a persona-driven testable surface.
260
- `comms.email` = `{ kind: fake, injectEnv, port?, recipients?, linkOrigin? }`.
261
+ `comms.email` = `{ kind: fake, injectEnv?, port?, recipients?, linkOrigin?, external? }`.
261
262
  `injectEnv` is the ADOPTER-NAMED env var the app reads for its email-API base
262
263
  URL (e.g. `RESEND_API_URL`); the harness sets it to an in-sandbox catch (so it
263
264
  is NOT declared in `subject.env`) that captures the app's sends without touching
@@ -273,7 +274,23 @@ A lab is a composition over code primitives, not a hardcoded kind:
273
274
  listing them, zero addressed lanes is a hard error, partial coverage warns
274
275
  with the uncovered lanes. Each addressed lane's actor prompt is extended with
275
276
  the full handoff: its address ("enter exactly that"), the inbox URL, and the
276
- wait steering ("waiting for an email is normal, not a blocker"). `linkOrigin`
277
+ wait steering ("waiting for an email is normal, not a blocker").
278
+ `external` (#328) switches the funnel to an ADOPTER-HOSTED catch, which is what
279
+ makes comms work on planes humanish does not provision (app-url /
280
+ operator-provisioned): `{ catchBaseUrl, inboxBaseUrl?, authTokenEnv? }`. The
281
+ operator runs the catch — `humanish comms catch` runs the same implementation
282
+ humanish deploys in-sandbox, so the capture shape, inbox surface, and drain
283
+ contract cannot drift between the two planes — and points their own app's
284
+ email-API base URL at it. `injectEnv` is then absent and meaningless, since
285
+ there is no subject env for humanish to inject. humanish keeps every other
286
+ part: per-lane addresses, the injected inbox handoff, a fail-closed readiness
287
+ probe before any actor spend (GET /health must return the
288
+ `humanish-comms-catch` marker, so a proxy answering 200 for everything cannot
289
+ pass for a catch), the teardown drain over `GET /deliveries`, and the same
290
+ digest-only evidence. `authTokenEnv` names an env var holding a bearer token
291
+ for the drain read — the NAME is recorded as evidence, the value never
292
+ persists. Declaring `external` on a harness-provisioned subject warns: two
293
+ catches would exist and the app would point at humanish's own. `linkOrigin`
277
294
  is an optional operator-declared origin the app bakes into links when it
278
295
  differs from the serve origin; the harness rewrites captured links through it
279
296
  so a clicked link resolves to a reachable host. Captured mail is drained into a
@@ -708,6 +725,8 @@ Core-owned fields:
708
725
  distinct from `timed_out`, which stays reserved for a zero-progress deadline
709
726
  hit and remains a failure)
710
727
  - `ids`, `counts`, `items[]`, optional `tokenUsage`, `capabilities`
728
+ - optional `affordanceUse` (`humanish.affordance-use.v1`): which KIND of route this
729
+ actor took (see Affordance Use below)
711
730
  - optional `estimatedCost` (`humanish.actor-estimated-cost.v1`): a token-derived
712
731
  cost ESTIMATE for this lane (see Run Cost Summary And Estimated Actor Cost).
713
732
  It is deliberately a DIFFERENT field from `tokenUsage.costUsd`: a bare
@@ -928,6 +947,46 @@ model `src/pricing.ts` cannot price is REFUSED at preflight
928
947
  (`HUMANISH_CUA_LAB_UNPRICED_CAP`) before any sandbox rather than run uncapped —
929
948
  an unenforceable cap is more dangerous than none.
930
949
 
950
+ ## Affordance Use
951
+
952
+ `humanish.affordance-use.v1` (additive `ActorTrace.affordanceUse`) records WHICH
953
+ KIND of route an actor took, per dispatched action, as counts by class:
954
+
955
+ | Class | What it covers |
956
+ | --- | --- |
957
+ | `pointer` | click, double-click, drag, scroll — interaction with what is rendered |
958
+ | `keyboard` | typed text and key presses into the page |
959
+ | `url-navigation` | typing a URL (the `nav` subset) — a HUMAN affordance, see below |
960
+ | `script-execution` | a `javascript:` or `data:` URL — not a human affordance |
961
+ | `devtools` | developer tooling opened by keyboard chord |
962
+ | `browser-internal` | `chrome://`, `about:`, `view-source:`, `file:` — the browser, not the product |
963
+ | `observation` | screenshots, waits, bare pointer moves — the actor looking rather than acting |
964
+
965
+ `counts` omits classes that never occurred; `total` is the denominator for any
966
+ rate; `shortcutTotal` rolls up `script-execution` + `devtools` +
967
+ `browser-internal`, and a value of `0` is a meaningful result rather than an
968
+ absence.
969
+
970
+ Direct URL navigation is deliberately its OWN class and is grouped with the
971
+ naturalistic classes, not with script execution: `load(url)` appears in 99.4% of
972
+ 2,337 real human web demonstrations, so address-bar use is ordinary human
973
+ behavior and classifying it as a shortcut would make an ordinary human lane look
974
+ unfaithful. See [`docs/principles/actor-fidelity.md`](../principles/actor-fidelity.md)
975
+ for the evidence and the scoping of what a fidelity claim can mean.
976
+
977
+ The record carries a CLASS and at most a scheme-shaped signal (`javascript:`,
978
+ `https:`, a devtools chord) — never the typed text, which can be a password, a
979
+ session token, or an identifying URL path. Classification runs at dispatch
980
+ because the text exists only there: the trace's own action label deliberately
981
+ renders `type [N chars]`.
982
+
983
+ The harness states NO verdict about a class. Whether an affordance invalidates a
984
+ study depends on the population that study declares, which is product semantics
985
+ and belongs to the adopter's scorer — which already receives the full trace, so
986
+ `affordanceUse` needs no extra wiring to reach it. Present on computer-use lanes
987
+ that dispatched at least one action; absent elsewhere and on every pre-existing
988
+ bundle, and its absence is tolerated by verify.
989
+
931
990
  ## Product-Adapter Extension Seam
932
991
 
933
992
  The terminal-product and browser/computer-use lanes let an adopter attach
@@ -16,7 +16,7 @@ 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 Program Truth (source `0.36.1`)
19
+ ## Current Program Truth (source `0.38.0`)
20
20
 
21
21
  The package source and repository implementation in this tree agree on these
22
22
  points:
@@ -0,0 +1,165 @@
1
+ # Actor Fidelity: whose behavior is this evidence about?
2
+
3
+ Status: research digest + design position. Sources are public papers and open-source
4
+ harnesses; every claim below carries its citation so it can be argued with rather
5
+ than inherited.
6
+
7
+ ## The question
8
+
9
+ A computer-use actor in a study of a consumer web app typed a `javascript:` URL into
10
+ the browser address bar to get past a step. The run finished green.
11
+
12
+ Whether that is a defect depends entirely on a question the harness never asked:
13
+ **who is this study's user?**
14
+
15
+ - If the declared users are **people**, it is a defect — and a costly one. The actor
16
+ routed around the friction the study existed to measure, so a passing run proves
17
+ nothing about the human experience. Worse, it is silent: nothing in the bundle
18
+ distinguishes that run from one where a person clicked through.
19
+ - If the declared users are **agents** — as they are for an agent-facing CLI, API, or
20
+ MCP surface — the same act is faithful. It is the user population behaving normally,
21
+ and the fact that the agent had to reach for that affordance is itself a product
22
+ finding about how legible the surface is to its actual users.
23
+
24
+ The proof roadmap already anticipated this: its strongest evidence class,
25
+ `user-census`, is defined as "the users of the product ARE agents, and the lab runs
26
+ real production harnesses." This page is the layer that makes the distinction
27
+ operable.
28
+
29
+ ## What the evidence says
30
+
31
+ ### Direct URL navigation is a human affordance
32
+
33
+ WebLINX built its action space from 2,337 real human demonstrations; `load(url)`
34
+ appears in 2,324 of them — 99.4%, roughly 1.6 times per session
35
+ ([arXiv 2402.05930](https://arxiv.org/abs/2402.05930)). Treating address-bar
36
+ navigation as non-human would make a human-declared lane *less* faithful, not more.
37
+ The anomalous class is script execution and developer tooling, not URL entry.
38
+ BrowserGym already factors these apart: its `nav` subset is exactly
39
+ `{goto, go_back, go_forward}`, separate from everything else
40
+ ([arXiv 2412.05467](https://arxiv.org/abs/2412.05467)).
41
+
42
+ ### Prose instructions are a weak control for action modality
43
+
44
+ - Tool-restriction constraints in realistic agentic prompts are honored 19.9–27.2% of
45
+ the time (AgentIF).
46
+ - When a constraint conflicts with the task goal, obedience falls to 9.6–45.8%, and
47
+ models usually do not register the conflict ("Control Illusion").
48
+ - Rule-file effects are largely content-independent: random rules tie with curated
49
+ ones, and shuffling changes little — measured specifically on agent skills and
50
+ persona definitions ([arXiv 2604.11088](https://arxiv.org/abs/2604.11088)). A
51
+ modality rule can therefore appear to work while doing nothing.
52
+ - Persona adherence decays over a long trajectory rather than holding
53
+ ([arXiv 2512.12775](https://arxiv.org/abs/2512.12775)).
54
+
55
+ The one large-scale prompt-level modality constraint in the literature —
56
+ Online-Mind2Web instructing agents not to use search — was not trusted by its own
57
+ authors, who published the measured constrained-vs-unconstrained delta (26% vs 31%)
58
+ instead of asserting the instruction took effect
59
+ ([arXiv 2504.01382](https://arxiv.org/abs/2504.01382)). That is the discipline this
60
+ project copies: where a constraint cannot be mechanically enforced, measure what it
61
+ was worth.
62
+
63
+ ### Broad motivational reframes have backfired; narrow countable ones have worked
64
+
65
+ Making realism the actor's stated objective is an appealing fix, and the nearest
66
+ measured attempts went the wrong way. A findings-informed realism persona prompt
67
+ lowered overall simulator fidelity (User-Sim Index 70.9 → 64.6) and worsened outcome
68
+ calibration (0.18 → 0.29): "moving some behaviors closer to humans can move others
69
+ further away" ([arXiv 2603.11245](https://arxiv.org/abs/2603.11245)). Explicitly
70
+ licensing persona-faithful failure fixed the *marginal* rate five-fold but left the
71
+ *conditional* structure nearly unchanged — it taught the simulator to disengage
72
+ uniformly rather than to disengage when a real user would
73
+ ([arXiv 2606.20708](https://arxiv.org/abs/2606.20708)). By contrast, a narrow,
74
+ countable instruction did produce a measured improvement
75
+ ([arXiv 2601.17087](https://arxiv.org/abs/2601.17087)).
76
+
77
+ Two further cautions for prompt design: telling an actor it is being observed and
78
+ scored is a documented behavior-changing cue whose effect grows with model scale
79
+ ([arXiv 2505.17815](https://arxiv.org/abs/2505.17815)), and stating the grading
80
+ criterion to the actor invites optimization of the stated metric. Pre-action
81
+ self-checks are worse than neutral: deliberation before acting degrades constraint
82
+ adherence in most models measured ([arXiv 2505.11423](https://arxiv.org/abs/2505.11423)),
83
+ and chain-of-thought is an unreliable report of what actually drove an action
84
+ ([arXiv 2505.05410](https://arxiv.org/abs/2505.05410)) — an actor that takes a
85
+ shortcut and then narrates a plausible justification for it is the expected output,
86
+ not an edge case.
87
+
88
+ What does hold, in the same literature: periodic re-injection of a short persona
89
+ contract (large, cheap, replicated), and grounding a persona in specifics rather
90
+ than exhorting it to be faithful (interview-grounded personas measurably beat prose
91
+ descriptions).
92
+
93
+ ### Outcome-only scoring cannot see modality
94
+
95
+ WebArena's URL evaluator scores on the final page URL, so a single `goto` to the
96
+ reference URL earns full credit ([arXiv 2307.13854](https://arxiv.org/abs/2307.13854)).
97
+ τ-bench states the general form: a state-based reward is necessary but not
98
+ sufficient, since it cannot see whether policy was followed
99
+ ([arXiv 2406.12045](https://arxiv.org/abs/2406.12045)). And the gradient is real —
100
+ calling site APIs instead of driving the UI roughly doubles WebArena scores
101
+ ([arXiv 2410.16464](https://arxiv.org/abs/2410.16464)). Any harness that scores only
102
+ outcomes should expect actors to find that gradient, and should not be surprised when
103
+ a green run proves nothing.
104
+
105
+ ## The position this project takes
106
+
107
+ **Declare, record, and let the adopter judge.**
108
+
109
+ 1. **Declared population is a property of a persona, not of a lab.** One study program
110
+ can legitimately run agents and people against the same surface; the comparison
111
+ between them is a finding, not a contradiction. Prior art runs both populations
112
+ through one instrument and reports the difference
113
+ ([SusBench](https://arxiv.org/abs/2510.11035); MAS-Bench's GUI/shortcut split,
114
+ [arXiv 2509.06477](https://arxiv.org/abs/2509.06477)).
115
+
116
+ 2. **Record which affordance class each action used.** Recording is the layer that
117
+ makes every other claim checkable, including whether the persona prompt worked at
118
+ all. It is also the only honest answer to a defect whose verdict depends on a
119
+ declaration the harness cannot verify.
120
+
121
+ 3. **Do not bake a verdict.** Whether an affordance invalidates a study is product
122
+ semantics, and product semantics belong to the adopter's scorer
123
+ (`review.scorer.ref`). The harness emits facts; the adopter decides what they mean.
124
+
125
+ 4. **Prompt guidance ships as a nudge whose take-rate is reported, never as the
126
+ mechanism.** The evidence above is what that sentence is standing on.
127
+
128
+ 5. **Fail closed only on harness integrity, never on product semantics** — a lane that
129
+ cannot report what it did is a broken instrument, which is a different thing from
130
+ an actor that behaved unexpectedly.
131
+
132
+ ## What this does not claim
133
+
134
+ Fidelity here is scoped to **affordance and decision** level: which routes an actor
135
+ took, and whether they belong to the declared population. It is not a claim of
136
+ behavioral realism. At the kinematic level — pointer paths, timing, motor noise — the
137
+ gap between agents and people is total and trivially detectable
138
+ ([arXiv 2604.09574](https://arxiv.org/abs/2604.09574)). Any claim beyond the
139
+ affordance/decision level would be dishonest, and this project does not make one.
140
+
141
+ Two further limits worth stating plainly. Restricting script execution and developer
142
+ tooling for *fidelity* reasons has no precedent — where such restrictions exist
143
+ elsewhere, the stated motive is code-execution safety — so this is new ground rather
144
+ than an inherited convention. And nobody has yet measured whether affordance-class
145
+ recording changes what adopters decide; that is the experiment this layer makes
146
+ possible, not a result it can assume.
147
+
148
+ ## Vocabulary
149
+
150
+ Terms are borrowed rather than coined, so results stay comparable with the
151
+ surrounding literature:
152
+
153
+ | Term | Source | Meaning here |
154
+ | --- | --- | --- |
155
+ | action space / action set | WebArena, BrowserGym, OSWorld | the set of actions an actor can express |
156
+ | `nav` subset | BrowserGym | `goto`, `go_back`, `go_forward` — direct navigation, a human affordance |
157
+ | naturalistic actions | AndroidWorld | the human-modality subset, contrasted with exposed function-calling APIs |
158
+ | shortcut action | MAS-Bench | a non-UI route to the same outcome (API, deep link, script) |
159
+ | algorithmic fidelity | Argyle et al., *Out of One, Many* | how well a conditioned model emulates a specific population |
160
+ | Agent Experience (AX) | Biilmann (Netlify) | the experience of a product whose users are agents |
161
+
162
+ Three collisions to avoid: "agent usability testing" already means an agent
163
+ *simulating* a human, which is the opposite of the agent-population case; `cheat()` in
164
+ BrowserGym means the reference solution, not misbehavior; and "reward hacking" refers
165
+ to attacking a grader, which is a different failure from routing around a UI.
@@ -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.36.1` (2026-08-07). The containment boundary introduced in
5
+ Package/source version in this tree: `0.38.0` (2026-08-07). 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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "humanish",
3
- "version": "0.36.1",
3
+ "version": "0.38.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": [