humanish 0.112.0 → 0.113.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 (90) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +11 -0
  3. package/TELEMETRY.md +21 -0
  4. package/dist/actors/codex/restricted-participant-policy.d.ts +21 -1
  5. package/dist/actors/codex/restricted-participant-policy.js +20 -2
  6. package/dist/actors/codex/restricted-participant.d.ts +1 -1
  7. package/dist/actors/codex/restricted-participant.js +2 -1
  8. package/dist/actors/computer-use/loop/debrief.d.ts +12 -4
  9. package/dist/actors/computer-use/loop/debrief.js +57 -20
  10. package/dist/actors/computer-use/loop/ending.d.ts +5 -2
  11. package/dist/actors/computer-use/loop/impressions.d.ts +14 -0
  12. package/dist/actors/computer-use/loop/impressions.js +40 -0
  13. package/dist/actors/computer-use/loop/session.d.ts +3 -1
  14. package/dist/actors/computer-use/loop/session.js +2 -0
  15. package/dist/actors/computer-use/loop/trace.js +2 -0
  16. package/dist/actors/computer-use/loop/types.d.ts +8 -1
  17. package/dist/actors/computer-use/loop.d.ts +2 -1
  18. package/dist/actors/computer-use/loop.js +15 -3
  19. package/dist/actors/computer-use/openai-conversation.d.ts +9 -4
  20. package/dist/actors/computer-use/openai-conversation.js +53 -24
  21. package/dist/actors/computer-use/openai-provider.js +18 -12
  22. package/dist/actors/contract.d.ts +43 -3
  23. package/dist/actors/contract.js +13 -0
  24. package/dist/analysis/evidence-sources.d.ts +3 -1
  25. package/dist/analysis/evidence-sources.js +10 -1
  26. package/dist/analysis/evidence.js +2 -2
  27. package/dist/analysis/execute.d.ts +1 -1
  28. package/dist/analysis/execute.js +3 -1
  29. package/dist/cli/commands/runs.js +33 -10
  30. package/dist/cli/commands/setup.js +95 -6
  31. package/dist/cli/commands/study-format.js +7 -4
  32. package/dist/cli/commands/study.js +1 -1
  33. package/dist/cli/commands/tui.js +1 -1
  34. package/dist/cli/doctor.d.ts +2 -0
  35. package/dist/cli/doctor.js +18 -0
  36. package/dist/cli/io.d.ts +2 -0
  37. package/dist/cli/program.js +35 -1
  38. package/dist/cli/secret-prompt.d.ts +5 -1
  39. package/dist/cli/secret-prompt.js +6 -2
  40. package/dist/cli/update-check-worker.d.ts +1 -0
  41. package/dist/cli/update-check-worker.js +5 -0
  42. package/dist/cli/update-check.d.ts +46 -0
  43. package/dist/cli/update-check.js +203 -0
  44. package/dist/feedback/draft.js +18 -0
  45. package/dist/keys/key-resolution.js +2 -0
  46. package/dist/keys/key-status.d.ts +37 -0
  47. package/dist/keys/key-status.js +68 -0
  48. package/dist/observer-app.html +4 -4
  49. package/dist/routes/computer-use/local-vm.js +9 -2
  50. package/dist/routes/computer-use/participant-desktop.d.ts +6 -0
  51. package/dist/routes/computer-use/participant-execution.js +9 -1
  52. package/dist/routes/computer-use/rerun-selection.js +23 -21
  53. package/dist/routes/computer-use/result.js +3 -2
  54. package/dist/routes/computer-use/self-report.js +7 -1
  55. package/dist/routes/computer-use/setup.js +14 -0
  56. package/dist/routes/computer-use/types.d.ts +4 -1
  57. package/dist/routes/shared-world/bundle-records.js +8 -7
  58. package/dist/routes/shared-world/bundle.js +1 -1
  59. package/dist/run/detail.js +4 -4
  60. package/dist/run/participant-caption.d.ts +2 -1
  61. package/dist/run/participant-caption.js +11 -1
  62. package/dist/run/participant-records.d.ts +3 -1
  63. package/dist/run/participant-records.js +6 -0
  64. package/dist/run-study.js +17 -1
  65. package/dist/study/discover.js +6 -1
  66. package/dist/study/doctor.d.ts +2 -0
  67. package/dist/study/doctor.js +45 -7
  68. package/dist/study/init-templates.js +10 -5
  69. package/dist/study/plan.js +3 -2
  70. package/dist/study/preflight-result.d.ts +1 -0
  71. package/dist/study/preflight-result.js +1 -1
  72. package/dist/study/preflight.d.ts +2 -0
  73. package/dist/study/preflight.js +54 -14
  74. package/dist/study/warnings.d.ts +5 -0
  75. package/dist/study/warnings.js +79 -2
  76. package/dist/substrates/local/capacity.d.ts +75 -0
  77. package/dist/substrates/local/capacity.js +143 -0
  78. package/dist/substrates/local/firecracker-desktop.d.ts +8 -0
  79. package/dist/substrates/local/firecracker-desktop.js +34 -3
  80. package/dist/substrates/local/runtime-host.d.ts +16 -3
  81. package/dist/substrates/local/runtime-host.js +49 -4
  82. package/dist/substrates/local/runtime.d.ts +10 -0
  83. package/dist/substrates/local/runtime.js +44 -5
  84. package/dist/tui-app.js +58 -58
  85. package/docs/architecture/actor-contract.md +20 -6
  86. package/docs/contracts/feedback.md +8 -1
  87. package/docs/contracts/schemas.md +57 -34
  88. package/docs/contracts/study-analysis.md +15 -0
  89. package/package.json +1 -1
  90. package/skills/humanish/SKILL.md +21 -10
