@aimarket/warden 0.22.2 → 0.22.3

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 (45) hide show
  1. package/CHANGELOG.md +16 -1
  2. package/README-es.md +9 -9
  3. package/README-fr.md +9 -9
  4. package/README-ru.md +9 -9
  5. package/README-zh.md +9 -9
  6. package/README.md +37 -31
  7. package/dist/histor.d.ts +6 -0
  8. package/dist/histor.d.ts.map +1 -1
  9. package/dist/histor.js +14 -0
  10. package/dist/histor.js.map +1 -1
  11. package/dist/jcs.d.ts +4 -3
  12. package/dist/jcs.d.ts.map +1 -1
  13. package/dist/jcs.js +4 -3
  14. package/dist/jcs.js.map +1 -1
  15. package/dist/mcp-server.js +19 -0
  16. package/dist/mcp-server.js.map +1 -1
  17. package/dist/mtl.d.ts +7 -6
  18. package/dist/mtl.d.ts.map +1 -1
  19. package/dist/mtl.js +31 -24
  20. package/dist/mtl.js.map +1 -1
  21. package/dist/scan.d.ts.map +1 -1
  22. package/dist/scan.js +2 -2
  23. package/dist/scan.js.map +1 -1
  24. package/docs/flow-guard-model-comparison-2026-10-25.es.md +9 -9
  25. package/docs/flow-guard-model-comparison-2026-10-25.fr.md +9 -9
  26. package/docs/flow-guard-model-comparison-2026-10-25.md +9 -9
  27. package/docs/flow-guard-model-comparison-2026-10-25.ru.md +9 -9
  28. package/docs/flow-guard-model-comparison-2026-10-25.zh.md +9 -9
  29. package/docs/flow-guard.es.md +5 -5
  30. package/docs/flow-guard.fr.md +5 -5
  31. package/docs/flow-guard.md +6 -6
  32. package/docs/flow-guard.ru.md +6 -6
  33. package/docs/flow-guard.zh.md +5 -5
  34. package/docs/scan-limits.es.md +2 -2
  35. package/docs/scan-limits.fr.md +2 -2
  36. package/docs/scan-limits.md +2 -2
  37. package/docs/scan-limits.ru.md +2 -2
  38. package/docs/scan-limits.zh.md +2 -2
  39. package/docs/scan.es.md +5 -5
  40. package/docs/scan.fr.md +5 -5
  41. package/docs/scan.md +5 -5
  42. package/docs/scan.ru.md +5 -5
  43. package/docs/scan.zh.md +5 -5
  44. package/docs/security-hardening-language-boundary.md +5 -5
  45. package/package.json +1 -1
