@junghanacs/entwurf 0.13.0 → 0.13.1
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 +5 -3
- package/BASELINE.md +57 -203
- package/CHANGELOG.md +19 -0
- package/CONTRIBUTING.md +1 -1
- package/DELIVERY.md +117 -261
- package/README.md +68 -408
- package/VERIFY.md +58 -87
- package/demo/README.md +1 -1
- package/docs/acp-backend-rail.md +231 -0
- package/docs/external-mcp-host.md +132 -0
- package/docs/fresh-cut-policy.md +99 -0
- package/docs/setup-clean-host.md +123 -328
- package/mcp/entwurf-bridge/dist/mcp/entwurf-bridge/src/index.js +21 -48
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/acp-client.js +12 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/backend-adapter.js +11 -10
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/config.js +1 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/engraving.js +42 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/models.js +4 -4
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/overlay.js +3 -3
- package/mcp/entwurf-bridge/src/index.ts +21 -48
- package/package.json +12 -9
- package/pi-extensions/entwurf-control.ts +20 -49
- package/pi-extensions/lib/acp/acp-client.ts +22 -0
- package/pi-extensions/lib/acp/augment.ts +42 -3
- package/pi-extensions/lib/acp/backend-adapter.ts +12 -11
- package/pi-extensions/lib/acp/backend.ts +305 -36
- package/pi-extensions/lib/acp/config.ts +1 -1
- package/pi-extensions/lib/acp/engraving.ts +43 -1
- package/pi-extensions/lib/acp/event-mapper.ts +16 -13
- package/pi-extensions/lib/acp/models.ts +4 -4
- package/pi-extensions/lib/acp/overlay.ts +3 -3
- package/prompts/engraving.md +13 -5
- package/run.sh +244 -108
- package/scripts/check-acp-carrier-augment.ts +246 -10
- package/scripts/check-acp-cortex.ts +5 -5
- package/scripts/check-acp-prompt-lifecycle.ts +565 -0
- package/scripts/check-acp-sdk-surface.ts +60 -21
- package/scripts/check-acp-stop-reason.ts +342 -0
- package/scripts/check-entwurf-v2-surface.ts +41 -0
- package/scripts/check-gate-qualification.ts +6 -3
- package/scripts/check-probe-ordering.ts +39 -7
- package/scripts/check-release-gate-outcomes.ts +332 -0
- package/scripts/lib/live-skip.ts +33 -0
- package/scripts/lib/probe-acp-turn.ts +33 -12
- package/scripts/lib/step-outcome.sh +88 -0
- package/scripts/mutants/acp-augment.json +106 -0
- package/scripts/mutants/acp-cortex.json +2 -2
- package/scripts/mutants/acp-prompt-lifecycle.json +100 -0
- package/scripts/mutants/acp-stop-reason.json +80 -0
- package/scripts/mutants/probe-ordering.json +27 -5
- package/scripts/mutants/release-gate.json +105 -0
- package/scripts/mutants/v2-surface.json +26 -15
- package/scripts/smoke-acp-bundled-mcp-live.ts +4 -3
- package/scripts/smoke-acp-carrier-augment-live.ts +2 -2
- package/scripts/smoke-acp-cortex-live.ts +8 -14
- package/scripts/smoke-acp-long-turn-live.ts +185 -0
- package/scripts/smoke-acp-mcp-live.ts +2 -2
- package/scripts/smoke-acp-memory-containment-live.ts +2 -2
- package/scripts/smoke-acp-ordering-probe-live.ts +2 -2
- package/scripts/smoke-acp-overlay-live.ts +2 -2
- package/scripts/smoke-acp-provider-live.ts +2 -2
- package/scripts/smoke-acp-raw-turn-live.ts +3 -3
- package/scripts/smoke-acp-session-reuse-live.ts +2 -2
- package/scripts/smoke-acp-skill-live.ts +2 -2
- package/scripts/smoke-acp-socket-citizen-live.ts +4 -3
- package/scripts/smoke-acp-v2-send-live.ts +4 -3
- package/scripts/smoke-agy-native-push-live.ts +4 -3
- package/scripts/smoke-claude-native-resume-live.sh +13 -3
- package/scripts/smoke-entwurf-chain-live.ts +352 -0
- package/scripts/smoke-entwurf-v2-matrix-live.ts +2 -2
- package/scripts/smoke-entwurf-v2-spawn-resume-live.ts +2 -4
- package/scripts/smoke-meta-install-state.sh +4 -0
package/AGENTS.md
CHANGED
|
@@ -64,7 +64,9 @@ Detailed incident histories belong in CHANGELOG/issues/BASELINE and source-adjac
|
|
|
64
64
|
- The common turn sequence stays backend-invariant: spawn → initialize → newSession → enforceModel → prompt → event map.
|
|
65
65
|
- Rich operator/project context rides the **first user message augment**, not a large system prompt. The actual callable schema is the tool truth; prose never grants a tool.
|
|
66
66
|
- A backend may have no carrier or use launch-time model pinning; those asymmetries stay inside its adapter.
|
|
67
|
-
-
|
|
67
|
+
- A streaming assistant message starts `pending`. ACP terminal reasons are mapped explicitly; refusal, exhausted turn budget, unknown, or absent reasons end as errors, and the raw reason is preserved. Never restore a default-to-success branch.
|
|
68
|
+
- Bootstrap steps carry wall-clock bounds; a running prompt does not. A turn ends only when the agent answers, the operator aborts (ACP `session/cancel` first, bounded cleanup after), or the child dies. Elapsed time is not evidence, and a prompt-phase failure we author must never read as transient to pi's retry classifier — a cutoff plus blind retry replays the whole prompt from cold.
|
|
69
|
+
- Claude is the reference adapter. Cortex is the second landed adapter (0.13.0): session-scoped dual-HOME containment, overlay-private `mcp.json` projection (its ACP server ignores the wire `mcpServers` param), `CORTEX_HOME` presence refusal, per-turn set-model. Current contract: `docs/acp-backend-rail.md` “Cortex Code audit (D1–D10)”.
|
|
68
70
|
- entwurf never supplies, copies, proxies, decrypts, or bypasses vendor credentials/subscriptions. It uses the operator's existing local authenticated backend.
|
|
69
71
|
|
|
70
72
|
## Citizen Identity and Dispatch
|
|
@@ -110,7 +112,7 @@ pnpm check
|
|
|
110
112
|
./run.sh check-install-surface
|
|
111
113
|
./run.sh check-install-container # require Docker in release acceptance
|
|
112
114
|
|
|
113
|
-
LIVE=1 ./run.sh release-gate /path/to/scratch
|
|
115
|
+
LIVE=1 ./run.sh release-gate /path/to/scratch --cut
|
|
114
116
|
LIVE=1 ./run.sh smoke-acp-socket-citizen-live
|
|
115
117
|
LIVE=1 ./run.sh smoke-acp-bundled-mcp-live
|
|
116
118
|
LIVE=1 ./run.sh smoke-acp-v2-send-live
|
|
@@ -146,7 +148,7 @@ LIVE=1 AGY_CONVERSATION_ID=<id> ./run.sh smoke-agy-native-push-live
|
|
|
146
148
|
- Every `.ts` file belongs to one typecheck fence: root emit-capable config, MCP strip-types config, or scripts strip-types config. Do not hide files with `exclude`.
|
|
147
149
|
- Root pi extensions import TypeBox through `@earendil-works/pi-ai`; do not mix direct `@sinclair/typebox` types.
|
|
148
150
|
- MCP/scripts use explicit `.ts` imports where Node strip-types requires them. Installed operator surfaces route to compiled JS.
|
|
149
|
-
- pi runtime range is `>=0.
|
|
151
|
+
- pi runtime range is `>=0.83.0 <0.84` with devDep exact `0.83.0`; re-evaluate loader aliases and `/compat` at the minor ceiling. Re-measured at the 0.82.1→0.83.0 move: `packages/coding-agent/src/core/extensions/loader.ts` and `packages/ai/src/compat.ts` are byte-identical across the two tags, so the ceiling moved on measurement, not assumption.
|
|
150
152
|
- ACP pins are recorded in `package.json` and checked by `check-dep-versions`/`check-acp-sdk-surface`; do not describe a dependency bump as a behavioral fix without evidence.
|
|
151
153
|
|
|
152
154
|
## Working Style
|
package/BASELINE.md
CHANGED
|
@@ -6,32 +6,43 @@ silently drifted into a different identity / context surface. Questions
|
|
|
6
6
|
are deliberately open-ended — they probe what the agent actually sees,
|
|
7
7
|
not what it was told to claim.
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
has a separate citizen/round-trip baseline below instead of being forced into Claude's
|
|
17
|
-
overlay questions. Codex (pi-native / delivery probe) and Gemini (historical non-goal
|
|
18
|
-
ACP probe) remain reference axes, not a shipped ACP baseline.
|
|
19
|
-
|
|
20
|
-
## Release-host baseline — #51 repair cut
|
|
9
|
+
Claude is the reference ACP backend. Cortex Code has a separate compact baseline
|
|
10
|
+
because it has no system-prompt carrier and keeps its own native tool surface.
|
|
11
|
+
Antigravity (`agy`) is a native-push citizen rather than an ACP backend and therefore
|
|
12
|
+
has a separate citizen/round-trip baseline. Historical Codex/Gemini probes are not
|
|
13
|
+
part of this operator interview.
|
|
14
|
+
|
|
15
|
+
## Release-host baseline
|
|
21
16
|
|
|
22
17
|
This table is the operator-facing support/certification view. It complements the
|
|
23
18
|
model interview below; a persuasive answer from the model cannot turn an unmeasured
|
|
24
|
-
host into a certified one.
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
|
29
|
-
|
|
30
|
-
|
|
|
31
|
-
|
|
|
32
|
-
|
|
|
33
|
-
|
|
|
34
|
-
|
|
|
19
|
+
host into a certified one. Verdicts are one of **certified** (a real host ran the
|
|
20
|
+
installed doctor green), **shape-only** (gates model the package, no live host),
|
|
21
|
+
or **unverified**.
|
|
22
|
+
|
|
23
|
+
| Surface | Verdict | Evidence |
|
|
24
|
+
|---|---|---|
|
|
25
|
+
| Node 24 Linux package consumer | shape-only | Required `artifact-consumer` CI |
|
|
26
|
+
| Claude Code >=2.1.217 exec form | **certified** — supported floor | Topology + floor gates, doctor oracle; B2 live NixOS session |
|
|
27
|
+
| Claude Code 2.1.138 | **unsupported** | Launcher refuses empty argv; no shell-form fallback |
|
|
28
|
+
| Maintainer NixOS installed package | **certified** for `0.12.8-repair.1` | 2026-07-25 registry install → doctor exit 0 (HISTORY) |
|
|
29
|
+
| Secondary Ubuntu installed package | **certified** for `0.12.8-repair.1` | 2026-07-25 same artifact, isolated agent dir → doctor exit 0 (HISTORY) |
|
|
30
|
+
| macOS Claude meta-bridge | unverified | Installer refuses Darwin; no `/proc` live join |
|
|
31
|
+
| WSL2 / Windows | unverified | None |
|
|
32
|
+
|
|
33
|
+
Notes the table cannot carry without becoming prose again:
|
|
34
|
+
|
|
35
|
+
- **shape-only is not a live proof.** The `artifact-consumer` job verifies a read-only
|
|
36
|
+
candidate `.tgz`, checkout-invisible non-root global install, PATH shims, a frozen
|
|
37
|
+
package root, the path+sha256 regular-file fence, and a strict doctor fixture. Its
|
|
38
|
+
planted Claude cache/owner/bridge are synthetic — no real Claude lifecycle runs there.
|
|
39
|
+
- **Both certified hosts are certified for the published repair artifact only**, including
|
|
40
|
+
physical `entwurf_v2` delivery and the live owner join. Stable cuts earn their own host
|
|
41
|
+
proof; hand-patched hooks and `plugin validate` output are never acceptance.
|
|
42
|
+
- **The maintainer host first went doctor-RED** on a managed dev-bin shadowing the registry
|
|
43
|
+
bridge, and now runs dev wiring again.
|
|
44
|
+
- **macOS is not permanently excluded.** Future native validation may reopen it, and the
|
|
45
|
+
package-level `os` field stays unrestricted.
|
|
35
46
|
|
|
36
47
|
**Operator acceptance rule:** on a claimed Claude host, reinstall from the released
|
|
37
48
|
artifact, restart every old Claude process, open a new session, and run the doctor
|
|
@@ -76,20 +87,16 @@ expected isolation-closed response, **FAIL** = listed failure mode,
|
|
|
76
87
|
> `check-acp-carrier-augment`) and the live `smoke-acp-memory-containment-live`;
|
|
77
88
|
> this document records the model-side observation.
|
|
78
89
|
|
|
79
|
-
##
|
|
90
|
+
## Claude-specific surface
|
|
80
91
|
|
|
81
|
-
|
|
82
|
-
is the 0.12 shipped ACP baseline; Codex/Gemini are historical probe reference.
|
|
83
|
-
Do not replace the Gemini column with agy: agy does not use this overlay/carrier
|
|
84
|
-
contract at all, and its shipped baseline is the native-citizen section below.
|
|
92
|
+
The two-round question bank below is the Claude reference baseline.
|
|
85
93
|
|
|
86
|
-
| Slot | Claude
|
|
87
|
-
|
|
88
|
-
| Config
|
|
89
|
-
|
|
|
90
|
-
|
|
|
91
|
-
|
|
|
92
|
-
| Memory write target (Q-L5W) | `CLAUDE.md`, hooks, agents | `~/.codex/memories`, AGENTS.md | `GEMINI.md`, `MEMORY.md`, autoMemory inbox |
|
|
94
|
+
| Slot | Expected Claude surface |
|
|
95
|
+
|---|---|
|
|
96
|
+
| Config dir (Q-L2) | `CLAUDE_CONFIG_DIR`, pointing at the entwurf overlay rather than `~/.claude/` |
|
|
97
|
+
| Read-class tools (Q-L3) | `Read`, `Bash` (ls/find/grep) |
|
|
98
|
+
| Project memory (Q-L4) | `CLAUDE.md` / `.claude/`, not inherited through the overlay |
|
|
99
|
+
| Native memory write (Q-L5W) | none; do not create `CLAUDE.md`, hooks, or agents as a memory substitute |
|
|
93
100
|
|
|
94
101
|
---
|
|
95
102
|
|
|
@@ -250,179 +257,26 @@ same-process concurrency.
|
|
|
250
257
|
|
|
251
258
|
---
|
|
252
259
|
|
|
253
|
-
##
|
|
254
|
-
|
|
255
|
-
Historical Gemini probe, retained for the probe lane only — **not** part of
|
|
256
|
-
the shipped Claude baseline. Gemini's `applySubstitutions` rewrites unknown
|
|
257
|
-
`${name}` tokens; the bridge inserts a U+200B between `$` and `{` in operator
|
|
258
|
-
engraving body so the regex misses while the visual text stays stable. The
|
|
259
|
-
former carrier-isolation canary literal is a doc-era artifact with **no code
|
|
260
|
-
surface on 0.12** — do not assert it as a current expectation.
|
|
260
|
+
## Cortex baseline
|
|
261
261
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
overlay, open a fresh Gemini ACP session, then ask `Q-H`:
|
|
262
|
+
Run these checks in a fresh `entwurf/cortex-*` session. Do not grade Cortex against
|
|
263
|
+
Claude's overlay or system-prompt carrier.
|
|
265
264
|
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
-
|
|
270
|
-
-
|
|
271
|
-
-
|
|
272
|
-
|
|
265
|
+
| ID | Check | PASS | FAIL |
|
|
266
|
+
|---|---|---|---|
|
|
267
|
+
| Q-CX-ID | Backend identity | Identifies Cortex and the selected enforced model; does not claim to be Claude Code. | Reports the Claude backend or an unenforced/default model. |
|
|
268
|
+
| Q-CX-TOOLS | Native surface | Reports Cortex-native tools; garden tools arrive only through `entwurf-bridge`. | Lists Claude's `Read/Bash/Edit/Write` allowlist as its native surface. |
|
|
269
|
+
| Q-CX-MCP | Bridge projection | `entwurf-bridge` is reachable through the overlay-private `cortex/mcp.json`; no ambient operator MCP catalog appears. | Bridge absent, or unrelated operator MCP servers leak in. |
|
|
270
|
+
| Q-CX-CARRIER | Context carrier | Says Cortex has no system-prompt engraving carrier; engraving/context arrived in the first-user augment. | Claims `_meta.systemPrompt` delivered the engraving. |
|
|
271
|
+
| Q-CX-HOME | Containment | Distinguishes isolated HOME from the real operator HOME restored only for the bridge; `CORTEX_HOME` is absent. | Claims broad operator home/config inheritance or a present `CORTEX_HOME`. |
|
|
273
272
|
|
|
274
|
-
|
|
275
|
-
|
|
273
|
+
The live `smoke-acp-cortex-live` and deterministic `check-acp-cortex` remain the
|
|
274
|
+
oracles. This interview tests whether the model describes that surface honestly.
|
|
276
275
|
|
|
277
276
|
---
|
|
278
277
|
|
|
279
278
|
# HISTORY (pointer)
|
|
280
279
|
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
`check`, `install-surface`, and `artifact-consumer` all success. The non-interference reading rests on what the
|
|
285
|
-
sources prove, not on an inspection of the runner image: the external Cortex CLI is not an npm
|
|
286
|
-
dependency, nothing in install or provider registration looks for the executable,
|
|
287
|
-
`.github/workflows/ci.yml` provisions only checkout, pnpm, and Node 24 (no Cortex install step,
|
|
288
|
-
no Snowflake auth), and the required Linux `artifact-consumer` job ran the candidate inside a
|
|
289
|
-
clean `node:24-bookworm` container and passed. Cells at that tree: `ENTWURF_REQUIRE_DOCKER=1 ./run.sh
|
|
290
|
-
check-install-container` EXIT=0 (40 ok) — candidate `junghanacs-entwurf-0.12.10.tgz`
|
|
291
|
-
**sha256=63342aa8a144011dee86ebea8f0b778c7860e54dc0f1c710438983c679e8af87**, image
|
|
292
|
-
`node:24-bookworm` `id=sha256:fcd0f74fb415c752…`,
|
|
293
|
-
`repoDigest=node@sha256:5711a0d445a1af54…`; `./run.sh check-pack-install` EXIT=0 with the
|
|
294
|
-
installed package's own model list enumerating the **exact six curated rows (claude 2 +
|
|
295
|
-
cortex 4)**; `LIVE=1 ./run.sh smoke-acp-cortex-live` **PASS 23/23**, deliberately rerun
|
|
296
|
-
after the `resolveSessionKey` overlay-scope repair so the claim does not rest on the earlier
|
|
297
|
-
CP2 code — overlay scope dir + `autoUpdate:false` + overlay-private `mcp.json` projection +
|
|
298
|
-
real-operator-HOME restore on the bridge entry, the model's own `entwurf_v2` landing exactly
|
|
299
|
-
one `.msg` on a seeded peer with the gid only in the envelope, and process-group teardown
|
|
300
|
-
leaving nothing alive in that run's overlay. `pnpm check` on the prepared tree includes
|
|
301
|
-
`check-gate-qualification` **111/111 killed** (lane `acp-cortex` twelve), and
|
|
302
|
-
`LIVE=1 ./run.sh release-gate /tmp/entwurf-release-gate-0.13.0.drnRyR` was all green —
|
|
303
|
-
**MUST PASS=17 FAIL=0 SKIP=0**, **BEHAVIOR PASS=1 FAIL=0**, EXIT=0. Operator-session (not
|
|
304
|
-
gate) evidence from 2026-07-29 on the same implementation set: a Cortex resident used the
|
|
305
|
-
host pi citizen's garden id instead of inventing one (`agentId=entwurf/cortex-claude-sonnet-5`,
|
|
306
|
-
`backend=pi`, `origin=pi-session`, `replyable=true`) and exchanged real turns across three
|
|
307
|
-
rails — native Claude Code mailbox drain, pi native control socket, and pi ACP Claude Sonnet
|
|
308
|
-
control socket; record `20260729T204101-7aaa6f` remains on disk. **Still pending as a
|
|
309
|
-
release-blocking `make` tag gate:** the preserved exact 0.13.0 candidate installed into a
|
|
310
|
-
fresh temporary root must drive one cold `entwurf/cortex-claude-sonnet-5` turn from those
|
|
311
|
-
installed bytes (unique nonce, exit 0, candidate sha256 unchanged before/after, resolved
|
|
312
|
-
installed root recorded). Installed-artifact evidence and real-Cortex evidence have not yet
|
|
313
|
-
met in one execution; a RED there stops the cut before the tag. Second machine, macOS, and
|
|
314
|
-
WSL2 remain unclaimed for this cut.
|
|
315
|
-
|
|
316
|
-
2026-07-25 repair.1 installed-native host acceptance (stable-promotion prerequisite):
|
|
317
|
-
the published registry artifact `@junghanacs/entwurf@0.12.8-repair.1` was installed
|
|
318
|
-
fresh on two Linux hosts (maintainer + secondary) through the package's stable bins.
|
|
319
|
-
Each host ran installed `entwurf install-meta-bridge`, opened a NEW real Claude Code
|
|
320
|
-
session with a live MCP child, and ran the installed `entwurf doctor-meta-bridge`
|
|
321
|
-
against an isolated clean `PI_CODING_AGENT_DIR`; both doctors reached **PASS**, including
|
|
322
|
-
the live MCP owner join and a physical `entwurf_v2` delivery. The maintainer host first
|
|
323
|
-
proved the oracle's value by failing when its managed dev-bin shadowed the registry
|
|
324
|
-
`entwurf-bridge`: the installed v2 hook wrote a v2 record while the checkout's v3 bridge
|
|
325
|
-
refused it. Removing the managed dev bin made PATH resolve the registry bridge, after
|
|
326
|
-
which the same native proof passed. The test-created v2 record from that failed mixed-path
|
|
327
|
-
attempt was preserved under `meta-sessions.proof-failed-20260725T165227/`; the maintainer's
|
|
328
|
-
V3 development wiring was restored after acceptance. This closes VERIFY's two-host
|
|
329
|
-
repair.1 prerequisite for a separately authorized stable `0.12.8`; it is host
|
|
330
|
-
corroboration of the published repair artifact, not evidence for the future stable
|
|
331
|
-
candidate, which still earns exact-SHA CI, LIVE, and preserved-artifact acceptance.
|
|
332
|
-
Exact pre-version closure checkpoint `28a52fe2d6e9ca29b657a33e5c80ff4debda2f0f`
|
|
333
|
-
passed GitHub Actions run [30149759311](https://github.com/junghan0611/entwurf/actions/runs/30149759311):
|
|
334
|
-
`check`, `install-surface`, and `artifact-consumer` all success. The host proof then found
|
|
335
|
-
a one-line `remove-dev-bin` dispatch defect, so the eventual stable landing HEAD must earn
|
|
336
|
-
a fresh exact-SHA run; this checkpoint is not reused as that acceptance.
|
|
337
|
-
|
|
338
|
-
2026-07-24 (night) upgrade-harness + review acceptance at exact HEAD
|
|
339
|
-
`cbda097` (branch `repair/v2-core-debt`, merged to main the same night — the
|
|
340
|
-
hard-cut branch chronicle lives in issue #50): the three-cell harness gained
|
|
341
|
-
the UPGRADE axis — `setup` / `install` / `install-meta-bridge` refuse a
|
|
342
|
-
pre-cut (v1/v2) meta-record store BEFORE their first write, prescribe on
|
|
343
|
-
three axes (pre-cut → migrate; problems → repair first; both → repair FIRST,
|
|
344
|
-
then migrate), and the proof seeds every host state from frozen fixture bytes
|
|
345
|
-
(`fixtures/meta-store`, sha256-manifested, excluded from the tarball).
|
|
346
|
-
Deterministic cells at this HEAD: `pnpm check` EXIT=0 (source cell
|
|
347
|
-
`check-upgrade-gate` 57/0), `check-pack-install` EXIT=0,
|
|
348
|
-
`ENTWURF_REQUIRE_DOCKER=1 check-install-container` EXIT=0 — candidate
|
|
349
|
-
`junghanacs-entwurf-0.12.8-repair.1.tgz` **sha256
|
|
350
|
-
`db17165f962c938d71ef97cb7a86252549dc91b00d5ec67f63ec65b41039e6dc`**,
|
|
351
|
-
11413738 bytes, image `sha256:f1158c7f34cf35a047bf0513c38282bb2fa253529e5ae404b32c6d93697410be`.
|
|
352
|
-
Live at this HEAD: `LIVE=1 release-gate` **MUST 16/1/0 + BEHAVIOR 1/0,
|
|
353
|
-
EXIT=1** — the single FAIL is `smoke-acp-bundled-mcp-live`, the known
|
|
354
|
-
bundled-MCP readiness race (ROADMAP 「🔴 OPEN」, GLG: observe, don't fix;
|
|
355
|
-
sample recorded with transcript; isolated re-run PASS 4/4). Every other MUST
|
|
356
|
-
passed at this HEAD, including `smoke-acp-v2-send-live` (send identity /
|
|
357
|
-
replyability) and the matrix honest-reject. **A release cut stays blocked on
|
|
358
|
-
that red by the gate's own words; the merge to main was GLG's explicit call
|
|
359
|
-
with the race documented as an open observation item.**
|
|
360
|
-
|
|
361
|
-
2026-07-24 dependency-uplift acceptance at exact HEAD
|
|
362
|
-
`7cbeb29b6afcfbaf4fc28da3b7929037c339113d` (branch `repair/v2-core-debt`): pi
|
|
363
|
-
runtime **0.80.7 → 0.82.0** and Claude ACP **claude-agent-acp 0.54.1 → 0.61.0 /
|
|
364
|
-
ACP SDK 1.1.0 → 1.3.0** as two separate cuts, with `@anthropic-ai/sdk` held at
|
|
365
|
-
**0.100.1** (measured through the real module graph: claude-agent-sdk 0.3.217's
|
|
366
|
-
`>=0.93.0` peer resolves to 0.100.1 there; dropping the direct pin under this
|
|
367
|
-
repo's `autoInstallPeers:false` leaves only 0.91.1 and the peer goes unmet).
|
|
368
|
-
Deterministic 3 cells all EXIT=0 on Node 24 Linux — checkout (`pnpm
|
|
369
|
-
build-bridge && pnpm check`), installed tree (`check-pack-install`: resolved
|
|
370
|
-
tree holds only `@earendil-works@0.82.0`, loader drove the pinned pi, installed
|
|
371
|
-
bin delivered a `.msg`), clean consumer (`ENTWURF_REQUIRE_DOCKER=1
|
|
372
|
-
check-install-container`, candidate `junghanacs-entwurf-0.12.8-repair.1.tgz`
|
|
373
|
-
**sha256 `ab5dee07585c8d7a4f8f174cedea0051489ae1a26766ff1baf8edd7377d5bac7`**,
|
|
374
|
-
11391060 bytes, image `sha256:f1158c7f34cf35a047bf0513c38282bb2fa253529e5ae404b32c6d93697410be`).
|
|
375
|
-
Live: `LIVE=1 ./run.sh release-gate` measured **MUST 17/0/0 + BEHAVIOR 1/0,
|
|
376
|
-
EXIT=0** at this HEAD — the first aggregate to include
|
|
377
|
-
`smoke-acp-v2-send-live`, which closes the SEND half of ACP citizenship (an ACP
|
|
378
|
-
model calls `entwurf_v2` and the `.msg` lands carrying the resident's own garden
|
|
379
|
-
id, `entwurf/<model>`, replyable — a gid never present in the prompt). Two
|
|
380
|
-
stale claims were retired against measurement rather than argument: the
|
|
381
|
-
extension-loader `/compat` shim survives 0.82.0 (root / `/compat` / `/oauth`
|
|
382
|
-
untouched; `/providers/all` is an addition, and the curated Claude anchors are
|
|
383
|
-
byte-identical across the bump), and the "one-shot bundled-MCP teardown hang"
|
|
384
|
-
that a gate comment used as its rationale does not reproduce on this
|
|
385
|
-
combination. What a plain `pi -p` genuinely lacks is garden identity, and only
|
|
386
|
-
without `--entwurf-control` — now documented as a provider/citizen boundary
|
|
387
|
-
instead of read as a defect.
|
|
388
|
-
|
|
389
|
-
2026-07-24 record-era aggregate floor: `LIVE=1 ./run.sh release-gate` measured
|
|
390
|
-
**MUST 16/0/0 + BEHAVIOR 1/0, EXIT=0** on the `repair/v2-core-debt` branch after
|
|
391
|
-
the #50 C1–C3 cuts and the observability repair — the first aggregate run since
|
|
392
|
-
2026-06-27 (every individual smoke had been green, but the two-tier summary and
|
|
393
|
-
exit code of the aggregate command itself had gone unverified for the whole
|
|
394
|
-
hard-cut window; three MUST live smokes were found dead on the pre-C2 address
|
|
395
|
-
contract and re-authored in the same pass). The step count moved 17→16 with the
|
|
396
|
-
v2-cutover smoke retirements. Evidence log: `/tmp/pi-tmux-release-gate.log`
|
|
397
|
-
(scratch `/tmp/entwurf-rg-scratch-20260724`).
|
|
398
|
-
|
|
399
|
-
2026-07-22 repair evidence: Linux artifact-consumer C is committed locally as
|
|
400
|
-
`328c66e` (not yet pushed at the time of this baseline update); B/B2 direct-native
|
|
401
|
-
observations and the exec-only production cut are documented in issue #51 and
|
|
402
|
-
VERIFY's host matrix. **Post-provenance C was re-proven rather than inheriting the
|
|
403
|
-
earlier green:** the first rerun correctly went RED because its stand-in Claude was
|
|
404
|
-
container PID 1, which the product rejects as an impossible/reparented owner. The
|
|
405
|
-
fixture now keeps an outer PID-1 shell and runs the consumer as pid 8; both default
|
|
406
|
-
pack-once and caller-preserved exact-tgz modes reached doctor PASS with marker
|
|
407
|
-
`ownerPid=8 (>1)` and identical artifact sha256. The preserved file's
|
|
408
|
-
inode/size/mtime/sha tuple was unchanged across acceptance. Evidence logs:
|
|
409
|
-
`/tmp/pi-tmux-entwurf-exact-final.log` and
|
|
410
|
-
`/tmp/pi-tmux-entwurf-default-final.log`; the digest belongs in the external cut log,
|
|
411
|
-
not inside this shipped file (embedding it would mutate the tarball it names).
|
|
412
|
-
This was the `0.12.7-1` gate candidate, **not** the approved release artifact. Exact
|
|
413
|
-
mode was later repeated for `0.12.8-repair.0`, and those accepted bytes were published
|
|
414
|
-
under `repair` on 2026-07-22. Field evidence then invalidated that release: its installed
|
|
415
|
-
MCP dist omitted `entwurf-capabilities.json`, so tools/list and the old doctor stayed
|
|
416
|
-
green while every `entwurf_v2` send died ENOENT. The repaired candidate must be
|
|
417
|
-
`0.12.8-repair.1` and must earn fresh exact-SHA CI, LIVE-gate, preserved-artifact, and
|
|
418
|
-
container evidence; none of repair.0's release evidence transfers. Maintainer/secondary-host
|
|
419
|
-
installed doctor GREEN remains deliberately pending until after repair.1 publication.
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
Per-release baselines — the 0.9.0 garden-native identity cut (17 PASS / 0 FAIL /
|
|
423
|
-
0 SKIP `/gnew`-inclusive gate, #28), and the older 0.8.x / 0.5.0 context-pressure
|
|
424
|
-
baselines — live in **CHANGELOG.md and git history**, including the gate names of
|
|
425
|
-
their era (several of which, e.g. `smoke-all` / `smoke-async-resume` /
|
|
426
|
-
`smoke-compaction-policy` / `sentinel` / `xt-tool-surface`, were retired in the
|
|
427
|
-
v2 cutover). The live calibration reference is the current release floor in
|
|
428
|
-
[VERIFY.md](./VERIFY.md) §0A — most recent: **2026-07-24 MUST 16/0/0 + BEHAVIOR 1/0**.
|
|
280
|
+
Per-release counts, digests, host observations, and incident chronology live in
|
|
281
|
+
[CHANGELOG.md](./CHANGELOG.md), release artifacts, issues, and git history. This
|
|
282
|
+
file keeps only the current operator interview and support verdicts.
|
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,25 @@ All notable changes to this project will be documented here. Format follows [Kee
|
|
|
4
4
|
|
|
5
5
|
## Unreleased
|
|
6
6
|
|
|
7
|
+
## 0.13.1 — 2026-07-31
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
|
|
11
|
+
- **ACP prompt lifecycle no longer applies a 600-second wall-clock cutoff to a running turn.** Bootstrap remains bounded; user abort sends ACP cancellation before bounded teardown, and child exit/stdio failure now preserves lifecycle phase, exit/signal, and stderr evidence without automatic cold replay.
|
|
12
|
+
- **The release gate now makes actual invocation auditable.** Every MUST step reports PASS, protocol SKIP, or FAIL; `--cut` refuses a MUST SKIP without misreporting it as a failed call. The aggregate includes the native resume, spawn substrate, and authenticated cross-harness delivery chain; Cortex remains an explicitly documented on-demand host-auth axis.
|
|
13
|
+
|
|
14
|
+
### Fixed
|
|
15
|
+
|
|
16
|
+
- **Claude's tiny non-empty engraving carrier owns its leading boundary.** The SDK fixed identity sentence and `# Engraving Here` now occupy separate blocks while preserving auto-memory containment, deterministic signature bytes, and the empty override opt-out.
|
|
17
|
+
- **The ACP provenance and v2 dispatch surfaces state their real boundaries.** First-user augment versus system carrier is rail-specific, and the `entwurf_v2` description fits the host tool-description cap.
|
|
18
|
+
|
|
19
|
+
### Verification
|
|
20
|
+
|
|
21
|
+
- The versioned release tree passed `pnpm check`, including **144/144** kill-qualified mutants across 10 lanes and `check-pack` at **309 files**.
|
|
22
|
+
- `LIVE=1 ./run.sh release-gate /tmp/entwurf-release-gate-0.13.1.LeOQDB --cut` passed: **MUST PASS=20 FAIL=0 SKIP=0**, **BEHAVIOR PASS=1 FAIL=0 SKIP=0**, `cut: OK`. Full log: `/tmp/entwurf-release-gate-0.13.1.LeOQDB/release-gate.log`.
|
|
23
|
+
- On-demand lifecycle acceptance `LIVE=1 ./run.sh smoke-acp-long-turn-live` passed on the final source set: a **733,635ms** turn exceeded the retired 600s cutoff with exactly one cold ACP bootstrap and no replay. Cortex is deliberately aggregate-excluded for this cut because the oracle has no Snowflake connection; its 0.13.0 thinkpad LIVE evidence is carry-forward, not a fresh 0.13.1 host certification.
|
|
24
|
+
- `check-pack-install` packed and installed `0.13.1` into a fresh consumer, proving the installed bridge boot/delivery and previous-generation lifecycle without touching the real data tree. The preserved exact candidate's checkout-invisible Docker consumer acceptance remains a `make` responsibility.
|
|
25
|
+
|
|
7
26
|
## 0.13.0 — 2026-07-30
|
|
8
27
|
|
|
9
28
|
### Added
|
package/CONTRIBUTING.md
CHANGED
|
@@ -4,7 +4,7 @@ This is a daily-driver bridge. Correctness beats feature breadth. Read this befo
|
|
|
4
4
|
|
|
5
5
|
## What this repo is
|
|
6
6
|
|
|
7
|
-
`entwurf` is a **garden-citizen dispatch bridge** — entwurf-core (v2 dispatch) + a meta-bridge + a pi adapter + an **ACP plugin on a two-backend adapter rail** — that lets already-running harnesses address one another by garden id; pi is one adapter, not the subject. The ACP plugin borrows the backend's identity (system prompt preset, model behavior, tool implementations) and shapes the *operating surface* — tools, MCP, skills, permissions — to match pi's own policy **wherever that backend exposes a knob for it**. Where it does not, the plugin does not fake one: a cortex session keeps its own native tool surface and receives MCP through an overlay projection, so "shaped to pi's policy" is a Claude-strength claim, not a universal one. Claude is the reference ACP backend and Snowflake Cortex Code is the second (landed 0.13.0, `cortex-` prefixed ids — [docs/acp-backend-rail.md](./docs/acp-backend-rail.md
|
|
7
|
+
`entwurf` is a **garden-citizen dispatch bridge** — entwurf-core (v2 dispatch) + a meta-bridge + a pi adapter + an **ACP plugin on a two-backend adapter rail** — that lets already-running harnesses address one another by garden id; pi is one adapter, not the subject. The ACP plugin borrows the backend's identity (system prompt preset, model behavior, tool implementations) and shapes the *operating surface* — tools, MCP, skills, permissions — to match pi's own policy **wherever that backend exposes a knob for it**. Where it does not, the plugin does not fake one: a cortex session keeps its own native tool surface and receives MCP through an overlay projection, so "shaped to pi's policy" is a Claude-strength claim, not a universal one. Claude is the reference ACP backend and Snowflake Cortex Code is the second (landed 0.13.0, `cortex-` prefixed ids — [docs/acp-backend-rail.md](./docs/acp-backend-rail.md#cortex-code-audit-d1d10)); Codex has native delivery-probe evidence but no managed citizen lane, and Gemini is not a shipped backend. That is the entire scope.
|
|
8
8
|
|
|
9
9
|
**How a backend joins the rail** (the shape a PR must take): one adapter object in `pi-extensions/lib/acp/backend-adapter.ts` + its own curated rows/overlay modules + its own `check-acp-*` gate and mutant lane. Backend-specific *behavior* must stay behind the adapter, and backend-specific settings ride the opaque `adapterSettings` seam rather than growing the common config. That is not a ban on ever touching the common layer (`backend.ts`'s turn loop, `acp-client.ts`, `event-mapper.ts`, `session-store.ts`, `config.ts`) — cortex's landing did change `backend.ts` to pass the authoritative session key through the generic `ensureOverlay` seam. The rule is narrower and stricter: a common-layer change must be **backend-invariant** (it reads no backend name and branches on no backend) and **separately gated**. A common file that grows an `if (backend === …)` is the thing to reject.
|
|
10
10
|
|