@junghanacs/entwurf 0.32.0 → 0.34.0

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/AGENTS.md CHANGED
@@ -31,7 +31,7 @@ Ask: does this follow capability rather than a surface name; record backend asym
31
31
  3. **One identity contract, capability domains.** Branch on rail/liveness capability, not a privileged citizen class.
32
32
  4. **Live-fact dispatch.** Never store liveness or infer send/resume before resolving the record and probing its rail.
33
33
  5. **Rejects are real.** Wrong intent, dead/drifted identity, undeliverable mailbox, ambiguity, and indeterminate probe reject without mutation or fallback.
34
- 6. **MCP and native modules are explicit.** MCP uses only explicit `mcpServers`; native extension modules use operator-declared paths through the owning bootstrap. Neither discovers ambient configuration, scans extension directories, or retrieves modules automatically. Native modules do not emulate a foreign extension API.
34
+ 6. **MCP and native modules are explicit.** MCP uses only explicit `mcpServers`. Native extension modules enter only through the owning bootstrap, from an operator-named absolute file or an operator-named absolute directory read once at launch: top level only, exact suffix filter, deterministic order, every selected entry a regular file. Neither discovers ambient or default locations, takes module paths from settings or environment, recurses, watches, or retrieves modules automatically. Native modules do not emulate a foreign extension API.
35
35
  7. **One meta-store contract.** Record body and filename agree; active records are readable regular non-symlink V3 files; `nativeSessionId` is unique. Writers and doctor certify the active store before writing. Address-bearing reads use the addressable reader; `readStoreRecordFile`/`O_NOFOLLOW` and lstat policy both remain load-bearing. Quiesce and fresh-cut an unreadable generation; redeploy a stale unknown-backend reader. Store protocol and gates: `meta-session.ts`, `check-meta-*`, `check-fresh-cut-gate`.
36
36
  8. **GC reclaims processes, not memory.** Preserve or archive records and transcripts; do not casually delete them.
37
37
  9. **Not a second harness.** No prompt reconstruction, transcript hydration, tool-result ledger, credential mediation, or harness emulation. Backends own auth and transcript.
@@ -88,13 +88,13 @@ A new contract's test goes beside the behavior it certifies — `pi-extensions/*
88
88
 
89
89
  ```text
90
90
  implement → affected focused gates → independent review → one amendment bundle
91
- → qualification once if gate/mutant/matrix changed → full floor once on frozen candidate → commit
91
+ → affected qualification PARTIAL once if gate/mutant/matrix changed → full floor once on frozen candidate → commit
92
92
  ```
93
93
 
94
- - GLG-requested branch checkpoint commits keep completed subject/proof bundles small: scoped review, affected focused checks and normal hooks/shared scanner before each checkpoint, with known RED/unmeasured boundaries recorded. A checkpoint is not frozen-candidate acceptance. The sequence above owns final candidate acceptance: required changed qualification, frozen FULL and native/LIVE/release floors remain mandatory before landing/shipment, never inherited from an interim commit.
94
+ - GLG-requested branch checkpoint commits keep completed subject/proof bundles small: scoped review, affected focused checks and normal hooks/shared scanner before each checkpoint, with known RED/unmeasured boundaries recorded. A checkpoint is not frozen-candidate acceptance. The sequence above owns final candidate acceptance: the affected qualification PARTIAL, frozen FULL and native/LIVE/release floors remain mandatory before landing, and the prepared SHA's CI qualification body before shipment, never inherited from an interim commit.
95
95
  - Inner loop runs only affected gates; review and its corrections finish before the full floor.
96
96
  - A changed contract names a production subject and independent oracle; its focused assertion has a stable QK and exact-once mutant. Matrices change by their declared axes/cells, not appended anecdotes.
97
- - Qualification body is scheduled once when its surface changes; its manifest/head checks remain in the deterministic floor. A release requires the exact-SHA qualification evidence required by VERIFY, never a nearby green run.
97
+ - Development never runs the whole qualification body. A changed gate/mutant/matrix runs its affected exact-argv groups once, after review and amendment, as PARTIAL receipts (`./run.sh check-gate-qualification --group '<argv JSON>' --receipt <absolute path outside the repo>`); the manifest head stays in the deterministic floor. The whole body runs once per cut, in the prepared SHA's CI: a prepared state awaits it and is never presumed PASS, and a release requires the exact-SHA evidence VERIFY names, never a nearby green run or a PARTIAL.
98
98
  - Freeze the candidate while the full floor runs; any worktree/index movement voids that receipt. Pre-commit is not the full floor.
99
99
  - LIVE/release floors are not lowered by a shorter inner loop. Failed gate or evidence downgrade blocks the relevant commit/release decision.
100
100
 