@@ -350,22 +350,36 @@ this paragraph is the record of that decision.
350
350
 
351
351
  `ComputerUseProvider.debrief` is an optional read-only request after a structured
352
352
  `stopWhen` or dwell stop. It returns a `ComputerUseTurn` with `closingReport` containing
353
- `summary` and `frictionReports`; an empty friction list is valid. The loop rejects
353
+ `summary`, `frictionReports` and `impressions`; an empty friction or impressions list is valid,
354
+ and a report without `impressions` (an older provider) is still accepted. The loop rejects
354
355
  actions, pending safety checks, and invalid report shapes. It redacts accepted
355
356
  reports, records them in `ActorTrace.debrief`, and projects one readable message
356
- without invoking action or communication callbacks.
357
+ without invoking action or communication callbacks. Each impression becomes its own message
358
+ and goes to `ActorTrace.impressions`; a session without them records why in the same field.
359
+ A turn that ends the session itself may carry `closingReport` too, and the loop keeps its
360
+ impressions the same way without a second request.
361
+
362
+ `ComputerUseProvider.requestImpressions` is the optional request after the participant ended
363
+ the session itself without impressions. It asks for impressions only, returns them as
364
+ `impressions` on the turn, and follows the debrief's rules and guards. The loop records it as
365
+ `ActorTrace.debrief` with `trigger: "participant_end"` and no report, so the participant's
366
+ reason, outcome and friction come from its final message as before. A failed, timed-out or
367
+ cut-off request leaves `ActorTrace.impressions` as `not_collected` with the reason.
357
368
 
358
369
  This request uses the final observation and retained provider history. It does
359
370
  not expose the hidden stop criterion or change the original task outcome. It is
360
- skipped before any participant turn, after natural completion, without provider
361
- support, or without remaining time and known budget. An attempted request's
371
+ skipped before any participant turn, after natural completion (apart from the impressions-only
372
+ request), without provider support, or without remaining time and known budget. An attempted request's
362
373
  unreported usage remains an unknown cost line. `counts.debriefCalls` is separate
363
374
  from interaction turns, and reported usage contributes to aggregate cost.
364
375
 
365
376
  The OpenAI implementation makes one request with tools disabled and structured
366
- output; no HTTP or policy retries. Stateless/ZDR mode does not offer retrospective
377
+ output; no HTTP or policy retries. Its output limit is 3072 tokens, or the declared
378
+ `maxOutputTokens` when lower. Stateless/ZDR mode does not offer retrospective
367
379
  reporting: its client-carried conversation summarizes its oldest turns past a token
