humanish 0.94.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 (95) hide show
  1. package/README.md +10 -0
  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 +52 -0
  6. package/dist/comms-connections.js +123 -0
  7. package/dist/comms-connections.js.map +1 -0
  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.d.ts +7 -0
  35. package/dist/doctor-lab.js +26 -7
  36. package/dist/doctor-lab.js.map +1 -1
  37. package/dist/e2b-terminal-lab.js +3 -0
  38. package/dist/e2b-terminal-lab.js.map +1 -1
  39. package/dist/index.d.ts +2 -0
  40. package/dist/index.js +1 -0
  41. package/dist/index.js.map +1 -1
  42. package/dist/key-resolution.d.ts +1 -1
  43. package/dist/key-resolution.js +6 -4
  44. package/dist/key-resolution.js.map +1 -1
  45. package/dist/lab-config.d.ts +20 -3
  46. package/dist/lab-config.js +65 -3
  47. package/dist/lab-config.js.map +1 -1
  48. package/dist/lab-engine.js +8 -3
  49. package/dist/lab-engine.js.map +1 -1
  50. package/dist/lab-summary.d.ts +3 -2
  51. package/dist/lab-summary.js +17 -7
  52. package/dist/lab-summary.js.map +1 -1
  53. package/dist/observer-app.html +1 -1
  54. package/dist/observer-data.js +14 -1
  55. package/dist/observer-data.js.map +1 -1
  56. package/dist/oss-lab.d.ts +1 -1
  57. package/dist/oss-lab.js.map +1 -1
  58. package/dist/oss-meta-lab.d.ts +1 -1
  59. package/dist/oss-meta-lab.js.map +1 -1
  60. package/dist/program.d.ts +4 -0
  61. package/dist/program.js +231 -74
  62. package/dist/program.js.map +1 -1
  63. package/dist/run-narration-secrets.d.ts +5 -0
  64. package/dist/run-narration-secrets.js +68 -0
  65. package/dist/run-narration-secrets.js.map +1 -0
  66. package/dist/run.d.ts +7 -2
  67. package/dist/run.js +25 -3
  68. package/dist/run.js.map +1 -1
  69. package/dist/scripted-browser-lab.js +7 -0
  70. package/dist/scripted-browser-lab.js.map +1 -1
  71. package/dist/secret-prompt.d.ts +2 -0
  72. package/dist/secret-prompt.js +36 -0
  73. package/dist/secret-prompt.js.map +1 -0
  74. package/dist/shared-world-lab.js +4 -0
  75. package/dist/shared-world-lab.js.map +1 -1
  76. package/dist/study-analysis-engine.js +30 -1
  77. package/dist/study-analysis-engine.js.map +1 -1
  78. package/dist/study-analysis-evidence.js +9 -1
  79. package/dist/study-analysis-evidence.js.map +1 -1
  80. package/dist/tui-app.js +135 -135
  81. package/dist/tui-contract.d.ts +26 -1
  82. package/dist/tui-contract.js.map +1 -1
  83. package/dist/tui-launch.d.ts +2 -0
  84. package/dist/tui-launch.js +9 -1
  85. package/dist/tui-launch.js.map +1 -1
  86. package/docs/architecture/comms-inbox.md +4 -0
  87. package/docs/architecture/real-email-receiving.md +135 -0
  88. package/docs/contracts/run-bundle.md +9 -1
  89. package/docs/contracts/schemas.md +50 -5
  90. package/docs/goals/current.md +5 -5
  91. package/docs/ramp/README.md +13 -3
  92. package/docs/release/0.95.0-connections-setup.md +38 -0
  93. package/docs/release/0.96.0-real-email-receiving.md +47 -0
  94. package/package.json +4 -2
  95. package/skills/humanish/SKILL.md +55 -14
@@ -6,6 +6,9 @@ import type { TuiActionResult } from "./tui-actions.js";
6
6
  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
+ 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";
9
12
  /** The humanish version string shown in the frame, so a screenshot in a bug report is datable. */
