@aimarket/warden 0.20.0 → 0.22.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 (160) hide show
  1. package/CHANGELOG.md +113 -0
  2. package/README-es.md +27 -11
  3. package/README-fr.md +27 -11
  4. package/README-ru.md +27 -11
  5. package/README-zh.md +27 -11
  6. package/README.md +27 -11
  7. package/dist/annotation-review.d.ts +10 -0
  8. package/dist/annotation-review.d.ts.map +1 -0
  9. package/dist/annotation-review.js +36 -0
  10. package/dist/annotation-review.js.map +1 -0
  11. package/dist/atomic-screen.d.ts +61 -0
  12. package/dist/atomic-screen.d.ts.map +1 -0
  13. package/dist/atomic-screen.js +165 -0
  14. package/dist/atomic-screen.js.map +1 -0
  15. package/dist/flow-guard-answer.d.ts +29 -0
  16. package/dist/flow-guard-answer.d.ts.map +1 -0
  17. package/dist/flow-guard-answer.js +201 -0
  18. package/dist/flow-guard-answer.js.map +1 -0
  19. package/dist/flow-guard-classify.d.ts +14 -0
  20. package/dist/flow-guard-classify.d.ts.map +1 -0
  21. package/dist/flow-guard-classify.js +224 -0
  22. package/dist/flow-guard-classify.js.map +1 -0
  23. package/dist/flow-guard-decode.d.ts +17 -0
  24. package/dist/flow-guard-decode.d.ts.map +1 -0
  25. package/dist/flow-guard-decode.js +149 -0
  26. package/dist/flow-guard-decode.js.map +1 -0
  27. package/dist/flow-guard-destinations.d.ts +23 -0
  28. package/dist/flow-guard-destinations.d.ts.map +1 -0
  29. package/dist/flow-guard-destinations.js +158 -0
  30. package/dist/flow-guard-destinations.js.map +1 -0
  31. package/dist/flow-guard-fingerprints.d.ts +27 -0
  32. package/dist/flow-guard-fingerprints.d.ts.map +1 -0
  33. package/dist/flow-guard-fingerprints.js +164 -0
  34. package/dist/flow-guard-fingerprints.js.map +1 -0
  35. package/dist/flow-guard-fragments.d.ts +17 -0
  36. package/dist/flow-guard-fragments.d.ts.map +1 -0
  37. package/dist/flow-guard-fragments.js +122 -0
  38. package/dist/flow-guard-fragments.js.map +1 -0
  39. package/dist/flow-guard-instructions.d.ts +12 -0
  40. package/dist/flow-guard-instructions.d.ts.map +1 -0
  41. package/dist/flow-guard-instructions.js +36 -0
  42. package/dist/flow-guard-instructions.js.map +1 -0
  43. package/dist/flow-guard-labels.d.ts +10 -0
  44. package/dist/flow-guard-labels.d.ts.map +1 -0
  45. package/dist/flow-guard-labels.js +55 -0
  46. package/dist/flow-guard-labels.js.map +1 -0
  47. package/dist/flow-guard-leak.d.ts +29 -0
  48. package/dist/flow-guard-leak.d.ts.map +1 -0
  49. package/dist/flow-guard-leak.js +135 -0
  50. package/dist/flow-guard-leak.js.map +1 -0
  51. package/dist/flow-guard-paths.d.ts +21 -0
  52. package/dist/flow-guard-paths.d.ts.map +1 -0
  53. package/dist/flow-guard-paths.js +72 -0
  54. package/dist/flow-guard-paths.js.map +1 -0
  55. package/dist/flow-guard-policy.d.ts +15 -0
  56. package/dist/flow-guard-policy.d.ts.map +1 -0
  57. package/dist/flow-guard-policy.js +179 -0
  58. package/dist/flow-guard-policy.js.map +1 -0
  59. package/dist/flow-guard-post.d.ts +6 -0
  60. package/dist/flow-guard-post.d.ts.map +1 -0
  61. package/dist/flow-guard-post.js +131 -0
  62. package/dist/flow-guard-post.js.map +1 -0
  63. package/dist/flow-guard-pre.d.ts +13 -0
  64. package/dist/flow-guard-pre.d.ts.map +1 -0
  65. package/dist/flow-guard-pre.js +335 -0
  66. package/dist/flow-guard-pre.js.map +1 -0
  67. package/dist/flow-guard-screen.d.ts +85 -0
  68. package/dist/flow-guard-screen.d.ts.map +1 -0
  69. package/dist/flow-guard-screen.js +558 -0
  70. package/dist/flow-guard-screen.js.map +1 -0
  71. package/dist/flow-guard-state.d.ts +12 -0
  72. package/dist/flow-guard-state.d.ts.map +1 -0
  73. package/dist/flow-guard-state.js +121 -0
  74. package/dist/flow-guard-state.js.map +1 -0
  75. package/dist/flow-guard-text.d.ts +9 -0
  76. package/dist/flow-guard-text.d.ts.map +1 -0
  77. package/dist/flow-guard-text.js +46 -0
  78. package/dist/flow-guard-text.js.map +1 -0
  79. package/dist/flow-guard-types.d.ts +154 -0
  80. package/dist/flow-guard-types.d.ts.map +1 -0
  81. package/dist/flow-guard-types.js +2 -0
  82. package/dist/flow-guard-types.js.map +1 -0
  83. package/dist/flow-guard.d.ts +20 -215
  84. package/dist/flow-guard.d.ts.map +1 -1
  85. package/dist/flow-guard.js +26 -1400
  86. package/dist/flow-guard.js.map +1 -1
  87. package/dist/mcp-client.d.ts +1 -2
  88. package/dist/mcp-client.d.ts.map +1 -1
  89. package/dist/mcp-client.js +2 -19
  90. package/dist/mcp-client.js.map +1 -1
  91. package/dist/mcp-server.js +5 -0
  92. package/dist/mcp-server.js.map +1 -1
  93. package/dist/mcp-tools.d.ts.map +1 -1
  94. package/dist/mcp-tools.js +46 -9
  95. package/dist/mcp-tools.js.map +1 -1
  96. package/dist/public-address.d.ts +3 -0
  97. package/dist/public-address.d.ts.map +1 -0
  98. package/dist/public-address.js +58 -0
  99. package/dist/public-address.js.map +1 -0
  100. package/dist/review-diff.d.ts +36 -0
  101. package/dist/review-diff.d.ts.map +1 -1
  102. package/dist/review-diff.js +177 -7
  103. package/dist/review-diff.js.map +1 -1
  104. package/dist/task-adapter.d.ts +73 -0
  105. package/dist/task-adapter.d.ts.map +1 -0
  106. package/dist/task-adapter.js +379 -0
  107. package/dist/task-adapter.js.map +1 -0
  108. package/dist/task-cli.d.ts +3 -0
  109. package/dist/task-cli.d.ts.map +1 -0
  110. package/dist/task-cli.js +162 -0
  111. package/dist/task-cli.js.map +1 -0
  112. package/dist/types.d.ts +9 -0
  113. package/dist/types.d.ts.map +1 -1
  114. package/dist/wrap-cli.d.ts +5 -0
  115. package/dist/wrap-cli.d.ts.map +1 -1
  116. package/dist/wrap-cli.js +29 -2
  117. package/dist/wrap-cli.js.map +1 -1
  118. package/dist/wrap-screen.d.ts +3 -0
  119. package/dist/wrap-screen.d.ts.map +1 -0
  120. package/dist/wrap-screen.js +20 -0
  121. package/dist/wrap-screen.js.map +1 -0
  122. package/dist/wrap-state.d.ts +8 -1
  123. package/dist/wrap-state.d.ts.map +1 -1
  124. package/dist/wrap-state.js +21 -4
  125. package/dist/wrap-state.js.map +1 -1
  126. package/dist/wrap.d.ts.map +1 -1
  127. package/dist/wrap.js +204 -10
  128. package/dist/wrap.js.map +1 -1
  129. package/docs/flow-guard-model-comparison-2026-10-25.es.md +82 -0
  130. package/docs/flow-guard-model-comparison-2026-10-25.fr.md +82 -0
  131. package/docs/flow-guard-model-comparison-2026-10-25.md +82 -0
  132. package/docs/flow-guard-model-comparison-2026-10-25.ru.md +82 -0
  133. package/docs/flow-guard-model-comparison-2026-10-25.zh.md +82 -0
  134. package/docs/flow-guard.es.md +307 -12
  135. package/docs/flow-guard.fr.md +307 -12
  136. package/docs/flow-guard.md +315 -13
  137. package/docs/flow-guard.ru.md +314 -13
  138. package/docs/flow-guard.zh.md +306 -8
  139. package/docs/scan-limits.es.md +39 -0
  140. package/docs/scan-limits.fr.md +39 -0
  141. package/docs/scan-limits.md +39 -0
  142. package/docs/scan-limits.ru.md +39 -0
  143. package/docs/scan-limits.zh.md +39 -0
  144. package/docs/scan.es.md +2 -0
  145. package/docs/scan.fr.md +2 -0
  146. package/docs/scan.md +2 -0
  147. package/docs/scan.ru.md +2 -0
  148. package/docs/scan.zh.md +2 -0
  149. package/docs/security-hardening.es.md +1 -1
  150. package/docs/security-hardening.fr.md +1 -1
  151. package/docs/security-hardening.md +1 -1
  152. package/docs/security-hardening.ru.md +1 -1
  153. package/docs/security-hardening.zh.md +1 -1
  154. package/examples/atomic-screen-server.mjs +42 -0
  155. package/native/macos/Package.swift +9 -0
  156. package/native/macos/Sources/WardenDesktop/NativeSurface.swift +246 -0
  157. package/native/macos/Sources/WardenDesktop/StandardIO.swift +139 -0
  158. package/native/macos/Sources/WardenDesktopHost/Main.swift +211 -0
  159. package/package.json +18 -6
  160. package/scripts/build-macos.mjs +22 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,118 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.22.0 — 2026-10-25