package/docs/scan.md CHANGED
@@ -7,15 +7,15 @@ Discovery calls can incur costs; see [measurement limits and version evidence](s
7
7
  `warden-mcp scan` reads the MCP configuration you already have, connects to every server it starts, and vets the tool definitions before a model sees them. It is the same gate chain as [`wrap`](../README.md#protect-claude-desktop-or-cursor-with-one-wrapper) and the [library](integration.md), run once over your configs instead of in front of one server.
8
8
 
9
9
  ```bash
10
- npx -y @aimarket/warden@0.11.0 scan
10
+ npx -y @aimarket/warden@0.22.3 scan
11
11
  ```
12
12
 
13
13
  ```text
14
- WARDEN scan 0.10.0 · ruleset 10 sha256-lJuKKKV5mtru… · block at high
14
+ WARDEN scan 0.22.3 · ruleset 16 sha256-86y6iNc4R+LM… · block at high
15
15
  read .mcp.json (claude-code, 3 servers)
16
16
 
17
17
  ✓ allow notes claude-code 1 tool · score 0.90
18
- ✗ BLOCK evil-notes claude-code 1 tool · score 0.00 · TOOL_DEF_EXFIL(notes) TOOL_DEF_SECRET_REQUEST(notes) THREAT_SSH_KEY_READ(notes)
18
+ ✗ BLOCK evil-notes claude-code 1 tool · score 0.00 · TOOL_DEF_EXFIL(save_note) TOOL_DEF_SECRET_REQUEST(save_note) THREAT_SSH_KEY_READ(save_note) THREAT_SEED_PHRASE(save_note)
19
19
  ! error broken claude-code could not start: spawn /nonexistent/bin/server ENOENT
20
20
 
21
21
  3 servers: 1 allowed, 1 blocked, 1 not checked, 0 skipped.
@@ -88,7 +88,7 @@ jobs:
88
88
  runs-on: ubuntu-latest
89
89
  steps:
90
90
  - uses: actions/checkout@v4
91
- - uses: alexar76/warden@v0.11.0
91
+ - uses: alexar76/warden@v0.21.0
92
92
  with:
93
93
  upload-sarif: 'true'
94
94
  ```
@@ -133,7 +133,7 @@ The capabilities are read from tool names and parameter names (`read_file`, `sen
133
133
 
134
134
  [HISTOR](https://histor.modelmarket.dev) is a public log that records, every day, the tool definitions of every remote server in the official MCP registry. `--histor` asks it one question per remote server: is the tool set you were just served the one HISTOR observes?
135
135
 
136
- What is sent: the endpoint with scheme, host and path only (no query, no user name or password), and the [MTL/1](https://github.com/alexar76/awr) digest of the tool set. No tool description, no header. Endpoints on private hosts or addresses, and paths that look like they carry a key, are not sent at all; the report says why.
136
+ What is sent: the endpoint with scheme, host and path only (no query, no user name or password), and the [MTL/1](https://github.com/alexar76/awr) digest of the tool set. No tool description, no header of yours. The User-Agent is `warden-scan/<version>`, followed by `(ci)` when the scan runs in CI (`(ci; github-actions)`, `(ci; gitlab)`) so that HISTOR can count checks that recur with every build; it never names the repository or the runner. Endpoints on private hosts or addresses, and paths that look like they carry a key, are not sent at all; the report says why.
137
137
 
138
138
  A stdio server started from the public npm or PyPI registry (`npx`, `bunx`, `npm exec`, `pnpm dlx`, `uvx`, `uv tool run`, `pipx run`) is named by its package — `npm:<name>` or `pypi:<name>`, without the version — and the same digest. HISTOR installs each published version of such a package in a gVisor sandbox (decoy credentials, no route out; each tool called once with canary arguments, against nothing real) and records its tools and what it did, so `previously-observed` here means you run an older version, and `different` a version HISTOR has not reached yet, a package whose tools depend on what your machine has and the sandbox has not (a launcher that hands over to a locally installed program, a real key or setting), or a package that is not the published one. The finding gives the tool count on both sides. A local path, a git or tarball URL, a private registry (`--registry`, `--index-url`) or a plain `node`/`python` launch is never sent. For a package HISTOR also says, as advisory findings, whether its name imitates a popular one (`HISTOR_PACKAGE_LOOKALIKE`: one character away, the same name under another scope, or other separators, from a package downloaded at least 100 times more) and whether the version it observed carries the marks of a stolen publishing token: `HISTOR_PACKAGE_PROVENANCE_LOST` (no attested CI build where the previous version had one), `HISTOR_PACKAGE_INSTALL_SCRIPTS` (new install scripts), `HISTOR_PACKAGE_PUBLISHER_CHANGED`, `HISTOR_PACKAGE_NEW_DEPENDENCIES`. And what the package did in the sandbox: `HISTOR_PACKAGE_READS_SECRETS` (it opened decoy credentials — SSH keys, cloud or registry tokens, a wallet — at install, at startup or when a tool was called), `HISTOR_PACKAGE_PERSISTENCE` (it wrote where it would outlive the session, such as `.bashrc` or `authorized_keys`), `HISTOR_PACKAGE_STARTUP_NETWORK` (it reached out before any tool was called), `HISTOR_PACKAGE_STARTS_PROGRAMS`, `HISTOR_PACKAGE_INSTALL_BEHAVIOUR` (what its install scripts do). Loading `.env` from the working directory and calling its own API during a tool call are not findings. Why a package did not start, from what it printed: `HISTOR_PACKAGE_SDK_INCOMPATIBLE` (medium — written for MCP SDK 1.x, so a fresh install with `mcp` 2.x crashes on import; when HISTOR also ran it with `mcp<2`, how many tools it listed then), `HISTOR_PACKAGE_NEEDS_CONFIG` (info — the key or setting it asked for, or that its tools were read with placeholders for them) and `HISTOR_PACKAGE_KEY_SENT_TO` (low — where it sent the placeholder key HISTOR set; check it is the service's own API). Every sandbox finding comes from the same conditions: Linux under gVisor, no internet, decoy secrets ([test conditions](https://histor.modelmarket.dev/#conditions)). With `--histor`, the report also gives a link to a HISTOR feed of changes to the scanned servers HISTOR knows (`historWatch` in `--json`): subscribe in any feed reader.
139
139
 
package/docs/scan.ru.md CHANGED
@@ -7,15 +7,15 @@
7
7
  `warden-mcp scan` читает уже существующую у вас конфигурацию MCP, подключается к каждому серверу из неё и проверяет определения инструментов до того, как их увидит модель. Это та же цепочка гейтов, что у [`wrap`](../README-ru.md) и у [библиотеки](integration.ru.md), только пройденная один раз по вашим конфигам, а не перед одним сервером.
8
8
 
9
9
  ```bash
10
- npx -y @aimarket/warden@0.11.0 scan
10
+ npx -y @aimarket/warden@0.22.3 scan
11
11
  ```
12
12
 
13
13
  ```text
14
- WARDEN scan 0.10.0 · ruleset 10 sha256-lJuKKKV5mtru… · block at high
14
+ WARDEN scan 0.22.3 · ruleset 16 sha256-86y6iNc4R+LM… · block at high
15
15
  read .mcp.json (claude-code, 3 servers)
16
16
 
17
17
  ✓ allow notes claude-code 1 tool · score 0.90
18
- ✗ BLOCK evil-notes claude-code 1 tool · score 0.00 · TOOL_DEF_EXFIL(notes) TOOL_DEF_SECRET_REQUEST(notes) THREAT_SSH_KEY_READ(notes)
18
+ ✗ BLOCK evil-notes claude-code 1 tool · score 0.00 · TOOL_DEF_EXFIL(save_note) TOOL_DEF_SECRET_REQUEST(save_note) THREAT_SSH_KEY_READ(save_note) THREAT_SEED_PHRASE(save_note)
19
19
  ! error broken claude-code could not start: spawn /nonexistent/bin/server ENOENT
20
20
 
21
21
  3 servers: 1 allowed, 1 blocked, 1 not checked, 0 skipped.
@@ -88,7 +88,7 @@ jobs:
88
88
  runs-on: ubuntu-latest
89
89
  steps:
90
90
  - uses: actions/checkout@v4
91
- - uses: alexar76/warden@v0.11.0
91
+ - uses: alexar76/warden@v0.21.0
92
92
  with:
93
93
  upload-sarif: 'true'
94
94
  ```
@@ -133,7 +133,7 @@ repos:
133
133
 
134
134
  [HISTOR](https://histor.modelmarket.dev) — публичный журнал, который каждый день записывает определения инструментов всех удалённых серверов из официального реестра MCP. `--histor` задаёт ему один вопрос о каждом удалённом сервере: тот ли это набор инструментов, который видит HISTOR?
135
135
 
136
- Что отправляется: адрес эндпоинта — только схема, хост и путь (без query, без имени пользователя и пароля) — и дайджест набора инструментов по [MTL/1](https://github.com/alexar76/awr). Ни описаний инструментов, ни заголовков. Эндпоинты на частных хостах и адресах, а также пути, похожие на содержащие ключ, не отправляются вовсе; отчёт объясняет почему.
136
+ Что отправляется: адрес эндпоинта — только схема, хост и путь (без query, без имени пользователя и пароля) — и дайджест набора инструментов по [MTL/1](https://github.com/alexar76/awr). Ни описаний инструментов, ни ваших заголовков. User-Agent — `warden-scan/<версия>`, а при запуске в CI к нему добавляется `(ci)` (`(ci; github-actions)`, `(ci; gitlab)`), чтобы HISTOR мог считать проверки, повторяющиеся с каждой сборкой; репозиторий и раннер он не называет. Эндпоинты на частных хостах и адресах, а также пути, похожие на содержащие ключ, не отправляются вовсе; отчёт объясняет почему.
137
137
 
138
138
  Stdio-сервер, запущенный из публичного реестра npm или PyPI (`npx`, `bunx`, `npm exec`, `pnpm dlx`, `uvx`, `uv tool run`, `pipx run`), называется по пакету — `npm:<имя>` или `pypi:<имя>`, без версии — с тем же дайджестом. HISTOR ставит каждую опубликованную версию такого пакета в песочнице gVisor (приманки вместо секретов, без маршрута наружу; каждый инструмент вызывается один раз с подставными аргументами, ни на что настоящее не действуя) и записывает его инструменты и то, что он делал, поэтому `previously-observed` здесь значит, что у вас более старая версия, а `different` — версия, до которой HISTOR ещё не дошёл, пакет, чьи инструменты зависят от того, что есть на вашей машине и чего нет в песочнице (запускатель, который передаёт работу установленной локально программе, настоящий ключ или настройка), или пакет, который не совпадает с опубликованным. В находке указано число инструментов с обеих сторон. Локальный путь, git- или tarball-адрес, частный реестр (`--registry`, `--index-url`) или простой запуск `node`/`python` не отправляются никогда. Для пакета HISTOR также сообщает, рекомендательными находками, не подражает ли его имя популярному (`HISTOR_PACKAGE_LOOKALIKE`: на один символ, то же имя под другим scope или с другими разделителями, при том что популярный скачивают хотя бы в 100 раз чаще) и нет ли у прочитанной версии признаков украденного токена публикации: `HISTOR_PACKAGE_PROVENANCE_LOST` (нет подтверждённой сборки в CI, хотя у предыдущей версии была), `HISTOR_PACKAGE_INSTALL_SCRIPTS` (появились установочные скрипты), `HISTOR_PACKAGE_PUBLISHER_CHANGED`, `HISTOR_PACKAGE_NEW_DEPENDENCIES`. И что пакет делал в песочнице: `HISTOR_PACKAGE_READS_SECRETS` (открыл приманки — SSH-ключи, токены облаков или реестров, кошелёк — при установке, при запуске или при вызове инструмента), `HISTOR_PACKAGE_PERSISTENCE` (писал туда, где пережил бы сессию, например в `.bashrc` или `authorized_keys`), `HISTOR_PACKAGE_STARTUP_NETWORK` (выходил в сеть до вызова любого инструмента), `HISTOR_PACKAGE_STARTS_PROGRAMS`, `HISTOR_PACKAGE_INSTALL_BEHAVIOUR` (что делают его установочные скрипты). Загрузка `.env` из рабочей папки и обращения к собственному API во время вызова инструмента находками не считаются. Почему пакет не запустился — по тому, что он напечатал: `HISTOR_PACKAGE_SDK_INCOMPATIBLE` (medium — написан под MCP SDK 1.x, поэтому свежая установка с `mcp` 2.x падает при импорте; если HISTOR запускал его и с `mcp<2`, — сколько инструментов он тогда отдал), `HISTOR_PACKAGE_NEEDS_CONFIG` (info — ключ или настройка, которые он потребовал, либо то, что его инструменты прочитаны с заглушками для них) и `HISTOR_PACKAGE_KEY_SENT_TO` (low — куда он отправил ключ-заглушку HISTOR; проверьте, что это собственный API сервиса). Все находки песочницы получены в одних условиях: Linux под gVisor, без интернета, приманки вместо секретов ([условия проверки](https://histor.modelmarket.dev/#conditions)). С `--histor` отчёт также даёт ссылку на ленту HISTOR с изменениями тех просканированных серверов, которые HISTOR знает (`historWatch` в `--json`): на неё можно подписаться в любом читателе лент.
139
139
 
package/docs/scan.zh.md CHANGED
@@ -7,15 +7,15 @@
7
7
  `warden-mcp scan` 读取你已有的 MCP 配置,连接其中启动的每个服务器,并在模型看到工具定义之前对其进行审查。它与 [`wrap`](../README-zh.md) 和[库](integration.zh.md)使用同一条关卡链,只是对你的配置运行一次,而不是挡在单个服务器前面。
8
8
 
9
9
  ```bash
10
- npx -y @aimarket/warden@0.11.0 scan
10
+ npx -y @aimarket/warden@0.22.3 scan
11
11
  ```
12
12
 
13
13
  ```text
14
- WARDEN scan 0.10.0 · ruleset 10 sha256-lJuKKKV5mtru… · block at high
14
+ WARDEN scan 0.22.3 · ruleset 16 sha256-86y6iNc4R+LM… · block at high
15
15
  read .mcp.json (claude-code, 3 servers)
16
16
 
17
17
  ✓ allow notes claude-code 1 tool · score 0.90
18
- ✗ BLOCK evil-notes claude-code 1 tool · score 0.00 · TOOL_DEF_EXFIL(notes) TOOL_DEF_SECRET_REQUEST(notes) THREAT_SSH_KEY_READ(notes)
18
+ ✗ BLOCK evil-notes claude-code 1 tool · score 0.00 · TOOL_DEF_EXFIL(save_note) TOOL_DEF_SECRET_REQUEST(save_note) THREAT_SSH_KEY_READ(save_note) THREAT_SEED_PHRASE(save_note)
19
19
  ! error broken claude-code could not start: spawn /nonexistent/bin/server ENOENT
20
20
 
21
21
  3 servers: 1 allowed, 1 blocked, 1 not checked, 0 skipped.
@@ -88,7 +88,7 @@ jobs:
88
88
  runs-on: ubuntu-latest
89
89
  steps:
90
90
  - uses: actions/checkout@v4
91
- - uses: alexar76/warden@v0.11.0
91
+ - uses: alexar76/warden@v0.21.0
92
92
  with:
93
93
  upload-sarif: 'true'
94
94
  ```
@@ -133,7 +133,7 @@ repos:
133
133
 
134
134
  [HISTOR](https://histor.modelmarket.dev) 是一个公开日志,每天记录官方 MCP 注册表中所有远程服务器的工具定义。`--histor` 对每个远程服务器问它一个问题:你刚收到的工具集,是否就是 HISTOR 观察到的那一个?
135
135
 
136
- 发送的内容:端点(只有协议、主机和路径,不含 query、用户名或密码),以及工具集的 [MTL/1](https://github.com/alexar76/awr) 摘要。不发送任何工具描述或请求头。私有主机或地址上的端点,以及看起来带有密钥的路径,根本不会发送;报告会说明原因。
136
+ 发送的内容:端点(只有协议、主机和路径,不含 query、用户名或密码),以及工具集的 [MTL/1](https://github.com/alexar76/awr) 摘要。不发送任何工具描述,也不发送您的请求头。User-Agent 为 `warden-scan/<版本>`,在 CI 中运行时后接 `(ci)`(`(ci; github-actions)`、`(ci; gitlab)`),以便 HISTOR 统计随每次构建重复的检查;它从不包含仓库或运行器的名称。私有主机或地址上的端点,以及看起来带有密钥的路径,根本不会发送;报告会说明原因。
137
137
 
138
138
  从公共 npm 或 PyPI 注册表启动的 stdio 服务器(`npx`、`bunx`、`npm exec`、`pnpm dlx`、`uvx`、`uv tool run`、`pipx run`)以其软件包命名——`npm:<名称>` 或 `pypi:<名称>`,不带版本——并附上同样的摘要。HISTOR 会在 gVisor 沙箱中(诱饵凭据、无对外路由;每个工具用金丝雀参数调用一次,不作用于任何真实对象)安装这类软件包的每个已发布版本,并记录其工具及其行为,因此这里的 `previously-observed` 表示你运行的是较旧的版本,`different` 表示 HISTOR 尚未覆盖到的版本、工具取决于你的机器上有而沙箱里没有的东西的软件包(把工作交给本地已安装程序的启动器、真实的密钥或设置),或者与已发布版本不一致的软件包。该发现会给出双方各自的工具数量。本地路径、git 或 tarball 地址、私有注册表(`--registry`、`--index-url`)以及直接用 `node`/`python` 启动的服务器,永远不会被发送。 对于软件包,HISTOR 还会以提示性发现告诉你:它的名称是否在模仿热门软件包(`HISTOR_PACKAGE_LOOKALIKE`:相差一个字符、在另一个 scope 下同名或仅分隔符不同,且热门软件包的下载量至少高 100 倍),以及所观察的版本是否带有发布令牌被盗的迹象:`HISTOR_PACKAGE_PROVENANCE_LOST`(上一个版本有经证明的 CI 构建,这个版本没有)、`HISTOR_PACKAGE_INSTALL_SCRIPTS`(新增安装脚本)、`HISTOR_PACKAGE_PUBLISHER_CHANGED`、`HISTOR_PACKAGE_NEW_DEPENDENCIES`。 以及软件包在沙箱中的行为:`HISTOR_PACKAGE_READS_SECRETS`(在安装、启动或工具被调用时打开了诱饵凭据——SSH 密钥、云或注册表令牌、钱包),`HISTOR_PACKAGE_PERSISTENCE`(写入了会在会话之后留存的位置,例如 `.bashrc` 或 `authorized_keys`),`HISTOR_PACKAGE_STARTUP_NETWORK`(在调用任何工具之前就访问了网络),`HISTOR_PACKAGE_STARTS_PROGRAMS`,`HISTOR_PACKAGE_INSTALL_BEHAVIOUR`(其安装脚本做了什么)。从工作目录加载 `.env`、在工具调用期间访问其自身 API,都不算发现。软件包为何没有启动——依据它打印的内容:`HISTOR_PACKAGE_SDK_INCOMPATIBLE`(medium——为 MCP SDK 1.x 编写,因此用 `mcp` 2.x 全新安装会在导入时失败;如果 HISTOR 也用 `mcp<2` 运行过它,则给出当时列出的工具数量)、`HISTOR_PACKAGE_NEEDS_CONFIG`(info——它要求的密钥或设置,或其工具是在占位值下读取的)以及 `HISTOR_PACKAGE_KEY_SENT_TO`(low——它把 HISTOR 设置的占位密钥发送到了哪里;请确认那是该服务自己的 API)。所有沙箱发现都来自相同的条件:gVisor 下的 Linux、无互联网、诱饵机密([测试条件](https://histor.modelmarket.dev/#conditions))。 使用 `--histor` 时,报告还会给出一个 HISTOR 订阅源链接,包含 HISTOR 已知的被扫描服务器的变更(`--json` 中的 `historWatch`):可在任意订阅阅读器中订阅。
139
139
 
@@ -232,7 +232,7 @@ operator approval demonstrate safety in every language or on future model versio
232
232
  The inputs are related synthetic templates, including the pilot used for protocol
233
233
  tuning. This is a reproducible stress evaluation, not a held-out generalization claim.
234
234
 
235
- The companion [machine-readable report](../../momus/docs/coverage-v11.json) contains
235
+ The companion [machine-readable report](https://github.com/alexar76/momus/blob/main/docs/coverage-v11.json) contains
236
236
  build/corpus/prompt identities, per-language counts, missed IDs, false-block IDs,
237
237
  provider pilots and validation results. Exact inputs and individual decisions are
238
238
  in `momus/data/warden-v11-comparison/` and
@@ -272,9 +272,9 @@ The 986 unlabelled public snapshots keep the same three blocks. Their block coun
272
272
  is not a false-positive estimate. Ordinary wrap is not part of the live semantic
273
273
  measurement.
274
274
 
275
- [Full report](../../momus/docs/coverage-v12.json),
276
- [implementation audit of the nine-part plan](../../momus/docs/mcp-quality-review.md),
277
- and [safe local reproductions](../../momus/docs/mcp-quality-reproductions.json).
275
+ [Full report](https://github.com/alexar76/momus/blob/main/docs/coverage-v12.json),
276
+ [implementation audit of the nine-part plan](https://github.com/alexar76/momus/blob/main/docs/mcp-quality-review.md),
277
+ and [safe local reproductions](https://github.com/alexar76/momus/blob/main/docs/mcp-quality-reproductions.json).
278
278
  Final decisions are in `momus/data/warden-semantic-full-v12-bound/`; frozen
279
279
  comparison inputs and offline decisions are in `momus/data/warden-v12-comparison/`.
280
280
  The report binds corpus, prompt and build hashes and records previous-error
@@ -299,7 +299,7 @@ network access, per-call authorization outside the model, and process isolation.
299
299
 
300
300
  ## Revision 0.13.0 — ordinary imperatives and honest coverage
301
301
 
302
- The generic classifier criterion now requires a concrete authority violation. An imperative describing an operation on user-provided input remains ordinary documentation after decoding. There is no Spanish allowlist. On the same frozen 8,606 fixtures, DeepSeek (`deepseek-flash`, effort `none`) blocked all 8,244 attacks and allowed all 362 controls, including `control.es.0.description.base64`; no inspection was incomplete. [Full report](../../momus/docs/coverage-v13.json) includes prompt/build/corpus hashes and token counts. Offline recognition remains 2,808/8,244 with 31/362 false blocks; the semantic result must not be attributed to offline mode.
302
+ The generic classifier criterion now requires a concrete authority violation. An imperative describing an operation on user-provided input remains ordinary documentation after decoding. There is no Spanish allowlist. On the same frozen 8,606 fixtures, DeepSeek (`deepseek-flash`, effort `none`) blocked all 8,244 attacks and allowed all 362 controls, including `control.es.0.description.base64`; no inspection was incomplete. [Full report](https://github.com/alexar76/momus/blob/main/docs/coverage-v13.json) includes prompt/build/corpus hashes and token counts. Offline recognition remains 2,808/8,244 with 31/362 false blocks; the semantic result must not be attributed to offline mode.
303
303
 
304
304
  `wrap` reports oversized results as incomplete rather than scanning head/tail and clearing the unseen middle. This result layer remains static; no claim of universal multilingual result recognition is made. `block` withholds the result after the tool ran. `warn` annotates it.
305
305
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aimarket/warden",
3
- "version": "0.22.2",
3
+ "version": "0.22.3",
4
4
  "description": "WARDEN — MCP security firewall. Stdio wrap proxy, inspection tools and library. Vets definitions before model exposure. Zero runtime dependencies.",
5
5
  "type": "module",
6
6
  "license": "MIT",