@junghanacs/entwurf 0.15.1 → 0.16.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 +229 -0
- package/DELIVERY.md +3 -2
- package/README.md +70 -87
- package/VERIFY.md +4 -1
- package/docs/acp-backend-rail.md +1 -1
- package/docs/external-mcp-host.md +147 -9
- package/docs/setup-clean-host.md +105 -0
- package/mcp/entwurf-bridge/dist/mcp/entwurf-bridge/src/index.js +65 -20
- package/mcp/entwurf-bridge/dist/pi-extensions/entwurf-capabilities.json +1 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-self-address.js +17 -6
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/meta-sender-identity.js +1 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/meta-session.js +172 -5
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-fresh-call.js +152 -17
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/omp-fresh-preflight.js +271 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/meta-bridge-omp.js +988 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/meta-bridge-receive-omp.js +574 -0
- package/mcp/entwurf-bridge/dist/scripts/omp-receive-facts.js +84 -0
- package/mcp/entwurf-bridge/src/index.ts +65 -19
- package/mcp/entwurf-bridge/tsconfig.build.json +19 -3
- package/mcp/tsconfig.json +10 -0
- package/package.json +13 -3
- package/pi/entwurf-capabilities.json +1 -0
- package/pi/meta-bridge-omp/entwurf-meta-omp/package.json +7 -0
- package/pi/omp-receive/entwurf-receive-omp/package.json +7 -0
- package/pi-extensions/entwurf-control.ts +12 -9
- package/pi-extensions/lib/entwurf-self-address.ts +18 -7
- package/pi-extensions/lib/meta-sender-identity.ts +1 -1
- package/pi-extensions/lib/meta-session.ts +219 -5
- package/pi-extensions/lib/mux-fresh-call.ts +171 -17
- package/pi-extensions/lib/omp-fresh-preflight.ts +275 -0
- package/pi-extensions/meta-bridge-omp.ts +1244 -0
- package/pi-extensions/meta-bridge-receive-omp.ts +666 -0
- package/run.sh +296 -4
- package/scripts/check-entwurf-self-address.ts +31 -0
- package/scripts/check-gate-qualification.ts +4 -1
- package/scripts/check-harness-admission-parity.ts +143 -0
- package/scripts/check-meta-doctor-oracle.sh +20 -0
- package/scripts/check-omp-birth-hook.ts +1049 -0
- package/scripts/check-omp-fresh-preflight.ts +181 -0
- package/scripts/check-omp-receive-arm.ts +516 -0
- package/scripts/inventory-verification-surface.ts +1 -1
- package/scripts/meta-bridge-hook-log.sh +9 -1
- package/scripts/mutants/copilot-birth.json +7 -5
- package/scripts/mutants/mux-fresh-call.json +22 -22
- package/scripts/mutants/omp-birth.json +173 -0
- package/scripts/mutants/omp-fresh.json +300 -0
- package/scripts/mutants/omp-receive.json +135 -0
- package/scripts/mutants/self-address.json +34 -0
- package/scripts/omp-bridge-doctor.sh +315 -0
- package/scripts/omp-bridge-install.sh +221 -0
- package/scripts/omp-bridge-oracle.sh +154 -0
- package/scripts/omp-bridge-uninstall.sh +57 -0
- package/scripts/omp-mcp-bridge.sh +320 -0
- package/scripts/omp-mcp-config.py +392 -0
- package/scripts/omp-receive-doctor.sh +246 -0
- package/scripts/omp-receive-facts.ts +106 -0
- package/scripts/omp-receive-install.sh +228 -0
- package/scripts/omp-receive-uninstall.sh +60 -0
- package/scripts/omp-tool-surface.py +349 -0
- package/scripts/raw-omp-measure/README.md +420 -0
- package/scripts/raw-omp-measure/probe-extension.ts +76 -0
- package/scripts/raw-omp-measure/probe-receive-surface.ts +250 -0
- package/scripts/raw-omp-measure/source-audit.md +414 -0
- package/scripts/smoke-omp-bridge-state.sh +221 -0
- package/scripts/smoke-omp-fresh-live.ts +497 -0
- package/scripts/smoke-omp-mcp-state.sh +327 -0
- package/scripts/smoke-omp-receive-live.ts +340 -0
- package/scripts/smoke-omp-receive-state.sh +196 -0
- package/scripts/tsconfig.json +2 -0
package/run.sh
CHANGED
|
@@ -131,10 +131,13 @@ Usage:
|
|
|
131
131
|
./run.sh check-meta-v3-record # deterministic gate: the ONE live record schema (v3) — canonical serialize/round-trip/mint, foreign-generation rejections name fresh-cut with the actual version value, strict keyset, no API
|
|
132
132
|
./run.sh check-mailbox-receipt-state # deterministic gate (0.11 Stage 0 step 3B): mailbox receipt state schema + store (stamp→persist→read-back) in a temp mailbox, strict keyset, no API
|
|
133
133
|
./run.sh check-copilot-birth-hook # #82 gate: drives the real Copilot assembler into a temp dir, fires the baked launcher with NO ARGV (the way Copilot's `exec`-string schema forces), and requires a backend:"copilot" v3 record + attach + peer row + a SENDER marker the resolver joins back to that record, and still zero mailbox/receiver marker (who-sent needs a shared parent; a receiver needs a doorbell this backend has not got). Hermetic; no Copilot, no model turn
|
|
134
|
+
./run.sh check-omp-birth-hook # #87 gate: drives the real OMP assembler into a temp dir, imports the ASSEMBLED index.ts into a MOCK omp host and fires session_start/session_switch. tui mints one backend:"omp" record + a sender marker keyed to the host's OWN pid (the one-process join) + the garden id on the status line; print/rpc/json mint NOTHING (hasUI is true on the rpc rows, as in the vendor); switch attaches on the same native id and mints the replacement on a new one; the CERTIFIED receiver reader still finds no marker. Also the four-root joint binding: extension and omp-labeled bridge child resolve the same sessions/mailbox/senders/receivers bundle against test-built literals (never the production resolver as its own oracle), under a poisoned PI_CODING_AGENT_DIR and under four distinct ENTWURF_META_* overrides; the override grammar is absolute-or-~ and both halves plus the doctor refuse anything else by name; and a drifted provenance label selects no root policy at all. Hermetic; no omp, no model turn
|
|
134
135
|
./run.sh check-copilot-receive-arm # #82 RAIL 5 gate: the REAL receiver installer + the REAL extension.mjs forked with a stubbed SDK. Arms only after birth, marker owned by the WATCHER pid, self-fetch dispatch answer, doorbell carries the garden id and NOT the body, id-drift/foreign-parent refusals. Hermetic; no Copilot, no model turn
|
|
135
136
|
./run.sh check-copilot-launch # #82 RAIL 7 gate: the MANAGED launch `entwurf copilot`, driven through its public address against a FAKE VENDOR on a sandbox PATH. Receiver precondition refusals, EXTENSIONS token + operator token preservation, injected defaults before the `--` terminator, byte-identical argv, the 11 explicit permission/surface policy overrides that suppress `--yolo`, exec (not fork) pid identity, exit passthrough, recursion refusal. Hermetic; no Copilot, no model turn
|
|
136
137
|
./run.sh check-copilot-statusline # #82 Copilot custom-footer renderer. session_id → ready/?/gid + rail `cop`; exit 0. IN pnpm check. No Copilot, no model turn
|
|
137
138
|
./run.sh check-entwurf-capabilities # deterministic gate (0.11 Stage 0 step 3C): backend capability registry (pi/entwurf-capabilities.json) — coverage==META_CITIZEN_BACKENDS + agrees with live META_BACKEND_DESCRIPTORS + strict keyset, no API
|
|
139
|
+
./run.sh check-omp-fresh-preflight # #87 C: the OMP fresh preflight reproduces omp_agent_dir and the tools.xdev read in TS (it runs from two emit depths and cannot call a sibling script). This drives the SHIPPED shell/python leaves over the same inputs — refusals included — and requires the TS half to agree, so the reproduction cannot silently drift from the installer's own oracle
|
|
140
|
+
./run.sh check-harness-admission-parity # #87 C: the EDGE the two closed parity loops never had. Every citizen backend is fresh-openable or a declared pre-#82 legacy admission whose exception a reader finds in DELIVERY.md — so a post-contract harness that mints records but cannot be opened by entwurf_fresh_call blocks the release package instead of only carrying an `unsupported` note (docs/adding-a-harness.md step 9)
|
|
138
141
|
./run.sh check-capability-bundle-reach # deterministic gate (IN pnpm check): re-ask EVERY shipped copy of meta-session (source + bridge bundle emit) whether metaCapabilitiesFilePath() reaches the registry — the artifact-depth check the source-path gates cannot make; needs a built dist, missing dist FAILS
|
|
139
142
|
./run.sh smoke-pi-attach # deterministic gate (#50 C2 checkpoint + C3 ACP tail): a pi session attaches as a V3 meta-record citizen (backend:"pi"), the gardenId is the RECORD's not pi's session id, the control socket is keyed on it, a re-open ATTACHES to the same address (never a second mint), the BUILT DIST ENTRY driven over MCP stdio lists the citizen + delivers entwurf_v2 to that socket with an RPC ack, and the ACP identity chain lands a send AS the host record (enrichMcpServersWithEnvelope env → bridge sender = host gardenId). mkdtemp-isolated; the live store is never read
|
|
140
143
|
./run.sh check-bridge-delivery # deterministic gate (IN pnpm run check:full): demo scene 3 recovered — seed strict meta-sender + armed receiver citizens in an isolated temp world, scrub ambient pi/sender carriers, drive the BUILT DIST ENTRY over MCP stdio through a real tools/call entwurf_v2, assert the .msg landed under the seeded sender + doorbell poked. DELIVERS through the artifact, not from source. ENTWURF_DELIVERY_SUBJECT=<launcher> replays the same scene against another consumer artifact (check-pack-install passes the npm-installed bin). No model/network/cost; stale or missing dist FAILS
|
|
@@ -184,6 +187,8 @@ Usage:
|
|
|
184
187
|
./run.sh smoke-agy-install-state # agy MCP + exact permission ownership regression: isolated HOME+XDG, adopt/state/inverse, symlink refuse, truthful setup outcomes. Offline/deterministic
|
|
185
188
|
./run.sh smoke-setup-verdict # #86 C1+C3b aggregate setup verdict fixture: all-absent SKIP/green, pi presence+floor, detected-FAIL nonzero, copilot four-unit composition (present=independent PASS/FAIL rows, absent=zero-state SKIP), installed-mode named branch, credential store untouched. Offline/deterministic
|
|
186
189
|
./run.sh check-agy-permission-matrix # AGY permission CONTRACT SPACE as a literal table (55 cells): parser-state × operation × settings × ownership × precedence with stated exclusion rules; expectations are hand-written literals, never read from the SUT. Offline/deterministic (deps: python3)
|
|
190
|
+
./run.sh smoke-omp-fresh-live # #87 bundle C acceptance, RELEASE MUST: omp opened as ONE visible fresh sibling through the PUBLIC entwurf_fresh_call surface (never raw tmux), exact nonce callback -> garden id from the SENDER ENVELOPE -> record/backend identity -> addressed receive -> lastReadAt -> the drain visible in that same native session's own transcript. Needs LIVE=1 and spends real model turns. Self-deciding: omp outside FRESH_CALL_BACKENDS or without a mailbox rail is a protocol SKIP, which --cut reads as RED
|
|
191
|
+
./run.sh smoke-omp-receive-live # #87 bundle B acceptance: another harness wakes an ALREADY-OPEN omp citizen, which reads its inbox and answers in the same session. Decides its own outcome from the capability registry — omp without a drainable mailbox is a protocol SKIP (no receiver unit exists to arm), which an unattended release-gate reports and `--cut` reads as RED; a registry that claims a receive rail with no acceptance body here is a FAIL
|
|
187
192
|
./run.sh smoke-entwurf-chain-live # LIVE cross-harness delivery chain: native Claude Code -> pi GPT -> pi ACP Sonnet -> mailbox terminus, proving sender identity/replyable at every hop and a real read receipt at the end. Prerequisites (claude on PATH, pi credentials per backend) report protocol SKIP, never a pass
|
|
188
193
|
./run.sh check-release-gate-outcomes # release-gate STEP OUTCOME protocol (P1): one skip exit code shared by the shell + TS halves, classifier never rounds a skip up to a pass, `--cut` refuses a MUST SKIP while a bare diagnostic stays exit 0, no LIVE smoke keeps the old exit-0 skip shape, and both real skip surfaces are INVOKED and observed to propagate the code
|
|
189
194
|
./run.sh check-gate-qualification # kill-proof qualification (the gate-of-gates): runner self-test (classifier truth table + synthetic negatives incl. wrong-reason/hang/control-red/impurity) + committed mutant manifests (scripts/mutants/*.json) run in an isolated snapshot repo under control→mutant→restore→control; the real checkout is never written. Evidence = claim IDs + killed mutant IDs, never assertion counts
|
|
@@ -192,6 +197,7 @@ Usage:
|
|
|
192
197
|
./run.sh smoke-agy-statusline-state # agy ambient garden-id statusLine install/doctor/inverse regression. Offline/deterministic
|
|
193
198
|
./run.sh smoke-copilot-statusline-state # Copilot custom-footer install/doctor/inverse regression. Offline/deterministic
|
|
194
199
|
./run.sh smoke-copilot-mcp-state # Copilot MCP install/doctor/inverse regression. Offline/deterministic
|
|
200
|
+
./run.sh smoke-omp-bridge-state # OMP birth-extension install/doctor/inverse regression: placement, stale-writer detection, honest inverse, no-state refusal (structurally VALID as well as foreign), symlink refusal, ambiguous-agent-dir refusal (ledger M6), and a poisoned PI_CODING_AGENT_DIR that attracts no artifact. Fully sandboxed HOME/PI/XDG. Offline/deterministic
|
|
195
201
|
./run.sh smoke-agy-hooks-state # agy PreInvocation birth/sender hook install/doctor/inverse + direct stdin→meta-record regression. Offline/deterministic
|
|
196
202
|
./run.sh smoke-user-scope-citizen # 0.12.6 install-boundary: pi packages[] registration SSOT (register-pi-package.py) — idempotent + preserves unrelated + remove symmetry + fails loud, and the #86 C2 explicit ownership cells (project scope still normalizes ITS OWN stale entries; user scope refuses other owners and only takeover-user-scope moves the shared entry). Offline/hermetic (deps: bash+python3)
|
|
197
203
|
./run.sh smoke-meta-prune # 1.0.0 meta-bridge Phase 4: listing-only store janitor regression gate — classify keep/orphan/stale/ambiguous, delete nothing. Offline/deterministic (deps: bash+node)
|
|
@@ -212,6 +218,17 @@ Usage:
|
|
|
212
218
|
./run.sh install-copilot-mcp # #82 RAIL 5: register ONE entwurf-bridge server in ~/.copilot/mcp-config.json (adopt / create / REFUSE symlink), type:local, install-state under $XDG_DATA_HOME/entwurf/copilot-mcp/
|
|
213
219
|
./run.sh uninstall-copilot-mcp # honest inverse of install-copilot-mcp from install-state
|
|
214
220
|
./run.sh doctor-copilot-mcp # static ownership/config/boot doctor; RED only when install-state exists
|
|
221
|
+
./run.sh install-omp-bridge # #87: install the OMP BIRTH extension into <omp agent dir>/extensions/entwurf-meta-omp (index.ts|js + lib + capability registry). No launcher and no bake — an omp hook is an in-process extension. Refuses when an inherited PI_CODING_AGENT_DIR/PI_CONFIG_DIR/PI_PROFILE makes the target agent dir ambiguous (ledger M6), and refuses ANY pre-existing artifact at the unit path that entwurf holds no ownership state for — a shape is not a proof of ownership
|
|
222
|
+
./run.sh uninstall-omp-bridge # honest inverse from install-state (exact unit dir + recorded entry; no-state host REFUSES; state deleted LAST). Records already minted are preserved
|
|
223
|
+
./run.sh doctor-omp-bridge # #87: runtime axis (importable unit, writer/registry parity, mint vs sender-marker errors on SEPARATE axes, scope-fence receipts, a root-grammar preflight that goes RED on a relative ENTWURF_META_* override instead of reporting on some other directory, CERTIFIED omp record count via meta-facts under the omp root policy — never a text grep, live omp processes carrying inherited PI_SESSION_ID/PI_AGENT_ID) + ownership axis. PI_CODING_AGENT_DIR is the vendor's own agent dir here and is reported as ignored, never as contamination. Zero records = NOT-YET, never red
|
|
224
|
+
./run.sh install-omp-receive # #87 bundle B: install the OMP RECEIVER extension into <omp agent dir>/extensions/entwurf-receive-omp. Own unit, own install-state, own doctor, own inverse. It joins the citizen BIRTH minted in the same process (sender marker for this pid + V3 record + the vendor's current session id, all three or refuse), holds an fs.watch on that citizen's mailbox signal, and rings an ANNOUNCE-ONLY doorbell via pi.sendUserMessage. It never assumes it loads after birth: extension handlers run in directory-name order and a before-sorting unit was MEASURED to see no marker, so the arm retries on a bounded ctx.setInterval cancelled with ctx.clearTimer (the vendor exposes no clearInterval)
|
|
225
|
+
./run.sh uninstall-omp-receive # honest inverse from install-state; records and sender identity untouched. A session that ALREADY armed keeps its marker until its process exits
|
|
226
|
+
./run.sh doctor-omp-receive # runtime axis (importable unit, writer parity, arm failures and doorbell failures on SEPARATE axes, who is armed RIGHT NOW through the production marker reader) + ownership axis. Zero armed receivers = NOT-YET, never red. Reports a marker for exactly what a marker proves — a live owner reached the arm emit — and never upgrades that into "a wake will happen"
|
|
227
|
+
./run.sh omp-receive-facts # read-only JSON projection of the omp receive rail: every receiver marker through readMetaReceiverMarker in BOTH readings (live / as-written) plus mailbox counts. The shared oracle so no consumer answers "is a doorbell held?" from a filename
|
|
228
|
+
./run.sh install-omp-mcp # #87 step 5: write ONE omp-native entwurf-bridge server into <omp agent dir>/mcp.json with env ENTWURF_BRIDGE_EXTERNAL_AGENT_ID=external-mcp/omp. The server key is a PINNED LITERAL, byte-identical to the Claude import's — same-key first-wins at native=100 > claude=80 is what SHADOWS the import (never disabledServers, which kills both). Adopt / create / REFUSE symlink, preimage recorded
|
|
229
|
+
./run.sh uninstall-omp-mcp # honest inverse from install-state (restores the preimage, or removes a file we created); the Claude import becomes effective again
|
|
230
|
+
./run.sh doctor-omp-mcp # ownership + config + boot doctor, plus the EFFECTIVE-source read (native-wins / native-invalid / import-wins / both-suppressed) — a configuration read, never a runtime receipt. Runtime validity and ownership are SEPARATE axes: foreign provenance, a disabledServers denylist, and a malformed entry under our key are each RED even with no install-state. tools.xdev is a RUNTIME cell: absent file/key applies the vendor default (true, no inline allowlist) and is RED while the native hand is the effective source; xdev false is ok; a covering xdevInlineDevices glob is ok-with-note
|
|
231
|
+
./run.sh smoke-omp-mcp-state # OMP MCP install/doctor/inverse regression incl. shadowing, the denylist refusal, target confinement + retarget refusal, and a malformed entry going RED with zero install-state. Fully sandboxed HOME/PI/XDG. Offline/deterministic
|
|
215
232
|
./run.sh install-copilot-receive # #82 RAIL 5: install the RECEIVER extension (user scope ~/.copilot/extensions/entwurf-receive). Owns the artifact and CHECKS the launch flag; it never sets one (a launch does — see `./run.sh copilot`). Arms per session after birth
|
|
216
233
|
./run.sh uninstall-copilot-receive # honest inverse from install-state; never removes a unit it did not install
|
|
217
234
|
./run.sh doctor-copilot-receive # artifact + digest, COPILOT_CLI_ENABLED_FEATURE_FLAGS on the LIVE copilot processes (the silent failure), live receiver markers via the production reader, receiver log. RED only when install-state exists
|
|
@@ -235,7 +252,7 @@ Usage:
|
|
|
235
252
|
./run.sh check-pack # publish gate (dry-run): npm pack --dry-run + tarball invariants (runtime-critical present, dev residue absent)
|
|
236
253
|
./run.sh check-pack-pin-matcher # pure self-test of check-pack-install's pin-leak matcher against synthetic .pnpm lookalikes (version boundary: @0.84.30 must leak, @0.84.3 bare/peer-hash must pass); snapshot-safe qualification oracle, also run first inside check-pack-install
|
|
237
254
|
./run.sh check-fresh-cut-gate # SOURCE cell of the generation-boundary proof (IN pnpm run check:full): drives real install/setup/fresh-cut in a sandbox; certification refusal is pre-write, quiescence is fail-closed, archives preserve bytes, and the #54 exit matrix distinguishes complete / no-move / usage / incomplete transition / complete-with-cleanup-residue. No model/network/cost
|
|
238
|
-
./run.sh check-pack-install # heavy publish gate (prepublishOnly): actual npm pack + tar -tf + fresh-temp install smoke with the pinned pi peers (pins derived from the package.json devDep; check-dep-versions binds them) + the npm-installed bridge BOOTS (tools/list) and DELIVERS (tools/call entwurf_v2 → .msg lands) + the installed all-absent and copilot-present (four-unit fake-vendor) `entwurf setup` rows + the INSTALLED generation lifecycle on a seeded previous-generation host (REFUSE before activation writes / zero Claude invocations → installed fresh-cut archives + opens empty → install-meta-bridge PASSES)
|
|
255
|
+
./run.sh check-pack-install # heavy publish gate (prepublishOnly): actual npm pack + tar -tf + fresh-temp install smoke with the pinned pi peers (pins derived from the package.json devDep; check-dep-versions binds them) + the npm-installed bridge BOOTS (tools/list) and DELIVERS (tools/call entwurf_v2 → .msg lands) + the installed all-absent and copilot-present (four-unit fake-vendor) `entwurf setup` rows + the INSTALLED generation lifecycle on a seeded previous-generation host (REFUSE before activation writes / zero Claude invocations → installed fresh-cut archives + opens empty → install-meta-bridge PASSES) + the INSTALLED-PACKAGE branch of the Copilot and OMP birth installers actually RUN (compiled entry selected, no raw .ts, and a real birth edge mints a citizen — the half a required-artifact list can never stand in for)
|
|
239
256
|
./run.sh check-install-container # 0.12.8 (#51 C): Linux artifact-CONSUMER gate — one candidate .tgz handed read-only to a checkout-invisible node:<engines-major>-bookworm cell. Default packs once to temp; ENTWURF_CANDIDATE_TGZ=/absolute/preserved.tgz consumes those exact bytes with no re-pack and prints canonical path+sha256 for release. Non-root global PATH install, frozen package, MCP tools/list, fake-Claude install-meta-bridge, path+sha256 fence, strict doctor, and the GENERATION host-state matrix (clean / v3-only store bytes unchanged / previous-generation REFUSE→fresh-cut→retry PASS) seeded inline. Docker missing = honest SKIP; ENTWURF_REQUIRE_DOCKER=1 makes that RED (required CI)
|
|
240
257
|
./run.sh install [project-dir] # INTERNAL part of `setup` (project .pi/settings.json wiring) + npm-consumer entry — prefer `setup`, don't call directly for dev
|
|
241
258
|
./run.sh remove [project-dir] # remove entwurf entries from project .pi/settings.json (project scope only; global user-scope citizen left intact)
|
|
@@ -774,6 +791,42 @@ check_entwurf_capabilities() {
|
|
|
774
791
|
run_ts scripts/check-entwurf-capabilities.ts
|
|
775
792
|
}
|
|
776
793
|
|
|
794
|
+
smoke_omp_fresh_live() {
|
|
795
|
+
# #87 Bundle C acceptance, RELEASE MUST. Opens omp as ONE visible fresh sibling through
|
|
796
|
+
# the PUBLIC entwurf_fresh_call surface in a private tmux server, correlates the exact
|
|
797
|
+
# nonce callback to a garden id from the SENDER ENVELOPE, then delivers an addressed
|
|
798
|
+
# message the sibling drains in that same native session. Decides its own outcome: omp
|
|
799
|
+
# absent from FRESH_CALL_BACKENDS or without a mailbox rail is a protocol SKIP, LIVE!=1
|
|
800
|
+
# is a protocol SKIP, and once the composition offers the backend every missing
|
|
801
|
+
# prerequisite is a FAIL. Writes into the REAL meta roots — the extensions run inside the
|
|
802
|
+
# launched omp process and no env carrier on the fresh argv could fence them.
|
|
803
|
+
run_ts scripts/smoke-omp-fresh-live.ts
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
check_omp_fresh_preflight() {
|
|
807
|
+
# #87 Bundle C. The OMP fresh preflight REPRODUCES two resolvers that already exist
|
|
808
|
+
# in this repo in another language — omp_agent_dir (scripts/omp-bridge-oracle.sh) and
|
|
809
|
+
# the tools.xdev half of scripts/omp-tool-surface.py — because the preflight runs from
|
|
810
|
+
# two different emit depths and cannot resolve a sibling script by relative path. A
|
|
811
|
+
# reproduction nothing compares is a divergence with a date on it, so this drives the
|
|
812
|
+
# SHIPPED shell and python leaves and requires the TS half to agree, refusals included.
|
|
813
|
+
# Never asks the resolver under test to confirm itself. Fixtures only; never reads ~/.omp.
|
|
814
|
+
run_ts scripts/check-omp-fresh-preflight.ts
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
check_harness_admission_parity() {
|
|
818
|
+
# #87 Bundle C. The EDGE between two parity loops that were each closed and had
|
|
819
|
+
# nothing between them: check-entwurf-capabilities held registry ==
|
|
820
|
+
# META_CITIZEN_BACKENDS, the fresh-call surfaces contract held surfaces ==
|
|
821
|
+
# FRESH_CALL_BACKENDS, and no file read both constants. So a harness could be a
|
|
822
|
+
# full D6 citizen that entwurf_fresh_call cannot open, with every gate green and
|
|
823
|
+
# only prose saying it was not supported — which is how an `unsupported` label
|
|
824
|
+
# started reading as a partial-release permit. Asserts every citizen backend is
|
|
825
|
+
# either fresh-openable or a DECLARED pre-#82 legacy admission whose exception a
|
|
826
|
+
# reader can find in DELIVERY.md, both directions, no third state. Pure parse.
|
|
827
|
+
run_ts scripts/check-harness-admission-parity.ts
|
|
828
|
+
}
|
|
829
|
+
|
|
777
830
|
check_capability_bundle_reach() {
|
|
778
831
|
# The gate check-entwurf-capabilities structurally cannot be. That gate imports
|
|
779
832
|
# metaCapabilitiesFilePath() from ../pi-extensions/lib/ — the one location where
|
|
@@ -1238,7 +1291,11 @@ check_mux_fresh_call() {
|
|
|
1238
1291
|
# copilot-fresh-preflight rides here rather than in its own gate: it exists only as
|
|
1239
1292
|
# freshCall's pre-mutation branch (#82 RAIL 9), and splitting it would let the two halves
|
|
1240
1293
|
# of one refusal be certified in different runs.
|
|
1241
|
-
|
|
1294
|
+
# omp-fresh-bootstrap.contract rides here for the same reason and one more: it is the ONLY
|
|
1295
|
+
# place the launcher's payload and the installed birth extension's decoder are read together.
|
|
1296
|
+
# They ship in different directories and cannot import each other (#87 Bundle C), so this
|
|
1297
|
+
# lane is what keeps a deliberate duplication from becoming drift.
|
|
1298
|
+
run_vitest test/mux-fresh-call.test.ts test/copilot-fresh-preflight.test.ts test/fresh-call-surfaces.contract.test.ts test/fresh-call-provider.contract.test.ts test/omp-fresh-bootstrap.contract.test.ts
|
|
1242
1299
|
}
|
|
1243
1300
|
|
|
1244
1301
|
smoke_mux_fresh_call_live() {
|
|
@@ -2891,6 +2948,9 @@ check_pack() {
|
|
|
2891
2948
|
# #65 — the owner-normalized store projection consumers call INSTEAD of
|
|
2892
2949
|
# parsing the store; installed hosts are exactly where those consumers live.
|
|
2893
2950
|
"mcp/entwurf-bridge/dist/scripts/meta-facts.js"
|
|
2951
|
+
# #87 Bundle B — omp-receive-doctor drives this operator projection through
|
|
2952
|
+
# run.sh, so installed node_modules must have the compiled twin too.
|
|
2953
|
+
"mcp/entwurf-bridge/dist/scripts/omp-receive-facts.js"
|
|
2894
2954
|
# 0.12.5 — the node_modules-safe plugin hook + its lib. install-meta-bridge copies
|
|
2895
2955
|
# these compiled JS into the assembled plugin when installed (raw .ts can't
|
|
2896
2956
|
# strip-types under node_modules). meta-session.js is shared with the store-doctor
|
|
@@ -2899,6 +2959,13 @@ check_pack() {
|
|
|
2899
2959
|
# #82 — the Copilot birth entry's compiled closure, for the same node_modules
|
|
2900
2960
|
# strip-types refusal that forces the Claude one.
|
|
2901
2961
|
"mcp/entwurf-bridge/dist/pi-extensions/meta-bridge-hook-copilot.js"
|
|
2962
|
+
# #87 — the OMP birth entry's compiled closure. install-omp-bridge SELECTS this path
|
|
2963
|
+
# under node_modules, and docs/setup-clean-host.md tells operators to run that installer,
|
|
2964
|
+
# so its absence is not a degraded path: the installed installer dies at its own artifact
|
|
2965
|
+
# check before assembling anything. The unit skeleton's package.json below is the other
|
|
2966
|
+
# half — the installer copies it, and `pi/` ships per-FILE.
|
|
2967
|
+
"mcp/entwurf-bridge/dist/pi-extensions/meta-bridge-omp.js"
|
|
2968
|
+
"pi/meta-bridge-omp/entwurf-meta-omp/package.json"
|
|
2902
2969
|
"mcp/entwurf-bridge/dist/pi-extensions/lib/meta-session.js"
|
|
2903
2970
|
"scripts/postinstall-chmod.cjs"
|
|
2904
2971
|
"pi/entwurf-capabilities.json"
|
|
@@ -3146,12 +3213,21 @@ _check_pack_install_impl() {
|
|
|
3146
3213
|
"mcp/entwurf-bridge/dist/scripts/meta-bridge-fresh-cut.js"
|
|
3147
3214
|
# #65 — the owner-normalized store projection (see check-pack).
|
|
3148
3215
|
"mcp/entwurf-bridge/dist/scripts/meta-facts.js"
|
|
3216
|
+
# #87 Bundle B — omp-receive-doctor reaches this through the installed dispatcher.
|
|
3217
|
+
"mcp/entwurf-bridge/dist/scripts/omp-receive-facts.js"
|
|
3149
3218
|
# 0.12.5 — node_modules-safe plugin hook + lib (see check-pack). The installed
|
|
3150
3219
|
# hook regression below runs exactly this compiled JS from under node_modules.
|
|
3151
3220
|
"mcp/entwurf-bridge/dist/pi-extensions/meta-bridge-hook.js"
|
|
3152
3221
|
# #82 — the Copilot birth entry's compiled closure, for the same node_modules
|
|
3153
3222
|
# strip-types refusal that forces the Claude one.
|
|
3154
3223
|
"mcp/entwurf-bridge/dist/pi-extensions/meta-bridge-hook-copilot.js"
|
|
3224
|
+
# #87 — the OMP birth entry's compiled closure. install-omp-bridge SELECTS this path
|
|
3225
|
+
# under node_modules, and docs/setup-clean-host.md tells operators to run that installer,
|
|
3226
|
+
# so its absence is not a degraded path: the installed installer dies at its own artifact
|
|
3227
|
+
# check before assembling anything. The unit skeleton's package.json below is the other
|
|
3228
|
+
# half — the installer copies it, and `pi/` ships per-FILE.
|
|
3229
|
+
"mcp/entwurf-bridge/dist/pi-extensions/meta-bridge-omp.js"
|
|
3230
|
+
"pi/meta-bridge-omp/entwurf-meta-omp/package.json"
|
|
3155
3231
|
"mcp/entwurf-bridge/dist/pi-extensions/lib/meta-session.js"
|
|
3156
3232
|
"scripts/postinstall-chmod.cjs"
|
|
3157
3233
|
"pi/entwurf-capabilities.json"
|
|
@@ -3257,8 +3333,15 @@ _check_pack_install_impl() {
|
|
|
3257
3333
|
# {pi-agent-core, pi-ai, pi-tui} at 0.83.0 to {pi-agent-core, pi-ai, pi-client,
|
|
3258
3334
|
# pi-protocol, pi-tui}, so pi-client and pi-protocol are pinned here for the
|
|
3259
3335
|
# first time. Unpinned they would float exactly like pi-agent-core did in the
|
|
3260
|
-
# 2026-07-21 incident above.
|
|
3261
|
-
#
|
|
3336
|
+
# 2026-07-21 incident above. pi-telemetry joined the explicit pin list on
|
|
3337
|
+
# 2026-08-31: it arrives transitively (pi-agent-core and pi-ai both carry
|
|
3338
|
+
# `^0.84.3` carets on it), and upstream's 0.84.4 patch publish (2026-08-28
|
|
3339
|
+
# 22:04Z) floated that caret in this lockfile-less temp install, turning CI
|
|
3340
|
+
# red through the leak assertion below. The bump itself stays a separate
|
|
3341
|
+
# hard-cut lane (#87 thread / NEXT "Do not touch: Pi 0.84.4") — pinning the
|
|
3342
|
+
# drift shut is how the verified 0.84.3 runtime stays OURS to hold. The leak
|
|
3343
|
+
# assertion below still covers every other pi package, including any package
|
|
3344
|
+
# a future pi bump adds to the closure.
|
|
3262
3345
|
echo "[check-pack-install] pnpm add into $tmp (with 0.84.x peers + typebox)"
|
|
3263
3346
|
local install_log
|
|
3264
3347
|
install_log=$(cd "$tmp" && pnpm add \
|
|
@@ -3269,6 +3352,7 @@ _check_pack_install_impl() {
|
|
|
3269
3352
|
"@earendil-works/pi-agent-core@0.84.3" \
|
|
3270
3353
|
"@earendil-works/pi-client@0.84.3" \
|
|
3271
3354
|
"@earendil-works/pi-protocol@0.84.3" \
|
|
3355
|
+
"@earendil-works/pi-telemetry@0.84.3" \
|
|
3272
3356
|
"typebox@latest" \
|
|
3273
3357
|
--ignore-workspace --ignore-scripts 2>&1) || {
|
|
3274
3358
|
fail "[check-pack-install] pnpm add failed:"
|
|
@@ -3882,6 +3966,76 @@ SH
|
|
|
3882
3966
|
fi
|
|
3883
3967
|
rm -rf "$cop_store"
|
|
3884
3968
|
echo "[check-pack-install] installed Copilot birth unit assembles its compiled branch and mints a citizen from a no-argv launch"
|
|
3969
|
+
|
|
3970
|
+
# --- #87: the OMP birth unit's INSTALLED-PACKAGE branch ---------------------
|
|
3971
|
+
# Same shape and same reason as the Copilot cell above, and it is here because the gap it
|
|
3972
|
+
# closes was REAL, not theoretical: the compiled entry this installer selects under
|
|
3973
|
+
# node_modules was in no emit include and no artifact list, so `entwurf install-omp-bridge`
|
|
3974
|
+
# — which docs/setup-clean-host.md tells operators to run — died at its own artifact check
|
|
3975
|
+
# on every installed host while every gate stayed green (Terra amendment review, #87 A1).
|
|
3976
|
+
# The list entries above make that artifact's ABSENCE loud; this RUNS it, which is the half
|
|
3977
|
+
# Hard Rule 11 says a list can never stand in for.
|
|
3978
|
+
#
|
|
3979
|
+
# No omp binary is faked into doing anything: the installer only asks whether one is on
|
|
3980
|
+
# PATH (entwurf never installs a harness), and the unit is a module the vendor imports, not
|
|
3981
|
+
# a process we launch — so the exercise imports the placed artifact the way omp does.
|
|
3982
|
+
local omp_agent="$npm_tmp/omp-agent" omp_home="$npm_tmp/omp-home" omp_bin="$npm_tmp/omp-bin" omp_log
|
|
3983
|
+
mkdir -p "$omp_agent" "$omp_home" "$omp_bin"
|
|
3984
|
+
printf '#!/usr/bin/env bash\nexit 0\n' > "$omp_bin/omp"
|
|
3985
|
+
chmod +x "$omp_bin/omp"
|
|
3986
|
+
if ! omp_log=$(HOME="$omp_home" XDG_DATA_HOME="$omp_home/.local/share" ENTWURF_OMP_AGENT_DIR="$omp_agent" PATH="$omp_bin:$npmroot/node_modules/.bin:$PATH" "$npm_pkg/run.sh" install-omp-bridge 2>&1); then
|
|
3987
|
+
fail "[check-pack-install] installed install-omp-bridge failed:"
|
|
3988
|
+
echo "$omp_log" | tail -20 | sed 's/^/ /' >&2
|
|
3989
|
+
return 1
|
|
3990
|
+
fi
|
|
3991
|
+
local omp_unit="$omp_agent/extensions/entwurf-meta-omp"
|
|
3992
|
+
# Branch SELECTION, pinned exactly as the Copilot cell pins its own: an installed package
|
|
3993
|
+
# must place the compiled entry and NO raw .ts, or the fire below could pass on a layout
|
|
3994
|
+
# that silently chose the dev-clone branch.
|
|
3995
|
+
if [ ! -f "$omp_unit/index.js" ] || [ -f "$omp_unit/index.ts" ]; then
|
|
3996
|
+
fail "[check-pack-install] installed install-omp-bridge did not select the compiled branch (want index.js, no raw .ts) in $omp_unit"
|
|
3997
|
+
ls -l "$omp_unit" 2>/dev/null | sed 's/^/ /' >&2 || true
|
|
3998
|
+
return 1
|
|
3999
|
+
fi
|
|
4000
|
+
if [ ! -f "$omp_unit/lib/meta-session.js" ] || [ ! -f "$omp_unit/entwurf-capabilities.json" ] || [ ! -f "$omp_unit/package.json" ]; then
|
|
4001
|
+
fail "[check-pack-install] installed omp unit is incomplete (want lib/meta-session.js + entwurf-capabilities.json + package.json) in $omp_unit"
|
|
4002
|
+
return 1
|
|
4003
|
+
fi
|
|
4004
|
+
# Fired the way omp fires it: import the module, call the exported factory with a mock
|
|
4005
|
+
# ExtensionAPI, and hand the tui host context to the birth edge.
|
|
4006
|
+
local omp_fire
|
|
4007
|
+
if ! omp_fire=$(OMP_UNIT="$omp_unit" HOME="$omp_home" node --input-type=module <<'JS' 2>&1
|
|
4008
|
+
const mod = await import(process.env.OMP_UNIT + "/index.js");
|
|
4009
|
+
const handlers = [];
|
|
4010
|
+
(mod.default ?? mod)({ on: (event, handler) => { if (event === "session_start") handlers.push(handler); } });
|
|
4011
|
+
const ctx = {
|
|
4012
|
+
mode: "tui",
|
|
4013
|
+
cwd: "/tmp",
|
|
4014
|
+
ui: { setStatus: () => {} },
|
|
4015
|
+
sessionManager: { getSessionId: () => "pack-omp-probe", getCwd: () => "/tmp", getSessionFile: () => null },
|
|
4016
|
+
};
|
|
4017
|
+
for (const handler of handlers) await handler({ type: "session_start" }, ctx);
|
|
4018
|
+
process.stdout.write("fired " + handlers.length + "\n");
|
|
4019
|
+
JS
|
|
4020
|
+
); then
|
|
4021
|
+
fail "[check-pack-install] the installed omp unit failed to import/run from its placed location: $(printf '%s' "$omp_fire" | tr '\n' ' ' | cut -c1-300)"
|
|
4022
|
+
return 1
|
|
4023
|
+
fi
|
|
4024
|
+
# Counted through the OWNER's certified projection, not a grep — and through the INSTALLED
|
|
4025
|
+
# bin, so this also proves dist/scripts/meta-facts.js is reachable from a consumer. `env -u
|
|
4026
|
+
# PI_CODING_AGENT_DIR` is the omp root policy: for backend omp that variable is the vendor's
|
|
4027
|
+
# own agent dir and never a garden root (#87 B1).
|
|
4028
|
+
local omp_citizens
|
|
4029
|
+
omp_citizens=$(env -u PI_CODING_AGENT_DIR HOME="$omp_home" "$npm_pkg/run.sh" meta-facts 2>&1 | python3 -c '
|
|
4030
|
+
import json, sys
|
|
4031
|
+
facts = json.load(sys.stdin)
|
|
4032
|
+
print(sum(1 for c in (facts.get("citizens") or []) if c.get("backend") == "omp"))
|
|
4033
|
+
' 2>/dev/null) || omp_citizens=""
|
|
4034
|
+
if [ "$omp_citizens" != "1" ]; then
|
|
4035
|
+
fail "[check-pack-install] the installed omp unit did not mint exactly one CERTIFIED omp citizen (found ${omp_citizens:-<unreadable>}); log: $(tail -1 "$omp_home/.pi/agent/meta-bridge-hook.log" 2>/dev/null)"
|
|
4036
|
+
return 1
|
|
4037
|
+
fi
|
|
4038
|
+
echo "[check-pack-install] installed OMP birth unit places its compiled branch and mints a certified citizen from a tui birth edge"
|
|
3885
4039
|
python3 - "$mb_cfg/settings.json" "$mb_home/.claude.json" "$stable_asm" <<'PY'
|
|
3886
4040
|
import json, sys
|
|
3887
4041
|
settings = json.load(open(sys.argv[1]))
|
|
@@ -5317,6 +5471,21 @@ release_gate() {
|
|
|
5317
5471
|
run_live_step "smoke-claude-native-resume-live (native Claude Code resume + meta-bridge neutrality)" gate bash "$self" smoke-claude-native-resume-live
|
|
5318
5472
|
run_live_step "smoke-entwurf-chain-live (P3: Claude Code -> pi GPT -> pi ACP Sonnet -> mailbox, identity + receipt)" gate bash "$self" smoke-entwurf-chain-live
|
|
5319
5473
|
run_live_step "smoke-mux-lifecycle-live (mux public-harness lifecycle: fresh -> send -> dormant -> same-id visible resume -> recall)" gate bash "$self" smoke-mux-lifecycle-live
|
|
5474
|
+
# #87 bundle B: MUST, and since bundle B moved omp's wakeMode to self-fetch this is a
|
|
5475
|
+
# REAL demand under LIVE=1, not a standing SKIP — it reads the registry, so an honest
|
|
5476
|
+
# SKIP now only ever names a missing prerequisite, and a registry claiming a receive
|
|
5477
|
+
# rail with no acceptance body here is a FAIL.
|
|
5478
|
+
run_live_step "smoke-omp-receive-live (#87 bundle B: other harness -> open omp citizen, addressed receive + roundtrip)" gate bash "$self" smoke-omp-receive-live
|
|
5479
|
+
# #87 bundle C: the step 9 clause 7 receipt, wired as a MUST rather than left to an
|
|
5480
|
+
# operator's memory. A schema is not a product — omp's bootstrap-payload submission
|
|
5481
|
+
# PARSES correctly, and parsing is exactly what pi got right while submitting no message
|
|
5482
|
+
# at all, so a release whose fresh_call(omp) opens a window that never runs its turn
|
|
5483
|
+
# would pass every deterministic gate here. That is not hypothetical for this backend:
|
|
5484
|
+
# the retired positional candidate parsed perfectly and still answered `ACK` with zero
|
|
5485
|
+
# tool calls, because the turn began before the callback tool existed. New contract,
|
|
5486
|
+
# applied from omp onward; it does not retroactively redesign Copilot's operator-metered
|
|
5487
|
+
# exclusion.
|
|
5488
|
+
run_live_step "smoke-omp-fresh-live (#87 bundle C: entwurf_fresh_call opens omp, exact nonce callback, addressed receive)" gate bash "$self" smoke-omp-fresh-live
|
|
5320
5489
|
|
|
5321
5490
|
# 4. BEHAVIOR lane (advisory, non-blocking). Model-in-loop gates that probe
|
|
5322
5491
|
# whether the model AUTONOMOUSLY drives the MCP entwurf surface. These never
|
|
@@ -5430,6 +5599,15 @@ case "$cmd" in
|
|
|
5430
5599
|
check-entwurf-capabilities)
|
|
5431
5600
|
check_entwurf_capabilities
|
|
5432
5601
|
;;
|
|
5602
|
+
check-harness-admission-parity)
|
|
5603
|
+
check_harness_admission_parity
|
|
5604
|
+
;;
|
|
5605
|
+
check-omp-fresh-preflight)
|
|
5606
|
+
check_omp_fresh_preflight
|
|
5607
|
+
;;
|
|
5608
|
+
smoke-omp-fresh-live)
|
|
5609
|
+
smoke_omp_fresh_live
|
|
5610
|
+
;;
|
|
5433
5611
|
check-capability-bundle-reach)
|
|
5434
5612
|
check_capability_bundle_reach
|
|
5435
5613
|
;;
|
|
@@ -5454,6 +5632,18 @@ case "$cmd" in
|
|
|
5454
5632
|
check-copilot-birth-hook)
|
|
5455
5633
|
check_copilot_birth_hook
|
|
5456
5634
|
;;
|
|
5635
|
+
check-omp-birth-hook)
|
|
5636
|
+
# #87 gate: the OMP BIRTH path without omp. Drives the real assembler into a temp dir,
|
|
5637
|
+
# then imports the ASSEMBLED index.ts into a mock omp host (mock ExtensionAPI + mock
|
|
5638
|
+
# ExtensionContext) and fires the two birth edges. Requires: a backend:"omp" v3 record
|
|
5639
|
+
# only under mode "tui"; NOTHING under print/rpc/json (a task subagent is not a citizen,
|
|
5640
|
+
# and hasUI is deliberately true on the rpc rows because it is true in the vendor too);
|
|
5641
|
+
# session_switch attaching on the same native id and minting the replacement on a new
|
|
5642
|
+
# one; a sender marker keyed to the HOST process's OWN pid (never its parent — the
|
|
5643
|
+
# one-process join) that the production resolver joins back to the record; the garden id
|
|
5644
|
+
# on the status line; and still zero mailbox/receiver marker. Hermetic; no omp, no model turn
|
|
5645
|
+
run_ts scripts/check-omp-birth-hook.ts
|
|
5646
|
+
;;
|
|
5457
5647
|
check-copilot-statusline)
|
|
5458
5648
|
check_copilot_statusline
|
|
5459
5649
|
;;
|
|
@@ -5586,6 +5776,12 @@ case "$cmd" in
|
|
|
5586
5776
|
smoke-acp-bundled-mcp-live)
|
|
5587
5777
|
smoke_acp_bundled_mcp_live
|
|
5588
5778
|
;;
|
|
5779
|
+
smoke-omp-receive-live)
|
|
5780
|
+
# #87 bundle B — the acceptance that makes omp's one-way garden executable.
|
|
5781
|
+
# Reads the capability registry and reports its own PASS/SKIP/FAIL; see the
|
|
5782
|
+
# header of the script for the three branches.
|
|
5783
|
+
run_ts scripts/smoke-omp-receive-live.ts
|
|
5784
|
+
;;
|
|
5589
5785
|
smoke-entwurf-chain-live)
|
|
5590
5786
|
# P3 — the cross-harness delivery CHAIN on real authenticated rails:
|
|
5591
5787
|
# native Claude Code -> pi GPT -> pi ACP Claude Sonnet -> mailbox terminus,
|
|
@@ -5910,6 +6106,102 @@ case "$cmd" in
|
|
|
5910
6106
|
smoke-copilot-mcp-state)
|
|
5911
6107
|
(cd "$REPO_DIR" && bash scripts/smoke-copilot-mcp-state.sh)
|
|
5912
6108
|
;;
|
|
6109
|
+
smoke-omp-bridge-state)
|
|
6110
|
+
(cd "$REPO_DIR" && bash scripts/smoke-omp-bridge-state.sh)
|
|
6111
|
+
;;
|
|
6112
|
+
install-omp-mcp)
|
|
6113
|
+
(cd "$REPO_DIR" && bash scripts/omp-mcp-bridge.sh install "$@")
|
|
6114
|
+
;;
|
|
6115
|
+
uninstall-omp-mcp)
|
|
6116
|
+
(cd "$REPO_DIR" && bash scripts/omp-mcp-bridge.sh uninstall "$@")
|
|
6117
|
+
;;
|
|
6118
|
+
doctor-omp-mcp)
|
|
6119
|
+
(cd "$REPO_DIR" && bash scripts/omp-mcp-bridge.sh doctor "$@")
|
|
6120
|
+
;;
|
|
6121
|
+
smoke-omp-mcp-state)
|
|
6122
|
+
(cd "$REPO_DIR" && bash scripts/smoke-omp-mcp-state.sh)
|
|
6123
|
+
;;
|
|
6124
|
+
install-omp-bridge)
|
|
6125
|
+
# #87: the OMP BIRTH install. Not a mode of the Claude or Copilot installer, and for a
|
|
6126
|
+
# structural reason rather than a stylistic one: an omp "hook" IS an in-process
|
|
6127
|
+
# extension, so there is no launcher to bake a node path into and no hook manifest to
|
|
6128
|
+
# declare events in — the vendor imports the module itself. What this owns is one
|
|
6129
|
+
# directory under the omp agent dir; the MCP hand is install-omp-mcp.
|
|
6130
|
+
shift || true
|
|
6131
|
+
(cd "$REPO_DIR" && bash scripts/omp-bridge-install.sh "$@")
|
|
6132
|
+
;;
|
|
6133
|
+
uninstall-omp-bridge)
|
|
6134
|
+
# The package-owned inverse: the ownership state is the sole removal authority (exact
|
|
6135
|
+
# unit dir, recorded entry name, recorded assembly), a no-state host REFUSES instead of
|
|
6136
|
+
# cleaning up what it cannot prove is ours, and the state is deleted LAST.
|
|
6137
|
+
shift || true
|
|
6138
|
+
(cd "$REPO_DIR" && bash scripts/omp-bridge-uninstall.sh "$@")
|
|
6139
|
+
;;
|
|
6140
|
+
doctor-omp-bridge)
|
|
6141
|
+
# #87: the fail-loud surface for the OMP unit. Red is a unit omp cannot import, a STALE
|
|
6142
|
+
# deployed writer, an unrecovered mint ERROR, a failed sender-marker write, or a live omp
|
|
6143
|
+
# process carrying inherited PI_SESSION_ID/PI_AGENT_ID. "Installed with zero records" is
|
|
6144
|
+
# NOT-YET, not red.
|
|
6145
|
+
shift || true
|
|
6146
|
+
(cd "$REPO_DIR" && bash scripts/omp-bridge-doctor.sh "$@")
|
|
6147
|
+
;;
|
|
6148
|
+
install-omp-receive)
|
|
6149
|
+
# #87 bundle B: install the OMP RECEIVER extension into
|
|
6150
|
+
# <omp agent dir>/extensions/entwurf-receive-omp. Its own unit, install-state, doctor and
|
|
6151
|
+
# inverse — birth says who sends, this says a reply can land, and neither grants the other.
|
|
6152
|
+
# Same ownership discipline as the birth installer: no adoption of an artifact entwurf holds
|
|
6153
|
+
# no state for, no writing through a symlink, refusal when the agent dir is ambiguous.
|
|
6154
|
+
shift || true
|
|
6155
|
+
(cd "$REPO_DIR" && bash scripts/omp-receive-install.sh "$@")
|
|
6156
|
+
;;
|
|
6157
|
+
uninstall-omp-receive)
|
|
6158
|
+
# honest inverse from install-state (exact unit dir + recorded entry; no-state host REFUSES;
|
|
6159
|
+
# state deleted LAST). Records, sender identity and any ALREADY-armed live session are
|
|
6160
|
+
# untouched — an omp TUI that armed before this ran stays addressable until it exits.
|
|
6161
|
+
shift || true
|
|
6162
|
+
(cd "$REPO_DIR" && bash scripts/omp-receive-uninstall.sh "$@")
|
|
6163
|
+
;;
|
|
6164
|
+
doctor-omp-receive)
|
|
6165
|
+
# #87 bundle B: runtime axis (importable unit, writer parity, arm vs doorbell failures on
|
|
6166
|
+
# SEPARATE axes, and WHO IS ARMED right now read through the PRODUCTION marker reader via
|
|
6167
|
+
# omp-receive-facts — never a filename) + ownership axis. Zero armed receivers is NOT-YET.
|
|
6168
|
+
# It reports a marker for exactly what a marker proves: a live owner reached the arm emit.
|
|
6169
|
+
# It never claims the vendor's watch is still registered — see the header.
|
|
6170
|
+
shift || true
|
|
6171
|
+
(cd "$REPO_DIR" && bash scripts/omp-receive-doctor.sh "$@")
|
|
6172
|
+
;;
|
|
6173
|
+
smoke-omp-receive-state)
|
|
6174
|
+
# #87 bundle B: OMP RECEIVER install/doctor/inverse regression — placement, stale-writer
|
|
6175
|
+
# detection, honest inverse, no-state refusal (structurally VALID as well as foreign),
|
|
6176
|
+
# symlink refusal, ambiguous-agent-dir refusal, a poisoned PI_CODING_AGENT_DIR that
|
|
6177
|
+
# attracts no artifact, plus the two this surface owns: installing a doorbell ARMS
|
|
6178
|
+
# NOTHING, and a host with no birth unit is a green doctor with a NAMED dependency note
|
|
6179
|
+
# rather than a red one. Fully sandboxed HOME/PI/XDG. Offline/deterministic
|
|
6180
|
+
shift || true
|
|
6181
|
+
(cd "$REPO_DIR" && bash scripts/smoke-omp-receive-state.sh "$@")
|
|
6182
|
+
;;
|
|
6183
|
+
check-omp-receive-arm)
|
|
6184
|
+
# #87 bundle B gate: drives the REAL receive assembler into a temp dir, imports the
|
|
6185
|
+
# ASSEMBLED index.ts into a MOCK omp host and proves everything on entwurf's side of the
|
|
6186
|
+
# vendor boundary — the tui-only scope fence, deferral before birth and the BOUNDED retry
|
|
6187
|
+
# that arms once the sender marker appears, the refusal to start a timer this build cannot
|
|
6188
|
+
# cancel, the refusal to arm when the wake surface is missing, id-drift refusal, the /new
|
|
6189
|
+
# unarm that the start-key guard structurally cannot catch, no-watch-no-marker ordering,
|
|
6190
|
+
# an announce-only doorbell that never carries the body, a vanished signal giving the
|
|
6191
|
+
# marker back, and an identity-guarded teardown. Hermetic; no omp, no model turn. What it
|
|
6192
|
+
# deliberately cannot prove — that the vendor really wakes an idle host — is
|
|
6193
|
+
# smoke-omp-receive-live's job, and neither receipt substitutes for the other
|
|
6194
|
+
shift || true
|
|
6195
|
+
run_ts scripts/check-omp-receive-arm.ts "$@"
|
|
6196
|
+
;;
|
|
6197
|
+
omp-receive-facts)
|
|
6198
|
+
# #87 bundle B: read-only JSON projection of the omp receive rail — every receiver marker
|
|
6199
|
+
# read through readMetaReceiverMarker in BOTH readings (live / as-written), plus the mailbox
|
|
6200
|
+
# counts behind each. The shared oracle for doctor-omp-receive, the state smoke and the LIVE
|
|
6201
|
+
# acceptance, so none of them answers "is a doorbell held?" from a filename.
|
|
6202
|
+
shift || true
|
|
6203
|
+
run_ts scripts/omp-receive-facts.ts "$@"
|
|
6204
|
+
;;
|
|
5913
6205
|
copilot)
|
|
5914
6206
|
# #82 RAIL 7: the managed launch. `exec` and NO subshell/cd on purpose — the vendor
|
|
5915
6207
|
# must inherit this terminal exactly: the caller's cwd, this pid, this tty, and its own
|
|
@@ -155,6 +155,26 @@ function row(facts: SelfAddressabilityFacts): { replyable: boolean; socketState:
|
|
|
155
155
|
);
|
|
156
156
|
}
|
|
157
157
|
|
|
158
|
+
// meta-session / NONE rail: no inbound transport at all. Mailbox facts and a live probe
|
|
159
|
+
// cannot buy replyability — there is nothing to land on. Distinct from the unsupplied
|
|
160
|
+
// (undefined) domain row below, which stays fail-closed for a caller that forgot the axis.
|
|
161
|
+
{
|
|
162
|
+
const noneFacts: SelfAddressabilityFacts = {
|
|
163
|
+
origin: "meta-session",
|
|
164
|
+
metaDeliveryDomain: "none",
|
|
165
|
+
recordBacked: true,
|
|
166
|
+
ownerAlive: true,
|
|
167
|
+
watchArmed: true,
|
|
168
|
+
probeAlive: true,
|
|
169
|
+
};
|
|
170
|
+
const noneRail = computeSelfAddressability(noneFacts);
|
|
171
|
+
ok("meta/none + all facts true → NOT replyable", noneRail.replyable === false);
|
|
172
|
+
ok(
|
|
173
|
+
"meta/none names the missing inbound rail (mailbox/probe facts cannot rescue it)",
|
|
174
|
+
noneRail.reason.includes("no inbound rail"),
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
|
|
158
178
|
// meta-session with NO rail declared: we cannot say how a reply would travel, so we do not
|
|
159
179
|
// claim it would arrive. The domain is derived from nativePushSupported(backend) — a caller
|
|
160
180
|
// that forgets it gets a refusal, not an optimistic guess.
|
|
@@ -246,6 +266,17 @@ ok(
|
|
|
246
266
|
/existsSync\s*\(/.test(piBody) && /controlSocketPathIn\s*\(\s*ENTWURF_DIR\s*,/.test(piBody),
|
|
247
267
|
);
|
|
248
268
|
|
|
269
|
+
const metaBuilder = functionBody("buildTrustedMetaSenderEnvelope");
|
|
270
|
+
// FIRST of the two derivation claims so a binary-fallback mutant dies here, not at the seam pin.
|
|
271
|
+
ok(
|
|
272
|
+
"buildTrustedMetaSenderEnvelope does not fall back every non-native-push backend to self-fetch [QK:SELFADDR-NO-FALLBACK-SELF-FETCH]",
|
|
273
|
+
!/\?\s*"native-push"\s*:\s*"self-fetch"/.test(metaBuilder),
|
|
274
|
+
);
|
|
275
|
+
ok(
|
|
276
|
+
"buildTrustedMetaSenderEnvelope derives self-fetch through resolveMailboxWakeModeCapability(identity), not a backend-name list [QK:SELFADDR-MAILBOX-WAKE-SEAM]",
|
|
277
|
+
/resolveMailboxWakeModeCapability\s*\(\s*identity\s*\)/.test(metaBuilder),
|
|
278
|
+
);
|
|
279
|
+
|
|
249
280
|
const selfRegion = toolRegion("entwurf_self");
|
|
250
281
|
ok(
|
|
251
282
|
"entwurf_self existsSync-probes the pi socket (alive vs expected, no synthesized path lie)",
|
|
@@ -821,11 +821,14 @@ console.log(`\n[gate-qualification] self-test: ${passed} checks passed`);
|
|
|
821
821
|
"pack-install": 1,
|
|
822
822
|
"pi-package-ownership": 6,
|
|
823
823
|
"mux-resume-call": 12,
|
|
824
|
+
"omp-birth": 11,
|
|
825
|
+
"omp-fresh": 24,
|
|
826
|
+
"omp-receive": 11,
|
|
824
827
|
"probe-ordering": 1,
|
|
825
828
|
"release-gate": 12,
|
|
826
829
|
"resume-args": 6,
|
|
827
830
|
"resume-launch-identity": 6,
|
|
828
|
-
"self-address":
|
|
831
|
+
"self-address": 5,
|
|
829
832
|
"setup-verdict": 10,
|
|
830
833
|
"source-install": 2,
|
|
831
834
|
"v2-surface": 7,
|