projmux 0.15.2 → 0.16.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.
@@ -58,7 +58,7 @@ step, never a silent no-op.
58
58
  Project`, which forwards to the canonical `create project --root` route for
59
59
  that one exact path, and `Unpin candidate`, which removes the preference and
60
60
  leaves the directory alone. Nothing here adopts a path automatically.
61
- - `Project Sidebar [View]` — holds the two Projects sidebar policies:
61
+ - `Project Sidebar [View]` — holds the Projects sidebar policy:
62
62
  `Runtime diagnostics [Choice]` chooses `When needed` (the read-time default
63
63
  with nothing saved) or `Always` for the sidebar's Runtime row. `When needed`
64
64
  keeps the row for a refused runtime class or for an observation that could
@@ -68,26 +68,27 @@ step, never a silent no-op.
68
68
  Recent Windows links are unchanged, and `projmux runtime diagnostics` and
69
69
  `get runtime` never read it. An unrecognized saved value applies the default
70
70
  without writing and shows an invalid source.
71
- `Closed Project startup` shows exactly two actions when no preference file
72
- exists and reports `Continue project / Recreate Project - default` (`이어서 열기 /
73
- Project 다시 만들기 - 기본값` in ko-KR). Saved `on` keeps those choices and reports
74
- `Continue project / Recreate Project - on - saved`. Saved `off` reports
75
- `Continue project - off - saved`, skips the picker, and retains the
76
- registered-Continue/unregistered-Fresh automatic
77
- adjudication. Reading the row or opening/cancelling the picker never writes
78
- the default or changes saved preference bytes/mtime.
71
+ The closed-Project startup screen has no setting: a registered closed
72
+ Project always gets it, and a root that is not a registered Project never
73
+ does. Its two rows are `Continue project` and `Clear layout and open`
74
+ (`이어서 열기` / `구성 비우고 새로 열기` in ko-KR).
79
75
  `Continue project` materializes the Project's current Registry desired state
80
- and then moves the client. `Recreate Project` confirms the exact old Project
76
+ and then moves the client. `Clear layout and open` confirms the exact old Project
81
77
  UID and per-kind counts before writing anything,
82
78
  atomically replaces the old Project graph with a new Project UID and a new
83
79
  canonical Window/shell UID pair, and leaves exactly one same-root claimant
84
80
  before ordinary materialization. Esc returns to Projects. Neither action
85
- deletes or rewrites snapshots, root, Git, or worktree data. The saved file
86
- keeps its `sidebar-startup-picker` spelling.
81
+ deletes or rewrites the folder, its files, Git, worktree data, or trust.
87
82
  - **AI** — `AI` is a product category, never an addressable resource.
88
83
  - `Default launch target [Choice]` — an Agent Provider, a Shell Pane, or
89
84
  choose-at-launch. It is a keybinding/picker preference and does not weaken
90
85
  the canonical `create agent` explicit-provider requirement.
86
+ - `New splits start in [Choice]` — `Project root` (default) or
87
+ `Current Pane directory`, shown with the tier that decided it (`project`,
88
+ `global`, `default`). It writes only the global `[ai] split_cwd_from` and
89
+ decides UI splits only; the Pane directory is used only inside the Project
90
+ root, and the CLI does not follow this setting (`create pane|agent` obey
91
+ `--cwd-from` alone).
91
92
  - `Enabled providers [View]` — Claude, Codex, and Antigravity are Providers;
92
93
  `Shell`, `Selective` and `Resume` are not Providers and never appear here.
93
94
  - `Agent Resume Picker [View]` — states that resume targets an existing Agent
@@ -141,10 +142,10 @@ step, never a silent no-op.
141
142
  HUD`, `Working directory` and `Git` are component Views because each owns a
142
143
  `Visible` Toggle plus an icon `Choice`; cwd/Git icon `off` removes only the
143
144
  icon and leaves the text segment visible. `Agent Usage HUD` is a component
144
- View with `Visible`, then Claude/Codex/Antigravity provider Views in the
145
+ View with `Visible`, then Claude/Codex provider Views in the
145
146
  usage-supported catalog order. Each provider owns `Visible` plus only its
146
- explicit HUD windows: Claude/Codex own `5h` and `Weekly`; Antigravity owns
147
- `Weekly` only. Parent off states gate effective visibility without rewriting
147
+ explicit HUD windows, `5h` and `Weekly`; Antigravity has no usage source and
148
+ no provider View. Parent off states gate effective visibility without rewriting
148
149
  saved child values. Provider/window rows show saved, effective, and source.
