humanish 0.84.1 → 0.85.1

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.
@@ -65,6 +65,42 @@ The browser polls `observer-data.json` with `no-store` caching. Static
65
65
  operator path. Agents and CI should use `humanish watch --json --no-open` for
66
66
  the same fresh evidence without browser open or a long-running process.
67
67
 
68
+ ### Reopening a run
69
+
70
+ The TUI's **Open Observer** action opens an HTTP view that follows saved captures
71
+ as the run writes them. One loopback evidence server is shared by the session's
72
+ browser tabs; exiting the TUI closes it, including when the UI fails. Opening a
73
+ run does not launch a study. The URL is always shown for manual opening or SSH
74
+ port forwarding, and only contained run paths in the TUI's project are accepted.
75
+
76
+ | Entry point | What updates | Lifetime |
77
+ | --- | --- | --- |
78
+ | `watch` during a study | Saved evidence and available in-memory desktop streams | Until the attached command exits |
79
+ | `observe --run <id>` | Saved evidence from the selected run | Until the command exits |
80
+ | TUI Open Observer | Saved evidence in the selected run; shares the project's evidence library | Until the TUI exits |
81
+ | `serve` | Saved evidence across the project's library | Until the server command exits |
82
+ | Static HTML or `file://` | The exported snapshot | Independent of a server |
83
+
84
+ `observe` uses the same current-data projection as the attached viewer, scoped
85
+ to the selected run. Its history cannot enumerate other runs. HTML exports use
86
+ the installed Observer renderer around the recording's saved data and embedded
87
+ images, so older recordings get UI improvements without changing their source.
88
+
89
+ Reopening an active run follows its saved captures; it cannot recover a live
90
+ desktop URL held by another process. Stream credentials are never recovered
91
+ from disk or added to the TUI/library server. Original `watch` attachment is
92
+ what enables a live desktop stream. The loopback library retains its Host
93
+ allowlist, contained file reads, read-only routes and no-store security headers.
94
+
95
+ Served data may also include `runtime` with `state`, `observedAt`, and
96
+ `source: "local-run-status"`. This is a current observation of a contained,
97
+ matching `status.json`; it never changes the run's recorded verdict or participant
98
+ outcomes. A fresh heartbeat means running, an explicitly finalized record means
99
+ finished, and stale or invalid timing means unknown. Missing, malformed, or
100
+ mismatched records omit the observation. A stale heartbeat alone does not prove
101
+ interruption, and stored PIDs are neither probed nor returned. Static rendering
102
+ and export do not create this served-only observation.
103
+
68
104
  Local `codex-exec` actor runs now publish an initial running `run.json` and
69
105
  `observer/observer-data.json` before actor completion, then refresh both after
70
106
  sanitized transcripts, traces, and verdict events are available. This gives a
@@ -81,13 +117,15 @@ stream URLs in any mode; remote viewers see persisted evidence only. See
81
117
  ### Exposed hardening and `watch --expose`
82
118
 
83
119
  The live `serveObserver` server binds `127.0.0.1` and, by default, is a
84
- permissive local-dev server (no Host allowlist, no security headers). Under its
120
+ local-dev server without a Host allowlist. Every response carries security
121
+ headers, including `X-Frame-Options: DENY` and CSP `frame-ancestors 'none'`.
122
+ Under its
85
123
  `exposed` option — set by `watch --expose` — it enforces the SAME
86
124
  DNS-rebinding defense as the library surface: a strict Host allowlist (loopback
87
125
  names at bind, extended by `addPublicOrigin(tunnel.url | public-url)`, `421
88
126
  Misdirected Request` otherwise) and the shared `buildServeSecurityHeaders()` on
89
127
  every response (both live in `src/serve-http.ts`, shared without a module cycle).
90
- Loopback (non-exposed) behavior is byte-identical to before.
128
+ The Host allowlist applies in exposed mode; frame-denial headers apply in both modes.
91
129
 
92
130
  Exposed mode also SCOPES the surface to the attached live run (`result.run`): the
93
131
  `/_humanish/history.json` index is filtered to that one run, and `/_humanish/runs/<id>/…`
@@ -108,8 +146,45 @@ attached server comes up DURING the run and survives a `timed_out`/`failed` run
108
146
  to Ctrl-C. `serve` still never injects stream URLs. See
