@junghanacs/entwurf 0.45.0 → 0.51.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 +5 -3
- package/BASELINE.md +110 -1
- package/CHANGELOG.md +249 -0
- package/CONTRIBUTING.md +1 -1
- package/ENTWURF-CLI.json +1229 -0
- package/ENTWURF.json +63 -15
- package/FAQ.md +4 -4
- package/README.md +132 -188
- package/VERIFY.md +18 -11
- package/demo/README.md +1 -1
- package/docs/acp-backend-rail.md +1 -1
- package/docs/external-mcp-host.md +4 -4
- package/docs/setup-clean-host.md +94 -22
- package/mcp/entwurf-bridge/dist/ENTWURF.json +63 -15
- package/mcp/entwurf-bridge/dist/mcp/entwurf-bridge/src/index.js +19 -8
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-contract.js +4 -4
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-visible-resume.js +483 -18
- 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-resume-call.js +50 -5
- 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/resume-launch-identity.js +18 -11
- package/mcp/entwurf-bridge/dist/pi-extensions/meta-bridge-pi-durable.js +30 -15
- 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 +28 -8
- package/mcp/entwurf-bridge/tsconfig.build.json +7 -1
- package/native/win32-x64/manifest.json +1 -1
- package/package.json +16 -20
- package/pi/pi-durable/bootstrap.mjs +179 -6
- package/pi/pi-durable/carrier/runtime.js +327 -57
- package/pi/pi-durable/carrier/session-name.js +11 -0
- package/pi/pi-durable/carrier/sessions.js +96 -20
- package/pi/pi-durable/carrier/subagent.js +5 -2
- package/pi/pi-durable/carrier/tui.js +60 -22
- package/pi/pi-durable/overlay/upstream-pin.json +26 -19
- package/pi-extensions/lib/entwurf-v2-contract-schema.ts +73 -69
- package/pi-extensions/lib/entwurf-v2-contract.ts +4 -4
- package/pi-extensions/lib/entwurf-v2-visible-resume.ts +710 -38
- 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-resume-call.ts +77 -4
- 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/resume-launch-identity.ts +31 -12
- package/pi-extensions/meta-bridge-pi-durable.ts +30 -16
- package/run.sh +552 -699
- package/scripts/check-claude-launch.ts +341 -0
- package/scripts/check-entwurf-v2-contract.ts +4 -4
- package/scripts/check-entwurf-v2-surface.ts +2 -2
- package/scripts/check-fresh-call-dispatch.ts +70 -9
- package/scripts/check-fresh-cut-gate.sh +23 -9
- package/scripts/check-gate-qualification.ts +19 -14
- 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 +28 -0
- 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 +4 -4
- package/scripts/mutants/claude-launch.json +142 -0
- package/scripts/mutants/cli-help-source.json +420 -0
- package/scripts/mutants/control-send-receipt.json +1 -1
- 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-resume-call.json +63 -2
- package/scripts/mutants/pack-install.json +4 -4
- package/scripts/mutants/peer-facts.json +15 -0
- package/scripts/mutants/pi-durable.json +1167 -3
- package/scripts/mutants/pi-floor.json +22 -5
- package/scripts/mutants/source-install.json +35 -0
- package/scripts/mutants/v2-surface.json +2 -2
- package/scripts/mutants/v2-visible-resume.json +255 -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,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
|
}
|
|
@@ -38,6 +38,21 @@
|
|
|
38
38
|
"timeoutSeconds": 180,
|
|
39
39
|
"signature": "[QK:FRESHCUT-PREFLIGHT-CUT-DETECTED]",
|
|
40
40
|
"signatureSource": "scripts/check-fresh-cut-gate.sh"
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"claim": "FRESHCUT-HELP-POINTER",
|
|
44
|
+
"title": "the leaf's --help and usage refusal point at another command's description, so an operator who followed them reads the wrong exit contract (#153)",
|
|
45
|
+
"subject": "scripts/meta-bridge-fresh-cut.ts",
|
|
46
|
+
"find": [
|
|
47
|
+
"\t\t\"meta-bridge-fresh-cut: see `entwurf help meta-bridge-fresh-cut` (from that checkout's root: `./run.sh help meta-bridge-fresh-cut`)\","
|
|
48
|
+
],
|
|
49
|
+
"replace": [
|
|
50
|
+
"\t\t\"meta-bridge-fresh-cut: see `entwurf help meta-bridge-prune` (from that checkout's root: `./run.sh help meta-bridge-prune`)\","
|
|
51
|
+
],
|
|
52
|
+
"gate": ["bash", "run.sh", "check-fresh-cut-gate"],
|
|
53
|
+
"timeoutSeconds": 180,
|
|
54
|
+
"signature": "[QK:FRESHCUT-HELP-POINTER]",
|
|
55
|
+
"signatureSource": "scripts/check-fresh-cut-gate.sh"
|
|
41
56
|
}
|
|
42
57
|
]
|
|
43
58
|
}
|
|
@@ -422,6 +422,134 @@
|
|
|
422
422
|
"timeoutSeconds": 300,
|
|
423
423
|
"signature": "[QK:DOCTOR-MODE-ADMISSION-CLAUSES]",
|
|
424
424
|
"signatureSource": "scripts/check-herdr-activation.ts"
|
|
425
|
+
},
|
|
426
|
+
{
|
|
427
|
+
"claim": "HAC-LEDGER-VERSION-ADMITTED",
|
|
428
|
+
"title": "a reader that admits only schema 2 refuses the floor ledger as uncertified, so the host's own current artifact can no longer read the ledger that keeps older artifacts out (#153)",
|
|
429
|
+
"subject": "scripts/herdr-activation.mjs",
|
|
430
|
+
"find": ["\tif (!ACTIVATION_SCHEMA_VERSIONS.includes(parsed.schemaVersion)) {"],
|
|
431
|
+
"replace": ["\tif (parsed.schemaVersion !== 2) {"],
|
|
432
|
+
"gate": ["bash", "run.sh", "check-herdr-activation"],
|
|
433
|
+
"timeoutSeconds": 300,
|
|
434
|
+
"signature": "[QK:HAC-LEDGER-VERSION-ADMITTED]",
|
|
435
|
+
"signatureSource": "scripts/check-herdr-activation.ts"
|
|
436
|
+
},
|
|
437
|
+
{
|
|
438
|
+
"claim": "HAC-LEDGER-WRITER-VERSION-CHECKED",
|
|
439
|
+
"title": "a writer that takes any version writes a ledger every reader refuses, turning a caller's typo into a host no verb can act on (#153)",
|
|
440
|
+
"subject": "scripts/herdr-activation.mjs",
|
|
441
|
+
"find": ["\tif (!ACTIVATION_SCHEMA_VERSIONS.includes(version)) {"],
|
|
442
|
+
"replace": ["\tif (false) {"],
|
|
443
|
+
"gate": ["bash", "run.sh", "check-herdr-activation"],
|
|
444
|
+
"timeoutSeconds": 300,
|
|
445
|
+
"signature": "[QK:HAC-LEDGER-WRITER-VERSION-CHECKED]",
|
|
446
|
+
"signatureSource": "scripts/check-herdr-activation.ts"
|
|
447
|
+
},
|
|
448
|
+
{
|
|
449
|
+
"claim": "HAC-LEDGER-WRITER-NO-EMBEDDED-VERSION",
|
|
450
|
+
"title": "an entry's own schemaVersion silently overrides the version the caller named, so a body copied from an old ledger lowers the floor without anyone asking (#153)",
|
|
451
|
+
"subject": "scripts/herdr-activation.mjs",
|
|
452
|
+
"find": ["\tif (Object.hasOwn(entry, \"schemaVersion\")) {"],
|
|
453
|
+
"replace": ["\tif (false) {"],
|
|
454
|
+
"gate": ["bash", "run.sh", "check-herdr-activation"],
|
|
455
|
+
"timeoutSeconds": 300,
|
|
456
|
+
"signature": "[QK:HAC-LEDGER-WRITER-NO-EMBEDDED-VERSION]",
|
|
457
|
+
"signatureSource": "scripts/check-herdr-activation.ts"
|
|
458
|
+
},
|
|
459
|
+
{
|
|
460
|
+
"claim": "HAC-LEDGER-VERSION-KEPT-BY-ACTIVATE",
|
|
461
|
+
"title": "activation rewrites every ledger at the fresh version, so one forward run over a floor host hands it back to the older readers the floor keeps out (#153)",
|
|
462
|
+
"subject": "scripts/herdr-plugin-activate.mjs",
|
|
463
|
+
"find": ["\tconst version = ledger?.schemaVersion ?? FRESH_ACTIVATION_SCHEMA_VERSION;"],
|
|
464
|
+
"replace": ["\tconst version = FRESH_ACTIVATION_SCHEMA_VERSION;"],
|
|
465
|
+
"gate": ["bash", "run.sh", "check-herdr-activation"],
|
|
466
|
+
"timeoutSeconds": 300,
|
|
467
|
+
"signature": "[QK:HAC-LEDGER-VERSION-KEPT-BY-ACTIVATE]",
|
|
468
|
+
"signatureSource": "scripts/check-herdr-activation.ts"
|
|
469
|
+
},
|
|
470
|
+
{
|
|
471
|
+
"claim": "HAC-LEDGER-VERSION-KEPT-BY-DEACTIVATE",
|
|
472
|
+
"title": "the teardown checkpoint lowers a floor ledger to 2, so a teardown stopped halfway can be resumed by an older reader that does not know the floor (#153)",
|
|
473
|
+
"subject": "scripts/herdr-plugin-deactivate.mjs",
|
|
474
|
+
"find": ["\t\t\tledger.schemaVersion,"],
|
|
475
|
+
"replace": ["\t\t\t2,"],
|
|
476
|
+
"gate": ["bash", "run.sh", "check-herdr-activation"],
|
|
477
|
+
"timeoutSeconds": 300,
|
|
478
|
+
"signature": "[QK:HAC-LEDGER-VERSION-KEPT-BY-DEACTIVATE]",
|
|
479
|
+
"signatureSource": "scripts/check-herdr-activation.ts"
|
|
480
|
+
},
|
|
481
|
+
{
|
|
482
|
+
"claim": "HAC-DEACTIVATE-LINK-FIRST",
|
|
483
|
+
"title": "the operator link is taken back after the components instead of before them, so a teardown stopped at a component leaves the link naming a runtime whose wiring is already half gone (#153)",
|
|
484
|
+
"subject": "scripts/herdr-plugin-deactivate.mjs",
|
|
485
|
+
"find": [
|
|
486
|
+
"\tif (operatorReceipt !== null) {",
|
|
487
|
+
"\t\tremoveOperatorLink(env, operatorReceipt);",
|
|
488
|
+
"\t\tdone.push(\"operator-link\");",
|
|
489
|
+
"\t}",
|
|
490
|
+
"\tfor (const step of steps) {",
|
|
491
|
+
"\t\tif (step === \"claude-code\" || step === \"pi\") {",
|
|
492
|
+
"\t\t\tconst verb = step === \"pi\" ? \"remove-user-scope\" : \"uninstall-meta-bridge\";",
|
|
493
|
+
"\t\t\tconst r = run(\"bash\", [path.join(PACKAGE_ROOT, \"run.sh\"), verb], env);",
|
|
494
|
+
"\t\t\tif (r.status !== 0) {",
|
|
495
|
+
"\t\t\t\tprocess.stderr.write(`${(r.stderr || r.stdout || \"\").trim()}\\n`);",
|
|
496
|
+
"\t\t\t\tfail(",
|
|
497
|
+
"\t\t\t\t\t\"deactivate-component-failed\",",
|
|
498
|
+
"\t\t\t\t\t`${step} inverse failed — runtime and ledger preserved as retry authority (${done.filter((s) => s === \"pi\" || s === \"claude-code\").length} component(s) already removed and recorded)`,",
|
|
499
|
+
"\t\t\t\t);",
|
|
500
|
+
"\t\t\t}",
|
|
501
|
+
"\t\t\tstates[step] = \"removed\";",
|
|
502
|
+
"\t\t\tcheckpoint();",
|
|
503
|
+
"\t\t\tdone.push(step);",
|
|
504
|
+
"\t\t} else if (step === \"runtime\") {"
|
|
505
|
+
],
|
|
506
|
+
"replace": [
|
|
507
|
+
"\tfor (const step of steps) {",
|
|
508
|
+
"\t\tif (step === \"claude-code\" || step === \"pi\") {",
|
|
509
|
+
"\t\t\tconst verb = step === \"pi\" ? \"remove-user-scope\" : \"uninstall-meta-bridge\";",
|
|
510
|
+
"\t\t\tconst r = run(\"bash\", [path.join(PACKAGE_ROOT, \"run.sh\"), verb], env);",
|
|
511
|
+
"\t\t\tif (r.status !== 0) {",
|
|
512
|
+
"\t\t\t\tprocess.stderr.write(`${(r.stderr || r.stdout || \"\").trim()}\\n`);",
|
|
513
|
+
"\t\t\t\tfail(",
|
|
514
|
+
"\t\t\t\t\t\"deactivate-component-failed\",",
|
|
515
|
+
"\t\t\t\t\t`${step} inverse failed — runtime and ledger preserved as retry authority (${done.filter((s) => s === \"pi\" || s === \"claude-code\").length} component(s) already removed and recorded)`,",
|
|
516
|
+
"\t\t\t\t);",
|
|
517
|
+
"\t\t\t}",
|
|
518
|
+
"\t\t\tstates[step] = \"removed\";",
|
|
519
|
+
"\t\t\tcheckpoint();",
|
|
520
|
+
"\t\t\tdone.push(step);",
|
|
521
|
+
"\t\t} else if (step === \"runtime\") {",
|
|
522
|
+
"\t\t\tif (operatorReceipt !== null) {",
|
|
523
|
+
"\t\t\t\tremoveOperatorLink(env, operatorReceipt);",
|
|
524
|
+
"\t\t\t\tdone.push(\"operator-link\");",
|
|
525
|
+
"\t\t\t}"
|
|
526
|
+
],
|
|
527
|
+
"gate": ["bash", "run.sh", "check-herdr-activation"],
|
|
528
|
+
"timeoutSeconds": 300,
|
|
529
|
+
"signature": "[QK:HAC-DEACTIVATE-LINK-FIRST]",
|
|
530
|
+
"signatureSource": "scripts/check-herdr-activation.ts"
|
|
531
|
+
},
|
|
532
|
+
{
|
|
533
|
+
"claim": "HAC-DEACTIVATE-FOREIGN-LINK-REFUSES",
|
|
534
|
+
"title": "the deactivate preflight no longer judges the link, so a foreign link is found only by the removal after the ledger already moved to deactivating (#153)",
|
|
535
|
+
"subject": "scripts/herdr-operator-link.mjs",
|
|
536
|
+
"find": ["\tassessForRemoval(receipt);", "\treturn receipt;"],
|
|
537
|
+
"replace": ["\treturn receipt;"],
|
|
538
|
+
"gate": ["bash", "run.sh", "check-herdr-activation"],
|
|
539
|
+
"timeoutSeconds": 300,
|
|
540
|
+
"signature": "[QK:HAC-DEACTIVATE-FOREIGN-LINK-REFUSES]",
|
|
541
|
+
"signatureSource": "scripts/check-herdr-activation.ts"
|
|
542
|
+
},
|
|
543
|
+
{
|
|
544
|
+
"claim": "HAC-NO-LEDGER-OPERATOR-LEFTOVERS",
|
|
545
|
+
"title": "with no ledger an operator-link receipt is not named, so deactivate reports nothing to undo over a receipt and its link (#153)",
|
|
546
|
+
"subject": "scripts/herdr-plugin-deactivate.mjs",
|
|
547
|
+
"find": ["\t\tconst leftovers = [...leftoversAtPluginAddresses(runtime), ...operatorLinkLeftovers(env)];"],
|
|
548
|
+
"replace": ["\t\tconst leftovers = [...leftoversAtPluginAddresses(runtime)];"],
|
|
549
|
+
"gate": ["bash", "run.sh", "check-herdr-activation"],
|
|
550
|
+
"timeoutSeconds": 300,
|
|
551
|
+
"signature": "[QK:HAC-NO-LEDGER-OPERATOR-LEFTOVERS]",
|
|
552
|
+
"signatureSource": "scripts/check-herdr-activation.ts"
|
|
425
553
|
}
|
|
426
554
|
]
|
|
427
555
|
}
|
|
@@ -15,10 +15,10 @@
|
|
|
15
15
|
},
|
|
16
16
|
{
|
|
17
17
|
"claim": "HFC-PILOT-CLOSED",
|
|
18
|
-
"title": "a backend nobody measured on herdr is admitted to the
|
|
18
|
+
"title": "a backend nobody measured on herdr is admitted to the agent-start set, so a caller gets a pane running something this rail never proved it can open (#116 A7: the tuple moved to the shared rails leaf; #157 A-L1 split it into the agent-start and layout sets, so the mutant follows the agent-start set that keys the herdr kind map — widening it is still the mutation)",
|
|
19
19
|
"subject": "scripts/herdr-rails.mjs",
|
|
20
|
-
"find": ["export const
|
|
21
|
-
"replace": ["export const
|
|
20
|
+
"find": ["export const HERDR_AGENT_START_BACKENDS = Object.freeze([\"pi\", \"claude-code\"]);"],
|
|
21
|
+
"replace": ["export const HERDR_AGENT_START_BACKENDS = Object.freeze([\"pi\", \"claude-code\", \"codex\"]);"],
|
|
22
22
|
"gate": ["bash", "run.sh", "check-herdr-fresh-call"],
|
|
23
23
|
"timeoutSeconds": 120,
|
|
24
24
|
"signature": "[QK:HFC-PILOT-CLOSED]",
|
|
@@ -96,14 +96,25 @@
|
|
|
96
96
|
"signature": "[QK:HFC-FRAMING-CONTROL-REFUSED]",
|
|
97
97
|
"signatureSource": "scripts/check-herdr-fresh-call.ts"
|
|
98
98
|
},
|
|
99
|
+
{
|
|
100
|
+
"claim": "HFC-CODEX-CWD-NO-FALLBACK",
|
|
101
|
+
"title": "the shared cwd chooser lets a known Codex caller with no record cwd fall back to this process's directory, which is the app-server's, so an agent-start sibling opens somewhere the caller never was (#157 A-L1x)",
|
|
102
|
+
"subject": "pi-extensions/lib/herdr-fresh-call.ts",
|
|
103
|
+
"find": ["\t\t\t? { ok: false, reason: \"codex-caller-cwd-unavailable\" }"],
|
|
104
|
+
"replace": ["\t\t\t? { ok: true, cwd: input.callerProcessCwd(), source: \"caller-process\" }"],
|
|
105
|
+
"gate": ["bash", "run.sh", "check-herdr-fresh-call"],
|
|
106
|
+
"timeoutSeconds": 120,
|
|
107
|
+
"signature": "[QK:HFC-CODEX-CWD-NO-FALLBACK]",
|
|
108
|
+
"signatureSource": "scripts/check-herdr-fresh-call.ts"
|
|
109
|
+
},
|
|
99
110
|
{
|
|
100
111
|
"claim": "HFC-PREMUTATION-ONLY",
|
|
101
112
|
"title": "a pre-mutation input refusal is dropped, so a call that should have refused instead splits a pane in the operator's workspace first",
|
|
102
113
|
"subject": "pi-extensions/lib/herdr-fresh-call.ts",
|
|
103
114
|
"find": [
|
|
104
|
-
"\
|
|
115
|
+
"\tconst badCwd = classifyHerdrCwd(chosenCwd.cwd);\n\tif (badCwd !== null) return { ok: false, reason: badCwd };"
|
|
105
116
|
],
|
|
106
|
-
"replace": ["\
|
|
117
|
+
"replace": ["\tvoid classifyHerdrCwd(chosenCwd.cwd);"],
|
|
107
118
|
"gate": ["bash", "run.sh", "check-herdr-fresh-call"],
|
|
108
119
|
"timeoutSeconds": 120,
|
|
109
120
|
"signature": "[QK:HFC-PREMUTATION-ONLY]",
|
|
@@ -271,6 +282,19 @@
|
|
|
271
282
|
"signature": "[QK:HFC-CWD-EMPTY-IS-OMITTED]",
|
|
272
283
|
"signatureSource": "scripts/check-herdr-fresh-call.ts"
|
|
273
284
|
},
|
|
285
|
+
{
|
|
286
|
+
"claim": "HFC-CWD-CALLER-DEFAULT",
|
|
287
|
+
"title": "the agent-start tab create sends --cwd only for a requested directory again, so an omitted cwd opens the sibling in herdr's own default instead of where the caller is while the receipt still names the caller's directory (#157 A-L1x)",
|
|
288
|
+
"subject": "pi-extensions/lib/herdr-fresh-call.ts",
|
|
289
|
+
"find": ["\t\t\tworkspaceId: callerPane.workspaceId,\n\t\t\tcwd: chosenCwd.cwd,"],
|
|
290
|
+
"replace": [
|
|
291
|
+
"\t\t\tworkspaceId: callerPane.workspaceId,\n\t\t\t...(chosenCwd.source === \"requested\" ? { cwd: chosenCwd.cwd } : {}),"
|
|
292
|
+
],
|
|
293
|
+
"gate": ["bash", "run.sh", "check-herdr-fresh-call"],
|
|
294
|
+
"timeoutSeconds": 120,
|
|
295
|
+
"signature": "[QK:HFC-CWD-CALLER-DEFAULT]",
|
|
296
|
+
"signatureSource": "scripts/check-herdr-fresh-call.ts"
|
|
297
|
+
},
|
|
274
298
|
{
|
|
275
299
|
"claim": "HFC-TAB-OCCUPIED",
|
|
276
300
|
"title": "a brand-new tab whose initial pane already holds an agent is started into anyway, landing beside somebody else's sibling",
|
|
@@ -454,6 +478,255 @@
|
|
|
454
478
|
"timeoutSeconds": 120,
|
|
455
479
|
"signature": "[QK:HFC-CALLBACK-ENV]",
|
|
456
480
|
"signatureSource": "scripts/check-herdr-fresh-call.ts"
|
|
481
|
+
},
|
|
482
|
+
{
|
|
483
|
+
"claim": "HLFC-SAME-ENDPOINT",
|
|
484
|
+
"title": "the caller-pane read is sent to a second endpoint instead of the one the layout write uses, so the workspace that names the new tab can come from a different herdr server answering with the same w1/p1 strings",
|
|
485
|
+
"subject": "pi-extensions/lib/herdr-fresh-call.ts",
|
|
486
|
+
"find": ["\t\tawait call(buildHerdrPaneGetPacket(readId, context.callerPaneId)),"],
|
|
487
|
+
"replace": [
|
|
488
|
+
"\t\tawait deps.socket(`${socketPath}.read`)(buildHerdrPaneGetPacket(readId, context.callerPaneId)),"
|
|
489
|
+
],
|
|
490
|
+
"gate": ["bash", "run.sh", "check-herdr-fresh-call"],
|
|
491
|
+
"timeoutSeconds": 120,
|
|
492
|
+
"signature": "[QK:HLFC-SAME-ENDPOINT]",
|
|
493
|
+
"signatureSource": "pi-extensions/lib/herdr-layout-fresh-call.test.ts"
|
|
494
|
+
},
|
|
495
|
+
{
|
|
496
|
+
"claim": "HLFC-READ-FAILURE-NO-WRITE",
|
|
497
|
+
"title": "a failed caller-pane read no longer stops the branch, so a layout write goes out with a workspace nobody read",
|
|
498
|
+
"subject": "pi-extensions/lib/herdr-fresh-call.ts",
|
|
499
|
+
"find": ["\tif (!read.ok) return { ok: false, reason: read.reason, reported: read.reported };"],
|
|
500
|
+
"replace": ["\tif (read.ok === undefined) return { ok: false, reason: read.reason, reported: read.reported };"],
|
|
501
|
+
"gate": ["bash", "run.sh", "check-herdr-fresh-call"],
|
|
502
|
+
"timeoutSeconds": 120,
|
|
503
|
+
"signature": "[QK:HLFC-READ-FAILURE-NO-WRITE]",
|
|
504
|
+
"signatureSource": "pi-extensions/lib/herdr-layout-fresh-call.test.ts"
|
|
505
|
+
},
|
|
506
|
+
{
|
|
507
|
+
"claim": "HLFC-ENVELOPE-BEFORE-CERTAINTY",
|
|
508
|
+
"title": "a reply carrying BOTH a result and an error is read as its result arm, so a malformed envelope can be believed as a launch or a pre-create refusal",
|
|
509
|
+
"subject": "pi-extensions/lib/herdr-fresh-call.ts",
|
|
510
|
+
"find": ["\tif (hasResult === Object.hasOwn(parsed, \"error\")) return null;"],
|
|
511
|
+
"replace": ["\tif (!hasResult && !Object.hasOwn(parsed, \"error\")) return null;"],
|
|
512
|
+
"gate": ["bash", "run.sh", "check-herdr-fresh-call"],
|
|
513
|
+
"timeoutSeconds": 120,
|
|
514
|
+
"signature": "[QK:HLFC-ENVELOPE-BEFORE-CERTAINTY]",
|
|
515
|
+
"signatureSource": "pi-extensions/lib/herdr-layout-fresh-call.test.ts"
|
|
516
|
+
},
|
|
517
|
+
{
|
|
518
|
+
"claim": "HLFC-NONE-CODES-ONLY",
|
|
519
|
+
"title": "layout_apply_failed joins the pre-create codes, so a request herdr may already have turned into a tab is reported as having created nothing",
|
|
520
|
+
"subject": "pi-extensions/lib/herdr-fresh-call.ts",
|
|
521
|
+
"find": ["\t\"invalid_env\","],
|
|
522
|
+
"replace": ["\t\"invalid_env\",", "\t\"layout_apply_failed\","],
|
|
523
|
+
"gate": ["bash", "run.sh", "check-herdr-fresh-call"],
|
|
524
|
+
"timeoutSeconds": 120,
|
|
525
|
+
"signature": "[QK:HLFC-NONE-CODES-ONLY]",
|
|
526
|
+
"signatureSource": "pi-extensions/lib/herdr-layout-fresh-call.test.ts"
|
|
527
|
+
},
|
|
528
|
+
{
|
|
529
|
+
"claim": "HLFC-POST-WRITE-UNKNOWN",
|
|
530
|
+
"title": "an I/O error after the connection existed is reported as none, so a layout request that may have reached herdr is said to have created nothing and its nonce is dropped",
|
|
531
|
+
"subject": "pi-extensions/lib/herdr-fresh-call.ts",
|
|
532
|
+
"find": [
|
|
533
|
+
"\t\t\treturn layoutFailure(\"herdr-layout-transport-failed\", \"unknown\", {",
|
|
534
|
+
"\t\t\t\ttransport: boundHerdrDiagnostic(`io-failed: ${outcome.code}`),"
|
|
535
|
+
],
|
|
536
|
+
"replace": [
|
|
537
|
+
"\t\t\treturn layoutFailure(\"herdr-layout-transport-failed\", \"none\", {",
|
|
538
|
+
"\t\t\t\ttransport: boundHerdrDiagnostic(`io-failed: ${outcome.code}`),"
|
|
539
|
+
],
|
|
540
|
+
"gate": ["bash", "run.sh", "check-herdr-fresh-call"],
|
|
541
|
+
"timeoutSeconds": 120,
|
|
542
|
+
"signature": "[QK:HLFC-POST-WRITE-UNKNOWN]",
|
|
543
|
+
"signatureSource": "pi-extensions/lib/herdr-layout-fresh-call.test.ts"
|
|
544
|
+
},
|
|
545
|
+
{
|
|
546
|
+
"claim": "HLFC-SUCCESS-PROVES-LAUNCH",
|
|
547
|
+
"title": "the echoed argv is no longer compared, so a success reply describing some other command is accepted as this launch's receipt",
|
|
548
|
+
"subject": "pi-extensions/lib/herdr-fresh-call.ts",
|
|
549
|
+
"find": ["\t\t!sameArgv(root.command, expect.command)"],
|
|
550
|
+
"replace": ["\t\tfalse"],
|
|
551
|
+
"gate": ["bash", "run.sh", "check-herdr-fresh-call"],
|
|
552
|
+
"timeoutSeconds": 120,
|
|
553
|
+
"signature": "[QK:HLFC-SUCCESS-PROVES-LAUNCH]",
|
|
554
|
+
"signatureSource": "pi-extensions/lib/herdr-layout-fresh-call.test.ts"
|
|
555
|
+
},
|
|
556
|
+
{
|
|
557
|
+
"claim": "HLFC-PAYLOAD-ROUNDTRIP",
|
|
558
|
+
"title": "the bootstrap payload is no longer escaped at its own layer, so a task carrying DEL or C1 cannot be launched faithfully and the call throws instead of opening the sibling",
|
|
559
|
+
"subject": "pi-extensions/lib/herdr-fresh-call.ts",
|
|
560
|
+
"find": ["\tconst payload = escapeRemainingControlChars(raw);"],
|
|
561
|
+
"replace": ["\tconst payload = raw;"],
|
|
562
|
+
"gate": ["bash", "run.sh", "check-herdr-fresh-call"],
|
|
563
|
+
"timeoutSeconds": 120,
|
|
564
|
+
"signature": "[QK:HLFC-PAYLOAD-ROUNDTRIP]",
|
|
565
|
+
"signatureSource": "pi-extensions/lib/herdr-layout-fresh-call.test.ts"
|
|
566
|
+
},
|
|
567
|
+
{
|
|
568
|
+
"claim": "HLFC-CWD-NO-FALLBACK",
|
|
569
|
+
"title": "the layout branch drops the caller's Codex fact before choosing a start directory, so a pi-durable sibling for a Codex caller with no record cwd opens in this process's directory, which is the app-server's, and a Codex caller's record directory is passed over for it",
|
|
570
|
+
"subject": "pi-extensions/lib/herdr-fresh-call.ts",
|
|
571
|
+
"find": [
|
|
572
|
+
"\tconst chosen = chooseHerdrLayoutCwd({\n\t\t...(requestedCwd === undefined ? {} : { requestedCwd }),\n\t\tcallerIsCodex: params.callerIsCodex === true,"
|
|
573
|
+
],
|
|
574
|
+
"replace": [
|
|
575
|
+
"\tconst chosen = chooseHerdrLayoutCwd({\n\t\t...(requestedCwd === undefined ? {} : { requestedCwd }),\n\t\tcallerIsCodex: false,"
|
|
576
|
+
],
|
|
577
|
+
"gate": ["bash", "run.sh", "check-herdr-fresh-call"],
|
|
578
|
+
"timeoutSeconds": 120,
|
|
579
|
+
"signature": "[QK:HLFC-CWD-NO-FALLBACK]",
|
|
580
|
+
"signatureSource": "pi-extensions/lib/herdr-layout-fresh-call.test.ts"
|
|
581
|
+
},
|
|
582
|
+
{
|
|
583
|
+
"claim": "HLFC-SOCKET-PATH-EXPLICIT",
|
|
584
|
+
"title": "a relative HERDR_SOCKET_PATH is accepted, so the endpoint becomes whatever that name resolves to in this process's directory",
|
|
585
|
+
"subject": "pi-extensions/lib/herdr-fresh-call.ts",
|
|
586
|
+
"find": ["\treturn typeof value === \"string\" && value.length > 0 && path.isAbsolute(value) ? value : null;"],
|
|
587
|
+
"replace": ["\treturn typeof value === \"string\" && value.length > 0 ? value : null;"],
|
|
588
|
+
"gate": ["bash", "run.sh", "check-herdr-fresh-call"],
|
|
589
|
+
"timeoutSeconds": 120,
|
|
590
|
+
"signature": "[QK:HLFC-SOCKET-PATH-EXPLICIT]",
|
|
591
|
+
"signatureSource": "pi-extensions/lib/herdr-layout-fresh-call.test.ts"
|
|
592
|
+
},
|
|
593
|
+
{
|
|
594
|
+
"claim": "HLFC-PREFLIGHT-BEFORE-SOCKET",
|
|
595
|
+
"title": "the carrier/SDK verdict is no longer handed to the pi-durable preflight, so a drifted carrier or mismatched SDK set is launched into a herdr tab",
|
|
596
|
+
"subject": "pi-extensions/lib/herdr-fresh-call.ts",
|
|
597
|
+
"find": ["\t\truntime: packageLayout === null ? null : deps.runtimeVerdict(packageLayout),"],
|
|
598
|
+
"replace": ["\t\truntime: null,"],
|
|
599
|
+
"gate": ["bash", "run.sh", "check-herdr-fresh-call"],
|
|
600
|
+
"timeoutSeconds": 120,
|
|
601
|
+
"signature": "[QK:HLFC-PREFLIGHT-BEFORE-SOCKET]",
|
|
602
|
+
"signatureSource": "pi-extensions/lib/herdr-layout-fresh-call.test.ts"
|
|
603
|
+
},
|
|
604
|
+
{
|
|
605
|
+
"claim": "HLFC-VERIFIED-LAUNCHER",
|
|
606
|
+
"title": "the package's run.sh is no longer checked as an executable regular file, so herdr is asked to exec a launcher that is missing, plain or a directory",
|
|
607
|
+
"subject": "pi-extensions/lib/herdr-fresh-call.ts",
|
|
608
|
+
"find": [
|
|
609
|
+
"\tif (!isExecutableRegularFile(runtime)) return { ok: false, reason: \"pi-durable-launcher-missing\" };"
|
|
610
|
+
],
|
|
611
|
+
"replace": ["\tif (runtime === \"\") return { ok: false, reason: \"pi-durable-launcher-missing\" };"],
|
|
612
|
+
"gate": ["bash", "run.sh", "check-herdr-fresh-call"],
|
|
613
|
+
"timeoutSeconds": 120,
|
|
614
|
+
"signature": "[QK:HLFC-VERIFIED-LAUNCHER]",
|
|
615
|
+
"signatureSource": "pi-extensions/lib/herdr-layout-fresh-call.test.ts"
|
|
616
|
+
},
|
|
617
|
+
{
|
|
618
|
+
"claim": "HLFC-SETS-AND-MAPS",
|
|
619
|
+
"title": "pi-durable is given a herdr agent kind, so a layout-launched backend could be started as herdr's pi program under its name",
|
|
620
|
+
"subject": "pi-extensions/lib/herdr-fresh-call.ts",
|
|
621
|
+
"find": ["export const HERDR_AGENT_KIND: Record<HerdrAgentStartBackend, string> = {"],
|
|
622
|
+
"replace": ["export const HERDR_AGENT_KIND: Record<HerdrAgentStartBackend, string> = { \"pi-durable\": \"pi\","],
|
|
623
|
+
"gate": ["bash", "run.sh", "check-herdr-fresh-call"],
|
|
624
|
+
"timeoutSeconds": 120,
|
|
625
|
+
"signature": "[QK:HLFC-SETS-AND-MAPS]",
|
|
626
|
+
"signatureSource": "pi-extensions/lib/herdr-layout-fresh-call.test.ts"
|
|
627
|
+
},
|
|
628
|
+
{
|
|
629
|
+
"claim": "HLFC-RENDER-CERTAINTY",
|
|
630
|
+
"title": "every transport failure renders as the none text, so an operator is told nothing was created after a layout request that may have landed",
|
|
631
|
+
"subject": "pi-extensions/lib/herdr-fresh-call.ts",
|
|
632
|
+
"find": ["\tif (result.recovery.outcome === \"none\") {"],
|
|
633
|
+
"replace": [
|
|
634
|
+
"\tif (result.recovery.outcome === \"none\" || result.reason === \"herdr-layout-transport-failed\") {"
|
|
635
|
+
],
|
|
636
|
+
"gate": ["bash", "run.sh", "check-herdr-fresh-call"],
|
|
637
|
+
"timeoutSeconds": 120,
|
|
638
|
+
"signature": "[QK:HLFC-RENDER-CERTAINTY]",
|
|
639
|
+
"signatureSource": "pi-extensions/lib/herdr-layout-fresh-call.test.ts"
|
|
640
|
+
},
|
|
641
|
+
{
|
|
642
|
+
"claim": "HLFC-DIAGNOSTIC-BOUND",
|
|
643
|
+
"title": "the display cut is lifted, so a herdr-reported string of any length is copied whole into the operator's text",
|
|
644
|
+
"subject": "pi-extensions/lib/herdr-fresh-call.ts",
|
|
645
|
+
"find": ["export const HERDR_DIAGNOSTIC_MAX_CHARS = 256;"],
|
|
646
|
+
"replace": ["export const HERDR_DIAGNOSTIC_MAX_CHARS = 4096;"],
|
|
647
|
+
"gate": ["bash", "run.sh", "check-herdr-fresh-call"],
|
|
648
|
+
"timeoutSeconds": 120,
|
|
649
|
+
"signature": "[QK:HLFC-DIAGNOSTIC-BOUND]",
|
|
650
|
+
"signatureSource": "pi-extensions/lib/herdr-layout-fresh-call.test.ts"
|
|
651
|
+
},
|
|
652
|
+
{
|
|
653
|
+
"claim": "HLFC-TRANSPORT-FRAMING",
|
|
654
|
+
"title": "the reply decode leaf decodes chunk by chunk, so a multi-byte character split between reads is corrupted into replacement characters",
|
|
655
|
+
"subject": "pi-extensions/lib/herdr-fresh-call.ts",
|
|
656
|
+
"find": ["\treturn Buffer.concat(chunks).toString(\"utf8\");"],
|
|
657
|
+
"replace": ["\treturn chunks.map((chunk) => chunk.toString(\"utf8\")).join(\"\");"],
|
|
658
|
+
"gate": ["bash", "run.sh", "check-herdr-fresh-call"],
|
|
659
|
+
"timeoutSeconds": 120,
|
|
660
|
+
"signature": "[QK:HLFC-TRANSPORT-FRAMING]",
|
|
661
|
+
"signatureSource": "pi-extensions/lib/herdr-layout-fresh-call.test.ts"
|
|
662
|
+
},
|
|
663
|
+
{
|
|
664
|
+
"claim": "HLFC-TRANSPORT-OVERSIZE",
|
|
665
|
+
"title": "the reply byte bound is effectively lifted, so an oversized reply is buffered until timeout instead of being refused at the bound",
|
|
666
|
+
"subject": "pi-extensions/lib/herdr-fresh-call.ts",
|
|
667
|
+
"find": ["\t\t\t\tif (lineBytes > bounds.maxReplyBytes) {"],
|
|
668
|
+
"replace": ["\t\t\t\tif (lineBytes > bounds.maxReplyBytes * 1000) {"],
|
|
669
|
+
"gate": ["bash", "run.sh", "check-herdr-fresh-call"],
|
|
670
|
+
"timeoutSeconds": 120,
|
|
671
|
+
"signature": "[QK:HLFC-TRANSPORT-OVERSIZE]",
|
|
672
|
+
"signatureSource": "pi-extensions/lib/herdr-layout-fresh-call.test.ts"
|
|
673
|
+
},
|
|
674
|
+
{
|
|
675
|
+
"claim": "HLFC-TRANSPORT-EOF",
|
|
676
|
+
"title": "a close before the reply's newline is reported as a connect failure, so a request herdr received is said to have never been written",
|
|
677
|
+
"subject": "pi-extensions/lib/herdr-fresh-call.ts",
|
|
678
|
+
"find": ["\t\t\tsocket.on(\"close\", () => settle({ kind: \"eof-before-newline\" }));"],
|
|
679
|
+
"replace": ["\t\t\tsocket.on(\"close\", () => settle({ kind: \"connect-failed\", code: \"closed\" }));"],
|
|
680
|
+
"gate": ["bash", "run.sh", "check-herdr-fresh-call"],
|
|
681
|
+
"timeoutSeconds": 120,
|
|
682
|
+
"signature": "[QK:HLFC-TRANSPORT-EOF]",
|
|
683
|
+
"signatureSource": "pi-extensions/lib/herdr-layout-fresh-call.test.ts"
|
|
684
|
+
},
|
|
685
|
+
{
|
|
686
|
+
"claim": "HLFC-TRANSPORT-CONNECT-FAIL",
|
|
687
|
+
"title": "a connection that never existed is reported as a post-connect I/O failure, so the one certain no-write outcome is lost",
|
|
688
|
+
"subject": "pi-extensions/lib/herdr-fresh-call.ts",
|
|
689
|
+
"find": ["\t\t\t\tsettle(connected ? { kind: \"io-failed\", code } : { kind: \"connect-failed\", code });"],
|
|
690
|
+
"replace": ["\t\t\t\tsettle({ kind: \"io-failed\", code });"],
|
|
691
|
+
"gate": ["bash", "run.sh", "check-herdr-fresh-call"],
|
|
692
|
+
"timeoutSeconds": 120,
|
|
693
|
+
"signature": "[QK:HLFC-TRANSPORT-CONNECT-FAIL]",
|
|
694
|
+
"signatureSource": "pi-extensions/lib/herdr-layout-fresh-call.test.ts"
|
|
695
|
+
},
|
|
696
|
+
{
|
|
697
|
+
"claim": "HLFC-TRANSPORT-TIMEOUT",
|
|
698
|
+
"title": "a bound expiring after the connection exists is reported as a connect failure, so a request herdr may hold is said to have never been written",
|
|
699
|
+
"subject": "pi-extensions/lib/herdr-fresh-call.ts",
|
|
700
|
+
"find": [
|
|
701
|
+
"\t\t\t\t() => settle(connected ? { kind: \"timeout\" } : { kind: \"connect-failed\", code: \"timeout-before-connect\" }),"
|
|
702
|
+
],
|
|
703
|
+
"replace": ["\t\t\t\t() => settle({ kind: \"connect-failed\", code: \"timeout-before-connect\" }),"],
|
|
704
|
+
"gate": ["bash", "run.sh", "check-herdr-fresh-call"],
|
|
705
|
+
"timeoutSeconds": 120,
|
|
706
|
+
"signature": "[QK:HLFC-TRANSPORT-TIMEOUT]",
|
|
707
|
+
"signatureSource": "pi-extensions/lib/herdr-layout-fresh-call.test.ts"
|
|
708
|
+
},
|
|
709
|
+
{
|
|
710
|
+
"claim": "HLFC-PACKET-LITERAL",
|
|
711
|
+
"title": "the layout env drops the PI_SESSION_ID/PI_AGENT_ID scrub, so a pi-durable sibling started by herdr can inherit an identity carrier it does not own",
|
|
712
|
+
"subject": "pi-extensions/lib/herdr-fresh-call.ts",
|
|
713
|
+
"find": ["\tconst env: Record<string, string> = { PI_SESSION_ID: \"\", PI_AGENT_ID: \"\" };"],
|
|
714
|
+
"replace": ["\tconst env: Record<string, string> = {};"],
|
|
715
|
+
"gate": ["bash", "run.sh", "check-herdr-fresh-call"],
|
|
716
|
+
"timeoutSeconds": 120,
|
|
717
|
+
"signature": "[QK:HLFC-PACKET-LITERAL]",
|
|
718
|
+
"signatureSource": "pi-extensions/lib/herdr-layout-fresh-call.test.ts"
|
|
719
|
+
},
|
|
720
|
+
{
|
|
721
|
+
"claim": "HLFC-READ-DIAGNOSTICS",
|
|
722
|
+
"title": "a failed caller-pane read drops herdr's reported cause, so the operator is refused without the transport outcome or herdr error that explains why",
|
|
723
|
+
"subject": "pi-extensions/lib/herdr-fresh-call.ts",
|
|
724
|
+
"find": ["\tif (!read.ok) return { ok: false, reason: read.reason, reported: read.reported };"],
|
|
725
|
+
"replace": ["\tif (!read.ok) return { ok: false, reason: read.reason, reported: {} };"],
|
|
726
|
+
"gate": ["bash", "run.sh", "check-herdr-fresh-call"],
|
|
727
|
+
"timeoutSeconds": 120,
|
|
728
|
+
"signature": "[QK:HLFC-READ-DIAGNOSTICS]",
|
|
729
|
+
"signatureSource": "pi-extensions/lib/herdr-layout-fresh-call.test.ts"
|
|
457
730
|
}
|
|
458
731
|
]
|
|
459
732
|
}
|