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.
- package/dist/actor-contract.d.ts +12 -0
- package/dist/actor-contract.js.map +1 -1
- package/dist/affordance.d.ts +51 -0
- package/dist/affordance.js +142 -0
- package/dist/affordance.js.map +1 -0
- package/dist/comms-catch-host.d.ts +19 -0
- package/dist/comms-catch-host.js +69 -0
- package/dist/comms-catch-host.js.map +1 -0
- package/dist/comms-sandbox-catch.d.ts +47 -1
- package/dist/comms-sandbox-catch.js +111 -0
- package/dist/comms-sandbox-catch.js.map +1 -1
- package/dist/computer-use.js +10 -0
- package/dist/computer-use.js.map +1 -1
- package/dist/concurrent-shared-world-lab.d.ts +4 -1
- package/dist/concurrent-shared-world-lab.js +58 -6
- package/dist/concurrent-shared-world-lab.js.map +1 -1
- package/dist/cua-actor-lab.js +3 -1
- package/dist/cua-actor-lab.js.map +1 -1
- package/dist/lab-config.d.ts +21 -1
- package/dist/lab-config.js +55 -6
- package/dist/lab-config.js.map +1 -1
- package/dist/persona.js +9 -1
- package/dist/persona.js.map +1 -1
- package/dist/program.js +25 -0
- package/dist/program.js.map +1 -1
- package/docs/contracts/schemas.md +62 -3
- package/docs/goals/current.md +1 -1
- package/docs/principles/actor-fidelity.md +165 -0
- package/docs/ramp/README.md +1 -1
- package/package.json +1 -1
|
@@ -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.
|
|
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
|
|
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").
|
|
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
|
package/docs/goals/current.md
CHANGED
|
@@ -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.
|
|
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.
|
package/docs/ramp/README.md
CHANGED
|
@@ -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.
|
|
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