From 9e159b44b1fb0a3587ed3c422b36bb9ffbf3f471 Mon Sep 17 00:00:00 2001 From: dormouse-bot <287024035+dormouse-bot@users.noreply.github.com> Date: Tue, 30 Jun 2026 07:46:58 +0000 Subject: [PATCH 1/2] docs(specs): browser TODO persists across restart via the alert blob --- docs/specs/alert.md | 4 ++-- docs/specs/glossary.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/specs/alert.md b/docs/specs/alert.md index b82a9e81..0548279e 100644 --- a/docs/specs/alert.md +++ b/docs/specs/alert.md @@ -177,7 +177,7 @@ Clearing behavior: > See `docs/specs/glossary.md` for the Workspace / Window containers. > -> **Not yet implemented (stage 2b).** The union projection and its surfacing are specified ahead of the code. The implemented piece (stage 2a) is that a browser Surface's user-set `todo` round-trips to the activity store live, so its door shows the TODO pill — the same input the union will read once it exists. +> **Not yet implemented (stage 2b).** The union projection and its surfacing are specified ahead of the code. The implemented piece (stage 2a) is that a browser Surface's user-set `todo` round-trips to the activity store live and persists across restart, so its door shows the TODO pill — the same input the union will read once it exists. A Workspace projects a **union status** over the attention state of the Surfaces it contains (terminal Sessions and browser Surfaces alike — see `docs/specs/glossary.md`): @@ -188,7 +188,7 @@ A Workspace projects a **union status** over the attention state of the Surfaces Rules: - The union is **display-only** and derived. It never enters the terminal Activity state machine, never fires a fresh ring, and produces no sound or notification of its own; it only mirrors member state. Every terminal ringing/TODO transition above remains per-Session, and every browser TODO transition remains per-browser Surface. -- Membership includes minimized (`Doored`) Surfaces and, in standalone, the Surfaces of inactive (unmounted) Workspaces. A terminal Session's Activity survives minimize and unmount (glossary I2/I3) and a browser Surface's `todo` survives in its persisted params, so a backgrounded Surface can light up its Workspace's indicator. +- Membership includes minimized (`Doored`) Surfaces and, in standalone, the Surfaces of inactive (unmounted) Workspaces. A terminal Session's Activity survives minimize and unmount (glossary I2/I3) and a browser Surface's `todo` survives in its persisted `alert` blob, so a backgrounded Surface can light up its Workspace's indicator. - Attention suppression needs no special-casing: a per-Session ring is already suppressed while that Session is attended, so the union simply reflects whatever rings survive. Where the union surfaces is host-specific: diff --git a/docs/specs/glossary.md b/docs/specs/glossary.md index dade9f87..2fc9f211 100644 --- a/docs/specs/glossary.md +++ b/docs/specs/glossary.md @@ -80,7 +80,7 @@ The union is **display-only**: it is derived from member Activity, never enters This vocabulary is the target model; it lands in stages, so parts of it are specified ahead of the code. As of this spec: -- **Implemented** — **Pane** and **Surface** as first-class concepts, the terminal/browser surface kinds and their per-axis participation, `surfaceType` in the persisted snapshot, and the restore/resume handling that keeps browser Surfaces (no stray PTY, saved layout preserved; `docs/specs/transport.md`). A browser Surface's user-set `todo` already round-trips to the activity store live. +- **Implemented** — **Pane** and **Surface** as first-class concepts, the terminal/browser surface kinds and their per-axis participation, `surfaceType` in the persisted snapshot, and the restore/resume handling that keeps browser Surfaces (no stray PTY, saved layout preserved; `docs/specs/transport.md`). A browser Surface's user-set `todo` round-trips to the activity store live and persists across restart — it is saved in the pane's `alert` blob and re-primed on cold restore and resume (`restoreBrowserSurfaceTodo`). - **Not yet implemented** — the **Workspace** and **Window** containers themselves: `PersistedWorkspace` / `PersistedWindow`, the container verbs (`switchWorkspace` / `createWorkspace` / `closeWorkspace` / `renameWorkspace`), the union projection, and the standalone workspace strip. The app today runs exactly one implicit Workspace per Window. The container layer lands behind a feature flag (**stage 2b**, dormant in-app), the switching UI follows (**stage 3**), and real multi-Workspace support comes last (**stage 4**). Container/union/strip passages below and in the area specs are forward-looking until then. ## Layers From 2ebaed6b4b55105109a23c9b0caace9ad32caf0e Mon Sep 17 00:00:00 2001 From: dormouse-bot <287024035+dormouse-bot@users.noreply.github.com> Date: Tue, 30 Jun 2026 07:50:00 +0000 Subject: [PATCH 2/2] docs(specs): fix parallel 'persisted params' phrasing in glossary union note The union-membership note still said a browser Surface's todo survives in its 'persisted params', the same imprecision this PR corrects in alert.md. A browser Surface's todo survives in the persisted alert blob, not the dockview render/door params. Co-Authored-By: Claude --- docs/specs/glossary.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/specs/glossary.md b/docs/specs/glossary.md index 2fc9f211..6a186749 100644 --- a/docs/specs/glossary.md +++ b/docs/specs/glossary.md @@ -74,7 +74,7 @@ A Workspace projects a **union status** over its member Surfaces' Activity (tran - `todo` — any member Surface has `todo === true`: a terminal Session, or a browser Surface a user has flagged. - `count` — number of member Surfaces currently owing attention (ringing or `todo`), for hosts that show a numeric badge. -The union is **display-only**: it is derived from member Activity, never enters the Activity state machine, and never itself fires a ring. Minimized (`Doored`) and unmounted (inactive-Workspace) Surfaces are included, because their Activity (Session) or persisted params (browser Surface) survive minimize/unmount (I2, I3). +The union is **display-only**: it is derived from member Activity, never enters the Activity state machine, and never itself fires a ring. Minimized (`Doored`) and unmounted (inactive-Workspace) Surfaces are included, because their Activity (Session) or persisted `alert` blob (browser Surface) survive minimize/unmount (I2, I3). ### Implementation status