pi-session-mcp 0.8.1 → 0.8.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.
@@ -128,9 +128,20 @@ trash, delete the trash entry by entry, owned record. `--apply`, `--remove` and
128
128
  transaction, and only when the slot is empty, a link, or one of setup's two
129
129
  copies:
130
130
 
131
- - A trash directory is deleted after a structural recheck: a real directory,
132
- regular files and directories only, no hidden entries, within the tree
133
- limits. It may be partial, because it was verified before the rename.
131
+ - A trash directory is deleted only when its current contents are the
132
+ complete, unchanged replaced copy: its version 2 tree fingerprint equals the
133
+ replaced fingerprint in the pending record. A partial trash tree (for
134
+ example after an interruption during the entry-by-entry deletion, including
135
+ an empty one), a modified, added-to, foreign or otherwise unprovable tree,
136
+ and any trash when the record names no usable replaced fingerprint are
137
+ retained. A directory name, the transaction id or a structural check alone
138
+ never proves ownership of the contents. This deliberately replaces the
139
+ earlier automatic deletion of partial trash trees; continuing a partial
140
+ deletion would need additional durable evidence, and no journal is added
141
+ for it. The fingerprint covers the paths and contents of regular files, not
142
+ empty directories or file modes, so an empty directory or a mode change
143
+ inside an otherwise complete trash does not prevent its deletion; no file
144
+ content is lost that way.
134
145
  - The backup must equal the replaced copy; the staging directory must equal
135
146
  the target or be an interrupted write of it. A partially written staging
136
147
  directory counts only when every file is a prefix-consistent part of the
@@ -138,10 +149,22 @@ copies:
138
149
  - `--apply` with an empty slot finishes forward with a complete staging
139
150
  directory, else moves the verified backup back. `--remove` and `--rollback`
140
151
  delete the verified intermediates and leave the slot to the removal.
141
- - Anything modified or foreign stays and is reported as
142
- `skill_recovery_retained` (divergent). A failed update leaves its staging
143
- directory until the next run settles it, and an unhealthy ownership fence
144
- retains intermediates the same way.
152
+ - Anything modified or foreign, the trash directory included, stays and is
153
+ reported as `skill_recovery_retained` (divergent). The pending record and
154
+ the slot then stay unchanged, and nothing is reported as settled. A
155
+ retained trash stops recovery before any other intermediate is touched; a
156
+ retained backup or staging directory can follow the deletion of a proven
157
+ own trash. A failed update leaves its staging directory until the
158
+ next run settles it, and an unhealthy ownership fence retains intermediates
159
+ the same way.
160
+ - Operator settlement of a retained trash directory: inspect the
161
+ `.pi-session-mcp-<skill>-<transactionId>.trash` directory next to the slot,
162
+ move any own content elsewhere, delete that directory, and rerun the same
163
+ setup command.
164
+ - For a pending version 2 transaction, `--dry-run` reports
165
+ `skill_recovery_retained` (divergent, exit 1) whenever `--apply` would
166
+ retain an intermediate, using the same read-only classification as the
167
+ recovery, and otherwise `skill_recovery_planned`. A dry-run never writes.
145
168
  - Random-name directories of 0.8.0 updates are never searched for or deleted;
146
169
  an operator may remove them by hand.
147
170
  - `--dry-run` and `--verify` do not report leftover intermediates.
@@ -264,29 +287,53 @@ skill name only if it is valid, else `invalid`.
264
287
 
265
288
  Production verification requires the offline Doctor, exact public client-CLI registration inspection, and a directly launched bounded MCP handshake. The verifier calls `pi_capabilities_get` with `{}` only; session start/prompt/turn and provider/model operations are forbidden. Its child process is terminated and awaited before success is reported.
266
289
 
290
+ Verify evaluates one target in this order, and the first failure ends that
291
+ target's verification:
292
+
293
+ 1. An unknown client: `client_unsupported`.
294
+ 2. Ownership: `ownership_unavailable`.
295
+ 3. Release binding: `release_binding_mismatch`.
296
+ 4. Doctor, under its own code. A failed Doctor ends the target's verify before
297
+ the registration is inspected and before any handshake.
298
+ 5. Inspection. A client the inspection reports as unsupported or not
299
+ discoverable, for example because its CLI is not on `PATH`, gives status
300
+ `unsupported` and code `unsupported`. An inspection that throws gives
301
+ `inspect_failed`. An absent registration, a divergent one, and an
302
+ equivalent one with another fingerprint give `registration_not_equivalent`.
303
+ 6. Only a truly equivalent registration runs the bounded handshake, which
304
+ reports `mcp_verified` or `mcp_<status>`.
305
+
306
+ None of the failure cases mutates a registration or starts the handshake, and
307
+ all exit with `1`. There is no separate client-unavailable code; the
308
+ dry-run already separates these states the same way.
309
+
267
310
  ## Compatibility and reporting
