@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.
Files changed (122) hide show
  1. package/AGENTS.md +4 -2
  2. package/BASELINE.md +110 -1
  3. package/CHANGELOG.md +328 -0
  4. package/CONTRIBUTING.md +1 -1
  5. package/ENTWURF-CLI.json +1229 -0
  6. package/ENTWURF.json +284 -0
  7. package/FAQ.md +4 -4
  8. package/README.md +125 -184
  9. package/VERIFY.md +2 -2
  10. package/docs/external-mcp-host.md +3 -3
  11. package/docs/setup-clean-host.md +37 -12
  12. package/mcp/entwurf-bridge/dist/ENTWURF.json +284 -0
  13. package/mcp/entwurf-bridge/dist/mcp/entwurf-bridge/src/index.js +46 -196
  14. package/mcp/entwurf-bridge/dist/pi-extensions/lib/agent-guidance.js +299 -0
  15. package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-surface.js +21 -25
  16. package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-visible-resume.js +498 -29
  17. package/mcp/entwurf-bridge/dist/pi-extensions/lib/fresh-call-dispatch.js +47 -10
  18. package/mcp/entwurf-bridge/dist/pi-extensions/lib/herdr-fresh-call.js +613 -33
  19. package/mcp/entwurf-bridge/dist/pi-extensions/lib/herdr-resume-call.js +497 -0
  20. package/mcp/entwurf-bridge/dist/pi-extensions/lib/meta-session.js +3 -1
  21. package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-fresh-call.js +23 -20
  22. package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-resume-call.js +68 -21
  23. package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-fresh-preflight.js +7 -1
  24. package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-location.js +347 -0
  25. package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-owner-fence.js +1132 -0
  26. package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-runtime.js +1 -0
  27. package/mcp/entwurf-bridge/dist/pi-extensions/lib/remote-pair-send.js +7 -4
  28. package/mcp/entwurf-bridge/dist/pi-extensions/lib/resume-launch-identity.js +18 -11
  29. package/mcp/entwurf-bridge/dist/pi-extensions/meta-bridge-pi-durable.js +53 -60
  30. package/mcp/entwurf-bridge/dist/scripts/herdr-rails.mjs +40 -7
  31. package/mcp/entwurf-bridge/dist/scripts/meta-bridge-fresh-cut.js +1 -27
  32. package/mcp/entwurf-bridge/dist/scripts/meta-bridge-prune.js +1 -1
  33. package/mcp/entwurf-bridge/dist/scripts/meta-facts.js +1 -1
  34. package/mcp/entwurf-bridge/dist/scripts/peer-facts.js +1 -1
  35. package/mcp/entwurf-bridge/src/index.ts +149 -327
  36. package/mcp/entwurf-bridge/tsconfig.build.json +7 -1
  37. package/native/win32-x64/manifest.json +1 -1
  38. package/package.json +8 -4
  39. package/pi/pi-durable/bootstrap.mjs +179 -6
  40. package/pi/pi-durable/carrier/runtime.js +108 -9
  41. package/pi/pi-durable/carrier/session-name.js +11 -0
  42. package/pi/pi-durable/carrier/sessions.js +96 -20
  43. package/pi/pi-durable/overlay/upstream-pin.json +11 -5
  44. package/pi-extensions/lib/agent-guidance.ts +341 -0
  45. package/pi-extensions/lib/entwurf-v2-surface.ts +25 -31
  46. package/pi-extensions/lib/entwurf-v2-visible-resume.ts +725 -54
  47. package/pi-extensions/lib/fresh-call-dispatch.ts +64 -12
  48. package/pi-extensions/lib/herdr-fresh-call.ts +919 -40
  49. package/pi-extensions/lib/herdr-resume-call.ts +810 -0
  50. package/pi-extensions/lib/meta-session.ts +13 -8
  51. package/pi-extensions/lib/mux-fresh-call.ts +23 -26
  52. package/pi-extensions/lib/mux-resume-call.ts +95 -23
  53. package/pi-extensions/lib/pi-durable-fresh-preflight.ts +9 -2
  54. package/pi-extensions/lib/pi-durable-location.ts +446 -0
  55. package/pi-extensions/lib/pi-durable-owner-fence.ts +1461 -0
  56. package/pi-extensions/lib/pi-durable-runtime.ts +4 -0
  57. package/pi-extensions/lib/remote-pair-send.ts +7 -4
  58. package/pi-extensions/lib/resume-launch-identity.ts +31 -12
  59. package/pi-extensions/meta-bridge-pi-durable.ts +52 -79
  60. package/run.sh +417 -654
  61. package/scripts/build-bridge.sh +10 -0
  62. package/scripts/check-capability-bundle-reach.ts +86 -0
  63. package/scripts/check-claude-launch.ts +341 -0
  64. package/scripts/check-entwurf-self-address.ts +3 -3
  65. package/scripts/check-entwurf-v2-surface.ts +94 -98
  66. package/scripts/check-fresh-call-dispatch.ts +70 -9
  67. package/scripts/check-fresh-cut-gate.sh +23 -9
  68. package/scripts/check-gate-qualification.ts +24 -17
  69. package/scripts/check-herdr-activation.ts +301 -23
  70. package/scripts/check-herdr-fresh-call.ts +161 -25
  71. package/scripts/check-herdr-plugin-build.ts +173 -1
  72. package/scripts/check-herdr-plugin.ts +28 -2
  73. package/scripts/check-herdr-runtime-bootstrap.ts +136 -0
  74. package/scripts/check-install-surface.ts +1236 -6
  75. package/scripts/check-meta-doctor-oracle.sh +1 -1
  76. package/scripts/check-meta-facts.ts +20 -1
  77. package/scripts/check-mux-resume-call.ts +48 -3
  78. package/scripts/check-peer-facts.ts +39 -2
  79. package/scripts/cli-help.mjs +222 -0
  80. package/scripts/dev-bin.sh +39 -2
  81. package/scripts/herdr-activation.mjs +28 -6
  82. package/scripts/herdr-operator-link.mjs +389 -0
  83. package/scripts/herdr-plugin-activate.mjs +5 -0
  84. package/scripts/herdr-plugin-deactivate.mjs +18 -5
  85. package/scripts/herdr-rails.mjs +43 -7
  86. package/scripts/herdr-runtime.mjs +27 -0
  87. package/scripts/meta-bridge-fresh-cut.ts +1 -27
  88. package/scripts/meta-bridge-prune.ts +1 -1
  89. package/scripts/meta-facts.ts +1 -1
  90. package/scripts/mutants/agent-guidance.json +160 -0
  91. package/scripts/mutants/bridge-boot-resume.json +6 -8
  92. package/scripts/mutants/capability-bundle-reach.json +124 -0
  93. package/scripts/mutants/claude-launch.json +142 -0
  94. package/scripts/mutants/cli-help-source.json +420 -0
  95. package/scripts/mutants/control-send-receipt.json +21 -4
  96. package/scripts/mutants/dev-gate-dispatch.json +109 -0
  97. package/scripts/mutants/fresh-call-dispatch.json +38 -2
  98. package/scripts/mutants/fresh-cut.json +15 -0
  99. package/scripts/mutants/herdr-activation.json +128 -0
  100. package/scripts/mutants/herdr-fresh-call.json +278 -5
  101. package/scripts/mutants/herdr-operator-link.json +318 -0
  102. package/scripts/mutants/herdr-plugin-build.json +55 -0
  103. package/scripts/mutants/herdr-plugin.json +17 -0
  104. package/scripts/mutants/herdr-resume-call.json +288 -0
  105. package/scripts/mutants/herdr-runtime-bootstrap.json +48 -0
  106. package/scripts/mutants/meta-facts.json +15 -0
  107. package/scripts/mutants/mux-fresh-call.json +14 -3
  108. package/scripts/mutants/mux-resume-call.json +89 -3
  109. package/scripts/mutants/peer-facts.json +15 -0
  110. package/scripts/mutants/pi-durable.json +996 -6
  111. package/scripts/mutants/remote-pair-send.json +21 -2
  112. package/scripts/mutants/self-address.json +10 -10
  113. package/scripts/mutants/source-install.json +35 -0
  114. package/scripts/mutants/v2-surface.json +50 -64
  115. package/scripts/mutants/v2-visible-resume.json +266 -6
  116. package/scripts/peer-facts.ts +1 -1
  117. package/scripts/smoke-agy-install-state.sh +66 -0
  118. package/scripts/smoke-meta-prune.sh +23 -0
  119. package/scripts/smoke-omp-fresh-live.ts +12 -3
  120. package/scripts/smoke-omp-receive-live.ts +7 -1
  121. package/scripts/smoke-pi-durable-fresh-live.ts +12 -2
  122. package/team.json.example +39 -0
