@junghanacs/entwurf 0.41.2 → 0.50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/AGENTS.md +4 -2
  2. package/BASELINE.md +110 -1
  3. package/CHANGELOG.md +328 -0
  4. package/CONTRIBUTING.md +1 -1
  5. package/ENTWURF-CLI.json +1229 -0
  6. package/ENTWURF.json +284 -0
  7. package/FAQ.md +4 -4
  8. package/README.md +125 -184
  9. package/VERIFY.md +2 -2
  10. package/docs/external-mcp-host.md +3 -3
  11. package/docs/setup-clean-host.md +37 -12
  12. package/mcp/entwurf-bridge/dist/ENTWURF.json +284 -0
  13. package/mcp/entwurf-bridge/dist/mcp/entwurf-bridge/src/index.js +46 -196
  14. package/mcp/entwurf-bridge/dist/pi-extensions/lib/agent-guidance.js +299 -0
  15. package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-surface.js +21 -25
  16. package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-visible-resume.js +498 -29
  17. package/mcp/entwurf-bridge/dist/pi-extensions/lib/fresh-call-dispatch.js +47 -10
  18. package/mcp/entwurf-bridge/dist/pi-extensions/lib/herdr-fresh-call.js +613 -33
  19. package/mcp/entwurf-bridge/dist/pi-extensions/lib/herdr-resume-call.js +497 -0
  20. package/mcp/entwurf-bridge/dist/pi-extensions/lib/meta-session.js +3 -1
  21. package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-fresh-call.js +23 -20
  22. package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-resume-call.js +68 -21
  23. package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-fresh-preflight.js +7 -1
  24. package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-location.js +347 -0
  25. package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-owner-fence.js +1132 -0
  26. package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-runtime.js +1 -0
  27. package/mcp/entwurf-bridge/dist/pi-extensions/lib/remote-pair-send.js +7 -4
  28. package/mcp/entwurf-bridge/dist/pi-extensions/lib/resume-launch-identity.js +18 -11
  29. package/mcp/entwurf-bridge/dist/pi-extensions/meta-bridge-pi-durable.js +53 -60
  30. package/mcp/entwurf-bridge/dist/scripts/herdr-rails.mjs +40 -7
  31. package/mcp/entwurf-bridge/dist/scripts/meta-bridge-fresh-cut.js +1 -27
  32. package/mcp/entwurf-bridge/dist/scripts/meta-bridge-prune.js +1 -1
  33. package/mcp/entwurf-bridge/dist/scripts/meta-facts.js +1 -1
  34. package/mcp/entwurf-bridge/dist/scripts/peer-facts.js +1 -1
  35. package/mcp/entwurf-bridge/src/index.ts +149 -327
  36. package/mcp/entwurf-bridge/tsconfig.build.json +7 -1
  37. package/native/win32-x64/manifest.json +1 -1
  38. package/package.json +8 -4
  39. package/pi/pi-durable/bootstrap.mjs +179 -6
  40. package/pi/pi-durable/carrier/runtime.js +108 -9
  41. package/pi/pi-durable/carrier/session-name.js +11 -0
  42. package/pi/pi-durable/carrier/sessions.js +96 -20
  43. package/pi/pi-durable/overlay/upstream-pin.json +11 -5
  44. package/pi-extensions/lib/agent-guidance.ts +341 -0
  45. package/pi-extensions/lib/entwurf-v2-surface.ts +25 -31
  46. package/pi-extensions/lib/entwurf-v2-visible-resume.ts +725 -54
  47. package/pi-extensions/lib/fresh-call-dispatch.ts +64 -12
  48. package/pi-extensions/lib/herdr-fresh-call.ts +919 -40
  49. package/pi-extensions/lib/herdr-resume-call.ts +810 -0
  50. package/pi-extensions/lib/meta-session.ts +13 -8
  51. package/pi-extensions/lib/mux-fresh-call.ts +23 -26
  52. package/pi-extensions/lib/mux-resume-call.ts +95 -23
  53. package/pi-extensions/lib/pi-durable-fresh-preflight.ts +9 -2
  54. package/pi-extensions/lib/pi-durable-location.ts +446 -0
  55. package/pi-extensions/lib/pi-durable-owner-fence.ts +1461 -0
  56. package/pi-extensions/lib/pi-durable-runtime.ts +4 -0
  57. package/pi-extensions/lib/remote-pair-send.ts +7 -4
  58. package/pi-extensions/lib/resume-launch-identity.ts +31 -12
  59. package/pi-extensions/meta-bridge-pi-durable.ts +52 -79
  60. package/run.sh +417 -654
  61. package/scripts/build-bridge.sh +10 -0
  62. package/scripts/check-capability-bundle-reach.ts +86 -0
  63. package/scripts/check-claude-launch.ts +341 -0
  64. package/scripts/check-entwurf-self-address.ts +3 -3
  65. package/scripts/check-entwurf-v2-surface.ts +94 -98
  66. package/scripts/check-fresh-call-dispatch.ts +70 -9
  67. package/scripts/check-fresh-cut-gate.sh +23 -9
  68. package/scripts/check-gate-qualification.ts +24 -17
  69. package/scripts/check-herdr-activation.ts +301 -23
  70. package/scripts/check-herdr-fresh-call.ts +161 -25
  71. package/scripts/check-herdr-plugin-build.ts +173 -1
  72. package/scripts/check-herdr-plugin.ts +28 -2
  73. package/scripts/check-herdr-runtime-bootstrap.ts +136 -0
  74. package/scripts/check-install-surface.ts +1236 -6
  75. package/scripts/check-meta-doctor-oracle.sh +1 -1
  76. package/scripts/check-meta-facts.ts +20 -1
  77. package/scripts/check-mux-resume-call.ts +48 -3
  78. package/scripts/check-peer-facts.ts +39 -2
  79. package/scripts/cli-help.mjs +222 -0
  80. package/scripts/dev-bin.sh +39 -2
  81. package/scripts/herdr-activation.mjs +28 -6
  82. package/scripts/herdr-operator-link.mjs +389 -0
  83. package/scripts/herdr-plugin-activate.mjs +5 -0
  84. package/scripts/herdr-plugin-deactivate.mjs +18 -5
  85. package/scripts/herdr-rails.mjs +43 -7
  86. package/scripts/herdr-runtime.mjs +27 -0
  87. package/scripts/meta-bridge-fresh-cut.ts +1 -27
  88. package/scripts/meta-bridge-prune.ts +1 -1
  89. package/scripts/meta-facts.ts +1 -1
  90. package/scripts/mutants/agent-guidance.json +160 -0
  91. package/scripts/mutants/bridge-boot-resume.json +6 -8
  92. package/scripts/mutants/capability-bundle-reach.json +124 -0
  93. package/scripts/mutants/claude-launch.json +142 -0
  94. package/scripts/mutants/cli-help-source.json +420 -0
  95. package/scripts/mutants/control-send-receipt.json +21 -4
  96. package/scripts/mutants/dev-gate-dispatch.json +109 -0
  97. package/scripts/mutants/fresh-call-dispatch.json +38 -2
  98. package/scripts/mutants/fresh-cut.json +15 -0
  99. package/scripts/mutants/herdr-activation.json +128 -0
  100. package/scripts/mutants/herdr-fresh-call.json +278 -5
  101. package/scripts/mutants/herdr-operator-link.json +318 -0
  102. package/scripts/mutants/herdr-plugin-build.json +55 -0
  103. package/scripts/mutants/herdr-plugin.json +17 -0
  104. package/scripts/mutants/herdr-resume-call.json +288 -0
  105. package/scripts/mutants/herdr-runtime-bootstrap.json +48 -0
  106. package/scripts/mutants/meta-facts.json +15 -0
  107. package/scripts/mutants/mux-fresh-call.json +14 -3
  108. package/scripts/mutants/mux-resume-call.json +89 -3
  109. package/scripts/mutants/peer-facts.json +15 -0
  110. package/scripts/mutants/pi-durable.json +996 -6
  111. package/scripts/mutants/remote-pair-send.json +21 -2
  112. package/scripts/mutants/self-address.json +10 -10
  113. package/scripts/mutants/source-install.json +35 -0
  114. package/scripts/mutants/v2-surface.json +50 -64
  115. package/scripts/mutants/v2-visible-resume.json +266 -6
  116. package/scripts/peer-facts.ts +1 -1
  117. package/scripts/smoke-agy-install-state.sh +66 -0
  118. package/scripts/smoke-meta-prune.sh +23 -0
  119. package/scripts/smoke-omp-fresh-live.ts +12 -3
  120. package/scripts/smoke-omp-receive-live.ts +7 -1
  121. package/scripts/smoke-pi-durable-fresh-live.ts +12 -2
  122. package/team.json.example +39 -0
