@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 +83 -0
- package/DELIVERY.md +1 -1
- package/README.md +2 -2
- package/VERIFY.md +2 -2
- package/demo/README.md +1 -1
- package/docs/acp-backend-rail.md +13 -8
- package/docs/external-mcp-host.md +1 -1
- package/docs/setup-clean-host.md +8 -8
- package/package.json +10 -10
- package/pi/pi-durable/overlay/upstream-pin.json +10 -10
- package/pi-extensions/meta-bridge-pi-durable.ts +1 -1
- package/run.sh +30 -24
- package/scripts/mutants/control-send-receipt.json +1 -1
- package/scripts/mutants/pack-install.json +3 -3
- package/scripts/mutants/pi-floor.json +5 -5
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
|
|
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.
|
|
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.
|
|
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
|
|
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.
|
|
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.
|
|
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
|
package/docs/acp-backend-rail.md
CHANGED
|
@@ -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
|
|
129
|
-
|
|
130
|
-
`
|
|
131
|
-
(`[측정 2026-10-
|
|
132
|
-
|
|
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.
|
|
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 |
|
|
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_
|
|
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
|
package/docs/setup-clean-host.md
CHANGED
|
@@ -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.
|
|
32
|
-
| Native durable (`pi-durable`) | supplied by the Entwurf package (#130): Entwurf's owned app carrier plus the exact 1.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
103
|
-
"@earendil-works/pi-agent-core": "1.
|
|
104
|
-
"@earendil-works/pi-ai": "1.
|
|
105
|
-
"@earendil-works/pi-codemode": "1.
|
|
106
|
-
"@earendil-works/pi-coding-agent": "1.
|
|
107
|
-
"@earendil-works/pi-durable": "1.
|
|
108
|
-
"@earendil-works/pi-mcp": "1.
|
|
109
|
-
"@earendil-works/pi-telemetry": "1.
|
|
110
|
-
"@earendil-works/pi-tui": "1.
|
|
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.
|
|
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.
|
|
138
|
-
"@earendil-works/pi-agent-core": "1.
|
|
139
|
-
"@earendil-works/pi-ai": "1.
|
|
140
|
-
"@earendil-works/pi-codemode": "1.
|
|
141
|
-
"@earendil-works/pi-coding-agent": "1.
|
|
142
|
-
"@earendil-works/pi-durable": "1.
|
|
143
|
-
"@earendil-works/pi-mcp": "1.
|
|
144
|
-
"@earendil-works/pi-telemetry": "1.
|
|
145
|
-
"@earendil-works/pi-tui": "1.
|
|
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.
|
|
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\.
|
|
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.
|
|
4015
|
-
'@earendil-works+pi-ai@1.
|
|
4016
|
-
'@earendil-works+pi-ai@1.
|
|
4017
|
-
'@earendil-works+pi-ai@1.
|
|
4018
|
-
'@earendil-works+pi-ai@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.
|
|
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.
|
|
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.
|
|
4030
|
+
'@earendil-works+chord@1.3.0' \
|
|
4031
4031
|
'@earendil-works+chord@0.87.1' \
|
|
4032
|
-
'@earendil-works+pi-ai@1.
|
|
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.
|
|
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
|
|
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
|
-
|
|
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.
|
|
4665
|
-
"@earendil-works/pi-coding-agent@1.
|
|
4666
|
-
"@earendil-works/pi-tui@1.
|
|
4667
|
-
"@earendil-works/pi-agent-core@1.
|
|
4668
|
-
"@earendil-works/pi-telemetry@1.
|
|
4669
|
-
"@earendil-works/chord@1.
|
|
4670
|
-
"@earendil-works/pi-codemode@1.
|
|
4671
|
-
"@earendil-works/pi-mcp@1.
|
|
4672
|
-
"@earendil-works/pi-durable@1.
|
|
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.
|
|
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.
|
|
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.
|
|
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\\.
|
|
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\\.
|
|
21
|
-
"replace": [" grep '^@earendil-works+pi-' | grep -Ev '@1\\.
|
|
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.
|
|
25
|
-
"replace": ["\"@earendil-works/pi-durable\": \"1.
|
|
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.
|
|
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]",
|