@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.
- package/AGENTS.md +4 -2
- package/BASELINE.md +110 -1
- package/CHANGELOG.md +328 -0
- package/CONTRIBUTING.md +1 -1
- package/ENTWURF-CLI.json +1229 -0
- package/ENTWURF.json +284 -0
- package/FAQ.md +4 -4
- package/README.md +125 -184
- package/VERIFY.md +2 -2
- package/docs/external-mcp-host.md +3 -3
- package/docs/setup-clean-host.md +37 -12
- package/mcp/entwurf-bridge/dist/ENTWURF.json +284 -0
- package/mcp/entwurf-bridge/dist/mcp/entwurf-bridge/src/index.js +46 -196
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/agent-guidance.js +299 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-surface.js +21 -25
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-visible-resume.js +498 -29
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/fresh-call-dispatch.js +47 -10
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/herdr-fresh-call.js +613 -33
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/herdr-resume-call.js +497 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/meta-session.js +3 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-fresh-call.js +23 -20
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-resume-call.js +68 -21
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-fresh-preflight.js +7 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-location.js +347 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-owner-fence.js +1132 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-runtime.js +1 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/remote-pair-send.js +7 -4
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/resume-launch-identity.js +18 -11
- package/mcp/entwurf-bridge/dist/pi-extensions/meta-bridge-pi-durable.js +53 -60
- package/mcp/entwurf-bridge/dist/scripts/herdr-rails.mjs +40 -7
- package/mcp/entwurf-bridge/dist/scripts/meta-bridge-fresh-cut.js +1 -27
- package/mcp/entwurf-bridge/dist/scripts/meta-bridge-prune.js +1 -1
- package/mcp/entwurf-bridge/dist/scripts/meta-facts.js +1 -1
- package/mcp/entwurf-bridge/dist/scripts/peer-facts.js +1 -1
- package/mcp/entwurf-bridge/src/index.ts +149 -327
- package/mcp/entwurf-bridge/tsconfig.build.json +7 -1
- package/native/win32-x64/manifest.json +1 -1
- package/package.json +8 -4
- package/pi/pi-durable/bootstrap.mjs +179 -6
- package/pi/pi-durable/carrier/runtime.js +108 -9
- package/pi/pi-durable/carrier/session-name.js +11 -0
- package/pi/pi-durable/carrier/sessions.js +96 -20
- package/pi/pi-durable/overlay/upstream-pin.json +11 -5
- package/pi-extensions/lib/agent-guidance.ts +341 -0
- package/pi-extensions/lib/entwurf-v2-surface.ts +25 -31
- package/pi-extensions/lib/entwurf-v2-visible-resume.ts +725 -54
- package/pi-extensions/lib/fresh-call-dispatch.ts +64 -12
- package/pi-extensions/lib/herdr-fresh-call.ts +919 -40
- package/pi-extensions/lib/herdr-resume-call.ts +810 -0
- package/pi-extensions/lib/meta-session.ts +13 -8
- package/pi-extensions/lib/mux-fresh-call.ts +23 -26
- package/pi-extensions/lib/mux-resume-call.ts +95 -23
- package/pi-extensions/lib/pi-durable-fresh-preflight.ts +9 -2
- package/pi-extensions/lib/pi-durable-location.ts +446 -0
- package/pi-extensions/lib/pi-durable-owner-fence.ts +1461 -0
- package/pi-extensions/lib/pi-durable-runtime.ts +4 -0
- package/pi-extensions/lib/remote-pair-send.ts +7 -4
- package/pi-extensions/lib/resume-launch-identity.ts +31 -12
- package/pi-extensions/meta-bridge-pi-durable.ts +52 -79
- package/run.sh +417 -654
- package/scripts/build-bridge.sh +10 -0
- package/scripts/check-capability-bundle-reach.ts +86 -0
- package/scripts/check-claude-launch.ts +341 -0
- package/scripts/check-entwurf-self-address.ts +3 -3
- package/scripts/check-entwurf-v2-surface.ts +94 -98
- package/scripts/check-fresh-call-dispatch.ts +70 -9
- package/scripts/check-fresh-cut-gate.sh +23 -9
- package/scripts/check-gate-qualification.ts +24 -17
- package/scripts/check-herdr-activation.ts +301 -23
- package/scripts/check-herdr-fresh-call.ts +161 -25
- package/scripts/check-herdr-plugin-build.ts +173 -1
- package/scripts/check-herdr-plugin.ts +28 -2
- package/scripts/check-herdr-runtime-bootstrap.ts +136 -0
- package/scripts/check-install-surface.ts +1236 -6
- package/scripts/check-meta-doctor-oracle.sh +1 -1
- package/scripts/check-meta-facts.ts +20 -1
- package/scripts/check-mux-resume-call.ts +48 -3
- package/scripts/check-peer-facts.ts +39 -2
- package/scripts/cli-help.mjs +222 -0
- package/scripts/dev-bin.sh +39 -2
- package/scripts/herdr-activation.mjs +28 -6
- package/scripts/herdr-operator-link.mjs +389 -0
- package/scripts/herdr-plugin-activate.mjs +5 -0
- package/scripts/herdr-plugin-deactivate.mjs +18 -5
- package/scripts/herdr-rails.mjs +43 -7
- package/scripts/herdr-runtime.mjs +27 -0
- package/scripts/meta-bridge-fresh-cut.ts +1 -27
- package/scripts/meta-bridge-prune.ts +1 -1
- package/scripts/meta-facts.ts +1 -1
- package/scripts/mutants/agent-guidance.json +160 -0
- package/scripts/mutants/bridge-boot-resume.json +6 -8
- package/scripts/mutants/capability-bundle-reach.json +124 -0
- package/scripts/mutants/claude-launch.json +142 -0
- package/scripts/mutants/cli-help-source.json +420 -0
- package/scripts/mutants/control-send-receipt.json +21 -4
- package/scripts/mutants/dev-gate-dispatch.json +109 -0
- package/scripts/mutants/fresh-call-dispatch.json +38 -2
- package/scripts/mutants/fresh-cut.json +15 -0
- package/scripts/mutants/herdr-activation.json +128 -0
- package/scripts/mutants/herdr-fresh-call.json +278 -5
- package/scripts/mutants/herdr-operator-link.json +318 -0
- package/scripts/mutants/herdr-plugin-build.json +55 -0
- package/scripts/mutants/herdr-plugin.json +17 -0
- package/scripts/mutants/herdr-resume-call.json +288 -0
- package/scripts/mutants/herdr-runtime-bootstrap.json +48 -0
- package/scripts/mutants/meta-facts.json +15 -0
- package/scripts/mutants/mux-fresh-call.json +14 -3
- package/scripts/mutants/mux-resume-call.json +89 -3
- package/scripts/mutants/peer-facts.json +15 -0
- package/scripts/mutants/pi-durable.json +996 -6
- package/scripts/mutants/remote-pair-send.json +21 -2
- package/scripts/mutants/self-address.json +10 -10
- package/scripts/mutants/source-install.json +35 -0
- package/scripts/mutants/v2-surface.json +50 -64
- package/scripts/mutants/v2-visible-resume.json +266 -6
- package/scripts/peer-facts.ts +1 -1
- package/scripts/smoke-agy-install-state.sh +66 -0
- package/scripts/smoke-meta-prune.sh +23 -0
- package/scripts/smoke-omp-fresh-live.ts +12 -3
- package/scripts/smoke-omp-receive-live.ts +7 -1
- package/scripts/smoke-pi-durable-fresh-live.ts +12 -2
- 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
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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
|

