@junghanacs/entwurf 0.13.0 → 0.14.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 +52 -17
- package/BASELINE.md +60 -206
- package/CHANGELOG.md +64 -0
- package/CONTRIBUTING.md +14 -10
- package/DELIVERY.md +118 -261
- package/README.md +91 -431
- package/VERIFY.md +74 -95
- package/demo/README.md +1 -1
- package/demo/demo-baseline.sh +1 -3
- package/demo/demo.sh +2 -5
- package/docs/acp-backend-rail.md +236 -0
- package/docs/external-mcp-host.md +131 -0
- package/docs/fresh-cut-policy.md +99 -0
- package/docs/setup-clean-host.md +124 -328
- package/mcp/entwurf-bridge/dist/mcp/entwurf-bridge/src/index.js +160 -67
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/acp-client.js +12 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/backend-adapter.js +11 -10
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/config.js +1 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/engraving.js +42 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/models.js +4 -4
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/overlay.js +11 -9
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-control-rpc.js +7 -5
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-core.js +13 -14
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-resume-args.js +45 -40
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-contract.js +117 -95
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-decider.js +23 -57
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-lock.js +16 -7
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-production.js +5 -53
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-release.js +21 -36
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-runner.js +3 -15
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-send-fallback.js +12 -11
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-send.js +2 -7
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-surface.js +30 -67
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-visible-resume.js +256 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/meta-session.js +91 -5
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-fresh-call.js +258 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-launch.js +202 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-placement.js +289 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-resume-call.js +170 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/resume-launch-identity.js +136 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/session-id.js +8 -5
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/socket-discovery.js +3 -3
- package/mcp/entwurf-bridge/dist/scripts/meta-facts.js +51 -0
- package/mcp/entwurf-bridge/dist/scripts/new-session-id.js +9 -4
- package/mcp/entwurf-bridge/src/index.ts +176 -67
- package/mcp/entwurf-bridge/start.sh +2 -2
- package/mcp/entwurf-bridge/test.sh +23 -9
- package/mcp/entwurf-bridge/tsconfig.build.json +11 -2
- package/package.json +25 -11
- package/pi-extensions/entwurf-control.ts +220 -71
- package/pi-extensions/lib/acp/acp-client.ts +22 -0
- package/pi-extensions/lib/acp/augment.ts +42 -3
- package/pi-extensions/lib/acp/backend-adapter.ts +12 -11
- package/pi-extensions/lib/acp/backend.ts +366 -38
- package/pi-extensions/lib/acp/config.ts +1 -1
- package/pi-extensions/lib/acp/engraving.ts +43 -1
- package/pi-extensions/lib/acp/event-mapper.ts +16 -13
- package/pi-extensions/lib/acp/models.ts +4 -4
- package/pi-extensions/lib/acp/overlay.ts +11 -9
- package/pi-extensions/lib/entwurf-control-rpc.ts +7 -5
- package/pi-extensions/lib/entwurf-core.ts +15 -15
- package/pi-extensions/lib/entwurf-resume-args.ts +41 -52
- package/pi-extensions/lib/entwurf-v2-contract-schema.ts +1 -1
- package/pi-extensions/lib/entwurf-v2-contract.ts +120 -99
- package/pi-extensions/lib/entwurf-v2-decider.ts +30 -91
- package/pi-extensions/lib/entwurf-v2-lock.ts +16 -7
- package/pi-extensions/lib/entwurf-v2-production.ts +4 -78
- package/pi-extensions/lib/entwurf-v2-release.ts +25 -49
- package/pi-extensions/lib/entwurf-v2-runner.ts +6 -21
- package/pi-extensions/lib/entwurf-v2-send-fallback.ts +12 -11
- package/pi-extensions/lib/entwurf-v2-send.ts +2 -7
- package/pi-extensions/lib/entwurf-v2-surface.ts +36 -76
- package/pi-extensions/lib/entwurf-v2-visible-resume.ts +370 -0
- package/pi-extensions/lib/meta-session.ts +93 -5
- package/pi-extensions/lib/mux-fresh-call.ts +328 -0
- package/pi-extensions/lib/mux-launch.ts +267 -0
- package/pi-extensions/lib/mux-placement.ts +387 -0
- package/pi-extensions/lib/mux-resume-call.ts +221 -0
- package/pi-extensions/lib/resume-launch-identity.ts +162 -0
- package/pi-extensions/lib/session-id.js +8 -5
- package/pi-extensions/lib/socket-discovery.ts +3 -3
- package/prompts/engraving.md +13 -5
- package/run.sh +688 -282
- package/scripts/agy-bridge-config.py +5 -1
- package/scripts/check-acp-backend-preflight.ts +1 -1
- package/scripts/check-acp-carrier-augment.ts +246 -10
- package/scripts/check-acp-cortex.ts +5 -5
- package/scripts/check-acp-overlay.ts +13 -3
- package/scripts/check-acp-prompt-lifecycle.ts +565 -0
- package/scripts/check-acp-stop-reason.ts +342 -0
- package/scripts/check-acp-stream-hooks.ts +504 -0
- package/scripts/check-elapsed.sh +25 -0
- package/scripts/check-entwurf-bridge-boot.ts +51 -4
- package/scripts/check-entwurf-bridge-pi-free.ts +6 -5
- package/scripts/check-entwurf-control-rpc.ts +4 -3
- package/scripts/check-entwurf-resume-args.ts +72 -70
- package/scripts/check-entwurf-session-identity.ts +14 -10
- package/scripts/check-entwurf-v2-contract.ts +34 -59
- package/scripts/check-entwurf-v2-decider.ts +17 -177
- package/scripts/check-entwurf-v2-lock.ts +5 -2
- package/scripts/check-entwurf-v2-matrix.ts +3 -53
- package/scripts/check-entwurf-v2-production.ts +2 -91
- package/scripts/check-entwurf-v2-release.ts +10 -105
- package/scripts/check-entwurf-v2-runner.ts +4 -85
- package/scripts/check-entwurf-v2-send-fallback.ts +5 -6
- package/scripts/check-entwurf-v2-send.ts +0 -28
- package/scripts/check-entwurf-v2-surface.ts +198 -128
- package/scripts/check-entwurf-v2-visible-resume.ts +445 -0
- package/scripts/check-fresh-cut-gate.sh +1 -1
- package/scripts/check-gate-qualification.ts +101 -7
- package/scripts/check-install-container.sh +10 -2
- package/scripts/check-install-surface.ts +1 -1
- package/scripts/check-keyset-overlap.py +1 -1
- package/scripts/check-meta-facts.ts +249 -0
- package/scripts/check-meta-identity-consumers.ts +1 -1
- package/scripts/check-meta-session.ts +169 -0
- package/scripts/check-mux-launch-tmux.ts +316 -0
- package/scripts/check-mux-launch.ts +288 -0
- package/scripts/check-mux-launcher-fence.ts +264 -0
- package/scripts/check-mux-parent-artifact.ts +195 -0
- package/scripts/check-mux-placement-tmux.ts +322 -0
- package/scripts/check-mux-placement.ts +323 -0
- package/scripts/check-mux-resume-call.ts +282 -0
- package/scripts/check-probe-cli-shim.ts +25 -22
- package/scripts/check-probe-ordering.ts +121 -81
- package/scripts/check-release-gate-outcomes.ts +452 -0
- package/scripts/check-resume-launch-identity.ts +244 -0
- package/scripts/check-socket-discovery.ts +1 -1
- package/scripts/fixtures/mux-parent-transcript.scrubbed.jsonl +3 -0
- package/scripts/inventory-verification-surface.ts +349 -0
- package/scripts/lib/claude-launcher-fence.ts +322 -0
- package/scripts/lib/live-skip.ts +33 -0
- package/scripts/lib/mutation-qualify.ts +109 -3
- package/scripts/lib/probe-acp-turn.ts +33 -12
- package/scripts/lib/step-outcome.sh +88 -0
- package/scripts/meta-bridge-doctor.sh +6 -8
- package/scripts/meta-facts.ts +60 -0
- package/scripts/mutants/acp-augment.json +106 -0
- package/scripts/mutants/acp-cortex.json +2 -2
- package/scripts/mutants/acp-overlay.json +17 -0
- package/scripts/mutants/acp-prompt-lifecycle.json +100 -0
- package/scripts/mutants/acp-stop-reason.json +80 -0
- package/scripts/mutants/acp-stream-hooks.json +158 -0
- package/scripts/mutants/bridge-boot-resume.json +45 -0
- package/scripts/mutants/meta-facts.json +50 -0
- package/scripts/mutants/meta-identity.json +36 -0
- package/scripts/mutants/mux-boundary.json +196 -0
- package/scripts/mutants/mux-fresh-call.json +185 -0
- package/scripts/mutants/mux-launcher-fence.json +123 -0
- package/scripts/mutants/mux-parent-artifact.json +39 -0
- package/scripts/mutants/mux-resume-call.json +148 -0
- package/scripts/mutants/probe-ordering.json +6 -1021
- package/scripts/mutants/release-gate.json +140 -0
- package/scripts/mutants/resume-args.json +76 -0
- package/scripts/mutants/resume-launch-identity.json +96 -0
- package/scripts/mutants/v2-surface.json +74 -23
- package/scripts/mutants/v2-visible-resume.json +215 -0
- package/scripts/new-session-id.ts +9 -4
- package/scripts/smoke-acp-bundled-mcp-live.ts +4 -3
- package/scripts/smoke-acp-carrier-augment-live.ts +2 -2
- package/scripts/smoke-acp-cortex-live.ts +8 -14
- package/scripts/smoke-acp-long-turn-live.ts +185 -0
- package/scripts/smoke-acp-mcp-live.ts +2 -2
- package/scripts/smoke-acp-memory-containment-live.ts +2 -2
- package/scripts/smoke-acp-ordering-probe-live.ts +2 -2
- package/scripts/smoke-acp-overlay-live.ts +2 -2
- package/scripts/smoke-acp-provider-live.ts +2 -2
- package/scripts/smoke-acp-raw-turn-live.ts +3 -3
- package/scripts/smoke-acp-session-reuse-live.ts +2 -2
- package/scripts/smoke-acp-skill-live.ts +2 -2
- package/scripts/smoke-acp-socket-citizen-live.ts +4 -3
- package/scripts/smoke-acp-v2-send-live.ts +4 -3
- package/scripts/smoke-agy-native-push-live.ts +10 -20
- package/scripts/smoke-claude-native-resume-live.sh +13 -3
- package/scripts/smoke-entwurf-chain-live.ts +352 -0
- package/scripts/smoke-entwurf-v2-matrix-live.ts +3 -3
- package/scripts/smoke-meta-honesty.sh +1 -1
- package/scripts/smoke-meta-install-state.sh +4 -0
- package/scripts/smoke-mux-fresh-call-live.ts +365 -0
- package/scripts/smoke-mux-lifecycle-live.ts +1136 -0
- package/scripts/smoke-pi-attach.ts +1 -1
- package/scripts/smoke-user-scope-citizen.sh +1 -1
- package/scripts/tsconfig.json +1 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-preflight.js +0 -160
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-spawn-production.js +0 -273
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-spawn.js +0 -216
- package/pi-extensions/lib/entwurf-v2-spawn-production.ts +0 -373
- package/pi-extensions/lib/entwurf-v2-spawn.ts +0 -323
- package/scripts/check-acp-sdk-surface.ts +0 -236
- package/scripts/check-entwurf-v2-spawn-production.ts +0 -551
- package/scripts/check-entwurf-v2-spawn.ts +0 -399
- package/scripts/smoke-entwurf-v2-spawn-live.ts +0 -188
- package/scripts/smoke-entwurf-v2-spawn-resume-live.ts +0 -469
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"lane": "acp-stream-hooks",
|
|
4
|
+
"mutants": [
|
|
5
|
+
{
|
|
6
|
+
"claim": "ACPHOOK-PAYLOAD-EXACT-WIRE",
|
|
7
|
+
"title": "the new-turn send site bypasses the payload hook entirely — the pi-vertex defect: extensions hooking before_provider_request silently observe nothing",
|
|
8
|
+
"subject": "pi-extensions/lib/acp/backend.ts",
|
|
9
|
+
"find": [
|
|
10
|
+
"\t\t\tconst wireParams = await applyProviderPayloadHook(options, { sessionId: acpSessionId, prompt }, model);"
|
|
11
|
+
],
|
|
12
|
+
"replace": ["\t\t\tconst wireParams = { sessionId: acpSessionId, prompt };"],
|
|
13
|
+
"gate": ["bash", "run.sh", "check-acp-stream-hooks"],
|
|
14
|
+
"timeoutSeconds": 300,
|
|
15
|
+
"signature": "[QK:ACPHOOK-PAYLOAD-EXACT-WIRE]",
|
|
16
|
+
"signatureSource": "scripts/check-acp-stream-hooks.ts"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"claim": "ACPHOOK-REPLACEMENT-ON-WIRE",
|
|
20
|
+
"title": "the helper validates the replacement and then discards it — the original params always cross the wire, so a payload-rewriting extension silently does nothing",
|
|
21
|
+
"subject": "pi-extensions/lib/acp/backend.ts",
|
|
22
|
+
"find": ["\treturn replacement as T;"],
|
|
23
|
+
"replace": ["\treturn params;"],
|
|
24
|
+
"gate": ["bash", "run.sh", "check-acp-stream-hooks"],
|
|
25
|
+
"timeoutSeconds": 300,
|
|
26
|
+
"signature": "[QK:ACPHOOK-REPLACEMENT-ON-WIRE]",
|
|
27
|
+
"signatureSource": "scripts/check-acp-stream-hooks.ts"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"claim": "ACPHOOK-REUSE-PARITY",
|
|
31
|
+
"title": "the reuse send site bypasses the hook, so resident-session requests become invisible to extensions while cold turns stay covered",
|
|
32
|
+
"subject": "pi-extensions/lib/acp/backend.ts",
|
|
33
|
+
"find": [
|
|
34
|
+
"\t\t\tconst wireParams = await applyProviderPayloadHook(options, { sessionId: session.acpSessionId, prompt }, model);"
|
|
35
|
+
],
|
|
36
|
+
"replace": ["\t\t\tconst wireParams = { sessionId: session.acpSessionId, prompt };"],
|
|
37
|
+
"gate": ["bash", "run.sh", "check-acp-stream-hooks"],
|
|
38
|
+
"timeoutSeconds": 300,
|
|
39
|
+
"signature": "[QK:ACPHOOK-REUSE-PARITY]",
|
|
40
|
+
"signatureSource": "scripts/check-acp-stream-hooks.ts"
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"claim": "ACPHOOK-REJECTION-FAILS-LOUD",
|
|
44
|
+
"title": "the new-turn call site silently catches a hook rejection and falls back to the original params — a broken extension keeps 'working'",
|
|
45
|
+
"subject": "pi-extensions/lib/acp/backend.ts",
|
|
46
|
+
"find": [
|
|
47
|
+
"\t\t\tconst wireParams = await applyProviderPayloadHook(options, { sessionId: acpSessionId, prompt }, model);"
|
|
48
|
+
],
|
|
49
|
+
"replace": [
|
|
50
|
+
"\t\t\tconst wireParams = await applyProviderPayloadHook(options, { sessionId: acpSessionId, prompt }, model).catch(",
|
|
51
|
+
"\t\t\t\t() => ({ sessionId: acpSessionId, prompt }),",
|
|
52
|
+
"\t\t\t);"
|
|
53
|
+
],
|
|
54
|
+
"gate": ["bash", "run.sh", "check-acp-stream-hooks"],
|
|
55
|
+
"timeoutSeconds": 300,
|
|
56
|
+
"signature": "[QK:ACPHOOK-REJECTION-FAILS-LOUD]",
|
|
57
|
+
"signatureSource": "scripts/check-acp-stream-hooks.ts"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"claim": "ACPHOOK-INVALID-REPLACEMENT-REFUSED",
|
|
61
|
+
"title": "the non-null/non-array object shape check is dropped, so a scalar replacement is refused for the wrong reason (or not at all) instead of by name",
|
|
62
|
+
"subject": "pi-extensions/lib/acp/backend.ts",
|
|
63
|
+
"find": [
|
|
64
|
+
"\tif (typeof replacement !== \"object\" || replacement === null || Array.isArray(replacement)) {",
|
|
65
|
+
"\t\tthrow new Error(",
|
|
66
|
+
"\t\t\t\"entwurf: before_provider_request returned a non-object replacement — the ACP prompt payload must stay a non-null, non-array object\",",
|
|
67
|
+
"\t\t);",
|
|
68
|
+
"\t}"
|
|
69
|
+
],
|
|
70
|
+
"replace": ["\t// a JS extension can return anything; the sessionId check below is the real guard"],
|
|
71
|
+
"gate": ["bash", "run.sh", "check-acp-stream-hooks"],
|
|
72
|
+
"timeoutSeconds": 300,
|
|
73
|
+
"signature": "[QK:ACPHOOK-INVALID-REPLACEMENT-REFUSED]",
|
|
74
|
+
"signatureSource": "scripts/check-acp-stream-hooks.ts"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"claim": "ACPHOOK-EMPTY-PROMPT-REFUSED",
|
|
78
|
+
"title": "the non-empty prompt invariant is dropped from replacement validation, so an extension can rewrite the turn into an empty ACP send",
|
|
79
|
+
"subject": "pi-extensions/lib/acp/backend.ts",
|
|
80
|
+
"find": [
|
|
81
|
+
"\tconst replacementPrompt = (replacement as { prompt?: unknown }).prompt;",
|
|
82
|
+
"\tif (!Array.isArray(replacementPrompt) || replacementPrompt.length === 0) {",
|
|
83
|
+
"\t\tthrow new Error(",
|
|
84
|
+
"\t\t\t\"entwurf: before_provider_request returned a replacement without a non-empty prompt array — an empty ACP prompt cannot be sent\",",
|
|
85
|
+
"\t\t);",
|
|
86
|
+
"\t}"
|
|
87
|
+
],
|
|
88
|
+
"replace": ["\t// the send sites already refuse an empty BUILT prompt; trust the replacement"],
|
|
89
|
+
"gate": ["bash", "run.sh", "check-acp-stream-hooks"],
|
|
90
|
+
"timeoutSeconds": 300,
|
|
91
|
+
"signature": "[QK:ACPHOOK-EMPTY-PROMPT-REFUSED]",
|
|
92
|
+
"signatureSource": "scripts/check-acp-stream-hooks.ts"
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"claim": "ACPHOOK-SESSIONID-TAMPER-REFUSED",
|
|
96
|
+
"title": "the sessionId invariant is dropped under a literal reading of 'use any returned replacement payload' — the prompt is delivered to a session entwurf never bootstrapped",
|
|
97
|
+
"subject": "pi-extensions/lib/acp/backend.ts",
|
|
98
|
+
"find": [
|
|
99
|
+
"\tif ((replacement as { sessionId?: unknown }).sessionId !== params.sessionId) {",
|
|
100
|
+
"\t\tthrow new Error(",
|
|
101
|
+
"\t\t\t\"entwurf: before_provider_request changed the ACP sessionId — entwurf cannot truthfully deliver to a session it did not bootstrap; prompt rewriting is allowed, session identity is not\",",
|
|
102
|
+
"\t\t);",
|
|
103
|
+
"\t}"
|
|
104
|
+
],
|
|
105
|
+
"replace": ["\t// upstream says use any returned replacement payload verbatim"],
|
|
106
|
+
"gate": ["bash", "run.sh", "check-acp-stream-hooks"],
|
|
107
|
+
"timeoutSeconds": 300,
|
|
108
|
+
"signature": "[QK:ACPHOOK-SESSIONID-TAMPER-REFUSED]",
|
|
109
|
+
"signatureSource": "scripts/check-acp-stream-hooks.ts"
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"claim": "ACPHOOK-ABORT-DURING-HOOK-WINS",
|
|
113
|
+
"title": "the post-hook abort recheck is dropped, so an abort raised during a slow handler still sends the prompt to the wire",
|
|
114
|
+
"subject": "pi-extensions/lib/acp/backend.ts",
|
|
115
|
+
"find": [
|
|
116
|
+
"\t\t\tconst wireParams = await applyProviderPayloadHook(options, { sessionId: acpSessionId, prompt }, model);",
|
|
117
|
+
"\t\t\tif (signal?.aborted) throw new Error(\"aborted during payload hook\");"
|
|
118
|
+
],
|
|
119
|
+
"replace": [
|
|
120
|
+
"\t\t\tconst wireParams = await applyProviderPayloadHook(options, { sessionId: acpSessionId, prompt }, model);"
|
|
121
|
+
],
|
|
122
|
+
"gate": ["bash", "run.sh", "check-acp-stream-hooks"],
|
|
123
|
+
"timeoutSeconds": 300,
|
|
124
|
+
"signature": "[QK:ACPHOOK-ABORT-DURING-HOOK-WINS]",
|
|
125
|
+
"signatureSource": "scripts/check-acp-stream-hooks.ts"
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
"claim": "ACPHOOK-REUSE-ABORT-WINS",
|
|
129
|
+
"title": "the REUSE call site's post-hook abort recheck is dropped, so an abort raised during a slow handler still sends a second prompt to the resident session",
|
|
130
|
+
"subject": "pi-extensions/lib/acp/backend.ts",
|
|
131
|
+
"find": [
|
|
132
|
+
"\t\t\tconst wireParams = await applyProviderPayloadHook(options, { sessionId: session.acpSessionId, prompt }, model);",
|
|
133
|
+
"\t\t\tif (signal?.aborted) throw new Error(\"aborted during payload hook\");"
|
|
134
|
+
],
|
|
135
|
+
"replace": [
|
|
136
|
+
"\t\t\tconst wireParams = await applyProviderPayloadHook(options, { sessionId: session.acpSessionId, prompt }, model);"
|
|
137
|
+
],
|
|
138
|
+
"gate": ["bash", "run.sh", "check-acp-stream-hooks"],
|
|
139
|
+
"timeoutSeconds": 300,
|
|
140
|
+
"signature": "[QK:ACPHOOK-REUSE-ABORT-WINS]",
|
|
141
|
+
"signatureSource": "scripts/check-acp-stream-hooks.ts"
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
"claim": "ACPHOOK-ONRESPONSE-NEVER-CALLED",
|
|
145
|
+
"title": "someone 'completes' the hook contract by fabricating an HTTP 200 response on turn success — exactly the false evidence the exemption exists to forbid",
|
|
146
|
+
"subject": "pi-extensions/lib/acp/backend.ts",
|
|
147
|
+
"find": ["\tfunction finishSuccess(promptResult: { stopReason?: string }): void {"],
|
|
148
|
+
"replace": [
|
|
149
|
+
"\tfunction finishSuccess(promptResult: { stopReason?: string }): void {",
|
|
150
|
+
"\t\tvoid options?.onResponse?.({ status: 200, headers: {} }, model);"
|
|
151
|
+
],
|
|
152
|
+
"gate": ["bash", "run.sh", "check-acp-stream-hooks"],
|
|
153
|
+
"timeoutSeconds": 300,
|
|
154
|
+
"signature": "[QK:ACPHOOK-ONRESPONSE-NEVER-CALLED]",
|
|
155
|
+
"signatureSource": "scripts/check-acp-stream-hooks.ts"
|
|
156
|
+
}
|
|
157
|
+
]
|
|
158
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"lane": "bridge-boot-resume",
|
|
4
|
+
"mutants": [
|
|
5
|
+
{
|
|
6
|
+
"claim": "BRIDGEBOOT-RESUME-CALL-REGISTERED",
|
|
7
|
+
"title": "the resume verb is imported but never registered — invisible to every host, while every import-level assertion stays green",
|
|
8
|
+
"subject": "mcp/entwurf-bridge/src/index.ts",
|
|
9
|
+
"find": ["server.tool(\n\t\"entwurf_resume_call\","],
|
|
10
|
+
"replace": [
|
|
11
|
+
"const _unregisteredResumeTool = (...a: unknown[]) => void a;\n_unregisteredResumeTool(\n\t\"entwurf_resume_call\","
|
|
12
|
+
],
|
|
13
|
+
"gate": ["bash", "run.sh", "check-entwurf-bridge-boot"],
|
|
14
|
+
"timeoutSeconds": 120,
|
|
15
|
+
"signature": "[QK:BRIDGEBOOT-RESUME-CALL-REGISTERED]",
|
|
16
|
+
"signatureSource": "scripts/check-entwurf-bridge-boot.ts"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"claim": "BRIDGEBOOT-RESUME-CALL-TARGET-ONLY",
|
|
20
|
+
"title": "a model knob is added to the resume schema, giving the caller a second way to decide what a resumed citizen is after the record already decided",
|
|
21
|
+
"subject": "mcp/entwurf-bridge/src/index.ts",
|
|
22
|
+
"find": ["\t\t\t.describe(\"Garden id of the DORMANT pi citizen to reopen (discover with entwurf_peers).\"),"],
|
|
23
|
+
"replace": [
|
|
24
|
+
"\t\t\t.describe(\"Garden id of the DORMANT pi citizen to reopen (discover with entwurf_peers).\"),\n\t\tmodel: z.string().optional().describe(\"Override the recorded model.\"),"
|
|
25
|
+
],
|
|
26
|
+
"gate": ["bash", "run.sh", "check-entwurf-bridge-boot"],
|
|
27
|
+
"timeoutSeconds": 120,
|
|
28
|
+
"signature": "[QK:BRIDGEBOOT-RESUME-CALL-TARGET-ONLY]",
|
|
29
|
+
"signatureSource": "scripts/check-entwurf-bridge-boot.ts"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"claim": "BRIDGEBOOT-PUBLIC-SURFACE-EXACT-SET",
|
|
33
|
+
"title": "a verb no assertion happens to name (entwurf_fresh_call) is imported but never registered — the public surface silently shrinks while every named check stays green",
|
|
34
|
+
"subject": "mcp/entwurf-bridge/src/index.ts",
|
|
35
|
+
"find": ["server.tool(\n\t\"entwurf_fresh_call\","],
|
|
36
|
+
"replace": [
|
|
37
|
+
"const _unregisteredFreshCallTool = (...a: unknown[]) => void a;\n_unregisteredFreshCallTool(\n\t\"entwurf_fresh_call\","
|
|
38
|
+
],
|
|
39
|
+
"gate": ["bash", "run.sh", "check-entwurf-bridge-boot"],
|
|
40
|
+
"timeoutSeconds": 120,
|
|
41
|
+
"signature": "[QK:BRIDGEBOOT-PUBLIC-SURFACE-EXACT-SET]",
|
|
42
|
+
"signatureSource": "scripts/check-entwurf-bridge-boot.ts"
|
|
43
|
+
}
|
|
44
|
+
]
|
|
45
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"lane": "meta-facts",
|
|
4
|
+
"mutants": [
|
|
5
|
+
{
|
|
6
|
+
"claim": "MF-EXIT-UNREADABLE",
|
|
7
|
+
"title": "answering an unreadable store with exit 0 makes an unreadable host look like an empty one — the false-success class the exit contract exists to refuse (#65)",
|
|
8
|
+
"subject": "scripts/meta-facts.ts",
|
|
9
|
+
"find": ["\tprocess.exit(3); // see the EXIT CONTRACT above: 3 = unreadable store, never an empty one"],
|
|
10
|
+
"replace": ["\tprocess.exit(0); // see the EXIT CONTRACT above: 3 = unreadable store, never an empty one"],
|
|
11
|
+
"gate": ["bash", "run.sh", "check-meta-facts"],
|
|
12
|
+
"timeoutSeconds": 120,
|
|
13
|
+
"signature": "[QK:MF-EXIT-UNREADABLE]",
|
|
14
|
+
"signatureSource": "scripts/check-meta-facts.ts"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"claim": "MF-FULL-V3-JOIN",
|
|
18
|
+
"title": "dropping the kept identities from the projection empties the join while still reporting a certified-looking store (#65 wrong fact)",
|
|
19
|
+
"subject": "scripts/meta-facts.ts",
|
|
20
|
+
"find": ["\t\t{ schemaVersion: 1, storeDir: facts.dir, citizens: facts.identities, defects: facts.errors },"],
|
|
21
|
+
"replace": ["\t\t{ schemaVersion: 1, storeDir: facts.dir, citizens: [], defects: facts.errors },"],
|
|
22
|
+
"gate": ["bash", "run.sh", "check-meta-facts"],
|
|
23
|
+
"timeoutSeconds": 120,
|
|
24
|
+
"signature": "[QK:MF-FULL-V3-JOIN]",
|
|
25
|
+
"signatureSource": "scripts/check-meta-facts.ts"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"claim": "MF-DEFECTS-IN-BAND",
|
|
29
|
+
"title": "dropping the defect list shows a store the certification refuses as clean — the decayed-copy failure mode this surface exists to end (#65 wrong fact)",
|
|
30
|
+
"subject": "scripts/meta-facts.ts",
|
|
31
|
+
"find": ["\t\t{ schemaVersion: 1, storeDir: facts.dir, citizens: facts.identities, defects: facts.errors },"],
|
|
32
|
+
"replace": ["\t\t{ schemaVersion: 1, storeDir: facts.dir, citizens: facts.identities, defects: [] },"],
|
|
33
|
+
"gate": ["bash", "run.sh", "check-meta-facts"],
|
|
34
|
+
"timeoutSeconds": 120,
|
|
35
|
+
"signature": "[QK:MF-DEFECTS-IN-BAND]",
|
|
36
|
+
"signatureSource": "scripts/check-meta-facts.ts"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"claim": "MF-USAGE",
|
|
40
|
+
"title": "disabling the argv guard makes extra positional args silently read the first as a store dir instead of refusing usage (#65)",
|
|
41
|
+
"subject": "scripts/meta-facts.ts",
|
|
42
|
+
"find": ["if (process.argv.length > 3 || (arg !== undefined && arg.startsWith(\"-\"))) {"],
|
|
43
|
+
"replace": ["if (false) {"],
|
|
44
|
+
"gate": ["bash", "run.sh", "check-meta-facts"],
|
|
45
|
+
"timeoutSeconds": 120,
|
|
46
|
+
"signature": "[QK:MF-USAGE]",
|
|
47
|
+
"signatureSource": "scripts/check-meta-facts.ts"
|
|
48
|
+
}
|
|
49
|
+
]
|
|
50
|
+
}
|
|
@@ -12,6 +12,42 @@
|
|
|
12
12
|
"timeoutSeconds": 120,
|
|
13
13
|
"signature": "[QK:META-FIFO-NONBLOCK]",
|
|
14
14
|
"signatureSource": "scripts/check-meta-identity-consumers.ts"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"claim": "META-CREATE-EXCLUSIVE",
|
|
18
|
+
"title": "reverting the exclusive CREATE publish link to rename silently replaces an existing citizen record on a garden-id collision (#66)",
|
|
19
|
+
"subject": "pi-extensions/lib/meta-session.ts",
|
|
20
|
+
"find": ["\t\tfs.linkSync(tmp, file);"],
|
|
21
|
+
"replace": ["\t\tfs.renameSync(tmp, file);"],
|
|
22
|
+
"gate": ["bash", "run.sh", "check-meta-session"],
|
|
23
|
+
"timeoutSeconds": 120,
|
|
24
|
+
"signature": "[QK:META-CREATE-EXCLUSIVE]",
|
|
25
|
+
"signatureSource": "scripts/check-meta-session.ts"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"claim": "META-CREATE-WIRING",
|
|
29
|
+
"title": "routing the CREATE action back through the replacing attach write reopens the silent-overwrite path at the upsert choke point (#66)",
|
|
30
|
+
"subject": "pi-extensions/lib/meta-session.ts",
|
|
31
|
+
"find": [
|
|
32
|
+
"\tif (decision.action === \"create\") publishExclusiveIdentity(file, decision.record);",
|
|
33
|
+
"\telse atomicWriteIdentity(file, decision.record);"
|
|
34
|
+
],
|
|
35
|
+
"replace": ["\tatomicWriteIdentity(file, decision.record);"],
|
|
36
|
+
"gate": ["bash", "run.sh", "check-meta-session"],
|
|
37
|
+
"timeoutSeconds": 120,
|
|
38
|
+
"signature": "[QK:META-CREATE-WIRING]",
|
|
39
|
+
"signatureSource": "scripts/check-meta-session.ts"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"claim": "META-CREATE-PUBLISHED-CLEANUP",
|
|
43
|
+
"title": "swallowing a post-publish temp-cleanup failure reports a clean create while a stale tmp lingers beside the record (#66 false success)",
|
|
44
|
+
"subject": "pi-extensions/lib/meta-session.ts",
|
|
45
|
+
"find": ["\t\tif ((err as { code?: unknown }).code === \"ENOENT\") return;"],
|
|
46
|
+
"replace": ["\t\treturn;"],
|
|
47
|
+
"gate": ["bash", "run.sh", "check-meta-session"],
|
|
48
|
+
"timeoutSeconds": 120,
|
|
49
|
+
"signature": "[QK:META-CREATE-PUBLISHED-CLEANUP]",
|
|
50
|
+
"signatureSource": "scripts/check-meta-session.ts"
|
|
15
51
|
}
|
|
16
52
|
]
|
|
17
53
|
}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"lane": "mux-boundary",
|
|
4
|
+
"mutants": [
|
|
5
|
+
{
|
|
6
|
+
"claim": "V2-DELIVERY-EXCLUDES-MUX",
|
|
7
|
+
"title": "a mux launch handle is reintroduced as an entwurf_v2 delivery receipt transport",
|
|
8
|
+
"subject": "pi-extensions/lib/entwurf-v2-contract.ts",
|
|
9
|
+
"find": [
|
|
10
|
+
"export const ENTWURF_V2_TRANSPORTS = [\"control-socket\", \"meta-mailbox\", \"native-push\"] as const;"
|
|
11
|
+
],
|
|
12
|
+
"replace": [
|
|
13
|
+
"export const ENTWURF_V2_TRANSPORTS = [",
|
|
14
|
+
"\t\"control-socket\",",
|
|
15
|
+
"\t\"tmux-live\",",
|
|
16
|
+
"\t\"meta-mailbox\",",
|
|
17
|
+
"\t\"native-push\",",
|
|
18
|
+
"] as const;"
|
|
19
|
+
],
|
|
20
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-contract"],
|
|
21
|
+
"timeoutSeconds": 60,
|
|
22
|
+
"signature": "[QK:V2-DELIVERY-EXCLUDES-MUX]",
|
|
23
|
+
"signatureSource": "scripts/check-entwurf-v2-contract.ts"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"claim": "MUX-ANCHOR-REQUIRED",
|
|
27
|
+
"title": "TMUX is no longer required, so a caller holding only a pane id makes a bare tmux resolve to the DEFAULT server",
|
|
28
|
+
"subject": "pi-extensions/lib/mux-placement.ts",
|
|
29
|
+
"find": [
|
|
30
|
+
"\tif (typeof server !== \"string\" || server.length === 0) return { ok: false, reason: \"no-tmux-context\" };"
|
|
31
|
+
],
|
|
32
|
+
"replace": ["\tvoid server;"],
|
|
33
|
+
"gate": ["bash", "run.sh", "check-mux-placement"],
|
|
34
|
+
"timeoutSeconds": 60,
|
|
35
|
+
"signature": "[QK:MUX-ANCHOR-REQUIRED]",
|
|
36
|
+
"signatureSource": "scripts/check-mux-placement.ts"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"claim": "MUX-SELECTOR-NATIVE-ID",
|
|
40
|
+
"title": "selector validation is disabled, so a forged `-t` value reaches tmux's own parser",
|
|
41
|
+
"subject": "pi-extensions/lib/mux-placement.ts",
|
|
42
|
+
"find": ["\tif (!okShape) {"],
|
|
43
|
+
"replace": ["\tif (false && !okShape) {"],
|
|
44
|
+
"gate": ["bash", "run.sh", "check-mux-placement"],
|
|
45
|
+
"timeoutSeconds": 60,
|
|
46
|
+
"signature": "[QK:MUX-SELECTOR-NATIVE-ID]",
|
|
47
|
+
"signatureSource": "scripts/check-mux-placement.ts"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"claim": "MUX-TMUX-FAILURE-LOUD",
|
|
51
|
+
"title": "a nonzero or signalled tmux run is swallowed, so `no server running` is laundered into a fact about the pane",
|
|
52
|
+
"subject": "pi-extensions/lib/mux-placement.ts",
|
|
53
|
+
"find": ["\tif (run.status === 0) return;"],
|
|
54
|
+
"replace": ["\tif (run.status === 0 || run.status !== 0) return;"],
|
|
55
|
+
"gate": ["bash", "run.sh", "check-mux-placement"],
|
|
56
|
+
"timeoutSeconds": 60,
|
|
57
|
+
"signature": "[QK:MUX-TMUX-FAILURE-LOUD]",
|
|
58
|
+
"signatureSource": "scripts/check-mux-placement.ts"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"claim": "MUX-ANCHOR-ECHO-BACK",
|
|
62
|
+
"title": "the pane-id echo-back is dropped, so tmux's rc=0 answer about ANOTHER pane is accepted as the caller's placement",
|
|
63
|
+
"subject": "pi-extensions/lib/mux-placement.ts",
|
|
64
|
+
"find": ["\tif (paneId !== anchor) return { ok: false, reason: \"anchor-mismatch\" };"],
|
|
65
|
+
"replace": ["\t// echo-back dropped"],
|
|
66
|
+
"gate": ["bash", "run.sh", "check-mux-placement"],
|
|
67
|
+
"timeoutSeconds": 60,
|
|
68
|
+
"signature": "[QK:MUX-ANCHOR-ECHO-BACK]",
|
|
69
|
+
"signatureSource": "scripts/check-mux-placement.ts"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"claim": "MUX-APPEND-END-DETACHED",
|
|
73
|
+
"title": "append drops -a/{end} and becomes a lowest-free-index new-window, a different verb from appending at the session end",
|
|
74
|
+
"subject": "pi-extensions/lib/mux-placement.ts",
|
|
75
|
+
"find": [
|
|
76
|
+
"\treturn [\"new-window\", \"-d\", \"-a\", \"-t\", `${sessionId}:{end}`, \"-P\", \"-F\", APPEND_FORMAT];"
|
|
77
|
+
],
|
|
78
|
+
"replace": ["\treturn [\"new-window\", \"-d\", \"-t\", `${sessionId}:`, \"-P\", \"-F\", APPEND_FORMAT];"],
|
|
79
|
+
"gate": ["bash", "run.sh", "check-mux-placement"],
|
|
80
|
+
"timeoutSeconds": 60,
|
|
81
|
+
"signature": "[QK:MUX-APPEND-END-DETACHED]",
|
|
82
|
+
"signatureSource": "scripts/check-mux-placement.ts"
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"claim": "MUX-CLOSE-BY-WINDOW-ID",
|
|
86
|
+
"title": "a failed kill-window is reported as already-gone without proving absence, so a window that is still open reads as closed",
|
|
87
|
+
"subject": "pi-extensions/lib/mux-placement.ts",
|
|
88
|
+
"find": ["\treturn ids.includes(windowId) ? null : \"already-gone\";"],
|
|
89
|
+
"replace": ["\treturn \"already-gone\";"],
|
|
90
|
+
"gate": ["bash", "run.sh", "check-mux-placement"],
|
|
91
|
+
"timeoutSeconds": 60,
|
|
92
|
+
"signature": "[QK:MUX-CLOSE-BY-WINDOW-ID]",
|
|
93
|
+
"signatureSource": "scripts/check-mux-placement.ts"
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"claim": "MUX-CONTEXT-BOUND-MUTATION",
|
|
97
|
+
"title": "context binding matches on the session id alone, so a restarted or foreign server with the same $N is accepted",
|
|
98
|
+
"subject": "pi-extensions/lib/mux-placement.ts",
|
|
99
|
+
"find": ["\treturn origin.serverPid === now.serverPid && origin.sessionId === now.sessionId;"],
|
|
100
|
+
"replace": ["\treturn origin.sessionId === now.sessionId;"],
|
|
101
|
+
"gate": ["bash", "run.sh", "check-mux-placement"],
|
|
102
|
+
"timeoutSeconds": 60,
|
|
103
|
+
"signature": "[QK:MUX-CONTEXT-BOUND-MUTATION]",
|
|
104
|
+
"signatureSource": "scripts/check-mux-placement.ts"
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"claim": "MUX-LAUNCH-PRECONDITION-FIRST",
|
|
108
|
+
"title": "the runtime precondition is skipped, so a window is opened onto a runtime that cannot start and the receipt looks identical to a good launch",
|
|
109
|
+
"subject": "pi-extensions/lib/mux-launch.ts",
|
|
110
|
+
"find": ["\tif (!isAbsolute(runtimePath)) {"],
|
|
111
|
+
"replace": ["\tif (false && !isAbsolute(runtimePath)) {"],
|
|
112
|
+
"gate": ["bash", "run.sh", "check-mux-launch"],
|
|
113
|
+
"timeoutSeconds": 60,
|
|
114
|
+
"signature": "[QK:MUX-LAUNCH-PRECONDITION-FIRST]",
|
|
115
|
+
"signatureSource": "scripts/check-mux-launch.ts"
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
"claim": "MUX-LAUNCH-PATH-NO-SPLIT",
|
|
119
|
+
"title": "the whitespace guard is dropped, so tmux re-splits a spaced runtime path and launches a truncated binary with the remainder as an argument",
|
|
120
|
+
"subject": "pi-extensions/lib/mux-launch.ts",
|
|
121
|
+
"find": ["\tif (WHITESPACE.test(runtimePath)) {"],
|
|
122
|
+
"replace": ["\tif (false && WHITESPACE.test(runtimePath)) {"],
|
|
123
|
+
"gate": ["bash", "run.sh", "check-mux-launch"],
|
|
124
|
+
"timeoutSeconds": 60,
|
|
125
|
+
"signature": "[QK:MUX-LAUNCH-PATH-NO-SPLIT]",
|
|
126
|
+
"signatureSource": "scripts/check-mux-launch.ts"
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"claim": "MUX-LAUNCH-PATH-HIT-NOT-SKIPPED",
|
|
130
|
+
"title": "the launchability proof is moved inside the PATH loop's catch, so an unlaunchable FIRST hit is silently skipped and a later entry launches a different install than the operator's own `pi`",
|
|
131
|
+
"subject": "pi-extensions/lib/mux-launch.ts",
|
|
132
|
+
"find": [
|
|
133
|
+
"\t\t} catch {",
|
|
134
|
+
"\t\t\tcontinue;",
|
|
135
|
+
"\t\t}",
|
|
136
|
+
"\t\tassertLaunchTarget(candidate);",
|
|
137
|
+
"\t\treturn candidate;"
|
|
138
|
+
],
|
|
139
|
+
"replace": [
|
|
140
|
+
"\t\t\tassertLaunchTarget(candidate);",
|
|
141
|
+
"\t\t} catch {",
|
|
142
|
+
"\t\t\tcontinue;",
|
|
143
|
+
"\t\t}",
|
|
144
|
+
"\t\treturn candidate;"
|
|
145
|
+
],
|
|
146
|
+
"gate": ["bash", "run.sh", "check-mux-launch"],
|
|
147
|
+
"timeoutSeconds": 60,
|
|
148
|
+
"signature": "[QK:MUX-LAUNCH-PATH-HIT-NOT-SKIPPED]",
|
|
149
|
+
"signatureSource": "scripts/check-mux-launch.ts"
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
"claim": "MUX-LAUNCH-NO-SHELL-ARGV",
|
|
153
|
+
"title": "the `--` separator is dropped, so tmux takes the runtime as a shell-command string instead of exec'ing it directly",
|
|
154
|
+
"subject": "pi-extensions/lib/mux-launch.ts",
|
|
155
|
+
"find": [
|
|
156
|
+
"\treturn [\"new-window\", \"-d\", \"-a\", \"-t\", `${sessionId}:{end}`, \"-P\", \"-F\", APPEND_FORMAT, \"--\", runtimePath];"
|
|
157
|
+
],
|
|
158
|
+
"replace": [
|
|
159
|
+
"\treturn [\"new-window\", \"-d\", \"-a\", \"-t\", `${sessionId}:{end}`, \"-P\", \"-F\", APPEND_FORMAT, runtimePath];"
|
|
160
|
+
],
|
|
161
|
+
"gate": ["bash", "run.sh", "check-mux-launch"],
|
|
162
|
+
"timeoutSeconds": 60,
|
|
163
|
+
"signature": "[QK:MUX-LAUNCH-NO-SHELL-ARGV]",
|
|
164
|
+
"signatureSource": "scripts/check-mux-launch.ts"
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
"claim": "MUX-LAUNCH-NO-CARRIER",
|
|
168
|
+
"title": "a window-name carrier is reintroduced into the launch argv, handing tmux's own parser a value this rail did not author",
|
|
169
|
+
"subject": "pi-extensions/lib/mux-launch.ts",
|
|
170
|
+
"find": [
|
|
171
|
+
"\treturn [\"new-window\", \"-d\", \"-a\", \"-t\", `${sessionId}:{end}`, \"-P\", \"-F\", APPEND_FORMAT, \"--\", runtimePath];"
|
|
172
|
+
],
|
|
173
|
+
"replace": [
|
|
174
|
+
"\treturn [\"new-window\", \"-d\", \"-a\", \"-n\", PI_RUNTIME_COMMAND, \"-t\", `${sessionId}:{end}`, \"-P\", \"-F\", APPEND_FORMAT, \"--\", runtimePath];"
|
|
175
|
+
],
|
|
176
|
+
"gate": ["bash", "run.sh", "check-mux-launch"],
|
|
177
|
+
"timeoutSeconds": 60,
|
|
178
|
+
"signature": "[QK:MUX-LAUNCH-NO-CARRIER]",
|
|
179
|
+
"signatureSource": "scripts/check-mux-launch.ts"
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
"claim": "MUX-LAUNCH-CORE-IMPORT-FREE",
|
|
183
|
+
"title": "the launch composition is imported by the delivery core, making fresh launch a dependency of entwurf_v2 delivery",
|
|
184
|
+
"subject": "pi-extensions/lib/entwurf-v2-production.ts",
|
|
185
|
+
"find": ["import { isOutOfSocketDomainGardenIdConflict } from \"./entwurf-facts.ts\";"],
|
|
186
|
+
"replace": [
|
|
187
|
+
"import { isOutOfSocketDomainGardenIdConflict } from \"./entwurf-facts.ts\";",
|
|
188
|
+
"import { launchPi as _launchPi } from \"./mux-launch.ts\";"
|
|
189
|
+
],
|
|
190
|
+
"gate": ["bash", "run.sh", "check-mux-launch"],
|
|
191
|
+
"timeoutSeconds": 60,
|
|
192
|
+
"signature": "[QK:MUX-LAUNCH-CORE-IMPORT-FREE]",
|
|
193
|
+
"signatureSource": "scripts/check-mux-launch.ts"
|
|
194
|
+
}
|
|
195
|
+
]
|
|
196
|
+
}
|