149
150
  `Project`, `Clock` and `Settings launcher` are direct visibility Toggles. These global
150
151
  presentation values default on except Codex `5h`, which defaults off to
@@ -157,8 +158,6 @@ step, never a silent no-op.
157
158
  presentation-only and do not disable their underlying producers, cache,
158
159
  backoff, explicit table/JSON command, or cached popup.
159
160
  - `Language / Locale [Choice]` and `Agent attention badge style [Choice]`.
160
- - **Snapshots** — the visible noun is the Snapshot resource. `session-state`
161
- remains the config/route spelling and appears only as source detail.
162
161
  - **Keybindings** — `Launch & popups`, `Agent & Pane launch`,
163
162
  `Pane & Window navigation`, `Sidebar & picker actions` (nested by surface:
164
163
  Project Sidebar, Session Picker, Notification Sidebar, Settings), and
@@ -215,15 +214,39 @@ step, never a silent no-op.
215
214
  the approve/revoke actions) and `Project hooks [View]` (`Session lifecycle`
216
215
  plus `After notification queued`, with the same per-event Views the global
217
216
  scope uses, extended by a trust state row).
218
- - **Snapshots** — the auto-save override and the saved snapshots.
219
217
 
220
218
  Without an actionable project context the Project surface renders a single
221
219
  passive guidance row rather than repeating a disabled reason per row.
222
220
 
221
+ ## Search
222
+
223
+ Search reaches every setting from the Settings root. A non-empty query at the
224
+ root lists the current scope's settings as one `path > label` list (rendered
225
+ with `›`) built by walking the navigation catalog, and choosing a result opens
226
+ the owning View with the cursor on that row without running its control --
227
+ Confirm and Action rows included, so `Quit Projmux` and `Reset theme` are
228
+ focused and never fired. The list is scope-pure: a Global query never returns
229
+ Project nodes and a Project query never returns Global ones, and with no project
230
+ context the Project tab returns nothing. User-data collection items -- an
231
+ individual discovery root, pinned Project or candidate -- are data
232
+ rather than settings, so results stop at their parent View and at the
233
+ collection-level controls. Inside a View the query still filters that View's
234
+ rows, and category rows carry their members' search text so search crosses
235
+ categories.
236
+
237
+ The result rows are built from the catalog alone: no Registry, tmux,
238
+ or filesystem read participates, because a result is a destination
239
+ rather than a rendered value. Where that leaves a row unnameable -- a saved
240
+ user path, a command whose row spelling depends on whether a command is
241
+ already stored, a read-only state row that stands for several rendered lines --
242
+ the result still appears and opens the owning View on its first row instead of
243
+ guessing a row. The same happens when the target row is simply not rendered any
244
+ more: the View opens, unfocused, and nothing errors.
245
+
223
246
  ## Vocabulary and compatibility
224
247
 
225
248
  Visible nouns follow the shared resource vocabulary: `Project`, `Window`,
226
- `Pane`, `Agent`, `Provider`, `Notification`, `Snapshot`, with `AI` as a category
249
+ `Pane`, `Agent`, `Provider`, `Notification`, with `AI` as a category
227
250
  and `Session` as the runtime projection. The Agent Usage HUD is a presentation
228
251
  of what the canonical `agent usage` command provides; there is no addressable
229
252
  `Usage` resource, and Settings never spells usage as a readable resource kind.
@@ -271,7 +294,7 @@ result replaces it. Typed validation and staged apply failures stay in the popup
271
294
  instead of being visible only on stdout/stderr.
272
295
 
273
296
  The generic feedback inventory deliberately excludes Welcome, Quit, read-only
274
- hook/effective/notification diagnostics, Snapshot preview, and key
297
+ hook/effective/notification diagnostics, and key
275
298
  capture/probe/diagnostic bodies. Those flows own a viewer, confirmation, or
276
299
  multi-step output surface; only an actual Settings write at their boundary is
277
300
  eligible for transient mutation feedback.
