humanish 0.36.0 → 0.37.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/AGENTS.md +8 -0
- 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/computer-use.js +10 -0
- package/dist/computer-use.js.map +1 -1
- package/dist/concurrent-shared-world-lab.d.ts +1 -1
- package/dist/concurrent-shared-world-lab.js +3 -3
- package/dist/concurrent-shared-world-lab.js.map +1 -1
- package/dist/init-templates.js +2 -2
- package/dist/init-templates.js.map +1 -1
- package/dist/lab-config.js +1 -1
- package/dist/lab-config.js.map +1 -1
- package/dist/persona.js +9 -1
- package/dist/persona.js.map +1 -1
- package/docs/architecture/external-public-shared-world.md +3 -3
- package/docs/contracts/schemas.md +44 -1
- package/docs/goals/current.md +1 -1
- package/docs/principles/actor-fidelity.md +165 -0
- package/docs/product/{cineguessr-3player-external-public.md → lobby-trivia-3player-external-public.md} +4 -4
- package/docs/ramp/README.md +1 -1
- package/docs/release/0.20.0-external-public-shared-world.md +1 -1
- package/package.json +1 -1
|
@@ -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.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Example: 3 mobile personas share ONE public multiplayer lobby at once
|
|
2
2
|
|
|
3
|
-
`humanish/labs/
|
|
3
|
+
`humanish/labs/lobby-trivia-3player.yaml` is a worked example of the EXTERNAL-PUBLIC shared-world route
|
|
4
4
|
(#164 phase 2): three mobile-LAYOUT personas play the SAME multiplayer lobby on a REAL public
|
|
5
5
|
deployment simultaneously, watched in ONE Observer. Point `subject.appUrl` + `subject.publicTarget` at
|
|
6
6
|
a public deployment YOU own/operate.
|
|
@@ -38,14 +38,14 @@ CSS-viewport rendering is the #221 CDP-device-emulation upgrade.
|
|
|
38
38
|
Dry-run (the default, $0 — proves the plumbing + the honesty contract, no sandboxes, no tokens):
|
|
39
39
|
|
|
40
40
|
```
|
|
41
|
-
humanish lab run
|
|
41
|
+
humanish lab run lobby-trivia-3player # or: humanish watch lobby-trivia-3player
|
|
42
42
|
```
|
|
43
43
|
|
|
44
44
|
Live (opens 3 real mobile-layout seats against the public app):
|
|
45
45
|
|
|
46
46
|
```
|
|
47
47
|
# flip scenario.mode to live in the lab (or override), then:
|
|
48
|
-
humanish watch
|
|
48
|
+
humanish watch lobby-trivia-3player --env-file .env.local # OPENAI_API_KEY + E2B_API_KEY
|
|
49
49
|
```
|
|
50
50
|
|
|
51
51
|
Watch it from a phone (today): serve the run directory's Observer through an authed edge —
|
|
@@ -69,7 +69,7 @@ No one run implies adoption, scale, or repeatability.
|
|
|
69
69
|
|
|
70
70
|
## Before a live run against a third-party site
|
|
71
71
|
|
|
72
|
-
The verified
|
|
72
|
+
The verified lobby-trivia lobby mechanics (createLobby/joinLobby → `/lobby/CODE`, the 6-char
|
|
73
73
|
`ABCDEFGHJKLMNPQRSTUVWXYZ23456789` alphabet, non-auto-join on a direct visit) are read from current
|
|
74
74
|
source and could change on the next deploy. The two coupling points to re-verify are the lobby-code
|
|
75
75
|
regex (`/\/lobby\/([A-Z2-9]{6})(?:$|[/?#])/`, tolerant of a locale prefix and query/hash) and the
|
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.37.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
|
|
@@ -18,7 +18,7 @@ asserts (byte-stable; a snapshot regression pins it).
|
|
|
18
18
|
creates the shared lobby, the orchestrator extracts `/lobby/CODE` from its CDP-observed URL and
|
|
19
19
|
threads the code into the follower JOIN missions; followers fail closed WITHOUT opening on
|
|
20
20
|
`HUMANISH_CONCURRENT_SHARED_WORLD_LAB_HANDOFF_TIMEOUT`.
|
|
21
|
-
- **3-mobile
|
|
21
|
+
- **3-mobile lobby-trivia example** (`humanish/labs/lobby-trivia-3player.yaml` + an init template): 3
|
|
22
22
|
mobile-LAYOUT personas play the same multiplayer lobby on a real public app at once. Dry-run $0.
|
|
23
23
|
- **Honest evidence class.** Attribution stays `shared-world`; every strength claim degrades honestly
|
|
24
24
|
and is asserted-ABSENT by verify: `subject.state.provenance == external-public` (not seeded);
|
package/package.json
CHANGED