@junghanacs/entwurf 0.45.0 → 0.51.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 (116) hide show
  1. package/AGENTS.md +5 -3
  2. package/BASELINE.md +110 -1
  3. package/CHANGELOG.md +249 -0
  4. package/CONTRIBUTING.md +1 -1
  5. package/ENTWURF-CLI.json +1229 -0
  6. package/ENTWURF.json +63 -15
  7. package/FAQ.md +4 -4
  8. package/README.md +132 -188
  9. package/VERIFY.md +18 -11
  10. package/demo/README.md +1 -1
  11. package/docs/acp-backend-rail.md +1 -1
  12. package/docs/external-mcp-host.md +4 -4
  13. package/docs/setup-clean-host.md +94 -22
  14. package/mcp/entwurf-bridge/dist/ENTWURF.json +63 -15
  15. package/mcp/entwurf-bridge/dist/mcp/entwurf-bridge/src/index.js +19 -8
  16. package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-contract.js +4 -4
  17. package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-visible-resume.js +483 -18
  18. package/mcp/entwurf-bridge/dist/pi-extensions/lib/fresh-call-dispatch.js +47 -10
  19. package/mcp/entwurf-bridge/dist/pi-extensions/lib/herdr-fresh-call.js +613 -33
  20. package/mcp/entwurf-bridge/dist/pi-extensions/lib/herdr-resume-call.js +497 -0
  21. package/mcp/entwurf-bridge/dist/pi-extensions/lib/meta-session.js +3 -1
  22. package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-resume-call.js +50 -5
  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/resume-launch-identity.js +18 -11
  28. package/mcp/entwurf-bridge/dist/pi-extensions/meta-bridge-pi-durable.js +30 -15
  29. package/mcp/entwurf-bridge/dist/scripts/herdr-rails.mjs +40 -7
  30. package/mcp/entwurf-bridge/dist/scripts/meta-bridge-fresh-cut.js +1 -27
  31. package/mcp/entwurf-bridge/dist/scripts/meta-bridge-prune.js +1 -1
  32. package/mcp/entwurf-bridge/dist/scripts/meta-facts.js +1 -1
  33. package/mcp/entwurf-bridge/dist/scripts/peer-facts.js +1 -1
  34. package/mcp/entwurf-bridge/src/index.ts +28 -8
  35. package/mcp/entwurf-bridge/tsconfig.build.json +7 -1
  36. package/native/win32-x64/manifest.json +1 -1
  37. package/package.json +16 -20
  38. package/pi/pi-durable/bootstrap.mjs +179 -6
  39. package/pi/pi-durable/carrier/runtime.js +327 -57
  40. package/pi/pi-durable/carrier/session-name.js +11 -0
  41. package/pi/pi-durable/carrier/sessions.js +96 -20
  42. package/pi/pi-durable/carrier/subagent.js +5 -2
  43. package/pi/pi-durable/carrier/tui.js +60 -22
  44. package/pi/pi-durable/overlay/upstream-pin.json +26 -19
  45. package/pi-extensions/lib/entwurf-v2-contract-schema.ts +73 -69
  46. package/pi-extensions/lib/entwurf-v2-contract.ts +4 -4
  47. package/pi-extensions/lib/entwurf-v2-visible-resume.ts +710 -38
  48. package/pi-extensions/lib/fresh-call-dispatch.ts +64 -12
  49. package/pi-extensions/lib/herdr-fresh-call.ts +919 -40
  50. package/pi-extensions/lib/herdr-resume-call.ts +810 -0
  51. package/pi-extensions/lib/meta-session.ts +13 -8
  52. package/pi-extensions/lib/mux-resume-call.ts +77 -4
  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/resume-launch-identity.ts +31 -12
  58. package/pi-extensions/meta-bridge-pi-durable.ts +30 -16
  59. package/run.sh +552 -699
  60. package/scripts/check-claude-launch.ts +341 -0
  61. package/scripts/check-entwurf-v2-contract.ts +4 -4
  62. package/scripts/check-entwurf-v2-surface.ts +2 -2
  63. package/scripts/check-fresh-call-dispatch.ts +70 -9
  64. package/scripts/check-fresh-cut-gate.sh +23 -9
  65. package/scripts/check-gate-qualification.ts +19 -14
  66. package/scripts/check-herdr-activation.ts +301 -23
  67. package/scripts/check-herdr-fresh-call.ts +161 -25
  68. package/scripts/check-herdr-plugin-build.ts +173 -1
  69. package/scripts/check-herdr-plugin.ts +28 -2
  70. package/scripts/check-herdr-runtime-bootstrap.ts +136 -0
  71. package/scripts/check-install-surface.ts +1236 -6
  72. package/scripts/check-meta-doctor-oracle.sh +1 -1
  73. package/scripts/check-meta-facts.ts +20 -1
  74. package/scripts/check-mux-resume-call.ts +28 -0
  75. package/scripts/check-peer-facts.ts +39 -2
  76. package/scripts/cli-help.mjs +222 -0
  77. package/scripts/dev-bin.sh +39 -2
  78. package/scripts/herdr-activation.mjs +28 -6
  79. package/scripts/herdr-operator-link.mjs +389 -0
  80. package/scripts/herdr-plugin-activate.mjs +5 -0
  81. package/scripts/herdr-plugin-deactivate.mjs +18 -5
  82. package/scripts/herdr-rails.mjs +43 -7
  83. package/scripts/herdr-runtime.mjs +27 -0
  84. package/scripts/meta-bridge-fresh-cut.ts +1 -27
  85. package/scripts/meta-bridge-prune.ts +1 -1
  86. package/scripts/meta-facts.ts +1 -1
  87. package/scripts/mutants/agent-guidance.json +4 -4
  88. package/scripts/mutants/claude-launch.json +142 -0
  89. package/scripts/mutants/cli-help-source.json +420 -0
  90. package/scripts/mutants/control-send-receipt.json +1 -1
  91. package/scripts/mutants/dev-gate-dispatch.json +109 -0
  92. package/scripts/mutants/fresh-call-dispatch.json +38 -2
  93. package/scripts/mutants/fresh-cut.json +15 -0
  94. package/scripts/mutants/herdr-activation.json +128 -0
  95. package/scripts/mutants/herdr-fresh-call.json +278 -5
  96. package/scripts/mutants/herdr-operator-link.json +318 -0
  97. package/scripts/mutants/herdr-plugin-build.json +55 -0
  98. package/scripts/mutants/herdr-plugin.json +17 -0
  99. package/scripts/mutants/herdr-resume-call.json +288 -0
  100. package/scripts/mutants/herdr-runtime-bootstrap.json +48 -0
  101. package/scripts/mutants/meta-facts.json +15 -0
  102. package/scripts/mutants/mux-resume-call.json +63 -2
  103. package/scripts/mutants/pack-install.json +4 -4
  104. package/scripts/mutants/peer-facts.json +15 -0
  105. package/scripts/mutants/pi-durable.json +1167 -3
  106. package/scripts/mutants/pi-floor.json +22 -5
  107. package/scripts/mutants/source-install.json +35 -0
  108. package/scripts/mutants/v2-surface.json +2 -2
  109. package/scripts/mutants/v2-visible-resume.json +255 -6
  110. package/scripts/peer-facts.ts +1 -1
  111. package/scripts/smoke-agy-install-state.sh +66 -0
  112. package/scripts/smoke-meta-prune.sh +23 -0
  113. package/scripts/smoke-omp-fresh-live.ts +12 -3
  114. package/scripts/smoke-omp-receive-live.ts +7 -1
  115. package/scripts/smoke-pi-durable-fresh-live.ts +12 -2
  116. 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,112 +16,91 @@ 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