package/docs/statusbar.md CHANGED
@@ -29,17 +29,16 @@ row 1 [#S] #{pane_current_path} <git> CPU 12% MEM 41%  %H:%M
29
29
  state surface.
30
30
  Settings > Appearance > Status Bar controls `Notifications HUD` and `Agent
31
31
  Usage HUD` independently. Agent Usage HUD is a View whose `Visible` parent
32
- contains Claude/Codex/Antigravity provider Views; each provider has its own
33
- `Visible` plus explicit supported windows (Claude/Codex: `5h`, `Weekly`;
34
- Antigravity: `Weekly`). Every leaf defaults on except Codex `5h`, which
32
+ contains Claude/Codex provider Views; each provider has its own
33
+ `Visible` plus explicit supported windows (`5h`, `Weekly`). Antigravity has
34
+ no usage source and no row. Every leaf defaults on except Codex `5h`, which
35
35
  defaults off; saving it as on explicitly restores that window. Parent off
36
36
  preserves saved children, and returning it on restores them. When only one HUD is visible, its
37
37
  sole range receives the full `#{client_width}` budget and the absent range and
38
38
  alignment are not emitted. When both are hidden, tmux collapses to one line
39
39
  with `status on`,
40
- moves the native Window row to `status-format[0]`, unsets stale higher rows,
41
- and keeps the app's quiet Session State autosave job on that surviving row;
42
- there is no empty HUD row. These toggles hide presentation only and do not
40
+ moves the native Window row to `status-format[0]`, and unsets stale higher
41
+ rows; there is no empty HUD row. These toggles hide presentation only and do not
43
42
  mutate the Notification queue or usage collection/cache/API state.
44
43
  Provider/window visibility also changes only the ambient status projection;
45
44
  the cached popup and explicit `agent usage` table/JSON stay lossless. If every
@@ -254,10 +253,16 @@ bind-key -n MouseDown1Status if-shell -F "#{==:#{mouse_status_range},window}" \
254
253
  ## Usage element drop order
255
254
 
256
255
  The compact Codex provider identity is native-first. An authoritative healthy
257
- app-server snapshot renders as `Codex`; only degraded lanes are qualified as
258
- `Codex [fallback]` or `Codex [stale]`. Unknown non-stale provenance uses the
259
- conservative fallback label. These labels are locale-invariant, including on
260
- en-US and ko-KR narrow rows. The full Usage table, JSON, and diagnostics retain
256
+ app-server snapshot renders as `Codex`; a retained last-known-good snapshot is
257
+ qualified as `Codex [stale]`. A fallback lane carries no text qualifier: it
258
+ keeps the bare `Codex` label, painted in the `provenance` theme color (user
259
+ decision: *"codex[fallback] 하단 status 바대신 주황색의 Codex가나오는게어때"* →
260
+ *"B로 가자"*, a role color of its own rather than a reused threshold color, with
261
+ `[stale]` kept). The text tiers below the bars emit no color, so the same row
262
+ spells `Codex^ 5h:17%` / `X^ 5h:17%` — one ASCII cell instead of the former
263
+ 11-cell ` [fallback]` tag. Unknown non-stale provenance uses that same
264
+ conservative fallback presentation. These labels are locale-invariant,
265
+ including on en-US and ko-KR narrow rows. The full Usage table, JSON, and diagnostics retain
261
266
  the raw source and closed reason; the statusbar label is presentation only.
262
267
 
263
268
  The usage segment does not pick a whole-segment tier. It starts from its
@@ -298,11 +303,11 @@ as a secondary bar and cannot be shed by rule 3.
298
303
  Only hard rune-truncation, below every listed step, can reach either.
299
304
 
300
305
  Within a per-provider rule the steps run **tail-first** over the canonical
301
- provider order (Claude, Codex, Antigravity), so the provider a user reads first
302
- is the last to lose detail. This is why a 120-cell budget renders
303
- `Claude 5h [bar] · weekly [bar] Codex 5h [bar] Antigravity~~ weekly [bar]`
304
- — Codex's second window paid for Claude's — where whole-segment tier selection
305
- dropped both second windows at once and rendered 92 cells into a 120-cell row.
306
+ provider order (Claude, Codex), so the provider a user reads first
307
+ is the last to lose detail. This is why a 100-cell budget renders
308
+ `Claude 5h [bar] · weekly [bar] Codex 5h [bar]` — Codex's second window paid
309
+ for Claude's — where whole-segment tier selection would drop both second
310
+ windows at once.
306
311
 
307
312
  The order lives in **exactly one place in code**: `usageShedOrder` in
308
313
  `internal/app/usagecmd/usage.go`. The entry names above are that variable's
@@ -345,18 +350,16 @@ the queued notify segment, not to the separate window-list live attention badge.
345
350
  the cached usage state in-process and aligns model/window rows with
346
351
  right-aligned numeric values, dims unavailable values, keeps stale sync/age
347
352
  metadata muted, and colors only threshold values: amber at 80% and red at 95%.
348
- Antigravity rows keep conversation-local `context` separate from account
349
- `quota/<exact upstream bucket ID>` rows; the popup displays an absolute reset
350
- when provided and otherwise the exact optional relative reset seconds. Opaque
351
- bucket IDs are escaped for terminal/tmux safety and are never assigned a
353
+ Named `quota/<exact upstream bucket ID>` rows display an absolute reset when
354
+ provided and otherwise the exact optional relative reset seconds; cached
355
+ Antigravity rows from the removed adapter are not shown, and an enabled
356
+ Antigravity appears only as an `usage unsupported` row. Opaque bucket IDs are escaped for terminal/tmux safety and are never assigned a
352
357
  `5h`/`weekly` cadence. Claude retains aggregate `5h`/`weekly` rows alongside
353
358
  typed named/model `limits[]` rows in this popup: model-scoped rows display the
354
359
  exact upstream group plus model display identity with a bounded terminal-safe
355
360
  label, reset, and per-row age. The compact status line excludes every Claude
356
361
  named/model row and continues to use only the aggregate official windows.
357
- Session State inspection lives under `Projects > Sessions > State`; global
358
- Settings > Session State is settings-only and the statusbar no longer exposes a
359
- duplicate State button.
362
+ The statusbar has no State button.
360
363
 
361
364
  The path popup uses the native picker frame chrome, a one-line title,
362
365
  the full wrapped current path, cheap project/git metadata when available, and
package/docs/testing.md CHANGED
@@ -7,6 +7,8 @@ and humans run the same entrypoints.
7
7
 
8
8
  - `make test` runs the fast Go unit suite. These tests avoid tmux, TTY, GUI,
9
9
  and host shell dependencies.
10
+ - `make vet` runs `go vet ./...`. CI runs it in the Unit Tests job after
11
+ `make test`.
10
12
  - Picker unit coverage includes the backend-neutral item/action contract,
11
13
  native title-focused filtering, numeric selection, and shared close actions.
12
14
  - `make test-integration` builds `test/docker/Dockerfile` and runs
@@ -40,6 +42,19 @@ and humans run the same entrypoints.
40
42
  runner is slow or loaded; a wait that expires still fails with the description
41
43
  of what it was waiting for, so a slow machine reports a timeout rather than
42
44
  the regression message of the assertion that would have run next.
45
+ - `make test-e2e-update` runs `test/e2e/update-flow.sh` in the Node image
46
+ (`test/docker/Dockerfile.node`) on a bridged network. It installs an older
47
+ published `projmux` from the public npm registry, runs the source build's
48
+ `update apply`, and asserts the global install reaches the latest published
49
+ version while the exact legacy tmux server, socket, and sessions survive,
50
+ then checks npm installer autodetection from an npm-shaped path. Because it
51
+ depends on the public registry and the published package, it is not a
52
+ required check and stays out of the aggregate `Test`: the separate
53
+ `Update Flow E2E` workflow runs it on pull requests that change the update
54
+ path, daily on a schedule, and on manual dispatch. A local run skips when the
55
+ registry is unreachable; under CI (`CI=true`) or
56
+ `PROJMUX_UPDATE_FLOW_STRICT=1` the script runs with `--strict`, where a skip
57
+ fails the run instead.
43
58
  - `make test-e2e-contract`, `make test-e2e-reliability`, and
44
59
  `make test-e2e-shards` validate typed attempt evidence, bounded semantic
45
60
  waits/owned cleanup, and exhaustive four-shard isolation without rerunning
@@ -54,6 +54,7 @@ onto these stable names:
54
54
  | `action_required` | AI needs-input/approval badge color | AI action-required badge (independent of `critical`) |
55
55
  | `pane_active_bg` | active-pane background tint | active-pane window-active-style tint (tmux pane chrome) |
56
56
  | `focus` | active-pane border color | active-pane border (tmux pane chrome) |
57
+ | `provenance` | fallback-data-source label color | compact usage label for a row served by a fallback source (never a usage threshold color) |
57
58
 
58
59
  `text_primary` and `chrome_foreground` split the old broad foreground behavior:
59
60
  changing primary content text no longer repaints frame/title/search/border/status
@@ -71,6 +72,17 @@ failure, destructive, over-limit, or risk states. `pane_active_bg` and `focus`
71
72
  are also public keys driving the active-pane tint and border (tmux-only pane
72
73
  chrome, with no ANSI/native role).
73
74
 
75
+ `provenance` colors a compact usage label whose numbers came from a fallback
76
+ data source instead of the provider's authoritative one (today: a Codex row
77
+ outside a healthy app-server). It is deliberately neither `warning` nor
78
+ `critical` — those mean usage thresholds — nor the `accent.ai` label color a
79
+ healthy row uses, because it is the only signal that row carries. Every built-in
80
+ preset defines it as an orange (hue 15-45°) whose nearest tmux color differs
81
+ from that preset's five state colors and from `colour121`; the fallback theme
82
+ uses `colour208`, and an explicit light `status_background` darkens that literal
83
+ the same way it darkens the other statusbar text roles. It is a tmux-only role
84
+ (`usage.provenance_fg`) with no ANSI/native counterpart.
85
+
74
86
  Renderer-only role names such as `accent.ai`, `state.progress`, `git.branch`,
