@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,288 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "lane": "herdr-resume-call",
4
+ "mutants": [
5
+ {
6
+ "claim": "HRESUME-CONTEXT-NO-FALLBACK",
7
+ "title": "the herdr context refusal is skipped, so a process with no herdr binary or no caller pane goes on to build a runner from coordinates it does not have",
8
+ "subject": "pi-extensions/lib/herdr-resume-call.ts",
9
+ "find": ["\tif (!context.ok) {"],
10
+ "replace": ["\tif (context.ok === undefined) {"],
11
+ "gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
12
+ "timeoutSeconds": 60,
13
+ "signature": "[QK:HRESUME-CONTEXT-NO-FALLBACK]",
14
+ "signatureSource": "pi-extensions/lib/herdr-resume-call.test.ts"
15
+ },
16
+ {
17
+ "claim": "HRESUME-PI-ONLY",
18
+ "title": "the pi-only refusal narrows to codex, so a Claude Code resume inside herdr opens a tab whose return no observation can ever join",
19
+ "subject": "pi-extensions/lib/herdr-resume-call.ts",
20
+ "find": ["\tif (params.backend !== \"pi\") return { ok: false, reason: \"herdr-resume-backend-unsupported\" };"],
21
+ "replace": [
22
+ "\tif (params.backend === \"codex\") return { ok: false, reason: \"herdr-resume-backend-unsupported\" };"
23
+ ],
24
+ "gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
25
+ "timeoutSeconds": 60,
26
+ "signature": "[QK:HRESUME-PI-ONLY]",
27
+ "signatureSource": "pi-extensions/lib/herdr-resume-call.test.ts"
28
+ },
29
+ {
30
+ "claim": "HRESUME-ARGV-CONTROL-REFUSED",
31
+ "title": "the pre-create control-character check is dropped, so herdr refuses the argv only after the tab already exists",
32
+ "subject": "pi-extensions/lib/herdr-resume-call.ts",
33
+ "find": [
34
+ "\tif (params.runtimeArgs.some(containsControlChar)) return { ok: false, reason: \"herdr-argv-control-character\" };"
35
+ ],
36
+ "replace": ["\tif (false) return { ok: false, reason: \"herdr-argv-control-character\" };"],
37
+ "gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
38
+ "timeoutSeconds": 60,
39
+ "signature": "[QK:HRESUME-ARGV-CONTROL-REFUSED]",
40
+ "signatureSource": "pi-extensions/lib/herdr-resume-call.test.ts"
41
+ },
42
+ {
43
+ "claim": "HRESUME-CALLER-WORKSPACE",
44
+ "title": "a caller-pane reply about another pane is believed, so the citizen reopens in a workspace the caller never named",
45
+ "subject": "pi-extensions/lib/herdr-resume-call.ts",
46
+ "find": [
47
+ "\tif (callerPane.paneId !== context.context.callerPaneId) return { ok: false, reason: \"herdr-caller-pane-drift\" };"
48
+ ],
49
+ "replace": [""],
50
+ "gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
51
+ "timeoutSeconds": 60,
52
+ "signature": "[QK:HRESUME-CALLER-WORKSPACE]",
53
+ "signatureSource": "pi-extensions/lib/herdr-resume-call.test.ts"
54
+ },
55
+ {
56
+ "claim": "HRESUME-TAB-ARGV-NO-CALLBACK",
57
+ "title": "the resume tab stops emptying the inherited PI_SESSION_ID, so the reopened pi can attach as whatever citizen the herdr server's environment names",
58
+ "subject": "pi-extensions/lib/herdr-resume-call.ts",
59
+ "find": ["\t\t\"--env\",", "\t\t\"PI_SESSION_ID=\","],
60
+ "replace": [""],
61
+ "gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
62
+ "timeoutSeconds": 60,
63
+ "signature": "[QK:HRESUME-TAB-ARGV-NO-CALLBACK]",
64
+ "signatureSource": "pi-extensions/lib/herdr-resume-call.test.ts"
65
+ },
66
+ {
67
+ "claim": "HRESUME-START-ARGV-IS-RECORD",
68
+ "title": "pi is started with no runtime argv, so a bare pi opens in the tab instead of the record's transcript, provider and model",
69
+ "subject": "pi-extensions/lib/herdr-resume-call.ts",
70
+ "find": ["\t\t\tbackendArgs: params.runtimeArgs,"],
71
+ "replace": ["\t\t\tbackendArgs: [],"],
72
+ "gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
73
+ "timeoutSeconds": 60,
74
+ "signature": "[QK:HRESUME-START-ARGV-IS-RECORD]",
75
+ "signatureSource": "pi-extensions/lib/herdr-resume-call.test.ts"
76
+ },
77
+ {
78
+ "claim": "HRESUME-SUCCESS-RECEIPT",
79
+ "title": "the receipt names a freshly minted agent instead of the one herdr was asked to start, so the operator is pointed at an agent that does not exist",
80
+ "subject": "pi-extensions/lib/herdr-resume-call.ts",
81
+ "find": [
82
+ "\t\treceipt: { ...created, requestedKind: HERDR_AGENT_KIND.pi, cwd: params.cwd, herdrAgentName: agentName },"
83
+ ],
84
+ "replace": [
85
+ "\t\treceipt: { ...created, requestedKind: HERDR_AGENT_KIND.pi, cwd: params.cwd, herdrAgentName: mintHerdrResumeAgentName() },"
86
+ ],
87
+ "gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
88
+ "timeoutSeconds": 60,
89
+ "signature": "[QK:HRESUME-SUCCESS-RECEIPT]",
90
+ "signatureSource": "pi-extensions/lib/herdr-resume-call.test.ts"
91
+ },
92
+ {
93
+ "claim": "HRESUME-POST-CREATE-RECOVERY",
94
+ "title": "a tab create our own runner cut off is reported as declined by herdr, telling the operator nothing exists when a tab may be on screen",
95
+ "subject": "pi-extensions/lib/herdr-resume-call.ts",
96
+ "find": ["\t\t\trecovery: code === undefined ? { outcome: \"unknown\" } : { outcome: \"none\" },"],
97
+ "replace": ["\t\t\trecovery: { outcome: \"none\" },"],
98
+ "gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
99
+ "timeoutSeconds": 60,
100
+ "signature": "[QK:HRESUME-POST-CREATE-RECOVERY]",
101
+ "signatureSource": "pi-extensions/lib/herdr-resume-call.test.ts"
102
+ },
103
+ {
104
+ "claim": "HRESUME-CREATED-WORKSPACE",
105
+ "title": "the created tab's workspace is no longer compared with the caller's one the call asked for, so a self-consistent create reply about another workspace starts pi where the operator is not looking",
106
+ "subject": "pi-extensions/lib/herdr-resume-call.ts",
107
+ "find": ["\tif (tab.workspaceId !== callerPane.workspaceId) {"],
108
+ "replace": ["\tif (tab.workspaceId !== tab.workspaceId) {"],
109
+ "gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
110
+ "timeoutSeconds": 60,
111
+ "signature": "[QK:HRESUME-CREATED-WORKSPACE]",
112
+ "signatureSource": "pi-extensions/lib/herdr-resume-call.test.ts"
113
+ },
114
+ {
115
+ "claim": "HRESUME-ROOT-PANE-OCCUPIED",
116
+ "title": "the pre-start occupancy check falls back to the session fact alone, so pi is started into a created pane where herdr already names an agent whose session was not reported yet",
117
+ "subject": "pi-extensions/lib/herdr-resume-call.ts",
118
+ "find": ["\tif (pane.agent !== undefined || pane.hasAgentSession) {"],
119
+ "replace": ["\tif (pane.hasAgentSession) {"],
120
+ "gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
121
+ "timeoutSeconds": 60,
122
+ "signature": "[QK:HRESUME-ROOT-PANE-OCCUPIED]",
123
+ "signatureSource": "pi-extensions/lib/herdr-resume-call.test.ts"
124
+ },
125
+ {
126
+ "claim": "HRESUME-START-FAILURE-RECLAIMS",
127
+ "title": "a start failure skips the conditional reclaim and reports an unknown outcome, so an empty created pane is left behind and an occupied one is never named",
128
+ "subject": "pi-extensions/lib/herdr-resume-call.ts",
129
+ "find": [
130
+ "\t\t\treason: \"herdr-agent-start-failed\",",
131
+ "\t\t\t...(code === undefined ? {} : { herdrErrorCode: code }),",
132
+ "\t\t\trecovery: await reclaim(pane, run),"
133
+ ],
134
+ "replace": [
135
+ "\t\t\treason: \"herdr-agent-start-failed\",",
136
+ "\t\t\t...(code === undefined ? {} : { herdrErrorCode: code }),",
137
+ "\t\t\trecovery: { outcome: \"unknown\" },"
138
+ ],
139
+ "gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
140
+ "timeoutSeconds": 60,
141
+ "signature": "[QK:HRESUME-START-FAILURE-RECLAIMS]",
142
+ "signatureSource": "pi-extensions/lib/herdr-resume-call.test.ts"
143
+ },
144
+ {
145
+ "claim": "HRESUME-PANE-DRIFT-NAMED",
146
+ "title": "a start reporting another pane id is accepted, so the receipt points at a pane that never held the reopened citizen",
147
+ "subject": "pi-extensions/lib/herdr-resume-call.ts",
148
+ "find": ["\t\tstarted.pane.paneId !== pane.paneId ||"],
149
+ "replace": ["\t\tfalse ||"],
150
+ "gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
151
+ "timeoutSeconds": 60,
152
+ "signature": "[QK:HRESUME-PANE-DRIFT-NAMED]",
153
+ "signatureSource": "pi-extensions/lib/herdr-resume-call.test.ts"
154
+ },
155
+ {
156
+ "claim": "HRESUME-ARGV-DRIFT-NAMED",
157
+ "title": "the echoed-argv check is dropped, so a pi started on something other than the record's transcript reads as a successful launch",
158
+ "subject": "pi-extensions/lib/herdr-resume-call.ts",
159
+ "find": ["\tif (!argvMatchesRequest(started.argv, \"pi\", params.runtimeArgs)) {"],
160
+ "replace": ["\tif (false) {"],
161
+ "gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
162
+ "timeoutSeconds": 60,
163
+ "signature": "[QK:HRESUME-ARGV-DRIFT-NAMED]",
164
+ "signatureSource": "pi-extensions/lib/herdr-resume-call.test.ts"
165
+ },
166
+ {
167
+ "claim": "HRESUME-OUTCOME-MAPPING",
168
+ "title": "every herdr failure reaches the v2 seam as a bare refusal, so a failure after the tab create loses its recovery and created tab",
169
+ "subject": "pi-extensions/lib/herdr-resume-call.ts",
170
+ "find": ["\tif (!(\"recovery\" in result)) return { ok: false, reason: result.reason, hint };"],
171
+ "replace": ["\tif (true) return { ok: false, reason: result.reason, hint };"],
172
+ "gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
173
+ "timeoutSeconds": 60,
174
+ "signature": "[QK:HRESUME-OUTCOME-MAPPING]",
175
+ "signatureSource": "pi-extensions/lib/herdr-resume-call.test.ts"
176
+ },
177
+ {
178
+ "claim": "HRESUME-IMPORT-FENCE",
179
+ "title": "the herdr resume launch gains a bare side-effect import, the weakest static form, which loads and runs fine, so only the exact import-set parser can see the new dependency",
180
+ "subject": "pi-extensions/lib/herdr-resume-call.ts",
181
+ "find": ["import { randomBytes } from \"node:crypto\";"],
182
+ "replace": ["import { randomBytes } from \"node:crypto\";", "import \"node:path\";"],
183
+ "gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
184
+ "timeoutSeconds": 60,
185
+ "signature": "[QK:HRESUME-IMPORT-FENCE]",
186
+ "signatureSource": "pi-extensions/lib/herdr-resume-call.test.ts"
187
+ },
188
+ {
189
+ "claim": "HRESUME-PD-ROUTED",
190
+ "title": "a pi-durable resume inside herdr falls through to the pi-only agent-start path and is refused as an unsupported backend",
191
+ "subject": "pi-extensions/lib/herdr-resume-call.ts",
192
+ "find": ["\tif (input.backend === \"pi-durable\") {"],
193
+ "replace": ["\tif (input.backend === \"pi_durable\") {"],
194
+ "gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
195
+ "timeoutSeconds": 60,
196
+ "signature": "[QK:HRESUME-PD-ROUTED]",
197
+ "signatureSource": "pi-extensions/lib/herdr-resume-call.test.ts"
198
+ },
199
+ {
200
+ "claim": "HRESUME-PD-PRE-WRITE-REFUSALS",
201
+ "title": "a control character in the adopt env is no longer refused before the socket, so it reaches herdr",
202
+ "subject": "pi-extensions/lib/herdr-resume-call.ts",
203
+ "find": ["\tif (command.some(containsControlChar) || Object.values(launchEnv).some(containsControlChar)) {"],
204
+ "replace": ["\tif (command.some(containsControlChar)) {"],
205
+ "gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
206
+ "timeoutSeconds": 60,
207
+ "signature": "[QK:HRESUME-PD-PRE-WRITE-REFUSALS]",
208
+ "signatureSource": "pi-extensions/lib/herdr-resume-call.test.ts"
209
+ },
210
+ {
211
+ "claim": "HRESUME-PD-LAYOUT-PACKET",
212
+ "title": "the layout env carries the sessions root under the receivers name, so the child refuses adopt-root-mismatch",
213
+ "subject": "pi-extensions/lib/herdr-resume-call.ts",
214
+ "find": ["\t\tENTWURF_META_RECEIVERS_DIR: params.adoptEnv.ENTWURF_META_RECEIVERS_DIR,"],
215
+ "replace": ["\t\tENTWURF_META_RECEIVERS_DIR: params.adoptEnv.ENTWURF_META_SESSIONS_DIR,"],
216
+ "gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
217
+ "timeoutSeconds": 60,
218
+ "signature": "[QK:HRESUME-PD-LAYOUT-PACKET]",
219
+ "signatureSource": "pi-extensions/lib/herdr-resume-call.test.ts"
220
+ },
221
+ {
222
+ "claim": "HRESUME-PD-SUCCESS-RECEIPT",
223
+ "title": "the receipt names the pane id as the tab id",
224
+ "subject": "pi-extensions/lib/herdr-resume-call.ts",
225
+ "find": ["\t\t\therdrTabId: applied.tabId,"],
226
+ "replace": ["\t\t\therdrTabId: applied.paneId,"],
227
+ "gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
228
+ "timeoutSeconds": 60,
229
+ "signature": "[QK:HRESUME-PD-SUCCESS-RECEIPT]",
230
+ "signatureSource": "pi-extensions/lib/herdr-resume-call.test.ts"
231
+ },
232
+ {
233
+ "claim": "HRESUME-PD-WRITE-CERTAINTY",
234
+ "title": "every layout failure reaches the v2 seam as unknown, so a request herdr never received keeps the reservation forever",
235
+ "subject": "pi-extensions/lib/herdr-resume-call.ts",
236
+ "find": ["\t\t\t\trecovery: result.recovery,\n\t\t\t},"],
237
+ "replace": ["\t\t\t\trecovery: { outcome: \"unknown\" },\n\t\t\t},"],
238
+ "gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
239
+ "timeoutSeconds": 60,
240
+ "signature": "[QK:HRESUME-PD-WRITE-CERTAINTY]",
241
+ "signatureSource": "pi-extensions/lib/herdr-resume-call.test.ts"
242
+ },
243
+ {
244
+ "claim": "HRESUME-PD-FAILURE-RAIL",
245
+ "title": "a pi-durable layout failure reaches the v2 seam tagged as the pi rail's herdr tab, so its receipt names a tab create step that never ran",
246
+ "subject": "pi-extensions/lib/herdr-resume-call.ts",
247
+ "find": ["\t\t\t\trail: \"herdr-layout\","],
248
+ "replace": ["\t\t\t\trail: \"herdr\","],
249
+ "gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
250
+ "timeoutSeconds": 60,
251
+ "signature": "[QK:HRESUME-PD-FAILURE-RAIL]",
252
+ "signatureSource": "pi-extensions/lib/herdr-resume-call.test.ts"
253
+ },
254
+ {
255
+ "claim": "HRESUME-CC-LAYOUT-VECTOR",
256
+ "title": "the Claude Code layout vector drops the record's argv, so herdr starts a bare claude that opens a NEW session instead of resuming this one",
257
+ "subject": "pi-extensions/lib/herdr-resume-call.ts",
258
+ "find": ["\tconst command = [HERDR_CLAUDE_CODE_RESUME_RUNTIME, ...params.runtimeArgs];"],
259
+ "replace": ["\tconst command = [HERDR_CLAUDE_CODE_RESUME_RUNTIME];"],
260
+ "gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
261
+ "timeoutSeconds": 60,
262
+ "signature": "[QK:HRESUME-CC-LAYOUT-VECTOR]",
263
+ "signatureSource": "pi-extensions/lib/herdr-resume-call.test.ts"
264
+ },
265
+ {
266
+ "claim": "HRESUME-CC-PANE-CHILD",
267
+ "title": "the process read no longer checks that herdr described THIS pane, so another pane's child becomes the pid the observation joins",
268
+ "subject": "pi-extensions/lib/herdr-resume-call.ts",
269
+ "find": ["\tif (envelope.result.type !== \"pane_process_info\" || !isRecord(info) || info.pane_id !== paneId) {"],
270
+ "replace": ["\tif (envelope.result.type !== \"pane_process_info\" || !isRecord(info)) {"],
271
+ "gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
272
+ "timeoutSeconds": 60,
273
+ "signature": "[QK:HRESUME-CC-PANE-CHILD]",
274
+ "signatureSource": "pi-extensions/lib/herdr-resume-call.test.ts"
275
+ },
276
+ {
277
+ "claim": "HRESUME-CC-FAILURE-SHARED",
278
+ "title": "the Claude Code launch takes the shared pi-durable hint for a missing herdr endpoint, so its refusal names pi-durable — the wrong backend — instead of Claude Code",
279
+ "subject": "pi-extensions/lib/herdr-resume-call.ts",
280
+ "find": ["\treturn { ...shared, hint: HERDR_CLAUDE_CODE_SOCKET_PATH_HINT };"],
281
+ "replace": ["\treturn shared;"],
282
+ "gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
283
+ "timeoutSeconds": 60,
284
+ "signature": "[QK:HRESUME-CC-FAILURE-SHARED]",
285
+ "signatureSource": "pi-extensions/lib/herdr-resume-call.test.ts"
286
+ }
287
+ ]
288
+ }
@@ -406,6 +406,54 @@
406
406
  "timeoutSeconds": 300,