10
13
  export interface TuiVersionInfo {
11
14
  cli: string;
@@ -16,6 +19,22 @@ export interface TuiVersionInfo {
16
19
  * one place, and anything absent here is something the TUI simply cannot do.
17
20
  */
18
21
  export interface TuiCapabilities {
22
+ /** Optional for older embedders. Credentials are never returned to the view. */
23
+ comms?: {
24
+ read(): Promise<CommsSetupStatus>;
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
+ }>;
37
+ };
19
38
  /** Read every run in the project, cheapest source first. */
20
39
  readRunIndex(cwd: string, options?: ReadRunIndexOptions): Promise<RunIndexResult>;
21
40
  /**
@@ -62,6 +81,9 @@ export interface TuiCapabilities {
62
81
  initProject(cwd: string): Promise<TuiActionResult>;
63
82
  }
64
83
  export interface TuiOptions {
84
+ /** Return to setup after the host-owned hidden prompt has finished. */
85
+ initialScreen?: "connections";
86
+ connectionNotice?: string;
65
87
  /** The project the surface is reading. Already resolved by the CLI. */
66
88
  cwd: string;
67
89
  version: TuiVersionInfo;
@@ -80,7 +102,10 @@ export interface TuiOptions {
80
102
  * Start the surface. Resolves with the process exit code when the operator quits — the TUI owns the
81
103
  * screen until then, so the CLI must not write to stdout while this is pending.
82
104
  */
83
- export type StartTui = (options: TuiOptions) => Promise<number>;
105
+ export type TuiHandoff = {
106
+ action: "agentmail-key";
107
+ };
108
+ export type StartTui = (options: TuiOptions) => Promise<number | TuiHandoff>;
84
109
  /** The shape `dist/tui-app.js` exports. Asserted at the load boundary in program.ts. */
85
110
  export interface TuiModule {
86
111
  startTui: StartTui;
@@ -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;AA+FnB,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.94.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.
@@ -265,10 +265,13 @@ A lab is a composition over code primitives, not a hardcoded kind:
265
265
  `redactScreenshots: true` (blur unimplemented there) and
266
266
  `allowPublicTargets: true` fail-closed rather than ignoring them.
267
267
  - `comms` (#297; hosted on the clone/local-tree computer-use lanes and the
268
- CONCURRENT shared-world getHost plane — warned inert everywhere else,
269
- including app-url/operator-provided subjects and the sequential
270
- `concurrency: 1` shared world, neither of which has a catch to host): off-app
271
- email/SMS the app itself SENDS, made a persona-driven testable surface.
268
+ concurrent shared-world getHost plane, or connected to an external catch on
269
+ app-url/operator-provided subjects; unwired on sequential `concurrency: 1`
270
+ shared worlds): off-app
271
+ email the app itself sends, made a persona-driven testable surface. Lab
272
+ configuration rejects `comms.sms` and unknown channel names; message-bus SMS
273
+ types do not imply a supported SMS execution route. SMTP capture is supported
274
+ on per-lane provisioned routes and rejected for shared-world studies.
272
275
  `comms.email` = `{ kind: fake, injectEnv?, port?, recipients?, linkOrigin?, external? }`.
273
276
  `injectEnv` is the ADOPTER-NAMED env var the app reads for its email-API base
274
277
  URL (e.g. `RESEND_API_URL`); the harness sets it to an in-sandbox catch (so it
@@ -310,6 +313,48 @@ A lab is a composition over code primitives, not a hardcoded kind:
310
313
  persona saw the email is its screenshots of the inbox page. Requires `python3`
311
314
  in the subject sandbox (the stock E2B desktop template has it).
312
315
 
316
+ ### Communication connection setup
317
+
318
+ `.humanish/local/comms.yaml` is a project-local, non-secret configuration file:
319
+
320
+ ```yaml
321
+ schema: humanish.comms-connections.v1
322
+ connections:
323
+ agentmail:
324
+ provider: agentmail
325
+ apiKeyEnv: AGENTMAIL_API_KEY
326
+ ```
327
+
328
+ AgentMail supports setup and fresh per-participant email receiving. Connection names use lowercase
329
+ letters, digits and hyphens, beginning with a letter, up to 48 characters.
330
+ `apiKeyEnv` names an environment variable; it never contains its value.
331
+ Invalid fields, unsupported providers and unsafe filesystem paths are rejected.
332
+ Adding an existing name with different settings refuses to overwrite it.
333
+
334
+ `comms connections list --json` returns `humanish.comms-setup.v1`: configured
335
+ profiles and local key presence/source, not provider authentication or delivery.
336
+ `comms providers --json` returns `humanish.comms-providers.v1` with explicit
337
+ setup/receiving availability. The key store accepts `humanish keys set agentmail`.
338
+ Saving a connection neither modifies a lab nor creates a provider resource;
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).
357
+
313
358
  Lab backends report results in their own schemas (`humanish.run-result.v1`,
314
359
  `humanish.oss-lab-result.v1`, `humanish.oss-meta-lab-result.v1`,
315
360
  `humanish.cua-lab-result.v2`, `humanish.scripted-lab-result.v1`,
@@ -1,9 +1,9 @@
1
1
  # Current Goals
2
2
 
3
- Status date: 2026-09-19. Release baseline: `0.94.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.94.0-reliability.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.94.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 and run library | 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 inboxes, supported inline raster images, in-sandbox email/SMS catch and digest-only thread evidence | Scope prevents accidental cross-recipient browsing; it is not tenant authentication or real-provider delivery |
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.94.0` (2026-09-19). 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,6 +47,15 @@ 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.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.
58
+
50
59
  The [0.94.0 release note](../release/0.94.0-reliability.md) describes analysis
51
60
  request deadlines and budget-aware output, smaller portable recordings,
52
61
  recipient-scoped synthetic inboxes, route-aware setup checks, decoded capture
@@ -154,11 +163,12 @@ Implemented:
154
163
  deterministic proof, while concurrent has deterministic and kept live proof;
155
164
  - `subject.source: local-tree`, which packages one selected working tree with a
156
165
  content pin before using the same provision-and-serve path as clone subjects;
157
- - an off-app comms funnel for email/SMS-gated flows: a vendor-neutral in-sandbox
166
+ - an off-app comms funnel for email-gated flows: a vendor-neutral in-sandbox
158
167
  catch redirects the app's own send API, a persona reads a minimal inbox surface
159
168
  and clicks through, and a digest-only `humanish.comms-thread.v1` artifact
160
169
  records the thread with no raw address, link, or code — wired into the
161
- computer-use and shared-world routes and live-proven on computer-use;
170
+ computer-use and concurrent shared-world routes and live-proven on computer-use.
171
+ SMS is not yet a configured execution route;
162
172
  - resolved-persona directives that actually shape the actor prompt on the
163
173
  terminal-product route (traits are applied and recorded in the actor trace, not
164
174
  decorative), reusing the same `persona.ts` compiler as the computer-use lane;
@@ -0,0 +1,38 @@
1
+ # 0.95.0 — Connections and hidden key entry
2
+
3
+ Open `humanish tui` and press **c** to configure AgentMail. **Add API key**
4
+ opens a hidden terminal prompt, then returns to Connections. Ctrl+C cancels
5
+ without changing the existing key or profile. Existing keys can be reused or
6
+ replaced. Entry uses the host's key store, outside the TUI rendering contract.
7
+
8
+ Keys live in the existing user-level store with file mode 0600. Project
9
+ connection metadata lives in `.humanish/local/comms.yaml` and contains only a
10
+ provider name and environment-variable reference. Explicit environment/env-file
11
+ values retain precedence; strict key mode continues to disable discovery.
12
+ The screen identifies those cases instead of claiming a newly stored key is active.
13
+
14
+ Agents have matching commands:
15
+
16
+ ```bash
17
+ humanish comms providers --json
18
+ humanish keys set agentmail
19
+ humanish comms connections add agentmail --json
20
+ humanish comms connections list --json
21
+ ```
22
+
23
+ This is connection setup only. Authentication, permissions, capacity and
24
+ delivery are unverified, and this version does not acquire mailboxes or enable
25
+ provider-backed email in studies. Unsupported study connection/SMS selectors
26
+ and shared-world SMTP declarations fail before execution. Supported local
27
+ email capture remains available.
28
+
29
+ The release also includes TUI `--env-file` propagation and route-specific key
30
+ requirements from #793. Dry-run, local-agent and terminal participants no longer
31
+ inherit a hardcoded OpenAI-plus-E2B key requirement.
32
+
33
+ Validation covers local configuration, containment, credential precedence,
34
+ hidden entry/cancellation/paste, persistence and TUI frames at 80 and 45
35
+ columns. `pnpm tui:connections:proof` drives the built CLI in a real PTY with
36
+ synthetic keys and an isolated store, checking cancellation, replacement,
37
+ restart and absence of credential values from terminal output. It requires
38
+ Python 3 with Unix PTY support; it does not contact AgentMail.
@@ -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.94.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": [
@@ -81,7 +81,8 @@
81
81
  "observer:browser:proof": "node scripts/observer-browser-proof.mjs",
82
82
  "observer:iframe:proof": "node scripts/observer-iframe-proof.mjs",
83
83
  "observer:chrome:proof": "node scripts/observer-chrome-proof.mjs",
84
- "observer:reliability:proof": "node scripts/observer-reliability-proof.mjs"
84
+ "observer:reliability:proof": "node scripts/observer-reliability-proof.mjs",
85
+ "tui:connections:proof": "python3 scripts/tui-connections-proof.py"
85
86
  },
86
87
  "repository": {
87
88
  "type": "git",
@@ -93,6 +94,7 @@
93
94
  "homepage": "https://github.com/danielgwilson/humanish#readme",
94
95
  "dependencies": {
95
96
  "commander": "^14.0.3",
97
+ "parse5": "^8.0.1",
96
98
  "playwright-core": "^1.60.0",
97
99
  "pngjs": "^7.0.0",
98
100
  "undici": "^6.28.1",