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.
- package/CHANGELOG.md +68 -0
- package/CONTRIBUTING.md +5 -3
- package/README.md +5 -3
- package/dist/setup-skills.d.ts +8 -2
- package/dist/setup-skills.js +56 -18
- package/dist/setup.js +21 -4
- package/docs/acceptance.md +393 -22
- package/docs/client-setup-design.md +60 -13
- package/docs/client-setup.md +19 -0
- package/docs/releasing.md +7 -1
- package/docs/reviews/2026-10-13-post-0.8.1-audit.md +393 -0
- package/docs/roadmap.md +127 -0
- package/docs/skills.md +39 -11
- package/docs/sprints/2026-10-13-s1-correctness.md +355 -0
- package/docs/sprints/2026-10-13-s2-evidence.md +431 -0
- package/docs/sprints/2026-10-13-s3-live-usage.md +267 -0
- package/docs/sprints/2026-10-13-s4-decision-inputs.md +241 -0
- package/docs/threat-model.md +1 -1
- package/docs/tool-contracts.md +19 -1
- package/package.json +1 -1
- package/skills/pi-session-orchestration/SKILL.md +5 -2
|
@@ -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
|
|
132
|
-
|
|
133
|
-
|
|
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
|
|
142
|
-
`skill_recovery_retained` (divergent).
|
|
143
|
-
|
|
144
|
-
|
|
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
|
|
284
|
-
`
|
|
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`,
|
|
289
|
-
`
|
|
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`,
|
package/docs/client-setup.md
CHANGED
|
@@ -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.
|