407
407
  "signature": "[QK:HRB-PREPARE-STDOUT-CLEAN]",
408
408
  "signatureSource": "scripts/check-herdr-runtime-bootstrap.ts"
409
+ },
410
+ {
411
+ "claim": "HRB-ADMISSION-BEFORE-SWAP",
412
+ "title": "the runtime never asks the caller's admission, so a floor host swaps in a candidate whose reader nobody observed (#153)",
413
+ "subject": "scripts/herdr-runtime.mjs",
414
+ "find": ["\t\tif (admitCandidate !== undefined) {"],
415
+ "replace": ["\t\tif (false) {"],
416
+ "gate": ["bash", "run.sh", "check-herdr-runtime-bootstrap"],
417
+ "timeoutSeconds": 300,
418
+ "signature": "[QK:HRB-ADMISSION-BEFORE-SWAP]",
419
+ "signatureSource": "scripts/check-herdr-runtime-bootstrap.ts"
420
+ },
421
+ {
422
+ "claim": "HRB-ADMISSION-REFUSAL-RETAINS",
423
+ "title": "the admission runs after the try that reclaims a failed candidate, so a refused candidate leaves its staging tree and our cache behind for the next run to trip over (#153)",
424
+ "subject": "scripts/herdr-runtime.mjs",
425
+ "find": [
426
+ "\t\tif (admitCandidate !== undefined) {\n\t\t\tconst verdict = admitCandidate(\n\t\t\t\tpath.join(layout.stagingDir, \"node_modules\", completenessOf(requested, acquired).name),\n\t\t\t);\n\t\t\tif (verdict !== undefined) {\n\t\t\t\tthrow new RuntimeBootstrapError(\n\t\t\t\t\t\"runtime-candidate-admission-invalid\",\n\t\t\t\t\t`admitCandidate returned ${typeof verdict}; admission is synchronous: return nothing to admit, throw to refuse`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t} catch (err) {\n\t\tremoveTree(layout.stagingDir);\n\t\t// A half-fetched tarball left in the cache is the thing a retry would trip over: npm's own\n\t\t// cache entry may be incomplete, and OUR cache is the only place this transaction wrote.\n\t\tremoveTree(layout.cacheDir);\n\t\tthrow err;\n\t}\n\n\tlet backedUp = false;"
427
+ ],
428
+ "replace": [
429
+ "\t} catch (err) {\n\t\tremoveTree(layout.stagingDir);\n\t\t// A half-fetched tarball left in the cache is the thing a retry would trip over: npm's own\n\t\t// cache entry may be incomplete, and OUR cache is the only place this transaction wrote.\n\t\tremoveTree(layout.cacheDir);\n\t\tthrow err;\n\t}\n\n\tif (admitCandidate !== undefined) {\n\t\tconst verdict = admitCandidate(\n\t\t\tpath.join(layout.stagingDir, \"node_modules\", completenessOf(requested, acquired).name),\n\t\t);\n\t\tif (verdict !== undefined) {\n\t\t\tthrow new RuntimeBootstrapError(\n\t\t\t\t\"runtime-candidate-admission-invalid\",\n\t\t\t\t`admitCandidate returned ${typeof verdict}; admission is synchronous: return nothing to admit, throw to refuse`,\n\t\t\t);\n\t\t}\n\t}\n\tlet backedUp = false;"
430
+ ],
431
+ "gate": ["bash", "run.sh", "check-herdr-runtime-bootstrap"],
432
+ "timeoutSeconds": 300,
433
+ "signature": "[QK:HRB-ADMISSION-REFUSAL-RETAINS]",
434
+ "signatureSource": "scripts/check-herdr-runtime-bootstrap.ts"
435
+ },
436
+ {
437
+ "claim": "HRB-ADMISSION-VOID-ONLY",
438
+ "title": "a value returned by the admission is read as consent, so a Promise whose refusal arrives later lets the swap happen first (#153)",
439
+ "subject": "scripts/herdr-runtime.mjs",
440
+ "find": ["\t\t\tif (verdict !== undefined) {"],
441
+ "replace": ["\t\t\tif (false) {"],
442
+ "gate": ["bash", "run.sh", "check-herdr-runtime-bootstrap"],
443
+ "timeoutSeconds": 300,
444
+ "signature": "[QK:HRB-ADMISSION-VOID-ONLY]",
445
+ "signatureSource": "scripts/check-herdr-runtime-bootstrap.ts"
446
+ },
447
+ {
448
+ "claim": "HRB-ADMISSION-CALLBACK-SHAPE",
449
+ "title": "an admission that cannot be called is discovered as a TypeError after the journal already says installing, instead of a named refusal before the first byte (#153)",
450
+ "subject": "scripts/herdr-runtime.mjs",
451
+ "find": ["\tif (admitCandidate !== undefined && typeof admitCandidate !== \"function\") {"],
452
+ "replace": ["\tif (false) {"],
453
+ "gate": ["bash", "run.sh", "check-herdr-runtime-bootstrap"],
454
+ "timeoutSeconds": 300,
455
+ "signature": "[QK:HRB-ADMISSION-CALLBACK-SHAPE]",
456
+ "signatureSource": "scripts/check-herdr-runtime-bootstrap.ts"
409
457
  }
