@junghanacs/entwurf 0.31.0 → 0.32.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.
Files changed (56) hide show
  1. package/AGENTS.md +3 -2
  2. package/CHANGELOG.md +82 -0
  3. package/README.md +46 -36
  4. package/VERIFY.md +35 -16
  5. package/demo/README.md +1 -1
  6. package/docs/acp-backend-rail.md +1 -1
  7. package/docs/setup-clean-host.md +112 -95
  8. package/mcp/entwurf-bridge/dist/mcp/entwurf-bridge/src/index.js +1 -1
  9. package/mcp/entwurf-bridge/dist/pi-extensions/lib/fresh-call-composition.js +1 -1
  10. package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-fresh-call.js +8 -10
  11. package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-fresh-preflight.js +3 -3
  12. package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-runtime.js +153 -205
  13. package/mcp/entwurf-bridge/dist/pi-extensions/meta-bridge-pi-durable.js +6 -4
  14. package/mcp/entwurf-bridge/src/index.ts +1 -1
  15. package/package.json +14 -17
  16. package/pi/pi-durable/bootstrap.mjs +142 -19
  17. package/pi/pi-durable/carrier/LICENSE +21 -0
  18. package/pi/pi-durable/carrier/harness-setup.js +123 -0
  19. package/pi/pi-durable/carrier/prompt.js +74 -0
  20. package/pi/pi-durable/carrier/runtime.js +402 -0
  21. package/pi/pi-durable/carrier/sessions.js +56 -0
  22. package/pi/pi-durable/carrier/subagent.js +55 -0
  23. package/pi/pi-durable/carrier/tui.js +655 -0
  24. package/pi/pi-durable/carrier-relocation.mjs +160 -0
  25. package/pi/pi-durable/carrier-resolver.mjs +38 -0
  26. package/pi/pi-durable/overlay/upstream-pin.json +103 -11
  27. package/pi-extensions/lib/fresh-call-composition.ts +1 -1
  28. package/pi-extensions/lib/mux-fresh-call.ts +8 -10
  29. package/pi-extensions/lib/pi-durable-fresh-preflight.ts +3 -3
  30. package/pi-extensions/lib/pi-durable-runtime.ts +197 -263
  31. package/pi-extensions/meta-bridge-pi-durable.ts +11 -7
  32. package/run.sh +508 -235
  33. package/scripts/check-entwurf-bridge-pi-free.ts +7 -5
  34. package/scripts/check-fresh-call-dispatch.ts +1 -1
  35. package/scripts/check-gate-qualification.ts +86 -34
  36. package/scripts/check-herdr-activation.ts +5 -4
  37. package/scripts/check-pi-durable-contact.ts +26 -93
  38. package/scripts/check-pi-durable-receive.ts +22 -59
  39. package/scripts/check-pi-durable-send.ts +235 -75
  40. package/scripts/emit-pi-durable-carrier.ts +355 -0
  41. package/scripts/lib/mutation-qualify.ts +21 -45
  42. package/scripts/lib/pi-durable-operator-guard.ts +89 -0
  43. package/scripts/lib/qualification-receipt.ts +7 -11
  44. package/scripts/mutants/control-send-receipt.json +1 -1
  45. package/scripts/mutants/gate-qualification.json +13 -0
  46. package/scripts/mutants/mux-fresh-call.json +13 -13
  47. package/scripts/mutants/pack-install.json +3 -3
  48. package/scripts/mutants/pi-durable.json +442 -109
  49. package/scripts/mutants/pi-floor.json +24 -2
  50. package/scripts/pi-durable-contact-host.mjs +3 -3
  51. package/scripts/pi-durable-receive-host.mjs +3 -3
  52. package/scripts/pi-durable-send-host.mjs +76 -5
  53. package/scripts/smoke-herdr-raw-install-live.sh +1 -1
  54. package/scripts/smoke-pi-durable-fresh-live.ts +3 -3
  55. package/scripts/smoke-setup-verdict.sh +15 -15
  56. package/scripts/smoke-user-scope-citizen.sh +1 -1
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 is explicit.** Only explicit `mcpServers`; no ambient configuration scan or automatic retrieval.
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.
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.
@@ -42,7 +42,7 @@ Ask: does this follow capability rather than a surface name; record backend asym
42
42
  14. **Native-hook ownership is structural.** Use shipped exec launchers and provenance, shared plausible-owner-pid policy, no shell fallback or ancestry guess. Version floors belong to their package source and are enforced there; hook contract/docs own the changing detail.
