@junghanacs/entwurf 0.37.1 → 0.38.1

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/CHANGELOG.md CHANGED
@@ -4,6 +4,223 @@ All notable changes to this project will be documented here. Format follows [Kee
4
4
 
5
5
  ## Unreleased
6
6
 
7
+ ## 0.38.1 - 2026-10-17
8
+
9
+ ### pi-durable
10
+
11
+ - **Background compaction returns to the SDK default (#146).** The owned Harness settings
12
+ hand the SDK Pi's compaction settings unchanged instead of forcing `backgroundTokens: 0`
13
+ (#143, 0.37.0-0.38.0), so the SDK's own default background policy applies again; no
14
+ Entwurf copy of its value exists. Past the background threshold a summary runs beside the
15
+ turn, which answers without waiting for it; threshold, overflow and manual compaction are
16
+ unchanged. Transport and the other Harness mappings are unchanged.
17
+ - **Limits.** A process started from 0.37.0-0.38.0 keeps the forced 0 it imported until the
18
+ operator restarts it. The beside proof is a faux scheduling proof on a loopback wire, not
19
+ live GPT latency, billing or overload evidence; thresholds for a given window are
20
+ predictions from the SDK's policy, not measurements. `backgroundTokens` has no operator
21
+ tuning entry, and Pi's per-model compaction overrides are not applied by the app.
22
+ - **Use native capabilities; refuse what a harness lacks.** `docs/durable-native-support.md`
23
+ now states the receive-side principle with the Pi / pi-durable contrast and maps which
24
+ layer decides each Harness setting.
25
+
26
+ ### Release boundary and verification
27
+
28
+ - **Implementation commits.** `58c4d0f` (principle doc) and `9229452` (#146 source, carrier,
29
+ pin, proof, mutant, docs). Coordinator independent review B0/D0 after one amendment;
30
+ additional independent review (ee20b5) B0/D0/O4.
31
+ - **Earlier-candidate PARTIAL (not this SHA):** `["bash","run.sh","check-pi-durable-carrier"]`
32
+ 30/30 killed, control ok, on the uncommitted amendment-1 surface (worktree diff
33
+ `fc146d97`, head beb5925), receipt seal `7906a9c0d88d`; the other 949 committed claims
34
+ not run there.
35
+ - **Kill-power at this SHA: not yet measured.** The final same-SHA manual `qualify=true`
36
+ whole BODY is required before the tag; its result is recorded in the #146 ledger and the
37
+ GitHub release, not in this frozen text.
38
+ - **Static/LIVE split.** Local P4/M0 `check:full` is not run on this operator host (its FULL
39
+ includes Herdr checks prohibited here) and is not counted as passed: the whole static
40
+ floor is owed to this prepared SHA's exact push CI.
41
+ - **Earlier LIVE r1 (history of the RED SHA c90b5bf, not this release's LIVE): MUST
42
+ (non-static 23) PASS=23 FAIL=0 SKIP=0 UNRUN=0; BEHAVIOR PASS=1 FAIL=0.** It ran once on
43
+ 2026-10-17 15:11:01-15:15:47 KST through the 0.38.0 stepwise driver. Its step lines are
44
+ unchanged, and `run.sh` is unchanged since d25b71e. Candidate: 9229452 plus `CHANGELOG.md`,
45
+ `NEXT.md` and `package.json`, which still carried the 0.38.0 npm runtime lock; the
46
+ fingerprint was equal at freeze, before and after. `smoke-codex-fresh-live` ran against an
47
+ owned app-server in its own session A, with `gpt-5.6-luna` / `openai-codex/gpt-5.6-luna`,
48
+ stopped by TERM afterwards. Receipts: `.tmp-verify/release-0.38.1/live-r1/` (`live.log`
49
+ 3ce295e1, `steps.SHA256SUMS` 5a18e7da). It was not a local `release-gate --cut` PASS.
50
+ - **Herdr follows core.** `plugins/herdr/runtime-lock.json` returns to the closed
51
+ `herdr-checkout` source for this unpublished candidate, as at the 0.37.1 and 0.38.0 cuts:
52
+ an npm lock must name the checkout's own version (`certifyLockCoherence`), and 0.38.1 has
53
+ no registry bytes yet. No plugin manifest version or registry pin changes; the npm pin
54
+ returns only in a separate Herdr snapshot after the operator publishes 0.38.1.
55
+ - **First prepared SHA was RED.** `c90b5bf` kept the 0.38.0 npm lock; its push run
56
+ 39009471179 failed `check` at `check-herdr-plugin-build` `[QK:HPB-DEFAULT-LOCK-READ]`
57
+ (`runtime-lock-incoherent`), with the other three jobs green. That gate is prohibited on
58
+ this operator host, so it first showed in CI. The RED run and that SHA's LIVE r1 stay as
59
+ history.
60
+ - **Repaired candidate LIVE r2 (RED, kept as history): MUST PASS=4 FAIL=1 UNRUN=19;
61
+ BEHAVIOR not reached.** It ran 15:31:58-15:37:27 KST on c90b5bf plus `CHANGELOG.md`,
62
+ `NEXT.md`, `plugins/herdr/README.md` and `plugins/herdr/runtime-lock.json`. Step
63
+ `smoke-mux-lifecycle-live` failed. In its pi-native arm, the sibling's first model turn
64
+ (`openai-codex/gpt-6.1-sol:low`) showed "Codex error: An error occurred while processing
65
+ your request", no nonce callback came, and the gate gave up after 300 s; the claude-code
66
+ arm passed. Whether that error is transient was not measured. Receipts:
67
+ `.tmp-verify/release-0.38.1/live-r2/` (`LIVE-R2-RED.md` 96070f72).
68
+ - **Local LIVE r3, this release's LIVE: MUST (non-static 23) PASS=23 FAIL=0 SKIP=0 UNRUN=0;
69
+ BEHAVIOR PASS=1 FAIL=0.** It ran once, 15:41:19-15:45:47 KST, on the same frozen repaired
70
+ candidate as r2 (fingerprint equal at freeze, before and after), with the same driver and
71
+ models. GLG approved this single re-measurement and allowed a repeat of that one vendor
72
+ failure to be recorded and continued past; it did not repeat, so the exception and its
73
+ continuation driver were not used. Each LIVE ran against a fresh owned app-server in its
74
+ own session A, stopped by TERM afterwards. Receipts: `.tmp-verify/release-0.38.1/live-r3/`
75
+ (`live.log` 929b7952, `steps.SHA256SUMS` 99f87db2). It was not a local
76
+ `release-gate --cut` PASS: the static step did not run locally.
77
+ - **Post-LIVE delta: evidence records only.** After r3, `CHANGELOG.md` and `NEXT.md` took
78
+ these records; `package.json`, the lockfile, `run.sh`, `plugins/herdr/` and all
79
+ source/carrier bytes equal the r3 candidate. The repaired prepared SHA's exact push CI is
80
+ owed.
81
+
82
+ ## v2026.10.16-herdr.0.38.0 — Herdr Entwurf plugin 0.38.0
83
+
84
+ A separate Herdr plugin snapshot, not another core release: core package 0.38.0 and its
85
+ `v0.38.0` tag remain unchanged. The operator has published the core to npm.
86
+
87
+ ### Herdr plugin
88
+
89
+ - **Re-pin the published core 0.38.0 and close the checkout window.**
90
+ `plugins/herdr/runtime-lock.json` returns from the `herdr-checkout` carrier that core 0.38.0
91
+ rode to production npm source `@junghanacs/entwurf@0.38.0` with the registry's measured
92
+ sha512 (`sha512-A7Pd4FOe…aqbA==`). The plugin manifest moves 0.37.0 → 0.38.0; admission
93
+ remains Herdr >= 0.9.0 and the one-build/one-pane/Linux shape is unchanged.
94
+ - **Pi 1.3 first, then the plugin.** The runtime this snapshot acquires carries core 0.38.0, whose
95
+ accepted Pi range is `>=1.3.0 <1.4` (#145). A host still on Pi 1.2 is refused by name
96
+ (`outside the supported range`) at plugin activation, the same check `entwurf setup` applies,
97
+ and no Pi settings are written. Upgrade Pi to 1.3, then install or reinstall the plugin. The
98
+ plugin README's Requirements say so.
99
+ - **Upgrade by acquisition source, not just version.** A settled npm-source 0.37.0 installation
100
+ can rebind under the plugin README's ownership conditions. A host that installed an
101
+ intervening `herdr-checkout` candidate must explicitly deactivate by its own absolute runtime
102
+ path before reinstalling the npm-source snapshot. No operator installation or active session
103
+ is rewired by this release work.
104
+
105
+ ### Source-specific verification
106
+
107
+ - Registry metadata reports version/latest 0.38.0, repair 0.12.8-repair.1, 599 files. The
108
+ registry's `dist.integrity` and `dist.shasum` equal the sha512 and sha1 independently
109
+ computed from the preserved accepted core candidate (SHA256
110
+ `6d21699b1a37a8441c9631bd9128f413aecd37146dfb091cc768eb7a69ea7438`, 11144202 bytes), so
111
+ core make's Docker consumer of those bytes (`node:24-bookworm`, repoDigest
112
+ `node@sha256:6dac556d…`) is reused here, not repeated. A sandboxed `pi install` of the
113
+ registry package resolved its bridge inside the sandbox, recorded the registry URL with that
114
+ integrity, and listed the curated Claude anchors with `--list-models entwurf`.
115
+ - **The npm runtime swap against the real registry**, by the registry-shipped helper (byte-equal
116
+ to this checkout's) in sandboxed user roots, 22/22 checks. The 0.37.0 runtime was seeded from
117
+ its own committed lock; the swap to 0.38.0 took one acquisition, the cached tarball's sha512
118
+ equals the lock and its sha256 equals both the ready journal's observed digest and the
119
+ accepted candidate. The `installing` journal carried the 0.37.0 identity as
120
+ `previousRuntime` and the `runtime-ready` journal carries `null`; when acquisition began the
121
+ 0.37.0 tree was still at the active address. A manually seeded torn swap (the active tree
122
+ moved to the backup address with a half candidate in staging; not a killed process) was
123
+ restored before acquisition and reported `recovered: torn-swap-with-candidate`. An exact
124
+ re-request acquired nothing and left journal and tree byte-identical, and the owned removal
125
+ reclaimed cache, runtime and journal. The helper is a leaf that probes no Pi, so these cells
126
+ certify neither a Pi upgrade nor Herdr's install/update relocation, harness wiring, the
127
+ installed CLI's deactivate path, a model turn, or recovery from a real kill.
128
+ - **Focused gates on the branch**, with HEAD, index and work surface unchanged across them:
129
+ `check-herdr-supply` (11 assertions), `check-herdr-plugin` (49),
130
+ `check-herdr-plugin-profile` (14), `check-herdr-runtime-bootstrap` (31),
131
+ `check-herdr-activation` (33), `check-herdr-placement` (25), `check-herdr-fresh-call` (45)
132
+ and `check-gate-manifests` (979 committed mutants across 72 lanes validated, none executed).
133
+ `check-herdr-plugin-build` and `check-herdr-sandbox` were not run locally because they run
134
+ the operator's own herdr; they ride the pushed SHA's FULL floor in CI.
135
+ - Pending, and not claimed here: the pushed SHA's four-job CI and the public-ref
136
+ install/use/deactivate journey on Herdr 0.9.5 with Pi 1.3.0. Earlier npm or checkout-carrier
137
+ receipts cannot certify these source-specific axes. This section is the prepared source
138
+ record; the actual post-push, public-ref and CI outcomes are recorded at the snapshot's
139
+ [acceptance ledger](https://github.com/junghan0611/entwurf/issues/145#issuecomment-6209375125).
140
+
141
+ ## 0.38.0 - 2026-10-16
142
+
143
+ ### Pi SDK 1.3.0
144
+
145
+ - **Accept the coherent nine-member Pi SDK 1.3.0 set (#145).** Upgrade exact pins,
146
+ lockfile, release-age allowlist, upstream constellation metadata and matching fixtures.
147
+ The supported PATH Pi range is now `>=1.3.0 <1.4`. Owned durable app source and emitted
148
+ carrier bytes are unchanged; execution, storage, compaction and provider/auth engines
149
+ remain upstream-owned. Stage2 shell changes and #142 thinking/default/ACP effort are not
150
+ included.
151
+ - **Known upstream behavior, not an app-level LIVE claim.** SDK 1.3.0 sends Haiku 5.5 /
152
+ Opus 5 thinking `off` as disabled; Opus 5.5 still does not support `off`. The app's
153
+ current level-less default reaches the SDK as `off`, so Haiku 5.5 / Opus 5 thinking is
154
+ EXPECTED to be disabled under 1.3.0. That is an inference inherited from the #142 source
155
+ reading, not measured in a vendor LIVE turn; the default selection is unchanged here and
156
+ remains #142's subject. Upstream also changes malformed tool-argument validation and
157
+ compaction baseline placement; no cross-version prompt-loss or universal compatibility
158
+ claim is made here.
159
+
160
+ ### Release boundary and verification
161
+
162
+ - **Implementation checkpoint.** `d25b71e6f320462e67827d71265811de7cd89db1`, reviewed
163
+ 19-file SDK bundle. Its branch push CI run 38843056373 passed all four required jobs
164
+ (620 s wall, static FULL 571 s). This is checkpoint evidence, not the prepared 0.38.0
165
+ SHA's CI.
166
+ - **Kill-power re-measured at this shipped SHA: none (all 979 committed claims not
167
+ re-proved, #144).**
168
+ - Earlier-candidate PARTIAL (operator-attested, not this SHA): head 2fa0d8210e98 surface
169
+ 79f961d6d2fa -- `check-dep-versions` 4/4 receipt 5e787c54c298
170
+ - Earlier-candidate PARTIAL (operator-attested, not this SHA): head 2fa0d8210e98 surface
171
+ 79f961d6d2fa -- `check-pack-pin-matcher` 2/2 receipt dc1abd661323
172
+ - Both PARTIAL candidates are head 2fa0d82 plus the then-uncommitted SDK diff (patch
173
+ 6f01d8dc), measured before d25b71e existed; they are not the shipped 0.37.1 bytes and
174
+ not this SHA.
175
+ - **Bounded forward-open proof.** One synthetic 1.2 SDK-written conversation was selected
176
+ by exact id, resumed by the 1.3 checkout reader under the same carrier, given one faux
177
+ turn, and reopened with history and identity preserved. Negative 2/2, writer 17/17,
178
+ reader 16/16; vendor wire counters 0 and final seals stable; independent review B0/D0. This is not a
179
+ universal migration/rollback/compaction or cross-version MCP schema certificate. The
180
+ first fixture attempt was RED and remains preserved. Source and limitations are in
181
+ [#145](https://github.com/junghan0611/entwurf/issues/145#issuecomment-6208532928); no operational DB was opened for this test.
182
+ - **Host alignment and continuity.** GLG authorized exact global Pi 1.3.0 installation and
183
+ manually restarted harnesses. Actual host and checkout SDK versions were 1.3.0. The same
184
+ coordinator garden id/cwd resumed, then exchanged real v2 replies with two existing
185
+ Claude citizens. After GLG reported SDK compaction complete, self identity and bookmark
186
+ continuity were observed; SDK internals/vendor prompt ordering were not inspected.
187
+ - **Static/LIVE split, newly approved for this cut.** GLG explicitly approved local LIVE
188
+ and whole static FULL in the prepared SHA's exact push CI. Local P4/P5-static/M0 FULL
189
+ are deferred, not passed: the FULL includes Herdr checks prohibited on this operator
190
+ host. The mutation whole BODY remains a weekly/manual diagnostic, never a release axis.
191
+ - **Local LIVE r1: MUST (non-static 23) PASS=23 FAIL=0 SKIP=0 UNRUN=0; BEHAVIOR PASS=1
192
+ FAIL=0.** The unchanged release aggregate's non-static MUST steps and its advisory
193
+ BEHAVIOR step ran once, 2026-10-16 14:00:43–14:05:43 KST, through a one-off stepwise
194
+ driver whose 24 step lines equal `release_gate`'s at d25b71e (source order, argv, env,
195
+ cwd and classifiers), stopping on the first MUST red. Candidate: d25b71e plus the four
196
+ release-metadata files, fingerprint `12fca42c` equal at freeze, before and after.
197
+ `smoke-codex-fresh-live` ran against an owned app-server in its own session A, separate
198
+ from the gate session S, with `gpt-5.6-luna` / `openai-codex/gpt-5.6-luna`;
199
+ `smoke-pi-durable-fresh-live` ran on the host's Pi 1.3.0 and is not repeated as a
200
+ separate smoke. Receipts: `.tmp-verify/release-0.38.0/live-r1/` (`live.log` b676817c,
201
+ `steps.SHA256SUMS` c7868c81). This is not a local `release-gate --cut` PASS: the
202
+ static step did not run locally.
203
+ - **Post-LIVE delta: evidence records and prose docs only.** After the LIVE run,
204
+ `CHANGELOG.md` and `NEXT.md` took the evidence records, and a separate docs-only commit
205
+ corrected stale prose in `DELIVERY.md`, `ROADMAP.md`, `VERIFY.md`,
206
+ `docs/acp-backend-rail.md` and `docs/external-mcp-host.md`. `package.json`,
207
+ `plugins/herdr/runtime-lock.json`, the lockfile, `run.sh` and all source/carrier bytes
208
+ equal the LIVE candidate; GLG waived a LIVE re-run for prose-only changes, and the
209
+ prepared SHA's push CI runs the whole static floor over the final bytes.
210
+ - **Native Claude host doctor:** the operator's `entwurf` bin in clone mode (resolving to
211
+ this checkout) ran `doctor-meta-bridge` and exited 0 (`meta-bridge doctor: PASS`) after
212
+ the host transition, with two live record-backed Claude MCP owners and a writer at v3
213
+ parity. This is not a doctor proof of the 0.38.0 tarball or an installed consumer.
214
+ Receipt: `.tmp-verify/release-0.38.0/doctor-meta-bridge.txt`.
215
+ - **Prepared exact-SHA CI is owed by this SHA's push run.** All four required jobs
216
+ (`check`, `install-surface`, `artifact-consumer`, `macos-install-surface`) and the
217
+ preserved post-CI tarball consumer acceptance remain owed; no tag or publication yet.
218
+ - **Herdr follows core.** The closed `herdr-checkout` verification carrier stays unchanged
219
+ apart from its dated comment. No plugin manifest version, registry pin or production
220
+ acquisition authority changes here. Re-pin and real Herdr installation/update/use proof
221
+ follow the published core 0.38.0 bytes as a separate plugin snapshot; this core LIVE is
222
+ not that proof.
223
+
7
224
  ## 0.37.1 - 2026-10-16
8
225
 
9
226
  ### Verification
package/DELIVERY.md CHANGED
@@ -116,7 +116,7 @@ physical host. Do not read a D-level cell as a Darwin receipt.
116
116
  | **Copilot CLI first-party extension** | raw transport probe; superseded by the owned product unit | D7 path observed; D3 control receipt incomplete; D8 unproven | CLI-spawned extension over stdio JSON-RPC; `joinSession()` + documented `fs.watch` → `session.send({mode:"enqueue"})`. Idle wake, exact-marker reply, and completion passed on 2026-08-23 (CLI 1.0.80, L4, one Linux host). Two-process isolation was observed but its decisive B log was not preserved. Kept as the transport receipt the owned receive unit was built on; the shipped unit differs deliberately — it announces the inbox instead of injecting the body. |
117
117
  | **Copilot CLI garden citizen** | shipped in 0.15.0; send + receive + visible fresh accepted on one host | D6; D7 partial; D3 pending; D8 unproven | Birth, garden id, MCP hand and record-backed sender identity are accepted; the RECEIVER is an installed first-party extension that binds to the V3 record, writes a receiver marker owned by the WATCHER pid, and rings a doorbell the model drains with `entwurf_inbox_read`. `wakeMode` is `self-fetch`, so dispatch reaches the mailbox rail: armed → delivered, unarmed/stale → the honest `mailbox-undeliverable` refusal. **D6 is the owned-invocation LIVE acceptance of 2026-08-23** — garden `20260823T181316-d9f6ba`, native `20fe30c8-b2bc-4600-91a0-8a409131be51`, CLI 1.0.80: receive log `joined`→`armed`→`doorbell fresh=1`→`rang`, mailbox `lastEnqueuedAt 09:23:41.235Z` / `lastReadAt 09:23:56.480Z`, and a model reply on the same record/native/gid chain. **Visible fresh (step 9 clause 7) is a separate LIVE, 2026-08-25** — launch window `@89`/`%89` nonce `mux-fresh-call-690529ae99f99faa2252aefb`; exact-callback garden `20260825T085721-f68be0`; one `entwurf_v2` → `meta-mailbox → enqueued`; same garden `lastReadAt 2026-08-24T23:57:47.784Z` plus same-gid reply; GLG saw footer garden id and a healthy multi-turn window. Those rows stay unmerged. D7 is PARTIAL: reply and read receipt were observed, the completion taxonomy and long-haul operation were not. D3 (second-session isolation of an owned invocation) is PENDING — observed once, decisive log lost to scratch cleanup. Evidence level L4: one host. Launch through the owned invocation `entwurf copilot`, which sets `COPILOT_CLI_ENABLED_FEATURE_FLAGS=EXTENSIONS` for that one process; `doctor-copilot-receive` reads live CLI environments because a session launched without it is silently inert. Visible fresh is operator-metered and is not a release-gate MUST. |
118
118
  | **OMP (`omp`) garden citizen** | shipped in 0.16.0; send + receive + visible fresh accepted on one host | D6; D3 proven; D7 partial; D8 partial | Two in-process extensions in the operator's own TUI: birth mints the `mode === "tui"` host (subagents mint nothing) and names it as sender; the RECEIVER unit joins that citizen in the SAME process, holds an `fs.watch` on its mailbox signal, and rings an announce-only doorbell through the vendor's `pi.sendUserMessage` — measured to be on the FACTORY object, not the event ctx, and measured to start a turn on an idle host with zero typing (`agent_start` +31ms). `wakeMode` is `self-fetch`: the model drains with `entwurf_inbox_read` and THAT read is the receipt. **D6 is the LIVE acceptance of 2026-08-30** (oracle, omp 18.0.0) — garden `20260830T140819-116f6a`, `lastEnqueuedAt 05:08:20.555Z` / `lastReadAt 05:08:23.958Z`, and the citizen's own transcript carrying `mcp__entwurf_bridge_entwurf_inbox_read` for its own garden id. **D3 is PROVEN, not pending**: with two live omp citizens armed, one addressed enqueue rang exactly one doorbell and the sibling persisted no transcript and kept an empty mailbox. D7 is PARTIAL (`lastReadAt` needs no scraping; the reply does). D8 is PARTIAL — dedupe and every stale-handling path are implemented and hermetically pinned, ordering/loop-guard/crash-recovery are not. The `/new` unarm is the rail-specific one: the watch lives in the operator's TUI, so pid + start-key cannot see a citizen change underneath a living process, and without an explicit unarm the previous garden id would keep reading deliverable. Requires `tools: xdev: false` in `~/.omp/agent/config.yml` — the vendor default hides MCP tool schemas from the prompt, so the doorbell would name a tool the model cannot call. The decisive receipt lines — the ordering probe, the D6 chain, the D3 isolation and the `/new` unarm — are pasted into `scripts/raw-omp-measure/README.md` §M7 rather than left in a host-local `/tmp` path. Evidence level L4: one Linux host, ARM. **Visible fresh (step 9) is ACCEPTED — the clause 7 LIVE went green on 2026-08-30:** `entwurf_fresh_call` opens omp on all three public surfaces through the bare `omp` runtime with an explicit `--approval-mode yolo` width and the `mcp__entwurf_bridge_entwurf_v` callback name, behind a five-axis pre-mutation preflight whose fifth axis is omp-specific (`tools.xdev !== true`, without which the model cannot call the callback tool at all). **The first turn is a TWO-STAGE BOOTSTRAP rather than a positional prompt, and that is a measured correction, not a preference.** `[LIVE 2026-08-30]` the positional-prompt candidate opened its window and minted its citizen (garden `20260830T181342-452167`, native `01a051f2-3107-7147-8806-fa2a6f527610`), delivered the byte-identical framing as a user message at `09:13:42.413Z`, and the model answered the literal text `ACK` at `09:13:47.105Z` with ZERO tool calls; the caller timed out at 240s. `[source]` the interactive UI defers MCP discovery (`sdk.ts:1847-1855`, `:1881-1905`) while the positional `initialMessage` prompts straight after `mode.init()` (`main.ts:540-565`), and `[측정]` an observer on the same runtime saw `turn_start` at +654ms with the entwurf tools absent and the callback tool present only at +1484ms. So the launcher now carries `{v,target,nonce,task}` on the fixed registered flag `--entwurf-bootstrap`, and the in-process birth extension polls `getAllTools`(`source:"mcp"`) AND `getActiveTools` for the exact callback name, sends a callback-ONLY prompt, arms the task only on a `tool_result` whose stored `toolCallId`, tool name, target, nonce and `isError === false` all match, and DELIVERS it at the next `turn_end` of that same session. `[LIVE 2026-08-30]` that last boundary is itself a measured correction: a first attempt sent the task from inside the `tool_result` handler with an explicit `deliverAs: "followUp"`, the hook log showed the full chain (`bootstrap-armed` → `bootstrap-ready` +440ms → `bootstrap-callback-observed` → `bootstrap-released`), and the task still never appeared in the session — `[source]` an explicit `deliverAs` queues without starting a turn in either state, while the omitted form starts one when idle (`agent-session.ts:6511-6513`), which the same transcript confirmed three seconds later when the Bundle B doorbell's omitted-option send landed and started a turn. `[측정 2026-08-30]` the callback-only half is what was proven to work: model `openai-codex/gpt-5.6-sol`, tool live at +1105ms, prompt injected at +1107ms, and the sibling calling `mcp__entwurf_bridge_entwurf_v` with the exact nonce (`omp-cb-btkvva4r87` → `20260830T184054-1aa1f2`, `meta-mailbox → enqueued`). **The clause 7 acceptance, `smoke-omp-fresh-live` (release-gate MUST), 2026-08-30, 21 assertions, omp 18.0.0 / `openai-codex/gpt-5.6-sol`:** launch through `tools/call entwurf_fresh_call` with nonce `mux-fresh-call-34faea228f3c3638684b40ff`; sibling garden `20260830T192913-df52b9` taken from the CALLBACK's sender envelope and never from the launch receipt; exactly one new citizen (§3.5); addressed `entwurf_v2` → `meta-mailbox → enqueued`; `lastEnqueuedAt 10:29:19.179Z` / `lastReadAt 10:29:24.673Z`; the drain visible in that session's own transcript for its own garden id. **Both bootstrap stages are in that transcript in order** — the callback-only prompt at offset 970, the caller's task at 4732, no four-backend positional framing anywhere, and an assistant message after the task proving it started a turn rather than sitting in a queue. The unit's own log carries the state machine: `bootstrap-armed 10:29:13.399Z` → `bootstrap-ready 10:29:13.819Z` (+420ms) → `bootstrap-callback-observed 10:29:18.663Z` (`toolCallId=call_KZJtkxfzy1IEE4ejKutCPWcm|fc_0858…`) → `bootstrap-released 10:29:18.731Z` → `bootstrap-task-sent 10:29:18.759Z`. Evidence level L4: one Linux host, ARM, one run. `check-harness-admission-parity` keeps the deterministic half of the admission from being a matter of memory. What this does NOT establish: multi-host, multi-model, or repeated fresh calls in one process. **Cross-harness leg, 2026-08-31 (first bidirectional live-turn roundtrip on the committed bytes + operator redeploy):** a claude-code citizen (`20260831T090152-f998ac`) opened a fresh omp sibling through the public surface (nonce `mux-fresh-call-807cb693b1913ce98ffdbfd1`, callback sender garden `20260831T124226-eac41a`), dispatched an addressed `entwurf_v2` → `meta-mailbox → enqueued`, and the omp citizen's own live turn drained and replied into the claude mailbox — its self-report (doorbell → `entwurf_inbox_read`; callback-only first user message, task second) agrees with every receipt on the chain. |
119
- | **pi-durable native host** | 0.31.0 candidate; visible fresh + addressed receive + both cross-harness legs accepted on one Linux host (2026-10-06, `smoke-pi-durable-fresh-live`, 36 assertions, exit 0) | D6 (D3/D4 shown); D7 partial; D8 unproven | The operator-provided pinned source runtime (`cd32f77` + overlay) launched by the managed `entwurf pi-durable --provider … --model … --width task-wide`; the contact registers six tools and spawns the compiled bridge as a direct child; receive is announce-only self-fetch (doorbell → root submission → `entwurf_inbox_read`). Receipt (V on both sides, `openai-codex/gpt-6.1-sol`): real Pi `20261006T223710-e51e21` opened pd `20261006T223720-ba0c08` through `entwurf_fresh_call`; pd's first action called back into Pi with the exact nonce; Pi's live turn → pd mailbox ENQUEUE `2026-10-06T13-37-35-446Z-b57c69.msg`, that message's doorbell submission `done` on pd's root conversation, drained by pd's live turn (`entwurf_inbox_read` of its own id, settled); pd's live turn → Pi `entwurf_v2` settled `control-socket → sent` (native tool-result, joined by call id) and landed as exactly one Pi row with the expected payload and pd as the anchored sender. Native offering (root `pi.system`, toolsAdded/toolsRemoved applied): the six contact tools + bash/read/edit/write/subagent; pd's first root tool call is the callback. Actual model from root `pi.assistant` rows; the generation checkpoint does not retain `request.model` after completion. |
119
+ | **pi-durable native host** | shipped in 0.31.0 (source-runtime route; carrier route since 0.32.0, see `docs/adding-a-harness.md`), receipt below from the 0.31 route; visible fresh + addressed receive + both cross-harness legs accepted on one Linux host (2026-10-06, `smoke-pi-durable-fresh-live`, 36 assertions, exit 0) | D6 (D3/D4 shown); D7 partial; D8 unproven | The operator-provided pinned source runtime (`cd32f77` + overlay) launched by the managed `entwurf pi-durable --provider … --model … --width task-wide`; the contact registers six tools and spawns the compiled bridge as a direct child; receive is announce-only self-fetch (doorbell → root submission → `entwurf_inbox_read`). Receipt (V on both sides, `openai-codex/gpt-6.1-sol`): real Pi `20261006T223710-e51e21` opened pd `20261006T223720-ba0c08` through `entwurf_fresh_call`; pd's first action called back into Pi with the exact nonce; Pi's live turn → pd mailbox ENQUEUE `2026-10-06T13-37-35-446Z-b57c69.msg`, that message's doorbell submission `done` on pd's root conversation, drained by pd's live turn (`entwurf_inbox_read` of its own id, settled); pd's live turn → Pi `entwurf_v2` settled `control-socket → sent` (native tool-result, joined by call id) and landed as exactly one Pi row with the expected payload and pd as the anchored sender. Native offering (root `pi.system`, toolsAdded/toolsRemoved applied): the six contact tools + bash/read/edit/write/subagent; pd's first root tool call is the callback. Actual model from root `pi.assistant` rows; the generation checkpoint does not retain `request.model` after completion. |
120
120
  | **Copilot CLI TUI+server** — *withdrawn lane, kept as evidence* | rejected | D7; D8 unproven | Older official-SDK probe over hidden `--ui-server`; idle enqueue worked, but loopback RPC authentication was not established. The bundled extension supersedes this candidate without reviving it. |
121
121
  | **ACP Claude / Cortex** | shipped runtime, outside this matrix | — | ACP sessions are children launched by entwurf's pi adapter, not already-running native sessions to wake. |
122
122
 
package/README.md CHANGED
@@ -53,7 +53,7 @@ ownership of the harness.
53
53
 
54
54
  Prerequisites: **Node >=24.0.0**, Python 3 for `setup`, and any harnesses you choose
55
55
  to use, already installed and authenticated. Pi is optional-by-presence, supported
56
- range `>=1.2.0 <1.3`; Claude Code supported floor `>=2.1.217` is required for its
56
+ range `>=1.3.0 <1.4`; Claude Code supported floor `>=2.1.217` is required for its
57
57
  managed exec-hook lifecycle. pnpm is needed only for source-checkout setup.
58
58
 
59
59
  ```bash
@@ -83,7 +83,7 @@ restriction; that is not certification of every platform's harness rails.
83
83
 
84
84
  ### Native durable (pi-durable)
85
85
 
86
- **The package supplies Entwurf's owned app/TUI carrier and nine exact Pi 1.2.0 SDK
86
+ **The package supplies Entwurf's owned app/TUI carrier and nine exact Pi 1.3.0 SDK
87
87
  members.** No separate runtime checkout, patch, build or ordinary Pi CLI is needed.
88
88
  The launch verifies carrier integrity and every reachable SDK edge's name/version;
89
89
  incomplete, drifted or mixed supply refuses by name.
package/VERIFY.md CHANGED
@@ -233,8 +233,8 @@ are the visible-terminal and consumer subjects. The 1.2 bootstrap child also obs
233
233
  reopening the chosen session and cancelling to nothing (#143). Two more sandboxed children reach the
234
234
  reference app's settings and prompt mapping: one drives the real bootstrap against a loopback
235
235
  WebSocket Responses endpoint, whose received frames decide the forwarded transport and its
236
- continuation and the reference compaction policy (no background summary; blocking and overflow
237
- kept, #143); the other renders the carrier prompt's skills section with no model, against a fixture
236
+ continuation and the reference compaction policy (the SDK's background summary beside the turn, held on the
237
+ wire while the turn answers; blocking and overflow kept, #146); the other renders the carrier prompt's skills section with no model, against a fixture
238
238
  of both settings scopes, an absolute entry, a same-name pair and a wrong-base decoy.
239
239
  `check-pi-runtime-version` asks the
240
240
  same installed verifier (`check-pi-durable-beside`) whether this checkout resolves exactly the pinned SDK set (the native set; the PATH
@@ -275,7 +275,7 @@ caller/target/cross-harness LIVE are owed by `smoke-pi-durable-fresh-live`, a re
275
275
  | Packed install | `check-pack-install` | Real tarball, but checkout-visible. |
276
276
  | Linux artifact consumer | required `check-install-container` CI job against one preserved candidate | Fixtures prove package/oracle shape, not a real Claude lifecycle. |
277
277
  | 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. |
278
- | 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 current `entwurf-bridge` MCP tools), 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. |
278
+ | 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; eight today), 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. |
279
279
  | LIVE runtime | `LIVE=1 ./run.sh release-gate <scratch> --cut` plus any shipped on-demand backend axis | `--cut` enforces `SKIP=0`; a red wired gate blocks the cut. |
280
280
  | Native Claude host | installed strict doctor against a new real session | Missing live join is `NOT CERTIFIED`, not a fixture PASS. |
281
281
  | Native agy host | three doctors plus conversation-id-gated native-push round trip | Aggregate release-gate does not own an agy conversation id. |
@@ -359,7 +359,7 @@ The goal is not merely "invoke Claude Code." We want:
359
359
  **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.
360
360
 
361
361
  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`)
362
- 2. pi wiring → `<project>/.pi/settings.json` + user-scope registration — only when a `pi` inside the supported range (`>=1.2.0 <1.3`) 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
362
+ 2. pi wiring → `<project>/.pi/settings.json` + user-scope registration — only when a `pi` inside the supported range (`>=1.3.0 <1.4`) 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
363
363
  3. Claude meta-bridge global plugin — only when `claude` is on PATH; otherwise skipped cleanly
364
364
  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
365
365
  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.2.0**); `entwurf` on PATH must be
27
+ - Pi at the checkout's supported floor (**current floor 1.3.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
@@ -125,18 +125,19 @@ What "supported" means here, per declaration class. The classes are kept apart o
125
125
  undifferentiated "supported" column is what let a Claude PASS read as if it also certified Cortex.
126
126
  The rows are THIS checkout's declarations, not a shipped release: what a published version carried
127
127
  is that version's CHANGELOG entry, and a candidate's own evidence is its issue thread, LIVE receipts
128
- and exact-SHA CI. The pi row shipped in 0.30.0 (#125). The ACP wire SDK, Claude adapter and Claude
129
- Agent SDK rows are the unpublished #127 candidate: published 0.30.0 still declares
130
- `claude-agent-acp 0.79.0` and `@agentclientprotocol/sdk 1.4.0`
131
- (`[측정 2026-10-04]` `npm view @junghanacs/entwurf@0.30.0`; per-bump record in the ROADMAP Dep bump
132
- ledger, 2026-10-03).
128
+ and exact-SHA CI. The pi row shipped in 0.30.0 (#125). The ACP wire SDK and Claude adapter rows
129
+ equal the published 0.36.1–0.37.1 manifests (`claude-agent-acp 0.90.0`, `@agentclientprotocol/sdk
130
+ 1.8.0`); 0.31.0–0.36.0 shipped `0.85.1` / `1.6.0` and 0.30.0 shipped `0.79.0` / `1.4.0`
131
+ (`[측정 2026-10-16]` `git show <tag>:package.json`). The transitive Claude Agent SDK `0.3.296`
132
+ row has no direct manifest entry; its bump is recorded in CHANGELOG 0.36.1 (#128) and the ROADMAP
133
+ Dep bump ledger. 0.38.0 (#145) changes only the pi SDK set; the ACP rows are unchanged from 0.37.1.
133
134
 
134
135
  | Surface | Declaration | Class | What a green actually says |
135
136
  |---|---|---|---|
136
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 |
137
- | pi runtime | SDK exact `1.2.0`, host `>=1.2.0 <1.3` | **exact** oracle + **closed range** | the SDK set this checkout builds, gates and (since #130) ships as exact production dependencies; an ordinary Pi host inside the range is accepted, and the ceiling moves only on measurement. The published 0.36.0 ships this 1.2.0 set (#141). Historical: the published 0.33.0 through 0.35.1 ship SDK exact 1.1.0, 0.32.0 ships SDK exact 1.0.4 with the next-minor ceiling (ROADMAP's 2026-10-07 bump entry), and 0.31.0 declared the earlier peer floor 1.0.2 |
138
+ | pi runtime | SDK exact `1.3.0`, host `>=1.3.0 <1.4` | **exact** oracle + **closed range** | the SDK set this checkout builds, gates and (since #130) ships as exact production dependencies; an ordinary Pi host inside the range is accepted, and the ceiling moves only on measurement. The published 0.36.0 through 0.37.1 shipped the 1.2.0 set (#141); 0.38.0 (#145) is the first to carry 1.3.0. Historical: the published 0.33.0 through 0.35.1 ship SDK exact 1.1.0, 0.32.0 ships SDK exact 1.0.4 with the next-minor ceiling (ROADMAP's 2026-10-07 bump entry), and 0.31.0 declared the earlier peer floor 1.0.2 |
138
139
  | ACP wire SDK | `@agentclientprotocol/sdk 1.8.0` | **exact** | the shared wire oracle both adapters speak |
139
- | Claude ACP adapter | `@agentclientprotocol/claude-agent-acp 0.90.0` | **exact**, bundled | checkout candidate; resolved before any PATH fallback; declaration is not compatibility evidence |
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 |
140
141
  | Claude Agent SDK | `0.3.296` (transitive) | **exact** oracle | the runtime risk surface behind the adapter |
141
142
  | Anthropic SDK | `0.100.1` | **exact**, peer-resolution only | satisfies the Agent SDK peer floor (0.93.0+); never an API client here (gate L4) |
142
143
  | Claude Code runtime | `>=2.1.217` (`entwurf.claudeCodeFloor`) | **floor** | below it, hook args are silently dropped; entwurf enforces this itself |
@@ -622,9 +623,13 @@ pnpm run check:full
622
623
  ./run.sh check-acp-session-reuse
623
624
  ./run.sh check-acp-stop-reason
624
625
  ./run.sh check-acp-cortex
625
- ./run.sh check-gate-qualification
626
626
  ```
627
627
 
628
+ The whole `check-gate-qualification` body is not part of this floor: it is a scheduled drift
629
+ diagnostic only (weekly CI or a manual `qualify=true` dispatch, never a release axis, #144). A
630
+ change to a gate, mutant or matrix runs its affected exact-argv groups as PARTIAL receipts
631
+ (VERIFY.md).
632
+
628
633
  Live axes:
629
634
 
630
635
  ```bash
@@ -273,7 +273,7 @@ top-level (`Tool web_search not found`, upstream #5973), fixed by pinning it via
273
273
 
274
274
  `read xd://` reports exactly what the default hides. `[측정]` on a host with only this
275
275
  bridge registered, **11 devices**: omp's own `ast_edit`, `debug`, `lsp`, `browser`, plus all
276
- seven `entwurf_*`. So the default does not merely wrap entwurf — it wraps omp's own LSP and
276
+ seven `entwurf_*` (as reported in that earlier measurement; the current bridge declares eight). So the default does not merely wrap entwurf — it wraps omp's own LSP and
277
277
  debugger too.
278
278
 
279
279
  **`entwurf setup` writes this for a detected omp host, and `entwurf install-omp-config` is
@@ -28,8 +28,8 @@ evidence split, and its three states must not collapse into "macOS is supported"
28
28
  | npm/pnpm | npm is bundled with Node; pnpm is required for source setup | package or source installation |
29
29
  | Python 3 | required by `setup`/`install` (project-path normalization + settings writers); `--help`/`check-bridge` stay Python-free | pi/Claude/agy/Copilot/Codex wiring writers |
30
30
  | entwurf | global/project-local `@junghanacs/entwurf`, or a source checkout | operator command and garden capability |
31
- | pi | optional-by-presence, `>=1.2.0 <1.3` — absent is an explicit setup SKIP, below-floor is a named FAIL | ACP provider, control sockets |
32
- | Native durable (`pi-durable`) | supplied by the Entwurf package (#130): Entwurf's owned app carrier plus the exact 1.2.0 pi SDK set as production dependencies — setup PASS when they verify, a named FAIL otherwise (never SKIP) | the `entwurf pi-durable` contact; native birth/LIVE on this supply surface is a separate release proof (§2b) |
31
+ | pi | optional-by-presence, `>=1.3.0 <1.4` — absent is an explicit setup SKIP, below-floor is a named FAIL | ACP provider, control sockets |
32
+ | Native durable (`pi-durable`) | supplied by the Entwurf package (#130): Entwurf's owned app carrier plus the exact 1.3.0 pi SDK set as production dependencies — setup PASS when they verify, a named FAIL otherwise (never SKIP) | the `entwurf pi-durable` contact; native birth/LIVE on this supply surface is a separate release proof (§2b) |
33
33
  | Claude Code | optional, **`>=2.1.217`** — the exec-form hook floor | Claude ACP auth/runtime and mailbox-backed native citizen |
34
34
  | GitHub Copilot CLI | optional-by-presence, operator-installed and authenticated — absent is an explicit setup SKIP; detected composes all four units (birth/MCP/receiver/footer) | self-fetch citizen and visible fresh |
35
35
  | OMP (`omp`) | optional-by-presence, operator-installed — absent is an explicit setup SKIP; detected composes all four units (birth/MCP/`tools.xdev` setting/receiver) | self-fetch citizen and visible fresh (accepted on one host — see §4b) |
@@ -209,7 +209,7 @@ on Darwin; that is wiring, not a rail receipt. If `pi` is on PATH,
209
209
  Install the exact release floor, then wire the project:
210
210
 
211
211
  ```bash
212
- npm install -g @earendil-works/pi-coding-agent@1.2.0
212
+ npm install -g @earendil-works/pi-coding-agent@1.3.0
213
213
  pi --version
214
214
 
215
215
  cd ~/entwurf-smoke
@@ -217,7 +217,7 @@ entwurf install .
217
217
  pi -e "$(npm root -g)/@junghanacs/entwurf" --list-models entwurf
218
218
  ```
219
219
 
220
- The supported range is `>=1.2.0 <1.3`. It is a hard minimum: installing this
220
+ The supported range is `>=1.3.0 <1.4`. It is a hard minimum: installing this
221
221
  release onto a 0.83.x pi host upgrades the runtime rather than keeping the older
222
222
  minor. A host using only the external MCP bridge can skip pi until it needs a
223
223
  control socket; no delivery rail launches a pi process.
@@ -313,7 +313,7 @@ by `entwurf pi` or by registering ordinary Pi's adapter.
313
313
  What the Entwurf package supplies:
314
314
 
315
315
  1. **The pi SDK set** — `@earendil-works/{pi-coding-agent, pi-ai, pi-tui, pi-agent-core,
316
- pi-durable, chord, pi-mcp, pi-codemode, pi-telemetry}` at exactly `1.2.0`, plus
316
+ pi-durable, chord, pi-mcp, pi-codemode, pi-telemetry}` at exactly `1.3.0`, plus
317
317
  `proper-lockfile`, as Entwurf's own production dependencies (declared once in
318
318
  `pi/pi-durable/overlay/upstream-pin.json` `sdk`). Model data rides the published
319
319
  `pi-ai`; there is no catalog copy.
@@ -326,7 +326,7 @@ What the Entwurf package supplies:
326
326
  (`pi/pi-durable/carrier-resolver.mjs`), which maps them to the published package's
327
327
  own `dist/` as installed — never through a source checkout.
328
328
 
329
- The upstream [library guide](https://github.com/earendil-works/pi/blob/v1.2.0/packages/durable/README.md)
329
+ The upstream [library guide](https://github.com/earendil-works/pi/blob/v1.3.0/packages/durable/README.md)
330
330
  and the [experimental app guide](https://github.com/earendil-works/pi/blob/v1.1.0/packages/coding-agent/src/experimental/durable/README.md)
331
331
  (last published at v1.1.0) describe what the carrier is. Running the bare upstream app does not attach Entwurf's
332
332
  garden contact. Entwurf does not rebuild the controller/model/auth/storage system or
@@ -411,7 +411,7 @@ tree (for example an override that binds pi-durable's `pi-ai` to an older publis
411
411
  manifest field; it is a known constraint of supplying both from one package, accepted for 0.32,
412
412
  not a claim that every load path is harmless.
413
413
 
414
- The ordinary Pi CLI on PATH is a separate subject (§2, range `>=1.2.0 <1.3`): a host Pi is
414
+ The ordinary Pi CLI on PATH is a separate subject (§2, range `>=1.3.0 <1.4`): a host Pi is
415
415
  not needed to run pi-durable, and a host inside the range need not be the same copy as the
416
416
  carrier's. Native Pi owns credentials, model settings and durable SQLite sessions; keep them
417
417
  in place rather than copying credentials or migrating ordinary Pi transcripts. Native
@@ -610,7 +610,7 @@ as a note rather than a fault.
610
610
 
611
611
  **entwurf sets no OMP version floor in code, and will not grow one on schedule.** Detection is
612
612
  presence-only (`command -v "${OMP_BIN:-omp}"`); there is no `entwurf.ompFloor`, no coherence
613
- gate, and no exact pin — unlike Node (`engines.node`), pi (`>=1.2.0 <1.3`) and Claude Code
613
+ gate, and no exact pin — unlike Node (`engines.node`), pi (`>=1.3.0 <1.4`) and Claude Code
614
614
  (`entwurf.claudeCodeFloor`), each of which has an enforcement point. That asymmetry is a
615
615
  decision, not an omission. A floor is the answer to a vendor that fails SILENTLY — Claude Code
616
616
  earned one because an older binary validates the exec manifest, drops `args` at runtime, and
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@junghanacs/entwurf",
3
- "version": "0.37.1",
3
+ "version": "0.38.1",
4
4
  "description": "Visible sibling sessions across independent agent harnesses: launch in Herdr or tmux, reopen pi in tmux, and deliver messages by garden id; native bridges and Claude/Cortex ACP adapters.",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -99,15 +99,15 @@
99
99
  "@agentclientprotocol/claude-agent-acp": "0.90.0",
100
100
  "@agentclientprotocol/sdk": "1.8.0",
101
101
  "@anthropic-ai/sdk": "0.100.1",
102
- "@earendil-works/chord": "1.2.0",
103
- "@earendil-works/pi-agent-core": "1.2.0",
104
- "@earendil-works/pi-ai": "1.2.0",
105
- "@earendil-works/pi-codemode": "1.2.0",
106
- "@earendil-works/pi-coding-agent": "1.2.0",
107
- "@earendil-works/pi-durable": "1.2.0",
108
- "@earendil-works/pi-mcp": "1.2.0",
109
- "@earendil-works/pi-telemetry": "1.2.0",
110
- "@earendil-works/pi-tui": "1.2.0",
102
+ "@earendil-works/chord": "1.3.0",
103
+ "@earendil-works/pi-agent-core": "1.3.0",
104
+ "@earendil-works/pi-ai": "1.3.0",
105
+ "@earendil-works/pi-codemode": "1.3.0",
106
+ "@earendil-works/pi-coding-agent": "1.3.0",
107
+ "@earendil-works/pi-durable": "1.3.0",
108
+ "@earendil-works/pi-mcp": "1.3.0",
109
+ "@earendil-works/pi-telemetry": "1.3.0",
110
+ "@earendil-works/pi-tui": "1.3.0",
111
111
  "@modelcontextprotocol/sdk": "^1.12.1",
112
112
  "proper-lockfile": "4.1.2",
113
113
  "smol-toml": "^1.8.0",
@@ -34,10 +34,10 @@ export function createHarnessSettings(settingsManager )
34
34
  ...(provider.maxRetries === undefined ? {} : { maxRetries: provider.maxRetries }),
35
35
  };
36
36
  },
37
- // The reference app waits for a compaction instead of summarizing beside the running turn (#143): no background
38
- // compaction. Threshold, manual and overflow compaction stay the SDK's, on pi's own compaction settings.
37
+ // Pi's own compaction settings, which carry no background policy: the SDK supplies its default background,
38
+ // threshold, overflow and manual compaction (#146; #143 had forced background compaction off).
39
39
  get compaction() {
40
- return { ...settingsManager.getCompactionSettings(), backgroundTokens: 0 };
40
+ return settingsManager.getCompactionSettings();
41
41
  },
42
42
  get retry() {
43
43
  return settingsManager.getRetrySettings();
@@ -82,8 +82,8 @@
82
82
  {
83
83
  "name": "harness-setup.js",
84
84
  "source": "pi/pi-durable/src/experimental/durable/harness-setup.ts",
85
- "blob": "36a622ec6d5dccda828ffaceaf74ce8ec241e39d",
86
- "sha256": "efb06ae25258fbbab5b28f8a9bbb50956c7ebfd77a5ed23b065706f662e70ba3"
85
+ "blob": "e8561809321ce8833a13e3757c172f4e38faabcc",
86
+ "sha256": "eb1158030a8ab95187a4fdd5e7b90816a7995e5f446d09a8184d4f5007e7ac5f"
87
87
  },
88
88
  {
89
89
  "name": "prompt.js",
@@ -132,17 +132,17 @@
132
132
  ]
133
133
  },
134
134
  "sdk": {
135
- "comment": "The published library set the carrier runs against, derived from the 1.2.0 declarations. members: the @earendil-works packages the carrier imports and every @earendil-works package those declare. direct: a third-party package a carrier file imports itself (sessions.ts: proper-lockfile, at the version pi-coding-agent 1.2.0 pins). Each is an exact production dependency in package.json; the members' own edges are caret ranges, so the installed physical edges, not semver, are what must equal these versions.",
135
+ "comment": "The published library set the carrier runs against, derived from the 1.3.0 declarations. members: the @earendil-works packages the carrier imports and every @earendil-works package those declare. direct: a third-party package a carrier file imports itself (sessions.ts: proper-lockfile, at the version pi-coding-agent 1.3.0 pins). Each is an exact production dependency in package.json. Since 1.3.0 the members' own edges are exact too (upstream #10865), and the installed physical edges are still what must equal these versions.",
136
136
  "members": {
137
- "@earendil-works/chord": "1.2.0",
138
- "@earendil-works/pi-agent-core": "1.2.0",
139
- "@earendil-works/pi-ai": "1.2.0",
140
- "@earendil-works/pi-codemode": "1.2.0",
141
- "@earendil-works/pi-coding-agent": "1.2.0",
142
- "@earendil-works/pi-durable": "1.2.0",
143
- "@earendil-works/pi-mcp": "1.2.0",
144
- "@earendil-works/pi-telemetry": "1.2.0",
145
- "@earendil-works/pi-tui": "1.2.0"
137
+ "@earendil-works/chord": "1.3.0",
138
+ "@earendil-works/pi-agent-core": "1.3.0",
139
+ "@earendil-works/pi-ai": "1.3.0",
140
+ "@earendil-works/pi-codemode": "1.3.0",
141
+ "@earendil-works/pi-coding-agent": "1.3.0",
142
+ "@earendil-works/pi-durable": "1.3.0",
143
+ "@earendil-works/pi-mcp": "1.3.0",
144
+ "@earendil-works/pi-telemetry": "1.3.0",
145
+ "@earendil-works/pi-tui": "1.3.0"
146
146
  },
147
147
  "direct": {
148
148
  "proper-lockfile": "4.1.2"
@@ -318,7 +318,7 @@ export interface PiDurableRoots {
318
318
  // ---------------------------------------------------------------------------
319
319
  // Durable surface, typed NARROWLY and locally — read at pi-durable 1.0.2 @cd32f77 (#129,
320
320
  // `harness/types.ts`; historical coordinates, not re-anchored here). The current supply is the
321
- // carrier emitted from Entwurf's owned source (pi/pi-durable/src, #141) against the 1.2.0 SDK set
321
+ // carrier emitted from Entwurf's owned source (pi/pi-durable/src, #141) against the 1.3.0 SDK set
322
322
  // `pi/pi-durable/overlay/upstream-pin.json` names (origin `abe508e`). `[read 2026-10-13]` at
323
323
  // v1.2.0 one shape typed below moved: `ToolExecutionResult.content` is now `output`, beside the new
324
324
  // `structuredOutput` (`harness/types.ts`, its CHANGELOG's breaking changes). An omitted `output`
package/run.sh CHANGED
@@ -3991,7 +3991,7 @@ check_pack() {
3991
3991
  # which is exactly what property (1)'s `(_|$)` absorbs; all three shapes are fixtures
3992
3992
  # below so a future suffix change cannot pass vacuously.)
3993
3993
  pack_install_leaked_pi() {
3994
- grep '^@earendil-works+' | grep -Ev '@1\.2\.0(_|$)' || true
3994
+ grep '^@earendil-works+' | grep -Ev '@1\.3\.0(_|$)' || true
3995
3995
  }
3996
3996
 
3997
3997
  # Matcher self-test on SYNTHETIC lookalikes: a healthy install tree cannot exercise either
@@ -4011,15 +4011,15 @@ check_pack_pin_matcher() {
4011
4011
  # None may leak; the two lookalikes must — a PREFIX-EXTENDED version (`0.86.0-beta.1`,
4012
4012
  # the prerelease shape that an unanchored match would bless) and an off-pin version.
4013
4013
  matcher_probe=$(printf '%s\n' \
4014
- '@earendil-works+pi-ai@1.2.0' \
4015
- '@earendil-works+pi-ai@1.2.0_@modelcontextprotocol+sdk@1.29.0_zod@4.3.6' \
4016
- '@earendil-works+pi-ai@1.2.0_ws@8.21.3' \
4017
- '@earendil-works+pi-ai@1.2.0_@modelcontextprotocol+sdk@1.29.0_zod@4.3.6__ws@8.21.3_zod@4.3.6' \
4018
- '@earendil-works+pi-ai@1.2.0-beta.1' \
4014
+ '@earendil-works+pi-ai@1.3.0' \
4015
+ '@earendil-works+pi-ai@1.3.0_@modelcontextprotocol+sdk@1.29.0_zod@4.3.6' \
4016
+ '@earendil-works+pi-ai@1.3.0_ws@8.21.3' \
4017
+ '@earendil-works+pi-ai@1.3.0_@modelcontextprotocol+sdk@1.29.0_zod@4.3.6__ws@8.21.3_zod@4.3.6' \
4018
+ '@earendil-works+pi-ai@1.3.0-beta.1' \
4019
4019
  '@earendil-works+pi-agent-core@0.87.1' | pack_install_leaked_pi)
4020
- if [ "$matcher_probe" != '@earendil-works+pi-ai@1.2.0-beta.1
4020
+ if [ "$matcher_probe" != '@earendil-works+pi-ai@1.3.0-beta.1
4021
4021
  @earendil-works+pi-agent-core@0.87.1' ]; then
4022
- fail "[QK:PACK-INSTALL-PIN-MATCHER-BOUNDED] the pin-leak matcher must flag the prefix-extended 1.2.0-beta.1 and the off-pin 0.87.1 lookalikes, and pass 1.2.0 bare or with any measured peer-hash — got: ${matcher_probe:-<nothing leaked>}"
4022
+ fail "[QK:PACK-INSTALL-PIN-MATCHER-BOUNDED] the pin-leak matcher must flag the prefix-extended 1.3.0-beta.1 and the off-pin 0.87.1 lookalikes, and pass 1.3.0 bare or with any measured peer-hash — got: ${matcher_probe:-<nothing leaked>}"
4023
4023
  return 1
4024
4024
  fi
4025
4025
 
@@ -4027,9 +4027,9 @@ check_pack_pin_matcher() {
4027
4027
  # (0.85.0 onward, still true at 0.99.1). An off-pin chord MUST leak; the pinned one must not. A matcher narrowed
4028
4028
  # back to `^@earendil-works+pi-` sees nothing here and dies at this signature.
4029
4029
  matcher_probe=$(printf '%s\n' \
4030
- '@earendil-works+chord@1.2.0' \
4030
+ '@earendil-works+chord@1.3.0' \
4031
4031
  '@earendil-works+chord@0.87.1' \
4032
- '@earendil-works+pi-ai@1.2.0' | pack_install_leaked_pi)
4032
+ '@earendil-works+pi-ai@1.3.0' | pack_install_leaked_pi)
4033
4033
  if [ "$matcher_probe" != '@earendil-works+chord@0.87.1' ]; then
4034
4034
  fail "[QK:PACK-INSTALL-PIN-MATCHER-COVERS-CLOSURE] the pin-leak matcher must cover every @earendil-works closure member, not just the pi-* families — an off-pin @earendil-works/chord has to leak (it was a runtime dependency of pi-coding-agent, pi-agent-core, pi-client and pi-protocol — `[측정 2026-09-20]` at 0.86.0, re-measured `[측정 2026-09-22]` at 0.87.0, `[측정 2026-09-23]` at 0.87.1 and `[측정 2026-09-30]` at 0.99.1, where pi-coding-agent adds pi-codemode and pi-mcp beside them; `[측정 2026-10-13]` at 1.2.0 pi-durable alone declares it) — got: ${matcher_probe:-<nothing leaked>}"
4035
4035
  return 1
@@ -4262,7 +4262,10 @@ ORACLE
4262
4262
  # aligned host binary (the pinned version, installed above for L1) must be inside the range.
4263
4263
  # The previous host version is a variable, not a quoted `@pkg@x.y.z` spec: check-dep-versions reads
4264
4264
  # those specs as this repo's install pins, and this one is deliberately off the floor.
4265
- local host_home host_proj host_old="$box/pd-host-old" host_env=() host_old_ver="1.1.0"
4265
+ local host_home host_proj host_old="$box/pd-host-old" host_env=() host_old_ver="1.2.0"
4266
+ # The range ceiling is the next minor of the pin, derived here rather than retyped at each bump.
4267
+ local pin_minor="${pin_ver#*.}"; pin_minor="${pin_minor%%.*}"
4268
+ local pin_ceiling="${pin_ver%%.*}.$((pin_minor + 1))"
4266
4269
  mkdir -p "$host_old"
4267
4270
  for spec in "${host_specs[@]}"; do host_old_specs+=("${spec%@*}@$host_old_ver"); done
4268
4271
  out=$(cd "$host_old" && npm install "${host_old_specs[@]}" --no-audit --no-fund 2>&1) || {
@@ -4280,7 +4283,7 @@ ORACLE
4280
4283
  fail "[check-pack-install] host $cell: the native pi-durable row must stay PASS whatever the PATH host is:"; echo "$out" | tail -20 | sed 's/^/ /' >&2; return 1
4281
4284
  fi
4282
4285
  if [ "$cell" = old ]; then
4283
- if [ "$rc" -eq 0 ] || ! grep -q "pi: FAIL — detected pi $host_old_ver is outside the supported range >=$pin_ver <1.3" <<<"$out" || [ -e "$host_proj/.pi" ] || [ -e "$host_home/.pi/agent/settings.json" ]; then
4286
+ if [ "$rc" -eq 0 ] || ! grep -q "pi: FAIL — detected pi $host_old_ver is outside the supported range >=$pin_ver <$pin_ceiling" <<<"$out" || [ -e "$host_proj/.pi" ] || [ -e "$host_home/.pi/agent/settings.json" ]; then
4284
4287
  fail "[QK:PACK-INSTALL-HOST-RANGE-SEPARATE] [check-pack-install] a real pi $host_old_ver host beside the $pin_ver native set must be a named pi FAIL with zero Pi wiring and a non-green setup (rc=$rc):"
4285
4288
  echo "$out" | tail -20 | sed 's/^/ /' >&2
4286
4289
  return 1
@@ -4657,19 +4660,22 @@ _check_pack_install_impl() {
4657
4660
  # (chord dropped), pi-ai {pi-telemetry}, pi-agent-core {pi-ai}, pi-durable {chord, pi-ai,
4658
4661
  # pi-codemode}; all nine are published at 1.2.0
4659
4662
  # (.tmp-verify/141-kickoff/s1a/map-receipts/01-tarballs.txt).
4660
- echo "[check-pack-install] pnpm add into $tmp (with the aligned 1.2.x SDK + chord + codemode + mcp + durable + typebox)"
4663
+ # `[측정 2026-10-16]` at 1.3.0 the constellation is unchanged: the installed manifests give the
4664
+ # same member edges as at 1.2.0, now every one exact 1.3.0 (upstream #10865), and the consumer
4665
+ # oracle walked 10 member edges with 0 mismatches (.tmp-verify/145-stage1/08-pack-install.log).
4666
+ echo "[check-pack-install] pnpm add into $tmp (with the aligned 1.3.x SDK + chord + codemode + mcp + durable + typebox)"
4661
4667
  local install_log
4662
4668
  install_log=$(cd "$tmp" && pnpm add \
4663
4669
  "$tgz_path" \
4664
- "@earendil-works/pi-ai@1.2.0" \
4665
- "@earendil-works/pi-coding-agent@1.2.0" \
4666
- "@earendil-works/pi-tui@1.2.0" \
4667
- "@earendil-works/pi-agent-core@1.2.0" \
4668
- "@earendil-works/pi-telemetry@1.2.0" \
4669
- "@earendil-works/chord@1.2.0" \
4670
- "@earendil-works/pi-codemode@1.2.0" \
4671
- "@earendil-works/pi-mcp@1.2.0" \
4672
- "@earendil-works/pi-durable@1.2.0" \
4670
+ "@earendil-works/pi-ai@1.3.0" \
4671
+ "@earendil-works/pi-coding-agent@1.3.0" \
4672
+ "@earendil-works/pi-tui@1.3.0" \
4673
+ "@earendil-works/pi-agent-core@1.3.0" \
4674
+ "@earendil-works/pi-telemetry@1.3.0" \
4675
+ "@earendil-works/chord@1.3.0" \
4676
+ "@earendil-works/pi-codemode@1.3.0" \
4677
+ "@earendil-works/pi-mcp@1.3.0" \
4678
+ "@earendil-works/pi-durable@1.3.0" \
4673
4679
  "typebox@latest" \
4674
4680
  --ignore-workspace --ignore-scripts 2>&1) || {
4675
4681
  fail "[check-pack-install] pnpm add failed:"
@@ -4685,11 +4691,11 @@ _check_pack_install_impl() {
4685
4691
  local leaked_pi
4686
4692
  leaked_pi=$(ls "$tmp/node_modules/.pnpm" 2>/dev/null | pack_install_leaked_pi)
4687
4693
  if [ -n "$leaked_pi" ]; then
4688
- fail "[check-pack-install] UNVERIFIED pi runtime resolved into the install tree (expected only 1.2.0):"
4694
+ fail "[check-pack-install] UNVERIFIED pi runtime resolved into the install tree (expected only 1.3.0):"
4689
4695
  printf '%s\n' "$leaked_pi" | sed 's/^/ /' >&2
4690
4696
  return 1
4691
4697
  fi
4692
- echo "[check-pack-install] pi runtime tree pin verified: every @earendil-works package is 1.2.0 (chord and pi-durable included)"
4698
+ echo "[check-pack-install] pi runtime tree pin verified: every @earendil-works package is 1.3.0 (chord and pi-durable included)"
4693
4699
 
4694
4700
  # Resolve the installed package.json and confirm pi.extensions
4695
4701
  # arrived intact. If pi.extensions is empty or missing, the
@@ -181,7 +181,7 @@
181
181
  "claim": "PI-CORE-PIN-TRACKS-FLOOR",
182
182
  "title": "the queue oracle's pi-agent-core pin drifts off the floor the rest of the pi runtime is pinned to, so the oracle keeps answering honestly — about a pi nobody in this repo runs",
183
183
  "subject": "package.json",
184
- "find": ["\"@earendil-works/pi-agent-core\": \"1.2.0\","],
184
+ "find": ["\"@earendil-works/pi-agent-core\": \"1.3.0\","],
185
185
  "replace": ["\"@earendil-works/pi-agent-core\": \"0.87.1\","],
186
186
  "gate": ["bash", "run.sh", "check-dep-versions"],
187
187
  "timeoutSeconds": 300,
@@ -6,7 +6,7 @@
6
6
  "claim": "PACK-INSTALL-PIN-MATCHER-BOUNDED",
7
7
  "title": "the pin-leak matcher loses its version boundary and blesses substring lookalikes — @0.85.10 reads as the pinned 0.85.1 and the gate announces a verified tree it never verified (independent review, 2026-08-25)",
8
8
  "subject": "run.sh",
9
- "find": [" grep '^@earendil-works+' | grep -Ev '@1\\.2\\.0(_|$)' || true"],
9
+ "find": [" grep '^@earendil-works+' | grep -Ev '@1\\.3\\.0(_|$)' || true"],
10
10
  "replace": [" grep '^@earendil-works+' | grep -v '@0\\.87\\.1' || true"],
11
11
  "gate": ["bash", "run.sh", "check-pack-pin-matcher"],
12
12
  "timeoutSeconds": 120,
@@ -17,8 +17,8 @@
17
17
  "claim": "PACK-INSTALL-PIN-MATCHER-COVERS-CLOSURE",
18
18
  "title": "the pin-leak matcher narrows back to the pi-* families and goes blind to a non-pi member of the same runtime closure — @earendil-works/chord (new in pi 0.85.0, a runtime dependency of pi-coding-agent/pi-agent-core/pi-client/pi-protocol) floats unpinned while the gate prints a verified pin (measured 2026-09-06 on a real 0.85.1 install tree)",
19
19
  "subject": "run.sh",
20
- "find": [" grep '^@earendil-works+' | grep -Ev '@1\\.2\\.0(_|$)' || true"],
21
- "replace": [" grep '^@earendil-works+pi-' | grep -Ev '@1\\.2\\.0(_|$)' || true"],
20
+ "find": [" grep '^@earendil-works+' | grep -Ev '@1\\.3\\.0(_|$)' || true"],
21
+ "replace": [" grep '^@earendil-works+pi-' | grep -Ev '@1\\.3\\.0(_|$)' || true"],
22
22
  "gate": ["bash", "run.sh", "check-pack-pin-matcher"],
23
23
  "timeoutSeconds": 120,
24
24
  "signature": "[QK:PACK-INSTALL-PIN-MATCHER-COVERS-CLOSURE]",
@@ -1177,14 +1177,14 @@
1177
1177
  "build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
1178
1178
  },
1179
1179
  {
1180
- "claim": "PI-DURABLE-COMPACTION-WAITS",
1181
- "title": "the Harness settings hand the SDK pi's compaction settings alone: its default background policy summarizes beside a running turn instead of the turn waiting",
1180
+ "claim": "PI-DURABLE-COMPACTION-SDK-BACKGROUND",
1181
+ "title": "the Harness settings force background compaction off again: past the SDK's background threshold the turn asks for no summary beside it",
1182
1182
  "subject": "pi/pi-durable/carrier/harness-setup.js",
1183
- "find": ["\t\t\treturn { ...settingsManager.getCompactionSettings(), backgroundTokens: 0 };"],
1184
- "replace": ["\t\t\treturn settingsManager.getCompactionSettings();"],
1183
+ "find": ["\t\t\treturn settingsManager.getCompactionSettings();"],
1184
+ "replace": ["\t\t\treturn { ...settingsManager.getCompactionSettings(), backgroundTokens: 0 };"],
1185
1185
  "gate": ["bash", "run.sh", "check-pi-durable-carrier"],
1186
1186
  "timeoutSeconds": 300,
1187
- "signature": "[QK:PI-DURABLE-COMPACTION-WAITS]",
1187
+ "signature": "[QK:PI-DURABLE-COMPACTION-SDK-BACKGROUND]",
1188
1188
  "signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
1189
1189
  "build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
1190
1190
  },
@@ -7,10 +7,10 @@
7
7
  "title": "one row of the pnpm workspace closure is left on the previous floor while every other surface moved — the shape a version bump actually fails in. Nothing else reads that file, so the stranded row surfaces only at install time, in a different command, far from the change that stranded it",
8
8
  "subject": "pnpm-workspace.yaml",
9
9
  "find": [
10
- " - '@earendil-works/pi-telemetry@0.85.0 || 0.85.1 || 0.86.0 || 0.87.0 || 0.87.1 || 0.99.1 || 0.99.2 || 1.0.0 || 1.0.2 || 1.0.4 || 1.1.0 || 1.2.0'"
10
+ " - '@earendil-works/pi-telemetry@0.85.0 || 0.85.1 || 0.86.0 || 0.87.0 || 0.87.1 || 0.99.1 || 0.99.2 || 1.0.0 || 1.0.2 || 1.0.4 || 1.1.0 || 1.2.0 || 1.3.0'"
11
11
  ],
12
12
  "replace": [
13
- " - '@earendil-works/pi-telemetry@0.85.0 || 0.85.1 || 0.86.0 || 0.87.0 || 0.87.1 || 0.99.1 || 0.99.2 || 1.0.0 || 1.0.2 || 1.0.4 || 1.1.0'"
13
+ " - '@earendil-works/pi-telemetry@0.85.0 || 0.85.1 || 0.86.0 || 0.87.0 || 0.87.1 || 0.99.1 || 0.99.2 || 1.0.0 || 1.0.2 || 1.0.4 || 1.1.0 || 1.2.0'"
14
14
  ],
15
15
  "gate": ["bash", "run.sh", "check-dep-versions"],
16
16
  "timeoutSeconds": 300,
@@ -21,8 +21,8 @@
21
21
  "claim": "PI-SDK-PRODUCTION-SET",
22
22
  "title": "the durable library's production pin falls one release behind the SDK set the pin declares, so the carrier would bind a pi-durable nobody verified it against",
23
23
  "subject": "package.json",
24
- "find": ["\"@earendil-works/pi-durable\": \"1.2.0\","],
25
- "replace": ["\"@earendil-works/pi-durable\": \"1.1.0\","],
24
+ "find": ["\"@earendil-works/pi-durable\": \"1.3.0\","],
25
+ "replace": ["\"@earendil-works/pi-durable\": \"1.2.0\","],
26
26
  "gate": ["bash", "run.sh", "check-dep-versions"],
27
27
  "timeoutSeconds": 300,
28
28
  "signature": "[QK:PI-SDK-PRODUCTION-SET]",
@@ -33,7 +33,7 @@
33
33
  "title": "an @earendil-works package returns as a dev dependency beside its production pin, one name in two dependency classes",
34
34
  "subject": "package.json",
35
35
  "find": ["\"@biomejs/biome\": \"^2.4.13\","],
36
- "replace": ["\"@biomejs/biome\": \"^2.4.13\",\n\t\t\"@earendil-works/pi-ai\": \"1.2.0\","],
36
+ "replace": ["\"@biomejs/biome\": \"^2.4.13\",\n\t\t\"@earendil-works/pi-ai\": \"1.3.0\","],
37
37
  "gate": ["bash", "run.sh", "check-dep-versions"],
38
38
  "timeoutSeconds": 300,
39
39
  "signature": "[QK:PI-SDK-NO-DUAL-DECLARATION]",