410
458
  ]
411
459
  }
@@ -45,6 +45,21 @@
45
45
  "timeoutSeconds": 120,
46
46
  "signature": "[QK:MF-USAGE]",
47
47
  "signatureSource": "scripts/check-meta-facts.ts"
48
+ },
49
+ {
50
+ "claim": "MF-HELP-POINTER",
51
+ "title": "the dash refusal points at another command's description, so an agent that followed it reads help for the wrong verb (#153)",
52
+ "subject": "scripts/meta-facts.ts",
53
+ "find": [
54
+ "\tconsole.error(\"meta-facts: see `entwurf help meta-facts` (from that checkout's root: `./run.sh help meta-facts`)\");"
55
+ ],
56
+ "replace": [
57
+ "\tconsole.error(\"meta-facts: see `entwurf help peer-facts` (from that checkout's root: `./run.sh help peer-facts`)\");"
58
+ ],
59
+ "gate": ["bash", "run.sh", "check-meta-facts"],
60
+ "timeoutSeconds": 120,
61
+ "signature": "[QK:MF-HELP-POINTER]",
62
+ "signatureSource": "scripts/check-meta-facts.ts"
48
63
  }
49
64
  ]
50
65
  }
@@ -127,7 +127,7 @@
127
127
  "title": "the fresh-call surface drops the optional cwd from its schema, so cross-repo fresh silently cannot exist from any caller — pi included, which reaches this bridge since #125",