@@ -0,0 +1,318 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "lane": "herdr-operator-link",
4
+ "mutants": [
5
+ {
6
+ "claim": "OPL-FORWARD-ONE-LINK",
7
+ "title": "a second expose over our settled link republishes the receipt and calls itself resumed instead of answering `already linked` with zero writes",
8
+ "subject": "scripts/herdr-operator-link.mjs",
9
+ "find": ["\t\treturn `already linked ${linkPath} -> ${target}`;"],
10
+ "replace": ["\t\t// (mutant) no idempotent answer"],
11
+ "gate": ["bash", "run.sh", "check-tests-beside-behavior"],
12
+ "timeoutSeconds": 600,
13
+ "signature": "[QK:OPL-FORWARD-ONE-LINK]",
14
+ "signatureSource": "plugins/herdr/operator-link.test.mjs",
15
+ "build": {
16
+ "argv": ["bash", "scripts/build-bridge.sh"],
17
+ "output": "mcp/entwurf-bridge/dist"
18
+ }
19
+ },
20
+ {
21
+ "claim": "OPL-FLOOR-BEFORE-RECEIPT",
22
+ "title": "the receipt says linking while the ledger is still schema 2, so an old 2-only reader can tear down a runtime a receipt already names",
23
+ "subject": "scripts/herdr-operator-link.mjs",
24
+ "find": [
25
+ "\t\tif (schemaVersion !== LEDGER_FLOOR_VERSION) writeLedger(activation, LEDGER_FLOOR_VERSION, entry);",
26
+ "\t\twriteOperatorLink(layout, body(\"linking\"));"
27
+ ],
28
+ "replace": [
29
+ "\t\twriteOperatorLink(layout, body(\"linking\"));",
30
+ "\t\tif (schemaVersion !== LEDGER_FLOOR_VERSION) writeLedger(activation, LEDGER_FLOOR_VERSION, entry);"
31
+ ],
32
+ "gate": ["bash", "run.sh", "check-tests-beside-behavior"],
33
+ "timeoutSeconds": 600,
34
+ "signature": "[QK:OPL-FLOOR-BEFORE-RECEIPT]",
35
+ "signatureSource": "plugins/herdr/operator-link.test.mjs",
36
+ "build": {
37
+ "argv": ["bash", "scripts/build-bridge.sh"],
38
+ "output": "mcp/entwurf-bridge/dist"
39
+ }
40
+ },
41
+ {
42
+ "claim": "OPL-RECEIPT-BEFORE-LINK",
43
+ "title": "the symlink is made before any receipt names it, so a run stopped there leaves a link no inverse will ever claim",
44
+ "subject": "scripts/herdr-operator-link.mjs",
45
+ "find": ["\t\twriteOperatorLink(layout, body(\"linking\"));", "\t\tfs.symlinkSync(target, linkPath);"],
46
+ "replace": ["\t\tfs.symlinkSync(target, linkPath);", "\t\twriteOperatorLink(layout, body(\"linking\"));"],
47
+ "gate": ["bash", "run.sh", "check-tests-beside-behavior"],
48
+ "timeoutSeconds": 600,
49
+ "signature": "[QK:OPL-RECEIPT-BEFORE-LINK]",
50
+ "signatureSource": "plugins/herdr/operator-link.test.mjs",
51
+ "build": {
52
+ "argv": ["bash", "scripts/build-bridge.sh"],
53
+ "output": "mcp/entwurf-bridge/dist"
54
+ }
55
+ },
56
+ {
57
+ "claim": "OPL-LINKED-AFTER-LINK",
58
+ "title": "the receipt says linked before the link stands, so a run stopped there is later named drift instead of resumed",
59
+ "subject": "scripts/herdr-operator-link.mjs",
60
+ "find": ["\t\tfs.symlinkSync(target, linkPath);", "\t\twriteOperatorLink(layout, body(\"linked\"));"],
61
+ "replace": ["\t\twriteOperatorLink(layout, body(\"linked\"));", "\t\tfs.symlinkSync(target, linkPath);"],
62
+ "gate": ["bash", "run.sh", "check-tests-beside-behavior"],
63
+ "timeoutSeconds": 600,
64
+ "signature": "[QK:OPL-LINKED-AFTER-LINK]",
65
+ "signatureSource": "plugins/herdr/operator-link.test.mjs",
66
+ "build": {
67
+ "argv": ["bash", "scripts/build-bridge.sh"],
68
+ "output": "mcp/entwurf-bridge/dist"
69
+ }
70
+ },
71
+ {
72
+ "claim": "OPL-SELF-IS-ACTIVE",
73
+ "title": "expose runs from any copy of the package, so a checkout or another npm root links the operator to a runtime it is not part of",
74
+ "subject": "scripts/herdr-operator-link.mjs",
75
+ "find": ["\tadmitSelf(runtime, \"expose\");"],
76
+ "replace": ["\tvoid admitSelf;"],
77
+ "gate": ["bash", "run.sh", "check-tests-beside-behavior"],
78
+ "timeoutSeconds": 600,
79
+ "signature": "[QK:OPL-SELF-IS-ACTIVE]",
80
+ "signatureSource": "plugins/herdr/operator-link.test.mjs",
81
+ "build": {
82
+ "argv": ["bash", "scripts/build-bridge.sh"],
83
+ "output": "mcp/entwurf-bridge/dist"
84
+ }
85
+ },
86
+ {
87
+ "claim": "OPL-WITHDRAW-SELF",
88
+ "title": "withdraw runs from any copy of the package, so a checkout or another root takes back a link the active runtime owns",
89
+ "subject": "scripts/herdr-operator-link.mjs",
90
+ "find": ["\tadmitSelf(runtime, \"withdraw\");"],
91
+ "replace": ["\tvoid admitSelf;"],
92
+ "gate": ["bash", "run.sh", "check-tests-beside-behavior"],
93
+ "timeoutSeconds": 600,
94
+ "signature": "[QK:OPL-WITHDRAW-SELF]",
95
+ "signatureSource": "plugins/herdr/operator-link.test.mjs",
96
+ "build": {
97
+ "argv": ["bash", "scripts/build-bridge.sh"],
98
+ "output": "mcp/entwurf-bridge/dist"
99
+ }
100
+ },
101
+ {
102
+ "claim": "OPL-SETTLED-ONLY",
103
+ "title": "a backed-up runtime beside the active one no longer stops expose, so the link is made over an install that is still mid-recovery",
104
+ "subject": "scripts/herdr-operator-link.mjs",
105
+ "find": [
106
+ "\t\tfs.lstatSync(runtime.stagingDir, { throwIfNoEntry: false }) ||",
107
+ "\t\tfs.lstatSync(runtime.previousDir, { throwIfNoEntry: false })"
108
+ ],
109
+ "replace": ["\t\tfs.lstatSync(runtime.stagingDir, { throwIfNoEntry: false })"],
110
+ "gate": ["bash", "run.sh", "check-tests-beside-behavior"],
111
+ "timeoutSeconds": 600,
112
+ "signature": "[QK:OPL-SETTLED-ONLY]",
113
+ "signatureSource": "plugins/herdr/operator-link.test.mjs",
114
+ "build": {
115
+ "argv": ["bash", "scripts/build-bridge.sh"],
116
+ "output": "mcp/entwurf-bridge/dist"
117
+ }
118
+ },
119
+ {
120
+ "claim": "OPL-BIN-DIR-CANONICAL",
121
+ "title": "a bin dir reached through an aliased parent is accepted, so the receipt records a path that is not its own realpath and the link moves with the alias",
122
+ "subject": "scripts/herdr-operator-link.mjs",
123
+ "find": ["\tif (fs.realpathSync(binDir) !== binDir) return \"alias\";"],
124
+ "replace": ["\t// (mutant) realpath not compared"],
125
+ "gate": ["bash", "run.sh", "check-tests-beside-behavior"],
126
+ "timeoutSeconds": 600,
127
+ "signature": "[QK:OPL-BIN-DIR-CANONICAL]",
128
+ "signatureSource": "plugins/herdr/operator-link.test.mjs",
129
+ "build": {
130
+ "argv": ["bash", "scripts/build-bridge.sh"],
131
+ "output": "mcp/entwurf-bridge/dist"
132
+ }
133
+ },
134
+ {
135
+ "claim": "OPL-PATH-NOT-SHADOWED",
136
+ "title": "an executable entwurf in an earlier PATH entry is ignored, so the link is made where it will never be the one that runs",
137
+ "subject": "scripts/herdr-operator-link.mjs",
138
+ "find": ["\t\tif (isExecutableFile(candidate)) return { onPath: false, shadowedBy: candidate };"],
139
+ "replace": ["\t\tvoid candidate;"],
140
+ "gate": ["bash", "run.sh", "check-tests-beside-behavior"],
141
+ "timeoutSeconds": 600,
142
+ "signature": "[QK:OPL-PATH-NOT-SHADOWED]",
143
+ "signatureSource": "plugins/herdr/operator-link.test.mjs",
144
+ "build": {
145
+ "argv": ["bash", "scripts/build-bridge.sh"],
146
+ "output": "mcp/entwurf-bridge/dist"
147
+ }
148
+ },
149
+ {
150
+ "claim": "OPL-FOREIGN-REFUSED",
151
+ "title": "a link with no receipt is not refused before the first write, so expose raises the floor and records a receipt over someone else's link",
152
+ "subject": "scripts/herdr-operator-link.mjs",
153
+ "find": [
154
+ "\t\tif (link !== \"absent\")",
155
+ "\t\t\trefuse(\"operator-link-foreign\", `${linkPath} exists and no receipt says it is ours; remove it yourself if it is`);"
156
+ ],
157
+ "replace": ["\t\tvoid link;"],
158
+ "gate": ["bash", "run.sh", "check-tests-beside-behavior"],
159
+ "timeoutSeconds": 600,
160
+ "signature": "[QK:OPL-FOREIGN-REFUSED]",
161
+ "signatureSource": "plugins/herdr/operator-link.test.mjs",
162
+ "build": {
163
+ "argv": ["bash", "scripts/build-bridge.sh"],
164
+ "output": "mcp/entwurf-bridge/dist"
165
+ }
166
+ },
167
+ {
168
+ "claim": "OPL-RECEIPT-NEEDS-FLOOR",
169
+ "title": "a receipt beside a schema-2 ledger is adopted, so a 2-only reader can deactivate under a link it does not know",
170
+ "subject": "scripts/herdr-operator-link.mjs",
171
+ "find": [
172
+ "\tif (ledger.schemaVersion !== LEDGER_FLOOR_VERSION)",
173
+ "\t\trefuse(\"operator-link-floor-mismatch\", `the ledger is schema ${ledger.schemaVersion}, not ${LEDGER_FLOOR_VERSION}`);"
174
+ ],
175
+ "replace": ["\t// (mutant) any ledger version carries a receipt"],
176
+ "gate": ["bash", "run.sh", "check-tests-beside-behavior"],
177
+ "timeoutSeconds": 600,
178
+ "signature": "[QK:OPL-RECEIPT-NEEDS-FLOOR]",
179
+ "signatureSource": "plugins/herdr/operator-link.test.mjs",
180
+ "build": {
181
+ "argv": ["bash", "scripts/build-bridge.sh"],
182
+ "output": "mcp/entwurf-bridge/dist"
183
+ }
184
+ },
185
+ {
186
+ "claim": "OPL-LINKED-MISSING-DRIFT",
187
+ "title": "a linked receipt whose link is gone silently re-creates it instead of naming the drift",
188
+ "subject": "scripts/herdr-operator-link.mjs",
189
+ "find": [
190
+ "\t\tif (link === \"absent\")",
191
+ "\t\t\trefuse(\"operator-link-drift\", `the receipt says ${linkPath} is linked but it is gone; withdraw, then ask again`);"
192
+ ],
193
+ "replace": ["\t\tif (link === \"absent\") fs.symlinkSync(target, linkPath);"],
194
+ "gate": ["bash", "run.sh", "check-tests-beside-behavior"],
195
+ "timeoutSeconds": 600,
196
+ "signature": "[QK:OPL-LINKED-MISSING-DRIFT]",
197
+ "signatureSource": "plugins/herdr/operator-link.test.mjs",
198
+ "build": {
199
+ "argv": ["bash", "scripts/build-bridge.sh"],
200
+ "output": "mcp/entwurf-bridge/dist"
201
+ }
202
+ },
203
+ {
204
+ "claim": "OPL-LINKING-PUBLISH-ONLY",
205
+ "title": "a linking resume makes the link again even when our exact link already stands, so the run that stopped after the symlink can never finish",
206
+ "subject": "scripts/herdr-operator-link.mjs",
207
+ "find": ["\tif (link === \"absent\") fs.symlinkSync(target, linkPath);"],
208
+ "replace": ["\tfs.symlinkSync(target, linkPath);"],
209
+ "gate": ["bash", "run.sh", "check-tests-beside-behavior"],
210
+ "timeoutSeconds": 600,
211
+ "signature": "[QK:OPL-LINKING-PUBLISH-ONLY]",
212
+ "signatureSource": "plugins/herdr/operator-link.test.mjs",
213
+ "build": {
214
+ "argv": ["bash", "scripts/build-bridge.sh"],
215
+ "output": "mcp/entwurf-bridge/dist"
216
+ }
217
+ },
218
+ {
219
+ "claim": "OPL-WITHDRAW-ONLY-OURS",
220
+ "title": "withdraw over a foreign link drops the receipt and reports success, so the only record of what was ours is gone and the foreign link stands",
221
+ "subject": "scripts/herdr-operator-link.mjs",
222
+ "find": [
223
+ "\tif (link === \"foreign\")",
224
+ "\t\trefuse(\"operator-link-foreign\", `${receipt.linkPath} is not the link the receipt names; nothing was removed`);"
225
+ ],
226
+ "replace": ["\tvoid refuse;"],
227
+ "gate": ["bash", "run.sh", "check-tests-beside-behavior"],
228
+ "timeoutSeconds": 600,
229
+ "signature": "[QK:OPL-WITHDRAW-ONLY-OURS]",
230
+ "signatureSource": "plugins/herdr/operator-link.test.mjs",
231
+ "build": {
232
+ "argv": ["bash", "scripts/build-bridge.sh"],
233
+ "output": "mcp/entwurf-bridge/dist"
234
+ }
235
+ },
236
+ {
237
+ "claim": "OPL-WITHDRAW-ORPHAN-REFUSED",
238
+ "title": "a receipt with no ledger is treated as bound, so withdraw calls an orphan done instead of naming it",
239
+ "subject": "scripts/herdr-operator-link.mjs",
240
+ "find": [
241
+ "\tif (ledger === null) refuse(\"operator-link-orphan\", \"an operator-link receipt stands with no activation ledger\");"
242
+ ],
243
+ "replace": ["\tif (ledger === null) return;"],
244
+ "gate": ["bash", "run.sh", "check-tests-beside-behavior"],
245
+ "timeoutSeconds": 600,
246
+ "signature": "[QK:OPL-WITHDRAW-ORPHAN-REFUSED]",
247
+ "signatureSource": "plugins/herdr/operator-link.test.mjs",
248
+ "build": {
249
+ "argv": ["bash", "scripts/build-bridge.sh"],
250
+ "output": "mcp/entwurf-bridge/dist"
251
+ }
252
+ },
253
+ {
254
+ "claim": "OPL-STRICT-ARGV",
255
+ "title": "expose accepts tokens after --bin-dir <abs>, so a mistyped command links instead of exiting 2",
256
+ "subject": "scripts/herdr-operator-link.mjs",
257
+ "find": ["\tif (argv.length !== 2 || argv[0] !== \"--bin-dir\")"],
258
+ "replace": ["\tif (argv[0] !== \"--bin-dir\")"],
259
+ "gate": ["bash", "run.sh", "check-tests-beside-behavior"],
260
+ "timeoutSeconds": 600,
261
+ "signature": "[QK:OPL-STRICT-ARGV]",
262
+ "signatureSource": "plugins/herdr/operator-link.test.mjs",
263
+ "build": {
264
+ "argv": ["bash", "scripts/build-bridge.sh"],
265
+ "output": "mcp/entwurf-bridge/dist"
266
+ }
267
+ },
268
+ {
269
+ "claim": "OPL-RECEIPT-TARGET-EXACT",
270
+ "title": "a receipt naming a target outside this runtime is certified, so withdraw removes a foreign link and its receipt on that receipt's word alone",
271
+ "subject": "scripts/herdr-operator-link.mjs",
272
+ "find": [
273
+ "\tif (parsed.target !== operatorLinkTarget(activeDir)) uncertified(`target is not ${operatorLinkTarget(activeDir)}`);"
274
+ ],
275
+ "replace": ["\t// (mutant) target not derived from this runtime"],
276
+ "gate": ["bash", "run.sh", "check-tests-beside-behavior"],
277
+ "timeoutSeconds": 600,
278
+ "signature": "[QK:OPL-RECEIPT-TARGET-EXACT]",
279
+ "signatureSource": "plugins/herdr/operator-link.test.mjs",
280
+ "build": {
281
+ "argv": ["bash", "scripts/build-bridge.sh"],
282
+ "output": "mcp/entwurf-bridge/dist"
283
+ }
284
+ },
285
+ {
286
+ "claim": "OPL-LEDGER-ACTIVE-ONLY",
287
+ "title": "an activating ledger with a component still pending is linked over, so the floor rises and a receipt names a runtime whose activation never settled",
288
+ "subject": "scripts/herdr-operator-link.mjs",
289
+ "find": ["\tif (ledger === null || ledger.phase !== \"active\") {"],
290
+ "replace": ["\tif (ledger === null) {"],
291
+ "gate": ["bash", "run.sh", "check-tests-beside-behavior"],
292
+ "timeoutSeconds": 600,
293
+ "signature": "[QK:OPL-LEDGER-ACTIVE-ONLY]",
294
+ "signatureSource": "plugins/herdr/operator-link.test.mjs",
295
+ "build": {
296
+ "argv": ["bash", "scripts/build-bridge.sh"],
297
+ "output": "mcp/entwurf-bridge/dist"
298
+ }
299
+ },
300
+ {
301
+ "claim": "OPL-BIN-DIR-ON-PATH",
302
+ "title": "a real bin dir that is not on PATH is linked into, so the receipt records a link no bare `entwurf` ever reaches",
303
+ "subject": "scripts/herdr-operator-link.mjs",
304
+ "find": [
305
+ "\tif (!selection.onPath) refuse(\"operator-link-bin-dir-off-path\", `${binDir} is not an entry of the current PATH`);"
306
+ ],
307
+ "replace": ["\t// (mutant) on-PATH not required"],
308
+ "gate": ["bash", "run.sh", "check-tests-beside-behavior"],
309
+ "timeoutSeconds": 600,
310
+ "signature": "[QK:OPL-BIN-DIR-ON-PATH]",
311
+ "signatureSource": "plugins/herdr/operator-link.test.mjs",
312
+ "build": {
313
+ "argv": ["bash", "scripts/build-bridge.sh"],
314
+ "output": "mcp/entwurf-bridge/dist"
315
+ }
316
+ }
317
+ ]
318
+ }
@@ -228,6 +228,61 @@
228
228
  "timeoutSeconds": 300,
