@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.
Files changed (72) hide show
  1. package/AGENTS.md +5 -3
  2. package/BASELINE.md +57 -203
  3. package/CHANGELOG.md +19 -0
  4. package/CONTRIBUTING.md +1 -1
  5. package/DELIVERY.md +117 -261
  6. package/README.md +68 -408
  7. package/VERIFY.md +58 -87
  8. package/demo/README.md +1 -1
  9. package/docs/acp-backend-rail.md +231 -0
  10. package/docs/external-mcp-host.md +132 -0
  11. package/docs/fresh-cut-policy.md +99 -0
  12. package/docs/setup-clean-host.md +123 -328
  13. package/mcp/entwurf-bridge/dist/mcp/entwurf-bridge/src/index.js +21 -48
  14. package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/acp-client.js +12 -0
  15. package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/backend-adapter.js +11 -10
  16. package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/config.js +1 -1
  17. package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/engraving.js +42 -1
  18. package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/models.js +4 -4
  19. package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/overlay.js +3 -3
  20. package/mcp/entwurf-bridge/src/index.ts +21 -48
  21. package/package.json +12 -9
  22. package/pi-extensions/entwurf-control.ts +20 -49
  23. package/pi-extensions/lib/acp/acp-client.ts +22 -0
  24. package/pi-extensions/lib/acp/augment.ts +42 -3
  25. package/pi-extensions/lib/acp/backend-adapter.ts +12 -11
  26. package/pi-extensions/lib/acp/backend.ts +305 -36
  27. package/pi-extensions/lib/acp/config.ts +1 -1
  28. package/pi-extensions/lib/acp/engraving.ts +43 -1
  29. package/pi-extensions/lib/acp/event-mapper.ts +16 -13
  30. package/pi-extensions/lib/acp/models.ts +4 -4
  31. package/pi-extensions/lib/acp/overlay.ts +3 -3
  32. package/prompts/engraving.md +13 -5
  33. package/run.sh +244 -108
  34. package/scripts/check-acp-carrier-augment.ts +246 -10
  35. package/scripts/check-acp-cortex.ts +5 -5
  36. package/scripts/check-acp-prompt-lifecycle.ts +565 -0
  37. package/scripts/check-acp-sdk-surface.ts +60 -21
  38. package/scripts/check-acp-stop-reason.ts +342 -0
  39. package/scripts/check-entwurf-v2-surface.ts +41 -0
  40. package/scripts/check-gate-qualification.ts +6 -3
  41. package/scripts/check-probe-ordering.ts +39 -7
  42. package/scripts/check-release-gate-outcomes.ts +332 -0
  43. package/scripts/lib/live-skip.ts +33 -0
  44. package/scripts/lib/probe-acp-turn.ts +33 -12
  45. package/scripts/lib/step-outcome.sh +88 -0
  46. package/scripts/mutants/acp-augment.json +106 -0
  47. package/scripts/mutants/acp-cortex.json +2 -2
  48. package/scripts/mutants/acp-prompt-lifecycle.json +100 -0
  49. package/scripts/mutants/acp-stop-reason.json +80 -0
  50. package/scripts/mutants/probe-ordering.json +27 -5
  51. package/scripts/mutants/release-gate.json +105 -0
  52. package/scripts/mutants/v2-surface.json +26 -15
  53. package/scripts/smoke-acp-bundled-mcp-live.ts +4 -3
  54. package/scripts/smoke-acp-carrier-augment-live.ts +2 -2
  55. package/scripts/smoke-acp-cortex-live.ts +8 -14
  56. package/scripts/smoke-acp-long-turn-live.ts +185 -0
  57. package/scripts/smoke-acp-mcp-live.ts +2 -2
  58. package/scripts/smoke-acp-memory-containment-live.ts +2 -2
  59. package/scripts/smoke-acp-ordering-probe-live.ts +2 -2
  60. package/scripts/smoke-acp-overlay-live.ts +2 -2
  61. package/scripts/smoke-acp-provider-live.ts +2 -2
  62. package/scripts/smoke-acp-raw-turn-live.ts +3 -3
  63. package/scripts/smoke-acp-session-reuse-live.ts +2 -2
  64. package/scripts/smoke-acp-skill-live.ts +2 -2
  65. package/scripts/smoke-acp-socket-citizen-live.ts +4 -3
  66. package/scripts/smoke-acp-v2-send-live.ts +4 -3
  67. package/scripts/smoke-agy-native-push-live.ts +4 -3
  68. package/scripts/smoke-claude-native-resume-live.sh +13 -3
  69. package/scripts/smoke-entwurf-chain-live.ts +352 -0
  70. package/scripts/smoke-entwurf-v2-matrix-live.ts +2 -2
  71. package/scripts/smoke-entwurf-v2-spawn-resume-live.ts +2 -4
  72. 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
