@junghanacs/entwurf 0.40.0 → 0.41.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 +4 -2
- package/BASELINE.md +55 -2
- package/CHANGELOG.md +321 -0
- package/CONTRIBUTING.md +1 -1
- package/DELIVERY.md +18 -2
- package/FAQ.md +8 -4
- package/README.md +26 -8
- package/VERIFY.md +13 -10
- package/docs/acp-backend-rail.md +5 -1
- package/docs/external-mcp-host.md +8 -6
- package/docs/fresh-cut-policy.md +9 -1
- package/docs/setup-clean-host.md +24 -8
- package/mcp/entwurf-bridge/dist/mcp/entwurf-bridge/src/index.js +81 -19
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/cc-retire-pidfd.py +236 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/cc-retire-request.js +473 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/control-retire.js +125 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-retire-production.js +149 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-retire.js +158 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-surface.js +2 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-visible-resume.js +283 -20
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/fresh-call-composition.js +7 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/fresh-call-dispatch.js +47 -3
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/herdr-fresh-call.js +3 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/meta-session.js +96 -16
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-fresh-call.js +5 -29
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-launch.js +28 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-resume-call.js +26 -11
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-retire-request.js +76 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/resume-launch-identity.js +67 -17
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/retirement-event.js +211 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/meta-bridge-hook.js +124 -10
- package/mcp/entwurf-bridge/dist/pi-extensions/meta-bridge-pi-durable.js +53 -2
- package/mcp/entwurf-bridge/dist/scripts/meta-facts.js +1 -1
- package/mcp/entwurf-bridge/dist/scripts/probe-bridge-command.js +1 -0
- package/mcp/entwurf-bridge/src/index.ts +93 -19
- package/mcp/entwurf-bridge/test.sh +2 -2
- package/mcp/entwurf-bridge/tsconfig.build.json +10 -1
- package/package.json +4 -4
- package/pi/meta-bridge/entwurf-meta-receive/scripts/hook-launch.sh +3 -3
- package/pi-extensions/entwurf-control.ts +55 -20
- package/pi-extensions/lib/cc-retire-pidfd.py +236 -0
- package/pi-extensions/lib/cc-retire-request.ts +553 -0
- package/pi-extensions/lib/control-retire.ts +195 -0
- package/pi-extensions/lib/entwurf-control-rpc.ts +17 -1
- package/pi-extensions/lib/entwurf-v2-retire-production.ts +227 -0
- package/pi-extensions/lib/entwurf-v2-retire.ts +269 -0
- package/pi-extensions/lib/entwurf-v2-surface.ts +2 -1
- package/pi-extensions/lib/entwurf-v2-visible-resume.ts +390 -36
- package/pi-extensions/lib/fresh-call-composition.ts +15 -0
- package/pi-extensions/lib/fresh-call-dispatch.ts +45 -4
- package/pi-extensions/lib/herdr-fresh-call.ts +5 -0
- package/pi-extensions/lib/meta-session.ts +140 -16
- package/pi-extensions/lib/mux-fresh-call.ts +7 -27
- package/pi-extensions/lib/mux-launch.ts +29 -0
- package/pi-extensions/lib/mux-resume-call.ts +33 -12
- package/pi-extensions/lib/pi-retire-request.ts +111 -0
- package/pi-extensions/lib/resume-launch-identity.ts +104 -18
- package/pi-extensions/lib/retirement-event.ts +253 -0
- package/pi-extensions/meta-bridge-hook.ts +142 -13
- package/pi-extensions/meta-bridge-pi-durable.ts +56 -2
- package/run.sh +78 -7
- package/scripts/agy-bridge-config.py +4 -1
- package/scripts/build-bridge.sh +14 -0
- package/scripts/check-capability-bundle-reach.ts +135 -2
- package/scripts/check-entwurf-bridge-boot.ts +2 -1
- package/scripts/check-entwurf-fact-provider.ts +1 -0
- package/scripts/check-entwurf-v2-production.ts +2 -0
- package/scripts/check-entwurf-v2-surface.ts +7 -0
- package/scripts/check-gate-qualification.ts +14 -8
- package/scripts/check-herdr-activation.ts +2 -2
- package/scripts/check-herdr-placement.ts +1 -0
- package/scripts/check-hook-launch-topology.ts +6 -15
- package/scripts/check-install-container.sh +2 -2
- package/scripts/check-meta-doctor-oracle.sh +27 -1
- package/scripts/check-meta-facts.ts +8 -3
- package/scripts/check-meta-hook-session-switch.ts +230 -13
- package/scripts/check-meta-identity-consumers.ts +1 -0
- package/scripts/check-meta-listing.ts +1 -0
- package/scripts/check-meta-manifest-schema.py +1 -1
- package/scripts/check-meta-session.ts +31 -0
- package/scripts/check-meta-v3-record.ts +55 -1
- package/scripts/check-mux-resume-call.ts +35 -9
- package/scripts/check-peer-facts.ts +1 -0
- package/scripts/check-pi-durable-contact.ts +3 -1
- package/scripts/check-pi-durable-send.ts +4 -2
- package/scripts/check-pi-mcp-bridge.ts +1 -0
- package/scripts/check-resume-launch-identity.ts +62 -23
- package/scripts/lib/meta-hook-bundle.ts +72 -0
- package/scripts/meta-bridge-claude-floor.sh +13 -9
- package/scripts/meta-bridge-doctor.sh +17 -0
- package/scripts/meta-bridge-install.sh +6 -0
- package/scripts/meta-facts.ts +1 -1
- package/scripts/mutants/bridge-boot-resume.json +5 -2
- package/scripts/mutants/cc-retire-pidfd.json +129 -0
- package/scripts/mutants/cc-retire-request.json +171 -0
- package/scripts/mutants/control-retire.json +105 -0
- package/scripts/mutants/copilot-receive.json +2 -6
- package/scripts/mutants/entwurf-v2-retire.json +476 -0
- package/scripts/mutants/fresh-call-dispatch.json +37 -0
- package/scripts/mutants/meta-hook-session-switch.json +88 -0
- package/scripts/mutants/meta-identity.json +57 -0
- package/scripts/mutants/mux-fresh-call.json +1 -1
- package/scripts/mutants/mux-resume-call.json +40 -4
- package/scripts/mutants/pi-durable.json +79 -0
- package/scripts/mutants/pi-retire-request.json +72 -0
- package/scripts/mutants/resume-launch-identity.json +35 -8
- package/scripts/mutants/retirement-event.json +195 -0
- package/scripts/mutants/v2-surface.json +16 -0
- package/scripts/mutants/v2-visible-resume.json +283 -13
- package/scripts/probe-bridge-command.ts +1 -0
- package/scripts/smoke-agy-install-state.sh +2 -2
- package/scripts/smoke-copilot-mcp-state.sh +1 -1
- package/scripts/smoke-herdr-raw-install-live.sh +5 -4
- package/scripts/smoke-meta-install-state.sh +4 -4
- package/scripts/smoke-mux-lifecycle-live.ts +10 -10
- package/scripts/smoke-omp-mcp-state.sh +1 -1
- package/scripts/smoke-pi-durable-fresh-live.ts +5 -3
- package/scripts/smoke-pi-provider-state.sh +3 -3
|
@@ -0,0 +1,476 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"lane": "entwurf-v2-retire",
|
|
4
|
+
"mutants": [
|
|
5
|
+
{
|
|
6
|
+
"claim": "RETIRE-CORE-ADMISSION",
|
|
7
|
+
"title": "self retirement reaches target IO instead of refusing before lock acquisition",
|
|
8
|
+
"subject": "pi-extensions/lib/entwurf-v2-retire.ts",
|
|
9
|
+
"find": [
|
|
10
|
+
"\t\tif (actor.sessionId === targetGardenId) return beforeLock({ kind: \"refused\", reason: \"self-target\" });"
|
|
11
|
+
],
|
|
12
|
+
"replace": ["\t\t// MUTANT: self guard omitted."],
|
|
13
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-retire"],
|
|
14
|
+
"timeoutSeconds": 600,
|
|
15
|
+
"signature": "[QK:RETIRE-CORE-ADMISSION]",
|
|
16
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-retire.test.ts"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"claim": "RETIRE-CORE-LOCK",
|
|
20
|
+
"title": "a failed lock acquisition still reads target state",
|
|
21
|
+
"subject": "pi-extensions/lib/entwurf-v2-retire.ts",
|
|
22
|
+
"find": [
|
|
23
|
+
"\tif (!acquired.ok) return beforeLock({ kind: \"refused\", reason: \"target-locked\", detail: acquired.conflict.detail });"
|
|
24
|
+
],
|
|
25
|
+
"replace": [
|
|
26
|
+
"\tif (!acquired.ok) {",
|
|
27
|
+
"\t\tdeps.recordExists(targetGardenId);",
|
|
28
|
+
"\t\treturn beforeLock({ kind: \"refused\", reason: \"target-locked\", detail: acquired.conflict.detail });",
|
|
29
|
+
"\t}"
|
|
30
|
+
],
|
|
31
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-retire"],
|
|
32
|
+
"timeoutSeconds": 600,
|
|
33
|
+
"signature": "[QK:RETIRE-CORE-LOCK]",
|
|
34
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-retire.test.ts"
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"claim": "RETIRE-CORE-RECORD",
|
|
38
|
+
"title": "a corrupt present record is disguised as target absence",
|
|
39
|
+
"subject": "pi-extensions/lib/entwurf-v2-retire.ts",
|
|
40
|
+
"find": ["\t\t\t\t? { kind: \"preflight-error\", cause: causeOf(error) }"],
|
|
41
|
+
"replace": ["\t\t\t\t? { kind: \"refused\", reason: \"target-not-found\" }"],
|
|
42
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-retire"],
|
|
43
|
+
"timeoutSeconds": 600,
|
|
44
|
+
"signature": "[QK:RETIRE-CORE-RECORD]",
|
|
45
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-retire.test.ts"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"claim": "RETIRE-CORE-LIVE",
|
|
49
|
+
"title": "a dead Pi probe falls through to the retirement adapter",
|
|
50
|
+
"subject": "pi-extensions/lib/entwurf-v2-retire.ts",
|
|
51
|
+
"find": [
|
|
52
|
+
"\t\t\tif (live.liveness === \"dead\") return { kind: \"refused\", reason: \"target-dead\" };",
|
|
53
|
+
"\t\t\tif (live.liveness !== \"alive\") return { kind: \"refused\", reason: \"target-indeterminate\" };"
|
|
54
|
+
],
|
|
55
|
+
"replace": [
|
|
56
|
+
"\t\t\tif (live.liveness === \"indeterminate\") return { kind: \"refused\", reason: \"target-indeterminate\" };"
|
|
57
|
+
],
|
|
58
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-retire"],
|
|
59
|
+
"timeoutSeconds": 600,
|
|
60
|
+
"signature": "[QK:RETIRE-CORE-LIVE]",
|
|
61
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-retire.test.ts"
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"claim": "RETIRE-CORE-FRESH",
|
|
65
|
+
"title": "the sole before versus after Pi birth-tuple guard is bypassed",
|
|
66
|
+
"subject": "pi-extensions/lib/entwurf-v2-retire.ts",
|
|
67
|
+
"find": [
|
|
68
|
+
"\t\t\tif (",
|
|
69
|
+
"\t\t\t\t[\"gardenId\", \"backend\", \"nativeSessionId\", \"createdAt\"].some(",
|
|
70
|
+
"\t\t\t\t\t(key) => current[key as keyof MetaIdentity] !== identity[key as keyof MetaIdentity],",
|
|
71
|
+
"\t\t\t\t)",
|
|
72
|
+
"\t\t\t) {"
|
|
73
|
+
],
|
|
74
|
+
"replace": ["\t\t\tif (false) {"],
|
|
75
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-retire"],
|
|
76
|
+
"timeoutSeconds": 600,
|
|
77
|
+
"signature": "[QK:RETIRE-CORE-FRESH]",
|
|
78
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-retire.test.ts"
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"claim": "RETIRE-CORE-PI",
|
|
82
|
+
"title": "Pi adapter receives a different directory than the inspected canonical address",
|
|
83
|
+
"subject": "pi-extensions/lib/entwurf-v2-retire.ts",
|
|
84
|
+
"find": ["\t\t\t\t\tcontrolSocketDir: deps.controlSocketDir,"],
|
|
85
|
+
"replace": ["\t\t\t\t\tcontrolSocketDir: \"/wrong-control-directory\","],
|
|
86
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-retire"],
|
|
87
|
+
"timeoutSeconds": 600,
|
|
88
|
+
"signature": "[QK:RETIRE-CORE-PI]",
|
|
89
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-retire.test.ts"
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"claim": "RETIRE-CORE-CC",
|
|
93
|
+
"title": "CC expected attach incarnation is not forwarded from the fresh target record",
|
|
94
|
+
"subject": "pi-extensions/lib/entwurf-v2-retire.ts",
|
|
95
|
+
"find": [
|
|
96
|
+
"\t\tconst result = await deps.requestCc({ gardenId, backend, nativeSessionId, createdAt, attachIncarnation });"
|
|
97
|
+
],
|
|
98
|
+
"replace": [
|
|
99
|
+
"\t\tconst result = await deps.requestCc({ gardenId, backend, nativeSessionId, createdAt, attachIncarnation: \"wrong-incarnation\" });"
|
|
100
|
+
],
|
|
101
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-retire"],
|
|
102
|
+
"timeoutSeconds": 600,
|
|
103
|
+
"signature": "[QK:RETIRE-CORE-CC]",
|
|
104
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-retire.test.ts"
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"claim": "RETIRE-CORE-THROW",
|
|
108
|
+
"title": "an escaped adapter throw is downgraded to a preflight error after possible effects",
|
|
109
|
+
"subject": "pi-extensions/lib/entwurf-v2-retire.ts",
|
|
110
|
+
"find": ["\t\t\t\t: { kind: \"unknown\", backend: enteredBackend, cause: causeOf(error) };"],
|
|
111
|
+
"replace": ["\t\t\t\t: { kind: \"preflight-error\", cause: causeOf(error) };"],
|
|
112
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-retire"],
|
|
113
|
+
"timeoutSeconds": 600,
|
|
114
|
+
"signature": "[QK:RETIRE-CORE-THROW]",
|
|
115
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-retire.test.ts"
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
"claim": "RETIRE-CORE-RELEASE",
|
|
119
|
+
"title": "a throwing release overwrites the original backend result with a preflight error",
|
|
120
|
+
"subject": "pi-extensions/lib/entwurf-v2-retire.ts",
|
|
121
|
+
"find": ["\t\t\trelease = { status: \"error\", cause: causeOf(error) };"],
|
|
122
|
+
"replace": [
|
|
123
|
+
"\t\t\trelease = { status: \"error\", cause: causeOf(error) };",
|
|
124
|
+
"\t\t\toutcome = { kind: \"preflight-error\", cause: causeOf(error) };"
|
|
125
|
+
],
|
|
126
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-retire"],
|
|
127
|
+
"timeoutSeconds": 600,
|
|
128
|
+
"signature": "[QK:RETIRE-CORE-RELEASE]",
|
|
129
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-retire.test.ts"
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"claim": "RETIRE-CORE-FAULT",
|
|
133
|
+
"title": "an acquired claim is falsely reported released without calling the release seam",
|
|
134
|
+
"subject": "pi-extensions/lib/entwurf-v2-retire.ts",
|
|
135
|
+
"find": ["\t\t\trelease = { status: deps.releaseLock(claim) };"],
|
|
136
|
+
"replace": ["\t\t\trelease = { status: \"released\" };"],
|
|
137
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-retire"],
|
|
138
|
+
"timeoutSeconds": 600,
|
|
139
|
+
"signature": "[QK:RETIRE-CORE-FAULT]",
|
|
140
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-retire.test.ts"
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
"claim": "RETIRE-CORE-ABORT-BEFORE-LOCK",
|
|
144
|
+
"title": "a request cancelled before the lock still acquires the target lock",
|
|
145
|
+
"subject": "pi-extensions/lib/entwurf-v2-retire.ts",
|
|
146
|
+
"find": ["\t\tif (aborted()) return beforeLock({ kind: \"refused\", reason: \"request-aborted\" });"],
|
|
147
|
+
"replace": ["\t\t// MUTANT: pre-lock cancellation check omitted."],
|
|
148
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-retire"],
|
|
149
|
+
"timeoutSeconds": 600,
|
|
150
|
+
"signature": "[QK:RETIRE-CORE-ABORT-BEFORE-LOCK]",
|
|
151
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-retire.test.ts"
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
"claim": "RETIRE-CORE-ABORT-PREFLIGHT",
|
|
155
|
+
"title": "cancellation during the locked preflight still writes a requested record",
|
|
156
|
+
"subject": "pi-extensions/lib/entwurf-v2-retire.ts",
|
|
157
|
+
"find": [
|
|
158
|
+
"\tconst admit = (targetBackend: RetireTargetBackend): RetireDispatchOutcome | null => {",
|
|
159
|
+
"\t\tif (aborted()) return { kind: \"refused\", reason: \"request-aborted\" };"
|
|
160
|
+
],
|
|
161
|
+
"replace": ["\tconst admit = (targetBackend: RetireTargetBackend): RetireDispatchOutcome | null => {"],
|
|
162
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-retire"],
|
|
163
|
+
"timeoutSeconds": 600,
|
|
164
|
+
"signature": "[QK:RETIRE-CORE-ABORT-PREFLIGHT]",
|
|
165
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-retire.test.ts"
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
"claim": "RETIRE-CORE-ABORT-AFTER-REQUESTED",
|
|
169
|
+
"title": "cancellation observed after the requested record still enters the adapter",
|
|
170
|
+
"subject": "pi-extensions/lib/entwurf-v2-retire.ts",
|
|
171
|
+
"find": [
|
|
172
|
+
"\t\tattempt = { eventId, context };",
|
|
173
|
+
"\t\tif (aborted()) return { kind: \"refused\", reason: \"request-aborted\" };"
|
|
174
|
+
],
|
|
175
|
+
"replace": ["\t\tattempt = { eventId, context };"],
|
|
176
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-retire"],
|
|
177
|
+
"timeoutSeconds": 600,
|
|
178
|
+
"signature": "[QK:RETIRE-CORE-ABORT-AFTER-REQUESTED]",
|
|
179
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-retire.test.ts"
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
"claim": "RETIRE-CORE-RECORD-JOIN",
|
|
183
|
+
"title": "the lock is released before the attempt's outcome is recorded",
|
|
184
|
+
"subject": "pi-extensions/lib/entwurf-v2-retire.ts",
|
|
185
|
+
"find": [
|
|
186
|
+
"\t\t// An attempt that was recorded as requested gets ONE outcome record, before release.",
|
|
187
|
+
"\t\tif (attempt) {"
|
|
188
|
+
],
|
|
189
|
+
"replace": ["\t\trelease = { status: deps.releaseLock(claim) };", "\t\tif (attempt) {"],
|
|
190
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-retire"],
|
|
191
|
+
"timeoutSeconds": 600,
|
|
192
|
+
"signature": "[QK:RETIRE-CORE-RECORD-JOIN]",
|
|
193
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-retire.test.ts"
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
"claim": "RETIRE-CORE-RECORD-THROWN-ADAPTER",
|
|
197
|
+
"title": "a thrown adapter attempt loses its outcome record",
|
|
198
|
+
"subject": "pi-extensions/lib/entwurf-v2-retire.ts",
|
|
199
|
+
"find": ["\t\t} catch (error) {", "\t\t\toutcome ="],
|
|
200
|
+
"replace": ["\t\t} catch (error) {", "\t\t\tattempt = null;", "\t\t\toutcome ="],
|
|
201
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-retire"],
|
|
202
|
+
"timeoutSeconds": 600,
|
|
203
|
+
"signature": "[QK:RETIRE-CORE-RECORD-THROWN-ADAPTER]",
|
|
204
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-retire.test.ts"
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
"claim": "RETIRE-CORE-REQUESTED-FAIL",
|
|
208
|
+
"title": "a malformed requested-record id still admits the adapter",
|
|
209
|
+
"subject": "pi-extensions/lib/entwurf-v2-retire.ts",
|
|
210
|
+
"find": ["\t\tif (typeof eventId !== \"string\" || !EVENT_ID_RE.test(eventId)) {"],
|
|
211
|
+
"replace": ["\t\tif (typeof eventId !== \"string\") {"],
|
|
212
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-retire"],
|
|
213
|
+
"timeoutSeconds": 600,
|
|
214
|
+
"signature": "[QK:RETIRE-CORE-REQUESTED-FAIL]",
|
|
215
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-retire.test.ts"
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
"claim": "RETIRE-CORE-OUTCOME-FAIL",
|
|
219
|
+
"title": "a failed outcome record rewrites an already effective backend result to unknown",
|
|
220
|
+
"subject": "pi-extensions/lib/entwurf-v2-retire.ts",
|
|
221
|
+
"find": ["\t\t\t\trecord = { status: \"outcome-append-error\", eventId, cause: causeOf(error) };"],
|
|
222
|
+
"replace": [
|
|
223
|
+
"\t\t\t\trecord = { status: \"outcome-append-error\", eventId, cause: causeOf(error) };",
|
|
224
|
+
"\t\t\t\toutcome = { kind: \"unknown\", backend: context.targetBackend, cause: causeOf(error) };"
|
|
225
|
+
],
|
|
226
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-retire"],
|
|
227
|
+
"timeoutSeconds": 600,
|
|
228
|
+
"signature": "[QK:RETIRE-CORE-OUTCOME-FAIL]",
|
|
229
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-retire.test.ts"
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
"claim": "RETIRE-FACTORY-DIRS-EXPLICIT",
|
|
233
|
+
"title": "lock release is bound to a different directory than lock acquisition",
|
|
234
|
+
"subject": "pi-extensions/lib/entwurf-v2-retire-production.ts",
|
|
235
|
+
"find": ["\t\treleaseLock: (claim) => io.releaseLock(claim, { dir: lockDir }),"],
|
|
236
|
+
"replace": ["\t\treleaseLock: (claim) => io.releaseLock(claim, { dir: controlSocketDir }),"],
|
|
237
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-retire"],
|
|
238
|
+
"timeoutSeconds": 600,
|
|
239
|
+
"signature": "[QK:RETIRE-FACTORY-DIRS-EXPLICIT]",
|
|
240
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-retire-production.test.ts"
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
"claim": "RETIRE-FACTORY-DIRS-MODULE-LOAD",
|
|
244
|
+
"title": "the default lock directory is re-derived from HOME at construction",
|
|
245
|
+
"subject": "pi-extensions/lib/entwurf-v2-retire-production.ts",
|
|
246
|
+
"find": ["\tconst lockDir = opts.lockDir ?? ENTWURF_V2_LOCK_DIR;"],
|
|
247
|
+
"replace": ["\tconst lockDir = opts.lockDir ?? `${process.env.HOME}/.pi/entwurf-v2-locks`;"],
|
|
248
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-retire"],
|
|
249
|
+
"timeoutSeconds": 600,
|
|
250
|
+
"signature": "[QK:RETIRE-FACTORY-DIRS-MODULE-LOAD]",
|
|
251
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-retire-production.test.ts"
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
"claim": "RETIRE-FACTORY-DIRS-CONSTRUCTION",
|
|
255
|
+
"title": "record existence re-reads the sessions environment on every call",
|
|
256
|
+
"subject": "pi-extensions/lib/entwurf-v2-retire-production.ts",
|
|
257
|
+
"find": ["\t\trecordExists: (gid) => io.metaRecordExists(gid, sessionsDir),"],
|
|
258
|
+
"replace": ["\t\trecordExists: (gid) => io.metaRecordExists(gid, opts.sessionsDir ?? defaultMetaSessionsDir()),"],
|
|
259
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-retire"],
|
|
260
|
+
"timeoutSeconds": 600,
|
|
261
|
+
"signature": "[QK:RETIRE-FACTORY-DIRS-CONSTRUCTION]",
|
|
262
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-retire-production.test.ts"
|
|
263
|
+
},
|
|
264
|
+
{
|
|
265
|
+
"claim": "RETIRE-FACTORY-CC-WITNESSES",
|
|
266
|
+
"title": "the CC sender witness reads a different owner pid than the adapter asked for",
|
|
267
|
+
"subject": "pi-extensions/lib/entwurf-v2-retire-production.ts",
|
|
268
|
+
"find": ["\t\treadSender: (ownerPid) => io.readSender({ backend: \"claude-code\", ownerPid, sendersDir }),"],
|
|
269
|
+
"replace": [
|
|
270
|
+
"\t\treadSender: (ownerPid) => io.readSender({ backend: \"claude-code\", ownerPid: ownerPid + 1, sendersDir }),"
|
|
271
|
+
],
|
|
272
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-retire"],
|
|
273
|
+
"timeoutSeconds": 600,
|
|
274
|
+
"signature": "[QK:RETIRE-FACTORY-CC-WITNESSES]",
|
|
275
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-retire-production.test.ts"
|
|
276
|
+
},
|
|
277
|
+
{
|
|
278
|
+
"claim": "RETIRE-FACTORY-CC-SIGNAL",
|
|
279
|
+
"title": "the CC adapter loses the request's AbortSignal",
|
|
280
|
+
"subject": "pi-extensions/lib/entwurf-v2-retire-production.ts",
|
|
281
|
+
"find": ["\t\trequestCc: (expected) => io.requestCc(expected, ccDeps, { signal }),"],
|
|
282
|
+
"replace": ["\t\trequestCc: (expected) => io.requestCc(expected, ccDeps, {}),"],
|
|
283
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-retire"],
|
|
284
|
+
"timeoutSeconds": 600,
|
|
285
|
+
"signature": "[QK:RETIRE-FACTORY-CC-SIGNAL]",
|
|
286
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-retire-production.test.ts"
|
|
287
|
+
},
|
|
288
|
+
{
|
|
289
|
+
"claim": "RETIRE-FACTORY-PI-OPTIONS",
|
|
290
|
+
"title": "the Pi adapter receives the caller's whole options object, timeout included",
|
|
291
|
+
"subject": "pi-extensions/lib/entwurf-v2-retire-production.ts",
|
|
292
|
+
"find": ["\t\t\tio.requestPi(target, expected, { controlSocketDir: options.controlSocketDir }),"],
|
|
293
|
+
"replace": ["\t\t\tio.requestPi(target, expected, options),"],
|
|
294
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-retire"],
|
|
295
|
+
"timeoutSeconds": 600,
|
|
296
|
+
"signature": "[QK:RETIRE-FACTORY-PI-OPTIONS]",
|
|
297
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-retire-production.test.ts"
|
|
298
|
+
},
|
|
299
|
+
{
|
|
300
|
+
"claim": "RETIRE-FACTORY-OPAQUE",
|
|
301
|
+
"title": "a control-socket inspection result is reshaped instead of returned by identity",
|
|
302
|
+
"subject": "pi-extensions/lib/entwurf-v2-retire-production.ts",
|
|
303
|
+
"find": ["\t\tinspectPath: (socketPath) => io.inspectPath(socketPath),"],
|
|
304
|
+
"replace": ["\t\tinspectPath: async (socketPath) => ({ ...(await io.inspectPath(socketPath)) }),"],
|
|
305
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-retire"],
|
|
306
|
+
"timeoutSeconds": 600,
|
|
307
|
+
"signature": "[QK:RETIRE-FACTORY-OPAQUE]",
|
|
308
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-retire-production.test.ts"
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
"claim": "RETIRE-FACTORY-RECORD-DIR",
|
|
312
|
+
"title": "the requested event's sidecar directory is re-derived from the environment per call",
|
|
313
|
+
"subject": "pi-extensions/lib/entwurf-v2-retire-production.ts",
|
|
314
|
+
"find": ["\t\t\tconst eventId = randomBytes(16).toString(\"hex\");", "\t\t\tio.append(retirementsDir, {"],
|
|
315
|
+
"replace": [
|
|
316
|
+
"\t\t\tconst eventId = randomBytes(16).toString(\"hex\");",
|
|
317
|
+
"\t\t\tio.append(retirementsDirBesideSessions(opts.sessionsDir ?? defaultMetaSessionsDir()), {"
|
|
318
|
+
],
|
|
319
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-retire"],
|
|
320
|
+
"timeoutSeconds": 600,
|
|
321
|
+
"signature": "[QK:RETIRE-FACTORY-RECORD-DIR]",
|
|
322
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-retire-production.test.ts"
|
|
323
|
+
},
|
|
324
|
+
{
|
|
325
|
+
"claim": "RETIRE-FACTORY-RECORD-EVENTS",
|
|
326
|
+
"title": "caller context fields beyond the three attribution fields leak into sidecar events",
|
|
327
|
+
"subject": "pi-extensions/lib/entwurf-v2-retire-production.ts",
|
|
328
|
+
"find": [
|
|
329
|
+
"\tconst attribution = (context: RetireRecordContext) => ({",
|
|
330
|
+
"\t\tactorGardenId: context.actorGardenId,"
|
|
331
|
+
],
|
|
332
|
+
"replace": [
|
|
333
|
+
"\tconst attribution = (context: RetireRecordContext) => ({",
|
|
334
|
+
"\t\t...context,",
|
|
335
|
+
"\t\tactorGardenId: context.actorGardenId,"
|
|
336
|
+
],
|
|
337
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-retire"],
|
|
338
|
+
"timeoutSeconds": 600,
|
|
339
|
+
"signature": "[QK:RETIRE-FACTORY-RECORD-EVENTS]",
|
|
340
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-retire-production.test.ts"
|
|
341
|
+
},
|
|
342
|
+
{
|
|
343
|
+
"claim": "RETIRE-FACTORY-RECORD-APPEND-FAIL",
|
|
344
|
+
"title": "a failed requested append is swallowed and its event id still returned",
|
|
345
|
+
"subject": "pi-extensions/lib/entwurf-v2-retire-production.ts",
|
|
346
|
+
"find": [
|
|
347
|
+
"\t\t\tio.append(retirementsDir, {",
|
|
348
|
+
"\t\t\t\tv: RETIREMENT_EVENT_VERSION,",
|
|
349
|
+
"\t\t\t\tkind: \"retirement-requested\",",
|
|
350
|
+
"\t\t\t\teventId,",
|
|
351
|
+
"\t\t\t\tat: new Date().toISOString(),",
|
|
352
|
+
"\t\t\t\t...attribution(context),",
|
|
353
|
+
"\t\t\t});",
|
|
354
|
+
"\t\t\treturn eventId;"
|
|
355
|
+
],
|
|
356
|
+
"replace": [
|
|
357
|
+
"\t\t\ttry {",
|
|
358
|
+
"\t\t\t\tio.append(retirementsDir, {",
|
|
359
|
+
"\t\t\t\t\tv: RETIREMENT_EVENT_VERSION,",
|
|
360
|
+
"\t\t\t\t\tkind: \"retirement-requested\",",
|
|
361
|
+
"\t\t\t\t\teventId,",
|
|
362
|
+
"\t\t\t\t\tat: new Date().toISOString(),",
|
|
363
|
+
"\t\t\t\t\t...attribution(context),",
|
|
364
|
+
"\t\t\t\t});",
|
|
365
|
+
"\t\t\t} catch {}",
|
|
366
|
+
"\t\t\treturn eventId;"
|
|
367
|
+
],
|
|
368
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-retire"],
|
|
369
|
+
"timeoutSeconds": 600,
|
|
370
|
+
"signature": "[QK:RETIRE-FACTORY-RECORD-APPEND-FAIL]",
|
|
371
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-retire-production.test.ts"
|
|
372
|
+
},
|
|
373
|
+
{
|
|
374
|
+
"claim": "RETIRE-FACTORY-SUMMARY",
|
|
375
|
+
"title": "a Claude Code adapter's free reason string reaches the sidecar summary",
|
|
376
|
+
"subject": "pi-extensions/lib/entwurf-v2-retire-production.ts",
|
|
377
|
+
"find": ["\t\treturn { status: outcome.result.outcome, reason: null };"],
|
|
378
|
+
"replace": [
|
|
379
|
+
"\t\treturn { status: outcome.result.outcome, reason: \"reason\" in outcome.result ? outcome.result.reason : null };"
|
|
380
|
+
],
|
|
381
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-retire"],
|
|
382
|
+
"timeoutSeconds": 600,
|
|
383
|
+
"signature": "[QK:RETIRE-FACTORY-SUMMARY]",
|
|
384
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-retire-production.test.ts"
|
|
385
|
+
},
|
|
386
|
+
{
|
|
387
|
+
"claim": "RETIRE-FACTORY-SUMMARY-REFUSE",
|
|
388
|
+
"title": "a Pi result is summarized under a Claude Code target context",
|
|
389
|
+
"subject": "pi-extensions/lib/entwurf-v2-retire-production.ts",
|
|
390
|
+
"find": ["\tif (outcome.kind === \"pi\" && backend === \"pi\") {"],
|
|
391
|
+
"replace": ["\tif (outcome.kind === \"pi\") {"],
|
|
392
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-retire"],
|
|
393
|
+
"timeoutSeconds": 600,
|
|
394
|
+
"signature": "[QK:RETIRE-FACTORY-SUMMARY-REFUSE]",
|
|
395
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-retire-production.test.ts"
|
|
396
|
+
},
|
|
397
|
+
{
|
|
398
|
+
"claim": "RETIRE-FACTORY-SIGNAL-CAPTURE",
|
|
399
|
+
"title": "the CC adapter re-reads a later options signal instead of the captured one",
|
|
400
|
+
"subject": "pi-extensions/lib/entwurf-v2-retire-production.ts",
|
|
401
|
+
"find": ["\t\trequestCc: (expected) => io.requestCc(expected, ccDeps, { signal }),"],
|
|
402
|
+
"replace": ["\t\trequestCc: (expected) => io.requestCc(expected, ccDeps, { signal: opts.signal }),"],
|
|
403
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-retire"],
|
|
404
|
+
"timeoutSeconds": 600,
|
|
405
|
+
"signature": "[QK:RETIRE-FACTORY-SIGNAL-CAPTURE]",
|
|
406
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-retire-production.test.ts"
|
|
407
|
+
},
|
|
408
|
+
{
|
|
409
|
+
"claim": "RETIRE-FACTORY-CORE-JOIN",
|
|
410
|
+
"title": "the requested append is deferred past the adapter call",
|
|
411
|
+
"subject": "pi-extensions/lib/entwurf-v2-retire-production.ts",
|
|
412
|
+
"find": [
|
|
413
|
+
"\t\t\tio.append(retirementsDir, {",
|
|
414
|
+
"\t\t\t\tv: RETIREMENT_EVENT_VERSION,",
|
|
415
|
+
"\t\t\t\tkind: \"retirement-requested\",",
|
|
416
|
+
"\t\t\t\teventId,",
|
|
417
|
+
"\t\t\t\tat: new Date().toISOString(),",
|
|
418
|
+
"\t\t\t\t...attribution(context),",
|
|
419
|
+
"\t\t\t});",
|
|
420
|
+
"\t\t\treturn eventId;"
|
|
421
|
+
],
|
|
422
|
+
"replace": [
|
|
423
|
+
"\t\t\tqueueMicrotask(() => {",
|
|
424
|
+
"\t\t\t\ttry {",
|
|
425
|
+
"\t\t\t\t\tio.append(retirementsDir, {",
|
|
426
|
+
"\t\t\t\t\t\tv: RETIREMENT_EVENT_VERSION,",
|
|
427
|
+
"\t\t\t\t\t\tkind: \"retirement-requested\",",
|
|
428
|
+
"\t\t\t\t\t\teventId,",
|
|
429
|
+
"\t\t\t\t\t\tat: new Date().toISOString(),",
|
|
430
|
+
"\t\t\t\t\t\t...attribution(context),",
|
|
431
|
+
"\t\t\t\t\t});",
|
|
432
|
+
"\t\t\t\t} catch { /* MUTANT ONLY: contain the deliberately deferred append fault. */ }",
|
|
433
|
+
"\t\t\t});",
|
|
434
|
+
"\t\t\treturn eventId;"
|
|
435
|
+
],
|
|
436
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-retire"],
|
|
437
|
+
"timeoutSeconds": 600,
|
|
438
|
+
"signature": "[QK:RETIRE-FACTORY-CORE-JOIN]",
|
|
439
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-retire-production.test.ts"
|
|
440
|
+
},
|
|
441
|
+
{
|
|
442
|
+
"claim": "RETIRE-FACTORY-CORE-REQUESTED-FAIL",
|
|
443
|
+
"title": "a failed requested append is retried, which could double a partial line",
|
|
444
|
+
"subject": "pi-extensions/lib/entwurf-v2-retire-production.ts",
|
|
445
|
+
"find": [
|
|
446
|
+
"\t\t\tio.append(retirementsDir, {",
|
|
447
|
+
"\t\t\t\tv: RETIREMENT_EVENT_VERSION,",
|
|
448
|
+
"\t\t\t\tkind: \"retirement-requested\",",
|
|
449
|
+
"\t\t\t\teventId,",
|
|
450
|
+
"\t\t\t\tat: new Date().toISOString(),",
|
|
451
|
+
"\t\t\t\t...attribution(context),",
|
|
452
|
+
"\t\t\t});",
|
|
453
|
+
"\t\t\treturn eventId;"
|
|
454
|
+
],
|
|
455
|
+
"replace": [
|
|
456
|
+
"\t\t\tconst event: RetirementEvent = {",
|
|
457
|
+
"\t\t\t\tv: RETIREMENT_EVENT_VERSION,",
|
|
458
|
+
"\t\t\t\tkind: \"retirement-requested\",",
|
|
459
|
+
"\t\t\t\teventId,",
|
|
460
|
+
"\t\t\t\tat: new Date().toISOString(),",
|
|
461
|
+
"\t\t\t\t...attribution(context),",
|
|
462
|
+
"\t\t\t};",
|
|
463
|
+
"\t\t\ttry {",
|
|
464
|
+
"\t\t\t\tio.append(retirementsDir, event);",
|
|
465
|
+
"\t\t\t} catch {",
|
|
466
|
+
"\t\t\t\tio.append(retirementsDir, event);",
|
|
467
|
+
"\t\t\t}",
|
|
468
|
+
"\t\t\treturn eventId;"
|
|
469
|
+
],
|
|
470
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-retire"],
|
|
471
|
+
"timeoutSeconds": 600,
|
|
472
|
+
"signature": "[QK:RETIRE-FACTORY-CORE-REQUESTED-FAIL]",
|
|
473
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-retire-production.test.ts"
|
|
474
|
+
}
|
|
475
|
+
]
|
|
476
|
+
}
|
|
@@ -149,6 +149,43 @@
|
|
|
149
149
|
"timeoutSeconds": 120,
|
|
150
150
|
"signature": "[QK:FCD-ACP-MODEL-EXACT]",
|
|
151
151
|
"signatureSource": "scripts/check-fresh-call-dispatch.ts"
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
"claim": "FCD-OPENROUTER-NAMED-REFUSED",
|
|
155
|
+
"title": "the root stops asking whether a pi or pi-durable model names the openrouter provider, so the 2026-08-13 explicit OpenRouter request opens a sibling again",
|
|
156
|
+
"subject": "pi-extensions/lib/fresh-call-dispatch.ts",
|
|
157
|
+
"find": [
|
|
158
|
+
"\tif (slash >= 0 && trimmed.slice(0, slash).toLowerCase() === \"openrouter\") return \"model-openrouter-forbidden\";\n"
|
|
159
|
+
],
|
|
160
|
+
"replace": [""],
|
|
161
|
+
"gate": ["bash", "run.sh", "check-fresh-call-provider"],
|
|
162
|
+
"timeoutSeconds": 120,
|
|
163
|
+
"signature": "[QK:FCD-OPENROUTER-NAMED-REFUSED]",
|
|
164
|
+
"signatureSource": "pi-extensions/lib/fresh-call-dispatch.test.ts"
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
"claim": "FCD-PI-PROVIDER-QUALIFIED",
|
|
168
|
+
"title": "the root lets a pi model name no provider, so a bare alias like the 2026-09-17 `terra` resolves to whichever catalog row Pi prefers",
|
|
169
|
+
"subject": "pi-extensions/lib/fresh-call-dispatch.ts",
|
|
170
|
+
"find": [
|
|
171
|
+
"\tif (backend === \"pi\" && splitPiDurableModel(trimmed) === null) return \"pi-model-not-provider-qualified\";\n"
|
|
172
|
+
],
|
|
173
|
+
"replace": [""],
|
|
174
|
+
"gate": ["bash", "run.sh", "check-fresh-call-provider"],
|
|
175
|
+
"timeoutSeconds": 120,
|
|
176
|
+
"signature": "[QK:FCD-PI-PROVIDER-QUALIFIED]",
|
|
177
|
+
"signatureSource": "pi-extensions/lib/fresh-call-dispatch.test.ts"
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
"claim": "FCD-PROVIDER-OTHER-BACKENDS-UNJUDGED",
|
|
181
|
+
"title": "the provider rules lose their backend guard, so another vendor's own model name is judged as if it were a Pi provider choice",
|
|
182
|
+
"subject": "pi-extensions/lib/fresh-call-dispatch.ts",
|
|
183
|
+
"find": ["\tif (backend !== \"pi\" && backend !== \"pi-durable\") return null;\n"],
|
|
184
|
+
"replace": [""],
|
|
185
|
+
"gate": ["bash", "run.sh", "check-fresh-call-provider"],
|
|
186
|
+
"timeoutSeconds": 120,
|
|
187
|
+
"signature": "[QK:FCD-PROVIDER-OTHER-BACKENDS-UNJUDGED]",
|
|
188
|
+
"signatureSource": "pi-extensions/lib/fresh-call-dispatch.test.ts"
|
|
152
189
|
}
|
|
153
190
|
]
|
|
154
191
|
}
|
|
@@ -220,6 +220,94 @@
|
|
|
220
220
|
"timeoutSeconds": 300,
|
|
221
221
|
"signature": "[QK:MHSS-JOIN-BACKEND-EQUALITY]",
|
|
222
222
|
"signatureSource": "scripts/check-meta-hook-session-switch.ts"
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
"claim": "MHSS-ARM-RECORD-BOUND",
|
|
226
|
+
"title": "an arm-capable event stops minting a binding, so the record never carries one",
|
|
227
|
+
"subject": "pi-extensions/meta-bridge-hook.ts",
|
|
228
|
+
"find": ["\tconst attachIncarnation = armsWatch ? mintAttachIncarnation() : undefined;"],
|
|
229
|
+
"replace": ["\tconst attachIncarnation = undefined;"],
|
|
230
|
+
"gate": ["bash", "run.sh", "check-meta-hook-session-switch"],
|
|
231
|
+
"timeoutSeconds": 300,
|
|
232
|
+
"signature": "[QK:MHSS-ARM-RECORD-BOUND]",
|
|
233
|
+
"signatureSource": "scripts/check-meta-hook-session-switch.ts"
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
"claim": "MHSS-ARM-BINDING-PAIRED",
|
|
237
|
+
"title": "the receiver marker stops copying the binding the record committed",
|
|
238
|
+
"subject": "pi-extensions/meta-bridge-hook.ts",
|
|
239
|
+
"find": ["\t\t\t\t\tattachIncarnation,"],
|
|
240
|
+
"replace": [""],
|
|
241
|
+
"gate": ["bash", "run.sh", "check-meta-hook-session-switch"],
|
|
242
|
+
"timeoutSeconds": 300,
|
|
243
|
+
"signature": "[QK:MHSS-ARM-BINDING-PAIRED]",
|
|
244
|
+
"signatureSource": "scripts/check-meta-hook-session-switch.ts"
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
"claim": "MHSS-UPS-PRESERVES-BINDING",
|
|
248
|
+
"title": "a keystroke mints a new binding, so every UserPromptSubmit unbinds the live marker",
|
|
249
|
+
"subject": "pi-extensions/meta-bridge-hook.ts",
|
|
250
|
+
"find": ["\tconst attachIncarnation = armsWatch ? mintAttachIncarnation() : undefined;"],
|
|
251
|
+
"replace": ["\tconst attachIncarnation = mintAttachIncarnation();"],
|
|
252
|
+
"gate": ["bash", "run.sh", "check-meta-hook-session-switch"],
|
|
253
|
+
"timeoutSeconds": 300,
|
|
254
|
+
"signature": "[QK:MHSS-UPS-PRESERVES-BINDING]",
|
|
255
|
+
"signatureSource": "scripts/check-meta-hook-session-switch.ts"
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
"claim": "MHSS-ARM-LOCK-BUSY-NO-WRITE",
|
|
259
|
+
"title": "the record-arm lock is not taken, so an arm writes while another holder is mid-pair",
|
|
260
|
+
"subject": "pi-extensions/meta-bridge-hook.ts",
|
|
261
|
+
"find": ["\tconst locked = takeArmLock(existing.gardenId, armsWatch);"],
|
|
262
|
+
"replace": ["\tconst locked = { ok: true, detail: \"\" };"],
|
|
263
|
+
"gate": ["bash", "run.sh", "check-meta-hook-session-switch"],
|
|
264
|
+
"timeoutSeconds": 300,
|
|
265
|
+
"signature": "[QK:MHSS-ARM-LOCK-BUSY-NO-WRITE]",
|
|
266
|
+
"signatureSource": "scripts/check-meta-hook-session-switch.ts"
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
"claim": "MHSS-UPS-LOCK-BUSY-SKIPS",
|
|
270
|
+
"title": "a keystroke writes without the record-arm lock and can revert an arm's binding",
|
|
271
|
+
"subject": "pi-extensions/meta-bridge-hook.ts",
|
|
272
|
+
"find": ["\tconst locked = takeArmLock(existing.gardenId, armsWatch);"],
|
|
273
|
+
"replace": ["\tconst locked = armsWatch ? takeArmLock(existing.gardenId, true) : { ok: true, detail: \"\" };"],
|
|
274
|
+
"gate": ["bash", "run.sh", "check-meta-hook-session-switch"],
|
|
275
|
+
"timeoutSeconds": 300,
|
|
276
|
+
"signature": "[QK:MHSS-UPS-LOCK-BUSY-SKIPS]",
|
|
277
|
+
"signatureSource": "scripts/check-meta-hook-session-switch.ts"
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
"claim": "MHSS-ARM-WAITS-FOR-LOCK",
|
|
281
|
+
"title": "an arm gives up at the first busy lock instead of waiting its bound",
|
|
282
|
+
"subject": "pi-extensions/meta-bridge-hook.ts",
|
|
283
|
+
"find": ["\tconst deadline = Date.now() + (wait ? ARM_LOCK_WAIT_MS : 0);"],
|
|
284
|
+
"replace": ["\tconst deadline = Date.now();"],
|
|
285
|
+
"gate": ["bash", "run.sh", "check-meta-hook-session-switch"],
|
|
286
|
+
"timeoutSeconds": 300,
|
|
287
|
+
"signature": "[QK:MHSS-ARM-WAITS-FOR-LOCK]",
|
|
288
|
+
"signatureSource": "scripts/check-meta-hook-session-switch.ts"
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
"claim": "MHSS-ARM-LOCK-OWN-DIR",
|
|
292
|
+
"title": "the record-arm lock moves into the v2 dispatch lock directory visible resume holds across its observation",
|
|
293
|
+
"subject": "pi-extensions/lib/meta-session.ts",
|
|
294
|
+
"find": ["\treturn path.join(path.dirname(receiversDir), \"meta-record-arm-locks\");"],
|
|
295
|
+
"replace": ["\treturn path.join(path.dirname(receiversDir), \"entwurf-v2-locks\");"],
|
|
296
|
+
"gate": ["bash", "run.sh", "check-meta-hook-session-switch"],
|
|
297
|
+
"timeoutSeconds": 300,
|
|
298
|
+
"signature": "[QK:MHSS-ARM-LOCK-OWN-DIR]",
|
|
299
|
+
"signatureSource": "scripts/check-meta-hook-session-switch.ts"
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
"claim": "MHSS-BUNDLE-CLOSURE-INSTALLED",
|
|
303
|
+
"title": "the installer stops copying the lock module the hook imports, so the installed hook cannot load",
|
|
304
|
+
"subject": "scripts/meta-bridge-install.sh",
|
|
305
|
+
"find": ["cp \"$LOCK_SRC\" \"$ASM/$PLUGIN/lib/entwurf-v2-lock.$LIB_EXT\""],
|
|
306
|
+
"replace": [":"],
|
|
307
|
+
"gate": ["bash", "run.sh", "check-meta-hook-session-switch"],
|
|
308
|
+
"timeoutSeconds": 300,
|
|
309
|
+
"signature": "[QK:MHSS-BUNDLE-CLOSURE-INSTALLED]",
|
|
310
|
+
"signatureSource": "scripts/check-meta-hook-session-switch.ts"
|
|
223
311
|
}
|
|
224
312
|
]
|
|
225
313
|
}
|