You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 5f193ee
Browse filesBrowse the repository at this point in the historyBrowse files
Copy file name to clipboardExpand all lines: docs/GUARD.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -253,7 +253,7 @@ Use during debugging when guard is in the way and you want to turn it off withou
253
253
### `mcpm guard cleanup [--yes]`
254
254
Prunes pin entries for servers no longer installed in any client config. Dry-run by default; pass `--yes` to apply.
255
255
256
-
A server whose config entry is malformed still counts as installed, so its pin is kept. A detected client's config that **cannot be read** (unparseable — mcpm reads configs as strict JSON, so comments and trailing commas count — or a permission error, including on the directory that holds it) holds servers cleanup cannot see. So if any pin is held by no readable config, cleanup refuses — in the dry run and with `--yes` alike — names each unreadable client, its config path and the error, prunes nothing, and exits `1`: that pin cannot be told apart from one belonging to a live server there, and pruning it would erase the server's rug-pull baseline. Fix the config and re-run. If every pin is held by a readable config, the unreadable one cannot change the result: cleanup reports nothing to prune, notes the unreadable config, and exits `0`. A client with no config file at all is not an error. A refusal because `pins.json` fails its integrity check also exits `1`.
256
+
A server whose config entry is malformed still counts as installed, so its pin is kept. A detected client's config that **cannot be read** (unparseable — VS Code permits JSONC comments/trailing commas, while the other clients use strict JSON — or a permission error, including on the directory that holds it) holds servers cleanup cannot see. So if any pin is held by no readable config, cleanup refuses — in the dry run and with `--yes` alike — names each unreadable client, its config path and the error, prunes nothing, and exits `1`: that pin cannot be told apart from one belonging to a live server there, and pruning it would erase the server's rug-pull baseline. Fix the config and re-run. If every pin is held by a readable config, the unreadable one cannot change the result: cleanup reports nothing to prune, notes the unreadable config, and exits `0`. A client with no config file at all is not an error. A refusal because `pins.json` fails its integrity check also exits `1`.
Reviewed and independently repeated local measurements on 2026-10-12 passed
87
+
**8/8 VS Code and 7/7 Claude Code** in both the realistic candidate suite and the
88
+
unchanged published-baseline mode. These use macOS 26.6.2/arm64 and the named
89
+
client versions below. Host/guest hashes, all 134 candidate distribution files,
90
+
raw configuration/backups, actual variable bindings, correlated cancellation,
91
+
post-removal receipts and cleanup were checked. All 3,588 source tests,
92
+
typecheck/build and 13 harness self-checks passed. Astra fixed inherited-key
93
+
server removal, incomplete candidate chunk identity and a pre-wire cancellation
94
+
fixture race; cancellation now waits for the current slow request before firing.
95
+
The managed server entry can be reformatted; comments/settings outside it and
96
+
the original raw backup are preserved.
97
+
41
98
## Boundary and fixture scope
42
99
43
100
The runner clones the immutable image independently for **VS Code first, then
@@ -102,7 +159,7 @@ VS Code completion for drift. A separate interrupted VM run verifies cleanup.
102
159
| Install and echo | mcpm writes the actual global file; native opening identifies the client and a real tool call returns the exact nonce/version/marker. |
103
160
| Enable, block and recovery | The app loads the wrapped launcher; attack content produces the guard block message, then an echo succeeds. Declaration/tool pins contain real hashes. |
104
161
| Warn and forward | The existing Unicode-warning fixture arrives unchanged and the guard records its expected warning signature. |
105
-
| Cancel and recover | VS Code forwards correlated cancellation and continues. Claude Code is deliberately interrupted during a real slow call; a new invocation succeeds. A deadline alone cannot count as cancellation. |
162
+
| Cancel and recover | VS Code waits up to 10 seconds for its current slow call to reach the peer, then forwards correlated cancellation and continues. Claude Code is deliberately interrupted during a real slow call; a new invocation succeeds. A deadline or cancellation before the wire call cannot count as success. |
106
163
| VS Code reload | A real window reload reestablishes MCP; the repeated echo has a different peer PID. |
107
164
| Update | The public CLI updates the fixture package coordinate while retaining the guard, extra arguments, environment and unrelated configuration. The native tool reports 2.0.0. |
108
165
| Schema drift | Changed tool schema is blocked, no call reaches the peer, pins remain unchanged, and the attempt finishes without a deadline kill. Reverting the fixture restores a successful native call. |
@@ -114,7 +171,9 @@ hashes, and rejects empty/incomplete success reports or missing/reused
114
171
observations. Per-case JSON records include execution status/deadlines, client receipts, synthetic wire
115
172
traffic, configuration, pins and events from that invocation. Each observation
116
173
has a unique filename linked from its case; recovery calls cannot overwrite
117
-
earlier evidence. `manifest.json` identifies pins, flags, VM configuration,
174
+
earlier evidence. The final removal observation includes raw configuration and
175
+
backup bytes; Claude Code also exports its `mcp get` not-found receipt.
176
+
`manifest.json` identifies pins, flags, VM configuration,
118
177
all guest fixture/extension hashes, host harness hashes and cleanup.
119
178
Read failures and unexpected client behavior are
120
179
failures; they are not silently classified as unsupported.
@@ -133,7 +192,7 @@ evidence local; publish scoped results rather than entire client transcripts.
133
192
## Remaining verification
134
193
135
194
Live providers and actual model/usage-skill behavior, interactive chat/default
136
-
approval workflows, other clients/platforms, JSONC/input-variable configuration,
195
+
approval workflows, other clients/platforms, additional configuration variants,
137
196
and complete protocol conformance remain unverified. Native client versions
138
197
and observed wire protocol must be recorded rather than inferred from package
139
198
versions. Updating pins requires repeating the native matrix. SIGKILL, host
0 commit comments