@junghanacs/entwurf 0.22.0 → 0.23.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +4 -1
- package/BASELINE.md +1 -0
- package/CHANGELOG.md +514 -0
- package/DELIVERY.md +10 -2
- package/README.md +43 -4
- package/VERIFY.md +47 -0
- package/docs/acp-backend-rail.md +96 -17
- package/docs/setup-clean-host.md +11 -1
- package/mcp/entwurf-bridge/dist/mcp/entwurf-bridge/src/index.js +39 -40
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/backend-adapter.js +2 -2
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/tool-surface.js +2 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/codex-declaration.js +609 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/codex-fresh-preflight.js +95 -56
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-control-rpc.js +40 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-fact-provider.js +6 -2
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-facts.js +7 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-peer-observe.js +67 -2
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-peers-render.js +9 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-self-address.js +24 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-contract.js +2 -2
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-lock.js +1 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/fresh-call-composition.js +423 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/fresh-call-dispatch.js +98 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/herdr-fresh-call.js +1018 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/herdr-placement.js +213 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-fresh-call.js +46 -273
- package/mcp/entwurf-bridge/dist/scripts/peer-facts.js +109 -0
- package/mcp/entwurf-bridge/src/index.ts +41 -41
- package/mcp/entwurf-bridge/tsconfig.build.json +1 -0
- package/package.json +9 -8
- package/pi-extensions/entwurf-control.ts +91 -52
- package/pi-extensions/lib/acp/acp-client.ts +3 -3
- package/pi-extensions/lib/acp/backend-adapter.ts +3 -3
- package/pi-extensions/lib/acp/backend.ts +4 -4
- package/pi-extensions/lib/acp/event-mapper.ts +5 -5
- package/pi-extensions/lib/acp/tool-surface.ts +2 -1
- package/pi-extensions/lib/codex-declaration.js +612 -0
- package/pi-extensions/lib/codex-fresh-preflight.ts +107 -51
- package/pi-extensions/lib/entwurf-control-rpc.ts +46 -0
- package/pi-extensions/lib/entwurf-fact-provider.ts +13 -2
- package/pi-extensions/lib/entwurf-facts.ts +14 -1
- package/pi-extensions/lib/entwurf-peer-observe.ts +72 -2
- package/pi-extensions/lib/entwurf-peers-render.ts +9 -1
- package/pi-extensions/lib/entwurf-self-address.ts +33 -0
- package/pi-extensions/lib/entwurf-v2-contract.ts +2 -2
- package/pi-extensions/lib/entwurf-v2-lock.ts +1 -1
- package/pi-extensions/lib/entwurf-v2-runner.ts +1 -1
- package/pi-extensions/lib/fresh-call-composition.ts +493 -0
- package/pi-extensions/lib/fresh-call-dispatch.ts +142 -0
- package/pi-extensions/lib/herdr-fresh-call.ts +1378 -0
- package/pi-extensions/lib/herdr-placement.ts +276 -0
- package/pi-extensions/lib/mux-fresh-call.ts +95 -301
- package/run.sh +588 -204
- package/scripts/check-acp-usage-accounting.ts +9 -9
- package/scripts/check-codex-birth-hook.ts +187 -0
- package/scripts/check-entwurf-control-rpc.ts +138 -0
- package/scripts/check-entwurf-fact-provider.ts +4 -2
- package/scripts/check-entwurf-peers-surface.ts +3 -1
- package/scripts/check-entwurf-self-address.ts +68 -0
- package/scripts/check-fresh-call-dispatch.ts +301 -0
- package/scripts/check-gate-qualification.ts +17 -4
- package/scripts/check-herdr-activation.ts +1293 -0
- package/scripts/check-herdr-fresh-call.ts +1250 -0
- package/scripts/check-herdr-placement.ts +383 -0
- package/scripts/check-herdr-plugin-build.ts +842 -0
- package/scripts/check-herdr-plugin-profile.ts +371 -0
- package/scripts/check-herdr-plugin.ts +523 -0
- package/scripts/check-herdr-runtime-bootstrap.ts +1264 -0
- package/scripts/check-herdr-sandbox.ts +456 -0
- package/scripts/check-herdr-supply.ts +184 -0
- package/scripts/check-mux-launcher-fence.ts +138 -0
- package/scripts/check-peer-facts.ts +331 -0
- package/scripts/check-pi-launch.ts +358 -0
- package/scripts/check-release-gate-outcomes.ts +19 -0
- package/scripts/check-typing-call-fence.ts +296 -0
- package/scripts/codex-birth-doctor.sh +159 -16
- package/scripts/codex-birth-install.sh +178 -72
- package/scripts/codex-birth-uninstall.sh +162 -7
- package/scripts/fixtures/herdr-supply.json +29 -0
- package/scripts/herdr-activation.mjs +536 -0
- package/scripts/herdr-plugin-activate.mjs +270 -0
- package/scripts/herdr-plugin-deactivate.mjs +193 -0
- package/scripts/herdr-runtime.mjs +1203 -0
- package/scripts/install-herdr-ci.sh +96 -0
- package/scripts/inventory-verification-surface.ts +86 -10
- package/scripts/lib/codex-fresh-live-protocol.ts +2 -2
- package/scripts/lib/tree-digest.ts +97 -0
- package/scripts/meta-bridge-install.sh +19 -2
- package/scripts/meta-bridge-state.py +167 -11
- package/scripts/mutants/codex-caller-seat.json +6 -8
- package/scripts/mutants/codex-native.json +195 -29
- package/scripts/mutants/control-socket-disconnect.json +57 -0
- package/scripts/mutants/fresh-call-dispatch.json +154 -0
- package/scripts/mutants/herdr-activation.json +305 -0
- package/scripts/mutants/herdr-fresh-call.json +448 -0
- package/scripts/mutants/herdr-placement.json +161 -0
- package/scripts/mutants/herdr-plugin-build.json +160 -0
- package/scripts/mutants/herdr-plugin-profile.json +202 -0
- package/scripts/mutants/herdr-plugin.json +133 -0
- package/scripts/mutants/herdr-runtime-bootstrap.json +411 -0
- package/scripts/mutants/herdr-supply.json +133 -0
- package/scripts/mutants/meta-hook-session-switch.json +2 -2
- package/scripts/mutants/mux-fresh-call.json +104 -17
- package/scripts/mutants/mux-launcher-fence.json +13 -0
- package/scripts/mutants/omp-fresh.json +4 -4
- package/scripts/mutants/peer-facts.json +98 -0
- package/scripts/mutants/pi-launch.json +113 -0
- package/scripts/mutants/resume-args.json +6 -6
- package/scripts/mutants/self-address.json +33 -0
- package/scripts/mutants/typing-call-fence.json +17 -0
- package/scripts/mutants/v2-surface.json +2 -2
- package/scripts/mutants/v2-visible-resume.json +17 -17
- package/scripts/peer-facts.ts +120 -0
- package/scripts/register-pi-package.py +8 -0
- package/scripts/register-pi-provider.py +88 -12
- package/scripts/smoke-acp-raw-turn-live.ts +1 -1
- package/scripts/smoke-codex-birth.sh +281 -12
- package/scripts/smoke-entwurf-v2-matrix-live.ts +1 -1
- package/scripts/smoke-herdr-fresh-call-live.ts +1027 -0
- package/scripts/smoke-herdr-plugin-build-live.ts +543 -0
- package/scripts/smoke-herdr-raw-install-live.sh +849 -0
- package/scripts/tsconfig.json +5 -0
- package/scripts/check-entwurf-facts.ts +0 -385
- package/scripts/check-entwurf-resume-args.ts +0 -122
- package/scripts/check-entwurf-v2-decider.ts +0 -657
- package/scripts/check-entwurf-v2-lock.ts +0 -371
- package/scripts/check-entwurf-v2-mailbox.ts +0 -261
- package/scripts/check-entwurf-v2-matrix.ts +0 -401
- package/scripts/check-entwurf-v2-native-push.ts +0 -221
- package/scripts/check-entwurf-v2-release.ts +0 -151
- package/scripts/check-entwurf-v2-runner.ts +0 -448
- package/scripts/check-entwurf-v2-send-fallback.ts +0 -350
- package/scripts/check-entwurf-v2-send.ts +0 -458
- package/scripts/check-entwurf-v2-visible-resume.ts +0 -445
- package/scripts/check-socket-discovery.ts +0 -401
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"lane": "herdr-runtime-bootstrap",
|
|
4
|
+
"mutants": [
|
|
5
|
+
{
|
|
6
|
+
"claim": "HRB-ONE-SHIPPED-OWNER",
|
|
7
|
+
"title": "forking any implementation back into the plugin copy recreates the split this move exists to close: Herdr deletes the checkout on uninstall, so an activation written by the shipped owner would be read back by a plugin-side copy that no longer exists — or worse, by one that does and disagrees",
|
|
8
|
+
"subject": "plugins/herdr/lib/runtime-bootstrap.mjs",
|
|
9
|
+
"find": ["export * from \"../../../scripts/herdr-runtime.mjs\";"],
|
|
10
|
+
"replace": [
|
|
11
|
+
"export * from \"../../../scripts/herdr-runtime.mjs\";",
|
|
12
|
+
"",
|
|
13
|
+
"export const RUNTIME_SCHEMA_VERSION = 2;"
|
|
14
|
+
],
|
|
15
|
+
"gate": ["bash", "run.sh", "check-herdr-runtime-bootstrap"],
|
|
16
|
+
"timeoutSeconds": 300,
|
|
17
|
+
"signature": "[QK:HRB-ONE-SHIPPED-OWNER]",
|
|
18
|
+
"signatureSource": "scripts/check-herdr-runtime-bootstrap.ts"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"claim": "HRB-STABLE-ADDRESS",
|
|
22
|
+
"title": "making the active address a symlink is the candidate #116 rejected by name: the scoped wiring records absolute commands under this root and Pi records the owner root it was wired with, so a link whose canonicalisation lands in a per-version directory turns every upgrade into a different owner taking that root over",
|
|
23
|
+
"subject": "scripts/herdr-runtime.mjs",
|
|
24
|
+
"find": ["\t\tfs.renameSync(layout.stagingDir, layout.activeDir);"],
|
|
25
|
+
"replace": ["\t\tfs.symlinkSync(layout.stagingDir, layout.activeDir);"],
|
|
26
|
+
"gate": ["bash", "run.sh", "check-herdr-runtime-bootstrap"],
|
|
27
|
+
"timeoutSeconds": 240,
|
|
28
|
+
"signature": "[QK:HRB-STABLE-ADDRESS]",
|
|
29
|
+
"signatureSource": "scripts/check-herdr-runtime-bootstrap.ts"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"claim": "HRB-PRE-MUTATION-ORDER",
|
|
33
|
+
"title": "creating the runtime root before ownership is decided answers 'is this ours?' with this module's own footprint — every later ownership question on that host is then answered by a directory we made while refusing to act",
|
|
34
|
+
"subject": "scripts/herdr-runtime.mjs",
|
|
35
|
+
"find": [
|
|
36
|
+
"\tconst layout = resolveRuntimeLayout(env);",
|
|
37
|
+
"",
|
|
38
|
+
"\t// PRE-MUTATION, and that word is literal: not one directory is created before ownership and the"
|
|
39
|
+
],
|
|
40
|
+
"replace": [
|
|
41
|
+
"\tconst layout = resolveRuntimeLayout(env);",
|
|
42
|
+
"\tfs.mkdirSync(layout.runtimeRoot, { recursive: true });",
|
|
43
|
+
"",
|
|
44
|
+
"\t// PRE-MUTATION, and that word is literal: not one directory is created before ownership and the"
|
|
45
|
+
],
|
|
46
|
+
"gate": ["bash", "run.sh", "check-herdr-runtime-bootstrap"],
|
|
47
|
+
"timeoutSeconds": 300,
|
|
48
|
+
"signature": "[QK:HRB-PRE-MUTATION-ORDER]",
|
|
49
|
+
"signatureSource": "scripts/check-herdr-runtime-bootstrap.ts"
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"claim": "HRB-PATH-KIND-LSTAT",
|
|
53
|
+
"title": "classifying with a link-following stat makes a dangling symlink read as absent and a link into somebody else's tree read as a directory we may rename — the two shapes a hostile or half-removed host actually presents",
|
|
54
|
+
"subject": "scripts/herdr-runtime.mjs",
|
|
55
|
+
"find": ["\tconst stat = fs.lstatSync(target, { throwIfNoEntry: false });"],
|
|
56
|
+
"replace": ["\tconst stat = fs.statSync(target, { throwIfNoEntry: false });"],
|
|
57
|
+
"gate": ["bash", "run.sh", "check-herdr-runtime-bootstrap"],
|
|
58
|
+
"timeoutSeconds": 300,
|
|
59
|
+
"signature": "[QK:HRB-PATH-KIND-LSTAT]",
|
|
60
|
+
"signatureSource": "scripts/check-herdr-runtime-bootstrap.ts"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"claim": "HRB-EXACT-ARTIFACT",
|
|
64
|
+
"title": "accepting any version whose NAME matches unpins the supply chain — the runtime a clean host ends up with becomes whatever the registry served, and the journal's provenance line then records a version nobody verified",
|
|
65
|
+
"subject": "scripts/herdr-runtime.mjs",
|
|
66
|
+
"find": ["\tif (seen.version !== spec.version) {"],
|
|
67
|
+
"replace": ["\tif (false) {"],
|
|
68
|
+
"gate": ["bash", "run.sh", "check-herdr-runtime-bootstrap"],
|
|
69
|
+
"timeoutSeconds": 240,
|
|
70
|
+
"signature": "[QK:HRB-EXACT-ARTIFACT]",
|
|
71
|
+
"signatureSource": "scripts/check-herdr-runtime-bootstrap.ts"
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"claim": "HRB-RUNTIME-COMPLETE",
|
|
75
|
+
"title": "skipping the required-bin check calls a tree ready that the scoped wiring above cannot actually invoke: the install runs with --ignore-scripts, so a missing or non-executable bin is exactly the shape that survives an install nobody chmod'd, and the harness command configured against it simply does not run",
|
|
76
|
+
"subject": "scripts/herdr-runtime.mjs",
|
|
77
|
+
"find": [
|
|
78
|
+
"\tfor (const name of REQUIRED_BINS) {",
|
|
79
|
+
"\t\tconst bin = path.join(prefix, \"node_modules\", \".bin\", name);",
|
|
80
|
+
"\t\ttry {",
|
|
81
|
+
"\t\t\tfs.accessSync(bin, fs.constants.X_OK);",
|
|
82
|
+
"\t\t} catch (err) {",
|
|
83
|
+
"\t\t\treturn { ok: false, code: \"runtime-required-bin-missing\", detail: `${bin}: ${err.message}` };",
|
|
84
|
+
"\t\t}",
|
|
85
|
+
"\t}"
|
|
86
|
+
],
|
|
87
|
+
"replace": ["\tfor (const name of REQUIRED_BINS) void name;"],
|
|
88
|
+
"gate": ["bash", "run.sh", "check-herdr-runtime-bootstrap"],
|
|
89
|
+
"timeoutSeconds": 240,
|
|
90
|
+
"signature": "[QK:HRB-RUNTIME-COMPLETE]",
|
|
91
|
+
"signatureSource": "scripts/check-herdr-runtime-bootstrap.ts"
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"claim": "HRB-LOCK-SHAPE-NAMED",
|
|
95
|
+
"title": "reading `.schemaVersion` off whatever JSON.parse returned leaks a native TypeError with no code when the lock is a bare null — an unnamed crash on the ONE file that says which package gets installed, where the contract promises a named refusal",
|
|
96
|
+
"subject": "scripts/herdr-runtime.mjs",
|
|
97
|
+
"find": [
|
|
98
|
+
"\tif (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed)) {",
|
|
99
|
+
"\t\tthrow new RuntimeBootstrapError(",
|
|
100
|
+
"\t\t\t\"runtime-lock-unreadable\","
|
|
101
|
+
],
|
|
102
|
+
"replace": ["\tif (false) {", "\t\tthrow new RuntimeBootstrapError(", "\t\t\t\"runtime-lock-unreadable\","],
|
|
103
|
+
"gate": ["bash", "run.sh", "check-herdr-runtime-bootstrap"],
|
|
104
|
+
"timeoutSeconds": 300,
|
|
105
|
+
"signature": "[QK:HRB-LOCK-SHAPE-NAMED]",
|
|
106
|
+
"signatureSource": "scripts/check-herdr-runtime-bootstrap.ts"
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"claim": "HRB-ARTIFACT-LOCK",
|
|
110
|
+
"title": "letting the lock and the checkout disagree installs a version nobody in this repository reviewed — the lock is the only place the published integrity lives, so a lock that has drifted is an integrity check performed against the wrong artifact",
|
|
111
|
+
"subject": "scripts/herdr-runtime.mjs",
|
|
112
|
+
"find": ["\tif (lock.name !== checkoutSpec.name || lock.version !== checkoutSpec.version) {"],
|
|
113
|
+
"replace": ["\tif (false) {"],
|
|
114
|
+
"gate": ["bash", "run.sh", "check-herdr-runtime-bootstrap"],
|
|
115
|
+
"timeoutSeconds": 240,
|
|
116
|
+
"signature": "[QK:HRB-ARTIFACT-LOCK]",
|
|
117
|
+
"signatureSource": "scripts/check-herdr-runtime-bootstrap.ts"
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"claim": "HRB-OWNED-NPM-CACHE",
|
|
121
|
+
"title": "letting an inherited npm cache setting win writes megabytes into the operator's default cache on behalf of a plugin install they typed one command for, and no inverse can afterwards tell those bytes from the operator's own",
|
|
122
|
+
"subject": "scripts/herdr-runtime.mjs",
|
|
123
|
+
"find": ["\t\tnpm_config_cache: cacheDir,"],
|
|
124
|
+
"replace": ["\t\tnpm_config_cache: env.npm_config_cache ?? cacheDir,"],
|
|
125
|
+
"gate": ["bash", "run.sh", "check-herdr-runtime-bootstrap"],
|
|
126
|
+
"timeoutSeconds": 240,
|
|
127
|
+
"signature": "[QK:HRB-OWNED-NPM-CACHE]",
|
|
128
|
+
"signatureSource": "scripts/check-herdr-runtime-bootstrap.ts"
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"claim": "HRB-INSTALL-SCRIPTS-OFF",
|
|
132
|
+
"title": "dropping --ignore-scripts runs a package's arbitrary postinstall hook inside the HOME of a Herdr user who never saw an npm prompt to decline — the plugin install is the only consent that was given, and it was not consent to execute install hooks",
|
|
133
|
+
"subject": "scripts/herdr-runtime.mjs",
|
|
134
|
+
"find": ["\t\t\"--ignore-scripts\","],
|
|
135
|
+
"replace": ["\t\t\"--no-package-lock\","],
|
|
136
|
+
"gate": ["bash", "run.sh", "check-herdr-runtime-bootstrap"],
|
|
137
|
+
"timeoutSeconds": 240,
|
|
138
|
+
"signature": "[QK:HRB-INSTALL-SCRIPTS-OFF]",
|
|
139
|
+
"signatureSource": "scripts/check-herdr-runtime-bootstrap.ts"
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
"claim": "HRB-OWNER-STATE-CERTIFIED",
|
|
143
|
+
"title": "renaming away a directory at our address with no certified journal behind it destroys files this module cannot prove are its own — a fresh host, a half-removed install and a stranger's directory are indistinguishable from the path alone, and the journal is the only thing that tells them apart",
|
|
144
|
+
"subject": "scripts/herdr-runtime.mjs",
|
|
145
|
+
"find": [
|
|
146
|
+
"\tif (assessed.state === \"unowned-residue\") {",
|
|
147
|
+
"\t\tthrow new RuntimeBootstrapError(",
|
|
148
|
+
"\t\t\t\"runtime-owner-state-missing\","
|
|
149
|
+
],
|
|
150
|
+
"replace": ["\tif (false) {", "\t\tthrow new RuntimeBootstrapError(", "\t\t\t\"runtime-owner-state-missing\","],
|
|
151
|
+
"gate": ["bash", "run.sh", "check-herdr-runtime-bootstrap"],
|
|
152
|
+
"timeoutSeconds": 240,
|
|
153
|
+
"signature": "[QK:HRB-OWNER-STATE-CERTIFIED]",
|
|
154
|
+
"signatureSource": "scripts/check-herdr-runtime-bootstrap.ts"
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
"claim": "HRB-JOURNAL-SHAPE-CERTIFIED",
|
|
158
|
+
"title": "`JSON.parse` returning something is not the same as a journal: a bare null, an array or a scalar reaches the key checks as an object-shaped value and what it grants is authority to delete a user's directories",
|
|
159
|
+
"subject": "scripts/herdr-runtime.mjs",
|
|
160
|
+
"find": [
|
|
161
|
+
"\tif (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed)) {",
|
|
162
|
+
"\t\tthrow new RuntimeBootstrapError(",
|
|
163
|
+
"\t\t\t\"runtime-journal-uncertified\","
|
|
164
|
+
],
|
|
165
|
+
"replace": ["\tif (false) {", "\t\tthrow new RuntimeBootstrapError(", "\t\t\t\"runtime-journal-uncertified\","],
|
|
166
|
+
"gate": ["bash", "run.sh", "check-herdr-runtime-bootstrap"],
|
|
167
|
+
"timeoutSeconds": 300,
|
|
168
|
+
"signature": "[QK:HRB-JOURNAL-SHAPE-CERTIFIED]",
|
|
169
|
+
"signatureSource": "scripts/check-herdr-runtime-bootstrap.ts"
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"claim": "HRB-FAILED-CANDIDATE-PRESERVES-ACTIVE",
|
|
173
|
+
"title": "clearing the active directory when a CANDIDATE fails verification destroys a working runtime on behalf of an upgrade that never arrived — the host is left with its wiring pointing at an emptied address, strictly worse than the old version it was replacing",
|
|
174
|
+
"subject": "scripts/herdr-runtime.mjs",
|
|
175
|
+
"find": ["\t\tremoveTree(layout.cacheDir);", "\t\tthrow err;"],
|
|
176
|
+
"replace": ["\t\tremoveTree(layout.cacheDir);", "\t\tremoveTree(layout.activeDir);", "\t\tthrow err;"],
|
|
177
|
+
"gate": ["bash", "run.sh", "check-herdr-runtime-bootstrap"],
|
|
178
|
+
"timeoutSeconds": 240,
|
|
179
|
+
"signature": "[QK:HRB-FAILED-CANDIDATE-PRESERVES-ACTIVE]",
|
|
180
|
+
"signatureSource": "scripts/check-herdr-runtime-bootstrap.ts"
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
"claim": "HRB-LAST-GOOD-NEVER-LOST",
|
|
184
|
+
"title": "deleting the backup because a sibling directory merely exists is how a corrupt active plus a good previous ends with zero usable runtimes — measured on the first cut of this module: it dropped the backup, then failed to acquire a candidate, and the address the wiring names held nothing",
|
|
185
|
+
"subject": "scripts/herdr-runtime.mjs",
|
|
186
|
+
"find": [
|
|
187
|
+
"\t\t\tif (inspectInstalledRuntime(layout.activeDir, activePackageName(certified)).ok) {",
|
|
188
|
+
"\t\t\t\tremoveTree(layout.previousDir);",
|
|
189
|
+
"\t\t\t\trecovered = \"stale-backup\";",
|
|
190
|
+
"\t\t\t} else {"
|
|
191
|
+
],
|
|
192
|
+
"replace": [
|
|
193
|
+
"\t\t\tif (true) {",
|
|
194
|
+
"\t\t\t\tremoveTree(layout.previousDir);",
|
|
195
|
+
"\t\t\t\trecovered = \"stale-backup\";",
|
|
196
|
+
"\t\t\t} else {"
|
|
197
|
+
],
|
|
198
|
+
"gate": ["bash", "run.sh", "check-herdr-runtime-bootstrap"],
|
|
199
|
+
"timeoutSeconds": 300,
|
|
200
|
+
"signature": "[QK:HRB-LAST-GOOD-NEVER-LOST]",
|
|
201
|
+
"signatureSource": "scripts/check-herdr-runtime-bootstrap.ts"
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
"claim": "HRB-ALL-STATES-NAMED",
|
|
205
|
+
"title": "collapsing two presence combinations into one name is a branch nobody decided: the leftover candidate beside a restored backup is handled as if it were not there, which is how a half-written tree survives into the next run",
|
|
206
|
+
"subject": "scripts/herdr-runtime.mjs",
|
|
207
|
+
"find": [
|
|
208
|
+
"\tif (!active && staging && previous) return Object.freeze({ state: \"torn-swap-with-candidate\", ...facts });"
|
|
209
|
+
],
|
|
210
|
+
"replace": ["\tif (!active && staging && previous) return Object.freeze({ state: \"torn-swap\", ...facts });"],
|
|
211
|
+
"gate": ["bash", "run.sh", "check-herdr-runtime-bootstrap"],
|
|
212
|
+
"timeoutSeconds": 300,
|
|
213
|
+
"signature": "[QK:HRB-ALL-STATES-NAMED]",
|
|
214
|
+
"signatureSource": "scripts/check-herdr-runtime-bootstrap.ts"
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
"claim": "HRB-PROVENANCE-CARRIED",
|
|
218
|
+
"title": "overwriting the finished runtime's provenance when the installing entry is written leaves a host that dies mid-install holding a backup directory and no statement of what is in it — recoverable bytes with unrecoverable provenance",
|
|
219
|
+
"subject": "scripts/herdr-runtime.mjs",
|
|
220
|
+
"find": ["\t\tpreviousRuntime: carried,"],
|
|
221
|
+
"replace": ["\t\tpreviousRuntime: null,"],
|
|
222
|
+
"gate": ["bash", "run.sh", "check-herdr-runtime-bootstrap"],
|
|
223
|
+
"timeoutSeconds": 300,
|
|
224
|
+
"signature": "[QK:HRB-PROVENANCE-CARRIED]",
|
|
225
|
+
"signatureSource": "scripts/check-herdr-runtime-bootstrap.ts"
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
"claim": "HRB-IDEMPOTENT-REINSTALL",
|
|
229
|
+
"title": "failing to recognise an already-correct runtime makes Herdr's own reinstall — the explicit refresh trigger this product depends on — re-download and re-swap every time, so the routine safe operation becomes the expensive and risky one",
|
|
230
|
+
"subject": "scripts/herdr-runtime.mjs",
|
|
231
|
+
"find": ["\t\tcertified.phase === \"runtime-ready\" &&"],
|
|
232
|
+
"replace": ["\t\tcertified.phase === \"installing\" &&"],
|
|
233
|
+
"gate": ["bash", "run.sh", "check-herdr-runtime-bootstrap"],
|
|
234
|
+
"timeoutSeconds": 240,
|
|
235
|
+
"signature": "[QK:HRB-IDEMPOTENT-REINSTALL]",
|
|
236
|
+
"signatureSource": "scripts/check-herdr-runtime-bootstrap.ts"
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
"claim": "HRB-JOURNAL-MUST-MATCH-DISK",
|
|
240
|
+
"title": "believing the journal without re-verifying the tree turns one damaged install into a permanent one: the record says runtime-ready, the bytes are gone or wrong, and every later install agrees there is nothing to do",
|
|
241
|
+
"subject": "scripts/herdr-runtime.mjs",
|
|
242
|
+
"find": [
|
|
243
|
+
"\t\ttry {",
|
|
244
|
+
"\t\t\tverifyInstalledRuntime(layout.activeDir, artifactCompleteness(certified.artifactIdentity));",
|
|
245
|
+
"\t\t\treturn Object.freeze({ phase: \"runtime-ready\", changed: false, recovered, journal: certified });"
|
|
246
|
+
],
|
|
247
|
+
"replace": [
|
|
248
|
+
"\t\ttry {",
|
|
249
|
+
"\t\t\treturn Object.freeze({ phase: \"runtime-ready\", changed: false, recovered, journal: certified });"
|
|
250
|
+
],
|
|
251
|
+
"gate": ["bash", "run.sh", "check-herdr-runtime-bootstrap"],
|
|
252
|
+
"timeoutSeconds": 240,
|
|
253
|
+
"signature": "[QK:HRB-JOURNAL-MUST-MATCH-DISK]",
|
|
254
|
+
"signatureSource": "scripts/check-herdr-runtime-bootstrap.ts"
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
"claim": "HRB-INVERSE-STATE-BACKED",
|
|
258
|
+
"title": "an inverse that walks past an address it cannot prove is its own will happily delete a stranger's directory — Herdr has no cleanup hook (measured: the plugin manifest has six sections, none an uninstall), so this is the only inverse that will ever run and there is no second chance to notice",
|
|
259
|
+
"subject": "scripts/herdr-runtime.mjs",
|
|
260
|
+
"find": ["\tif (certified === null) {", "\t\tif (assessed.state === \"unowned-residue\") {"],
|
|
261
|
+
"replace": ["\tif (certified === null) {", "\t\tif (false) {"],
|
|
262
|
+
"gate": ["bash", "run.sh", "check-herdr-runtime-bootstrap"],
|
|
263
|
+
"timeoutSeconds": 240,
|
|
264
|
+
"signature": "[QK:HRB-INVERSE-STATE-BACKED]",
|
|
265
|
+
"signatureSource": "scripts/check-herdr-runtime-bootstrap.ts"
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
"claim": "HRB-NO-HERDR-CLAIM",
|
|
269
|
+
"title": "giving this module a phase that claims Herdr installed the plugin records a step that had not run: [[build]] finishes BEFORE Herdr re-reads the manifest, swaps its checkout and registers, so the next install would reconcile against a state nobody observed",
|
|
270
|
+
"subject": "scripts/herdr-runtime.mjs",
|
|
271
|
+
"find": ["export const JOURNAL_PHASES = Object.freeze([\"installing\", \"runtime-ready\", \"removing\"]);"],
|
|
272
|
+
"replace": [
|
|
273
|
+
"export const JOURNAL_PHASES = Object.freeze([\"installing\", \"runtime-ready\", \"removing\", \"herdr-installed\"]);"
|
|
274
|
+
],
|
|
275
|
+
"gate": ["bash", "run.sh", "check-herdr-runtime-bootstrap"],
|
|
276
|
+
"timeoutSeconds": 240,
|
|
277
|
+
"signature": "[QK:HRB-NO-HERDR-CLAIM]",
|
|
278
|
+
"signatureSource": "scripts/check-herdr-runtime-bootstrap.ts"
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
"claim": "HRB-LOCK-SOURCE-CLOSED",
|
|
282
|
+
"title": "defaulting an unknown or absent `source` instead of refusing it lets whoever edits a lock — or ships a v1 one — choose the acquisition authority silently, which is the one decision this discriminant exists to keep committed",
|
|
283
|
+
"subject": "scripts/herdr-runtime.mjs",
|
|
284
|
+
"find": ["\tif (!ARTIFACT_KINDS.includes(parsed.source)) {"],
|
|
285
|
+
"replace": ["\tif (false && !ARTIFACT_KINDS.includes(parsed.source)) {"],
|
|
286
|
+
"gate": ["bash", "run.sh", "check-herdr-runtime-bootstrap"],
|
|
287
|
+
"timeoutSeconds": 300,
|
|
288
|
+
"signature": "[QK:HRB-LOCK-SOURCE-CLOSED]",
|
|
289
|
+
"signatureSource": "scripts/check-herdr-runtime-bootstrap.ts"
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
"claim": "HRB-CHECKOUT-REPO-LITERAL",
|
|
293
|
+
"title": "accepting any repository inside the identity certifier means a journal or ledger naming a foreign tree is believed on re-read — a strange source becomes ours by transcription, which is how a record-based authority gets laundered",
|
|
294
|
+
"subject": "scripts/herdr-runtime.mjs",
|
|
295
|
+
"find": ["\t\tif (value.repository !== CHECKOUT_REPOSITORY) {"],
|
|
296
|
+
"replace": ["\t\tif (false && value.repository !== CHECKOUT_REPOSITORY) {"],
|
|
297
|
+
"gate": ["bash", "run.sh", "check-herdr-runtime-bootstrap"],
|
|
298
|
+
"timeoutSeconds": 300,
|
|
299
|
+
"signature": "[QK:HRB-CHECKOUT-REPO-LITERAL]",
|
|
300
|
+
"signatureSource": "scripts/check-herdr-runtime-bootstrap.ts"
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
"claim": "HRB-ARTIFACT-IDENTITY-EXACT",
|
|
304
|
+
"title": "accepting either stage wherever an identity is read makes a ready-shaped `installing` entry legal — an observation nobody made — and lets a requested-shaped ready entry name a runtime whose bytes were never looked at",
|
|
305
|
+
"subject": "scripts/herdr-runtime.mjs",
|
|
306
|
+
"find": ["\tconst shapes = stage === \"either\" ? [\"requested\", \"ready\"] : [stage];"],
|
|
307
|
+
"replace": ["\tconst shapes = [\"requested\", \"ready\"];"],
|
|
308
|
+
"gate": ["bash", "run.sh", "check-herdr-runtime-bootstrap"],
|
|
309
|
+
"timeoutSeconds": 300,
|
|
310
|
+
"signature": "[QK:HRB-ARTIFACT-IDENTITY-EXACT]",
|
|
311
|
+
"signatureSource": "scripts/check-herdr-runtime-bootstrap.ts"
|
|
312
|
+
},
|
|
313
|
+
{
|
|
314
|
+
"claim": "HRB-IDENTITY-COMMIT-DECIDES",
|
|
315
|
+
"title": "dropping the commit from the checkout comparison makes a stale candidate satisfy a request for a new one — two commits can both call themselves 0.21.0, so the host keeps serving the old artifact while every receipt above it names the new",
|
|
316
|
+
"subject": "scripts/herdr-runtime.mjs",
|
|
317
|
+
"find": ["\treturn ready.repository === requested.repository && ready.commit === requested.commit;"],
|
|
318
|
+
"replace": ["\treturn ready.repository === requested.repository;"],
|
|
319
|
+
"gate": ["bash", "run.sh", "check-herdr-runtime-bootstrap"],
|
|
320
|
+
"timeoutSeconds": 300,
|
|
321
|
+
"signature": "[QK:HRB-IDENTITY-COMMIT-DECIDES]",
|
|
322
|
+
"signatureSource": "scripts/check-herdr-runtime-bootstrap.ts"
|
|
323
|
+
},
|
|
324
|
+
{
|
|
325
|
+
"claim": "HRB-CHECKOUT-COMMIT-CANONICAL",
|
|
326
|
+
"title": "accepting whatever `rev-parse` printed lets an abbreviated sha, an empty line or a git error message become the anchor a candidate is identified by, and an anchor that is not a full commit identifies nothing",
|
|
327
|
+
"subject": "scripts/herdr-runtime.mjs",
|
|
328
|
+
"find": ["\tif (!COMMIT_SHA.test(commit)) {"],
|
|
329
|
+
"replace": ["\tif (false && !COMMIT_SHA.test(commit)) {"],
|
|
330
|
+
"gate": ["bash", "run.sh", "check-herdr-runtime-bootstrap"],
|
|
331
|
+
"timeoutSeconds": 300,
|
|
332
|
+
"signature": "[QK:HRB-CHECKOUT-COMMIT-CANONICAL]",
|
|
333
|
+
"signatureSource": "scripts/check-herdr-runtime-bootstrap.ts"
|
|
334
|
+
},
|
|
335
|
+
{
|
|
336
|
+
"claim": "HRB-CHECKOUT-ARGV-FIXED",
|
|
337
|
+
"title": "adding `--ignore-scripts` to the PACK skips `prepare`, so the tarball arrives with no compiled bridge — the exact footgun measured on npm 11.16.0, where only the git-spec form builds and the directory form needs a global pnpm",
|
|
338
|
+
"subject": "scripts/herdr-runtime.mjs",
|
|
339
|
+
"find": ["\t\t`${buildCheckoutRemote(identity.repository)}#${identity.commit}`,", "\t\t\"--json\","],
|
|
340
|
+
"replace": [
|
|
341
|
+
"\t\t`${buildCheckoutRemote(identity.repository)}#${identity.commit}`,",
|
|
342
|
+
"\t\t\"--ignore-scripts\",",
|
|
343
|
+
"\t\t\"--json\","
|
|
344
|
+
],
|
|
345
|
+
"gate": ["bash", "run.sh", "check-herdr-runtime-bootstrap"],
|
|
346
|
+
"timeoutSeconds": 300,
|
|
347
|
+
"signature": "[QK:HRB-CHECKOUT-ARGV-FIXED]",
|
|
348
|
+
"signatureSource": "scripts/check-herdr-runtime-bootstrap.ts"
|
|
349
|
+
},
|
|
350
|
+
{
|
|
351
|
+
"claim": "HRB-SOURCE-UNAVAILABLE-NAMED",
|
|
352
|
+
"title": "collapsing a remote that cannot serve the commit into the generic acquire failure erases the one distinction an operator needs: this candidate does not exist at that source, and no other artifact may stand in for it",
|
|
353
|
+
"subject": "scripts/herdr-runtime.mjs",
|
|
354
|
+
"find": ["\t\t\t\"runtime-checkout-source-unavailable\","],
|
|
355
|
+
"replace": ["\t\t\t\"runtime-acquire-failed\","],
|
|
356
|
+
"gate": ["bash", "run.sh", "check-herdr-runtime-bootstrap"],
|
|
357
|
+
"timeoutSeconds": 300,
|
|
358
|
+
"signature": "[QK:HRB-SOURCE-UNAVAILABLE-NAMED]",
|
|
359
|
+
"signatureSource": "scripts/check-herdr-runtime-bootstrap.ts"
|
|
360
|
+
},
|
|
361
|
+
{
|
|
362
|
+
"claim": "HRB-CACHE-UNOWNED-REFUSED",
|
|
363
|
+
"title": "adopting a cache directory with no journal behind it makes this module's first act on a strange host the deletion of a tree it cannot prove it wrote",
|
|
364
|
+
"subject": "scripts/herdr-runtime.mjs",
|
|
365
|
+
"find": [
|
|
366
|
+
"\t\tif (kinds.cache !== \"absent\") return Object.freeze({ state: \"unowned-cache-residue\", ...facts });"
|
|
367
|
+
],
|
|
368
|
+
"replace": ["\t\tif (false) return Object.freeze({ state: \"unowned-cache-residue\", ...facts });"],
|
|
369
|
+
"gate": ["bash", "run.sh", "check-herdr-runtime-bootstrap"],
|
|
370
|
+
"timeoutSeconds": 300,
|
|
371
|
+
"signature": "[QK:HRB-CACHE-UNOWNED-REFUSED]",
|
|
372
|
+
"signatureSource": "scripts/check-herdr-runtime-bootstrap.ts"
|
|
373
|
+
},
|
|
374
|
+
{
|
|
375
|
+
"claim": "HRB-CACHE-FAILED-ACQUIRE-RECLAIMED",
|
|
376
|
+
"title": "leaving a half-fetched tarball in our own cache after a failed acquisition is what a retry then trips over — and the transaction that wrote those bytes is the only one that can prove they are ours to remove",
|
|
377
|
+
"subject": "scripts/herdr-runtime.mjs",
|
|
378
|
+
"find": [
|
|
379
|
+
"\t\t// cache entry may be incomplete, and OUR cache is the only place this transaction wrote.",
|
|
380
|
+
"\t\tremoveTree(layout.cacheDir);"
|
|
381
|
+
],
|
|
382
|
+
"replace": ["\t\t// cache entry may be incomplete, and OUR cache is the only place this transaction wrote."],
|
|
383
|
+
"gate": ["bash", "run.sh", "check-herdr-runtime-bootstrap"],
|
|
384
|
+
"timeoutSeconds": 300,
|
|
385
|
+
"signature": "[QK:HRB-CACHE-FAILED-ACQUIRE-RECLAIMED]",
|
|
386
|
+
"signatureSource": "scripts/check-herdr-runtime-bootstrap.ts"
|
|
387
|
+
},
|
|
388
|
+
{
|
|
389
|
+
"claim": "HRB-INVERSE-CACHE-UNOWNED",
|
|
390
|
+
"title": "letting the inverse report success over a journal-less cache makes the two sides of one ownership fact disagree — the forward path refuses that exact state, and the side that shrugs is the one that eventually deletes what the careful side would not",
|
|
391
|
+
"subject": "scripts/herdr-runtime.mjs",
|
|
392
|
+
"find": ["\t\tif (assessed.state === \"unowned-cache-residue\") {"],
|
|
393
|
+
"replace": ["\t\tif (false && assessed.state === \"unowned-cache-residue\") {"],
|
|
394
|
+
"gate": ["bash", "run.sh", "check-herdr-runtime-bootstrap"],
|
|
395
|
+
"timeoutSeconds": 300,
|
|
396
|
+
"signature": "[QK:HRB-INVERSE-CACHE-UNOWNED]",
|
|
397
|
+
"signatureSource": "scripts/check-herdr-runtime-bootstrap.ts"
|
|
398
|
+
},
|
|
399
|
+
{
|
|
400
|
+
"claim": "HRB-PREPARE-STDOUT-CLEAN",
|
|
401
|
+
"title": "silencing stderr instead of stdout is the exact byte that broke the first clean-host install: husky writes `.git can't be found` to STDOUT when npm packs our GitHub git spec (no `.git` in a codeload tarball), npm merges that line into `npm pack --json`, and a perfectly good artifact is refused as `runtime-checkout-source-unavailable` — invisible to both the fake-npm cells here and to the LIVE gate, whose `insteadOf` mirror is cloned and therefore HAS a `.git`",
|
|
402
|
+
"subject": "package.json",
|
|
403
|
+
"find": ["\t\t\"prepare\": \"husky 1>&2 || true; npm run --silent build-bridge 1>&2\","],
|
|
404
|
+
"replace": ["\t\t\"prepare\": \"husky 2>/dev/null || true; npm run --silent build-bridge\","],
|
|
405
|
+
"gate": ["bash", "run.sh", "check-herdr-runtime-bootstrap"],
|
|
406
|
+
"timeoutSeconds": 300,
|
|
407
|
+
"signature": "[QK:HRB-PREPARE-STDOUT-CLEAN]",
|
|
408
|
+
"signatureSource": "scripts/check-herdr-runtime-bootstrap.ts"
|
|
409
|
+
}
|
|
410
|
+
]
|
|
411
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"lane": "herdr-supply",
|
|
4
|
+
"mutants": [
|
|
5
|
+
{
|
|
6
|
+
"claim": "HSUP-MANIFEST-SSOT",
|
|
7
|
+
"title": "a second copy of the pinned version appears in the sandbox gate, so an installed version and an expected version can drift apart with nobody watching",
|
|
8
|
+
"subject": "scripts/check-herdr-sandbox.ts",
|
|
9
|
+
"find": ["const SUPPLY_MANIFEST = \"scripts/fixtures/herdr-supply.json\";"],
|
|
10
|
+
"replace": [
|
|
11
|
+
"const SUPPLY_MANIFEST = \"scripts/fixtures/herdr-supply.json\";\nconst PINNED_FALLBACK = \"0.9.1\";\nvoid PINNED_FALLBACK;"
|
|
12
|
+
],
|
|
13
|
+
"gate": ["bash", "run.sh", "check-herdr-supply"],
|
|
14
|
+
"timeoutSeconds": 120,
|
|
15
|
+
"signature": "[QK:HSUP-MANIFEST-SSOT]",
|
|
16
|
+
"signatureSource": "scripts/check-herdr-supply.ts"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"claim": "HSUP-DIGEST-SHAPE",
|
|
20
|
+
"title": "a pinned digest is truncated, so the check that is supposed to catch a swapped binary can no longer fail",
|
|
21
|
+
"subject": "scripts/fixtures/herdr-supply.json",
|
|
22
|
+
"find": ["\"sha256\": \"2a02fed16beb651ef006e1d43f048f652ca4dc58ad053cd2d44450563d5c54b7\""],
|
|
23
|
+
"replace": ["\"sha256\": \"2a02fed16beb651ef006e1d43f04\""],
|
|
24
|
+
"gate": ["bash", "run.sh", "check-herdr-supply"],
|
|
25
|
+
"timeoutSeconds": 120,
|
|
26
|
+
"signature": "[QK:HSUP-DIGEST-SHAPE]",
|
|
27
|
+
"signatureSource": "scripts/check-herdr-supply.ts"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"claim": "HSUP-ARCH-FAIL-CLOSED",
|
|
31
|
+
"title": "an unmeasured architecture silently receives the x86_64 binary instead of a refusal",
|
|
32
|
+
"subject": "scripts/install-herdr-ci.sh",
|
|
33
|
+
"find": ["\t\tif (!asset) {"],
|
|
34
|
+
"replace": ["\t\tif (false) {"],
|
|
35
|
+
"gate": ["bash", "run.sh", "check-herdr-supply"],
|
|
36
|
+
"timeoutSeconds": 120,
|
|
37
|
+
"signature": "[QK:HSUP-ARCH-FAIL-CLOSED]",
|
|
38
|
+
"signatureSource": "scripts/check-herdr-supply.ts"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"claim": "HSUP-VERIFY-BEFORE-CHMOD",
|
|
42
|
+
"title": "the downloaded file is made executable BEFORE its digest is checked, so a byte nobody chose becomes runnable first",
|
|
43
|
+
"subject": "scripts/install-herdr-ci.sh",
|
|
44
|
+
"find": ["actual_sha=\"$(sha256sum \"$target\" | cut -d' ' -f1)\""],
|
|
45
|
+
"replace": ["chmod +x \"$target\"\nactual_sha=\"$(sha256sum \"$target\" | cut -d' ' -f1)\""],
|
|
46
|
+
"gate": ["bash", "run.sh", "check-herdr-supply"],
|
|
47
|
+
"timeoutSeconds": 120,
|
|
48
|
+
"signature": "[QK:HSUP-VERIFY-BEFORE-CHMOD]",
|
|
49
|
+
"signatureSource": "scripts/check-herdr-supply.ts"
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"claim": "HSUP-NO-MUTABLE-SUPPLY",
|
|
53
|
+
"title": "the installer falls back to the upstream curl-pipe, which pins no version and verifies no digest",
|
|
54
|
+
"subject": "scripts/install-herdr-ci.sh",
|
|
55
|
+
"find": ["curl -fsSL --retry 3 --retry-delay 2 -o \"$target\" \"$url\" || fail \"download failed: ${url}\""],
|
|
56
|
+
"replace": ["curl -fsSL https://herdr.dev/install.sh | sh || fail \"download failed: ${url}\""],
|
|
57
|
+
"gate": ["bash", "run.sh", "check-herdr-supply"],
|
|
58
|
+
"timeoutSeconds": 120,
|
|
59
|
+
"signature": "[QK:HSUP-NO-MUTABLE-SUPPLY]",
|
|
60
|
+
"signatureSource": "scripts/check-herdr-supply.ts"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"claim": "HSUP-NO-ATTESTATION-CLI",
|
|
64
|
+
"title": "the installer starts depending on `gh attestation verify`, which measured on gh 2.97.0 cannot close herdr's predicate at all",
|
|
65
|
+
"subject": "scripts/install-herdr-ci.sh",
|
|
66
|
+
"find": ["chmod +x \"$target\""],
|
|
67
|
+
"replace": [
|
|
68
|
+
"chmod +x \"$target\"\ngh attestation verify \"$target\" --repo herdrdev/herdr || fail \"attestation\""
|
|
69
|
+
],
|
|
70
|
+
"gate": ["bash", "run.sh", "check-herdr-supply"],
|
|
71
|
+
"timeoutSeconds": 120,
|
|
72
|
+
"signature": "[QK:HSUP-NO-ATTESTATION-CLI]",
|
|
73
|
+
"signatureSource": "scripts/check-herdr-supply.ts"
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"claim": "HSUP-CI-INSTALL-BEFORE-FLOOR",
|
|
77
|
+
"title": "CI installs herdr AFTER the floor, so the required cell skips in the one place it was supposed to be required",
|
|
78
|
+
"subject": ".github/workflows/ci.yml",
|
|
79
|
+
"find": [" - name: install the pinned herdr binary\n run: ./scripts/install-herdr-ci.sh\n"],
|
|
80
|
+
"replace": [""],
|
|
81
|
+
"gate": ["bash", "run.sh", "check-herdr-supply"],
|
|
82
|
+
"timeoutSeconds": 120,
|
|
83
|
+
"signature": "[QK:HSUP-CI-INSTALL-BEFORE-FLOOR]",
|
|
84
|
+
"signatureSource": "scripts/check-herdr-supply.ts"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"claim": "HSUP-CI-REQUIRES-HERDR",
|
|
88
|
+
"title": "CI runs the floor without the required-mode switch, so a failed install downgrades to a silent skip",
|
|
89
|
+
"subject": ".github/workflows/ci.yml",
|
|
90
|
+
"find": [" env:\n ENTWURF_REQUIRE_HERDR: \"1\"\n"],
|
|
91
|
+
"replace": [""],
|
|
92
|
+
"gate": ["bash", "run.sh", "check-herdr-supply"],
|
|
93
|
+
"timeoutSeconds": 120,
|
|
94
|
+
"signature": "[QK:HSUP-CI-REQUIRES-HERDR]",
|
|
95
|
+
"signatureSource": "scripts/check-herdr-supply.ts"
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"claim": "HSUP-CI-LINUX-ONLY",
|
|
99
|
+
"title": "a second job installs herdr, widening a Linux-only certification to platforms this rail has never been measured on",
|
|
100
|
+
"subject": ".github/workflows/ci.yml",
|
|
101
|
+
"find": [" - name: install the pinned herdr binary\n run: ./scripts/install-herdr-ci.sh\n"],
|
|
102
|
+
"replace": [
|
|
103
|
+
" - name: install the pinned herdr binary\n run: ./scripts/install-herdr-ci.sh\n - name: install the pinned herdr binary again\n run: ./scripts/install-herdr-ci.sh\n"
|
|
104
|
+
],
|
|
105
|
+
"gate": ["bash", "run.sh", "check-herdr-supply"],
|
|
106
|
+
"timeoutSeconds": 120,
|
|
107
|
+
"signature": "[QK:HSUP-CI-LINUX-ONLY]",
|
|
108
|
+
"signatureSource": "scripts/check-herdr-supply.ts"
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
"claim": "HSUP-SETUP-NEVER-INSTALLS",
|
|
112
|
+
"title": "the product itself gains a script that installs herdr, which is Entwurf supplying a placement owner's bytes",
|
|
113
|
+
"subject": "package.json",
|
|
114
|
+
"find": ["\"check:contracts\":"],
|
|
115
|
+
"replace": ["\"install-herdr\": \"./scripts/install-herdr-ci.sh\",\n\t\t\"check:contracts\":"],
|
|
116
|
+
"gate": ["bash", "run.sh", "check-herdr-supply"],
|
|
117
|
+
"timeoutSeconds": 120,
|
|
118
|
+
"signature": "[QK:HSUP-SETUP-NEVER-INSTALLS]",
|
|
119
|
+
"signatureSource": "scripts/check-herdr-supply.ts"
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"claim": "HSUP-X86-UNEXECUTED",
|
|
123
|
+
"title": "the x86_64 asset is recorded as executed although no cell of this rail has ever run on it",
|
|
124
|
+
"subject": "scripts/fixtures/herdr-supply.json",
|
|
125
|
+
"find": ["\"executed\": false"],
|
|
126
|
+
"replace": ["\"executed\": true"],
|
|
127
|
+
"gate": ["bash", "run.sh", "check-herdr-supply"],
|
|
128
|
+
"timeoutSeconds": 120,
|
|
129
|
+
"signature": "[QK:HSUP-X86-UNEXECUTED]",
|
|
130
|
+
"signatureSource": "scripts/check-herdr-supply.ts"
|
|
131
|
+
}
|
|
132
|
+
]
|
|
133
|
+
}
|
|
@@ -129,10 +129,10 @@
|
|
|
129
129
|
"title": "measuring both axes and printing neither returns the listing to two identical rows for a live citizen and a phantom — the surface gap that made a sibling dispatch into a void",
|
|
130
130
|
"subject": "pi-extensions/lib/entwurf-peers-render.ts",
|
|
131
131
|
"find": [
|
|
132
|
-
"\t\t`- ${p.gardenId} backend=${p.backend} liveness=${p.liveness} receiver=${p.receiver} ` +\n\t\t`transcript=${p.transcript} cwd=${p.cwd} model=${model}`"
|
|
132
|
+
"\t\t`- ${p.gardenId} backend=${p.backend} liveness=${p.liveness} receiver=${p.receiver} ` +\n\t\t`transcript=${p.transcript} cwd=${p.cwd} model=${model} placement=${renderPlacement(p.placement)}`"
|
|
133
133
|
],
|
|
134
134
|
"replace": [
|
|
135
|
-
"\t\t`- ${p.gardenId} backend=${p.backend} liveness=${p.liveness} `
|
|
135
|
+
"\t\t`- ${p.gardenId} backend=${p.backend} liveness=${p.liveness} ` +\n\t\t`cwd=${p.cwd} model=${model} placement=${renderPlacement(p.placement)}`"
|
|
136
136
|
],
|
|
137
137
|
"gate": ["bash", "run.sh", "check-meta-hook-session-switch"],
|
|
138
138
|
"timeoutSeconds": 300,
|