128
128
  "subject": "mcp/entwurf-bridge/src/index.ts",
129
129
  "find": [
130
- "\t\tcwd: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Optional literal ABSOLUTE path of an existing directory to start the sibling in (cross-repo fresh). Omit or pass \\\"\\\" to start where the CALLER is — this agent's own cwd on BOTH rails, or for a Codex caller its own record directory, because this bridge is the app-server's child and that process's directory is not the caller's. Taken exactly as given: no trim, no realpath, no project-name resolution. '#' is refused on the tmux rail only, because tmux format-expands a start directory; inside herdr it is an ordinary path character. The receipt echoes the directory that was REQUESTED or the caller record it came from, never an observation of where the pane landed.\",\n\t\t\t),\n"
130
+ "\t\tcwd: z.string().optional().describe(ENTWURF_TOOL_GUIDANCE.entwurf_fresh_call.parameters[\"cwd\"]),\n"
131
131
  ],
132
132
  "replace": [""],
133
133
  "gate": ["bash", "run.sh", "check-mux-fresh-call"],
@@ -153,7 +153,7 @@
153
153
  "title": "MCP drops the required model field from fresh-call while the composition still expects one",
154
154
  "subject": "mcp/entwurf-bridge/src/index.ts",
155
155
  "find": [
156
- "\t\tmodel: z\n\t\t\t.string()\n\t\t\t.min(1)\n\t\t\t.max(200)\n\t\t\t// The `\\[` below is USELESS TO JS AND LOAD-BEARING TO THE HOST. zod emits this source\n\t\t\t// text verbatim as the JSON Schema `pattern`, and the host's tool-schema validator is a\n\t\t\t// Rust regex engine that rejects an unescaped `[` inside a character class as \"unclosed\n\t\t\t// character class\" — a 400 on tools/list that stops EVERY Claude session from opening\n\t\t\t// (7-M-fix). Biome's safe fix removes it; do not accept that fix. The suppression must\n\t\t\t// stay on the line DIRECTLY above the expression, or it attaches to nothing and reads\n\t\t\t// as an unused suppression while the escape goes back to being fixable.\n\t\t\t// biome-ignore lint/complexity/noUselessEscapeInRegex: emitted to a Rust regex validator, see above\n\t\t\t.regex(/^[A-Za-z0-9][A-Za-z0-9._/:\\[\\]-]*$/)\n\t\t\t.describe(\n\t\t\t\t\"Required runtime model: canonical provider/model for pi (a bare alias is refused), provider/<exact catalog model id> for pi-durable, a Claude Code model id/alias, or a Copilot/OMP/Codex model name. Neither pi nor pi-durable may name the openrouter provider.\",\n\t\t\t),\n"
156
+ "\t\tmodel: z\n\t\t\t.string()\n\t\t\t.min(1)\n\t\t\t.max(200)\n\t\t\t// The `\\[` below is USELESS TO JS AND LOAD-BEARING TO THE HOST. zod emits this source\n\t\t\t// text verbatim as the JSON Schema `pattern`, and the host's tool-schema validator is a\n\t\t\t// Rust regex engine that rejects an unescaped `[` inside a character class as \"unclosed\n\t\t\t// character class\" — a 400 on tools/list that stops EVERY Claude session from opening\n\t\t\t// (7-M-fix). Biome's safe fix removes it; do not accept that fix. The suppression must\n\t\t\t// stay on the line DIRECTLY above the expression, or it attaches to nothing and reads\n\t\t\t// as an unused suppression while the escape goes back to being fixable.\n\t\t\t// biome-ignore lint/complexity/noUselessEscapeInRegex: emitted to a Rust regex validator, see above\n\t\t\t.regex(/^[A-Za-z0-9][A-Za-z0-9._/:\\[\\]-]*$/)\n\t\t\t.describe(ENTWURF_TOOL_GUIDANCE.entwurf_fresh_call.parameters[\"model\"]),\n"
157
157
  ],
