@aimarket/warden 0.22.0 → 0.22.2

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 (140) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README-es.md +23 -7
  3. package/README-fr.md +23 -7
  4. package/README-ru.md +23 -7
  5. package/README-zh.md +23 -7
  6. package/README.md +23 -7
  7. package/dist/annotation-review.js.map +1 -1
  8. package/dist/answer-gate.d.ts +94 -0
  9. package/dist/answer-gate.d.ts.map +1 -0
  10. package/dist/answer-gate.js +234 -0
  11. package/dist/answer-gate.js.map +1 -0
  12. package/dist/atomic-screen.d.ts.map +1 -1
  13. package/dist/classifier.d.ts +2 -2
  14. package/dist/classifier.d.ts.map +1 -1
  15. package/dist/claude-hook.js.map +1 -1
  16. package/dist/declare.d.ts.map +1 -1
  17. package/dist/declare.js.map +1 -1
  18. package/dist/flow-guard-answer.d.ts +3 -2
  19. package/dist/flow-guard-answer.d.ts.map +1 -1
  20. package/dist/flow-guard-answer.js +38 -11
  21. package/dist/flow-guard-answer.js.map +1 -1
  22. package/dist/flow-guard-classify.js.map +1 -1
  23. package/dist/flow-guard-constraints.d.ts +43 -0
  24. package/dist/flow-guard-constraints.d.ts.map +1 -0
  25. package/dist/flow-guard-constraints.js +69 -0
  26. package/dist/flow-guard-constraints.js.map +1 -0
  27. package/dist/flow-guard-fragments.d.ts.map +1 -1
  28. package/dist/flow-guard-labels.js.map +1 -1
  29. package/dist/flow-guard-leak.js.map +1 -1
  30. package/dist/flow-guard-paths.d.ts.map +1 -1
  31. package/dist/flow-guard-paths.js.map +1 -1
  32. package/dist/flow-guard-policy.js.map +1 -1
  33. package/dist/flow-guard-post.js.map +1 -1
  34. package/dist/flow-guard-pre.js.map +1 -1
  35. package/dist/flow-guard-screen.d.ts.map +1 -1
  36. package/dist/flow-guard-screen.js.map +1 -1
  37. package/dist/flow-guard-state.d.ts.map +1 -1
  38. package/dist/flow-guard-state.js +8 -0
  39. package/dist/flow-guard-state.js.map +1 -1
  40. package/dist/flow-guard-text.js.map +1 -1
  41. package/dist/flow-guard-types.d.ts +8 -0
  42. package/dist/flow-guard-types.d.ts.map +1 -1
  43. package/dist/flow-guard.d.ts +2 -0
  44. package/dist/flow-guard.d.ts.map +1 -1
  45. package/dist/flow-guard.js +1 -0
  46. package/dist/flow-guard.js.map +1 -1
  47. package/dist/histor.js.map +1 -1
  48. package/dist/index.d.ts +4 -0
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +2 -0
  51. package/dist/index.js.map +1 -1
  52. package/dist/jcs.d.ts.map +1 -1
  53. package/dist/jcs.js.map +1 -1
  54. package/dist/mcp-client.d.ts.map +1 -1
  55. package/dist/mcp-client.js.map +1 -1
  56. package/dist/mcp-rpc.js.map +1 -1
  57. package/dist/mcp-tools.d.ts.map +1 -1
  58. package/dist/mcp-tools.js +3 -0
  59. package/dist/mcp-tools.js.map +1 -1
  60. package/dist/mtl.d.ts +1 -1
  61. package/dist/mtl.d.ts.map +1 -1
  62. package/dist/mtl.js.map +1 -1
  63. package/dist/origin.d.ts.map +1 -1
  64. package/dist/pin-store.d.ts.map +1 -1
  65. package/dist/pin-store.js.map +1 -1
  66. package/dist/pinning.d.ts.map +1 -1
  67. package/dist/pinning.js.map +1 -1
  68. package/dist/review-diff.js.map +1 -1
  69. package/dist/sandbox.d.ts.map +1 -1
  70. package/dist/sanitize.js.map +1 -1
  71. package/dist/scan-lock.d.ts.map +1 -1
  72. package/dist/scan-lock.js.map +1 -1
  73. package/dist/scan.d.ts.map +1 -1
  74. package/dist/scan.js.map +1 -1
  75. package/dist/static-scan.d.ts.map +1 -1
  76. package/dist/static-scan.js.map +1 -1
  77. package/dist/task-adapter.d.ts.map +1 -1
  78. package/dist/task-adapter.js.map +1 -1
  79. package/dist/threat-feed.d.ts.map +1 -1
  80. package/dist/threat-feed.js.map +1 -1
  81. package/dist/tool-list.js.map +1 -1
  82. package/dist/toxic-flow.js.map +1 -1
  83. package/dist/wrap-cli.d.ts +1 -1
  84. package/dist/wrap-cli.d.ts.map +1 -1
  85. package/dist/wrap-cli.js.map +1 -1
  86. package/dist/wrap-screen.js.map +1 -1
  87. package/dist/wrap-wire.d.ts.map +1 -1
  88. package/dist/wrap-wire.js.map +1 -1
  89. package/docs/flow-guard-answer-gate.es.md +53 -0
  90. package/docs/flow-guard-answer-gate.fr.md +53 -0
  91. package/docs/flow-guard-answer-gate.md +86 -0
  92. package/docs/flow-guard-answer-gate.ru.md +53 -0
  93. package/docs/flow-guard-answer-gate.zh.md +53 -0
  94. package/docs/flow-guard-constraint-evidence.es.md +76 -0
  95. package/docs/flow-guard-constraint-evidence.fr.md +76 -0
  96. package/docs/flow-guard-constraint-evidence.md +78 -0
  97. package/docs/flow-guard-constraint-evidence.ru.md +78 -0
  98. package/docs/flow-guard-constraint-evidence.zh.md +76 -0
  99. package/docs/flow-guard-final-witness-2026-10-26.es.md +24 -0
  100. package/docs/flow-guard-final-witness-2026-10-26.fr.md +24 -0
  101. package/docs/flow-guard-final-witness-2026-10-26.md +24 -0
  102. package/docs/flow-guard-final-witness-2026-10-26.ru.md +24 -0
  103. package/docs/flow-guard-final-witness-2026-10-26.zh.md +24 -0
  104. package/docs/flow-guard-fresh-rechecks-2026-10-26.es.md +39 -0
  105. package/docs/flow-guard-fresh-rechecks-2026-10-26.fr.md +39 -0
  106. package/docs/flow-guard-fresh-rechecks-2026-10-26.md +39 -0
  107. package/docs/flow-guard-fresh-rechecks-2026-10-26.ru.md +39 -0
  108. package/docs/flow-guard-fresh-rechecks-2026-10-26.zh.md +39 -0
  109. package/docs/flow-guard-model-comparison-2026-10-25.es.md +27 -0
  110. package/docs/flow-guard-model-comparison-2026-10-25.fr.md +27 -0
  111. package/docs/flow-guard-model-comparison-2026-10-25.md +27 -0
  112. package/docs/flow-guard-model-comparison-2026-10-25.ru.md +27 -0
  113. package/docs/flow-guard-model-comparison-2026-10-25.zh.md +27 -0
  114. package/docs/flow-guard-prospective-holdout-2026-10-26.es.md +30 -0
  115. package/docs/flow-guard-prospective-holdout-2026-10-26.fr.md +30 -0
  116. package/docs/flow-guard-prospective-holdout-2026-10-26.md +44 -0
  117. package/docs/flow-guard-prospective-holdout-2026-10-26.ru.md +44 -0
  118. package/docs/flow-guard-prospective-holdout-2026-10-26.zh.md +30 -0
  119. package/docs/flow-guard-reference-egress.es.md +25 -0
  120. package/docs/flow-guard-reference-egress.fr.md +25 -0
  121. package/docs/flow-guard-reference-egress.md +26 -0
  122. package/docs/flow-guard-reference-egress.ru.md +26 -0
  123. package/docs/flow-guard-reference-egress.zh.md +25 -0
  124. package/docs/flow-guard-review-factors-2026-10-26.es.md +41 -0
  125. package/docs/flow-guard-review-factors-2026-10-26.fr.md +41 -0
  126. package/docs/flow-guard-review-factors-2026-10-26.md +45 -0
  127. package/docs/flow-guard-review-factors-2026-10-26.ru.md +45 -0
  128. package/docs/flow-guard-review-factors-2026-10-26.zh.md +41 -0
  129. package/docs/flow-guard-structured-model-2026-10-26.es.md +35 -0
  130. package/docs/flow-guard-structured-model-2026-10-26.fr.md +35 -0
  131. package/docs/flow-guard-structured-model-2026-10-26.md +44 -0
  132. package/docs/flow-guard-structured-model-2026-10-26.ru.md +46 -0
  133. package/docs/flow-guard-structured-model-2026-10-26.zh.md +35 -0
  134. package/docs/flow-guard.es.md +25 -1
  135. package/docs/flow-guard.fr.md +25 -1
  136. package/docs/flow-guard.md +25 -1
  137. package/docs/flow-guard.ru.md +25 -1
  138. package/docs/flow-guard.zh.md +25 -1
  139. package/examples/answer-gate-host.mjs +33 -0
  140. package/package.json +5 -4