75
87
  and trust colors remain in `internal/theme/palette.go` until Phase 2+ maps each
76
88
  surface to the resolver tokens. The key product contract for this phase is that
@@ -200,6 +212,7 @@ light experience with `daylight` also requires a light terminal theme.
200
212
  | `action_required` | `#d97706` | `colour172` |
201
213
  | `pane_active_bg` | `#e8e4dc` | `colour254` |
202
214
  | `focus` | `#2563eb` | `colour26` |
215
+ | `provenance` | `#944400` | `colour94` |
203
216
 
204
217
  ## Fallback Inventory
205
218
 
@@ -221,6 +234,7 @@ Accents and state:
221
234
  | `accent.action` | `141;205;142`, strong `122;199;173` | `colour29` bg / `colour230` fg |
222
235
  | `accent.attention` | notify HUD background/project family | `colour53`, project `colour90` |
223
236
  | `accent.ai` | notify agent `colour37` family | `colour37` bg / `colour121` fg |
237
+ | `usage.provenance_fg` | not emitted on native surfaces | `colour208` (public `provenance` token) |
224
238
  | `state.progress` | `255;204;102`; switch attention/busy dot, pane-border in-progress badge, and pending notify title/bell/badge `colour220` | `colour220` |
225
239
  | `state.action_required` | AI approval/input-required status badge amber-orange; currently aliases the established warning token | `colour214` |