158
158
  "replace": [""],
159
159
  "gate": ["bash", "run.sh", "check-mux-fresh-call"],
@@ -514,7 +514,7 @@
514
514
  "title": "the fresh-call surface drops the optional seat from its schema, so opening a sibling in the operator's project session silently cannot exist from any caller",
515
515
  "subject": "mcp/entwurf-bridge/src/index.ts",
516
516
  "find": [
517
- "\t\tplacement: z\n\t\t\t.object({\n\t\t\t\ttmuxSession: z\n\t\t\t\t\t.string()\n\t\t\t\t\t.describe(\n\t\t\t\t\t\t\"EXACT name of an EXISTING session on this agent's own tmux server. Nothing is created: an absent session is refused as tmux-session-missing, and a name outside [A-Za-z0-9][A-Za-z0-9_-]* as tmux-session-name-invalid.\",\n\t\t\t\t\t),\n\t\t\t})\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Optional expert seat override, TMUX ONLY: open the sibling in ONE EXISTING tmux session of this agent's own server, and it always wins. When omitted the seat follows the CALLER, never the backend being opened: a Codex CALLER opens beside its own TUI pane, matched by thread-id in that pane's terminal title (0 or 2+ matching panes refuse, never fall back); every other caller opens in its own session. A pane title is a placement input only — never an address, liveness or delivery fact. Nothing is ever created. Inside herdr this field is refused by name — placement there belongs to herdr, and a tmux session name would silently place the sibling somewhere else. Independent of cwd; neither is inferred from the other. The receipt reports the selected name (absent for the caller-pane rule, which observed a session rather than requesting a name), its source, and resolved target session id.\",\n\t\t\t),\n"
517
+ "\t\tplacement: z\n\t\t\t.object({\n\t\t\t\ttmuxSession: z.string().describe(ENTWURF_TOOL_GUIDANCE.entwurf_fresh_call.parameters[\"placement.tmuxSession\"]),\n\t\t\t})\n\t\t\t.optional()\n\t\t\t.describe(ENTWURF_TOOL_GUIDANCE.entwurf_fresh_call.parameters[\"placement\"]),\n"
518
518
  ],