package/CHANGELOG.md CHANGED
@@ -1,5 +1,49 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.22.2 — 2026-10-27
4
+
5
+ - Reject unknown keys in `server_info` for MCP status and approval calls, matching the existing
6
+ `additionalProperties: false` schema. Calls without `server_info`, empty metadata and partial
7
+ `name`/`version` objects retain their previous behavior. Invalid metadata is rejected before
8
+ an approval is written; reviewed hashes, revision checks and operator opt-in remain required.
9
+
10
+ <!-- qingfeng-reference-egress -->
11
+ ## Reference-only egress checks — 2026-10-26
12
+
13
+ - Add 25 synthetic regressions for reference-only outbound payloads, observed intermediary results, new turns, operator labels, modes and exact one-use grants. Linux build/typecheck and 127 tests in four relevant suites pass. No runtime or threshold changes; no paid model calls.
14
+ - Document expected review/deny behavior separately from explicit policy exemptions, unknown non-MCP tools and unobserved credentials. An exact grant does not certify semantic publicness. [Report in five languages](docs/flow-guard-reference-egress.md).
15
+ <!-- /qingfeng-reference-egress -->
16
+
17
+ ## 0.22.1 — 2026-10-26
18
+
19
+ Ships the local source recorded below. npm `0.22.0` did not include it.
20
+
21
+ - Add an opt-in host-owned structured answer gate and captured-fact repair feedback for numeric ranking and missing eligible sets, as recorded below. Frozen experiment snapshots retain their original 0.22.0 identity; the version bump does not rerun or alter those results.
22
+
23
+ <!-- final-ranking-witness -->
24
+ ## Local final ranking-feedback validation — 2026-10-26
25
+
26
+ The unchanged candidate completed a separate 120-call Linux comparison: old feedback repaired 6/40 known-failure continuations, explicit selected-versus-best feedback repaired 40/40; valid controls remained 20/20 per nominal arm. All delivered frames passed arithmetic audit. This closes the selected-cohort series, not a new holdout. Production repair bounds and local unpublished 0.22.0 are unchanged. [Report](docs/flow-guard-final-witness-2026-10-26.md).
27
+ <!-- /final-ranking-witness -->
28
+
29
+ ## Local follow-up — ranking and missing-set counterevidence, 2026-10-26
30
+
31
+ - After a frozen prospective 24-fixture run, add bounded captured-fact feedback for `not-optimal` and `incomplete-eligible-set`: selected/best numeric values, direction, a safe optimal record reference, counts and at most eight missing eligible references. Never copy source labels, IDs or prose. Schema, validation rules, output decisions and two-correction limit stay unchanged.
32
+ - Linux build/typecheck, 798 WARDEN tests (50 gate/stdio) and 28 red-team scenarios pass. Replay of 210 saved proposals/156 trajectories preserves all decisions and final frames; no new model call tests the improved messages.
33
+ - Keep frozen live outcomes separate: natural first 89/96, five of seven errors repaired/two withheld; controlled final 45/48/three withheld. Seven second repairs produce two successes/five withholdings. No invalid delivered result in the sample; synthetic supported types and same-author limitations apply. [Five-language report](docs/flow-guard-prospective-holdout-2026-10-26.md). Local 0.22.0 only, not published.
34
+
35
+ ## Local follow-up — host-owned structured answer gate, 2026-10-26
36
+
37
+ - Add opt-in `createAnswerGate`: host-frozen numeric/boolean rules, safe record/field references, complete eligible-set and optional ranking checks. After every proposal, recheck every admitted alternative against all rules; C-to-D substitution is a new violation, not success.
38
+ - Buffer delivery through an explicit host SDK: initial proposal plus at most two corrections, fixed independent notice, and withholding after unresolved/unknown input. One output reservation per instance; no automatic retries after provider, cancellation, timeout or uncertain output failure. An ordinary Stop hook remains a one-continuation request, not a final-display owner.
39
+ - Include an actual stdio host example and regressions; arbitrary prose, source truth, native-client GUI rendering and new model repair efficacy are outside this check. Clarify source-record numbering in legacy constraint feedback. Five-language [contract and limits](docs/flow-guard-answer-gate.md). Local 0.22.0 only; no publication.
40
+
41
+ ## Local follow-up — deterministic answer evidence, 2026-10-26
42
+
43
+ - Add optional host-owned `answer_check` and exported `checkAnswerConstraints`: exact answer/session/turn binding, finite numeric/boolean rules, selected and explicitly eligible items, partial/invalid status and fixed numerical counterevidence. Constraints must originate in real user/operator policy; source data remains conditional, and native hooks do not automatically extract this contract.
44
+ - Preserve a guard-owned source-instruction notice after a host-marked Stop continuation without requesting a second recheck. Keep any existing model disclosure in the review instruction. A host must display `systemMessage`; this does not guarantee model-prose preservation or native-client rendering.
45
+ - Add a closed-schema synthetic-probe claim adapter and saved-pair replay. Linux build/typecheck, 743 WARDEN tests in 21 files, 24 Python tests and the existing 28-scenario deterministic gate pass. Replay detects all four known eligibility contradictions and emits continuation notices for all twelve saved pairs, including the three prior disclosure losses; it does not regenerate or correct model answers. Verify 276 output hashes and synchronize the Linux-generated local build/plugin. No npm publication, GitHub write or public article change. See [contract, results and limits](docs/flow-guard-constraint-evidence.md), also in RU/ES/FR/ZH.
46
+
3
47
  ## 0.22.0 — 2026-10-25
