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.
@@ -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
+ ```