- - 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. Audit record and contract: `docs/acp-backend-rail.md` §11-8.
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.82.1 <0.83` with devDep exact `0.82.1`; re-evaluate loader aliases and `/compat` at the minor ceiling.
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
- The released 0.12 ACP backend is **Claude**, and the main question bank below is the
10
- Claude ACP baseline. The prepared **0.13.0** cut adds **Snowflake Cortex Code** as a
11
- second ACP backend; it has no question bank of its own yet (deferred to 0.13.1), and the
12
- Claude bank must not be run against it verbatim — cortex is
13
- system-prompt-carrier-less and runs its own native tool surface, so the overlay/engraving
14
- questions below would grade it against a surface it does not have. Antigravity (`agy`)
15
- is also shipped, but as a native-push garden citizen rather than an ACP backend, so it
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
- | Surface | Automated artifact evidence | Direct/native evidence | Current verdict |
27
- |---|---|---|---|
28
- | Node 24 Linux package consumer | Required `artifact-consumer` CI: read-only candidate `.tgz`, checkout-invisible, non-root global install, PATH shims, frozen package root, path+sha256 regular-file fence, strict doctor fixture | None required for the package layout itself | Package-consumer shape verified. The planted Claude cache/owner/bridge are synthetic and prove no real Claude lifecycle. |
29
- | Claude Code 2.1.217 exec form | `check-hook-launch-topology` + `check-claude-floor-coherence`; doctor oracle healthy fixture + 21 defect mutations | B2 actual Claude session on NixOS: args per element, literal `${HOME}`, direct parent, FileChanged exit 2 → idle wake | Runtime behavior verified at 2.1.217 on one host; this is the supported floor. |
30
- | Claude Code 2.1.138 negative | Launcher empty-argv refusal + installer/doctor floor checks | B actual Claude session on NixOS: args discarded while runtime reported success | Unsupported; no shell-form fallback. |
31
- | Maintainer NixOS installed package | Gates and B/B2 are green; the published `0.12.8-repair.1` artifact was installed from the registry for acceptance, then the V3 development wiring was restored | 2026-07-25: registry install → installed `install-meta-bridge` → NEW Claude session with a live MCP child → installed doctor **exit 0** (HISTORY) | Host-certified for the published repair artifact, including physical `entwurf_v2` delivery and the live owner join. The doctor first went RED on a managed dev-bin shadowing the registry bridge. This host now runs dev wiring again; stable `0.12.8` earns its own host proof. |
32
- | Secondary Ubuntu Linux installed package | Linux artifact-consumer gate models the package shape, not this machine | 2026-07-25: same registry artifact, isolated clean `PI_CODING_AGENT_DIR`, NEW Claude session with a live MCP child → installed doctor **exit 0** (HISTORY) | Recovery closed for `0.12.8-repair.1`. Hand-patched hooks and validate output remain non-acceptance; a stable artifact is a separate proof. |
33
- | macOS Claude meta-bridge | No artifact-consumer job and no `/proc` live join | None | **Not yet verified/certified for this repair cut.** Installer refuses Darwin and doctor remains nonzero; uninstall permits Darwin to remove older managed state. This is not permanent—future native validation may reopen it, and package-level `os` stays unrestricted. |
34
- | WSL2 / Windows | None | None | Unverified / outside this repair cut. |
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
- ## Per-ACP-backend specifics
90
+ ## Claude-specific surface
80
91
 
81
- Pick the active **ACP backend's** column before pasting a question block. Claude
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 *(shipped)* | Codex *(probe)* | Gemini *(probe)* |
87
- |---|---|---|---|
88
- | Config-dir env (Q-L2) | `CLAUDE_CONFIG_DIR` | `CODEX_HOME` / `CODEX_SQLITE_HOME` | `GEMINI_CLI_HOME` |
89
- | Native dir to compare | `~/.claude/` | `~/.codex/` | `~/.gemini/` |
90
- | Read-class native tools (Q-L3) | `Read`, `Bash` (ls/find/grep) | `exec_command` | `read_file`, `list_directory`, `glob`, `grep_search` |
91
- | Project memory file (Q-L4) | `CLAUDE.md` / `.claude/` | `~/.codex/AGENTS.md` | `GEMINI.md` |
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
- ## Probe appendix — Gemini engraving substitution (`Q-H`, not 0.12 baseline)
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
- Setup (operator side): author a test engraving with literal `${AvailableTools}` /
263
- `${SubAgents}` / `${arbitrary_unknown_key}` tokens, plumb it through the Gemini
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
- [Q-H] Verify whether these three lines are visually present in your system
268
- prompt, and if so quote the visible text exactly:
269
- - TOKEN_A = ${AvailableTools}
270
- - TOKEN_B = ${SubAgents}
271
- - TOKEN_C = ${arbitrary_unknown_key}
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
- - **PASS** All three quoted with `${...}` visually preserved (the ZWSP is invisible; a PASS looks identical to the input).
275
- - **FAIL** TOKEN_A shows a tool list in place of `${AvailableTools}`; any token mutated, dropped, or interpolated.
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
- 2026-07-30 Cortex 0.13.0 acceptance + landing checkpoint (Linux/thinkpad, Cortex Code
282
- v1.1.52). Pre-version landing HEAD `9f1c7dc9e1fa77103e29a6f1884af7759e1595eb` passed
283
- exact-SHA GitHub Actions run [30505001694](https://github.com/junghan0611/entwurf/actions/runs/30505001694):
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) §6/§11-8); Codex is a native garden citizen, and the Gemini path is deprecated. That is the entire scope.
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