4
48
 
5
49
  Ships the local source recorded below. npm `0.21.0` did not include it. The entries below describe changes since 0.21.0.
package/README-es.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # WARDEN — servidor MCP
2
2
 
3
+ <!-- final-ranking-witness -->
4
+ **[Comparación final de mensajes de clasificación, 26 de octubre](docs/flow-guard-final-witness-2026-10-26.es.md).** En los cinco contextos previamente retenidos, el mensaje anterior corrigió 6/40 continuaciones y la comparación explícita entre la opción elegida y la mejor corrigió 40/40. Los controles válidos se conservaron 20/20 por grupo nominal. La serie termina sobre fallos conocidos, no sobre un nuevo conjunto reservado. Este resultado actualiza la limitación anterior de evaluación solo sin conexión para la clasificación; la eficacia del mensaje de conjunto incompleto sigue sin medirse.
5
+ <!-- /final-ranking-witness -->
6
+
3
7
  <!-- mcp-name: io.github.alexar76/warden -->
4
8
 
5
9
  <!-- aicom-readme-badges -->
@@ -8,7 +12,7 @@
8
12
  <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
13
  <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
14
  <img src="docs/badges/deps.svg" alt="Cero dependencias de ejecución" />
11
- <img src="docs/badges/tests.svg" alt="1256 pruebas en verde" />
15
+ <img src="docs/badges/tests.svg" alt="1382 pruebas en verde" />
12
16
  <img src="docs/badges/node.svg" alt="Node >= 20" />
13
17
  <a href="LICENSE"><img src="docs/badges/license.svg" alt="Licencia: MIT" /></a>
14
18
  </p>
@@ -29,7 +33,7 @@
29
33
  **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
34
 
31
35
  ```bash
32
- npx -y @aimarket/warden@0.22.0 scan
36
+ npx -y @aimarket/warden@0.22.2 scan
33
37
  ```
34
38
 
35
39
  ```text
@@ -104,14 +108,14 @@ Operaciones limitadas explícitas: `node dist/mcp-server.js task`. [Adaptador, p
104
108
  "mcpServers": {
105
109
  "filesystem": {
106
110
  "command": "npx",
107
- "args": ["-y", "@aimarket/warden@0.22.0", "wrap", "--id", "filesystem", "--",
111
+ "args": ["-y", "@aimarket/warden@0.22.2", "wrap", "--id", "filesystem", "--",
108
112
  "npx", "-y", "@modelcontextprotocol/server-filesystem", "/Users/me/docs"]
109
113
  }
110
114
  }
111
115
  }
112
116
  ```
113
117
 
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`.
118
+ 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.2` y el comando `warden-mcp` evitan arranques fríos repetidos de `npx`.
115
119
 
116
120
  **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.
117
121
 
@@ -139,12 +143,12 @@ Claude Desktop en macOS: `~/Library/Logs/Claude/mcp-server-<nombre>.log`. En Cur
139
143
  ## Analiza todos los servidores que inician tus clientes
140
144
 
141
145
  ```bash
142
- npx -y @aimarket/warden@0.22.0 scan
146
+ npx -y @aimarket/warden@0.22.2 scan
143
147
  ```
144
148
 
145
149
  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).
146
150
 
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).
151
+ **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.2 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).
148
152
 
149
153
  ## Lo que WARDEN no hace
150
154
 
@@ -364,7 +368,7 @@ comprobarlas: [Identidades ERC-8004](https://github.com/alexar76/aicom/blob/main
364
368
  ## Desarrollo
365
369
 
366
370
  ```bash
367
- npm install && npm run build && npm test # 1256 pruebas
371
+ npm install && npm run build && npm test # 1382 pruebas
368
372
  ```
369
373
 
370
374
  `test/packaging.test.ts` es lo que mantiene honesto el titular: falla si aparece una dependencia de
@@ -375,3 +379,15 @@ Usado por [ARGUS](https://github.com/alexar76/argus) (el host de referencia),
375
379
  [MOMUS](https://github.com/alexar76/momus) (el lado editor) y el curso de seguridad MCP de AICOM.
376
380
 
377
381
  MIT © AICOM (alexar76)
382
+
383
+ <!-- structured-answer-gate -->
384
+
385
+ [Validación por la aplicación](docs/flow-guard-answer-gate.es.md): todas las reglas, corrección adicional limitada y salida almacenada; solo datos estructurados.
386
+
387
+ <!-- structured-live-followup -->
388
+
389
+ [Prueba real de respuestas estructuradas](docs/flow-guard-structured-model-2026-10-26.es.md): 96 primeras propuestas válidas y 64 reparaciones controladas; denominadores y límites separados.
390
+
391
+ <!-- prospective-holdout-followup -->
392
+
393
+ [Nuevos casos tras congelación](docs/flow-guard-prospective-holdout-2026-10-26.es.md): primeras naturales válidas 89/96, cinco de siete reparadas y dos retenidas; controladas 45/48. Evidencia posterior de clasificación/conjunto incompleto probada offline, sin volver a llamar al modelo.
package/README-fr.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # WARDEN — serveur MCP
2
2
 
3
+ <!-- final-ranking-witness -->
4
+ **[Comparaison finale des messages de classement, 26 octobre](docs/flow-guard-final-witness-2026-10-26.fr.md).** Sur les cinq contextes précédemment retenus, l’ancien message a corrigé 6/40 continuations et la comparaison explicite du choix avec le meilleur a corrigé 40/40. Les contrôles valides sont restés valides 20/20 par groupe nominal. La série se termine sur des échecs connus, sans nouvel échantillon réservé. Ce résultat actualise la limite antérieure de vérification hors ligne pour le classement ; l’efficacité du message d’ensemble incomplet reste non mesurée.
5
+ <!-- /final-ranking-witness -->
6
+
3
7
  <!-- mcp-name: io.github.alexar76/warden -->
4
8
 
5
9
  <!-- aicom-readme-badges -->
@@ -8,7 +12,7 @@
8
12
  <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
13
  <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
14
  <img src="docs/badges/deps.svg" alt="Zéro dépendance d'exécution" />
11
- <img src="docs/badges/tests.svg" alt="1256 tests au vert" />
15
+ <img src="docs/badges/tests.svg" alt="1382 tests au vert" />
12
16
  <img src="docs/badges/node.svg" alt="Node >= 20" />
13
17
  <a href="LICENSE"><img src="docs/badges/license.svg" alt="Licence : MIT" /></a>
14
18
  </p>
@@ -29,7 +33,7 @@
29
33
  **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
34
 
31
35
  ```bash
32
- npx -y @aimarket/warden@0.22.0 scan
36
+ npx -y @aimarket/warden@0.22.2 scan
33
37
  ```
34
38
 
35
39
  ```text
@@ -104,14 +108,14 @@ Opérations limitées sur activation explicite : `node dist/mcp-server.js task`.
104
108
  "mcpServers": {
105
109
  "filesystem": {
106
110
  "command": "npx",
107
- "args": ["-y", "@aimarket/warden@0.22.0", "wrap", "--id", "filesystem", "--",
111
+ "args": ["-y", "@aimarket/warden@0.22.2", "wrap", "--id", "filesystem", "--",
108
112
  "npx", "-y", "@modelcontextprotocol/server-filesystem", "/Users/me/docs"]
109
113
  }
110
114
  }
111
115
  }
112
116
  ```
113
117
 
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`.
118
+ 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.2` puis `warden-mcp` évitent les démarrages à froid répétés de `npx`.
115
119
 
116
120
  **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.
117
121
 
@@ -139,12 +143,12 @@ Claude Desktop sur macOS : `~/Library/Logs/Claude/mcp-server-<nom>.log`. Cursor
139
143
  ## Analyser tous les serveurs que démarrent vos clients
140
144
 
141
145
  ```bash
142
- npx -y @aimarket/warden@0.22.0 scan
146
+ npx -y @aimarket/warden@0.22.2 scan
143
147
  ```
144
148
 
145
149
  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).
146
150
 
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).
151
+ **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.2 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).
148
152
 