368
- budget, so it may not hold the whole session a retrospective report needs. The
380
+ budget, so it may not hold the whole session a retrospective report needs. It does offer
381
+ the impressions-only request, which reads the carried conversation: its newest
382
+ exchanges whole and earlier turns as a text note. The
369
383
  [paired live receipt](https://github.com/danielgwilson/humanish/blob/main/docs/evidence/computer-use/structured-closing-report-2026-09-05.md)
370
384
  records both report recovery and control failures in the separate legacy parser.
371
385
 
@@ -66,7 +66,9 @@ Listing does not create a draft or check public-sharing eligibility.
66
66
 
67
67
  For completed computer-use and shared-world sessions, participant-reported
68
68
  friction comes from the redacted closing report, a completed debrief's
69
- `frictionReports`, and observed-report clauses in earlier messages.
69
+ `frictionReports`, and observed-report clauses in earlier messages. The
70
+ participant's closing impressions (`ActorTrace.impressions`) are opinions about
71
+ the product and never count as friction.
70
72
  Matching `stopWhen` or ending a dwell window does not discard an earlier
71
73
  report or change the successful completion verdict. Exact repeated reports
72
74
  appear once in the participant's candidate. Harness notices, reasoning, and observed
@@ -84,6 +86,11 @@ was not repeated in the message trace.
84
86
  Builds structured feedback from the first usable run candidate, or the candidate
85
87
  selected with `--candidate`. With no candidate, a live run produces a summary of
86
88
  its recorded review; that fallback does not add a finding to the candidate list.
89
+ With `--analysis` and `--finding`, the draft is built from that analysis finding
90
+ instead. When the finding's observations cite a participant's closing impression,
91
+ `actual` quotes it after the observations as
92
+ `Participant <id> said at the end (<kind>): <text>`. An impression is quoted only
93
+ when the cited evidence entry carries its text whole; uncited impressions stay out.
87
94
  A dry run tests no product behavior, so `draft`, `verify`, `issue` and
88
95
  `issue-url` refuse it with `HUMANISH_FEEDBACK_REQUIRES_LIVE_RUN`. All drafts
89
96
  require a verified `share_ready` live run and are written under the run bundle,
@@ -24,38 +24,38 @@ workflow without leaking private upstream truth into core.
24
24
 
25
25
  ## Contract Index
26
26
 
27
- | Contract | Schema | Public-safe fixture |
28
- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------- |
29
- | Run bundle | `humanish.run-bundle.v1` | `synthetic-run-bundle` |
30
- | Adapter | `humanish.adapter.v1` | `synthetic-cli-adapter` |
31
- | Study file | `humanish.study.v3` | `first-run` |
32
- | Persona | `humanish.persona.v1` | `synthetic-maintainer` |
33
- | Scenario | `humanish.scenario.v1` | `first-run-smoke` |
34
- | Actor trace | `humanish.actor-trace.v1` | `synthetic-actor-trace` |
35
- | Substrate | reserved (never shipped) | none |
36
- | Evidence stream | reserved (streams live inside the run bundle) | see [`run-bundle.md`](run-bundle.md) |
37
- | Review | `humanish.review.v1` | `contract-proof-review` |
38
- | Study analysis | `humanish.study-analysis.v1` (prompt `study-evidence-7` adds `findings[].headline`, `findings[].experience` and `designFindings[]`; older artifacts omit them) | see [study analysis](study-analysis.md) and synthetic analysis fixtures in `tests/` |
39
- | Study analysis correction | `humanish.study-analysis-correction.v1` | see [study analysis](study-analysis.md#human-review-and-sharing) |
40
- | Analysis findings view | `humanish.analysis-findings.v1` (`review --json` field `analysis`; read-only projection of the selected analysis) | see [study analysis](study-analysis.md#reading-findings) |
41
- | Analysis execution receipt | `humanish.analysis-execution.v1` | see [study analysis](study-analysis.md#durable-records) |
42
- | Analysis execution start | `humanish.analysis-execution-start.v1` | see [study analysis](study-analysis.md#durable-records) |
43
- | Verification | `humanish.verify-result.v1` | `five-check-verify` |
44
- | Policy | `humanish.policy.v1` (fixture-only; not engine-validated) | `public-safety-policy` |
45
- | Feedback | `humanish.feedback.v1` | `public-safe-feedback` |
46
- | Terminal cost ledger | `humanish.terminal-cost-ledger.v1` | see Terminal Cost Ledger below |
47
- | Terminal no-spend proof | `humanish.terminal-no-spend-proof.v1` | see Terminal Cost Ledger below |
48
- | Pricing (operator-editable rates) | `humanish.pricing.v1` (`src/run/pricing.ts`; dated per-model + E2B desktop rates) | see Run Cost Summary And Estimated Actor Cost below |
49
- | Run cost summary | `humanish.run-cost-summary.v1` (additive `RunBundle.cost`; estimate, never a charge) | see Run Cost Summary And Estimated Actor Cost below |
50
- | Estimated actor cost | `humanish.actor-estimated-cost.v1` (additive `ActorTrace.estimatedCost`) | see Run Cost Summary And Estimated Actor Cost below |
51
- | Model settings | `humanish.model-settings.v1` (additive `ActorTrace.modelSettings`; the reasoning effort the request carried) | see Actor Trace below |
52
- | Affordance use | `humanish.affordance-use.v1` (additive `ActorTrace.affordanceUse`; per-class counts of the routes an actor took) | see Affordance Use below |
53
- | Adapter score | `humanish.adapter-score.v1` (`RunBundle.adapterScore`; namespaced; route-specific acceptance semantics) | see Product-Adapter Extension Seam below |
54
- | Adapter artifact | `humanish.adapter-artifact.v1` (`RunBundle.adapterArtifacts[]`; namespaced; local relative proof references) | see Product-Adapter Extension Seam below |
55
- | Shared-world evidence | `humanish.shared-world.v1` (additive `RunBundle.sharedWorld` + `RunBundle.attributionClass`; `topologyMode: sequential \| concurrent`) | see Shared-World Evidence below |
56
- | Comms thread | `humanish.comms-thread.v1` (off-app email/SMS the app sent, captured; a `kind: log` run-dir artifact of digests only: from/to/subject/link digests + one OTP count, never raw) | see `comms` under Study File |
57
- | Serve result | `humanish.serve-result.v1` (`src/observer/serve.ts` is authoritative) | none (command result envelope; see Serve Result below) |
58
- | Serve control plane | reserved (`/_humanish/api/*` answers `501` `HUMANISH_SERVE_CONTROL_PLANE_DISABLED` in v1) | none |
27
+ | Contract | Schema | Public-safe fixture |
28
+ | --------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- |
29
+ | Run bundle | `humanish.run-bundle.v1` | `synthetic-run-bundle` |
30
+ | Adapter | `humanish.adapter.v1` | `synthetic-cli-adapter` |
31
+ | Study file | `humanish.study.v3` | `first-run` |
32
+ | Persona | `humanish.persona.v1` | `synthetic-maintainer` |
33
+ | Scenario | `humanish.scenario.v1` | `first-run-smoke` |
34
+ | Actor trace | `humanish.actor-trace.v1` | `synthetic-actor-trace` |
35
+ | Substrate | reserved (never shipped) | none |
36
+ | Evidence stream | reserved (streams live inside the run bundle) | see [`run-bundle.md`](run-bundle.md) |
37
+ | Review | `humanish.review.v1` | `contract-proof-review` |
38
+ | Study analysis | `humanish.study-analysis.v1` (prompt `study-evidence-7` adds `findings[].headline`, `findings[].experience` and `designFindings[]`; older artifacts omit them; `study-evidence-8` adds participant impressions to the instructions, with no field change) | see [study analysis](study-analysis.md) and synthetic analysis fixtures in `tests/` |
39
+ | Study analysis correction | `humanish.study-analysis-correction.v1` | see [study analysis](study-analysis.md#human-review-and-sharing) |
40
+ | Analysis findings view | `humanish.analysis-findings.v1` (`review --json` field `analysis`; read-only projection of the selected analysis) | see [study analysis](study-analysis.md#reading-findings) |
41
+ | Analysis execution receipt | `humanish.analysis-execution.v1` | see [study analysis](study-analysis.md#durable-records) |
42
+ | Analysis execution start | `humanish.analysis-execution-start.v1` | see [study analysis](study-analysis.md#durable-records) |
43
+ | Verification | `humanish.verify-result.v1` | `five-check-verify` |
44
+ | Policy | `humanish.policy.v1` (fixture-only; not engine-validated) | `public-safety-policy` |
45
+ | Feedback | `humanish.feedback.v1` | `public-safe-feedback` |
46
+ | Terminal cost ledger | `humanish.terminal-cost-ledger.v1` | see Terminal Cost Ledger below |
47
+ | Terminal no-spend proof | `humanish.terminal-no-spend-proof.v1` | see Terminal Cost Ledger below |
48
+ | Pricing (operator-editable rates) | `humanish.pricing.v1` (`src/run/pricing.ts`; dated per-model + E2B desktop rates) | see Run Cost Summary And Estimated Actor Cost below |
49
+ | Run cost summary | `humanish.run-cost-summary.v1` (additive `RunBundle.cost`; estimate, never a charge) | see Run Cost Summary And Estimated Actor Cost below |
50
+ | Estimated actor cost | `humanish.actor-estimated-cost.v1` (additive `ActorTrace.estimatedCost`) | see Run Cost Summary And Estimated Actor Cost below |
51
+ | Model settings | `humanish.model-settings.v1` (additive `ActorTrace.modelSettings`; the reasoning effort the request carried) | see Actor Trace below |
52
+ | Affordance use | `humanish.affordance-use.v1` (additive `ActorTrace.affordanceUse`; per-class counts of the routes an actor took) | see Affordance Use below |
53
+ | Adapter score | `humanish.adapter-score.v1` (`RunBundle.adapterScore`; namespaced; route-specific acceptance semantics) | see Product-Adapter Extension Seam below |
54
+ | Adapter artifact | `humanish.adapter-artifact.v1` (`RunBundle.adapterArtifacts[]`; namespaced; local relative proof references) | see Product-Adapter Extension Seam below |
55
+ | Shared-world evidence | `humanish.shared-world.v1` (additive `RunBundle.sharedWorld` + `RunBundle.attributionClass`; `topologyMode: sequential \| concurrent`) | see Shared-World Evidence below |
56
+ | Comms thread | `humanish.comms-thread.v1` (off-app email/SMS the app sent, captured; a `kind: log` run-dir artifact of digests only: from/to/subject/link digests + one OTP count, never raw) | see `comms` under Study File |
57
+ | Serve result | `humanish.serve-result.v1` (`src/observer/serve.ts` is authoritative) | none (command result envelope; see Serve Result below) |
58
+ | Serve control plane | reserved (`/_humanish/api/*` answers `501` `HUMANISH_SERVE_CONTROL_PLANE_DISABLED` in v1) | none |
59
59
 
60
60
  ## Study File
61
61
 
@@ -970,8 +970,9 @@ Core-owned fields:
970
970
  - optional `modelSettings.maxOutputTokens`: the declared positive integer
971
971
  `actor.maxOutputTokens`, passed to every first-party OpenAI CUA response
972
972
  request, including reasoning output. Absent when undeclared. The first request
973
- of a session and closing reports use `min(maxOutputTokens, 1024)`, or 1024 when
974
- undeclared; the first request also carries the opening screenshot as an
973
+ of a session uses `min(maxOutputTokens, 1024)`, or 1024 when undeclared, and
974
+ closing requests use `min(maxOutputTokens, 3072)`, or 3072 when undeclared; the
975
+ first request also carries the opening screenshot as an
975
976
  `input_image` after the instructions. Unsupported routes,
976
977
  custom provider/session hooks, and per-participant overrides fail before allocation.
977
978
  This is an output-token limit, not an input-token, request-count or billing cap.
@@ -1014,6 +1015,28 @@ Core-owned fields:
1014
1015
  providers and on earlier bundles
1015
1016
  - optional `affordanceUse` (`humanish.affordance-use.v1`): which kind of route this
1016
1017
  actor took (see Affordance Use below)
1018
+ - optional `impressions`: what a computer-use participant said about the product
1019
+ at the end of its session. `status: collected` carries `items[]`, each a
1020
+ `kind` (`unclear`, `unfinished`, `untrustworthy`, `liked`, `missing`,
1021
+ `unlike_my_work`), a redacted first-person `text` of at most 500 characters
1022
+ and the `messageId` of the trace `message` that quotes it as
1023
+ `Impression (<kind>): <text>`. They are not counted in `counts.messages`. Up
1024
+ to six come from the closing account: a completed debrief's report, the
1025
+ participant's own final account when its provider writes a structured one
1026
+ (the Codex participant), or, when the participant ended the session itself
1027
+ without them, one impressions-only request (OpenAI computer-use, threaded or
1028
+ `explicit_context`). That request is recorded as `debrief` with `trigger:
1029
+ participant_end` and never has a `report` or `messageId`; it leaves the
1030
+ participant's `reason`, outcome and friction as they were. An empty `items`
1031
+ list means the participant named none. `status: not_collected` carries a
1032
+ `reason`: the closing report or impressions request was skipped or failed
1033
+ (including a reply cut off by the output limit), the participant ended the
1034
+ session without a structured closing account and its provider cannot ask for
1035
+ impressions (the Claude local agent), the closing account had no
1036
+ impressions, or the session stopped before a closing account. Every
1037
+ computer-use loop trace records one; absent on other routes and on earlier
1038
+ bundles. `debrief.report` keeps only `summary` and `frictionReports`.
1039
+ Impression messages do not count as participant-reported friction
1017
1040
  - optional `estimatedCost` (`humanish.actor-estimated-cost.v1`): a token-derived
1018
1041
  cost estimate for this participant (see Run Cost Summary And Estimated Actor Cost).
1019
1042
  It is deliberately a different field from `tokenUsage.costUsd`: a bare
@@ -266,6 +266,21 @@ a finding opens. Exposure and remaining unique limits are one disclosure away;
266
266
  observation details retain each original claim and its specific limitation.
267
267
  This presentation does not rewrite the saved analysis or reviewer corrections.
268
268
 
269
+ ## Participant impressions
270
+
271
+ A computer-use participant's closing impressions (`ActorTrace.impressions`) reach the packet as
272
+ ordinary `message` entries of that participant's stream, one per impression, with text
273
+ `Impression (<kind>): <text>`. They are quote-eligible and attributed by `streamId`, so feedback,
274
+ participant_statement observations and design findings can cite them under the existing rules.
275
+ Selection admits them right after the participant's last entry, ahead of the rest of its
276
+ session. The evidence mapping and `captureVersion` are unchanged.
277
+
278
+ The `study-evidence-8` prompt adds one paragraph: impressions are the participant's own opinions,
279
+ used as participant statements, and an `unlike my work` impression together with a capture of
280
+ that screen is a strong design finding. Validation is unchanged. A design finding still needs at
281
+ least one cited capture, so an impression plus the capture of its screen makes a design finding,
282
+ and an impression alone supports only a finding about what the participant said.
283
+
269
284
  ## Durable records
270
285
 
271
286
  The frozen `humanish.observer-data.v1` schema is unchanged. A companion
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "humanish",
3
- "version": "0.112.0",
3
+ "version": "0.113.0",
4
4
  "description": "Synthetic user research for apps, CLIs, and agent-facing product flows.",
5
5
  "keywords": [
6
6
  "cli",
@@ -190,16 +190,6 @@ Legacy profiles without it retain medium defaults for missing patience and
190
190
  technical confidence. Avoid contradictory prose and traits; inspect the compiled
191
191
  brief with `humanish study show <study> --json` before running.
192
192
 
193
- For an autonomous participant study, use a computer-use/local-agent study and write
194
- its `mission` as a believable situation and desired outcome. Supply fixture facts
195
- needed to act, but do not supply selectors, click sequences, hidden success rules,
196
- expected defects or recovery tricks. For example: “Saturday's event needs two
197
- setup volunteers and one cleanup volunteer. See whether this app helps you
198
- organize the event and keep people informed.” Do not instruct a participant to
199
- find a specific UI control merely to make the study succeed. Allow discovery,
200
- recovery and stopping appropriate to the participant. Keep researcher criteria in
201
- `tasks[].success`, separate from participant-facing `tasks[].goal`.
202
-
203
193
  Scripted regression checks are a different use of scenarios. When the requested
204
194
  work is deterministic verification of a known path, a `browser.steps` manifest
205
195
  can drive it with explicit selectors and assertions. It does not establish
@@ -232,6 +222,27 @@ tokens into scenario files.
232
222
 
233
223
  ## Authoring Studies
234
224
 
225
+ For an autonomous participant study, write `mission`, participant `instruction`
226
+ and `tasks[].goal` as a believable situation and desired outcome. Supply fixture
227
+ facts needed to act. Leave discovery, recovery and stopping to the participant.
228
+ Keep researcher criteria in `tasks[].success`.
229
+
230
+ | Bad: scripts the controls | Good: gives a situation |
231
+ | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
232
+ | Click "New event", type a title into the field, then press "Save" and open "Settings". | Saturday's event needs two setup volunteers and one cleanup volunteer. See whether this app helps you organize the event and keep people informed. |
233
+
234
+ `humanish study check` and `humanish run` warn about step lists, chains of UI
235
+ actions, quoted control labels, CSS selectors and URLs beyond the subject's entry
236
+ point. They quote up to three matched lines and suggest a situation-style mission.
237
+ The checks apply to computer-use and shared-world studies; scripted-browser and
238
+ terminal studies and `tasks[].success` are excluded. These warnings never refuse
239
+ a run, and the run records them in its bundle.
240
+
241
+ Give each participant a persona with a short, fictional `background` describing
242
+ their relevant experience and situation. A missing persona or background also
243
+ warns. Use `humanish study show <study> --json` to see what the participant receives.
244
+ Do not supply hidden success rules, expected defects or recovery tricks.
245
+
235
246
  Write reusable studies as `.yaml` study files (`humanish.study.v3`):
236
247
 
237
248
  ```yaml