- [ENTWURF.json](./ENTWURF.json) is the sole editable source for the product-owned guidance
27
- currently extracted there: MCP descriptions/parameters, durable short variants, the static
28
- entwurf_v2 reject hints, the static visible-resume reject hints of entwurf_resume_call, the static tmux launch-stage reject hints of entwurf_fresh_call and entwurf_resume_call (herdr rail hints stay in code), five static delivery-result clauses of the entwurf_v2 dirty-lock and remote-pair receipts (receipt syntax and the mailbox envelope stay in code) and the record-less-socket reject hint's text around its fix command (the command itself stays in code). It is not a user prompt override; its payload revision is independent of
29
- package releases. Bootstrap, notices, other hints and ACP guidance still have their existing owners. Operator engraving/configuration is unchanged.
35
+ ## The four verbs
30
36
 
31
- | Verb | Tool | Where it lands | Harnesses |
37
+ | Verb | Tool | What it does | Harnesses |
32
38
  |---|---|---|---|
33
- | **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 |
34
- | **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 |
35
- | **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 |
36
- | **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) |
37
-
38
- Antigravity is a legacy citizen: an existing conversation registers itself, and Entwurf never
39
- launches one. Its native push is paused (#152): on the measured external path the agy language server
40
- 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
41
- processed its task; the sibling's own callback envelope supplies its garden id.
42
-
43
- The package holds the v2 core, native-harness bridges, a pi adapter and an ACP
44
- plugin. ACP is one ingress, not the boundary; pi is one adapter, not the center.
45
- Claude and Cortex Code are ACP backends. Codex and Antigravity stay native so they
46
- retain their own tools and work context. Capabilities differ by rail: a shipped
47
- citizen is not a promise of every lifecycle operation.
48
-
49
- [Releases](https://github.com/junghan0611/entwurf/releases) contain each cut's notes and acceptance
50
- 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 |
51
43
 
52
- ## 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).
53
48
 
54
- **Choose by where you work. Bring your own harnesses, subscriptions and login.**
55
- The native durable route below additionally supplies an app/TUI, Entwurf's own thin composition of
56
- the durable app upstream omits from its npm release; it does not supply credentials or take
57
- 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).
58
52
 
59
- ### Direct — ordinary shell or tmux
53
+ ## Install
60
54
 
61
- Prerequisites: **Node >=24.0.0**, Python 3 for `setup`, and any harnesses you choose
62
- to use, already installed and authenticated. Pi is optional-by-presence, supported
63
- range `>=1.4.0 <1.5`; Claude Code supported floor `>=2.1.306` is required for its
64
- 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.
65
58
 
66
- **Release state.** The Pi range above belongs to the published 0.41.2, which ships the Pi
67
- 1.4.0 SDK set, as 0.41.1 did. The previous `0.41.0` ships the Pi 1.3.0 set and requires Pi 1.3.x; the README
68
- inside that tarball and the Herdr snapshot `v2026.10.22-herdr.0.41.0` are its contract.
59
+ ### Direct — ordinary shell or tmux
69
60
 
70
61
  ```bash
71
- npm install -g @junghanacs/entwurf@0.41.2
62
+ npm install -g @junghanacs/entwurf
72
63
  entwurf setup /path/to/your-project
73
64
  entwurf check-bridge
74
65
  ```
75
66
 
76
- `setup` composes each harness it finds and reports PASS / SKIP / FAIL. An absent
77
- harness is an explicit SKIP; a detected incomplete/below-floor integration is a
78
- named FAIL with nonzero exit, not a false green. `check-bridge` proves the installed
79
- MCP bytes boot and list tools without backend auth; it does **not** certify a real
80
- model turn or native receive rail.
81
-
82
- [Clean-host setup](./docs/setup-clean-host.md) owns project-local/source installs,
83
- config paths, optional backends, doctors, upgrade/repair and uninstall.
84
- Codex also needs your own hook-trust decision, app-server and exact-directory
85
- consent: [the operator steps](./docs/setup-clean-host.md#three-operator-decisions-before-fresh).
86
- Plain MCP registration alone does not make a garden citizen.
87
-
88
- **Platform bounds:** Linux is the certified harness-rail axis. macOS Entwurf-only
89
- installation is **CERTIFIED (CI)**; native harness rails, ACP and mux remain
90
- **NOT CERTIFIED — pending physical host**, so detected wiring can still leave setup non-green.
91
- WSL2 and native Windows have **experimental CI previews**, not general or physical-host support.
92
- The native-Windows preview covers Pi citizens and offline scripted delivery, not vendor turns,
93
- other harnesses, shell entrypoints, fresh/resume, mux, Herdr or ACP.
94
- [BASELINE](./BASELINE.md#release-host-baseline) owns the version-specific receipts and gaps;
95
- 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.
96
71
 
97
- ### 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.
98
79
 
99
- **The package supplies Entwurf's owned app/TUI carrier and nine exact Pi 1.4.0 SDK
100
- members** (the previous 0.41.0 supplies the 1.3.0 set). No separate runtime checkout, patch, build or ordinary Pi CLI is needed.
101
- The launch verifies carrier integrity and every reachable SDK edge's name/version;
102
- incomplete, drifted or mixed supply refuses by name.
80
+ ### Native durable (pi-durable)
103
81
 
104
82
  ```bash
105
83
  entwurf pi-durable --provider <provider> --model <model-id> --width task-wide
106
84
  entwurf pi-durable --continue
107
85
  entwurf pi-durable --resume
86
+ entwurf pi-durable --session <native id>
108
87
  ```
109
88
 
110
- `--continue` opens this directory's latest-created durable session. `--resume` lists its
111
- sessions, most recently written first, by creation time, garden id and last write, and
112
- reopens the one you choose as it was saved; a cancelled choice opens nothing.
113
-
114
- The contact adds garden identity and two-way mailbox communication. Entwurf owns the
115
- thin app/TUI composition (shipped as an emitted JS carrier); execution, models/auth, queues,
116
- SQLite, transcripts and recovery remain the upstream SDK's:
117
- [Hard Rule 17](./AGENTS.md#hard-rules), **supply the missing surface; do not become the harness**.
118
-
119
- Optional `--native-module <absolute file>` initializes trusted ESM before runtime/TUI
120
- imports, then installs its default native Extension after the contact.
121
- `--native-module-dir <absolute directory>` loads that named directory's top-level
122
- `*.extension.mjs` files in byte-wise order instead. No automatic module discovery or
123
- classic Pi API shim; guards are not a sandbox or rollback.
124
- [Native setup](./docs/setup-clean-host.md#2b-optional-native-durable-pi-durable)
125
- owns flags, refusals and the extension contract.
89
+ The package supplies Entwurf's thin app/TUI carrier, emitted from its own canonical production
90
+ source, and the exact pi SDK set it declares; the launch verifies both and refuses incomplete,
91
+ drifted or mixed supply by name. No separate runtime checkout,
92
+ patch, build or ordinary Pi CLI is needed. The contact adds garden identity and two-way mailbox
93
+ communication; execution, models, auth, queues, storage and recovery stay the upstream SDK's
94
+ ([Hard Rule 17](./AGENTS.md#hard-rules): **supply the missing surface; do not become the harness**).
95
+ On a CLI reopen, name the original `--native-module <absolute file>` or
96
+ `--native-module-dir <absolute directory>` again if needed. Public garden-id
97
+ `entwurf_resume_call` is bridge-only: it restores neither those modules nor the old seat. To retain
98
+ them, use the explicit CLI in the terminal you choose, after confirming the old owner has exited.
99
+ For an SDK upgrade, normally close the owner and back up the complete SQLite session file set,
100
+ including WAL/SHM, before the first write; verify the exact version and artifact, then reopen the
101
+ same identity. [Setup §2b](./docs/setup-clean-host.md#2b-optional-native-durable-pi-durable) owns
102
+ selectors and refusals; the [SDK upgrade boundary](./docs/setup-clean-host.md#default-radius-for-a-requested-pi-sdk-upgrade)
103
+ owns the operating and publication gates.
126
104
 
127
105
  ### Herdr workbench
128
106
 
@@ -130,37 +108,36 @@ owns flags, refusals and the extension contract.
130
108
  herdr plugin install junghan0611/entwurf/plugins/herdr --yes
131
109
  ```
132
110
 
133
- The [Herdr guide](./plugins/herdr/README.md#from-a-raw-linux-box-in-nine-steps) says which
134
- runtime each ref installs.
135
-
136
- This separate path activates Herdr-integrated **pi and Claude Code** with an
137
- independently locked runtime and an observation pane; it puts no Entwurf bins on PATH.
138
- An Entwurf release does not automatically re-pin that runtime: while 0.45.0 is an unpublished
139
- candidate, main's lock rides the `herdr-checkout` verification carrier, and the published 0.41.2
140
- runtime stays pinned by the Herdr tag `v2026.10.24-herdr.0.41.2`.
141
- [Herdr guide](./plugins/herdr/README.md) owns install, use, evidence and removal;
142
- the plugin does not own delivery or the Herdr launch rail.
111
+ This separate path activates Herdr-integrated **pi and Claude Code** with its own locked runtime
112
+ and an observation pane. By default it puts no Entwurf bins on PATH; a runtime that carries
113
+ `herdr-plugin-expose-operator` makes exactly one `entwurf` link, and only when you ask for it.
114
+ An Entwurf release does not re-pin that runtime by itself; the
115
+ [Herdr guide](./plugins/herdr/README.md#from-a-raw-linux-box-in-nine-steps) says which runtime each
116
+ ref installs and owns install, use, evidence and removal. The plugin owns neither delivery nor the
117
+ Herdr launch rail.
143
118
 
144
- ### Garden launcher
119
+ ## First steps
145
120
 
146
- After direct setup, start a pi citizen in your project:
121
+ Start a citizen in your project:
147
122
 
148
123
  ```bash
149
124
  cd /path/to/your-project
150
125
  entwurf pi
151
- # equivalent when the package is registered (also the Herdr plugin's spelling):
152
- pi --entwurf-control
153
126
  ```
154
127
 
155
- `entwurf pi` execs your own pi with the control flag. A plain pi may load the
156
- package without becoming a citizen. The record mints the garden id; do not inject
157
- a session id. Native harness launch and manual Herdr argv instructions live in
158
- [setup §2–§5](./docs/setup-clean-host.md#2-optional-pi-adapter--acp-plugin).
128
+ `entwurf pi` execs your own pi with the control flag (`pi --entwurf-control` is equivalent once the
129
+ package is registered); the record mints the garden id, so do not inject a session id.
130
+ `entwurf claude [args…]` execs the `claude` on your PATH with its arguments unchanged; a Claude Code
131
+ session is a citizen through the hooks `entwurf install-meta-bridge` installed
132
+ ([setup §3](./docs/setup-clean-host.md#3-optional-claude-code-native-citizen)), however it started.
133
+ `entwurf pi-durable` is the durable contact above. `entwurf --help` is the quick overview of the
134
+ other entries and `entwurf help all` the full catalog; `entwurf help team` and
135
+ `entwurf help remote-pair` are the two guides.
159
136
 
160
- In that **harness session**, ask the agent to:
137
+ In that harness session, ask the agent to:
161
138
 
162
- 1. Call `entwurf_self` to confirm its authoritative identity.
163
- 2. Call `entwurf_peers` to discover existing citizens and their liveness facts.
139
+ 1. Call `entwurf_self` to confirm its identity.
140
+ 2. Call `entwurf_peers` to see existing siblings and their liveness facts.
164
141
  3. Pick a live garden id and call `entwurf_v2` with a message, for example:
165
142
 
166
143
  ```json
@@ -172,22 +149,12 @@ In that **harness session**, ask the agent to:
172
149
  }
173
150
  ```
174
151
 
175
- These are tools, not shell subcommands. Pi calls
176
- `mcp__entwurf_bridge__<verb>` through Pi's built-in MCP. The bridge exposes **nine**
177
- verbs; a pi citizen has **seven active + two hidden** (`entwurf_inbox_read` and
178
- `entwurf_register_native`), since it has no mailbox and its own extension births it.
179
- Those counts describe the source; a running host offers what its already-loaded bridge
180
- listed, so see [applying new source to a running host](./docs/setup-clean-host.md#applying-new-source-to-a-running-host).
181
- The server key stays `entwurf-bridge`. An operator/trusted-project MCP entry with
182
- that normalized namespace can replace the registration by Pi's own precedence;
183
- `/mcp` shows it, and Entwurf does not scan or fight that choice.
152
+ These are MCP tools inside a session, not shell commands; pi reaches them as
153
+ `mcp__entwurf_bridge__<verb>` through its built-in MCP. A running host offers what its
154
+ already-loaded bridge listed:
155
+ [applying new source to a running host](./docs/setup-clean-host.md#applying-new-source-to-a-running-host).
184
156
 
185
- ## Entwurf orchestration
186
-
187
- One narrow dispatch capability connects independent siblings, not an agent factory.
188
- The record is the **sole address authority**. A pane, socket, native transcript id,
189
- model or process marker is a carrier or observation, never a second address axis.
190
- Liveness is read at dispatch time; an id's shape does not tell you its transport.
157
+ ## How delivery works
191
158
 
192
159
  ### `entwurf_v2` — canonical dispatch verb
193
160
 
@@ -198,75 +165,50 @@ pi / pi-durable / Claude Code / Copilot / OMP / Antigravity / Codex
198
165
  → control-socket | self-fetch mailbox | native-push
199
166
  ```
200
167
 
201
- **Delivery starts no process.** A live pi receives over its record-addressed control
202
- address, an armed self-fetch citizen (Claude Code, Copilot, OMP, pi-durable) through its
203
- mailbox, a probe-alive native-push citizen (Codex; Antigravity is paused, #152) through its own
204
- conversation or thread. Anything else is refused honestly, never launched into. The receipt
205
- is a receiver acceptance boundary, a durable mailbox file or an injection, never completion;
206
- `wants_reply` is etiquette, not waiting. [DELIVERY](./DELIVERY.md#control-socket-acceptance-boundaries-120)
207
- owns what each boundary means and each rail's admission.
208
-
209
- The lifecycle verbs in the [table above](#entwurf) return their own receipts, never a delivery
210
- result: fresh a launch receipt (the sibling's callback envelope supplies its garden id), resume
211
- separate LAUNCH and OBSERVATION receipts, retire separate action, record and lock results.
212
- **Retirement is never autonomous:** it needs the human operator's explicit target and action, and
213
- no role, caller identity or tool annotation grants it ([DELIVERY](./DELIVERY.md#candidate-lifecycle-commands-are-not-delivery-boundaries-147)).
214
-
215
- **Mux launches; it never delivers.** Fresh opens in the caller's Herdr workspace or tmux session;
216
- `placement.tmuxSession` names another existing tmux session and is refused inside Herdr. The model
217
- is required and `cwd` is a literal absolute directory. Missing or ambiguous context refuses with no
218
- fallback. Exact argv, identity checks and limits: [tmux launch](./docs/mux-launch-rail.md),
219
- [Herdr launch](./docs/herdr-launch-rail.md).
220
-
221
- ### Remote siblings — declared pairs across hosts
222
-
223
- Opt-in. The v2 file below is read by the published 0.41.2; 0.41.1 and earlier read the
224
- earlier single-pair file. On each host, write `~/.pi/agent/entwurf-remote-pair.json` (mode `0600`; a
225
- 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
226
- below are fictional; use your own records' garden ids:
227
-
228
- ```json
229
- {
230
- "version": 2,
231
- "routes": [
232
- {
233
- "localGardenId": "20260101T090000-a1b2c3",
234
- "remoteGardenId": "20260101T091500-d4e5f6",
235
- "ssh": "host-b",
236
- "remotePairFile": "/home/me/.pi/agent/entwurf-remote-pair.json"
237
- }
238
- ]
239
- }
240
- ```
241
-
242
- The other host carries the mirror route: the two garden ids swapped, its own SSH alias for this
243
- host, and this file's canonical absolute path. Then send with the ordinary `entwurf_v2` to the
244
- remote garden id: one SSH attempt over your own account, checked and dispatched by the host that
245
- holds the record. There is no peer discovery, wake or retry. Why: [remote sibling principles](./docs/remote-sibling-principles.md);
246
- contract: [DELIVERY](./DELIVERY.md#remote-pairs-107-149-declared-pairs-across-hosts); steps and the
247
- hand conversion from the earlier file: [setup §2c](./docs/setup-clean-host.md#2c-optional-remote-pair-between-two-hosts-107).
248
-
249
- ### Team bookmarks — `team.json`
250
-
251
- A person's bookmark of the siblings one project works with. Copy [`team.json.example`](./team.json.example)
252
- to an ignored `team.json` at the project root and fill names, backend, garden id, native session id
253
- and cwd from Entwurf's record facts; read liveness from `entwurf_peers` when you dispatch. Entwurf
254
- does not load it as runtime configuration, and it is not configuration for identity, routes, roles, permissions or lifecycle. The
255
- example's own notes say the rest.
168
+ **Delivery starts no process.** The record is the sole address authority, and liveness is read at
169
+ dispatch time: a live pi receives over its control address, an armed self-fetch citizen through its
170
+ mailbox, a probe-alive native-push citizen in its own conversation. Anything else is refused, never
171
+ launched into. The receipt is the receiver's acceptance boundary, a durable mailbox file or an
172
+ injection — never the sibling's turn result; `wants_reply` is etiquette, not waiting.
173
+ [DELIVERY](./DELIVERY.md#control-socket-acceptance-boundaries-120) owns what each boundary means.
174
+
175
+ **Lifecycle verbs keep their own receipts.** Open returns a launch receipt, not an address; reopen
176
+ separates its launch from its observation; retire reports action, record and lock separately.
177
+ **Retirement is never autonomous:** it needs the human operator's explicit target and action, and no
178
+ role, caller identity or tool annotation grants it
179
+ ([DELIVERY](./DELIVERY.md#candidate-lifecycle-commands-are-not-delivery-boundaries-147)).
180
+
181
+ **Lifecycle launch is separate from `entwurf_v2` delivery.** Open and reopen place a sibling in the
182
+ caller's Herdr workspace or tmux session; `placement.tmuxSession` names another existing tmux session and is refused inside Herdr.
183
+ Missing or ambiguous context refuses with no fallback:
184
+ [tmux launch](./docs/mux-launch-rail.md) · [Herdr launch](./docs/herdr-launch-rail.md).
185
+
186
+ ### Remote siblings and team bookmarks
187
+
188
+ **Remote pairs** are opt-in. Each host declares the pair in its own file, and `entwurf_v2` to the
189
+ remote garden id makes one SSH attempt over your own account, checked and dispatched by the host that
190
+ holds the record — no discovery, wake or retry. `entwurf help remote-pair`, the steps in
191
+ [setup §2c](./docs/setup-clean-host.md#2c-optional-remote-pair-between-two-hosts-107), the
192
+ [principles](./docs/remote-sibling-principles.md) and the
193
+ [contract](./DELIVERY.md#remote-pairs-107-149-declared-pairs-across-hosts).
194
+
195
+ **Team bookmarks:** [`team.json.example`](./team.json.example) is a person's note of the siblings one
196
+ project works with, copied to an ignored `team.json`. Entwurf never loads it as configuration for
197
+ identity, routes, roles, permissions or lifecycle. `entwurf help team`.
256
198
 
257
199
  ## Concepts
258
200
 
259
- **Entwurf** (기투, projection-of-self) connects independent visible siblings;
260
- **garden id** names a record-backed citizen, not its pane or native transcript.
261
- [FAQ](./FAQ.md) explains ACP, MCP and context carriers.
201
+ **Entwurf** (기투, projection-of-self) connects independent visible siblings; a **garden id** names
202
+ a record-backed citizen, not its pane or native transcript. The package holds the v2 core, the
203
+ native-harness bridges, a pi adapter and an ACP plugin. ACP is one ingress, not the boundary; pi is
204
+ one adapter, not the center. Claude and Cortex Code are ACP backends; Codex and Antigravity stay
205
+ native so they keep their own tools and work context. The pi adapter registers the compiled bridge
206
+ with Pi's built-in MCP after record birth, while pi's own receive stays its record-addressed control
207
+ address. [FAQ](./FAQ.md) explains ACP, MCP and context carriers.
262
208
 
263
- ## Pi integration
264
-
265
- The pi adapter registers the compiled bridge with Pi's built-in MCP after record
266
- birth; Pi supervises the MCP child. **MCP is ingress; pi receive remains the
267
- record-addressed control address (a Unix socket, or the native-Windows preview's named
268
- pipe).** Garden identity and dispatch stay Entwurf's.
269
- Codemode is harness-internal, not another garden citizen.
209
+ Product guidance and CLI help each have one editable source: [ENTWURF.json](./ENTWURF.json) for
210
+ the MCP tool descriptions and the hints extracted there, [ENTWURF-CLI.json](./ENTWURF-CLI.json) for
211
+ `entwurf --help`. [AGENTS](./AGENTS.md#architecture) lists exactly what each carries.
270
212
 
271
213
  ## Operation guides
272
214
 
@@ -292,6 +234,8 @@ credential mediation, subscription bypass, pane-typing delivery or hidden orches
292
234
 
293
235
  Installation, a doctor, a fixture and an exact release candidate prove different things;
294
236
  none is interchangeable with the others or an all-host/long-haul guarantee.
237
+ [Releases](https://github.com/junghan0611/entwurf/releases) carry each cut's notes and acceptance
238
+ receipts; [CHANGELOG](./CHANGELOG.md) records source history.
295
239
 
296
240
  ## References
297
241
 
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
  >
@@ -239,12 +239,19 @@ holds that node and the badge counts it, `pending` while recovered), and the car
239
239
  `durableLayout` drawn by the published pi-tui renderer on a fake terminal across rows 1–8 × cols
240
240
  1–12, count changes and resizes, against the pinned upstream screen for the zero-task case. Its
241
241
  editor is a fixed stand-in: the real `CustomEditor`, overlays, emoji width and a consumer's own task
242
- are the visible-terminal and consumer subjects. The 1.2 bootstrap child also observes `--resume`
243
- reopening the chosen session and cancelling to nothing (#143). Two more sandboxed children reach the
244
- reference app's settings and prompt mapping: one drives the real bootstrap against a loopback
245
- WebSocket Responses endpoint, whose received frames decide the forwarded transport and its
246
- continuation and the reference compaction policy (the SDK's background summary beside the turn, held on the
247
- wire while the turn answers; blocking and overflow kept, #146); the other renders the carrier prompt's skills section with no model, against a fixture
242
+ are the visible-terminal and consumer subjects. Another sandboxed child holds the active transcript the
243
+ TUI renders (#155 D1): the carrier runtime over a session seeded through the SDK's public API, through
244
+ an open with a commit between its read and its watch, appends, one commit past the window's 100, a
245
+ switch away and back, compaction-like and reset head markers, a read held across a switch, a refused
246
+ read and the close. Its oracles are the entry IDs the SDK returned and, after close, a non-participant
247
+ open's `Conversation.context().entries`; the SDK boundary is steered test-only at the Conversation
248
+ prototype the child and carrier share. The bootstrap child on the pinned set also observes `--resume`
249
+ reopening the chosen session, by what its screen shows, and cancelling to nothing (#143). Two more
250
+ sandboxed children reach the owned app's settings and prompt mapping: one drives the real bootstrap
251
+ against a loopback WebSocket Responses endpoint, whose received frames decide the forwarded transport
252
+ and its continuation and the SDK's compaction policy under those settings (the SDK's background summary beside the turn, held on the
253
+ wire while the turn answers; blocking and overflow kept, #146), each placed summary, manual ones
254
+ included, heading the screen's active transcript; the other renders the carrier prompt's skills section with no model, against a fixture
248
255
  of both settings scopes, an absolute entry, a same-name pair and a wrong-base decoy.
249
256
  `check-pi-runtime-version` asks the
250
257
  same installed verifier (`check-pi-durable-beside`) whether this checkout resolves exactly the pinned SDK set (the native set; the PATH
@@ -269,8 +276,8 @@ constructed depth-3 mismatch refused by the verifier and seen by the oracle, the
269
276
  app's own model refusal before any birth — also with one installed `--native-module` initialized
270
277
  first, a reserved extension name refused before anything opens, one installed `--native-module-dir`
271
278
  initializing only its top-level `*.extension.mjs` (#134) and a directory without a module refused
272
- before anything opens — and the HOST kept a separate subject — a real pi 1.1.0
273
- binary (the previous generation) beside the pinned native set is a named pi FAIL with zero Pi wiring while pi-durable still
279
+ before anything opens — and the HOST kept a separate subject — a real pi 1.2.0
280
+ binary (below the supported range; a fixture version, not the pinned set's previous generation) beside the pinned native set is a named pi FAIL with zero Pi wiring while pi-durable still
274
281
  PASSes — not native admission. The carrier's rebuild
275
282
  equality is the owned source's emission (#141): the carrier claim `PI-DURABLE-CARRIER-EMIT-SOURCE-EQUAL`
276
283
  on every floor, `emit-pi-durable-carrier --check` as its CLI. The emitter's exact Node is red in the CI
@@ -282,7 +289,7 @@ caller/target/cross-harness LIVE are owed by `smoke-pi-durable-fresh-live`, a re
282
289
  | Axis | Required proof | Limit |
283
290
  |---|---|---|
284
291
  | 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. |
292
+ | 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
293
  | Linux artifact consumer | required `check-install-container` CI job against one preserved candidate | Fixtures prove package/oracle shape, not a real Claude lifecycle. |
287
294
  | 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
295
  | 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. |
@@ -374,7 +381,7 @@ The goal is not merely "invoke Claude Code." We want:
374
381
  **One install command to remember: `./run.sh setup <project>`.** It is idempotent — re-run the exact same command whenever anything looks wrong. There is no second install surface to juggle: from a clone `setup` runs the whole floor in order.
375
382
 
376
383
  1. `pnpm install` — installs the pinned development dependencies and builds the bridge (source-checkout bootstrap only; an installed package never runs npm/pnpm inside `node_modules`)
377
- 2. pi wiring → `<project>/.pi/settings.json` + user-scope registration — only when a `pi` inside the supported range (`>=1.4.0 <1.5`) is on PATH; absent pi is an explicit zero-state SKIP, a below-floor pi is a detected FAIL. The user-scope entry is owner-recorded (#86 C2): another root's live-or-missing ownership makes this step a zero-write refusal (setup: pi FAIL) that names `takeover-user-scope`; the install-states bind the exact managed settings path (a drifted/symlinked/corrupt target is a zero-write refusal) and the inverse removes only the recorded owner's exact entry; `doctor-pi-package` reports the verdict
384
+ 2. pi wiring → `<project>/.pi/settings.json` + user-scope registration — only when a `pi` inside the supported range (`>=1.5.0 <1.6`) is on PATH; absent pi is an explicit zero-state SKIP, a below-floor pi is a detected FAIL. The user-scope entry is owner-recorded (#86 C2): another root's live-or-missing ownership makes this step a zero-write refusal (setup: pi FAIL) that names `takeover-user-scope`; the install-states bind the exact managed settings path (a drifted/symlinked/corrupt target is a zero-write refusal) and the inverse removes only the recorded owner's exact entry; `doctor-pi-package` reports the verdict
378
385
  3. Claude meta-bridge global plugin — only when `claude` is on PATH; otherwise skipped cleanly
379
386
  4. source stable-bin exposure — including certified `entwurf` → this checkout's `run.sh`, the managed runtime Copilot fresh resolves; helper units are attempted independently and a foreign helper is a named FAIL
380
387
  5. agy bridge + exact permission + statusline + `PreInvocation` hook — only when `agy` is on PATH; each adapter is idempotent and independently doctorable
package/demo/README.md CHANGED
@@ -24,7 +24,7 @@ takes/helpers/tests are maintainer tooling and are deliberately excluded from th
24
24
 
25
25
  - Node at the `package.json#engines.node` floor; the checkout's pinned dependencies and
26
26
  current compiled bridge. After a source/bootstrap change, build with `pnpm run build-bridge`.
27
- - Pi at the checkout's supported floor (**current floor 1.4.0**); `entwurf` on PATH must be
27
+ - Pi at the checkout's supported floor (**current floor 1.5.0**); `entwurf` on PATH must be
28
28
  the intended source stable-bin. Source evidence is not registry-package acceptance.
29
29
  - `herdr` on PATH at exactly `scripts/fixtures/herdr-supply.json#version`; `asciinema` v3.
30
30
  - Herdr's existing Pi integration at
@@ -135,7 +135,7 @@ Dep bump ledger. 0.38.0 (#145) changes only the pi SDK set; the ACP rows are unc
135
135
  | Surface | Declaration | Class | What a green actually says |
136
136
  |---|---|---|---|
137
137
  | Entwurf package | `package.json` `version` | checkout declaration, not a release receipt | names the package label these rows sit beside; whether that label shipped, and with which rows, is CHANGELOG's record |
138
- | pi runtime | SDK exact `1.4.0`, host `>=1.4.0 <1.5` | **exact** oracle + **closed range** | the SDK set this checkout builds, gates and (since #130) ships as exact production dependencies; an ordinary Pi host inside the range is accepted, and the ceiling moves only on measurement. The published 0.36.0 through 0.37.1 shipped the 1.2.0 set (#141); 0.38.0 (#145) is the first to carry 1.3.0. Historical: the published 0.33.0 through 0.35.1 ship SDK exact 1.1.0, 0.32.0 ships SDK exact 1.0.4 with the next-minor ceiling (ROADMAP's 2026-10-07 bump entry), and 0.31.0 declared the earlier peer floor 1.0.2 |
138
+ | pi runtime | SDK exact `1.5.0`, host `>=1.5.0 <1.6` | **exact** oracle + **closed range** | the #155 development checkout's declared SDK set and derived host range, not a release or operating-host acceptance; an ordinary Pi host inside the range is accepted by the source's version predicate, and the ceiling moves only on measurement. The published 0.36.0 through 0.37.1 shipped the 1.2.0 set (#141); 0.38.0 (#145) is the first to carry 1.3.0. Historical: the published 0.33.0 through 0.35.1 ship SDK exact 1.1.0, 0.32.0 ships SDK exact 1.0.4 with the next-minor ceiling (ROADMAP's 2026-10-07 bump entry), and 0.31.0 declared the earlier peer floor 1.0.2 |
139
139
  | ACP wire SDK | `@agentclientprotocol/sdk 1.8.0` | **exact** | the shared wire oracle both adapters speak |
140
140
  | Claude ACP adapter | `@agentclientprotocol/claude-agent-acp 0.90.0` | **exact**, bundled | shipped since 0.36.1; resolved before any PATH fallback; declaration is not compatibility evidence |
141
141
  | Claude Agent SDK | `0.3.296` (transitive) | **exact** oracle | the runtime risk surface behind the adapter |
@@ -11,9 +11,9 @@ 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 resolves the target's current rail: a live pi control socket, a deliverable self-fetch mailbox (pi-durable, Claude Code, Copilot or OMP), or probe-alive Codex native push. Dormant pi and undeliverable targets reject; Antigravity native push is paused and rejects before probing (#152). 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
- 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.
16
+ Observed: Claude Code, Codex CLI, Antigravity CLI, GitHub Copilot CLI and OMP all reach this MCP bridge. Claude, Copilot and OMP become replyable through deliverable mailbox-backed meta-sessions; Codex uses native push, while Antigravity's native-push rail is paused (#152). 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
 
18
18
  Prerequisites on the host running the external MCP client:
19
19
 
@@ -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).