humanish 0.95.0 → 0.96.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 (87) hide show
  1. package/README.md +4 -2
  2. package/dist/comms-agentmail.d.ts +25 -0
  3. package/dist/comms-agentmail.js +418 -0
  4. package/dist/comms-agentmail.js.map +1 -0
  5. package/dist/comms-connections.d.ts +4 -2
  6. package/dist/comms-connections.js +3 -3
  7. package/dist/comms-connections.js.map +1 -1
  8. package/dist/comms-lease-store.d.ts +90 -0
  9. package/dist/comms-lease-store.js +489 -0
  10. package/dist/comms-lease-store.js.map +1 -0
  11. package/dist/comms-receiving-evidence.d.ts +46 -0
  12. package/dist/comms-receiving-evidence.js +35 -0
  13. package/dist/comms-receiving-evidence.js.map +1 -0
  14. package/dist/comms-receiving-inbox.d.ts +16 -0
  15. package/dist/comms-receiving-inbox.js +410 -0
  16. package/dist/comms-receiving-inbox.js.map +1 -0
  17. package/dist/comms-receiving-runtime.d.ts +25 -0
  18. package/dist/comms-receiving-runtime.js +45 -0
  19. package/dist/comms-receiving-runtime.js.map +1 -0
  20. package/dist/comms-receiving-types.d.ts +98 -0
  21. package/dist/comms-receiving-types.js +2 -0
  22. package/dist/comms-receiving-types.js.map +1 -0
  23. package/dist/comms-receiving.d.ts +58 -0
  24. package/dist/comms-receiving.js +554 -0
  25. package/dist/comms-receiving.js.map +1 -0
  26. package/dist/comms-setup.d.ts +40 -0
  27. package/dist/comms-setup.js +121 -0
  28. package/dist/comms-setup.js.map +1 -0
  29. package/dist/concurrent-shared-world-lab.js +662 -624
  30. package/dist/concurrent-shared-world-lab.js.map +1 -1
  31. package/dist/cua-actor-lab.d.ts +4 -1
  32. package/dist/cua-actor-lab.js +98 -17
  33. package/dist/cua-actor-lab.js.map +1 -1
  34. package/dist/doctor-lab.js +11 -0
  35. package/dist/doctor-lab.js.map +1 -1
  36. package/dist/e2b-terminal-lab.js +3 -0
  37. package/dist/e2b-terminal-lab.js.map +1 -1
  38. package/dist/index.d.ts +2 -0
  39. package/dist/index.js +1 -0
  40. package/dist/index.js.map +1 -1
  41. package/dist/lab-config.d.ts +20 -3
  42. package/dist/lab-config.js +59 -6
  43. package/dist/lab-config.js.map +1 -1
  44. package/dist/lab-engine.js +8 -3
  45. package/dist/lab-engine.js.map +1 -1
  46. package/dist/lab-summary.d.ts +1 -0
  47. package/dist/lab-summary.js +8 -2
  48. package/dist/lab-summary.js.map +1 -1
  49. package/dist/observer-app.html +1 -1
  50. package/dist/observer-data.js +14 -1
  51. package/dist/observer-data.js.map +1 -1
  52. package/dist/oss-lab.d.ts +1 -1
  53. package/dist/oss-lab.js.map +1 -1
  54. package/dist/oss-meta-lab.d.ts +1 -1
  55. package/dist/oss-meta-lab.js.map +1 -1
  56. package/dist/program.d.ts +2 -0
  57. package/dist/program.js +100 -4
  58. package/dist/program.js.map +1 -1
  59. package/dist/run-narration-secrets.d.ts +5 -0
  60. package/dist/run-narration-secrets.js +68 -0
  61. package/dist/run-narration-secrets.js.map +1 -0
  62. package/dist/run.d.ts +7 -2
  63. package/dist/run.js +25 -3
  64. package/dist/run.js.map +1 -1
  65. package/dist/scripted-browser-lab.js +7 -0
  66. package/dist/scripted-browser-lab.js.map +1 -1
  67. package/dist/shared-world-lab.js +4 -0
  68. package/dist/shared-world-lab.js.map +1 -1
  69. package/dist/study-analysis-engine.js +30 -1
  70. package/dist/study-analysis-engine.js.map +1 -1
  71. package/dist/study-analysis-evidence.js +9 -1
  72. package/dist/study-analysis-evidence.js.map +1 -1
  73. package/dist/tui-app.js +134 -134
  74. package/dist/tui-contract.d.ts +13 -0
  75. package/dist/tui-contract.js.map +1 -1
  76. package/dist/tui-launch.d.ts +2 -0
  77. package/dist/tui-launch.js +9 -1
  78. package/dist/tui-launch.js.map +1 -1
  79. package/docs/architecture/comms-inbox.md +4 -0
  80. package/docs/architecture/real-email-receiving.md +135 -0
  81. package/docs/contracts/run-bundle.md +9 -1
  82. package/docs/contracts/schemas.md +20 -3
  83. package/docs/goals/current.md +5 -5
  84. package/docs/ramp/README.md +9 -5
  85. package/docs/release/0.96.0-real-email-receiving.md +47 -0
  86. package/package.json +2 -1
  87. package/skills/humanish/SKILL.md +33 -13