229
229
  "signature": "[QK:HPB-PLANNED-ROOT-TIE]",
230
230
  "signatureSource": "scripts/check-herdr-plugin-build.ts"
231
+ },
232
+ {
233
+ "claim": "HPB-FLOOR-PROBE-SUPPLIED",
234
+ "title": "the official build never supplies the admission, so a floor host installs a candidate whose own reader may refuse the ledger it is about to act on (#153)",
235
+ "subject": "plugins/herdr/lib/build.mjs",
236
+ "find": ["\tif (plan.ledger !== null && plan.ledger.schemaVersion === LEDGER_FLOOR_VERSION) {"],
237
+ "replace": ["\tif (false) {"],
238
+ "gate": ["bash", "run.sh", "check-herdr-plugin-build"],
239
+ "timeoutSeconds": 300,
240
+ "signature": "[QK:HPB-FLOOR-PROBE-SUPPLIED]",
241
+ "signatureSource": "scripts/check-herdr-plugin-build.ts"
242
+ },
243
+ {
244
+ "claim": "HPB-FLOOR-PROBE-LEGACY-UNPROBED",
245
+ "title": "the probe runs on every ledger, so a legacy 2-ledger host refuses candidates the floor was never raised against (#153)",
246
+ "subject": "plugins/herdr/lib/build.mjs",
247
+ "find": ["\tif (plan.ledger !== null && plan.ledger.schemaVersion === LEDGER_FLOOR_VERSION) {"],
248
+ "replace": ["\tif (plan.ledger !== null) {"],
249
+ "gate": ["bash", "run.sh", "check-herdr-plugin-build"],
250
+ "timeoutSeconds": 300,
251
+ "signature": "[QK:HPB-FLOOR-PROBE-LEGACY-UNPROBED]",
252
+ "signatureSource": "scripts/check-herdr-plugin-build.ts"
253
+ },
254
+ {
255
+ "claim": "HPB-FLOOR-PROBE-EXIT-STATUS",
256
+ "title": "the probe ignores the reader's exit, so a reader that failed after printing is admitted (#153)",
257
+ "subject": "plugins/herdr/lib/build.mjs",
258
+ "find": ["\tif (probe.error || probe.status !== 0) {"],
259
+ "replace": ["\tif (false) {"],
260
+ "gate": ["bash", "run.sh", "check-herdr-plugin-build"],
261
+ "timeoutSeconds": 300,
262
+ "signature": "[QK:HPB-FLOOR-PROBE-EXIT-STATUS]",
263
+ "signatureSource": "scripts/check-herdr-plugin-build.ts"
264
+ },
265
+ {
266
+ "claim": "HPB-FLOOR-PROBE-STDERR-SILENT",
267
+ "title": "the probe ignores what the reader said on stderr, so a reader warning about the ledger is admitted (#153)",
268
+ "subject": "plugins/herdr/lib/build.mjs",
269
+ "find": ["\tif ((probe.stderr ?? \"\") !== \"\") refuse(\"the candidate's reader wrote to stderr\");"],
270
+ "replace": ["\tvoid 0;"],
271
+ "gate": ["bash", "run.sh", "check-herdr-plugin-build"],
272
+ "timeoutSeconds": 300,
273
+ "signature": "[QK:HPB-FLOOR-PROBE-STDERR-SILENT]",
274
+ "signatureSource": "scripts/check-herdr-plugin-build.ts"
275
+ },
276
+ {
277
+ "claim": "HPB-FLOOR-PROBE-VALUE-EXACT",
278
+ "title": "the probe accepts any answer from the reader, so a null, a lowered or a different ledger is admitted as if it were the one this build certified (#153)",
279
+ "subject": "plugins/herdr/lib/build.mjs",
280
+ "find": ["\tif (canonicalJson(read) !== canonicalJson(ledger)) {"],
281
+ "replace": ["\tif (false) {"],
282
+ "gate": ["bash", "run.sh", "check-herdr-plugin-build"],
283
+ "timeoutSeconds": 300,
284
+ "signature": "[QK:HPB-FLOOR-PROBE-VALUE-EXACT]",
285
+ "signatureSource": "scripts/check-herdr-plugin-build.ts"
231
286
  }