226
240
  | `state.warning` | usage/status popup warning ANSI 256 wrapper; non-AI warning chrome | `colour214` |
@@ -10,7 +10,6 @@ Primary production sources:
10
10
 
11
11
  - `internal/integrations/mux/`
12
12
  - `internal/integrations/tmux/`
13
- - `internal/integrations/sessionstate/`
14
13
  - `internal/app/`
15
14
  - generated config from `projmux config render standalone`,
16
15
  `projmux config render app`, and `projmux shell`
@@ -79,7 +78,7 @@ focus resolution, preview, and recent-window inventory.
79
78
 
80
79
  The typed `internal/integrations/tmux.Client` owns higher-level operations
81
80
  such as ensure/open/kill sessions, recent session summaries, preview inventory,
82
- resource inventory, and session-state capture/replay.
81
+ and resource inventory.
83
82
 
84
83
  ## Generated Configuration Surface
85
84
 
@@ -87,7 +86,7 @@ The standalone and app configs own:
87
86
 
88
87
  - app/runtime marker options such as `@projmux_app`;
89
88
  - status rows, ranges, palette options, mouse dispatch, and popup bindings;
90
- - AI, attention, notify, recent-window, session-state, and resource hooks;
89
+ - AI, attention, notify, recent-window, and resource hooks;
91
90
  - project-root and live-resource options;
92
91
  - reload/apply behavior for default and named sockets.
93
92
 
@@ -102,11 +101,11 @@ integration or e2e coverage when live tmux behavior changes.
102
101
  | Identity | `display-message -p`, `list-clients -F` | focus, switch, hooks |
103
102
  | Pane/window inventory | `list-panes -a -F`, `list-windows -F` | preview, notify, attention, recent windows |
104
103
  | Session lifecycle | `has-session`, `new-session`, `attach-session`, `switch-client`, `kill-session` | attach, switch, sessions |
105
- | Split/window creation | `split-window`, `new-window` | AI split, shell, session restore |
104
+ | Split/window creation | `split-window`, `new-window` | AI split, shell, Project materialization |
106
105
  | Metadata | `set-option -p`, `show-options`, `display-message` | AI state, labels, app ownership |
107
- | Hooks | `set-hook`, `show-hooks`, `run-shell -b` | notify, attention, autosave, recent windows |
106
+ | Hooks | `set-hook`, `show-hooks`, `run-shell -b` | notify, attention, recent windows |
108
107
  | Interactive UI | `display-popup`, `capture-pane`, `resize-pane` | popup surfaces, title watch, layout |
