@junghanacs/entwurf 0.41.2 → 0.50.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 +110 -1
- package/CHANGELOG.md +328 -0
- package/CONTRIBUTING.md +1 -1
- package/ENTWURF-CLI.json +1229 -0
- package/ENTWURF.json +284 -0
- package/FAQ.md +4 -4
- package/README.md +125 -184
- package/VERIFY.md +2 -2
- package/docs/external-mcp-host.md +3 -3
- package/docs/setup-clean-host.md +37 -12
- package/mcp/entwurf-bridge/dist/ENTWURF.json +284 -0
- package/mcp/entwurf-bridge/dist/mcp/entwurf-bridge/src/index.js +46 -196
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/agent-guidance.js +299 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-surface.js +21 -25
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-visible-resume.js +498 -29
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/fresh-call-dispatch.js +47 -10
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/herdr-fresh-call.js +613 -33
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/herdr-resume-call.js +497 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/meta-session.js +3 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-fresh-call.js +23 -20
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-resume-call.js +68 -21
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-fresh-preflight.js +7 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-location.js +347 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-owner-fence.js +1132 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-runtime.js +1 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/remote-pair-send.js +7 -4
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/resume-launch-identity.js +18 -11
- package/mcp/entwurf-bridge/dist/pi-extensions/meta-bridge-pi-durable.js +53 -60
- package/mcp/entwurf-bridge/dist/scripts/herdr-rails.mjs +40 -7
- package/mcp/entwurf-bridge/dist/scripts/meta-bridge-fresh-cut.js +1 -27
- package/mcp/entwurf-bridge/dist/scripts/meta-bridge-prune.js +1 -1
- package/mcp/entwurf-bridge/dist/scripts/meta-facts.js +1 -1
- package/mcp/entwurf-bridge/dist/scripts/peer-facts.js +1 -1
- package/mcp/entwurf-bridge/src/index.ts +149 -327
- package/mcp/entwurf-bridge/tsconfig.build.json +7 -1
- package/native/win32-x64/manifest.json +1 -1
- package/package.json +8 -4
- package/pi/pi-durable/bootstrap.mjs +179 -6
- package/pi/pi-durable/carrier/runtime.js +108 -9
- package/pi/pi-durable/carrier/session-name.js +11 -0
- package/pi/pi-durable/carrier/sessions.js +96 -20
- package/pi/pi-durable/overlay/upstream-pin.json +11 -5
- package/pi-extensions/lib/agent-guidance.ts +341 -0
- package/pi-extensions/lib/entwurf-v2-surface.ts +25 -31
- package/pi-extensions/lib/entwurf-v2-visible-resume.ts +725 -54
- package/pi-extensions/lib/fresh-call-dispatch.ts +64 -12
- package/pi-extensions/lib/herdr-fresh-call.ts +919 -40
- package/pi-extensions/lib/herdr-resume-call.ts +810 -0
- package/pi-extensions/lib/meta-session.ts +13 -8
- package/pi-extensions/lib/mux-fresh-call.ts +23 -26
- package/pi-extensions/lib/mux-resume-call.ts +95 -23
- package/pi-extensions/lib/pi-durable-fresh-preflight.ts +9 -2
- package/pi-extensions/lib/pi-durable-location.ts +446 -0
- package/pi-extensions/lib/pi-durable-owner-fence.ts +1461 -0
- package/pi-extensions/lib/pi-durable-runtime.ts +4 -0
- package/pi-extensions/lib/remote-pair-send.ts +7 -4
- package/pi-extensions/lib/resume-launch-identity.ts +31 -12
- package/pi-extensions/meta-bridge-pi-durable.ts +52 -79
- package/run.sh +417 -654
- package/scripts/build-bridge.sh +10 -0
- package/scripts/check-capability-bundle-reach.ts +86 -0
- package/scripts/check-claude-launch.ts +341 -0
- package/scripts/check-entwurf-self-address.ts +3 -3
- package/scripts/check-entwurf-v2-surface.ts +94 -98
- package/scripts/check-fresh-call-dispatch.ts +70 -9
- package/scripts/check-fresh-cut-gate.sh +23 -9
- package/scripts/check-gate-qualification.ts +24 -17
- package/scripts/check-herdr-activation.ts +301 -23
- package/scripts/check-herdr-fresh-call.ts +161 -25
- package/scripts/check-herdr-plugin-build.ts +173 -1
- package/scripts/check-herdr-plugin.ts +28 -2
- package/scripts/check-herdr-runtime-bootstrap.ts +136 -0
- package/scripts/check-install-surface.ts +1236 -6
- package/scripts/check-meta-doctor-oracle.sh +1 -1
- package/scripts/check-meta-facts.ts +20 -1
- package/scripts/check-mux-resume-call.ts +48 -3
- package/scripts/check-peer-facts.ts +39 -2
- package/scripts/cli-help.mjs +222 -0
- package/scripts/dev-bin.sh +39 -2
- package/scripts/herdr-activation.mjs +28 -6
- package/scripts/herdr-operator-link.mjs +389 -0
- package/scripts/herdr-plugin-activate.mjs +5 -0
- package/scripts/herdr-plugin-deactivate.mjs +18 -5
- package/scripts/herdr-rails.mjs +43 -7
- package/scripts/herdr-runtime.mjs +27 -0
- package/scripts/meta-bridge-fresh-cut.ts +1 -27
- package/scripts/meta-bridge-prune.ts +1 -1
- package/scripts/meta-facts.ts +1 -1
- package/scripts/mutants/agent-guidance.json +160 -0
- package/scripts/mutants/bridge-boot-resume.json +6 -8
- package/scripts/mutants/capability-bundle-reach.json +124 -0
- package/scripts/mutants/claude-launch.json +142 -0
- package/scripts/mutants/cli-help-source.json +420 -0
- package/scripts/mutants/control-send-receipt.json +21 -4
- package/scripts/mutants/dev-gate-dispatch.json +109 -0
- package/scripts/mutants/fresh-call-dispatch.json +38 -2
- package/scripts/mutants/fresh-cut.json +15 -0
- package/scripts/mutants/herdr-activation.json +128 -0
- package/scripts/mutants/herdr-fresh-call.json +278 -5
- package/scripts/mutants/herdr-operator-link.json +318 -0
- package/scripts/mutants/herdr-plugin-build.json +55 -0
- package/scripts/mutants/herdr-plugin.json +17 -0
- package/scripts/mutants/herdr-resume-call.json +288 -0
- package/scripts/mutants/herdr-runtime-bootstrap.json +48 -0
- package/scripts/mutants/meta-facts.json +15 -0
- package/scripts/mutants/mux-fresh-call.json +14 -3
- package/scripts/mutants/mux-resume-call.json +89 -3
- package/scripts/mutants/peer-facts.json +15 -0
- package/scripts/mutants/pi-durable.json +996 -6
- package/scripts/mutants/remote-pair-send.json +21 -2
- package/scripts/mutants/self-address.json +10 -10
- package/scripts/mutants/source-install.json +35 -0
- package/scripts/mutants/v2-surface.json +50 -64
- package/scripts/mutants/v2-visible-resume.json +266 -6
- package/scripts/peer-facts.ts +1 -1
- package/scripts/smoke-agy-install-state.sh +66 -0
- package/scripts/smoke-meta-prune.sh +23 -0
- package/scripts/smoke-omp-fresh-live.ts +12 -3
- package/scripts/smoke-omp-receive-live.ts +7 -1
- package/scripts/smoke-pi-durable-fresh-live.ts +12 -2
- package/team.json.example +39 -0
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"lane": "cli-help-source",
|
|
4
|
+
"mutants": [
|
|
5
|
+
{
|
|
6
|
+
"claim": "CLI-HELP-ALL-BYTES",
|
|
7
|
+
"title": "the renderer drops the blank line before Notes, so `entwurf help all` no longer prints the usage it replaced",
|
|
8
|
+
"subject": "scripts/cli-help.mjs",
|
|
9
|
+
"find": ["out.push(\"\", line(notes.title, \"usage.notes.title\"));"],
|
|
10
|
+
"replace": ["out.push(line(notes.title, \"usage.notes.title\"));"],
|
|
11
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
12
|
+
"timeoutSeconds": 120,
|
|
13
|
+
"signature": "[QK:CLI-HELP-ALL-BYTES]",
|
|
14
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"claim": "CLI-HELP-MODULE-RELATIVE",
|
|
18
|
+
"title": "the renderer reads the help source from the caller's cwd, so whatever ENTWURF-CLI.json sits where `entwurf` was run describes the CLI",
|
|
19
|
+
"subject": "scripts/cli-help.mjs",
|
|
20
|
+
"find": ["const SOURCE = new URL(\"../ENTWURF-CLI.json\", import.meta.url);"],
|
|
21
|
+
"replace": ["const SOURCE = `${process.cwd()}/ENTWURF-CLI.json`;"],
|
|
22
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
23
|
+
"timeoutSeconds": 120,
|
|
24
|
+
"signature": "[QK:CLI-HELP-MODULE-RELATIVE]",
|
|
25
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"claim": "CLI-HELP-ONLY-RENDERER",
|
|
29
|
+
"title": "usage() asks git for the checkout state before rendering, so reading the help starts a tool the description never needed",
|
|
30
|
+
"subject": "run.sh",
|
|
31
|
+
"find": [" node \"$REPO_DIR/scripts/cli-help.mjs\"\n}"],
|
|
32
|
+
"replace": [
|
|
33
|
+
" git -C \"$REPO_DIR\" rev-parse HEAD >/dev/null 2>&1 || true\n node \"$REPO_DIR/scripts/cli-help.mjs\"\n}"
|
|
34
|
+
],
|
|
35
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
36
|
+
"timeoutSeconds": 120,
|
|
37
|
+
"signature": "[QK:CLI-HELP-ONLY-RENDERER]",
|
|
38
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"claim": "CLI-HELP-FAIL-LOUD",
|
|
42
|
+
"title": "usage() swallows the renderer's failure, so a missing or broken help source answers `entwurf --help` with exit 0 and an empty page",
|
|
43
|
+
"subject": "run.sh",
|
|
44
|
+
"find": [" node \"$REPO_DIR/scripts/cli-help.mjs\"\n}"],
|
|
45
|
+
"replace": [" node \"$REPO_DIR/scripts/cli-help.mjs\" || true\n}"],
|
|
46
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
47
|
+
"timeoutSeconds": 120,
|
|
48
|
+
"signature": "[QK:CLI-HELP-FAIL-LOUD]",
|
|
49
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"claim": "CLI-HELP-STRICT-FIELDS",
|
|
53
|
+
"title": "the renderer stops checking key sets, so an entry can carry a field nobody reviewed — a handler, an argv, a command to run — and still render",
|
|
54
|
+
"subject": "scripts/cli-help.mjs",
|
|
55
|
+
"find": ["\tif (got.length !== want.length || got.some((k, i) => k !== want[i])) {"],
|
|
56
|
+
"replace": ["\tif (false) {"],
|
|
57
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
58
|
+
"timeoutSeconds": 120,
|
|
59
|
+
"signature": "[QK:CLI-HELP-STRICT-FIELDS]",
|
|
60
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"claim": "CLI-HELP-UNIQUE",
|
|
64
|
+
"title": "the renderer stops refusing a command described twice, so two descriptions of one command both print and neither owns it",
|
|
65
|
+
"subject": "scripts/cli-help.mjs",
|
|
66
|
+
"find": ["\t\tif (entries.has(name)) fail("],
|
|
67
|
+
"replace": ["\t\tif (false) fail("],
|
|
68
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
69
|
+
"timeoutSeconds": 120,
|
|
70
|
+
"signature": "[QK:CLI-HELP-UNIQUE]",
|
|
71
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"claim": "CLI-HELP-CANONICAL",
|
|
75
|
+
"title": "a duplicated JSON property rides into the committed help source; JSON.parse keeps the later value and every runtime check stays green",
|
|
76
|
+
"subject": "ENTWURF-CLI.json",
|
|
77
|
+
"find": ["\t\"schemaVersion\": 4,"],
|
|
78
|
+
"replace": ["\t\"schemaVersion\": 4,\n\t\"schemaVersion\": 4,"],
|
|
79
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
80
|
+
"timeoutSeconds": 120,
|
|
81
|
+
"signature": "[QK:CLI-HELP-CANONICAL]",
|
|
82
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"claim": "CLI-HELP-NO-ORPHAN",
|
|
86
|
+
"title": "the help describes a command that no dispatch arm or gate function provides — `entwurf --help` advertises something that does not exist",
|
|
87
|
+
"subject": "ENTWURF-CLI.json",
|
|
88
|
+
"find": ["\t\t\t\t\t\"synopsis\": \"menu\","],
|
|
89
|
+
"replace": ["\t\t\t\t\t\"synopsis\": \"menu-retired\","],
|
|
90
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
91
|
+
"timeoutSeconds": 120,
|
|
92
|
+
"signature": "[QK:CLI-HELP-NO-ORPHAN]",
|
|
93
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"claim": "CLI-HELP-DEBT-EXACT",
|
|
97
|
+
"title": "a new dispatch arm lands with no description, and the help silently stops covering a command run.sh answers",
|
|
98
|
+
"subject": "run.sh",
|
|
99
|
+
"find": [" -h|--help|help|\"\")"],
|
|
100
|
+
"replace": [" zz-undescribed)\n :\n ;;\n -h|--help|help|\"\")"],
|
|
101
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
102
|
+
"timeoutSeconds": 120,
|
|
103
|
+
"signature": "[QK:CLI-HELP-DEBT-EXACT]",
|
|
104
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"claim": "CLI-HELP-DISPATCH-REVIEWED",
|
|
108
|
+
"title": "the dispatch changes after its labels were reviewed, and the help coverage keeps trusting labels nobody re-read",
|
|
109
|
+
"subject": "run.sh",
|
|
110
|
+
"find": [" -h|--help|help|\"\")"],
|
|
111
|
+
"replace": [" # an unreviewed edit inside the dispatch\n -h|--help|help|\"\")"],
|
|
112
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
113
|
+
"timeoutSeconds": 120,
|
|
114
|
+
"signature": "[QK:CLI-HELP-DISPATCH-REVIEWED]",
|
|
115
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
"claim": "CLI-HELP-REAL-OWNER",
|
|
119
|
+
"title": "the gate inventory goes back to reading definition-shaped text, so a gate deleted from run.sh but left in a heredoc still counts as a command and keeps its description",
|
|
120
|
+
"subject": "scripts/check-install-surface.ts",
|
|
121
|
+
"find": ["\t\t\tconst names = new Set<string>();"],
|
|
122
|
+
"replace": [
|
|
123
|
+
"\t\t\tconst names = new Set<string>(\n\t\t\t\t[...text.matchAll(/^((?:check|smoke)_[a-z0-9_]+)\\(\\)\\s*\\{/gm)].map((m) => (m[1] as string).replace(/_/g, \"-\")),\n\t\t\t);"
|
|
124
|
+
],
|
|
125
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
126
|
+
"timeoutSeconds": 120,
|
|
127
|
+
"signature": "[QK:CLI-HELP-REAL-OWNER]",
|
|
128
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"claim": "CLI-HELP-AMENDMENTS",
|
|
132
|
+
"title": "the tool count goes back to eight, a number the bridge has not shipped since entwurf_callback joined",
|
|
133
|
+
"subject": "ENTWURF-CLI.json",
|
|
134
|
+
"find": ["EXACTLY the nine shipped garden verbs"],
|
|
135
|
+
"replace": ["EXACTLY the eight shipped garden verbs"],
|
|
136
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
137
|
+
"timeoutSeconds": 120,
|
|
138
|
+
"signature": "[QK:CLI-HELP-AMENDMENTS]",
|
|
139
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
"claim": "CLI-HELP-PREFLIGHT-PLACEMENT",
|
|
143
|
+
"title": "a heredoc lands between the help preflight and the dispatch case, where the text pin no longer watches",
|
|
144
|
+
"subject": "run.sh",
|
|
145
|
+
"find": [" exec node \"$REPO_DIR/scripts/cli-help.mjs\" --command \"$cmd\"\nfi\n"],
|
|
146
|
+
"replace": [" exec node \"$REPO_DIR/scripts/cli-help.mjs\" --command \"$cmd\"\nfi\n: <<'NOTE'\nNOTE\n"],
|
|
147
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
148
|
+
"timeoutSeconds": 120,
|
|
149
|
+
"signature": "[QK:CLI-HELP-PREFLIGHT-PLACEMENT]",
|
|
150
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
"claim": "CLI-HELP-COMMAND",
|
|
154
|
+
"title": "`<command> --help` prints the whole root page instead of that command's own help",
|
|
155
|
+
"subject": "run.sh",
|
|
156
|
+
"find": [" exec node \"$REPO_DIR/scripts/cli-help.mjs\" --command \"$cmd\""],
|
|
157
|
+
"replace": [" exec node \"$REPO_DIR/scripts/cli-help.mjs\""],
|
|
158
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
159
|
+
"timeoutSeconds": 120,
|
|
160
|
+
"signature": "[QK:CLI-HELP-COMMAND]",
|
|
161
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
"claim": "CLI-HELP-NO-DISPATCH",
|
|
165
|
+
"title": "the preflight stops catching `<command> --help`, so asking an argv-ignoring command for help runs it",
|
|
166
|
+
"subject": "run.sh",
|
|
167
|
+
"find": ["elif [ \"$#\" -ge 2 ] && { [ \"$2\" = -h ] || [ \"$2\" = --help ]; } \\"],
|
|
168
|
+
"replace": ["elif false \\"],
|
|
169
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
170
|
+
"timeoutSeconds": 120,
|
|
171
|
+
"signature": "[QK:CLI-HELP-NO-DISPATCH]",
|
|
172
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
"claim": "CLI-HELP-FORMS",
|
|
176
|
+
"title": "`entwurf help <command>` looks up the word help instead of the command it names",
|
|
177
|
+
"subject": "run.sh",
|
|
178
|
+
"find": ["--name \"$2\""],
|
|
179
|
+
"replace": ["--name \"$cmd\""],
|
|
180
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
181
|
+
"timeoutSeconds": 120,
|
|
182
|
+
"signature": "[QK:CLI-HELP-FORMS]",
|
|
183
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
"claim": "CLI-HELP-EXTRA-REFUSED",
|
|
187
|
+
"title": "a help flag followed by more argv is answered as help, guessing past what was typed",
|
|
188
|
+
"subject": "run.sh",
|
|
189
|
+
"find": [
|
|
190
|
+
" if [ \"$#\" -gt 2 ]; then\n echo 'entwurf: a help request takes nothing after -h/--help; nothing was run' >&2"
|
|
191
|
+
],
|
|
192
|
+
"replace": [
|
|
193
|
+
" if false; then\n echo 'entwurf: a help request takes nothing after -h/--help; nothing was run' >&2"
|
|
194
|
+
],
|
|
195
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
196
|
+
"timeoutSeconds": 120,
|
|
197
|
+
"signature": "[QK:CLI-HELP-EXTRA-REFUSED]",
|
|
198
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
"claim": "CLI-HELP-ALIAS-REFUSED",
|
|
202
|
+
"title": "`--help <command>` stops being refused and falls through to the dispatch",
|
|
203
|
+
"subject": "run.sh",
|
|
204
|
+
"find": ["elif { [ \"$cmd\" = -h ] || [ \"$cmd\" = --help ]; } && [ \"$#\" -ge 2 ]; then"],
|
|
205
|
+
"replace": ["elif false; then"],
|
|
206
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
207
|
+
"timeoutSeconds": 120,
|
|
208
|
+
"signature": "[QK:CLI-HELP-ALIAS-REFUSED]",
|
|
209
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
"claim": "CLI-HELP-VENDOR-PASSTHROUGH",
|
|
213
|
+
"title": "the preflight intercepts `entwurf pi --help`, so pi's own help is replaced by a refusal",
|
|
214
|
+
"subject": "run.sh",
|
|
215
|
+
"find": ["[ \"$cmd\" != pi ] && "],
|
|
216
|
+
"replace": [""],
|
|
217
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
218
|
+
"timeoutSeconds": 120,
|
|
219
|
+
"signature": "[QK:CLI-HELP-VENDOR-PASSTHROUGH]",
|
|
220
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
"claim": "CLI-HELP-NOT-HELP-POSITION",
|
|
224
|
+
"title": "the preflight treats --help anywhere in argv as a help request, rewriting commands whose own argv carries it",
|
|
225
|
+
"subject": "run.sh",
|
|
226
|
+
"find": ["{ [ \"$2\" = -h ] || [ \"$2\" = --help ]; }"],
|
|
227
|
+
"replace": ["[[ \" ${*:2} \" == *\" --help \"* ]]"],
|
|
228
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
229
|
+
"timeoutSeconds": 120,
|
|
230
|
+
"signature": "[QK:CLI-HELP-NOT-HELP-POSITION]",
|
|
231
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
"claim": "CLI-HELP-ONE-LINE",
|
|
235
|
+
"title": "an unknown name is printed raw, so a newline in it splits the one-line refusal",
|
|
236
|
+
"subject": "scripts/cli-help.mjs",
|
|
237
|
+
"find": ["no help for ${JSON.stringify(wanted)}"],
|
|
238
|
+
"replace": ["no help for ${wanted}"],
|
|
239
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
240
|
+
"timeoutSeconds": 120,
|
|
241
|
+
"signature": "[QK:CLI-HELP-ONE-LINE]",
|
|
242
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
"claim": "CLI-HELP-COMMAND-TRACE",
|
|
246
|
+
"title": "a command help asks git for checkout state before answering, starting a tool the description never needed",
|
|
247
|
+
"subject": "run.sh",
|
|
248
|
+
"find": [" exec node \"$REPO_DIR/scripts/cli-help.mjs\" --command \"$cmd\""],
|
|
249
|
+
"replace": [
|
|
250
|
+
" git -C \"$REPO_DIR\" rev-parse HEAD >/dev/null 2>&1 || true\n exec node \"$REPO_DIR/scripts/cli-help.mjs\" --command \"$cmd\""
|
|
251
|
+
],
|
|
252
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
253
|
+
"timeoutSeconds": 120,
|
|
254
|
+
"signature": "[QK:CLI-HELP-COMMAND-TRACE]",
|
|
255
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
"claim": "CLI-HELP-DETAILS-ORACLE",
|
|
259
|
+
"title": "fresh-cut's longer help is reworded in the data and silently drifts from the text the verb shipped",
|
|
260
|
+
"subject": "ENTWURF-CLI.json",
|
|
261
|
+
"find": [" live dirs. No migration, no restore: the archive is forensic bytes only."],
|
|
262
|
+
"replace": [" live dirs. No migration, no restore: the archive is forensic only."],
|
|
263
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
264
|
+
"timeoutSeconds": 120,
|
|
265
|
+
"signature": "[QK:CLI-HELP-DETAILS-ORACLE]",
|
|
266
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
"claim": "CLI-HELP-EPIPE-QUIET",
|
|
270
|
+
"title": "a reader that stops early (`entwurf --help | head`) gets a node EPIPE stack trace on stderr",
|
|
271
|
+
"subject": "scripts/cli-help.mjs",
|
|
272
|
+
"find": ["\tif (err.code === \"EPIPE\") process.exit(0);"],
|
|
273
|
+
"replace": ["\tif (false) process.exit(0);"],
|
|
274
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
275
|
+
"timeoutSeconds": 120,
|
|
276
|
+
"signature": "[QK:CLI-HELP-EPIPE-QUIET]",
|
|
277
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
"claim": "CLI-HELP-METADATA-EXIT",
|
|
281
|
+
"title": "a broken help source exits 2, the same status as a refused help request, so a caller can no longer tell a damaged install from a typo",
|
|
282
|
+
"subject": "scripts/cli-help.mjs",
|
|
283
|
+
"find": ["\tprocess.exit(1);"],
|
|
284
|
+
"replace": ["\tprocess.exit(2);"],
|
|
285
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
286
|
+
"timeoutSeconds": 120,
|
|
287
|
+
"signature": "[QK:CLI-HELP-METADATA-EXIT]",
|
|
288
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
"claim": "CLI-HELP-EPIPE-EXIT",
|
|
292
|
+
"title": "the early-closed pipe is reported as a failure exit, so `set -o pipefail; entwurf --help | head` fails a script that only wanted the first lines",
|
|
293
|
+
"subject": "scripts/cli-help.mjs",
|
|
294
|
+
"find": ["\tif (err.code === \"EPIPE\") process.exit(0);"],
|
|
295
|
+
"replace": ["\tif (err.code === \"EPIPE\") process.exit(1);"],
|
|
296
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
297
|
+
"timeoutSeconds": 120,
|
|
298
|
+
"signature": "[QK:CLI-HELP-EPIPE-EXIT]",
|
|
299
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
"claim": "PRUNE-HELP-POINTER",
|
|
303
|
+
"title": "the prune leaf's --help and unknown-flag refusal point at another command's description, so an operator who followed them reads help for the wrong verb (#153)",
|
|
304
|
+
"subject": "scripts/meta-bridge-prune.ts",
|
|
305
|
+
"find": [
|
|
306
|
+
"\t\t\"meta-bridge-prune: see `entwurf help meta-bridge-prune` (from that checkout's root: `./run.sh help meta-bridge-prune`)\","
|
|
307
|
+
],
|
|
308
|
+
"replace": [
|
|
309
|
+
"\t\t\"meta-bridge-prune: see `entwurf help meta-bridge-fresh-cut` (from that checkout's root: `./run.sh help meta-bridge-fresh-cut`)\","
|
|
310
|
+
],
|
|
311
|
+
"gate": ["bash", "run.sh", "smoke-meta-prune"],
|
|
312
|
+
"timeoutSeconds": 120,
|
|
313
|
+
"signature": "[QK:PRUNE-HELP-POINTER]",
|
|
314
|
+
"signatureSource": "scripts/smoke-meta-prune.sh"
|
|
315
|
+
},
|
|
316
|
+
{
|
|
317
|
+
"claim": "CLI-HELP-PI-DESCRIBED",
|
|
318
|
+
"title": "pi's description drops the flag the launch adds, so `entwurf help pi` no longer says what the arm execs",
|
|
319
|
+
"subject": "ENTWURF-CLI.json",
|
|
320
|
+
"find": [
|
|
321
|
+
"\t\t\t\t\t\"summary\": \"#118: the MANAGED pi launch. exec()s the pi that `type -P` finds on PATH (a file, never a shell function or alias) in THIS terminal, with --entwurf-control added ahead of your argv, which passes through untouched. Refuses by name when ENTWURF_PI_LAUNCH_ACTIVE is non-empty (it exports that to the pi it starts), when no pi is on PATH (it launches the pi coding agent, it does not install one), or when that path is not an executable regular file\""
|
|
322
|
+
],
|
|
323
|
+
"replace": [
|
|
324
|
+
"\t\t\t\t\t\"summary\": \"#118: the MANAGED pi launch. exec()s the pi that `type -P` finds on PATH (a file, never a shell function or alias) in THIS terminal, with your argv, which passes through untouched. Refuses by name when ENTWURF_PI_LAUNCH_ACTIVE is non-empty (it exports that to the pi it starts), when no pi is on PATH (it launches the pi coding agent, it does not install one), or when that path is not an executable regular file\""
|
|
325
|
+
],
|
|
326
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
327
|
+
"timeoutSeconds": 120,
|
|
328
|
+
"signature": "[QK:CLI-HELP-PI-DESCRIBED]",
|
|
329
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
330
|
+
},
|
|
331
|
+
{
|
|
332
|
+
"claim": "CLI-HELP-ROOT-COMPACT",
|
|
333
|
+
"title": "the root page prints the whole catalog again, so a bare `entwurf` buries the few commands an operator needs under every gate",
|
|
334
|
+
"subject": "scripts/cli-help.mjs",
|
|
335
|
+
"find": ["\tprocess.stdout.write(`${(all ? out : compact).join(\"\\n\")}\\n`);"],
|
|
336
|
+
"replace": ["\tprocess.stdout.write(`${out.join(\"\\n\")}\\n`);"],
|
|
337
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
338
|
+
"timeoutSeconds": 120,
|
|
339
|
+
"signature": "[QK:CLI-HELP-ROOT-COMPACT]",
|
|
340
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
341
|
+
},
|
|
342
|
+
{
|
|
343
|
+
"claim": "CLI-HELP-ALL-ROUTE",
|
|
344
|
+
"title": "`entwurf help all` no longer reaches the catalog: it is read as help for a command named `all` and refused, so the full list has no door",
|
|
345
|
+
"subject": "run.sh",
|
|
346
|
+
"find": ["if [ \"$cmd\" = help ] && [ \"$#\" -eq 2 ] && [ \"$2\" = all ]; then"],
|
|
347
|
+
"replace": ["if false; then"],
|
|
348
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
349
|
+
"timeoutSeconds": 120,
|
|
350
|
+
"signature": "[QK:CLI-HELP-ALL-ROUTE]",
|
|
351
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
352
|
+
},
|
|
353
|
+
{
|
|
354
|
+
"claim": "CLI-HELP-ROOT-NAMES-REAL",
|
|
355
|
+
"title": "the renderer stops checking that an example names a described command, so the root page advertises a command that does not exist",
|
|
356
|
+
"subject": "scripts/cli-help.mjs",
|
|
357
|
+
"find": ["\tif (!helpItself && !entries.has(named))"],
|
|
358
|
+
"replace": ["\tif (false)"],
|
|
359
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
360
|
+
"timeoutSeconds": 120,
|
|
361
|
+
"signature": "[QK:CLI-HELP-ROOT-NAMES-REAL]",
|
|
362
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
363
|
+
},
|
|
364
|
+
{
|
|
365
|
+
"claim": "CLI-HELP-TOPIC-BYTES",
|
|
366
|
+
"title": "a guide topic loses the blank line under its title, so `entwurf help team` no longer prints the reviewed page",
|
|
367
|
+
"subject": "scripts/cli-help.mjs",
|
|
368
|
+
"find": ["\t\tprocess.stdout.write(`${[topic.title, \"\", ...topic.lines].join(\"\\n\")}\\n`);"],
|
|
369
|
+
"replace": ["\t\tprocess.stdout.write(`${[topic.title, ...topic.lines].join(\"\\n\")}\\n`);"],
|
|
370
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
371
|
+
"timeoutSeconds": 120,
|
|
372
|
+
"signature": "[QK:CLI-HELP-TOPIC-BYTES]",
|
|
373
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
374
|
+
},
|
|
375
|
+
{
|
|
376
|
+
"claim": "CLI-HELP-TOPIC-ROUTE",
|
|
377
|
+
"title": "`entwurf help <name>` asks the renderer in the commands-only mode, so the guides have no door and `help team` is refused",
|
|
378
|
+
"subject": "run.sh",
|
|
379
|
+
"find": ["--name \"$2\""],
|
|
380
|
+
"replace": ["--command \"$2\""],
|
|
381
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
382
|
+
"timeoutSeconds": 120,
|
|
383
|
+
"signature": "[QK:CLI-HELP-TOPIC-ROUTE]",
|
|
384
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
385
|
+
},
|
|
386
|
+
{
|
|
387
|
+
"claim": "CLI-HELP-TOPIC-NOT-COMMAND",
|
|
388
|
+
"title": "a guide topic answers `<topic> --help` as if it were a command, so asking about running `team` prints a page instead of the refusal",
|
|
389
|
+
"subject": "scripts/cli-help.mjs",
|
|
390
|
+
"find": ["const topicsToo = argv[0] === \"--name\";"],
|
|
391
|
+
"replace": ["const topicsToo = true;"],
|
|
392
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
393
|
+
"timeoutSeconds": 120,
|
|
394
|
+
"signature": "[QK:CLI-HELP-TOPIC-NOT-COMMAND]",
|
|
395
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
396
|
+
},
|
|
397
|
+
{
|
|
398
|
+
"claim": "CLI-HELP-TOPIC-DISJOINT",
|
|
399
|
+
"title": "the renderer stops checking topic names, so a guide can take a command's name, `all` or another guide's and one word answers with two pages",
|
|
400
|
+
"subject": "scripts/cli-help.mjs",
|
|
401
|
+
"find": ["\tif (name === \"all\" || entries.has(name) || topics.has(name))"],
|
|
402
|
+
"replace": ["\tif (false)"],
|
|
403
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
404
|
+
"timeoutSeconds": 120,
|
|
405
|
+
"signature": "[QK:CLI-HELP-TOPIC-DISJOINT]",
|
|
406
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
407
|
+
},
|
|
408
|
+
{
|
|
409
|
+
"claim": "CLI-HELP-TOPIC-SHIPPED",
|
|
410
|
+
"title": "team.json.example leaves the package files, so `entwurf help team` sends an installed reader to a file the install does not have",
|
|
411
|
+
"subject": "package.json",
|
|
412
|
+
"find": ["\t\t\"ENTWURF-CLI.json\",", "\t\t\"team.json.example\","],
|
|
413
|
+
"replace": ["\t\t\"ENTWURF-CLI.json\","],
|
|
414
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
415
|
+
"timeoutSeconds": 120,
|
|
416
|
+
"signature": "[QK:CLI-HELP-TOPIC-SHIPPED]",
|
|
417
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
418
|
+
}
|
|
419
|
+
]
|
|
420
|
+
}
|
|
@@ -153,7 +153,7 @@
|
|
|
153
153
|
"title": "the dirty-lock line goes back to `DELIVERED (<route>)` for all three shapes that reach it — a refusal that delivered nothing, a message lying in a volatile queue, and a durable mailbox file all read as one word, at the exact moment an operator is deciding BY HAND whether anything still needs sending",
|
|
154
154
|
"subject": "pi-extensions/lib/entwurf-v2-surface.ts",
|
|
155
155
|
"find": [
|
|
156
|
-
"\t\t\t\t\t\t? `rejected${result.finalizedRejectReason ? ` (${result.finalizedRejectReason})` : \"\"} —
|
|
156
|
+
"\t\t\t\t\t\t? `rejected${result.finalizedRejectReason ? ` (${result.finalizedRejectReason})` : \"\"} — ${ENTWURF_DELIVERY_RESULT_CLAUSES[\"finalized-rejected\"]}`"
|
|
157
157
|
],
|
|
158
158
|
"replace": ["\t\t\t\t\t\t? `DELIVERED (${result.finalizedOutcome})`"],
|
|
159
159
|
"gate": ["bash", "run.sh", "check-entwurf-v2-surface"],
|
|
@@ -161,6 +161,19 @@
|
|
|
161
161
|
"signature": "[QK:SEND-DIRTY-LOCK-NAMES-ACCEPTANCE]",
|
|
162
162
|
"signatureSource": "scripts/check-entwurf-v2-surface.ts"
|
|
163
163
|
},
|
|
164
|
+
{
|
|
165
|
+
"claim": "V2SURF-DELIVERY-RESULT-CLAUSES-FROM-ROOT",
|
|
166
|
+
"title": "the dirty-lock receipt reads a hand-kept copy of its clause, one byte off the Root text, instead of the Root lookup: DIRTY and do NOT retry still read on every shape, so only the whole-line comparison against Root can see the drift",
|
|
167
|
+
"subject": "pi-extensions/lib/entwurf-v2-surface.ts",
|
|
168
|
+
"find": ["\t\t\t\t\t\t`${ENTWURF_DELIVERY_RESULT_CLAUSES[\"dirty-lock\"]}\\n error: ${result.error}`,"],
|
|
169
|
+
"replace": [
|
|
170
|
+
"\t\t\t\t\t\t`the lock is DIRTY (release failed) — do NOT retry automatically. Inspect the reported acceptance and have the operator resolve the lock before deciding whether to resend.\\n error: ${result.error}`,"
|
|
171
|
+
],
|
|
172
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-surface"],
|
|
173
|
+
"timeoutSeconds": 300,
|
|
174
|
+
"signature": "[QK:V2SURF-DELIVERY-RESULT-CLAUSES-FROM-ROOT]",
|
|
175
|
+
"signatureSource": "scripts/check-entwurf-v2-surface.ts"
|
|
176
|
+
},
|
|
164
177
|
{
|
|
165
178
|
"claim": "VITEST-TEST-DIR-ON-THE-FLOOR",
|
|
166
179
|
"title": "the pi queue oracle's public coordinate is dropped from `check:vitest`, so the file that proves every claim the receipt makes about a receiver's queues is green only when somebody runs `pnpm test` by hand — the discovery door deliberately does not select `test/**`, so nothing else would notice",
|
|
@@ -225,9 +238,13 @@
|
|
|
225
238
|
{
|
|
226
239
|
"claim": "SEND-OUTCOME-LIST-NAMES-EVERY-RAIL",
|
|
227
240
|
"title": "the caller-facing outcome list drops the native-push rail, so a caller reading the one blurb it reads before dispatching is told the control rail's vocabulary covers a rail that answers with a direct injection instead",
|
|
228
|
-
"subject": "
|
|
229
|
-
"find": [
|
|
230
|
-
|
|
241
|
+
"subject": "ENTWURF.json",
|
|
242
|
+
"find": [
|
|
243
|
+
"native-push INJECTION, a rejection, or lock-dirty. This receipt is not the colleague's reply or evidence of reading. EXISTING targets only; discover with "
|
|
244
|
+
],
|
|
245
|
+
"replace": [
|
|
246
|
+
"a rejection, or lock-dirty. This receipt is not the colleague's reply or evidence of reading. EXISTING targets only; discover with "
|
|
247
|
+
],
|
|
231
248
|
"gate": ["bash", "run.sh", "check-entwurf-v2-surface"],
|
|
232
249
|
"timeoutSeconds": 300,
|
|
233
250
|
"signature": "[QK:SEND-OUTCOME-LIST-NAMES-EVERY-RAIL]",
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"lane": "dev-gate-dispatch",
|
|
4
|
+
"mutants": [
|
|
5
|
+
{
|
|
6
|
+
"claim": "BY-NAME-GATE-PREFIX",
|
|
7
|
+
"title": "the default arm drops its gate-prefix guard, so every function run.sh defines answers as a command by name — `entwurf usage` runs usage at rc 0, and the install writers are one spelling away",
|
|
8
|
+
"subject": "run.sh",
|
|
9
|
+
"find": [" if [[ $cmd =~ ^(check|smoke)-[a-z0-9-]+$ ]] \\"],
|
|
10
|
+
"replace": [" if true \\"],
|
|
11
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
12
|
+
"timeoutSeconds": 120,
|
|
13
|
+
"signature": "[QK:BY-NAME-GATE-PREFIX]",
|
|
14
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"claim": "BY-NAME-GATE-DEFINED",
|
|
18
|
+
"title": "the default arm stops asking whether the gate function exists, so a misspelled gate dies as a bash command-not-found (rc 127) instead of the Unknown command it always was",
|
|
19
|
+
"subject": "run.sh",
|
|
20
|
+
"find": [
|
|
21
|
+
" && gate_decl=$(shopt -s extdebug; declare -F \"$gate_fn\") \\\n && [[ ${gate_decl#\"$gate_fn \"} =~ ^[1-9][0-9]*\\ (.*)$ ]] \\\n && [ \"${BASH_REMATCH[1]}\" = \"${BASH_SOURCE[0]}\" ]; then"
|
|
22
|
+
],
|
|
23
|
+
"replace": [" ; then"],
|
|
24
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
25
|
+
"timeoutSeconds": 120,
|
|
26
|
+
"signature": "[QK:BY-NAME-GATE-DEFINED]",
|
|
27
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"claim": "BY-NAME-GATE-DEFINED-HERE",
|
|
31
|
+
"title": "the default arm admits any function bash can see, so an exported BASH_FUNC_check_* in the caller's environment becomes an entwurf command that run.sh never defined",
|
|
32
|
+
"subject": "run.sh",
|
|
33
|
+
"find": [
|
|
34
|
+
" && [[ ${gate_decl#\"$gate_fn \"} =~ ^[1-9][0-9]*\\ (.*)$ ]] \\\n && [ \"${BASH_REMATCH[1]}\" = \"${BASH_SOURCE[0]}\" ]; then"
|
|
35
|
+
],
|
|
36
|
+
"replace": [" ; then"],
|
|
37
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
38
|
+
"timeoutSeconds": 120,
|
|
39
|
+
"signature": "[QK:BY-NAME-GATE-DEFINED-HERE]",
|
|
40
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"claim": "BY-NAME-GATE-RUNS",
|
|
44
|
+
"title": "the admitted gate is never called: every by-name gate reports success with no output, and the whole dev floor goes green without running",
|
|
45
|
+
"subject": "run.sh",
|
|
46
|
+
"find": [" \"$gate_fn\""],
|
|
47
|
+
"replace": [" :"],
|
|
48
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
49
|
+
"timeoutSeconds": 120,
|
|
50
|
+
"signature": "[QK:BY-NAME-GATE-RUNS]",
|
|
51
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"claim": "BY-NAME-GATE-NO-ARGV",
|
|
55
|
+
"title": "the by-name gate is handed run.sh's whole argv, its own name included, where the explicit arm it replaced called it with none",
|
|
56
|
+
"subject": "run.sh",
|
|
57
|
+
"find": [" \"$gate_fn\""],
|
|
58
|
+
"replace": [" \"$gate_fn\" \"$@\""],
|
|
59
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
60
|
+
"timeoutSeconds": 120,
|
|
61
|
+
"signature": "[QK:BY-NAME-GATE-NO-ARGV]",
|
|
62
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"claim": "BY-NAME-GATE-STOPS",
|
|
66
|
+
"title": "the gate is called under `|| exit $?`, which reads like status propagation but switches errexit off inside it: a gate runs on past its first failure and returns the status of whatever ran last",
|
|
67
|
+
"subject": "run.sh",
|
|
68
|
+
"find": [" \"$gate_fn\""],
|
|
69
|
+
"replace": [" \"$gate_fn\" || exit $?"],
|
|
70
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
71
|
+
"timeoutSeconds": 120,
|
|
72
|
+
"signature": "[QK:BY-NAME-GATE-STOPS]",
|
|
73
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"claim": "DEV-GATE-BY-NAME-NOT-EMITTED",
|
|
77
|
+
"title": "a gate reached only by name is added to the bridge build include, and a case-label reader no longer sees it: the tarball ships a dev gate leaf while S4 stays green",
|
|
78
|
+
"subject": "mcp/entwurf-bridge/tsconfig.build.json",
|
|
79
|
+
"find": ["\t\t\"../../scripts/peer-facts.ts\","],
|
|
80
|
+
"replace": ["\t\t\"../../scripts/peer-facts.ts\",\n\t\t\"../../scripts/check-peer-facts.ts\","],
|
|
81
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
82
|
+
"timeoutSeconds": 120,
|
|
83
|
+
"signature": "[QK:DEV-GATE-BY-NAME-NOT-EMITTED]",
|
|
84
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"claim": "DEV-GATE-BY-NAME-READ",
|
|
88
|
+
"title": "the by-name reader narrows to check_ functions, so every smoke gate leaves S4's view and the bloat check passes on the rows it still sees",
|
|
89
|
+
"subject": "scripts/check-install-surface.ts",
|
|
90
|
+
"find": ["\tif (/^(?:check|smoke)_[a-z0-9_]+$/.test(fn) && !targets.has(cmd)) byNameGates.set(cmd, ts);"],
|
|
91
|
+
"replace": ["\tif (/^check_[a-z0-9_]+$/.test(fn) && !targets.has(cmd)) byNameGates.set(cmd, ts);"],
|
|
92
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
93
|
+
"timeoutSeconds": 120,
|
|
94
|
+
"signature": "[QK:DEV-GATE-BY-NAME-READ]",
|
|
95
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"claim": "DEV-GATE-BY-NAME-LEAVES",
|
|
99
|
+
"title": "the by-name reader keeps every gate name but drops the leaves they run, so the bloat check passes on empty rows and a gate leaf can ride into the tarball",
|
|
100
|
+
"subject": "scripts/check-install-surface.ts",
|
|
101
|
+
"find": ["\tif (/^(?:check|smoke)_[a-z0-9_]+$/.test(fn) && !targets.has(cmd)) byNameGates.set(cmd, ts);"],
|
|
102
|
+
"replace": ["\tif (/^(?:check|smoke)_[a-z0-9_]+$/.test(fn) && !targets.has(cmd)) byNameGates.set(cmd, []);"],
|
|
103
|
+
"gate": ["bash", "run.sh", "check-install-surface"],
|
|
104
|
+
"timeoutSeconds": 120,
|
|
105
|
+
"signature": "[QK:DEV-GATE-BY-NAME-LEAVES]",
|
|
106
|
+
"signatureSource": "scripts/check-install-surface.ts"
|
|
107
|
+
}
|
|
108
|
+
]
|
|
109
|
+
}
|
|
@@ -67,8 +67,8 @@
|
|
|
67
67
|
"claim": "FCD-ONE-NONCE",
|
|
68
68
|
"title": "the rail mints its own second nonce, so the sibling calls back with a tag the caller never recorded",
|
|
69
69
|
"subject": "pi-extensions/lib/fresh-call-dispatch.ts",
|
|
70
|
-
"find": ["\t\treturn { rail: \"herdr\", result: await herdrFreshCall(
|
|
71
|
-
"replace": ["\t\treturn { rail: \"herdr\", result: await herdrFreshCall(
|
|
70
|
+
"find": ["\t\treturn { rail: \"herdr\", result: await herdrFreshCall(herdrRequest, run, env, nonce) };"],
|
|
71
|
+
"replace": ["\t\treturn { rail: \"herdr\", result: await herdrFreshCall(herdrRequest, run, env, mintNonce()) };"],
|
|
72
72
|
"gate": ["bash", "run.sh", "check-fresh-call-dispatch"],
|
|
73
73
|
"timeoutSeconds": 120,
|
|
74
74
|
"signature": "[QK:FCD-ONE-NONCE]",
|
|
@@ -186,6 +186,42 @@
|
|
|
186
186
|
"timeoutSeconds": 120,
|
|
187
187
|
"signature": "[QK:FCD-PROVIDER-OTHER-BACKENDS-UNJUDGED]",
|
|
188
188
|
"signatureSource": "pi-extensions/lib/fresh-call-dispatch.test.ts"
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
"claim": "FCD-RESUME-RAIL-SHARED",
|
|
192
|
+
"title": "the resume entry point reads the herdr marker loosely instead of through the shared exact predicate, so a process carrying HERDR_ENV=0 reopens its resume through a herdr launch",
|
|
193
|
+
"subject": "pi-extensions/lib/fresh-call-dispatch.ts",
|
|
194
|
+
"find": ["\tif (selectFreshCallRail(env) !== \"herdr\") return tmuxLaunch(input);"],
|
|
195
|
+
"replace": ["\tif (env.HERDR_ENV === undefined) return tmuxLaunch(input);"],
|
|
196
|
+
"gate": ["bash", "run.sh", "check-fresh-call-dispatch"],
|
|
197
|
+
"timeoutSeconds": 120,
|
|
198
|
+
"signature": "[QK:FCD-RESUME-RAIL-SHARED]",
|
|
199
|
+
"signatureSource": "scripts/check-fresh-call-dispatch.ts"
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
"claim": "FCD-HERDR-PI-DURABLE-LAYOUT",
|
|
203
|
+
"title": "the root stops telling the herdr layout branch that the caller is a record-backed Codex citizen, so a Codex caller with no record cwd silently opens pi-durable in the bridge process's own directory",
|
|
204
|
+
"subject": "pi-extensions/lib/fresh-call-dispatch.ts",
|
|
205
|
+
"find": ["\t\t\tcallerIsCodex: request.callerNativeSessionId !== undefined,"],
|
|
206
|
+
"replace": ["\t\t\tcallerIsCodex: false,"],
|
|
207
|
+
"gate": ["bash", "run.sh", "check-fresh-call-dispatch"],
|
|
208
|
+
"timeoutSeconds": 120,
|
|
209
|
+
"signature": "[QK:FCD-HERDR-PI-DURABLE-LAYOUT]",
|
|
210
|
+
"signatureSource": "scripts/check-fresh-call-dispatch.ts"
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
"claim": "FCD-HERDR-NO-THREAD-ID",
|
|
214
|
+
"title": "the herdr request carries the Codex thread id across the root again, so a tmux seat input reaches a rail that has no pane title to anchor it to and can start treating it as placement",
|
|
215
|
+
"subject": "pi-extensions/lib/fresh-call-dispatch.ts",
|
|
216
|
+
"find": ["\t\t\tcallerIsCodex: request.callerNativeSessionId !== undefined,"],
|
|
217
|
+
"replace": [
|
|
218
|
+
"\t\t\tcallerIsCodex: request.callerNativeSessionId !== undefined,",
|
|
219
|
+
"\t\t\tcallerNativeSessionId: request.callerNativeSessionId,"
|
|
220
|
+
],
|
|
221
|
+
"gate": ["bash", "run.sh", "check-fresh-call-dispatch"],
|
|
222
|
+
"timeoutSeconds": 120,
|
|
223
|
+
"signature": "[QK:FCD-HERDR-NO-THREAD-ID]",
|
|
224
|
+
"signatureSource": "scripts/check-fresh-call-dispatch.ts"
|
|
189
225
|
}
|
|
190
226
|
]
|
|
191
227
|
}
|