43
43
  15. **Crash, don’t warn.** Invalid config/path/model/store state throws. Empty catches are only bounded environment probes; diagnostics go to stderr.
44
44
  16. **mux launches, never delivers.** A tmux handle is an ephemeral view, not an address or liveness receipt; screen text/keystrokes are not delivery evidence. A Codex caller's seat is the pane whose title carries its own thread-id, a placement input only; it is never an address, and never a pane nobody named. Cross-window adjacency requires the documented observed-coordinate proof, never pane guessing.
45
- 17. **Entwurf installs itself; setup composes.** Installation supplies Entwurf bytes and development fixtures, never a harness binary, subscription, credential, or login. Setup detects existing harness capability; absence is explicit skip and detected incompleteness is non-green. Portability evidence and rail/runtime support remain separate.
45
+ 17. **Supply the missing surface; do not become the harness.** Installation supplies Entwurf bytes, development fixtures, and declared upstream SDK dependencies. Where upstream omits a native execution surface from its distribution, Entwurf may carry that pinned, removable app/TUI with its declared overlay and deterministic emit/import relocation, against one coherent published-library version set. Native execution, auth, queues, storage, transcript and recovery remain upstream-owned (Rule 9). Provenance, license, rebuild and installed-consumer proof belong to the supply contract. No Entwurf-owned copying/inlining of provider model catalogs, subscription, credential or login; no launch-time download, repair, update or fallback. Setup checks capability, version-set coherence and carrier integrity: absent optional capability is explicit skip; incomplete installation, mismatch and drift are named non-green refusals. Portability and runtime evidence remain separate.
46
46
 
47
47
  History and incident detail belong in [CHANGELOG.md](./CHANGELOG.md), issue threads, [BASELINE.md](./BASELINE.md), or source-adjacent comments. When prose and behavior disagree, repair the owning source or document.
48
48
 
@@ -91,6 +91,7 @@ implement → affected focused gates → independent review → one amendment bu
91
91
  → qualification 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
95
  - Inner loop runs only affected gates; review and its corrections finish before the full floor.
