@junghanacs/entwurf 0.41.0 → 0.41.2
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 +1 -1
- package/BASELINE.md +7 -5
- package/CHANGELOG.md +426 -0
- package/DELIVERY.md +37 -20
- package/README.md +83 -81
- package/VERIFY.md +10 -10
- package/demo/README.md +1 -1
- package/docs/acp-backend-rail.md +1 -1
- package/docs/external-mcp-host.md +1 -1
- package/docs/setup-clean-host.md +95 -29
- package/mcp/entwurf-bridge/dist/mcp/entwurf-bridge/src/index.js +14 -11
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-self-address.js +10 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-contract.js +23 -2
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-decider.js +7 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-surface.js +3 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/fresh-call-composition.js +21 -10
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/herdr-fresh-call.js +4 -2
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/meta-sender-identity.js +5 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-fresh-call.js +6 -4
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/native-push/register.js +13 -2
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/omp-fresh-preflight.js +2 -2
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-fresh-preflight.js +1 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/remote-pair-receive.js +25 -17
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/remote-pair-send.js +94 -28
- package/mcp/entwurf-bridge/dist/pi-extensions/meta-bridge-omp.js +57 -7
- package/mcp/entwurf-bridge/dist/pi-extensions/meta-bridge-pi-durable.js +2 -2
- package/mcp/entwurf-bridge/dist/scripts/remote-pair-receive.js +12 -12
- package/mcp/entwurf-bridge/src/index.ts +14 -11
- package/native/win32-x64/entwurf_win.node +0 -0
- package/native/win32-x64/manifest.json +2 -2
- package/package.json +15 -14
- package/pi/pi-durable/carrier/tui.js +18 -3
- package/pi/pi-durable/overlay/upstream-pin.json +12 -12
- package/pi-extensions/lib/acp/backend-adapter.ts +5 -3
- package/pi-extensions/lib/acp/backend.ts +12 -9
- package/pi-extensions/lib/entwurf-self-address.ts +13 -0
- package/pi-extensions/lib/entwurf-v2-contract.ts +25 -2
- package/pi-extensions/lib/entwurf-v2-decider.ts +7 -0
- package/pi-extensions/lib/entwurf-v2-surface.ts +3 -0
- package/pi-extensions/lib/fresh-call-composition.ts +21 -10
- package/pi-extensions/lib/herdr-fresh-call.ts +4 -2
- package/pi-extensions/lib/meta-sender-identity.ts +4 -0
- package/pi-extensions/lib/mux-fresh-call.ts +6 -4
- package/pi-extensions/lib/native-push/register.ts +17 -2
- package/pi-extensions/lib/omp-fresh-preflight.ts +2 -2
- package/pi-extensions/lib/pi-durable-fresh-preflight.ts +1 -1
- package/pi-extensions/lib/remote-pair-receive.ts +27 -19
- package/pi-extensions/lib/remote-pair-send.ts +117 -30
- package/pi-extensions/meta-bridge-omp.ts +69 -7
- package/pi-extensions/meta-bridge-pi-durable.ts +3 -3
- package/run.sh +218 -49
- package/scripts/check-agy-sender-identity.ts +6 -4
- package/scripts/check-entwurf-self-address.ts +34 -3
- package/scripts/check-entwurf-v2-contract.ts +24 -2
- package/scripts/check-entwurf-v2-production.ts +45 -31
- package/scripts/check-gate-qualification.ts +11 -9
- package/scripts/check-native-push-adapter.ts +4 -0
- package/scripts/check-native-push-register.ts +32 -82
- package/scripts/check-remote-pair-installed.ts +2 -2
- package/scripts/dev-bin.sh +112 -1
- package/scripts/lib/chain-terminus-publication.ts +58 -0
- package/scripts/lib/codex-fresh-live-protocol.ts +33 -2
- package/scripts/lib/codex-fresh-source-receipts.ts +112 -3
- package/scripts/lib/pi-durable-fresh-live-receipts.ts +29 -1
- package/scripts/mutants/chain-terminus-publication.json +17 -0
- package/scripts/mutants/codex-native.json +98 -0
- package/scripts/mutants/control-send-receipt.json +3 -3
- package/scripts/mutants/mux-fresh-call.json +16 -1
- package/scripts/mutants/native-push-paused.json +17 -0
- package/scripts/mutants/omp-fresh.json +13 -2
- package/scripts/mutants/pack-install.json +50 -4
- package/scripts/mutants/pi-durable.json +60 -0
- package/scripts/mutants/pi-floor.json +5 -5
- package/scripts/mutants/remote-pair-display.json +3 -3
- package/scripts/mutants/remote-pair-receive.json +41 -11
- package/scripts/mutants/remote-pair-roundtrip.json +67 -7
- package/scripts/mutants/remote-pair-send.json +156 -17
- package/scripts/mutants/remote-pair-transport.json +4 -4
- package/scripts/mutants/source-install.json +66 -0
- package/scripts/remote-pair-receive.ts +12 -12
- package/scripts/smoke-agy-install-state.sh +121 -0
- package/scripts/smoke-agy-native-push-live.ts +13 -0
- package/scripts/smoke-codex-fresh-live.ts +52 -28
- package/scripts/smoke-entwurf-chain-live.ts +7 -9
- package/scripts/smoke-herdr-fresh-call-live.ts +4 -4
- package/scripts/smoke-herdr-plugin-build-live.ts +179 -50
- package/scripts/smoke-herdr-raw-install-live.sh +10 -3
- package/scripts/smoke-mux-lifecycle-live.ts +140 -8
- package/scripts/smoke-omp-fresh-live.ts +5 -4
- package/scripts/smoke-pi-durable-fresh-live.ts +29 -7
- package/scripts/smoke-setup-verdict.sh +27 -2
|
@@ -7,10 +7,10 @@
|
|
|
7
7
|
"title": "one row of the pnpm workspace closure is left on the previous floor while every other surface moved — the shape a version bump actually fails in. Nothing else reads that file, so the stranded row surfaces only at install time, in a different command, far from the change that stranded it",
|
|
8
8
|
"subject": "pnpm-workspace.yaml",
|
|
9
9
|
"find": [
|
|
10
|
-
" - '@earendil-works/pi-telemetry@0.85.0 || 0.85.1 || 0.86.0 || 0.87.0 || 0.87.1 || 0.99.1 || 0.99.2 || 1.0.0 || 1.0.2 || 1.0.4 || 1.1.0 || 1.2.0 || 1.3.0'"
|
|
10
|
+
" - '@earendil-works/pi-telemetry@0.85.0 || 0.85.1 || 0.86.0 || 0.87.0 || 0.87.1 || 0.99.1 || 0.99.2 || 1.0.0 || 1.0.2 || 1.0.4 || 1.1.0 || 1.2.0 || 1.3.0 || 1.4.0'"
|
|
11
11
|
],
|
|
12
12
|
"replace": [
|
|
13
|
-
" - '@earendil-works/pi-telemetry@0.85.0 || 0.85.1 || 0.86.0 || 0.87.0 || 0.87.1 || 0.99.1 || 0.99.2 || 1.0.0 || 1.0.2 || 1.0.4 || 1.1.0 || 1.2.0'"
|
|
13
|
+
" - '@earendil-works/pi-telemetry@0.85.0 || 0.85.1 || 0.86.0 || 0.87.0 || 0.87.1 || 0.99.1 || 0.99.2 || 1.0.0 || 1.0.2 || 1.0.4 || 1.1.0 || 1.2.0 || 1.3.0'"
|
|
14
14
|
],
|
|
15
15
|
"gate": ["bash", "run.sh", "check-dep-versions"],
|
|
16
16
|
"timeoutSeconds": 300,
|
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
"claim": "PI-SDK-PRODUCTION-SET",
|
|
22
22
|
"title": "the durable library's production pin falls one release behind the SDK set the pin declares, so the carrier would bind a pi-durable nobody verified it against",
|
|
23
23
|
"subject": "package.json",
|
|
24
|
-
"find": ["\"@earendil-works/pi-durable\": \"1.
|
|
25
|
-
"replace": ["\"@earendil-works/pi-durable\": \"1.
|
|
24
|
+
"find": ["\"@earendil-works/pi-durable\": \"1.4.0\","],
|
|
25
|
+
"replace": ["\"@earendil-works/pi-durable\": \"1.3.0\","],
|
|
26
26
|
"gate": ["bash", "run.sh", "check-dep-versions"],
|
|
27
27
|
"timeoutSeconds": 300,
|
|
28
28
|
"signature": "[QK:PI-SDK-PRODUCTION-SET]",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"title": "an @earendil-works package returns as a dev dependency beside its production pin, one name in two dependency classes",
|
|
34
34
|
"subject": "package.json",
|
|
35
35
|
"find": ["\"@biomejs/biome\": \"^2.4.13\","],
|
|
36
|
-
"replace": ["\"@biomejs/biome\": \"^2.4.13\",\n\t\t\"@earendil-works/pi-ai\": \"1.
|
|
36
|
+
"replace": ["\"@biomejs/biome\": \"^2.4.13\",\n\t\t\"@earendil-works/pi-ai\": \"1.4.0\","],
|
|
37
37
|
"gate": ["bash", "run.sh", "check-dep-versions"],
|
|
38
38
|
"timeoutSeconds": 300,
|
|
39
39
|
"signature": "[QK:PI-SDK-NO-DUAL-DECLARATION]",
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"replace": [
|
|
11
11
|
"\tconst remote = !replyable ? (sender.remote ?? { via: \"?\", replyRoute: \"none\" as const }) : undefined;"
|
|
12
12
|
],
|
|
13
|
-
"gate": ["bash", "run.sh", "check-
|
|
13
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
14
14
|
"timeoutSeconds": 600,
|
|
15
15
|
"signature": "[QK:REMOTE-DISPLAY-LOCAL-UNCHANGED]",
|
|
16
16
|
"signatureSource": "pi-extensions/lib/meta-mailbox-body.test.ts",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"subject": "pi-extensions/lib/meta-mailbox-body.ts",
|
|
26
26
|
"find": ["\"reply route declared, not probed\""],
|
|
27
27
|
"replace": ["\"reply via entwurf_v2 to this sessionId\""],
|
|
28
|
-
"gate": ["bash", "run.sh", "check-
|
|
28
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
29
29
|
"timeoutSeconds": 600,
|
|
30
30
|
"signature": "[QK:REMOTE-DISPLAY-SESSIONLINE]",
|
|
31
31
|
"signatureSource": "pi-extensions/lib/meta-mailbox-body.test.ts",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"subject": "pi-extensions/lib/meta-mailbox-body.ts",
|
|
41
41
|
"find": ["\tconst where = remote ? `${sender.cwd} (sender-host path)` : abbreviateHome(sender.cwd);"],
|
|
42
42
|
"replace": ["\tconst where = abbreviateHome(sender.cwd);"],
|
|
43
|
-
"gate": ["bash", "run.sh", "check-
|
|
43
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
44
44
|
"timeoutSeconds": 600,
|
|
45
45
|
"signature": "[QK:REMOTE-DISPLAY-SENDER-HOST-CWD]",
|
|
46
46
|
"signatureSource": "pi-extensions/lib/meta-mailbox-body.test.ts",
|
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
"claim": "REMOTE-PAIR-FROM-OUTSIDE-NO-MUTATION",
|
|
7
7
|
"title": "the receiving entry stops checking the claimed sender against the declared pair, so any gid the SSH account writes is dispatched into the declared target's mailbox",
|
|
8
8
|
"subject": "pi-extensions/lib/remote-pair-receive.ts",
|
|
9
|
-
"find": ["\tif (
|
|
9
|
+
"find": ["\tif (fromRoutes.length === 0) {"],
|
|
10
10
|
"replace": ["\tif (false) {"],
|
|
11
|
-
"gate": ["bash", "run.sh", "check-
|
|
11
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
12
12
|
"timeoutSeconds": 600,
|
|
13
13
|
"signature": "[QK:REMOTE-PAIR-FROM-OUTSIDE-NO-MUTATION]",
|
|
14
14
|
"signatureSource": "pi-extensions/lib/remote-pair-receive.test.ts",
|
|
@@ -21,9 +21,9 @@
|
|
|
21
21
|
"claim": "REMOTE-PAIR-TARGET-OUTSIDE-NO-MUTATION",
|
|
22
22
|
"title": "the receiving entry stops checking the claimed target against the declared pair, so a declared remote can reach every deliverable citizen on this host",
|
|
23
23
|
"subject": "pi-extensions/lib/remote-pair-receive.ts",
|
|
24
|
-
"find": ["\
|
|
25
|
-
"replace": ["\
|
|
26
|
-
"gate": ["bash", "run.sh", "check-
|
|
24
|
+
"find": ["\tconst decl = fromRoutes.find((d) => d.localGardenId === claim.target);"],
|
|
25
|
+
"replace": ["\tconst decl = fromRoutes.find((d) => d.localGardenId === claim.target) ?? fromRoutes[0];"],
|
|
26
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
27
27
|
"timeoutSeconds": 600,
|
|
28
28
|
"signature": "[QK:REMOTE-PAIR-TARGET-OUTSIDE-NO-MUTATION]",
|
|
29
29
|
"signatureSource": "pi-extensions/lib/remote-pair-receive.test.ts",
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"subject": "pi-extensions/lib/remote-pair-receive.ts",
|
|
39
39
|
"find": ["\t\tsessionId: claim.from,"],
|
|
40
40
|
"replace": ["\t\tsessionId: process.env.PI_SESSION_ID ?? claim.from,"],
|
|
41
|
-
"gate": ["bash", "run.sh", "check-
|
|
41
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
42
42
|
"timeoutSeconds": 600,
|
|
43
43
|
"signature": "[QK:REMOTE-PAIR-IGNORES-AMBIENT-SENDER]",
|
|
44
44
|
"signatureSource": "pi-extensions/lib/remote-pair-receive.test.ts",
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"subject": "pi-extensions/lib/remote-pair-receive.ts",
|
|
54
54
|
"find": ["\t\treplyable: false,"],
|
|
55
55
|
"replace": ["\t\treplyable: true,"],
|
|
56
|
-
"gate": ["bash", "run.sh", "check-
|
|
56
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
57
57
|
"timeoutSeconds": 600,
|
|
58
58
|
"signature": "[QK:REMOTE-PAIR-MATCH-DISPATCHES-ONCE]",
|
|
59
59
|
"signatureSource": "pi-extensions/lib/remote-pair-receive.test.ts",
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
"subject": "pi-extensions/lib/remote-pair-receive.ts",
|
|
69
69
|
"find": ["\tif (got.length !== want.length || got.some((k, i) => k !== want[i])) {"],
|
|
70
70
|
"replace": ["\tif (false) {"],
|
|
71
|
-
"gate": ["bash", "run.sh", "check-
|
|
71
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
72
72
|
"timeoutSeconds": 600,
|
|
73
73
|
"signature": "[QK:REMOTE-PAIR-CLAIM-EXACT-SHAPE]",
|
|
74
74
|
"signatureSource": "pi-extensions/lib/remote-pair-receive.test.ts",
|
|
@@ -83,7 +83,7 @@
|
|
|
83
83
|
"subject": "scripts/remote-pair-receive.ts",
|
|
84
84
|
"find": ["emit(receipt, receipt.kind === \"rejected\" ? 3 : receipt.isError ? 4 : 0);"],
|
|
85
85
|
"replace": ["emit(receipt, receipt.kind === \"rejected\" ? 0 : receipt.isError ? 4 : 0);"],
|
|
86
|
-
"gate": ["bash", "run.sh", "check-
|
|
86
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
87
87
|
"timeoutSeconds": 600,
|
|
88
88
|
"signature": "[QK:REMOTE-PAIR-ENTRY-REFUSES-OUTSIDE]",
|
|
89
89
|
"signatureSource": "pi-extensions/lib/remote-pair-receive.test.ts",
|
|
@@ -98,7 +98,7 @@
|
|
|
98
98
|
"subject": "scripts/remote-pair-receive.ts",
|
|
99
99
|
"find": ["\tif (!path.isAbsolute(pairFile) || path.normalize(pairFile) !== own) {"],
|
|
100
100
|
"replace": ["\tif (false) {"],
|
|
101
|
-
"gate": ["bash", "run.sh", "check-
|
|
101
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
102
102
|
"timeoutSeconds": 600,
|
|
103
103
|
"signature": "[QK:REMOTE-PAIR-ENTRY-USAGE]",
|
|
104
104
|
"signatureSource": "pi-extensions/lib/remote-pair-receive.test.ts",
|
|
@@ -113,7 +113,7 @@
|
|
|
113
113
|
"subject": "scripts/remote-pair-receive.ts",
|
|
114
114
|
"find": ["\treplyRoute: \"declared\","],
|
|
115
115
|
"replace": ["\treplyRoute: \"none\","],
|
|
116
|
-
"gate": ["bash", "run.sh", "check-
|
|
116
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
117
117
|
"timeoutSeconds": 600,
|
|
118
118
|
"signature": "[QK:REMOTE-PAIR-ENTRY-REPLY-ROUTE-DECLARED]",
|
|
119
119
|
"signatureSource": "pi-extensions/lib/remote-pair-receive.test.ts",
|
|
@@ -121,6 +121,36 @@
|
|
|
121
121
|
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
122
122
|
"output": "mcp/entwurf-bridge/dist"
|
|
123
123
|
}
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
"claim": "REMOTE-PAIR-CROSS-PAIR-REFUSED",
|
|
127
|
+
"title": "the two ends are checked as independent memberships, so a sender declared in one route reaches the local citizen of another route",
|
|
128
|
+
"subject": "pi-extensions/lib/remote-pair-receive.ts",
|
|
129
|
+
"find": ["\tconst decl = fromRoutes.find((d) => d.localGardenId === claim.target);"],
|
|
130
|
+
"replace": ["\tconst decl = decls.some((d) => d.localGardenId === claim.target) ? fromRoutes[0] : undefined;"],
|
|
131
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
132
|
+
"timeoutSeconds": 600,
|
|
133
|
+
"signature": "[QK:REMOTE-PAIR-CROSS-PAIR-REFUSED]",
|
|
134
|
+
"signatureSource": "pi-extensions/lib/remote-pair-receive.test.ts",
|
|
135
|
+
"build": {
|
|
136
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
137
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
"claim": "REMOTE-PAIR-SELECTED-ROUTE-LABEL",
|
|
142
|
+
"title": "the body is labelled with the first declared route, so a message that came over one host is shown as arriving over another",
|
|
143
|
+
"subject": "pi-extensions/lib/remote-pair-receive.ts",
|
|
144
|
+
"find": ["\tconst sender = buildRemoteSenderEnvelope(claim, picked.decl,"],
|
|
145
|
+
"replace": ["\tconst sender = buildRemoteSenderEnvelope(claim, decls[0],"],
|
|
146
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
147
|
+
"timeoutSeconds": 600,
|
|
148
|
+
"signature": "[QK:REMOTE-PAIR-SELECTED-ROUTE-LABEL]",
|
|
149
|
+
"signatureSource": "pi-extensions/lib/remote-pair-receive.test.ts",
|
|
150
|
+
"build": {
|
|
151
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
152
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
153
|
+
}
|
|
124
154
|
}
|
|
125
155
|
]
|
|
126
156
|
}
|
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
"claim": "REMOTE-ROUNDTRIP-A-TO-B",
|
|
7
7
|
"title": "the bridge never reads the opt-in, so a declared remote target falls through to the local decider as bad-target",
|
|
8
8
|
"subject": "mcp/entwurf-bridge/src/index.ts",
|
|
9
|
-
"find": ["\t\t\t\t\
|
|
10
|
-
"replace": ["\t\t\t\t\
|
|
11
|
-
"gate": ["bash", "run.sh", "check-
|
|
9
|
+
"find": ["\t\t\t\t\toptIn: readRemotePairOptIn(remotePairOptInPath()),"],
|
|
10
|
+
"replace": ["\t\t\t\t\toptIn: null,"],
|
|
11
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
12
12
|
"timeoutSeconds": 600,
|
|
13
13
|
"signature": "[QK:REMOTE-ROUNDTRIP-A-TO-B]",
|
|
14
14
|
"signatureSource": "pi-extensions/lib/remote-pair-roundtrip.test.ts",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"replace": [
|
|
26
26
|
"\t\t\t\t\ttransport: { run: async () => ({ exitCode: 1, signal: null, timedOut: false, stdout: \"\", stderr: \"\" }) },"
|
|
27
27
|
],
|
|
28
|
-
"gate": ["bash", "run.sh", "check-
|
|
28
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
29
29
|
"timeoutSeconds": 600,
|
|
30
30
|
"signature": "[QK:REMOTE-ROUNDTRIP-REVERSE-DISPATCH]",
|
|
31
31
|
"signatureSource": "pi-extensions/lib/remote-pair-roundtrip.test.ts",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"subject": "mcp/entwurf-bridge/src/index.ts",
|
|
41
41
|
"find": ["\t\t\t\t\trunLocal: (params, opts) => runAndRenderEntwurfV2FromSurface(params, opts),"],
|
|
42
42
|
"replace": ["\t\t\t\t\trunLocal: async () => ({ isError: false, text: \"local skipped\" }),"],
|
|
43
|
-
"gate": ["bash", "run.sh", "check-
|
|
43
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
44
44
|
"timeoutSeconds": 600,
|
|
45
45
|
"signature": "[QK:REMOTE-ROUNDTRIP-OPT-IN-ABSENT-OFF]",
|
|
46
46
|
"signatureSource": "pi-extensions/lib/remote-pair-roundtrip.test.ts",
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"subject": "pi-extensions/lib/remote-pair-send.ts",
|
|
56
56
|
"find": ["refused by the other host's pair: ${o.reason} (${o.detail})"],
|
|
57
57
|
"replace": ["failed"],
|
|
58
|
-
"gate": ["bash", "run.sh", "check-
|
|
58
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
59
59
|
"timeoutSeconds": 600,
|
|
60
60
|
"signature": "[QK:REMOTE-ROUNDTRIP-OTHER-HOST-REFUSES]",
|
|
61
61
|
"signatureSource": "pi-extensions/lib/remote-pair-roundtrip.test.ts",
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
"subject": "mcp/entwurf-bridge/src/index.ts",
|
|
71
71
|
"find": ["\t\t\t\t\t\tcontrolSocketDirs: [CONTROL_SOCKET_DIR, ENTWURF_DIR],"],
|
|
72
72
|
"replace": ["\t\t\t\t\t\tcontrolSocketDirs: [ENTWURF_DIR],"],
|
|
73
|
-
"gate": ["bash", "run.sh", "check-
|
|
73
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
74
74
|
"timeoutSeconds": 600,
|
|
75
75
|
"signature": "[QK:REMOTE-ROUNDTRIP-LOCAL-TRACE-BOTH-SOCKET-DIRS]",
|
|
76
76
|
"signatureSource": "pi-extensions/lib/remote-pair-roundtrip.test.ts",
|
|
@@ -78,6 +78,66 @@
|
|
|
78
78
|
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
79
79
|
"output": "mcp/entwurf-bridge/dist"
|
|
80
80
|
}
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"claim": "REMOTE-ROUNDTRIP-MULTI-INDEPENDENT",
|
|
84
|
+
"title": "the receiving entry reads only the first route of its file, so a second citizen paired with this host is refused as an undeclared sender",
|
|
85
|
+
"subject": "scripts/remote-pair-receive.ts",
|
|
86
|
+
"find": ["\tdecls = optIn.routes.map("],
|
|
87
|
+
"replace": ["\tdecls = optIn.routes.slice(0, 1).map("],
|
|
88
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
89
|
+
"timeoutSeconds": 600,
|
|
90
|
+
"signature": "[QK:REMOTE-ROUNDTRIP-MULTI-INDEPENDENT]",
|
|
91
|
+
"signatureSource": "pi-extensions/lib/remote-pair-roundtrip.test.ts",
|
|
92
|
+
"build": {
|
|
93
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
94
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"claim": "REMOTE-ROUNDTRIP-MULTI-REVERSE",
|
|
99
|
+
"title": "the receiving side recognizes only the first route's remote as a sender, so a claim from a second host lands on the wrong route or is refused",
|
|
100
|
+
"subject": "pi-extensions/lib/remote-pair-receive.ts",
|
|
101
|
+
"find": ["\tconst fromRoutes = decls.filter((d) => d.remoteGardenId === claim.from);"],
|
|
102
|
+
"replace": ["\tconst fromRoutes = decls.filter((d) => d.remoteGardenId === decls[0].remoteGardenId);"],
|
|
103
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
104
|
+
"timeoutSeconds": 600,
|
|
105
|
+
"signature": "[QK:REMOTE-ROUNDTRIP-MULTI-REVERSE]",
|
|
106
|
+
"signatureSource": "pi-extensions/lib/remote-pair-roundtrip.test.ts",
|
|
107
|
+
"build": {
|
|
108
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
109
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"claim": "REMOTE-ROUNDTRIP-MULTI-UNDECLARED-SENDER-ZERO-SSH",
|
|
114
|
+
"title": "a sender with no route to a declared remote borrows another sender's route, so ssh runs and the other host is asked to accept a pair nobody declared",
|
|
115
|
+
"subject": "pi-extensions/lib/remote-pair-send.ts",
|
|
116
|
+
"find": ["? declared.find((r) => r.localGardenId === sender.sessionId) :"],
|
|
117
|
+
"replace": ["? (declared.find((r) => r.localGardenId === sender.sessionId) ?? declared[0]) :"],
|
|
118
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
119
|
+
"timeoutSeconds": 600,
|
|
120
|
+
"signature": "[QK:REMOTE-ROUNDTRIP-MULTI-UNDECLARED-SENDER-ZERO-SSH]",
|
|
121
|
+
"signatureSource": "pi-extensions/lib/remote-pair-roundtrip.test.ts",
|
|
122
|
+
"build": {
|
|
123
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
124
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
"claim": "REMOTE-ROUNDTRIP-MULTI-CROSS-CLAIM-REFUSED",
|
|
129
|
+
"title": "the target is matched against every route rather than the sender's own, so a peer that declares an extra pair on its side widens this host's",
|
|
130
|
+
"subject": "pi-extensions/lib/remote-pair-receive.ts",
|
|
131
|
+
"find": ["\tconst decl = fromRoutes.find((d) => d.localGardenId === claim.target);"],
|
|
132
|
+
"replace": ["\tconst decl = decls.find((d) => d.localGardenId === claim.target);"],
|
|
133
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
134
|
+
"timeoutSeconds": 600,
|
|
135
|
+
"signature": "[QK:REMOTE-ROUNDTRIP-MULTI-CROSS-CLAIM-REFUSED]",
|
|
136
|
+
"signatureSource": "pi-extensions/lib/remote-pair-roundtrip.test.ts",
|
|
137
|
+
"build": {
|
|
138
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
139
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
140
|
+
}
|
|
81
141
|
}
|
|
82
142
|
]
|
|
83
143
|
}
|
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
"claim": "REMOTE-ROUTE-UNDECLARED-LOCAL-UNCHANGED",
|
|
7
7
|
"title": "a declared route captures every target, so a gid the declaration never named is sent to the other host instead of the local decider",
|
|
8
8
|
"subject": "pi-extensions/lib/remote-pair-send.ts",
|
|
9
|
-
"find": ["\
|
|
10
|
-
"replace": ["\
|
|
11
|
-
"gate": ["bash", "run.sh", "check-
|
|
9
|
+
"find": ["\tconst declared = (opts.optIn?.routes ?? []).filter((r) => r.remoteGardenId === params.target);"],
|
|
10
|
+
"replace": ["\tconst declared = opts.optIn?.routes ?? [];"],
|
|
11
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
12
12
|
"timeoutSeconds": 600,
|
|
13
13
|
"signature": "[QK:REMOTE-ROUTE-UNDECLARED-LOCAL-UNCHANGED]",
|
|
14
14
|
"signatureSource": "pi-extensions/lib/remote-pair-send.test.ts",
|
|
@@ -21,9 +21,9 @@
|
|
|
21
21
|
"claim": "REMOTE-ROUTE-LOCAL-CONFLICT-FAILS-CLOSED",
|
|
22
22
|
"title": "a declared remote gid that this host also answers to is sent away anyway, so two hosts' citizens share one address and the sender silently picks the remote",
|
|
23
23
|
"subject": "pi-extensions/lib/remote-pair-send.ts",
|
|
24
|
-
"find": ["\tif (await opts.localTrace(
|
|
24
|
+
"find": ["\tif (await opts.localTrace(params.target)) {"],
|
|
25
25
|
"replace": ["\tif (Boolean(0)) {"],
|
|
26
|
-
"gate": ["bash", "run.sh", "check-
|
|
26
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
27
27
|
"timeoutSeconds": 600,
|
|
28
28
|
"signature": "[QK:REMOTE-ROUTE-LOCAL-CONFLICT-FAILS-CLOSED]",
|
|
29
29
|
"signatureSource": "pi-extensions/lib/remote-pair-send.test.ts",
|
|
@@ -36,9 +36,9 @@
|
|
|
36
36
|
"claim": "REMOTE-ROUTE-SENDER-MUST-BE-DECLARED",
|
|
37
37
|
"title": "any present envelope may use the route, so an anonymous caller or another citizen on this host speaks to the other host as the declared sender",
|
|
38
38
|
"subject": "pi-extensions/lib/remote-pair-send.ts",
|
|
39
|
-
"find": ["\
|
|
40
|
-
"replace": ["\
|
|
41
|
-
"gate": ["bash", "run.sh", "check-
|
|
39
|
+
"find": ["\t\tsender && sender.origin !== \"external-mcp\""],
|
|
40
|
+
"replace": ["\t\tsender"],
|
|
41
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
42
42
|
"timeoutSeconds": 600,
|
|
43
43
|
"signature": "[QK:REMOTE-ROUTE-SENDER-MUST-BE-DECLARED]",
|
|
44
44
|
"signatureSource": "pi-extensions/lib/remote-pair-send.test.ts",
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"subject": "pi-extensions/lib/remote-pair-send.ts",
|
|
54
54
|
"find": ["\t\t\"BatchMode=yes\","],
|
|
55
55
|
"replace": ["\t\t\"BatchMode=no\","],
|
|
56
|
-
"gate": ["bash", "run.sh", "check-
|
|
56
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
57
57
|
"timeoutSeconds": 600,
|
|
58
58
|
"signature": "[QK:REMOTE-ROUTE-EXACT-ARGV-ONCE]",
|
|
59
59
|
"signatureSource": "pi-extensions/lib/remote-pair-send.test.ts",
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
"replace": [
|
|
71
71
|
"\tawait opts.transport.run(remoteReceiveArgv(route), JSON.stringify(claim), 1);\n\tconst result = await opts.transport.run("
|
|
72
72
|
],
|
|
73
|
-
"gate": ["bash", "run.sh", "check-
|
|
73
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
74
74
|
"timeoutSeconds": 600,
|
|
75
75
|
"signature": "[QK:REMOTE-ROUTE-NO-RETRY]",
|
|
76
76
|
"signatureSource": "pi-extensions/lib/remote-pair-send.test.ts",
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
"\tif (r.exitCode === 0 && keys === \"isError,kind,text\" && o.kind === \"dispatched\" && o.isError === false) {"
|
|
88
88
|
],
|
|
89
89
|
"replace": ["\tif (keys === \"isError,kind,text\" && o.kind === \"dispatched\" && o.isError === false) {"],
|
|
90
|
-
"gate": ["bash", "run.sh", "check-
|
|
90
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
91
91
|
"timeoutSeconds": 600,
|
|
92
92
|
"signature": "[QK:REMOTE-RECEIPT-EXIT-AND-KIND-AGREE]",
|
|
93
93
|
"signatureSource": "pi-extensions/lib/remote-pair-send.test.ts",
|
|
@@ -102,7 +102,7 @@
|
|
|
102
102
|
"subject": "pi-extensions/lib/remote-pair-send.ts",
|
|
103
103
|
"find": ["const REMOTE_PATH = /^\\/[A-Za-z0-9._/-]+$/;"],
|
|
104
104
|
"replace": ["const REMOTE_PATH = /^\\/.+$/;"],
|
|
105
|
-
"gate": ["bash", "run.sh", "check-
|
|
105
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
106
106
|
"timeoutSeconds": 600,
|
|
107
107
|
"signature": "[QK:REMOTE-ROUTE-DECL-NO-QUOTING-NEEDED]",
|
|
108
108
|
"signatureSource": "pi-extensions/lib/remote-pair-send.test.ts",
|
|
@@ -117,7 +117,7 @@
|
|
|
117
117
|
"subject": "pi-extensions/lib/remote-pair-send.ts",
|
|
118
118
|
"find": ["\t\t\tif (inspection.kind !== \"absent\") return true;"],
|
|
119
119
|
"replace": ["\t\t\tif (false) return true;"],
|
|
120
|
-
"gate": ["bash", "run.sh", "check-
|
|
120
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
121
121
|
"timeoutSeconds": 600,
|
|
122
122
|
"signature": "[QK:REMOTE-ROUTE-LOCAL-TRACE-ANY-STATE]",
|
|
123
123
|
"signatureSource": "pi-extensions/lib/remote-pair-send.test.ts",
|
|
@@ -132,7 +132,7 @@
|
|
|
132
132
|
"subject": "pi-extensions/lib/remote-pair-send.ts",
|
|
133
133
|
"find": ["read/answer unknown until a reply arrives; paths below are on the other host)"],
|
|
134
134
|
"replace": ["read/answer unknown until a reply arrives)"],
|
|
135
|
-
"gate": ["bash", "run.sh", "check-
|
|
135
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
136
136
|
"timeoutSeconds": 600,
|
|
137
137
|
"signature": "[QK:REMOTE-ROUTE-RECEIPT-PATHS-OTHER-HOST]",
|
|
138
138
|
"signatureSource": "pi-extensions/lib/remote-pair-send.test.ts",
|
|
@@ -147,7 +147,7 @@
|
|
|
147
147
|
"subject": "pi-extensions/lib/remote-pair-send.ts",
|
|
148
148
|
"find": ["\t\tif ((err as NodeJS.ErrnoException).code === \"ENOENT\") return null;"],
|
|
149
149
|
"replace": ["\t\tif (false) return null;"],
|
|
150
|
-
"gate": ["bash", "run.sh", "check-
|
|
150
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
151
151
|
"timeoutSeconds": 600,
|
|
152
152
|
"signature": "[QK:REMOTE-PAIR-OPT-IN-ABSENT-IS-OFF]",
|
|
153
153
|
"signatureSource": "pi-extensions/lib/remote-pair-send.test.ts",
|
|
@@ -162,7 +162,7 @@
|
|
|
162
162
|
"subject": "pi-extensions/lib/remote-pair-send.ts",
|
|
163
163
|
"find": ["\tif (!st.isFile()) {\n\t\tthrow new RemoteRouteDeclarationError(`remote pair opt-in"],
|
|
164
164
|
"replace": ["\tif (false) {\n\t\tthrow new RemoteRouteDeclarationError(`remote pair opt-in"],
|
|
165
|
-
"gate": ["bash", "run.sh", "check-
|
|
165
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
166
166
|
"timeoutSeconds": 600,
|
|
167
167
|
"signature": "[QK:REMOTE-PAIR-OPT-IN-BROKEN-REFUSED]",
|
|
168
168
|
"signatureSource": "pi-extensions/lib/remote-pair-send.test.ts",
|
|
@@ -181,7 +181,7 @@
|
|
|
181
181
|
"replace": [
|
|
182
182
|
"\t\t\t\ttext: `entwurf_v2 remote ${via} → the other host did not deliver (paths below are on the other host)\\n${o.text}`,"
|
|
183
183
|
],
|
|
184
|
-
"gate": ["bash", "run.sh", "check-
|
|
184
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
185
185
|
"timeoutSeconds": 600,
|
|
186
186
|
"signature": "[QK:REMOTE-REPORTED-ERROR-NO-DELIVERY-INFERENCE]",
|
|
187
187
|
"signatureSource": "pi-extensions/lib/remote-pair-send.test.ts",
|
|
@@ -189,6 +189,145 @@
|
|
|
189
189
|
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
190
190
|
"output": "mcp/entwurf-bridge/dist"
|
|
191
191
|
}
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
"claim": "REMOTE-ROUTES-V2-EXACT-SHAPE",
|
|
195
|
+
"title": "an empty routes array is read as a declaration with no route, so a file meant to switch the pair off silently keeps the bridge reading an opt-in instead of being refused",
|
|
196
|
+
"subject": "pi-extensions/lib/remote-pair-send.ts",
|
|
197
|
+
"find": ["\tif (!Array.isArray(obj.routes) || obj.routes.length === 0) {"],
|
|
198
|
+
"replace": ["\tif (!Array.isArray(obj.routes)) {"],
|
|
199
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
200
|
+
"timeoutSeconds": 600,
|
|
201
|
+
"signature": "[QK:REMOTE-ROUTES-V2-EXACT-SHAPE]",
|
|
202
|
+
"signatureSource": "pi-extensions/lib/remote-pair-send.test.ts",
|
|
203
|
+
"build": {
|
|
204
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
205
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
206
|
+
}
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
"claim": "REMOTE-ROUTES-LEGACY-NAMED-REFUSAL",
|
|
210
|
+
"title": "the versionless single-pair file is quietly read as one route, so a host keeps a pre-#149 declaration through the hard cut with no named transition",
|
|
211
|
+
"subject": "pi-extensions/lib/remote-pair-send.ts",
|
|
212
|
+
"find": ["\tif (!Object.hasOwn(obj, \"version\")) {"],
|
|
213
|
+
"replace": [
|
|
214
|
+
"\tif (!Object.hasOwn(obj, \"version\")) return { routes: [parseRoute(obj, what)] };\n\tif (Boolean(0)) {"
|
|
215
|
+
],
|
|
216
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
217
|
+
"timeoutSeconds": 600,
|
|
218
|
+
"signature": "[QK:REMOTE-ROUTES-LEGACY-NAMED-REFUSAL]",
|
|
219
|
+
"signatureSource": "pi-extensions/lib/remote-pair-send.test.ts",
|
|
220
|
+
"build": {
|
|
221
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
222
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
223
|
+
}
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
"claim": "REMOTE-ROUTES-LEGAL-REPEATS-ACCEPTED",
|
|
227
|
+
"title": "one alias may carry only one route, so a host with two citizens on the same other host cannot declare both pairs",
|
|
228
|
+
"subject": "pi-extensions/lib/remote-pair-send.ts",
|
|
229
|
+
"find": ["\t\tif (file !== undefined && file !== r.remotePairFile) {"],
|
|
230
|
+
"replace": ["\t\tif (file !== undefined) {"],
|
|
231
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
232
|
+
"timeoutSeconds": 600,
|
|
233
|
+
"signature": "[QK:REMOTE-ROUTES-LEGAL-REPEATS-ACCEPTED]",
|
|
234
|
+
"signatureSource": "pi-extensions/lib/remote-pair-send.test.ts",
|
|
235
|
+
"build": {
|
|
236
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
237
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
238
|
+
}
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
"claim": "REMOTE-ROUTES-DUPLICATE-PAIR-REFUSED",
|
|
242
|
+
"title": "the same exact pair may be declared twice, so the file carries two entries for one route and the reader keeps whichever it meets first",
|
|
243
|
+
"subject": "pi-extensions/lib/remote-pair-send.ts",
|
|
244
|
+
"find": ["\t\tif (pairs.has(pair)) {"],
|
|
245
|
+
"replace": ["\t\tif (Boolean(0)) {"],
|
|
246
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
247
|
+
"timeoutSeconds": 600,
|
|
248
|
+
"signature": "[QK:REMOTE-ROUTES-DUPLICATE-PAIR-REFUSED]",
|
|
249
|
+
"signatureSource": "pi-extensions/lib/remote-pair-send.test.ts",
|
|
250
|
+
"build": {
|
|
251
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
252
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
253
|
+
}
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
"claim": "REMOTE-ROUTES-LOCAL-REMOTE-OVERLAP-REFUSED",
|
|
257
|
+
"title": "a gid may be local in one route and remote in another, so one citizen is claimed to live on this host and on another at once",
|
|
258
|
+
"subject": "pi-extensions/lib/remote-pair-send.ts",
|
|
259
|
+
"find": ["\t\tif (locals.has(r.remoteGardenId)) {"],
|
|
260
|
+
"replace": ["\t\tif (Boolean(0)) {"],
|
|
261
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
262
|
+
"timeoutSeconds": 600,
|
|
263
|
+
"signature": "[QK:REMOTE-ROUTES-LOCAL-REMOTE-OVERLAP-REFUSED]",
|
|
264
|
+
"signatureSource": "pi-extensions/lib/remote-pair-send.test.ts",
|
|
265
|
+
"build": {
|
|
266
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
267
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
268
|
+
}
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
"claim": "REMOTE-ROUTES-REMOTE-HOST-CONFLICT-REFUSED",
|
|
272
|
+
"title": "one remote gid may be reached through two aliases, so which host a message to it goes to depends on which sender sends it",
|
|
273
|
+
"subject": "pi-extensions/lib/remote-pair-send.ts",
|
|
274
|
+
"find": ["\t\tif (host && (host.ssh !== r.ssh || host.remotePairFile !== r.remotePairFile)) {"],
|
|
275
|
+
"replace": ["\t\tif (host && host.remotePairFile !== r.remotePairFile) {"],
|
|
276
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
277
|
+
"timeoutSeconds": 600,
|
|
278
|
+
"signature": "[QK:REMOTE-ROUTES-REMOTE-HOST-CONFLICT-REFUSED]",
|
|
279
|
+
"signatureSource": "pi-extensions/lib/remote-pair-send.test.ts",
|
|
280
|
+
"build": {
|
|
281
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
282
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
283
|
+
}
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
"claim": "REMOTE-ROUTES-ALIAS-FILE-CONFLICT-REFUSED",
|
|
287
|
+
"title": "one alias may name two remote files, though the host behind it accepts only its one canonical file, so one of those routes can never be received",
|
|
288
|
+
"subject": "pi-extensions/lib/remote-pair-send.ts",
|
|
289
|
+
"find": ["\t\tif (file !== undefined && file !== r.remotePairFile) {"],
|
|
290
|
+
"replace": ["\t\tif (Boolean(0)) {"],
|
|
291
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
292
|
+
"timeoutSeconds": 600,
|
|
293
|
+
"signature": "[QK:REMOTE-ROUTES-ALIAS-FILE-CONFLICT-REFUSED]",
|
|
294
|
+
"signatureSource": "pi-extensions/lib/remote-pair-send.test.ts",
|
|
295
|
+
"build": {
|
|
296
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
297
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
298
|
+
}
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
"claim": "REMOTE-ROUTE-SELECT-EXACT-PAIR",
|
|
302
|
+
"title": "the route is chosen by target alone, so a citizen paired with another remote speaks over a route declared for a different sender",
|
|
303
|
+
"subject": "pi-extensions/lib/remote-pair-send.ts",
|
|
304
|
+
"find": ["? declared.find((r) => r.localGardenId === sender.sessionId) :"],
|
|
305
|
+
"replace": ["? declared.find(() => true) :"],
|
|
306
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
307
|
+
"timeoutSeconds": 600,
|
|
308
|
+
"signature": "[QK:REMOTE-ROUTE-SELECT-EXACT-PAIR]",
|
|
309
|
+
"signatureSource": "pi-extensions/lib/remote-pair-send.test.ts",
|
|
310
|
+
"build": {
|
|
311
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
312
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
313
|
+
}
|
|
314
|
+
},
|
|
315
|
+
{
|
|
316
|
+
"claim": "REMOTE-ROUTE-NO-LOCAL-FALLBACK",
|
|
317
|
+
"title": "a declared remote target with no route for this sender falls through to the local path, so a gid the operator said lives elsewhere is resolved on this host",
|
|
318
|
+
"subject": "pi-extensions/lib/remote-pair-send.ts",
|
|
319
|
+
"find": ["\tif (!sender || !route) {"],
|
|
320
|
+
"replace": [
|
|
321
|
+
"\tif (!sender || !route) return opts.runLocal(params, { senderProvider: opts.senderProvider });\n\tif (!sender || !route) {"
|
|
322
|
+
],
|
|
323
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
324
|
+
"timeoutSeconds": 600,
|
|
325
|
+
"signature": "[QK:REMOTE-ROUTE-NO-LOCAL-FALLBACK]",
|
|
326
|
+
"signatureSource": "pi-extensions/lib/remote-pair-send.test.ts",
|
|
327
|
+
"build": {
|
|
328
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
329
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
330
|
+
}
|
|
192
331
|
}
|
|
193
332
|
]
|
|
194
333
|
}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"subject": "pi-extensions/lib/remote-pair-transport.ts",
|
|
9
9
|
"find": ["{ shell: false, stdio: [\"pipe\", \"pipe\", \"pipe\"] }"],
|
|
10
10
|
"replace": ["{ shell: true, stdio: [\"pipe\", \"pipe\", \"pipe\"] }"],
|
|
11
|
-
"gate": ["bash", "run.sh", "check-
|
|
11
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
12
12
|
"timeoutSeconds": 600,
|
|
13
13
|
"signature": "[QK:REMOTE-TRANSPORT-NO-SHELL-SEPARATE-STREAMS]",
|
|
14
14
|
"signatureSource": "pi-extensions/lib/remote-pair-transport.test.ts",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"subject": "pi-extensions/lib/remote-pair-transport.ts",
|
|
24
24
|
"find": ["\t\t\t\t\tchild.kill(\"SIGKILL\");"],
|
|
25
25
|
"replace": ["\t\t\t\t\tvoid 0;"],
|
|
26
|
-
"gate": ["bash", "run.sh", "check-
|
|
26
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
27
27
|
"timeoutSeconds": 600,
|
|
28
28
|
"signature": "[QK:REMOTE-TRANSPORT-TIMEOUT-REAPS-OWN-CHILD]",
|
|
29
29
|
"signatureSource": "pi-extensions/lib/remote-pair-transport.test.ts",
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"subject": "pi-extensions/lib/remote-pair-transport.ts",
|
|
39
39
|
"find": ["\t\t\t\t\texitCode: spawnError ? null : code,"],
|
|
40
40
|
"replace": ["\t\t\t\t\texitCode: spawnError ? 0 : code,"],
|
|
41
|
-
"gate": ["bash", "run.sh", "check-
|
|
41
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
42
42
|
"timeoutSeconds": 600,
|
|
43
43
|
"signature": "[QK:REMOTE-TRANSPORT-SPAWN-FAILURE-INDETERMINATE]",
|
|
44
44
|
"signatureSource": "pi-extensions/lib/remote-pair-transport.test.ts",
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"subject": "pi-extensions/lib/remote-pair-transport.ts",
|
|
54
54
|
"find": ["\t\t\t\t\tfinalTimer = setTimeout(() => {"],
|
|
55
55
|
"replace": ["\t\t\t\t\tfinalTimer = setTimeout(() => {\n\t\t\t\t\t\treturn;"],
|
|
56
|
-
"gate": ["bash", "run.sh", "check-
|
|
56
|
+
"gate": ["bash", "run.sh", "check-remote-pair-beside"],
|
|
57
57
|
"timeoutSeconds": 600,
|
|
58
58
|
"signature": "[QK:REMOTE-TRANSPORT-HELD-PIPES-STILL-SETTLE]",
|
|
59
59
|
"signatureSource": "pi-extensions/lib/remote-pair-transport.test.ts",
|