109
147
  [Serve: the run library surface](serve.md).
110
148
 
149
+ ### Live desktop iframe authority
150
+
151
+ Only a URL in the attached server's in-memory runtime map receives
152
+ `stream.embed.runtimeDesktop: true`. Persisted markers are removed when building
153
+ Observer data and again when reading served fallback projections. Cross-run
154
+ library routes do not inherit the attached run's runtime URLs, even when their
155
+ stream ids match. Ended or invalid runtime entries do not receive the grant.
156
+ The generic static-server helper strips this marker and saved `runtime` state
157
+ from Observer JSON and inline data. Static responses carry the same framing
158
+ denial headers; they never grant active desktop attachment.
159
+
160
+ The browser can preserve a cross-origin provider's origin for its desktop viewer
161
+ modules only with this grant. Ordinary stored embeds remain isolated. Every
162
+ Observer/library response, including raw run HTML, refuses framing, so a provider
163
+ redirect or scripted navigation back to an Observer-origin document cannot load
164
+ it inside the iframe and gain access to the parent. This protects the receiving
165
+ origin without a fixed provider allowlist that becomes stale as desktops start.
166
+ The underlying standards are [iframe sandbox permissions](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/iframe)
167
+ and [CSP frame-ancestors](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Content-Security-Policy/frame-ancestors).
168
+
169
+ Raw artifact responses also carry `sandbox allow-scripts` in their CSP. Opening
170
+ a saved HTML or SVG document directly gives its scripts an opaque origin, so
171
+ they cannot read the Observer's other evidence or browser storage. The policy
172
+ applies to every raw file, including unknown extensions, alongside `nosniff`.
173
+ Generated Observer HTML and JSON routes retain normal same-origin access for
174
+ updates. The generic static helper serves raw documents under the sandbox;
175
+ origin-dependent scripts and modules in those artifacts may require independent
176
+ hosting. See the [CSP sandbox standard](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Content-Security-Policy/sandbox).
177
+
178
+ History entries may include `runtimeState` from the same contained local status
179
+ read as the Observer. Their existing `status` remains the recorded verdict.
180
+ Running filters should use runtime state when present, preserving the difference
181
+ between an active study and its provisional evidence outcome.
182
+
111
183
  ## UI Shape
112
184
 
185
+ See [Watching and reviewing evidence](observer-review.md) for current controls,
186
+ entry-point capabilities, timing limits and browser acceptance commands.
187
+
113
188
  The Observer shell has:
114
189
 
115
190
  - top mission-control band with run status and metrics;
@@ -119,6 +194,17 @@ The Observer shell has:
119
194
  - terminal/TUI transcript stage;
120
195
  - right evidence rail for events, artifacts, and known gaps.
121
196
 
197
+ The participant grid uses equal-height previews whose widths follow each screen's
198
+ aspect ratio. A 44px identity/source/outcome caption sits below the captured pixels;
199
+ no badges or controls cover the screen. Generated computer-use lane labels display
200
+ the recorded persona identity; repeated identities gain a lane or stream qualifier.
201
+ A stable details button opens labeled Pin/Compare actions, recorded notices, final
202
+ messages, dimensions, duration and exact identifiers. Exceptional outcomes remain
203
+ in the caption. Icon controls have visible hover/focus hints and touch-sized targets. Search, preview size and monitor mode
204
+ share the view/filter popover. Monitor mode keeps its exit beside the run status.
205
+ Live previews remain bounded to four visible cards, with the hovered or focused
206
+ participant taking priority when the grid shows more than four eligible cards.
207
+
122
208
  ## Codex UI Contract
123
209
 
124
210
  `codex-ui` streams are normalized session/event projections. Public artifacts
