@junghanacs/entwurf 0.37.1 → 0.38.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/CHANGELOG.md CHANGED
@@ -4,6 +4,89 @@ All notable changes to this project will be documented here. Format follows [Kee
4
4
 
5
5
  ## Unreleased
6
6
 
7
+ ## 0.38.0 - 2026-10-16
8
+
9
+ ### Pi SDK 1.3.0
10
+
11
+ - **Accept the coherent nine-member Pi SDK 1.3.0 set (#145).** Upgrade exact pins,
12
+ lockfile, release-age allowlist, upstream constellation metadata and matching fixtures.
13
+ The supported PATH Pi range is now `>=1.3.0 <1.4`. Owned durable app source and emitted
14
+ carrier bytes are unchanged; execution, storage, compaction and provider/auth engines
15
+ remain upstream-owned. Stage2 shell changes and #142 thinking/default/ACP effort are not
16
+ included.
17
+ - **Known upstream behavior, not an app-level LIVE claim.** SDK 1.3.0 sends Haiku 5.5 /
18
+ Opus 5 thinking `off` as disabled; Opus 5.5 still does not support `off`. The app's
19
+ current level-less default reaches the SDK as `off`, so Haiku 5.5 / Opus 5 thinking is
20
+ EXPECTED to be disabled under 1.3.0. That is an inference inherited from the #142 source
21
+ reading, not measured in a vendor LIVE turn; the default selection is unchanged here and
22
+ remains #142's subject. Upstream also changes malformed tool-argument validation and
23
+ compaction baseline placement; no cross-version prompt-loss or universal compatibility
24
+ claim is made here.
25
+
26
+ ### Release boundary and verification
27
+
28
+ - **Implementation checkpoint.** `d25b71e6f320462e67827d71265811de7cd89db1`, reviewed
29
+ 19-file SDK bundle. Its branch push CI run 38843056373 passed all four required jobs
30
+ (620 s wall, static FULL 571 s). This is checkpoint evidence, not the prepared 0.38.0
31
+ SHA's CI.
32
+ - **Kill-power re-measured at this shipped SHA: none (all 979 committed claims not
33
+ re-proved, #144).**
34
+ - Earlier-candidate PARTIAL (operator-attested, not this SHA): head 2fa0d8210e98 surface
35
+ 79f961d6d2fa -- `check-dep-versions` 4/4 receipt 5e787c54c298
36
+ - Earlier-candidate PARTIAL (operator-attested, not this SHA): head 2fa0d8210e98 surface
37
+ 79f961d6d2fa -- `check-pack-pin-matcher` 2/2 receipt dc1abd661323
38
+ - Both PARTIAL candidates are head 2fa0d82 plus the then-uncommitted SDK diff (patch
39
+ 6f01d8dc), measured before d25b71e existed; they are not the shipped 0.37.1 bytes and
40
+ not this SHA.
41
+ - **Bounded forward-open proof.** One synthetic 1.2 SDK-written conversation was selected
42
+ by exact id, resumed by the 1.3 checkout reader under the same carrier, given one faux
43
+ turn, and reopened with history and identity preserved. Negative 2/2, writer 17/17,
44
+ reader 16/16; vendor wire counters 0 and final seals stable; independent review B0/D0. This is not a
45
+ universal migration/rollback/compaction or cross-version MCP schema certificate. The
46
+ first fixture attempt was RED and remains preserved. Source and limitations are in
47
+ [#145](https://github.com/junghan0611/entwurf/issues/145#issuecomment-6208532928); no operational DB was opened for this test.
48
+ - **Host alignment and continuity.** GLG authorized exact global Pi 1.3.0 installation and
49
+ manually restarted harnesses. Actual host and checkout SDK versions were 1.3.0. The same
50
+ coordinator garden id/cwd resumed, then exchanged real v2 replies with two existing
51
+ Claude citizens. After GLG reported SDK compaction complete, self identity and bookmark
52
+ continuity were observed; SDK internals/vendor prompt ordering were not inspected.
53
+ - **Static/LIVE split, newly approved for this cut.** GLG explicitly approved local LIVE
54
+ and whole static FULL in the prepared SHA's exact push CI. Local P4/P5-static/M0 FULL
55
+ are deferred, not passed: the FULL includes Herdr checks prohibited on this operator
56
+ host. The mutation whole BODY remains a weekly/manual diagnostic, never a release axis.
57
+ - **Local LIVE r1: MUST (non-static 23) PASS=23 FAIL=0 SKIP=0 UNRUN=0; BEHAVIOR PASS=1
58
+ FAIL=0.** The unchanged release aggregate's non-static MUST steps and its advisory
59
+ BEHAVIOR step ran once, 2026-10-16 14:00:43–14:05:43 KST, through a one-off stepwise
60
+ driver whose 24 step lines equal `release_gate`'s at d25b71e (source order, argv, env,
61
+ cwd and classifiers), stopping on the first MUST red. Candidate: d25b71e plus the four
62
+ release-metadata files, fingerprint `12fca42c` equal at freeze, before and after.
63
+ `smoke-codex-fresh-live` ran against an owned app-server in its own session A, separate
64
+ from the gate session S, with `gpt-5.6-luna` / `openai-codex/gpt-5.6-luna`;
65
+ `smoke-pi-durable-fresh-live` ran on the host's Pi 1.3.0 and is not repeated as a
66
+ separate smoke. Receipts: `.tmp-verify/release-0.38.0/live-r1/` (`live.log` b676817c,
67
+ `steps.SHA256SUMS` c7868c81). This is not a local `release-gate --cut` PASS: the
68
+ static step did not run locally.
69
+ - **Post-LIVE delta: evidence records and prose docs only.** After the LIVE run,
70
+ `CHANGELOG.md` and `NEXT.md` took the evidence records, and a separate docs-only commit
71
+ corrected stale prose in `DELIVERY.md`, `ROADMAP.md`, `VERIFY.md`,
72
+ `docs/acp-backend-rail.md` and `docs/external-mcp-host.md`. `package.json`,
73
+ `plugins/herdr/runtime-lock.json`, the lockfile, `run.sh` and all source/carrier bytes
74
+ equal the LIVE candidate; GLG waived a LIVE re-run for prose-only changes, and the
75
+ prepared SHA's push CI runs the whole static floor over the final bytes.
76
+ - **Native Claude host doctor:** the operator's `entwurf` bin in clone mode (resolving to
77
+ this checkout) ran `doctor-meta-bridge` and exited 0 (`meta-bridge doctor: PASS`) after
78
+ the host transition, with two live record-backed Claude MCP owners and a writer at v3
79
+ parity. This is not a doctor proof of the 0.38.0 tarball or an installed consumer.
80
+ Receipt: `.tmp-verify/release-0.38.0/doctor-meta-bridge.txt`.
81
+ - **Prepared exact-SHA CI is owed by this SHA's push run.** All four required jobs
82
+ (`check`, `install-surface`, `artifact-consumer`, `macos-install-surface`) and the
83
+ preserved post-CI tarball consumer acceptance remain owed; no tag or publication yet.
84
+ - **Herdr follows core.** The closed `herdr-checkout` verification carrier stays unchanged
85
+ apart from its dated comment. No plugin manifest version, registry pin or production
86
+ acquisition authority changes here. Re-pin and real Herdr installation/update/use proof
87
+ follow the published core 0.38.0 bytes as a separate plugin snapshot; this core LIVE is
88
+ not that proof.
89
+
7
90
  ## 0.37.1 - 2026-10-16
8
91
 
9
92
  ### 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
@@ -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.0",
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",
@@ -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]",
@@ -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]",