|
|
10
9
|
|
|
@@ -17,107 +16,83 @@ A recorded source-checkout demo: callback → task → native Bash → reply.
|
|
|
17
16
|
|
|
18
17
|
[](https://www.npmjs.com/package/@junghanacs/entwurf) · maintained by [junghanacs.com](https://junghanacs.com/)
|
|
19
18
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
35
|
+
## The four verbs
|
|
36
|
+
|
|
37
|
+
| Verb | Tool | What it does | Harnesses |
|
|
27
38
|
|---|---|---|---|
|
|
28
|
-
| **Open**
|
|
29
|
-
| **Reopen**
|
|
30
|
-
| **
|
|
31
|
-
| **
|
|
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
|
-
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
|
|
53
|
+
## Install
|
|
55
54
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
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
|
-
|
|
129
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
151
|
-
package
|
|
152
|
-
|
|
153
|
-
|
|
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
|
|
129
|
+
In that harness session, ask the agent to:
|
|
156
130
|
|
|
157
|
-
1. Call `entwurf_self` to confirm its
|
|
158
|
-
2. Call `entwurf_peers` to
|
|
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
|
|
171
|
-
`mcp__entwurf_bridge__<verb>` through
|
|
172
|
-
|
|
173
|
-
|
|
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
|
-
|
|
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.**
|
|
197
|
-
address, an armed self-fetch citizen
|
|
198
|
-
mailbox, a probe-alive native-push citizen
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
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
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
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
|
-
|
|
261
|
-
|
|
262
|
-
|
|
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
|
-
[
|
|
329
|
-
[AGENTS.md](../AGENTS.md), and [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).
|
package/docs/setup-clean-host.md
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
396
|
-
|
|
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
|
|
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
|