268
311
 
269
312
  Codex and Claude Code are separate adapters with explicit supported scopes and documented capability fixtures. Unknown output fails closed with stable codes. Absolute paths are passed only to client commands where required and are never included in results, logs, or ownership metadata. Client command diagnostics must be reduced to stable codes before crossing this boundary.
270
313
 
271
- Human and JSON output derive from one `schemaVersion: 1` result. Exit code `0` is success, `1` is an operational or reconciliation failure, `64` is command-line misuse, and interrupted setup returns `130` for `SIGINT` or `143` for `SIGTERM` only after the guardian cleanup path has completed or retained the fence. Automatic replacement of a divergent registration is deliberately unsupported.
314
+ Human and JSON output derive from one `schemaVersion: 1` result; this version is the setup report's own, not the package version or the MCP tool contract (see [Versions](tool-contracts.md#versions)). Exit code `0` is success, `1` is an operational or reconciliation failure, `64` is command-line misuse, and interrupted setup returns `130` for `SIGINT` or `143` for `SIGTERM` only after the guardian cleanup path has completed or retained the fence. Automatic replacement of a divergent registration is deliberately unsupported.
272
315
 
273
316
  Stable finding codes are grouped by responsibility:
274
317
 
275
318
  - input/prerequisites: `target_invalid`, `config_required`, `usage_invalid`,
276
319
  `platform_unsupported`, `operation_interrupted`,
277
320
  `doctor_failed`, `release_unavailable`, `client_unsupported`, `inspect_failed`;
278
- - planning/reconciliation: `absent`, `equivalent`, `divergent`,
321
+ - planning/reconciliation: `absent`, `equivalent`, `divergent`, `unsupported`,
279
322
  `already_equivalent`, `divergence_requires_replacement`,
280
323
  `registration_fingerprint_mismatch`, `release_binding_mismatch`;
281
324
  - ownership/apply: `applied`, `pending_recovered`, `ownership_unavailable`,
282
325
  `apply_failed_recovery_pending`;
283
- - verification: `registration_not_equivalent`, `mcp_verified`,
284
- `mcp_unsupported`, `mcp_timeout`, `mcp_failed`;
326
+ - verification: `registration_not_equivalent` (absent, divergent or
327
+ differently fingerprinted registration), `mcp_verified`, `mcp_unsupported`,
328
+ `mcp_timeout`, `mcp_failed`; verify also reports `unsupported` (client not
329
+ discoverable) and `inspect_failed` (inspection threw), which belong to the
330
+ other groups;
285
331
  - rollback/removal: `rolled_back`, `removed`, `ownership_diverged`,
286
332
  `cleanup_failed`;
287
333
  - controller skill, dry-run: `skill_absent`, `skill_equivalent`, `skill_linked`,
288
- `skill_update_planned`, `skill_recovery_planned`, `skill_divergent`,
289
- `skill_legacy_unverified`, `skill_source_invalid`;
334
+ `skill_update_planned`, `skill_recovery_planned`,
335
+ `skill_recovery_retained`, `skill_divergent`, `skill_legacy_unverified`,
336
+ `skill_source_invalid`;
290
337
  - controller skill, apply: `skill_installed`, `skill_already_equivalent`, `skill_recovered`, `skill_linked`,
291
338
  `skill_updated`, `skill_divergent`, `skill_legacy_unverified`,
292
339
  `skill_recovery_retained`, `skill_source_invalid`,
@@ -90,6 +90,25 @@ bounded direct MCP `initialize`, `tools/list`, and
90
90
  `pi_capabilities_get({})` check. It never starts a session or invokes
91
91
  a provider.
92
92
 
93
+ ### Verify diagnostics
94
+
95
+ Verify checks one target in a fixed order and stops that target at the first
96
+ failure. After an unknown client (`client_unsupported`), ownership
97
+ (`ownership_unavailable`) and release binding (`release_binding_mismatch`),
98
+ Doctor runs; if it fails, verify reports its code and neither inspects the
99
+ registration nor runs the handshake. Then the client's registration is
100
+ inspected:
101
+
102
+ | Result | Status | Code | What it means |
103
+ | --- | --- | --- | --- |
104
+ | Client unsupported or not discoverable | `unsupported` | `unsupported` | Setup could not run or recognize the client CLI. Usually the CLI is not on `PATH`, for example in a non-interactive SSH shell. Put the client's directory on `PATH` and rerun; the registration itself may be fine. `--dry-run` reports the same state |
105
+ | Inspection failed | `failed` | `inspect_failed` | Inspecting the registration threw an error. Rerun; if it persists, run the client's own `mcp` listing |
106
+ | Registration absent, divergent, or equivalent with another fingerprint | `failed` | `registration_not_equivalent` | The registration is missing or differs from the one setup would create. Run `--dry-run` for the exact state |
107
+ | Registration equivalent | `ok` or `failed` | `mcp_verified` or `mcp_<status>` | Only now does the bounded MCP handshake run |
108
+
109
+ None of the failure rows changes a registration or starts the handshake, and
110
+ each exits with `1`.
111
+
93
112
  ### Controller skill