109
- | State replay | `rename-window`, `select-layout`, `select-pane`, `send-keys` | session state |
108
+ | Topology materialization | `rename-window`, `select-layout`, `select-pane`, `send-keys` | Project Continue and Registry reconcile |
110
109
  | Config | `source-file`, global/session options | install, apply, shell |
111
110
  | Resource inventory | `list-panes -a -F` with PID/TTY/project fields | Linux resource attribution |
112
111
 
@@ -121,7 +120,6 @@ Changes to this surface should preserve the repository validation order:
121
120
  5. `make test-integration`;
122
121
  6. `make test-e2e`.
123
122
 
124
- The maintained test list in [agent-workflow.md](agent-workflow.md) must change
125
- with behavior. Live tests must use isolated tmux sockets and must validate
126
- returned ids or queried server state rather than pane ordering, screen content,
127
- or `send-keys` as a completion signal.
123
+ Live tests must use isolated tmux sockets and must validate returned ids or
124
+ queried server state rather than pane ordering, screen content, or `send-keys`
125
+ as a completion signal.
@@ -126,10 +126,8 @@ history without a current activation is excluded. A complete comparison with no
126
126
  mismatches emits no comparison block. An unreadable Registry or missing,
127
127
  inconsistent, orphaned, or unobservable activation produces an `unavailable` or
128
128
  `incomplete` enumeration signal; confirmed mismatches remain visible alongside
129
- those gaps. A foreign Codex state domain, opaque generation, or a present or
130
- unreadable generation pool is unobservable from the default daemon probe.
131
- Private pool generations can also have version-shaped IDs, so Doctor does not
132
- infer their running endpoint from that spelling or from admission-current.
129
+ those gaps. A foreign Codex state domain or an opaque generation is
130
+ unobservable from the default daemon probe.
133
131
 
134
132
  The additive `codex_endpoint_mismatch` JSON field carries the same mismatch set,
135
133
  enumeration gaps, and evidence strength without changing the schema version.
package/docs/upgrading.md CHANGED
@@ -52,6 +52,141 @@ still requires an explicit `PROJMUX_INSTALLER=github-release`.
52
52
 
53
53
  ## Behavior Changes
54
54
 
