projmux 0.15.0 → 0.15.2

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.
@@ -2,7 +2,11 @@
2
2
 
3
3
  Session snapshots are explicit desired-state inputs for one Project. They are
4
4
  not tmux replay scripts and they are not Registry backups. Snapshot save keeps
5
- the existing v1 schema and storage behavior.
5
+ the existing v1 schema and storage behavior. In snapshot save's runtime id
6
+ duplicate check, a Window or Pane recorded as `MissingRuntime`/`RuntimeUnbound`
7
+ does not claim its retained runtime id, so a tmux id reused after a server
8
+ restart does not refuse the save; two live Windows or two live Panes sharing an
9
+ id are still refused.
6
10
 
7
11
  ```sh
8
12
  projmux get snapshots [--session <snapshot-session>]
@@ -42,10 +46,11 @@ same-kind collision is rejected as damaged before trust authorization,
42
46
  Registry/tmux/provider mutation, or any snapshot write.
43
47
 
44
48
  The committed Registry is then converged by the ordinary Project materializer.
45
- For a restored offline Agent-anchor Window, `Continue project` visibly plans a
49
+ For a restored offline Agent-anchor Window, snapshot materialization visibly plans a
46
50
  lazy default shell, creates the Window from that shell, and stages the Agent on
47
51
  its retained anchor Pane UID. A successful repeat writes neither Registry nor
48
- topology. Agent recipes use the canonical provider launch/resume path. Stored startup
52
+ topology. Snapshot Agent recipes use the canonical provider launch/resume path,
53
+ including their existing fresh-conversation fallback. Stored startup
49
54
  commands are not directly executed by snapshot restore. A runtime item refusal
50
55
  does not roll the Registry back: desired state and the source snapshot remain
51
56
  available for another `Continue project`, and the refusal is reported as an
@@ -70,6 +75,41 @@ A closed Project has exactly two actions:
70
75
  Esc/cancel returns to Projects; it is not an action row. Picker failure falls
71
76
  back to the non-destructive `Continue project` action.
72
77
 
78
+ Continue resumes an Agent's exact recorded conversation after interrupted,
79
+ killed, abnormal, unknown, or unrecorded termination. Intentional and normal
80
+ termination remain excluded. A recorded receipt must agree on the Agent and
81
+ its retained Pane's current managed activation. Without a receipt, Running
82
+ requires its exact paneRef; Offline or Failed requires one unambiguous retained
83
+ Agent-owned Pane activation. Pending Agents are skipped. Live Agents are not
84
+ launched again.
85
+
86
+ A missing, blank, malformed, or mismatched conversation ref, a disabled provider,
87
+ a missing workspace, or a resume preparation failure skips the Agent with a
88
+ reason. Continue never substitutes a new conversation. Shells and other
89
+ recoverable Agents still converge; an unrecoverable Agent that is itself a
90
+ Window's required anchor keeps the existing Window refusal. Explicit snapshot
91
+ restore and `agent resume` retain their separate authority.
92
+
93
+ After Continue commits, its startup summary shows the resumed and skipped Agent
94
+ totals and `projmux diagnostics log --component topology`. The same counts are
95
+ available in the public materialize-project JSON result's `recovery` field.
96
+ Already-live Agents count in neither total. Full per-Agent explanations remain
97
+ on stderr; the transient summary stays within 220 UTF-8 bytes, including any
98
+ ellipsis, independently of Agent names or how many were skipped.
99
+
100
+ The private operations journal stores one `topology.outcome` and one
101
+ `topology.agent.skipped` row per reason in the same invocation `run_id`. Reason
102
+ counts sum to the committed skipped total. The ten codes use `topology.agent.`
103
+ followed by `termination-excluded`, `phase-ineligible`, `activation-unproven`,
104
+ `termination-invalid`, `session-ref-missing`, `session-ref-invalid`,
105
+ `session-ref-mismatch`, `provider-unavailable`, `workspace-unavailable`, or
106
+ `resume-prepare-failed`. `diagnostics report` includes recent closed recovery
107
+ events in `topology-recovery.json`, including successful partial and 0/0 results.
108
+ Journal rows contain no resource IDs/names, conversation IDs, payloads, or raw
109
+ errors. Dry-run writes no execution event; failed or rolled-back execution
110
+ records an error with zero committed counts. Journal and display failures are
111
+ best effort and never change the topology result.
112
+
73
113
  `Recreate Project` never deletes or overwrites autosave or named snapshot files. It
74
114
  preserves the root, Git/worktrees, trust decision, and all unrelated Registry
75
115
  graphs while changing the Project identity. A rejected commit retains the
@@ -111,6 +111,32 @@ The `Codex app-server` result keeps four readiness axes separate:
111
111
  remain separate supporting fields. A ready endpoint therefore does not hide an
112
112
  unmanaged process or version skew.
113
113
 
114
+ When a current Codex activation records a different endpoint generation from
115
+ the running default endpoint, `Codex endpoint generation comparison` lists each
116
+ affected Agent by exact `uid:` selector. The comparison uses the activation's
117
+ `endpointGenerationID` and the observed running version, independently of the
118
+ installed CLI version. It reports an observed interruption risk during endpoint
119
+ replacement (2026-09-09, n=1), with causality undetermined; interruption is not
120
+ certain. This is a snapshot valid before the next replacement, and performs no
121
+ recovery or process mutation.
122
+
123
+ The census includes bound Codex activations across every Project and Window in
124
+ the managed Registry, even if their Agent phase is stale. Offline conversation
125
+ history without a current activation is excluded. A complete comparison with no
126
+ mismatches emits no comparison block. An unreadable Registry or missing,
127
+ inconsistent, orphaned, or unobservable activation produces an `unavailable` or
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.
133
+
134
+ The additive `codex_endpoint_mismatch` JSON field carries the same mismatch set,
135
+ enumeration gaps, and evidence strength without changing the schema version.
136
+ Support report `doctor.json` preserves those counts and closed evidence fields;
137
+ Agent and generation IDs retain the support report's normal deterministic
138
+ hashes. Exact Agent selectors are available in ordinary Doctor text and JSON.
139
+
114
140
  `external-cli-only` states only two observed facts: the ordinary Codex CLI
115
141
  exists, and the managed standalone payload was not observed. It does not mean
116
142
  the ordinary CLI is unsupported, identify how that CLI was installed, or prove
@@ -120,9 +146,12 @@ An explicit native action refuses a ready unmanaged or version-skewed endpoint.
120
146
  The refusal reports `shared-clients-disconnect`: replacing this shared process
121
147
  can interrupt every attached Codex client. For a managed skew, confirm the
122
148
  interruption and run `codex app-server daemon restart`. For an unmanaged
123
- endpoint, close every sharing client, stop the process through the operator
124
- that owns it, then run `codex app-server daemon start`. Projmux never performs
125
- those stop/restart steps or invents an ownership-specific kill command.
149
+ endpoint, close every sharing Codex client, run
150
+ `codex app-server daemon bootstrap`, then rerun diagnostics. The observed `pid`
151
+ backend requires bootstrap again after reboot; this observation does not
152
+ establish boot persistence for other backends. The unmanaged bootstrap
153
+ prescription is absent for managed or unknown ownership. Projmux reports this
154
+ operator-owned guidance without executing the recovery commands.
126
155
 
127
156
  A prompted managed Codex create also requires that endpoint. When it is not
128
157
  ready or not attachable, `projmux create codex -- "<prompt>"` refuses instead of
@@ -159,6 +188,38 @@ method, rerun Doctor. Do not copy binaries, create symlinks in the Codex home,
159
188
  or edit the control socket as a diagnostic workaround. Doctor, Settings, and
160
189
  support-report collection never start the daemon or modify the installation.
161
190
 
191
+ The read-only manager observation is recorded separately as `manager_evidence`:
192
+ `status`, `backend`, `result`, `agreement`, and the manager's reported `version`.
193
+ `running_version` describes the independently initialized endpoint. A version or
194
+ running/stopped contradiction yields `manager_ownership=unknown`,
195
+ `native_action_refusal=evidence-contradictory`, and inspection guidance. A ready
196
+ endpoint with insufficient manager evidence also refuses mutation. Running/PID
197
+ or a managed-looking path alone does not prove ownership. The existing exact
198
+ cold-start rule remains separate; a contradictory running-manager observation
199
+ cannot authorize it.
200
+
201
+ Observer `ai-ingest.log` fallback rows keep the existing `reason` and add a
202
+ `failure` object: allowlisted request `method`, nullable original `rpc_code`, and
203
+ closed `cause`. For example, an unsupported request and a catalog rejection can
204
+ share `reason=unsupported` while retaining different original methods/codes.
205
+ Transport and local protocol failures have `rpc_code=null`. Read-only preflight
206
+ refusals also carry the same `recovery` evidence and operator decision Doctor
207
+ reports. These fields are appended only after the exact authority write succeeds;
208
+ the existing startup handshake and reason consumers are unchanged.
209
+ `projmux diagnostics agent-hook` displays the same safe `failure=` and `recovery=`
210
+ JSON objects in its default text output; `--json` retains the original JSONL
211
+ records. Older rows keep their existing text format.
212
+
213
+ Diagnostic bounds are 32 bytes per method/cause/evidence token or version,
214
+ 20 decimal bytes for an RPC integer, 64 bytes per recovery decision token,
215
+ 160 bytes for `failure` JSON, 256 for `manager_evidence`, and 768 for `recovery`.
216
+ The Codex health JSON/text section and enriched observer row each fit within
217
+ 4096 bytes (the row reserves space for its timestamp). Public journal text adds
218
+ at most 947 bytes for both diagnostic objects, labels and separators; an enriched
219
+ observer line remains within the same 4096-byte row bound. The existing journal file
220
+ retention bound remains 1 MiB. Provider messages, payloads, prompts, auth, paths,
221
+ and raw PIDs are excluded; unknown strings are replaced by closed unknown values.
222
+
162
223
  ## Incomplete npm install
163
224
 
164
225
  If the npm shim exits before Projmux starts with:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "projmux",
3
- "version": "0.15.0",
3
+ "version": "0.15.2",
4
4
  "description": "tmux project session manager",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/crevissepartners/projmux#readme",
@@ -28,9 +28,9 @@
28
28
  "package:npm:pack": "scripts/package-npm.sh --pack"
29
29
  },
30
30
  "optionalDependencies": {
31
- "@projmux/linux-x64": "0.15.0",
32
- "@projmux/linux-arm64": "0.15.0",
33
- "@projmux/darwin-x64": "0.15.0",
34
- "@projmux/darwin-arm64": "0.15.0"
31
+ "@projmux/linux-x64": "0.15.2",
32
+ "@projmux/linux-arm64": "0.15.2",
33
+ "@projmux/darwin-x64": "0.15.2",
34
+ "@projmux/darwin-arm64": "0.15.2"
35
35
  }
36
36
  }