519
519
  "replace": [""],
520
520
  "gate": ["bash", "run.sh", "check-mux-fresh-call"],
@@ -781,6 +781,17 @@
781
781
  "timeoutSeconds": 120,
782
782
  "signature": "[QK:PD-FRESH-LIVE-BOOTSTRAP-ORDER]",
783
783
  "signatureSource": "test/pi-durable-fresh-live-receipts.test.ts"
784
+ },
785
+ {
786
+ "claim": "FRESHCALL-LAUNCH-REJECT-HINTS-FROM-ROOT",
787
+ "title": "one static tmux launch-stage hint is inlined as a literal one byte away from the Root text, so the reader and its byte oracle stay green and only the rendered refusal can disagree with Root",
788
+ "subject": "pi-extensions/lib/mux-fresh-call.ts",
789
+ "find": ["\t\"anchor-malformed\": ENTWURF_FRESH_LAUNCH_REJECT_HINTS[\"anchor-malformed\"],"],
790
+ "replace": ["\t\"anchor-malformed\": \"TMUX_PANE is not a native pane id\","],
791
+ "gate": ["bash", "run.sh", "check-mux-fresh-call"],
792
+ "timeoutSeconds": 120,
793
+ "signature": "[QK:FRESHCALL-LAUNCH-REJECT-HINTS-FROM-ROOT]",
794
+ "signatureSource": "test/mux-fresh-call.test.ts"
784
795
  }