@@ -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.84.1`; it is not an exhaustive inventory of command/result envelopes. Exported types,
6
+ `0.85.1`; 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.
@@ -1,6 +1,6 @@
1
1
  # Current Goals
2
2
 
3
- Status date: 2026-09-07 (rev 22)
3
+ Status date: 2026-09-09 (rev 24)
4
4
 
5
5
  This page is the current public-safe operating goal for `humanish`. Keep it
6
6
  short enough to reread before a coding session and concrete enough that future
@@ -29,11 +29,15 @@ study completed, reproduced, and produced a real accessibility finding via a
29
29
  keyboard-first participant
30
30
  ([docs/goals/email-gated-signup/receipts/](email-gated-signup/receipts/)).
31
31
 
32
- ## Current Program Truth (source `0.84.1`)
32
+ ## Current Program Truth (source `0.85.1`)
33
33
 
34
34
  The package source and repository implementation in this tree agree on these
35
35
  points:
36
36
 
37
+ **Observer review continuity, 2026-09-09 (#731).** The run library opens during player/comparison review. Comparison frames link into the player and return to the saved alignment and cursor; participant names stay consistent. Explicit thinking filters reveal narration, and run/setup notices remain inspectable separately from frame-linked findings. See the [0.85.1 release note](../release/0.85.1-observer-continuity.md).
38
+
39
+ **Observer watching and review, 2026-09-09 (#723, #724, #726, #728).** Grid previews preserve complete screens at a shared height, with compact captions and controls below the evidence. Run activity, live viewing, recorded replay and update freshness are distinct. Seeking, refresh and incoming captures preserve the selected viewing intent. The player adds elapsed-time review, zoom, saved moments and participant/cross-run comparison. The built TUI and observe serve existing evidence; exports contain no runtime desktop grants. See the [0.85.0 release note](../release/0.85.0-observer-review.md) for capabilities, acceptance evidence and limits.
40
+
37
41
  **Portable feedback acceptance commands, 2026-09-07 (#720).** Generated proof commands use the installed CLI from the evidence workspace, including standalone exports without a package manifest. Redrafting recognized first-party candidates projects exact legacy command templates without rewriting source candidates or receipts. Custom instructions remain unchanged. See the [0.84.1 release note](../release/0.84.1-portable-feedback.md).
38
42
 
39
43
  **Readable evidence and shareable feedback, 2026-09-07 (#136).** `export --format bundle --redact-screenshots` creates a separate verified workspace while retaining the readable original. Four real operator-run recordings preserved all measured findings and costs through export and ordinary feedback commands; all 31 frames played in both bundle and HTML views. Static Observer grades now reflect their actual verification result. See the [retained workflow receipt](computer-use-actor/receipts/redacted-evidence-workflow-2026-09-07.md). External maintainer use and acceptance remain unproven.
@@ -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.84.1` (2026-09-07). 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.85.1` (2026-09-09). 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
@@ -0,0 +1,56 @@
1
+ # Humanish 0.85.0: watch and review complete screens
2
+
3
+ Observer now shows portrait and desktop captures at their original proportions,
4
+ with equal-height grid previews and a compact caption below each screen. Live
5
+ labels and controls leave the captured pixels clear. A stable Info button opens
6
+ participant details, labeled Pin/Compare actions and recorded notices.
7
+
8
+ Run activity, viewing mode and evidence freshness are distinct. Finished studies
9
+ say they are finished; failed updates preserve the last evidence and offer retry.
10
+ Seeking, keyboard controls, moment links and refresh agree about the displayed
11
+ capture. Paused replay stays on its selected frame as new evidence arrives.
12
+
13
+ The review tools include:
14
+
15
+ - elapsed-time playback, capture-gap labels, Skip waits and action/finding navigation;
16
+ - fit, actual size, zoom/pan, fullscreen and a hideable/resizable inspector;
17
+ - copyable moment links, original-frame inspection and local saved moments;
18
+ - preview size, filtering, pinning, monitoring and reachable participant pages;
19
+ - participant and cross-run comparison with explicit capture age and missing coverage;
20
+ - consistent icons, keyboard hints, explicit popover dismissal and larger touch targets.
21
+
22
+ `observe` and the built TUI open existing evidence through a local viewer. Live
23
+ desktop access remains owned by the attached process; opening an existing study
24
+ cannot recover another process's credentials. Offline exports keep the current
25
+ renderer and saved images without runtime desktop authority. The
26
+ [Observer review guide](../architecture/observer-review.md) explains these paths.
27
+
28
+ ## Updating
29
+
30
+ Install this version using your usual package manager. For a global installation:
31
+
32
+ ```bash
33
+ npm install -g humanish@0.85.0
34
+ humanish --version
35
+ humanish observe --run RUN
36
+ ```
37
+
38
+ Run the last command from the workspace containing the existing study. Previously
39
+ generated HTML embeds its viewer: reopen the run with the updated CLI, or
40
+ regenerate its HTML export, to get the new interface.
41
+
42
+ ## Verification and limits
43
+
44
+ The implementation was exercised with five hosted two-participant studies and
45
+ 140 retained screenshots. A separate check opened all 28 frames through observe,
46
+ the built headed TUI and HTML export: 84 of 84 opens passed. The
47
+ [implementation receipt](https://github.com/danielgwilson/humanish/blob/main/docs/goals/observer-qol/receipts/2026-09-08-observer-review.md)
48
+ distinguishes failed probes, accepted runs and cleanup evidence.
49
+
50
+ Regression coverage includes 156 Observer tests, 33 production-artifact browser
51
+ scenarios and 15 iframe/artifact isolation checks. Browser acceptance covers
52
+ Chromium on Linux, including touch emulation; physical devices and other engines
53
+ remain unverified. Screenshot replay remains sparse evidence, without a
54
+ continuous video track or guaranteed before/after capture for every action.
55
+ The pre-existing source-checkout TUI loader limitation remains; the built CLI
56
+ is the tested installation path.
@@ -0,0 +1,20 @@
1
+ # Humanish 0.85.1: keep your place while reviewing evidence
2
+
3
+ The Observer review flow now carries the selected evidence between views:
4
+
5
+ - The library button opens a drawer from the player and comparison on desktop and phone.
6
+ - Comparison previews share a height, preserving complete portrait and desktop screens. Panels use the same participant names as the grid and link to their exact recorded frames. Open a frame, save it, and return to the previous comparison alignment and cursor. Reopening the same comparison from the grid also keeps its place.
7
+ - Adding another run cannot silently remove one of the three selected participants. Grid-only filters no longer appear in comparison.
8
+ - Recalling a saved moment after reloading and stepping through frames selects the saved image as well as its URL.
9
+ - Player details identify the selected participant rather than the study's fan-out placeholder.
10
+ - Selecting Reported thinking shows existing narration even when thinking is hidden in All evidence. Warnings & findings includes a separate, paged list of run/setup notices with their recorded timestamps; these notices do not invent screenshot links or claim participant product findings.
11
+
12
+ Install with `npm install -g humanish@0.85.1`. Reopen an existing run with the updated CLI (`humanish observe --run RUN` from its workspace), or regenerate its HTML export, to refresh embedded viewers.
13
+
14
+ ## Verification and limits
15
+
16
+ The [retained workflow receipt](https://github.com/danielgwilson/humanish/blob/main/docs/goals/observer-qol/receipts/2026-09-09-review-continuity.md) records actual-study outcomes, independent review and practical limits. The production browser suite adds desktop/touch library access, comparison-to-frame/save/return, browser history and explicit capacity checks. Player regression tests cover narration filtering and separate notice pagination without changing the selected frame.
17
+
18
+ A fresh hosted two-participant drawDB study exercises actual growing captures and the review journey. Retained run: `observer-review-journey-n2-20260909`. The attached `observe` check follows updated captures; it does not establish a new live-desktop connection or physical mobile fidelity. The release gate separately exercises the packed candidate in disposable terminal sandboxes.
19
+
20
+ Saved moments remain local to the browser. Cross-run review requires the served run library. Screenshot replay remains sparse; continuous video, physical devices, other browser engines, and screen-reader acceptance remain separate work.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "humanish",
3
- "version": "0.84.1",
3
+ "version": "0.85.1",
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": [
@@ -76,7 +76,9 @@
76
76
  "tui:test": "pnpm --filter humanish-tui test",
77
77
  "release:dogfood": "node scripts/release-dogfood.mjs",
78
78
  "docs:generate": "tsx scripts/generate-cli-docs.ts",
79
- "docs:check": "tsx scripts/generate-cli-docs.ts --check"
79
+ "docs:check": "tsx scripts/generate-cli-docs.ts --check",
80
+ "observer:browser:proof": "node scripts/observer-browser-proof.mjs",
81
+ "observer:iframe:proof": "node scripts/observer-iframe-proof.mjs"
80
82
  },
81
83
  "repository": {
82
84
  "type": "git",