@junghanacs/entwurf 0.30.1 → 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 +4 -2
- package/CHANGELOG.md +194 -0
- package/DELIVERY.md +1 -0
- package/README.md +64 -14
- package/VERIFY.md +36 -1
- package/demo/README.md +1 -1
- package/docs/acp-backend-rail.md +1 -1
- package/docs/setup-clean-host.md +121 -4
- package/mcp/entwurf-bridge/dist/mcp/entwurf-bridge/src/index.js +7 -7
- package/mcp/entwurf-bridge/dist/pi-extensions/entwurf-capabilities.json +1 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-deliverability.js +7 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/fresh-call-composition.js +34 -3
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/meta-sender-identity.js +7 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/meta-session.js +28 -2
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-fresh-call.js +28 -2
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-fresh-preflight.js +92 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-runtime.js +236 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/meta-bridge-pi-durable.js +746 -0
- package/mcp/entwurf-bridge/src/index.ts +7 -7
- package/mcp/entwurf-bridge/tsconfig.build.json +8 -1
- package/package.json +19 -19
- package/pi/entwurf-capabilities.json +1 -0
- package/pi/pi-durable/bootstrap.mjs +404 -0
- 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/runtime-contacts.patch +91 -0
- package/pi/pi-durable/overlay/upstream-pin.json +108 -0
- package/pi-extensions/lib/entwurf-deliverability.ts +7 -1
- package/pi-extensions/lib/fresh-call-composition.ts +42 -7
- package/pi-extensions/lib/meta-sender-identity.ts +7 -1
- package/pi-extensions/lib/meta-session.ts +28 -2
- package/pi-extensions/lib/mux-fresh-call.ts +32 -2
- package/pi-extensions/lib/pi-durable-fresh-preflight.ts +113 -0
- package/pi-extensions/lib/pi-durable-runtime.ts +318 -0
- package/pi-extensions/meta-bridge-pi-durable.ts +1024 -0
- package/run.sh +624 -184
- package/scripts/check-entwurf-bridge-pi-free.ts +7 -5
- package/scripts/check-fresh-call-dispatch.ts +18 -0
- package/scripts/check-gate-qualification.ts +87 -34
- package/scripts/check-herdr-activation.ts +5 -4
- package/scripts/check-pi-durable-contact.ts +767 -0
- package/scripts/check-pi-durable-receive.ts +1079 -0
- package/scripts/check-pi-durable-send.ts +1821 -0
- package/scripts/emit-pi-durable-carrier.ts +355 -0
- package/scripts/lib/mutation-qualify.ts +21 -45
- package/scripts/lib/pi-durable-fresh-live-receipts.ts +139 -0
- package/scripts/lib/pi-durable-operator-guard.ts +89 -0
- package/scripts/lib/pi-durable-r1.ts +100 -0
- package/scripts/lib/pi-durable-reap.ts +27 -0
- package/scripts/lib/pi-durable-receive.ts +137 -0
- package/scripts/lib/qualification-receipt.ts +7 -11
- package/scripts/mutants/control-send-receipt.json +1 -1
- package/scripts/mutants/copilot-birth.json +2 -2
- package/scripts/mutants/gate-qualification.json +13 -0
- package/scripts/mutants/meta-hook-session-switch.json +4 -2
- package/scripts/mutants/mux-fresh-call.json +69 -3
- package/scripts/mutants/omp-birth.json +2 -2
- package/scripts/mutants/omp-fresh.json +6 -4
- package/scripts/mutants/pack-install.json +3 -3
- package/scripts/mutants/pi-durable.json +723 -0
- package/scripts/mutants/pi-floor.json +24 -2
- package/scripts/pi-durable-contact-host.mjs +105 -0
- package/scripts/pi-durable-receive-host.mjs +127 -0
- package/scripts/pi-durable-send-host.mjs +284 -0
- package/scripts/smoke-herdr-raw-install-live.sh +1 -1
- package/scripts/smoke-pi-durable-fresh-live.ts +624 -0
- package/scripts/smoke-setup-verdict.sh +22 -3
- package/scripts/smoke-user-scope-citizen.sh +1 -1
- package/scripts/tsconfig.json +1 -0
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.
|
|
@@ -100,6 +101,7 @@ implement → affected focused gates → independent review → one amendment bu
|
|
|
100
101
|
## Type and Working Boundaries
|
|
101
102
|
|
|
102
103
|
- Each `.ts` file belongs to one declared typecheck fence; `exclude` may move a file between fences but never out of all of them, so an exclude states the receiving `include` in the same change. Root pi extensions use TypeBox through `@earendil-works/pi-ai`; MCP/scripts use explicit `.ts` imports required by Node strip-types. Installed surfaces route to compiled JS. Behavior-adjacent `.test.ts` takes the fence `test/` takes — `scripts/tsconfig.json`, never the emit-capable root program — and is kept out of the tarball by a files-array negation whose tripwire is `check-pack`.
|
|
104
|
+
- Develop only on branches in this repository checkout; never use worktrees or tmp development clones. Isolated test fixtures and temporary evidence are not development checkouts.
|
|
103
105
|
- Make surgical, one-contract changes. Removal repairs source and its proof together; a green gate never proves retired behavior.
|
|
104
106
|
- Before commit, sweep repository-wide for retired authority vocabulary and landed-plan future tense. Historical tombstones may remain; live docs, source, gates, and usage must agree.
|
|
105
107
|
- Prefer capability-domain language over identity rank. Use tabs unless the project formatter requires otherwise. GLG decides commit, push, and release gates.
|
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,200 @@ 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
|
+
|
|
89
|
+
## 0.31.0 - 2026-10-07
|
|
90
|
+
|
|
91
|
+
### Added
|
|
92
|
+
|
|
93
|
+
- **Native durable contact (`pi-durable`, #129).**
|
|
94
|
+
Treat the experimental durable coding app as a separate native harness. One
|
|
95
|
+
native host attaches to one V3 garden id; the contact adds visible garden
|
|
96
|
+
identity, self/peers, canonical outbound dispatch and announce-only root-directed
|
|
97
|
+
mailbox receive with explicit inbox read. Runtime, TUI, model/auth, SQLite
|
|
98
|
+
storage, transcript and recovery remain upstream-owned. Internal subagents do
|
|
99
|
+
not mint another citizen. Native recovery is not exactly-once Entwurf delivery.
|
|
100
|
+
|
|
101
|
+
### Installation
|
|
102
|
+
|
|
103
|
+
- **Entwurf's npm/source installation route stays unchanged.** Optional native
|
|
104
|
+
durable use additionally requires an operator-provided pinned upstream source
|
|
105
|
+
runtime and the narrow runtime-contact overlay (Pi 1.0.2/source `cd32f77` in this
|
|
106
|
+
lane). The `@earendil-works/pi-durable` **library** is npm-installable; the
|
|
107
|
+
experimental coding app/TUI is not supplied by the ordinary Pi npm package.
|
|
108
|
+
Entwurf does not install a harness or copy credentials. Existing non-durable
|
|
109
|
+
users do not need a source checkout. [Native durable setup boundary](docs/setup-clean-host.md#2b-optional-native-durable-pi-durable).
|
|
110
|
+
|
|
111
|
+
### Changed
|
|
112
|
+
|
|
113
|
+
- **Pi dependency/runtime floor is 1.0.2**, with pi peer range `>=1.0.2 <1.1`.
|
|
114
|
+
Native durable pins upstream source `cd32f77` and its narrow contact overlay;
|
|
115
|
+
no upgrade to a newer experimental app or replacement runtime is included.
|
|
116
|
+
- **Source workspace discovery is root-only.** Explicit `packages: ['.']` keeps
|
|
117
|
+
pnpm's workspace scan coherent with the root install, without disabling its
|
|
118
|
+
dependency verification. Prepack still runs the foreground build lifecycle,
|
|
119
|
+
with build output on stderr so pack JSON stays readable and failures propagate.
|
|
120
|
+
|
|
121
|
+
### Verification
|
|
122
|
+
|
|
123
|
+
- **Reviewed pre-version main:** product `165338e` and native-admission `535c2e1`
|
|
124
|
+
landed separately with normal hooks/shared safety scans. The final landing's
|
|
125
|
+
[exact-SHA CI](https://github.com/junghan0611/entwurf/actions/runs/37478003145)
|
|
126
|
+
at `535c2e1b63e6a66c45227e197de80bf261202aec` passed all four required jobs
|
|
127
|
+
and the qualification BODY **872/872 KILLED**, including the new foreign-sender
|
|
128
|
+
guard4.5s KILLED against subject `7bdea2c4c664…`. Implementation issue #129 is closed; #130 owns
|
|
129
|
+
npm-only runtime supply, Pi upgrades, ACP and UI follow-ups. This main receipt
|
|
130
|
+
is not the later prepared-commit or preserved-artifact acceptance.
|
|
131
|
+
- **Native first admission:** corrected real Pi → pi-durable → Pi LIVE36
|
|
132
|
+
passed in41s on `openai-codex/gpt-6.1-sol`, task-wide native5 + contact6 offering.
|
|
133
|
+
A consistent official SQLite backup establishes first callback, own-id inbox
|
|
134
|
+
read, joined successful native dispatch and the exact root doorbell reaching done.
|
|
135
|
+
Pi transcript row19 carries the exact expected payload and authoritative durable
|
|
136
|
+
sender. Native V evidence is distinct from checkout contact95/send19/receive21
|
|
137
|
+
scripted S + native H and installed-bootstrap import-only proof.
|
|
138
|
+
- **Receipt-oracle repair is portable and independently reviewed.** Exact payload,
|
|
139
|
+
terminal sender envelope, root scope, effective offering, call/result and doorbell
|
|
140
|
+
joins replace substring/union predicates. Eight inline tests and the existing mux
|
|
141
|
+
coordinate carry a foreign-sender guard mutant. The original35-GREEN predicate
|
|
142
|
+
selected fixture row15; real old-row19 delivery was independently present. Old raw,
|
|
143
|
+
wrong receipt and RED857/870 remain preserved, never relabelled new acceptance.
|
|
144
|
+
Native admission raw: `.tmp-verify/b9ffcb-pack-cause/live-pd-20261006T223708/`.
|
|
145
|
+
- **Versioned working-candidate P4:** FULL666s/exit0, HEAD/index/tracked work-surface
|
|
146
|
+
and binary diff frozen MATCH; pack dry-run580files. The pre-verdict release-metadata
|
|
147
|
+
patch/bytes are preserved in `.tmp-verify/031-release/prepare/p4/`, snapshot SHA
|
|
148
|
+
`2529949384af40c6ca15f65575638b97980817cb85d7a68bb81e9ff1b34c8fa7`, full-log SHA
|
|
149
|
+
`57da80e9e32159f8bc966381a2756d6a34cca647dd5ee5791ee681ed3509b0df`.
|
|
150
|
+
This floor used the exact private Herdr0.9.3 aarch64 supply pin; operator0.9.1 stayed
|
|
151
|
+
unchanged. No qualification BODY or native LIVE was executed in this P4 run.
|
|
152
|
+
- **Explicit agy criterion7 exception for this0.31.0 cut, confirmed by GLG
|
|
153
|
+
(2026-10-07):** “agy 예외. 0.30.1부터 그렇게 헀어 더 진행가자” permits continuing
|
|
154
|
+
prepare/make while agy1.2 remains **NOT CERTIFIED**. The historical1.1 pin and
|
|
155
|
+
DELIVERY certification row stay unchanged; #128 remains first-party own-context
|
|
156
|
+
prerequisite research. No nonce/credential extraction, old-CID replay, transport
|
|
157
|
+
implementation, permanent floor change or npm publication is authorized by this
|
|
158
|
+
exception. Other release axes remain mandatory.
|
|
159
|
+
- **Fresh native Claude host:** owned writer/registry refresh corrected the stale
|
|
160
|
+
deployed v3 bytes before P5. Source=assembled=installed writer `c8f05d394d0e`,
|
|
161
|
+
capability registry `2f95e94f1eb9`; strict doctor exits0 with four live owner joins.
|
|
162
|
+
A new Claude2.1.291 session after install, garden `20261007T024544-c71062`,
|
|
163
|
+
ownerPID2784041/startKey `linux:304383485`, bridge child2784080, joins sender,
|
|
164
|
+
receiver and V3 record with no model turn. `prepare/claude-native-cert/accepted.json`
|
|
165
|
+
retains the exact metadata. This is checkout-provenance certification, not an
|
|
166
|
+
installed emitted-JS/bin-shim, registry, model-turn or fresh delivery/reply receipt.
|
|
167
|
+
- **First P5 and scoped repair remain distinct.** The frozen candidate's first
|
|
168
|
+
`--cut` run ended RED: MUST23/2/0, BEHAVIOR1/0/0, qualification872/872 KILLED,
|
|
169
|
+
HEAD/index/tracked bytes MATCH. Log `/tmp/entwurf-release-gate-0.31.0.JdQ4q6/release-gate.log`.
|
|
170
|
+
The owned OMP receiver's stale writer was refreshed through its installer; strict
|
|
171
|
+
runtime/ownership doctor and fresh receive LIVE11 passed. Initial Pi's Codex relay
|
|
172
|
+
added one trailing newline; the exact source oracle rejected it. A fresh chain on
|
|
173
|
+
the unchanged candidate passed65 assertions, source audits Pi3/3 + Codex3/3, with
|
|
174
|
+
no oracle relaxation or old-CID replay. The owed on-demand seat×cwd fresh-call
|
|
175
|
+
matrix passed39. `prepare/p5-focused-1/accepted.json` retains those focused receipts;
|
|
176
|
+
they do not turn the original aggregate RED into GREEN. Immediate P9 was report-only,
|
|
177
|
+
five eligible roots312K after P5 and six328K after the focused bundle; protected
|
|
178
|
+
Emacs was the only reparented `/tmp` process, with no deletion or signal.
|
|
179
|
+
- **Final fresh P5 cut verdict:** `LIVE=1 ./run.sh release-gate
|
|
180
|
+
/tmp/entwurf-release-gate-0.31.0.Xzbk2b --cut` exited0 after110m15s:
|
|
181
|
+
**MUST PASS=25 FAIL=0 SKIP=0**, **BEHAVIOR PASS=1 FAIL=0 SKIP=0**, its own
|
|
182
|
+
FULL and qualification **872/872 KILLED**, frozen HEAD/index/tracked bytes MATCH.
|
|
183
|
+
Log SHA256 `609612baff850ec06fc74321002b33a6b71d3dabc76874dc1546b8722c317bf2`;
|
|
184
|
+
snapshot SHA256 `38c49ca5123ffc9883762d637084dba9ed77adbdd5f3e86287a1ace565f763de`.
|
|
185
|
+
`prepare/p5-final/accepted.json` retains the boundary; native durable raw is
|
|
186
|
+
`/tmp/smoke-pi-durable-fresh-live-2026-10-06T23-27-34-983Z`. Immediate P9 reported
|
|
187
|
+
unused198/eligible6/328K, protected Emacs only; no deletion/signal.
|
|
188
|
+
- **Fresh-eyes documentation alignment:** independent Grok review found one
|
|
189
|
+
underclaim bundle, not a false green: operator docs still called accepted native
|
|
190
|
+
admission pending and a direction note pointed to a retired branch handoff.
|
|
191
|
+
After the final P5 verdict, documentation-only commit `87de9f7` aligns those states
|
|
192
|
+
with DELIVERY/#129 and distinguishes seven citizen backends from six fresh-openable
|
|
193
|
+
ones. Bounded independent re-review closed the Defect (Blocker0/Defect0); normal
|
|
194
|
+
hooks/shared scanner passed, and main fast-forwarded locally before release-prep. Executable/gate/model/pin/manifest bytes are unchanged; no LIVE Claude ↔
|
|
195
|
+
durable or registry/runtime provision is inferred. Review artifacts live in
|
|
196
|
+
`.tmp-verify/031-release/grok-fresh-review/` and `docs-amendment/`.
|
|
197
|
+
- **Release acceptance is pending:** prep commit/prepared-SHA CI and preserved
|
|
198
|
+
artifact remain outstanding. No final candidate, tag, GitHub release or npm
|
|
199
|
+
publication is asserted here.
|
|
200
|
+
|
|
7
201
|
## 0.30.1 - 2026-10-04
|
|
8
202
|
|
|
9
203
|
### Fixed
|
package/DELIVERY.md
CHANGED
|
@@ -116,6 +116,7 @@ physical host. Do not read a D-level cell as a Darwin receipt.
|
|
|
116
116
|
| **Copilot CLI first-party extension** | raw transport probe; superseded by the owned product unit | D7 path observed; D3 control receipt incomplete; D8 unproven | CLI-spawned extension over stdio JSON-RPC; `joinSession()` + documented `fs.watch` → `session.send({mode:"enqueue"})`. Idle wake, exact-marker reply, and completion passed on 2026-08-23 (CLI 1.0.80, L4, one Linux host). Two-process isolation was observed but its decisive B log was not preserved. Kept as the transport receipt the owned receive unit was built on; the shipped unit differs deliberately — it announces the inbox instead of injecting the body. |
|
|
117
117
|
| **Copilot CLI garden citizen** | shipped in 0.15.0; send + receive + visible fresh accepted on one host | D6; D7 partial; D3 pending; D8 unproven | Birth, garden id, MCP hand and record-backed sender identity are accepted; the RECEIVER is an installed first-party extension that binds to the V3 record, writes a receiver marker owned by the WATCHER pid, and rings a doorbell the model drains with `entwurf_inbox_read`. `wakeMode` is `self-fetch`, so dispatch reaches the mailbox rail: armed → delivered, unarmed/stale → the honest `mailbox-undeliverable` refusal. **D6 is the owned-invocation LIVE acceptance of 2026-08-23** — garden `20260823T181316-d9f6ba`, native `20fe30c8-b2bc-4600-91a0-8a409131be51`, CLI 1.0.80: receive log `joined`→`armed`→`doorbell fresh=1`→`rang`, mailbox `lastEnqueuedAt 09:23:41.235Z` / `lastReadAt 09:23:56.480Z`, and a model reply on the same record/native/gid chain. **Visible fresh (step 9 clause 7) is a separate LIVE, 2026-08-25** — launch window `@89`/`%89` nonce `mux-fresh-call-690529ae99f99faa2252aefb`; exact-callback garden `20260825T085721-f68be0`; one `entwurf_v2` → `meta-mailbox → enqueued`; same garden `lastReadAt 2026-08-24T23:57:47.784Z` plus same-gid reply; GLG saw footer garden id and a healthy multi-turn window. Those rows stay unmerged. D7 is PARTIAL: reply and read receipt were observed, the completion taxonomy and long-haul operation were not. D3 (second-session isolation of an owned invocation) is PENDING — observed once, decisive log lost to scratch cleanup. Evidence level L4: one host. Launch through the owned invocation `entwurf copilot`, which sets `COPILOT_CLI_ENABLED_FEATURE_FLAGS=EXTENSIONS` for that one process; `doctor-copilot-receive` reads live CLI environments because a session launched without it is silently inert. Visible fresh is operator-metered and is not a release-gate MUST. |
|
|
118
118
|
| **OMP (`omp`) garden citizen** | shipped in 0.16.0; send + receive + visible fresh accepted on one host | D6; D3 proven; D7 partial; D8 partial | Two in-process extensions in the operator's own TUI: birth mints the `mode === "tui"` host (subagents mint nothing) and names it as sender; the RECEIVER unit joins that citizen in the SAME process, holds an `fs.watch` on its mailbox signal, and rings an announce-only doorbell through the vendor's `pi.sendUserMessage` — measured to be on the FACTORY object, not the event ctx, and measured to start a turn on an idle host with zero typing (`agent_start` +31ms). `wakeMode` is `self-fetch`: the model drains with `entwurf_inbox_read` and THAT read is the receipt. **D6 is the LIVE acceptance of 2026-08-30** (oracle, omp 18.0.0) — garden `20260830T140819-116f6a`, `lastEnqueuedAt 05:08:20.555Z` / `lastReadAt 05:08:23.958Z`, and the citizen's own transcript carrying `mcp__entwurf_bridge_entwurf_inbox_read` for its own garden id. **D3 is PROVEN, not pending**: with two live omp citizens armed, one addressed enqueue rang exactly one doorbell and the sibling persisted no transcript and kept an empty mailbox. D7 is PARTIAL (`lastReadAt` needs no scraping; the reply does). D8 is PARTIAL — dedupe and every stale-handling path are implemented and hermetically pinned, ordering/loop-guard/crash-recovery are not. The `/new` unarm is the rail-specific one: the watch lives in the operator's TUI, so pid + start-key cannot see a citizen change underneath a living process, and without an explicit unarm the previous garden id would keep reading deliverable. Requires `tools: xdev: false` in `~/.omp/agent/config.yml` — the vendor default hides MCP tool schemas from the prompt, so the doorbell would name a tool the model cannot call. The decisive receipt lines — the ordering probe, the D6 chain, the D3 isolation and the `/new` unarm — are pasted into `scripts/raw-omp-measure/README.md` §M7 rather than left in a host-local `/tmp` path. Evidence level L4: one Linux host, ARM. **Visible fresh (step 9) is ACCEPTED — the clause 7 LIVE went green on 2026-08-30:** `entwurf_fresh_call` opens omp on all three public surfaces through the bare `omp` runtime with an explicit `--approval-mode yolo` width and the `mcp__entwurf_bridge_entwurf_v` callback name, behind a five-axis pre-mutation preflight whose fifth axis is omp-specific (`tools.xdev !== true`, without which the model cannot call the callback tool at all). **The first turn is a TWO-STAGE BOOTSTRAP rather than a positional prompt, and that is a measured correction, not a preference.** `[LIVE 2026-08-30]` the positional-prompt candidate opened its window and minted its citizen (garden `20260830T181342-452167`, native `01a051f2-3107-7147-8806-fa2a6f527610`), delivered the byte-identical framing as a user message at `09:13:42.413Z`, and the model answered the literal text `ACK` at `09:13:47.105Z` with ZERO tool calls; the caller timed out at 240s. `[source]` the interactive UI defers MCP discovery (`sdk.ts:1847-1855`, `:1881-1905`) while the positional `initialMessage` prompts straight after `mode.init()` (`main.ts:540-565`), and `[측정]` an observer on the same runtime saw `turn_start` at +654ms with the entwurf tools absent and the callback tool present only at +1484ms. So the launcher now carries `{v,target,nonce,task}` on the fixed registered flag `--entwurf-bootstrap`, and the in-process birth extension polls `getAllTools`(`source:"mcp"`) AND `getActiveTools` for the exact callback name, sends a callback-ONLY prompt, arms the task only on a `tool_result` whose stored `toolCallId`, tool name, target, nonce and `isError === false` all match, and DELIVERS it at the next `turn_end` of that same session. `[LIVE 2026-08-30]` that last boundary is itself a measured correction: a first attempt sent the task from inside the `tool_result` handler with an explicit `deliverAs: "followUp"`, the hook log showed the full chain (`bootstrap-armed` → `bootstrap-ready` +440ms → `bootstrap-callback-observed` → `bootstrap-released`), and the task still never appeared in the session — `[source]` an explicit `deliverAs` queues without starting a turn in either state, while the omitted form starts one when idle (`agent-session.ts:6511-6513`), which the same transcript confirmed three seconds later when the Bundle B doorbell's omitted-option send landed and started a turn. `[측정 2026-08-30]` the callback-only half is what was proven to work: model `openai-codex/gpt-5.6-sol`, tool live at +1105ms, prompt injected at +1107ms, and the sibling calling `mcp__entwurf_bridge_entwurf_v` with the exact nonce (`omp-cb-btkvva4r87` → `20260830T184054-1aa1f2`, `meta-mailbox → enqueued`). **The clause 7 acceptance, `smoke-omp-fresh-live` (release-gate MUST), 2026-08-30, 21 assertions, omp 18.0.0 / `openai-codex/gpt-5.6-sol`:** launch through `tools/call entwurf_fresh_call` with nonce `mux-fresh-call-34faea228f3c3638684b40ff`; sibling garden `20260830T192913-df52b9` taken from the CALLBACK's sender envelope and never from the launch receipt; exactly one new citizen (§3.5); addressed `entwurf_v2` → `meta-mailbox → enqueued`; `lastEnqueuedAt 10:29:19.179Z` / `lastReadAt 10:29:24.673Z`; the drain visible in that session's own transcript for its own garden id. **Both bootstrap stages are in that transcript in order** — the callback-only prompt at offset 970, the caller's task at 4732, no four-backend positional framing anywhere, and an assistant message after the task proving it started a turn rather than sitting in a queue. The unit's own log carries the state machine: `bootstrap-armed 10:29:13.399Z` → `bootstrap-ready 10:29:13.819Z` (+420ms) → `bootstrap-callback-observed 10:29:18.663Z` (`toolCallId=call_KZJtkxfzy1IEE4ejKutCPWcm|fc_0858…`) → `bootstrap-released 10:29:18.731Z` → `bootstrap-task-sent 10:29:18.759Z`. Evidence level L4: one Linux host, ARM, one run. `check-harness-admission-parity` keeps the deterministic half of the admission from being a matter of memory. What this does NOT establish: multi-host, multi-model, or repeated fresh calls in one process. **Cross-harness leg, 2026-08-31 (first bidirectional live-turn roundtrip on the committed bytes + operator redeploy):** a claude-code citizen (`20260831T090152-f998ac`) opened a fresh omp sibling through the public surface (nonce `mux-fresh-call-807cb693b1913ce98ffdbfd1`, callback sender garden `20260831T124226-eac41a`), dispatched an addressed `entwurf_v2` → `meta-mailbox → enqueued`, and the omp citizen's own live turn drained and replied into the claude mailbox — its self-report (doorbell → `entwurf_inbox_read`; callback-only first user message, task second) agrees with every receipt on the chain. |
|
|
119
|
+
| **pi-durable native host** | 0.31.0 candidate; visible fresh + addressed receive + both cross-harness legs accepted on one Linux host (2026-10-06, `smoke-pi-durable-fresh-live`, 36 assertions, exit 0) | D6 (D3/D4 shown); D7 partial; D8 unproven | The operator-provided pinned source runtime (`cd32f77` + overlay) launched by the managed `entwurf pi-durable --provider … --model … --width task-wide`; the contact registers six tools and spawns the compiled bridge as a direct child; receive is announce-only self-fetch (doorbell → root submission → `entwurf_inbox_read`). Receipt (V on both sides, `openai-codex/gpt-6.1-sol`): real Pi `20261006T223710-e51e21` opened pd `20261006T223720-ba0c08` through `entwurf_fresh_call`; pd's first action called back into Pi with the exact nonce; Pi's live turn → pd mailbox ENQUEUE `2026-10-06T13-37-35-446Z-b57c69.msg`, that message's doorbell submission `done` on pd's root conversation, drained by pd's live turn (`entwurf_inbox_read` of its own id, settled); pd's live turn → Pi `entwurf_v2` settled `control-socket → sent` (native tool-result, joined by call id) and landed as exactly one Pi row with the expected payload and pd as the anchored sender. Native offering (root `pi.system`, toolsAdded/toolsRemoved applied): the six contact tools + bash/read/edit/write/subagent; pd's first root tool call is the callback. Actual model from root `pi.assistant` rows; the generation checkpoint does not retain `request.model` after completion. |
|
|
119
120
|
| **Copilot CLI TUI+server** — *withdrawn lane, kept as evidence* | rejected | D7; D8 unproven | Older official-SDK probe over hidden `--ui-server`; idle enqueue worked, but loopback RPC authentication was not established. The bundled extension supersedes this candidate without reviving it. |
|
|
120
121
|
| **ACP Claude / Cortex** | shipped runtime, outside this matrix | — | ACP sessions are children launched by entwurf's pi adapter, not already-running native sessions to wake. |
|
|
121
122
|
|
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,6 +27,20 @@ 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.
|
|
43
|
+
|
|
30
44
|
## Install
|
|
31
45
|
|
|
32
46
|
**Choose by where you work. Neither route installs a harness, subscription or login.**
|
|
@@ -35,7 +49,7 @@ citizen is not a promise of every lifecycle operation.
|
|
|
35
49
|
|
|
36
50
|
Prerequisites: **Node >=24.0.0**, Python 3 for `setup`, and any harnesses you choose
|
|
37
51
|
to use, already installed and authenticated. Pi is optional-by-presence, supported
|
|
38
|
-
range `>=1.0.
|
|
52
|
+
range `>=1.0.4 <1.1`; Claude Code supported floor `>=2.1.217` is required for its
|
|
39
53
|
managed exec-hook lifecycle. pnpm is needed only for source-checkout setup.
|
|
40
54
|
|
|
41
55
|
```bash
|
|
@@ -63,6 +77,38 @@ Detected harness wiring on Darwin can therefore be written while setup stays
|
|
|
63
77
|
non-green. Native Windows is **UNSUPPORTED**. The package has no npm `os`
|
|
64
78
|
restriction; that is not certification of every platform's harness rails.
|
|
65
79
|
|
|
80
|
+
### Native durable (pi-durable) — #130 / 0.32 contract
|
|
81
|
+
|
|
82
|
+
**Installing Entwurf from npm supplies pi-durable. There is no runtime checkout, patch,
|
|
83
|
+
build or model-data copy for the operator.**
|
|
84
|
+
|
|
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).
|
|
111
|
+
|
|
66
112
|
### Herdr workbench
|
|
67
113
|
|
|
68
114
|
```bash
|
|
@@ -132,9 +178,9 @@ Liveness is read at dispatch time; an id's shape does not tell you its transport
|
|
|
132
178
|
| Reopen a dormant pi citizen under its own id | `entwurf_resume_call {target}` | Separate LAUNCH and socket OBSERVATION receipts; no turn is run |
|
|
133
179
|
|
|
134
180
|
**Delivery starts no process.** A live pi receives over its record-addressed Unix
|
|
135
|
-
control socket; an armed self-fetch citizen (Claude Code, Copilot, OMP)
|
|
136
|
-
mailbox; a probe-alive native-push citizen (Antigravity, Codex) through
|
|
137
|
-
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
|
|
138
184
|
push and record-less sockets reject honestly. Only control-socket dispatch takes
|
|
139
185
|
the per-target lock; the other rails use their own deliverability/probe evidence.
|
|
140
186
|
|
|
@@ -148,9 +194,10 @@ is a live rail fact, not merely a consequence of trusted identity.
|
|
|
148
194
|
|
|
149
195
|
**Mux launches; it never delivers.** Inside Herdr, fresh opens a new unfocused tab
|
|
150
196
|
in the caller's workspace, pi/Claude Code only, with no tmux fallback. Outside,
|
|
151
|
-
it opens pi/Claude Code/Copilot/OMP/Codex visibly on the caller's own tmux
|
|
152
|
-
|
|
153
|
-
|
|
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
|
|
154
201
|
tmux session (not permitted inside Herdr), never a new session or a cwd lookup.
|
|
155
202
|
Omitted tmux placement follows the caller: Codex beside its own TUI pane matched
|
|
156
203
|
by thread-id, everyone else in their own session. Missing/ambiguous context refuses.
|
|
@@ -182,14 +229,17 @@ and [Herdr launch](https://github.com/junghan0611/entwurf/blob/main/docs/herdr-l
|
|
|
182
229
|
Instead of keeping native pi copies of the verbs, the adapter registers the same
|
|
183
230
|
compiled bridge after record birth, under the citizen's identity, and Pi supervises
|
|
184
231
|
that MCP child. **MCP is ingress; pi receive remains the record-addressed Unix
|
|
185
|
-
control socket.** Garden identity and dispatch stay Entwurf's.
|
|
186
|
-
|
|
187
|
-
|
|
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
|
|
188
237
|
re-pinned the plugin runtime to published npm 0.30.0 with manifest 0.30.0; its
|
|
189
238
|
public consumer and CI receipts live in the #126 thread. That dated alignment is
|
|
190
|
-
not a permanent version-equality rule.
|
|
191
|
-
`herdr-checkout` verification carrier
|
|
192
|
-
|
|
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.
|
|
193
243
|
|
|
194
244
|
Entwurf is the 0.12+ successor to
|
|
195
245
|
[`@junghanacs/pi-shell-acp`](https://www.npmjs.com/package/@junghanacs/pi-shell-acp):
|
package/VERIFY.md
CHANGED
|
@@ -200,6 +200,41 @@ 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, #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.
|
|
237
|
+
|
|
203
238
|
| Axis | Required proof | Limit |
|
|
204
239
|
|---|---|---|
|
|
205
240
|
| Source | `pnpm run check:full` + `./run.sh check-gate-qualification` | Does not prove an installed consumer. |
|
|
@@ -290,7 +325,7 @@ The goal is not merely "invoke Claude Code." We want:
|
|
|
290
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.
|
|
291
326
|
|
|
292
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`)
|
|
293
|
-
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
|
|
294
329
|
3. Claude meta-bridge global plugin — only when `claude` is on PATH; otherwise skipped cleanly
|
|
295
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
|
|
296
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 |
|