@junghanacs/entwurf 0.31.0 → 0.33.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 +128 -0
- package/README.md +62 -117
- package/VERIFY.md +40 -21
- 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 +13 -7
- package/run.sh +519 -248
- 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/check-release-gate-outcomes.ts +21 -17
- 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/mutants/release-gate.json +5 -3
- 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,134 @@ All notable changes to this project will be documented here. Format follows [Kee
|
|
|
4
4
|
|
|
5
5
|
## Unreleased
|
|
6
6
|
|
|
7
|
+
## 0.33.0 - 2026-10-08
|
|
8
|
+
|
|
9
|
+
### Release coordination
|
|
10
|
+
|
|
11
|
+
- **First cut coordinated by a pi-durable citizen (#132).** This cut is coordinated by the
|
|
12
|
+
pi-durable citizen `20261008T113104-801621`, implemented by Claude Code Opus, and independently
|
|
13
|
+
scrutinized by Grok. Per GLG's direct report (carried here as that report, not as a source
|
|
14
|
+
receipt), an earlier durable-coordination attempt during the 0.31.0 process broke down; 0.31.0
|
|
15
|
+
itself shipped with the accepted receipts recorded in its own section below, and neither that
|
|
16
|
+
report nor 0.32.0's snapshot-loss incident is restated here as a package-publication failure.
|
|
17
|
+
This section is written at prepare time: the prepared-SHA CI, the preserved artifact and the tag
|
|
18
|
+
that close the cut are recorded in the GitHub release and the #132 thread, not claimed here.
|
|
19
|
+
- **Verified for this cut.** The Pi SDK 1.1.0 implementation landed at `aceba59` with exact-SHA CI
|
|
20
|
+
run 37739273349 green on all four required jobs and its qualification body (898/898 killed),
|
|
21
|
+
after a local body of 898/898 and a frozen `check:full` on that candidate. The prepared tree
|
|
22
|
+
(scheduling policy, ASCII fix, version metadata) passed a frozen `check:full`. The policy's
|
|
23
|
+
affected 22-mutant partial run killed 22/22, and its later format/doc amendments re-ran their
|
|
24
|
+
focused gates. After the operator-owned Codex app-server was restarted, the Codex and
|
|
25
|
+
Antigravity native doctors were green.
|
|
26
|
+
- **Not run for this cut — GLG's direct cost/deadline decision, one cut only** ("아니야 30분 내로
|
|
27
|
+
npm publish 전까지 끝내줘. 이 부랜치 핵심은 검증했지? 그럼 됬어. … 시간 아끼자.";
|
|
28
|
+
[authority record](https://github.com/junghan0611/entwurf/issues/132#issuecomment-6057425161)). The LIVE
|
|
29
|
+
`release-gate --cut` was started and then aborted inside its `check:full`, before any LIVE step;
|
|
30
|
+
that is not a verdict, so the live MUST floor is unproven here. Also not run: the pre-commit
|
|
31
|
+
native acceptance (provider-instruction wire observation, warm/cold retention, the Codex
|
|
32
|
+
caller-seat cell), the second `check:full` before the push, and waiting for the prepared SHA's CI
|
|
33
|
+
qualification body before the candidate was packed. That CI run continues and its outcome is
|
|
34
|
+
recorded with the release; a red result is new scope. Antigravity criterion 7 stays NOT
|
|
35
|
+
CERTIFIED. VERIFY's release floor is unchanged — this is not a standing waiver.
|
|
36
|
+
|
|
37
|
+
### Changed
|
|
38
|
+
|
|
39
|
+
- **Pi SDK 1.1.0 (#132).** The nine exact production SDK members move to `1.1.0` and the
|
|
40
|
+
pi-durable carrier pin to upstream `v1.1.0` (`abe508e`); the emitter's `--check` reproduces the
|
|
41
|
+
existing carrier bytes at that commit, so only the pin's tag/commit/SDK set change. The supported
|
|
42
|
+
ordinary Pi host range follows the pin to `>=1.1.0 <1.2`. The installed-consumer previous-host
|
|
43
|
+
control moves from a real pi 1.0.2 to 1.0.4 — the immediately prior generation is now the refused
|
|
44
|
+
host — while the L3/L4 mixed and depth-3 controls keep their real 1.0.3 packages.
|
|
45
|
+
- **A cut runs its qualification body once, at the prepared SHA (#132, #133).** `release-gate` no
|
|
46
|
+
longer runs a local `check-gate-qualification` body; the release's one body is the exact-SHA CI
|
|
47
|
+
step at the prepared SHA, which the release oracle already required. The scheduling assertion now
|
|
48
|
+
keeps `release-gate` at zero invocations and its mutant plants the call back. The development rule
|
|
49
|
+
of one local run when a gate or mutant changes is unchanged; retiring it stays with #133. For this
|
|
50
|
+
cut alone GLG granted two exceptions: the policy commit rides the prepared push without its own
|
|
51
|
+
pre-version CI, and its local whole body was replaced by its affected 22-mutant partial run.
|
|
52
|
+
|
|
53
|
+
## 0.32.0 - 2026-10-08
|
|
54
|
+
|
|
55
|
+
### Added
|
|
56
|
+
|
|
57
|
+
- **One npm installation unit for native `pi-durable` (#130).** The package
|
|
58
|
+
supplies the omitted experimental app/TUI as a pinned Pi1.0.4 carrier, with the
|
|
59
|
+
declared contact overlay, deterministic emit/import relocation, MIT license
|
|
60
|
+
and rebuild contract. Nine exact published SDK dependencies supply the native
|
|
61
|
+
library set. The operator no longer clones, patches or builds a separate
|
|
62
|
+
fixed-XDG source runtime; there is no old-route fallback, downloader or repair.
|
|
63
|
+
Native runtime/TUI/models/auth/queues/SQLite/transcripts/recovery remain upstream-owned.
|
|
64
|
+
- **One explicit native extension ingress.** `--native-module <absolute file>`
|
|
65
|
+
loads ordinary ESM, including top-level await, before TUI/runtime imports;
|
|
66
|
+
its default native durable Extension is installed by reference after the
|
|
67
|
+
contact. Reserved extension/contact names and identity/cwd changes refuse by
|
|
68
|
+
name. These are trusted-code mistake guards, not a sandbox or rollback. No
|
|
69
|
+
ambient discovery, classic ExtensionAPI shim, persistent module profile or
|
|
70
|
+
fresh-call propagation. Synthetic node:* development fixtures prove the
|
|
71
|
+
contact, module tool and native bash child; real dotenv policy stays downstream
|
|
72
|
+
in agent-config after release.
|
|
73
|
+
|
|
74
|
+
### Changed
|
|
75
|
+
|
|
76
|
+
- **Pi host floor and native SDK set are separate subjects.** Host CLI range is
|
|
77
|
+
`>=1.0.4 <1.1`; native SDK members are exact1.0.4 production dependencies,
|
|
78
|
+
with `proper-lockfile`4.1.2. The installed verifier walks reachable physical
|
|
79
|
+
member edges by name/version, allows coherent sharing and cycles, and refuses
|
|
80
|
+
incomplete, drifted or mixed-version supply even when imports work.
|
|
81
|
+
- **Known ordinary-Pi manifest warning retained.** The host warns that its
|
|
82
|
+
extension packages belong in peer dependencies; the exact installed SDK copies
|
|
83
|
+
intentionally serve the separate native process. GLG accepted this manifest
|
|
84
|
+
constraint for0.32, not a universal harmlessness or peer-contract certification.
|
|
85
|
+
|
|
86
|
+
### Fixed
|
|
87
|
+
|
|
88
|
+
- **Qualification preserves prior-run evidence.** Retire the ambient dead-pid /
|
|
89
|
+
prefix sweep and its marker-based authority. Full/group execution share only
|
|
90
|
+
invocation-owned snapshot creation/teardown; prior names and bytes survive
|
|
91
|
+
green, red and collection fixture cases. No replacement GC or cleanup manager.
|
|
92
|
+
Repair the malformed-carrier oracle's discriminator and run the actual rebuilt
|
|
93
|
+
verifier inside its own copied package so the READ-ONLY mutant cannot contaminate
|
|
94
|
+
the checkout. The production refusal and read-only contracts remain unchanged.
|
|
95
|
+
- **Installed-gate host fixtures keep their SDK generation closed.** Derive the
|
|
96
|
+
aligned host's complete exact SDK roots from the owning pin, and the same
|
|
97
|
+
member names at1.0.2 for the previous-host control. The first prepared CI's
|
|
98
|
+
coinstalled host tried pi-ai1.1.0 and received npm404 through its caret edges;
|
|
99
|
+
its RED is preserved. Product pins/overrides and native assertions are unchanged.
|
|
100
|
+
- **Fresh-call tool description fits the existing host cap.** One clause was
|
|
101
|
+
shortened from2068 to2021 characters; callable schema, cap2048, named refusals
|
|
102
|
+
and the installed-carrier contract are unchanged.
|
|
103
|
+
|
|
104
|
+
### Verification and evidence boundaries
|
|
105
|
+
|
|
106
|
+
- **Frozen source/native candidate:** `b220b20c1b95f0ecafe8e679668bda3c5678be81`
|
|
107
|
+
accepted FULL716s/exit0, all898 committed mutant IDs exactly once KILLED,
|
|
108
|
+
178 green controls, unchanged origin, MUST25/0/0 and BEHAVIOR1/0/0/cutOK.
|
|
109
|
+
Explicit installed `check-pack-install` passed separately; FULL/aggregate do
|
|
110
|
+
not contain that gate or the container gate. Saved official Codex65/Pi-durable36
|
|
111
|
+
snapshots were independently rejudged through their shipped receipt oracles.
|
|
112
|
+
[Owning #130 receipt](https://github.com/junghan0611/entwurf/issues/130#issuecomment-6043744944).
|
|
113
|
+
- **Pre-version landing:** main `78c917ae2dbec01281c41287db14ed8d008a3c82`,
|
|
114
|
+
[push CI37679372365](https://github.com/junghan0611/entwurf/actions/runs/37679372365),
|
|
115
|
+
all four required jobs plus qualification BODY success, exact898/898 KILLED,
|
|
116
|
+
controls178green/origin unchanged and Linux artifact-consumer exit0. Its
|
|
117
|
+
temporary tarball retained package version0.31.0; it is neither the published
|
|
118
|
+
0.31.0 artifact nor a preserved accepted0.32 candidate.
|
|
119
|
+
- **Independent pre-prepare consistency review:** Grok Blocker0/Defect2; the
|
|
120
|
+
two stale pending underclaims were corrected as prose, not a gate restart.
|
|
121
|
+
GLG explicitly approved version metadata preparation, new prepared-SHA CI and
|
|
122
|
+
one preserved exact artifact without repeating local FULL/LIVE for documentation
|
|
123
|
+
changes. Source/native receipts retain their original fingerprints; prepared-SHA
|
|
124
|
+
qualification, versioned artifact and registry equality remain independent
|
|
125
|
+
evidence. This preparation text does not assert a tag, GitHub release or npm publish.
|
|
126
|
+
- **Historical RED retained.** R3 aggregate remains RED despite FULL714s/exit0.
|
|
127
|
+
Its protected36MB snapshot was irreversibly deleted by the retired sweep;
|
|
128
|
+
wider deletion extent and the vendor `-32603` cause remain unknown. Original
|
|
129
|
+
raw/confirmation/review erratum are preserved. Prior-run preservation is a
|
|
130
|
+
private-fixture proof: r4 had no prior root in actual tmp, so no in-situ claim.
|
|
131
|
+
Original0.31 release/tag/artifact/archive are immutable. Native agy1.2 remains
|
|
132
|
+
NOT CERTIFIED and its historical1.1 pin is unchanged; no new native agy acceptance
|
|
133
|
+
or permanent exception is inferred.
|
|
134
|
+
|
|
7
135
|
## 0.31.0 - 2026-10-07
|
|
8
136
|
|
|
9
137
|
### 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,24 +27,23 @@ Claude and Cortex Code are ACP backends. Codex and Antigravity stay native so th
|
|
|
27
27
|
retain their own tools and work context. Capabilities differ by rail: a shipped
|
|
28
28
|
citizen is not a promise of every lifecycle operation.
|
|
29
29
|
|
|
30
|
-
**
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
release/artifact acceptance is separate. The
|
|
36
|
-
[installation requirements](#optional-native-durable--0310) differ from installing
|
|
37
|
-
the ordinary Pi CLI.
|
|
30
|
+
> **Current release: [0.32.0](https://github.com/junghan0611/entwurf/releases/tag/v0.32.0)**
|
|
31
|
+
> ([`80d66f4`](https://github.com/junghan0611/entwurf/commit/80d66f4ca66f0be674b2d2bfbe20c49717c0340e)).
|
|
32
|
+
> Includes the pinned Pi 1.0.4 native durable app/TUI and one explicit native-module ingress.
|
|
33
|
+
> npm publication and registry byte equality are [verified](https://github.com/junghan0611/entwurf/issues/130#issuecomment-6049936030).
|
|
34
|
+
> Release history and detailed evidence belong in [CHANGELOG](./CHANGELOG.md).
|
|
38
35
|
|
|
39
36
|
## Install
|
|
40
37
|
|
|
41
|
-
**Choose by where you work.
|
|
38
|
+
**Choose by where you work. Bring your own harnesses, subscriptions and login.**
|
|
39
|
+
The native durable route below additionally supplies the upstream app/TUI missing from its npm
|
|
40
|
+
release; it does not supply credentials or take ownership of the harness.
|
|
42
41
|
|
|
43
42
|
### Direct — ordinary shell or tmux
|
|
44
43
|
|
|
45
44
|
Prerequisites: **Node >=24.0.0**, Python 3 for `setup`, and any harnesses you choose
|
|
46
45
|
to use, already installed and authenticated. Pi is optional-by-presence, supported
|
|
47
|
-
range `>=1.0
|
|
46
|
+
range `>=1.1.0 <1.2`; Claude Code supported floor `>=2.1.217` is required for its
|
|
48
47
|
managed exec-hook lifecycle. pnpm is needed only for source-checkout setup.
|
|
49
48
|
|
|
50
49
|
```bash
|
|
@@ -72,33 +71,28 @@ Detected harness wiring on Darwin can therefore be written while setup stays
|
|
|
72
71
|
non-green. Native Windows is **UNSUPPORTED**. The package has no npm `os`
|
|
73
72
|
restriction; that is not certification of every platform's harness rails.
|
|
74
73
|
|
|
75
|
-
###
|
|
74
|
+
### Native durable (pi-durable)
|
|
76
75
|
|
|
77
|
-
**
|
|
78
|
-
|
|
76
|
+
**The package supplies the pinned upstream app/TUI and nine exact Pi 1.1.0 SDK
|
|
77
|
+
members.** No separate runtime checkout, patch, build or ordinary Pi CLI is needed.
|
|
78
|
+
The launch verifies carrier integrity and every reachable SDK edge's name/version;
|
|
79
|
+
incomplete, drifted or mixed supply refuses by name.
|
|
79
80
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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.
|
|
99
|
-
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.
|
|
81
|
+
```bash
|
|
82
|
+
entwurf pi-durable --provider <provider> --model <model-id> --width task-wide
|
|
83
|
+
entwurf pi-durable --continue
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
The contact adds garden identity and two-way mailbox communication. Runtime/TUI,
|
|
87
|
+
models/auth, queues, SQLite, transcripts and recovery remain upstream-owned:
|
|
88
|
+
[Hard Rule 17](./AGENTS.md#hard-rules), **supply the missing surface; do not become the harness**.
|
|
89
|
+
|
|
90
|
+
Optional `--native-module <absolute file>` initializes trusted ESM before runtime/TUI
|
|
91
|
+
imports, then installs its default native Extension after the contact. No automatic
|
|
92
|
+
module discovery or classic Pi API shim; guards are not a sandbox or rollback.
|
|
93
|
+
Ordinary Pi's known `peerDependencies` warning reflects the separate native SDK supply.
|
|
94
|
+
[Native setup](./docs/setup-clean-host.md#2b-optional-native-durable-pi-durable)
|
|
95
|
+
owns flags, refusals and the extension contract.
|
|
102
96
|
|
|
103
97
|
### Herdr workbench
|
|
104
98
|
|
|
@@ -106,13 +100,11 @@ Pi-upgrade, ACP and UI follow-ups.
|
|
|
106
100
|
herdr plugin install junghan0611/entwurf/plugins/herdr --yes
|
|
107
101
|
```
|
|
108
102
|
|
|
109
|
-
This
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
[Herdr
|
|
113
|
-
|
|
114
|
-
The plugin does not own delivery or the Herdr launch rail; a direct-installed
|
|
115
|
-
citizen inside Herdr selects that rail from its own process context too.
|
|
103
|
+
This separate path activates Herdr-integrated **pi and Claude Code** with an
|
|
104
|
+
independently locked runtime and an observation pane; it puts no Entwurf bins on PATH.
|
|
105
|
+
An Entwurf release does not automatically re-pin that runtime.
|
|
106
|
+
[Herdr guide](./plugins/herdr/README.md) owns install, use, evidence and removal;
|
|
107
|
+
the plugin does not own delivery or the Herdr launch rail.
|
|
116
108
|
|
|
117
109
|
### Garden launcher
|
|
118
110
|
|
|
@@ -169,9 +161,9 @@ Liveness is read at dispatch time; an id's shape does not tell you its transport
|
|
|
169
161
|
| Reopen a dormant pi citizen under its own id | `entwurf_resume_call {target}` | Separate LAUNCH and socket OBSERVATION receipts; no turn is run |
|
|
170
162
|
|
|
171
163
|
**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
|
|
164
|
+
control socket; an armed self-fetch citizen (Claude Code, Copilot, OMP, pi-durable)
|
|
165
|
+
through its mailbox; a probe-alive native-push citizen (Antigravity, Codex) through
|
|
166
|
+
its native conversation/thread. Dormant pi, undeliverable mailboxes, dead/indeterminate native
|
|
175
167
|
push and record-less sockets reject honestly. Only control-socket dispatch takes
|
|
176
168
|
the per-target lock; the other rails use their own deliverability/probe evidence.
|
|
177
169
|
|
|
@@ -185,9 +177,10 @@ is a live rail fact, not merely a consequence of trusted identity.
|
|
|
185
177
|
|
|
186
178
|
**Mux launches; it never delivers.** Inside Herdr, fresh opens a new unfocused tab
|
|
187
179
|
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
|
-
|
|
180
|
+
it opens pi/pi-durable/Claude Code/Copilot/OMP/Codex visibly on the caller's own tmux
|
|
181
|
+
server. pi-durable runs the installed carrier on its exact SDK set described above and
|
|
182
|
+
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
|
|
183
|
+
absolute directory, omitted or empty means the caller's cwd. Optional `placement.tmuxSession` names an existing
|
|
191
184
|
tmux session (not permitted inside Herdr), never a new session or a cwd lookup.
|
|
192
185
|
Omitted tmux placement follows the caller: Codex beside its own TUI pane matched
|
|
193
186
|
by thread-id, everyone else in their own session. Missing/ambiguous context refuses.
|
|
@@ -197,74 +190,26 @@ a live or non-pi target refuses, and an unobserved window stays visible without
|
|
|
197
190
|
Exact boundaries: [tmux launch](https://github.com/junghan0611/entwurf/blob/main/docs/mux-launch-rail.md)
|
|
198
191
|
and [Herdr launch](https://github.com/junghan0611/entwurf/blob/main/docs/herdr-launch-rail.md).
|
|
199
192
|
|
|
200
|
-
##
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
(
|
|
219
|
-
|
|
220
|
-
compiled bridge after record birth, under the citizen's identity, and Pi supervises
|
|
221
|
-
that MCP child. **MCP is ingress; pi receive remains the record-addressed Unix
|
|
222
|
-
control socket.** Garden identity and dispatch stay Entwurf's. That 0.30.0 cut
|
|
223
|
-
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
|
|
225
|
-
harness-internal capability, not another garden citizen. The 0.30.0 follow-up
|
|
226
|
-
separately measured Herdr supply 0.9.3 and
|
|
227
|
-
re-pinned the plugin runtime to published npm 0.30.0 with manifest 0.30.0; its
|
|
228
|
-
public consumer and CI receipts live in the #126 thread. That dated alignment is
|
|
229
|
-
not a permanent version-equality rule. 0.30.1 is published (npm, 2026-10-04); at its tag the
|
|
230
|
-
plugin's runtime lock is still the closed `herdr-checkout` verification carrier. Publication did
|
|
231
|
-
not re-pin it: the measured npm re-pin and its source-specific proof are separate, still-open
|
|
232
|
-
work that the [plugin source contract](./plugins/herdr/README.md) owns.
|
|
233
|
-
|
|
234
|
-
Entwurf is the 0.12+ successor to
|
|
235
|
-
[`@junghanacs/pi-shell-acp`](https://www.npmjs.com/package/@junghanacs/pi-shell-acp):
|
|
236
|
-
the work was renamed around the dispatch substrate rather than the pi adapter.
|
|
237
|
-
The pre-0.12 [two-pane demo](./demo/README.md) is **archived evidence**, including
|
|
238
|
-
retired resume behaviour, not current instructions. [CHANGELOG](./CHANGELOG.md)
|
|
239
|
-
keeps the release history; dated Codex topology and qualification receipts remain
|
|
240
|
-
in [DELIVERY](./DELIVERY.md) and [BASELINE](./BASELINE.md), not rewritten as today's acceptance.
|
|
241
|
-
|
|
242
|
-
## Detailed operation
|
|
243
|
-
|
|
244
|
-
### Settings
|
|
245
|
-
|
|
246
|
-
[Setup — settings and backend-specific keys](./docs/setup-clean-host.md#settings-reference-and-backend-specific-keys)
|
|
247
|
-
owns configuration, including billing-safe carrier choices and pi-versus-backend keys.
|
|
248
|
-
|
|
249
|
-
### External MCP registration
|
|
250
|
-
|
|
251
|
-
[Setup — external hosts](./docs/setup-clean-host.md#stable-bins-and-external-mcp-hosts)
|
|
252
|
-
and [manual wiring](./docs/external-mcp-host.md) own paths, env and identity prerequisites.
|
|
253
|
-
|
|
254
|
-
### Custom skills
|
|
255
|
-
|
|
256
|
-
[Setup — custom skills](./docs/setup-clean-host.md#custom-skills) owns the Claude ACP
|
|
257
|
-
plugin layout and validation; other harnesses keep their native skill mechanisms.
|
|
258
|
-
|
|
259
|
-
### Context carriers
|
|
260
|
-
|
|
261
|
-
[Setup — carriers](./docs/setup-clean-host.md#context-carriers) separates short
|
|
262
|
-
engraving from the rich first-user augment and the actual callable schema.
|
|
263
|
-
|
|
264
|
-
### Compaction policy
|
|
265
|
-
|
|
266
|
-
[Setup — reuse and compaction](./docs/setup-clean-host.md#session-reuse-and-compaction):
|
|
267
|
-
Entwurf does not implement backend compaction or hydrate another harness's transcript.
|
|
193
|
+
## Concepts
|
|
194
|
+
|
|
195
|
+
**Entwurf** (기투, projection-of-self) connects independent visible siblings;
|
|
196
|
+
**garden id** names a record-backed citizen, not its pane or native transcript.
|
|
197
|
+
[FAQ](./FAQ.md) explains ACP, MCP and context carriers.
|
|
198
|
+
|
|
199
|
+
## Pi integration
|
|
200
|
+
|
|
201
|
+
The pi adapter registers the compiled bridge with Pi's built-in MCP after record
|
|
202
|
+
birth; Pi supervises the MCP child. **MCP is ingress; pi receive remains the
|
|
203
|
+
record-addressed Unix control socket.** Garden identity and dispatch stay Entwurf's.
|
|
204
|
+
Codemode is harness-internal, not another garden citizen.
|
|
205
|
+
|
|
206
|
+
## Operation guides
|
|
207
|
+
|
|
208
|
+
- [Settings and backend keys](./docs/setup-clean-host.md#settings-reference-and-backend-specific-keys)
|
|
209
|
+
- [External MCP registration](./docs/setup-clean-host.md#stable-bins-and-external-mcp-hosts) · [manual wiring](./docs/external-mcp-host.md)
|
|
210
|
+
- [Custom skills](./docs/setup-clean-host.md#custom-skills)
|
|
211
|
+
- [Context carriers](./docs/setup-clean-host.md#context-carriers)
|
|
212
|
+
- [Reuse and compaction](./docs/setup-clean-host.md#session-reuse-and-compaction) — native harness-owned; no transcript hydration
|
|
268
213
|
|
|
269
214
|
## What this repo owns, and does not
|
|
270
215
|
|
package/VERIFY.md
CHANGED
|
@@ -86,12 +86,12 @@ that moved out of `scripts/` and into a file beside its subject would otherwise
|
|
|
86
86
|
### The canonical floor — two entry points
|
|
87
87
|
|
|
88
88
|
- **Deterministic floor — two tiers (#70):** `pnpm check` is the everyday CORE — toolchain (lint + typecheck), the vitest lanes, and the pure-unit / behavioral-contract / source-topology gates plus the cheap static coherence checks. It prints its own total wall time; acceptance is ≤60s on the reference host `oracle` (an operator measurement, never a hard wall-clock gate on arbitrary hosts). `pnpm run check:full` is the FULL deterministic floor — the core plus the hermetic-integration and package/install tiers — and is what the frozen-candidate protocol, push CI, release-gate, and `prepublishOnly` run. Exact membership is the named `check:*` group scripts in `package.json` (the executable SSOT — this document records meaning and principles, not the command list); a gate changes tier by semantic-class decision, never by getting faster or slower. One core member assumes a build output: the beside test `pi-extensions/entwurf-control.test.ts` (reached through `check-tests-beside-behavior`) registers the COMPILED bridge and refuses by name when it is absent. `prepare` normally builds it at install; after an `--ignore-scripts` install or a bridge source change, run `pnpm run build-bridge` (in the sandbox candidate when verifying one) before the core. The FULL tier carries the qualification HEAD (`check-gate-manifests`, through `check:hermetic`); the everyday core does not, and neither tier carries the separately scheduled mutant-executing body (`check-gate-qualification`).
|
|
89
|
-
- **Discriminating power of that floor:** `./run.sh check-gate-qualification` (scheduled, not ambient: standalone when a lane changes a gate/mutant/matrix, in the CI `check` job on a branch push that touched the qualification surface, and
|
|
89
|
+
- **Discriminating power of that floor:** `./run.sh check-gate-qualification` (scheduled, not ambient: standalone when a lane changes a gate/mutant/matrix, in the CI `check` job on a branch push that touched the qualification surface, and — for a cut — at the prepared SHA, where the exact-SHA release oracle requires that CI step (#132: `release-gate` no longer runs a second, local BODY; this moves only the release-mode owner — the development rule of one local run when a gate/mutant/matrix changes stays in force until #133 retires it, and the 0.33.0 cut skips it only by a one-cut exception) — no longer inside the default check chains; a semver TAG push triggers no CI at all, and the exact-SHA evidence a release quotes is whichever run at that commit CARRIES the body — the branch run when the push touched the qualification surface, else a dispatch run; a push that touched none of the qualification surface skips the body, and `workflow_dispatch -f qualify=true` plus a weekly `schedule` run it unconditionally — the exact-SHA release oracle refuses a SHA whose body step did not conclude success) re-plants committed defect mutants (`scripts/mutants/*.json`, one per closed defect class) in an isolated snapshot repo and requires each to turn its gate red **bounded and at its claimed `[QK:<claim>]` signature** — a wrong-reason red fails, a baseline-red control voids the whole group, and the runner is negative-controlled on every run (zero-match/multi-match/survived/wrong-reason/hang/control-red/impurity). This measures whether the deterministic gates still *block* what they claim to block; it is **not a new evidence level** (L0–L5 are untouched) and never substitutes for LIVE evidence. Per-cut records cite claim IDs + killed mutant IDs — "N checks passed" alone is not evidence. `check-agy-permission-matrix` complements it with the enumerated permission contract space (literal cells + stated exclusion rules, oracle independent of the SUT). The gate's HEAD is separable and IS in the floor: `check-gate-manifests` runs the runner self-test, validates the committed manifest set against the origin index, and asserts the declared lane inventory, while executing zero COMMITTED mutants (the self-test runs only its synthetic fixture mutants, in tmp fixture repos) and never snapshotting the repo — three of the five reds qualification has ever produced in CI died in that head, in under five seconds.
|
|
90
90
|
- **The snapshot is source-only (#125).** It replicates the git work surface and never copies an ignored artifact from the checkout. A gate that consumes an ignored build output — the compiled `entwurf-bridge` a pi citizen registers — declares it on each of its mutants (`"build": {"argv": [...], "output": "<dir>"}`, one declaration per gate group). For that group only, the runner builds the output from the snapshot's own bytes before the control, rebuilds it after every mutation and from the restored bytes before the post-control (which must reproduce the baseline digest), never counts a build red as a kill, voids a run whose gate writes into the output, and removes the output when the group ends. The runner self-test owns this as `[QK:QUALIFY-BUILD-*]`.
|
|
91
91
|
- **Live floor:** `LIVE=1 ./run.sh release-gate <scratch-project-dir> --cut` — `pnpm run check:full` + the v2-native live gates + the ACP plugin acceptance floor. It reports a **two-tier summary**:
|
|
92
|
-
- **MUST tier** (release-blocking — owns the exit code; "green" applies only here): `pnpm run check:full`, `
|
|
92
|
+
- **MUST tier** (release-blocking — owns the exit code; "green" applies only here): `pnpm run check:full`, `smoke-entwurf-v2-matrix-live`, `check-bridge`, `doctor-pi-provider` (#81 — `check-bridge` proves the launcher this checkout SHIPS; this proves the invocation the operator's pi provider actually EXECS, by booting it and requiring the entwurf verb set back, because `command -v` answers yes for a command that exits 127; wired as a step on 2026-08-19 after a relocated pnpm cmd-shim cost a cut sixteen LIVE steps before the same fact surfaced at `smoke-acp-bundled-mcp-live`), the resident-garden-guard zero-token half (record birth / record-keyed socket / attach-on-reopen), the `smoke-acp-*-live` ACP plugin smokes (socket-citizen / raw-turn / overlay / provider / session-reuse / carrier-augment / memory-containment / rgg / mcp / skill / bundled-mcp / v2-send), the axis wired in on 2026-07-31 that the aggregate had simply never listed (`smoke-claude-native-resume-live`), `smoke-entwurf-chain-live` — the cross-harness delivery chain (native Claude Code → pi GPT → pi ACP Sonnet → mailbox terminus) proving sender identity and replyability at every hop plus a real read receipt at the end — the integrated `smoke-mux-lifecycle-live` (its own note below), and the two OMP steps 0.16.0 wired: `smoke-omp-receive-live` (the addressed roundtrip into a live omp citizen; it reads the capability registry and decides its own outcome rather than passing by default) and `smoke-omp-fresh-live` (the clause 7 receipt the release stop now requires). (`smoke-session-id-name` is gone — #50 C3: its `--session-id`/`--name` substrate has no entwurf consumer anymore.)
|
|
93
93
|
- **BEHAVIOR tier** (advisory, non-blocking): the resident-garden-guard positive (a model-in-loop `entwurf_self` turn). A BEHAVIOR FAIL is surfaced with its artifact path but **never blocks the cut**. The lane holds what the model *chooses*, never what our wiring fails to deliver — a gate that TELLS the model which tool to call stays MUST, because its failure is ours — measured 2026-07-24, when the tool turned out to be absent from the session schema in both observed failures (the bundled-MCP readiness gap recorded in `scripts/smoke-acp-v2-send-live.ts`).
|
|
94
|
-
- **Every MUST step is invoked and reports its own outcome.** Prerequisite-bearing LIVE MUST steps ride the P1 STEP OUTCOME protocol (`scripts/lib/step-outcome.sh`): exit 0 = PASS, exit 97 = SKIP (a prerequisite the step does not have, printed as an `[entwurf:skip]` line), anything else = FAIL. The
|
|
94
|
+
- **Every MUST step is invoked and reports its own outcome.** Prerequisite-bearing LIVE MUST steps ride the P1 STEP OUTCOME protocol (`scripts/lib/step-outcome.sh`): exit 0 = PASS, exit 97 = SKIP (a prerequisite the step does not have, printed as an `[entwurf:skip]` line), anything else = FAIL. The non-skippable static step (`pnpm run check:full`) is inline: 0 = PASS, nonzero = FAIL, no SKIP arm — it has no prerequisite to decline. A skip is never counted as a pass — that hole is what let a cortex-less host read as cortex acceptance. Without `--cut` this is the unattended diagnostic: SKIPs are reported and the run still exits 0. **`--cut` makes it acceptance and any MUST SKIP is red**, which is how "a real cut needs `LIVE=1` with `SKIP=0`" stopped being prose. A green MUST gate is **necessary, not sufficient** — GLG authorizes the cut.
|
|
95
95
|
- **When cost-bearing MUST gates run (fixed 2026-07-23, the F6/F7 lesson):** a commit that touches a rail a MUST-tier live gate covers runs that gate **before cross-review is requested** — never parked behind "run it at approval time". Deferring a wired gate to a human decision is what let F6/F7 ship reviewed-and-approved; the wiring exists so the verdict never depends on who pressed enter. "배선이 없어 못 한 것은 OK, 배선이 있는데 안 돌린 것은 우리가 남긴 구멍이다." Model-in-loop cost is spent via the subscription-backed `entwurf` provider where the gate allows it, a free-tier native model otherwise; cost is a reason to pick the cheap target, not to skip the gate.
|
|
96
96
|
|
|
97
97
|
> **The herdr rail is an on-demand axis until it has run.** `smoke-herdr-fresh-call-live` opens a real caller inside a real herdr pane, has it invoke the PUBLIC `entwurf_fresh_call`, and reads the child's nonce callback — the one axis no deterministic gate reaches, since the rail is selected from the caller's own process environment. **The release aggregate does not yet require the herdr rail**: herdr is optional (a cut on a host without it must not block), and first evidence precedes promotion — a rail whose first acceptance run is days old has not earned a place in the gate that blocks every cut. Run it directly with `LIVE=1 ./run.sh smoke-herdr-fresh-call-live` whenever a cut changes herdr rail code, and promote it to a MUST only after the axis has a run history to point at. Without `LIVE=1`, or without herdr/pi/claude on PATH, it reports protocol SKIP — never a pass.
|
|
@@ -200,25 +200,44 @@ 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.4
|
|
231
|
+
binary (the previous generation) 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
|
|---|---|---|
|
|
221
|
-
| Source | `pnpm run check:full` + `./run.sh check-gate-qualification` | Does not prove an installed consumer. |
|
|
240
|
+
| Source | `pnpm run check:full` + the prepared SHA's CI `./run.sh check-gate-qualification` step | Does not prove an installed consumer. |
|
|
222
241
|
| Packed install | `check-pack-install` | Real tarball, but checkout-visible. |
|
|
223
242
|
| Linux artifact consumer | required `check-install-container` CI job against one preserved candidate | Fixtures prove package/oracle shape, not a real Claude lifecycle. |
|
|
224
243
|
| Exact release commit | all required CI jobs green, and the `check` job's qualification body step concluded success, at the exact SHA | A different green SHA is not transferable evidence. |
|
|
@@ -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.1.0 <1.2`) is on PATH; absent pi is an explicit zero-state SKIP, a below-floor pi is a detected FAIL. The user-scope entry is owner-recorded (#86 C2): another root's live-or-missing ownership makes this step a zero-write refusal (setup: pi FAIL) that names `takeover-user-scope`; the install-states bind the exact managed settings path (a drifted/symlinked/corrupt target is a zero-write refusal) and the inverse removes only the recorded owner's exact entry; `doctor-pi-package` reports the verdict
|
|
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
|
|
@@ -463,7 +482,7 @@ Pass: user/assistant turns accumulate normally; the transcript is not broken/emp
|
|
|
463
482
|
|
|
464
483
|
The minimum passing bar:
|
|
465
484
|
|
|
466
|
-
1. **Deterministic floor green:** `pnpm run check:full` passes (the core tier plus the hermetic-integration and package/install tiers, incl. `check-pack`), plus
|
|
485
|
+
1. **Deterministic floor green:** `pnpm run check:full` passes (the core tier plus the hermetic-integration and package/install tiers, incl. `check-pack`), plus the `./run.sh check-gate-qualification` step green in the exact-SHA CI run of the same prepared candidate (criterion 2's run).
|
|
467
486
|
2. **All four required CI jobs green on the exact release commit:** `check`, `install-surface`, the required Linux `artifact-consumer`, and `macos-install-surface` — promoted from non-voting to required in 0.20.0 (see the release acceptance axes table above for what its green run does and does not certify); preserve the Linux artifact-consumer's tarball digest and image identity. A macOS runner failure now blocks the cut like any other required job.
|
|
468
487
|
3. **Live floor MUST green:** `LIVE=1 ./run.sh release-gate <dir> --cut` exits 0 reporting `MUST PASS=N FAIL=0 SKIP=0`; with `--cut` a single SKIP is red, so the exit code itself now carries this condition. A BEHAVIOR FAIL is advisory, not blocking.
|
|
469
488
|
4. **Native-host doctor green where the Claude meta-bridge is claimed:** a new post-install Claude session exists, live evidence is present, and the installed `doctor-meta-bridge` exits 0. `NOT CERTIFIED` is a release failure for that host, not a skip.
|
package/demo/README.md
CHANGED
|
@@ -142,7 +142,7 @@ SCENE_DELAY=30 FINAL_PAUSE=10 bash demo.sh
|
|
|
142
142
|
|
|
143
143
|
## Prerequisites
|
|
144
144
|
|
|
145
|
-
- `pi` on PATH (current floor 1.0
|
|
145
|
+
- `pi` on PATH (current floor 1.1.0)
|
|
146
146
|
- `entwurf` provider configured + auth ready for the selected sender/peer models
|
|
147
147
|
- `asciinema` installed
|
|
148
148
|
- `agg` installed (optional — only for GIF conversion)
|
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.1.0`, host `>=1.1.0 <1.2` | **exact** oracle + **closed range** | the SDK set this checkout builds, gates and (since #130) ships as exact production dependencies; an ordinary Pi host inside the range is accepted, and the ceiling moves only on measurement. Unshipped candidate: #132's 1.1.0 move (ROADMAP's 2026-10-08 bump entry) has its own acceptance still owed. Historical: the published 0.32.0 ships SDK exact 1.0.4 with the next-minor ceiling (ROADMAP's 2026-10-07 bump entry), and 0.31.0 declared the earlier peer floor 1.0.2 |
|
|
138
138
|
| ACP wire SDK | `@agentclientprotocol/sdk 1.6.0` | **exact** | the shared wire oracle both adapters speak |
|
|
139
139
|
| Claude ACP adapter | `@agentclientprotocol/claude-agent-acp 0.85.1` | **exact**, bundled | checkout candidate; resolved before any PATH fallback; declaration is not compatibility evidence |
|
|
140
140
|
| Claude Agent SDK | `0.3.286` (transitive) | **exact** oracle | the runtime risk surface behind the adapter |
|