@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.
- package/AGENTS.md +5 -3
- package/BASELINE.md +110 -1
- package/CHANGELOG.md +249 -0
- package/CONTRIBUTING.md +1 -1
- package/ENTWURF-CLI.json +1229 -0
- package/ENTWURF.json +63 -15
- package/FAQ.md +4 -4
- package/README.md +132 -188
- package/VERIFY.md +18 -11
- package/demo/README.md +1 -1
- package/docs/acp-backend-rail.md +1 -1
- package/docs/external-mcp-host.md +4 -4
- package/docs/setup-clean-host.md +94 -22
- package/mcp/entwurf-bridge/dist/ENTWURF.json +63 -15
- package/mcp/entwurf-bridge/dist/mcp/entwurf-bridge/src/index.js +19 -8
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-contract.js +4 -4
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-visible-resume.js +483 -18
- 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-resume-call.js +50 -5
- 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/resume-launch-identity.js +18 -11
- package/mcp/entwurf-bridge/dist/pi-extensions/meta-bridge-pi-durable.js +30 -15
- 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 +28 -8
- package/mcp/entwurf-bridge/tsconfig.build.json +7 -1
- package/native/win32-x64/manifest.json +1 -1
- package/package.json +16 -20
- package/pi/pi-durable/bootstrap.mjs +179 -6
- package/pi/pi-durable/carrier/runtime.js +327 -57
- package/pi/pi-durable/carrier/session-name.js +11 -0
- package/pi/pi-durable/carrier/sessions.js +96 -20
- package/pi/pi-durable/carrier/subagent.js +5 -2
- package/pi/pi-durable/carrier/tui.js +60 -22
- package/pi/pi-durable/overlay/upstream-pin.json +26 -19
- package/pi-extensions/lib/entwurf-v2-contract-schema.ts +73 -69
- package/pi-extensions/lib/entwurf-v2-contract.ts +4 -4
- package/pi-extensions/lib/entwurf-v2-visible-resume.ts +710 -38
- 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-resume-call.ts +77 -4
- 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/resume-launch-identity.ts +31 -12
- package/pi-extensions/meta-bridge-pi-durable.ts +30 -16
- package/run.sh +552 -699
- package/scripts/check-claude-launch.ts +341 -0
- package/scripts/check-entwurf-v2-contract.ts +4 -4
- package/scripts/check-entwurf-v2-surface.ts +2 -2
- package/scripts/check-fresh-call-dispatch.ts +70 -9
- package/scripts/check-fresh-cut-gate.sh +23 -9
- package/scripts/check-gate-qualification.ts +19 -14
- 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 +28 -0
- 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 +4 -4
- package/scripts/mutants/claude-launch.json +142 -0
- package/scripts/mutants/cli-help-source.json +420 -0
- package/scripts/mutants/control-send-receipt.json +1 -1
- 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-resume-call.json +63 -2
- package/scripts/mutants/pack-install.json +4 -4
- package/scripts/mutants/peer-facts.json +15 -0
- package/scripts/mutants/pi-durable.json +1167 -3
- package/scripts/mutants/pi-floor.json +22 -5
- package/scripts/mutants/source-install.json +35 -0
- package/scripts/mutants/v2-surface.json +2 -2
- package/scripts/mutants/v2-visible-resume.json +255 -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,112 +16,91 @@ 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
|
-
|
|
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 |
|
|
37
|
+
| Verb | Tool | What it does | Harnesses |
|
|
32
38
|
|---|---|---|---|
|
|
33
|
-
| **Open**
|
|
34
|
-
| **Reopen**
|
|
35
|
-
| **
|
|
36
|
-
| **
|
|
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
|
-
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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
|
-
|
|
53
|
+
## Install
|
|
60
54
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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
|
-
|
|
119
|
+
## First steps
|
|
145
120
|
|
|
146
|
-
|
|
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
|
|
156
|
-
package
|
|
157
|
-
|
|
158
|
-
|
|
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
|
|
137
|
+
In that harness session, ask the agent to:
|
|
161
138
|
|
|
162
|
-
1. Call `entwurf_self` to confirm its
|
|
163
|
-
2. Call `entwurf_peers` to
|
|
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
|
|
176
|
-
`mcp__entwurf_bridge__<verb>` through
|
|
177
|
-
|
|
178
|
-
|
|
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
|
-
##
|
|
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.**
|
|
202
|
-
address, an armed self-fetch citizen
|
|
203
|
-
mailbox, a probe-alive native-push citizen
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
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
|
-
|
|
261
|
-
|
|
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
|
-
|
|
264
|
-
|
|
265
|
-
|
|
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.
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
package/docs/acp-backend-rail.md
CHANGED
|
@@ -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.
|
|
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
|
|
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
|
|
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
|
-
[
|
|
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).
|