149
153
  ## Ce que WARDEN ne fait pas
150
154
 
@@ -365,7 +369,7 @@ transactions et la façon de les vérifier :
365
369
  ## Développement
366
370
 
367
371
  ```bash
368
- npm install && npm run build && npm test # 1256 tests
372
+ npm install && npm run build && npm test # 1382 tests
369
373
  ```
370
374
 
371
375
  `test/packaging.test.ts` est ce qui tient l'accroche honnête : il échoue si une dépendance d'exécution
@@ -376,3 +380,15 @@ Utilisé par [ARGUS](https://github.com/alexar76/argus) (l'hôte de référence)
376
380
  [MOMUS](https://github.com/alexar76/momus) (le côté éditeur) et le cours AICOM sur la sécurité MCP.
377
381
 
378
382
  MIT © AICOM (alexar76)
383
+
384
+ <!-- structured-answer-gate -->
385
+
386
+ [Validation par l’application](docs/flow-guard-answer-gate.fr.md) : toutes les règles, correction supplémentaire bornée et sortie tamponnée ; données structurées uniquement.
387
+
388
+ <!-- structured-live-followup -->
389
+
390
+ [Test réel des réponses structurées](docs/flow-guard-structured-model-2026-10-26.fr.md) : 96 premières propositions valides et 64 réparations contrôlées ; dénominateurs et limites séparés.
391
+
392
+ <!-- prospective-holdout-followup -->
393
+
394
+ [Nouveaux cas après gel](docs/flow-guard-prospective-holdout-2026-10-26.fr.md) : premières naturelles valides 89/96, cinq erreurs sur sept réparées, deux retenues ; contrôlées 45/48. Constats ultérieurs de classement/ensemble incomplet vérifiés hors ligne, sans nouveau modèle.
package/README-ru.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # WARDEN — MCP-сервер
2
2
 
3
+ <!-- final-ranking-witness -->
4
+ **[Финальное сравнение обратной связи, 26 октября](docs/flow-guard-final-witness-2026-10-26.ru.md).** Во всех пяти ранее удержанных контекстах старое сообщение исправило 6/40 продолжений, явное сравнение выбранного и лучшего — 40/40. Правильные контроли сохранились 20/20 в каждой условной группе. Серия завершена на известных ошибках; это не новый holdout. Прежнее утверждение о проверке только офлайн уточнено этим результатом для ранжирования; эффективность сообщений о неполном наборе моделью пока не измерена.
5
+ <!-- /final-ranking-witness -->
6
+
3
7
  <!-- mcp-name: io.github.alexar76/warden -->
4
8
 
5
9
  <!-- aicom-readme-badges -->
@@ -8,7 +12,7 @@
8
12
  <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
13
  <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
14
  <img src="docs/badges/deps.svg" alt="Zero runtime dependencies" />
11
- <img src="docs/badges/tests.svg" alt="1256 tests passing" />
15
+ <img src="docs/badges/tests.svg" alt="1382 tests passing" />
12
16
  <img src="docs/badges/node.svg" alt="Node >= 20" />
13
17
  <a href="LICENSE"><img src="docs/badges/license.svg" alt="License: MIT" /></a>
14
18
  </p>
@@ -29,7 +33,7 @@
29
33
  **Проверьте все MCP-серверы на своей машине.** Без аккаунта, без API-ключа, без модели. Сетевой трафик идёт только к серверам из вашего конфига.
30
34
 
31
35
  ```bash
32
- npx -y @aimarket/warden@0.22.0 scan
36
+ npx -y @aimarket/warden@0.22.2 scan
33
37
  ```
34
38
 
35
39
  ```text
@@ -104,7 +108,7 @@ MCP-сервер добавляет другие `node:` builtins (`fs`, `path`,
104
108
  "mcpServers": {
105
109
  "filesystem": {
106
110
  "command": "npx",
107
- "args": ["-y", "@aimarket/warden@0.22.0", "wrap", "--id", "filesystem", "--",
111
+ "args": ["-y", "@aimarket/warden@0.22.2", "wrap", "--id", "filesystem", "--",
108
112
  "npx", "-y", "@modelcontextprotocol/server-filesystem", "/Users/me/docs"]
109
113
  }
110
114
  }
@@ -113,7 +117,7 @@ MCP-сервер добавляет другие `node:` builtins (`fs`, `path`,
113
117
 
114
118
  Для обязательного утверждения первого контакта добавьте к `wrap` флаг `--require-approval`. Определения не попадут модели до `warden-mcp pins approve --id filesystem` в терминале оператора. Любое изменение полей или идентичности запуска требует нового утверждения; автоматические и старые pins не подходят. Подробнее: [граница допуска, не зависящая от языка](docs/security-hardening-language-boundary.md).
115
119
 
116
- Всегда задавайте `--id`: без него изменение аргументов создаёт новую идентичность и новый первый контакт. Со стабильным ID смена команды или пути даёт `SERVER_IDENTITY_DRIFT`. Дочерний процесс наследует окружение; оно не входит в идентичность. Чтобы избежать холодного старта `npx`, установите глобально: `npm install -g @aimarket/warden@0.22.0`, затем команда `warden-mcp`.
120
+ Всегда задавайте `--id`: без него изменение аргументов создаёт новую идентичность и новый первый контакт. Со стабильным ID смена команды или пути даёт `SERVER_IDENTITY_DRIFT`. Дочерний процесс наследует окружение; оно не входит в идентичность. Чтобы избежать холодного старта `npx`, установите глобально: `npm install -g @aimarket/warden@0.22.2`, затем команда `warden-mcp`.
117
121
 
118
122
  **Чувствительные инструменты.** `sensitiveToolPatterns` в файле политики (`--policy policy.json` с `{"sensitiveToolPatterns": ["*delete*", "*transfer*"]}`, шаблоны `*` без учёта регистра) заставляет каждый вызов подходящего инструмента ждать человека: `wrap` спрашивает через собственную форму клиента (MCP elicitation), показывая инструмент, сервер и аргументы, и пропускает этот один вызов только при отмеченной галочке и принятой форме. Галочка по умолчанию снята, поэтому клиент, принимающий формы со значениями по умолчанию, ничего не одобрит. Клиенту без формы elicitation вызов отклоняется, и сервер его не получает; `--ask refuse` отклоняет, не спрашивая. Если клиент отменил вызов, пока человек решает, или за это время изменились определения, вызов не отправляется. До 0.20.0 `wrap` принимал эти шаблоны, но не применял их. С `--flow` отправка, о которой страж потоков спросил бы, спрашивается так же.
119
123
 
@@ -141,12 +145,12 @@ warden-mcp pins revoke --id filesystem
141
145
  ## Проверить все серверы, которые запускают ваши клиенты
142
146
 
143
147
  ```bash
144
- npx -y @aimarket/warden@0.22.0 scan
148
+ npx -y @aimarket/warden@0.22.2 scan
145
149
  ```
146
150
 
147
151
  Читает 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).
148
152
 
149
- **Для издателя сервера.** Если ваш сервер отдаёт другие инструменты там, где установлено то, чего нет в песочнице HISTOR, — раннер запускателя, по одному на ОС, — `npx -y @aimarket/warden@0.22.0 declare --out mcp-tool-sets.json -- <ваш сервер>` записывает эти наборы в файл, который вы публикуете на своём домене, и те, кто их получает, видят заявление издателя, а не незнакомый набор. Подробно — в [руководстве по scan](docs/scan.ru.md).
153
+ **Для издателя сервера.** Если ваш сервер отдаёт другие инструменты там, где установлено то, чего нет в песочнице HISTOR, — раннер запускателя, по одному на ОС, — `npx -y @aimarket/warden@0.22.2 declare --out mcp-tool-sets.json -- <ваш сервер>` записывает эти наборы в файл, который вы публикуете на своём домене, и те, кто их получает, видят заявление издателя, а не незнакомый набор. Подробно — в [руководстве по scan](docs/scan.ru.md).
150
154
 
151
155
  ## Чего WARDEN не делает
152
156
 
@@ -366,7 +370,7 @@ WARDEN — агент ERC-8004 [`96684` в сети Base](https://8004scan.io/ag
366
370
  ## Разработка
367
371
 
368
372
  ```bash
369
- npm install && npm run build && npm test # 1256 тестов
373
+ npm install && npm run build && npm test # 1382 тестов
370
374
  ```
371
375
 
372
376
  `test/packaging.test.ts` — то, что удерживает заголовок честным: он падает, если появляется
@@ -377,3 +381,15 @@ npm install && npm run build && npm test # 1256 тестов
377
381
  [MOMUS](https://github.com/alexar76/momus) (сторона издателя) и в курсе AICOM по безопасности MCP.
378
382
 
379
383
  MIT © AICOM (alexar76)
384
+
385
+ <!-- structured-answer-gate -->
386
+
387
+ [Проверка ответа приложением](docs/flow-guard-answer-gate.ru.md): все ограничения, дополнительный ограниченный проход и буферизация выдачи; только структурированные данные.
388
+
389
+ <!-- structured-live-followup -->
390
+
391
+ [Живой прогон структурированных ответов](docs/flow-guard-structured-model-2026-10-26.ru.md): 96 правильных первых предложений и 64 исправления контролируемых ошибок; отдельные знаменатели и границы.
392
+
393
+ <!-- prospective-holdout-followup -->
394
+
395
+ [Новые случаи после заморозки](docs/flow-guard-prospective-holdout-2026-10-26.ru.md): 89/96 первых естественных ответов правильны, пять из семи ошибок исправлены, два удержаны; контролируемые 45/48. Отдельные подсказки ранжирования/неполного списка проверены офлайн, без нового запуска модели.
package/README-zh.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # WARDEN — MCP 服务器
2
2
 
3
+ <!-- final-ranking-witness -->
4
+ **[10月26日最终排序反馈对照](docs/flow-guard-final-witness-2026-10-26.zh.md).** 在全部五个此前被拦截的上下文中,旧反馈修复了6/40次续答,明确比较所选项与最优项的新反馈修复了40/40次。每个名义组的有效对照均保持20/20。本系列到此结束,结果针对已知失败案例,并非新的留出测试。此结果更新了此前仅离线验证的排序反馈限制;缺失合格项反馈的模型修复效果仍未测量。
5
+ <!-- /final-ranking-witness -->
6
+
3
7
  <!-- mcp-name: io.github.alexar76/warden -->
4
8
 
5
9
  <!-- aicom-readme-badges -->
@@ -8,7 +12,7 @@
8
12
  <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
13
  <a href="https://warden.modelmarket.dev/"><img src="https://img.shields.io/npm/v/@aimarket/warden?color=cb3837&label=npm" alt="npm 版本" /></a>
10
14
  <img src="docs/badges/deps.svg" alt="零运行时依赖" />
11
- <img src="docs/badges/tests.svg" alt="1256 项测试通过" />
15
+ <img src="docs/badges/tests.svg" alt="1382 项测试通过" />
12
16
  <img src="docs/badges/node.svg" alt="Node >= 20" />
13
17
  <a href="LICENSE"><img src="docs/badges/license.svg" alt="许可证:MIT" /></a>
14
18
  </p>
@@ -29,7 +33,7 @@
29
33
  **检查你机器上的所有 MCP 服务器。** 无需账号、无需 API 密钥、不调用模型。唯一的网络流量是发往你配置中的服务器。
30
34
 
31
35
  ```bash
32
- npx -y @aimarket/warden@0.22.0 scan
36
+ npx -y @aimarket/warden@0.22.2 scan
33
37
  ```
34
38
 
35
39
  ```text
@@ -100,14 +104,14 @@ Auten 后续:`taskAdapter.mode: "review"` / `task_run` 按固定结果确认
100
104
  "mcpServers": {
101
105
  "filesystem": {
102
106
  "command": "npx",
103
- "args": ["-y", "@aimarket/warden@0.22.0", "wrap", "--id", "filesystem", "--",
107
+ "args": ["-y", "@aimarket/warden@0.22.2", "wrap", "--id", "filesystem", "--",
104
108
  "npx", "-y", "@modelcontextprotocol/server-filesystem", "/Users/me/docs"]
105
109
  }
106
110
  }
107
111
  }
108
112
  ```
109
113
 
110
- 始终指定 `--id`:否则修改命令参数会创建新身份并重新执行首次信任。稳定 ID 会把命令或路径变更识别为 `SERVER_IDENTITY_DRIFT`。子进程继承环境变量,身份哈希不包含环境。可运行 `npm install -g @aimarket/warden@0.22.0`,使用 `warden-mcp` 避免反复进行 `npx` 冷启动。
114
+ 始终指定 `--id`:否则修改命令参数会创建新身份并重新执行首次信任。稳定 ID 会把命令或路径变更识别为 `SERVER_IDENTITY_DRIFT`。子进程继承环境变量,身份哈希不包含环境。可运行 `npm install -g @aimarket/warden@0.22.2`,使用 `warden-mcp` 避免反复进行 `npx` 冷启动。
111
115
 
112
116
  **敏感工具。** 策略文件中的 `sensitiveToolPatterns`(`--policy policy.json`,内容如 `{"sensitiveToolPatterns": ["*delete*", "*transfer*"]}`,`*` 通配、不区分大小写)让每次调用匹配的工具都要等人确认:`wrap` 通过客户端自己的表单(MCP elicitation)询问,列出工具、服务器和参数,只有勾选并接受的回答才放行这一次调用。复选框默认不勾选,所以按默认值自动接受表单的客户端什么也批准不了。不提供 elicitation 表单的客户端会收到拒绝,服务器永远收不到这次调用;`--ask refuse` 不询问直接拒绝。若客户端在等人决定时取消调用,或其间定义发生变化,调用不会发出。0.20.0 之前 `wrap` 接受这些模式却不执行。配合 `--flow`,流守卫会询问的发送也以同样方式询问。
113
117
 
@@ -135,12 +139,12 @@ macOS 上 Claude Desktop 日志:`~/Library/Logs/Claude/mcp-server-<名称>.log
135
139
  ## 扫描客户端启动的所有服务器
136
140
 
137
141
  ```bash
138
- npx -y @aimarket/warden@0.22.0 scan
142
+ npx -y @aimarket/warden@0.22.2 scan
139
143
  ```
140
144
 
141
145
  读取 Claude Code、Claude Desktop、Cursor、VS Code 和 Windsurf 的 MCP 配置,连接其中启动的每个服务器,并在模型看到工具定义之前对其进行审查。输出表格、JSON、SARIF 或 Markdown,有服务器被阻止时以 1 退出;`--no-launch` 不启动任何程序。在仓库中,`warden.lock.json` 把工具定义的改动变成可审查的 diff,CI 会在出现新的或改动过的服务器时失败。也提供 GitHub Action(`uses: alexar76/warden@v0.21.0`)、pre-commit 钩子和 Claude Code 插件(`/plugin marketplace add alexar76/warden`)。`--histor` 询问公开的 HISTOR 日志:服务器给你的是否与给所有人的相同;对远程服务器发送端点和摘要,对从 npm 或 PyPI 启动的 stdio 服务器发送软件包名(`npm:<名称>`、`pypi:<名称>`,HISTOR 会在 gVisor 沙箱中运行它)和摘要,从不发送工具文本。可选的分类器(`--classifier-url`、`--classifier-model`)会加入你所选模型(本地或托管)的判断,用于覆盖任何规则都没有提到的内容。详见 [scan 指南](docs/scan.zh.md)。与另外两款扫描器在同一批服务器上的对比,见[扫描器对比](docs/scanner-comparison.zh.md)。
142
146
 
143
- **面向服务器发布者。** 如果在安装了 HISTOR 沙箱所没有的东西(启动器的运行器、每个操作系统各一个)的地方,你的服务器列出的是别的工具,`npx -y @aimarket/warden@0.22.0 declare --out mcp-tool-sets.json -- <你的服务器>` 会把这些工具集写进一个文件,由你发布在自己的域名上;拿到这些工具集的人看到的将是发布者的声明,而不是陌生的工具集。参见 [scan 指南](docs/scan.zh.md)。
147
+ **面向服务器发布者。** 如果在安装了 HISTOR 沙箱所没有的东西(启动器的运行器、每个操作系统各一个)的地方,你的服务器列出的是别的工具,`npx -y @aimarket/warden@0.22.2 declare --out mcp-tool-sets.json -- <你的服务器>` 会把这些工具集写进一个文件,由你发布在自己的域名上;拿到这些工具集的人看到的将是发布者的声明,而不是陌生的工具集。参见 [scan 指南](docs/scan.zh.md)。
144
148
 
145
149
  ## WARDEN 不做什么
146
150
 
@@ -342,7 +346,7 @@ WARDEN 是 [Base 上的 `96684` 号](https://8004scan.io/agents/base/96684) ERC-
342
346
  ## 开发
343
347
 
344
348
  ```bash
345
- npm install && npm run build && npm test # 1256 项测试
349
+ npm install && npm run build && npm test # 1382 项测试
346
350
  ```
347
351
 
348
352
  `test/packaging.test.ts` 正是让标题保持诚实的东西:一旦出现运行时依赖、任何源文件从包外 import、或者入口点不
@@ -352,3 +356,15 @@ npm install && npm run build && npm test # 1256 项测试
352
356
  (发布方一侧)以及 AICOM 的 MCP 安全课程使用。
353
357
 
354
358
  MIT © AICOM (alexar76)
359
+
360
+ <!-- structured-answer-gate -->
361
+
362
+ [应用答案门禁](docs/flow-guard-answer-gate.zh.md):全部规则、有界额外纠正与缓冲交付;仅支持结构化数据。
363
+
364
+ <!-- structured-live-followup -->
365
+
366
+ [结构化答案真实模型测试](docs/flow-guard-structured-model-2026-10-26.zh.md):96 个初次提案有效,64 个受控种子修复;分母与边界分别报告。
367
+
368
+ <!-- prospective-holdout-followup -->
369
+
370
+ [冻结后的新案例](docs/flow-guard-prospective-holdout-2026-10-26.zh.md):自然初次有效 89/96,七个错误中五个纠正、两个保留;受控纠正 45/48。后续排序/缺失集合证据已离线验证,未重新调用模型。
package/README.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # WARDEN — MCP server
2
2
 
3
+ <!-- final-ranking-witness -->
4
+ **[Final ranking-feedback comparison, 26 October](docs/flow-guard-final-witness-2026-10-26.md).** On all five previously withheld contexts, old feedback repaired 6/40 continuations and explicit selected-versus-best feedback repaired 40/40. Valid controls stayed valid 20/20 per nominal arm. This completes the series on selected known failures, not a new holdout. The earlier offline-only statement is superseded for ranking feedback on this cohort; missing-set feedback efficacy remains unmeasured.
5
+ <!-- /final-ranking-witness -->
6
+
3
7
  <!-- mcp-name: io.github.alexar76/warden -->
4
8
 
5
9
  <!-- aicom-readme-badges -->
@@ -8,7 +12,7 @@
8
12
  <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
13
  <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
14
  <img src="docs/badges/deps.svg" alt="Zero runtime dependencies" />
11
- <img src="docs/badges/tests.svg" alt="1256 tests passing" />
15
+ <img src="docs/badges/tests.svg" alt="1382 tests passing" />
12
16
  <img src="docs/badges/node.svg" alt="Node >= 20" />
13
17
  <a href="LICENSE"><img src="docs/badges/license.svg" alt="License: MIT" /></a>
14
18
  </p>
@@ -29,7 +33,7 @@
29
33
  **Check every MCP server on your machine.** No account, no API key, no model. The only network traffic is to the servers in your config.
30
34
 
31
35
  ```bash
32
- npx -y @aimarket/warden@0.22.0 scan
36
+ npx -y @aimarket/warden@0.22.2 scan
33
37
  ```
34
38
 
35
39
  ```text
@@ -103,7 +107,7 @@ Opt-in constrained operations: `node dist/mcp-server.js task`. See the [task ada
103
107
  "mcpServers": {
104
108
  "filesystem": {
105
109
  "command": "npx",
106
- "args": ["-y", "@aimarket/warden@0.22.0", "wrap", "--id", "filesystem", "--",
110
+ "args": ["-y", "@aimarket/warden@0.22.2", "wrap", "--id", "filesystem", "--",
107
111
  "npx", "-y", "@modelcontextprotocol/server-filesystem", "/Users/me/docs"]
108
112
  }
109
113
  }
@@ -112,7 +116,7 @@ Opt-in constrained operations: `node dist/mcp-server.js task`. See the [task ada
112
116
 
113
117
  For explicit first-contact review, add `--require-approval` to `wrap`. It withholds new definitions until `warden-mcp pins approve --id filesystem` in an operator terminal, then rejects any changed field or launch identity. Automatic/legacy pins need reapproval. See the [language-independent admission boundary](docs/security-hardening-language-boundary.md).
114
118
 
115
- Always specify `--id`: without it, changing command arguments creates a new identity and a new first contact. A stable ID turns a command or path change into `SERVER_IDENTITY_DRIFT`. Environment variables are inherited by the child and excluded from identity. To avoid repeated cold `npx` starts, install globally with `npm install -g @aimarket/warden@0.22.0`, then use `warden-mcp`.
119
+ Always specify `--id`: without it, changing command arguments creates a new identity and a new first contact. A stable ID turns a command or path change into `SERVER_IDENTITY_DRIFT`. Environment variables are inherited by the child and excluded from identity. To avoid repeated cold `npx` starts, install globally with `npm install -g @aimarket/warden@0.22.2`, then use `warden-mcp`.
116
120
 
117
121
  **Sensitive tools.** A policy file's `sensitiveToolPatterns` (`--policy policy.json` with `{"sensitiveToolPatterns": ["*delete*", "*transfer*"]}`, case-insensitive `*` globs) makes every call to a matching tool wait for a person: `wrap` asks through the client's own form (MCP elicitation) with the tool, the server and the arguments, and only a ticked, accepted answer lets that one call through. The box starts unticked, so a client that accepts forms with their defaults approves nothing. A client that offers no elicitation form gets a refusal and the server never receives the call; `--ask refuse` refuses without asking. If the client cancels the call while the person decides, or the definitions change meanwhile, it is not sent. Before 0.20.0 `wrap` accepted these patterns and did not enforce them. With `--flow`, a send the flow guard would ask about is asked the same way.
118
122
 
@@ -140,12 +144,12 @@ Claude Desktop on macOS writes stderr to `~/Library/Logs/Claude/mcp-server-<name
140
144
  ## Scan every server your clients start
141
145
 
142
146
  ```bash
143
- npx -y @aimarket/warden@0.22.0 scan
147
+ npx -y @aimarket/warden@0.22.2 scan
144
148
  ```
145
149
 
146
150
  Reads the MCP configs of Claude Code, Claude Desktop, Cursor, VS Code and Windsurf, connects to every server they start, and vets the tool definitions before a model sees them. It prints a table, JSON, SARIF or Markdown, and exits 1 when a server is blocked; `--no-launch` starts nothing. In a repository, `warden.lock.json` turns a change in tool definitions into a reviewable diff, and CI fails on a new or changed server. Also as a GitHub Action (`uses: alexar76/warden@v0.21.0`), pre-commit hooks and a Claude Code plugin (`/plugin marketplace add alexar76/warden`). `--histor` asks the public HISTOR log whether a server serves you what it serves everyone; for a remote server it sends the endpoint and a digest, for a stdio server started from npm or PyPI the package name (`npm:<name>`, `pypi:<name>`, which HISTOR runs in a gVisor sandbox) and a digest — never tool text. An opt-in classifier (`--classifier-url`, `--classifier-model`) adds the reading of a model you choose, local or hosted, for what no rule names. See the [scan guide](docs/scan.md). How it compares with two other scanners, on the same servers: [scanner comparison](docs/scanner-comparison.md).
147
151
 
148
- **For a server's publisher.** If your server lists different tools where something HISTOR's sandbox lacks is installed — a launcher's runner, one per operating system — `npx -y @aimarket/warden@0.22.0 declare --out mcp-tool-sets.json -- <your server>` writes those sets to a file you publish on your own domain, and the people who get them see the publisher's declaration instead of an unseen tool set. See [declare your server's tool sets](docs/scan.md#for-publishers-declare-your-servers-tool-sets).
152
+ **For a server's publisher.** If your server lists different tools where something HISTOR's sandbox lacks is installed — a launcher's runner, one per operating system — `npx -y @aimarket/warden@0.22.2 declare --out mcp-tool-sets.json -- <your server>` writes those sets to a file you publish on your own domain, and the people who get them see the publisher's declaration instead of an unseen tool set. See [declare your server's tool sets](docs/scan.md#for-publishers-declare-your-servers-tool-sets).
149
153
 
150
154
  ## What WARDEN does not do
151
155
 
@@ -366,7 +370,7 @@ check them: [ERC-8004 identities](https://github.com/alexar76/aicom/blob/main/do
366
370
  ## Development
367
371
 
368
372
  ```bash
369
- npm install && npm run build && npm test # 1256 tests
373
+ npm install && npm run build && npm test # 1382 tests
370
374
  ```
371
375
 
372
376
  `test/packaging.test.ts` is what keeps the headline honest: it fails if an npm runtime dependency
@@ -378,3 +382,15 @@ Used by [ARGUS](https://github.com/alexar76/argus) (the reference host), [MOMUS]
378
382
  (the publisher side), and the AICOM MCP-security course.
379
383
 
380
384
  MIT © AICOM (alexar76)
385
+
386
+ <!-- structured-answer-gate -->
387
+
388
+ [Host-owned answer gate](docs/flow-guard-answer-gate.md): all constraints, bounded extra correction and buffered final delivery; structured data only.
389
+
390
+ <!-- structured-live-followup -->
391
+
392
+ [Live structured-model test](docs/flow-guard-structured-model-2026-10-26.md): 96 valid first proposals and 64 controlled-seed repairs; separate denominators and limits.
393
+
394
+ <!-- prospective-holdout-followup -->
395
+
396
+ [Prospective new-fixture results](docs/flow-guard-prospective-holdout-2026-10-26.md): 89/96 natural first proposals valid, five of seven repaired, two withheld; controlled repair 45/48. Separate post-hoc ranking/missing-set facts passed offline checks, without a new model run.
@@ -1 +1 @@
1
- {"version":3,"file":"annotation-review.js","sourceRoot":"","sources":["../src/annotation-review.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGpD,MAAM,KAAK,GAAG,CAAC,cAAc,EAAE,iBAAiB,EAAE,eAAe,CAAU,CAAC;AAQ5E,4FAA4F;AAC5F,MAAM,UAAU,gBAAgB,CAC9B,MAAoB,EAAE,KAAgB,EAAE,QAAgB,EAAE,QAAgB,EAC1E,MAAkB,EAAE,WAAyC,EAAE;IAE/D,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,gBAAgB,KAAK,WAAW,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,SAAS,CAAC;IACpG,MAAM,SAAS,GAAG,QAAQ,QAAQ,KAAK,QAAQ,EAAE,CAAC;IAClD,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1F,IAAI,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC;QAAE,OAAO,SAAS,CAAC;IACjE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IAClD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC9D,MAAM,WAAW,GAAY,IAAI,CAAC,WAAW,CAAC;IAC9C,IAAI,MAAgB,CAAC;IACrB,IAAI,CAAC,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;QAAE,MAAM,GAAG,CAAC,2BAA2B,CAAC,CAAC;SACrH,CAAC;QACJ,MAAM,MAAM,GAAG,WAAsC,CAAC;QACtD,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;aACvD,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,IAAI,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QAClG,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;IACvC,CAAC;IACD,OAAO;QACL,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,kBAAkB,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC3F,MAAM,EAAE,mDAAmD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,kDAAkD;YAC5H,mGAAmG;YACnG,sJAAsJ;KACzJ,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"annotation-review.js","sourceRoot":"","sources":["../src/annotation-review.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGpD,MAAM,KAAK,GAAG,CAAC,cAAc,EAAE,iBAAiB,EAAE,eAAe,CAAU,CAAC;AAQ5E,4FAA4F;AAC5F,MAAM,UAAU,gBAAgB,CAC9B,MAAoB,EAAE,KAAgB,EAAE,QAAgB,EAAE,QAAgB,EAC1E,MAAkB,EAAE,QAAQ,GAAiC,EAAE;IAE/D,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,gBAAgB,KAAK,WAAW,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,SAAS,CAAC;IACpG,MAAM,SAAS,GAAG,QAAQ,QAAQ,KAAK,QAAQ,EAAE,CAAC;IAClD,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1F,IAAI,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC;QAAE,OAAO,SAAS,CAAC;IACjE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IAClD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC9D,MAAM,WAAW,GAAY,IAAI,CAAC,WAAW,CAAC;IAC9C,IAAI,MAAgB,CAAC;IACrB,IAAI,CAAC,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;QAAE,MAAM,GAAG,CAAC,2BAA2B,CAAC,CAAC;SACrH,CAAC;QACJ,MAAM,MAAM,GAAG,WAAsC,CAAC;QACtD,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;aACvD,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,IAAI,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QAClG,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;IACvC,CAAC;IACD,OAAO;QACL,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,kBAAkB,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC3F,MAAM,EAAE,mDAAmD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,kDAAkD;YAC5H,mGAAmG;YACnG,sJAAsJ;KACzJ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,94 @@
1
+ export type AnswerScalar = number | boolean;
2
+ export interface AnswerRule {
3
+ field: string;
4
+ op: 'lte' | 'gte' | 'eq';
5
+ value: AnswerScalar;
6
+ }
7
+ export interface AnswerRecord {
8
+ id: string;
9
+ attributes: Record<string, AnswerScalar>;
10
+ }
11
+ export interface AnswerGateOptions {
12
+ sessionId: string;
13
+ turn: number;
14
+ rules: AnswerRule[];
15
+ records: AnswerRecord[];
16
+ ranking?: {
17
+ field: string;
18
+ direction: 'min' | 'max';
19
+ };
20
+ disclosure?: 'external-data' | 'source-instructions';
21
+ }
22
+ export interface AnswerCatalog {
23
+ readonly schema: 'warden-answer-catalog/1';
24
+ readonly catalogSha256: string;
25
+ readonly rules: readonly Readonly<AnswerRule>[];
26
+ readonly records: readonly {
27
+ readonly ref: string;
28
+ readonly attributes: Readonly<Record<string, AnswerScalar>>;
29
+ }[];
30
+ readonly ranking?: {
31
+ readonly field: string;
32
+ readonly direction: 'min' | 'max';
33
+ };
34
+ readonly responseSchema: 'warden-selection/1';
35
+ }
36
+ export interface StructuredAnswer {
37
+ readonly schema: 'warden-selection/1';
38
+ readonly catalogSha256: string;
39
+ readonly selectedRef: string;
40
+ readonly eligibleRefs: readonly string[];
41
+ }
42
+ export type AnswerGateCode = 'verified' | 'invalid-json' | 'invalid-schema' | 'stale-catalog' | 'unknown-record' | 'incomplete-facts' | 'no-eligible-records' | 'constraint-violation' | 'incomplete-eligible-set' | 'not-optimal';
43
+ export interface AnswerGateViolation {
44
+ readonly recordRef: string;
45
+ readonly field: string;
46
+ readonly op: AnswerRule['op'];
47
+ readonly actual: AnswerScalar;
48
+ readonly required: AnswerScalar;
49
+ }
50
+ export interface AnswerGateDecision {
51
+ readonly decision: 'allow' | 'deny' | 'unknown';
52
+ readonly code: AnswerGateCode;
53
+ readonly answerSha256: string;
54
+ readonly feedback: string;
55
+ readonly violations: readonly AnswerGateViolation[];
56
+ readonly answer?: StructuredAnswer;
57
+ }
58
+ export interface AnswerGateRequest {
59
+ readonly attempt: number;
60
+ readonly catalog: AnswerCatalog;
61
+ readonly feedback?: string;
62
+ readonly signal: AbortSignal;
63
+ }
64
+ export interface AnswerGateRunOptions {
65
+ /** Initial proposal plus at most two corrections. Never an unbounded Stop-hook loop. */
66
+ maxCorrections?: 0 | 1 | 2;
67
+ /** Per-generation deadline; no automatic retry on generation/timeout/output errors. */
68
+ timeoutMs?: number;
69
+ signal?: AbortSignal;
70
+ generate: (request: AnswerGateRequest) => Promise<string> | string;
71
+ /** One host-owned output boundary; receives only fixed notice + checked data or a withholding notice. */
72
+ emit: (rendered: string) => Promise<void> | void;
73
+ }
74
+ export interface AnswerGateRunResult {
75
+ readonly status: 'delivered' | 'withheld' | 'cancelled' | 'generation-error' | 'delivery-uncertain';
76
+ readonly attempts: number;
77
+ readonly decisions: readonly AnswerGateDecision[];
78
+ readonly lastCode?: AnswerGateCode;
79
+ }
80
+ export interface AnswerGate {
81
+ readonly catalog: AnswerCatalog;
82
+ readonly notice: string;
83
+ /** Host-only mapping into the safe catalog; never forwards source metadata. Not an effect authorization. */
84
+ referenceForRecord(sourceId: string): string | undefined;
85
+ evaluate(raw: string): AnswerGateDecision;
86
+ /** This gate instance owns one run/output reservation. A repeated or concurrent run is refused. */
87
+ run(options: AnswerGateRunOptions): Promise<AnswerGateRunResult>;
88
+ }
89
+ /**
90
+ * The host owns rules, snapshot, context and output. Raw model prose is deliberately unsupported.
91
+ * Safe aliases replace source IDs/field labels in both the model catalog and every counterexample.
92
+ */
93
+ export declare function createAnswerGate(options: AnswerGateOptions): AnswerGate;
94
+ //# sourceMappingURL=answer-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"answer-gate.d.ts","sourceRoot":"","sources":["../src/answer-gate.ts"],"names":[],"mappings":"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"}