@junghanacs/entwurf 0.34.2 → 0.35.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/CHANGELOG.md +244 -0
- package/README.md +7 -0
- package/VERIFY.md +16 -5
- package/demo/README.md +109 -175
- package/demo/demo-baseline.sh +5 -1
- package/demo/demo.sh +6 -2
- package/demo/herdr-pi-cc-20261011.provenance.json +64 -0
- package/docs/acp-backend-rail.md +28 -2
- package/docs/assets/entwurf-demo.gif +0 -0
- package/docs/setup-clean-host.md +1 -1
- 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/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/resume-launch-identity.js +13 -4
- package/mcp/entwurf-bridge/dist/pi-extensions/meta-bridge-pi-durable.js +119 -11
- package/package.json +4 -2
- 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/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/resume-launch-identity.ts +12 -4
- package/pi-extensions/meta-bridge-pi-durable.ts +153 -13
- package/run.sh +118 -20
- 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-fresh-call-dispatch.ts +47 -4
- package/scripts/check-gate-qualification.ts +8 -5
- package/scripts/check-probe-ordering.ts +13 -6
- package/scripts/check-release-gate-outcomes.ts +159 -1
- package/scripts/check-resume-launch-identity.ts +38 -0
- package/scripts/ci-qualify-decide.sh +114 -17
- package/scripts/mutants/acp-cortex.json +17 -8
- package/scripts/mutants/acp-set-model-readback.json +28 -0
- package/scripts/mutants/demo-reproducibility.json +155 -0
- package/scripts/mutants/fresh-call-dispatch.json +11 -0
- package/scripts/mutants/herdr-dev-checkout.json +70 -0
- package/scripts/mutants/pi-durable.json +117 -0
- package/scripts/mutants/release-gate.json +28 -2
- package/scripts/mutants/resume-launch-identity.json +15 -0
- package/scripts/mutants/v2-visible-resume.json +11 -0
- 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/scripts/tsconfig.json +1 -0
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"lane": "demo-reproducibility",
|
|
4
|
+
"mutants": [
|
|
5
|
+
{
|
|
6
|
+
"claim": "DEMO-BASELINE-ARCHIVED",
|
|
7
|
+
"title": "the archived baseline resumes launching the retired scene and can overwrite the approved GIF",
|
|
8
|
+
"subject": "demo/demo-baseline.sh",
|
|
9
|
+
"find": ["exit 2"],
|
|
10
|
+
"replace": [":"],
|
|
11
|
+
"gate": ["bash", "run.sh", "check-demo-reproducibility"],
|
|
12
|
+
"timeoutSeconds": 120,
|
|
13
|
+
"signature": "[QK:DEMO-BASELINE-ARCHIVED]",
|
|
14
|
+
"signatureSource": "demo/maintenance-guards.test.ts"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"claim": "DEMO-PEER-ARCHIVED",
|
|
18
|
+
"title": "the archived peer scene becomes a second runnable v1 route again",
|
|
19
|
+
"subject": "demo/demo.sh",
|
|
20
|
+
"find": ["exit 2"],
|
|
21
|
+
"replace": [":"],
|
|
22
|
+
"gate": ["bash", "run.sh", "check-demo-reproducibility"],
|
|
23
|
+
"timeoutSeconds": 120,
|
|
24
|
+
"signature": "[QK:DEMO-PEER-ARCHIVED]",
|
|
25
|
+
"signatureSource": "demo/maintenance-guards.test.ts"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"claim": "DEMO-LIVE-OPT-IN",
|
|
29
|
+
"title": "the Herdr scene reaches preflight without the explicit LIVE grant",
|
|
30
|
+
"subject": "demo/take-herdr-pi-cc.ts",
|
|
31
|
+
"find": ["if (process.env.LIVE !== \"1\")"],
|
|
32
|
+
"replace": ["if (false)"],
|
|
33
|
+
"gate": ["bash", "run.sh", "check-demo-reproducibility"],
|
|
34
|
+
"timeoutSeconds": 120,
|
|
35
|
+
"signature": "[QK:DEMO-LIVE-OPT-IN]",
|
|
36
|
+
"signatureSource": "demo/maintenance-guards.test.ts"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"claim": "DEMO-PUBLISHED-PROVENANCE",
|
|
40
|
+
"title": "the tracked provenance names another GIF digest while the approved pixels stay unchanged",
|
|
41
|
+
"subject": "demo/herdr-pi-cc-20261011.provenance.json",
|
|
42
|
+
"find": ["\t\t\"sha256\": \"b686739b5c68fa458dd47c844711aea0f6ab5819eb3eb5d2850449922fa084c0\","],
|
|
43
|
+
"replace": ["\t\t\"sha256\": \"0000000000000000000000000000000000000000000000000000000000000000\","],
|
|
44
|
+
"gate": ["bash", "run.sh", "check-demo-reproducibility"],
|
|
45
|
+
"timeoutSeconds": 120,
|
|
46
|
+
"signature": "[QK:DEMO-PUBLISHED-PROVENANCE]",
|
|
47
|
+
"signatureSource": "demo/maintenance-guards.test.ts"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"claim": "DEMO-PACK-SOURCE-ONLY",
|
|
51
|
+
"title": "a directory allowlist ships maintainer TypeScript as if it were an installed entrypoint",
|
|
52
|
+
"subject": "package.json",
|
|
53
|
+
"find": [
|
|
54
|
+
"\t\t\"demo/README.md\",",
|
|
55
|
+
"\t\t\"demo/herdr-pi-cc-20261011.provenance.json\",",
|
|
56
|
+
"\t\t\"!demo/**/*.ts\","
|
|
57
|
+
],
|
|
58
|
+
"replace": ["\t\t\"demo/\","],
|
|
59
|
+
"gate": ["bash", "run.sh", "check-demo-reproducibility"],
|
|
60
|
+
"timeoutSeconds": 120,
|
|
61
|
+
"signature": "[QK:DEMO-PACK-SOURCE-ONLY]",
|
|
62
|
+
"signatureSource": "demo/maintenance-guards.test.ts"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"claim": "DEMO-PUBLICATION-DESTINATION",
|
|
66
|
+
"title": "a live-pass renderer can overwrite publication assets through a direct or aliased destination",
|
|
67
|
+
"subject": "demo/render-take.ts",
|
|
68
|
+
"find": ["\tif (isPublicationOutput(out))"],
|
|
69
|
+
"replace": ["\tif (false)"],
|
|
70
|
+
"gate": ["bash", "run.sh", "check-demo-reproducibility"],
|
|
71
|
+
"timeoutSeconds": 120,
|
|
72
|
+
"signature": "[QK:DEMO-PUBLICATION-DESTINATION]",
|
|
73
|
+
"signatureSource": "demo/maintenance-guards.test.ts"
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"claim": "DEMO-TMUX-SUBJECT-TAIL",
|
|
77
|
+
"title": "the tmux tail trimmer drops real subject text merged with the terminal teardown",
|
|
78
|
+
"subject": "demo/render-take.ts",
|
|
79
|
+
"find": ["\t\tisOnlyCsi(teardown[2])"],
|
|
80
|
+
"replace": ["\t\ttrue"],
|
|
81
|
+
"gate": ["bash", "run.sh", "check-demo-reproducibility"],
|
|
82
|
+
"timeoutSeconds": 120,
|
|
83
|
+
"signature": "[QK:DEMO-TMUX-SUBJECT-TAIL]",
|
|
84
|
+
"signatureSource": "demo/render-take.test.ts"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"claim": "DEMO-RECORDING-REQUIRED",
|
|
88
|
+
"title": "no recorder means no assertion, so an empty capture again certifies live-pass",
|
|
89
|
+
"subject": "demo/lib/take-recorder.ts",
|
|
90
|
+
"find": [
|
|
91
|
+
"\t\tthis.step(",
|
|
92
|
+
"\t\t\t\"the recording ran until the take ended and the recorder stopped cleanly (no cut, no signal, exit 0)\","
|
|
93
|
+
],
|
|
94
|
+
"replace": [
|
|
95
|
+
"\t\tif (recorder) this.step(",
|
|
96
|
+
"\t\t\t\"the recording ran until the take ended and the recorder stopped cleanly (no cut, no signal, exit 0)\","
|
|
97
|
+
],
|
|
98
|
+
"gate": ["bash", "run.sh", "check-demo-reproducibility"],
|
|
99
|
+
"timeoutSeconds": 120,
|
|
100
|
+
"signature": "[QK:DEMO-RECORDING-REQUIRED]",
|
|
101
|
+
"signatureSource": "demo/lib/take-recorder.test.ts"
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"claim": "DEMO-TEST-DISCOVERY",
|
|
105
|
+
"title": "a dead discovery glob produces no tests but the demo floor is still invoked",
|
|
106
|
+
"subject": "run.sh",
|
|
107
|
+
"find": [
|
|
108
|
+
" while IFS= read -r f; do [ -n \"$f\" ] && tests+=(\"$f\"); done < <(cd \"$REPO_DIR\" && find demo -type f -name '*.test.ts' -print | LC_ALL=C sort)"
|
|
109
|
+
],
|
|
110
|
+
"replace": [
|
|
111
|
+
" while IFS= read -r f; do [ -n \"$f\" ] && tests+=(\"$f\"); done < <(cd \"$REPO_DIR\" && find demo -type f -name '*.test.NO-MATCH' -print | LC_ALL=C sort)"
|
|
112
|
+
],
|
|
113
|
+
"gate": ["bash", "run.sh", "check-demo-reproducibility"],
|
|
114
|
+
"timeoutSeconds": 120,
|
|
115
|
+
"signature": "[QK:DEMO-TEST-DISCOVERY]",
|
|
116
|
+
"signatureSource": "run.sh"
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"claim": "DEMO-NO-EARLY-RESOURCES",
|
|
120
|
+
"title": "a Take allocated before missing-LIVE refusal writes resources without calling any fake tool",
|
|
121
|
+
"subject": "demo/take-pi-cc.ts",
|
|
122
|
+
"find": ["if (process.env.LIVE !== \"1\") {"],
|
|
123
|
+
"replace": [
|
|
124
|
+
"if (process.env.LIVE !== \"1\") {",
|
|
125
|
+
"\tnew Take({ label: LABEL, repo: REPO, cols: 132, rows: 38 });"
|
|
126
|
+
],
|
|
127
|
+
"gate": ["bash", "run.sh", "check-demo-reproducibility"],
|
|
128
|
+
"timeoutSeconds": 120,
|
|
129
|
+
"signature": "[QK:DEMO-NO-EARLY-RESOURCES]",
|
|
130
|
+
"signatureSource": "demo/maintenance-guards.test.ts"
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"claim": "DEMO-ORIGINAL-RENDER-INPUT",
|
|
134
|
+
"title": "rerendering replaces the original approved GIF's exact agg input inside the take directory",
|
|
135
|
+
"subject": "demo/render-take.ts",
|
|
136
|
+
"find": ["\tconst renderCast = path.join(path.dirname(out), `.${path.basename(out)}.${tag}.render.cast`);"],
|
|
137
|
+
"replace": ["\tconst renderCast = path.join(takeDir, \"take.render.cast\");"],
|
|
138
|
+
"gate": ["bash", "run.sh", "check-demo-reproducibility"],
|
|
139
|
+
"timeoutSeconds": 120,
|
|
140
|
+
"signature": "[QK:DEMO-ORIGINAL-RENDER-INPUT]",
|
|
141
|
+
"signatureSource": "demo/render-take.test.ts"
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
"claim": "DEMO-RAIL-POLICY",
|
|
145
|
+
"title": "the pi-durable scene stops refusing an OpenRouter base-URL redirect, so LIVE=1 could spend a sibling turn through OpenRouter",
|
|
146
|
+
"subject": "demo/take-pi-durable.ts",
|
|
147
|
+
"find": ["const routedVia = openRouterOverride(process.env);"],
|
|
148
|
+
"replace": ["const routedVia = null;"],
|
|
149
|
+
"gate": ["bash", "run.sh", "check-demo-reproducibility"],
|
|
150
|
+
"timeoutSeconds": 120,
|
|
151
|
+
"signature": "[QK:DEMO-RAIL-POLICY]",
|
|
152
|
+
"signatureSource": "demo/maintenance-guards.test.ts"
|
|
153
|
+
}
|
|
154
|
+
]
|
|
155
|
+
}
|
|
@@ -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
|
+
}
|
|
@@ -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",
|
|
@@ -151,8 +151,12 @@
|
|
|
151
151
|
"claim": "QUALIFY-FILTER-READS-PUSH-RANGE",
|
|
152
152
|
"title": "the filter reads the tip commit instead of the two-dot push range - the exact misreading that once concluded four of the five historical qualification reds would have been skipped",
|
|
153
153
|
"subject": "scripts/ci-qualify-decide.sh",
|
|
154
|
-
"find": [
|
|
155
|
-
|
|
154
|
+
"find": [
|
|
155
|
+
"CHANGED=\"$(git -C \"$REPO_DIR\" diff --no-renames --no-ext-diff --no-textconv --name-only \"$BEFORE\"..\"$HEAD_SHA\" 2>/dev/null)\""
|
|
156
|
+
],
|
|
157
|
+
"replace": [
|
|
158
|
+
"CHANGED=\"$(git -C \"$REPO_DIR\" diff --no-renames --no-ext-diff --no-textconv --name-only \"$HEAD_SHA~1\"..\"$HEAD_SHA\" 2>/dev/null)\""
|
|
159
|
+
],
|
|
156
160
|
"gate": ["bash", "run.sh", "check-release-gate-outcomes"],
|
|
157
161
|
"timeoutSeconds": 180,
|
|
158
162
|
"signature": "[QK:QUALIFY-FILTER-READS-PUSH-RANGE]",
|
|
@@ -169,6 +173,28 @@
|
|
|
169
173
|
"signature": "[QK:QUALIFY-FILTER-REPLAYS-PAST-CATCHES]",
|
|
170
174
|
"signatureSource": "scripts/check-release-gate-outcomes.ts"
|
|
171
175
|
},
|
|
176
|
+
{
|
|
177
|
+
"claim": "QUALIFY-FILTER-SUBJECT-HUNKS",
|
|
178
|
+
"title": "data-subject hunk refinement collapses back to file identity, so a version-only pin repeats the unchanged mutant body",
|
|
179
|
+
"subject": "scripts/ci-qualify-decide.sh",
|
|
180
|
+
"find": ["\t\t\t\tif subject_find_untouched \"$file\"; then"],
|
|
181
|
+
"replace": ["\t\t\t\tif false; then"],
|
|
182
|
+
"gate": ["bash", "run.sh", "check-release-gate-outcomes"],
|
|
183
|
+
"timeoutSeconds": 180,
|
|
184
|
+
"signature": "[QK:QUALIFY-FILTER-SUBJECT-HUNKS]",
|
|
185
|
+
"signatureSource": "scripts/check-release-gate-outcomes.ts"
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
"claim": "QUALIFY-FILTER-TOML-ONLY-REFINEMENT",
|
|
189
|
+
"title": "Markdown/JSON data re-enter hunk refinement, so an out-of-find presence restatement or later duplicate JSON key skips a body whose mutant now survives",
|
|
190
|
+
"subject": "scripts/ci-qualify-decide.sh",
|
|
191
|
+
"find": ["\t\t\t\t\t*.toml) ;;"],
|
|
192
|
+
"replace": ["\t\t\t\t\t*.toml|*.json|*.md) ;;"],
|
|
193
|
+
"gate": ["bash", "run.sh", "check-release-gate-outcomes"],
|
|
194
|
+
"timeoutSeconds": 180,
|
|
195
|
+
"signature": "[QK:QUALIFY-FILTER-TOML-ONLY-REFINEMENT]",
|
|
196
|
+
"signatureSource": "scripts/check-release-gate-outcomes.ts"
|
|
197
|
+
},
|
|
172
198
|
{
|
|
173
199
|
"claim": "MUX-LIFECYCLE-IS-RELEASE-MUST",
|
|
174
200
|
"title": "the integrated mux lifecycle stays listed but bypasses run_live_step, so a missing prerequisite returns SKIP into a branch that never classifies it and the cut reads green",
|
|
@@ -91,6 +91,21 @@
|
|
|
91
91
|
"timeoutSeconds": 60,
|
|
92
92
|
"signature": "[QK:RESUME-ID-SESSION-ABSOLUTE]",
|
|
93
93
|
"signatureSource": "scripts/check-resume-launch-identity.ts"
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"claim": "RESUME-ID-ACP-EXACT-CURATION",
|
|
97
|
+
"title": "judging the RECORDED provider instead of the emitted one lets a bare Claude 5 id recorded under another provider reopen under entwurf on a Cortex row",
|
|
98
|
+
"subject": "pi-extensions/lib/resume-launch-identity.ts",
|
|
99
|
+
"find": [
|
|
100
|
+
"\tif (provider === PROVIDER_ID && !isCuratedAcpModelId(model)) throw new AcpModelNotCuratedError(model);"
|
|
101
|
+
],
|
|
102
|
+
"replace": [
|
|
103
|
+
"\tif (identity.provider === PROVIDER_ID && !isCuratedAcpModelId(model)) throw new AcpModelNotCuratedError(model);"
|
|
104
|
+
],
|
|
105
|
+
"gate": ["bash", "run.sh", "check-resume-launch-identity"],
|
|
106
|
+
"timeoutSeconds": 60,
|
|
107
|
+
"signature": "[QK:RESUME-ID-ACP-EXACT-CURATION]",
|
|
108
|
+
"signatureSource": "scripts/check-resume-launch-identity.ts"
|
|
94
109
|
}
|
|
95
110
|
]
|
|
96
111
|
}
|
|
@@ -210,6 +210,17 @@
|
|
|
210
210
|
"timeoutSeconds": 60,
|
|
211
211
|
"signature": "[QK:V2RESUME-SHARED-ID-GRAMMAR]",
|
|
212
212
|
"signatureSource": "pi-extensions/lib/entwurf-v2-visible-resume.test.ts"
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
"claim": "V2RESUME-ACP-MODEL-REFUSED",
|
|
216
|
+
"title": "not matching AcpModelNotCuratedError turns the named refusal into a raw error escaping the resume verb",
|
|
217
|
+
"subject": "pi-extensions/lib/entwurf-v2-visible-resume.ts",
|
|
218
|
+
"find": ["\t\t\tif (err instanceof AcpModelNotCuratedError) {"],
|
|
219
|
+
"replace": ["\t\t\tif (err instanceof AcpModelNotCuratedError && false) {"],
|
|
220
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
|
|
221
|
+
"timeoutSeconds": 60,
|
|
222
|
+
"signature": "[QK:V2RESUME-ACP-MODEL-REFUSED]",
|
|
223
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-visible-resume.test.ts"
|
|
213
224
|
}
|
|
214
225
|
]
|
|
215
226
|
}
|
|
@@ -16,7 +16,7 @@ import type { ResolvedTarget } from "../pi-extensions/lib/entwurf-core.ts";
|
|
|
16
16
|
import { getRegistryRouting } from "../pi-extensions/lib/entwurf-core.ts";
|
|
17
17
|
|
|
18
18
|
const isRemote = process.argv[2] === "remote";
|
|
19
|
-
const target: ResolvedTarget = { provider: "entwurf", model: "claude-sonnet-5", explicitOnly: false };
|
|
19
|
+
const target: ResolvedTarget = { provider: "entwurf", model: "claude-sonnet-5-5", explicitOnly: false };
|
|
20
20
|
|
|
21
21
|
// Throws EntwurfRoutingError (non-zero exit) when the bridge cannot be resolved —
|
|
22
22
|
// exactly the fail-fast the smoke wants to observe as a failure, not a pass.
|
|
@@ -56,7 +56,7 @@ import { skipLive } from "./lib/live-skip.ts";
|
|
|
56
56
|
import { PI_BOOT_TIMEOUT_MS, waitForPiRecord } from "./lib/pi-record-discovery.ts";
|
|
57
57
|
|
|
58
58
|
const ACP_PROVIDER = "entwurf";
|
|
59
|
-
const ACP_MODEL = process.env.ENTWURF_ACP_PROVIDER_MODEL?.trim() || "claude-sonnet-5";
|
|
59
|
+
const ACP_MODEL = process.env.ENTWURF_ACP_PROVIDER_MODEL?.trim() || "claude-sonnet-5-5";
|
|
60
60
|
|
|
61
61
|
const REAL_CONTROL_DIR = path.join(os.homedir(), ".pi", "entwurf-control");
|
|
62
62
|
const SOCKET_SUFFIX = ".sock";
|
|
@@ -48,7 +48,7 @@ import { fileURLToPath } from "node:url";
|
|
|
48
48
|
import { skipLive } from "./lib/live-skip.ts";
|
|
49
49
|
|
|
50
50
|
const REPO_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..");
|
|
51
|
-
const MODEL = process.env.ENTWURF_ACP_PROVIDER_MODEL?.trim() || "claude-sonnet-5";
|
|
51
|
+
const MODEL = process.env.ENTWURF_ACP_PROVIDER_MODEL?.trim() || "claude-sonnet-5-5";
|
|
52
52
|
const PROVIDER = "entwurf";
|
|
53
53
|
const TURN_TIMEOUT_MS = Number(process.env.ENTWURF_ACP_PROVIDER_TIMEOUT_MS) || 240_000;
|
|
54
54
|
|
|
@@ -44,7 +44,7 @@ import { fileURLToPath } from "node:url";
|
|
|
44
44
|
import { skipLive } from "./lib/live-skip.ts";
|
|
45
45
|
|
|
46
46
|
const REPO_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..");
|
|
47
|
-
const MODEL = process.env.ENTWURF_ACP_LONG_TURN_MODEL?.trim() || "claude-sonnet-5";
|
|
47
|
+
const MODEL = process.env.ENTWURF_ACP_LONG_TURN_MODEL?.trim() || "claude-sonnet-5-5";
|
|
48
48
|
const PROVIDER = "entwurf";
|
|
49
49
|
|
|
50
50
|
/** The cutoff this cut removed. The turn must outlive it. */
|
|
@@ -30,7 +30,7 @@ import { skipLive } from "./lib/live-skip.ts";
|
|
|
30
30
|
|
|
31
31
|
const REPO_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..");
|
|
32
32
|
const PROBE_SERVER = join(REPO_ROOT, "scripts", "fixtures", "probe-mcp-server.ts");
|
|
33
|
-
const MODEL = process.env.ENTWURF_ACP_PROVIDER_MODEL?.trim() || "claude-sonnet-5";
|
|
33
|
+
const MODEL = process.env.ENTWURF_ACP_PROVIDER_MODEL?.trim() || "claude-sonnet-5-5";
|
|
34
34
|
const PROVIDER = "entwurf";
|
|
35
35
|
const TURN_TIMEOUT_MS = Number(process.env.ENTWURF_ACP_PROVIDER_TIMEOUT_MS) || 240_000;
|
|
36
36
|
|
|
@@ -70,7 +70,7 @@ import {
|
|
|
70
70
|
import { terminateChild } from "./lib/acp-child-cleanup.ts";
|
|
71
71
|
import { skipLive } from "./lib/live-skip.ts";
|
|
72
72
|
|
|
73
|
-
const REQUESTED_MODEL_ID = process.env.ENTWURF_ACP_MEMORY_MODEL ?? "claude-sonnet-5";
|
|
73
|
+
const REQUESTED_MODEL_ID = process.env.ENTWURF_ACP_MEMORY_MODEL ?? "claude-sonnet-5-5";
|
|
74
74
|
const ALLOW_PATH_FALLBACK = process.env.ENTWURF_ACP_MEMORY_ALLOW_PATH_FALLBACK === "1";
|
|
75
75
|
const RAW_TAIL_CAP = 64 * 1024;
|
|
76
76
|
|
|
@@ -93,7 +93,7 @@ const SHIM_RUNTIME_FILES: readonly string[] = [
|
|
|
93
93
|
join(REPO_ROOT, "scripts", "lib", "probe-cli-target.ts"),
|
|
94
94
|
join(REPO_ROOT, "scripts", "lib", "probe-event-log.ts"),
|
|
95
95
|
];
|
|
96
|
-
const MODEL_ID = process.env.ENTWURF_ACP_PROBE_MODEL?.trim() || "claude-sonnet-5";
|
|
96
|
+
const MODEL_ID = process.env.ENTWURF_ACP_PROBE_MODEL?.trim() || "claude-sonnet-5-5";
|
|
97
97
|
const D1_MS = Number(process.env.PROBE_D1_MS ?? "2000") || 2000;
|
|
98
98
|
const D2_MS = Number(process.env.PROBE_D2_MS ?? "8000") || 8000;
|
|
99
99
|
const TEXT_TAIL_CAP = 400;
|
|
@@ -57,7 +57,7 @@ import {
|
|
|
57
57
|
import { terminateChild } from "./lib/acp-child-cleanup.ts";
|
|
58
58
|
import { skipLive } from "./lib/live-skip.ts";
|
|
59
59
|
|
|
60
|
-
const REQUESTED_MODEL_ID = process.env.ENTWURF_ACP_OVERLAY_MODEL ?? "claude-sonnet-5";
|
|
60
|
+
const REQUESTED_MODEL_ID = process.env.ENTWURF_ACP_OVERLAY_MODEL ?? "claude-sonnet-5-5";
|
|
61
61
|
const ALLOW_PATH_FALLBACK = process.env.ENTWURF_ACP_OVERLAY_ALLOW_PATH_FALLBACK === "1";
|
|
62
62
|
const RAW_TAIL_CAP = 64 * 1024;
|
|
63
63
|
|
|
@@ -29,7 +29,7 @@ import { fileURLToPath } from "node:url";
|
|
|
29
29
|
import { skipLive } from "./lib/live-skip.ts";
|
|
30
30
|
|
|
31
31
|
const REPO_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..");
|
|
32
|
-
const MODEL = process.env.ENTWURF_ACP_PROVIDER_MODEL?.trim() || "claude-sonnet-5";
|
|
32
|
+
const MODEL = process.env.ENTWURF_ACP_PROVIDER_MODEL?.trim() || "claude-sonnet-5-5";
|
|
33
33
|
const PROVIDER = "entwurf";
|
|
34
34
|
const TURN_TIMEOUT_MS = Number(process.env.ENTWURF_ACP_PROVIDER_TIMEOUT_MS) || 240_000;
|
|
35
35
|
|
|
@@ -36,7 +36,7 @@ import { connectAcpClient } from "../pi-extensions/lib/acp/acp-client.ts";
|
|
|
36
36
|
import { terminateChild } from "./lib/acp-child-cleanup.ts";
|
|
37
37
|
import { skipLive } from "./lib/live-skip.ts";
|
|
38
38
|
|
|
39
|
-
const REQUESTED_MODEL_ID = process.env.ENTWURF_ACP_RAW_TURN_MODEL ?? "claude-sonnet-5";
|
|
39
|
+
const REQUESTED_MODEL_ID = process.env.ENTWURF_ACP_RAW_TURN_MODEL ?? "claude-sonnet-5-5";
|
|
40
40
|
const ALLOW_PATH_FALLBACK = process.env.ENTWURF_ACP_RAW_TURN_ALLOW_PATH_FALLBACK === "1";
|
|
41
41
|
const RAW_TAIL_CAP = 64 * 1024; // cap captured raw NDJSON to 64KB tail on report.
|
|
42
42
|
|
|
@@ -36,7 +36,7 @@ import { normalizeContext } from "@earendil-works/pi-ai";
|
|
|
36
36
|
import { skipLive } from "./lib/live-skip.ts";
|
|
37
37
|
|
|
38
38
|
const REPO_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..");
|
|
39
|
-
const MODEL = process.env.ENTWURF_ACP_PROVIDER_MODEL?.trim() || "claude-sonnet-5";
|
|
39
|
+
const MODEL = process.env.ENTWURF_ACP_PROVIDER_MODEL?.trim() || "claude-sonnet-5-5";
|
|
40
40
|
// The pi built-ins the Claude child also exposes natively. pi declares its tool surface on
|
|
41
41
|
// every turn, and since 0.86 that declaration reaches a provider as the leading system
|
|
42
42
|
// message's `toolsAdded` (`normalizeContext`), which backend.ts replays for the exclude-tools
|
|
@@ -31,7 +31,7 @@ import { fileURLToPath } from "node:url";
|
|
|
31
31
|
import { skipLive } from "./lib/live-skip.ts";
|
|
32
32
|
|
|
33
33
|
const REPO_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..");
|
|
34
|
-
const MODEL = process.env.ENTWURF_ACP_PROVIDER_MODEL?.trim() || "claude-sonnet-5";
|
|
34
|
+
const MODEL = process.env.ENTWURF_ACP_PROVIDER_MODEL?.trim() || "claude-sonnet-5-5";
|
|
35
35
|
const PROVIDER = "entwurf";
|
|
36
36
|
const TURN_TIMEOUT_MS = Number(process.env.ENTWURF_ACP_PROVIDER_TIMEOUT_MS) || 240_000;
|
|
37
37
|
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
// LIVE-only (spawns a real pi + opens a real socket) — kept OUT of `pnpm check`;
|
|
21
21
|
// honest skip when LIVE!=1 (skip = CI safety, NOT an acceptance PASS).
|
|
22
22
|
// LIVE=1 ./run.sh smoke-acp-socket-citizen-live
|
|
23
|
-
// override model via ENTWURF_S1_MODEL (default claude-opus-5).
|
|
23
|
+
// override model via ENTWURF_S1_MODEL (default claude-opus-5-5).
|
|
24
24
|
|
|
25
25
|
import { type ChildProcess, spawn } from "node:child_process";
|
|
26
26
|
import { existsSync } from "node:fs";
|
|
@@ -35,7 +35,7 @@ import { skipLive } from "./lib/live-skip.ts";
|
|
|
35
35
|
import { PI_BOOT_TIMEOUT_MS, waitForPiRecord } from "./lib/pi-record-discovery.ts";
|
|
36
36
|
|
|
37
37
|
const ACP_PROVIDER = "entwurf";
|
|
38
|
-
const ACP_MODEL = process.env.ENTWURF_S1_MODEL?.trim() || "claude-opus-5";
|
|
38
|
+
const ACP_MODEL = process.env.ENTWURF_S1_MODEL?.trim() || "claude-opus-5-5";
|
|
39
39
|
|
|
40
40
|
const REAL_CONTROL_DIR = path.join(os.homedir(), ".pi", "entwurf-control");
|
|
41
41
|
const SOCKET_SUFFIX = ".sock";
|
|
@@ -89,7 +89,7 @@ import { skipLive } from "./lib/live-skip.ts";
|
|
|
89
89
|
import { PI_BOOT_TIMEOUT_MS, waitForPiRecord } from "./lib/pi-record-discovery.ts";
|
|
90
90
|
|
|
91
91
|
const ACP_PROVIDER = "entwurf";
|
|
92
|
-
const ACP_MODEL = process.env.ENTWURF_ACP_PROVIDER_MODEL?.trim() || "claude-sonnet-5";
|
|
92
|
+
const ACP_MODEL = process.env.ENTWURF_ACP_PROVIDER_MODEL?.trim() || "claude-sonnet-5-5";
|
|
93
93
|
|
|
94
94
|
const REAL_CONTROL_DIR = path.join(os.homedir(), ".pi", "entwurf-control");
|
|
95
95
|
const SOCKET_SUFFIX = ".sock";
|
|
@@ -74,7 +74,7 @@ const REAL_CONTROL_DIR = path.join(os.homedir(), ".pi", "entwurf-control");
|
|
|
74
74
|
const SOCKET_SUFFIX = ".sock";
|
|
75
75
|
|
|
76
76
|
const GPT_TARGET = process.env.ENTWURF_CHAIN_GPT_TARGET?.trim() || "openai-codex/gpt-5.6-luna";
|
|
77
|
-
const ACP_TARGET = process.env.ENTWURF_CHAIN_ACP_TARGET?.trim() || "entwurf/claude-sonnet-5";
|
|
77
|
+
const ACP_TARGET = process.env.ENTWURF_CHAIN_ACP_TARGET?.trim() || "entwurf/claude-sonnet-5-5";
|
|
78
78
|
const BOOT_TIMEOUT_MS = 45_000;
|
|
79
79
|
const CLAUDE_TURN_TIMEOUT_MS = Number(process.env.ENTWURF_CHAIN_CLAUDE_TIMEOUT_MS) || 240_000;
|
|
80
80
|
const CHAIN_TIMEOUT_MS = Number(process.env.ENTWURF_CHAIN_TIMEOUT_MS) || 420_000;
|
|
@@ -109,7 +109,7 @@ const BRIDGE_LAUNCHER = path.join(REPO, "mcp", "entwurf-bridge", "start.sh");
|
|
|
109
109
|
/** The two pi shapes. They differ in exactly one thing that matters here — whether the record
|
|
110
110
|
* carries `provider=entwurf`, which is what makes the resume argv re-inject the bridge (#29). */
|
|
111
111
|
const PI_NATIVE_MODEL = "openai-codex/gpt-6-luna";
|
|
112
|
-
const PI_ACP_MODEL = "entwurf/claude-sonnet-5";
|
|
112
|
+
const PI_ACP_MODEL = "entwurf/claude-sonnet-5-5";
|
|
113
113
|
const CLAUDE_MODEL = "claude-sonnet-5";
|
|
114
114
|
|
|
115
115
|
// Bounded waits — harness-side only. Each names what it is waiting FOR, so a red run says which
|
package/scripts/tsconfig.json
CHANGED
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
"include": [
|
|
28
28
|
"./**/*.ts",
|
|
29
29
|
"../test/**/*.ts",
|
|
30
|
+
"../demo/**/*.ts",
|
|
30
31
|
"../pi-extensions/lib/**/*.ts",
|
|
31
32
|
// The behavior-adjacent tests the root config just excluded (#119 V2). Listed at
|
|
32
33
|
// pi-extensions/** rather than pi-extensions/lib/** so a test beside an extension
|