55
+ ### Closed Project startup setting removed
56
+
57
+ The closed-Project startup screen is now shown for every registered Project
58
+ that has no running session, and it is never shown for a folder that is not a
59
+ registered Project -- Enter registers and opens that folder in one step.
60
+ With nothing left to choose, the setting that turned the screen off is gone.
61
+
62
+ - Settings > Projects > Project Sidebar > Closed Project startup is removed.
63
+ Project Sidebar keeps its Runtime diagnostics choice.
64
+ - `~/.config/projmux/sidebar-startup-picker` is no longer read. The first
65
+ `projmux config apply` after upgrading (which `make install` and
66
+ `projmux update apply` also run) removes it and prints one
67
+ `reclaimed retired closed-Project startup setting: removed 1 file` line.
68
+ Only a regular file with that name is removed; a failure is reported and
69
+ never fails the apply, and later applies print nothing.
70
+ - **A saved `off` is not migrated.** If you had turned the screen off, a
71
+ registered closed Project shows it again. Its default row is Continue
72
+ project, so Enter opens the Project the way `off` did.
73
+ - The second row is renamed from **Recreate Project** to
74
+ **Clear layout and open** (ko-KR: **구성 비우고 새로 열기**). It clears only
75
+ the Project's saved Window and Agent layout; the folder, its files,
76
+ `.projmux/config.toml`, and trust stay. Its confirmation screen uses the same
77
+ name, and its cancel row is **Keep the saved layout**. What the row does is
78
+ unchanged.
79
+ - `switch sidebar-open --mode fresh` keeps its token, so a sidebar started by
80
+ an older client still reaches the renamed row's action.
81
+
82
+ ### Antigravity statusLine support removed
83
+
84
+ projmux no longer installs, reads, or judges the Antigravity `statusLine` in
85
+ `~/.gemini/antigravity-cli/settings.json`. Only the official hooks entry
86
+ (`projmux` in `~/.gemini/config/hooks.json`) remains.
87
+
88
+ - The first `projmux config apply` after upgrading (which `make install` and
89
+ `projmux update apply` also run) removes only a `statusLine` whose `command`
90
+ carries the `projmux-managed:antigravity-statusline:v1` marker, whatever its
91
+ `enabled`, `stack_with_default`, extra keys, or executable path. The rest of
92
+ the file keeps its bytes and mode. It is never re-installed, and
93
+ `projmux agent integrate antigravity` never creates or writes the file.
94
+ `agent integrate antigravity --remove` also removes the marker entry.
95
+ - A user-owned `statusLine`, or any value without the marker, is left
96
+ untouched and can no longer block install, cause a conflict, or change the
97
+ doctor status. A malformed or unreadable settings file is skipped.
98
+ - Until that removal runs, a leftover bridge calling
99
+ `internal agent-hook ingest antigravity-hook --event Statusline` exits 0 with
100
+ empty stdout and changes nothing.
101
+ - Antigravity usage display (`agent usage`, the statusbar HUD and popup, and
102
+ the Settings usage rows), the Antigravity approval-required notification,
103
+ and the mid-turn busy detail are gone until Antigravity offers official
104
+ events for them. `agent usage --model antigravity` is still accepted and
105
+ prints the `usage unsupported` note; `agent capabilities` reports Antigravity
106
+ usage as unsupported. Working state still follows the official
107
+ `PreInvocation`/`Stop` hooks.
108
+ - Leftover `~/.config/projmux/statusbar-visibility-*antigravity*` files,
109
+ `<state>/usage/antigravity-*.json` sidecars, and cached Antigravity rows in
110
+ `snapshots.json` are ignored, not deleted. Doctor JSON no longer has
111
+ `statusline_config_path`, and the diagnostic is named `Antigravity hooks`.
112
+
113
+ ### Project snapshots removed
114
+
115
+ `registry.json` is now the only saved Project state. projmux no longer saves or
116
+ restores Project snapshots anywhere else, so these surfaces are gone:
117
+
118
+ - the `create snapshot`, `get snapshots`, `delete snapshot`,
119
+ `restore snapshot`, and `prune snapshot` commands. `create`, `get`,
120
+ `delete`, and `prune` now refuse the `snapshot` kind with a usage error. The
121
+ `restore` command group had no other child and is removed with them, so
122
+ `restore snapshot` fails as an unknown command. `prune` now prunes only stale
123
+ Projects and Agents;
124
+ - the hidden `session-state` route;
125
+ - the Global and Project **Snapshots** pages in Settings: the auto-save toggle
126
+ and interval, the per-Project auto-save override, and the save latest, save
127
+ named, preview, and delete actions;
128
+ - the snapshot view in the session popup and its `SessionPopup:OpenState`
129
+ keybinding;
130
+ - the session-state section of `projmux doctor`, including
131
+ `doctor --section session-state` and the `session_state_resume` and
132
+ `session_state_prune` JSON fields.
133
+
134
+ projmux no longer emits `session-state.outcome` diagnostics records. Records
135
+ with that event in existing logs are still read and accepted.
136
+
137
+ The existing `${XDG_STATE_HOME:-$HOME/.local/state}/projmux/sessions` directory
138
+ is no longer read. `projmux config apply` (which `make install` runs) removes
139
+ the `*.json` snapshot files in it once, along with the `sessionstate-autosave`
140
+ and `sessionstate-autosave-interval` files and the
141
+ `sessionstate-projects/<session>/autosave` files under the config directory,
142
+ and then removes the `sessions/` and `sessionstate-projects/` directories if
143
+ they end up empty. It only removes regular files with those names and never
144
+ follows symlinks. Any other entry there is kept, and the apply that removes
145
+ the files lists it on its one `reclaimed retired Project snapshot files: ...`
146
+ line; later applies with nothing left to remove print nothing. To keep the old files,
147
+ copy those directories before you upgrade. `PROJMUX_SESSIONSTATE_AUTOSAVE` is
148
+ ignored. Tmux configs rendered by older installs may
149
+ still call `projmux internal tmux autosave-session-state`; that route stays and
150
+ exits 0 without writing anything.
151
+
152
+ Closed Projects start from the Registry: **Continue project** materializes the
153
+ Project's stored Windows and Panes, and **Recreate Project** (since renamed
154
+ **Clear layout and open**) replaces them with a fresh graph.
155
+ Settings > Projects > Project Sidebar > Closed Project startup and its
156
+ `sidebar-startup-picker` file were unchanged by that release; a later release
157
+ removed them
158
+ ([Closed Project startup setting removed](#closed-project-startup-setting-removed)).
159
+ Settings no longer saves a
160
+ named layout from a live session into `<project>/.projmux/layouts`, and no
161
+ current surface opens those files.
162
+ Leftover `.projmux/layouts` files on disk and layout entries in
163
+ `trusted-projects.json` are kept and ignored.
164
+
165
+ ### Private Codex generation files reclaimed
166
+
167
+ The private Codex generation pool is gone; app-server lifetime belongs to
168
+ `codex app-server daemon`. Nothing reads the files that pool left on disk, and
169
+ `projmux config apply` (which `make install` and `projmux update apply` also
170
+ run) removes them once:
171
+
172
+ - under `${XDG_STATE_HOME:-$HOME/.local/state}/projmux/codex-generations/`:
173
+ `rolling-upgrade.json` and its `.flock`, the stored `qualification/*.json`
174
+ records, and the leased release bundles in `bundles/sha256-<digest>/`, which
175
+ are the bulk of that directory;
176
+ - under `${XDG_STATE_HOME:-$HOME/.local/state}/projmux/g/<key>/`: each private
177
+ host's `.projmux-launch-<generation>.json` intent, its `.guard`, and the
178
+ app-server socket nothing listens on anymore.
179
+
180
+ Each directory is removed once it ends up empty. Only entries whose names have
181
+ exactly those shapes are removed, and symlinks are never followed. A private
182
+ host whose socket still accepts a connection keeps its whole directory and is
183
+ named on the report line instead, so an app-server that outlived projmux does
184
+ not lose the socket under it. Any other entry is kept and listed on the single
185
+ `reclaimed retired Codex generation files: ...` line that apply prints; later
186
+ applies with nothing left to remove print nothing. A failure is reported on
187
+ that line and never fails the apply, and a rerun converges. To keep the old
188
+ files, copy those directories before you upgrade.
189
+
55
190
  ### Claude dialogue endpoint revalidation
56
191
 
57
192
  The heterogeneous dialogue release moves the public message envelope and
@@ -124,8 +259,7 @@ That is evidence of incompatibility, not permission to proceed. Operators must
124
259
  refuse a binary-only downgrade before installation and must not permit the old
125
260
  binary to write final-v2 bytes. To roll back during the prerelease window, stop
126
261
  the final writer, restore the exact pre-normalization Registry backup, and
127
- restore the matching intermediate binary as a pair. Snapshots are not migration
128
- or rollback inputs and are never rewritten by this normalization.
262
+ restore the matching intermediate binary as a pair.
129
263
 
130
264
  Rollback rehearsal is byte-oriented: record the backup path, mode, SHA-256,
131
265
  and matching pre-release binary revision; stop every final-v2 writer; atomically
@@ -346,7 +480,7 @@ commands and exit 1. Use `internal ...` for generated plumbing and `config
346
480
  render|apply` for public configuration work.
347
481
 
348
482
  The mixed roots retain only `attach project`, `focus project|window|pane`, `pin
349
- project`, and `prune project|snapshot`. Shortcuts and singular/plural resource
483
+ project`, and `prune agent|project`. Shortcuts and singular/plural resource
350
484
  kind aliases are unchanged. The ledger contains the complete removed
351
485
  argv/replacement/error matrix.
352
486
 
@@ -359,8 +493,8 @@ queue maintenance.
359
493
 
360
494
  ### Managed Agent hook producer migration
361
495
 
362
- The installer now writes Codex, Claude, Antigravity named hooks, Antigravity
363
- Statusline, and the tmux bell fallback with the canonical
496
+ The installer now writes Codex, Claude, Antigravity named hooks, and the tmux
497
+ bell fallback with the canonical
364
498
  `projmux internal agent-hook ingest ...` entrypoint. Copyable integration
365
499
  commands use `projmux agent integrate <provider>`.
366
500
 
@@ -374,8 +508,9 @@ through v0.11.1 before the next release when you need the migration-window
374
508
  event guarantee.
375
509
 
376
510
  Migration is ownership- and transaction-aware. Codex managed blocks and the
377
- Claude, Antigravity, Statusline, and tmux-bell markers are the only ownership
378
- evidence. Missing integrations and markerless commands are not installed or
511
+ Claude, Antigravity, and tmux-bell markers are the only ownership
512
+ evidence (the legacy Antigravity statusLine marker is only ever removed; see
513
+ [Antigravity statusLine support removed](#antigravity-statusline-support-removed)). Missing integrations and markerless commands are not installed or
379
514
  rewritten. Provider file plans and conflicts are collected before the first
380
515
  file write. Live bell state is then inventoried on the exact target socket
381
516
  before its first command; a later bell failure rolls back both that live state