95
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.
96
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.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,88 @@ All notable changes to this project will be documented here. Format follows [Kee
4
4
 
5
5
  ## Unreleased
6
6
 
7
+ ## 0.32.0 - 2026-10-08
8
+
9
+ ### Added
10
+
11
+ - **One npm installation unit for native `pi-durable` (#130).** The package
12
+ supplies the omitted experimental app/TUI as a pinned Pi1.0.4 carrier, with the
13
+ declared contact overlay, deterministic emit/import relocation, MIT license
14
+ and rebuild contract. Nine exact published SDK dependencies supply the native
15
+ library set. The operator no longer clones, patches or builds a separate
16
+ fixed-XDG source runtime; there is no old-route fallback, downloader or repair.
17
+ Native runtime/TUI/models/auth/queues/SQLite/transcripts/recovery remain upstream-owned.
18
+ - **One explicit native extension ingress.** `--native-module <absolute file>`
19
+ loads ordinary ESM, including top-level await, before TUI/runtime imports;
20
+ its default native durable Extension is installed by reference after the
21
+ contact. Reserved extension/contact names and identity/cwd changes refuse by
22
+ name. These are trusted-code mistake guards, not a sandbox or rollback. No
23
+ ambient discovery, classic ExtensionAPI shim, persistent module profile or
24
+ fresh-call propagation. Synthetic node:* development fixtures prove the
25
+ contact, module tool and native bash child; real dotenv policy stays downstream
26
+ in agent-config after release.
27
+
28
+ ### Changed
29
+
30
+ - **Pi host floor and native SDK set are separate subjects.** Host CLI range is
31
+ `>=1.0.4 <1.1`; native SDK members are exact1.0.4 production dependencies,
32
+ with `proper-lockfile`4.1.2. The installed verifier walks reachable physical
33
+ member edges by name/version, allows coherent sharing and cycles, and refuses
34
+ incomplete, drifted or mixed-version supply even when imports work.
35
+ - **Known ordinary-Pi manifest warning retained.** The host warns that its
36
+ extension packages belong in peer dependencies; the exact installed SDK copies
37
+ intentionally serve the separate native process. GLG accepted this manifest
38
+ constraint for0.32, not a universal harmlessness or peer-contract certification.
39
+
40
+ ### Fixed
41
+
42
+ - **Qualification preserves prior-run evidence.** Retire the ambient dead-pid /
43
+ prefix sweep and its marker-based authority. Full/group execution share only
44
+ invocation-owned snapshot creation/teardown; prior names and bytes survive
45
+ green, red and collection fixture cases. No replacement GC or cleanup manager.
46
+ Repair the malformed-carrier oracle's discriminator and run the actual rebuilt
47
+ verifier inside its own copied package so the READ-ONLY mutant cannot contaminate
48
+ the checkout. The production refusal and read-only contracts remain unchanged.
49
+ - **Installed-gate host fixtures keep their SDK generation closed.** Derive the
50
+ aligned host's complete exact SDK roots from the owning pin, and the same
51
+ member names at1.0.2 for the previous-host control. The first prepared CI's
52
+ coinstalled host tried pi-ai1.1.0 and received npm404 through its caret edges;
53
+ its RED is preserved. Product pins/overrides and native assertions are unchanged.
54
+ - **Fresh-call tool description fits the existing host cap.** One clause was
55
+ shortened from2068 to2021 characters; callable schema, cap2048, named refusals
56
+ and the installed-carrier contract are unchanged.
57
+
58
+ ### Verification and evidence boundaries
59
+
60
+ - **Frozen source/native candidate:** `b220b20c1b95f0ecafe8e679668bda3c5678be81`
61
+ accepted FULL716s/exit0, all898 committed mutant IDs exactly once KILLED,
62
+ 178 green controls, unchanged origin, MUST25/0/0 and BEHAVIOR1/0/0/cutOK.
63
+ Explicit installed `check-pack-install` passed separately; FULL/aggregate do
64
+ not contain that gate or the container gate. Saved official Codex65/Pi-durable36
65
+ snapshots were independently rejudged through their shipped receipt oracles.
66
+ [Owning #130 receipt](https://github.com/junghan0611/entwurf/issues/130#issuecomment-6043744944).
67
+ - **Pre-version landing:** main `78c917ae2dbec01281c41287db14ed8d008a3c82`,
68
+ [push CI37679372365](https://github.com/junghan0611/entwurf/actions/runs/37679372365),
69
+ all four required jobs plus qualification BODY success, exact898/898 KILLED,
70
+ controls178green/origin unchanged and Linux artifact-consumer exit0. Its
71
+ temporary tarball retained package version0.31.0; it is neither the published
72
+ 0.31.0 artifact nor a preserved accepted0.32 candidate.
73
+ - **Independent pre-prepare consistency review:** Grok Blocker0/Defect2; the
74
+ two stale pending underclaims were corrected as prose, not a gate restart.
75
+ GLG explicitly approved version metadata preparation, new prepared-SHA CI and
76
+ one preserved exact artifact without repeating local FULL/LIVE for documentation
77
+ changes. Source/native receipts retain their original fingerprints; prepared-SHA
78
+ qualification, versioned artifact and registry equality remain independent
79
+ evidence. This preparation text does not assert a tag, GitHub release or npm publish.
80
+ - **Historical RED retained.** R3 aggregate remains RED despite FULL714s/exit0.
81
+ Its protected36MB snapshot was irreversibly deleted by the retired sweep;
82
+ wider deletion extent and the vendor `-32603` cause remain unknown. Original
83
+ raw/confirmation/review erratum are preserved. Prior-run preservation is a
84
+ private-fixture proof: r4 had no prior root in actual tmp, so no in-situ claim.
85
+ Original0.31 release/tag/artifact/archive are immutable. Native agy1.2 remains
86
+ NOT CERTIFIED and its historical1.1 pin is unchanged; no new native agy acceptance
87
+ or permanent exception is inferred.
88
+
7
89
  ## 0.31.0 - 2026-10-07
8
90
 
9
91
  ### Added
package/README.md CHANGED
@@ -15,7 +15,7 @@ Git branches, worktrees, file isolation and internal delegation remain their con
15
15
  [Short answers: FAQ](./FAQ.md).
16
16
 
17
17
  ```text
18
- pi / Claude Code / Copilot / OMP / Antigravity / Codex
18
+ pi / pi-durable / Claude Code / Copilot / OMP / Antigravity / Codex
19
19
  → record-backed garden id
20
20
  → entwurf_v2
21
21
  → control-socket | self-fetch mailbox | native-push
@@ -27,14 +27,19 @@ 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`) is accepted in the 0.31.0 candidate (#129).**
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
31
  It is a separate native harness contact, not ordinary Pi's control-socket adapter.
32
32
  The contact attaches one durable host to a garden id, adds visible identity and
33
33
  two-way mailbox contact, while the upstream harness keeps its TUI, models/auth,
34
- SQLite storage and recovery. First native admission passed on one Linux host;
35
- release/artifact acceptance is separate. The
36
- [installation requirements](#optional-native-durable--0310) differ from installing
37
- the ordinary Pi CLI.
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.
38
43
 
39
44
  ## Install
40
45
 
@@ -44,7 +49,7 @@ the ordinary Pi CLI.
44
49
 
45
50
  Prerequisites: **Node >=24.0.0**, Python 3 for `setup`, and any harnesses you choose
46
51
  to use, already installed and authenticated. Pi is optional-by-presence, supported
47
- range `>=1.0.2 <1.1`; Claude Code supported floor `>=2.1.217` is required for its
52
+ range `>=1.0.4 <1.1`; Claude Code supported floor `>=2.1.217` is required for its
48
53
  managed exec-hook lifecycle. pnpm is needed only for source-checkout setup.
49
54
 
50
55
  ```bash
@@ -72,33 +77,37 @@ Detected harness wiring on Darwin can therefore be written while setup stays
72
77
  non-green. Native Windows is **UNSUPPORTED**. The package has no npm `os`
73
78
  restriction; that is not certification of every platform's harness rails.
74
79
 
75
- ### Optional native durable — 0.31.0
80
+ ### Native durable (pi-durable) — #130 / 0.32 contract
76
81
 
77
- **Entwurf's npm installation does not change. Enabling durable additionally needs
78
- an operator-provided native runtime; installing ordinary Pi from npm is not enough.**
82
+ **Installing Entwurf from npm supplies pi-durable. There is no runtime checkout, patch,
83
+ build or model-data copy for the operator.**
79
84
 
80
85
  | Component | How it is supplied | What it does not supply |
81
86
  |---|---|---|
82
- | Entwurf | Existing npm or source-checkout route above | A harness binary, source runtime, subscription or login |
83
- | `@earendil-works/pi-durable` | npm **library** | The experimental app/TUI or Entwurf citizen attachment |
84
- | Native experimental durable app | Pinned upstream **source checkout**, with Entwurf's narrow runtime-contact overlay | A replacement ordinary Pi CLI or an Entwurf-owned harness |
85
-
86
- This lane retains Pi 1.0.2/source `cd32f77`; a newer global Pi installation does
87
- not provision that experimental runtime. Existing non-durable users do not need
88
- a Pi source checkout. Native auth and sessions stay upstream-owned: Entwurf does
89
- not copy credentials or convert ordinary Pi sessions into durable SQLite sessions.
90
-
91
- The package ships the compiled adapter and bootstrap: `entwurf setup` reports the
92
- operator runtime as PASS/SKIP/FAIL without writing durable wiring, and
93
- `entwurf pi-durable` is the managed launch. First native admission passed on
94
- 2026-10-06: visible fresh/callback, addressed receive and real Pi ↔ pi-durable
95
- LIVE36 on one Linux host ([receipts](./DELIVERY.md)). Installed-bootstrap import
96
- proof does not supply or certify the native runtime; npm installation alone is
97
- not a durable readiness verdict. #129 closed at reviewed main; release acceptance
98
- remains its own floor.
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.
99
109
  See [setup: native durable](./docs/setup-clean-host.md#2b-optional-native-durable-pi-durable)
100
- and [#130](https://github.com/junghan0611/entwurf/issues/130) for runtime-supply,
101
- Pi-upgrade, ACP and UI follow-ups.
110
+ and [#130](https://github.com/junghan0611/entwurf/issues/130).
102
111
 
103
112
  ### Herdr workbench
104
113
 
@@ -169,9 +178,9 @@ Liveness is read at dispatch time; an id's shape does not tell you its transport
169
178
  | Reopen a dormant pi citizen under its own id | `entwurf_resume_call {target}` | Separate LAUNCH and socket OBSERVATION receipts; no turn is run |
170
179
 
171
180
  **Delivery starts no process.** A live pi receives over its record-addressed Unix
172
- control socket; an armed self-fetch citizen (Claude Code, Copilot, OMP) through its
173
- mailbox; a probe-alive native-push citizen (Antigravity, Codex) through its native
174
- conversation/thread. Dormant pi, undeliverable mailboxes, dead/indeterminate native
181
+ control socket; an armed self-fetch citizen (Claude Code, Copilot, OMP, pi-durable)
182
+ through its mailbox; a probe-alive native-push citizen (Antigravity, Codex) through
183
+ its native conversation/thread. Dormant pi, undeliverable mailboxes, dead/indeterminate native
175
184
  push and record-less sockets reject honestly. Only control-socket dispatch takes
176
185
  the per-target lock; the other rails use their own deliverability/probe evidence.
177
186
 
@@ -185,9 +194,10 @@ is a live rail fact, not merely a consequence of trusted identity.
185
194
 
186
195
  **Mux launches; it never delivers.** Inside Herdr, fresh opens a new unfocused tab
187
196
  in the caller's workspace, pi/Claude Code only, with no tmux fallback. Outside,
188
- it opens pi/Claude Code/Copilot/OMP/Codex visibly on the caller's own tmux server.
189
- The model is required; optional `cwd` is a literal absolute directory, omitted or
190
- empty means the caller's cwd. Optional `placement.tmuxSession` names an existing
197
+ it opens pi/pi-durable/Claude Code/Copilot/OMP/Codex visibly on the caller's own tmux
198
+ server. pi-durable runs the installed carrier on its exact SDK set described above and
199
+ refuses by name before any window when that verdict is not green; Herdr does not fresh-open it. The model is required; optional `cwd` is a literal
200
+ absolute directory, omitted or empty means the caller's cwd. Optional `placement.tmuxSession` names an existing
191
201
  tmux session (not permitted inside Herdr), never a new session or a cwd lookup.
192
202
  Omitted tmux placement follows the caller: Codex beside its own TUI pane matched
193
203
  by thread-id, everyone else in their own session. Missing/ambiguous context refuses.
@@ -221,7 +231,7 @@ compiled bridge after record birth, under the citizen's identity, and Pi supervi
221
231
  that MCP child. **MCP is ingress; pi receive remains the record-addressed Unix
222
232
  control socket.** Garden identity and dispatch stay Entwurf's. That 0.30.0 cut
223
233
  did not adopt or certify `pi-durable` or codemode. Native durable support is now
224
- accepted as a separate 0.31.0 candidate contact, as described above; codemode remains a
234
+ released as a separate 0.31.0 native contact, as described above; codemode remains a
225
235
  harness-internal capability, not another garden citizen. The 0.30.0 follow-up
226
236
  separately measured Herdr supply 0.9.3 and
227
237
  re-pinned the plugin runtime to published npm 0.30.0 with manifest 0.30.0; its
package/VERIFY.md CHANGED
@@ -200,21 +200,40 @@ that moved out of `scripts/` and into a file beside its subject would otherwise
200
200
 
201
201
  Do not collapse source, package, fixture, and native-host evidence into one “green.”
202
202
 
203
- **Native durable contact (#129).** `check-pi-durable-beside` is the deterministic
204
- beside-test/mutant coordinate in `check:contracts`. The separate
205
- `check-pi-durable-contact`, `check-pi-durable-send` and `check-pi-durable-receive`
206
- are CHECKOUT-ONLY SDK/contact gates: they require the provisioned pinned overlay
207
- runtime (`ENTWURF_PI_DURABLE_RUNTIME`) and a private compiled bridge emitted from
208
- this candidate (`ENTWURF_PI_DURABLE_BRIDGE_ENTRY`). Missing inputs report SKIP 97,
209
- never PASS; present invalid inputs fail. Installed packages refuse these developer
210
- gates. Contact is adapter-direct/harness-bypassed; send/receive exercise scripted
211
- loopback S plus actual native harness H, not vendor V. Their scoped raw records,
212
- wire, native view and SQLite oracles do not certify every queue/crash window.
213
- The installed-bootstrap import in `check-pack-install` proves package closure,
214
- not runtime supply or native admission. First-release visible fresh/callback and
215
- native caller/target/cross-harness LIVE are owed by `smoke-pi-durable-fresh-live`, a
216
- release-gate MUST (LIVE=1; vendor V on a real Pi and a real pi-durable host, operator
217
- runtime required); SDK or package green does not waive it.
203
+ **Native durable contact (#129, #130 carrier).** `check-pi-durable-beside` is the deterministic
204
+ beside-test/mutant coordinate in `check:contracts`: the adapter, the installed carrier/SDK-set
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
210
+ same verifier whether this checkout resolves exactly the pinned SDK set (the native set; the PATH
211
+ host is setup's subject), and `check-pi-import-surface` asserts the carrier fence. The separate
212
+ `check-pi-durable-contact`, `check-pi-durable-send` and `check-pi-durable-receive` are
213
+ CHECKOUT-ONLY SDK/contact gates: they run the checkout's own carrier — verified first, refused by
214
+ name — and require a private compiled bridge emitted from this candidate
215
+ (`ENTWURF_PI_DURABLE_BRIDGE_ENTRY`). A missing bridge input reports SKIP 97, never PASS; a
216
+ refused carrier fails. Installed packages refuse these developer gates. Contact is
217
+ adapter-direct/harness-bypassed; send/receive exercise scripted loopback S plus actual native
218
+ harness H, not vendor V. `check-pi-durable-send` with `ENTWURF_PI_DURABLE_SEND_CELL=native-module`
219
+ runs the whole packaged `main` with the synthetic module (`test/fixtures/pi-durable-native-module/`):
220
+ its initialization lands before the host's first `@earendil-works`/`entwurf-pi-dist:` resolution
221
+ (one receipt file, observing resolve hook), and one scripted answer calls the module's tool, the
222
+ native `bash` (whose child sees the module's value) and the contact's `entwurf_self`. Their scoped
223
+ raw records, wire, native view and SQLite oracles do not certify every queue/crash window. `check-pack-install` proves the INSTALLED carrier on actual npm
224
+ consumers (Entwurf-only, aligned host, isolated global): the installed verifier, a consumer oracle
225
+ whose every resolved product file lies inside that consumer's own `node_modules` (with a
226
+ same-sandbox neighbour as the rejected control), every reachable physical SDK edge at the pinned
227
+ version and declared name, a mixed-version tree refused by name although it still imports, a
228
+ constructed depth-3 mismatch refused by the verifier and seen by the oracle, the public launch reaching the
229
+ 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
232
+ PASSes — not native admission. The maintainer's rebuild
233
+ equality is `emit-pi-durable-carrier --check` against a supplied upstream clone; without one it is
234
+ a named SKIP, not acceptance. First-release visible fresh/callback and native
235
+ caller/target/cross-harness LIVE are owed by `smoke-pi-durable-fresh-live`, a release-gate MUST
236
+ (LIVE=1; vendor V on a real Pi and a real pi-durable host); SDK or package green does not waive it.
218
237
 
219
238
  | Axis | Required proof | Limit |
220
239
  |---|---|---|
@@ -306,7 +325,7 @@ The goal is not merely "invoke Claude Code." We want:
306
325
  **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.
307
326
 
308
327
  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`)
309
- 2. pi wiring → `<project>/.pi/settings.json` + user-scope registration — only when a `pi` inside the supported range (`>=1.0.2 <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
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
310
329
  3. Claude meta-bridge global plugin — only when `claude` is on PATH; otherwise skipped cleanly
311
330
  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
312
331
  5. agy bridge + exact permission + statusline + `PreInvocation` hook — only when `agy` is on PATH; each adapter is idempotent and independently doctorable
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.2)
145
+ - `pi` on PATH (current floor 1.0.4)
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 | devDep exact `1.0.2`, peer `>=1.0.2 <1.1` | **exact** oracle + **closed range** | the source pin this checkout builds and gates against; hosts inside the range are accepted, and the ceiling moves only on measurement. Unshipped candidate floor: the published 0.30.0 and 0.30.1 declare floor 1.0.0 with the same next-minor ceiling (`[측정 2026-10-05]` `npm view @junghanacs/entwurf@0.30.1 peerDependencies`; acceptance record CHANGELOG 0.30.0, #125 branch evidence). The 1.0.2 move and its receipts are ROADMAP's 2026-10-05 bump entry |
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 |
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 |