@junghanacs/entwurf 0.41.2 → 0.50.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +4 -2
- package/BASELINE.md +110 -1
- package/CHANGELOG.md +328 -0
- package/CONTRIBUTING.md +1 -1
- package/ENTWURF-CLI.json +1229 -0
- package/ENTWURF.json +284 -0
- package/FAQ.md +4 -4
- package/README.md +125 -184
- package/VERIFY.md +2 -2
- package/docs/external-mcp-host.md +3 -3
- package/docs/setup-clean-host.md +37 -12
- package/mcp/entwurf-bridge/dist/ENTWURF.json +284 -0
- package/mcp/entwurf-bridge/dist/mcp/entwurf-bridge/src/index.js +46 -196
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/agent-guidance.js +299 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-surface.js +21 -25
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-visible-resume.js +498 -29
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/fresh-call-dispatch.js +47 -10
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/herdr-fresh-call.js +613 -33
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/herdr-resume-call.js +497 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/meta-session.js +3 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-fresh-call.js +23 -20
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-resume-call.js +68 -21
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-fresh-preflight.js +7 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-location.js +347 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-owner-fence.js +1132 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-runtime.js +1 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/remote-pair-send.js +7 -4
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/resume-launch-identity.js +18 -11
- package/mcp/entwurf-bridge/dist/pi-extensions/meta-bridge-pi-durable.js +53 -60
- package/mcp/entwurf-bridge/dist/scripts/herdr-rails.mjs +40 -7
- package/mcp/entwurf-bridge/dist/scripts/meta-bridge-fresh-cut.js +1 -27
- package/mcp/entwurf-bridge/dist/scripts/meta-bridge-prune.js +1 -1
- package/mcp/entwurf-bridge/dist/scripts/meta-facts.js +1 -1
- package/mcp/entwurf-bridge/dist/scripts/peer-facts.js +1 -1
- package/mcp/entwurf-bridge/src/index.ts +149 -327
- package/mcp/entwurf-bridge/tsconfig.build.json +7 -1
- package/native/win32-x64/manifest.json +1 -1
- package/package.json +8 -4
- package/pi/pi-durable/bootstrap.mjs +179 -6
- package/pi/pi-durable/carrier/runtime.js +108 -9
- package/pi/pi-durable/carrier/session-name.js +11 -0
- package/pi/pi-durable/carrier/sessions.js +96 -20
- package/pi/pi-durable/overlay/upstream-pin.json +11 -5
- package/pi-extensions/lib/agent-guidance.ts +341 -0
- package/pi-extensions/lib/entwurf-v2-surface.ts +25 -31
- package/pi-extensions/lib/entwurf-v2-visible-resume.ts +725 -54
- package/pi-extensions/lib/fresh-call-dispatch.ts +64 -12
- package/pi-extensions/lib/herdr-fresh-call.ts +919 -40
- package/pi-extensions/lib/herdr-resume-call.ts +810 -0
- package/pi-extensions/lib/meta-session.ts +13 -8
- package/pi-extensions/lib/mux-fresh-call.ts +23 -26
- package/pi-extensions/lib/mux-resume-call.ts +95 -23
- package/pi-extensions/lib/pi-durable-fresh-preflight.ts +9 -2
- package/pi-extensions/lib/pi-durable-location.ts +446 -0
- package/pi-extensions/lib/pi-durable-owner-fence.ts +1461 -0
- package/pi-extensions/lib/pi-durable-runtime.ts +4 -0
- package/pi-extensions/lib/remote-pair-send.ts +7 -4
- package/pi-extensions/lib/resume-launch-identity.ts +31 -12
- package/pi-extensions/meta-bridge-pi-durable.ts +52 -79
- package/run.sh +417 -654
- package/scripts/build-bridge.sh +10 -0
- package/scripts/check-capability-bundle-reach.ts +86 -0
- package/scripts/check-claude-launch.ts +341 -0
- package/scripts/check-entwurf-self-address.ts +3 -3
- package/scripts/check-entwurf-v2-surface.ts +94 -98
- package/scripts/check-fresh-call-dispatch.ts +70 -9
- package/scripts/check-fresh-cut-gate.sh +23 -9
- package/scripts/check-gate-qualification.ts +24 -17
- package/scripts/check-herdr-activation.ts +301 -23
- package/scripts/check-herdr-fresh-call.ts +161 -25
- package/scripts/check-herdr-plugin-build.ts +173 -1
- package/scripts/check-herdr-plugin.ts +28 -2
- package/scripts/check-herdr-runtime-bootstrap.ts +136 -0
- package/scripts/check-install-surface.ts +1236 -6
- package/scripts/check-meta-doctor-oracle.sh +1 -1
- package/scripts/check-meta-facts.ts +20 -1
- package/scripts/check-mux-resume-call.ts +48 -3
- package/scripts/check-peer-facts.ts +39 -2
- package/scripts/cli-help.mjs +222 -0
- package/scripts/dev-bin.sh +39 -2
- package/scripts/herdr-activation.mjs +28 -6
- package/scripts/herdr-operator-link.mjs +389 -0
- package/scripts/herdr-plugin-activate.mjs +5 -0
- package/scripts/herdr-plugin-deactivate.mjs +18 -5
- package/scripts/herdr-rails.mjs +43 -7
- package/scripts/herdr-runtime.mjs +27 -0
- package/scripts/meta-bridge-fresh-cut.ts +1 -27
- package/scripts/meta-bridge-prune.ts +1 -1
- package/scripts/meta-facts.ts +1 -1
- package/scripts/mutants/agent-guidance.json +160 -0
- package/scripts/mutants/bridge-boot-resume.json +6 -8
- package/scripts/mutants/capability-bundle-reach.json +124 -0
- package/scripts/mutants/claude-launch.json +142 -0
- package/scripts/mutants/cli-help-source.json +420 -0
- package/scripts/mutants/control-send-receipt.json +21 -4
- package/scripts/mutants/dev-gate-dispatch.json +109 -0
- package/scripts/mutants/fresh-call-dispatch.json +38 -2
- package/scripts/mutants/fresh-cut.json +15 -0
- package/scripts/mutants/herdr-activation.json +128 -0
- package/scripts/mutants/herdr-fresh-call.json +278 -5
- package/scripts/mutants/herdr-operator-link.json +318 -0
- package/scripts/mutants/herdr-plugin-build.json +55 -0
- package/scripts/mutants/herdr-plugin.json +17 -0
- package/scripts/mutants/herdr-resume-call.json +288 -0
- package/scripts/mutants/herdr-runtime-bootstrap.json +48 -0
- package/scripts/mutants/meta-facts.json +15 -0
- package/scripts/mutants/mux-fresh-call.json +14 -3
- package/scripts/mutants/mux-resume-call.json +89 -3
- package/scripts/mutants/peer-facts.json +15 -0
- package/scripts/mutants/pi-durable.json +996 -6
- package/scripts/mutants/remote-pair-send.json +21 -2
- package/scripts/mutants/self-address.json +10 -10
- package/scripts/mutants/source-install.json +35 -0
- package/scripts/mutants/v2-surface.json +50 -64
- package/scripts/mutants/v2-visible-resume.json +266 -6
- package/scripts/peer-facts.ts +1 -1
- package/scripts/smoke-agy-install-state.sh +66 -0
- package/scripts/smoke-meta-prune.sh +23 -0
- package/scripts/smoke-omp-fresh-live.ts +12 -3
- package/scripts/smoke-omp-receive-live.ts +7 -1
- package/scripts/smoke-pi-durable-fresh-live.ts +12 -2
- package/team.json.example +39 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"lane": "agent-guidance",
|
|
4
|
+
"mutants": [
|
|
5
|
+
{
|
|
6
|
+
"claim": "GUIDANCE-REVIEWED-REVISION",
|
|
7
|
+
"title": "a valid Root revision advances beyond the independently reviewed payload revision while every history entry and decoded tool string remains valid",
|
|
8
|
+
"subject": "ENTWURF.json",
|
|
9
|
+
"find": ["\t\"revision\": 19,", "\t\"history\": ["],
|
|
10
|
+
"replace": ["\t\"revision\": 20,", "\t\"history\": ["],
|
|
11
|
+
"gate": ["bash", "run.sh", "check-agent-guidance-beside"],
|
|
12
|
+
"timeoutSeconds": 120,
|
|
13
|
+
"signature": "[QK:GUIDANCE-REVIEWED-REVISION]",
|
|
14
|
+
"signatureSource": "pi-extensions/lib/agent-guidance.test.ts"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"claim": "GUIDANCE-CURRENT-DECODED-BYTES",
|
|
18
|
+
"title": "a valid authored parameter gains one space, so normalized/shared-constant comparisons would hide a reviewed-current byte break",
|
|
19
|
+
"subject": "ENTWURF.json",
|
|
20
|
+
"find": ["Target garden id (use entwurf_peers to discover)"],
|
|
21
|
+
"replace": ["Target garden id (use entwurf_peers to discover)"],
|
|
22
|
+
"gate": ["bash", "run.sh", "check-agent-guidance-beside"],
|
|
23
|
+
"timeoutSeconds": 120,
|
|
24
|
+
"signature": "[QK:GUIDANCE-CURRENT-DECODED-BYTES]",
|
|
25
|
+
"signatureSource": "pi-extensions/lib/agent-guidance.test.ts"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"claim": "GUIDANCE-REJECT-HINTS-ORIGINAL",
|
|
29
|
+
"title": "a valid static reject hint gains one space in the real JSON, which the reader and the surface wiring both carry faithfully, so only the C0 plus reviewed-revision-6 byte oracle can disagree",
|
|
30
|
+
"subject": "ENTWURF.json",
|
|
31
|
+
"find": ["native-push for this backend is paused (#152):"],
|
|
32
|
+
"replace": ["native-push for this backend is paused (#152):"],
|
|
33
|
+
"gate": ["bash", "run.sh", "check-agent-guidance-beside"],
|
|
34
|
+
"timeoutSeconds": 120,
|
|
35
|
+
"signature": "[QK:GUIDANCE-REJECT-HINTS-ORIGINAL]",
|
|
36
|
+
"signatureSource": "pi-extensions/lib/agent-guidance.test.ts"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"claim": "GUIDANCE-RESUME-REJECT-HINTS-ORIGINAL",
|
|
40
|
+
"title": "a valid static visible-resume reject hint gains one space in the real JSON, which the reader and the visible-resume wiring both carry faithfully, so only the C0 byte oracle can disagree",
|
|
41
|
+
"subject": "ENTWURF.json",
|
|
42
|
+
"find": ["no tmux window and no herdr tab was opened"],
|
|
43
|
+
"replace": ["no tmux window and no herdr tab was opened"],
|
|
44
|
+
"gate": ["bash", "run.sh", "check-agent-guidance-beside"],
|
|
45
|
+
"timeoutSeconds": 120,
|
|
46
|
+
"signature": "[QK:GUIDANCE-RESUME-REJECT-HINTS-ORIGINAL]",
|
|
47
|
+
"signatureSource": "pi-extensions/lib/agent-guidance.test.ts"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"claim": "GUIDANCE-RUNTIME-REVIEWED-FIELDS",
|
|
51
|
+
"title": "valid callback prose changes in the real JSON and reaches source tools/list, whose C0 plus reviewed-delta expectation must disagree",
|
|
52
|
+
"subject": "ENTWURF.json",
|
|
53
|
+
"find": ["No arguments, no fallback to a model-supplied target."],
|
|
54
|
+
"replace": ["No arguments, automatic fallback to a model-supplied target."],
|
|
55
|
+
"gate": ["bash", "run.sh", "check-agent-guidance-beside"],
|
|
56
|
+
"timeoutSeconds": 120,
|
|
57
|
+
"signature": "[QK:GUIDANCE-RUNTIME-REVIEWED-FIELDS]",
|
|
58
|
+
"signatureSource": "pi-extensions/lib/agent-guidance.test.ts"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"claim": "GUIDANCE-DURABLE-REVIEWED-FIELDS",
|
|
62
|
+
"title": "the actual durable short variant changes without touching the independent C0 plus reviewed-delta contact expectation",
|
|
63
|
+
"subject": "ENTWURF.json",
|
|
64
|
+
"find": ["Return this durable host's garden identity envelope"],
|
|
65
|
+
"replace": ["Return this durable host's alternate identity envelope"],
|
|
66
|
+
"gate": ["bash", "run.sh", "check-agent-guidance-beside"],
|
|
67
|
+
"timeoutSeconds": 120,
|
|
68
|
+
"signature": "[QK:GUIDANCE-DURABLE-REVIEWED-FIELDS]",
|
|
69
|
+
"signatureSource": "pi-extensions/lib/agent-guidance.test.ts"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"claim": "GUIDANCE-DUPLICATE-DECODED-KEYS",
|
|
73
|
+
"title": "grammar-only parsing skips the original token walk and accepts last-key-wins data",
|
|
74
|
+
"subject": "pi-extensions/lib/agent-guidance.ts",
|
|
75
|
+
"find": ["rejectDuplicateKeys(source);"],
|
|
76
|
+
"replace": ["// duplicate-key check removed by data-integrity mutant"],
|
|
77
|
+
"gate": ["bash", "run.sh", "check-agent-guidance-beside"],
|
|
78
|
+
"timeoutSeconds": 120,
|
|
79
|
+
"signature": "[QK:GUIDANCE-DUPLICATE-DECODED-KEYS]",
|
|
80
|
+
"signatureSource": "pi-extensions/lib/agent-guidance.test.ts"
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"claim": "GUIDANCE-STRICT-SHAPE",
|
|
84
|
+
"title": "the shape reader no longer rejects missing or unknown members",
|
|
85
|
+
"subject": "pi-extensions/lib/agent-guidance.ts",
|
|
86
|
+
"find": ["actual.length !== wanted.length || actual.some((key, i) => key !== wanted[i])"],
|
|
87
|
+
"replace": ["false"],
|
|
88
|
+
"gate": ["bash", "run.sh", "check-agent-guidance-beside"],
|
|
89
|
+
"timeoutSeconds": 120,
|
|
90
|
+
"signature": "[QK:GUIDANCE-STRICT-SHAPE]",
|
|
91
|
+
"signatureSource": "pi-extensions/lib/agent-guidance.test.ts"
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"claim": "GUIDANCE-INDEPENDENT-REVISION",
|
|
95
|
+
"title": "history length becomes payload revision, so history-only annotation silently changes it",
|
|
96
|
+
"subject": "pi-extensions/lib/agent-guidance.ts",
|
|
97
|
+
"find": ["freeze(data);"],
|
|
98
|
+
"replace": ["data.revision = data.history.length;\n\tfreeze(data);"],
|
|
99
|
+
"gate": ["bash", "run.sh", "check-agent-guidance-beside"],
|
|
100
|
+
"timeoutSeconds": 120,
|
|
101
|
+
"signature": "[QK:GUIDANCE-INDEPENDENT-REVISION]",
|
|
102
|
+
"signatureSource": "pi-extensions/lib/agent-guidance.test.ts"
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"claim": "GUIDANCE-FIXED-MODULE-ROOT",
|
|
106
|
+
"title": "an ambient path selects replacement guidance instead of the module's fixed packaged source",
|
|
107
|
+
"subject": "pi-extensions/lib/agent-guidance.ts",
|
|
108
|
+
"find": ["new URL(\"../../ENTWURF.json\", import.meta.url)"],
|
|
109
|
+
"replace": ["process.env.ENTWURF_GUIDANCE_PATH ?? new URL(\"../../ENTWURF.json\", import.meta.url)"],
|
|
110
|
+
"gate": ["bash", "run.sh", "check-agent-guidance-beside"],
|
|
111
|
+
"timeoutSeconds": 120,
|
|
112
|
+
"signature": "[QK:GUIDANCE-FIXED-MODULE-ROOT]",
|
|
113
|
+
"signatureSource": "pi-extensions/lib/agent-guidance.test.ts"
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
"claim": "GUIDANCE-LAUNCH-REJECT-HINTS-ORIGINAL",
|
|
117
|
+
"title": "a valid static tmux launch-stage hint gains one space in the real JSON, which the reader, the fresh renderer and the compiled reader all carry faithfully, so only the C0 per-verb byte oracle can disagree",
|
|
118
|
+
"subject": "ENTWURF.json",
|
|
119
|
+
"find": ["the requested tmux session name is outside the shape"],
|
|
120
|
+
"replace": ["the requested tmux session name is outside the shape"],
|
|
121
|
+
"gate": ["bash", "run.sh", "check-agent-guidance-beside"],
|
|
122
|
+
"timeoutSeconds": 120,
|
|
123
|
+
"signature": "[QK:GUIDANCE-LAUNCH-REJECT-HINTS-ORIGINAL]",
|
|
124
|
+
"signatureSource": "pi-extensions/lib/agent-guidance.test.ts"
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"claim": "GUIDANCE-DELIVERY-RESULT-CLAUSES-ORIGINAL",
|
|
128
|
+
"title": "a valid static delivery-result clause gains one space in the real JSON, which the reader, the v2-surface and remote-pair renderers and the compiled reader all carry faithfully, so only the 94d0594 byte oracle can disagree",
|
|
129
|
+
"subject": "ENTWURF.json",
|
|
130
|
+
"find": ["the receiver refused it; nothing was accepted"],
|
|
131
|
+
"replace": ["the receiver refused it; nothing was accepted"],
|
|
132
|
+
"gate": ["bash", "run.sh", "check-agent-guidance-beside"],
|
|
133
|
+
"timeoutSeconds": 120,
|
|
134
|
+
"signature": "[QK:GUIDANCE-DELIVERY-RESULT-CLAUSES-ORIGINAL]",
|
|
135
|
+
"signatureSource": "pi-extensions/lib/agent-guidance.test.ts"
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
"claim": "GUIDANCE-READER-LEAF-IMPORTS",
|
|
139
|
+
"title": "the reader gains a bare side-effect import, the weakest static form, which loads and runs fine, so only the leaf import-set parser can see the new dependency",
|
|
140
|
+
"subject": "pi-extensions/lib/agent-guidance.ts",
|
|
141
|
+
"find": ["import { readFileSync } from \"node:fs\";"],
|
|
142
|
+
"replace": ["import { readFileSync } from \"node:fs\";", "import \"node:path\";"],
|
|
143
|
+
"gate": ["bash", "run.sh", "check-agent-guidance-beside"],
|
|
144
|
+
"timeoutSeconds": 120,
|
|
145
|
+
"signature": "[QK:GUIDANCE-READER-LEAF-IMPORTS]",
|
|
146
|
+
"signatureSource": "pi-extensions/lib/agent-guidance.test.ts"
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
"claim": "GUIDANCE-SLOTTED-REJECT-HINTS-ORIGINAL",
|
|
150
|
+
"title": "a valid record-less-socket segment gains one space in the real JSON, which the reader and the surface composition both carry faithfully, so only the C0 segment and template oracle can disagree",
|
|
151
|
+
"subject": "ENTWURF.json",
|
|
152
|
+
"find": ["If a pre-record-era resident owns that socket"],
|
|
153
|
+
"replace": ["If a pre-record-era resident owns that socket"],
|
|
154
|
+
"gate": ["bash", "run.sh", "check-agent-guidance-beside"],
|
|
155
|
+
"timeoutSeconds": 120,
|
|
156
|
+
"signature": "[QK:GUIDANCE-SLOTTED-REJECT-HINTS-ORIGINAL]",
|
|
157
|
+
"signatureSource": "pi-extensions/lib/agent-guidance.test.ts"
|
|
158
|
+
}
|
|
159
|
+
]
|
|
160
|
+
}
|
|
@@ -19,11 +19,9 @@
|
|
|
19
19
|
"claim": "BRIDGEBOOT-RESUME-CALL-TARGET-ONLY",
|
|
20
20
|
"title": "a model knob is added to the resume schema, giving the caller a second way to decide what a resumed citizen is after the record already decided",
|
|
21
21
|
"subject": "mcp/entwurf-bridge/src/index.ts",
|
|
22
|
-
"find": [
|
|
23
|
-
"\t\t\t.describe(\"Garden id of the DORMANT pi or Claude Code citizen to reopen (discover with entwurf_peers).\"),"
|
|
24
|
-
],
|
|
22
|
+
"find": ["\t\t\t.describe(ENTWURF_TOOL_GUIDANCE.entwurf_resume_call.parameters[\"target\"]),"],
|
|
25
23
|
"replace": [
|
|
26
|
-
"\t\t\t.describe(\"
|
|
24
|
+
"\t\t\t.describe(ENTWURF_TOOL_GUIDANCE.entwurf_resume_call.parameters[\"target\"]),",
|
|
27
25
|
"\t\tmodel: z.string().optional().describe(\"Override the recorded model.\"),"
|
|
28
26
|
],
|
|
29
27
|
"gate": ["bash", "run.sh", "check-entwurf-bridge-boot"],
|
|
@@ -48,9 +46,9 @@
|
|
|
48
46
|
"claim": "BRIDGEBOOT-CALLBACK-REGISTERED",
|
|
49
47
|
"title": "the callback verb is imported but never registered — invisible to every host, while every import-level assertion stays green",
|
|
50
48
|
"subject": "mcp/entwurf-bridge/src/index.ts",
|
|
51
|
-
"find": ["server.tool(\
|
|
49
|
+
"find": ["server.tool(\"entwurf_callback\","],
|
|
52
50
|
"replace": [
|
|
53
|
-
"const _unregisteredCallbackTool = (...a: unknown[]) => void a;\n_unregisteredCallbackTool(\
|
|
51
|
+
"const _unregisteredCallbackTool = (...a: unknown[]) => void a;\n_unregisteredCallbackTool(\"entwurf_callback\","
|
|
54
52
|
],
|
|
55
53
|
"gate": ["bash", "run.sh", "check-entwurf-bridge-boot"],
|
|
56
54
|
"timeoutSeconds": 120,
|
|
@@ -61,9 +59,9 @@
|
|
|
61
59
|
"claim": "BRIDGEBOOT-CALLBACK-ZERO-ARG",
|
|
62
60
|
"title": "a target parameter is added to the callback schema, giving the model a way to supply an address the env pair was meant to own",
|
|
63
61
|
"subject": "mcp/entwurf-bridge/src/index.ts",
|
|
64
|
-
"find": ["\
|
|
62
|
+
"find": ["server.tool(\"entwurf_callback\", ENTWURF_TOOL_GUIDANCE.entwurf_callback.descriptions.mcp, {},"],
|
|
65
63
|
"replace": [
|
|
66
|
-
"\
|
|
64
|
+
"server.tool(\"entwurf_callback\", ENTWURF_TOOL_GUIDANCE.entwurf_callback.descriptions.mcp, { target: z.string().optional() },"
|
|
67
65
|
],
|
|
68
66
|
"gate": ["bash", "run.sh", "check-entwurf-bridge-boot"],
|
|
69
67
|
"timeoutSeconds": 120,
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"lane": "capability-bundle-reach",
|
|
4
|
+
"mutants": [
|
|
5
|
+
{
|
|
6
|
+
"claim": "BUNDLE-REACH-GUIDANCE-CARRIER",
|
|
7
|
+
"title": "the private build appends one LF to the emitted guidance carrier: valid JSON and all decoded exports stay identical, but canonical raw-byte parity must fail before the reader import",
|
|
8
|
+
"subject": "scripts/build-bridge.sh",
|
|
9
|
+
"find": ["cp \"$GUIDANCE_SOURCE\" \"$REPO_DIR/mcp/entwurf-bridge/dist/ENTWURF.json\""],
|
|
10
|
+
"replace": [
|
|
11
|
+
"cp \"$GUIDANCE_SOURCE\" \"$REPO_DIR/mcp/entwurf-bridge/dist/ENTWURF.json\"",
|
|
12
|
+
"printf '\\n' >> \"$REPO_DIR/mcp/entwurf-bridge/dist/ENTWURF.json\""
|
|
13
|
+
],
|
|
14
|
+
"gate": ["bash", "run.sh", "check-capability-bundle-reach"],
|
|
15
|
+
"timeoutSeconds": 300,
|
|
16
|
+
"signature": "[QK:BUNDLE-REACH-GUIDANCE-CARRIER]",
|
|
17
|
+
"signatureSource": "scripts/check-capability-bundle-reach.ts",
|
|
18
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"claim": "BUNDLE-REACH-REJECT-HINTS",
|
|
22
|
+
"title": "the compiled reader exports one static reject hint with a trailing space while the carrier keeps canonical Root bytes and the version/tools exports stay identical, so only the compiled hint-family reach can fail",
|
|
23
|
+
"subject": "pi-extensions/lib/agent-guidance.ts",
|
|
24
|
+
"find": ["export const ENTWURF_REJECT_HINTS = guidance.rejectHints;"],
|
|
25
|
+
"replace": [
|
|
26
|
+
"export const ENTWURF_REJECT_HINTS: typeof guidance.rejectHints = Object.freeze({",
|
|
27
|
+
"\t...guidance.rejectHints,",
|
|
28
|
+
"\t\"native-push-paused\": `${guidance.rejectHints[\"native-push-paused\"]} `,",
|
|
29
|
+
"});"
|
|
30
|
+
],
|
|
31
|
+
"gate": ["bash", "run.sh", "check-capability-bundle-reach"],
|
|
32
|
+
"timeoutSeconds": 300,
|
|
33
|
+
"signature": "[QK:BUNDLE-REACH-REJECT-HINTS]",
|
|
34
|
+
"signatureSource": "scripts/check-capability-bundle-reach.ts",
|
|
35
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"claim": "BUNDLE-REACH-RESUME-REJECT-HINTS",
|
|
39
|
+
"title": "the compiled reader exports one static visible-resume reject hint with a trailing space while the carrier keeps canonical Root bytes and the version/tools/reject-hint exports stay identical, so only the compiled resume-hint-family reach can fail",
|
|
40
|
+
"subject": "pi-extensions/lib/agent-guidance.ts",
|
|
41
|
+
"find": ["export const ENTWURF_RESUME_REJECT_HINTS = guidance.resumeRejectHints;"],
|
|
42
|
+
"replace": [
|
|
43
|
+
"export const ENTWURF_RESUME_REJECT_HINTS: typeof guidance.resumeRejectHints = Object.freeze({",
|
|
44
|
+
"\t...guidance.resumeRejectHints,",
|
|
45
|
+
"\t\"launch-refused\": `${guidance.resumeRejectHints[\"launch-refused\"]} `,",
|
|
46
|
+
"});"
|
|
47
|
+
],
|
|
48
|
+
"gate": ["bash", "run.sh", "check-capability-bundle-reach"],
|
|
49
|
+
"timeoutSeconds": 300,
|
|
50
|
+
"signature": "[QK:BUNDLE-REACH-RESUME-REJECT-HINTS]",
|
|
51
|
+
"signatureSource": "scripts/check-capability-bundle-reach.ts",
|
|
52
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"claim": "BUNDLE-REACH-LAUNCH-REJECT-HINTS",
|
|
56
|
+
"title": "the compiled reader exports one fresh launch-stage hint with a trailing space while the carrier keeps canonical Root bytes and every earlier export stays identical, so only the compiled launch-family reach can fail",
|
|
57
|
+
"subject": "pi-extensions/lib/agent-guidance.ts",
|
|
58
|
+
"find": ["export const ENTWURF_FRESH_LAUNCH_REJECT_HINTS = guidance.freshLaunchRejectHints;"],
|
|
59
|
+
"replace": [
|
|
60
|
+
"export const ENTWURF_FRESH_LAUNCH_REJECT_HINTS: typeof guidance.freshLaunchRejectHints = Object.freeze({",
|
|
61
|
+
"\t...guidance.freshLaunchRejectHints,",
|
|
62
|
+
"\t\"runtime-missing\": `${guidance.freshLaunchRejectHints[\"runtime-missing\"]} `,",
|
|
63
|
+
"});"
|
|
64
|
+
],
|
|
65
|
+
"gate": ["bash", "run.sh", "check-capability-bundle-reach"],
|
|
66
|
+
"timeoutSeconds": 300,
|
|
67
|
+
"signature": "[QK:BUNDLE-REACH-LAUNCH-REJECT-HINTS]",
|
|
68
|
+
"signatureSource": "scripts/check-capability-bundle-reach.ts",
|
|
69
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"claim": "BUNDLE-REACH-DELIVERY-RESULT-CLAUSES",
|
|
73
|
+
"title": "the compiled reader exports one delivery-result clause with a trailing space while the carrier keeps canonical Root bytes and every earlier export stays identical, so only the compiled delivery-clause reach can fail",
|
|
74
|
+
"subject": "pi-extensions/lib/agent-guidance.ts",
|
|
75
|
+
"find": ["export const ENTWURF_DELIVERY_RESULT_CLAUSES = guidance.deliveryResultClauses;"],
|
|
76
|
+
"replace": [
|
|
77
|
+
"export const ENTWURF_DELIVERY_RESULT_CLAUSES: typeof guidance.deliveryResultClauses = Object.freeze({",
|
|
78
|
+
"\t...guidance.deliveryResultClauses,",
|
|
79
|
+
"\t\"dirty-lock\": `${guidance.deliveryResultClauses[\"dirty-lock\"]} `,",
|
|
80
|
+
"});"
|
|
81
|
+
],
|
|
82
|
+
"gate": ["bash", "run.sh", "check-capability-bundle-reach"],
|
|
83
|
+
"timeoutSeconds": 300,
|
|
84
|
+
"signature": "[QK:BUNDLE-REACH-DELIVERY-RESULT-CLAUSES]",
|
|
85
|
+
"signatureSource": "scripts/check-capability-bundle-reach.ts",
|
|
86
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"claim": "BUNDLE-REACH-SLOTTED-REJECT-HINTS",
|
|
90
|
+
"title": "the compiled reader exports one slotted reject-hint segment with a trailing space while the carrier keeps canonical Root bytes and every earlier export stays identical, so only the compiled slotted-family reach can fail",
|
|
91
|
+
"subject": "pi-extensions/lib/agent-guidance.ts",
|
|
92
|
+
"find": ["export const ENTWURF_SLOTTED_REJECT_HINTS = guidance.slottedRejectHints;"],
|
|
93
|
+
"replace": [
|
|
94
|
+
"export const ENTWURF_SLOTTED_REJECT_HINTS: typeof guidance.slottedRejectHints = Object.freeze({",
|
|
95
|
+
"\t\"record-less-socket\": Object.freeze({",
|
|
96
|
+
"\t\t...guidance.slottedRejectHints[\"record-less-socket\"],",
|
|
97
|
+
"\t\tafterFreshCutPrescription: `${guidance.slottedRejectHints[\"record-less-socket\"].afterFreshCutPrescription} `,",
|
|
98
|
+
"\t}),",
|
|
99
|
+
"});"
|
|
100
|
+
],
|
|
101
|
+
"gate": ["bash", "run.sh", "check-capability-bundle-reach"],
|
|
102
|
+
"timeoutSeconds": 300,
|
|
103
|
+
"signature": "[QK:BUNDLE-REACH-SLOTTED-REJECT-HINTS]",
|
|
104
|
+
"signatureSource": "scripts/check-capability-bundle-reach.ts",
|
|
105
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
"claim": "BUNDLE-REACH-RECORD-LESS-SOCKET-CONSUMER",
|
|
109
|
+
"title": "the surface source returns a hand-kept copy of the record-less-socket hint, one byte off the Root segments, instead of composing them with the owner's fix command; the build carries it into the compiled surface while the carrier and every reader export stay canonical, so only the compiled consumer cell can fail",
|
|
110
|
+
"subject": "pi-extensions/lib/entwurf-v2-surface.ts",
|
|
111
|
+
"find": [
|
|
112
|
+
"\t\t\treturn `${hint.beforeFreshCutPrescription}${FRESH_CUT_PRESCRIPTION}${hint.afterFreshCutPrescription}`;"
|
|
113
|
+
],
|
|
114
|
+
"replace": [
|
|
115
|
+
"\t\t\treturn `a control socket exists at this garden id but NO meta-record claims it — the record is the sole address authority, so a bare socket is not an addressable citizen. If a pre-record-era resident owns that socket, restart it under the current runtime (session_start births its record); if the store predates the current generation, quiesce and archive it with ${FRESH_CUT_PRESCRIPTION}. A stale/forged socket should be removed.`;"
|
|
116
|
+
],
|
|
117
|
+
"gate": ["bash", "run.sh", "check-capability-bundle-reach"],
|
|
118
|
+
"timeoutSeconds": 300,
|
|
119
|
+
"signature": "[QK:BUNDLE-REACH-RECORD-LESS-SOCKET-CONSUMER]",
|
|
120
|
+
"signatureSource": "scripts/check-capability-bundle-reach.ts",
|
|
121
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
122
|
+
}
|
|
123
|
+
]
|
|
124
|
+
}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"lane": "claude-launch",
|
|
4
|
+
"mutants": [
|
|
5
|
+
{
|
|
6
|
+
"claim": "CLAUDELAUNCH-VERB-DROPPED",
|
|
7
|
+
"title": "without the shift the dispatcher verb stays in the forwarded argv and `claude` arrives at Claude Code as a prompt argument",
|
|
8
|
+
"subject": "run.sh",
|
|
9
|
+
"find": [" shift || true\n if [ -n \"${ENTWURF_CLAUDE_LAUNCH_ACTIVE:-}\" ]; then"],
|
|
10
|
+
"replace": [" if [ -n \"${ENTWURF_CLAUDE_LAUNCH_ACTIVE:-}\" ]; then"],
|
|
11
|
+
"gate": ["bash", "run.sh", "check-claude-launch"],
|
|
12
|
+
"timeoutSeconds": 300,
|
|
13
|
+
"signature": "[QK:CLAUDELAUNCH-VERB-DROPPED]",
|
|
14
|
+
"signatureSource": "scripts/check-claude-launch.ts"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"claim": "CLAUDELAUNCH-ARGV-UNTOUCHED",
|
|
18
|
+
"title": "a launcher that adds an argument of its own stops being a spelling and starts deciding the session (Rule 9)",
|
|
19
|
+
"subject": "run.sh",
|
|
20
|
+
"find": [" exec \"$entwurf_claude_bin\" \"$@\""],
|
|
21
|
+
"replace": [" exec \"$entwurf_claude_bin\" --verbose \"$@\""],
|
|
22
|
+
"gate": ["bash", "run.sh", "check-claude-launch"],
|
|
23
|
+
"timeoutSeconds": 300,
|
|
24
|
+
"signature": "[QK:CLAUDELAUNCH-ARGV-UNTOUCHED]",
|
|
25
|
+
"signatureSource": "scripts/check-claude-launch.ts"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"claim": "CLAUDELAUNCH-VENDOR-HELP",
|
|
29
|
+
"title": "the help preflight intercepts `entwurf claude --help`, so Claude Code's own help is replaced by an Entwurf page",
|
|
30
|
+
"subject": "run.sh",
|
|
31
|
+
"find": ["[ \"$cmd\" != claude ] && "],
|
|
32
|
+
"replace": [""],
|
|
33
|
+
"gate": ["bash", "run.sh", "check-claude-launch"],
|
|
34
|
+
"timeoutSeconds": 300,
|
|
35
|
+
"signature": "[QK:CLAUDELAUNCH-VENDOR-HELP]",
|
|
36
|
+
"signatureSource": "scripts/check-claude-launch.ts"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"claim": "CLAUDELAUNCH-CWD-KEPT",
|
|
40
|
+
"title": "a launch that moves to the package directory opens Claude Code in the wrong project and session scope",
|
|
41
|
+
"subject": "run.sh",
|
|
42
|
+
"find": [" exec \"$entwurf_claude_bin\" \"$@\""],
|
|
43
|
+
"replace": [" cd \"$REPO_DIR\"; exec \"$entwurf_claude_bin\" \"$@\""],
|
|
44
|
+
"gate": ["bash", "run.sh", "check-claude-launch"],
|
|
45
|
+
"timeoutSeconds": 300,
|
|
46
|
+
"signature": "[QK:CLAUDELAUNCH-CWD-KEPT]",
|
|
47
|
+
"signatureSource": "scripts/check-claude-launch.ts"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"claim": "CLAUDELAUNCH-SENTINEL-EXPORTED",
|
|
51
|
+
"title": "an unexported sentinel is invisible to a PATH `claude` that shells back here, so the wrapper loop spins",
|
|
52
|
+
"subject": "run.sh",
|
|
53
|
+
"find": [" export ENTWURF_CLAUDE_LAUNCH_ACTIVE=1"],
|
|
54
|
+
"replace": [" ENTWURF_CLAUDE_LAUNCH_ACTIVE=1"],
|
|
55
|
+
"gate": ["bash", "run.sh", "check-claude-launch"],
|
|
56
|
+
"timeoutSeconds": 300,
|
|
57
|
+
"signature": "[QK:CLAUDELAUNCH-SENTINEL-EXPORTED]",
|
|
58
|
+
"signatureSource": "scripts/check-claude-launch.ts"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"claim": "CLAUDELAUNCH-CARRIERS-SCRUBBED",
|
|
62
|
+
"title": "clearing only half of an inherited pi identity pair leaves another citizen's carrier for a partial reader",
|
|
63
|
+
"subject": "run.sh",
|
|
64
|
+
"find": [" unset PI_SESSION_ID PI_AGENT_ID"],
|
|
65
|
+
"replace": [" unset PI_AGENT_ID"],
|
|
66
|
+
"gate": ["bash", "run.sh", "check-claude-launch"],
|
|
67
|
+
"timeoutSeconds": 300,
|
|
68
|
+
"signature": "[QK:CLAUDELAUNCH-CARRIERS-SCRUBBED]",
|
|
69
|
+
"signatureSource": "scripts/check-claude-launch.ts"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"claim": "CLAUDELAUNCH-ENV-EXACT",
|
|
73
|
+
"title": "a launcher that sets a variable of its own decides something Claude Code owns",
|
|
74
|
+
"subject": "run.sh",
|
|
75
|
+
"find": [" export ENTWURF_CLAUDE_LAUNCH_ACTIVE=1"],
|
|
76
|
+
"replace": [" export ENTWURF_CLAUDE_LAUNCH_ACTIVE=1 ENTWURF_CLAUDE_EXTRA=1"],
|
|
77
|
+
"gate": ["bash", "run.sh", "check-claude-launch"],
|
|
78
|
+
"timeoutSeconds": 300,
|
|
79
|
+
"signature": "[QK:CLAUDELAUNCH-ENV-EXACT]",
|
|
80
|
+
"signatureSource": "scripts/check-claude-launch.ts"
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"claim": "CLAUDELAUNCH-EXEC-KEEPS-PID",
|
|
84
|
+
"title": "without exec run.sh stays as a parent between Claude Code and the terminal, owning nothing",
|
|
85
|
+
"subject": "run.sh",
|
|
86
|
+
"find": [" exec \"$entwurf_claude_bin\" \"$@\""],
|
|
87
|
+
"replace": [" \"$entwurf_claude_bin\" \"$@\""],
|
|
88
|
+
"gate": ["bash", "run.sh", "check-claude-launch"],
|
|
89
|
+
"timeoutSeconds": 300,
|
|
90
|
+
"signature": "[QK:CLAUDELAUNCH-EXEC-KEEPS-PID]",
|
|
91
|
+
"signatureSource": "scripts/check-claude-launch.ts"
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"claim": "CLAUDELAUNCH-VENDOR-ABSENT",
|
|
95
|
+
"title": "with the absent-vendor refusal gone an empty PATH hit falls through to a refusal that names the wrong cause",
|
|
96
|
+
"subject": "run.sh",
|
|
97
|
+
"find": [" if [ -z \"$entwurf_claude_bin\" ]; then"],
|
|
98
|
+
"replace": [" if false; then"],
|
|
99
|
+
"gate": ["bash", "run.sh", "check-claude-launch"],
|
|
100
|
+
"timeoutSeconds": 300,
|
|
101
|
+
"signature": "[QK:CLAUDELAUNCH-VENDOR-ABSENT]",
|
|
102
|
+
"signatureSource": "scripts/check-claude-launch.ts"
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"claim": "CLAUDELAUNCH-NOT-REGULAR",
|
|
106
|
+
"title": "a non-regular PATH hit is handed to exec, which fails with the shell's own error instead of a named refusal",
|
|
107
|
+
"subject": "run.sh",
|
|
108
|
+
"find": [" if [ ! -f \"$entwurf_claude_bin\" ] || [ ! -x \"$entwurf_claude_bin\" ]; then"],
|
|
109
|
+
"replace": [" if false; then"],
|
|
110
|
+
"gate": ["bash", "run.sh", "check-claude-launch"],
|
|
111
|
+
"timeoutSeconds": 300,
|
|
112
|
+
"signature": "[QK:CLAUDELAUNCH-NOT-REGULAR]",
|
|
113
|
+
"signatureSource": "scripts/check-claude-launch.ts"
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
"claim": "CLAUDELAUNCH-RECURSION-FENCE",
|
|
117
|
+
"title": "with the sentinel fence removed a PATH `claude` that shells back here spins forever behind a hung terminal",
|
|
118
|
+
"subject": "run.sh",
|
|
119
|
+
"find": [
|
|
120
|
+
" if [ -n \"${ENTWURF_CLAUDE_LAUNCH_ACTIVE:-}\" ]; then\n echo \"entwurf: recursive managed launch detected (ENTWURF_CLAUDE_LAUNCH_ACTIVE is already set).\" >&2"
|
|
121
|
+
],
|
|
122
|
+
"replace": [
|
|
123
|
+
" if false; then\n echo \"entwurf: recursive managed launch detected (ENTWURF_CLAUDE_LAUNCH_ACTIVE is already set).\" >&2"
|
|
124
|
+
],
|
|
125
|
+
"gate": ["bash", "run.sh", "check-claude-launch"],
|
|
126
|
+
"timeoutSeconds": 300,
|
|
127
|
+
"signature": "[QK:CLAUDELAUNCH-RECURSION-FENCE]",
|
|
128
|
+
"signatureSource": "scripts/check-claude-launch.ts"
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"claim": "CLAUDELAUNCH-SELF-EXEC-FENCE",
|
|
132
|
+
"title": "with the resolved-path fence removed a PATH `claude` that is run.sh re-enters with the operator's argv as an entwurf verb",
|
|
133
|
+
"subject": "run.sh",
|
|
134
|
+
"find": [" if [ \"$entwurf_claude_real\" = \"$REPO_DIR/run.sh\" ]; then"],
|
|
135
|
+
"replace": [" if false; then"],
|
|
136
|
+
"gate": ["bash", "run.sh", "check-claude-launch"],
|
|
137
|
+
"timeoutSeconds": 300,
|
|
138
|
+
"signature": "[QK:CLAUDELAUNCH-SELF-EXEC-FENCE]",
|
|
139
|
+
"signatureSource": "scripts/check-claude-launch.ts"
|
|
140
|
+
}
|
|
141
|
+
]
|
|
142
|
+
}
|