pi-session-mcp 0.8.1 → 0.8.3

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.
@@ -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.
@@ -0,0 +1,140 @@
1
+ # Maintenance roadmap
2
+
3
+ Planning basis: main `e462054a37505ef00e1e0c549ebab27e4db7ef55`, 2026-10-13.
4
+ Tracking: [#57](https://github.com/plagor44-ux/pi-session-mcp/issues/57).
5
+ The complete [audit and clustered backlog](reviews/2026-10-13-post-0.8.1-audit.md)
6
+ preserves source bindings, reproductions, checks and all R01–R23 items.
7
+
8
+ PR #55 and v0.8.1 have green final native CI, but the review reproduced a
9
+ skill-recovery data-preservation defect and confirmed #56's verify diagnosis.
10
+ Both were fixed in Sprint 1; real acceptance follows. Recording tasks does not
11
+ mean they are implemented or that their gates passed.
12
+
13
+ ## Current state
14
+
15
+ Updated 2026-10-15. Base main `bdfb95de9a46defa64d2eb382d58d454f97fc8fb`
16
+ (the merge of the 0.8.2 release).
17
+
18
+ - R21 (this roadmap) was delivered as documentation by
19
+ [#58](https://github.com/plagor44-ux/pi-session-mcp/pull/58), which closed
20
+ [#57](https://github.com/plagor44-ux/pi-session-mcp/issues/57).
21
+ - Sprint 1 is closed: [#61](https://github.com/plagor44-ux/pi-session-mcp/pull/61),
22
+ merged as `b145f8c`, closed #59 (R01) and #56 (R02). See the
23
+ [Sprint 1 file](sprints/2026-10-13-s1-correctness.md#closure).
24
+ - Sprint 2 is closed: [#69](https://github.com/plagor44-ux/pi-session-mcp/pull/69)
25
+ was merged on 2026-10-13 as `0aae639`, after its final-head CI passed on
26
+ Linux, macOS 15 and macOS 26. It closed #60, #62, #63, #64, #65, #66, #67
27
+ and #68 as completed. See the [Sprint 2 file](sprints/2026-10-13-s2-evidence.md).
28
+ The main CI run on the merge commit then failed on `macos-15` in one harness
29
+ test that timed out on the slow runner; the tree is identical to the green
30
+ pull-request head. Tracked as
31
+ [#70](https://github.com/plagor44-ux/pi-session-mcp/issues/70) and fixed in
32
+ Sprint 3.
33
+ - Sprint 3 is closed: [#75](https://github.com/plagor44-ux/pi-session-mcp/pull/75)
34
+ was merged on 2026-10-13 as `f636e6e` with green CI on Linux, macOS 15
35
+ and macOS 26, also on main; it closed #70 and #71. The first ten-task Level 3
36
+ cycle on Pi SDK `1.x` was accepted (10 of 10, with the maintainer's intended
37
+ profiles `explore-fast` and `code-deepseek`); R06 and R07 passed; R08
38
+ passed for Codex while Claude Code failed one timing criterion
39
+ ([#74](https://github.com/plagor44-ux/pi-session-mcp/issues/74)). R10 and R11
40
+ are blocked on the work Mac, with a runbook. See the
41
+ [Sprint 3 file](sprints/2026-10-13-s3-live-usage.md).
42
+ - Release 0.8.2 was merged in [#76](https://github.com/plagor44-ux/pi-session-mcp/pull/76)
43
+ and published on 2026-10-14. It carries #59, #56, #60 and the #62 skill
44
+ change under an unchanged MCP contract. Its published-release acceptance on
45
+ 2026-10-15 found that a fresh npm install crashes at startup
46
+ ([#78](https://github.com/plagor44-ux/pi-session-mcp/issues/78)); the fix
47
+ ships as 0.8.3.
48
+ - Sprint 4 decision inputs for the conditional items R12, R15, R17 and R18 are recorded in the [Sprint 4 decision inputs](sprints/2026-10-13-s4-decision-inputs.md) ([#72](https://github.com/plagor44-ux/pi-session-mcp/issues/72)): R12, R15 and R17 not met, R18 not determinable as of 2026-10-13; this is input, not the Sprint 4 decision.
49
+ - Sprint 4 is closed with its [decision](sprints/2026-10-15-s4-decision.md)
50
+ ([#77](https://github.com/plagor44-ux/pi-session-mcp/issues/77)), taken on
51
+ 2026-10-15 before the macOS gate by maintainer decision. ADR 0003's isolation
52
+ trigger fired, because coding profiles had written on non-disposable
53
+ repositories. The one next investment is the isolation decision
54
+ ([#79](https://github.com/plagor44-ux/pi-session-mcp/issues/79), ADR 0008
55
+ Proposed), with interim operating rules until it is accepted. R12, R15 and
56
+ R17 stay deferred (not met), R18 stays deferred (not determinable), and
57
+ [#74](https://github.com/plagor44-ux/pi-session-mcp/issues/74) is closed as
58
+ not planned. R10, R11 and R22 stay open.
59
+
60
+ ### Sprint 3 task status
61
+
62
+ | Task | Issue | Status |
63
+ | --- | --- | --- |
64
+ | Harness tests time out on macOS | [#70](https://github.com/plagor44-ux/pi-session-mcp/issues/70) | verified: CI green on macOS 15 and 26, also on main |
65
+ | R08 three sessions with a read-only reviewer | [#71](https://github.com/plagor44-ux/pi-session-mcp/issues/71) | partially verified: Codex passed, Claude Code failed on timing only; follow-up [#74](https://github.com/plagor44-ux/pi-session-mcp/issues/74) closed as not planned in Sprint 4 |
66
+ | R05 / R09 ten-task Level 3 cycle | None (acceptance) | verified: accepted, 10 of 10 tasks |
67
+ | R06 new Codex abort run | None (acceptance) | verified |
68
+ | R07 Codex discovery of the setup-installed skill | None (acceptance) | verified |
69
+ | R10 / R11 current macOS Level 2 and smoke | None | blocked: work Mac not reachable; runbook in the Sprint 3 file |
70
+ | R22 ChatGPT project instructions | None (outside this repository) | blocked on an operator action; proposal in the Sprint 2 file |
71
+
72
+ Status words: planned, in progress, implemented (code exists), verified (named
73
+ criteria met with evidence), blocked, failed (ran and missed its criteria; kept
74
+ on record). Sprints 1 to 4 are closed; the next investment is the isolation
75
+ decision in [#79](https://github.com/plagor44-ux/pi-session-mcp/issues/79).
76
+
77
+ ## Sprints and exit gates
78
+
79
+ The dates are proposed windows, not commitments. Dependent work waits for its
80
+ gate; independent Mac setup verification and documentation may run alongside.
81
+ Later windows shift with the gate of the sprint before them.
82
+
83
+ | Sprint | Proposed window | Work | Exit gate |
84
+ | --- | --- | --- | --- |
85
+ | S1: correctness | Oct 13–14; 1–2 sessions plus native QA | R01 recovery fix, R02/#56 diagnosis, R03 native checks, R19 evidence record | Operator data preserved; correct existing codes; native Level 1, final review/CI and relevant Level 2 pass |
86
+ | S2: evidence | Oct 15–16; 1–2 sessions | R04, R13/R14 resource binding, handshake offering, #60, R16 strict CI, R20, R22 and R23 documentation, current-source canary; R15 not included (entry condition in the Sprint 2 file) | Changed resources invalidate acceptance; original failures retained; remainder has issues or entry conditions |
87
+ | S3: live usage | Oct 17–20; 2–3 bounded sessions | R05–R11: same-build ten-task cycle, Codex abort scope/discovery, third/read-only worker, intended profile, current Mac acceptance | Existing Level-3 gate plus all scope/security/cleanup criteria; no claim beyond tested combinations |
88
+ | S4: decision | Oct 21–23; 1 evaluation | Usage metrics, conditional R12/R15/R17/R18 | Maintenance or at most one justified investment, with focused issue and ADR where required |
89
+
90
+ R-identifiers are planning identifiers, not GitHub issue numbers. #56 was
91
+ the only open implementation tracker at the audit snapshot; #59 was created
92
+ for R01 afterwards. Create a focused, duplicate-checked issue before each new
93
+ implementation task. This roadmap delivers R21's documentation; it does not
94
+ close the other tasks.
95
+
96
+ ## Parallel work
97
+
98
+ - S1 recovery and #56 use separate worktrees and file ownership. The
99
+ integrator owns shared docs, changelog and release fields. Full-suite QA
100
+ runs once on the final combined source, without overlapping heavy suites.
101
+ - S2 has one harness owner; skill policy and documentation can proceed
102
+ independently.
103
+ - S3 live runs are sequential on each shared inference endpoint; independent
104
+ current Mac Level-2 setup checks can run in parallel. Only after two-session
105
+ acceptance, try two writers on separate aliases plus one read-only reviewer
106
+ of a frozen result.
107
+ - Keep heavy suites and parallel large-model work off a constrained work Mac.
108
+
109
+ ```mermaid
110
+ flowchart TD
111
+ S1["S1: Fix confirmed defects"] --> G["Native QA and review"]
112
+ G --> S2["S2: Bind evidence"]
113
+ G --> M["Current Mac setup acceptance"]
114
+ S2 --> S3["S3: Live usage acceptance"]
115
+ S3 --> S4["S4: Next-investment decision"]
116
+ M --> S4
117
+ ```
118
+
119
+ ## Product boundary and deferred work
120
+
121
+ Follow [ADR 0003](adr/0003-post-mvp-maintenance.md), together with the approved
122
+ macOS, extension and skill decisions in ADRs 0005–0007. Maintain local stdio,
123
+ in-memory state and one trusted local peer.
124
+
125
+ | Topic | Entry condition |
126
+ | --- | --- |
127
+ | OS isolation | Trigger fired on 2026-10-15 (coding profiles wrote on non-disposable repositories); decision in [#79](https://github.com/plagor44-ux/pi-session-mcp/issues/79) and ADR 0008, interim rules in the [Sprint 4 decision](sprints/2026-10-15-s4-decision.md#interim-operating-rules); profiles/skills are not an OS sandbox |
128
+ | pi_turn_wait | Measured high polling cost per turn with pauses or tool/approval cost; 5–7 polls per invocation is insufficient evidence |
129
+ | Persistence/resume | Actual loss of useful work on restart |
130
+ | HTTP/remote/mobile | Concrete need existing SSH/remote development cannot meet; separate ADR/security decision |
131
+ | Finer turn_failed | Closed public final SDK cause discriminator after retry/compaction, not error-text guessing |
132
+ | Multi-user/UI/credentials | Separate justified product scope and ADR |
133
+ | Explicit unverified code for an unreadable client start time (R15) | A run that passes while the start time was unreadable, or a demonstrated need; today the run fails with `noServerObserved`, so it cannot pass falsely |
134
+ | Former pi-control #31/#32 | Closed as not_planned; no automatic migration/reopening |
135
+ | Former release gates/#11–#14 | Historical; bind current acceptance to the current build |
136
+
137
+ 0.8.3 is a patch release only if the MCP contract remains unchanged and its
138
+ gates pass. Apply the current [release procedure](releasing.md): version and
139
+ pre-release acceptance travel in the change PR. Merge, tagging and
140
+ publication remain maintainer decisions. No release is authorized by this plan.
package/docs/skills.md CHANGED
@@ -290,7 +290,7 @@ status `failed` (exit 1), so it is not overlooked.
290
290
 
291
291
  | Operation | Code (status) |
292
292
  | --- | --- |
293
- | `--dry-run` | `skill_absent` (absent), `skill_equivalent` (unchanged), `skill_linked` (unchanged), `skill_update_planned` (planned), `skill_recovery_planned` (planned), `skill_divergent` (divergent), `skill_legacy_unverified` (divergent), `skill_source_invalid` (failed) |
293
+ | `--dry-run` | `skill_absent` (absent), `skill_equivalent` (unchanged), `skill_linked` (unchanged), `skill_update_planned` (planned), `skill_recovery_planned` (planned), `skill_recovery_retained` (divergent), `skill_divergent` (divergent), `skill_legacy_unverified` (divergent), `skill_source_invalid` (failed) |
294
294
  | `--apply` | `skill_installed` (ok), `skill_already_equivalent` (unchanged), `skill_recovered` (ok), `skill_linked` (unchanged), `skill_updated` (ok), `skill_divergent` (divergent), `skill_legacy_unverified` (divergent), `skill_recovery_retained` (divergent), `skill_source_invalid` (failed), `skill_install_failed` (failed) |
295
295
  | `--verify` | `skill_verified` (ok), `skill_missing` (failed), `skill_not_equivalent` (failed) |
296
296
  | `--rollback`, `--remove` | `skill_removed` (ok), `skill_kept_shared` (unchanged), `skill_not_owned` (unchanged), `skill_absent` (ok), `skill_divergent` (divergent), `skill_legacy_unverified` (divergent), `skill_recovery_retained` (divergent) |
@@ -306,11 +306,12 @@ status `failed` (exit 1), so it is not overlooked.
306
306
  If the settled copy still needs the new version, `--apply` continues and
307
307
  reports `skill_installed` or `skill_updated`.
308
308
  - `skill_recovery_planned` means that the ownership record is pending for an
309
- update that `--apply` would settle. The dry-run does not write or delete
310
- anything and does not look at the intermediate directories, so `--apply` can
311
- still find a modified or foreign intermediate, keep it and report
312
- `skill_recovery_retained`. A divergent or
313
- foreign copy keeps `skill_divergent`, and a 0.8.0 record keeps its own code.
309
+ update that `--apply` would settle, and that the read-only classification
310
+ found no intermediate that `--apply` would retain. The dry-run does not
311
+ write or delete anything. In the dry-run, `skill_recovery_retained`
312
+ (divergent, exit 1) means that the same classification found an
313
+ intermediate that `--apply` would retain. A divergent or foreign copy keeps
314
+ `skill_divergent`, and a 0.8.0 record keeps its own code.
314
315
  - `skill_kept_shared` means that the other Claude Code registration (`user` or
315
316
  `local`) still uses the shared directory. The last one removes the skill.
316
317
  - A copy that already equals the effective skill but was not created by `setup`
@@ -366,15 +367,42 @@ still recognizes the old copy as its own. `--apply`, `--remove` and
366
367
  moves the verified backup back, and then continues.
367
368
  - `--remove` and `--rollback` delete the verified intermediates and then remove
368
369
  the copy as usual.
369
- - A partial trash directory is deleted after a structural recheck (real
370
- directories and regular files only, no hidden entries, within the tree
371
- limits).
370
+ - A trash directory is deleted only when its current contents are the
371
+ complete, unchanged copy that the update replaced: its tree fingerprint
372
+ equals the replaced fingerprint in the pending record. A partial trash
373
+ directory (for example after an interruption during the entry-by-entry
374
+ deletion, including an empty one), a modified or added-to one, a foreign one,
375
+ and any trash when the record names no usable replaced fingerprint are
376
+ retained, because their contents cannot be proven to be setup's own. A
377
+ directory name or a structural check alone never proves that. The
378
+ fingerprint covers the paths and contents of regular files, not empty
379
+ directories or file modes: an empty directory or a mode change inside an
380
+ otherwise complete trash is deleted with it, but no file content is lost.
372
381
  - A partially written staging directory is deleted only when every file in it
373
382
  is a prefix-consistent part of the current library tree, and that tree is the
374
383
  record's target.
375
384
  - Anything modified or foreign stays and is reported as
376
- `skill_recovery_retained` (divergent). Inspect the directory and delete it
377
- yourself if it is not yours.
385
+ `skill_recovery_retained` (divergent). This includes the trash directory.
386
+ A retained intermediate leaves the pending record and the skill directory
387
+ unchanged, and nothing is reported as settled. A retained trash directory
388
+ stops recovery before any other intermediate is touched; a retained backup
389
+ or staging directory can follow the deletion of a proven own trash
390
+ directory.
391
+
392
+ To settle a retained trash directory:
393
+
394
+ 1. Inspect the `.pi-session-mcp-<skill>-<transactionId>.trash` directory next
395
+ to the skill directory.
396
+ 2. Move any content of your own elsewhere.
397
+ 3. Delete that directory.
398
+ 4. Run the same setup command again.
399
+
400
+ For a pending version 2 transaction, `--dry-run` reports
401
+ `skill_recovery_retained` (divergent, exit 1) when `--apply` would retain an
402
+ intermediate, using the same read-only classification as the recovery, and
403
+ otherwise `skill_recovery_planned`. It never writes or deletes anything.
404
+ Setup deliberately no longer deletes a partial trash tree automatically;
405
+ before this rule it did after a structural recheck.
378
406
 
379
407
  A failed update leaves its staging directory until the next run settles it.
380
408
  The directories of updates by 0.8.0 had random names. Setup never searches for