@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,171 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"lane": "cc-retire-request",
|
|
4
|
+
"mutants": [
|
|
5
|
+
{
|
|
6
|
+
"claim": "CCREQ-STABLE-GO-EXITS",
|
|
7
|
+
"title": "a stable binding writes cancel instead of go, so a retirement the caller authorised never happens",
|
|
8
|
+
"subject": "pi-extensions/lib/cc-retire-request.ts",
|
|
9
|
+
"find": ["\t\t\twrite(\"go\");"],
|
|
10
|
+
"replace": ["\t\t\twrite(\"cancel\");"],
|
|
11
|
+
"gate": ["bash", "run.sh", "check-cc-retire-request"],
|
|
12
|
+
"timeoutSeconds": 600,
|
|
13
|
+
"signature": "[QK:CCREQ-STABLE-GO-EXITS]",
|
|
14
|
+
"signatureSource": "pi-extensions/lib/cc-retire-request.test.ts"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"claim": "CCREQ-RECORD-DRIFT-CANCELS",
|
|
18
|
+
"title": "the record is no longer compared with what the caller authorised, so a committed re-arm after ready still gets go",
|
|
19
|
+
"subject": "pi-extensions/lib/cc-retire-request.ts",
|
|
20
|
+
"find": ["\t\tif (record[key] !== expected[key]) {"],
|
|
21
|
+
"replace": ["\t\tif (false) {"],
|
|
22
|
+
"gate": ["bash", "run.sh", "check-cc-retire-request"],
|
|
23
|
+
"timeoutSeconds": 600,
|
|
24
|
+
"signature": "[QK:CCREQ-RECORD-DRIFT-CANCELS]",
|
|
25
|
+
"signatureSource": "pi-extensions/lib/cc-retire-request.test.ts"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"claim": "CCREQ-RECEIVER-DRIFT-CANCELS",
|
|
29
|
+
"title": "the receiver's native session is not joined to the record, so a marker re-armed for another session still gets go",
|
|
30
|
+
"subject": "pi-extensions/lib/cc-retire-request.ts",
|
|
31
|
+
"find": ["\t\tmarker.backend !== \"claude-code\" ||\n\t\tmarker.nativeSessionId !== record.nativeSessionId\n"],
|
|
32
|
+
"replace": ["\t\tmarker.backend !== \"claude-code\"\n"],
|
|
33
|
+
"gate": ["bash", "run.sh", "check-cc-retire-request"],
|
|
34
|
+
"timeoutSeconds": 600,
|
|
35
|
+
"signature": "[QK:CCREQ-RECEIVER-DRIFT-CANCELS]",
|
|
36
|
+
"signatureSource": "pi-extensions/lib/cc-retire-request.test.ts"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"claim": "CCREQ-SENDER-DRIFT-CANCELS",
|
|
40
|
+
"title": "the sender marker's garden is not compared, so an owner that switched to another citizen in place is still terminated",
|
|
41
|
+
"subject": "pi-extensions/lib/cc-retire-request.ts",
|
|
42
|
+
"find": ["\t\tsender.gardenId !== gid ||\n"],
|
|
43
|
+
"replace": [""],
|
|
44
|
+
"gate": ["bash", "run.sh", "check-cc-retire-request"],
|
|
45
|
+
"timeoutSeconds": 600,
|
|
46
|
+
"signature": "[QK:CCREQ-SENDER-DRIFT-CANCELS]",
|
|
47
|
+
"signatureSource": "pi-extensions/lib/cc-retire-request.test.ts"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"claim": "CCREQ-PRECHECK-REFUSES",
|
|
51
|
+
"title": "an unbound record is not refused by name, so a record no arm ever touched reaches the binding comparison as if it had one",
|
|
52
|
+
"subject": "pi-extensions/lib/cc-retire-request.ts",
|
|
53
|
+
"find": ["\tif (record.attachIncarnation === null) {"],
|
|
54
|
+
"replace": ["\tif (false) {"],
|
|
55
|
+
"gate": ["bash", "run.sh", "check-cc-retire-request"],
|
|
56
|
+
"timeoutSeconds": 600,
|
|
57
|
+
"signature": "[QK:CCREQ-PRECHECK-REFUSES]",
|
|
58
|
+
"signatureSource": "pi-extensions/lib/cc-retire-request.test.ts"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"claim": "CCREQ-HELPER-MISSING-REFUSED",
|
|
62
|
+
"title": "a missing packaged helper is not refused, so the interpreter is started on a path that is not the helper",
|
|
63
|
+
"subject": "pi-extensions/lib/cc-retire-request.ts",
|
|
64
|
+
"find": ["\tif (helperPath === null) {"],
|
|
65
|
+
"replace": ["\tif (false) {"],
|
|
66
|
+
"gate": ["bash", "run.sh", "check-cc-retire-request"],
|
|
67
|
+
"timeoutSeconds": 600,
|
|
68
|
+
"signature": "[QK:CCREQ-HELPER-MISSING-REFUSED]",
|
|
69
|
+
"signatureSource": "pi-extensions/lib/cc-retire-request.test.ts"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"claim": "CCREQ-HELPER-PATH-FIXED",
|
|
73
|
+
"title": "the helper entry is followed through a symlink, so a file that is not the packaged bytes can stand in for the helper",
|
|
74
|
+
"subject": "pi-extensions/lib/cc-retire-request.ts",
|
|
75
|
+
"find": ["return fs.lstatSync(candidate).isFile() ? candidate : null;"],
|
|
76
|
+
"replace": ["return fs.statSync(candidate).isFile() ? candidate : null;"],
|
|
77
|
+
"gate": ["bash", "run.sh", "check-cc-retire-request"],
|
|
78
|
+
"timeoutSeconds": 600,
|
|
79
|
+
"signature": "[QK:CCREQ-HELPER-PATH-FIXED]",
|
|
80
|
+
"signatureSource": "pi-extensions/lib/cc-retire-request.test.ts"
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"claim": "CCREQ-PROTOCOL-NOT-SUCCESS",
|
|
84
|
+
"title": "a ready line naming another pid is accepted, so the helper's process and the binding the adapter checked need not be the same",
|
|
85
|
+
"subject": "pi-extensions/lib/cc-retire-request.ts",
|
|
86
|
+
"find": [" || line.pid !== owner.pid)"],
|
|
87
|
+
"replace": [")"],
|
|
88
|
+
"gate": ["bash", "run.sh", "check-cc-retire-request"],
|
|
89
|
+
"timeoutSeconds": 600,
|
|
90
|
+
"signature": "[QK:CCREQ-PROTOCOL-NOT-SUCCESS]",
|
|
91
|
+
"signatureSource": "pi-extensions/lib/cc-retire-request.test.ts"
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"claim": "CCREQ-LATCH-NO-GO-AFTER-FAILURE",
|
|
95
|
+
"title": "every stdout chunk forgets the protocol failure an earlier chunk recorded, so a buffered ready behind a bad line is parsed on the next chunk and gets go",
|
|
96
|
+
"subject": "pi-extensions/lib/cc-retire-request.ts",
|
|
97
|
+
"find": ["\t\tchild.stdout.on(\"data\", (chunk: Buffer) => {"],
|
|
98
|
+
"replace": ["\t\tchild.stdout.on(\"data\", (chunk: Buffer) => {\n\t\t\tprotocolError = null;"],
|
|
99
|
+
"gate": ["bash", "run.sh", "check-cc-retire-request"],
|
|
100
|
+
"timeoutSeconds": 600,
|
|
101
|
+
"signature": "[QK:CCREQ-LATCH-NO-GO-AFTER-FAILURE]",
|
|
102
|
+
"signatureSource": "pi-extensions/lib/cc-retire-request.test.ts"
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"claim": "CCREQ-CONTROL-WRITE-THROW-UNKNOWN",
|
|
106
|
+
"title": "a go whose write threw leaves no trace, so the unknown outcome no longer names why it is unknown",
|
|
107
|
+
"subject": "pi-extensions/lib/cc-retire-request.ts",
|
|
108
|
+
"find": ["\t\t\t\tprotocolError ??= `writing the ${frame} frame threw: ${causeOf(err)}`;\n"],
|
|
109
|
+
"replace": [""],
|
|
110
|
+
"gate": ["bash", "run.sh", "check-cc-retire-request"],
|
|
111
|
+
"timeoutSeconds": 600,
|
|
112
|
+
"signature": "[QK:CCREQ-CONTROL-WRITE-THROW-UNKNOWN]",
|
|
113
|
+
"signatureSource": "pi-extensions/lib/cc-retire-request.test.ts"
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
"claim": "CCREQ-TRAILING-OUTPUT-NOT-SUCCESS",
|
|
117
|
+
"title": "incomplete trailing stdout is ignored, so a valid exited line followed by junk is reported as an observed exit",
|
|
118
|
+
"subject": "pi-extensions/lib/cc-retire-request.ts",
|
|
119
|
+
"find": ["\t\t\tif (buf.length > 0)"],
|
|
120
|
+
"replace": ["\t\t\tif (false)"],
|
|
121
|
+
"gate": ["bash", "run.sh", "check-cc-retire-request"],
|
|
122
|
+
"timeoutSeconds": 600,
|
|
123
|
+
"signature": "[QK:CCREQ-TRAILING-OUTPUT-NOT-SUCCESS]",
|
|
124
|
+
"signatureSource": "pi-extensions/lib/cc-retire-request.test.ts"
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"claim": "CCREQ-TERMINAL-SHAPE-CLOSED",
|
|
128
|
+
"title": "terminal lines are no longer closed to the helper's wire shape, so extra or contradicting keys pass as a known outcome",
|
|
129
|
+
"subject": "pi-extensions/lib/cc-retire-request.ts",
|
|
130
|
+
"find": ["\tif (!terminalShapeOk(line)) return null;\n"],
|
|
131
|
+
"replace": [""],
|
|
132
|
+
"gate": ["bash", "run.sh", "check-cc-retire-request"],
|
|
133
|
+
"timeoutSeconds": 600,
|
|
134
|
+
"signature": "[QK:CCREQ-TERMINAL-SHAPE-CLOSED]",
|
|
135
|
+
"signatureSource": "pi-extensions/lib/cc-retire-request.test.ts"
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
"claim": "CCREQ-DOMAIN-FROM-WRITER",
|
|
139
|
+
"title": "the receiver owner kind is not checked, so another harness's process holding a matching marker is treated as a Claude Code owner",
|
|
140
|
+
"subject": "pi-extensions/lib/cc-retire-request.ts",
|
|
141
|
+
"find": ["\tif (marker.ownerKind !== CC_RECEIVER_OWNER_KIND) {"],
|
|
142
|
+
"replace": ["\tif (false) {"],
|
|
143
|
+
"gate": ["bash", "run.sh", "check-cc-retire-request"],
|
|
144
|
+
"timeoutSeconds": 600,
|
|
145
|
+
"signature": "[QK:CCREQ-DOMAIN-FROM-WRITER]",
|
|
146
|
+
"signatureSource": "pi-extensions/lib/cc-retire-request.test.ts"
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
"claim": "CCREQ-ABORT-BEFORE-GO-NO-SIGNAL",
|
|
150
|
+
"title": "the requester's AbortSignal is dropped from the helper exchange, so neither the abort listener nor the ready-time abort check can stop a go while the fd is held (the preflight abort checks before spawn are untouched)",
|
|
151
|
+
"subject": "pi-extensions/lib/cc-retire-request.ts",
|
|
152
|
+
"find": ["\t\topts.signal?.addEventListener(\"abort\", onAbort, { once: true });"],
|
|
153
|
+
"replace": ["\t\topts = { ...opts, signal: undefined };"],
|
|
154
|
+
"gate": ["bash", "run.sh", "check-cc-retire-request"],
|
|
155
|
+
"timeoutSeconds": 600,
|
|
156
|
+
"signature": "[QK:CCREQ-ABORT-BEFORE-GO-NO-SIGNAL]",
|
|
157
|
+
"signatureSource": "pi-extensions/lib/cc-retire-request.test.ts"
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
"claim": "CCREQ-ABORT-AFTER-GO-UNKNOWN",
|
|
161
|
+
"title": "an abort after go is not recorded, so its ending is reported as a generic protocol failure instead of the requester's abort",
|
|
162
|
+
"subject": "pi-extensions/lib/cc-retire-request.ts",
|
|
163
|
+
"find": ["\t\t\t\tabortedAfterGo = true;\n"],
|
|
164
|
+
"replace": [""],
|
|
165
|
+
"gate": ["bash", "run.sh", "check-cc-retire-request"],
|
|
166
|
+
"timeoutSeconds": 600,
|
|
167
|
+
"signature": "[QK:CCREQ-ABORT-AFTER-GO-UNKNOWN]",
|
|
168
|
+
"signatureSource": "pi-extensions/lib/cc-retire-request.test.ts"
|
|
169
|
+
}
|
|
170
|
+
]
|
|
171
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"lane": "control-retire",
|
|
4
|
+
"mutants": [
|
|
5
|
+
{
|
|
6
|
+
"claim": "RETIRE-SAME-PATH-REBIND",
|
|
7
|
+
"title": "same-path rebind tears down the live listener instead of preserving it",
|
|
8
|
+
"subject": "pi-extensions/lib/control-retire.ts",
|
|
9
|
+
"find": ["if (state.socketPath === socketPath && state.server) {"],
|
|
10
|
+
"replace": ["if (false) {"],
|
|
11
|
+
"gate": ["bash", "run.sh", "check-control-retire"],
|
|
12
|
+
"timeoutSeconds": 600,
|
|
13
|
+
"signature": "[QK:RETIRE-SAME-PATH-REBIND]",
|
|
14
|
+
"signatureSource": "pi-extensions/lib/control-retire.test.ts"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"claim": "RETIRE-IDENTITY",
|
|
18
|
+
"title": "an old generation with equal identity values is allowed to request shutdown",
|
|
19
|
+
"subject": "pi-extensions/lib/control-retire.ts",
|
|
20
|
+
"find": ["\t\tstate.binding !== serverBinding ||\n"],
|
|
21
|
+
"replace": [""],
|
|
22
|
+
"gate": ["bash", "run.sh", "check-control-retire"],
|
|
23
|
+
"timeoutSeconds": 600,
|
|
24
|
+
"signature": "[QK:RETIRE-IDENTITY]",
|
|
25
|
+
"signatureSource": "pi-extensions/lib/control-retire.test.ts"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"claim": "RETIRE-IDLE",
|
|
29
|
+
"title": "a busy TUI schedules process-wide shutdown instead of refusing",
|
|
30
|
+
"subject": "pi-extensions/lib/control-retire.ts",
|
|
31
|
+
"find": ["if (!ctx.isIdle())"],
|
|
32
|
+
"replace": ["if (false)"],
|
|
33
|
+
"gate": ["bash", "run.sh", "check-control-retire"],
|
|
34
|
+
"timeoutSeconds": 600,
|
|
35
|
+
"signature": "[QK:RETIRE-IDLE]",
|
|
36
|
+
"signatureSource": "pi-extensions/lib/control-retire.test.ts"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"claim": "RETIRE-TUI",
|
|
40
|
+
"title": "a non-TUI context enters an unproven shutdown scheduler",
|
|
41
|
+
"subject": "pi-extensions/lib/control-retire.ts",
|
|
42
|
+
"find": ["if (ctx.mode !== \"tui\")"],
|
|
43
|
+
"replace": ["if (false)"],
|
|
44
|
+
"gate": ["bash", "run.sh", "check-control-retire"],
|
|
45
|
+
"timeoutSeconds": 600,
|
|
46
|
+
"signature": "[QK:RETIRE-TUI]",
|
|
47
|
+
"signatureSource": "pi-extensions/lib/control-retire.test.ts"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"claim": "RETIRE-PENDING",
|
|
51
|
+
"title": "queued work is ignored when accepting an idle-only retirement",
|
|
52
|
+
"subject": "pi-extensions/lib/control-retire.ts",
|
|
53
|
+
"find": ["if (ctx.hasPendingMessages())"],
|
|
54
|
+
"replace": ["if (false)"],
|
|
55
|
+
"gate": ["bash", "run.sh", "check-control-retire"],
|
|
56
|
+
"timeoutSeconds": 600,
|
|
57
|
+
"signature": "[QK:RETIRE-PENDING]",
|
|
58
|
+
"signatureSource": "pi-extensions/lib/control-retire.test.ts"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"claim": "RETIRE-REQUEST-ONCE",
|
|
62
|
+
"title": "the same binding can invoke SDK shutdown again after its first request",
|
|
63
|
+
"subject": "pi-extensions/lib/control-retire.ts",
|
|
64
|
+
"find": ["\tstate.retireRequested = true;"],
|
|
65
|
+
"replace": ["\tstate.retireRequested = false;"],
|
|
66
|
+
"gate": ["bash", "run.sh", "check-control-retire"],
|
|
67
|
+
"timeoutSeconds": 600,
|
|
68
|
+
"signature": "[QK:RETIRE-REQUEST-ONCE]",
|
|
69
|
+
"signatureSource": "pi-extensions/lib/control-retire.test.ts"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"claim": "RETIRE-CALL-UNKNOWN",
|
|
73
|
+
"title": "a requested receipt is fabricated without calling the SDK, bypassing its possible failure",
|
|
74
|
+
"subject": "pi-extensions/lib/control-retire.ts",
|
|
75
|
+
"find": ["\t\tshutdown.call(ctx);"],
|
|
76
|
+
"replace": ["\t\tvoid shutdown;"],
|
|
77
|
+
"gate": ["bash", "run.sh", "check-control-retire"],
|
|
78
|
+
"timeoutSeconds": 600,
|
|
79
|
+
"signature": "[QK:RETIRE-CALL-UNKNOWN]",
|
|
80
|
+
"signatureSource": "pi-extensions/lib/control-retire.test.ts"
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"claim": "RETIRE-INVALIDATE",
|
|
84
|
+
"title": "teardown fails to establish the closing boundary before awaiting server close",
|
|
85
|
+
"subject": "pi-extensions/lib/control-retire.ts",
|
|
86
|
+
"find": ["\tstate.closing = true;"],
|
|
87
|
+
"replace": ["\tstate.closing = false;"],
|
|
88
|
+
"gate": ["bash", "run.sh", "check-control-retire"],
|
|
89
|
+
"timeoutSeconds": 600,
|
|
90
|
+
"signature": "[QK:RETIRE-INVALIDATE]",
|
|
91
|
+
"signatureSource": "pi-extensions/lib/control-retire.test.ts"
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"claim": "RETIRE-BOUNDED-CLOSE",
|
|
95
|
+
"title": "a half-open accepted peer holds session teardown indefinitely after FIN",
|
|
96
|
+
"subject": "pi-extensions/lib/control-retire.ts",
|
|
97
|
+
"find": ["\t\t\tfor (const socket of sockets) socket.destroy();"],
|
|
98
|
+
"replace": ["\t\t\tvoid sockets;"],
|
|
99
|
+
"gate": ["bash", "run.sh", "check-control-retire"],
|
|
100
|
+
"timeoutSeconds": 600,
|
|
101
|
+
"signature": "[QK:RETIRE-BOUNDED-CLOSE]",
|
|
102
|
+
"signatureSource": "pi-extensions/lib/control-retire.test.ts"
|
|
103
|
+
}
|
|
104
|
+
]
|
|
105
|
+
}
|
|
@@ -135,17 +135,13 @@
|
|
|
135
135
|
"title": "dropping the receiver marker's liveness guard makes a dead watcher's marker read as an ACTIVE receiver — replies to a closed Copilot session are enqueued into a void and reported as delivered",
|
|
136
136
|
"subject": "pi-extensions/lib/meta-session.ts",
|
|
137
137
|
"find": [
|
|
138
|
-
"\t\
|
|
139
|
-
"\t\tif (!isPlausibleOwnerPid(marker.ownerPid)) return null;",
|
|
138
|
+
"\t\tif (marker === null) return null;",
|
|
140
139
|
"\t\tif (opts.verifyOwner !== false) {",
|
|
141
140
|
"\t\t\tconst liveKey = processStartKey(marker.ownerPid);",
|
|
142
141
|
"\t\t\tif (!liveKey || liveKey !== marker.ownerStartKey) return null;",
|
|
143
142
|
"\t\t}"
|
|
144
143
|
],
|
|
145
|
-
"replace": [
|
|
146
|
-
"\t\t// as an ACTIVE RECEIVER and pull the mailbox rail into delivering to a void.",
|
|
147
|
-
"\t\tif (!isPlausibleOwnerPid(marker.ownerPid)) return null;"
|
|
148
|
-
],
|
|
144
|
+
"replace": ["\t\tif (marker === null) return null;"],
|
|
149
145
|
"gate": ["bash", "run.sh", "check-copilot-receive-arm"],
|
|
150
146
|
"timeoutSeconds": 300,
|
|
151
147
|
"signature": "[QK:COPILOT-RECEIVE-DEAD-EXTENSION-REFUSED]",
|