4
+
5
+ Ships the local source recorded below. npm `0.21.0` did not include it. The entries below describe changes since 0.21.0.
6
+
7
+ - Add opt-in `annotationReview: "first-use"` for unverified MCP tool annotations. Server hints remain untrusted and never authorize effects or payments; the default remains off.
8
+ - Distinguish a requested package version from the version reported by a server when reviewing launch changes.
9
+ - Include the credential-window and flow-guard module changes recorded below.
10
+ - Add a repository-only selection evaluator with admissible choice sets, matched baseline comparisons and separate selection/mention metrics. The tie experiment does not establish reliable added guard benefit; no new runtime selection-blocking behavior is claimed. The evaluator is outside the npm package file list.
11
+ - Expand bounded source instruction signals for role/authority spoofing and add source-warning and Stop-trigger diagnostics. Keep semantic compliance unassessed and the existing overlap/continuation contract; saved-answer hook replay cannot establish changed model behavior. Local candidate only, not published by this change.
12
+ - Keep Post/Stop warnings free of raw tool/source metadata and detected-text quotes. Use stable opaque source IDs for correlation only; add hostile identifier/URL regressions and update source-identification tests. This is warning-channel custody, not semantic prevention.
13
+ - Record a fresh 720-answer, five-profile model comparison on Linux: injected target choices 48/48 unguarded, 44/48 and 46/48 published, 27/48 in both local candidate profiles; keep different clean baselines and six-cluster intervals visible. Twelve actual Stop continuations change no selected IDs. All 30 genuine-user controls pass; admissible IDs do not prove factual explanations. No independent holdout, native-client or broad security claim; no npm publication. Evidence: `docs/evidence/launchgate-live-comparison-2026-10-25/` in the monorepo.
14
+
15
+ ## Local source — credential-window measurement and prefix indexing, 2026-10-25
16
+
17
+ - Retain non-hex/hex strong windows at 8/10 after Linux hook comparisons at 6/7/8. Recognized normalized provider prefixes no longer cause alphabetic payload before the first digit to be skipped. Preserve generic/DER starts, every previous fingerprint and the existing storage format; existing sessions need a credential reread to gain new windows.
18
+ - Add a reproducible threshold sweep with two synthetic seeds, corpus manifests, whole-call decisions and deliberately selected collision controls. At unchanged 8/10, 717 of 14,400 attack fixtures change from ask to deny; all attacks already required ask or deny. Decisions on 7,680 benign requests per profile remain unchanged. A broader generic-prefix candidate was rejected for a false hard denial. These are fixture results, not a production false-positive estimate. [Study and evidence](../docs/growth/warden-thresholds-2026-10-25.ru.md). Local only, unreleased.
19
+
20
+ ## Local source — flow guard split into modules, 2026-10-24
21
+
22
+ - `src/flow-guard.ts` (2,286 lines) is now the public API and the hook entry point. The code moved unchanged into `src/flow-guard-*.ts`: types, paths, policy, text, classify, screen, destinations, fingerprints, decode, fragments, leak, state, pre, post, answer and labels. Exports and behaviour are the same: the existing tests pass unchanged, and the code-aware red team writes the same report as before (0 of 28 delivered).
23
+ - The Claude Code plugin carries `scripts/flow-guard.mjs` and its `flow-guard-*.mjs` parts. `npm run build` writes them; a test checks every copy against its compiled file and refuses any import other than node: built-ins and the guard's own parts. The parts sit in `dist/` beside the other modules, so the MOMUS release gate's build digest (`dist/*.js`) still covers the whole guard. Replaying another build with `WARDEN_FLOW_GUARD` needs the parts in the same folder.
24
+
25
+ ## 0.21.0 — 2026-10-24
26
+
27
+ Ships the local source recorded below. npm `0.20.0` did not include it.
28
+
29
+ ## Local source — second native macOS audit, 2026-10-24
30
+
31
+ - Bind native target opacity through its ancestor chain and refuse fully transparent windows/controls, blocked modality and pending sheets, including logical sheetParent transitions before attachedSheet is populated. Observe sheet/minimize transitions before effects.
32
+ - Pin ABI-checked method_getImplementation and invoke that exact IMP directly. NSApp.sendAction overrides can reroute, defer or return success without the approved handler, so they are no longer a dispatch authority. Registered handlers must enforce their own permissions and support direct invocation.
33
+ - Recheck the revision after injected clocks and prepare callbacks; allocate the receipt revision before effects and guard monotonic deadline overflow. Add real-window regressions for these paths and preserve strict defaults. Update five languages; no npm publication or remote release gate.
34
+
35
+ ## Local source — follow-up atomic backend audit, 2026-10-24
36
+
37
+ - Refuse native target changes during overridable hit-test in both prepare and commit by recapturing target state; recheck wall and monotonic expiry immediately before dispatch. Hidden application mutations still require explicit invalidation.
38
+ - Reject Objective-C block sender signatures (`@?`) rather than accepting the object prefix. Add real AppKit regressions for stale preparation, handler/title/enabled/frame drift without invalidation, both clocks and reentrant handlers.
39
+ - Add a monotonic deadline to the generic TypeScript atomic server, reclaim expired pending capacity with either clock and recheck expiry after target validation. Keep strict mode and local-only scope; update five languages.
40
+
41
+ ## Local source — native target-side macOS backend, 2026-10-23
42
+
43
+ - Add the local Swift WardenDesktop package, WardenDesktopSurface and bounded exclusive-stdio transport. Compare live registered AppKit button/target/selector/implementation, window/focus, metadata and hit-test on MainActor; recheck revision after overridable hit-test; dispatch directly to the retained target without AX/CGEvent/performClick or responder routing. Validate void target-action signatures, bounds and unique identities; retain targets and consume five-minute wall/monotonic tickets before effects.
44
+ - Provide a real native demo window and local build:macos / test:macos commands. This is an application-embedded backend, not an injector for unmodified third-party apps. MainActor model invalidation before mutations and synchronous non-modal handlers are required; receipts attest local dispatch, not external payment/mail completion. Raw effects and unsupported typing/keyboard/clipboard paths refuse. No TCC or global input changes.
45
+ - Add a separate real macOS integration gate with production/test binaries, cross-language stamp parity, Unicode, target/handler/object/frame/window drift, ABA, hit-test reentrancy, clock rollback, replay/cancel/restart and actual wrap forms. Compile test endpoints out of production; fail rather than silently skip when native prerequisites are absent. Configure macOS CI jobs locally and update five languages. No remote CI, publication or deployment.
46
+
47
+ ## Local source — atomic screen target CAS, 2026-10-23
48
+
49
+ - Add opt-in `wrap --screen-atomic`: private prepare/commit/cancel protocol binds a one-use ticket to the full action, target stamp and surface revision. Require enforcement and a supported server; never fall back to raw GUI dispatch. Validate receipts, hide tickets, refuse oversized incomplete previews, preserve uncertainty leases and never retry effects.
50
+ - Add exported `@aimarket/warden/atomic-screen` server runtime. A shared server-owned surface compares and synchronously commits to the resolved target in one critical section. Rotate revisions on every mutation/commit, including hidden handler changes and ABA; consume tickets before effects, expire pending capacity and invalidate uncertain state. Reject async callback registration and reentrancy. Other mutation paths and transport authentication remain the backend's responsibility.
51
+ - Include a runnable virtual-form server with no OS/network/payment effects. This is not a native desktop adapter: asynchronous OS/browser RPC, cached snapshots or untracked external mutations cannot satisfy the atomic ownership contract. Strict remains default; hooks and snapshot-only mode retain their previous limits.
52
+ - Add server and real stdio regressions for the final-read/commit race, same-metadata revisions, exact argument binding, replay, expiry, restart, cancellation, raw-call refusal and malformed/uncertain receipts. Update all five languages. Local only, no publication/deployment.
53
+
54
+ ## Local source — Auten outcome approval and fresh target checks, 2026-10-23
55
+
56
+ - Add explicit taskAdapter review mode and one-use ordered task_run plans. Show one unchecked MCP outcome form before the first effect with all fixed destinations/bodies; disallow caller-supplied steps and individual task_execute in review mode. Refuse missing form support and non-explicit acceptance.
57
+ - Hold a task execution lease across approval/run and atomically reserve the entire plan plus operation budgets after acceptance. Recheck pin/policy, expiry, cancellation and authentication binding before every fixed step; stop the rest on drift/error, preserve spent reservations and never claim rollback of earlier effects. Record approval separately from execution outcomes.
58
+ - Add opt-in wrap --screen-read / --screen-read-input for an operator-selected same-server observation schema. Observe before the question and after acceptance, recheck definitions and risk context, and compare the fresh response's target role/reference/accessibility identity/bounds/context. Refuse unsupported/ambiguous schemas, pixels-only results, changed targets, failed reads and cancellation.
59
+ - Serialize known GUI effects across enforcing proxies in one flow session; an uncertain missing result leaves a non-reclaimable lease for operator review. Audit unchanged/refused/uncertain screen checks separately from user approval. Hooks cannot revalidate between the client's dialog and execution.
60
+ - Strict remains default. Structured plans do not grant arbitrary GUI chains. Snapshot and click remain separate calls; cached/false server metadata, external actors and unchanged event handlers require a trusted atomic server-side revision/effect contract for stronger guarantees. Update all five languages and prepare an unsent Auten reply. No publishing/deployment.
61
+
62
+ ## Local source — Gautam regressions and failing replay gate, 2026-10-23
63
+
64
+ - Add bounded decimal scalar-code and NATO-word candidates, including explicit numeric arrays and case markers for nested encodings. Unknown items break a run; candidates share existing limits. Decoding alone never denies ordinary numbers/prose. First 1–4 character encodings still require review at the credential boundary.
65
+ - Classify unlabelled MCP Git commit/push and GitHub push_files, with common camelCase/dotted names, as outbound/persistent effects. Keep get_commit/list_commits as reads. Add regression fixtures without performing any real commit or push.
66
+ - Extend the original 23 end-to-end scenarios with five Gautam cases. `test:redteam` now fails on reopened delivery, missing/duplicate cases or inconsistent outcomes: 26 tool attacks and two answer-only note/recheck cases, never conflated. Fault-injected reports prove the gate exits nonzero.
67
+ - Wire the gate into local WARDEN/workspace CI, npm prepublishOnly and registry publication workflow. No remote workflows or publication were triggered. Update all five languages and prepare an unsent response.
68
+
69
+ ## Local source — constrained task capabilities, 2026-10-23
70
+
71
+ - Keep strict GUI behavior by default and retire automatic permissions based on untrusted snapshots, including legacy `gui.mode: "policy"`. A spoofed Close/role/accessibility ID cannot authorize Send. Geometry/focus/translated labels remain explanation only.
72
+ - Add opt-in `warden-mcp task`: a built-in MCP effect adapter with pinned UTF-8 resources and exact operator-reviewed HTTP requests, selected only by fixed IDs. No arbitrary GUI forwarding, browser profile, clipboard, page scripts or dynamic payloads. Bind its MCP name explicitly in protected `taskAdapter` policy and pin the manifest bytes.
73
+ - Validate the entire manifest and RPC schema, reject duplicate JSON keys/extra metadata, bound expiry, request/response size and time, deny redirects and retries. Persist per-task budgets before dispatch under a cross-process lock and fsync; restart, uncertain outcomes, cancellation after dispatch or manifest edits cannot replenish a spent task ID. Keep audit free of payloads/tokens.
74
+ - Narrow Copy exceptions to exact known keyboard tool names. Regressions cover policy spoofing, first 1–4 secret characters/encodings, exact request bodies, independent server processes, redirects, state corruption and uncertain payment outcomes.
75
+ - Rerun deterministic AgentDojo locally without network/model API: intent 0/579 delivered action attacks, 57/97 clean tasks without a question, 58/97 clean completion, 608/949 completion under attack (historically 613/949). This does not measure GUI usability or recertify live-model results. Five-language docs cover setup, migration, payment semantics and limits. Nothing published or deployed.
76
+
77
+ ## Local source — credential boundary and layered encodings, 2026-10-23
78
+
79
+ - Require review after credentials plus outside text for supported outbound/MCP calls, including read-only labels and one-character/unknown-encoded arguments, and ordinary project-file writes. Keep a sticky credential flag across prompts and bounded source-history rotation. This supersedes the former length-dependent automatic-pass behavior.
80
+ - Add optional exact public-request rules to protected user policy. Bind full tool/all canonical JSON arguments; consume each rule once per session under the shared lock. Never waive detected leaks, incomplete scans, saturated stores, GUI controls, shell/destructive actions or protected settings. Reject extra RPC metadata and malformed arguments for automatic grants.
81
+ - Compose bounded URL, canonical base64/base64url, UTF-8 hex, Unicode/hex escapes, numeric entities and English character-list candidates. Report depth/variant/text exhaustion explicitly; never interpret it as clean data. Validate corrupt fingerprint files, preserve standalone PII checks, and bound e-mail matching to prevent long non-address payloads from causing quadratic scans.
82
+ - Real stdio regressions check tiny/encoded arguments, concurrent once-only public rules, retry/metadata bypass and no delivery without approval. Workflow fixture: 0/16 automatic attacks in both profiles; strict default reviews 12/12 benign calls, exact reviewed rules 0/12. The fingerprint-only corpus reports 0 hard false denials and 2 reviewed files among 758; these are distinct measurements, not a production rate.
83
+ - Five-language docs include the same validated policy example, approval semantics, bounded decoding and explicit usability costs. No public rules are installed, and no publishing or deployment occurs.
84
+
85
+ ## Earlier local iteration — first-fragment review, 2026-10-23
86
+
87
+ - Stop the first matching short credential fragment with per-call `ask` before execution (`deny` refuses). Preserve hard denial for two distinct adjacent six-character pieces. Earlier approval never whitelists a repeated or later call.
88
+ - Add narrow five/seven-character and known-prefix-boundary fingerprints, excluding public prefixes and tiny suffixes. Decode short supported URL/base64/character-list candidates and delimit atoms without weakly scanning long uninterrupted hashes.
89
+ - Version the hash/offset/size index as v2; old v1 sessions require review and a fresh session/reread for complete tracking. Validate both index and observations; retain conservative capacity and corruption handling. GUI policy cannot waive ambiguous fragment review.
90
+ - Regression tests assert no first-fragment server delivery for concurrent unapproved calls and for decline/cancel/missing elicitation. An explicit approval forwards one call only.
91
+ - The new-rule 480-key/757-file probe measures 0 hard false denials and 2 files requiring review, not zero false positives. Five-language documentation explains scope, approval semantics and remaining limits. No npm publication, GitHub write or deployment.
92
+
93
+ ## Earlier local iteration — secret-transfer regressions, 2026-10-23
94
+
95
+ - Correlate distinct adjacent six-character credential payload fragments across fields, turns and concurrent proxies; a single short match, repeated piece, overlap or unrelated key is insufficient. Shared prefixes and DER structure are excluded. Earlier partial disclosure remains possible.
96
+ - Decode explicit English character/digit lists with bounded input and reset at unsupported units, then apply existing secret checks. Arbitrary verbal encodings remain outside the decoder.
97
+ - Store bounded hash/offset metadata under the session lock; fail conservatively on legacy or exhausted tracking and fail closed on corrupt state. Project-file writes also receive the new correlation check. Strict GUI stays the default; detected secrets cannot be exempted by GUI policy.
98
+ - Hook and real concurrent stdio regression tests verify refusal before server delivery. The unchanged 23-case deterministic red-team harness moves from 2 delivered to 0 delivered (two answer-only cases are noted/rechecked). Five-language documentation separates this local result from historical AgentDojo/corpus measurements. No production deploy or npm publication.
99
+
100
+ ## Unreleased
101
+
102
+ - **Superseded by the constrained task mode above: optional GUI policy mode** (`gui.mode: "policy"`) reduces questions only for explicit exact tool/action/role/accessibility-ID rules scoped to a site origin and/or application ID. Strict behavior remains the default. Validated coordinates and focus resolve the target; visible labels never grant permission. Bounded plain typing and configured navigation keys are supported, with snapshot age and one-use reservations under the session lock. Unknown/malformed policy or call shapes fall back to strict behavior with a diagnostic. Send/pay/delete/submit, Enter, paste, sensitive-data matches and credential reads retain their checks. Forwarded input/paste gates later clicks for the rest of the session. Local stdio tests compare four strict forms with one policy form for the same four fixture calls; this is not a real-world utility measurement. Five language docs include the same validated configuration example.
103
+
104
+
105
+ The local source closes automatic-pass paths for coordinate clicks, pixel-only screens, Enter in a focused field and non-English labels. By default, after untrusted content, every recognized GUI pointer action, text input/fill, paste and non-exempt keyboard action requires approval (`screen_action`; `deny` refuses). Target labels and element-list formats no longer decide whether approval is required. English target words only improve the explanation. A user-named or policy-allowed destination does not exempt GUI actions.
106
+
107
+ - Only exact copy/select-all chords in a strict known schema are exempt from the GUI rule; extra fields, sequences, malformed arrays, trailing newlines and oversized values ask. Visible-secret checks remain in force. Unknown/missing generic controller actions ask; exact known observation actions with only `action` are exempt. CamelCase and dotted/hyphenated names are normalized.
108
+ - Coordinate hit-testing against unambiguous JSON boxes or exact centers, reported focus/form relations for Enter and cmd/ctrl+Enter, semantic submit types, accessibility/automation ID hints and a small multilingual action vocabulary improve the approval explanation. Overlaps, conflicting geometry, invalid values and conflicting duplicate nodes do not resolve a target. These are explicitly untrusted snapshot hints; context alone never exempts an action, while explicitly configured operator rules can permit reviewed interactions. Raw accessibility identifiers are not retained in element metadata or shown in the prompt. Asking only after paste/input remains insufficient for prefilled messages, payments and deletion.
109
+ - Clipboard paste asks without needing a recognized credential read; the more specific `paste_after_secret` reason remains when such a read was recorded. Plain typing and Enter ask even without a visible credential or focus description.
110
+ - The previous large-image text-budget and stale-screen fixes remain: binary image/audio result data does not hide later text, action results refresh the screen map, acknowledgments retain it and image-only results clear it. Outgoing arguments keep all secret checks.
111
+ - Hook and real stdio-proxy integration tests cover coordinates, pixels, multilingual labels, Enter, unknown schemas and per-action approval, asserting refused calls never reach the server. Five language documents explain the behavior and limitations.
112
+ - This deliberately increases confirmation frequency, including benign navigation and message-body clicks. No OCR or visual instruction classifier was added; answer-only pixel injection, arbitrary renamed tools and hidden server behavior remain outside this rule. It requires recorded untrusted content, enabled enforcement and a client that honors hook decisions. See [the flow guard documentation](docs/flow-guard.md#opaque-gui-actions-local-source-2026-10-23).
113
+
114
+ npm `0.20.0` did not include the screen-control fixes. They ship in 0.21.0.
115
+
3
116
  ## 0.20.0 — 2026-10-22
4
117
 
5
118
  What 0.19.0 still let through, closed as far as it goes without false positives, and one false positive of 0.19.0 itself. [The flow guard doc](docs/flow-guard.md#what-changed-on-2026-10-22-and-why) has the table; 2 of 23 code-aware attacks still get through, both named.
package/README-es.md CHANGED
@@ -8,7 +8,7 @@
8
8
  <a href="https://glama.ai/mcp/servers/alexar76/warden"><img src="https://glama.ai/mcp/servers/alexar76/warden/badges/score.svg" alt="warden MCP server" /></a>
9
9
  <a href="https://warden.modelmarket.dev/"><img src="https://img.shields.io/npm/v/@aimarket/warden?color=cb3837&label=npm" alt="npm version" /></a>
10
10
  <img src="docs/badges/deps.svg" alt="Cero dependencias de ejecución" />
11
- <img src="docs/badges/tests.svg" alt="586 pruebas en verde" />
11
+ <img src="docs/badges/tests.svg" alt="1256 pruebas en verde" />
12
12
  <img src="docs/badges/node.svg" alt="Node >= 20" />
13
13
  <a href="LICENSE"><img src="docs/badges/license.svg" alt="Licencia: MIT" /></a>
14
14
  </p>
@@ -29,11 +29,11 @@
29
29
  **Revisa todos los servidores MCP de tu máquina.** Sin cuenta, sin clave de API, sin modelo. El único tráfico de red va a los servidores de tu configuración.
30
30
 
31
31
  ```bash
32
- npx -y @aimarket/warden@0.20.0 scan
32
+ npx -y @aimarket/warden@0.22.0 scan
33
33
  ```
34
34
 
35
35
  ```text
36
- WARDEN scan 0.20.0 · ruleset 11 sha256-RDXs+TaQoehA… · block at high
36
+ WARDEN scan 0.21.0 · ruleset 11 sha256-RDXs+TaQoehA… · block at high
37
37
  read .mcp.json (claude-code, 3 servers)
38
38
 
39
39
  ✓ allow notes claude-code 1 tool · score 0.90
@@ -47,7 +47,8 @@ Details: warden-mcp scan --json, or --markdown FILE. To review a changed server:
47
47
  Frente a otros cuatro escáneres de código abierto sobre los mismos servidores, cada uno en un contenedor gVisor sin red: en la mitad reservada de MCPTox (un benchmark de AAAI 2026; las reglas de WARDEN se escribieron con la otra mitad) WARDEN bloquea 171 de 218 herramientas envenenadas, los demás entre 8 y 41. En 986 servidores públicos WARDEN bloquea 3 y en 14 933 paquetes de npm y PyPI, 369; mcp-shield bloquea 343 y 5354. [Método y todas las cifras](docs/scanner-comparison.es.md) · [guía de scan](docs/scan.es.md).
48
48
  <!-- /warden-try -->
49
49
 
50
- **Guardia de flujo (0.20.0).** Comprobaciones de llamadas tras texto externo, reforzadas tras la auditoría del 2026-10-18 y ampliadas dos veces el 2026-10-22: claves en trozos o disfrazadas, herramientas sin etiqueta que llegan a una persona, una clave escrita en un archivo del proyecto, una dirección solo pegada en el prompt, y una nota (y una revisión) bajo respuestas apoyadas en texto externo. 2 de nuestros 23 ataques con el código en la mano siguen pasando, cada uno nombrado. Replay de AgentDojo sobre este código: 0 de 579 acciones de ataque, 57 de 97 tareas sin pregunta. La ejecución con modelo anterior (modelo secuestrado 42 → 0 de 929) describe la versión previa a la auditoría. [Comportamiento y límites actuales](docs/flow-guard.es.md).
50
+ **Guardia de flujo (código local, 2026-10-23).** Tras credenciales y texto externo, llamadas salientes/MCP y escrituras normales del proyecto requieren revisión, incluso con partes diminutas o codificación desconocida. Solicitudes públicas exactas revisadas por el operador pueden ejecutarse una vez por sesión; no eximen fugas detectadas ni análisis incompletos. Prueba: 0/16 ataques automáticos en ambos perfiles; revisión inocua 12/12 por defecto, 0/12 con reglas exactas. Compromiso explícito de uso, no decodificación universal. El mismo conjunto sigue en 0/23 entregados por completo. Producción/npm no cambian. [Política, pruebas y límites](docs/flow-guard.es.md).
51
+
51
52
 
52
53
  Ruleset v16 (0.20.0, 2026-10-22, solo WARDEN): mitad reservada de MCPTox 210 de 218 (v15: 194, v12–v14: 171), 0 de 45 servidores limpios; en el corpus de campo y en una muestra de 1000 paquetes de HISTOR bloquea exactamente lo mismo que v15. La comparación con otros escáneres de arriba es del 2026-10-16, con v12. [v15 y v16 en la cadena de puertas](docs/gates.es.md).
53
54
 
@@ -80,6 +81,20 @@ servidor MCP stdio añade otros builtins `node:` (`fs`, `path`, `process`) y sig
80
81
  Es el cortafuegos de [ARGUS](https://github.com/alexar76/argus), extraído para que puedas ponerlo
81
82
  delante de tu propio host MCP sin adoptar un agente.
82
83
 
84
+ Regresiones para códigos decimales/NATO y MCP Git commit/push; replay completo de 28 casos como gate CI/release local (`npm run test:redteam`).
85
+
86
+ Seguimiento Auten: `taskAdapter.mode: "review"` / `task_run` pregunta una vez por el resultado fijo; `wrap --screen-read` cancela acciones aprobadas si cambia el objetivo. GUI estricto por defecto; snapshot y clic no son atómicos.
87
+
88
+ Modo atómico: `wrap --flow screen --screen-read screenshot --screen-atomic` exige CAS de revisión/objetivo en un servidor de confianza (`AtomicScreenServer`, `warden.screen.atomic.v1`). Sin clic directo alternativo; solo superficies síncronas controladas por el servidor. Incluye un ejemplo de formulario virtual; no se afirma atomicidad del escritorio nativo arbitrario.
89
+
90
+ macOS nativo: `npm run build:macos` compila el SDK AppKit dentro de la aplicación y una ventana real; `npm run test:macos` ejecuta su gate independiente. La atomicidad exige integrar `WardenDesktopSurface` en la aplicación propietaria; se rechazan aplicaciones ajenas. Véase [integración macOS](docs/flow-guard.es.md).
91
+
92
+ ## Modo de tareas limitado: menos confirmaciones y control del efecto real
93
+
94
+ El GUI estricto sigue siendo predeterminado. `gui.mode: "policy"` / `gui.allow` se leen para migración, pero ya no autorizan clics, escritura ni teclas de navegación tras texto externo. La página puede falsificar incluso origin, rol e accessibility ID. Geometría, foco y traducciones solo explican. Nombres compuestos como `press_keys_then_execute` no obtienen la excepción Copy; metadatos RPC adicionales tampoco autorizan automáticamente.
95
+
96
+ Operaciones limitadas explícitas: `node dist/mcp-server.js task`. [Adaptador, pagos, límites y nuevo AgentDojo replay](docs/flow-guard.es.md). Solo código local, sin publicación ni despliegue.
97
+
83
98
  ## Proteger Claude Desktop o Cursor con un envoltorio
84
99
 
85
100
  **Use 0.8.2 o posterior: 0.8.0 y 0.8.1 permiten que un servidor envuelto falsifique la respuesta al propio `tools/list` del cliente** ([CHANGELOG](CHANGELOG.md)). Desde el código fuente, `node /ruta/absoluta/warden/dist/mcp-server.js wrap ...` funciona igual. Añadir WARDEN como servidor separado no inspecciona los demás servidores. Probado de extremo a extremo con el SDK de TypeScript de MCP y servidores de prueba; aún no hay ejecuciones registradas en los propios Claude Desktop y Cursor ([validación de la versión](docs/wrap-validation.md)). Sustituya el comando de cada servidor protegido por `wrap`:
@@ -89,14 +104,14 @@ delante de tu propio host MCP sin adoptar un agente.
89
104
  "mcpServers": {
90
105
  "filesystem": {
91
106
  "command": "npx",
92
- "args": ["-y", "@aimarket/warden@0.20.0", "wrap", "--id", "filesystem", "--",
107
+ "args": ["-y", "@aimarket/warden@0.22.0", "wrap", "--id", "filesystem", "--",
93
108
  "npx", "-y", "@modelcontextprotocol/server-filesystem", "/Users/me/docs"]
94
109
  }
95
110
  }
96
111
  }
97
112
  ```
98
113
 
99
- Especifique siempre `--id`: sin él, cambiar los argumentos crea otra identidad y otro primer contacto. Con un ID estable, cambiar el comando o una ruta produce `SERVER_IDENTITY_DRIFT`. El hijo hereda el entorno, excluido de la identidad. `npm install -g @aimarket/warden@0.20.0` y el comando `warden-mcp` evitan arranques fríos repetidos de `npx`.
114
+ Especifique siempre `--id`: sin él, cambiar los argumentos crea otra identidad y otro primer contacto. Con un ID estable, cambiar el comando o una ruta produce `SERVER_IDENTITY_DRIFT`. El hijo hereda el entorno, excluido de la identidad. `npm install -g @aimarket/warden@0.22.0` y el comando `warden-mcp` evitan arranques fríos repetidos de `npx`.
100
115
 
101
116
  **Herramientas sensibles.** `sensitiveToolPatterns` en un archivo de política (`--policy policy.json` con `{"sensitiveToolPatterns": ["*delete*", "*transfer*"]}`, comodines `*` sin distinguir mayúsculas) hace que cada llamada a una herramienta que coincida espere a una persona: `wrap` pregunta mediante el propio formulario del cliente (elicitation de MCP) con la herramienta, el servidor y los argumentos, y solo una respuesta aceptada con la casilla marcada deja pasar esa llamada. La casilla empieza desmarcada, así que un cliente que acepta formularios con sus valores por defecto no aprueba nada. Un cliente sin formulario de elicitation recibe un rechazo y el servidor nunca recibe la llamada; `--ask refuse` rechaza sin preguntar. Si el cliente cancela la llamada mientras la persona decide, o las definiciones cambian entretanto, no se envía. Antes de 0.20.0 `wrap` aceptaba estos patrones sin aplicarlos. Con `--flow`, un envío por el que la guardia de flujo preguntaría se pregunta igual.
102
117
 
@@ -124,16 +139,16 @@ Claude Desktop en macOS: `~/Library/Logs/Claude/mcp-server-<nombre>.log`. En Cur
124
139
  ## Analiza todos los servidores que inician tus clientes
125
140
 
126
141
  ```bash
127
- npx -y @aimarket/warden@0.20.0 scan
142
+ npx -y @aimarket/warden@0.22.0 scan
128
143
  ```
129
144
 
130
- Lee las configuraciones MCP de Claude Code, Claude Desktop, Cursor, VS Code y Windsurf, se conecta a cada servidor que inician y revisa las definiciones de herramientas antes de que un modelo las vea. Imprime una tabla, JSON, SARIF o Markdown, y sale con 1 cuando bloquea un servidor; `--no-launch` no inicia nada. En un repositorio, `warden.lock.json` convierte un cambio en las definiciones en un diff revisable, y la CI falla ante un servidor nuevo o modificado. También como GitHub Action (`uses: alexar76/warden@v0.20.0`), hooks de pre-commit y plugin de Claude Code (`/plugin marketplace add alexar76/warden`). `--histor` pregunta al registro público HISTOR si un servidor te sirve lo mismo que a todos; para un servidor remoto envía el endpoint y un digest; para un servidor stdio que arranca desde npm o PyPI, el nombre del paquete (`npm:<nombre>`, `pypi:<nombre>`, que HISTOR ejecuta en un sandbox gVisor) y un digest; nunca el texto de las herramientas. Un clasificador opcional (`--classifier-url`, `--classifier-model`) añade la lectura de un modelo que tú eliges, local o alojado, para lo que ninguna regla nombra. Consulta la [guía de scan](docs/scan.es.md). Cómo se compara con otros dos escáneres sobre los mismos servidores: [comparación de escáneres](docs/scanner-comparison.es.md).
145
+ Lee las configuraciones MCP de Claude Code, Claude Desktop, Cursor, VS Code y Windsurf, se conecta a cada servidor que inician y revisa las definiciones de herramientas antes de que un modelo las vea. Imprime una tabla, JSON, SARIF o Markdown, y sale con 1 cuando bloquea un servidor; `--no-launch` no inicia nada. En un repositorio, `warden.lock.json` convierte un cambio en las definiciones en un diff revisable, y la CI falla ante un servidor nuevo o modificado. También como GitHub Action (`uses: alexar76/warden@v0.21.0`), hooks de pre-commit y plugin de Claude Code (`/plugin marketplace add alexar76/warden`). `--histor` pregunta al registro público HISTOR si un servidor te sirve lo mismo que a todos; para un servidor remoto envía el endpoint y un digest; para un servidor stdio que arranca desde npm o PyPI, el nombre del paquete (`npm:<nombre>`, `pypi:<nombre>`, que HISTOR ejecuta en un sandbox gVisor) y un digest; nunca el texto de las herramientas. Un clasificador opcional (`--classifier-url`, `--classifier-model`) añade la lectura de un modelo que tú eliges, local o alojado, para lo que ninguna regla nombra. Consulta la [guía de scan](docs/scan.es.md). Cómo se compara con otros dos escáneres sobre los mismos servidores: [comparación de escáneres](docs/scanner-comparison.es.md).
131
146
 
132
- **Para el editor de un servidor.** Si tu servidor lista otras herramientas donde está instalado algo que el sandbox de HISTOR no tiene —el runner de un lanzador, uno por sistema operativo—, `npx -y @aimarket/warden@0.20.0 declare --out mcp-tool-sets.json -- <tu servidor>` escribe esos conjuntos en un archivo que publicas en tu propio dominio, y quienes los reciben ven la declaración del editor en lugar de un conjunto desconocido. Consulta la [guía de scan](docs/scan.es.md).
147
+ **Para el editor de un servidor.** Si tu servidor lista otras herramientas donde está instalado algo que el sandbox de HISTOR no tiene —el runner de un lanzador, uno por sistema operativo—, `npx -y @aimarket/warden@0.22.0 declare --out mcp-tool-sets.json -- <tu servidor>` escribe esos conjuntos en un archivo que publicas en tu propio dominio, y quienes los reciben ven la declaración del editor en lugar de un conjunto desconocido. Consulta la [guía de scan](docs/scan.es.md).
133
148
 
134
149
  ## Lo que WARDEN no hace
135
150
 
136
- Solo envuelve stdio. Los resultados de las herramientas se leen con las mismas reglas (`--results warn`, por defecto, antepone un aviso al resultado que se lee como instrucciones al modelo; `block` lo retiene, cuando la herramienta ya se ejecutó; `off`); no analiza argumentos de llamadas, `prompts/*`, `resources/*`, sampling ni elicitation. Pueden pasar paráfrasis e instrucciones no inglesas sin literales reconocidos; véase el [clasificador HISTOR](https://github.com/alexar76/histor). No es un sandbox ni protege la configuración contra ediciones. No puede hacer atómicas la comprobación y la ejecución en otro proceso: un cambio detectado antes del envío bloquea; durante la ejecución se retiene el resultado, pero la acción pudo ocurrir. Un cambio silencioso posterior a la última lista no es observable. Los clientes sin notificaciones pueden mostrar listas antiguas; las definiciones se comprueban antes de llamar.
151
+ Solo envuelve stdio. Los resultados de las herramientas se leen con las mismas reglas (`--results warn`, por defecto, antepone un aviso al resultado que se lee como instrucciones al modelo; `block` lo retiene, cuando la herramienta ya se ejecutó; `off`); no analiza argumentos de llamadas, `prompts/*`, `resources/*`, sampling ni elicitation. Pueden pasar paráfrasis e instrucciones no inglesas sin literales reconocidos; véase el [clasificador HISTOR](https://github.com/alexar76/histor). No es un sandbox ni protege la configuración contra ediciones. Sin un backend de pantalla atómico participante y de confianza, no puede hacer atómicas la comprobación y la ejecución en otro proceso: un cambio detectado antes del envío bloquea; durante la ejecución se retiene el resultado, pero la acción pudo ocurrir. Un cambio silencioso posterior a la última lista no es observable. Los clientes sin notificaciones pueden mostrar listas antiguas; las definiciones se comprueban antes de llamar.
137
152
 
138
153
  Los veredictos son diagnósticos sin firma, no certificaciones de cumplimiento. `--audit-only` marca los registros `AUDIT-ONLY`, deja pasar descripciones y llamadas bloqueadas por seguridad y no crea pins; mantiene límites de protocolo y recursos. Sirve para investigar falsos positivos, no para proteger.
139
154
 
@@ -325,6 +340,7 @@ comprobarlas: [Identidades ERC-8004](https://github.com/alexar76/aicom/blob/main
325
340
  | [Estudio de campo: 1 108 servidores MCP públicos](docs/mcp-survey.es.md) | Qué decidió WARDEN sobre definiciones de herramienta reales de terceros — 50 servidores bloqueados, 4 sustentados, y las seis formas en que el resto se equivocó |
326
341
  | [Comparación de escáneres](docs/scanner-comparison.es.md) | WARDEN, mcp-audit, mcp-shield, truecopy y mcpsentry sobre los mismos servidores, sobre 14 933 paquetes de npm y PyPI y sobre el benchmark MCPTox, con cada juicio, el manifiesto y el banco de pruebas |
327
342
  | [Guardián de flujos](docs/flow-guard.es.md) | La protección en ejecución del plugin de Claude Code: texto ajeno, datos privados, llamadas salientes; la medición en AgentDojo y sus límites |
343
+ | [Nueva comparación del modelo](docs/flow-guard-model-comparison-2026-10-25.es.md) | 720 respuestas: mejora en casos conocidos, incertidumbre, canal de avisos y ninguna corrección de ID observada por Stop |
328
344
  | [Glama / Docker](docs/GLAMA.md) | MCP stdio, health check, Build steps / CMD |
329
345
  | [Security](SECURITY.md) | Cómo informar de un bypass del cortafuegos |
330
346
  | [Contributing](CONTRIBUTING.md) | Regla de cero dependencias, PRs de la tabla de reglas |
@@ -348,7 +364,7 @@ comprobarlas: [Identidades ERC-8004](https://github.com/alexar76/aicom/blob/main
348
364
  ## Desarrollo
349
365
 
350
366
  ```bash
351
- npm install && npm run build && npm test # 586 pruebas
367
+ npm install && npm run build && npm test # 1256 pruebas
352
368
  ```
353
369
 
354
370
  `test/packaging.test.ts` es lo que mantiene honesto el titular: falla si aparece una dependencia de
package/README-fr.md CHANGED
@@ -8,7 +8,7 @@
8
8
  <a href="https://glama.ai/mcp/servers/alexar76/warden"><img src="https://glama.ai/mcp/servers/alexar76/warden/badges/score.svg" alt="warden MCP server" /></a>
9
9
  <a href="https://warden.modelmarket.dev/"><img src="https://img.shields.io/npm/v/@aimarket/warden?color=cb3837&label=npm" alt="version npm" /></a>
10
10
  <img src="docs/badges/deps.svg" alt="Zéro dépendance d'exécution" />
11
- <img src="docs/badges/tests.svg" alt="586 tests au vert" />
11
+ <img src="docs/badges/tests.svg" alt="1256 tests au vert" />
12
12
  <img src="docs/badges/node.svg" alt="Node >= 20" />
13
13
  <a href="LICENSE"><img src="docs/badges/license.svg" alt="Licence : MIT" /></a>
14
14
  </p>
@@ -29,11 +29,11 @@
29
29
  **Vérifiez tous les serveurs MCP de votre machine.** Pas de compte, pas de clé d’API, pas de modèle. Le seul trafic réseau va vers les serveurs de votre configuration.
30
30
 
31
31
  ```bash
32
- npx -y @aimarket/warden@0.20.0 scan
32
+ npx -y @aimarket/warden@0.22.0 scan
33
33
  ```
34
34
 
35
35
  ```text
36
- WARDEN scan 0.20.0 · ruleset 11 sha256-RDXs+TaQoehA… · block at high
36
+ WARDEN scan 0.21.0 · ruleset 11 sha256-RDXs+TaQoehA… · block at high
37
37
  read .mcp.json (claude-code, 3 servers)
38
38
 
39
39
  ✓ allow notes claude-code 1 tool · score 0.90
@@ -47,7 +47,8 @@ Details: warden-mcp scan --json, or --markdown FILE. To review a changed server:
47
47
  Face à quatre autres scanners open source sur les mêmes serveurs, chacun dans un conteneur gVisor sans réseau : sur la moitié réservée de MCPTox (un benchmark d’AAAI 2026 ; les règles de WARDEN ont été écrites à partir de l’autre moitié), WARDEN bloque 171 des 218 outils empoisonnés, les autres entre 8 et 41. Sur 986 serveurs publics, WARDEN en bloque 3 et sur 14 933 paquets npm et PyPI, 369 ; mcp-shield en bloque 343 et 5 354. [Méthode et tous les chiffres](docs/scanner-comparison.fr.md) · [guide de scan](docs/scan.fr.md).
48
48
  <!-- /warden-try -->
49
49
 
50
- **Garde de flux (0.20.0).** Vérifications des appels après du texte extérieur, renforcées après l’audit du 2026-10-18 et étendues deux fois le 2026-10-22 : clés en morceaux ou déguisées, outils sans étiquette qui atteignent une personne, une clé écrite dans un fichier du projet, une adresse seulement collée dans le prompt, et une ligne (et une vérification) sous les réponses appuyées sur du texte extérieur. 2 de nos 23 attaques code en main passent encore, chacune nommée. Rejeu AgentDojo sur ce code : 0 sur 579 actions d’attaque, 57 tâches sur 97 sans question. L’exécution avec modèle antérieure (modèle détourné 42 → 0 sur 929) décrit la version d’avant l’audit. [Comportement et limites actuels](docs/flow-guard.fr.md).
50
+ **Garde de flux (code local, 2026-10-23).** Après identifiants et texte extérieur, appels sortants/MCP et écritures ordinaires du projet imposent vérification, même pour fragments minuscules ou encodages inconnus. Des requêtes publiques exactes vérifiées par l’opérateur peuvent passer une fois par session ; elles ne dispensent pas les fuites reconnues ni analyses incomplètes. Scénario : 0/16 attaques automatiques dans les deux profils ; confirmations innocentes 12/12 par défaut, 0/12 avec règles exactes. Compromis explicite, pas décodeur universel. Même ensemble : 0/23 livrés intégralement. Production/npm restent inchangés. [Politique, tests et limites](docs/flow-guard.fr.md).
51
+
51
52
 
52
53
  Ruleset v16 (0.20.0, 2026-10-22, WARDEN seul) : moitié réservée de MCPTox 210 sur 218 (v15 : 194, v12–v14 : 171), 0 sur 45 serveurs propres ; sur le corpus de terrain et un échantillon de 1 000 paquets HISTOR, il bloque exactement ce que bloquait v15. La comparaison avec les autres scanners ci-dessus date du 2026-10-16, avec v12. [v15 et v16 dans la chaîne de portes](docs/gates.fr.md).
53
54
 
@@ -80,6 +81,20 @@ MCP stdio ajoute d'autres builtins `node:` (`fs`, `path`, `process`) et ne tire
80
81
  C'est le pare-feu d'[ARGUS](https://github.com/alexar76/argus), extrait pour que vous puissiez le
81
82
  placer devant votre propre hôte MCP sans adopter d'agent.
82
83
 
84
+ Régressions codes décimaux/NATO et MCP Git commit/push ; replay complet de 28 cas comme gate CI/release local (`npm run test:redteam`).
85
+
86
+ Suite Auten : `taskAdapter.mode: "review"` / `task_run` demande une fois pour le résultat fixé ; `wrap --screen-read` annule si la cible fraîche change. GUI strict par défaut ; snapshot et clic non atomiques.
87
+
88
+ Mode atomique : `wrap --flow screen --screen-read screenshot --screen-atomic` exige un CAS révision/cible sur un serveur de confiance (`AtomicScreenServer`, `warden.screen.atomic.v1`). Aucun clic direct de repli ; seules les surfaces synchrones contrôlées par le serveur sont prises en charge. Exemple de formulaire virtuel inclus ; aucune atomicité revendiquée pour un bureau natif arbitraire.
89
+
90
+ macOS natif : `npm run build:macos` compile le SDK AppKit côté application et une vraie fenêtre ; `npm run test:macos` lance son gate séparé. L’atomicité exige `WardenDesktopSurface` dans l’application propriétaire des contrôles ; les autres applications sont refusées. Voir [intégration macOS](docs/flow-guard.fr.md).
91
+
92
+ ## Mode de tâches limité : moins de confirmations, contrôle des effets réels
93
+
94
+ Le GUI strict reste le défaut. `gui.mode: "policy"` / `gui.allow` sont lus pour la migration, mais n’autorisent plus clic, saisie ou navigation après du texte externe. La page peut falsifier même origin, rôle et accessibility ID. Géométrie, focus et traductions expliquent seulement. Un nom composé tel que `press_keys_then_execute` n’obtient pas l’exception Copy ; des métadonnées RPC supplémentaires n’autorisent rien automatiquement.
95
+
96
+ Opérations limitées sur activation explicite : `node dist/mcp-server.js task`. [Adaptateur, paiements, limites et nouveau replay AgentDojo](docs/flow-guard.fr.md). Code local uniquement, aucune publication ni mise en production.
97
+
83
98
  ## Protéger Claude Desktop ou Cursor avec un wrapper
84
99
 
85
100
  **Utilisez 0.8.2 ou une version ultérieure : 0.8.0 et 0.8.1 permettent à un serveur placé derrière le wrapper de falsifier la réponse au propre `tools/list` du client** ([CHANGELOG](CHANGELOG.md)). Depuis les sources, `node /chemin/absolu/warden/dist/mcp-server.js wrap ...` fonctionne de la même façon. Ajouter WARDEN comme serveur distinct ne vérifie pas les autres serveurs. Testé de bout en bout avec le SDK TypeScript MCP et des serveurs de test ; aucun essai dans Claude Desktop ni dans Cursor eux-mêmes n’est encore consigné ([validation de la version](docs/wrap-validation.md)). Remplacez la commande de chaque serveur protégé par `wrap` :
@@ -89,14 +104,14 @@ placer devant votre propre hôte MCP sans adopter d'agent.
89
104
  "mcpServers": {
90
105
  "filesystem": {
91
106
  "command": "npx",
92
- "args": ["-y", "@aimarket/warden@0.20.0", "wrap", "--id", "filesystem", "--",
107
+ "args": ["-y", "@aimarket/warden@0.22.0", "wrap", "--id", "filesystem", "--",
93
108
  "npx", "-y", "@modelcontextprotocol/server-filesystem", "/Users/me/docs"]
94
109
  }
95
110
  }
96
111
  }
97
112
  ```
98
113
 
99
- Spécifiez toujours `--id` : sans cet identifiant, modifier les arguments crée une nouvelle identité et un premier contact. Un ID stable transforme un changement de commande ou de chemin en `SERVER_IDENTITY_DRIFT`. Le processus enfant hérite de l’environnement, exclu de l’identité. `npm install -g @aimarket/warden@0.20.0` puis `warden-mcp` évitent les démarrages à froid répétés de `npx`.
114
+ Spécifiez toujours `--id` : sans cet identifiant, modifier les arguments crée une nouvelle identité et un premier contact. Un ID stable transforme un changement de commande ou de chemin en `SERVER_IDENTITY_DRIFT`. Le processus enfant hérite de l’environnement, exclu de l’identité. `npm install -g @aimarket/warden@0.22.0` puis `warden-mcp` évitent les démarrages à froid répétés de `npx`.
100
115
 
101
116
  **Outils sensibles.** `sensitiveToolPatterns` dans un fichier de politique (`--policy policy.json` avec `{"sensitiveToolPatterns": ["*delete*", "*transfer*"]}`, motifs `*` insensibles à la casse) fait attendre une personne à chaque appel d’un outil correspondant : `wrap` demande par le formulaire du client lui-même (elicitation MCP), avec l’outil, le serveur et les arguments, et seule une réponse acceptée, case cochée, laisse passer cet appel-là. La case est décochée au départ : un client qui accepte les formulaires avec leurs valeurs par défaut n’approuve rien. Un client sans formulaire d’elicitation reçoit un refus et le serveur ne reçoit jamais l’appel ; `--ask refuse` refuse sans demander. Si le client annule l’appel pendant que la personne décide, ou si les définitions changent entre-temps, il n’est pas envoyé. Avant 0.20.0, `wrap` acceptait ces motifs sans les appliquer. Avec `--flow`, un envoi pour lequel la garde de flux demanderait est demandé de la même façon.
102
117
 
@@ -124,16 +139,16 @@ Claude Desktop sur macOS : `~/Library/Logs/Claude/mcp-server-<nom>.log`. Cursor
124
139
  ## Analyser tous les serveurs que démarrent vos clients
125
140
 
126
141
  ```bash
127
- npx -y @aimarket/warden@0.20.0 scan
142
+ npx -y @aimarket/warden@0.22.0 scan
128
143
  ```
129
144
 
130
- Lit les configurations MCP de Claude Code, Claude Desktop, Cursor, VS Code et Windsurf, se connecte à chaque serveur qu’elles démarrent et vérifie les définitions d’outils avant qu’un modèle ne les voie. Affiche un tableau, du JSON, du SARIF ou du Markdown, et sort avec 1 quand un serveur est bloqué ; `--no-launch` ne démarre rien. Dans un dépôt, `warden.lock.json` transforme un changement de définitions en diff relisible, et la CI échoue sur un serveur nouveau ou modifié. Existe aussi en GitHub Action (`uses: alexar76/warden@v0.20.0`), en hooks pre-commit et en plugin Claude Code (`/plugin marketplace add alexar76/warden`). `--histor` demande au journal public HISTOR si un serveur vous sert ce qu’il sert à tout le monde ; pour un serveur distant il envoie l’endpoint et un condensé, pour un serveur stdio lancé depuis npm ou PyPI le nom du paquet (`npm:<nom>`, `pypi:<nom>`, qu’HISTOR exécute dans un bac à sable gVisor) et un condensé — jamais le texte des outils. Un classificateur optionnel (`--classifier-url`, `--classifier-model`) ajoute la lecture d'un modèle que vous choisissez, local ou hébergé, pour ce qu'aucune règle ne nomme. Voir le [guide de scan](docs/scan.fr.md). Comment il se compare à deux autres scanners sur les mêmes serveurs : [comparaison de scanners](docs/scanner-comparison.fr.md).
145
+ Lit les configurations MCP de Claude Code, Claude Desktop, Cursor, VS Code et Windsurf, se connecte à chaque serveur qu’elles démarrent et vérifie les définitions d’outils avant qu’un modèle ne les voie. Affiche un tableau, du JSON, du SARIF ou du Markdown, et sort avec 1 quand un serveur est bloqué ; `--no-launch` ne démarre rien. Dans un dépôt, `warden.lock.json` transforme un changement de définitions en diff relisible, et la CI échoue sur un serveur nouveau ou modifié. Existe aussi en GitHub Action (`uses: alexar76/warden@v0.21.0`), en hooks pre-commit et en plugin Claude Code (`/plugin marketplace add alexar76/warden`). `--histor` demande au journal public HISTOR si un serveur vous sert ce qu’il sert à tout le monde ; pour un serveur distant il envoie l’endpoint et un condensé, pour un serveur stdio lancé depuis npm ou PyPI le nom du paquet (`npm:<nom>`, `pypi:<nom>`, qu’HISTOR exécute dans un bac à sable gVisor) et un condensé — jamais le texte des outils. Un classificateur optionnel (`--classifier-url`, `--classifier-model`) ajoute la lecture d'un modèle que vous choisissez, local ou hébergé, pour ce qu'aucune règle ne nomme. Voir le [guide de scan](docs/scan.fr.md). Comment il se compare à deux autres scanners sur les mêmes serveurs : [comparaison de scanners](docs/scanner-comparison.fr.md).
131
146
 
132
- **Pour l’éditeur d’un serveur.** Si votre serveur liste d’autres outils là où est installé ce que le bac à sable d’HISTOR n’a pas — le runner d’un lanceur, un par système —, `npx -y @aimarket/warden@0.20.0 declare --out mcp-tool-sets.json -- <votre serveur>` écrit ces ensembles dans un fichier que vous publiez sur votre propre domaine, et ceux qui les reçoivent voient la déclaration de l’éditeur au lieu d’un ensemble inconnu. Voir le [guide de scan](docs/scan.fr.md).
147
+ **Pour l’éditeur d’un serveur.** Si votre serveur liste d’autres outils là où est installé ce que le bac à sable d’HISTOR n’a pas — le runner d’un lanceur, un par système —, `npx -y @aimarket/warden@0.22.0 declare --out mcp-tool-sets.json -- <votre serveur>` écrit ces ensembles dans un fichier que vous publiez sur votre propre domaine, et ceux qui les reçoivent voient la déclaration de l’éditeur au lieu d’un ensemble inconnu. Voir le [guide de scan](docs/scan.fr.md).
133
148
 
134
149
  ## Ce que WARDEN ne fait pas
135
150
 
136
- Seul stdio est pris en charge. Les résultats des outils sont lus par les mêmes règles (`--results warn`, par défaut, place un avertissement devant un résultat qui se lit comme des instructions au modèle ; `block` le retient, l’outil ayant déjà été exécuté ; `off`) ; les arguments d’appel, `prompts/*`, `resources/*`, sampling et elicitation ne sont pas analysés. Des paraphrases et des instructions non anglaises sans littéraux reconnus peuvent passer ; voir le [classificateur HISTOR](https://github.com/alexar76/histor). Ce n’est pas un sandbox et la configuration du client reste modifiable. Vérification et exécution dans un autre processus ne sont pas atomiques : un changement détecté avant envoi bloque ; pendant l’exécution, la réponse est retenue, mais l’action peut avoir eu lieu. Un changement silencieux après la dernière liste est inobservable. Un client sans notifications peut afficher une ancienne liste ; les définitions sont revérifiées avant appel.
151
+ Seul stdio est pris en charge. Les résultats des outils sont lus par les mêmes règles (`--results warn`, par défaut, place un avertissement devant un résultat qui se lit comme des instructions au modèle ; `block` le retient, l’outil ayant déjà été exécuté ; `off`) ; les arguments d’appel, `prompts/*`, `resources/*`, sampling et elicitation ne sont pas analysés. Des paraphrases et des instructions non anglaises sans littéraux reconnus peuvent passer ; voir le [classificateur HISTOR](https://github.com/alexar76/histor). Ce n’est pas un sandbox et la configuration du client reste modifiable. Sans backend écran atomique participant et de confiance, vérification et exécution dans un autre processus ne sont pas atomiques : un changement détecté avant envoi bloque ; pendant l’exécution, la réponse est retenue, mais l’action peut avoir eu lieu. Un changement silencieux après la dernière liste est inobservable. Un client sans notifications peut afficher une ancienne liste ; les définitions sont revérifiées avant appel.
137
152
 
138
153
  Les verdicts sont des diagnostics non signés, pas des attestations de conformité. `--audit-only` inscrit `AUDIT-ONLY`, transmet les descriptions et appels refusés par la sécurité et ne crée pas d’empreintes ; les limites de protocole et de ressources restent actives. Ce mode sert à étudier les faux positifs, pas à protéger.
139
154
 
@@ -326,6 +341,7 @@ transactions et la façon de les vérifier :
326
341
  | [Étude de terrain : 1 108 serveurs MCP publics](docs/mcp-survey.fr.md) | Ce que WARDEN a décidé sur de vraies définitions d'outil tierces — 50 serveurs bloqués, 4 étayés, et les six façons dont le reste était faux |
327
342
  | [Comparaison de scanners](docs/scanner-comparison.fr.md) | WARDEN, mcp-audit, mcp-shield, truecopy et mcpsentry sur les mêmes serveurs, sur 14 933 paquets npm et PyPI et sur le benchmark MCPTox, avec chaque jugement, le manifeste et le banc d’essai |
328
343
  | [Garde de flux](docs/flow-guard.fr.md) | La protection à l’exécution du plugin Claude Code : texte extérieur, données privées, appels sortants ; la mesure sur AgentDojo et ses limites |
344
+ | [Nouvelle comparaison du modèle](docs/flow-guard-model-comparison-2026-10-25.fr.md) | 720 réponses : amélioration sur des cas connus, incertitude, canal d’avertissement et aucune correction d’ID observée par Stop |
329
345
  | [Glama / Docker](docs/GLAMA.md) | MCP stdio, health check, Build steps / CMD |
330
346
  | [Security](SECURITY.md) | Signaler un contournement du pare-feu |
331
347
  | [Contributing](CONTRIBUTING.md) | Règle zéro dépendance, PRs de table de règles |
@@ -349,7 +365,7 @@ transactions et la façon de les vérifier :
349
365
  ## Développement
350
366
 
351
367
  ```bash
352
- npm install && npm run build && npm test # 586 tests
368
+ npm install && npm run build && npm test # 1256 tests
353
369
  ```
354
370
 
355
371
  `test/packaging.test.ts` est ce qui tient l'accroche honnête : il échoue si une dépendance d'exécution
package/README-ru.md CHANGED
@@ -8,7 +8,7 @@
8
8
  <a href="https://glama.ai/mcp/servers/alexar76/warden"><img src="https://glama.ai/mcp/servers/alexar76/warden/badges/score.svg" alt="warden MCP server" /></a>
9
9
  <a href="https://warden.modelmarket.dev/"><img src="https://img.shields.io/npm/v/@aimarket/warden?color=cb3837&label=npm" alt="npm version" /></a>
10
10
  <img src="docs/badges/deps.svg" alt="Zero runtime dependencies" />
11
- <img src="docs/badges/tests.svg" alt="586 tests passing" />
11
+ <img src="docs/badges/tests.svg" alt="1256 tests passing" />
12
12
  <img src="docs/badges/node.svg" alt="Node >= 20" />
13
13
  <a href="LICENSE"><img src="docs/badges/license.svg" alt="License: MIT" /></a>
14
14
  </p>
@@ -29,11 +29,11 @@
29
29
  **Проверьте все MCP-серверы на своей машине.** Без аккаунта, без API-ключа, без модели. Сетевой трафик идёт только к серверам из вашего конфига.
30
30
 
31
31
  ```bash
32
- npx -y @aimarket/warden@0.20.0 scan
32
+ npx -y @aimarket/warden@0.22.0 scan
33
33
  ```
34
34
 
35
35
  ```text
36
- WARDEN scan 0.20.0 · ruleset 11 sha256-RDXs+TaQoehA… · block at high
36
+ WARDEN scan 0.21.0 · ruleset 11 sha256-RDXs+TaQoehA… · block at high
37
37
  read .mcp.json (claude-code, 3 servers)
38
38
 
39
39
  ✓ allow notes claude-code 1 tool · score 0.90
@@ -47,7 +47,8 @@ Details: warden-mcp scan --json, or --markdown FILE. To review a changed server:
47
47
  Рядом с четырьмя другими открытыми сканерами на одних и тех же серверах, каждый в контейнере gVisor без сети: на отложенной половине MCPTox (бенчмарк AAAI 2026; правила WARDEN писались по другой половине) WARDEN блокирует 171 отравленный инструмент из 218, остальные — от 8 до 41. На 986 публичных серверах WARDEN блокирует 3, на 14 933 пакетах npm и PyPI — 369; mcp-shield — 343 и 5 354. [Методика и все цифры](docs/scanner-comparison.ru.md) · [руководство по scan](docs/scan.ru.md).
48
48
  <!-- /warden-try -->
49
49
 
50
- **Страж потоков (0.20.0).** Проверки вызовов после внешнего текста усилены по аудиту 2026-10-18 и дважды расширены 2026-10-22: ключи кусками и в маскировке, непомеченные инструменты, которые обращаются к людям, ключ в файле проекта, адрес, только вставленный в запрос, и строка (а иногда и одна перепроверка) под ответом, опиравшимся на внешний текст. Из 23 наших атак со знанием кода проходят 2, обе названы. Воспроизведение AgentDojo на этом коде: 0 из 579 атак-действий, 57 из 97 задач без вопроса. Прежний прогон с моделью (перехваченная модель 42 → 0 из 929) относится к коду до аудита. [Текущее поведение и ограничения](docs/flow-guard.ru.md).
50
+ **Страж потоков (локальный код, 2026-10-23).** После учётных данных и внешнего текста исходящие/MCP-вызовы и обычные записи в проект требуют проверки независимо от длины фрагмента и неизвестной кодировки. Точные публичные запросы, проверенные оператором, могут исполняться один раз за сессию; найденные утечки и неполная проверка этим не освобождаются. В тестовом сценарии автоматически прошло 0/16 атак в обоих режимах; подтверждение для безвредных вызовов — 12/12 по умолчанию, 0/12 с точными правилами. Это явный компромисс удобства, а не универсальный декодер. Прежний набор — 0/23 прошедших целиком. Прод и npm не обновлены. [Политика, тесты и пределы](docs/flow-guard.ru.md).
51
+
51
52
 
52
53
  Ruleset v16 (0.20.0, 2026-10-22, только WARDEN): отложенная половина MCPTox — 210 из 218 (v15: 194, v12–v14: 171), 0 из 45 чистых серверов; на полевом корпусе и выборке из 1 000 пакетов HISTOR блокирует ровно то же, что v15. Сравнение с другими сканерами выше — от 2026-10-16, с v12. [v15 и v16 в цепочке гейтов](docs/gates.ru.md).
53
54
 
@@ -80,6 +81,20 @@ MCP-сервер добавляет другие `node:` builtins (`fs`, `path`,
80
81
  Это файрвол из [ARGUS](https://github.com/alexar76/argus), вынесенный отдельно, чтобы его можно было
81
82
  поставить перед своим MCP-хостом, не переезжая на агента.
82
83
 
84
+ Добавлены регрессии для десятичных/NATO-кодировок и MCP Git commit/push; полный hook replay из 28 случаев стал локально проверяемым CI/release-гейтом (`npm run test:redteam`).
85
+
86
+ Продолжение Auten: `taskAdapter.mode: "review"` / `task_run` задаёт один вопрос о фиксированном результате; `wrap --screen-read` отменяет одобренное GUI-действие при изменении свежей цели. Строгий GUI остаётся по умолчанию; снимок и клик не атомарны.
87
+
88
+ Атомарный режим: `wrap --flow screen --screen-read screenshot --screen-atomic` требует доверенного серверного CAS ревизии/цели (`AtomicScreenServer`, `warden.screen.atomic.v1`). Запасного обычного клика нет; поддерживаются только поверхности с синхронным исполнением под полным контролем сервера. Добавлен работающий пример виртуальной формы; атомарность произвольного рабочего стола не заявляется.
89
+
90
+ Нативная macOS: `npm run build:macos` собирает модуль AppKit внутри целевого приложения и пример с настоящим окном; `npm run test:macos` запускает отдельный интеграционный гейт. Атомарность требует подключения `WardenDesktopSurface` в приложение — владелец контролов; чужие приложения отклоняются. См. [подключение macOS](docs/flow-guard.ru.md).
91
+
92
+ ## Ограниченный режим задач: меньше подтверждений, контроль реального действия
93
+
94
+ Строгий GUI остаётся по умолчанию. Старые `gui.mode: "policy"` / `gui.allow` читаются для миграции, но больше не разрешают клик, ввод или навигационную клавишу после внешнего текста. Страница может подделать даже точный origin, роль и accessibility ID. Геометрия, фокус и переводы служат только объяснением. Составное имя вроде `press_keys_then_execute` не получает исключение Copy. Дополнительные поля RPC не дают автоматического разрешения.
95
+
96
+ Ограниченные операции включаются явно: `node dist/mcp-server.js task`. [Адаптер, платежи, пределы и новый AgentDojo replay](docs/flow-guard.ru.md). Только локальный код, без публикации и деплоя.
97
+
83
98
  ## Защитить Claude Desktop или Cursor одной обёрткой
84
99
 
85
100
  **Используйте 0.8.2 или новее: в 0.8.0 и 0.8.1 обёрнутый сервер мог подделать ответ на собственный запрос клиента `tools/list`** ([CHANGELOG](CHANGELOG.md)). Из исходников так же работает `node /полный/путь/warden/dist/mcp-server.js wrap ...`. Отдельный MCP-сервер WARDEN не проверяет соседние серверы. Проверено сквозными тестами с MCP TypeScript SDK и тестовыми серверами; запуски в самих Claude Desktop и Cursor пока не записаны ([проверка релиза](docs/wrap-validation.md)). Замените команду каждого защищаемого сервера на `wrap`:
@@ -89,7 +104,7 @@ MCP-сервер добавляет другие `node:` builtins (`fs`, `path`,
89
104
  "mcpServers": {
90
105
  "filesystem": {
91
106
  "command": "npx",
92
- "args": ["-y", "@aimarket/warden@0.20.0", "wrap", "--id", "filesystem", "--",
107
+ "args": ["-y", "@aimarket/warden@0.22.0", "wrap", "--id", "filesystem", "--",
93
108
  "npx", "-y", "@modelcontextprotocol/server-filesystem", "/Users/me/docs"]
94
109
  }
95
110
  }
@@ -98,7 +113,7 @@ MCP-сервер добавляет другие `node:` builtins (`fs`, `path`,
98
113
 
99
114
  Для обязательного утверждения первого контакта добавьте к `wrap` флаг `--require-approval`. Определения не попадут модели до `warden-mcp pins approve --id filesystem` в терминале оператора. Любое изменение полей или идентичности запуска требует нового утверждения; автоматические и старые pins не подходят. Подробнее: [граница допуска, не зависящая от языка](docs/security-hardening-language-boundary.md).
100
115
 
101
- Всегда задавайте `--id`: без него изменение аргументов создаёт новую идентичность и новый первый контакт. Со стабильным ID смена команды или пути даёт `SERVER_IDENTITY_DRIFT`. Дочерний процесс наследует окружение; оно не входит в идентичность. Чтобы избежать холодного старта `npx`, установите глобально: `npm install -g @aimarket/warden@0.20.0`, затем команда `warden-mcp`.
116
+ Всегда задавайте `--id`: без него изменение аргументов создаёт новую идентичность и новый первый контакт. Со стабильным ID смена команды или пути даёт `SERVER_IDENTITY_DRIFT`. Дочерний процесс наследует окружение; оно не входит в идентичность. Чтобы избежать холодного старта `npx`, установите глобально: `npm install -g @aimarket/warden@0.22.0`, затем команда `warden-mcp`.
102
117
 
103
118
  **Чувствительные инструменты.** `sensitiveToolPatterns` в файле политики (`--policy policy.json` с `{"sensitiveToolPatterns": ["*delete*", "*transfer*"]}`, шаблоны `*` без учёта регистра) заставляет каждый вызов подходящего инструмента ждать человека: `wrap` спрашивает через собственную форму клиента (MCP elicitation), показывая инструмент, сервер и аргументы, и пропускает этот один вызов только при отмеченной галочке и принятой форме. Галочка по умолчанию снята, поэтому клиент, принимающий формы со значениями по умолчанию, ничего не одобрит. Клиенту без формы elicitation вызов отклоняется, и сервер его не получает; `--ask refuse` отклоняет, не спрашивая. Если клиент отменил вызов, пока человек решает, или за это время изменились определения, вызов не отправляется. До 0.20.0 `wrap` принимал эти шаблоны, но не применял их. С `--flow` отправка, о которой страж потоков спросил бы, спрашивается так же.
104
119
 
@@ -126,16 +141,16 @@ warden-mcp pins revoke --id filesystem
126
141
  ## Проверить все серверы, которые запускают ваши клиенты
127
142
 
128
143
  ```bash
129
- npx -y @aimarket/warden@0.20.0 scan
144
+ npx -y @aimarket/warden@0.22.0 scan
130
145
  ```
131
146
 
132
- Читает MCP-конфиги Claude Code, Claude Desktop, Cursor, VS Code и Windsurf, подключается к каждому серверу из них и проверяет определения инструментов до того, как их увидит модель. Выводит таблицу, JSON, SARIF или Markdown и завершается с кодом 1, если сервер заблокирован; `--no-launch` ничего не запускает. В репозитории `warden.lock.json` превращает изменение определений инструментов в дифф для ревью, а CI падает на новом или изменённом сервере. Есть GitHub Action (`uses: alexar76/warden@v0.20.0`), хуки pre-commit и плагин Claude Code (`/plugin marketplace add alexar76/warden`). `--histor` спрашивает публичный журнал HISTOR, отдаёт ли сервер вам то же, что всем; для удалённого сервера уходят адрес и дайджест, для stdio-сервера из npm или PyPI — имя пакета (`npm:<имя>`, `pypi:<имя>`; HISTOR запускает такие пакеты в песочнице gVisor) и дайджест, текст инструментов — никогда. Опциональный классификатор (`--classifier-url`, `--classifier-model`) добавляет прочтение модели, которую выбираете вы, локальной или облачной, — для того, что не называет ни одно правило. Подробно — в [руководстве по scan](docs/scan.ru.md). Как он выглядит рядом с двумя другими сканерами на одних и тех же серверах: [сравнение сканеров](docs/scanner-comparison.ru.md).
147
+ Читает MCP-конфиги Claude Code, Claude Desktop, Cursor, VS Code и Windsurf, подключается к каждому серверу из них и проверяет определения инструментов до того, как их увидит модель. Выводит таблицу, JSON, SARIF или Markdown и завершается с кодом 1, если сервер заблокирован; `--no-launch` ничего не запускает. В репозитории `warden.lock.json` превращает изменение определений инструментов в дифф для ревью, а CI падает на новом или изменённом сервере. Есть GitHub Action (`uses: alexar76/warden@v0.21.0`), хуки pre-commit и плагин Claude Code (`/plugin marketplace add alexar76/warden`). `--histor` спрашивает публичный журнал HISTOR, отдаёт ли сервер вам то же, что всем; для удалённого сервера уходят адрес и дайджест, для stdio-сервера из npm или PyPI — имя пакета (`npm:<имя>`, `pypi:<имя>`; HISTOR запускает такие пакеты в песочнице gVisor) и дайджест, текст инструментов — никогда. Опциональный классификатор (`--classifier-url`, `--classifier-model`) добавляет прочтение модели, которую выбираете вы, локальной или облачной, — для того, что не называет ни одно правило. Подробно — в [руководстве по scan](docs/scan.ru.md). Как он выглядит рядом с двумя другими сканерами на одних и тех же серверах: [сравнение сканеров](docs/scanner-comparison.ru.md).
133
148
 
134
- **Для издателя сервера.** Если ваш сервер отдаёт другие инструменты там, где установлено то, чего нет в песочнице HISTOR, — раннер запускателя, по одному на ОС, — `npx -y @aimarket/warden@0.20.0 declare --out mcp-tool-sets.json -- <ваш сервер>` записывает эти наборы в файл, который вы публикуете на своём домене, и те, кто их получает, видят заявление издателя, а не незнакомый набор. Подробно — в [руководстве по scan](docs/scan.ru.md).
149
+ **Для издателя сервера.** Если ваш сервер отдаёт другие инструменты там, где установлено то, чего нет в песочнице HISTOR, — раннер запускателя, по одному на ОС, — `npx -y @aimarket/warden@0.22.0 declare --out mcp-tool-sets.json -- <ваш сервер>` записывает эти наборы в файл, который вы публикуете на своём домене, и те, кто их получает, видят заявление издателя, а не незнакомый набор. Подробно — в [руководстве по scan](docs/scan.ru.md).
135
150
 
136
151
  ## Чего WARDEN не делает
137
152
 
138
- Обёртка поддерживает только stdio. Результаты инструментов читаются теми же правилами (`--results warn`, по умолчанию, ставит перед результатом, который читается как команды модели, предупреждение; `block` не отдаёт его — инструмент при этом уже сработал; `off`); аргументы вызовов, `prompts/*`, `resources/*`, sampling и elicitation проходят без сканирования. Перефраз и неанглийские инструкции без известных литералов могут пройти; отдельный слой — [классификатор HISTOR](https://github.com/alexar76/histor). WARDEN не является песочницей и не защищает конфиг клиента от редактирования. Проверка и выполнение в чужом процессе не атомарны: обнаруженное изменение до отправки блокирует вызов; изменение во время выполнения скрывает результат, но действие уже могло произойти. Молчаливое изменение после последнего ответа со списком не наблюдаемо. Клиенты без поддержки уведомлений могут показывать старый список; перед вызовом определения всё равно сверяются.
153
+ Обёртка поддерживает только stdio. Результаты инструментов читаются теми же правилами (`--results warn`, по умолчанию, ставит перед результатом, который читается как команды модели, предупреждение; `block` не отдаёт его — инструмент при этом уже сработал; `off`); аргументы вызовов, `prompts/*`, `resources/*`, sampling и elicitation проходят без сканирования. Перефраз и неанглийские инструкции без известных литералов могут пройти; отдельный слой — [классификатор HISTOR](https://github.com/alexar76/histor). WARDEN не является песочницей и не защищает конфиг клиента от редактирования. Без доверенного сервера с атомарным экранным контрактом проверка и выполнение в чужом процессе не атомарны: обнаруженное изменение до отправки блокирует вызов; изменение во время выполнения скрывает результат, но действие уже могло произойти. Молчаливое изменение после последнего ответа со списком не наблюдаемо. Клиенты без поддержки уведомлений могут показывать старый список; перед вызовом определения всё равно сверяются.
139
154
 
140
155
  Вердикты не подписаны: это диагностические записи, не подтверждение compliance. `--audit-only` помечает логи `AUDIT-ONLY`, пропускает описания и вызовы, запрещённые проверками безопасности, и не создаёт пины; ограничения протокола и ресурсов сохраняются. Режим нужен для разбора ложных срабатываний, а не для защиты.
141
156
 
@@ -327,6 +342,7 @@ WARDEN — агент ERC-8004 [`96684` в сети Base](https://8004scan.io/ag
327
342
  | [Полевой обзор: 1 108 публичных MCP-серверов](docs/mcp-survey.ru.md) | Что WARDEN решил на настоящих чужих определениях инструментов — 50 серверов заблокировано, 4 подтверждено, и шесть способов, которыми остальные оказались ошибкой |
328
343
  | [Сравнение сканеров](docs/scanner-comparison.ru.md) | WARDEN, mcp-audit, mcp-shield, truecopy и mcpsentry на одних и тех же серверах, на 14 933 пакетах npm и PyPI и на бенчмарке MCPTox, со всеми разметками, манифестом и стендом |
329
344
  | [Страж потоков](docs/flow-guard.ru.md) | Защита плагина Claude Code во время работы: чужой текст, приватные данные, исходящие вызовы; измерение на AgentDojo и его границы |
345
+ | [Свежий прогон модели](docs/flow-guard-model-comparison-2026-10-25.ru.md) | 720 ответов: улучшение на известных сценариях, неопределённость, канал предупреждений и отсутствие исправленных ID через Stop |
330
346
  | [Glama / Docker](docs/GLAMA.md) | stdio MCP, health check, Build steps / CMD |
331
347
  | [Security](SECURITY.md) | Как сообщать об обходе файрвола |
332
348
  | [Contributing](CONTRIBUTING.md) | Правило нулевых зависимостей, PR на таблицу правил |
@@ -350,7 +366,7 @@ WARDEN — агент ERC-8004 [`96684` в сети Base](https://8004scan.io/ag
350
366
  ## Разработка
351
367
 
352
368
  ```bash
353
- npm install && npm run build && npm test # 586 тестов
369
+ npm install && npm run build && npm test # 1256 тестов
354
370
  ```
355
371
 
356
372
  `test/packaging.test.ts` — то, что удерживает заголовок честным: он падает, если появляется