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
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
# Sprint 2: evidence
|
|
2
|
+
|
|
3
|
+
Base: main `b145f8c32cca76d23628ac8830069cee5ccbaece` (after Sprint 1, pull
|
|
4
|
+
request #61). Date: 2026-10-13. Integration branch: `fix/s2-evidence`.
|
|
5
|
+
Tracking: [#62](https://github.com/plagor44-ux/pi-session-mcp/issues/62) (R04),
|
|
6
|
+
[#66](https://github.com/plagor44-ux/pi-session-mcp/issues/66) (R13),
|
|
7
|
+
[#67](https://github.com/plagor44-ux/pi-session-mcp/issues/67) (R14),
|
|
8
|
+
[#68](https://github.com/plagor44-ux/pi-session-mcp/issues/68) (handshake
|
|
9
|
+
offering), [#63](https://github.com/plagor44-ux/pi-session-mcp/issues/63)
|
|
10
|
+
(R16), [#64](https://github.com/plagor44-ux/pi-session-mcp/issues/64) (R20),
|
|
11
|
+
[#65](https://github.com/plagor44-ux/pi-session-mcp/issues/65) (R23) and the
|
|
12
|
+
Sprint 1 follow-up [#60](https://github.com/plagor44-ux/pi-session-mcp/issues/60).
|
|
13
|
+
Planning sources: the [roadmap](../roadmap.md) and the
|
|
14
|
+
[post-0.8.1 audit](../reviews/2026-10-13-post-0.8.1-audit.md), whose Sprint 2
|
|
15
|
+
section defines the exit gate. The [Sprint 1 file](2026-10-13-s1-correctness.md)
|
|
16
|
+
holds the closure of the previous sprint.
|
|
17
|
+
|
|
18
|
+
This file tracks the state of Sprint 2. It records what is planned, what code
|
|
19
|
+
exists and what is proven. A status of `implemented` or `verified` is set only
|
|
20
|
+
together with evidence in the sections below. The statuses and evidence below
|
|
21
|
+
are the final state of the sprint, recorded before its pull request
|
|
22
|
+
[#69](https://github.com/plagor44-ux/pi-session-mcp/pull/69) was merged as
|
|
23
|
+
`0aae639`; the merge closed #60, #62, #63, #64, #65, #66, #67 and #68. Its
|
|
24
|
+
final-head CI passed; the later main CI failure on `macos-15` is recorded in
|
|
25
|
+
the [Sprint 3 file](2026-10-13-s3-live-usage.md#main-ci-on-the-sprint-2-merge).
|
|
26
|
+
|
|
27
|
+
## Scope
|
|
28
|
+
|
|
29
|
+
In scope:
|
|
30
|
+
|
|
31
|
+
- R04: the orchestration skill classifies every documented `pi_session_start`
|
|
32
|
+
error code ([#62](https://github.com/plagor44-ux/pi-session-mcp/issues/62)).
|
|
33
|
+
- R13: the multi-session acceptance harness binds the contents of the loaded
|
|
34
|
+
Pi extensions ([#66](https://github.com/plagor44-ux/pi-session-mcp/issues/66)).
|
|
35
|
+
- R14: the harness binds the Codex skill sources, a prerequisite for the live
|
|
36
|
+
discovery check R07
|
|
37
|
+
([#67](https://github.com/plagor44-ux/pi-session-mcp/issues/67)).
|
|
38
|
+
- The handshake offering: the harness offers its test skill only to the task
|
|
39
|
+
that needs it, a prerequisite for a new Codex abort run in R06
|
|
40
|
+
([#68](https://github.com/plagor44-ux/pi-session-mcp/issues/68)).
|
|
41
|
+
- #60: the dry-run of a pending skill transaction predicts a retained
|
|
42
|
+
intermediate ([#60](https://github.com/plagor44-ux/pi-session-mcp/issues/60)).
|
|
43
|
+
- R16: CI runs the tests with strict unhandled rejections
|
|
44
|
+
([#63](https://github.com/plagor44-ux/pi-session-mcp/issues/63)).
|
|
45
|
+
- R20: delivery-status notes on the two historical plans
|
|
46
|
+
([#64](https://github.com/plagor44-ux/pi-session-mcp/issues/64)).
|
|
47
|
+
- R22: proposed replacement text for the ChatGPT project instructions, which
|
|
48
|
+
live outside this repository (see the appendix).
|
|
49
|
+
- R23: acceptance and versioning wording
|
|
50
|
+
([#65](https://github.com/plagor44-ux/pi-session-mcp/issues/65)).
|
|
51
|
+
- A current-source Pi SDK canary on the frozen candidate with
|
|
52
|
+
`scripts/pi-sdk-canary.sh`, without moving the pin.
|
|
53
|
+
- The documentation that these changes directly affect.
|
|
54
|
+
|
|
55
|
+
R19 and R21 were delivered in Sprint 1 (R19 in the Sprint 1 pull request, R21
|
|
56
|
+
by [#58](https://github.com/plagor44-ux/pi-session-mcp/pull/58)) and are not
|
|
57
|
+
repeated here.
|
|
58
|
+
|
|
59
|
+
Out of scope: the Sprint 3 and 4 live runs (R05 to R11, R12, R17, R18), a
|
|
60
|
+
Level 3 cycle, macOS live runs, new features, dependency or Pi SDK updates, a
|
|
61
|
+
version bump and any change to the MCP contract. The harness changes concern
|
|
62
|
+
the maintainer script, which is not part of the npm package, not the package
|
|
63
|
+
runtime.
|
|
64
|
+
|
|
65
|
+
R-identifiers are planning identifiers, not GitHub issue numbers.
|
|
66
|
+
|
|
67
|
+
## Delivery
|
|
68
|
+
|
|
69
|
+
One integration branch and one pull request against main, with separate
|
|
70
|
+
commits per issue. The work runs in separate worktrees with their own file
|
|
71
|
+
ownership, and an integrator combines them. No merge, tag or publication is
|
|
72
|
+
part of this sprint.
|
|
73
|
+
|
|
74
|
+
| Strand | Branch | Owns |
|
|
75
|
+
| --- | --- | --- |
|
|
76
|
+
| G | `s2/g-dryrun` | #60 fix in `src/setup-skills.ts` |
|
|
77
|
+
| I | `s2/i-dryrun-tests` | #60 counterexamples in `test/setup-skills-dry-run-recovery.test.ts` |
|
|
78
|
+
| J | `s2/j-skill` | #62 in `skills/pi-session-orchestration/SKILL.md` and `test/orchestration-skill-start-codes.test.ts` |
|
|
79
|
+
| H | `s2/h-harness` | #66, #67, #68 in `scripts/multi-session-acceptance.mjs` and its test |
|
|
80
|
+
| F | `s2/f-docs` | Sprint tracking, plan delivery notes, wording and changed-behavior documentation |
|
|
81
|
+
| Integrator | `fix/s2-evidence` | `.github/workflows/ci.yml` (#63), the harness sections of acceptance, integration, final documentation and the pull request |
|
|
82
|
+
|
|
83
|
+
One owner edits the harness. Writing strands never share a file.
|
|
84
|
+
|
|
85
|
+
## Status legend
|
|
86
|
+
|
|
87
|
+
| Status | Meaning |
|
|
88
|
+
| --- | --- |
|
|
89
|
+
| planned | Not started |
|
|
90
|
+
| in_progress | Work has started; no result may be claimed yet |
|
|
91
|
+
| implemented | The code or text exists; the acceptance criteria are not yet met with evidence |
|
|
92
|
+
| verified | The named acceptance criteria are met and the evidence is recorded below |
|
|
93
|
+
| blocked | A named blocker prevents progress |
|
|
94
|
+
| not included | Deliberately outside this sprint, with an entry condition |
|
|
95
|
+
|
|
96
|
+
## Tasks
|
|
97
|
+
|
|
98
|
+
| Task | Issue | Owner strand | Branch | Depends on | Status |
|
|
99
|
+
| --- | --- | --- | --- | --- | --- |
|
|
100
|
+
| R04 orchestration skill classifies every start code | [#62](https://github.com/plagor44-ux/pi-session-mcp/issues/62) | J | `s2/j-skill` | None | verified |
|
|
101
|
+
| R13 bind loaded extension package contents | [#66](https://github.com/plagor44-ux/pi-session-mcp/issues/66) | H | `s2/h-harness` | None | verified |
|
|
102
|
+
| R14 bind all Codex skill sources | [#67](https://github.com/plagor44-ux/pi-session-mcp/issues/67) | H | `s2/h-harness` | None; prerequisite for R07 | verified |
|
|
103
|
+
| Handshake offered only where a task needs it | [#68](https://github.com/plagor44-ux/pi-session-mcp/issues/68) | H | `s2/h-harness` | None; prerequisite for a new Codex abort run (R06) | verified |
|
|
104
|
+
| Dry-run predicts a retained intermediate | [#60](https://github.com/plagor44-ux/pi-session-mcp/issues/60) | G (fix), I (counterexamples) | `s2/g-dryrun`, `s2/i-dryrun-tests` | Sprint 1 merge (done) | verified |
|
|
105
|
+
| R16 strict unhandled rejections in CI | [#63](https://github.com/plagor44-ux/pi-session-mcp/issues/63) | Integrator (`ci.yml`), F (command in `CONTRIBUTING.md` and `docs/releasing.md`) | `fix/s2-evidence`, `s2/f-docs` | None | implemented (takes effect in the final-head CI of the pull request) |
|
|
106
|
+
| R20 delivery status of the historical plans | [#64](https://github.com/plagor44-ux/pi-session-mcp/issues/64) | F | `s2/f-docs` | None | verified |
|
|
107
|
+
| R23 acceptance and versioning wording | [#65](https://github.com/plagor44-ux/pi-session-mcp/issues/65) | F | `s2/f-docs` | None | verified |
|
|
108
|
+
| R22 ChatGPT project instructions | None (outside this repository) | Operator | None | An operator action; this repository only proposes a text | blocked (external) |
|
|
109
|
+
| R15 explicit unverified evidence for an unreadable client start time | None | None | None | See the entry condition below | not included |
|
|
110
|
+
| Current-source Pi SDK canary on the frozen candidate | None | Integrator | `fix/s2-evidence` | Frozen candidate; the pin does not move | verified (SDK 1.2.0 compatible; pin unchanged) |
|
|
111
|
+
| Sprint tracking, roadmap, changelog, S1 closure | None | F, then the integrator | `s2/f-docs`, `fix/s2-evidence` | None | verified |
|
|
112
|
+
|
|
113
|
+
Status as of 2026-10-13, after integration, four native gate runs, the Pi
|
|
114
|
+
SDK canary, Level 2 and two independent reviews (see [Evidence](#evidence)).
|
|
115
|
+
"verified" refers to the acceptance criteria of each task below. It does not
|
|
116
|
+
include the final-head CI matrix of the pull request or the maintainer's
|
|
117
|
+
merge decision; the Sprint 2 exit gate stays open until both exist.
|
|
118
|
+
|
|
119
|
+
R22 is blocked because the ChatGPT project instructions are not stored in this
|
|
120
|
+
repository and the integrator cannot change them. The
|
|
121
|
+
[appendix](#appendix-proposed-chatgpt-project-instructions-r22) holds a
|
|
122
|
+
proposal; this repository does not apply it.
|
|
123
|
+
|
|
124
|
+
R15 is not included. An unreadable client start time directly after spawn
|
|
125
|
+
cannot produce a false pass: the run fails with `noServerObserved`, which is a
|
|
126
|
+
misleading code but still a failing one. Entry condition: a run that passes
|
|
127
|
+
while the start time was unreadable, or a demonstrated need for an explicit
|
|
128
|
+
unverified code.
|
|
129
|
+
|
|
130
|
+
## Behavior contracts
|
|
131
|
+
|
|
132
|
+
These describe the intended change. They are contracts, not results; none is
|
|
133
|
+
verified until the evidence section says so.
|
|
134
|
+
|
|
135
|
+
- #60: for a pending version 2 skill transaction, `--dry-run` reports
|
|
136
|
+
`skill_recovery_retained` (status `divergent`, exit 1) whenever `--apply`
|
|
137
|
+
would retain an intermediate, using the same read-only classification as the
|
|
138
|
+
recovery. Otherwise it still reports `skill_recovery_planned`. A dry-run
|
|
139
|
+
never writes.
|
|
140
|
+
- #62: the orchestration skill classifies every documented `pi_session_start`
|
|
141
|
+
code as operator-needed, transient or unknown, by the code alone. A code that
|
|
142
|
+
is not listed is unknown. The `startup_failed` diagnostics mean that no MCP
|
|
143
|
+
server is available.
|
|
144
|
+
- #63: CI runs the tests with `NODE_OPTIONS=--unhandled-rejections=strict` on
|
|
145
|
+
the existing matrix and nothing else changes in the workflow.
|
|
146
|
+
|
|
147
|
+
## Acceptance criteria
|
|
148
|
+
|
|
149
|
+
### R04 / #62: start-code classification
|
|
150
|
+
|
|
151
|
+
- The skill lists every start code documented in the
|
|
152
|
+
[tool contracts](../tool-contracts.md) in exactly one class: operator
|
|
153
|
+
needed, transient or unknown.
|
|
154
|
+
- A test fails if a documented start code is missing from the skill or appears
|
|
155
|
+
in two classes.
|
|
156
|
+
- The skill states that classification uses the code only and that unlisted
|
|
157
|
+
codes are unknown. Provider free text is never classified.
|
|
158
|
+
- Documentation that mirrors the skill's rules is aligned.
|
|
159
|
+
- No runtime, MCP contract or error-code change.
|
|
160
|
+
|
|
161
|
+
### R13 / #66: bind loaded extension contents
|
|
162
|
+
|
|
163
|
+
- `prepare` resolves the agent directory once, records it privately, and the
|
|
164
|
+
run's MCP server receives it explicitly as `PI_CODING_AGENT_DIR` for both
|
|
165
|
+
clients.
|
|
166
|
+
- When the run uses extensions, the bound resources include each extension's
|
|
167
|
+
package root tree and the agent directory's npm installation, dependencies
|
|
168
|
+
included, under path-free keys. Runs without extensions get a stable `none`
|
|
169
|
+
value.
|
|
170
|
+
- A change to any of them between `prepare`, launch and the end of the run
|
|
171
|
+
reports `resourcesChanged` and fails or refuses the run.
|
|
172
|
+
- Tests change an extension file, a dependency file and the npm lockfile after
|
|
173
|
+
`prepare` and observe `resourcesChanged` before launch and after a run.
|
|
174
|
+
- Tests never read or write the operator's real home or Pi directory. Results
|
|
175
|
+
and evidence stay path-free.
|
|
176
|
+
- [Acceptance](../acceptance.md) describes the binding.
|
|
177
|
+
|
|
178
|
+
### R14 / #67: bind all Codex skill sources
|
|
179
|
+
|
|
180
|
+
- `prepare` resolves `CODEX_HOME` once and the Codex controller runs with
|
|
181
|
+
exactly that value.
|
|
182
|
+
- `$CODEX_HOME/skills` (including the bundled `.system` skills),
|
|
183
|
+
`/etc/codex/skills`, other skills in `~/.agents/skills` and `.agents/skills`
|
|
184
|
+
directories in ancestors of the controller directory are bound under
|
|
185
|
+
path-free keys, as a tree hash or a stable `missing` value.
|
|
186
|
+
- A differing `pi-session-orchestration` copy in any source refuses a Codex run
|
|
187
|
+
before launch; an equal copy or none is allowed.
|
|
188
|
+
- Evidence states per client whether the controller skill was an installed copy
|
|
189
|
+
(Claude Code) or a run-scoped link (Codex), with its tree hash, without
|
|
190
|
+
paths. Installed and linked skills are distinguishable.
|
|
191
|
+
- Tests cover a change in each source, a differing skill in each source, an
|
|
192
|
+
equal copy and a different `CODEX_HOME` at launch, and never touch the
|
|
193
|
+
operator's real home, `CODEX_HOME` or `/etc`.
|
|
194
|
+
- [Acceptance](../acceptance.md) lists the sources and the refusal rule.
|
|
195
|
+
|
|
196
|
+
### Handshake offering / #68
|
|
197
|
+
|
|
198
|
+
- Two coding profiles: `accept-code` with exactly `implementation` for every
|
|
199
|
+
task, and a separate profile with exactly `implementation` and `handshake`,
|
|
200
|
+
used only for the `slug` session.
|
|
201
|
+
- The controller prompt names the profile of each task.
|
|
202
|
+
- The skill criterion checks both skill lists and that only the `slug` session
|
|
203
|
+
used the handshake profile; a run in which another task used it fails.
|
|
204
|
+
- The scope oracle and `ALLOWED_CHANGES` stay unchanged and strict. This is not
|
|
205
|
+
a wider allowed-file set. Earlier failed attempts stay recorded unchanged.
|
|
206
|
+
- [Acceptance](../acceptance.md) describes the two profiles.
|
|
207
|
+
|
|
208
|
+
### #60: dry-run prediction
|
|
209
|
+
|
|
210
|
+
- For each retained case of the recovery tests (partial, modified or added-to
|
|
211
|
+
trash; modified backup; foreign staging), `--dry-run` reports
|
|
212
|
+
`skill_recovery_retained` and changes nothing.
|
|
213
|
+
- For each settleable case, `--dry-run` still reports `skill_recovery_planned`.
|
|
214
|
+
- Classification is shared with the recovery. No second rule set, no new
|
|
215
|
+
persisted state, no name-pattern search and no new report code.
|
|
216
|
+
- [Skills](../skills.md#interrupted-updates) and the
|
|
217
|
+
[setup design](../client-setup-design.md) no longer describe the dry-run as
|
|
218
|
+
optimistic.
|
|
219
|
+
|
|
220
|
+
### R16 / #63: strict CI
|
|
221
|
+
|
|
222
|
+
- `ci.yml` sets the strict option for the test step only, on every platform of
|
|
223
|
+
the existing matrix, without new matrix entries.
|
|
224
|
+
- The CI run of the change passes on Linux, macOS 15 and macOS 26.
|
|
225
|
+
- `CONTRIBUTING.md` and [Releasing](../releasing.md) name the same strict
|
|
226
|
+
command.
|
|
227
|
+
|
|
228
|
+
### R20 / #64: plan delivery status
|
|
229
|
+
|
|
230
|
+
- Both plans carry a dated delivery-status note with pull request references
|
|
231
|
+
and the actual remainder, and state that their checkboxes are historical.
|
|
232
|
+
- No claim of acceptance beyond the recorded evidence; nothing is
|
|
233
|
+
reimplemented; relative links resolve.
|
|
234
|
+
|
|
235
|
+
### R23 / #65: wording
|
|
236
|
+
|
|
237
|
+
- No passage presents targeted two-session evidence as Level 3.
|
|
238
|
+
- One place defines the package version, the MCP tool contract and the setup
|
|
239
|
+
report `schemaVersion` ([tool contracts](../tool-contracts.md#versions)), and
|
|
240
|
+
other places link to it.
|
|
241
|
+
- Recorded results are unchanged; historical records get at most a clarifying
|
|
242
|
+
note.
|
|
243
|
+
|
|
244
|
+
### Sprint 2 exit gate
|
|
245
|
+
|
|
246
|
+
From the audit, with the issue-level criteria above:
|
|
247
|
+
|
|
248
|
+
- Changing a bound skill or extension after preparation invalidates a run.
|
|
249
|
+
- Installed and linked skills are distinguishable in the evidence.
|
|
250
|
+
- Original failed attempts remain recorded.
|
|
251
|
+
- Every remainder has an issue or an explicit entry condition (R15 above, R22
|
|
252
|
+
as an operator action, the S3 and S4 items in the roadmap).
|
|
253
|
+
- No new runtime feature phase.
|
|
254
|
+
|
|
255
|
+
## Evidence
|
|
256
|
+
|
|
257
|
+
Recorded by the integrator on 2026-10-13 on native Linux (x64, kernel 7.2,
|
|
258
|
+
Btrfs checkout, tmpfs temporary root), Node.js `26.11.1`, npm `12.2.0`, Codex
|
|
259
|
+
CLI `0.162.1`, Claude Code `2.1.296`. No provider or model was used by any
|
|
260
|
+
check. A result for one commit is not evidence for another; each row names
|
|
261
|
+
the commit it ran on.
|
|
262
|
+
|
|
263
|
+
### Before the fix (base `b145f8c`)
|
|
264
|
+
|
|
265
|
+
| Issue | Check | Result |
|
|
266
|
+
| --- | --- | --- |
|
|
267
|
+
| #60 | `test/setup-skills-dry-run-recovery.test.ts`, written against the contract | Exit 1: 14 of 23 failed, each at the dry-run assertion (received `skill_recovery_planned`/`planned` where `skill_recovery_retained` was required); the 9 settleable cases passed. |
|
|
268
|
+
| #62 | `test/orchestration-skill-start-codes.test.ts` against the base skill (scratch copy) | Failed at suite level because the base skill has no classes at all (`expected one class bullet for Operator needed, found 0`); per-code assertions did not run. |
|
|
269
|
+
| #66, #67, #68 | New harness tests | Against the base harness most new tests fail because the functions they test do not exist yet, which proves little. The harness author showed instead, with single-fix mutants of the new harness (client stand-ins first on `PATH`), that each new test fails when its own fix is removed. These mutant runs are author-reported and were not repeated by the integrator; both independent reviewers judged the new assertions to target the defects. |
|
|
270
|
+
|
|
271
|
+
### Native gate
|
|
272
|
+
|
|
273
|
+
| Head | Runtime candidate | Result |
|
|
274
|
+
| --- | --- | --- |
|
|
275
|
+
| `29d54b0` | `e5af851` | All steps exit 0; 54 files; 1208 passed, 6 skipped |
|
|
276
|
+
| `a3b47af` | `1f32de7` (after the first review round) | All steps exit 0; 54 files; 1232 passed, 6 skipped |
|
|
277
|
+
| `9e67654` | `94f8099` (after the second round) | All steps exit 0; 54 files; 1278 passed, 6 skipped |
|
|
278
|
+
| `07f56b6` | `923a393` (final) | All steps exit 0; 54 files; 1300 passed, 6 skipped |
|
|
279
|
+
|
|
280
|
+
Every run used `npm ci`, `npm run typecheck`, `npm run build:cli`,
|
|
281
|
+
`NODE_OPTIONS=--unhandled-rejections=strict npm test`, `npm run build`,
|
|
282
|
+
`npm audit`, `npm audit --omit=dev` (0 vulnerabilities each time),
|
|
283
|
+
`git diff --check b145f8c HEAD` and a clean `git status --short`. The counts
|
|
284
|
+
reconcile with Sprint 1's 1127 cases: the new #60, #62 and harness tests account
|
|
285
|
+
for every addition, and the six skips are the same as in Sprint 1.
|
|
286
|
+
|
|
287
|
+
### Pi SDK canary
|
|
288
|
+
|
|
289
|
+
`scripts/pi-sdk-canary.sh` on `29d54b0` (runtime `e5af851`): pinned `1.1.0`,
|
|
290
|
+
latest published `1.2.0`. Typecheck passed; the 12 SDK-facing test files
|
|
291
|
+
passed (311 passed, 1 skipped). The script has a built-in single retry for
|
|
292
|
+
known load-sensitive tests; no test was retried. `package.json` and
|
|
293
|
+
`package-lock.json` stayed byte-identical and `npm ci` restored the pinned
|
|
294
|
+
tree. Later commits change no SDK-facing test and change `src/` only by one
|
|
295
|
+
comment line. This is a compatibility observation, not an SDK update.
|
|
296
|
+
|
|
297
|
+
### Level 2
|
|
298
|
+
|
|
299
|
+
`scripts/setup-acceptance.mjs`, real Codex and Claude Code in disposable
|
|
300
|
+
homes, no model:
|
|
301
|
+
|
|
302
|
+
| Build | Result |
|
|
303
|
+
| --- | --- |
|
|
304
|
+
| Runtime `e5af851` (`dist` JS tree `f84fc446…`) | 160/160, exit 0 |
|
|
305
|
+
| Runtime `1f32de7` (`dist` JS tree `f85bf73e…`; differs from the previous build only by one comment in `setup-skills.js`) | 160/160, exit 0; `codex:user`, `claude-code:user`, `project` and `local` 9/9 each; real registrations unchanged, no remaining process, no path leak, build unchanged, disposable directory removed |
|
|
306
|
+
|
|
307
|
+
Every later commit changes only the maintainer harness, tests and
|
|
308
|
+
documentation; the final head builds the same `dist` tree `f85bf73e…`, which
|
|
309
|
+
binds this Level 2 result to it.
|
|
310
|
+
|
|
311
|
+
### Package and links
|
|
312
|
+
|
|
313
|
+
On `07f56b6`, `npm pack --dry-run --json` exited 0: 133 files, 248,627 bytes, both sprint files included, and no `src/`, `test/`, lockfile, implementation plan or maintainer harness script. A relative link and heading-anchor check of every changed Markdown file outside the historical plans, plus README and the audit, found 194 links and no problem on the final documentation; the historical macOS plan keeps one pre-existing link inside its drafted README text.
|
|
314
|
+
|
|
315
|
+
### Real-client incident during development
|
|
316
|
+
|
|
317
|
+
While developing #66, an unguarded scratch mutant of the harness test started
|
|
318
|
+
the real `claude -p` three times before the test file installed its client
|
|
319
|
+
stand-ins. The test timeout ended each process after about five seconds. No
|
|
320
|
+
session transcript was written and no process remained; a model request in
|
|
321
|
+
flight at that moment cannot be excluded. The three empty project directories
|
|
322
|
+
it left in the operator's Claude Code data were removed. Afterwards the harness
|
|
323
|
+
tests put stand-in `claude` and `codex` executables first on `PATH`, and the
|
|
324
|
+
integrator checked every harness and full-suite run for client sessions whose
|
|
325
|
+
recorded working directory lies in a test root, and for client processes:
|
|
326
|
+
none were found. One unrelated Codex session of another project, started
|
|
327
|
+
concurrently, was identified by its recorded working directory and is not
|
|
328
|
+
part of this work.
|
|
329
|
+
|
|
330
|
+
## Independent review
|
|
331
|
+
|
|
332
|
+
Two read-only reviewers who did not write the change reviewed the frozen
|
|
333
|
+
runtime diff `b145f8c..e5af851` and the fix deltas:
|
|
334
|
+
|
|
335
|
+
| Reviewer | Round | Verdict | Outcome |
|
|
336
|
+
| --- | --- | --- | --- |
|
|
337
|
+
| Claude family | 1 | approve with nits | Hermetic system-skill path in a test driver, controller-skill identity by declared name, the `CODEX_HOME` upgrade note: fixed. A claim that recovery now retains a proven trash was checked against the code and rejected; a pinning test (`4f67188`) records the actual behavior. |
|
|
338
|
+
| OpenAI family (Pi `review` profile) | 1 | changes requested | Content behind nested links, `.system` controller skills, hermeticity of `prepare`, equal symlinked copies: fixed in `1db846f`, `850f779`, `1f32de7`. |
|
|
339
|
+
| OpenAI family | 2 | changes requested | Incomplete digests treated as stable, YAML comments in the skill name, a blocking header read: fixed in `0386d5d`, `fb79f23`, `94f8099`. |
|
|
340
|
+
| OpenAI family | 3 | changes requested | Indented or flow YAML headers and symlinked candidate skill roots: fixed in `b1a6b0f` and `61d1721`; the FIFO tests now run under a watchdog (`923a393`). |
|
|
341
|
+
| OpenAI family | 4 | approve with nits | No blocker or major finding; the remaining minor limits are listed below. |
|
|
342
|
+
|
|
343
|
+
The package runtime (#60, #62, #63) passed both reviewers without a required
|
|
344
|
+
change in every round; all requested changes concerned the maintainer
|
|
345
|
+
acceptance harness.
|
|
346
|
+
|
|
347
|
+
### Remaining limits recorded by the reviews
|
|
348
|
+
|
|
349
|
+
- Only skills found by directory name or by a `SKILL.md` frontmatter `name`
|
|
350
|
+
are checked; skills that Codex might load by other means (other file names,
|
|
351
|
+
plugin caches) are not covered. YAML merge keys (`<<`) are not read as a
|
|
352
|
+
name source; it is not established that Codex honors them.
|
|
353
|
+
- Exotic but valid frontmatter in an operator's own skills is conservatively
|
|
354
|
+
indeterminate and refuses a Codex run.
|
|
355
|
+
- Bound trees are digested by reading whole files; the 200,000-entry cap is
|
|
356
|
+
neither a byte nor a time budget. An unreadable or too large tree fails
|
|
357
|
+
closed with `resourcesUnbound`.
|
|
358
|
+
- The Codex controller directory's own `.agents/skills` is bound only through
|
|
359
|
+
the run-scoped link; Codex writing its `.system` skills during a run shows as
|
|
360
|
+
`resourcesChanged` and fails safe.
|
|
361
|
+
|
|
362
|
+
## Open gates
|
|
363
|
+
|
|
364
|
+
- Final-head CI on Linux, macOS 15 and macOS 26 for the pull request, which
|
|
365
|
+
also exercises the strict test step of #63 for the first time; its result
|
|
366
|
+
belongs to the pull request.
|
|
367
|
+
- The maintainer's merge decision.
|
|
368
|
+
- R22: an operator updates the ChatGPT project instructions with the
|
|
369
|
+
[proposed text](#appendix-proposed-chatgpt-project-instructions-r22).
|
|
370
|
+
- R15: not included until its entry condition holds.
|
|
371
|
+
- Sprint 3 and 4 as in the [roadmap](../roadmap.md): the ten-task Level 3
|
|
372
|
+
cycle (R05), a new Codex abort run (R06), live discovery of the
|
|
373
|
+
setup-installed Codex home skill (R07), a third and a read-only worker (R08,
|
|
374
|
+
which needs the stricter `workerSkills` rule extended for a read-only
|
|
375
|
+
session), the profile actually intended for use (R09) and current macOS
|
|
376
|
+
Level 2 on real hardware (R10, R11).
|
|
377
|
+
|
|
378
|
+
No release is authorized by this sprint. A 0.8.2 patch would carry #59, #56,
|
|
379
|
+
#60 and the skill change of #62 under an unchanged MCP contract; it needs its
|
|
380
|
+
own release scope and pre-release acceptance.
|
|
381
|
+
|
|
382
|
+
## Next step
|
|
383
|
+
|
|
384
|
+
When final-head CI passes and the maintainer has merged the one pull request,
|
|
385
|
+
merging closes #60, #62, #63, #64, #65, #66, #67 and #68, and Sprint 3 (live
|
|
386
|
+
acceptance) can begin under the entry conditions in the
|
|
387
|
+
[roadmap](../roadmap.md). Its dependent runs use the bindings and the
|
|
388
|
+
handshake profile split delivered here. Before the first Codex run, start
|
|
389
|
+
Codex once with the intended `CODEX_HOME` after any upgrade, so its bundled
|
|
390
|
+
skills are installed before `prepare`.
|
|
391
|
+
|
|
392
|
+
## Appendix: Proposed ChatGPT project instructions (R22)
|
|
393
|
+
|
|
394
|
+
This is a proposal for the operator to paste into the ChatGPT project
|
|
395
|
+
instructions. This repository does not apply it and cannot check that the
|
|
396
|
+
instructions are updated. It describes the state on 2026-10-13.
|
|
397
|
+
|
|
398
|
+
```text
|
|
399
|
+
Project: Pi Session MCP
|
|
400
|
+
|
|
401
|
+
Current repository: plagor44-ux/pi-session-mcp. It is the successor of
|
|
402
|
+
pi-control. pi-control is archived; its final pull request was #79. Do not
|
|
403
|
+
work in pi-control and do not treat its history as the current plan.
|
|
404
|
+
|
|
405
|
+
Current release: package and release 0.8.1 on npm (pi-session-mcp). It uses
|
|
406
|
+
Pi SDK 1.1.0 and MCP SDK 2.3.1. Local stdio, in-memory state, one trusted
|
|
407
|
+
local peer.
|
|
408
|
+
|
|
409
|
+
Decisions that bind current work (docs/adr, in this order):
|
|
410
|
+
0001 stdio first; 0002 embedded Pi SDK; 0003 post-MVP maintenance; 0004 client
|
|
411
|
+
contract, not client version; 0005 macOS setup platform; 0006 Pi extension
|
|
412
|
+
allowlist (exact npm:<name>@<version> entries per execution profile); 0007
|
|
413
|
+
profile-selected skills and the setup-installed controller skill.
|
|
414
|
+
|
|
415
|
+
The project is in maintenance mode (ADR 0003): focused fixes and upstream
|
|
416
|
+
drift, no new feature phase. A change to the public MCP contract needs a new
|
|
417
|
+
minor release and its own decision.
|
|
418
|
+
|
|
419
|
+
Current priorities come only from docs/roadmap.md and the sprint files in
|
|
420
|
+
docs/sprints/ (together with docs/reviews/2026-10-13-post-0.8.1-audit.md for
|
|
421
|
+
the R01-R23 backlog). Read them before proposing work. Roadmap windows are
|
|
422
|
+
proposals and shift with their gates.
|
|
423
|
+
|
|
424
|
+
Historical gates are not active priorities: the v0.3.0 release sequence and
|
|
425
|
+
the former pi-control issues #11-#14 are historical. Bind any
|
|
426
|
+
acceptance to the current build, not to those gates.
|
|
427
|
+
|
|
428
|
+
Rules: state only what was run; provider-free tests do not establish live
|
|
429
|
+
client or model behavior; targeted two-session checks are not a Level 3
|
|
430
|
+
cycle; no secrets, absolute paths or prompts in records.
|
|
431
|
+
```
|