@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.
- package/AGENTS.md +3 -2
- package/CHANGELOG.md +82 -0
- package/README.md +46 -36
- package/VERIFY.md +35 -16
- package/demo/README.md +1 -1
- package/docs/acp-backend-rail.md +1 -1
- package/docs/setup-clean-host.md +112 -95
- package/mcp/entwurf-bridge/dist/mcp/entwurf-bridge/src/index.js +1 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/fresh-call-composition.js +1 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-fresh-call.js +8 -10
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-fresh-preflight.js +3 -3
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-runtime.js +153 -205
- package/mcp/entwurf-bridge/dist/pi-extensions/meta-bridge-pi-durable.js +6 -4
- package/mcp/entwurf-bridge/src/index.ts +1 -1
- package/package.json +14 -17
- package/pi/pi-durable/bootstrap.mjs +142 -19
- package/pi/pi-durable/carrier/LICENSE +21 -0
- package/pi/pi-durable/carrier/harness-setup.js +123 -0
- package/pi/pi-durable/carrier/prompt.js +74 -0
- package/pi/pi-durable/carrier/runtime.js +402 -0
- package/pi/pi-durable/carrier/sessions.js +56 -0
- package/pi/pi-durable/carrier/subagent.js +55 -0
- package/pi/pi-durable/carrier/tui.js +655 -0
- package/pi/pi-durable/carrier-relocation.mjs +160 -0
- package/pi/pi-durable/carrier-resolver.mjs +38 -0
- package/pi/pi-durable/overlay/upstream-pin.json +103 -11
- package/pi-extensions/lib/fresh-call-composition.ts +1 -1
- package/pi-extensions/lib/mux-fresh-call.ts +8 -10
- package/pi-extensions/lib/pi-durable-fresh-preflight.ts +3 -3
- package/pi-extensions/lib/pi-durable-runtime.ts +197 -263
- package/pi-extensions/meta-bridge-pi-durable.ts +11 -7
- package/run.sh +508 -235
- package/scripts/check-entwurf-bridge-pi-free.ts +7 -5
- package/scripts/check-fresh-call-dispatch.ts +1 -1
- package/scripts/check-gate-qualification.ts +86 -34
- package/scripts/check-herdr-activation.ts +5 -4
- package/scripts/check-pi-durable-contact.ts +26 -93
- package/scripts/check-pi-durable-receive.ts +22 -59
- package/scripts/check-pi-durable-send.ts +235 -75
- package/scripts/emit-pi-durable-carrier.ts +355 -0
- package/scripts/lib/mutation-qualify.ts +21 -45
- package/scripts/lib/pi-durable-operator-guard.ts +89 -0
- package/scripts/lib/qualification-receipt.ts +7 -11
- package/scripts/mutants/control-send-receipt.json +1 -1
- package/scripts/mutants/gate-qualification.json +13 -0
- package/scripts/mutants/mux-fresh-call.json +13 -13
- package/scripts/mutants/pack-install.json +3 -3
- package/scripts/mutants/pi-durable.json +442 -109
- package/scripts/mutants/pi-floor.json +24 -2
- package/scripts/pi-durable-contact-host.mjs +3 -3
- package/scripts/pi-durable-receive-host.mjs +3 -3
- package/scripts/pi-durable-send-host.mjs +76 -5
- package/scripts/smoke-herdr-raw-install-live.sh +1 -1
- package/scripts/smoke-pi-durable-fresh-live.ts +3 -3
- package/scripts/smoke-setup-verdict.sh +15 -15
- 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
|
|
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. **
|
|
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`)
|
|
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.
|
|
35
|
-
|
|
36
|
-
[
|
|
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.
|
|
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
|
-
###
|
|
80
|
+
### Native durable (pi-durable) — #130 / 0.32 contract
|
|
76
81
|
|
|
77
|
-
**Entwurf
|
|
78
|
-
|
|
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,
|
|
83
|
-
| `@earendil-works
|
|
84
|
-
| Native experimental durable app |
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
operator
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
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)
|
|
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)
|
|
173
|
-
mailbox; a probe-alive native-push citizen (Antigravity, Codex) through
|
|
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
|
|
189
|
-
|
|
190
|
-
|
|
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
|
-
|
|
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
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
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.
|
|
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.
|
|
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)
|
package/docs/acp-backend-rail.md
CHANGED
|
@@ -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 |
|
|
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 |
|