785
796
  ]
786
797
  }
@@ -98,12 +98,12 @@
98
98
  {
99
99
  "claim": "MUXRESUME-DESC-CONTRACT-MCP",
100
100
  "title": "the MCP description drops the dormant-only scope, inviting callers to aim the verb at live citizens it will refuse",
101
- "subject": "mcp/entwurf-bridge/src/index.ts",
101
+ "subject": "ENTWURF.json",
102
102
  "find": [
103
- "\t\"Reopen ONE DORMANT pi or Claude Code citizen under its OWN garden id, in a visible window in the operator's \" +"
103
+ "Only on an explicit operator request, reopen ONE DORMANT pi, pi-durable or Claude Code citizen under its OWN garden id, in a visible window in the operator's "
104
104
  ],
105
105
  "replace": [
106
- "\t\"Reopen ONE pi or Claude Code citizen under its OWN garden id, in a visible window in the operator's \" +"
106
+ "Only on an explicit operator request, reopen ONE pi, pi-durable or Claude Code citizen under its OWN garden id, in a visible window in the operator's "
107
107
  ],
108
108
  "gate": ["bash", "run.sh", "check-mux-resume-call"],
109
109
  "timeoutSeconds": 60,
@@ -155,6 +155,92 @@
155
155
  "timeoutSeconds": 60,
156
156
  "signature": "[QK:MUXRESUME-ARGV-IDENTITY-SCRUB]",
157
157
  "signatureSource": "scripts/check-mux-resume-call.ts"
158
+ },
159
+ {
160
+ "claim": "MUXRESUME-LAUNCH-REJECT-HINTS-FROM-ROOT",
161
+ "title": "one launch-stage resume hint is inlined as a literal one byte away from the Root text, so the reader and its byte oracle stay green and only the table-to-Root wiring can disagree",
162
+ "subject": "pi-extensions/lib/mux-resume-call.ts",
163
+ "find": ["\t\"anchor-malformed\": ENTWURF_RESUME_LAUNCH_REJECT_HINTS[\"anchor-malformed\"],"],
164
+ "replace": ["\t\"anchor-malformed\": \"TMUX_PANE is not a native pane id\","],
165
+ "gate": ["bash", "run.sh", "check-mux-resume-call"],
166
+ "timeoutSeconds": 60,
167
+ "signature": "[QK:MUXRESUME-LAUNCH-REJECT-HINTS-FROM-ROOT]",
168
+ "signatureSource": "scripts/check-mux-resume-call.ts"
169
+ },
170
+ {
171
+ "claim": "MUXRESUME-IMPORT-SET",
172
+ "title": "the resume composition gains a bare side-effect import, the weakest static form, which loads and runs fine, so only the exact import-set parser can see the new lane",
173
+ "subject": "pi-extensions/lib/mux-resume-call.ts",
174
+ "find": ["import { ENTWURF_RESUME_LAUNCH_REJECT_HINTS } from \"./agent-guidance.ts\";"],
175
+ "replace": [
176
+ "import { ENTWURF_RESUME_LAUNCH_REJECT_HINTS } from \"./agent-guidance.ts\";",
177
+ "import \"node:path\";"
178
+ ],
179
+ "gate": ["bash", "run.sh", "check-mux-resume-call"],
180
+ "timeoutSeconds": 60,
181
+ "signature": "[QK:MUXRESUME-IMPORT-SET]",
182
+ "signatureSource": "scripts/check-mux-resume-call.ts"
183
+ },
184
+ {
185
+ "claim": "MUXRESUME-V2-NO-HERDR-IMPORT",
186
+ "title": "the v2 composition imports a herdr module directly, so the herdr CLI rail enters entwurf core instead of arriving through the injected seam",
187
+ "subject": "pi-extensions/lib/entwurf-v2-visible-resume.ts",
188
+ "find": ["import { buildResumePiArgs } from \"./entwurf-resume-args.ts\";"],
189
+ "replace": [
190
+ "import { buildResumePiArgs } from \"./entwurf-resume-args.ts\";\nimport { HERDR_AGENT_KIND } from \"./herdr-fresh-call.ts\";\nvoid HERDR_AGENT_KIND;"
191
+ ],
192
+ "gate": ["bash", "run.sh", "check-mux-resume-call"],
193
+ "timeoutSeconds": 60,
194
+ "signature": "[QK:MUXRESUME-V2-NO-HERDR-IMPORT]",
195
+ "signatureSource": "scripts/check-mux-resume-call.ts"
196
+ },
197
+ {
198
+ "claim": "MUXRESUME-HERDR-COMPOSED",
199
+ "title": "the bridge bypasses the shared rail root and calls the tmux leaf directly, so every resume inside herdr is refused by the tmux leaf",
200
+ "subject": "mcp/entwurf-bridge/src/index.ts",
201
+ "find": [
202
+ "const visibleResumeLaunch: VisibleResumeDeps[\"launch\"] = (input) => dispatchResumeLaunch(input, tmuxResumeLaunch);"
203
+ ],
204
+ "replace": [
205
+ "const visibleResumeLaunch: VisibleResumeDeps[\"launch\"] = (input) => tmuxResumeLaunch(input);\nvoid dispatchResumeLaunch;"
206
+ ],
207
+ "gate": ["bash", "run.sh", "check-mux-resume-call"],
208
+ "timeoutSeconds": 60,
209
+ "signature": "[QK:MUXRESUME-HERDR-COMPOSED]",
210
+ "signatureSource": "scripts/check-mux-resume-call.ts"
211
+ },
212
+ {
213
+ "claim": "MUXRESUME-PD-ADOPT-ENV",
214
+ "title": "the tmux window drops the profile assignment, so the child's SDK reads the tmux server's profile",
215
+ "subject": "pi-extensions/lib/mux-resume-call.ts",
216
+ "find": ["\t\t...adoptAssignments.flatMap((assignment) => [\"-e\", assignment]),"],
217
+ "replace": ["\t\t...adoptAssignments.slice(1).flatMap((assignment) => [\"-e\", assignment]),"],
218
+ "gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
219
+ "timeoutSeconds": 60,
220
+ "signature": "[QK:MUXRESUME-PD-ADOPT-ENV]",
221
+ "signatureSource": "pi-extensions/lib/mux-resume-call.test.ts"
222
+ },
223
+ {
224
+ "claim": "MUXRESUME-PD-ADOPT-ABSOLUTE",
225
+ "title": "a relative projection value reaches tmux",
226
+ "subject": "pi-extensions/lib/mux-resume-call.ts",
227
+ "find": ["\t\tif (typeof value !== \"string\" || !value.startsWith(\"/\")) {"],
228
+ "replace": ["\t\tif (typeof value !== \"string\") {"],
229
+ "gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
230
+ "timeoutSeconds": 60,
231
+ "signature": "[QK:MUXRESUME-PD-ADOPT-ABSOLUTE]",
232
+ "signatureSource": "pi-extensions/lib/mux-resume-call.test.ts"
233
+ },
234
+ {
235
+ "claim": "MUXRESUME-PD-MANAGED-RUNTIME",
236
+ "title": "the pi-durable window starts bare pi instead of the managed entwurf verb",
237
+ "subject": "pi-extensions/lib/mux-resume-call.ts",
238
+ "find": ["\treturn openResumeWindow(RESUME_CALL_PI_DURABLE_RUNTIME, params, params.adoptEnv, env);"],
239
+ "replace": ["\treturn openResumeWindow(RESUME_CALL_RUNTIME.pi, params, params.adoptEnv, env);"],
240
+ "gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
241
+ "timeoutSeconds": 60,
242
+ "signature": "[QK:MUXRESUME-PD-MANAGED-RUNTIME]",
243
+ "signatureSource": "pi-extensions/lib/mux-resume-call.test.ts"
158
244
  }
159
245
  ]
160
246
  }
@@ -93,6 +93,21 @@
93
93
  "timeoutSeconds": 120,
94
94
  "signature": "[QK:PF-USAGE]",
95
95
  "signatureSource": "scripts/check-peer-facts.ts"
96
+ },
97
+ {
98
+ "claim": "PF-HELP-POINTER",
99
+ "title": "the dash refusal points at another command's description, so an agent that followed it reads help for the wrong verb (#153)",
100
+ "subject": "scripts/peer-facts.ts",
101
+ "find": [
102
+ "\tconsole.error(\"peer-facts: see `entwurf help peer-facts` (from that checkout's root: `./run.sh help peer-facts`)\");"
103
+ ],
104
+ "replace": [
105
+ "\tconsole.error(\"peer-facts: see `entwurf help meta-facts` (from that checkout's root: `./run.sh help meta-facts`)\");"
106
+ ],
107
+ "gate": ["bash", "run.sh", "check-peer-facts"],
108
+ "timeoutSeconds": 120,
109
+ "signature": "[QK:PF-HELP-POINTER]",
110
+ "signatureSource": "scripts/check-peer-facts.ts"
96
111
  }
97
112
  ]
98
113
  }