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.
- package/docs/agent-message-replies.md +49 -0
- package/docs/agent-workflow.md +166 -9
- package/docs/architecture.md +10 -0
- package/docs/claude-coordination-endpoints.md +15 -0
- package/docs/cli-guide.md +49 -6
- package/docs/cli.md +15 -15
- package/docs/codex-generation-pool.md +5 -0
- package/docs/codex-stored-qualification.md +45 -0
- package/docs/column-profiles.md +14 -9
- package/docs/heterogeneous-dialogue-canary.md +23 -0
- package/docs/keybindings.md +85 -0
- package/docs/operational-diagnostics.md +14 -0
- package/docs/replacement-contract.md +53 -12
- package/docs/session-restore.md +43 -3
- package/docs/troubleshooting.md +64 -3
- package/package.json +5 -5
package/docs/session-restore.md
CHANGED
|
@@ -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,
|
|
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
|
|
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
|
package/docs/troubleshooting.md
CHANGED
|
@@ -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,
|
|
124
|
-
|
|
125
|
-
|
|
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.
|
|
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.
|
|
32
|
-
"@projmux/linux-arm64": "0.15.
|
|
33
|
-
"@projmux/darwin-x64": "0.15.
|
|
34
|
-
"@projmux/darwin-arm64": "0.15.
|
|
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
|
}
|