94
113
 
95
114
  Besides the registration, `--apply` installs the controller skill
package/docs/releasing.md CHANGED
@@ -16,7 +16,13 @@ does not authorize any of them.
16
16
  - A change to the public contract needs a minor release and its own decision.
17
17
 
18
18
  The public contract is the set of eight tools with their fields, states and
19
- error codes, as defined in the [tool contracts](tool-contracts.md).
19
+ error codes, as defined in the [tool contracts](tool-contracts.md). How the
20
+ package version, the MCP tool contract and the setup report's `schemaVersion`
21
+ differ is defined under [Versions](tool-contracts.md#versions).
22
+
23
+ Wherever this document asks for the Level 1 checks, the test step is
24
+ `NODE_OPTIONS=--unhandled-rejections=strict npm test`. CI uses the same
25
+ setting, so an unhandled promise rejection fails the run locally and in CI.
20
26
 
21
27
  A release is distributed twice: as the GitHub release with its source archive,
22
28
  and as the npm package `pi-session-mcp`. The npm package contains the built
@@ -0,0 +1,393 @@
1
+ # Post-0.8.1 audit and backlog snapshot
2
+
3
+ Snapshot date: 2026-10-13. Reviewed source:
4
+ [`e462054a37505ef00e1e0c549ebab27e4db7ef55`](https://github.com/plagor44-ux/pi-session-mcp/commit/e462054a37505ef00e1e0c549ebab27e4db7ef55).
5
+ Documentation tracking: [#57](https://github.com/plagor44-ux/pi-session-mcp/issues/57).
6
+
7
+ PR #55 delivered useful stabilization and its final native CI passes. This
8
+ review nevertheless reproduced an additional, bounded data-preservation defect
9
+ in skill recovery and confirmed the diagnostic classification in issue #56.
10
+ Fix these first, then complete the missing acceptance. The evidence does not
11
+ justify a general new feature phase.
12
+
13
+ This is an English preservation of the review and plan produced on 2026-10-13.
14
+ The observations below belong to the reviewed source, not to future fixes.
15
+ Proposed tasks are separate from verified facts. Creating this record does not
16
+ fix either defect or complete any acceptance. The shorter execution index is
17
+ the [roadmap](../roadmap.md).
18
+
19
+ ## Repository and source bindings
20
+
21
+ `plagor44-ux/pi-control` is archived, with no open issues or pull requests at
22
+ the snapshot. Its final PR is
23
+ [#79](https://github.com/plagor44-ux/pi-control/pull/79), main `a64a5b8`.
24
+ Its issues #31, #32 and #41 were closed as `not_planned`, not implemented.
25
+ The [closing comment on #41](https://github.com/plagor44-ux/pi-control/issues/41#issuecomment-6037099724)
26
+ explicitly names Pi Session MCP as the successor. Other software projects are
27
+ outside this review.
28
+
29
+ | Subject | Observed state |
30
+ | --- | --- |
31
+ | Main | `e462054a37505ef00e1e0c549ebab27e4db7ef55` |
32
+ | Latest PR | [#55](https://github.com/plagor44-ux/pi-session-mcp/pull/55), merged 2026-10-12 at 21:15 UTC; final head `440f2e4ccb4f7cebd88825abd8515218f4bbbdee` |
33
+ | Release | [v0.8.1](https://github.com/plagor44-ux/pi-session-mcp/releases/tag/v0.8.1), published 2026-10-12 at 22:06 UTC, or 2026-10-13 at 00:06 Europe/Berlin |
34
+ | Open issues during review | One: [#56](https://github.com/plagor44-ux/pi-session-mcp/issues/56) |
35
+ | Open PRs during review | None |
36
+ | Final PR CI | [38309093300](https://github.com/plagor44-ux/pi-session-mcp/actions/runs/38309093300), Linux, macOS 15, macOS 26 and the aggregate check passed |
37
+ | Main CI | [38309519719](https://github.com/plagor44-ux/pi-session-mcp/actions/runs/38309519719), passed |
38
+ | Tag CI | [38309738675](https://github.com/plagor44-ux/pi-session-mcp/actions/runs/38309738675), passed |
39
+ | SDK canary | [38247575455](https://github.com/plagor44-ux/pi-session-mcp/actions/runs/38247575455), passed on `de46896`, before #55 |
40
+ | Dependencies | Package 0.8.1, Pi SDK 1.1.0, MCP client/server 2.3.1; direct dependencies exactly pinned |
41
+
42
+ Open issue and PR collections, repository paths, [AGENTS.md](../../AGENTS.md),
43
+ all seven ADRs, both implementation plans, acceptance, releasing, skills,
44
+ setup design, threat model, CI and the changed runtime files and relevant
45
+ tests were inspected. Main and the open issue collection were rechecked
46
+ before delivery; main remained `e462054` and #56 remained the only open issue.
47
+ The subsequent documentation issue #57 is not part of that earlier snapshot.
48
+ Refresh main, issues, PRs and affected sources before implementation.
49
+
50
+ ## Findings
51
+
52
+ ### F1: recovery deletes operator changes in the transaction's trash
53
+
54
+ Severity: medium correctness/data-preservation defect. Work priority: P1.
55
+ The reproduced case needs an interrupted local skill update and subsequent
56
+ operator changes to its intermediate directory. It does not establish remote
57
+ reachability or general deletion of workspace files.
58
+
59
+ In [src/setup-skills.ts](../../src/setup-skills.ts), `recover()` at reviewed
60
+ lines 313–320 checks `.trash` only with `collectPlain()`: directory structure,
61
+ regular file types, hidden entries and tree limits. An additional regular file
62
+ passes this check; `discardTrash()` then removes it. A transaction-shaped
63
+ directory name does not prove that its current contents remain setup's own.
64
+
65
+ The isolated reproduction used the built modules from the reviewed source,
66
+ a temporary synthetic package, home and project, and `MemoryOwnershipStore`:
67
+
68
+ 1. Install a synthetic v1 controller skill.
69
+ 2. Provide a synthetic v2 override.
70
+ 3. Throw at the existing `trash-renamed` checkpoint during the update. This
71
+ leaves the actual pending record and intermediate directory. It simulates
72
+ an interruption; it is not evidence of a real operating-system crash.
73
+ 4. Add a regular `operator-notes.txt` with synthetic operator content inside
74
+ that `.trash` directory.
75
+ 5. In separate fresh fixtures, run `apply`, `remove` and `rollback`.
76
+
77
+ | Operation | Reported code | Operator file retained |
78
+ | --- | --- | --- |
79
+ | apply | skill_recovered | No |
80
+ | remove | skill_removed | No |
81
+ | rollback | skill_removed | No |
82
+
83
+ The [skills guide](../skills.md) and [setup lifecycle design](../client-setup-design.md)
84
+ also promise to retain modified or foreign intermediates. Existing recovery
85
+ tests cover modified backups and staging trees, plus trash with links or
86
+ hidden entries. The regular foreign-trash-file counterexample is missing.
87
+
88
+ Smallest proposed correction: delete a complete trash tree only after proving
89
+ it equals the replaced tree. Retain a partial or otherwise unprovable tree
90
+ with `skill_recovery_retained`. Continuing a partial deletion is not a reason
91
+ to risk operator files. If automatic partial recovery requires additional
92
+ durable evidence, deliver the conservative behavior first and decide that
93
+ extra scope separately. Do not introduce a broad journal abstraction as
94
+ incidental work. Align partial-trash expectations and documentation with the
95
+ actual preservation guarantee; do not weaken the counterexample.
96
+
97
+ At the audit snapshot this finding had no GitHub implementation issue.
98
+ Duplicate-check and create a focused issue before implementing R01.
99
+
100
+ ### F2: verify misclassifies client and inspection failures
101
+
102
+ Severity: low diagnostic defect. Work priority: P2. Existing tracker:
103
+ [#56](https://github.com/plagor44-ux/pi-session-mcp/issues/56).
104
+
105
+ In [src/setup.ts](../../src/setup.ts), `verify()` at reviewed lines 146–149
106
+ reduces the inspection to an `equivalent` boolean. Both `unsupported` and an
107
+ inspection exception become `registration_not_equivalent`.
108
+
109
+ An isolated synthetic-adapter reproduction confirmed:
110
+
111
+ | Inspection | dry-run | verify |
112
+ | --- | --- | --- |
113
+ | unsupported | unsupported | registration_not_equivalent |
114
+ | exception | inspect_failed | registration_not_equivalent |
115
+ | absent | absent | registration_not_equivalent |
116
+ | divergent | divergent | registration_not_equivalent |
117
+
118
+ The production wrapper returns `unsupported` when client discovery fails.
119
+ The actual missing-PATH-client reproduction is reported in #56. This review
120
+ executed the orchestrator counterexample, not a real client installation.
121
+
122
+ Smallest proposed correction: preserve existing `unsupported` and
123
+ `inspect_failed` codes; reserve `registration_not_equivalent` for a genuinely
124
+ absent or divergent registration. A new `client_unavailable` code is not
125
+ necessary. Neither failure may start a mutation or MCP handshake. Preserve
126
+ Doctor, ownership and release-binding precedence, and check human/JSON output,
127
+ exit status, documentation and negative Level-2 cases.
128
+
129
+ ## Review and CI limits
130
+
131
+ [CI 38307240366](https://github.com/plagor44-ux/pi-session-mcp/actions/runs/38307240366)
132
+ failed on both macOS jobs at the earlier `183d53c` head; Linux passed.
133
+ `f048144` made Linux-only harness checks platform-explicit and `0c7bad3`
134
+ named the platform in lock fail-closed cases. The final head passes the full
135
+ matrix. There is no still-failing final PR check in this observation.
136
+
137
+ GitHub returned no formal review submissions and no inline review threads
138
+ for #55. The [Codex security comment](https://github.com/plagor44-ux/pi-session-mcp/pull/55#issuecomment-6132442390)
139
+ names `183d53c`, a P0 threshold and no merge gate. It does not approve the
140
+ complete final head. The PR description reports independent local reviews;
141
+ their reports were not separately available to this review. Green CI and the
142
+ security summary do not exclude F1.
143
+
144
+ ## Checks actually executed by the review
145
+
146
+ Unmodified checkout `e462054`; Linux container, Node.js 24.19.0. No real
147
+ client registrations, models or providers were used. The review itself did
148
+ not modify repository files, create commits/issues/PRs or publish a release.
149
+ The later documentation-preservation change is separate.
150
+
151
+ | Check | Result |
152
+ | --- | --- |
153
+ | npm ci | Exit 0 |
154
+ | npm run typecheck | Exit 0 |
155
+ | npm run build:cli | Exit 0 |
156
+ | NODE_OPTIONS=--unhandled-rejections=strict npm test | Exit 1: 41 files passed, 9 failed; 983 tests passed, 52 failed, 6 skipped; 4 unhandled errors |
157
+ | npm run build | Executed separately, exit 0 |
158
+ | npm audit | Exit 0; no vulnerabilities at the time of the query |
159
+ | git diff --check | Exit 0 |
160
+ | git status --short | Empty |
161
+ | Recovery reproduction | F1 confirmed for all three operations |
162
+ | Verify reproduction | F2 confirmed for unsupported and inspection exception |
163
+ | Isolated existing process-table test | createProcessTable().readable() failed in this environment |
164
+
165
+ Failures concentrate on process groups, `/proc`, kernel locks, the guardian
166
+ and dependent crash/harness tests. Direct probes gave inconsistent process
167
+ visibility. The precise cause is unresolved. The isolated process test,
168
+ `src/setup-platform.ts`, `src/setup-process.ts` and `test/process-fixture.ts`
169
+ are unchanged from the PR base. This argues against attributing all 52
170
+ failures to #55 but does not establish the cause of each failure. Do not
171
+ claim a green local acceptance or turn all failures into new product bugs.
172
+ A complete run on a supported native runner remains a gate.
173
+
174
+ ## Complete clustered remainder
175
+
176
+ P1 means first or a gate for dependent usage. P2 is bounded follow-up work.
177
+ P3 needs concrete demand. **R01–R23 are roadmap identifiers, not GitHub issue
178
+ numbers.** Only #56 was already an open issue during the audit; other rows are
179
+ findings, evidence gaps or proposed maintenance tasks.
180
+
181
+ ### A: correctness and local operation
182
+
183
+ | ID | Priority | Remainder | Deliverable |
184
+ | --- | --- | --- | --- |
185
+ | R01 | P1 | F1 modified-trash data loss | Focused issue and conservative fix; regular foreign file, modified existing content, complete own trash and partial trash counterexamples for apply/remove/rollback |
186
+ | R02 | P2 | F2 / #56 verify classification | Preserve existing codes; negative cases without mutation or handshake |
187
+ | R03 | P1 gate | Local full suite failed | Reproduce on native Linux; distinguish product defects from container prerequisites without retries or weaker process proofs |
188
+ | R04 | P2 | Non-exhaustive start-error list in the orchestration skill | Classify current public start codes as operator-needed, transient or unknown; never classify provider free text |
189
+
190
+ ### B: evidence and orchestration
191
+
192
+ | ID | Priority | Remainder | Deliverable |
193
+ | --- | --- | --- | --- |
194
+ | R05 | P1 | No full ten-task Level-3 cycle on Pi SDK 1.x | One frozen build, both controllers, five tasks each, independent snapshots/oracles; preserve failed attempts |
195
+ | R06 | P1 gate | Final supplementary Codex abort run violated scope | Offer handshake only where needed or make it unambiguously task-bound; new run with unchanged strict scope oracles, not a wider allowed-file set |
196
+ | R07 | P2 | No live discovery of the setup-installed Codex home skill | Real discovery of a regular setup-installed copy in an isolated client home; verified revision, no required manual symlink |
197
+ | R08 | P2 | Third concurrent worker and read-only reviewer unproven live | After two-worker acceptance, two writers in separate worktrees plus a reviewer of a frozen result; scope, association, neighbor abort and close |
198
+ | R09 | P2 | Current multi-session live evidence covers Cursor workers only | Level 3 for the normal/local Pi profile actually intended for use; do not transfer Cursor evidence to other providers |
199
+ | R10 | P2 | Current macOS Level-2 path not fully accepted on real hardware | 0.8.x with both clients in isolated homes; prior Claude Code evidence does not automatically cover new skill locks/recovery, and Codex was already pending |
200
+ | R11 | P2 conditional | macOS live use beyond CI | Small real-Mac read-only smoke when needed; heavy suites and parallel inference on suitable Linux hardware |
201
+ | R12 | P3 | Real skill-update crash, customization contention and harness-analysis signal runs absent | Add only targeted evidence when operating experience warrants it; existing provider-free tests are not renamed as live evidence |
202
+
203
+ Two-session operation already has real evidence: Claude Code passed parallel
204
+ and abort; Codex passed parallel. The final Codex abort run failed only
205
+ `range:changes`, because a Cursor worker applied the handshake skill to an
206
+ unrequested file. Abort, neighbor behavior and cleanup passed. This is a
207
+ task/worker outcome, not a demonstrated session-control defect. More than two
208
+ sessions are not documented as technically impossible; their live proof is
209
+ missing.
210
+
211
+ ### C: acceptance and release evidence quality
212
+
213
+ | ID | Priority | Remainder | Deliverable |
214
+ | --- | --- | --- | --- |
215
+ | R13 | P2 | Runs bind extension name/version, not package contents | Fingerprint effectively loaded extension trees before/after a run; changed contents invalidate acceptance; no published raw paths |
216
+ | R14 | P2 | Additional Codex skill sources are not bound | Bind actually active CODEX_HOME/system skill sources or demonstrably exclude them; prerequisite for R07 |
217
+ | R15 | P3 | Unreadable client start time immediately after spawn leaves no sighting | Explicit failed/unverified evidence; never infer cleanup from an absent observation |
218
+ | R16 | P2 | Strict unhandled rejections are not explicit in CI | Align the current CI test environment with the local strict command; no broad new matrix |
219
+ | R17 | P3 | npm audit is manual only | Keep the manual release gate; consider one small scheduled advisory check only after further demonstrated drift, in its own issue |
220
+ | R18 | P3 | npm publication has no provenance attestation | Consider Trusted Publishing/provenance as a separate supply-chain decision if external use makes it relevant; not a blocker for bounded local dogfooding |
221
+
222
+ The latest observed canary predates #55. A current-source canary can add
223
+ maintenance evidence, but cannot replace native full-suite or live acceptance.
224
+ It does not authorize an SDK upgrade.
225
+
226
+ ### D: documentation and planning
227
+
228
+ | ID | Priority | Remainder | Deliverable |
229
+ | --- | --- | --- | --- |
230
+ | R19 | P2 | v0.8.1 post-release evidence exists only in release notes | Carry it into acceptance with the next change PR, as #55 explicitly planned; do not describe this as a forgotten release operation |
231
+ | R20 | P2 | Historical macOS/extension plans retain unchecked steps | Mark delivered/superseded work with PR references; do not reimplement it |
232
+ | R21 | P2 | No consolidated active roadmap in the successor | Short English docs/roadmap.md with actual remainder, sources and gates, under a focused issue |
233
+ | R22 | P2 | ChatGPT project instructions still describe the former repository/release sequence | Update successor, SDK, macOS, extensions/skills and current ADR ordering; do not reuse v0.3.0 or old #11–#14 as active priorities |
234
+ | R23 | P3 | Acceptance/versioning wording can be misunderstood | Distinguish targeted two-session evidence from full Level 3; clarify MCP-contract versus setup-report versioning |
235
+
236
+ R21 is the documentation created alongside this snapshot. The other rows do
237
+ not become complete merely because they are recorded here.
238
+
239
+ ### E: deliberately deferred decisions
240
+
241
+ | Topic | State | Entry condition / smallest useful test |
242
+ | --- | --- | --- |
243
+ | OS/process isolation | ADR 0003; decide before real writable workspaces | Non-disposable repositories or untrusted coding content: separate architecture/threat-model issue; synthetic isolated write test |
244
+ | pi_turn_wait | No implementation now | Routinely more than about five polls per turn with pauses, or demonstrated tool/approval cost. The reported 5–7 polls per invocation do not establish the trigger |
245
+ | Persistence/resume | No demonstrated current need | Actual loss of useful work after restart; otherwise ephemeral sessions |
246
+ | HTTP/remote/mobile | No approved need | Concrete case SSH/existing remote development cannot satisfy; separate ADR/security decision |
247
+ | Finer turn_failed | Upstream-dependent | Closed public final SDK cause discriminator after retry/compaction, with positive and negative cases; no regex on raw errors |
248
+ | Multi-user, UI, credential management | Outside product scope | Separate justified product goal and ADR |
249
+ | Former pi-control #31/#32 | Closed as not_planned | No automatic reopening/migration; a current project-specific need requires separate scope |
250
+ | Former release gates and #11–#14 | Historical | Do not repeat delivered historical gates; acceptance must bind the current build |
251
+
252
+ ## Plan and ADR reconciliation
253
+
254
+ | Source | Delivered state | Actual remainder |
255
+ | --- | --- | --- |
256
+ | [macOS plan, 2026-10-10](../superpowers/plans/2026-10-10-macos-setup.md), tasks 1–8 | Platform, runner/guardian, ownership, tests, EOF, CI and docs delivered by #33; #32 closed | Real Codex Mac acceptance, current 0.8.x skill paths, plan checkbox status |
257
+ | [Extension plan, 2026-10-11](../superpowers/plans/2026-10-11-pi-extensions.md), tasks 1–9 | Configuration, resolution, Doctor, stdout guard, prompt source, runtime, contracts and governance delivered by #35/#37/#44; #34 closed | Plan status and current follow-ups; no duplicate implementation |
258
+ | Extension plan, task 10 | Cursor live path documented in acceptance and #55, including Claude Code parallel/abort | Controller/platform limits in cluster B |
259
+ | [ADR 0001](../adr/0001-stdio-first.md) | Local stdio, one trusted peer | No transport project |
260
+ | [ADR 0002](../adr/0002-embedded-pi-sdk.md) | Public embedded APIs, no OS isolation | Read later approved ADR 0006/0007 expansions together |
261
+ | [ADR 0003](../adr/0003-post-mvp-maintenance.md) | Maintenance, no general feature phase | Evaluate revisit triggers using current measurements only |
262
+ | [ADR 0004](../adr/0004-client-contract-not-version.md) | Client contract rather than exact client-version allowlist | Fix #56; do not reinstate the old allowlist |
263
+ | [ADR 0005](../adr/0005-macos-setup-platform.md) | macOS with the same fence guarantee | Current native acceptance |
264
+ | [ADR 0006](../adr/0006-pi-extension-allowlist.md) | Exact locally installed profile extensions | Runtime/content evidence; no automatic install |
265
+ | [ADR 0007](../adr/0007-profile-skill-selection.md) | Operator catalog, profile-selected skills, setup-installed controller skill | F1 and actual discovery; skills neither grant rights nor guarantee task success |
266
+
267
+ ## Four gated sprints
268
+
269
+ Dates are a proposal from 2026-10-13, not a capacity commitment. A delayed gate
270
+ shifts dependent work; independent documentation and Mac setup checks may
271
+ continue. Each coding task needs a focused issue first.
272
+
273
+ ### Sprint 1: stability and correct diagnostics
274
+
275
+ Proposed window: October 13–14, one or two implementation sessions plus native
276
+ verification. Scope: R01, R02, R03, R19 and directly affected documentation.
277
+
278
+ Create the missing R01 issue after a duplicate check. Claude Code locally
279
+ integrates. Recovery and #56 can run in separate worktrees with read-only
280
+ review/documentation work in parallel. Run the heavy full suite only after
281
+ integration; do not overlap full suites on a small host.
282
+
283
+ - Recovery owns `src/setup-skills.ts` and dedicated recovery counterexamples.
284
+ - #56 owns `src/setup.ts` and targeted lifecycle/verify tests.
285
+ - The integrator owns shared docs, changelog, acceptance and version fields.
286
+
287
+ Exit gate:
288
+ - Modified regular trash contents remain intact under apply/remove/rollback.
289
+ - Complete own intermediates are handled correctly; unprovable partial trees
290
+ remain with a stable report code.
291
+ - Missing clients report unsupported and inspection exceptions inspect_failed;
292
+ neither runs a registration mutation or handshake.
293
+ - Doctor, release-binding and ownership precedence remain intact.
294
+ - Native Level 1 has no unhandled rejections; the final head passes the full
295
+ Linux/macOS matrix and independent code review.
296
+ - Level 2 remains green on actually checked targets; new negative cases are
297
+ recorded separately.
298
+
299
+ Delivery: one consolidated maintenance PR with separate issue commits.
300
+ 0.8.2 is a possible patch candidate if the MCP contract is unchanged. The
301
+ version and pre-release evidence belong in that change PR under the current
302
+ release procedure. Merge/tag/publish remain a separate maintainer gate, not
303
+ an action performed by this plan. Do not approve if F1 remains or native
304
+ Level 1 fails.
305
+
306
+ ### Sprint 2: make acceptance traceable
307
+
308
+ Proposed window: October 15–16, one or two sessions after Sprint 1. Scope:
309
+ R04, R13, R14, R16 and R19–R23 where narrowly justified. Include R15 only if a
310
+ counterexample establishes a material proof gap.
311
+
312
+ Bind effectively loaded extensions and active skill sources; do not silently
313
+ ignore unknown sources. Offer the handshake only where its task needs it.
314
+ Keep original strict scope oracles. Reconcile historical plans with delivered
315
+ PRs, maintain a short English roadmap and preserve post-release evidence.
316
+ Align strict CI. Check the current-source canary on a frozen candidate without
317
+ moving the SDK pin.
318
+
319
+ Harness evidence, controller-skill failure policy and documentation can run in
320
+ separate worktrees. One owner edits the central harness; the integrator owns
321
+ shared acceptance documentation.
322
+
323
+ Exit gate: changing a bound skill/extension after preparation invalidates a
324
+ run; installed versus linked skills are distinguishable; original failed
325
+ attempts remain recorded; every remainder has an issue or explicit entry
326
+ condition. No new runtime feature phase.
327
+
328
+ ### Sprint 3: accept real usage
329
+
330
+ Proposed window: October 17–20, two or three bounded acceptance sessions, not
331
+ a broad implementation package. Scope: R05–R11. Requires Sprint 1 and the
332
+ Sprint-2 evidence bindings before the runs that depend on them.
333
+
334
+ Start on Linux with the full Level-3 matrix for both controllers at the same
335
+ frozen build. Select a normal/local Pi profile actually intended for use;
336
+ record the loaded model before/after every run and never force a model switch
337
+ on shared inference. Use synthetic coding fixtures only. Pre-register tests,
338
+ allowed files, snapshots and oracles. A scope failure remains a failed task.
339
+
340
+ Then run targeted parallel/abort scenarios for both controllers with the
341
+ appropriate Cursor profile. A fresh Codex abort must pass scope too.
342
+ Only afterwards try one small extension to two writers in separate alias
343
+ worktrees and a read-only reviewer of a frozen result. Do not begin with a
344
+ large worker matrix.
345
+
346
+ In parallel, the Mac runs only current Level 2 for both clients and a short
347
+ read-only smoke. Keep heavy suites and parallel large inference off a
348
+ resource-constrained work Mac. If a client is unavailable, retain that gate
349
+ and deliver independent Linux work.
350
+
351
+ Exit gate: meet the existing Level-3 criteria, including at least 8/10
352
+ intended outcomes without a server defect **and** every required scope,
353
+ security and cleanup condition, both client lifecycles, useful follow-ups
354
+ and verified coding. Target 10/10; the 8/10 rule never hides unauthorized
355
+ changes. Codex abort scope passes; setup's installed Codex copy is actually
356
+ read; read-only fixtures remain byte-identical; all sessions close with no
357
+ residual processes or structural leaks. Usage claims cover only tested
358
+ profiles, clients, platforms and concurrency.
359
+
360
+ ### Sprint 4: decide the next investment from usage
361
+
362
+ Proposed window: October 21–23, one short evaluation. No feature implementation
363
+ without a separate justified decision.
364
+
365
+ Evaluate failures/causes, scope violations, polls per turn with real pauses,
366
+ task duration, cleanup, actual restart costs and planned non-disposable coding
367
+ workspaces. Route R12/R15/R17/R18 into one concrete follow-up or the deferred
368
+ list according to need.
369
+
370
+ If real writing is next, isolation is the first architecture question. If only
371
+ polling is costly, examine the smallest bounded-wait proposal. If no trigger
372
+ fired, continue maintenance. Persistence and remote access need their own
373
+ evidence. The strongest argument against expansion is the security and
374
+ maintenance surface it adds to a deliberately small local server.
375
+
376
+ Exit gate: documented decision, at most one next investment, a focused issue
377
+ and an appropriate ADR for scope/contract changes. No automatic roadmap to
378
+ 1.0 or general release authorization.
379
+
380
+ ## Dependencies
381
+
382
+ ```mermaid
383
+ flowchart TD
384
+ S1["S1: Recovery and verify fixes"] --> G["Native QA and final review pass"]
385
+ G --> S2["S2: Bind harness evidence"]
386
+ G --> M["Current macOS Level 2"]
387
+ S2 --> S3["S3: Linux Level 3 and multi-session acceptance"]
388
+ M --> S4["S4: Usage boundary and next investment"]
389
+ S3 --> S4
390
+ ```
391
+
392
+ The next implementation session is Sprint 1: R01 plus #56 are the smallest
393
+ evidence-backed development step. A published tag alone is not its exit gate.