@junghanacs/entwurf 0.35.0 → 0.36.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 +2 -2
- package/CHANGELOG.md +338 -0
- package/CONTRIBUTING.md +1 -1
- package/DELIVERY.md +15 -0
- package/FAQ.md +3 -3
- package/README.md +30 -16
- package/VERIFY.md +14 -11
- package/demo/README.md +1 -1
- package/docs/acp-backend-rail.md +29 -3
- package/docs/setup-clean-host.md +31 -23
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/backend-adapter.js +46 -2
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/model-ids.js +67 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/models.js +9 -20
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/codex-fresh-preflight.js +4 -3
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-visible-resume.js +11 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/fresh-call-dispatch.js +27 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/herdr-fresh-call.js +3 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-fresh-call.js +2 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/native-push/codex-ws-client.js +99 -18
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-runtime.js +3 -3
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/resume-launch-identity.js +13 -4
- package/mcp/entwurf-bridge/dist/pi-extensions/meta-bridge-pi-durable.js +178 -25
- package/mcp/entwurf-bridge/dist/scripts/codex-socket-classify.js +44 -0
- package/mcp/entwurf-bridge/tsconfig.build.json +5 -0
- package/package.json +20 -15
- package/pi/pi-durable/bootstrap.mjs +12 -8
- package/pi/pi-durable/carrier/runtime.js +52 -2
- package/pi/pi-durable/carrier/subagent.js +6 -1
- package/pi/pi-durable/carrier/tui.js +31 -4
- package/pi/pi-durable/carrier-relocation.mjs +2 -2
- package/pi/pi-durable/overlay/upstream-pin.json +79 -36
- package/pi-extensions/lib/acp/backend-adapter.ts +52 -2
- package/pi-extensions/lib/acp/model-ids.js +77 -0
- package/pi-extensions/lib/acp/models.ts +15 -22
- package/pi-extensions/lib/codex-fresh-preflight.ts +4 -3
- package/pi-extensions/lib/entwurf-v2-visible-resume.ts +12 -0
- package/pi-extensions/lib/fresh-call-dispatch.ts +25 -1
- package/pi-extensions/lib/herdr-fresh-call.ts +5 -0
- package/pi-extensions/lib/mux-fresh-call.ts +3 -0
- package/pi-extensions/lib/native-push/codex-ws-client.ts +129 -18
- package/pi-extensions/lib/pi-durable-runtime.ts +4 -4
- package/pi-extensions/lib/resume-launch-identity.ts +12 -4
- package/pi-extensions/meta-bridge-pi-durable.ts +230 -34
- package/run.sh +193 -58
- package/scripts/check-acp-backend-preflight.ts +10 -2
- package/scripts/check-acp-cortex.ts +7 -6
- package/scripts/check-acp-prompt-lifecycle.ts +2 -2
- package/scripts/check-acp-provider-surface.ts +1 -1
- package/scripts/check-acp-session-reuse.ts +5 -5
- package/scripts/check-acp-stop-reason.ts +2 -2
- package/scripts/check-acp-stream-hooks.ts +2 -2
- package/scripts/check-acp-usage-accounting.ts +2 -2
- package/scripts/check-codex-app-server-launch.ts +55 -12
- package/scripts/check-codex-native-push.ts +231 -12
- package/scripts/check-fresh-call-dispatch.ts +47 -4
- package/scripts/check-gate-qualification.ts +8 -6
- package/scripts/check-probe-ordering.ts +13 -6
- package/scripts/check-resume-launch-identity.ts +38 -0
- package/scripts/codex-app-server-launch.sh +54 -29
- package/scripts/codex-socket-classify.ts +46 -0
- package/scripts/emit-pi-durable-carrier.ts +159 -168
- package/scripts/mutants/acp-cortex.json +17 -8
- package/scripts/mutants/acp-set-model-readback.json +28 -0
- package/scripts/mutants/codex-app-server-launch.json +39 -12
- package/scripts/mutants/codex-native.json +15 -0
- package/scripts/mutants/control-send-receipt.json +1 -1
- package/scripts/mutants/fresh-call-dispatch.json +11 -0
- package/scripts/mutants/herdr-dev-checkout.json +70 -0
- package/scripts/mutants/pack-install.json +3 -3
- package/scripts/mutants/pi-durable.json +282 -16
- package/scripts/mutants/pi-floor.json +5 -5
- package/scripts/mutants/resume-launch-identity.json +15 -0
- package/scripts/mutants/v2-visible-resume.json +11 -0
- package/scripts/pi-durable-contact-host.mjs +1 -1
- package/scripts/resolve-acp-bridge.ts +1 -1
- package/scripts/smoke-acp-bundled-mcp-live.ts +1 -1
- package/scripts/smoke-acp-carrier-augment-live.ts +1 -1
- package/scripts/smoke-acp-long-turn-live.ts +1 -1
- package/scripts/smoke-acp-mcp-live.ts +1 -1
- package/scripts/smoke-acp-memory-containment-live.ts +1 -1
- package/scripts/smoke-acp-ordering-probe-live.ts +1 -1
- package/scripts/smoke-acp-overlay-live.ts +1 -1
- package/scripts/smoke-acp-provider-live.ts +1 -1
- package/scripts/smoke-acp-raw-turn-live.ts +1 -1
- package/scripts/smoke-acp-session-reuse-live.ts +1 -1
- package/scripts/smoke-acp-skill-live.ts +1 -1
- package/scripts/smoke-acp-socket-citizen-live.ts +2 -2
- package/scripts/smoke-acp-v2-send-live.ts +1 -1
- package/scripts/smoke-entwurf-chain-live.ts +1 -1
- package/scripts/smoke-mux-lifecycle-live.ts +1 -1
- package/pi/pi-durable/overlay/runtime-contacts.patch +0 -283
|
@@ -20,7 +20,8 @@
|
|
|
20
20
|
"gate": ["bash", "run.sh", "check-codex-app-server-launch"],
|
|
21
21
|
"timeoutSeconds": 300,
|
|
22
22
|
"signature": "[QK:CODEX-APP-SERVER-ADDRESS-MATCHES-PRODUCT-LEAF]",
|
|
23
|
-
"signatureSource": "scripts/check-codex-app-server-launch.ts"
|
|
23
|
+
"signatureSource": "scripts/check-codex-app-server-launch.ts",
|
|
24
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
24
25
|
},
|
|
25
26
|
{
|
|
26
27
|
"claim": "CODEX-APP-SERVER-EXECS-NOT-FORKS",
|
|
@@ -31,7 +32,8 @@
|
|
|
31
32
|
"gate": ["bash", "run.sh", "check-codex-app-server-launch"],
|
|
32
33
|
"timeoutSeconds": 300,
|
|
33
34
|
"signature": "[QK:CODEX-APP-SERVER-EXECS-NOT-FORKS]",
|
|
34
|
-
"signatureSource": "scripts/check-codex-app-server-launch.ts"
|
|
35
|
+
"signatureSource": "scripts/check-codex-app-server-launch.ts",
|
|
36
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
35
37
|
},
|
|
36
38
|
{
|
|
37
39
|
"claim": "CODEX-APP-SERVER-REFUSES-LIVE-SOCKET",
|
|
@@ -42,18 +44,20 @@
|
|
|
42
44
|
"gate": ["bash", "run.sh", "check-codex-app-server-launch"],
|
|
43
45
|
"timeoutSeconds": 300,
|
|
44
46
|
"signature": "[QK:CODEX-APP-SERVER-REFUSES-LIVE-SOCKET]",
|
|
45
|
-
"signatureSource": "scripts/check-codex-app-server-launch.ts"
|
|
47
|
+
"signatureSource": "scripts/check-codex-app-server-launch.ts",
|
|
48
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
46
49
|
},
|
|
47
50
|
{
|
|
48
51
|
"claim": "CODEX-APP-SERVER-REFUSES-INDETERMINATE-SOCKET",
|
|
49
|
-
"title": "reading
|
|
52
|
+
"title": "reading the classifier's indeterminate verdict (a symlink that is not Codex's exact alias, a foreign owner, not a socket) as an absent path lets the launch clobber something it could not identify \u2014 the same classification the delivery rail refuses on, silently downgraded at the one place that would overwrite it",
|
|
50
53
|
"subject": "scripts/codex-app-server-launch.sh",
|
|
51
|
-
"find": ["\
|
|
52
|
-
"replace": ["\
|
|
54
|
+
"find": ["\tindeterminate) probe=\"indeterminate\t$classified_detail\" ;;"],
|
|
55
|
+
"replace": ["\tindeterminate) probe=\"absent\" ;;"],
|
|
53
56
|
"gate": ["bash", "run.sh", "check-codex-app-server-launch"],
|
|
54
57
|
"timeoutSeconds": 300,
|
|
55
58
|
"signature": "[QK:CODEX-APP-SERVER-REFUSES-INDETERMINATE-SOCKET]",
|
|
56
|
-
"signatureSource": "scripts/check-codex-app-server-launch.ts"
|
|
59
|
+
"signatureSource": "scripts/check-codex-app-server-launch.ts",
|
|
60
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
57
61
|
},
|
|
58
62
|
{
|
|
59
63
|
"claim": "CODEX-APP-SERVER-REFUSES-SECOND-LISTEN",
|
|
@@ -72,7 +76,8 @@
|
|
|
72
76
|
"gate": ["bash", "run.sh", "check-codex-app-server-launch"],
|
|
73
77
|
"timeoutSeconds": 300,
|
|
74
78
|
"signature": "[QK:CODEX-APP-SERVER-REFUSES-SECOND-LISTEN]",
|
|
75
|
-
"signatureSource": "scripts/check-codex-app-server-launch.ts"
|
|
79
|
+
"signatureSource": "scripts/check-codex-app-server-launch.ts",
|
|
80
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
76
81
|
},
|
|
77
82
|
{
|
|
78
83
|
"claim": "CODEX-APP-SERVER-READS-PROC-HOLDER",
|
|
@@ -94,7 +99,8 @@
|
|
|
94
99
|
"gate": ["bash", "run.sh", "check-codex-app-server-launch"],
|
|
95
100
|
"timeoutSeconds": 300,
|
|
96
101
|
"signature": "[QK:CODEX-APP-SERVER-READS-PROC-HOLDER]",
|
|
97
|
-
"signatureSource": "scripts/check-codex-app-server-launch.ts"
|
|
102
|
+
"signatureSource": "scripts/check-codex-app-server-launch.ts",
|
|
103
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
98
104
|
},
|
|
99
105
|
{
|
|
100
106
|
"claim": "CODEX-APP-SERVER-REFUSES-UNRECOGNISED-PROBE",
|
|
@@ -115,7 +121,26 @@
|
|
|
115
121
|
"gate": ["bash", "run.sh", "check-codex-app-server-launch"],
|
|
116
122
|
"timeoutSeconds": 300,
|
|
117
123
|
"signature": "[QK:CODEX-APP-SERVER-REFUSES-UNRECOGNISED-PROBE]",
|
|
118
|
-
"signatureSource": "scripts/check-codex-app-server-launch.ts"
|
|
124
|
+
"signatureSource": "scripts/check-codex-app-server-launch.ts",
|
|
125
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
"claim": "CODEX-APP-SERVER-REFUSES-UNRECOGNISED-CLASSIFIER",
|
|
129
|
+
"title": "passing an unrecognised classifier word through to the probe verdicts lets a word the classifier never gives \u2014 'stale' \u2014 be read as a dead socket file and launched over, so a classifier that answers something nobody wrote decides that this launch may clobber the endpoint",
|
|
130
|
+
"subject": "scripts/codex-app-server-launch.sh",
|
|
131
|
+
"find": [
|
|
132
|
+
"\t*)",
|
|
133
|
+
"\t\tfail \"codex-app-server-socket-probe-unrecognised: the socket classifier answered",
|
|
134
|
+
" '$classified_word', which is not one of socket/absent/dangling/indeterminate. Refusing to launch on a",
|
|
135
|
+
" reading nothing understands.\"",
|
|
136
|
+
"\t\t;;"
|
|
137
|
+
],
|
|
138
|
+
"replace": ["\t*) probe=\"$classified_word\" ;;"],
|
|
139
|
+
"gate": ["bash", "run.sh", "check-codex-app-server-launch"],
|
|
140
|
+
"timeoutSeconds": 300,
|
|
141
|
+
"signature": "[QK:CODEX-APP-SERVER-REFUSES-UNRECOGNISED-CLASSIFIER]",
|
|
142
|
+
"signatureSource": "scripts/check-codex-app-server-launch.ts",
|
|
143
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
119
144
|
},
|
|
120
145
|
{
|
|
121
146
|
"claim": "CODEX-APP-SERVER-REFUSES-RELATIVE-SOCKET",
|
|
@@ -135,7 +160,8 @@
|
|
|
135
160
|
"gate": ["bash", "run.sh", "check-codex-app-server-launch"],
|
|
136
161
|
"timeoutSeconds": 300,
|
|
137
162
|
"signature": "[QK:CODEX-APP-SERVER-REFUSES-RELATIVE-SOCKET]",
|
|
138
|
-
"signatureSource": "scripts/check-codex-app-server-launch.ts"
|
|
163
|
+
"signatureSource": "scripts/check-codex-app-server-launch.ts",
|
|
164
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
139
165
|
},
|
|
140
166
|
{
|
|
141
167
|
"claim": "CODEX-APP-SERVER-REFUSES-CONTROL-CHAR-SOCKET",
|
|
@@ -151,7 +177,8 @@
|
|
|
151
177
|
"gate": ["bash", "run.sh", "check-codex-app-server-launch"],
|
|
152
178
|
"timeoutSeconds": 300,
|
|
153
179
|
"signature": "[QK:CODEX-APP-SERVER-REFUSES-CONTROL-CHAR-SOCKET]",
|
|
154
|
-
"signatureSource": "scripts/check-codex-app-server-launch.ts"
|
|
180
|
+
"signatureSource": "scripts/check-codex-app-server-launch.ts",
|
|
181
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
155
182
|
}
|
|
156
183
|
]
|
|
157
184
|
}
|
|
@@ -28,6 +28,21 @@
|
|
|
28
28
|
"signature": "[QK:CODEX-NATIVE-LOADED-PROBE]",
|
|
29
29
|
"signatureSource": "scripts/check-codex-native-push.ts"
|
|
30
30
|
},
|
|
31
|
+
{
|
|
32
|
+
"claim": "CODEX-SOCKET-ALIAS-EXACT",
|
|
33
|
+
"title": "accepting any symlink into Codex's socket directory instead of the one target Codex derives for THIS advertised path lets a retargeted alias hand delivery, preflight and the launcher a socket that belongs to a different listen address \u2014 the exact-target equality is the whole of what makes the 0.162.1 alias trustworthy",
|
|
34
|
+
"subject": "pi-extensions/lib/native-push/codex-ws-client.ts",
|
|
35
|
+
"find": [
|
|
36
|
+
"\tif (target !== expected) {",
|
|
37
|
+
"\t\treturn refuse(`app-server socket is a symlink that is not Codex's rendezvous alias: ${socketPath} -> ${target}`);",
|
|
38
|
+
"\t}"
|
|
39
|
+
],
|
|
40
|
+
"replace": ["\t// any target inside Codex's socket directory is good enough"],
|
|
41
|
+
"gate": ["bash", "run.sh", "check-codex-native-push"],
|
|
42
|
+
"timeoutSeconds": 120,
|
|
43
|
+
"signature": "[QK:CODEX-SOCKET-ALIAS-EXACT]",
|
|
44
|
+
"signatureSource": "scripts/check-codex-native-push.ts"
|
|
45
|
+
},
|
|
31
46
|
{
|
|
32
47
|
"claim": "CODEX-NATIVE-VENDOR-QUEUE",
|
|
33
48
|
"title": "native delivery invokes a different Codex subcommand instead of the measured one-shot queue surface",
|
|
@@ -181,7 +181,7 @@
|
|
|
181
181
|
"claim": "PI-CORE-PIN-TRACKS-FLOOR",
|
|
182
182
|
"title": "the queue oracle's pi-agent-core pin drifts off the floor the rest of the pi runtime is pinned to, so the oracle keeps answering honestly — about a pi nobody in this repo runs",
|
|
183
183
|
"subject": "package.json",
|
|
184
|
-
"find": ["\"@earendil-works/pi-agent-core\": \"1.
|
|
184
|
+
"find": ["\"@earendil-works/pi-agent-core\": \"1.2.0\","],
|
|
185
185
|
"replace": ["\"@earendil-works/pi-agent-core\": \"0.87.1\","],
|
|
186
186
|
"gate": ["bash", "run.sh", "check-dep-versions"],
|
|
187
187
|
"timeoutSeconds": 300,
|
|
@@ -138,6 +138,17 @@
|
|
|
138
138
|
"timeoutSeconds": 120,
|
|
139
139
|
"signature": "[QK:FCD-NO-SYNC-SPAWN]",
|
|
140
140
|
"signatureSource": "scripts/check-fresh-call-dispatch.ts"
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
"claim": "FCD-ACP-MODEL-EXACT",
|
|
144
|
+
"title": "dropping the exact-curation check lets a retired entwurf/claude-sonnet-5 reach a rail, where Pi opens it on the Cortex row by substring",
|
|
145
|
+
"subject": "pi-extensions/lib/fresh-call-dispatch.ts",
|
|
146
|
+
"find": ["\treturn !isCuratedAcpModelId(trimmed.slice(slash + 1));"],
|
|
147
|
+
"replace": ["\treturn false;"],
|
|
148
|
+
"gate": ["bash", "run.sh", "check-fresh-call-dispatch"],
|
|
149
|
+
"timeoutSeconds": 120,
|
|
150
|
+
"signature": "[QK:FCD-ACP-MODEL-EXACT]",
|
|
151
|
+
"signatureSource": "scripts/check-fresh-call-dispatch.ts"
|
|
141
152
|
}
|
|
142
153
|
]
|
|
143
154
|
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"lane": "herdr-dev-checkout",
|
|
4
|
+
"mutants": [
|
|
5
|
+
{
|
|
6
|
+
"claim": "DEV-MENU-EXPLICIT-CONFIRM",
|
|
7
|
+
"title": "the source menu invokes apply after an unconfirmed selection instead of requiring exact DEV; the existing helper guards do not substitute for the operator's choice",
|
|
8
|
+
"subject": "run.sh",
|
|
9
|
+
"find": [" if [ \"$confirm\" != DEV ]; then"],
|
|
10
|
+
"replace": [" if false; then"],
|
|
11
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
12
|
+
"timeoutSeconds": 600,
|
|
13
|
+
"signature": "[QK:DEV-MENU-EXPLICIT-CONFIRM]",
|
|
14
|
+
"signatureSource": "plugins/herdr/use-dev-checkout.test.mjs",
|
|
15
|
+
"build": {
|
|
16
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
17
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"claim": "HERDR-DEV-PREPARE-BEFORE-TEARDOWN",
|
|
22
|
+
"title": "deactivation must be preceded by a successful source bridge proof, not merely a build",
|
|
23
|
+
"subject": "plugins/herdr/use-dev-checkout.sh",
|
|
24
|
+
"find": ["(cd \"$ROOT\" && pnpm run build-bridge)", "\"$ROOT/run.sh\" check-bridge"],
|
|
25
|
+
"replace": ["(cd \"$ROOT\" && pnpm run build-bridge)", ":"],
|
|
26
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
27
|
+
"timeoutSeconds": 600,
|
|
28
|
+
"signatureSource": "plugins/herdr/use-dev-checkout.test.mjs",
|
|
29
|
+
"build": {
|
|
30
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
31
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
32
|
+
},
|
|
33
|
+
"signature": "[QK:HERDR-DEV-PREPARE-BEFORE-TEARDOWN]"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"claim": "HERDR-DEV-RECHECK-BEFORE-TEARDOWN",
|
|
37
|
+
"title": "an old-runtime process appearing during source preparation must refuse before the owner is deactivated",
|
|
38
|
+
"subject": "plugins/herdr/use-dev-checkout.sh",
|
|
39
|
+
"find": ["quiescent", "", "stage=owned-deactivate"],
|
|
40
|
+
"replace": [":", "", "stage=owned-deactivate"],
|
|
41
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
42
|
+
"timeoutSeconds": 600,
|
|
43
|
+
"signatureSource": "plugins/herdr/use-dev-checkout.test.mjs",
|
|
44
|
+
"build": {
|
|
45
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
46
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
47
|
+
},
|
|
48
|
+
"signature": "[QK:HERDR-DEV-RECHECK-BEFORE-TEARDOWN]"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"claim": "HERDR-DEV-NO-SUCCESS-ON-DRIFT",
|
|
52
|
+
"title": "actual Pi model-id drift must remain non-green rather than claiming successful developer wiring",
|
|
53
|
+
"subject": "plugins/herdr/use-dev-checkout.sh",
|
|
54
|
+
"find": [
|
|
55
|
+
"[ \"$ACTUAL_IDS\" = \"$SOURCE_IDS\" ] || { echo '[use-dev-checkout] actual Pi model IDs differ from the explicit checkout provider; not accepted.' >&2; exit 1; }"
|
|
56
|
+
],
|
|
57
|
+
"replace": [
|
|
58
|
+
"true || { echo '[use-dev-checkout] actual Pi model IDs differ from the explicit checkout provider; not accepted.' >&2; exit 1; }"
|
|
59
|
+
],
|
|
60
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
61
|
+
"timeoutSeconds": 600,
|
|
62
|
+
"signatureSource": "plugins/herdr/use-dev-checkout.test.mjs",
|
|
63
|
+
"build": {
|
|
64
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
65
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
66
|
+
},
|
|
67
|
+
"signature": "[QK:HERDR-DEV-NO-SUCCESS-ON-DRIFT]"
|
|
68
|
+
}
|
|
69
|
+
]
|
|
70
|
+
}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"claim": "PACK-INSTALL-PIN-MATCHER-BOUNDED",
|
|
7
7
|
"title": "the pin-leak matcher loses its version boundary and blesses substring lookalikes — @0.85.10 reads as the pinned 0.85.1 and the gate announces a verified tree it never verified (independent review, 2026-08-25)",
|
|
8
8
|
"subject": "run.sh",
|
|
9
|
-
"find": [" grep '^@earendil-works+' | grep -Ev '@1\\.
|
|
9
|
+
"find": [" grep '^@earendil-works+' | grep -Ev '@1\\.2\\.0(_|$)' || true"],
|
|
10
10
|
"replace": [" grep '^@earendil-works+' | grep -v '@0\\.87\\.1' || true"],
|
|
11
11
|
"gate": ["bash", "run.sh", "check-pack-pin-matcher"],
|
|
12
12
|
"timeoutSeconds": 120,
|
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
"claim": "PACK-INSTALL-PIN-MATCHER-COVERS-CLOSURE",
|
|
18
18
|
"title": "the pin-leak matcher narrows back to the pi-* families and goes blind to a non-pi member of the same runtime closure — @earendil-works/chord (new in pi 0.85.0, a runtime dependency of pi-coding-agent/pi-agent-core/pi-client/pi-protocol) floats unpinned while the gate prints a verified pin (measured 2026-09-06 on a real 0.85.1 install tree)",
|
|
19
19
|
"subject": "run.sh",
|
|
20
|
-
"find": [" grep '^@earendil-works+' | grep -Ev '@1\\.
|
|
21
|
-
"replace": [" grep '^@earendil-works+pi-' | grep -Ev '@1\\.
|
|
20
|
+
"find": [" grep '^@earendil-works+' | grep -Ev '@1\\.2\\.0(_|$)' || true"],
|
|
21
|
+
"replace": [" grep '^@earendil-works+pi-' | grep -Ev '@1\\.2\\.0(_|$)' || true"],
|
|
22
22
|
"gate": ["bash", "run.sh", "check-pack-pin-matcher"],
|
|
23
23
|
"timeoutSeconds": 120,
|
|
24
24
|
"signature": "[QK:PACK-INSTALL-PIN-MATCHER-COVERS-CLOSURE]",
|
|
@@ -277,6 +277,123 @@
|
|
|
277
277
|
"output": "mcp/entwurf-bridge/dist"
|
|
278
278
|
}
|
|
279
279
|
},
|
|
280
|
+
{
|
|
281
|
+
"claim": "PI-DURABLE-RECEIVER-READ-WITHDRAWS-STALE",
|
|
282
|
+
"title": "an inbox read no longer withdraws the notices its drain made stale, so each still-queued notice is placed later as its own run and an empty read (#140)",
|
|
283
|
+
"subject": "pi-extensions/meta-bridge-pi-durable.ts",
|
|
284
|
+
"find": ["\t\t\t\tawait withdrawDrained(context);\n"],
|
|
285
|
+
"replace": [""],
|
|
286
|
+
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
287
|
+
"timeoutSeconds": 300,
|
|
288
|
+
"signature": "[QK:PI-DURABLE-RECEIVER-READ-WITHDRAWS-STALE]",
|
|
289
|
+
"signatureSource": "pi-extensions/meta-bridge-pi-durable.test.ts",
|
|
290
|
+
"build": {
|
|
291
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
292
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
293
|
+
}
|
|
294
|
+
},
|
|
295
|
+
{
|
|
296
|
+
"claim": "PI-DURABLE-RECEIVER-FOREIGN-GARDEN-READ-KEEPS",
|
|
297
|
+
"title": "the per-notice file predicate is bypassed, so any read — another garden's included — withdraws notices whose own mail is still unread, and that mail is never announced again",
|
|
298
|
+
"subject": "pi-extensions/meta-bridge-pi-durable.ts",
|
|
299
|
+
"find": ["\t\t\tif (notice.fresh.some((name) => unread.has(`${name}.delivered`))) continue;\n"],
|
|
300
|
+
"replace": [""],
|
|
301
|
+
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
302
|
+
"timeoutSeconds": 300,
|
|
303
|
+
"signature": "[QK:PI-DURABLE-RECEIVER-FOREIGN-GARDEN-READ-KEEPS]",
|
|
304
|
+
"signatureSource": "pi-extensions/meta-bridge-pi-durable.test.ts",
|
|
305
|
+
"build": {
|
|
306
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
307
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
308
|
+
}
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
"claim": "PI-DURABLE-RECEIVER-PARTIAL-DRAIN-WITHDRAWS-ONLY-ARCHIVED",
|
|
312
|
+
"title": "the withdrawal runs only after a successful read, so a drain that failed part-way leaves the notices of the mail it already archived queued, stale",
|
|
313
|
+
"subject": "pi-extensions/meta-bridge-pi-durable.ts",
|
|
314
|
+
"find": [
|
|
315
|
+
"\t\t\treturn await call();\n\t\t} finally {\n\t\t\ttry {\n\t\t\t\tawait withdrawDrained(context);\n\t\t\t} finally {\n\t\t\t\tleaveGate();\n\t\t\t}\n\t\t}\n"
|
|
316
|
+
],
|
|
317
|
+
"replace": [
|
|
318
|
+
"\t\t\tconst answered = await call();\n\t\t\tif (!answered.isError) await withdrawDrained(context);\n\t\t\treturn answered;\n\t\t} finally {\n\t\t\tleaveGate();\n\t\t}\n"
|
|
319
|
+
],
|
|
320
|
+
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
321
|
+
"timeoutSeconds": 300,
|
|
322
|
+
"signature": "[QK:PI-DURABLE-RECEIVER-PARTIAL-DRAIN-WITHDRAWS-ONLY-ARCHIVED]",
|
|
323
|
+
"signatureSource": "pi-extensions/meta-bridge-pi-durable.test.ts",
|
|
324
|
+
"build": {
|
|
325
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
326
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
327
|
+
}
|
|
328
|
+
},
|
|
329
|
+
{
|
|
330
|
+
"claim": "PI-DURABLE-RECEIVER-READ-SERIALIZED",
|
|
331
|
+
"title": "an inbox read no longer waits for the doorbell's gate, so a drain that overtakes an admission in flight withdraws before that notice's handle exists and the notice stays queued, stale",
|
|
332
|
+
"subject": "pi-extensions/meta-bridge-pi-durable.ts",
|
|
333
|
+
"find": ["\t\tawait enterGate();\n"],
|
|
334
|
+
"replace": [""],
|
|
335
|
+
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
336
|
+
"timeoutSeconds": 300,
|
|
337
|
+
"signature": "[QK:PI-DURABLE-RECEIVER-READ-SERIALIZED]",
|
|
338
|
+
"signatureSource": "pi-extensions/meta-bridge-pi-durable.test.ts",
|
|
339
|
+
"build": {
|
|
340
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
341
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
342
|
+
}
|
|
343
|
+
},
|
|
344
|
+
{
|
|
345
|
+
"claim": "PI-DURABLE-RECEIVER-ARRIVAL-DURING-READ-ANNOUNCED",
|
|
346
|
+
"title": "the gate opening after a read forgets the signal that landed while it was held, so mail that arrived after the drain is never announced until another arrival",
|
|
347
|
+
"subject": "pi-extensions/meta-bridge-pi-durable.ts",
|
|
348
|
+
"find": ["\t\tif (pending) void ring(\"signal\");\n"],
|
|
349
|
+
"replace": [""],
|
|
350
|
+
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
351
|
+
"timeoutSeconds": 300,
|
|
352
|
+
"signature": "[QK:PI-DURABLE-RECEIVER-ARRIVAL-DURING-READ-ANNOUNCED]",
|
|
353
|
+
"signatureSource": "pi-extensions/meta-bridge-pi-durable.test.ts",
|
|
354
|
+
"build": {
|
|
355
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
356
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
357
|
+
}
|
|
358
|
+
},
|
|
359
|
+
{
|
|
360
|
+
"claim": "PI-DURABLE-RECEIVER-WITHDRAW-FAILURE-KEEPS-READ",
|
|
361
|
+
"title": "a notice whose native withdraw rejected is put back among the held ones, so every later read retries that withdraw and names the same failure again",
|
|
362
|
+
"subject": "pi-extensions/meta-bridge-pi-durable.ts",
|
|
363
|
+
"find": [
|
|
364
|
+
"\t\t\t\tnoteWithdrawalFailure({ reason: \"abort-failed\", requestId: notice.requestId, detail: describeError(error) });\n"
|
|
365
|
+
],
|
|
366
|
+
"replace": [
|
|
367
|
+
"\t\t\t\tnoteWithdrawalFailure({ reason: \"abort-failed\", requestId: notice.requestId, detail: describeError(error) });\n\t\t\t\tnotices.push(notice);\n"
|
|
368
|
+
],
|
|
369
|
+
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
370
|
+
"timeoutSeconds": 300,
|
|
371
|
+
"signature": "[QK:PI-DURABLE-RECEIVER-WITHDRAW-FAILURE-KEEPS-READ]",
|
|
372
|
+
"signatureSource": "pi-extensions/meta-bridge-pi-durable.test.ts",
|
|
373
|
+
"build": {
|
|
374
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
375
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
376
|
+
}
|
|
377
|
+
},
|
|
378
|
+
{
|
|
379
|
+
"claim": "PI-DURABLE-RECEIVER-INSPECTION-FAILURE-KEEPS-NOTICES",
|
|
380
|
+
"title": "a mailbox that could not be listed is judged as if it held no unread mail, so every held notice is withdrawn while its mail may still be unread",
|
|
381
|
+
"subject": "pi-extensions/meta-bridge-pi-durable.ts",
|
|
382
|
+
"find": [
|
|
383
|
+
"\t\t\tnoteWithdrawalFailure({ reason: \"inspection-failed\", detail: `${inbox}: ${describeError(error)}` });\n\t\t\treturn;\n"
|
|
384
|
+
],
|
|
385
|
+
"replace": [
|
|
386
|
+
"\t\t\tnoteWithdrawalFailure({ reason: \"inspection-failed\", detail: `${inbox}: ${describeError(error)}` });\n\t\t\tunread = new Set();\n"
|
|
387
|
+
],
|
|
388
|
+
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
389
|
+
"timeoutSeconds": 300,
|
|
390
|
+
"signature": "[QK:PI-DURABLE-RECEIVER-INSPECTION-FAILURE-KEEPS-NOTICES]",
|
|
391
|
+
"signatureSource": "pi-extensions/meta-bridge-pi-durable.test.ts",
|
|
392
|
+
"build": {
|
|
393
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
394
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
395
|
+
}
|
|
396
|
+
},
|
|
280
397
|
{
|
|
281
398
|
"claim": "PI-DURABLE-CARRIER-RELOCATION-TWO-RULES",
|
|
282
399
|
"title": "a carrier file's import of a sibling keeps its .ts specifier, so the installed carrier asks Node for a file that was never emitted",
|
|
@@ -341,7 +458,7 @@
|
|
|
341
458
|
"claim": "PI-DURABLE-CARRIER-PIN-MATCHES",
|
|
342
459
|
"title": "the pin records a digest the committed carrier file does not carry, so a carrier edited after emission would still be the declared one",
|
|
343
460
|
"subject": "pi/pi-durable/overlay/upstream-pin.json",
|
|
344
|
-
"find": ["\"sha256\": \"
|
|
461
|
+
"find": ["\"sha256\": \"60c2965eadbdbbe78fce1b7eeb89d97eb3104a30b7d58ebca87009d2e9118403\""],
|
|
345
462
|
"replace": ["\"sha256\": \"0000000000000000000000000000000000000000000000000000000000000000\""],
|
|
346
463
|
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
347
464
|
"timeoutSeconds": 300,
|
|
@@ -716,19 +833,40 @@
|
|
|
716
833
|
}
|
|
717
834
|
},
|
|
718
835
|
{
|
|
719
|
-
"claim": "PI-DURABLE-CARRIER-
|
|
720
|
-
"title": "
|
|
836
|
+
"claim": "PI-DURABLE-CARRIER-EMIT-SOURCE-EQUAL",
|
|
837
|
+
"title": "the owned source changes and the carrier is not re-emitted, so the shipped app is no longer the emission of the source the repository reviews",
|
|
838
|
+
"subject": "pi/pi-durable/src/experimental/durable/tui.ts",
|
|
839
|
+
"find": ["\t\tconst forms = [...detailed, tasks, `⏳ ${n}`, `⏳${n}`, `*${n}`, \"*+\", \"*\"];"],
|
|
840
|
+
"replace": ["\t\tconst forms = [...detailed, tasks, `⏳ ${n}`, `⏳${n}`, `*${n}`, \"*\"];"],
|
|
841
|
+
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
842
|
+
"timeoutSeconds": 300,
|
|
843
|
+
"signature": "[QK:PI-DURABLE-CARRIER-EMIT-SOURCE-EQUAL]",
|
|
844
|
+
"signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
|
|
845
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
846
|
+
},
|
|
847
|
+
{
|
|
848
|
+
"claim": "PI-DURABLE-CARRIER-EMIT-NODE-EXACT",
|
|
849
|
+
"title": "the emitter stops comparing its own Node with the pinned one, so a carrier emitted under any Node reads as the pinned emission",
|
|
721
850
|
"subject": "scripts/emit-pi-durable-carrier.ts",
|
|
722
|
-
"find": ["\tif (
|
|
723
|
-
"replace": ["\tif (
|
|
851
|
+
"find": ["\tif (pinned !== running) {"],
|
|
852
|
+
"replace": ["\tif (false) {"],
|
|
724
853
|
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
725
854
|
"timeoutSeconds": 300,
|
|
726
|
-
"signature": "[QK:PI-DURABLE-CARRIER-
|
|
855
|
+
"signature": "[QK:PI-DURABLE-CARRIER-EMIT-NODE-EXACT]",
|
|
727
856
|
"signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
|
|
728
|
-
"build": {
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
857
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
858
|
+
},
|
|
859
|
+
{
|
|
860
|
+
"claim": "PI-DURABLE-SOURCE-FENCE-RESOLVES",
|
|
861
|
+
"title": "the source fence inherits the root program's exclusion of pi/pi-durable/src, so the owned source sits in no typecheck program at all",
|
|
862
|
+
"subject": "pi/pi-durable/tsconfig.json",
|
|
863
|
+
"find": ["\t\"exclude\": []"],
|
|
864
|
+
"replace": ["\t\"files\": []"],
|
|
865
|
+
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
866
|
+
"timeoutSeconds": 300,
|
|
867
|
+
"signature": "[QK:PI-DURABLE-SOURCE-FENCE-RESOLVES]",
|
|
868
|
+
"signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
|
|
869
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
732
870
|
},
|
|
733
871
|
{
|
|
734
872
|
"claim": "PI-DURABLE-FOOTER-GRAPH-LIFETIME",
|
|
@@ -781,12 +919,8 @@
|
|
|
781
919
|
"claim": "PI-DURABLE-FOOTER-BADGE-PROTECTED",
|
|
782
920
|
"title": "the badge sits last in the dock, so the renderer's bottom clip drops it first on a short terminal",
|
|
783
921
|
"subject": "pi/pi-durable/carrier/tui.js",
|
|
784
|
-
"find": [
|
|
785
|
-
|
|
786
|
-
],
|
|
787
|
-
"replace": [
|
|
788
|
-
"\t\t{ component: new VStack([...dock, { component: badge, shrink: 0 }]), basis: \"auto\", grow: 0, shrink: 1, minSize: 1 },"
|
|
789
|
-
],
|
|
922
|
+
"find": ["\t\t\tcomponent: new VStack([{ component: badge, shrink: 0 }, ...dock]),"],
|
|
923
|
+
"replace": ["\t\t\tcomponent: new VStack([...dock, { component: badge, shrink: 0 }]),"],
|
|
790
924
|
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
791
925
|
"timeoutSeconds": 300,
|
|
792
926
|
"signature": "[QK:PI-DURABLE-FOOTER-BADGE-PROTECTED]",
|
|
@@ -885,6 +1019,138 @@
|
|
|
885
1019
|
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
886
1020
|
"output": "mcp/entwurf-bridge/dist"
|
|
887
1021
|
}
|
|
1022
|
+
},
|
|
1023
|
+
{
|
|
1024
|
+
"claim": "PI-DURABLE-SOURCE-NOT-SHIPPED",
|
|
1025
|
+
"title": "the files allowlist admits pi/pi-durable/src, so the owned TypeScript source rides the tarball beside the carrier an installed consumer runs",
|
|
1026
|
+
"subject": "package.json",
|
|
1027
|
+
"find": ["\t\t\"pi/pi-durable/carrier/\",\n"],
|
|
1028
|
+
"replace": ["\t\t\"pi/pi-durable/carrier/\",\n\t\t\"pi/pi-durable/src/\",\n"],
|
|
1029
|
+
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
1030
|
+
"timeoutSeconds": 300,
|
|
1031
|
+
"signature": "[QK:PI-DURABLE-SOURCE-NOT-SHIPPED]",
|
|
1032
|
+
"signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
|
|
1033
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1034
|
+
},
|
|
1035
|
+
{
|
|
1036
|
+
"claim": "PI-DURABLE-EMITTER-NODE-CI-BOUND",
|
|
1037
|
+
"title": "the CI check job floats its Node major again, so the floor that proves the carrier emission runs under a Node other than the pinned emitter",
|
|
1038
|
+
"subject": ".github/workflows/ci.yml",
|
|
1039
|
+
"find": [" node-version: 24.18.1\n"],
|
|
1040
|
+
"replace": [" node-version: 24\n"],
|
|
1041
|
+
"gate": ["bash", "run.sh", "check-node-floor-coherence"],
|
|
1042
|
+
"timeoutSeconds": 120,
|
|
1043
|
+
"signature": "[QK:PI-DURABLE-EMITTER-NODE-CI-BOUND]",
|
|
1044
|
+
"signatureSource": "run.sh"
|
|
1045
|
+
},
|
|
1046
|
+
{
|
|
1047
|
+
"claim": "PI-DURABLE-EMITTER-NODE-CI-REQUIRED",
|
|
1048
|
+
"title": "the check:full step's ENTWURF_REQUIRE_EMITTER_NODE line is commented out, so an emitter-identity mismatch on the CI floor becomes a skip while the workflow text still names the variable",
|
|
1049
|
+
"subject": ".github/workflows/ci.yml",
|
|
1050
|
+
"find": [" ENTWURF_REQUIRE_EMITTER_NODE: \"1\"\n"],
|
|
1051
|
+
"replace": [" # ENTWURF_REQUIRE_EMITTER_NODE: \"1\"\n"],
|
|
1052
|
+
"gate": ["bash", "run.sh", "check-node-floor-coherence"],
|
|
1053
|
+
"timeoutSeconds": 120,
|
|
1054
|
+
"signature": "[QK:PI-DURABLE-EMITTER-NODE-CI-REQUIRED]",
|
|
1055
|
+
"signatureSource": "run.sh"
|
|
1056
|
+
},
|
|
1057
|
+
{
|
|
1058
|
+
"claim": "PI-DURABLE-SUBAGENT-OUTPUT-MODEL-VISIBLE",
|
|
1059
|
+
"title": "the emitted subagent answers in `content`, the 1.1 field: on 1.2 the result still type-checks against the all-optional result and the parent model reads nothing of the child's answer",
|
|
1060
|
+
"subject": "pi/pi-durable/carrier/subagent.js",
|
|
1061
|
+
"find": ["\t\t\t\t\toutput: [{ type: \"text\", text }],"],
|
|
1062
|
+
"replace": ["\t\t\t\t\tcontent: [{ type: \"text\", text }],"],
|
|
1063
|
+
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
1064
|
+
"timeoutSeconds": 300,
|
|
1065
|
+
"signature": "[QK:PI-DURABLE-SUBAGENT-OUTPUT-MODEL-VISIBLE]",
|
|
1066
|
+
"signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
|
|
1067
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1068
|
+
},
|
|
1069
|
+
{
|
|
1070
|
+
"claim": "PI-DURABLE-BRIDGE-TOOL-OUTPUT-MODEL-VISIBLE",
|
|
1071
|
+
"title": "the contact's bridge tools answer in `content`, the 1.1 field, past the declared result type: the bridge still builds and the model reads none of the bridge's text",
|
|
1072
|
+
"subject": "pi-extensions/meta-bridge-pi-durable.ts",
|
|
1073
|
+
"find": ["\t\t\treturn { output: [{ type: \"text\", text: result.text }] };"],
|
|
1074
|
+
"replace": ["\t\t\treturn { content: [{ type: \"text\", text: result.text }] } as unknown as DurableToolResult;"],
|
|
1075
|
+
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
1076
|
+
"timeoutSeconds": 300,
|
|
1077
|
+
"signature": "[QK:PI-DURABLE-BRIDGE-TOOL-OUTPUT-MODEL-VISIBLE]",
|
|
1078
|
+
"signatureSource": "pi-extensions/meta-bridge-pi-durable.test.ts",
|
|
1079
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1080
|
+
},
|
|
1081
|
+
{
|
|
1082
|
+
"claim": "PI-DURABLE-FATAL-SESSION-VIEW",
|
|
1083
|
+
"title": "the close listener stops recording the failure: a Session that failed and closed itself looks open, and the host learns of it only if `closed` ever settles, which a tool ignoring its abort can hold off for good",
|
|
1084
|
+
"subject": "pi/pi-durable/carrier/runtime.js",
|
|
1085
|
+
"find": ["\t\t\tupdate({ failure: {} });"],
|
|
1086
|
+
"replace": ["\t\t\t// the failure is not recorded"],
|
|
1087
|
+
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
1088
|
+
"timeoutSeconds": 300,
|
|
1089
|
+
"signature": "[QK:PI-DURABLE-FATAL-SESSION-VIEW]",
|
|
1090
|
+
"signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
|
|
1091
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1092
|
+
},
|
|
1093
|
+
{
|
|
1094
|
+
"claim": "PI-DURABLE-FATAL-SESSION-SHOWN",
|
|
1095
|
+
"title": "the TUI stops drawing the failed session's line: the view knows, the screen keeps the last live frame and every later keystroke looks accepted",
|
|
1096
|
+
"subject": "pi/pi-durable/carrier/tui.js",
|
|
1097
|
+
"find": ["\tif (view.failure !== undefined) {"],
|
|
1098
|
+
"replace": ["\tif (view.failure === null) {"],
|
|
1099
|
+
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
1100
|
+
"timeoutSeconds": 300,
|
|
1101
|
+
"signature": "[QK:PI-DURABLE-FATAL-SESSION-SHOWN]",
|
|
1102
|
+
"signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
|
|
1103
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1104
|
+
},
|
|
1105
|
+
{
|
|
1106
|
+
"claim": "PI-DURABLE-FATAL-SUBMIT-REFUSED",
|
|
1107
|
+
"title": "input to a failed session is handed to the SDK instead of being refused by name: it fails later with the SDK's generic error and the user is not told the session takes no input",
|
|
1108
|
+
"subject": "pi/pi-durable/carrier/runtime.js",
|
|
1109
|
+
"find": ["\t\t\t\t\tif (state.failure !== undefined) {"],
|
|
1110
|
+
"replace": ["\t\t\t\t\tif (state.failure === null) {"],
|
|
1111
|
+
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
1112
|
+
"timeoutSeconds": 300,
|
|
1113
|
+
"signature": "[QK:PI-DURABLE-FATAL-SUBMIT-REFUSED]",
|
|
1114
|
+
"signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
|
|
1115
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1116
|
+
},
|
|
1117
|
+
{
|
|
1118
|
+
"claim": "PI-DURABLE-RECEIVER-RETIRE-ON-FATAL",
|
|
1119
|
+
"title": "the doorbell ignores the session's failure: its marker stays and senders keep waking a host that can admit nothing, until a ring happens to be rejected",
|
|
1120
|
+
"subject": "pi-extensions/meta-bridge-pi-durable.ts",
|
|
1121
|
+
"find": ["const problems = retire(\"session-failed\", \"the durable session failed and closed itself\");"],
|
|
1122
|
+
"replace": ["const problems: string[] = [];"],
|
|
1123
|
+
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
1124
|
+
"timeoutSeconds": 300,
|
|
1125
|
+
"signature": "[QK:PI-DURABLE-RECEIVER-RETIRE-ON-FATAL]",
|
|
1126
|
+
"signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
|
|
1127
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1128
|
+
},
|
|
1129
|
+
{
|
|
1130
|
+
"claim": "PI-DURABLE-SELF-CLOSE-NOT-FAILURE",
|
|
1131
|
+
"title": "close() keeps its close listener subscribed: every normal exit reports a failed session and retires its listeners as if the storage had failed",
|
|
1132
|
+
"subject": "pi/pi-durable/carrier/runtime.js",
|
|
1133
|
+
"find": [
|
|
1134
|
+
"\t\t\t\t\t// First: the Session runs its close listeners inside its own close call.\n\t\t\t\t\tunsubscribeClose();"
|
|
1135
|
+
],
|
|
1136
|
+
"replace": ["\t\t\t\t\t// First: the Session runs its close listeners inside its own close call."],
|
|
1137
|
+
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
1138
|
+
"timeoutSeconds": 300,
|
|
1139
|
+
"signature": "[QK:PI-DURABLE-SELF-CLOSE-NOT-FAILURE]",
|
|
1140
|
+
"signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
|
|
1141
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1142
|
+
},
|
|
1143
|
+
{
|
|
1144
|
+
"claim": "PI-DURABLE-COMPACTION-FAILURE-SHOWN",
|
|
1145
|
+
"title": "the TUI drops the conversation's retained compaction failure: a failed background compaction vanishes from the screen once its status is removed",
|
|
1146
|
+
"subject": "pi/pi-durable/carrier/tui.js",
|
|
1147
|
+
"find": ["\tif (compaction !== undefined) {\n\t\tlines.push"],
|
|
1148
|
+
"replace": ["\tif (compaction === null) {\n\t\tlines.push"],
|
|
1149
|
+
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
1150
|
+
"timeoutSeconds": 300,
|
|
1151
|
+
"signature": "[QK:PI-DURABLE-COMPACTION-FAILURE-SHOWN]",
|
|
1152
|
+
"signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
|
|
1153
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
888
1154
|
}
|
|
889
1155
|
]
|
|
890
1156
|
}
|
|
@@ -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'"
|
|
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'"
|
|
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'"
|
|
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'"
|
|
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.0
|
|
24
|
+
"find": ["\"@earendil-works/pi-durable\": \"1.2.0\","],
|
|
25
|
+
"replace": ["\"@earendil-works/pi-durable\": \"1.1.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.2.0\","],
|
|
37
37
|
"gate": ["bash", "run.sh", "check-dep-versions"],
|
|
38
38
|
"timeoutSeconds": 300,
|
|
39
39
|
"signature": "[QK:PI-SDK-NO-DUAL-DECLARATION]",
|