@junghanacs/entwurf 0.12.9 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +135 -248
- package/BASELINE.md +46 -7
- package/CHANGELOG.md +35 -0
- package/CONTRIBUTING.md +4 -2
- package/DELIVERY.md +5 -4
- package/README.md +46 -18
- package/VERIFY.md +10 -6
- package/demo/demo.sh +7 -1
- package/docs/setup-clean-host.md +10 -4
- package/mcp/entwurf-bridge/dist/mcp/entwurf-bridge/src/index.js +159 -66
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/backend-adapter.js +148 -5
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/config.js +16 -4
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/models.js +66 -7
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/overlay.js +190 -3
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/tool-surface.js +12 -4
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-core.js +26 -9
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-deliverability.js +10 -6
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-fact-provider.js +15 -17
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-facts.js +13 -13
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-resume-args.js +31 -41
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-self-address.js +8 -9
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-contract.js +32 -25
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-decider.js +4 -4
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-lock.js +5 -4
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-production.js +9 -11
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-spawn-production.js +3 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/meta-session.js +17 -20
- package/mcp/entwurf-bridge/src/index.ts +190 -82
- package/package.json +7 -3
- package/pi/settings.reference.json +1 -1
- package/pi-extensions/acp-provider.ts +20 -10
- package/pi-extensions/entwurf-control.ts +69 -27
- package/pi-extensions/lib/acp/augment.ts +60 -2
- package/pi-extensions/lib/acp/backend-adapter.ts +183 -8
- package/pi-extensions/lib/acp/backend.ts +5 -1
- package/pi-extensions/lib/acp/config.ts +19 -5
- package/pi-extensions/lib/acp/engraving.ts +3 -1
- package/pi-extensions/lib/acp/event-mapper.ts +10 -3
- package/pi-extensions/lib/acp/models.ts +69 -7
- package/pi-extensions/lib/acp/overlay.ts +234 -3
- package/pi-extensions/lib/acp/tool-surface.ts +12 -4
- package/pi-extensions/lib/entwurf-core.ts +26 -9
- package/pi-extensions/lib/entwurf-deliverability.ts +10 -6
- package/pi-extensions/lib/entwurf-fact-provider.ts +15 -17
- package/pi-extensions/lib/entwurf-facts.ts +13 -13
- package/pi-extensions/lib/entwurf-resume-args.ts +40 -46
- package/pi-extensions/lib/entwurf-self-address.ts +8 -9
- package/pi-extensions/lib/entwurf-v2-contract-schema.ts +7 -2
- package/pi-extensions/lib/entwurf-v2-contract.ts +32 -25
- package/pi-extensions/lib/entwurf-v2-decider.ts +8 -8
- package/pi-extensions/lib/entwurf-v2-lock.ts +5 -4
- package/pi-extensions/lib/entwurf-v2-production.ts +14 -11
- package/pi-extensions/lib/entwurf-v2-spawn-production.ts +3 -1
- package/pi-extensions/lib/meta-session.ts +17 -20
- package/run.sh +200 -62
- package/scripts/agy-bridge-config.py +249 -49
- package/scripts/agy-bridge.sh +59 -14
- package/scripts/check-acp-carrier-augment.ts +34 -2
- package/scripts/check-acp-cortex.ts +668 -0
- package/scripts/check-acp-provider-surface.ts +50 -6
- package/scripts/check-acp-sdk-surface.ts +22 -11
- package/scripts/check-acp-session-reuse.ts +64 -1
- package/scripts/check-agy-permission-matrix.py +655 -0
- package/scripts/check-entwurf-deliverability.ts +9 -6
- package/scripts/check-entwurf-fact-provider.ts +7 -7
- package/scripts/check-entwurf-facts.ts +12 -12
- package/scripts/check-entwurf-resume-args.ts +22 -60
- package/scripts/check-entwurf-self-address.ts +187 -4
- package/scripts/check-entwurf-v2-contract.ts +2 -2
- package/scripts/check-entwurf-v2-production.ts +5 -5
- package/scripts/check-entwurf-v2-spawn-production.ts +6 -2
- package/scripts/check-entwurf-v2-surface.ts +327 -14
- package/scripts/check-gate-qualification.ts +787 -0
- package/scripts/check-meta-identity-consumers.ts +1 -1
- package/scripts/check-probe-cli-shim.ts +879 -0
- package/scripts/check-probe-ordering.ts +2450 -0
- package/scripts/check-shell-quote.ts +5 -4
- package/scripts/fixtures/probe-cli-shim +20 -0
- package/scripts/fixtures/probe-mcp-server.ts +168 -12
- package/scripts/lib/mutation-qualify.ts +794 -0
- package/scripts/lib/probe-acp-turn.ts +207 -0
- package/scripts/lib/probe-cli-shim.ts +464 -0
- package/scripts/lib/probe-cli-target.ts +165 -0
- package/scripts/lib/probe-event-log.ts +383 -0
- package/scripts/lib/probe-verdict.ts +1213 -0
- package/scripts/mutants/acp-augment.json +30 -0
- package/scripts/mutants/acp-cortex.json +196 -0
- package/scripts/mutants/agy-permission.json +144 -0
- package/scripts/mutants/meta-identity.json +17 -0
- package/scripts/mutants/probe-ordering.json +1032 -0
- package/scripts/mutants/self-address.json +59 -0
- package/scripts/mutants/v2-surface.json +87 -0
- package/scripts/smoke-acp-cortex-live.ts +392 -0
- package/scripts/smoke-acp-ordering-probe-live.ts +848 -0
- package/scripts/smoke-acp-raw-turn-live.ts +1 -1
- package/scripts/smoke-acp-v2-send-live.ts +33 -18
- package/scripts/smoke-agy-install-state.sh +205 -20
- package/scripts/smoke-entwurf-v2-matrix-live.ts +3 -2
- package/pi-extensions/lib/entwurf-mailbox-guard.ts +0 -100
- package/scripts/check-entwurf-mailbox-guard.ts +0 -266
package/run.sh
CHANGED
|
@@ -94,7 +94,7 @@ Usage:
|
|
|
94
94
|
./run.sh check-meta-capability-source # deterministic gate (0.11 Stage 0 step 3D-3): capability-source cut-over — mint/parse read wakeMode/deliveryLevel from the registry (metaCapabilityFor, registry-driven via injection), not META_BACKEND_DESCRIPTORS; behaviour-preserving (registry ≡ const); the record.delivery slot 3D-3 preserved was deleted by 3D-4, no API
|
|
95
95
|
./run.sh check-socket-probe # deterministic gate (0.11 Stage 0, F3): three-valued control-socket liveness (alive|dead|indeterminate) — GC reclaims dead only, indeterminate survives; pure classify + 2-socket integration, no API
|
|
96
96
|
./run.sh check-project-trust-handler # deterministic gate (0.11 Stage 0, Trust 2층): project_trust handler — decideProjectTrust matrix (escape=inherited-false+interactive+trust-here→{yes,remember:true}; non-interactive→undecided; never undefined) + adapter single-writer, fake prompt, no UI
|
|
97
|
-
./run.sh check-entwurf-v2-contract # deterministic gate (0.11 Stage 0 step 4-pre, 동결결정 10 + Fable R1-R5): FROZEN entwurf_v2 contract — R1
|
|
97
|
+
./run.sh check-entwurf-v2-contract # deterministic gate (0.11 Stage 0 step 4-pre, 동결결정 10 + Fable R1-R5): FROZEN entwurf_v2 contract — R1 control-socket domain (currently pi; claude/codex/agy=unsupported, not folded), 6-cell intent×liveness table (single verdict, 2 allow/4 reject), N1 indeterminate-no-spawn, Q2 owned-live-no-autosend, R3 table↔receipt round-trip, R5 taxonomy, schema↔types drift; pure, no API
|
|
98
98
|
./run.sh check-entwurf-v2-lock # deterministic gate (0.11 Stage 0 step 5a, 버킷 B F2): per-gid dispatch LOCK primitive — openSync wx atomic acquire, second-acquire=target-locked conflict (holder JSON for human cleanup), nonce-owned release (successor survives late release), stale reclaim same-host+ESRCH-only (EPERM/remote/alive/unknown fail-closed), empty/corrupt=conflict not auto-deleted, F2-P1 malformed gid throws; real temp dir, deps injected
|
|
99
99
|
./run.sh check-entwurf-v2-decider # deterministic gate (0.11 Stage 0 step 5b): PURE dispatch decider decideDispatch — frozen 7-step order over injected fakes, lock acquire+release tracked so reject⇒no-plan-no-lock proven; pre-probe rejects observedLiveness=null, send/resume execute keep lock + mailbox no-lock (?7), resume plan no mode/provider/model, invalid gid throws (F2-P1); pure, no IO
|
|
100
100
|
./run.sh check-entwurf-v2-matrix # deterministic gate (0.11 Stage 0 step 5d-5 a): REACHABILITY + LOCK SSOT table — drives REAL decideDispatch over fakes, fixes every (target kind → transport → lock class) cell as one table (control-socket/meta-mailbox/spawn-bg + bad-target/conflict/locked/undeliverable/owned-live/dormant/indeterminate rejects), coverage pass fails on a dropped cell; thin coverage not a decider re-impl; pure, no IO
|
|
@@ -104,20 +104,19 @@ Usage:
|
|
|
104
104
|
./run.sh check-entwurf-v2-runner # deterministic gate (0.11 Stage 0 step 5d-1): execute-router (executeDispatch) routing an already-decided DispatchDecision to its 5c transport hand → one outcome-rich EntwurfV2RunResult. reject→rejected (no hand) / control/spawn/mailbox→matching hand with decision.lock verbatim / spawn lock-retained rides executed (fail-closed) / N3 rejectReason carried / N1 SendDeliveredReleaseFailedError→execution-failed{finalizedOutcome,releaseFailed,retrySafe:false}; fake hands, no IO
|
|
105
105
|
./run.sh check-entwurf-v2-mailbox # deterministic gate (0.11 Stage 0 step 5c-4, LAST 5c transport slice): ENQUEUE-ONLY meta-mailbox SEND body (executeMetaMailboxSend) + production sendViaMailbox adapter — sender→formatMetaMailboxBody with plan.wantsReply threaded (divergence from legacy hard false), sender absent→raw plan.message, enqueue opts EXACTLY {gardenId,body,sessionsDir,mailboxDir}, enqueue throw PROPAGATES (no success:false fold — mailbox has no in-band refuse); adapter NEVER touches lock (release is the hand's job); source guard: no release/routing seam
|
|
106
106
|
./run.sh check-entwurf-v2-spawn # deterministic gate (0.11 Stage 0 step 5c-3a): spawn-bg RESUME watcher hand (executeSpawnBgResume) wiring spawn + socket-observe IO onto the 5c-1 reducer — Fable-3: TIMEOUT IS NOT A RELEASE (bare observeTimeout→killChild, release 0; bounded killGrace then real socket-alive ∨ child-exited releases ×1); spawnChild throw→spawn-start-failed; no observation obtainable (grace elapses / post-spawn watch dep throws)→lock-retained fail-closed (released:false, evidence surfaced), NO direct-release hatch; IO-via-dep, controlled promises
|
|
107
|
-
./run.sh check-entwurf-resume-args # deterministic gate (0.11 Stage 0 step 5c-3b): resume-argv SSOT (buildResumePiArgs)
|
|
107
|
+
./run.sh check-entwurf-resume-args # deterministic gate (0.11 Stage 0 step 5c-3b): resume-argv SSOT (buildResumePiArgs) for the v2 spawn-bg RESIDENT citizen — the `legacy` one-shot variant and its async worker were removed 2026-07-27, so the shipped posture is the only one the gate drives: v2-control=--entwurf-control + no --no-extensions (keep-alive is the goal, resumed session stays addressable); keeps --mode json -p + prompt-as-turn (-p NOT dropped); explicitExtensionArgs preserved exactly once (#29); plan.launchArgs (--approve) ride before the prompt; null provider→no --provider
|
|
108
108
|
./run.sh check-entwurf-v2-spawn-production # deterministic gate (0.11 Stage 0 step 5c-3c): production SpawnBgResumeDeps factory (makeProductionSpawnBgResumeDeps) wiring the 5c-3a watcher's 6 IO seams — no real pi/socket/timer (that=opt-in smoke-entwurf-v2-spawn-live, OUT of pnpm check). socketWatchVerdict: address-conflict→forged (reject, never wait)/alive→alive/dead·indeterminate→wait; spawnChild builds v2-control argv (--entwurf-control, no --no-extensions, -p+prompt, --approve, cwd authority); awaitSocketAlive connectable→resolve / symlink→reject without connect / dead→wait→alive / abort-clears; awaitChildExit code + listener cleanup; awaitTimeout schedule + abort-clear; killChild=SIGTERM; proc-less child fails loud
|
|
109
109
|
./run.sh smoke-entwurf-v2-spawn-live # LIVE phase gate (0.11 Stage 0 step 5c-3c, D5) — OUT of pnpm check, needs LIVE=1. Exercises the production SpawnBgResumeDeps against REAL OS objects: S1 real unix socket → awaitSocketAlive resolves (real lstat+probe), symlink→forged, absent→abort settles; S2 real child → spawn-event resolve + SIGTERM kill + exit-code capture; S3 watcher integration → real timeout→kill→child-exited→release ×1. Does NOT spawn a real pi resume (that=5d matrix). Run before 5d: LIVE=1 ./run.sh smoke-entwurf-v2-spawn-live
|
|
110
110
|
./run.sh smoke-entwurf-v2-spawn-resume-live # 0.11.0 (A) ACCEPTANCE gate — OUT of pnpm check, needs LIVE=1. The FULL spawn-bg resident lifecycle: mint backend=pi identity → seed a REAL dormant pi session (one-shot into ~/.pi/agent/sessions) → runEntwurfV2(owned-outcome) routes dormant→spawn-bg resume → a REAL detached pi --entwurf-control child stands its socket up, resumes, DOES a model turn. Asserts executed/spawn-bg/socket-alive/released + lock released ×1 + no lock file + pid alive + socket connectable + resume USER & assistant OK nonces in the session JSONL. Model-in-loop IN. The gate v1 deprecation (0.12) is predicated on. Model: ENTWURF_LIVE_TARGET=<provider>/<model> (default openai-codex/gpt-5.4). LIVE=1 ./run.sh smoke-entwurf-v2-spawn-resume-live
|
|
111
111
|
./run.sh smoke-entwurf-v2-matrix-live # LIVE sentinel (0.11 Stage 0 step 5d-5, D4-b) — OUT of pnpm check, needs LIVE=1. Drives REAL production runEntwurfV2 deps over REAL OS objects, 4 cells: C1 control-socket (real pi --entwurf-control resident → RPC send → lock acquire→release ×1), C1b record-less socket (#50 C4: live record-less pi → EVERY intent rejected pre-probe record-less-socket, no lock, rendered hint names record authority + fresh-cut), C2 meta-mailbox deliverable (armed self-fetch citizen → real .msg enqueue, lock-free), C3 meta-mailbox guard (no armed receiver → reject, no garbage). Model-in-loop OUT (transport/lock/enqueue gate, GPT Q2); negative/timeout stay deterministic. Model: ENTWURF_LIVE_TARGET=<provider>/<model> (default openai-codex/gpt-5.4). LIVE=1 ./run.sh smoke-entwurf-v2-matrix-live
|
|
112
112
|
./run.sh smoke-agy-native-push-live # 봉인 8 LIVE acceptance for the native-push (agy) rail — OUT of pnpm check, needs LIVE=1 + AGY_CONVERSATION_ID (a live agy conversation). Drives the REAL antigravity adapter + register core + runEntwurfV2 (production deps): doctor-static preflight (dangling→FAIL, the ③ gate), probe route, register create/attach idempotency, fire→native-push delivered, post-send re-probe (D7 partial), owned-outcome→native-push-no-resume-authority, bogus-conv→native-push-probe-indeterminate. Meta-store isolated to a temp dir (only the agy round-trip is real; no real-store residue). LIVE=1 AGY_CONVERSATION_ID=<convId> ./run.sh smoke-agy-native-push-live
|
|
113
|
-
./run.sh check-entwurf-facts # deterministic gate (0.11 Stage 0 step 4, fact-provider slice 1+2): PURE PeerFact core + resolveFactList union — R1 out-of-domain→unsupported, R3b
|
|
113
|
+
./run.sh check-entwurf-facts # deterministic gate (0.11 Stage 0 step 4, fact-provider slice 1+2): PURE PeerFact core + resolveFactList union — R1 out-of-domain→unsupported, R3b socket-domain 4-value, facts-only keyset; union: PeerFact + RecordLessSocketFact by gardenId (#50 C4: record-less socket = diagnostic subject, gid+liveness only), dormant→dead, F3 indeterminate preserved, out-of-socket-domain+socket fail-loud; pure, no IO
|
|
114
114
|
./run.sh check-socket-discovery # deterministic gate (0.11 Stage 0 step 4, fact-provider slice 3): SOCKET-axis scanSocketProbes — probes (dir sockets) ∪ (in-domain citizen canonical paths) 3-valued; dormant citizen no-file → dead (resumable, not unprobed), stall → indeterminate (F3), dir hygiene/dedup/missing-dir + e2e → resolveFactList; readdir/probe injected, no IO
|
|
115
115
|
./run.sh check-meta-listing # deterministic gate: META-STORE facts axis — kind-carrying entries; non-regular records are never read, parse/drift become diagnostics, duplicate nativeSessionId quarantines every rival but not unrelated citizens; strict throws / collect partial; pure injected IO
|
|
116
|
-
./run.sh check-entwurf-fact-provider # deterministic gate (0.11 Stage 0 step 4, fact-provider slice 4b): ASSEMBLY listEntwurfFacts — listAllMetaIdentities→scanSocketProbes→pre-quarantine
|
|
116
|
+
./run.sh check-entwurf-fact-provider # deterministic gate (0.11 Stage 0 step 4, fact-provider slice 4b): ASSEMBLY listEntwurfFacts — listAllMetaIdentities→scanSocketProbes→pre-quarantine out-of-socket-domain/socket conflicts→resolveFactList(clean)→{facts,diagnostics}; C-원칙: expected corruption (parse/collision)→diagnostics (listing survives), impossible invariant (dup/unprobed)→throw; collision quarantines BOTH PeerFact+socket; deps injected, no IO
|
|
117
117
|
./run.sh check-entwurf-peers-surface # deterministic gate (0.11 Stage 0 step 4, fact-provider slice 4c): MCP entwurf_peers RENDER renderEntwurfPeers (#50 C4) — payload keyset exactly {peers, diagnostics}; FORBIDDEN keys sessions/socketOnly/controlDir/socketPath/count + no .sock in text (socket is transport, never identity); record-less socket = aggregated record-less-socket diagnostic (F8, liveness-keyed message, alive names fresh-cut); NO verb-routing key (JSON deep scan) NOR word (text), diagnostics both surfaces, empty→(none), unsupported shown; WIRING guard: both surfaces call provider+render, getLiveSessions + /entwurf-sessions gone; facts fabricated, no IO
|
|
118
|
-
./run.sh check-entwurf-self-address # deterministic gate (SE-1/SE-2 slice 1): self-addressability honesty predicate computeSelfAddressability — pi replyable ⟺ live socket; meta ⟺ recordBacked ∧ ownerAlive ∧ watchArmed (regression-proof record-present rows); SOURCE GUARD buildStrictPiSenderEnvelope drops hardcoded replyable:true + existsSync-probes socket, entwurf_self renders alive vs expected
|
|
118
|
+
./run.sh check-entwurf-self-address # deterministic gate (SE-1/SE-2 slice 1): self-addressability honesty predicate computeSelfAddressability — pi replyable ⟺ live socket; meta splits by RAIL: self-fetch ⟺ recordBacked ∧ ownerAlive ∧ watchArmed (regression-proof record-present rows), native-push ⟺ recordBacked ∧ probeAlive (separate axis — no mailbox fact may rescue or sink it), unsupplied rail fail-closed; SOURCE GUARD buildStrictPiSenderEnvelope drops hardcoded replyable:true + existsSync-probes socket, entwurf_self renders alive vs expected AND renders the meta rail per-rail (mailbox only inside the self-fetch branch; native-push denies an inbox and gates injection on the probe)
|
|
119
119
|
./run.sh check-entwurf-deliverability # deterministic gate (SE-1/SE-2 slice 2c): conversational-mailbox deliverability predicate — computeMetaReceiverActive (recordBacked ∧ ownerAlive ∧ watchArmed) + mailboxConversationalDeliverable (self-fetch AND active); direct-inject pi refused (SE-1), self-fetch dead/unarmed refused (SE-2); self-address shares the same atom
|
|
120
|
-
./run.sh check-entwurf-mailbox-guard # deterministic gate (SE-1/SE-2 slice 2d): guarded mailbox enqueue — PURE 0-call (undeliverable target leaves injected enqueue uncalled) + TMPDIR snapshot (refused send leaves mailbox byte-identical, accepted writes one .msg) + fact gathering from record/capability/receiver-marker
|
|
121
120
|
./run.sh check-native-push-adapter # deterministic gate (봉인 3/8): native-push adapter leaf (antigravity) via a FAKE runner — FULL pid scan (not head -1), dead vs indeterminate, VOLATILE route re-discovery (no cache), send argv+ANTIGRAVITY_LS_ADDRESS env, non-zero exit throws, NO adapter-level retry (executor-owned), resolveNativePushAdapter fail-fast
|
|
122
121
|
./run.sh check-native-push-register # deterministic gate (봉인 5): registerNativeConversation (entwurf_register_native core) via fake adapter + isolated mkdtemp store — live probe→CREATE, re-register→ATTACH (same gid, cwd refreshed, no dup), not-live probe→REFUSE (throws, no record), receiver-marker abstinence (보정① source guard)
|
|
123
122
|
./run.sh check-agy-sender-identity # deterministic gate (#46 sender lane): WHO is calling the bridge — real agy hook as a child process writes an antigravity sender marker keyed by its PARENT pid (never on upsert failure), and resolveTrustedMetaSenderIdentity over isolated stores yields 0→null / 1→identity on EITHER backend / two distinct live identities on one owner pid→THROW (never guess, never downgrade to anonymous). This is what turns an agy send from external-mcp/unknown-host into a replyable garden citizen
|
|
@@ -128,9 +127,13 @@ Usage:
|
|
|
128
127
|
./run.sh smoke-meta-honesty # 1.0.0 meta-bridge: honesty regression gate (#30 blockers) — doorbell counts ALL msgs honestly + hook logs failures as ERROR (best-effort, no scream). Offline/deterministic (deps: bash+node+python3)
|
|
129
128
|
./run.sh smoke-meta-install-state # 1.0.0 meta-bridge Phase 2: stateful install/uninstall + store-doctor regression gate. Offline/deterministic (deps: bash+node+python3)
|
|
130
129
|
./run.sh check-meta-doctor-oracle # 0.12.8 (#51): detection power of the release ORACLE — healthy fixture must reach `doctor: PASS`, then 21 planted defects (retired shell form, partial hand-patch, launcher bypass/repoint/provenance loss, malformed exec args, owner type drift, extra leaf/group, doorbell asyncRewake/path/timeout, no live bridge, stale receiver, ambiguous/missing cache, missing hook log/writer, failing CLI probes) must each turn it FAIL naming their own cause, plus a positive case pinning that a long-writing CLI is NOT a false negative. Offline/deterministic (deps: bash+node+python3)
|
|
131
|
-
./run.sh smoke-agy-install-state # agy MCP + exact permission ownership regression
|
|
132
|
-
./run.sh
|
|
133
|
-
./run.sh
|
|
130
|
+
./run.sh smoke-agy-install-state # agy MCP + exact permission ownership regression: isolated HOME+XDG, adopt/state/inverse, symlink refuse, setup degrade. Offline/deterministic
|
|
131
|
+
./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)
|
|
132
|
+
./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
|
|
133
|
+
./run.sh check-probe-ordering # §11-7 ordering-probe deterministic gate: raw-client SAMENESS pinned to backend.ts (sequence/args/timeouts/permission policy — the probe may never measure a lookalike), phase attribution incl. set-model, probe-mode fixture wire markers (delay honored, probeRunId REQUIRED, smoke-acp-mcp-live legacy compat), event-log door integrity (reserved keys refused at write; unknown marker name, broken sort axis, or a payload the classifier cannot judge on is MALFORMED, never a quiet event), and the §11-7 paired-verdict truth table (P0/I0 outside the space, phase-qualified D, B promotion ladder, C, A two-delay rule). Offline/deterministic; kill-proofed via scripts/mutants/probe-ordering.json
|
|
134
|
+
./run.sh check-probe-cli-shim # §11-7-c B-name-snapshot PRODUCER gate: the CLI shim driven as a REAL process against fake CLIs (no API, no cost). Proves what a defect would buy — FABRICATED evidence (a malformed init is never reported as an empty name set; the boot report carries the true target path+sha256 the classifier verifies against the roster), a DESTROYED turn (byte transparency across mid-UTF8/CRLF/oversized/unterminated framing, exit-code fidelity, signal re-raise, inbound signal forwarding, stderr passthrough, stdout backpressure), and LEAKED operator state (exact-allowlist env scrub, no argv/env/prompt body in the log). Offline/deterministic; kill-proofed via scripts/mutants/probe-ordering.json
|
|
135
|
+
./run.sh smoke-agy-statusline-state # agy ambient garden-id statusLine install/doctor/inverse regression. Offline/deterministic
|
|
136
|
+
./run.sh smoke-agy-hooks-state # agy PreInvocation birth/sender hook install/doctor/inverse + direct stdin→meta-record regression. Offline/deterministic
|
|
134
137
|
./run.sh smoke-user-scope-citizen # 0.12.6 install-boundary: pi packages[] registration SSOT (register-pi-package.py) — idempotent + preserves unrelated + normalizes stale + remove symmetry + fails loud. Offline/hermetic (deps: bash+python3)
|
|
135
138
|
./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)
|
|
136
139
|
./run.sh smoke-meta-keyset-guard # 0.10.0 meta-bridge: keyset-owner guard regression — check-keyset-overlap + managed-keys SSOT (disjoint passes, collisions fail). Offline/hermetic (deps: bash+python3)
|
|
@@ -745,7 +748,7 @@ check_entwurf_v2_contract() {
|
|
|
745
748
|
# contract (동결결정 10 + 버킷 B F1/F4/F6 + Fable R1-R5). The intent×liveness
|
|
746
749
|
# decision table is a constant; the "table cell ↔ dispatch receipt" round-trip
|
|
747
750
|
# is asserted exhaustively — THE executable proof F6 demands ("산문 금지").
|
|
748
|
-
# R1
|
|
751
|
+
# R1 control-socket capability domain (currently pi; claude-code/codex/antigravity =
|
|
749
752
|
# unsupported, never folded into dead/indeterminate). 6-cell table, single
|
|
750
753
|
# verdict per cell (Q2), 2 allow / 4 reject. N1 indeterminate never spawns;
|
|
751
754
|
# Q2 owned-outcome+live never auto-sends. R5 taxonomy covers table reasons +
|
|
@@ -948,14 +951,13 @@ check_entwurf_v2_spawn() {
|
|
|
948
951
|
|
|
949
952
|
check_entwurf_resume_args() {
|
|
950
953
|
# Deterministic gate for 0.11 Stage 0 step 5c-3b: the resume-argv SSOT
|
|
951
|
-
# (buildResumePiArgs)
|
|
952
|
-
#
|
|
953
|
-
# `--no-extensions`
|
|
954
|
-
#
|
|
955
|
-
#
|
|
956
|
-
#
|
|
957
|
-
#
|
|
958
|
-
# (--approve) before the prompt; null provider emits no --provider; no cross-contamination.
|
|
954
|
+
# (buildResumePiArgs). v2-control is the only shipped shape (the legacy one-shot variant and
|
|
955
|
+
# its launcher were removed 2026-07-27). Pins the resident posture: `--entwurf-control`
|
|
956
|
+
# present + `--no-extensions` never (the keep-alive is the goal — a resumed session stands
|
|
957
|
+
# its socket up and stays addressable), the headless `--mode json -p` prefix and the
|
|
958
|
+
# prompt-as-turn positional (`-p` NOT dropped), explicitExtensionArgs preserved exactly once
|
|
959
|
+
# (provider-resolution footgun #29), plan.launchArgs (--approve) before the prompt, and a
|
|
960
|
+
# null provider emitting no --provider.
|
|
959
961
|
run_ts scripts/check-entwurf-resume-args.ts
|
|
960
962
|
}
|
|
961
963
|
|
|
@@ -1177,6 +1179,40 @@ smoke_acp_rgg_live() {
|
|
|
1177
1179
|
(cd "$REPO_DIR" && ENTWURF_LIVE_TARGET="$target" SMOKE_RGG_POSITIVE=0 bash scripts/smoke-resident-garden-guard.sh)
|
|
1178
1180
|
}
|
|
1179
1181
|
|
|
1182
|
+
smoke_acp_cortex_live() {
|
|
1183
|
+
# On-demand LIVE smoke for the Cortex (Snowflake Cortex Code) ACP backend — the
|
|
1184
|
+
# first NON-claude adapter on the rail (docs/acp-backend-rail.md §6). OUT of
|
|
1185
|
+
# `pnpm check` AND OUTSIDE the claude-only aggregate LIVE floor (capability
|
|
1186
|
+
# dignity, invariant #7): a host with no cortex install / no Snowflake auth must
|
|
1187
|
+
# not redden a release for a backend it does not run, so this is deliberately
|
|
1188
|
+
# absent from release-gate's 11-smoke ACP acceptance floor. That is a WIRING
|
|
1189
|
+
# decision, not a lower evidence bar — a cut that SHIPS cortex still owes a
|
|
1190
|
+
# deliberate run of this smoke, and the aggregate gate's silence is not a pass
|
|
1191
|
+
# (rail §11-8 tail). Drives one real
|
|
1192
|
+
# cortex ACP turn through the entwurf provider path (outbound entwurf_v2 +
|
|
1193
|
+
# dual-HOME overlay facts + process-group reclaim — CP2, rail §11-8).
|
|
1194
|
+
# HONEST-SKIP (exit 0) when LIVE!=1 OR `cortex` is not on PATH OR no
|
|
1195
|
+
# connection is pinned — the live turn needs `cortex` installed with the
|
|
1196
|
+
# operator's own web-login auth already present (there is no `cortex auth`
|
|
1197
|
+
# subcommand — CP0 D6), reached through the overlay's narrow credential
|
|
1198
|
+
# symlinks — narrow in WHICH paths are reachable (D5), not read-only: a symlink
|
|
1199
|
+
# carries no write protection (AGENTS §ACP Plugin Boundary: entwurf never
|
|
1200
|
+
# provides/proxies the Snowflake credential). The connection must ride the adapter seam
|
|
1201
|
+
# (ENTWURF_ACP_CORTEX_CONNECTION) because the dual-HOME overlay denies the
|
|
1202
|
+
# operator settings.json where a default would live. PR #40 called this
|
|
1203
|
+
# `smoke-cortex`; the canonical family name is smoke-acp-cortex-live.
|
|
1204
|
+
# LIVE=1 ENTWURF_ACP_CORTEX_CONNECTION=<conn> ./run.sh smoke-acp-cortex-live
|
|
1205
|
+
if [ "${LIVE:-}" != "1" ]; then
|
|
1206
|
+
echo "[smoke-acp-cortex-live] skipped — set LIVE=1 (+ ENTWURF_ACP_CORTEX_CONNECTION) to run."
|
|
1207
|
+
return 0
|
|
1208
|
+
fi
|
|
1209
|
+
if ! command -v cortex >/dev/null 2>&1; then
|
|
1210
|
+
echo "[smoke-acp-cortex-live] skipped — cortex not on PATH (install Snowflake Cortex Code and complete its own login flow)."
|
|
1211
|
+
return 0
|
|
1212
|
+
fi
|
|
1213
|
+
run_ts scripts/smoke-acp-cortex-live.ts
|
|
1214
|
+
}
|
|
1215
|
+
|
|
1180
1216
|
smoke_entwurf_v2_matrix_live() {
|
|
1181
1217
|
# LIVE sentinel for 0.11 Stage 0 step 5d-5 (D4-b) — kept OUT of `pnpm check`. The deterministic
|
|
1182
1218
|
# sibling (check-entwurf-v2-matrix) fixes every (target kind → transport → lock) cell over fakes
|
|
@@ -1266,7 +1302,7 @@ check_meta_listing() {
|
|
|
1266
1302
|
check_entwurf_fact_provider() {
|
|
1267
1303
|
# Deterministic gate for 0.11 Stage 0 step 4 (fact-provider slice 4b): the
|
|
1268
1304
|
# ASSEMBLY layer listEntwurfFacts. listAllMetaIdentities → scanSocketProbes →
|
|
1269
|
-
# pre-quarantine
|
|
1305
|
+
# pre-quarantine out-of-socket-domain/socket conflicts → resolveFactList(clean) →
|
|
1270
1306
|
# {facts, diagnostics}. Throw-vs-diagnostics policy (GPT힣 C-원칙): expected
|
|
1271
1307
|
# corruption (parse failure / gardenId↔socket collision) → diagnostics, listing
|
|
1272
1308
|
# survives; impossible wiring invariant (resolveFactList duplicate/unprobed) →
|
|
@@ -1297,7 +1333,8 @@ check_entwurf_self_address() {
|
|
|
1297
1333
|
# from env presence alone: a socketless pi session, or a meta citizen whose owner
|
|
1298
1334
|
# exited / whose idle-watch was never armed, all advertised replyable while
|
|
1299
1335
|
# delivery silently failed (SE-1). Asserts: PURE truth table (pi replyable ⟺
|
|
1300
|
-
# socketAlive; meta ⟺ recordBacked ∧ ownerAlive ∧
|
|
1336
|
+
# socketAlive; external never; meta BY RAIL — self-fetch ⟺ recordBacked ∧ ownerAlive ∧
|
|
1337
|
+
# watchArmed, native-push ⟺ recordBacked ∧ probeAlive, unsupplied rail fail-closed),
|
|
1301
1338
|
# incl. the two regression-proof rows (record-present + owner-dead / watch-unarmed)
|
|
1302
1339
|
# that stay meaningful after slice 3 mints records; SOURCE GUARD that
|
|
1303
1340
|
# buildStrictPiSenderEnvelope drops the hardcoded `replyable: true` and existsSync-
|
|
@@ -1319,17 +1356,6 @@ check_entwurf_deliverability() {
|
|
|
1319
1356
|
run_ts scripts/check-entwurf-deliverability.ts
|
|
1320
1357
|
}
|
|
1321
1358
|
|
|
1322
|
-
check_entwurf_mailbox_guard() {
|
|
1323
|
-
# Deterministic gate for the guarded mailbox enqueue (SE-1/SE-2 slice 2d) — the IO
|
|
1324
|
-
# orchestration conversational-reply sites use instead of enqueueMetaMessage directly.
|
|
1325
|
-
# Asserts (GPT Q5, both axes): PURE 0-call — an undeliverable target (dead receiver /
|
|
1326
|
-
# direct-inject pi / absent record) leaves the injected enqueue UNCALLED, a deliverable
|
|
1327
|
-
# one calls it exactly once; TMPDIR SNAPSHOT with the real enqueueMetaMessage — a refused
|
|
1328
|
-
# send leaves the mailbox tree byte-identical (file list + content hash, not just mtime),
|
|
1329
|
-
# an accepted send writes exactly one .msg; plus fact gathering from record/capability/marker.
|
|
1330
|
-
run_ts scripts/check-entwurf-mailbox-guard.ts
|
|
1331
|
-
}
|
|
1332
|
-
|
|
1333
1359
|
check_native_push_adapter() {
|
|
1334
1360
|
# Deterministic gate for the native-push adapter LEAF (봉인 3/8). Drives
|
|
1335
1361
|
# createAntigravityAdapter with a FAKE runner (no real agy/ss/pgrep). Asserts: FULL pid
|
|
@@ -1695,7 +1721,7 @@ const SITES = [
|
|
|
1695
1721
|
['pi/meta-bridge/entwurf-meta-receive/scripts/hook-launch.sh', /Claude Code >= (\d+\.\d+\.\d+)/g, 1, 'launcher refusal message'],
|
|
1696
1722
|
['scripts/meta-bridge-claude-floor.sh', /THE FLOOR IS (\d+\.\d+\.\d+)/g, 1, 'floor helper rationale header'],
|
|
1697
1723
|
['docs/setup-clean-host.md', /`>=(\d+\.\d+\.\d+)`\*\* — the exec-form hook floor/g, 1, 'clean-host pin matrix'],
|
|
1698
|
-
['AGENTS.md', /Claude Code `>=(\d+\.\d+\.\d+)`/g, 1, 'AGENTS rule
|
|
1724
|
+
['AGENTS.md', /Claude Code `>=(\d+\.\d+\.\d+)`/g, 1, 'AGENTS rule 14'],
|
|
1699
1725
|
['README.md', /supported floor `>=(\d+\.\d+\.\d+)`/g, 1, 'README doctor description'],
|
|
1700
1726
|
['scripts/check-hook-launch-topology.ts', /\/(\d+)\\\.(\d+)\\\.(\d+)\//g, 1, 'topology gate floor assertion'],
|
|
1701
1727
|
];
|
|
@@ -2221,19 +2247,23 @@ EOF
|
|
|
2221
2247
|
}
|
|
2222
2248
|
|
|
2223
2249
|
check_acp_provider_surface() {
|
|
2224
|
-
# Deterministic gate for the
|
|
2225
|
-
# provider lib modules
|
|
2226
|
-
#
|
|
2227
|
-
#
|
|
2228
|
-
#
|
|
2229
|
-
|
|
2250
|
+
# Deterministic gate for the ACP provider registration surface. Loads the REAL
|
|
2251
|
+
# provider lib modules AND compiles + drives the REAL entry against a fake pi,
|
|
2252
|
+
# asserting: one surface name, the no-auth sentinel shape, full
|
|
2253
|
+
# ProviderModelConfig rows on the curated claude anchor, the EXACT curated model
|
|
2254
|
+
# set both adapters contribute (claude 2 + cortex 4 —
|
|
2255
|
+
# [QK:CORTEX-PROVIDER-SIX-ROW-SURFACE], the claim that catches an entry which
|
|
2256
|
+
# silently drops a whole backend), and that streamSimple is the real
|
|
2257
|
+
# streamShellAcp backend (checked BY NAME, never invoked — invoking spawns an
|
|
2258
|
+
# ACP child). Pure, no pi runtime, no API.
|
|
2259
|
+
section "ACP provider surface (registration + both-adapter model set)"
|
|
2230
2260
|
run_ts scripts/check-acp-provider-surface.ts
|
|
2231
2261
|
}
|
|
2232
2262
|
|
|
2233
2263
|
check_acp_sdk_surface() {
|
|
2234
2264
|
# Deterministic gate for the S2a ACP SDK dependency surface. Pins the three
|
|
2235
2265
|
# ACP runtime deps to the current oracle versions (@agentclientprotocol/sdk
|
|
2236
|
-
# 1.3.0 + claude-agent-acp 0.
|
|
2266
|
+
# 1.3.0 + claude-agent-acp 0.62.0 + @anthropic-ai/sdk 0.100.1), locks the
|
|
2237
2267
|
# peer-resolution that keeps claude-agent-sdk satisfiable (0.100.1, not the
|
|
2238
2268
|
# stale 0.91.1), asserts the wire SDK still value-exports the symbols the raw
|
|
2239
2269
|
# turn needs (silent-rename gate), and forbids any source-level anthropic SDK
|
|
@@ -2350,6 +2380,33 @@ check_acp_carrier_augment() {
|
|
|
2350
2380
|
run_ts scripts/check-acp-carrier-augment.ts
|
|
2351
2381
|
}
|
|
2352
2382
|
|
|
2383
|
+
check_acp_cortex() {
|
|
2384
|
+
# Deterministic gate for the Cortex (Snowflake Cortex Code) ACP backend — the
|
|
2385
|
+
# first non-claude adapter on the rail, landed 0.13.0 on the CP0-measured
|
|
2386
|
+
# contract (docs/acp-backend-rail.md §4/§6/§11-8). The cortex source is one
|
|
2387
|
+
# `cortexAdapter` object (backend-adapter.ts) + its curated surface (models.ts)
|
|
2388
|
+
# + the dual-HOME overlay (overlay.ts); the 결합 규칙 requires the gate to land
|
|
2389
|
+
# WITH it, and §6 said EXTEND the check-acp-* family, so cortex's whole
|
|
2390
|
+
# deterministic axis lives here. Locks (each §11-8 D-pinned): the GLG-decided
|
|
2391
|
+
# 4-row curation rides real registry bases and the `cortex-` prefix routes to
|
|
2392
|
+
# cortexAdapter; launch is `cortex acp serve` with NO -m — the model is
|
|
2393
|
+
# enforced per turn via session/set_config_option with the native id (E);
|
|
2394
|
+
# CORTEX_HOME presence (empty included) refuses the spawn (D3); the dual-HOME
|
|
2395
|
+
# overlay isolates HOME+SNOWFLAKE_HOME per session key (P0-1: scope =
|
|
2396
|
+
# backend-passed resolveSessionKey, never ambient), passes through only
|
|
2397
|
+
# connections.toml / optional config.toml / credential_cache (D5/F — never the
|
|
2398
|
+
# whole cache, never skills; symlink-through, no copies — AGENTS §ACP Plugin
|
|
2399
|
+
# Boundary), authors autoUpdate:false (D4), and projects envelope-enriched
|
|
2400
|
+
# explicit servers into cortex/mcp.json with the real HOME restored on
|
|
2401
|
+
# entwurf-bridge alone (D9/D10), non-stdio failing loud; the
|
|
2402
|
+
# CORTEX_ACP_COMMAND override single-quotes shell-metachar connection tokens.
|
|
2403
|
+
# The gate self-manages the tsc-emit layer for the .js-suffixed backend-adapter
|
|
2404
|
+
# imports; no auth, no spawn, no live cortex needed. Kill-qualified via the
|
|
2405
|
+
# `acp-cortex` mutant lane under check-gate-qualification.
|
|
2406
|
+
section "ACP cortex backend (Snowflake Cortex Code — 1st non-claude adapter)"
|
|
2407
|
+
run_ts scripts/check-acp-cortex.ts
|
|
2408
|
+
}
|
|
2409
|
+
|
|
2353
2410
|
check_pack() {
|
|
2354
2411
|
# Dry-run tarball invariant gate for the public npm surface.
|
|
2355
2412
|
#
|
|
@@ -2834,18 +2891,45 @@ _check_pack_install_impl() {
|
|
|
2834
2891
|
echo "$loader_out" | tail -10 | sed 's/^/ /' >&2
|
|
2835
2892
|
return 1
|
|
2836
2893
|
fi
|
|
2837
|
-
# Verify the
|
|
2838
|
-
#
|
|
2839
|
-
#
|
|
2840
|
-
#
|
|
2841
|
-
|
|
2842
|
-
|
|
2843
|
-
|
|
2844
|
-
|
|
2845
|
-
|
|
2846
|
-
|
|
2847
|
-
|
|
2848
|
-
|
|
2894
|
+
# Verify the EXACT curated surface the installed package registers — both
|
|
2895
|
+
# backends (claude 2 rows + cortex 4 rows = 6), as a SET, not as anchors.
|
|
2896
|
+
#
|
|
2897
|
+
# Why exact-set and not `grep -q <id>`: the cortex ids CONTAIN the claude ids
|
|
2898
|
+
# as substrings (`cortex-claude-sonnet-5` matches a bare `claude-sonnet-5`
|
|
2899
|
+
# grep), so a substring probe could go green on a surface that dropped every
|
|
2900
|
+
# unprefixed Claude row. And an anchor-only probe cannot see a MISSING cortex
|
|
2901
|
+
# row at all — that is exactly the installed-consumer gap this assertion
|
|
2902
|
+
# closes: the source-side sets are pinned by check-acp-cortex /
|
|
2903
|
+
# check-acp-provider-surface, but only THIS gate proves the ids survive the
|
|
2904
|
+
# pack → install → pi-loader path into a real consumer's model list.
|
|
2905
|
+
#
|
|
2906
|
+
# Parse rows whose FIRST field is the provider `entwurf` (pi prints a
|
|
2907
|
+
# `provider model context …` table; the header row's first field is
|
|
2908
|
+
# `provider`, so it drops out) and take the second field as the model id.
|
|
2909
|
+
local loader_ids loader_expected
|
|
2910
|
+
loader_ids=$(awk '$1 == "entwurf" { print $2 }' <<<"$loader_out" | LC_ALL=C sort)
|
|
2911
|
+
loader_expected=$(printf '%s\n' \
|
|
2912
|
+
claude-opus-5 \
|
|
2913
|
+
claude-sonnet-5 \
|
|
2914
|
+
cortex-auto \
|
|
2915
|
+
cortex-claude-opus-5 \
|
|
2916
|
+
cortex-claude-sonnet-5 \
|
|
2917
|
+
cortex-openai-gpt-5.4 | LC_ALL=C sort)
|
|
2918
|
+
if [ "$loader_ids" != "$loader_expected" ]; then
|
|
2919
|
+
fail "[check-pack-install] installed provider model set drifted — expected exactly 6 curated ids (claude 2 + cortex 4):"
|
|
2920
|
+
echo " expected:" >&2
|
|
2921
|
+
echo "$loader_expected" | sed 's/^/ /' >&2
|
|
2922
|
+
echo " actual (entwurf rows):" >&2
|
|
2923
|
+
echo "${loader_ids:-<none>}" | sed 's/^/ /' >&2
|
|
2924
|
+
echo " raw loader output:" >&2
|
|
2925
|
+
echo "$loader_out" | tail -15 | sed 's/^/ /' >&2
|
|
2926
|
+
return 1
|
|
2927
|
+
fi
|
|
2928
|
+
# Name the set on SUCCESS too, not only in the failure branch — same principle as
|
|
2929
|
+
# the pinned-pi version assert above: a gate that cannot name what it proved has
|
|
2930
|
+
# proved nothing, and "6 rows" without the ids cannot be audited from a CI log.
|
|
2931
|
+
echo "[check-pack-install] pi loader smoke pass (entwurf registered; exact 6-row curated set: claude 2 + cortex 4):"
|
|
2932
|
+
echo "$loader_ids" | sed 's/^/ /'
|
|
2849
2933
|
|
|
2850
2934
|
# npm-managed neutral install regression — the README's PRIMARY install path is
|
|
2851
2935
|
# now `npm install @junghanacs/entwurf` (NOT `pi install npm:...`). This layout
|
|
@@ -3737,7 +3821,7 @@ wire_agy_bridge() {
|
|
|
3737
3821
|
# whatever agy the CI/dev host happens to have — production leaves it unset (= `command -v
|
|
3738
3822
|
# agy`, no regression). Same override spirit as agy-bridge.sh's AGY_MCP_CONFIG/AGY_BRIDGE_COMMAND.
|
|
3739
3823
|
if ! command -v "${AGY_BIN:-agy}" >/dev/null 2>&1; then
|
|
3740
|
-
echo "[setup] no agy on PATH — skipping agy bridge wiring (no state;
|
|
3824
|
+
echo "[setup] no agy on PATH — skipping agy bridge wiring (no state; this host runs no Antigravity)"
|
|
3741
3825
|
return 0
|
|
3742
3826
|
fi
|
|
3743
3827
|
section "agy bridge install (native harness detected: Antigravity)"
|
|
@@ -3757,12 +3841,13 @@ wire_agy_bridge() {
|
|
|
3757
3841
|
# reported as an mcp_config problem and sends the operator to repair the wrong file.
|
|
3758
3842
|
case "$out" in
|
|
3759
3843
|
*"permission refused (symlink)"*|*"permission invalid JSON"*|*"permission could not be granted"*)
|
|
3760
|
-
# The MCP server IS registered — only the allow
|
|
3761
|
-
# Ask, so the bridge works but stops for a y/n on EVERY
|
|
3844
|
+
# The MCP server IS registered — only the allow rules failed. agy defaults every mcp action to
|
|
3845
|
+
# Ask, so the bridge works but stops for a y/n on EVERY entwurf tool call. Half-wired, and said
|
|
3762
3846
|
# so: the explicit installer fails loud on this; setup only degrades it, never hides it.
|
|
3763
|
-
echo "[setup] WARN: agy settings.json could not take our permission
|
|
3764
|
-
echo "[setup] agy will prompt on every
|
|
3765
|
-
echo "[setup]
|
|
3847
|
+
echo "[setup] WARN: agy settings.json could not take our permission rules — bridge REGISTERED but NOT GRANTED." >&2
|
|
3848
|
+
echo "[setup] agy will prompt on every entwurf tool call until our narrow rules" >&2
|
|
3849
|
+
echo "[setup] ($(python3 "$REPO_DIR/scripts/agy-bridge-config.py" permission-rules 2>/dev/null || echo 'mcp(entwurf-bridge/<tool>)'))" >&2
|
|
3850
|
+
echo "[setup] are in its permissions.allow (see the line above for why). setup continues." >&2
|
|
3766
3851
|
;;
|
|
3767
3852
|
*"refused (symlink)"*)
|
|
3768
3853
|
echo "[setup] WARN: agy mcp_config is a symlink — someone else's SSOT (transitional)." >&2
|
|
@@ -3789,7 +3874,7 @@ wire_agy_bridge() {
|
|
|
3789
3874
|
# stable bin entwurf-agy-statusline, exposed by expose_dev_bin above.
|
|
3790
3875
|
wire_agy_statusline() {
|
|
3791
3876
|
if ! command -v "${AGY_BIN:-agy}" >/dev/null 2>&1; then
|
|
3792
|
-
echo "[setup] no agy on PATH — skipping agy statusLine wiring (no state;
|
|
3877
|
+
echo "[setup] no agy on PATH — skipping agy statusLine wiring (no state; this host runs no Antigravity)"
|
|
3793
3878
|
return 0
|
|
3794
3879
|
fi
|
|
3795
3880
|
section "agy statusLine install (native harness detected: Antigravity)"
|
|
@@ -3827,7 +3912,7 @@ wire_agy_statusline() {
|
|
|
3827
3912
|
# garden id after the first invocation.
|
|
3828
3913
|
wire_agy_hooks() {
|
|
3829
3914
|
if ! command -v "${AGY_BIN:-agy}" >/dev/null 2>&1; then
|
|
3830
|
-
echo "[setup] no agy on PATH — skipping agy hooks wiring (no state;
|
|
3915
|
+
echo "[setup] no agy on PATH — skipping agy hooks wiring (no state; this host runs no Antigravity)"
|
|
3831
3916
|
return 0
|
|
3832
3917
|
fi
|
|
3833
3918
|
section "agy hooks install (native harness detected: Antigravity)"
|
|
@@ -4329,6 +4414,9 @@ case "$cmd" in
|
|
|
4329
4414
|
smoke-acp-rgg-live)
|
|
4330
4415
|
smoke_acp_rgg_live
|
|
4331
4416
|
;;
|
|
4417
|
+
smoke-acp-cortex-live)
|
|
4418
|
+
smoke_acp_cortex_live
|
|
4419
|
+
;;
|
|
4332
4420
|
smoke-acp-socket-citizen-live)
|
|
4333
4421
|
smoke_acp_socket_citizen_live
|
|
4334
4422
|
;;
|
|
@@ -4356,9 +4444,6 @@ case "$cmd" in
|
|
|
4356
4444
|
check-entwurf-deliverability)
|
|
4357
4445
|
check_entwurf_deliverability
|
|
4358
4446
|
;;
|
|
4359
|
-
check-entwurf-mailbox-guard)
|
|
4360
|
-
check_entwurf_mailbox_guard
|
|
4361
|
-
;;
|
|
4362
4447
|
check-native-push-adapter)
|
|
4363
4448
|
check_native_push_adapter
|
|
4364
4449
|
;;
|
|
@@ -4445,6 +4530,56 @@ case "$cmd" in
|
|
|
4445
4530
|
# Offline + deterministic (deps: bash+python3).
|
|
4446
4531
|
(cd "$REPO_DIR" && bash scripts/smoke-agy-install-state.sh)
|
|
4447
4532
|
;;
|
|
4533
|
+
check-agy-permission-matrix)
|
|
4534
|
+
# The agy permission engine's CONTRACT SPACE as a literal table (55 cells + stated
|
|
4535
|
+
# exclusions R2/R4-R7): parser-state × operation × settings × ownership × precedence.
|
|
4536
|
+
# Every recent permission defect was an unenumerated cell of this matrix; this gate
|
|
4537
|
+
# states the axes and exhausts the meaningful product, with hand-written literal
|
|
4538
|
+
# expectations (oracle independence — nothing is read back from the SUT). Sandbox
|
|
4539
|
+
# per cell; offline + deterministic (deps: python3).
|
|
4540
|
+
(cd "$REPO_DIR" && python3 scripts/check-agy-permission-matrix.py)
|
|
4541
|
+
;;
|
|
4542
|
+
check-gate-qualification)
|
|
4543
|
+
# Kill-proof qualification — the gate-of-gates. Proves the committed defect mutants
|
|
4544
|
+
# (scripts/mutants/*.json) make their gates fail BOUNDED and FOR THE CLAIMED REASON
|
|
4545
|
+
# ([QK:<claim>] token on a failure line), inside an isolated snapshot repo under the
|
|
4546
|
+
# control→mutant→restore→control state machine; the real checkout is never written
|
|
4547
|
+
# (HEAD + work-surface content hash asserted identical before/after). The runner is negative-controlled
|
|
4548
|
+
# first: zero-match/multi-match/survived/wrong-reason/hang(+pgroup grandchild kill)/
|
|
4549
|
+
# control-red/impurity all must classify red before any real manifest counts.
|
|
4550
|
+
run_ts scripts/check-gate-qualification.ts
|
|
4551
|
+
;;
|
|
4552
|
+
check-probe-ordering)
|
|
4553
|
+
# §11-7 ordering-probe gate (docs/acp-backend-rail.md §11-7): the raw-client seam is
|
|
4554
|
+
# only admissible "bound by a gate asserting it issues the same calls, arguments, and
|
|
4555
|
+
# order as the backend's real sequence" — this is that gate. Sameness over a recording
|
|
4556
|
+
# fake + backend.ts SOURCE pins (order/clientInfo/timeouts/permission policy), phase
|
|
4557
|
+
# attribution (set-model included), the probe-mode fixture's wire instrumentation
|
|
4558
|
+
# (real child, raw JSON-RPC, no API), the shared log's contract at its door — envelope
|
|
4559
|
+
# (the evidence line's own runId/marker/sort axis cannot be rewritten by a payload) AND
|
|
4560
|
+
# payload (every field the classifier judges on is typed there) — and the PURE
|
|
4561
|
+
# paired-verdict truth table.
|
|
4562
|
+
run_ts scripts/check-probe-ordering.ts
|
|
4563
|
+
;;
|
|
4564
|
+
check-probe-cli-shim)
|
|
4565
|
+
# §11-7-c producer gate (docs/acp-backend-rail.md §11-7-c condition 5: "Byte-transparency,
|
|
4566
|
+
# backpressure, and exit/signal propagation are proved by a fake-CLI deterministic gate").
|
|
4567
|
+
# The shim sits on the production spawn path of a paid LIVE turn, so this drives it as a
|
|
4568
|
+
# REAL process against fake CLIs and asks what each defect would buy: fabricated absence
|
|
4569
|
+
# evidence (a malformed init reported as an empty name set, a boot report that does not
|
|
4570
|
+
# name what was actually exec'd), a destroyed turn (mangled bytes, a swallowed signal, a
|
|
4571
|
+
# crash reported as exit 0), or leaked operator state (a prefix env scrub, argv/env/prompt
|
|
4572
|
+
# body in the shared log). No API, no network, no cost.
|
|
4573
|
+
run_ts scripts/check-probe-cli-shim.ts
|
|
4574
|
+
;;
|
|
4575
|
+
smoke-acp-ordering-probe-live)
|
|
4576
|
+
# §11-7 ordering probe — LIVE paired-run instrument, OUT of pnpm check. Control
|
|
4577
|
+
# (delay=0, must be visible AND callable) + interventions D1/D2 against the SAME
|
|
4578
|
+
# pins/config/fixture; classifies A/A-withheld/B/C/D-<phase> or P0/I0, preserves
|
|
4579
|
+
# the shared NDJSON log + classification under .probe-artifacts/ (gitignored).
|
|
4580
|
+
# LIVE=1 ./run.sh smoke-acp-ordering-probe-live
|
|
4581
|
+
run_ts scripts/smoke-acp-ordering-probe-live.ts
|
|
4582
|
+
;;
|
|
4448
4583
|
smoke-agy-statusline-state)
|
|
4449
4584
|
# #46 Task 1 regression gate for the agy statusLine install adapter: install→doctor→uninstall
|
|
4450
4585
|
# in an ISOLATED HOME+XDG with a fake stable bin (entwurf-agy-statusline) + fake pgrep —
|
|
@@ -4717,6 +4852,9 @@ case "$cmd" in
|
|
|
4717
4852
|
check-acp-carrier-augment)
|
|
4718
4853
|
check_acp_carrier_augment
|
|
4719
4854
|
;;
|
|
4855
|
+
check-acp-cortex)
|
|
4856
|
+
check_acp_cortex
|
|
4857
|
+
;;
|
|
4720
4858
|
check-fresh-cut-gate)
|
|
4721
4859
|
# SOURCE cell of the generation-boundary proof: a host whose store the live
|
|
4722
4860
|
# schema cannot read must be refused BEFORE any write, told the fresh-cut
|