package/CHANGELOG.md CHANGED
@@ -4,6 +4,109 @@ All notable changes to this project will be documented here. Format follows [Kee
4
4
 
5
5
  ## Unreleased
6
6
 
7
+ ## 0.34.0 - 2026-10-09
8
+
9
+ ### Release coordination
10
+
11
+ - **One cut for #134 and #133.** Coordinated by the pi-durable citizen `20261008T113104-801621` and
12
+ implemented by Claude Code Opus under GLG's grant for prepare and make; npm publication is
13
+ coordinated with GLG separately. This section is written at prepare time: the prepared SHA's CI,
14
+ the preserved artifact and the tag are recorded in the GitHub release, not claimed here.
15
+ - **Verified for this cut.** `check:full` passed on the prepare tree (719 s). The first
16
+ `release-gate --cut` ended RED, MUST 23/1/0: `smoke-codex-fresh-live` timed out because Codex
17
+ 0.153.4 refused the stated Codex-side model `gpt-6-luna` for a ChatGPT account (vendor 400); that
18
+ run is preserved as RED. The rerun with the Codex model `gpt-5.6-terra` (Pi side unchanged) passed
19
+ MUST 24/0/0 and BEHAVIOR 1/0/0 in 1115 s, its own `check:full` 723 s. Before the commit,
20
+ `check-pack-install` (with the module-directory cell) and the `check-pi-durable-contact`/`-send`/
21
+ `-receive` gates against a bridge bundle emitted from the candidate passed, and an installed-package
22
+ fixture drove agent-config's background-bash module through a faux model: badge with the panel
23
+ hidden and at narrow sizes, report once, an interrupted task never re-run after `--continue`.
24
+ Vendor model calls there were 0 by construction; its token counts are faux accounting. Affected
25
+ qualification partials: 58/58 for #134 (earlier tree), 52/52 and 22/22 for #133. The whole
26
+ qualification body runs once, in the prepared SHA's CI.
27
+ - **Not measured, by GLG's decision for this cut.** GLG waived the agy shipped-lane criterion: the
28
+ three agy doctors passed, the first native-push probe of a fresh conversation was indeterminate,
29
+ and agy native-push stays NOT CERTIFIED. GLG deferred the badge on GLG's own visible terminal and
30
+ the new post-install Claude session of the meta-bridge criterion to a later session; the host's
31
+ dev-linked doctor passed with five live joins, and the meta-bridge writer is unchanged since
32
+ 0.33.0. None of these is a pass, and no 0.33.0 exception carries over.
33
+
34
+ ### pi-durable
35
+
36
+ - **Background-task badge (#134).** The carrier runtime observes the native task graph from open to
37
+ close; `/tasks` now toggles only the panel. The carrier TUI draws a kind-agnostic badge of live
38
+ background tasks (`node.background`) as the dock's first, never-shrunk row, naming the ones not
39
+ running and shortening down to one ASCII cell; a one-row terminal with live background work shows
40
+ the badge, and with none the screen is upstream's. The overlay patch now carries one section per
41
+ patched carrier file (`runtime.js`, `tui.js`), and the emitter refuses any other shape.
42
+ - **Module directory ingress (#134).** `--native-module-dir <absolute directory>` is the paired,
43
+ exclusive form of `--native-module`: one top-level read, `*.extension.mjs` non-dotfiles only,
44
+ byte-wise order, per-module guards, and named refusals for an empty directory, a non-regular
45
+ match, two names for one file and a cross-module extension or tool name. Hard Rule 6 now admits an
46
+ operator-named directory read once; ambient, default, recursive, watched and setting/environment
47
+ discovery stay forbidden.
48
+ - **Deferred:** #106 no-turn retirement moved to ROADMAP as GLG's deferral, not implemented.
49
+ #132's unfinished Herdr plugin alignment (npm re-pin, source proof, pi-durable under Herdr) moved
50
+ to ROADMAP, closed not-planned, to reopen against this release's published bytes.
51
+
52
+ ### Verification
53
+
54
+ - **Development runs no whole qualification body (#133).** `run.sh check-gate-qualification` now
55
+ hands its arguments to the runner's parser: `--group '<argv JSON>' --receipt <absolute path>`
56
+ runs one affected exact-argv group as a PARTIAL receipt, and a malformed, missing or repeated flag
57
+ is refused by name before any body or snapshot. Until now the wrapper dropped them, so a requested
58
+ PARTIAL started the whole body. Bare, it stays the whole body, which runs once per cut at the
59
+ prepared SHA's CI; a prepared state awaits it and is never presumed PASS. AGENTS, VERIFY and the
60
+ release skill retire the development rule of a local whole run when a gate, mutant or matrix
61
+ changes. Native/LIVE, the deterministic and package floors, the four required CI jobs and the
62
+ artifact acceptance are unchanged; P4 FULL and its CI repetition are not reduced here.
63
+
64
+ ## 0.33.0 - 2026-10-08
65
+
66
+ ### Release coordination
67
+
68
+ - **First cut coordinated by a pi-durable citizen (#132).** This cut is coordinated by the
69
+ pi-durable citizen `20261008T113104-801621`, implemented by Claude Code Opus, and independently
70
+ scrutinized by Grok. Per GLG's direct report (carried here as that report, not as a source
71
+ receipt), an earlier durable-coordination attempt during the 0.31.0 process broke down; 0.31.0
72
+ itself shipped with the accepted receipts recorded in its own section below, and neither that
73
+ report nor 0.32.0's snapshot-loss incident is restated here as a package-publication failure.
74
+ This section is written at prepare time: the prepared-SHA CI, the preserved artifact and the tag
75
+ that close the cut are recorded in the GitHub release and the #132 thread, not claimed here.
76
+ - **Verified for this cut.** The Pi SDK 1.1.0 implementation landed at `aceba59` with exact-SHA CI
77
+ run 37739273349 green on all four required jobs and its qualification body (898/898 killed),
78
+ after a local body of 898/898 and a frozen `check:full` on that candidate. The prepared tree
79
+ (scheduling policy, ASCII fix, version metadata) passed a frozen `check:full`. The policy's
80
+ affected 22-mutant partial run killed 22/22, and its later format/doc amendments re-ran their
81
+ focused gates. After the operator-owned Codex app-server was restarted, the Codex and
82
+ Antigravity native doctors were green.
83
+ - **Not run for this cut — GLG's direct cost/deadline decision, one cut only** ("아니야 30분 내로
84
+ npm publish 전까지 끝내줘. 이 부랜치 핵심은 검증했지? 그럼 됬어. … 시간 아끼자.";
85
+ [authority record](https://github.com/junghan0611/entwurf/issues/132#issuecomment-6057425161)). The LIVE
86
+ `release-gate --cut` was started and then aborted inside its `check:full`, before any LIVE step;
87
+ that is not a verdict, so the live MUST floor is unproven here. Also not run: the pre-commit
88
+ native acceptance (provider-instruction wire observation, warm/cold retention, the Codex
89
+ caller-seat cell), the second `check:full` before the push, and waiting for the prepared SHA's CI
90
+ qualification body before the candidate was packed. That CI run continues and its outcome is
91
+ recorded with the release; a red result is new scope. Antigravity criterion 7 stays NOT
92
+ CERTIFIED. VERIFY's release floor is unchanged — this is not a standing waiver.
93
+
94
+ ### Changed
95
+
96
+ - **Pi SDK 1.1.0 (#132).** The nine exact production SDK members move to `1.1.0` and the
97
+ pi-durable carrier pin to upstream `v1.1.0` (`abe508e`); the emitter's `--check` reproduces the
98
+ existing carrier bytes at that commit, so only the pin's tag/commit/SDK set change. The supported
99
+ ordinary Pi host range follows the pin to `>=1.1.0 <1.2`. The installed-consumer previous-host
100
+ control moves from a real pi 1.0.2 to 1.0.4 — the immediately prior generation is now the refused
101
+ host — while the L3/L4 mixed and depth-3 controls keep their real 1.0.3 packages.
102
+ - **A cut runs its qualification body once, at the prepared SHA (#132, #133).** `release-gate` no
103
+ longer runs a local `check-gate-qualification` body; the release's one body is the exact-SHA CI
104
+ step at the prepared SHA, which the release oracle already required. The scheduling assertion now
105
+ keeps `release-gate` at zero invocations and its mutant plants the call back. The development rule
106
+ of one local run when a gate or mutant changes is unchanged; retiring it stays with #133. For this
107
+ cut alone GLG granted two exceptions: the policy commit rides the prepared push without its own
108
+ pre-version CI, and its local whole body was replaced by its affected 22-mutant partial run.
109
+
7
110
  ## 0.32.0 - 2026-10-08
8
111
 
9
112
  ### Added
package/README.md CHANGED
@@ -27,29 +27,23 @@ Claude and Cortex Code are ACP backends. Codex and Antigravity stay native so th
27
27
  retain their own tools and work context. Capabilities differ by rail: a shipped
28
28
  citizen is not a promise of every lifecycle operation.
29
29
 
30
- **Native durable contact (`pi-durable`) ships in the [0.31.0 release](https://github.com/junghan0611/entwurf/releases/tag/v0.31.0) (#129).**
31
- It is a separate native harness contact, not ordinary Pi's control-socket adapter.
32
- The contact attaches one durable host to a garden id, adds visible identity and
33
- two-way mailbox contact, while the upstream harness keeps its TUI, models/auth,
34
- SQLite storage and recovery. Native admission passed on one Linux host on the
35
- 0.31.0 source-runtime route. Under the #130/0.32 contract the app ships inside the
36
- Entwurf package as a pinned [carrier](#native-durable-pi-durable--130--032-contract), so
37
- it no longer depends on installing the ordinary Pi CLI or provisioning a runtime.
38
-
39
- > **Prepared 0.32.0 candidate, not a published release.** The current source contains #130's
40
- > carrier and explicit native-module contract. Prepared-SHA CI and one preserved versioned
41
- > artifact have their own acceptance receipts; preparation alone does not assert npm publication.
42
- > The published 0.31.0 follows its source-runtime docs — it does not supply this carrier.
30
+ > **Current release: [0.33.0](https://github.com/junghan0611/entwurf/releases/tag/v0.33.0)**
31
+ > ([`fea9b3d`](https://github.com/junghan0611/entwurf/commit/fea9b3dc4779ac5deb34e239abc8e0b5e3e95382)).
32
+ > Includes the pinned Pi 1.1.0 native durable app/TUI and one explicit native-module ingress;
33
+ > `npm` `latest` is `0.33.0`. What that cut ran and did not run is in its CHANGELOG section.
34
+ > Release history and detailed evidence belong in [CHANGELOG](./CHANGELOG.md).
43
35
 
44
36
  ## Install
45
37
 
46
- **Choose by where you work. Neither route installs a harness, subscription or login.**
38
+ **Choose by where you work. Bring your own harnesses, subscriptions and login.**
39
+ The native durable route below additionally supplies the upstream app/TUI missing from its npm
40
+ release; it does not supply credentials or take ownership of the harness.
47
41
 
48
42
  ### Direct — ordinary shell or tmux
49
43
 
50
44
  Prerequisites: **Node >=24.0.0**, Python 3 for `setup`, and any harnesses you choose
51
45
  to use, already installed and authenticated. Pi is optional-by-presence, supported
52
- range `>=1.0.4 <1.1`; Claude Code supported floor `>=2.1.217` is required for its
46
+ range `>=1.1.0 <1.2`; Claude Code supported floor `>=2.1.217` is required for its
53
47
  managed exec-hook lifecycle. pnpm is needed only for source-checkout setup.
54
48
 
55
49
  ```bash
@@ -77,37 +71,31 @@ Detected harness wiring on Darwin can therefore be written while setup stays
77
71
  non-green. Native Windows is **UNSUPPORTED**. The package has no npm `os`
78
72
  restriction; that is not certification of every platform's harness rails.
79
73
 
80
- ### Native durable (pi-durable) — #130 / 0.32 contract
74
+ ### Native durable (pi-durable)
81
75
 
82
- **Installing Entwurf from npm supplies pi-durable. There is no runtime checkout, patch,
83
- build or model-data copy for the operator.**
76
+ **The package supplies the pinned upstream app/TUI and nine exact Pi 1.1.0 SDK
77
+ members.** No separate runtime checkout, patch, build or ordinary Pi CLI is needed.
78
+ The launch verifies carrier integrity and every reachable SDK edge's name/version;
79
+ incomplete, drifted or mixed supply refuses by name.
84
80
 
85
- | Component | How it is supplied | What it does not supply |
86
- |---|---|---|
87
- | Entwurf | Existing npm or source-checkout route above | A harness binary, subscription or login |
88
- | pi SDK set (`@earendil-works/*` 1.0.4, incl. the `pi-durable` library) | Exact production dependencies of Entwurf | The experimental app, which upstream does not publish |
89
- | Native experimental durable app/TUI | Entwurf's **carrier**: the pinned upstream v1.0.4 app files, type-stripped, with the narrow runtime-contact overlay (`pi/pi-durable/carrier/`, MIT) | A replacement ordinary Pi CLI or an Entwurf-owned harness |
90
-
91
- `entwurf pi-durable` verifies the carrier and the pi SDK set it resolves — every reachable
92
- package edge binds the declared name at exactly the pinned version — and refuses by name otherwise
93
- (`pi-durable-package-incomplete`, `-carrier-drift`, `-sdk-absent`, `-sdk-mismatch`);
94
- `entwurf setup` reports the same verdict as PASS or FAIL (never SKIP) without writing durable
95
- wiring. The ordinary Pi on PATH is a separate subject with its own range above. Native auth,
96
- models, sessions and recovery stay upstream-owned: Entwurf does not copy credentials or convert
97
- ordinary Pi sessions into durable SQLite sessions. One operator module of your own can ride the
98
- launch with `--native-module <absolute file>`: it initializes before the durable runtime and its
99
- default export, a native durable `Extension`, is installed after Entwurf's contact ([setup
100
- §2b](./docs/setup-clean-host.md#2b-optional-native-durable-pi-durable)). Ordinary Pi may warn
101
- that Entwurf's `@earendil-works/*` belong in `peerDependencies`; the exact set is a production
102
- dependency on purpose, for the native process — a known manifest constraint accepted for 0.32.
103
-
104
- The installed carrier's runtime/TUI load, its physical SDK edges and the public launch up to the
105
- app's own model resolution are package-gate evidence; the checkout contact/send/receive gates run the
106
- same carrier with scripted S plus native H; Pi ↔ pi-durable LIVE on this supply surface is a separate
107
- release proof. 0.31.0 shipped the earlier source-runtime
108
- route (Pi 1.0.2/source `cd32f77`), which this contract replaces.
109
- See [setup: native durable](./docs/setup-clean-host.md#2b-optional-native-durable-pi-durable)
110
- and [#130](https://github.com/junghan0611/entwurf/issues/130).
81
+ ```bash
82
+ entwurf pi-durable --provider <provider> --model <model-id> --width task-wide
83
+ entwurf pi-durable --continue
84
+ ```
85
+
86
+ The contact adds garden identity and two-way mailbox communication. Runtime/TUI,
87
+ models/auth, queues, SQLite, transcripts and recovery remain upstream-owned:
88
+ [Hard Rule 17](./AGENTS.md#hard-rules), **supply the missing surface; do not become the harness**.
89
+
90
+ Optional `--native-module <absolute file>` initializes trusted ESM before runtime/TUI
91
+ imports, then installs its default native Extension after the contact. After 0.33.0 (#134):
92
+ `--native-module-dir <absolute directory>` loads the top-level `*.extension.mjs` files of that
93
+ one named directory in byte-wise order instead, and the durable TUI keeps a live
94
+ background-task badge on screen at any terminal size. No automatic module discovery or
95
+ classic Pi API shim; guards are not a sandbox or rollback.
96
+ Ordinary Pi's known `peerDependencies` warning reflects the separate native SDK supply.
97
+ [Native setup](./docs/setup-clean-host.md#2b-optional-native-durable-pi-durable)
98
+ owns flags, refusals and the extension contract.
111
99
 
112
100
  ### Herdr workbench
113
101
 
@@ -115,13 +103,11 @@ and [#130](https://github.com/junghan0611/entwurf/issues/130).
115
103
  herdr plugin install junghan0611/entwurf/plugins/herdr --yes
116
104
  ```
117
105
 
118
- This is a separate consumer path: it activates only Herdr-integrated **pi and
119
- Claude Code**, acquires the locked Entwurf runtime, and adds an observation pane.
120
- It puts no Entwurf bins on PATH. The
121
- [Herdr integration guide](https://github.com/junghan0611/entwurf/blob/main/plugins/herdr/README.md)
122
- owns its prerequisites, first install → first use, evidence and explicit removal.
123
- The plugin does not own delivery or the Herdr launch rail; a direct-installed
124
- citizen inside Herdr selects that rail from its own process context too.
106
+ This separate path activates Herdr-integrated **pi and Claude Code** with an
107
+ independently locked runtime and an observation pane; it puts no Entwurf bins on PATH.
108
+ An Entwurf release does not automatically re-pin that runtime.
109
+ [Herdr guide](./plugins/herdr/README.md) owns install, use, evidence and removal;
110
+ the plugin does not own delivery or the Herdr launch rail.
125
111
 
126
112
  ### Garden launcher
127
113
 
@@ -207,74 +193,26 @@ a live or non-pi target refuses, and an unobserved window stays visible without
207
193
  Exact boundaries: [tmux launch](https://github.com/junghan0611/entwurf/blob/main/docs/mux-launch-rail.md)
208
194
  and [Herdr launch](https://github.com/junghan0611/entwurf/blob/main/docs/herdr-launch-rail.md).
209
195
 
210
- ## Concept primer
211
-
212
- - **Entwurf** (기투, projection-of-self): opening and addressing independent visible
213
- siblings, not turning them into workers of a second orchestrator.
214
- - **Garden / garden id:** the shared address space and stable id of one V3
215
- record-backed citizen. Native harnesses keep their own identity and transcript.
216
- - **ACP:** a plugin that exposes backend turns as pi provider/models under the
217
- operator's own auth. The host pi is already a citizen; ACP mints no second one.
218
- - **MCP:** tool-call ingress to the same compiled `entwurf-bridge`, not a general
219
- MCP platform or the pi receive rail. ACP uses explicit `mcpServers` declarations;
220
- no ambient config scan or automatic retrieval. Plain anonymous hosts have no
221
- authoritative reply address and sends are refused by default.
222
- - **Engraving:** optional short operator text in the backend's identity carrier,
223
- not rich project context or a hidden tool catalog.
224
-
225
- ## Pi 1.0 and a short history
226
-
227
- **We welcome Pi's built-in MCP:** [You Said No MCP!](https://earendil.com/posts/you-said-no-mcp/)
228
- (Earendil, 2026-09-29). The 0.30.0 cut targets Pi 1.0 admission and ACP basics.
229
- Instead of keeping native pi copies of the verbs, the adapter registers the same
230
- compiled bridge after record birth, under the citizen's identity, and Pi supervises
231
- that MCP child. **MCP is ingress; pi receive remains the record-addressed Unix
232
- control socket.** Garden identity and dispatch stay Entwurf's. That 0.30.0 cut
233
- did not adopt or certify `pi-durable` or codemode. Native durable support is now
234
- released as a separate 0.31.0 native contact, as described above; codemode remains a
235
- harness-internal capability, not another garden citizen. The 0.30.0 follow-up
236
- separately measured Herdr supply 0.9.3 and
237
- re-pinned the plugin runtime to published npm 0.30.0 with manifest 0.30.0; its
238
- public consumer and CI receipts live in the #126 thread. That dated alignment is
239
- not a permanent version-equality rule. 0.30.1 is published (npm, 2026-10-04); at its tag the
240
- plugin's runtime lock is still the closed `herdr-checkout` verification carrier. Publication did
241
- not re-pin it: the measured npm re-pin and its source-specific proof are separate, still-open
242
- work that the [plugin source contract](./plugins/herdr/README.md) owns.
243
-
244
- Entwurf is the 0.12+ successor to
245
- [`@junghanacs/pi-shell-acp`](https://www.npmjs.com/package/@junghanacs/pi-shell-acp):
246
- the work was renamed around the dispatch substrate rather than the pi adapter.
247
- The pre-0.12 [two-pane demo](./demo/README.md) is **archived evidence**, including
248
- retired resume behaviour, not current instructions. [CHANGELOG](./CHANGELOG.md)
249
- keeps the release history; dated Codex topology and qualification receipts remain
250
- in [DELIVERY](./DELIVERY.md) and [BASELINE](./BASELINE.md), not rewritten as today's acceptance.
251
-
252
- ## Detailed operation
253
-
254
- ### Settings
255
-
256
- [Setup — settings and backend-specific keys](./docs/setup-clean-host.md#settings-reference-and-backend-specific-keys)
257
- owns configuration, including billing-safe carrier choices and pi-versus-backend keys.
258
-
259
- ### External MCP registration
260
-
261
- [Setup — external hosts](./docs/setup-clean-host.md#stable-bins-and-external-mcp-hosts)
262
- and [manual wiring](./docs/external-mcp-host.md) own paths, env and identity prerequisites.
263
-
264
- ### Custom skills
265
-
266
- [Setup — custom skills](./docs/setup-clean-host.md#custom-skills) owns the Claude ACP
267
- plugin layout and validation; other harnesses keep their native skill mechanisms.
268
-
269
- ### Context carriers
270
-
271
- [Setup — carriers](./docs/setup-clean-host.md#context-carriers) separates short
272
- engraving from the rich first-user augment and the actual callable schema.
273
-
274
- ### Compaction policy
275
-
276
- [Setup — reuse and compaction](./docs/setup-clean-host.md#session-reuse-and-compaction):
277
- Entwurf does not implement backend compaction or hydrate another harness's transcript.
196
+ ## Concepts
197
+
198
+ **Entwurf** (기투, projection-of-self) connects independent visible siblings;
199
+ **garden id** names a record-backed citizen, not its pane or native transcript.
200
+ [FAQ](./FAQ.md) explains ACP, MCP and context carriers.
201
+
202
+ ## Pi integration
203
+
204
+ The pi adapter registers the compiled bridge with Pi's built-in MCP after record
205
+ birth; Pi supervises the MCP child. **MCP is ingress; pi receive remains the
206
+ record-addressed Unix control socket.** Garden identity and dispatch stay Entwurf's.
207
+ Codemode is harness-internal, not another garden citizen.
208
+
209
+ ## Operation guides
210
+
211
+ - [Settings and backend keys](./docs/setup-clean-host.md#settings-reference-and-backend-specific-keys)
212
+ - [External MCP registration](./docs/setup-clean-host.md#stable-bins-and-external-mcp-hosts) · [manual wiring](./docs/external-mcp-host.md)
213
+ - [Custom skills](./docs/setup-clean-host.md#custom-skills)
214
+ - [Context carriers](./docs/setup-clean-host.md#context-carriers)
215
+ - [Reuse and compaction](./docs/setup-clean-host.md#session-reuse-and-compaction) — native harness-owned; no transcript hydration
278
216
 
279
217
  ## What this repo owns, and does not
280
218
 
package/VERIFY.md CHANGED
@@ -86,12 +86,12 @@ that moved out of `scripts/` and into a file beside its subject would otherwise
86
86
  ### The canonical floor — two entry points
87
87
 
88
88
  - **Deterministic floor — two tiers (#70):** `pnpm check` is the everyday CORE — toolchain (lint + typecheck), the vitest lanes, and the pure-unit / behavioral-contract / source-topology gates plus the cheap static coherence checks. It prints its own total wall time; acceptance is ≤60s on the reference host `oracle` (an operator measurement, never a hard wall-clock gate on arbitrary hosts). `pnpm run check:full` is the FULL deterministic floor — the core plus the hermetic-integration and package/install tiers — and is what the frozen-candidate protocol, push CI, release-gate, and `prepublishOnly` run. Exact membership is the named `check:*` group scripts in `package.json` (the executable SSOT — this document records meaning and principles, not the command list); a gate changes tier by semantic-class decision, never by getting faster or slower. One core member assumes a build output: the beside test `pi-extensions/entwurf-control.test.ts` (reached through `check-tests-beside-behavior`) registers the COMPILED bridge and refuses by name when it is absent. `prepare` normally builds it at install; after an `--ignore-scripts` install or a bridge source change, run `pnpm run build-bridge` (in the sandbox candidate when verifying one) before the core. The FULL tier carries the qualification HEAD (`check-gate-manifests`, through `check:hermetic`); the everyday core does not, and neither tier carries the separately scheduled mutant-executing body (`check-gate-qualification`).
89
- - **Discriminating power of that floor:** `./run.sh check-gate-qualification` (scheduled, not ambient: standalone when a lane changes a gate/mutant/matrix, in the CI `check` job on a branch push that touched the qualification surface, and as a release-gate MUST step — no longer inside the default check chains; a semver TAG push triggers no CI at all, and the exact-SHA evidence a release quotes is whichever run at that commit CARRIES the body — the branch run when the push touched the qualification surface, else a dispatch run; a push that touched none of the qualification surface skips the body, and `workflow_dispatch -f qualify=true` plus a weekly `schedule` run it unconditionally — the exact-SHA release oracle refuses a SHA whose body step did not conclude success) re-plants committed defect mutants (`scripts/mutants/*.json`, one per closed defect class) in an isolated snapshot repo and requires each to turn its gate red **bounded and at its claimed `[QK:<claim>]` signature** — a wrong-reason red fails, a baseline-red control voids the whole group, and the runner is negative-controlled on every run (zero-match/multi-match/survived/wrong-reason/hang/control-red/impurity). This measures whether the deterministic gates still *block* what they claim to block; it is **not a new evidence level** (L0–L5 are untouched) and never substitutes for LIVE evidence. Per-cut records cite claim IDs + killed mutant IDs — "N checks passed" alone is not evidence. `check-agy-permission-matrix` complements it with the enumerated permission contract space (literal cells + stated exclusion rules, oracle independent of the SUT). The gate's HEAD is separable and IS in the floor: `check-gate-manifests` runs the runner self-test, validates the committed manifest set against the origin index, and asserts the declared lane inventory, while executing zero COMMITTED mutants (the self-test runs only its synthetic fixture mutants, in tmp fixture repos) and never snapshotting the repo — three of the five reds qualification has ever produced in CI died in that head, in under five seconds.
89
+ - **Discriminating power of that floor:** `./run.sh check-gate-qualification` (scheduled, not ambient: the whole body runs only as the bare call — in the CI `check` job on a branch push that touched the qualification surface, and — for a cut — at the prepared SHA, where the exact-SHA release oracle requires that CI step once and the prepared state awaits it, never presumed PASS; a cut therefore batches its commits into that one prepared push (#132 took the cut's body off the local `release-gate`). Development runs no whole body (#133): a lane that changes a gate/mutant/matrix runs its affected exact-argv groups once, after review, as PARTIAL receipts — `./run.sh check-gate-qualification --group '<argv JSON>' --receipt <absolute path outside the repo>`, whose arguments reach the runner's parser unchanged and are refused there by name, before any body or snapshot, when malformed, missing or repeated. A receipt is a measurement of one group, never a qualification pass. Neither form is inside the default check chains; a semver TAG push triggers no CI at all, and the exact-SHA evidence a release quotes is whichever run at that commit CARRIES the body — the branch run when the push touched the qualification surface, else a dispatch run; a push that touched none of the qualification surface skips the body, and `workflow_dispatch -f qualify=true` plus a weekly `schedule` run it unconditionally — the exact-SHA release oracle refuses a SHA whose body step did not conclude success) re-plants committed defect mutants (`scripts/mutants/*.json`, one per closed defect class) in an isolated snapshot repo and requires each to turn its gate red **bounded and at its claimed `[QK:<claim>]` signature** — a wrong-reason red fails, a baseline-red control voids the whole group, and the runner is negative-controlled on every run (zero-match/multi-match/survived/wrong-reason/hang/control-red/impurity). This measures whether the deterministic gates still *block* what they claim to block; it is **not a new evidence level** (L0–L5 are untouched) and never substitutes for LIVE evidence. Per-cut records cite claim IDs + killed mutant IDs — "N checks passed" alone is not evidence. `check-agy-permission-matrix` complements it with the enumerated permission contract space (literal cells + stated exclusion rules, oracle independent of the SUT). The gate's HEAD is separable and IS in the floor: `check-gate-manifests` runs the runner self-test, validates the committed manifest set against the origin index, and asserts the declared lane inventory, while executing zero COMMITTED mutants (the self-test runs only its synthetic fixture mutants, in tmp fixture repos) and never snapshotting the repo — three of the five reds qualification has ever produced in CI died in that head, in under five seconds.
90
90
  - **The snapshot is source-only (#125).** It replicates the git work surface and never copies an ignored artifact from the checkout. A gate that consumes an ignored build output — the compiled `entwurf-bridge` a pi citizen registers — declares it on each of its mutants (`"build": {"argv": [...], "output": "<dir>"}`, one declaration per gate group). For that group only, the runner builds the output from the snapshot's own bytes before the control, rebuilds it after every mutation and from the restored bytes before the post-control (which must reproduce the baseline digest), never counts a build red as a kill, voids a run whose gate writes into the output, and removes the output when the group ends. The runner self-test owns this as `[QK:QUALIFY-BUILD-*]`.
91
91
  - **Live floor:** `LIVE=1 ./run.sh release-gate <scratch-project-dir> --cut` — `pnpm run check:full` + the v2-native live gates + the ACP plugin acceptance floor. It reports a **two-tier summary**:
92
- - **MUST tier** (release-blocking — owns the exit code; "green" applies only here): `pnpm run check:full`, `check-gate-qualification`, `smoke-entwurf-v2-matrix-live`, `check-bridge`, `doctor-pi-provider` (#81 — `check-bridge` proves the launcher this checkout SHIPS; this proves the invocation the operator's pi provider actually EXECS, by booting it and requiring the entwurf verb set back, because `command -v` answers yes for a command that exits 127; wired as a step on 2026-08-19 after a relocated pnpm cmd-shim cost a cut sixteen LIVE steps before the same fact surfaced at `smoke-acp-bundled-mcp-live`), the resident-garden-guard zero-token half (record birth / record-keyed socket / attach-on-reopen), the `smoke-acp-*-live` ACP plugin smokes (socket-citizen / raw-turn / overlay / provider / session-reuse / carrier-augment / memory-containment / rgg / mcp / skill / bundled-mcp / v2-send), the axis wired in on 2026-07-31 that the aggregate had simply never listed (`smoke-claude-native-resume-live`), `smoke-entwurf-chain-live` — the cross-harness delivery chain (native Claude Code → pi GPT → pi ACP Sonnet → mailbox terminus) proving sender identity and replyability at every hop plus a real read receipt at the end — the integrated `smoke-mux-lifecycle-live` (its own note below), and the two OMP steps 0.16.0 wired: `smoke-omp-receive-live` (the addressed roundtrip into a live omp citizen; it reads the capability registry and decides its own outcome rather than passing by default) and `smoke-omp-fresh-live` (the clause 7 receipt the release stop now requires). (`smoke-session-id-name` is gone — #50 C3: its `--session-id`/`--name` substrate has no entwurf consumer anymore.)
92
+ - **MUST tier** (release-blocking — owns the exit code; "green" applies only here): `pnpm run check:full`, `smoke-entwurf-v2-matrix-live`, `check-bridge`, `doctor-pi-provider` (#81 — `check-bridge` proves the launcher this checkout SHIPS; this proves the invocation the operator's pi provider actually EXECS, by booting it and requiring the entwurf verb set back, because `command -v` answers yes for a command that exits 127; wired as a step on 2026-08-19 after a relocated pnpm cmd-shim cost a cut sixteen LIVE steps before the same fact surfaced at `smoke-acp-bundled-mcp-live`), the resident-garden-guard zero-token half (record birth / record-keyed socket / attach-on-reopen), the `smoke-acp-*-live` ACP plugin smokes (socket-citizen / raw-turn / overlay / provider / session-reuse / carrier-augment / memory-containment / rgg / mcp / skill / bundled-mcp / v2-send), the axis wired in on 2026-07-31 that the aggregate had simply never listed (`smoke-claude-native-resume-live`), `smoke-entwurf-chain-live` — the cross-harness delivery chain (native Claude Code → pi GPT → pi ACP Sonnet → mailbox terminus) proving sender identity and replyability at every hop plus a real read receipt at the end — the integrated `smoke-mux-lifecycle-live` (its own note below), and the two OMP steps 0.16.0 wired: `smoke-omp-receive-live` (the addressed roundtrip into a live omp citizen; it reads the capability registry and decides its own outcome rather than passing by default) and `smoke-omp-fresh-live` (the clause 7 receipt the release stop now requires). (`smoke-session-id-name` is gone — #50 C3: its `--session-id`/`--name` substrate has no entwurf consumer anymore.)
93
93
  - **BEHAVIOR tier** (advisory, non-blocking): the resident-garden-guard positive (a model-in-loop `entwurf_self` turn). A BEHAVIOR FAIL is surfaced with its artifact path but **never blocks the cut**. The lane holds what the model *chooses*, never what our wiring fails to deliver — a gate that TELLS the model which tool to call stays MUST, because its failure is ours — measured 2026-07-24, when the tool turned out to be absent from the session schema in both observed failures (the bundled-MCP readiness gap recorded in `scripts/smoke-acp-v2-send-live.ts`).
94
- - **Every MUST step is invoked and reports its own outcome.** Prerequisite-bearing LIVE MUST steps ride the P1 STEP OUTCOME protocol (`scripts/lib/step-outcome.sh`): exit 0 = PASS, exit 97 = SKIP (a prerequisite the step does not have, printed as an `[entwurf:skip]` line), anything else = FAIL. The two non-skippable static steps (`pnpm run check:full`, `check-gate-qualification`) are inline: 0 = PASS, nonzero = FAIL, no SKIP arm — they have no prerequisite to decline. A skip is never counted as a pass — that hole is what let a cortex-less host read as cortex acceptance. Without `--cut` this is the unattended diagnostic: SKIPs are reported and the run still exits 0. **`--cut` makes it acceptance and any MUST SKIP is red**, which is how "a real cut needs `LIVE=1` with `SKIP=0`" stopped being prose. A green MUST gate is **necessary, not sufficient** — GLG authorizes the cut.
94
+ - **Every MUST step is invoked and reports its own outcome.** Prerequisite-bearing LIVE MUST steps ride the P1 STEP OUTCOME protocol (`scripts/lib/step-outcome.sh`): exit 0 = PASS, exit 97 = SKIP (a prerequisite the step does not have, printed as an `[entwurf:skip]` line), anything else = FAIL. The non-skippable static step (`pnpm run check:full`) is inline: 0 = PASS, nonzero = FAIL, no SKIP arm — it has no prerequisite to decline. A skip is never counted as a pass — that hole is what let a cortex-less host read as cortex acceptance. Without `--cut` this is the unattended diagnostic: SKIPs are reported and the run still exits 0. **`--cut` makes it acceptance and any MUST SKIP is red**, which is how "a real cut needs `LIVE=1` with `SKIP=0`" stopped being prose. A green MUST gate is **necessary, not sufficient** — GLG authorizes the cut.
95
95
  - **When cost-bearing MUST gates run (fixed 2026-07-23, the F6/F7 lesson):** a commit that touches a rail a MUST-tier live gate covers runs that gate **before cross-review is requested** — never parked behind "run it at approval time". Deferring a wired gate to a human decision is what let F6/F7 ship reviewed-and-approved; the wiring exists so the verdict never depends on who pressed enter. "배선이 없어 못 한 것은 OK, 배선이 있는데 안 돌린 것은 우리가 남긴 구멍이다." Model-in-loop cost is spent via the subscription-backed `entwurf` provider where the gate allows it, a free-tier native model otherwise; cost is a reason to pick the cheap target, not to skip the gate.
96
96
 
97
97
  > **The herdr rail is an on-demand axis until it has run.** `smoke-herdr-fresh-call-live` opens a real caller inside a real herdr pane, has it invoke the PUBLIC `entwurf_fresh_call`, and reads the child's nonce callback — the one axis no deterministic gate reaches, since the rail is selected from the caller's own process environment. **The release aggregate does not yet require the herdr rail**: herdr is optional (a cut on a host without it must not block), and first evidence precedes promotion — a rail whose first acceptance run is days old has not earned a place in the gate that blocks every cut. Run it directly with `LIVE=1 ./run.sh smoke-herdr-fresh-call-live` whenever a cut changes herdr rail code, and promote it to a MUST only after the axis has a run history to point at. Without `LIVE=1`, or without herdr/pi/claude on PATH, it reports protocol SKIP — never a pass.
@@ -203,10 +203,21 @@ Do not collapse source, package, fixture, and native-host evidence into one “g
203
203
  **Native durable contact (#129, #130 carrier).** `check-pi-durable-beside` is the deterministic
204
204
  beside-test/mutant coordinate in `check:contracts`: the adapter, the installed carrier/SDK-set
205
205
  verifier, the preflight, the owner join, the carrier's relocation grammar, resolver and
206
- maintainer emitter (its source reads refuse replace refs), and the bootstrap's explicit
207
- `--native-module` ingress (#130 P2), driven through the packaged `main`'s own seams: initialization
208
- before the TUI and the open, named refusals, the identity and directory guards, the contact-first
209
- order by reference, and the bridge spawn *spec* (not the child's inheritance). `check-pi-runtime-version` asks the
206
+ maintainer emitter (its source reads refuse replace refs; its one patch carries exactly one
207
+ section per patched carrier file, #134), and the bootstrap's explicit `--native-module` ingress
208
+ (#130 P2) with its paired `--native-module-dir` (#134), driven through the packaged `main`'s own
209
+ seams: initialization before the TUI and the open, named refusals, the identity and directory
210
+ guards, the top-level `*.extension.mjs` filter and byte-wise order, cross-module name refusals, the
211
+ contact-first order by reference, and the bridge spawn *spec* (not the child's inheritance). The
212
+ carrier's task footer (#134) is observed in ONE sandboxed child that loads the committed carrier
213
+ through its own resolver: the real carrier runtime opened and closed with no model (graph observed
214
+ for the session, `/tasks` toggling only the panel), then continued after one native background task
215
+ was committed into that session through the SDK's public `Conversation.commit` (the carrier's graph
216
+ holds that node and the badge counts it, `pending` while recovered), and the carrier TUI's badge and
217
+ `durableLayout` drawn by the published pi-tui renderer on a fake terminal across rows 1–8 × cols
218
+ 1–12, count changes and resizes, against the pinned upstream screen for the zero-task case. Its
219
+ editor is a fixed stand-in: the real `CustomEditor`, overlays, emoji width and a consumer's own task
220
+ are the visible-terminal and consumer subjects. `check-pi-runtime-version` asks the
210
221
  same verifier whether this checkout resolves exactly the pinned SDK set (the native set; the PATH
211
222
  host is setup's subject), and `check-pi-import-surface` asserts the carrier fence. The separate
212
223
  `check-pi-durable-contact`, `check-pi-durable-send` and `check-pi-durable-receive` are
@@ -227,8 +238,10 @@ same-sandbox neighbour as the rejected control), every reachable physical SDK ed
227
238
  version and declared name, a mixed-version tree refused by name although it still imports, a
228
239
  constructed depth-3 mismatch refused by the verifier and seen by the oracle, the public launch reaching the
229
240
  app's own model refusal before any birth — also with one installed `--native-module` initialized
230
- first, and a reserved extension name refused before anything opens — and the HOST kept a separate subject — a real pi 1.0.2
231
- binary beside the pinned native set is a named pi FAIL with zero Pi wiring while pi-durable still
241
+ first, a reserved extension name refused before anything opens, one installed `--native-module-dir`
242
+ initializing only its top-level `*.extension.mjs` (#134) and a directory without a module refused
243
+ before anything opens — and the HOST kept a separate subject — a real pi 1.0.4
244
+ binary (the previous generation) beside the pinned native set is a named pi FAIL with zero Pi wiring while pi-durable still
232
245
  PASSes — not native admission. The maintainer's rebuild
233
246
  equality is `emit-pi-durable-carrier --check` against a supplied upstream clone; without one it is
234
247
  a named SKIP, not acceptance. First-release visible fresh/callback and native
@@ -237,7 +250,7 @@ caller/target/cross-harness LIVE are owed by `smoke-pi-durable-fresh-live`, a re
237
250
 
238
251
  | Axis | Required proof | Limit |
239
252
  |---|---|---|
240
- | Source | `pnpm run check:full` + `./run.sh check-gate-qualification` | Does not prove an installed consumer. |
253
+ | Source | `pnpm run check:full` + the prepared SHA's CI `./run.sh check-gate-qualification` step | Does not prove an installed consumer. |
241
254
  | Packed install | `check-pack-install` | Real tarball, but checkout-visible. |
242
255
  | Linux artifact consumer | required `check-install-container` CI job against one preserved candidate | Fixtures prove package/oracle shape, not a real Claude lifecycle. |
243
256
  | Exact release commit | all required CI jobs green, and the `check` job's qualification body step concluded success, at the exact SHA | A different green SHA is not transferable evidence. |
@@ -325,7 +338,7 @@ The goal is not merely "invoke Claude Code." We want:
325
338
  **One install command to remember: `./run.sh setup <project>`.** It is idempotent — re-run the exact same command whenever anything looks wrong. There is no second install surface to juggle: from a clone `setup` runs the whole floor in order.
326
339
 
327
340
  1. `pnpm install` — installs the pinned development dependencies and builds the bridge (source-checkout bootstrap only; an installed package never runs npm/pnpm inside `node_modules`)
328
- 2. pi wiring → `<project>/.pi/settings.json` + user-scope registration — only when a `pi` inside the supported range (`>=1.0.4 <1.1`) is on PATH; absent pi is an explicit zero-state SKIP, a below-floor pi is a detected FAIL. The user-scope entry is owner-recorded (#86 C2): another root's live-or-missing ownership makes this step a zero-write refusal (setup: pi FAIL) that names `takeover-user-scope`; the install-states bind the exact managed settings path (a drifted/symlinked/corrupt target is a zero-write refusal) and the inverse removes only the recorded owner's exact entry; `doctor-pi-package` reports the verdict
341
+ 2. pi wiring → `<project>/.pi/settings.json` + user-scope registration — only when a `pi` inside the supported range (`>=1.1.0 <1.2`) is on PATH; absent pi is an explicit zero-state SKIP, a below-floor pi is a detected FAIL. The user-scope entry is owner-recorded (#86 C2): another root's live-or-missing ownership makes this step a zero-write refusal (setup: pi FAIL) that names `takeover-user-scope`; the install-states bind the exact managed settings path (a drifted/symlinked/corrupt target is a zero-write refusal) and the inverse removes only the recorded owner's exact entry; `doctor-pi-package` reports the verdict
329
342
  3. Claude meta-bridge global plugin — only when `claude` is on PATH; otherwise skipped cleanly
330
343
  4. source stable-bin exposure — including certified `entwurf` → this checkout's `run.sh`, the managed runtime Copilot fresh resolves; helper units are attempted independently and a foreign helper is a named FAIL
331
344
  5. agy bridge + exact permission + statusline + `PreInvocation` hook — only when `agy` is on PATH; each adapter is idempotent and independently doctorable
@@ -482,7 +495,7 @@ Pass: user/assistant turns accumulate normally; the transcript is not broken/emp
482
495
 
483
496
  The minimum passing bar:
484
497
 
485
- 1. **Deterministic floor green:** `pnpm run check:full` passes (the core tier plus the hermetic-integration and package/install tiers, incl. `check-pack`), plus a `./run.sh check-gate-qualification` green on the same candidate.
498
+ 1. **Deterministic floor green:** `pnpm run check:full` passes (the core tier plus the hermetic-integration and package/install tiers, incl. `check-pack`), plus the `./run.sh check-gate-qualification` step green in the exact-SHA CI run of the same prepared candidate (criterion 2's run).
486
499
  2. **All four required CI jobs green on the exact release commit:** `check`, `install-surface`, the required Linux `artifact-consumer`, and `macos-install-surface` — promoted from non-voting to required in 0.20.0 (see the release acceptance axes table above for what its green run does and does not certify); preserve the Linux artifact-consumer's tarball digest and image identity. A macOS runner failure now blocks the cut like any other required job.
487
500
  3. **Live floor MUST green:** `LIVE=1 ./run.sh release-gate <dir> --cut` exits 0 reporting `MUST PASS=N FAIL=0 SKIP=0`; with `--cut` a single SKIP is red, so the exit code itself now carries this condition. A BEHAVIOR FAIL is advisory, not blocking.
488
501
  4. **Native-host doctor green where the Claude meta-bridge is claimed:** a new post-install Claude session exists, live evidence is present, and the installed `doctor-meta-bridge` exits 0. `NOT CERTIFIED` is a release failure for that host, not a skip.
package/demo/README.md CHANGED
@@ -142,7 +142,7 @@ SCENE_DELAY=30 FINAL_PAUSE=10 bash demo.sh
142
142
 
143
143
  ## Prerequisites
144
144
 
145
- - `pi` on PATH (current floor 1.0.4)
145
+ - `pi` on PATH (current floor 1.1.0)
146
146
  - `entwurf` provider configured + auth ready for the selected sender/peer models
147
147
  - `asciinema` installed
148
148
  - `agg` installed (optional — only for GIF conversion)
@@ -134,7 +134,7 @@ ledger, 2026-10-03).
134
134
  | Surface | Declaration | Class | What a green actually says |
135
135
  |---|---|---|---|
136
136
  | Entwurf package | `package.json` `version` | checkout declaration, not a release receipt | names the package label these rows sit beside; whether that label shipped, and with which rows, is CHANGELOG's record |
137
- | pi runtime | SDK exact `1.0.4`, host `>=1.0.4 <1.1` | **exact** oracle + **closed range** | the SDK set this checkout builds, gates and (since #130) ships as exact production dependencies; an ordinary Pi host inside the range is accepted, and the ceiling moves only on measurement. Unshipped candidate: the published 0.31.0 declares the earlier peer floor 1.0.2 with the same next-minor ceiling; the 1.0.4 move and its receipts are ROADMAP's 2026-10-07 bump entry |
137
+ | pi runtime | SDK exact `1.1.0`, host `>=1.1.0 <1.2` | **exact** oracle + **closed range** | the SDK set this checkout builds, gates and (since #130) ships as exact production dependencies; an ordinary Pi host inside the range is accepted, and the ceiling moves only on measurement. Unshipped candidate: #132's 1.1.0 move (ROADMAP's 2026-10-08 bump entry) has its own acceptance still owed. Historical: the published 0.32.0 ships SDK exact 1.0.4 with the next-minor ceiling (ROADMAP's 2026-10-07 bump entry), and 0.31.0 declared the earlier peer floor 1.0.2 |
138
138
  | ACP wire SDK | `@agentclientprotocol/sdk 1.6.0` | **exact** | the shared wire oracle both adapters speak |
139
139
  | Claude ACP adapter | `@agentclientprotocol/claude-agent-acp 0.85.1` | **exact**, bundled | checkout candidate; resolved before any PATH fallback; declaration is not compatibility evidence |
140
140
  | Claude Agent SDK | `0.3.286` (transitive) | **exact** oracle | the runtime risk surface behind the adapter |