@junghanacs/entwurf 0.52.0 → 0.53.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +1 -1
- package/BASELINE.md +116 -397
- package/CHANGELOG.md +131 -2
- package/CONTRIBUTING.md +4 -4
- package/DELIVERY.md +2 -2
- package/ENTWURF-CLI.json +1 -1
- package/README.md +7 -4
- package/VERIFY.md +332 -142
- package/demo/demo-baseline.sh +1 -1
- package/demo/demo.sh +1 -1
- package/docs/acp-backend-rail.md +248 -34
- package/docs/setup-clean-host.md +50 -65
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/acp-client.js +1 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/backend-adapter.js +90 -14
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/config.js +4 -9
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/context.js +15 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/model-ids.js +9 -12
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/models.js +41 -56
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/tool-surface.js +33 -6
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/fresh-call-composition.js +34 -3
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/herdr-fresh-call.js +3 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-fresh-call.js +2 -1
- package/package.json +4 -4
- package/pi/settings.reference.json +0 -1
- package/pi-extensions/acp-provider.ts +12 -6
- package/pi-extensions/lib/acp/acp-client.ts +6 -7
- package/pi-extensions/lib/acp/backend-adapter.ts +139 -15
- package/pi-extensions/lib/acp/backend.ts +261 -32
- package/pi-extensions/lib/acp/config.ts +4 -9
- package/pi-extensions/lib/acp/context.ts +17 -0
- package/pi-extensions/lib/acp/event-mapper.ts +236 -17
- package/pi-extensions/lib/acp/model-ids.js +9 -12
- package/pi-extensions/lib/acp/models.ts +46 -57
- package/pi-extensions/lib/acp/tool-surface.ts +34 -6
- package/pi-extensions/lib/fresh-call-composition.ts +37 -3
- package/pi-extensions/lib/herdr-fresh-call.ts +3 -1
- package/pi-extensions/lib/mux-fresh-call.ts +3 -1
- package/run.sh +25 -86
- package/scripts/check-acp-carrier-augment.ts +3 -21
- package/scripts/check-acp-prompt-lifecycle.ts +24 -3
- package/scripts/check-acp-provider-surface.ts +17 -26
- package/scripts/check-acp-session-reuse.ts +23 -4
- package/scripts/check-acp-stop-reason.ts +22 -3
- package/scripts/check-acp-stream-hooks.ts +24 -3
- package/scripts/check-acp-usage-accounting.ts +53 -24
- package/scripts/check-copilot-receive-arm.ts +19 -2
- package/scripts/check-fresh-call-dispatch.ts +9 -3
- package/scripts/check-gate-qualification.ts +5 -5
- package/scripts/check-herdr-fresh-call.ts +1 -0
- package/scripts/check-install-surface.ts +6 -0
- package/scripts/check-probe-ordering.ts +34 -24
- package/scripts/check-release-gate-outcomes.ts +9 -23
- package/scripts/lib/probe-cli-target.ts +3 -2
- package/scripts/mutants/acp-augment.json +0 -26
- package/scripts/mutants/acp-cortex.json +10 -183
- package/scripts/mutants/acp-foreground-only.json +11 -0
- package/scripts/mutants/acp-launch-namespace.json +3 -1
- package/scripts/mutants/acp-prompt-lifecycle.json +2 -2
- package/scripts/mutants/acp-set-model-readback.json +488 -0
- package/scripts/mutants/mux-fresh-call.json +12 -1
- package/scripts/mutants/pi-floor.json +2 -2
- package/scripts/mutants/release-gate.json +3 -3
- package/scripts/raw-acp-compaction-measure/probe.ts +8 -2
- package/scripts/smoke-acp-cortex-live.ts +4 -408
- package/scripts/smoke-acp-ordering-probe-live.ts +7 -1
- package/scripts/smoke-acp-session-reuse-live.ts +11 -2
- package/scripts/smoke-herdr-raw-install-live.sh +4 -4
- package/scripts/check-acp-cortex.ts +0 -710
|
@@ -3,205 +3,32 @@
|
|
|
3
3
|
"lane": "acp-cortex",
|
|
4
4
|
"mutants": [
|
|
5
5
|
{
|
|
6
|
-
"claim": "
|
|
7
|
-
"title": "dropping a curated row
|
|
8
|
-
"subject": "pi-extensions/lib/acp/model-ids.js",
|
|
9
|
-
"find": [
|
|
10
|
-
"export const SUPPORTED_CORTEX_MODEL_IDS = /** @type {const} */ ([",
|
|
11
|
-
"\t\"cortex-auto\",",
|
|
12
|
-
"\t\"cortex-claude-opus-5\",",
|
|
13
|
-
"\t\"cortex-claude-sonnet-5\",",
|
|
14
|
-
"\t\"cortex-openai-gpt-5.4\",",
|
|
15
|
-
"]);"
|
|
16
|
-
],
|
|
17
|
-
"replace": [
|
|
18
|
-
"export const SUPPORTED_CORTEX_MODEL_IDS = /** @type {const} */ ([",
|
|
19
|
-
"\t\"cortex-auto\",",
|
|
20
|
-
"\t\"cortex-claude-sonnet-5\",",
|
|
21
|
-
"\t\"cortex-openai-gpt-5.4\",",
|
|
22
|
-
"]);"
|
|
23
|
-
],
|
|
24
|
-
"gate": ["bash", "run.sh", "check-acp-cortex"],
|
|
25
|
-
"timeoutSeconds": 300,
|
|
26
|
-
"signature": "[QK:CORTEX-CURATED-FOUR-ROWS]",
|
|
27
|
-
"signatureSource": "scripts/check-acp-cortex.ts"
|
|
28
|
-
},
|
|
29
|
-
{
|
|
30
|
-
"claim": "CLAUDE-CURATED-THREE-ROWS",
|
|
31
|
-
"title": "dropping a curated CLAUDE row shrinks the operator's model list while the exact-set comparison stays green — expected derives from the same constant, so only the independent count catches it",
|
|
6
|
+
"claim": "CLAUDE-CURATED-FOUR-ROWS",
|
|
7
|
+
"title": "dropping a curated Claude row shrinks the operator's model list",
|
|
32
8
|
"subject": "pi-extensions/lib/acp/model-ids.js",
|
|
33
9
|
"find": [
|
|
34
10
|
"export const SUPPORTED_ANTHROPIC_MODEL_IDS = /** @type {const} */ ([",
|
|
35
11
|
"\t\"claude-sonnet-5-5\",",
|
|
36
12
|
"\t\"claude-opus-5-5\",",
|
|
37
13
|
"\t\"claude-fable-5-1\",",
|
|
14
|
+
"\t\"claude-fable-5-2\",",
|
|
38
15
|
"]);"
|
|
39
16
|
],
|
|
40
17
|
"replace": [
|
|
41
18
|
"export const SUPPORTED_ANTHROPIC_MODEL_IDS = /** @type {const} */ ([",
|
|
42
19
|
"\t\"claude-sonnet-5-5\",",
|
|
43
20
|
"\t\"claude-opus-5-5\",",
|
|
21
|
+
"\t\"claude-fable-5-1\",",
|
|
44
22
|
"]);"
|
|
45
23
|
],
|
|
46
24
|
"gate": ["bash", "run.sh", "check-acp-provider-surface"],
|
|
47
25
|
"timeoutSeconds": 300,
|
|
48
|
-
"signature": "[QK:CLAUDE-CURATED-
|
|
26
|
+
"signature": "[QK:CLAUDE-CURATED-FOUR-ROWS]",
|
|
49
27
|
"signatureSource": "scripts/check-acp-provider-surface.ts"
|
|
50
28
|
},
|
|
51
|
-
{
|
|
52
|
-
"claim": "CORTEX-AUTH-NARROW-CREDENTIAL-CACHE",
|
|
53
|
-
"title": "widening the auth passthrough to the whole cortex/cache leaks operator tool_outputs/tip_history into the child",
|
|
54
|
-
"subject": "pi-extensions/lib/acp/overlay.ts",
|
|
55
|
-
"find": [
|
|
56
|
-
"\tcortexLinkIfExists(",
|
|
57
|
-
"\t\tjoin(realSnowflake, \"cortex\", \"cache\", \"credential_cache\"),",
|
|
58
|
-
"\t\tjoin(cortexDir, \"cache\", \"credential_cache\"),",
|
|
59
|
-
"\t);"
|
|
60
|
-
],
|
|
61
|
-
"replace": [
|
|
62
|
-
"\trmSync(join(cortexDir, \"cache\"), { recursive: true, force: true });",
|
|
63
|
-
"\tcortexLinkIfExists(join(realSnowflake, \"cortex\", \"cache\"), join(cortexDir, \"cache\"));"
|
|
64
|
-
],
|
|
65
|
-
"gate": ["bash", "run.sh", "check-acp-cortex"],
|
|
66
|
-
"timeoutSeconds": 300,
|
|
67
|
-
"signature": "[QK:CORTEX-AUTH-NARROW-CREDENTIAL-CACHE]",
|
|
68
|
-
"signatureSource": "scripts/check-acp-cortex.ts"
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
"claim": "CORTEX-AUTOUPDATE-OFF",
|
|
72
|
-
"title": "flipping autoUpdate back on lets the cortex runtime replace itself on launch mid-rail (D4)",
|
|
73
|
-
"subject": "pi-extensions/lib/acp/overlay.ts",
|
|
74
|
-
"find": ["\treturn `${JSON.stringify({ autoUpdate: false }, null, \"\\t\")}\\n`;"],
|
|
75
|
-
"replace": ["\treturn `${JSON.stringify({ autoUpdate: true }, null, \"\\t\")}\\n`;"],
|
|
76
|
-
"gate": ["bash", "run.sh", "check-acp-cortex"],
|
|
77
|
-
"timeoutSeconds": 300,
|
|
78
|
-
"signature": "[QK:CORTEX-AUTOUPDATE-OFF]",
|
|
79
|
-
"signatureSource": "scripts/check-acp-cortex.ts"
|
|
80
|
-
},
|
|
81
|
-
{
|
|
82
|
-
"claim": "CORTEX-REALHOME-PLATFORM-NEUTRAL",
|
|
83
|
-
"title": "re-deriving realHome absoluteness from the POSIX flavor alone makes a drive/UNC HOME read as relative — the guard would state the host it runs on instead of the contract (PR #77, @yizixu)",
|
|
84
|
-
"subject": "pi-extensions/lib/acp/overlay.ts",
|
|
85
|
-
"find": ["\tif (!params.realHome || !(isAbsolute(params.realHome) || win32.isAbsolute(params.realHome))) {"],
|
|
86
|
-
"replace": ["\tif (!params.realHome || !params.realHome.startsWith(\"/\")) {"],
|
|
87
|
-
"gate": ["bash", "run.sh", "check-acp-cortex"],
|
|
88
|
-
"timeoutSeconds": 300,
|
|
89
|
-
"signature": "[QK:CORTEX-REALHOME-PLATFORM-NEUTRAL]",
|
|
90
|
-
"signatureSource": "scripts/check-acp-cortex.ts"
|
|
91
|
-
},
|
|
92
|
-
{
|
|
93
|
-
"claim": "CORTEX-BRIDGE-DUAL-HOME",
|
|
94
|
-
"title": "dropping the bridge-only real-HOME restore leaves the garden store cut off — tools reach the model but see an empty garden (D10)",
|
|
95
|
-
"subject": "pi-extensions/lib/acp/overlay.ts",
|
|
96
|
-
"find": ["\t\tif (stdio.name === CORTEX_DUAL_HOME_BRIDGE_SERVER) env.HOME = realHome;"],
|
|
97
|
-
"replace": ["\t\tvoid realHome;"],
|
|
98
|
-
"gate": ["bash", "run.sh", "check-acp-cortex"],
|
|
99
|
-
"timeoutSeconds": 300,
|
|
100
|
-
"signature": "[QK:CORTEX-BRIDGE-DUAL-HOME]",
|
|
101
|
-
"signatureSource": "scripts/check-acp-cortex.ts"
|
|
102
|
-
},
|
|
103
|
-
{
|
|
104
|
-
"claim": "CORTEX-MCP-NON-STDIO-FAILLOUD",
|
|
105
|
-
"title": "silently dropping a non-stdio server advertises a config the session does not have (D9 fail-loud)",
|
|
106
|
-
"subject": "pi-extensions/lib/acp/overlay.ts",
|
|
107
|
-
"find": [
|
|
108
|
-
"\t\tif (\"type\" in server && (server.type === \"http\" || server.type === \"sse\")) {",
|
|
109
|
-
"\t\t\tthrow new Error(",
|
|
110
|
-
"\t\t\t\t`entwurf: cortex mcp.json projection cannot represent ${server.type} server ` +",
|
|
111
|
-
"\t\t\t\t\t`${JSON.stringify(server.name)} — only stdio entries are measured through ` +",
|
|
112
|
-
"\t\t\t\t\t`$SNOWFLAKE_HOME/cortex/mcp.json (CP0 D9). Remove it from entwurfProvider.mcpServers ` +",
|
|
113
|
-
"\t\t\t\t\t`for cortex models or front it with a stdio bridge.`,",
|
|
114
|
-
"\t\t\t);",
|
|
115
|
-
"\t\t}"
|
|
116
|
-
],
|
|
117
|
-
"replace": [
|
|
118
|
-
"\t\tif (\"type\" in server && (server.type === \"http\" || server.type === \"sse\")) {",
|
|
119
|
-
"\t\t\tcontinue;",
|
|
120
|
-
"\t\t}"
|
|
121
|
-
],
|
|
122
|
-
"gate": ["bash", "run.sh", "check-acp-cortex"],
|
|
123
|
-
"timeoutSeconds": 300,
|
|
124
|
-
"signature": "[QK:CORTEX-MCP-NON-STDIO-FAILLOUD]",
|
|
125
|
-
"signatureSource": "scripts/check-acp-cortex.ts"
|
|
126
|
-
},
|
|
127
|
-
{
|
|
128
|
-
"claim": "CORTEX-OVERLAY-SESSION-SCOPED",
|
|
129
|
-
"title": "a static shared overlay dir lets two residents overwrite one mcp.json/envelope",
|
|
130
|
-
"subject": "pi-extensions/lib/acp/overlay.ts",
|
|
131
|
-
"find": ["\tconst scopeDir = join(overlaysRoot, cortexOverlayScopeId(params.scopeKey));"],
|
|
132
|
-
"replace": ["\tconst scopeDir = join(overlaysRoot, \"shared\");"],
|
|
133
|
-
"gate": ["bash", "run.sh", "check-acp-cortex"],
|
|
134
|
-
"timeoutSeconds": 300,
|
|
135
|
-
"signature": "[QK:CORTEX-OVERLAY-SESSION-SCOPED]",
|
|
136
|
-
"signatureSource": "scripts/check-acp-cortex.ts"
|
|
137
|
-
},
|
|
138
|
-
{
|
|
139
|
-
"claim": "CORTEX-HOME-PRESENCE-REFUSED",
|
|
140
|
-
"title": "a truthy check instead of presence lets an empty-string CORTEX_HOME slip past the refusal (D3 E2b nuance)",
|
|
141
|
-
"subject": "pi-extensions/lib/acp/backend-adapter.ts",
|
|
142
|
-
"find": ["\t\tif (\"CORTEX_HOME\" in process.env) {"],
|
|
143
|
-
"replace": ["\t\tif (process.env.CORTEX_HOME) {"],
|
|
144
|
-
"gate": ["bash", "run.sh", "check-acp-cortex"],
|
|
145
|
-
"timeoutSeconds": 300,
|
|
146
|
-
"signature": "[QK:CORTEX-HOME-PRESENCE-REFUSED]",
|
|
147
|
-
"signatureSource": "scripts/check-acp-cortex.ts"
|
|
148
|
-
},
|
|
149
|
-
{
|
|
150
|
-
"claim": "CORTEX-LAUNCH-NO-MODEL-PIN",
|
|
151
|
-
"title": "re-introducing the launch -m pin creates a second model authority that drifts from per-turn set-model",
|
|
152
|
-
"subject": "pi-extensions/lib/acp/backend-adapter.ts",
|
|
153
|
-
"find": [
|
|
154
|
-
"\tresolveLaunch({ config }) {",
|
|
155
|
-
"\t\tconst settings = config.adapterSettings as CortexAdapterSettings | undefined;",
|
|
156
|
-
"\t\tconst connection = settings?.cortexConnection?.trim() || undefined;",
|
|
157
|
-
"\t\tconst selectionArgs: string[] = [];"
|
|
158
|
-
],
|
|
159
|
-
"replace": [
|
|
160
|
-
"\tresolveLaunch({ config, nativeModelId }) {",
|
|
161
|
-
"\t\tconst settings = config.adapterSettings as CortexAdapterSettings | undefined;",
|
|
162
|
-
"\t\tconst connection = settings?.cortexConnection?.trim() || undefined;",
|
|
163
|
-
"\t\tconst selectionArgs: string[] = [\"-m\", nativeModelId];"
|
|
164
|
-
],
|
|
165
|
-
"gate": ["bash", "run.sh", "check-acp-cortex"],
|
|
166
|
-
"timeoutSeconds": 300,
|
|
167
|
-
"signature": "[QK:CORTEX-LAUNCH-NO-MODEL-PIN]",
|
|
168
|
-
"signatureSource": "scripts/check-acp-cortex.ts"
|
|
169
|
-
},
|
|
170
|
-
{
|
|
171
|
-
"claim": "CORTEX-ENFORCE-SET-MODEL",
|
|
172
|
-
"title": "enforcing a constant instead of the native id silently answers with the wrong model (CP0-M)",
|
|
173
|
-
"subject": "pi-extensions/lib/acp/backend-adapter.ts",
|
|
174
|
-
"find": [
|
|
175
|
-
"\t\tawait setConfig.call(connection, { sessionId: acpSessionId, configId: \"model\", value: nativeModelId });",
|
|
176
|
-
"\t},",
|
|
177
|
-
"",
|
|
178
|
-
"\t// A connection change must invalidate a reused session (rail: Adapter contract). Flat,"
|
|
179
|
-
],
|
|
180
|
-
"replace": [
|
|
181
|
-
"\t\tawait setConfig.call(connection, { sessionId: acpSessionId, configId: \"model\", value: \"auto\" });",
|
|
182
|
-
"\t},",
|
|
183
|
-
"",
|
|
184
|
-
"\t// A connection change must invalidate a reused session (rail: Adapter contract). Flat,"
|
|
185
|
-
],
|
|
186
|
-
"gate": ["bash", "run.sh", "check-acp-cortex"],
|
|
187
|
-
"timeoutSeconds": 300,
|
|
188
|
-
"signature": "[QK:CORTEX-ENFORCE-SET-MODEL]",
|
|
189
|
-
"signatureSource": "scripts/check-acp-cortex.ts"
|
|
190
|
-
},
|
|
191
|
-
{
|
|
192
|
-
"claim": "CORTEX-OVERLAY-KEY-IS-SESSION-KEY",
|
|
193
|
-
"title": "re-deriving the overlay scope from ambient env drops opts.sessionId — two same-process/cwd sessions alias one overlay/mcp.json",
|
|
194
|
-
"subject": "pi-extensions/lib/acp/backend-adapter.ts",
|
|
195
|
-
"find": ["\t\tconst overlay = ensureCortexDualHomeOverlay({", "\t\t\tscopeKey: sessionKey,"],
|
|
196
|
-
"replace": ["\t\tconst overlay = ensureCortexDualHomeOverlay({", "\t\t\tscopeKey: piSessionId ?? \"static\","],
|
|
197
|
-
"gate": ["bash", "run.sh", "check-acp-cortex"],
|
|
198
|
-
"timeoutSeconds": 300,
|
|
199
|
-
"signature": "[QK:CORTEX-OVERLAY-KEY-IS-SESSION-KEY]",
|
|
200
|
-
"signatureSource": "scripts/check-acp-cortex.ts"
|
|
201
|
-
},
|
|
202
29
|
{
|
|
203
30
|
"claim": "ACP-OVERLAY-SESSIONKEY-WIRED",
|
|
204
|
-
"title": "passing a cwd-derived key instead of resolveSessionKey's value
|
|
31
|
+
"title": "passing a cwd-derived key instead of resolveSessionKey's value merges distinct sessions' overlay scopes",
|
|
205
32
|
"subject": "pi-extensions/lib/acp/backend.ts",
|
|
206
33
|
"find": [
|
|
207
34
|
"\t\t\tconst overlay = adapter.ensureOverlay({ cwd, modelId: model.id, nativeModelId, config, sessionKey });"
|
|
@@ -215,14 +42,14 @@
|
|
|
215
42
|
"signatureSource": "scripts/check-acp-session-reuse.ts"
|
|
216
43
|
},
|
|
217
44
|
{
|
|
218
|
-
"claim": "
|
|
219
|
-
"title": "
|
|
45
|
+
"claim": "ACP-PROVIDER-CLAUDE-ONLY",
|
|
46
|
+
"title": "the provider entry advertises a retired Cortex row despite the admission fence",
|
|
220
47
|
"subject": "pi-extensions/acp-provider.ts",
|
|
221
48
|
"find": ["\t\tmodels: allCuratedModels(),"],
|
|
222
|
-
"replace": ["\t\tmodels: allCuratedModels()
|
|
49
|
+
"replace": ["\t\tmodels: [...allCuratedModels(), { ...allCuratedModels()[0], id: \"cortex-auto\" }],"],
|
|
223
50
|
"gate": ["bash", "run.sh", "check-acp-provider-surface"],
|
|
224
51
|
"timeoutSeconds": 300,
|
|
225
|
-
"signature": "[QK:
|
|
52
|
+
"signature": "[QK:ACP-PROVIDER-CLAUDE-ONLY]",
|
|
226
53
|
"signatureSource": "scripts/check-acp-provider-surface.ts"
|
|
227
54
|
}
|
|
228
55
|
]
|
|
@@ -12,6 +12,17 @@
|
|
|
12
12
|
"timeoutSeconds": 60,
|
|
13
13
|
"signature": "[QK:ACP-CLAUDE-FOREGROUND-ONLY]",
|
|
14
14
|
"signatureSource": "pi-extensions/lib/acp/backend-adapter.test.ts"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"claim": "ACP-CLAUDE-NO-IDLE-COMPACTION",
|
|
18
|
+
"title": "the claude session settings lose idleCompaction:false — claude-agent-acp 0.101+ sends its own /compact prompt on an idle retained session, a model turn pi never sees",
|
|
19
|
+
"subject": "pi-extensions/lib/acp/tool-surface.ts",
|
|
20
|
+
"find": ["\t\t\tidleCompaction: false,"],
|
|
21
|
+
"replace": [""],
|
|
22
|
+
"gate": ["bash", "run.sh", "check-acp-foreground-only"],
|
|
23
|
+
"timeoutSeconds": 60,
|
|
24
|
+
"signature": "[QK:ACP-CLAUDE-NO-IDLE-COMPACTION]",
|
|
25
|
+
"signatureSource": "pi-extensions/lib/acp/backend-adapter.test.ts"
|
|
15
26
|
}
|
|
16
27
|
]
|
|
17
28
|
}
|
|
@@ -7,7 +7,9 @@
|
|
|
7
7
|
"title": "the default launch names the vendor bin directly again — the child re-enters the process-name space a janitor for another harness scans by substring, which is the whole of #72",
|
|
8
8
|
"subject": "pi-extensions/lib/acp/backend-adapter.ts",
|
|
9
9
|
"find": ["\tconst launcher = fileURLToPath(new URL(\"./claude-acp-launch.js\", import.meta.url));"],
|
|
10
|
-
"replace": [
|
|
10
|
+
"replace": [
|
|
11
|
+
"\tconst launcher = require.resolve(\"@agentclientprotocol/claude-agent-acp/package.json\").replace(/package\\.json$/, \"dist/index.js\");"
|
|
12
|
+
],
|
|
11
13
|
"gate": ["bash", "run.sh", "check-acp-launch-namespace"],
|
|
12
14
|
"timeoutSeconds": 240,
|
|
13
15
|
"signature": "[QK:CLAUDE-LAUNCH-IS-NAMESPACED]",
|
|
@@ -77,9 +77,9 @@
|
|
|
77
77
|
"title": "a backend session that died between turns is cleared but never announced — the next turn respawns silently and the operator never learns the session is gone",
|
|
78
78
|
"subject": "pi-extensions/lib/acp/backend.ts",
|
|
79
79
|
"find": [
|
|
80
|
-
"\t\t\tconst priorEnd = takeUnreportedChildEnd(sessionKey);\n\t\t\tif (priorEnd) {\n\t\t\t\tpushAcpLifecycleNotice(\n\t\t\t\t\tstate,\n\t\t\t\t\t`previous ${adapter.backend} session ended between turns (${describeChildEnd(priorEnd)}) — opening a new one`,\n\t\t\t\t);\n\t\t\t}"
|
|
80
|
+
"\t\t\tconst priorEnd = summary ? undefined : takeUnreportedChildEnd(sessionKey);\n\t\t\tif (priorEnd) {\n\t\t\t\tpushAcpLifecycleNotice(\n\t\t\t\t\tstate,\n\t\t\t\t\t`previous ${adapter.backend} session ended between turns (${describeChildEnd(priorEnd)}) — opening a new one`,\n\t\t\t\t);\n\t\t\t}"
|
|
81
81
|
],
|
|
82
|
-
"replace": ["\t\t\
|
|
82
|
+
"replace": ["\t\t\tif (!summary) takeUnreportedChildEnd(sessionKey);"],
|
|
83
83
|
"gate": ["bash", "run.sh", "check-acp-prompt-lifecycle"],
|
|
84
84
|
"timeoutSeconds": 180,
|
|
85
85
|
"signature": "[QK:IDLE-DEATH-ANNOUNCED]",
|