232
287
  ]
233
288
  }
@@ -170,6 +170,23 @@
170
170
  "signature": "[QK:HPL-RAILS-SHARED-SOURCE]",
171
171
  "signatureSource": "scripts/check-herdr-plugin.ts"
172
172
  },
173
+ {
174
+ "claim": "HPL-RAILS-DOMAINS-DISTINCT",
175
+ "title": "the status pane hands pi-durable to the RAILS block as an agent-start backend, so the pane still lists all three fresh-call backends but presents pi-durable as something herdr starts as an agent, with an empty layout group (#157 A-L2)",
176
+ "subject": "plugins/herdr/lib/status.mjs",
177
+ "find": [
178
+ "\t\t\tagentStartBackends: HERDR_AGENT_START_BACKENDS,",
179
+ "\t\t\tlayoutBackends: HERDR_LAYOUT_LAUNCH_BACKENDS,"
180
+ ],
181
+ "replace": [
182
+ "\t\t\tagentStartBackends: [...HERDR_AGENT_START_BACKENDS, ...HERDR_LAYOUT_LAUNCH_BACKENDS],",
183
+ "\t\t\tlayoutBackends: [],"
184
+ ],
185
+ "gate": ["bash", "run.sh", "check-herdr-plugin"],
186
+ "timeoutSeconds": 180,
187
+ "signature": "[QK:HPL-RAILS-DOMAINS-DISTINCT]",
188
+ "signatureSource": "scripts/check-herdr-plugin.ts"
189
+ },
173
190
  {
174
191
  "claim": "HPL-LEDGER-FALLBACK-READS-CITIZENS",
175
192
  "title": "the D3=C fallback is removed, so a correct plugin install — which puts nothing on PATH — closes its own first screen with entwurf-not-found again, and the operator is back to setting ENTWURF_BIN by hand",