package/README.md CHANGED
@@ -1,10 +1,9 @@
1
1
  # entwurf
2
2
 
3
- `entwurf` connects independent agent harnesses as visible siblings: open a new session,
4
- reopen a supported dormant sibling in tmux, or reach an existing sibling by **garden id**. Fresh
5
- sessions open in the caller's Herdr workspace or tmux session by default; explicit tmux
6
- placement can name another existing session. Each harness keeps its own runtime,
7
- authentication, tools and transcript.
3
+ `entwurf` connects independent agent harnesses as visible siblings. Open a fresh sibling, or reopen
4
+ or message an existing one by its **garden id**. Every harness keeps its own runtime,
5
+ authentication, tools and transcript; Entwurf adds identity, delivery, receipts and named
6
+ lifecycle verbs.
8
7
 
9
8
  ![entwurf — a forged screwdriver for visible sibling sessions](docs/assets/entwurf-hero.jpg)
10
9
 
@@ -17,107 +16,83 @@ A recorded source-checkout demo: callback → task → native Bash → reply.
17
16
 
18
17
  [![npm](https://img.shields.io/npm/v/@junghanacs/entwurf?logo=npm)](https://www.npmjs.com/package/@junghanacs/entwurf) · maintained by [junghanacs.com](https://junghanacs.com/)
19
18
 
20
- A sibling is a visible session with its own runtime boundary, not a disposable
21
- worker or a subagent of a new central harness. Entwurf supplies identity, delivery,
22
- receipts and named lifecycle verbs; the operator and native harnesses keep steering.
23
- Git branches, worktrees, file isolation and internal delegation remain their concern.
19
+ ## Why
20
+
21
+ - **Siblings, not workers.** A sibling is a visible session with its own runtime boundary, not a
22
+ disposable worker or a subagent of a new central harness. You and the native harnesses keep
23
+ steering; branches, worktrees, file isolation and internal delegation stay their concern.
24
+ - **Native harnesses stay native.** Claude Code keeps its hooks and tools, Codex its own threads and
25
+ delegation, pi its extensions. Entwurf reconstructs no prompt, hydrates no transcript and mediates
26
+ no credential.
27
+ - **One address.** A garden id names a record-backed citizen. A pane, socket, native session id or
28
+ model is a carrier or an observation, never a second address.
29
+ - **The same verbs on both screens.** In an ordinary tmux session or inside a Herdr workspace, a
30
+ sibling opens and reopens beside you through the same tools. The rail follows where the caller
31
+ runs, with no fallback from one to the other.
32
+
24
33
  [Short answers: FAQ](./FAQ.md).
25
34
 
26
- | Verb | Tool | Where it lands | Harnesses |
35
+ ## The four verbs
36
+
37
+ | Verb | Tool | What it does | Harnesses |
27
38
  |---|---|---|---|
28
- | **Open** a new sibling | `entwurf_fresh_call` | Herdr: a new unfocused tab in the caller's workspace. tmux: a new window in the caller's session, or an existing session named by `placement.tmuxSession`; without an explicit tmux placement, a Codex caller opens beside its own TUI pane | Herdr: pi, Claude Code. tmux: pi, pi-durable, Claude Code, Copilot, OMP, Codex |
29
- | **Reopen** a dormant sibling | `entwurf_resume_call` | A visible tmux window under the same garden id, with its record selecting the native session (Pi: identity-checked recorded transcript supplies launch metadata; Claude Code: `claude --resume <session id>` at the record cwd); the verb submits no prompt | pi, Claude Code |
30
- | **Retire** one sibling the human operator explicitly requested | `entwurf_retire_call` | One guarded attempt on that target: a Pi shutdown request or Claude Code fd-pinned process termination. Refused/unknown outcomes remain possible; the record stays for guarded same-id return. Not a grant, a roster cleanup or an automatic retry | pi, Claude Code |
31
- | **Message** an existing sibling | `entwurf_v2` | Its own rail: control socket, self-fetch mailbox or native push; delivery starts no process | pi, pi-durable, Claude Code, Copilot, OMP, Codex (Antigravity native push is paused, #152) |
32
-
33
- Antigravity is a legacy citizen: an existing conversation registers itself, and Entwurf never
34
- launches one. Its native push is paused (#152): on the measured external path the agy language server
35
- refused Entwurf's calls for a missing CSRF token, so a message to it is refused as `native-push-paused`. A launch receipt is neither the new sibling's address nor proof that it
36
- processed its task; the sibling's own callback envelope supplies its garden id.
37
-
38
- The package holds the v2 core, native-harness bridges, a pi adapter and an ACP
39
- plugin. ACP is one ingress, not the boundary; pi is one adapter, not the center.
40
- Claude and Cortex Code are ACP backends. Codex and Antigravity stay native so they
41
- retain their own tools and work context. Capabilities differ by rail: a shipped
42
- citizen is not a promise of every lifecycle operation.
43
-
44
- [Releases](https://github.com/junghan0611/entwurf/releases) contain each cut's notes and acceptance
45
- receipts; [CHANGELOG](./CHANGELOG.md) records source history.
39
+ | **Open** | `entwurf_fresh_call` | Opens a new visible sibling beside the caller — a new Herdr tab, or a tmux window — and hands it a first task. The sibling's own callback supplies its garden id | tmux: pi, pi-durable, Claude Code, Copilot, OMP, Codex. Herdr: pi, pi-durable, Claude Code |
40
+ | **Reopen** | `entwurf_resume_call` | Reopens a dormant sibling under the same garden id, its record selecting the native session. Submits no prompt | pi, pi-durable, Claude Code |
41
+ | **Message** | `entwurf_v2` | Delivers to an existing sibling over its own rail. Starts no process | pi, pi-durable, Claude Code, Copilot, OMP, Codex |
42
+ | **Retire** | `entwurf_retire_call` | One guarded attempt on one sibling the human operator explicitly named. The record stays for a later same-id return | pi, Claude Code |
46
43
 
47
- ## Install
44
+ Every verb returns a receipt, not the sibling's turn result. Capabilities differ by rail, so a
45
+ shipped citizen is not a promise of every lifecycle operation; [DELIVERY](./DELIVERY.md) owns each
46
+ rail's admission. Antigravity is a legacy citizen: it registers an existing conversation, Entwurf
47
+ never launches one, and its native push is paused (#152).
48
48
 
49
- **Choose by where you work. Bring your own harnesses, subscriptions and login.**
50
- The native durable route below additionally supplies an app/TUI, Entwurf's own thin composition of
51
- the durable app upstream omits from its npm release; it does not supply credentials or take
52
- ownership of the harness.
49
+ Capabilities here describe this source and ref; an installed release can differ — see its
50
+ [release notes](https://github.com/junghan0611/entwurf/releases) and
51
+ [package-specific setup](./docs/setup-clean-host.md#requirements).
53
52
 
54
- ### Direct — ordinary shell or tmux
53
+ ## Install
55
54
 
56
- Prerequisites: **Node >=24.0.0**, Python 3 for `setup`, and any harnesses you choose
57
- to use, already installed and authenticated. Pi is optional-by-presence, supported
58
- range `>=1.4.0 <1.5`; Claude Code supported floor `>=2.1.306` is required for its
59
- managed exec-hook lifecycle. pnpm is needed only for source-checkout setup.
55
+ Bring your own harnesses, subscriptions and logins. Entwurf installs its own bytes and composes the
56
+ harnesses it finds; it needs Node 24 or newer, Python 3 for `setup`, and whichever harnesses you
57
+ use, already installed and signed in.
60
58
 
61
- **Release state.** The Pi range above belongs to the published 0.41.1, which ships the Pi
62
- 1.4.0 SDK set. The previous `0.41.0` ships the Pi 1.3.0 set and requires Pi 1.3.x; the README
63
- inside that tarball and the Herdr snapshot `v2026.10.22-herdr.0.41.0` are its contract.
59
+ ### Direct — ordinary shell or tmux
64
60
 
65
61
  ```bash
66
- npm install -g @junghanacs/entwurf@0.41.1
62
+ npm install -g @junghanacs/entwurf
67
63
  entwurf setup /path/to/your-project
68
64
  entwurf check-bridge
69
65
  ```
70
66
 
71
- `setup` composes each harness it finds and reports PASS / SKIP / FAIL. An absent
72
- harness is an explicit SKIP; a detected incomplete/below-floor integration is a
73
- named FAIL with nonzero exit, not a false green. `check-bridge` proves the installed
74
- MCP bytes boot and list tools without backend auth; it does **not** certify a real
75
- model turn or native receive rail.
76
-
77
- [Clean-host setup](./docs/setup-clean-host.md) owns project-local/source installs,
78
- config paths, optional backends, doctors, upgrade/repair and uninstall.
79
- Codex also needs your own hook-trust decision, app-server and exact-directory
80
- consent: [the operator steps](./docs/setup-clean-host.md#three-operator-decisions-before-fresh).
81
- Plain MCP registration alone does not make a garden citizen.
82
-
83
- **Platform bounds:** Linux is the certified harness-rail axis. macOS Entwurf-only
84
- installation is **CERTIFIED (CI)**; native harness rails, ACP and mux remain
85
- **NOT CERTIFIED — pending physical host**, so detected wiring can still leave setup non-green.
86
- WSL2 and native Windows have **experimental CI previews**, not general or physical-host support.
87
- The native-Windows preview covers Pi citizens and offline scripted delivery, not vendor turns,
88
- other harnesses, shell entrypoints, fresh/resume, mux, Herdr or ACP.
89
- [BASELINE](./BASELINE.md#release-host-baseline) owns the version-specific receipts and gaps;
90
- an npm package without an `os` restriction is not an all-platform certification.
67
+ `setup` composes each harness it finds and reports PASS / SKIP / FAIL. An absent harness is an
68
+ explicit SKIP; a detected incomplete or below-floor integration is a named FAIL with a nonzero exit,
69
+ not a false green. `check-bridge` proves the installed MCP bytes boot and list their tools without
70
+ backend auth; it does **not** certify a model turn or a receive rail.
91
71
 
92
- ### Native durable (pi-durable)
72
+ [Clean-host setup](./docs/setup-clean-host.md) owns the supported harness versions, installing a
73
+ chosen package version, project-local and source installs, the per-harness steps (Codex needs
74
+ [your own trust decision and app-server](./docs/setup-clean-host.md#three-operator-decisions-before-fresh)),
75
+ doctors, upgrade, repair and uninstall. Plain MCP registration alone does not make a garden citizen.
76
+ Linux is the certified harness-rail axis; [BASELINE](./BASELINE.md#release-host-baseline) owns the
77
+ macOS, WSL2 and native-Windows evidence split, and an npm package without an `os` restriction is not
78
+ an all-platform certification.
93
79
 
94
- **The package supplies Entwurf's owned app/TUI carrier and nine exact Pi 1.4.0 SDK
95
- members** (the previous 0.41.0 supplies the 1.3.0 set). No separate runtime checkout, patch, build or ordinary Pi CLI is needed.
96
- The launch verifies carrier integrity and every reachable SDK edge's name/version;
97
- incomplete, drifted or mixed supply refuses by name.
80
+ ### Native durable (pi-durable)
98
81
 
99
82
  ```bash
100
83
  entwurf pi-durable --provider <provider> --model <model-id> --width task-wide
101
84
  entwurf pi-durable --continue
102
85
  entwurf pi-durable --resume
86
+ entwurf pi-durable --session <native id>
103
87
  ```
104
88
 
105
- `--continue` opens this directory's latest-created durable session. `--resume` lists its
106
- sessions, most recently written first, by creation time, garden id and last write, and
107
- reopens the one you choose as it was saved; a cancelled choice opens nothing.
108
-
109
- The contact adds garden identity and two-way mailbox communication. Entwurf owns the
110
- thin app/TUI composition (shipped as an emitted JS carrier); execution, models/auth, queues,
111
- SQLite, transcripts and recovery remain the upstream SDK's:
112
- [Hard Rule 17](./AGENTS.md#hard-rules), **supply the missing surface; do not become the harness**.
113
-
114
- Optional `--native-module <absolute file>` initializes trusted ESM before runtime/TUI
115
- imports, then installs its default native Extension after the contact.
116
- `--native-module-dir <absolute directory>` loads that named directory's top-level
117
- `*.extension.mjs` files in byte-wise order instead. No automatic module discovery or
118
- classic Pi API shim; guards are not a sandbox or rollback.
119
- [Native setup](./docs/setup-clean-host.md#2b-optional-native-durable-pi-durable)
120
- owns flags, refusals and the extension contract.
89
+ The package supplies Entwurf's thin app/TUI carrier and the exact pi SDK set it declares; the launch
90
+ verifies both and refuses incomplete, drifted or mixed supply by name. No separate runtime checkout,
91
+ patch, build or ordinary Pi CLI is needed. The contact adds garden identity and two-way mailbox
92
+ communication; execution, models, auth, queues, storage and recovery stay the upstream SDK's
93
+ ([Hard Rule 17](./AGENTS.md#hard-rules): **supply the missing surface; do not become the harness**).
94
+ Selectors, native modules and refusals:
95
+ [setup §2b](./docs/setup-clean-host.md#2b-optional-native-durable-pi-durable).
121
96
 
122
97
  ### Herdr workbench
123
98
 
@@ -125,37 +100,36 @@ owns flags, refusals and the extension contract.
125
100
  herdr plugin install junghan0611/entwurf/plugins/herdr --yes
126
101
  ```
127
102
 
128
- The [Herdr guide](./plugins/herdr/README.md#from-a-raw-linux-box-in-nine-steps) says which
129
- runtime each ref installs.
103
+ This separate path activates Herdr-integrated **pi and Claude Code** with its own locked runtime
104
+ and an observation pane. By default it puts no Entwurf bins on PATH; a runtime that carries
105
+ `herdr-plugin-expose-operator` makes exactly one `entwurf` link, and only when you ask for it.
106
+ An Entwurf release does not re-pin that runtime by itself; the
107
+ [Herdr guide](./plugins/herdr/README.md#from-a-raw-linux-box-in-nine-steps) says which runtime each
108
+ ref installs and owns install, use, evidence and removal. The plugin owns neither delivery nor the
109
+ Herdr launch rail.
130
110
 
131
- This separate path activates Herdr-integrated **pi and Claude Code** with an
132
- independently locked runtime and an observation pane; it puts no Entwurf bins on PATH.
133
- An Entwurf release does not automatically re-pin that runtime: while 0.41.2 is an unpublished
134
- candidate, main's lock rides the `herdr-checkout` verification carrier, and the published 0.41.1
135
- runtime stays pinned by the Herdr tag `v2026.10.23-herdr.0.41.1`.
136
- [Herdr guide](./plugins/herdr/README.md) owns install, use, evidence and removal;
137
- the plugin does not own delivery or the Herdr launch rail.
111
+ ## First steps
138
112
 
139
- ### Garden launcher
140
-
141
- After direct setup, start a pi citizen in your project:
113
+ Start a citizen in your project:
142
114
 
143
115
  ```bash
144
116
  cd /path/to/your-project
145
117
  entwurf pi
146
- # equivalent when the package is registered (also the Herdr plugin's spelling):
147
- pi --entwurf-control
148
118
  ```
149
119
 
150
- `entwurf pi` execs your own pi with the control flag. A plain pi may load the
151
- package without becoming a citizen. The record mints the garden id; do not inject
152
- a session id. Native harness launch and manual Herdr argv instructions live in
153
- [setup §2–§5](./docs/setup-clean-host.md#2-optional-pi-adapter--acp-plugin).
120
+ `entwurf pi` execs your own pi with the control flag (`pi --entwurf-control` is equivalent once the
121
+ package is registered); the record mints the garden id, so do not inject a session id.
122
+ `entwurf claude [args…]` execs the `claude` on your PATH with its arguments unchanged; a Claude Code
123
+ session is a citizen through the hooks `entwurf install-meta-bridge` installed
124
+ ([setup §3](./docs/setup-clean-host.md#3-optional-claude-code-native-citizen)), however it started.
125
+ `entwurf pi-durable` is the durable contact above. `entwurf --help` is the quick overview of the
126
+ other entries and `entwurf help all` the full catalog; `entwurf help team` and
127
+ `entwurf help remote-pair` are the two guides.
154
128
 
155
- In that **harness session**, ask the agent to:
129
+ In that harness session, ask the agent to:
156
130
 
157
- 1. Call `entwurf_self` to confirm its authoritative identity.
158
- 2. Call `entwurf_peers` to discover existing citizens and their liveness facts.
131
+ 1. Call `entwurf_self` to confirm its identity.
132
+ 2. Call `entwurf_peers` to see existing siblings and their liveness facts.
159
133
  3. Pick a live garden id and call `entwurf_v2` with a message, for example:
160
134
 
161
135
  ```json
@@ -167,22 +141,12 @@ In that **harness session**, ask the agent to:
167
141
  }
168
142
  ```
169
143
 
170
- These are tools, not shell subcommands. Pi calls
171
- `mcp__entwurf_bridge__<verb>` through Pi's built-in MCP. The bridge exposes **nine**
172
- verbs; a pi citizen has **seven active + two hidden** (`entwurf_inbox_read` and
173
- `entwurf_register_native`), since it has no mailbox and its own extension births it.
174
- Those counts describe the source; a running host offers what its already-loaded bridge
175
- listed, so see [applying new source to a running host](./docs/setup-clean-host.md#applying-new-source-to-a-running-host).
176
- The server key stays `entwurf-bridge`. An operator/trusted-project MCP entry with
177
- that normalized namespace can replace the registration by Pi's own precedence;
178
- `/mcp` shows it, and Entwurf does not scan or fight that choice.
179
-
180
- ## Entwurf orchestration
144
+ These are MCP tools inside a session, not shell commands; pi reaches them as
145
+ `mcp__entwurf_bridge__<verb>` through its built-in MCP. A running host offers what its
146
+ already-loaded bridge listed:
147
+ [applying new source to a running host](./docs/setup-clean-host.md#applying-new-source-to-a-running-host).
181
148
 
182
- One narrow dispatch capability connects independent siblings, not an agent factory.
183
- The record is the **sole address authority**. A pane, socket, native transcript id,
184
- model or process marker is a carrier or observation, never a second address axis.
185
- Liveness is read at dispatch time; an id's shape does not tell you its transport.
149
+ ## How delivery works
186
150
 
187
151
  ### `entwurf_v2` — canonical dispatch verb
188
152
 
@@ -193,75 +157,50 @@ pi / pi-durable / Claude Code / Copilot / OMP / Antigravity / Codex
193
157
  → control-socket | self-fetch mailbox | native-push
194
158
  ```
195
159
 
196
- **Delivery starts no process.** A live pi receives over its record-addressed control
197
- address, an armed self-fetch citizen (Claude Code, Copilot, OMP, pi-durable) through its
198
- mailbox, a probe-alive native-push citizen (Codex; Antigravity is paused, #152) through its own
199
- conversation or thread. Anything else is refused honestly, never launched into. The receipt
200
- is a receiver acceptance boundary, a durable mailbox file or an injection, never completion;
201
- `wants_reply` is etiquette, not waiting. [DELIVERY](./DELIVERY.md#control-socket-acceptance-boundaries-120)
202
- owns what each boundary means and each rail's admission.
203
-
204
- The lifecycle verbs in the [table above](#entwurf) return their own receipts, never a delivery
205
- result: fresh a launch receipt (the sibling's callback envelope supplies its garden id), resume
206
- separate LAUNCH and OBSERVATION receipts, retire separate action, record and lock results.
207
- **Retirement is never autonomous:** it needs the human operator's explicit target and action, and
208
- no role, caller identity or tool annotation grants it ([DELIVERY](./DELIVERY.md#candidate-lifecycle-commands-are-not-delivery-boundaries-147)).
209
-
210
- **Mux launches; it never delivers.** Fresh opens in the caller's Herdr workspace or tmux session;
211
- `placement.tmuxSession` names another existing tmux session and is refused inside Herdr. The model
212
- is required and `cwd` is a literal absolute directory. Missing or ambiguous context refuses with no
213
- fallback. Exact argv, identity checks and limits: [tmux launch](./docs/mux-launch-rail.md),
214
- [Herdr launch](./docs/herdr-launch-rail.md).
215
-
216
- ### Remote siblings — declared pairs across hosts
217
-
218
- Opt-in. The v2 file below is in main and the 0.41.2 candidate; the published 0.41.1 reads the
219
- earlier single-pair file. On each host, write `~/.pi/agent/entwurf-remote-pair.json` (mode `0600`; a
220
- moved agent dir or meta store moves it, see [setup §2c](./docs/setup-clean-host.md#2c-optional-remote-pair-between-two-hosts-107)). The ids
221
- below are fictional; use your own records' garden ids:
222
-
223
- ```json
224
- {
225
- "version": 2,
226
- "routes": [
227
- {
228
- "localGardenId": "20260101T090000-a1b2c3",
229
- "remoteGardenId": "20260101T091500-d4e5f6",
230
- "ssh": "host-b",
231
- "remotePairFile": "/home/me/.pi/agent/entwurf-remote-pair.json"
232
- }
233
- ]
234
- }
235
- ```
236
-
237
- The other host carries the mirror route: the two garden ids swapped, its own SSH alias for this
238
- host, and this file's canonical absolute path. Then send with the ordinary `entwurf_v2` to the
239
- remote garden id: one SSH attempt over your own account, checked and dispatched by the host that
240
- holds the record. There is no peer discovery, wake or retry. Why: [remote sibling principles](./docs/remote-sibling-principles.md);
241
- contract: [DELIVERY](./DELIVERY.md#remote-pairs-107-149-declared-pairs-across-hosts); steps and the
242
- hand conversion from the earlier file: [setup §2c](./docs/setup-clean-host.md#2c-optional-remote-pair-between-two-hosts-107).
243
-
244
- ### Team bookmarks — `team.json`
245
-
246
- A person's bookmark of the siblings one project works with. Copy [`team.json.example`](./team.json.example)
247
- to an ignored `team.json` at the project root and fill names, backend, garden id, native session id
248
- and cwd from Entwurf's record facts; read liveness from `entwurf_peers` when you dispatch. Entwurf
249
- does not load it as runtime configuration, and it is not configuration for identity, routes, roles, permissions or lifecycle. The
250
- example's own notes say the rest.
160
+ **Delivery starts no process.** The record is the sole address authority, and liveness is read at
161
+ dispatch time: a live pi receives over its control address, an armed self-fetch citizen through its
162
+ mailbox, a probe-alive native-push citizen in its own conversation. Anything else is refused, never
163
+ launched into. The receipt is the receiver's acceptance boundary, a durable mailbox file or an
164
+ injection — never the sibling's turn result; `wants_reply` is etiquette, not waiting.
165
+ [DELIVERY](./DELIVERY.md#control-socket-acceptance-boundaries-120) owns what each boundary means.
166
+
167
+ **Lifecycle verbs keep their own receipts.** Open returns a launch receipt, not an address; reopen
168
+ separates its launch from its observation; retire reports action, record and lock separately.
169
+ **Retirement is never autonomous:** it needs the human operator's explicit target and action, and no
170
+ role, caller identity or tool annotation grants it
171
+ ([DELIVERY](./DELIVERY.md#candidate-lifecycle-commands-are-not-delivery-boundaries-147)).
172
+
173
+ **Lifecycle launch is separate from `entwurf_v2` delivery.** Open and reopen place a sibling in the
174
+ caller's Herdr workspace or tmux session; `placement.tmuxSession` names another existing tmux session and is refused inside Herdr.
175
+ Missing or ambiguous context refuses with no fallback:
176
+ [tmux launch](./docs/mux-launch-rail.md) · [Herdr launch](./docs/herdr-launch-rail.md).
177
+
178
+ ### Remote siblings and team bookmarks
179
+
180
+ **Remote pairs** are opt-in. Each host declares the pair in its own file, and `entwurf_v2` to the
181
+ remote garden id makes one SSH attempt over your own account, checked and dispatched by the host that
182
+ holds the record — no discovery, wake or retry. `entwurf help remote-pair`, the steps in
183
+ [setup §2c](./docs/setup-clean-host.md#2c-optional-remote-pair-between-two-hosts-107), the
184
+ [principles](./docs/remote-sibling-principles.md) and the
185
+ [contract](./DELIVERY.md#remote-pairs-107-149-declared-pairs-across-hosts).
186
+
187
+ **Team bookmarks:** [`team.json.example`](./team.json.example) is a person's note of the siblings one
188
+ project works with, copied to an ignored `team.json`. Entwurf never loads it as configuration for
189
+ identity, routes, roles, permissions or lifecycle. `entwurf help team`.
251
190
 
252
191
  ## Concepts
253
192
 
254
- **Entwurf** (기투, projection-of-self) connects independent visible siblings;
255
- **garden id** names a record-backed citizen, not its pane or native transcript.
256
- [FAQ](./FAQ.md) explains ACP, MCP and context carriers.
257
-
258
- ## Pi integration
193
+ **Entwurf** (기투, projection-of-self) connects independent visible siblings; a **garden id** names
194
+ a record-backed citizen, not its pane or native transcript. The package holds the v2 core, the
195
+ native-harness bridges, a pi adapter and an ACP plugin. ACP is one ingress, not the boundary; pi is
196
+ one adapter, not the center. Claude and Cortex Code are ACP backends; Codex and Antigravity stay
197
+ native so they keep their own tools and work context. The pi adapter registers the compiled bridge
198
+ with Pi's built-in MCP after record birth, while pi's own receive stays its record-addressed control
199
+ address. [FAQ](./FAQ.md) explains ACP, MCP and context carriers.
259
200
 
260
- The pi adapter registers the compiled bridge with Pi's built-in MCP after record
261
- birth; Pi supervises the MCP child. **MCP is ingress; pi receive remains the
262
- record-addressed control address (a Unix socket, or the native-Windows preview's named
263
- pipe).** Garden identity and dispatch stay Entwurf's.
264
- Codemode is harness-internal, not another garden citizen.
201
+ Product guidance and CLI help each have one editable source: [ENTWURF.json](./ENTWURF.json) for
202
+ the MCP tool descriptions and the hints extracted there, [ENTWURF-CLI.json](./ENTWURF-CLI.json) for
203
+ `entwurf --help`. [AGENTS](./AGENTS.md#architecture) lists exactly what each carries.
265
204
 
266
205
  ## Operation guides
267
206
 
@@ -287,6 +226,8 @@ credential mediation, subscription bypass, pane-typing delivery or hidden orches
287
226
 
288
227
  Installation, a doctor, a fixture and an exact release candidate prove different things;
289
228
  none is interchangeable with the others or an all-host/long-haul guarantee.
229
+ [Releases](https://github.com/junghan0611/entwurf/releases) carry each cut's notes and acceptance
230
+ receipts; [CHANGELOG](./CHANGELOG.md) records source history.
290
231
 
291
232
  ## References
292
233
 
package/VERIFY.md CHANGED
@@ -121,7 +121,7 @@ that moved out of `scripts/` and into a file beside its subject would otherwise
121
121
  >
122
122
  > Be honest about its cost, because it is a MUST: it spends real model turns on the operator's configured runtimes (two pi siblings, each resumed once, plus one Claude Code sibling), it READS the operator's real runtime config, and the siblings' native session transcripts stay in the real pi agent dir — they are not cleaned up, and they are part of the evidence a resume was real. The fence is per-axis rather than absolute: the four meta roots (records, mailbox, receivers, senders) are fixture for every cell, so no garden record is ever minted outside it; the native pi cell's control socket and v2 lock are fixture too; the ACP pi cell's are REAL and transient (see the paragraph above); and the Claude cell runs its runtime under the real HOME while its mailbox and meta stay fixture. The run ends by proving the operator's SIX real roots — the four meta roots plus `~/.pi/entwurf-control` and `~/.pi/entwurf-v2-locks` — hold the entry sets they started with, with no fixture garden id anywhere, and that proof now runs on the failure path as well as the green one. Missing prerequisites decline with the protocol SKIP (97), which `release-gate --cut` refuses rather than rounding up.
123
123
  >
124
- > **Fresh-call LIVE is on-demand, not part of `release-gate`.** `LIVE=1 ./run.sh smoke-mux-fresh-call-live` opens configured Pi and Claude Code siblings, spends four model turns (two in the caller's own session, two in a second SEAT session on the same private server — the #105 seat x cwd matrix), and preserves their native transcripts; run it directly whenever a cut changes mux fresh-call/launch behavior. Its private tmux servers and fixture-bound entwurf write axes make it deterministic about garden-record/socket residue, but those real native turns should not appear unexpectedly in every aggregate cut. **Both this smoke and `smoke-mux-lifecycle-live` enumerate `pi` and `claude-code` only — that exclusion is intentional.** A Copilot visible-fresh (step 9 clause 7) was accepted on 2026-08-25 as an operator-metered LIVE (receipts in `DELIVERY.md`'s Copilot matrix row and the issue #82 thread). It still spends Copilot premium quota, still needs its own grant to re-run, and is never folded into those loops or into the release-gate MUST tier.
124
+ > **Fresh-call LIVE is on-demand, not part of `release-gate`.** `LIVE=1 ./run.sh smoke-mux-fresh-call-live` opens configured Pi and Claude Code siblings, spends four model turns (two in the caller's own session, two in a second SEAT session on the same private server — the #105 seat x cwd matrix), and preserves their native transcripts; run it directly whenever a cut changes mux fresh-call/launch behavior. Its private tmux servers and fixture-bound entwurf write axes make it deterministic about garden-record/socket residue, but those real native turns should not appear unexpectedly in every aggregate cut. **Both this smoke and `smoke-mux-lifecycle-live` enumerate `pi` and `claude-code` only — that exclusion is intentional.** Neither covers pi-durable same-id resume (#157 B3), and no LIVE or release gate does: its proof is the deterministic beside tests plus the local FULL/package floor, and its one public n=1 (Herdr, a pre-final candidate, synthetic callers) is a dated [BASELINE](./BASELINE.md) row, not a floor. The tmux path at the final candidate is unmeasured. Claude Code's same-id resume inside Herdr (#157 stage 4) is covered by no LIVE or release gate either: its proof is the deterministic beside tests plus the local FULL/package floor (a dated receipt, not a floor this text inherits: on 2026-11-02 the affected PARTIAL, six groups, and one frozen FULL of 1016 s passed at the stage-4 candidate, work surface `1075a5c8…` = HEAD `2734f524` plus the then-uncommitted changes; later edits leave that receipt valid for its snapshot but do not certify a later candidate, which owes its own), and its two test-owned n=1 runs on 2026-11-02 are a dated [BASELINE](./BASELINE.md) row, together with the operator vendor-data changes observed inside their windows — not a floor. A Copilot visible-fresh (step 9 clause 7) was accepted on 2026-08-25 as an operator-metered LIVE (receipts in `DELIVERY.md`'s Copilot matrix row and the issue #82 thread). It still spends Copilot premium quota, still needs its own grant to re-run, and is never folded into those loops or into the release-gate MUST tier.
125
125
 
126
126
  > **A visible-fresh receipt outside the MUST tier is no longer the general rule — it is Copilot's preserved exception.** #87 measured what that wording permitted: because clause 7 sat outside every aggregate, a harness could be admitted as a full D6 citizen that `entwurf_fresh_call` cannot open, carry an honest "not a supported harness" sentence in the delivery matrix, and still pass the whole floor toward a cut. From OMP onward, the FIRST release of a harness admitted under the #82 contract owes its clause 7 receipt as a release-gate MUST step (`smoke-omp-fresh-live`), and the deterministic half of the same rule (`check-harness-admission-parity`, inside `check:full`) makes a citizen backend missing from `FRESH_CALL_BACKENDS` a red floor rather than a documented one. Forward-only by decision: Copilot's row is not reopened. The contract lives in `docs/adding-a-harness.md` step 9, "The release stop"; this note exists so the cost discipline above is not read as permission.
127
127
  >
@@ -282,7 +282,7 @@ caller/target/cross-harness LIVE are owed by `smoke-pi-durable-fresh-live`, a re
282
282
  | Axis | Required proof | Limit |
283
283
  |---|---|---|
284
284
  | Source | `pnpm run check:full` in the prepared SHA's CI `check` job | Does not prove an installed consumer. Kill-power of the committed claims is not re-measured per release (#144); the release record says so and lists any earlier-candidate PARTIAL separately. |
285
- | Packed install | `check-pack-install` | Real tarball, but checkout-visible. |
285
+ | Packed install | `check-pack-install` | Real tarball, but checkout-visible. Every npm install it runs (the npm-managed root and second root, the four #130 pi-durable cells) and its pnpm consumer run with lifecycle scripts off (`--ignore-scripts`), so its executable, bridge and closure checks measure the tree as installed without the package's postinstall; that hook stays shipped as a registry-mode defense this gate does not exercise, and packed file modes remain the pack gate's evidence. |
286
286
  | Linux artifact consumer | required `check-install-container` CI job against one preserved candidate | Fixtures prove package/oracle shape, not a real Claude lifecycle. |
287
287
  | Exact release commit | the exact SHA's push run: all four required CI jobs green (the qualification body is not read, #144) | A different green SHA is not transferable evidence. |
288
288
  | macOS Entwurf-only install | required `macos-install-surface` CI job at the exact release SHA | Shape-only, CERTIFIED (CI): certifies the Entwurf-only install path on macOS only — never Claude/Copilot/OMP/agy wiring, the pi rail, ACP or mux. Promoted from non-voting (`continue-on-error`) to required in 0.20.0 after its first CERTIFIED (CI) green on a GitHub Actions `macos-latest` runner (not a physical host): run 34303884286 @ `70eda03` (2026-09-09), 65s, all 10 steps success — the packed candidate installed clean, `entwurf --help` and `entwurf check-bridge` ran (the latter listing the seven `entwurf-bridge` MCP tools of that date; 0.41.0 declares nine, unmeasured on that runner), an all-harness-absent `entwurf setup` reached `result: green` across the five documented SKIP probes (`pi`/`claude`/`agy`/`copilot`/`omp`), and five checked paths (`.pi`, `settings.json`, `.gemini`, `.copilot`, `auth.json.bak`) plus a byte-identical `auth.json` proved zero harness/credential writes. A macOS runner failure now blocks every release cut, the same as any other required job. |
@@ -11,7 +11,7 @@ the one-line registration; everything an operator needs to actually wire a host
11
11
 
12
12
  **Being garden-native is not the same as being replyable, and Copilot is the case that separates them.** Its hook writes a sender marker, so an `entwurf_v2` send carries its own garden id and the receiver learns who wrote — measured 2026-08-21 on Copilot CLI 1.0.80, where a live send arrived under its own garden id with `origin: "meta-session"` and `replyable: false`. Replyability arrived later and through a different process: a first-party extension (`run.sh install-copilot-receive`) that the CLI forks, which binds to the same V3 record and writes a receiver marker owned by its own pid (#82 RAIL 5). So a Copilot citizen is `replyable: true` exactly while that extension is armed for it, and `replyable: false` — honestly, with a real garden identity — when it is not installed, not launched with `COPILOT_CLI_ENABLED_FEATURE_FLAGS=EXTENSIONS` (which is what `entwurf copilot` sets for one invocation), not yet born, or gone. Read the two facts off different rails: the sender marker answers *who sent this*; the receiver marker answers *can a reply land*. The onboarding obligations are in [`adding-a-harness.md`](./adding-a-harness.md) step 7, and the evidence boundary — the managed LIVE acceptance that moved receive to D6, and what D7-partial / D3-pending still exclude — is in [`DELIVERY.md`](../DELIVERY.md).
13
13
 
14
- **Which verb an external agent should reach for:** to deliver to / reply to a garden id, use **`entwurf_v2`** — it is the canonical delivery surface and the only one that reads whether the target is live pi, dormant pi, a mailbox-backed self-fetch citizen (Claude Code, Copilot, OMP), or native-push Antigravity/Codex and routes correctly. Discover targets with `entwurf_peers`, confirm your own identity with `entwurf_self`, drain a mailbox with `entwurf_inbox_read`, and use `entwurf_register_native` only as the explicit/manual fallback for binding an already-running agy conversation. Open a NEW sibling with **`entwurf_fresh_call {backend, model, task, cwd?, placement?}`**, and reopen a DORMANT pi or Claude Code citizen under the same id with **`entwurf_resume_call {target}`**. **`entwurf_retire_call {target}`** (new in 0.41.0) attempts retirement of exactly one target, and only one the human operator explicitly requested; mounting or seeing the tool, a coordinator role or caller identity is not permission, and an unknown result is not a reason to replay.
14
+ **Which verb an external agent should reach for:** to deliver to / reply to a garden id, use **`entwurf_v2`** — it is the canonical delivery surface and the only one that reads whether the target is live pi, dormant pi, a mailbox-backed self-fetch citizen (Claude Code, Copilot, OMP), or native-push Antigravity/Codex and routes correctly. Discover targets with `entwurf_peers`, confirm your own identity with `entwurf_self`, drain a mailbox with `entwurf_inbox_read`, and use `entwurf_register_native` only as the explicit/manual fallback for binding an already-running agy conversation. Open a NEW sibling with **`entwurf_fresh_call {backend, model, task, cwd?, placement?}`**, and reopen a DORMANT pi, pi-durable or Claude Code citizen under the same id with **`entwurf_resume_call {target}`**. **`entwurf_retire_call {target}`** (new in 0.41.0) attempts retirement of exactly one target, and only one the human operator explicitly requested; mounting or seeing the tool, a coordinator role or caller identity is not permission, and an unknown result is not a reason to replay.
15
15
 
16
16
  Observed: Claude Code, Codex CLI, Antigravity CLI, GitHub Copilot CLI and OMP all reach this MCP bridge. Claude, Copilot and OMP become symmetric/replyable through mailbox-backed meta-sessions; agy and Codex use native-push. Codex's identity is request-scoped `_meta.threadId`, and its replyability requires that exact record plus a loaded app-server thread. Plain external hosts still need an identity lane to send.
17
17
 
@@ -325,5 +325,5 @@ MCP registration gives the external harness the tools; the host still needs work
325
325
 
326
326
  For the maintained multi-harness setup and skill/command packaging details, see
327
327
  [agent-config](https://github.com/junghan0611/agent-config). See also the
328
- [concept primer](../README.md#concept-primer), the sender-envelope contract in
329
- [AGENTS.md](../AGENTS.md), and [custom skills](../README.md#custom-skills).
328
+ [concepts](../README.md#concepts), the sender-envelope contract in
329
+ [AGENTS.md](../AGENTS.md), and [custom skills](./setup-clean-host.md#custom-skills).
@@ -23,7 +23,7 @@ evidence split, and its three states must not collapse into "macOS is supported"
23
23
 
24
24
  ## Requirements
25
25
 
26
- This table is the published `@junghanacs/entwurf@0.41.1`'s, which ships the Pi 1.4.0 SDK set.
26
+ This table is the published `@junghanacs/entwurf@0.45.0`'s, which ships the Pi 1.4.0 SDK set.
27
27
  The previous package, `0.41.0`, ships the Pi 1.3.0 SDK set and requires Pi 1.3.x; the setup guide
28
28
  inside that tarball is its contract.
29
29
 
@@ -83,14 +83,16 @@ node --version
83
83
  npm --version
84
84
  ```
85
85
 
86
- The two npm forms below install the **published** package, `0.41.1` (Pi 1.4.x, the Pi 1.4.0 SDK
87
- set).
86
+ The two npm forms below install the **published** package, `0.45.0` (Pi 1.4.x, the Pi 1.4.0 SDK
87
+ set). The [product entry](../README.md#install)'s unpinned `npm install -g @junghanacs/entwurf`
88
+ takes whichever version npm's `latest` dist-tag names; pin `@<version>` as below when you mean the
89
+ exact artifact the [Requirements](#requirements) table describes.
88
90
 
89
91
  Global install is simplest when native harnesses should find stable bins from every
90
92
  working directory:
91
93
 
92
94
  ```bash
93
- npm install -g @junghanacs/entwurf@0.41.1
95
+ npm install -g @junghanacs/entwurf@0.45.0
94
96
  entwurf --help
95
97
  entwurf setup /path/to/your-project
96
98
  entwurf check-bridge
@@ -101,7 +103,7 @@ A project-local installation is also supported:
101
103
  ```bash
102
104
  mkdir -p ~/entwurf-smoke && cd ~/entwurf-smoke
103
105
  npm init -y
104
- npm install --save-dev @junghanacs/entwurf@0.41.1
106
+ npm install --save-dev @junghanacs/entwurf@0.45.0
105
107
  npx entwurf setup .
106
108
  npx entwurf check-bridge
107
109
  ```
@@ -111,7 +113,7 @@ project-local install, or `./run.sh <command>` from a source checkout. Keep that
111
113
  same scope when upgrading and checking; native process restarts are separate (§7).
112
114
 
113
115
  `check-bridge` is auth-free. It proves the installed prebuilt MCP server boots and
114
- lists the nine garden tools (0.41.1); it does not prove a backend model turn, native hook or retirement permission.
116
+ lists the nine garden tools (0.45.0); it does not prove a backend model turn, native hook or retirement permission.
115
117
 
116
118
  Neither npm form installs a harness runtime. `pi`, Claude Code, Copilot CLI, Codex CLI, agy,
117
119
  Cortex, and their authentication remain operator-owned optional prerequisites for the
@@ -257,7 +259,7 @@ A plain `pi` can load the package without becoming a citizen.
257
259
  In that session ask for `entwurf_self`, then `entwurf_peers`. Pick an existing
258
260
  live garden id and ask for `entwurf_v2` with `intent: "fire-and-forget"` and your
259
261
  message. These are harness tools, not shell subcommands; pi exposes them through
260
- Pi's built-in MCP as `mcp__entwurf_bridge__<verb>`. The 0.41.1 bridge has nine tools;
262
+ Pi's built-in MCP as `mcp__entwurf_bridge__<verb>`. The 0.45.0 bridge has nine tools;
261
263
  pi hides `entwurf_inbox_read` and `entwurf_register_native`, leaving seven active.
262
264
  The added `entwurf_retire_call` is only for one target/action explicitly requested by the
263
265
  human operator, never autonomous cleanup. Where a host provides or is configured with an approval
@@ -270,6 +272,10 @@ Tool-call ingress is MCP; delivery to a pi citizen is still its record-addressed
270
272
  control address (a Unix socket; a named pipe on the experimental native-Windows Pi
271
273
  preview). A boot/listing from `check-bridge` is not a model-turn or
272
274
  native-rail acceptance.
275
+ The server key stays `entwurf-bridge`. An operator/trusted-project MCP entry with
276
+ that normalized namespace can replace the registration by Pi's own precedence;
277
+ `/mcp` shows it, and Entwurf does not scan or fight that choice.
278
+ Codemode is harness-internal, not another garden citizen.
273
279
 
274
280
  To inspect the ACP provider from a project-local package instead of a global one:
275
281
 
@@ -385,15 +391,23 @@ tree (for example an override that binds pi-durable's `pi-ai` to an older publis
385
391
  entwurf pi-durable --provider <provider> --model <exact catalog id> --width task-wide
386
392
  entwurf pi-durable --continue # this directory's newest durable session
387
393
  entwurf pi-durable --resume # choose one of this directory's durable sessions
394
+ entwurf pi-durable --session <native id> # reopen exactly that session of this directory
388
395
  ```
389
396
 
397
+ `--continue`, `--resume` and `--session` reopen a session as it was saved: they take no
398
+ `--provider`, `--model`, `--width` or `--entwurf-bootstrap` and are mutually exclusive.
399
+ `--session` takes the native session id (`<13-digit ms>-<uuid>`, as `--resume` lists it), not a
400
+ garden id, with no interactive session picker or picker-specific TTY check (the normal TUI still
401
+ runs); a value of any other shape is refused as `session-id-malformed` before your module is
402
+ evaluated, the TUI loads or the app opens.
403
+
390
404
  The bootstrap imports only the compiled closure shipped beside it
391
405
  (`mcp/entwurf-bridge/dist/…`); a source checkout needs a built bridge
392
406
  (`pnpm run build-bridge`) and its development dependencies installed first.
393
407
  `plugins/pi-durable/bootstrap.mjs` is only the checkout path that re-exports it.
394
408
 
395
- - **One explicit native module (optional).** Add `--native-module <absolute file>` to either
396
- launch to load ONE module of your own. It is an ordinary ES module: its top-level code (top-level
409
+ - **One explicit native module (optional).** Add `--native-module <absolute file>` to any of these
410
+ launches to load ONE module of your own. It is an ordinary ES module: its top-level code (top-level
397
411
  await included) runs first, before the TUI and the durable runtime load, so it can prepare the
398
412
  environment the provider runtime and tool children will read; its default export is a native
399
413
  durable `Extension` (`{ name, tools?, sections?, hooks?, … }`, the upstream durable API, not
@@ -450,8 +464,8 @@ proof ([#130](https://github.com/junghan0611/entwurf/issues/130)).
450
464
 
451
465
  ### Moving durable sessions from the Pi 1.3 SDK to 1.4
452
466
 
453
- 0.41.1 is published; moving a live host onto it remains a separate operator decision for each
454
- host. When you do:
467
+ 0.41.1, 0.41.2 and 0.45.0 are published on the 1.4.0 SDK set; moving a live host onto any of them
468
+ remains a separate operator decision for each host. When you do:
455
469
 
456
470
  1. **Confirm the old owner is gone.** Close the 0.41 (SDK 1.3) durable session normally and check
457
471
  that its process has exited. A stale session lock alone is not proof.
@@ -558,7 +572,7 @@ entwurf install-meta-bridge
558
572
  entwurf doctor-meta-bridge
559
573
  ```
560
574
 
561
- The supported floor `>=2.1.306` is enforced by package metadata through installer
575
+ The Claude Code supported floor `>=2.1.306` is enforced by package metadata through installer
562
576
  and doctor gates. Older Claude versions validate an exec-form hook but silently drop
563
577
  its `args` at runtime, so there is no shell-form fallback.
564
578
 
@@ -568,6 +582,17 @@ validation, or hand-inspected marker cannot replace a new real session. If the l
568
582
  form is unsupported, reinstall; if ownership is correct but the live join is absent,
569
583
  restart the affected session.
570
584
 
585
+ Start a session as plain `claude` or as `entwurf claude [args…]`. The second execs the
586
+ `claude` on PATH in this terminal — same cwd, pid and exit status, signals reaching it directly,
587
+ arguments and `--help` unchanged — after removing an inherited `PI_SESSION_ID`/`PI_AGENT_ID` and
588
+ exporting only `ENTWURF_CLAUDE_LAUNCH_ACTIVE=1`. Unlike `entwurf copilot` it checks no Entwurf setup
589
+ or citizen precondition before launch — only that `claude` resolves to an executable file that
590
+ is not this launcher — and sets no feature flag: either spelling is a citizen through the hooks above,
591
+ and plain Claude Code without them. A launch whose environment already carries that sentinel
592
+ (inherited from an earlier `entwurf claude` up its process tree), or whose `claude` resolves to
593
+ Entwurf's own `run.sh`, refuses as a recursive managed launch instead of looping; its message
594
+ currently names only the PATH cause. Run plain `claude` there.
595
+
571
596
  The Darwin install fence is open (`Linux | Darwin`); python3 is the
572
597
  refusal, not the platform name. A completed Darwin install is still not
573
598
  a rail receipt: this rail is NOT CERTIFIED — pending physical host. The