@@ -7,6 +7,8 @@ import type { TuiProjectState } from "./tui-project.js";
7
7
  import type { ReadRunIndexOptions, RunIndexResult } from "./run-index.js";
8
8
  import type { LaunchRunOptions, LaunchRunResult } from "./tui-launch.js";
9
9
  import type { CommsSetupResult, CommsSetupStatus } from "./comms-connections.js";
10
+ import type { CommsCheckResult, CommsConfigureResult } from "./comms-setup.js";
11
+ import type { CommsRecoveryEntry } from "./comms-receiving.js";
10
12
  /** The humanish version string shown in the frame, so a screenshot in a bug report is datable. */
11
13
  export interface TuiVersionInfo {
12
14
  cli: string;
@@ -21,6 +23,17 @@ export interface TuiCapabilities {
21
23
  comms?: {
22
24
  read(): Promise<CommsSetupStatus>;
23
25
  save(): Promise<CommsSetupResult>;
26
+ check?(): Promise<CommsCheckResult>;
27
+ labs?(): Promise<{
28
+ title: string;
29
+ path: string;
30
+ }[]>;
31
+ configure?(lab: string, apply: boolean, planToken?: string): Promise<CommsConfigureResult>;
32
+ recovery?(): Promise<CommsRecoveryEntry[]>;
33
+ recover?(runId: string, connectionName: string): Promise<{
34
+ ok: boolean;
35
+ message: string;
36
+ }>;
24
37
  };
25
38
  /** Read every run in the project, cheapest source first. */
26
39
  readRunIndex(cwd: string, options?: ReadRunIndexOptions): Promise<RunIndexResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"tui-contract.js","sourceRoot":"","sources":["../src/tui-contract.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,EAAE;AACF,6FAA6F;AAC7F,mGAAmG;AACnG,+EAA+E;AAC/E,EAAE;AACF,gGAAgG;AAChG,+FAA+F;AAC/F,gGAAgG;AAChG,mGAAmG;AACnG,6DAA6D;AAC7D,EAAE;AACF,mGAAmG;AACnG,mBAAmB;AAyGnB,mFAAmF;AACnF,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAErC;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,gBAAwB,OAAO,CAAC,OAAO;IACrE,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACvF,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,kBAAkB,CAAC;AAC/D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,OAAO,IAAI,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAKtC;IACC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO,+BAA+B,kBAAkB,cAAc,KAAK,CAAC,WAAW,mCAAmC,CAAC;IAC7H,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;QACzB,OAAO,8GAA8G,CAAC;IACxH,CAAC;IACD,OAAO,KAAK,CAAC,WAAW;QACtB,CAAC,CAAC,yEAAyE;QAC3E,CAAC,CAAC,kJAAkJ,CAAC;AACzJ,CAAC"}
1
+ {"version":3,"file":"tui-contract.js","sourceRoot":"","sources":["../src/tui-contract.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,EAAE;AACF,6FAA6F;AAC7F,mGAAmG;AACnG,+EAA+E;AAC/E,EAAE;AACF,gGAAgG;AAChG,+FAA+F;AAC/F,gGAAgG;AAChG,mGAAmG;AACnG,6DAA6D;AAC7D,EAAE;AACF,mGAAmG;AACnG,mBAAmB;AAgHnB,mFAAmF;AACnF,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAErC;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,gBAAwB,OAAO,CAAC,OAAO;IACrE,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACvF,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,kBAAkB,CAAC;AAC/D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,OAAO,IAAI,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAKtC;IACC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO,+BAA+B,kBAAkB,cAAc,KAAK,CAAC,WAAW,mCAAmC,CAAC;IAC7H,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;QACzB,OAAO,8GAA8G,CAAC;IACxH,CAAC;IACD,OAAO,KAAK,CAAC,WAAW;QACtB,CAAC,CAAC,yEAAyE;QAC3E,CAAC,CAAC,kJAAkJ,CAAC;AACzJ,CAAC"}
@@ -4,6 +4,8 @@ export interface LaunchRunOptions {
4
4
  cwd: string;
5
5
  /** The manifest handle (filename stem), as `humanish lab run` takes it. */
6
6
  lab: string;
7
+ /** Exact selected manifest, avoiding a same-name committed lab shadowing a local copy. */
8
+ manifestPath?: string;
7
9
  mode: "dry-run" | "live";
8
10
  /** Injected in tests; defaults to the real spawn. */
9
11
  spawn?: typeof spawn;
@@ -15,6 +15,7 @@ import { constants as fsConstants } from "node:fs";
15
15
  import { open } from "node:fs/promises";
16
16
  import path from "node:path";
17
17
  import { fileURLToPath } from "node:url";
18
+ import { resolveLabManifest } from "./labs.js";
18
19
  import { prepareManagedHumanishOutputDirectory } from "./selected-output-paths.js";
19
20
  /**
20
21
  * A lab handle is the manifest FILENAME, which is what `humanish lab run` resolves. Restricted to
@@ -49,6 +50,13 @@ export async function launchRun(options) {
49
50
  };
50
51
  }
51
52
  const cwd = path.resolve(options.cwd);
53
+ let selectedLab = options.lab;
54
+ if (options.manifestPath !== undefined) {
55
+ const resolved = await resolveLabManifest(cwd, options.manifestPath);
56
+ if (!resolved.ok)
57
+ return { ok: false, error: { code: "HUMANISH_LAUNCH_INVALID_LAB", message: "The selected lab path could not be read safely. Refresh the lab list." } };
58
+ selectedLab = path.relative(cwd, path.resolve(cwd, resolved.path)).replace(/\\/g, "/");
59
+ }
52
60
  const now = options.now ?? (() => new Date());
53
61
  const spawnFn = options.spawn ?? spawn;
54
62
  const launchedAt = now().toISOString();
@@ -88,7 +96,7 @@ export async function launchRun(options) {
88
96
  ...(options.mode === "dry-run" ? ["--dry-run"] : []),
89
97
  // `--` ends option parsing, so the handle can only ever be read as the positional argument.
90
98
  "--",
91
- options.lab
99
+ selectedLab
92
100
  ];
93
101
  const spawnOptions = {
94
102
  cwd,
@@ -1 +1 @@
1
- {"version":3,"file":"tui-launch.js","sourceRoot":"","sources":["../src/tui-launch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tui-launch.js","sourceRoot":"","sources":["../src/tui-launch.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,9 @@
1
1
  # Participant inboxes
2
2
 
3
+ This page describes local capture. For fresh hosted inboxes, see
4
+ [real email receiving](real-email-receiving.md); that route has a separate
5
+ parsed renderer, strict remote-asset blocking and private lease lifecycle.
6
+
3
7
  The catch captures application mail without sending it to an external recipient.
4
8
  Humanish gives each participant an address and a matching
5
9
  `/inbox/for/<address-digest>` URL. The same address scope applies to list, message,
@@ -0,0 +1,135 @@
1
+ # Real email receiving
2
+
3
+ A supported browser study can give each participant a fresh AgentMail inbox. The
4
+ application sends real email to that address; Humanish polls it on the host and
5
+ publishes a private inbox surface on that participant's desktop. The participant
6
+ can read the original email, switch to a plain view and follow an approved link.
7
+
8
+ Use local capture when you can redirect the app's send configuration and want to
9
+ avoid hosted mail. Use real receiving when the app must send normally or delivery
10
+ itself is part of the flow. These are separate modes; do not combine their settings.
11
+ SMS and participant outbound mail are not supported.
12
+
13
+ ## Setup
14
+
15
+ Open `humanish tui`, press **c**, and add an AgentMail key. Hidden entry saves it
16
+ in the existing user key store and checks authentication without creating an inbox.
17
+ The project profile stores only the provider and environment-variable name.
18
+ Environment and explicit env-file values retain precedence over saved keys.
19
+ A rejected or unavailable authentication check does not delete the saved key.
20
+ Authentication does not prove inbox creation/deletion permissions, quota or delivery.
21
+ This release requires an organization-scoped key.
22
+
23
+ Connections can preview and save a receiving-enabled local lab copy. The preview
24
+ discloses hosted email, model processing, local review and separate provider charges.
25
+ The original manifest is preserved. Select the new exact path when launching.
26
+
27
+ The same operations are available to agents:
28
+
29
+ ```bash
30
+ humanish keys set agentmail
31
+ humanish comms connections add agentmail --json
32
+ humanish comms check --online --json
33
+ humanish comms configure --lab humanish/labs/signup.yaml --json
34
+ # Review the returned path, disclosures and planToken, then:
35
+ humanish comms configure --lab humanish/labs/signup.yaml --apply --plan-token <digest> --json
36
+ humanish lab run .humanish/local/labs/signup-receiving.yaml --json --no-open
37
+ ```
38
+
39
+ Direct manifest authoring selects a saved connection:
40
+
41
+ ```yaml
42
+ comms:
43
+ email:
44
+ connection: agentmail
45
+ # Optional: additional trusted email-link destinations, exact origins only.
46
+ allowedOrigins:
47
+ - https://accounts.example.test
48
+ ```
49
+
50
+ The target origin is automatically allowed. On provisioned subjects, the declared
51
+ serve origin and optional `linkOrigin` use the existing target-origin rewrite.
52
+ Review additional origins as destinations the participant is allowed to open from
53
+ mail. This policy governs the inbox surface, not all later browser navigation.
54
+
55
+ Supported execution is hosted computer use with app-url, clone or local-tree
56
+ subjects, including concurrent shared-world studies. Sequential shared-world,
57
+ local-agent, scripted, terminal, desktop-cli, in-process and local-app routes reject
58
+ real receiving before allocation. Connection mode cannot declare capture options,
59
+ recipients or borrowed mailbox IDs. A fresh address is not an existing account;
60
+ assignments must allow signup or arranging mail to the new identity.
61
+
62
+ ## What a run does
63
+
64
+ 1. Resolve the selected connection and host credential. Reject forwarding that
65
+ management credential through target environment names, aliases or literals.
66
+ 2. Authenticate and durably record each acquisition intent in private host state.
67
+ Acquire all participant addresses before starting desktops.
68
+ 3. Give each participant its address and loopback inbox URL. No management key or
69
+ other participant's mailbox is installed in its desktop. Each surface has only
70
+ its own list/message/plain/JSON routes, with no send endpoint or aggregate inbox.
71
+ 4. Poll received mail, register scrub targets, sanitize/render and atomically
72
+ publish the complete inbox snapshot. Repeated reads can fill temporarily missing
73
+ bodies and inline images without changing local message identity.
74
+ 5. Before desktop teardown, perform a bounded final read, save evidence, stop the
75
+ inbox surface and request deletion. Confirm provider absence; otherwise retain
76
+ unresolved cleanup for recovery. Provider deletion is not an erasure guarantee.
77
+
78
+ The original view preserves supported email structure and inline PNG/JPEG/GIF/WebP
79
+ images. Parsed HTML removes active content; response CSP blocks scripts, forms,
80
+ frames and remote assets. Remote images show an explicit unavailable placeholder.
81
+ Links use the same origin policy in original, plain and JSON views. Attachment
82
+ bytes are fetched only through the fixed provider API and its observed CDN host;
83
+ provider authorization never goes to the CDN. General attachments, arbitrary remote
84
+ images and raw-MIME fallback are unsupported. Raster checks are bounded signature
85
+ checks, not a guarantee that every malformed image will decode in a browser.
86
+
87
+ Collection is bounded by request time, request/page count, bytes, images and a
88
+ 100-message retained inbox limit. Limits, failed reads, blocked content and failed
89
+ publication are recorded as coverage limitations. Inbox pages require reload to
90
+ show later messages. No webhook/public mail ingress is required on the host.
91
+
92
+ ## Evidence and publication
93
+
94
+ `comms/receiving.json` uses `humanish.comms-receiving.v2`. It records local IDs,
95
+ counts, timestamps and lifecycle/coverage status, without raw mail, provider IDs,
96
+ addresses or stable content digests. The final run bundle embeds that projection.
97
+ Receipt, successful inbox publication, participant reading and target success are
98
+ separate claims; analysis receives this distinction and the harness limitations.
99
+ A missing message alone does not establish that the application failed to send.
100
+ Immediate automatic analysis scrubs known exact values from generated narration
101
+ using a bounded, invocation-local registry. It never saves that registry. Later
102
+ analysis cannot reconstruct it; screenshots may still expose mail content, and the
103
+ publication restriction applies to both immediate and later findings.
104
+
105
+ Mail is hosted by AgentMail. Its content can reach the hosted desktop, actor model,
106
+ screenshots, narration and analysis model. Such runs carry a durable
107
+ `real-communications` publication restriction: verification returns `local_only`,
108
+ public feedback/exposure and shareable exports remain gated, and screenshot
109
+ blurring does not clear the restriction. Local Observer review and explicitly local
110
+ HTML export remain available. Local-only publication is not local-only processing.
111
+
112
+ ## Interrupted-run recovery
113
+
114
+ Process interruption can bypass normal final reads and teardown. Inspect recovery
115
+ state after stopping a run; do not assume Ctrl+C or killing a process deleted its
116
+ inboxes:
117
+
118
+ ```bash
119
+ humanish comms recover --json
120
+ humanish comms recover --run <run-id> --apply --json
121
+ ```
122
+
123
+ Connections also exposes pending cleanup. Recovery only uses private host journals
124
+ under `$XDG_STATE_HOME/humanish/comms` (default `~/.local/state/humanish/comms`),
125
+ with private directories/files and bound project, connection, account and scope.
126
+ A live or unknown owner blocks takeover. The adapter checks resource/client identity
127
+ before deletion; it cannot delete an inbox named only in a run artifact. Lost
128
+ creation responses can be reconciled through the recorded idempotent client ID.
129
+ Do not delete private journals while resources remain unresolved. Moving/replacing
130
+ the project or changing account/scope can intentionally prevent recovery.
131
+
132
+ If final evidence persistence fails, the provider inbox is retained as unresolved
133
+ rather than discarding the last retrievable copy. Explicit recovery is a deletion
134
+ operation, not message-history reconstruction. Sandbox reclamation remains a
135
+ separate operation.
@@ -468,7 +468,7 @@ bundle is safe to promote into a public issue. Public promotion should branch on
468
468
  `shareSafety.status`:
469
469
 
470
470
  - `share_ready`: feedback draft commands may render public issue payloads;
471
- - `local_only`: keep the run local or generate a redacted replacement bundle;
471
+ - `local_only`: keep the run local; only supported redaction-only cases can produce a shareable derivative;
472
472
  - `blocked`: fix the verification or public-safety failure first.
473
473
 
474
474
  The local-evidence check includes screenshots declared only by
@@ -487,6 +487,14 @@ over a blurred declaration. Missing or unknown per-frame metadata retains the
487
487
  existing permissive compatibility behavior; verification does not infer pixel
488
488
  privacy from that absence.
489
489
 
490
+ Real email receiving adds `publication.restrictions: [real-communications]` and
491
+ an optional `commsReceiving` projection using `humanish.comms-receiving.v2`.
492
+ Either field contributes `REAL_COMMUNICATIONS` and keeps the run `local_only`.
493
+ This applies to interrupted bundles and after screenshot blurring: real mail can
494
+ appear in text and analysis as well as pixels. Malformed receiving metadata fails
495
+ bundle validation. The projection holds counts, local IDs and lifecycle/coverage
496
+ status; private provider identities and cleanup authority are kept outside the run.
497
+
490
498
  ## Redacted Derivative Workspace
491
499
 
492
500
  `humanish export --run RUN --format bundle --redact-screenshots --out DIRECTORY`
@@ -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.95.0`; it is not an exhaustive inventory of command/result envelopes. Exported types,
6
+ `0.96.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.
@@ -325,7 +325,7 @@ connections:
325
325
  apiKeyEnv: AGENTMAIL_API_KEY
326
326
  ```
327
327
 
328
- Only AgentMail setup is currently supported. Connection names use lowercase
328
+ AgentMail supports setup and fresh per-participant email receiving. Connection names use lowercase
329
329
  letters, digits and hyphens, beginning with a letter, up to 48 characters.
330
330
  `apiKeyEnv` names an environment variable; it never contains its value.
331
331
  Invalid fields, unsupported providers and unsafe filesystem paths are rejected.
@@ -336,7 +336,24 @@ profiles and local key presence/source, not provider authentication or delivery.
336
336
  `comms providers --json` returns `humanish.comms-providers.v1` with explicit
337
337
  setup/receiving availability. The key store accepts `humanish keys set agentmail`.
338
338
  Saving a connection neither modifies a lab nor creates a provider resource;
339
- `comms.email.connection` in a study remains unsupported and is rejected.
339
+ a supported study explicitly selects `comms.email: { connection: agentmail }`.
340
+ Optional `allowedOrigins` lists exact additional HTTP(S) origins; `linkOrigin`
341
+ participates in the existing provisioned-subject origin rewrite. Connection
342
+ selection cannot be combined with capture settings, recipients or provider options.
343
+ The derived internal kind is `real`; do not write `kind` beside a connection.
344
+
345
+ `comms check --online --json` returns `humanish.comms-check.v1`. Authentication,
346
+ credential presence, unknown permissions/capacity and untested delivery are separate.
347
+ `comms configure` previews/saves an ignored local manifest; `comms recover`
348
+ inspects or explicitly recovers privately owned interrupted leases.
349
+
350
+ Real receiving writes `humanish.comms-receiving.v2` count-only evidence with
351
+ participant-local message IDs, observation/publication timestamps, limitations,
352
+ acquisition and cleanup status. It contains no raw addresses, bodies, provider IDs
353
+ or content digests. `run.json` embeds the final projection as `commsReceiving` and
354
+ carries `publication.restrictions: [real-communications]`. Verification keeps the
355
+ run local-only regardless of screenshot redaction. See the
356
+ [receiving contract](../architecture/real-email-receiving.md).
340
357
 
341
358
  Lab backends report results in their own schemas (`humanish.run-result.v1`,
342
359
  `humanish.oss-lab-result.v1`, `humanish.oss-meta-lab-result.v1`,
@@ -1,9 +1,9 @@
1
1
  # Current Goals
2
2
 
3
- Status date: 2026-09-20. Release baseline: `0.95.0`.
3
+ Status date: 2026-09-21. Release baseline: `0.96.0`.
4
4
 
5
5
  This page guides work on current merged source. Published behavior is described
6
- in the [release notes](../release/0.95.0-connections-setup.md).
6
+ in the [release notes](../release/0.96.0-real-email-receiving.md).
7
7
  The [September 9 history](https://github.com/danielgwilson/humanish/blob/main/docs/goals/current-history-2026-09-09.md)
8
8
  preserves the former status log; its queues do not supersede this page.
9
9
 
@@ -88,7 +88,7 @@ requires decision-equivalent retained evidence and a real deletion branch.
88
88
  No first-party deletion branch has met that gate. Public demonstrations do not
89
89
  substitute for it.
90
90
 
91
- ## Current Program Truth (source `0.95.0`)
91
+ ## Current Program Truth (source `0.96.0`)
92
92
 
93
93
  | Surface | Available in merged source | Remaining boundary |
94
94
  | --- | --- | --- |
@@ -100,8 +100,8 @@ substitute for it.
100
100
  | Observer | Live/recorded views, shared grid and participant playback, participant assignments, action-specific links, saved moments, zoom, comparison and phone-width review | Sparse captures cannot prove every action's effect; visual comparison alone is not a controlled experiment |
101
101
  | Review and feedback | Verification grades, feedback drafts, portable HTML, redacted bundle derivatives and computer-use completion-source labels | Sharing requires the appropriate grade; participant reports and condition matches still need task adjudication |
102
102
  | Study findings | Default post-run analysis on supported live routes with a separate disclosed $3 admission estimate limit and opt-out; explicit `analyze`, fairer evidence selection, concern review and versioned findings with exact source links | Model interpretation needs review; bounded selection and source truncation limit coverage; opening Observer never dispatches analysis |
103
- | TUI and serving | Detached starts, run stopping, reclamation, Observer attachment, loopback serving, run library and AgentMail connection/key setup | Stopping a process does not itself prove sandbox cleanup; TUI views over CLI `stats`/`export` remain follow-ups |
104
- | Off-app communication | Recipient-scoped synthetic email inboxes, supported inline raster images, email capture and digest-only thread evidence | Scope prevents accidental cross-recipient browsing; it is not tenant authentication or real-provider delivery. AgentMail setup does not enable receiving; SMS is not a configured execution route |
103
+ | TUI and serving | Detached starts, run stopping, reclamation, Observer attachment, loopback serving, run library and AgentMail setup, authentication and lab configuration | Stopping a process does not itself prove sandbox cleanup; TUI views over CLI `stats`/`export` remain follow-ups |
104
+ | Off-app communication | Recipient-scoped local capture and fresh real AgentMail receiving, supported inline raster images, bounded collection and host-owned recovery | Real mail uses isolated participant surfaces and remains local-only for publication. Hosted mail/model processing, bounded fidelity and interrupted-run recovery are explicit; local-agent, borrowed inboxes and SMS are unsupported |
105
105
  | Mobile and media | Hosted viewport/emulation, desktop geometry checks, bounded dwell and declared camera feed; a synthetic video-only call with separate hosted peers is proven | Audio, TURN, provider-specific rooms, physical-device and touch fidelity remain unproven; unsupported media declarations are rejected |
106
106
 
107
107
  Use the [task support matrix](../architecture/task-protocol-support.md),
@@ -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.95.0` (2026-09-20). The Observer is phone-usable as a stated requirement (observer/AGENTS.md); interactive primitives start from Base UI. The Observer renderer is the observer/ workspace artifact only; the legacy string-concat renderer was deleted at cutover (#426), and rollback is a version pin to 0.42.0. The containment boundary introduced in
5
+ Package/source version in this tree: `0.96.0` (2026-09-21). The Observer is phone-usable as a stated requirement (observer/AGENTS.md); interactive primitives start from Base UI. The Observer renderer is the observer/ workspace artifact only; the legacy string-concat renderer was deleted at cutover (#426), and rollback is a version pin to 0.42.0. 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
@@ -47,10 +47,14 @@ If a change does not improve one of those loops, it probably belongs elsewhere.
47
47
 
48
48
  ## Current State
49
49
 
50
- The [0.95.0 release note](../release/0.95.0-connections-setup.md) describes
51
- AgentMail connection setup, hidden key entry and return to the TUI, matching
52
- CLI setup commands, and truthful credential status. Real email receiving is
53
- still unavailable; saved connections cannot be used in studies yet.
50
+ The [0.96.0 release note](../release/0.96.0-real-email-receiving.md) describes
51
+ fresh per-participant AgentMail inboxes, isolated desktop mail views, host-owned
52
+ cleanup/recovery, local-only evidence publication, and authentication/configuration
53
+ in Connections. SMS and local-agent receiving remain unsupported.
54
+
55
+ The [0.95.0 release note](../release/0.95.0-connections-setup.md) introduced
56
+ connection profiles and hidden key entry; 0.96.0 makes those connections usable
57
+ in supported browser studies.
54
58
 
55
59
  The [0.94.0 release note](../release/0.94.0-reliability.md) describes analysis
56
60
  request deadlines and budget-aware output, smaller portable recordings,
@@ -0,0 +1,47 @@
1
+ # 0.96.0 — Real email receiving
2
+
3
+ Supported browser studies can now give each participant a fresh AgentMail inbox.
4
+ The application sends normally; participants open their own inbox, read the email
5
+ and follow its confirmation link. Local capture remains a separate option for
6
+ apps whose send configuration can point at a test catch.
7
+
8
+ Connections checks authentication after hidden key entry and offers lab
9
+ configuration and pending cleanup. Lab configuration previews a separate ignored
10
+ copy, preserves the original, checks for stale previews and launches by exact
11
+ selected path. Agents have matching `comms check`, `comms configure` and
12
+ `comms recover` commands.
13
+
14
+ Provider credentials remain on the host. Participants receive isolated loopback
15
+ mail surfaces with original/plain views, supported inline raster images and a
16
+ consistent allowed-origin link policy. Remote images and active HTML are blocked;
17
+ missing content is explicit. Collection and publication are bounded and distinct
18
+ from a participant reading mail. Later reads can fill temporarily missing content.
19
+
20
+ Fresh mailbox ownership is recorded privately before acquisition. Normal teardown
21
+ saves evidence and confirms provider deletion. Interrupted runs have explicit,
22
+ project/account-bound recovery; mutable recording IDs cannot authorize deletion.
23
+ Evidence-write failures retain the inbox as unresolved.
24
+
25
+ Real mail may reach hosted desktops, actor/analysis models and recordings. These
26
+ runs have a durable `local_only` publication restriction; blurring screenshots
27
+ does not make them shareable. Immediate analysis uses the run's temporary scrub
28
+ registry for generated narration, without saving raw secret values. Later analysis
29
+ cannot reconstruct that registry and remains subject to the same publication gate.
30
+
31
+ This release supports hosted computer-use app-url, clone and local-tree routes,
32
+ including concurrent shared worlds. It rejects local-agent and unsupported routes
33
+ before allocation. SMS, outbound participant mail, borrowed inboxes, arbitrary
34
+ attachments and raw-MIME fallback remain unavailable.
35
+
36
+ See [setup, behavior and recovery](../architecture/real-email-receiving.md) for
37
+ configuration, processing disclosures and limits.
38
+
39
+ Validation includes captured provider-wire contracts, crash/recovery and credential
40
+ isolation tests, outer-runner tests for clone/local-tree and concurrent shared-world
41
+ routes, inbox browser checks at desktop/phone widths, and hidden-key TUI proof.
42
+ A retained live app-url study, `real-email-57ed0512-218d-4e58-9f76-c540541d0b56`,
43
+ had two concurrent participants receive separate emails, follow their own links,
44
+ reach the target dashboard and finish automatic analysis. Provider absence was
45
+ confirmed for both participant inboxes and the synthetic sender. Raw mail and
46
+ recordings remain private. This does not establish delivery for every target app
47
+ or live-provider coverage of every execution route.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "humanish",
3
- "version": "0.95.0",
3
+ "version": "0.96.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": [
@@ -94,6 +94,7 @@
94
94
  "homepage": "https://github.com/danielgwilson/humanish#readme",
95
95
  "dependencies": {
96
96
  "commander": "^14.0.3",
97
+ "parse5": "^8.0.1",
97
98
  "playwright-core": "^1.60.0",
98
99
  "pngjs": "^7.0.0",
99
100
  "undici": "^6.28.1",
@@ -49,7 +49,11 @@ project-local. Never ask for the key in chat. The CLI alternative is
49
49
  authorized credential source), followed by
50
50
  `humanish comms connections add agentmail --json`. Existing env/file precedence
51
51
  and `HUMANISH_STRICT_KEYS=1` still apply. Read installed provider capabilities:
52
- this release supports setup only, not authenticated checks or real email delivery.
52
+ use `humanish comms check --online --json` for read-only authentication.
53
+ Authentication does not establish mailbox permissions, capacity or delivery.
54
+ `humanish comms configure --lab <path> --json` previews an ignored lab copy;
55
+ add `--apply --plan-token <digest>` to save the reviewed version. Launch its
56
+ exact returned path, not a basename that could resolve to another manifest.
53
57
 
54
58
  ## Setup Workflow
55
59
 
@@ -216,18 +220,34 @@ npx humanish lab run first-run --json --no-open
216
220
 
217
221
  ### Off-app email verification (comms)
218
222
 
219
- When a flow is gated behind an email the app itself sends — a signup
220
- verification link, a one-time code, a magic link — add a `comms:` block. The
221
- harness redirects the app's email-API sends into a catch INSIDE the sandbox (no
222
- mail leaves the machine), gives the persona a synthetic inbox to open and click
223
- through, and writes a digest-only `humanish.comms-thread.v1` evidence artifact (no
224
- raw address/link/code persists). Reach for this whenever a persona must read mail
225
- the app sent it to finish a step.
226
-
227
- Lab execution supports email capture only. `comms.sms`, saved connection
228
- selectors and unknown channel names are rejected. AgentMail connection/key
229
- setup is available separately; it does not enable real receiving yet. Real SMS
230
- delivery is also unavailable; a message-bus type does not establish route support.
223
+ When a flow needs an email from the app — a verification link, one-time code or
224
+ magic link — configure an inbox so the participant can read and use that message.
225
+ Humanish supports local capture and fresh hosted receiving, with different setup
226
+ and privacy behavior.
227
+
228
+ Choose the transport to match the app:
229
+
230
+ - **Local capture** (below): app send configuration can point at a test catch;
231
+ no external mail service is needed. It tests the email flow without proving
232
+ real delivery.
233
+ - **Real AgentMail receiving**: use `comms.email: { connection: agentmail }`.
234
+ Humanish acquires one fresh hosted inbox per participant before desktops start.
235
+ The app sends normally. Requires a configured organization-scoped key and
236
+ app-url/clone/local-tree hosted computer-use participants; concurrent shared
237
+ worlds work, sequential shared worlds and local-agent do not. Do not combine
238
+ connection with capture settings or substitute fresh addresses for existing
239
+ account identities. `allowedOrigins` can name additional trusted link origins.
240
+
241
+ Real mail can reach hosted desktops, actor models and analysis models. Screenshots
242
+ can contain it. Such runs remain `local_only` even after screenshot blurring;
243
+ this is a publication restriction, not local-only processing. Provider charges
244
+ and model charges are separate. Use `humanish comms recover --json` after an
245
+ interrupted run, then `humanish comms recover --run <id> --apply --json` for its
246
+ privately recorded resources. Never derive deletion authority from run artifacts.
247
+ SMS, participant sending, borrowed inboxes and other providers remain unavailable.
248
+ See `docs/architecture/real-email-receiving.md` for limits and recovery.
249
+
250
+ The following configuration selects **local capture**:
231
251
 
232
252
  ```yaml
233
253
  comms: