@junghanacs/entwurf 0.41.0 → 0.41.2

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 (91) hide show
  1. package/AGENTS.md +1 -1
  2. package/BASELINE.md +7 -5
  3. package/CHANGELOG.md +426 -0
  4. package/DELIVERY.md +37 -20
  5. package/README.md +83 -81
  6. package/VERIFY.md +10 -10
  7. package/demo/README.md +1 -1
  8. package/docs/acp-backend-rail.md +1 -1
  9. package/docs/external-mcp-host.md +1 -1
  10. package/docs/setup-clean-host.md +95 -29
  11. package/mcp/entwurf-bridge/dist/mcp/entwurf-bridge/src/index.js +14 -11
  12. package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-self-address.js +10 -0
  13. package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-contract.js +23 -2
  14. package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-decider.js +7 -1
  15. package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-surface.js +3 -0
  16. package/mcp/entwurf-bridge/dist/pi-extensions/lib/fresh-call-composition.js +21 -10
  17. package/mcp/entwurf-bridge/dist/pi-extensions/lib/herdr-fresh-call.js +4 -2
  18. package/mcp/entwurf-bridge/dist/pi-extensions/lib/meta-sender-identity.js +5 -0
  19. package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-fresh-call.js +6 -4
  20. package/mcp/entwurf-bridge/dist/pi-extensions/lib/native-push/register.js +13 -2
  21. package/mcp/entwurf-bridge/dist/pi-extensions/lib/omp-fresh-preflight.js +2 -2
  22. package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-fresh-preflight.js +1 -1
  23. package/mcp/entwurf-bridge/dist/pi-extensions/lib/remote-pair-receive.js +25 -17
  24. package/mcp/entwurf-bridge/dist/pi-extensions/lib/remote-pair-send.js +94 -28
  25. package/mcp/entwurf-bridge/dist/pi-extensions/meta-bridge-omp.js +57 -7
  26. package/mcp/entwurf-bridge/dist/pi-extensions/meta-bridge-pi-durable.js +2 -2
  27. package/mcp/entwurf-bridge/dist/scripts/remote-pair-receive.js +12 -12
  28. package/mcp/entwurf-bridge/src/index.ts +14 -11
  29. package/native/win32-x64/entwurf_win.node +0 -0
  30. package/native/win32-x64/manifest.json +2 -2
  31. package/package.json +15 -14
  32. package/pi/pi-durable/carrier/tui.js +18 -3
  33. package/pi/pi-durable/overlay/upstream-pin.json +12 -12
  34. package/pi-extensions/lib/acp/backend-adapter.ts +5 -3
  35. package/pi-extensions/lib/acp/backend.ts +12 -9
  36. package/pi-extensions/lib/entwurf-self-address.ts +13 -0
  37. package/pi-extensions/lib/entwurf-v2-contract.ts +25 -2
  38. package/pi-extensions/lib/entwurf-v2-decider.ts +7 -0
  39. package/pi-extensions/lib/entwurf-v2-surface.ts +3 -0
  40. package/pi-extensions/lib/fresh-call-composition.ts +21 -10
  41. package/pi-extensions/lib/herdr-fresh-call.ts +4 -2
  42. package/pi-extensions/lib/meta-sender-identity.ts +4 -0
  43. package/pi-extensions/lib/mux-fresh-call.ts +6 -4
  44. package/pi-extensions/lib/native-push/register.ts +17 -2
  45. package/pi-extensions/lib/omp-fresh-preflight.ts +2 -2
  46. package/pi-extensions/lib/pi-durable-fresh-preflight.ts +1 -1
  47. package/pi-extensions/lib/remote-pair-receive.ts +27 -19
  48. package/pi-extensions/lib/remote-pair-send.ts +117 -30
  49. package/pi-extensions/meta-bridge-omp.ts +69 -7
  50. package/pi-extensions/meta-bridge-pi-durable.ts +3 -3
  51. package/run.sh +218 -49
  52. package/scripts/check-agy-sender-identity.ts +6 -4
  53. package/scripts/check-entwurf-self-address.ts +34 -3
  54. package/scripts/check-entwurf-v2-contract.ts +24 -2
  55. package/scripts/check-entwurf-v2-production.ts +45 -31
  56. package/scripts/check-gate-qualification.ts +11 -9
  57. package/scripts/check-native-push-adapter.ts +4 -0
  58. package/scripts/check-native-push-register.ts +32 -82
  59. package/scripts/check-remote-pair-installed.ts +2 -2
  60. package/scripts/dev-bin.sh +112 -1
  61. package/scripts/lib/chain-terminus-publication.ts +58 -0
  62. package/scripts/lib/codex-fresh-live-protocol.ts +33 -2
  63. package/scripts/lib/codex-fresh-source-receipts.ts +112 -3
  64. package/scripts/lib/pi-durable-fresh-live-receipts.ts +29 -1
  65. package/scripts/mutants/chain-terminus-publication.json +17 -0
  66. package/scripts/mutants/codex-native.json +98 -0
  67. package/scripts/mutants/control-send-receipt.json +3 -3
  68. package/scripts/mutants/mux-fresh-call.json +16 -1
  69. package/scripts/mutants/native-push-paused.json +17 -0
  70. package/scripts/mutants/omp-fresh.json +13 -2
  71. package/scripts/mutants/pack-install.json +50 -4
  72. package/scripts/mutants/pi-durable.json +60 -0
  73. package/scripts/mutants/pi-floor.json +5 -5
  74. package/scripts/mutants/remote-pair-display.json +3 -3
  75. package/scripts/mutants/remote-pair-receive.json +41 -11
  76. package/scripts/mutants/remote-pair-roundtrip.json +67 -7
  77. package/scripts/mutants/remote-pair-send.json +156 -17
  78. package/scripts/mutants/remote-pair-transport.json +4 -4
  79. package/scripts/mutants/source-install.json +66 -0
  80. package/scripts/remote-pair-receive.ts +12 -12
  81. package/scripts/smoke-agy-install-state.sh +121 -0
  82. package/scripts/smoke-agy-native-push-live.ts +13 -0
  83. package/scripts/smoke-codex-fresh-live.ts +52 -28
  84. package/scripts/smoke-entwurf-chain-live.ts +7 -9
  85. package/scripts/smoke-herdr-fresh-call-live.ts +4 -4
  86. package/scripts/smoke-herdr-plugin-build-live.ts +179 -50
  87. package/scripts/smoke-herdr-raw-install-live.sh +10 -3
  88. package/scripts/smoke-mux-lifecycle-live.ts +140 -8
  89. package/scripts/smoke-omp-fresh-live.ts +5 -4
  90. package/scripts/smoke-pi-durable-fresh-live.ts +29 -7
  91. package/scripts/smoke-setup-verdict.sh +27 -2
package/AGENTS.md CHANGED
@@ -35,7 +35,7 @@ Ask: does this follow capability rather than a surface name; record backend asym
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; roll forward a stale reader that rejects a newly known backend or V3 key. Reader-version skew is not a generation change: preserve identities and records, and verify every participating reader before claiming rollout complete. 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.
38
- 10. **Native-push is distinct.** It is neither mailbox nor pi socket. Native-push citizens are record-backed plus probe-alive, with no receiver/watch state or resume authority. Antigravity retries only after bounded re-probe; Codex never replays queue acceptance. Codex sender identity is request-scoped metadata; app-server environment carries root/placement, never citizen identity.
38
+ 10. **Native-push is distinct.** It is neither mailbox nor pi socket. Native-push citizens are record-backed plus probe-alive, with no receiver/watch state or resume authority. Antigravity retries only after bounded re-probe, and its native push is paused (#152: one contract constant refuses dispatch and registration, and makes the sender non-replyable, before any probe); Codex never replays queue acceptance. Codex sender identity is request-scoped metadata; app-server environment carries root/placement, never citizen identity.
39
39
  11. **Package proof models a consumer.** Installed operator entrypoints reach compiled JS; `run_ts` is the sole TS crossing. Keep checkout, tarball, and consumer proofs distinct.
40
40
  12. **Offline verification never rewires the operator.** Sandbox HOME, `PI_CODING_AGENT_DIR`, and writable XDG roots. Only named LIVE gates may touch the host, and must say so.
41
41
  13. **Doctors report runtime and ownership independently.** Working runtime does not prove ownership; broken ownership does not erase runtime observation. Required failure on either axis is red.
package/BASELINE.md CHANGED
@@ -312,7 +312,9 @@ Per-question PASS / FAIL / NOTE for grading the model's response.
312
312
 
313
313
  ## Native-citizen baseline — Antigravity / agy (shipped)
314
314
 
315
- This is not an ACP overlay interview. Run it in a **fresh agy conversation** after
315
+ This is not an ACP overlay interview, and while agy native push is paused (#152) it is an
316
+ optional diagnostic run on request, not a release-cut requirement (VERIFY criterion 7).
317
+ Run it in a **fresh agy conversation** after
316
318
  `install-agy-bridge`, `install-agy-statusline`, and `install-agy-hooks`, with all
317
319
  three doctors green. `PreInvocation` is the earliest lifecycle event, so a brief
318
320
  `🪛 ? agy` before the first model invocation is honest; after that first invocation
@@ -321,13 +323,13 @@ the same conversation must have a garden id.
321
323
  | ID | Check | PASS | FAIL |
322
324
  |---|---|---|---|
323
325
  | Q-AGY-BIRTH | Automatic birth | First invocation creates/attaches one record by native `conversationId`; statusline becomes `🪛 <garden-id> agy`. | Manual cwd matching or `entwurf_register_native` is required for normal birth; a new id appears on every turn. |
324
- | Q-AGY-SELF | Sender identity | `entwurf_self` reports the same garden id, `origin=meta-session`, `agentId=meta-session/antigravity`, and `replyable:true` while the native probe is alive. | Anonymous `external-mcp`, unbacked marker accepted, model name substituted into `agentId`, or mailbox evidence used to infer replyability. |
325
- | Q-AGY-SEND | Outbound attribution | `entwurf_v2` from agy reaches a sibling carrying that same sender garden id and `replyable:true`. | Receiver sees unknown host/wrong garden id, or sender ambiguity is silently guessed. |
326
- | Q-AGY-REPLY | Same-conversation reply | Sibling replies with `entwurf_v2(target=<agy-gid>, intent=fire-and-forget)` and the message direct-injects into the same live agy conversation. | New conversation/spawn, mailbox file/doorbell, or a cosmetic delivered result with no live native route. |
326
+ | Q-AGY-SELF | Sender identity | `entwurf_self` reports the same garden id, `origin=meta-session`, `agentId=meta-session/antigravity`, and, while native push is paused (#152), `replyable:false` with a reason naming the pause and no probe run. | Anonymous `external-mcp`, unbacked marker accepted, model name substituted into `agentId`, or mailbox evidence used to infer replyability. |
327
+ | Q-AGY-SEND | Outbound attribution | `entwurf_v2` from agy reaches a sibling carrying that same sender garden id; while native push is paused (#152) the sender is `replyable:false`. | Receiver sees unknown host/wrong garden id, or sender ambiguity is silently guessed. |
328
+ | Q-AGY-REPLY | Same-conversation reply (paused, #152) | While the pause holds, a sibling's `entwurf_v2(target=<agy-gid>, intent=fire-and-forget)` returns `native-push-paused` with nothing probed or sent, and the agy record is unchanged. When the pause lifts: the message direct-injects into the same live agy conversation. | New conversation/spawn, mailbox file/doorbell, a probe or send while paused, or a cosmetic delivered result with no live native route. |
327
329
  | Q-AGY-OWNERSHIP | Install scope | MCP owns one server plus one narrow `mcp(entwurf-bridge/<tool>)` rule per normal-path tool (`entwurf_v2`, `entwurf_peers`, `entwurf_self`) and nothing else; statusline owns its subtree; hooks own one named hook. | Installer broadens YOLO policy (`command(*)`, `unsandboxed(*)`), grants tools it does not need (`entwurf_inbox_read`, `entwurf_register_native`), or overwrites unrelated settings/hooks. |
328
330
  | Q-AGY-CONCURRENCY | Evidence boundary | Separate agy processes have separate pid/start-key markers; same-pid concurrent model invocation is explicitly reported unsupported. | Claims that one pid can safely identify two simultaneously invoking conversations. |
329
331
 
330
- The replyability formula is **record-backed identity AND live native-push probe**.
332
+ The replyability formula is **record-backed identity AND live native-push probe**; while agy native push is paused (#152) the probe does not run and agy replyability is false by name.
331
333
  There is intentionally no receiver marker, `watchArmed`, mailbox, or resume
332
334
  authority (no rail has one since the visible-first cut). The model field may exist in the meta-record/status display,
333
335
  but `agentId=meta-session/antigravity` is the stable sender contract.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,432 @@ All notable changes to this project will be documented here. Format follows [Kee
4
4
 
5
5
  ## Unreleased
6
6
 
7
+ ## 0.41.2 — 2026-10-24
8
+
9
+ A bug-fix release for the setup, pack and mux verification surfaces. It also carries #149's remote-pair declaration change, a hard cut: every host that has an `entwurf-remote-pair.json` must convert it by hand (Remote pairs below, setup §2c). It also pauses agy native push (#152, Antigravity below), a scope added while this release was being made. The release evidence below separates what was measured while this release was prepared from what the MAKE phase measures on the exact artifact and installed hosts. Herdr is not re-pinned to npm here. An npm lock must name this checkout's exact version, and 0.41.2 had no published bytes when this release was prepared, so `plugins/herdr/runtime-lock.json` returned to the closed `herdr-checkout` verification carrier, as earlier release candidates did. Since the prepare commit `1e66466` reached main, a main-tracking Herdr install builds its runtime from the checked-out commit instead of npm, and a host already on the npm 0.41.1 runtime must run `herdr-plugin-deactivate` before it reinstalls. The published 0.41.1 pairing stays pinned by the Herdr tag `v2026.10.23-herdr.0.41.1` (its section below). The Herdr manifest version is unchanged; a separate snapshot re-pins npm after 0.41.2 is published.
10
+
11
+ ### Release evidence
12
+
13
+ - Kill-power re-measured at this shipped SHA: none (all 1215 committed claims not re-proved, #144).
14
+ - Earlier-candidate PARTIAL (operator-attested, not this SHA): head 439b399c64ef surface de3c1bcf6db9 -- ["bash","run.sh","check-remote-pair-beside"] 47/47 receipt 55bd9563fe43
15
+ - Earlier-candidate PARTIAL (operator-attested, not this SHA): head 439b399c64ef surface de3c1bcf6db9 -- ["bash","run.sh","check-tests-beside-behavior"] 6/6 receipt aef18acbe804
16
+ - Earlier-candidate PARTIAL (operator-attested, not this SHA): head 156bb6231cee surface c883d0df88b5 -- ["bash","run.sh","check-pack-argv-matcher"] 4/4 receipt 11470c62389c
17
+ - Earlier-candidate PARTIAL (operator-attested, not this SHA): head e7ed0576ea65 surface 9bff5948bcb3 -- ["bash","run.sh","smoke-agy-install-state"] 18/18 receipt 13b86f54457e
18
+ - Earlier-candidate PARTIAL (operator-attested, not this SHA): head e7ed0576ea65 surface 9bff5948bcb3 -- ["bash","run.sh","smoke-setup-verdict"] 4/4 receipt ba3113f9661e
19
+ - Earlier-candidate PARTIAL (operator-attested, not this SHA): head 3e2673ba9a1b surface 2b1c5c7c1d52 -- ["bash","run.sh","check-mux-launcher-fence"] 8/8 receipt d27f3ded70ab
20
+ - Not measured for this release: the real two-host exchange (T3) over the v2 remote-pair file. It is opt-in operator evidence, not a release-gate MUST (VERIFY, "Real two-host exchange"), and it was not re-run for this candidate.
21
+ - `LIVE=1 ./run.sh smoke-herdr-plugin-build-live` on Herdr 0.9.5, measured on an earlier working tree (diff `40f12860ffbf`, smoke `15744e13f9bf`), not on this SHA: 635 s, 5 passed, 0 skipped. The Claude cell ran the real vendor CLI. The gap install exited 1 with the registry unchanged and the ledger on the gap commit, and the reconcile then re-bound to HEAD with 0. Log `0a9f293a155c`. A fixture pack is not a release artifact.
22
+ - Prepare-time floor and release gate, measured on the working tree `80c40705809c` (fixture source `15744e13f9bf`, before this record's final wording), not on an exact SHA: managed build 6 s with dist byte-identical, `check:full` 905 s exit 0. `release-gate --cut`: MUST 24/0/0, BEHAVIOR 1/0/0, cut OK, log `8c18f08880d3`. The census afterwards was read-only.
23
+ - Prior candidate, kept and not inherited: the prepare commit `1e66466`, its push CI, its M3w artifact `df407c70c0b2` and that artifact's container and Claude installed acceptance were measured before the #152 pause. They are evidence for that candidate only; the paused product bytes do not inherit them.
24
+ - #152 PARTIAL (operator-attested, not this SHA): head 1e664667a663 surface 81cbb2888465 -- ["bash","run.sh","check-native-push-paused"] 1/1 receipt 2f262170bf98
25
+ - #152 PARTIAL (operator-attested, not this SHA): head 1e664667a663 surface 81cbb2888465 -- ["bash","run.sh","check-entwurf-v2-contract"] 1/1 receipt 0c624bad9b67
26
+ - #152 PARTIAL (operator-attested, not this SHA): head 1e664667a663 surface 81cbb2888465 -- ["bash","run.sh","check-entwurf-v2-production"] 5/5 receipt f7dd4d94c275
27
+ - #152 PARTIAL (operator-attested, not this SHA): head 1e664667a663 surface 81cbb2888465 -- ["bash","run.sh","check-entwurf-self-address"] 8/8 receipt 3c223a9034d8
28
+ - Those four groups were measured on an uncommitted working tree with green controls; the other 1189 of 1204 committed mutants were not run for them. They are not shipped-SHA kill-power and do not sum to release coverage.
29
+ - #152 candidate floor, before this record's final doc amendment: `check:full` 900 s exit 0 on the uncommitted working tree with tracked patch `f883ba29c22d` (log `ce9ca5df53eb`), not this SHA.
30
+ - Earlier-candidate PARTIAL (operator-attested, not this SHA): head 100f618e2b42 surface 61f6ab3d25c1 -- ["bash","run.sh","check-chain-terminus-publication"] 1/1 receipt 6a8af23eb259
31
+ - That group was measured on an uncommitted working tree over `100f618` with green controls; the other 1204 of 1205 committed mutants were not run for it, and it is not shipped-SHA kill-power.
32
+ - Earlier-candidate PARTIAL (operator-attested, not this SHA): head ed6490fdc949 surface e966ed7447e8 -- ["bash","run.sh","check-tests-beside-behavior"] 6/6 receipt cecf3a83a675
33
+ - `LIVE=1 ./run.sh smoke-entwurf-chain-live` on the chain-terminus candidate (uncommitted, tracked patch `4df5f793fb04`), not this SHA: 24 assertions, 24 s, exit 0, log `e5115bbeb06d`; every identity and read-receipt check after the doorbell was reached.
34
+ - Earlier-candidate PARTIAL (operator-attested, not this SHA): head bad44f4beb6c surface cd1627ae7b7c -- ["bash","run.sh","check-mux-fresh-call"] 160/160 receipt 33b6f81cff24
35
+ - That group was measured on an uncommitted working tree over `bad44f4` (the bootstrap repair) with green controls; the other 1055 of 1215 committed mutants were not run for it, and it is not shipped-SHA kill-power.
36
+ - Guided caller check, `LIVE=1 ./run.sh smoke-codex-fresh-live` on an earlier uncommitted candidate (tracked patch `a5b3833b9ebd`), not this SHA: 66 assertions, exit 0, the initial Pi's peers prefix 1, log `753dd4b24b6c`. It is one run of the path the task asked for, not evidence of a sibling's own judgement, and the earlier outbound-callback timeout (P5 r4) is still unexplained.
37
+ - Exact prepared-SHA CI and the M3w artifact with its container acceptance belong to the final prepared SHA and produce their own receipts. §3.7 is VERIFY criterion 7's deterministic paused proof inside `check:full`; it needs no install.
38
+ - Release gate and native Claude acceptance after install (§3.4), measured on `4f14a4d` (the bootstrap checkpoint, before the docs-only agy-scope change), not this SHA: `release-gate --cut` log `fcb5c64dd70a`, its `check:full` 923 s exit 0, MUST 24/0/0, BEHAVIOR 1/0/0, cut OK. Installed `doctor-meta-bridge` exited 0 (log `0065d7a78d8e`). A new Claude Code session ran the acceptance prefix's MCP entry `8ca6d4cb4b90`, the same bytes as the tarball member, and sent its own self-report. The checkout re-registration and its doctor passed afterwards.
39
+ - Also on `4f14a4d`, not this SHA: `smoke-omp-fresh-live` 21 assertions after the managed OMP install (log `e2c91d7683cc`), and `smoke-herdr-fresh-call-live` 32 assertions (log `bbfe0386b2c6`).
40
+ - Those `4f14a4d` receipts stand for this SHA only if the final artifact differs from the `4f14a4d` artifact `37b4670837d2` in exactly BASELINE.md, CHANGELOG.md, VERIFY.md and docs/setup-clean-host.md. That comparison is an operator-handoff receipt, not part of this record.
41
+
42
+ ### Docs
43
+
44
+ - **remote-sibling-principles now carries #149.** Several relationships coexist, each one exact sender–target edge, never a union of memberships or a local fallback. Record, process, screen and conversational continuity stay separate. Disjoint routes do not narrow SSH account trust. Implementation, switch-over and a real exchange are kept as separate evidence; no version-2 nonce round trip is claimed. The page keeps the why and links the mechanism to DELIVERY and setup.
45
+ - **README's orchestration section is an entrance, not a second manual.** It drops the lifecycle table it repeated from the overview and the acceptance-boundary detail DELIVERY owns, and adds two short entries: a minimal v2 remote-pair file with its mirror rule, linked to the principles page, DELIVERY and setup §2c; and `team.json`, a person's bookmark copied from `team.json.example`, which Entwurf does not load as runtime configuration.
46
+
47
+ ### Remote pairs (#149)
48
+
49
+ - **One host's declaration now carries several exact pairs.** `entwurf-remote-pair.json` keeps its name and location. Its content is now exactly `{"version": 2, "routes": [...]}`, and each route has the four keys of the #107 file. One local citizen may pair with several remotes, one remote with several locals, and one alias may carry several routes. The file is refused if a pair repeats, a garden id is both local and remote, one remote garden id has two aliases or files, or one alias has two files. A route is selected by the exact (sender, target) pair. A target declared remote with no route for the calling sender is refused with zero SSH and no local fallback. The receiving entry matches both ends of one route at once, so a sender declared in one route cannot reach another route's local. It still refuses with the two existing reasons (`remote-pair-from-mismatch`, `remote-pair-target-mismatch`). The claim, SSH argv, exit codes and receipt are unchanged.
50
+ - **Hard cut, converted by hand.** The versionless single-pair file is refused by name with its manual rewrite; there is no legacy reader. Setup §2c gives the per-host order. While a host's bytes and its file disagree, every `entwurf_v2` call of its bridges is refused, local targets included; a running bridge keeps the code it loaded. Trust stays same-account SSH: every key that account accepts can claim any garden id its file declares.
51
+ - **Evidence.**
52
+ - T1 cells cover the v2 shape, the legacy refusal, the set rules, exact-pair selection with no local fallback, the cross-pair refusal and the matched-route label.
53
+ - The T2 surface-in scene adds a third host and a second citizen on one root, giving three routes in one file: fan-out, a shared remote, the reverse, an undeclared sender with zero SSH, and a cross claim refused on the receiving host.
54
+ - The remote-pair mutants run through the new narrow coordinate `check-remote-pair-beside`, which is in `check:contracts`.
55
+ - Not measured: a real exchange over the v2 file (T3 must be re-run for the schema change) and a sender and a receiver on different releases.
56
+
57
+ ### Antigravity native push paused (#152)
58
+
59
+ - **agy native push is paused.** On the external send path entwurf measured, the agy language server refused the `agentapi` call with `Unauthenticated: missing CSRF token` (#128 on agy 1.2.16, again on agy 1.4.6). Whether a first-party own-tool shell holds a token entwurf could legitimately present is unmeasured; this pause does not claim it is impossible. One fixed constant in the v2 contract drives three refusals before any probe: `entwurf_v2` rejects an agy target as the new pre-probe reason `native-push-paused` with `observedLiveness: null`, an agy sender's `replyable` is false with a reason naming the pause, and `entwurf_register_native` refuses without probing or minting a garden id. Existing agy records, the backend enum, the record reader and the schema are unchanged, so agy citizens stay readable and listed with their birth hook and statusline. Codex native push is unaffected. The fresh-cut quiescence probe stays outside the pause and keeps failing closed.
60
+ - **Acceptance changes with it.** VERIFY criterion 7 proves the pause with the deterministic `[QK:AGY-NATIVE-PUSH-PAUSED]` cell, which needs no agy conversation; the doctors and the fresh-conversation identity check of the retained legacy identity surfaces are an optional diagnostic run on request, not a cut requirement, and are not send evidence. A release does not claim the installed agy host is certified or can receive. A same-gid reply is not claimed while the pause holds. `smoke-agy-native-push-live` exits 2 with `[entwurf:paused]` before it reads a conversation id, and that is not a PASS. The mutant for that cell runs through the narrow coordinate `./run.sh check-native-push-paused`, which is also part of `check:contracts`.
61
+
62
+ ### Fixed
63
+
64
+ - **A fresh sibling may check its caller before calling back, and may hold back.** The framing no longer calls the callback the literal first action. A read-only `entwurf_peers` check may come first, and a capped listing that does not show the caller proves no absence. A sibling whose check does not hold up may hold the callback and the task; the caller then has no address for it. The callback correlates an address; it grants no trust and no authority, and Entwurf decides nothing on the sibling's behalf. omp's stage one reads the caller id from the launch env for display only, and a requested bootstrap without a well-formed one is refused with its task unsent. The LIVE audits admit only successful exact checks before one exact callback; that is those fixtures' condition, not a list of what a sibling may do. Pi and pi-durable prove the result order by row ordinals, Codex only the call order.
65
+ - **`smoke-entwurf-chain-live` could report a false RED while the terminus message was still being published.** `enqueueMetaMessage` writes the `.msg` body first and `inbox.signal` last. The smoke stopped waiting at the first body and checked the signal at once, and in the 0.41.2 release gate on 2026-10-24 the signal landed about 5 ms later. The wait now ends only when the body and the signal are both there, inside the same deadline. A missing body, a missing signal and a duplicate still fail, and the identity and read-receipt checks after it are unchanged. Product mailbox behavior is unchanged. The wait lives in `scripts/lib/chain-terminus-publication.ts` and is proven offline by `test/chain-terminus-publication.test.ts` through the narrow coordinate `check-chain-terminus-publication` (in `check:vitest`), with one mutant that restores the early stop.
66
+ - **The release MUST now drives `entwurf_fresh_call`'s explicit seat over the real MCP wire (#108).** Before this, `placement.tmuxSession` was checked on the bridge only through its schema and a source regex, and the seat was proven only by calling the composition directly. In `smoke-mux-lifecycle-live`, the native pi cell's existing `tools/call` now names a seat session made on the same private tmux server, with no extra model turn. The harness asks tmux itself (not the receipt, whose session id is the target the product chose) that the pane sits in that seat, that the caller's windows are unchanged, and that the stable-handle close removes only that window while the seat's original anchor session, window and pane stand. The ACP and Claude Code cells keep the omitted-placement path. Product code is unchanged.
67
+ - **`check-pack-install`'s two dispatcher-verb leak refusals could pass a leak on a SIGPIPE.** The copilot and codex-app-server cells searched the vendor stand-in's argv with `printf '%s' "$op_out" | grep -qF …` under `pipefail` and refused only when that pipeline exited 0. bash's `printf` writes a multi-line value one line at a time, so a `-q` that closes the pipe at the first match can kill the producer with 141 and pass the cell. The defect was latent: no false green was observed in CI, and the product carries no leak. Both cells now return through one verdict, `pack_install_refuse_argv_leak`. It searches a here-string, which has no producer to kill. It passes on a clean search, and refuses with the cell's existing diagnostic on a leak, or by name when the search itself fails.
68
+ - `check-pack-argv-matcher` is a snapshot-safe gate in `check:package`. Like `check-pack-pin-matcher`, it also runs first inside `check-pack-install`. It drives that same verdict: it must refuse a leak at the front or end of about 260 KB, pass clean output silently, and refuse a failing `grep`. A text check holds both cells to the verdict.
69
+ - A teeth control first requires the retired pipe shape to miss the front-loaded leak on the host. The mutant that restores that shape dies deterministically only because of this large fixture; on the real small output it would survive.
70
+ - The other pipe-to-`-q` lines reviewed alongside are unchanged: the pi-provider doctor and dev-only gate fence checks, which the next confirm-type check backstops; the meta-sessions `ls | grep -q .` cell; the `takeover-user-scope` and uninstall notes; and the confirm-type greps.
71
+ - **A source checkout's setup could report a developer install while an old global entwurf was still selectable.** The bins step certified only the PATH winner: `~/.local/bin/entwurf` into this checkout. An old pnpm global shim later in the same PATH stayed in place, and a non-interactive SSH shell, whose PATH puts that directory first, ran it with the old reader. Source setup now also refuses, by name, any other root under the six package bin names in every PATH entry and in the global bin directory that `pnpm bin -g` and `npm prefix -g` report.
72
+ - The same resolved target is the same install, so duplicate PATH entries and second links pass. An unreadable package manifest, or a package manager that fails or hangs, is refused rather than read as clean. pnpm 11 refuses `bin -g` while its global bin dir is off PATH, so that case is refused too.
73
+ - Nothing is removed and no profile is edited. The refusal prints the path, the conditional package-manager removal command and the next `./run.sh setup`. Installed mode is unchanged.
74
+ - A PASS covers only the directories checked: another shell's PATH, another package manager, a running bridge and the other host are outside it.
75
+ - The two setup smokes now drop host PATH entries that carry a package bin name and answer the global-bin queries with fixtures, so the host's own installation cannot reach their verdict.
76
+ - **`smoke-herdr-plugin-build-live` could not go green on the current Herdr and manifest.** Three fixture defects are fixed in the smoke alone; product code is unchanged.
77
+ - The snapshot and gap-probe clones now install their own frozen, offline, ignore-scripts dependencies before their ordinary commit, which the strict hook needs.
78
+ - Cell 1 locates the managed checkout from Herdr's own registration: exactly one `plugins.json` entry, whose `plugin_root` must resolve inside the sandbox. It no longer scans a `plugins/github/` layout that Herdr no longer writes.
79
+ - Cell 4's probe had replaced a `version = "0.1.0"` literal that the manifest stopped carrying at dd84ac0, so it changed nothing. It now derives the change from the version line it reads, and records the runner's code and the written change in a JSON receipt. The smoke accepts the post-build gap only when that receipt shows code 0 and a real change.
80
+
81
+ ## v2026.10.23-herdr.0.41.1 — Herdr Entwurf plugin 0.41.1
82
+
83
+ A separate Herdr plugin snapshot, not another core release: core package 0.41.1 and its
84
+ `v0.41.1` tag remain unchanged. Core 0.41.1 is now published to npm; the publication is
85
+ verified from the registry, not from observing who ran it.
86
+
87
+ **Reading guide (2026-10-23).** The `## 0.41.1` section below is prepare-time text. Its opening
88
+ "Unpublished candidate; release acceptance is not complete", its "Main still carries the
89
+ published 0.41.0 Herdr lock" and its closing "No tag, GitHub release, npm publication, Herdr
90
+ re-pin or laptop rollout has occurred" predate later facts: `v0.41.1` and its GitHub release
91
+ point at `6a88436` and that SHA's main push CI ran its four required jobs green ([#148 make
92
+ record](https://github.com/junghan0611/entwurf/issues/148#issuecomment-6353660427)), and npm
93
+ `latest` is 0.41.1 (published 2026-10-22T23:49:43.983Z), byte-equal to the accepted
94
+ Windows-bearing candidate ([#148 publication
95
+ record](https://github.com/junghan0611/entwurf/issues/148#issuecomment-6354276182)). When main
96
+ moved to `6a88436`, its Herdr lock was the `herdr-checkout` carrier, so until this snapshot
97
+ lands a main-tracking `herdr plugin install` acquires the checkout commit rather than an npm
98
+ artifact. Neither the published tarball's CHANGELOG nor the core release page is amended by
99
+ this snapshot.
100
+
101
+ ### Herdr plugin
102
+
103
+ - **Re-pin the published core 0.41.1 and close the checkout window.**
104
+ `plugins/herdr/runtime-lock.json` returns from the `herdr-checkout` carrier that the Pi 1.4.0
105
+ SDK candidate rode to production npm source `@junghanacs/entwurf@0.41.1` with the registry's
106
+ measured sha512 (`sha512-GEKfcpFC…xWqw==`). The plugin manifest moves 0.41.0 → 0.41.1;
107
+ admission remains Herdr >= 0.9.0 and the one-build/one-pane/Linux shape is unchanged. From
108
+ the `v2026.10.22-herdr.0.41.0` snapshot to `v0.41.1`, the changes under `plugins/herdr/`,
109
+ `scripts/herdr-runtime.mjs` and `scripts/fixtures/herdr-supply.json` were that lock's return
110
+ to `herdr-checkout` and the plugin README's candidate wording; the runtime helper and the
111
+ Herdr supply pin did not change.
112
+ - **Pi 1.4 is now required.** The acquired runtime carries the Pi 1.4.0 SDK set and accepts Pi
113
+ `>=1.4.0 <1.5`; the previous snapshot's runtime accepted Pi `>=1.3.0 <1.4`. Upgrade Pi to 1.4
114
+ first, then install or reinstall the plugin: a host still on Pi 1.3 is refused at activation
115
+ by name (`outside the supported range`), the check `entwurf setup` applies, and no Pi
116
+ settings are written.
117
+ - **Upgrade by acquisition source, not just version.** A settled npm-source 0.41.0
118
+ installation can rebind under the plugin README's ownership conditions. A host that
119
+ installed a `herdr-checkout` candidate — from main at `6a88436` or from a validation branch —
120
+ must explicitly deactivate by its own absolute runtime path before reinstalling the
121
+ npm-source snapshot. No operator installation or active session is rewired by this release
122
+ work.
123
+ - **What the acquired runtime carries, and what this path does not.** The runtime ships core
124
+ 0.41.1's bytes, including its nine-tool bridge and the pi-durable carrier. Herdr wires and
125
+ opens only `{pi, claude-code}`, so this plugin path launches no pi-durable session and makes
126
+ no claim about migrating durable-session storage. Inside Herdr, `entwurf_resume_call` still
127
+ refuses as `herdr-resume-unsupported`.
128
+ - **README.** The quick start and nine steps drop the candidate's `--ref "$CANDIDATE_REF"`
129
+ instructions and install against the ref Herdr resolves; the Pi step keeps `>=1.4.0 <1.5`,
130
+ and the runtime paragraph names npm 0.41.1 and points at the previous snapshot for Pi 1.3.x.
131
+ - **Current install docs.** The root README and the clean-host setup guide replace their "not
132
+ published to npm yet / newest published 0.41.0" install text with the published 0.41.1 and its
133
+ Pi 1.4.x requirement, and point at the previous 0.41.0 for Pi 1.3.x. Moving a live host onto
134
+ 0.41.1 remains a separate operator decision for each host, with the durable-session backup,
135
+ owner-exit and no-rollback boundaries unchanged.
136
+
137
+ ### Source-specific verification
138
+
139
+ - Registry metadata reports `latest` 0.41.1 and `repair` 0.12.8-repair.1, 642 files, published
140
+ 2026-10-22T23:49:43.983Z. The downloaded registry tarball is byte-equal (SHA256 and `cmp`) to
141
+ the preserved accepted core candidate (SHA256
142
+ `0172b049edde352d404b1119e330852b92ce235e3f2809e06d1ef0e71c95b95f`, 11406938 bytes); its
143
+ independently computed sha512 and sha1 equal `dist.integrity` and `dist.shasum`. Core make
144
+ already ran its container consumer against those same 0.41.1 bytes (repoDigest
145
+ `node@sha256:6dac556d…`, image ID `sha256:55ab623b…`, both recorded in make's artifact
146
+ receipt), so that result is reused here, not repeated. The new registry acquisition and
147
+ dependency resolution are closed separately: a sandboxed global npm install of the registry
148
+ package passed its installed `check-bridge` with nine tools, and a sandboxed `pi install`
149
+ resolved its bridge inside the sandbox, recorded the registry URL with that integrity, and
150
+ printed seven `entwurf` model rows (plus the header) including the curated Claude anchors.
151
+ The only checkout input of that `pi install` check, the bridge resolver script, is unchanged
152
+ on this branch. No model turn. The accepted run stripped every `PI_`, `ENTWURF_`, `CLAUDE`,
153
+ `CODEX_HOME`, `TMUX` and `HERDR_` carrier. These rows do not cover the runtime Herdr acquires
154
+ in use — its bins, its `check-bridge`, or the installed CLI's deactivate path — which belong
155
+ to the public-ref journey below. npm 11.16 listed the package's `postinstall` chmod as not
156
+ yet covered by `allowScripts`; whether that script ran was not checked. The installed
157
+ `entwurf` of the global install ran and its `check-bridge` exited 0.
158
+ - **The npm runtime swap against the real registry**, by the registry-shipped
159
+ `scripts/herdr-runtime.mjs` (byte-equal to this checkout's) in sandboxed user roots, 22/22
160
+ checks. The 0.41.0 runtime was seeded from its own committed lock (`addcb8c`); the swap to
161
+ 0.41.1 took one acquisition, the cached tarball's sha512 equals the lock and its sha256 equals
162
+ both the ready journal's observed digest and the accepted candidate. The `installing` journal
163
+ carried the 0.41.0 identity as `previousRuntime` and the `runtime-ready` journal carries
164
+ `null`; when acquisition began the 0.41.0 tree was still at the active address. A manually
165
+ seeded torn swap (the active tree moved to the backup address with a half candidate in
166
+ staging; not a killed process) was restored before acquisition and reported `recovered:
167
+ torn-swap-with-candidate`. An exact re-request acquired nothing and left journal and tree
168
+ byte-identical, and the owned removal reclaimed cache, runtime and journal. The helper is a
169
+ leaf that probes no Pi, so these cells certify neither a Pi upgrade nor Herdr's
170
+ install/update relocation, harness wiring, the installed CLI's deactivate path, a model turn,
171
+ or recovery from a real kill.
172
+ - **Focused gates, by surface.** On the pin surface (lock, manifest, plugin README and this
173
+ section before its later amendments), with HEAD, index and work surface unchanged across them:
174
+ `check-herdr-supply` (11 assertions), `check-herdr-plugin` (49),
175
+ `check-herdr-plugin-profile` (14), `check-herdr-runtime-bootstrap` (31),
176
+ `check-herdr-activation` (33), `check-herdr-placement` (25), `check-herdr-fresh-call` (45),
177
+ `check-herdr-plugin-build` (21, its real-binary cell on herdr 0.9.5), `check-herdr-sandbox`
178
+ (12, a private herdr 0.9.5 server), `check-dep-versions` (Pi 1.4.0 coherent),
179
+ `check-install-surface`, `check-claude-floor-coherence` and `check-gate-manifests` (1178
180
+ committed mutants across 85 lanes validated, none executed). After the root README, setup
181
+ guide and NEXT changes, the seven gates those documents affect ran again on that later
182
+ surface, unchanged across them: `check-dep-versions`, `check-node-floor-coherence`,
183
+ `check-claude-floor-coherence`, `check-pi-runtime-version`, `check-herdr-plugin` (49),
184
+ `check-install-surface` and `check-entwurf-v2-surface` (99). Neither set certifies the final
185
+ amended surface; that is closed by the frozen FULL.
186
+ - Pending, and not claimed here: the pushed SHA's four-job CI and the public-ref
187
+ install/use/deactivate journey of this npm pin, on Herdr 0.9.5 (the binary
188
+ `scripts/fixtures/herdr-supply.json` names) with Pi 1.4.0. Earlier npm or checkout-carrier
189
+ receipts cannot certify these source-specific axes. Those outcomes are recorded in the
190
+ snapshot's post-push acceptance ledger, not in this frozen text.
191
+
192
+ ## 0.41.1 — 2026-10-23
193
+
194
+ **Unpublished candidate; release acceptance is not complete.** The actual operator
195
+ transition and Native aggregate below have been measured. Final prepared-SHA CI and
196
+ the requested manual BODY, the exact carrier-bearing artifact, main promotion, tags
197
+ and publication remain separate gates. Main still carries the published 0.41.0 Herdr
198
+ lock: promoting the checkout lock can change what main-tracking installations acquire.
199
+ A validation artifact or an earlier checkpoint's green run is not final acceptance.
200
+
201
+ ### Pi 1.4.0 reference shell
202
+
203
+ - Move the coherent nine-member production SDK set from exact 1.3.0 to exact 1.4.0,
204
+ keeping Entwurf's owned app/TUI composition and deterministic carrier emission.
205
+ The SDK owns execution, storage, queues, compaction and recovery; this adds no second
206
+ engine, supervisor, automatic retry policy or credential surface. The ordinary Pi
207
+ adapter's supported range becomes `>=1.4.0 <1.5`.
208
+ - Show sleeping tasks in the background-task tally, their local wake time in the task
209
+ panel, and the SDK's blocked reason verbatim. Keep cancellation distinct from retry;
210
+ no new retry command or UI is added.
211
+ - Adapt the ACP vendor-rejection test to pi-ai 1.4's bounded HTTP-status matching:
212
+ digits inside opaque request/tool ids no longer classify as transient. The raw
213
+ `Internal error` control remains transient. The production non-replay verdict and
214
+ raw diagnostic preservation are unchanged.
215
+ - Add SDK 1.3 public-API-generated SQL fixtures and independent SQLite conformance
216
+ tests for the SDK 1.4 schema transition, row/index preservation, constraints,
217
+ reopening and future-version refusal. These are SDK conformance, not a local
218
+ mutation claim over the upstream engine. Keep fixture data and its generator out
219
+ of installed packages, with npm packlist and tarball-floor checks.
220
+ - Separate this unpublished candidate's checkout instructions from public npm
221
+ 0.41.0 / SDK 1.3 instructions. The Herdr lock uses the closed `herdr-checkout`
222
+ verification carrier; it invents no unpublished npm integrity. No new Herdr
223
+ snapshot or registry publication is implied.
224
+ - Keep the Codex LIVE fixture callback-only on its outbound Pi leg. Asking for an
225
+ extra ACK created a fourth real tool call while the audit required three. The
226
+ exact-three, nonce and terminal-turn assertions remain unchanged; only the two
227
+ matching task strings changed, not production routing or retry behavior.
228
+ - Trim historical platform details, dated labels and duplicated lifecycle prose
229
+ from the README while retaining operator consent, unknown-outcome handling,
230
+ platform limits and the published-versus-candidate install distinction.
231
+
232
+ ### Upgrade boundary
233
+
234
+ Opening each existing durable session with SDK 1.4 migrates its SQLite storage to
235
+ schema 2. SDK 1.3 / Entwurf 0.41.0 refuses that session. Reinstalling the older package
236
+ is not data rollback: restoring a pre-upgrade backup reopens the old data, but omits
237
+ work done after that backup. Database restoration does not undo external messages,
238
+ tool/file/network effects, meta records or mailbox read receipts. Preserve the newer
239
+ set and inspect unknown outcomes before considering a restore or resend.
240
+ Even a refused SDK 1.4 open can change the file header
241
+ and sidecars while preserving logical rows (measured on a future-schema copy). Back up the complete target session
242
+ file set before its first new-SDK open.
243
+
244
+ Close the old owner normally and prove the process has exited before cutover. A
245
+ stale lock is not proof: a bounded, SQLite-free fixture reproduced a stalled but live
246
+ owner losing its lock. This lock behavior already existed in 0.41.0. Use the resume
247
+ picker to select the intended session rather than guessing with `--continue`.
248
+
249
+ SDK 1.4 counts a task SDK 1.3 left running as an interrupted run at its first open;
250
+ SDK 1.4's own normal close does not add a restart. Repeated interruptions can park a
251
+ task at the restart limit. Inspect outcomes before any resend; cancellation is not
252
+ retry, and recovery of an actual parked model generation remains unmeasured.
253
+
254
+ ### Preparation and operating evidence — not final release acceptance
255
+
256
+ Implementation checkpoint `3ed079b` follows independent source/proof reviews. Its
257
+ earlier working candidate passed the deterministic FULL floor in 885 seconds with
258
+ source/index unchanged, carrier 45 tests, storage conformance 11 tests, and ACP
259
+ vendor rejection 14 tests. The final pre-commit vocabulary sweep then changed one
260
+ harness-table SDK literal into a reference to the pin authority, independently read
261
+ and checked. These are implementation-era observations, not this prepared version's
262
+ FULL, native LIVE, installed artifact, operating-session migration or exact-SHA CI.
263
+
264
+ Private sandbox observations separately cover old-package refusal, backup restoration
265
+ and loss of later marker work, SDK task replay/parking, candidate shell open/close,
266
+ SDK 1.3-born fixture identity carried into the SDK 1.4 shell, and in-process open
267
+ failure releasing the session lock. Parked non-generation Hold tasks did not block
268
+ root input; conversation abort cancelled only the non-background Hold. None proves
269
+ real model-generation continuity or an operating citizen's actual upgrade.
270
+
271
+ Kill-power re-measured at this shipped SHA: none (all 1178 committed claims not
272
+ re-proved, #144).
273
+
274
+ That required line records the source's preparation-time measurement state, not a
275
+ prediction of later CI. GLG separately requested manual BODY evidence. The earlier
276
+ validation SHA `ff86c88bd58ba776e15ef48e1e4be566971a3e9a` has a four-job green push run
277
+ [39790950791](https://github.com/junghan0611/entwurf/actions/runs/39790950791) and a
278
+ separate `workflow_dispatch qualify=true` run
279
+ [39792701159](https://github.com/junghan0611/entwurf/actions/runs/39792701159): 85 lanes,
280
+ 1178 unique claims KILLED, survived/error/skipped 0. Those are that SHA's receipts,
281
+ not this later prepared SHA's. Its requested exact-SHA CI/BODY results must be recorded
282
+ separately in [#148's live evidence thread](https://github.com/junghan0611/entwurf/issues/148#issuecomment-6348113761);
283
+ no future result is invented here and the standing release policy is unchanged.
284
+
285
+ Earlier-candidate PARTIAL (operator-attested, not this SHA): head addcb8cd0bac surface
286
+ 6a9481bc357c -- `["bash","run.sh","check-dep-versions"]` 4/4 receipt 48d085e06816.
287
+
288
+ Earlier-candidate PARTIAL (operator-attested, not this SHA): head addcb8cd0bac surface
289
+ 6a9481bc357c -- `["bash","run.sh","check-pack-pin-matcher"]` 2/2 receipt 593dd0401502.
290
+
291
+ Earlier-candidate PARTIAL (operator-attested, not this SHA): head addcb8cd0bac surface
292
+ 6a9481bc357c -- `["bash","run.sh","check-pi-durable-carrier"]` 35/35 receipt 258f783406a7.
293
+
294
+ Earlier-candidate PARTIAL (operator-attested, not this SHA): head ff86c88bd58b surface
295
+ 7c75301f53a9 -- `["bash","run.sh","check-release-gate-outcomes"]` 21/21 receipt 251b71584442.
296
+
297
+ Earlier-candidate PARTIAL (operator-attested, not this SHA): head ff86c88bd58b surface
298
+ 7c75301f53a9 -- `["bash","run.sh","check-mux-fresh-call"]` 150/150 receipt 56c3558f9a15.
299
+
300
+ Both ff86c88 PARTIAL receipts were taken with the Codex fixture correction still
301
+ uncommitted on that head, on the recorded working surface.
302
+
303
+ The versioned working candidate's earlier FULL completed in 890 seconds, exit 0,
304
+ with source/index unchanged (log SHA256 `757115f291c05f397631f6e8de48a2b77fdfde973d5219edf70e63658c3b8e88`).
305
+ It predates later checkpoint metadata and is not a final committed-SHA CI result.
306
+
307
+ **Actual operator transition:** after the human closed the original owners and their
308
+ exit was proven with the scheme-aware owner classifier, the complete session file
309
+ set was consistently backed up without opening SQLite. The exact Linux validation
310
+ tarball (`92e5b2722ab8063d2bc50936db358a36a02a5e92e36babc3e1fbf98b399c2f44`)
311
+ was accepted unchanged in a container, separately exercised through an isolated pnpm
312
+ global old-to-new takeover, then installed as the operator's 0.41.1/SDK 1.4 runtime.
313
+ User-scope extension loading and doctors passed. The coordinator resumed the actual
314
+ old conversation: garden/native/createdAt/cwd stayed unchanged, a new owner attached,
315
+ a real model turn recalled the pre-close agreement and used tools, and four
316
+ send/read/reply/read receipts closed a round trip with an existing Claude Code sibling.
317
+ The human-reopened Pi reviewer also confirmed its identity, model, tools and recall.
318
+ No separate live DB query or universal transcript/parked-generation recovery claim is
319
+ made. This addon-less Linux validation tarball is not the carrier-bearing release file.
320
+
321
+ **Native aggregate:** the first run at `ff86c88` was MUST 23/1/0 and BEHAVIOR 1/0/0:
322
+ the extra requested ACK was a fourth distinct call, not parser duplication. Its raw
323
+ failure is preserved. After the scoped fixture correction, an affected fresh Codex
324
+ run passed 66 assertions with both terminal audits exactly 3/3. The new full run at
325
+ `a9d05847295230ed58f53b0bfd689d9ebd6ac1da` then passed **MUST 24/0/0,
326
+ BEHAVIOR 1/0/0**, including the deterministic FULL; source/index stayed unchanged.
327
+ The operator still used the **ff86c88 validation install**, not an installed a9d0584
328
+ artifact. Its runtime closure (bridge dist, pi-durable carrier, bootstrap and resolver)
329
+ was byte-identical to the checkout before and after the run; README and LIVE fixture
330
+ bytes differ. This is checkout-gate evidence with that installed runtime, not a claim
331
+ that the complete a9d0584 package was installed or accepted.
332
+ Scratch `/tmp/entwurf-release-gate-0.41.1-r2.cl0DDR`, log `release-gate.log`, SHA256
333
+ `020f489bf6fe024447bfc26a12f3499e5b80e844b0dcadf1e474e6adc8b4ae05`.
334
+ P9 was a read-only census: root 4.9 GiB and home 6.9 GiB free, with the existing
335
+ Emacs infrastructure identified rather than killed; current receipts and scratch
336
+ were preserved. Only the explicitly owned test app-server was normally stopped.
337
+
338
+ The final prepared-SHA push CI/manual BODY and Win32-bearing artifact acceptance
339
+ are still pending. The validation tarball has no Win32 addon; it cannot stand for
340
+ M3w or final macOS/Windows acceptance. No tag, GitHub release, npm publication,
341
+ Herdr re-pin or laptop rollout has occurred. Earlier 0.41.0 receipts below remain
342
+ historical.
343
+
344
+ ## v2026.10.22-herdr.0.41.0 — Herdr Entwurf plugin 0.41.0
345
+
346
+ A separate Herdr plugin snapshot, not another core release: core package 0.41.0 and its
347
+ `v0.41.0` tag remain unchanged. Core 0.41.0 is now published to npm; the publication is
348
+ verified from the registry, not from observing who ran it.
349
+
350
+ **Reading guide (2026-10-22).** The `## 0.41.0` section below and the body of the
351
+ [v0.41.0 GitHub release](https://github.com/junghan0611/entwurf/releases/tag/v0.41.0) are
352
+ prepare-time and make-time text: their npm wording (the Herdr lock's "unpublished candidate",
353
+ "npm publication each need their own approval") predates the publication. The publish is the later registry fact recorded in this section (`latest` 0.41.0,
354
+ published 2026-10-22T04:37:02.853Z, registry bytes equal to the accepted candidate). Neither the
355
+ published tarball's CHANGELOG nor the core release page is amended by this snapshot.
356
+
357
+ ### Herdr plugin
358
+
359
+ - **Re-pin the published core 0.41.0 and close the checkout window.**
360
+ `plugins/herdr/runtime-lock.json` returns from the `herdr-checkout` carrier that core 0.41.0
361
+ rode to production npm source `@junghanacs/entwurf@0.41.0` with the registry's measured
362
+ sha512 (`sha512-hSf6St0u…fBlvA==`). The plugin manifest moves 0.40.0 → 0.41.0; admission
363
+ remains Herdr >= 0.9.0 and the one-build/one-pane/Linux shape is unchanged. From the
364
+ `v2026.10.20-herdr.0.40.0` snapshot to `v0.41.0`, the changes under `plugins/herdr/`,
365
+ `scripts/herdr-runtime.mjs` and `scripts/fixtures/herdr-supply.json` were that lock's return
366
+ to `herdr-checkout` and the plugin README's resume/retire wording; the runtime helper and the
367
+ Herdr supply pin did not change.
368
+ - **What the acquired runtime now carries.** Core 0.41.0's lifecycle verbs ride in the runtime's
369
+ bytes: its installed bridge lists nine tools, `entwurf_retire_call` among them. Inside Herdr,
370
+ `entwurf_resume_call` still refuses as `herdr-resume-unsupported`. This snapshot measures no
371
+ retirement or resume through Herdr.
372
+ - **Pi range unchanged.** The acquired runtime still accepts Pi `>=1.3.0 <1.4`; core 0.41.0
373
+ keeps the Pi 1.3.0 SDK set.
374
+ - **Upgrade by acquisition source, not just version.** A settled npm-source 0.40.0 installation
375
+ can rebind under the plugin README's ownership conditions. A host that installed an
376
+ intervening `herdr-checkout` candidate must explicitly deactivate by its own absolute runtime
377
+ path before reinstalling the npm-source snapshot. No operator installation or active session
378
+ is rewired by this release work.
379
+ - **README.** The first-user-path receipt description no longer says the installed
380
+ `check-bridge` lists an eight-verb set; it names the verb set the installed bridge declares,
381
+ nine since 0.41.0.
382
+ - **Raw-install smoke scaffolding follows the Claude Code floor.** The first public-ref run of
383
+ `smoke-herdr-raw-install-live` at `cfdae0e` built its container with Claude Code 2.1.278, a
384
+ hand-kept pin from 2026-09-19, and the acquired 0.41.0 runtime refused to wire Claude below its
385
+ supported floor `>= 2.1.306` — the product's intended refusal, not a runtime defect. The smoke now
386
+ derives its exact Claude Code version from `package.json` `entwurf.claudeCodeFloor` instead of
387
+ retyping it. The product floor, the Pi, Herdr and Node pins and the smoke's end-state oracle are
388
+ unchanged.
389
+
390
+ ### Source-specific verification
391
+
392
+ - Registry metadata reports `latest` 0.41.0 and `repair` 0.12.8-repair.1, 642 files, published
393
+ 2026-10-22T04:37:02.853Z. The downloaded registry tarball is byte-equal to the preserved
394
+ accepted core candidate (SHA256 `2bd03ba900324a7c0882c2738c29593df0a1e4829fb3ae18d22be62186cf67ad`,
395
+ 11399545 bytes); its independently computed sha512 and sha1 equal `dist.integrity` and
396
+ `dist.shasum`, so core make's Docker consumer of those bytes (`node:24-bookworm`, repoDigest
397
+ `node@sha256:6dac556d…`) is reused here, not repeated. A sandboxed `pi install` of the
398
+ registry package resolved its bridge inside the sandbox, recorded the registry URL with that
399
+ integrity, and listed the curated Claude anchors with `--list-models entwurf`; a sandboxed
400
+ global npm install of the same package passed its installed `check-bridge` with nine tools.
401
+ No model turn. The accepted run stripped every `PI_`, `ENTWURF_`, `CLAUDE`, `CODEX_HOME`,
402
+ `TMUX` and `HERDR_` carrier and ran on the branch worktree, whose only checkout input (the
403
+ bridge resolver script) is unchanged; an earlier run from the clean tag HEAD left `TMUX` and
404
+ non-identity `PI_*` variables set and is kept only as a preliminary record.
405
+ - **The npm runtime swap against the real registry**, by the registry-shipped
406
+ `scripts/herdr-runtime.mjs` (byte-equal to this checkout's) in sandboxed user roots, 22/22
407
+ checks. The 0.40.0 runtime was seeded from its own committed lock (`036e268`); the swap to
408
+ 0.41.0 took one acquisition, the cached tarball's sha512 equals the lock and its sha256 equals
409
+ both the ready journal's observed digest and the accepted candidate. The `installing` journal
410
+ carried the 0.40.0 identity as `previousRuntime` and the `runtime-ready` journal carries
411
+ `null`; when acquisition began the 0.40.0 tree was still at the active address. A manually
412
+ seeded torn swap (the active tree moved to the backup address with a half candidate in
413
+ staging; not a killed process) was restored before acquisition and reported `recovered:
414
+ torn-swap-with-candidate`. An exact re-request acquired nothing and left journal and tree
415
+ byte-identical, and the owned removal reclaimed cache, runtime and journal. The helper is a
416
+ leaf that probes no Pi, so these cells certify neither a Pi upgrade nor Herdr's
417
+ install/update relocation, harness wiring, the installed CLI's deactivate path, a model turn,
418
+ or recovery from a real kill.
419
+ - **Focused gates on the branch**, with HEAD, index and work surface unchanged across them:
420
+ `check-herdr-supply` (11 assertions), `check-herdr-plugin` (49),
421
+ `check-herdr-plugin-profile` (14), `check-herdr-runtime-bootstrap` (31),
422
+ `check-herdr-activation` (33), `check-herdr-placement` (25), `check-herdr-fresh-call` (45),
423
+ `check-herdr-plugin-build` (21, its real-binary cell on herdr 0.9.5), `check-herdr-sandbox`
424
+ (12, a private herdr 0.9.5 server), `check-dep-versions`, `check-install-surface` and
425
+ `check-gate-manifests` (1173 committed mutants across 85 lanes validated, none executed).
426
+ - Pending, and not claimed here: the pushed SHA's four-job CI and the public-ref
427
+ install/use/deactivate journey of this npm pin, on Herdr 0.9.5 (the binary
428
+ `scripts/fixtures/herdr-supply.json` names) with Pi 1.3.0, from the public `main` ref rather
429
+ than the tag. Earlier npm or checkout-carrier receipts cannot certify these source-specific
430
+ axes. Those outcomes are recorded in the snapshot's post-push acceptance ledger, not in this
431
+ frozen text.
432
+
7
433
  ## 0.41.0 - 2026-10-22
8
434
 
9
435
  A sibling's garden id is its birthday, and this cut lets it rest and come back under it. A