@aimarket/warden 0.21.0 → 0.22.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +52 -0
- package/README-es.md +24 -7
- package/README-fr.md +24 -7
- package/README-ru.md +24 -7
- package/README-zh.md +24 -7
- package/README.md +24 -7
- package/dist/annotation-review.d.ts +10 -0
- package/dist/annotation-review.d.ts.map +1 -0
- package/dist/annotation-review.js +36 -0
- package/dist/annotation-review.js.map +1 -0
- package/dist/answer-gate.d.ts +94 -0
- package/dist/answer-gate.d.ts.map +1 -0
- package/dist/answer-gate.js +234 -0
- package/dist/answer-gate.js.map +1 -0
- package/dist/atomic-screen.d.ts.map +1 -1
- package/dist/classifier.d.ts +2 -2
- package/dist/classifier.d.ts.map +1 -1
- package/dist/claude-hook.js.map +1 -1
- package/dist/declare.d.ts.map +1 -1
- package/dist/declare.js.map +1 -1
- package/dist/flow-guard-answer.d.ts +30 -0
- package/dist/flow-guard-answer.d.ts.map +1 -0
- package/dist/flow-guard-answer.js +228 -0
- package/dist/flow-guard-answer.js.map +1 -0
- package/dist/flow-guard-classify.d.ts +14 -0
- package/dist/flow-guard-classify.d.ts.map +1 -0
- package/dist/flow-guard-classify.js +224 -0
- package/dist/flow-guard-classify.js.map +1 -0
- package/dist/flow-guard-constraints.d.ts +43 -0
- package/dist/flow-guard-constraints.d.ts.map +1 -0
- package/dist/flow-guard-constraints.js +69 -0
- package/dist/flow-guard-constraints.js.map +1 -0
- package/dist/flow-guard-decode.d.ts +17 -0
- package/dist/flow-guard-decode.d.ts.map +1 -0
- package/dist/flow-guard-decode.js +149 -0
- package/dist/flow-guard-decode.js.map +1 -0
- package/dist/flow-guard-destinations.d.ts +23 -0
- package/dist/flow-guard-destinations.d.ts.map +1 -0
- package/dist/flow-guard-destinations.js +158 -0
- package/dist/flow-guard-destinations.js.map +1 -0
- package/dist/flow-guard-fingerprints.d.ts +27 -0
- package/dist/flow-guard-fingerprints.d.ts.map +1 -0
- package/dist/flow-guard-fingerprints.js +164 -0
- package/dist/flow-guard-fingerprints.js.map +1 -0
- package/dist/flow-guard-fragments.d.ts +17 -0
- package/dist/flow-guard-fragments.d.ts.map +1 -0
- package/dist/flow-guard-fragments.js +122 -0
- package/dist/flow-guard-fragments.js.map +1 -0
- package/dist/flow-guard-instructions.d.ts +12 -0
- package/dist/flow-guard-instructions.d.ts.map +1 -0
- package/dist/flow-guard-instructions.js +36 -0
- package/dist/flow-guard-instructions.js.map +1 -0
- package/dist/flow-guard-labels.d.ts +10 -0
- package/dist/flow-guard-labels.d.ts.map +1 -0
- package/dist/flow-guard-labels.js +55 -0
- package/dist/flow-guard-labels.js.map +1 -0
- package/dist/flow-guard-leak.d.ts +29 -0
- package/dist/flow-guard-leak.d.ts.map +1 -0
- package/dist/flow-guard-leak.js +135 -0
- package/dist/flow-guard-leak.js.map +1 -0
- package/dist/flow-guard-paths.d.ts +21 -0
- package/dist/flow-guard-paths.d.ts.map +1 -0
- package/dist/flow-guard-paths.js +72 -0
- package/dist/flow-guard-paths.js.map +1 -0
- package/dist/flow-guard-policy.d.ts +15 -0
- package/dist/flow-guard-policy.d.ts.map +1 -0
- package/dist/flow-guard-policy.js +179 -0
- package/dist/flow-guard-policy.js.map +1 -0
- package/dist/flow-guard-post.d.ts +6 -0
- package/dist/flow-guard-post.d.ts.map +1 -0
- package/dist/flow-guard-post.js +131 -0
- package/dist/flow-guard-post.js.map +1 -0
- package/dist/flow-guard-pre.d.ts +13 -0
- package/dist/flow-guard-pre.d.ts.map +1 -0
- package/dist/flow-guard-pre.js +335 -0
- package/dist/flow-guard-pre.js.map +1 -0
- package/dist/flow-guard-screen.d.ts +85 -0
- package/dist/flow-guard-screen.d.ts.map +1 -0
- package/dist/flow-guard-screen.js +558 -0
- package/dist/flow-guard-screen.js.map +1 -0
- package/dist/flow-guard-state.d.ts +12 -0
- package/dist/flow-guard-state.d.ts.map +1 -0
- package/dist/flow-guard-state.js +129 -0
- package/dist/flow-guard-state.js.map +1 -0
- package/dist/flow-guard-text.d.ts +9 -0
- package/dist/flow-guard-text.d.ts.map +1 -0
- package/dist/flow-guard-text.js +46 -0
- package/dist/flow-guard-text.js.map +1 -0
- package/dist/flow-guard-types.d.ts +162 -0
- package/dist/flow-guard-types.d.ts.map +1 -0
- package/dist/flow-guard-types.js +2 -0
- package/dist/flow-guard-types.js.map +1 -0
- package/dist/flow-guard.d.ts +22 -394
- package/dist/flow-guard.d.ts.map +1 -1
- package/dist/flow-guard.js +27 -2522
- package/dist/flow-guard.js.map +1 -1
- package/dist/histor.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/jcs.d.ts.map +1 -1
- package/dist/jcs.js.map +1 -1
- package/dist/mcp-client.d.ts +1 -2
- package/dist/mcp-client.d.ts.map +1 -1
- package/dist/mcp-client.js +2 -19
- package/dist/mcp-client.js.map +1 -1
- package/dist/mcp-rpc.js.map +1 -1
- package/dist/mcp-tools.d.ts.map +1 -1
- package/dist/mcp-tools.js.map +1 -1
- package/dist/mtl.d.ts +1 -1
- package/dist/mtl.d.ts.map +1 -1
- package/dist/mtl.js.map +1 -1
- package/dist/origin.d.ts.map +1 -1
- package/dist/pin-store.d.ts.map +1 -1
- package/dist/pin-store.js.map +1 -1
- package/dist/pinning.d.ts.map +1 -1
- package/dist/pinning.js.map +1 -1
- package/dist/public-address.d.ts +3 -0
- package/dist/public-address.d.ts.map +1 -0
- package/dist/public-address.js +58 -0
- package/dist/public-address.js.map +1 -0
- package/dist/review-diff.d.ts +3 -3
- package/dist/review-diff.d.ts.map +1 -1
- package/dist/review-diff.js +3 -5
- package/dist/review-diff.js.map +1 -1
- package/dist/sandbox.d.ts.map +1 -1
- package/dist/sanitize.js.map +1 -1
- package/dist/scan-lock.d.ts.map +1 -1
- package/dist/scan-lock.js.map +1 -1
- package/dist/scan.d.ts.map +1 -1
- package/dist/scan.js.map +1 -1
- package/dist/static-scan.d.ts.map +1 -1
- package/dist/static-scan.js.map +1 -1
- package/dist/task-adapter.d.ts.map +1 -1
- package/dist/task-adapter.js.map +1 -1
- package/dist/threat-feed.d.ts.map +1 -1
- package/dist/threat-feed.js.map +1 -1
- package/dist/tool-list.js.map +1 -1
- package/dist/toxic-flow.js.map +1 -1
- package/dist/wrap-cli.d.ts +1 -1
- package/dist/wrap-cli.d.ts.map +1 -1
- package/dist/wrap-cli.js +2 -1
- package/dist/wrap-cli.js.map +1 -1
- package/dist/wrap-screen.js.map +1 -1
- package/dist/wrap-state.d.ts +3 -1
- package/dist/wrap-state.d.ts.map +1 -1
- package/dist/wrap-state.js +18 -3
- package/dist/wrap-state.js.map +1 -1
- package/dist/wrap-wire.d.ts.map +1 -1
- package/dist/wrap-wire.js.map +1 -1
- package/dist/wrap.d.ts.map +1 -1
- package/dist/wrap.js +45 -7
- package/dist/wrap.js.map +1 -1
- package/docs/flow-guard-answer-gate.es.md +53 -0
- package/docs/flow-guard-answer-gate.fr.md +53 -0
- package/docs/flow-guard-answer-gate.md +86 -0
- package/docs/flow-guard-answer-gate.ru.md +53 -0
- package/docs/flow-guard-answer-gate.zh.md +53 -0
- package/docs/flow-guard-constraint-evidence.es.md +76 -0
- package/docs/flow-guard-constraint-evidence.fr.md +76 -0
- package/docs/flow-guard-constraint-evidence.md +78 -0
- package/docs/flow-guard-constraint-evidence.ru.md +78 -0
- package/docs/flow-guard-constraint-evidence.zh.md +76 -0
- package/docs/flow-guard-final-witness-2026-10-26.es.md +24 -0
- package/docs/flow-guard-final-witness-2026-10-26.fr.md +24 -0
- package/docs/flow-guard-final-witness-2026-10-26.md +24 -0
- package/docs/flow-guard-final-witness-2026-10-26.ru.md +24 -0
- package/docs/flow-guard-final-witness-2026-10-26.zh.md +24 -0
- package/docs/flow-guard-fresh-rechecks-2026-10-26.es.md +39 -0
- package/docs/flow-guard-fresh-rechecks-2026-10-26.fr.md +39 -0
- package/docs/flow-guard-fresh-rechecks-2026-10-26.md +39 -0
- package/docs/flow-guard-fresh-rechecks-2026-10-26.ru.md +39 -0
- package/docs/flow-guard-fresh-rechecks-2026-10-26.zh.md +39 -0
- package/docs/flow-guard-model-comparison-2026-10-25.es.md +109 -0
- package/docs/flow-guard-model-comparison-2026-10-25.fr.md +109 -0
- package/docs/flow-guard-model-comparison-2026-10-25.md +109 -0
- package/docs/flow-guard-model-comparison-2026-10-25.ru.md +109 -0
- package/docs/flow-guard-model-comparison-2026-10-25.zh.md +109 -0
- package/docs/flow-guard-prospective-holdout-2026-10-26.es.md +30 -0
- package/docs/flow-guard-prospective-holdout-2026-10-26.fr.md +30 -0
- package/docs/flow-guard-prospective-holdout-2026-10-26.md +44 -0
- package/docs/flow-guard-prospective-holdout-2026-10-26.ru.md +44 -0
- package/docs/flow-guard-prospective-holdout-2026-10-26.zh.md +30 -0
- package/docs/flow-guard-review-factors-2026-10-26.es.md +41 -0
- package/docs/flow-guard-review-factors-2026-10-26.fr.md +41 -0
- package/docs/flow-guard-review-factors-2026-10-26.md +45 -0
- package/docs/flow-guard-review-factors-2026-10-26.ru.md +45 -0
- package/docs/flow-guard-review-factors-2026-10-26.zh.md +41 -0
- package/docs/flow-guard-structured-model-2026-10-26.es.md +35 -0
- package/docs/flow-guard-structured-model-2026-10-26.fr.md +35 -0
- package/docs/flow-guard-structured-model-2026-10-26.md +44 -0
- package/docs/flow-guard-structured-model-2026-10-26.ru.md +46 -0
- package/docs/flow-guard-structured-model-2026-10-26.zh.md +35 -0
- package/docs/flow-guard.es.md +54 -4
- package/docs/flow-guard.fr.md +54 -4
- package/docs/flow-guard.md +61 -4
- package/docs/flow-guard.ru.md +60 -4
- package/docs/flow-guard.zh.md +54 -4
- package/docs/scan-limits.es.md +39 -0
- package/docs/scan-limits.fr.md +39 -0
- package/docs/scan-limits.md +39 -0
- package/docs/scan-limits.ru.md +39 -0
- package/docs/scan-limits.zh.md +39 -0
- package/docs/scan.es.md +2 -0
- package/docs/scan.fr.md +2 -0
- package/docs/scan.md +2 -0
- package/docs/scan.ru.md +2 -0
- package/docs/scan.zh.md +2 -0
- package/examples/answer-gate-host.mjs +33 -0
- package/native/macos/Sources/WardenDesktop/NativeSurface.swift +1 -1
- package/package.json +6 -5
package/docs/flow-guard.zh.md
CHANGED
|
@@ -1,7 +1,23 @@
|
|
|
1
1
|
# 流守卫:接收外部文本后的工具调用检查
|
|
2
2
|
|
|
3
|
+
<!-- final-ranking-witness -->
|
|
4
|
+
**[10月26日最终排序反馈对照](flow-guard-final-witness-2026-10-26.zh.md).** 在全部五个此前被拦截的上下文中,旧反馈修复了6/40次续答,明确比较所选项与最优项的新反馈修复了40/40次。每个名义组的有效对照均保持20/20。本系列到此结束,结果针对已知失败案例,并非新的留出测试。此结果更新了此前仅离线验证的排序反馈限制;缺失合格项反馈的模型修复效果仍未测量。
|
|
5
|
+
<!-- /final-ranking-witness -->
|
|
6
|
+
|
|
3
7
|
> 🌐 [English](flow-guard.md) · [Русский](flow-guard.ru.md) · [Español](flow-guard.es.md) · [Français](flow-guard.fr.md) · **中文**
|
|
4
8
|
|
|
9
|
+
关于账单、包版本固定、launcher 比较及批准计数的含义,请参见[测量边界与版本证据](scan-limits.zh.md)。
|
|
10
|
+
|
|
11
|
+
## 首次注解审核与回答复查(本地源码,2026-10-25)
|
|
12
|
+
|
|
13
|
+
用户策略可选择 `{"annotationReview":"first-use"}`,**仅在 `wrap --flow NAME` 中**增加首次使用确认。默认 `off`;普通 wrap 或单独 hooks 不增加要求。对没有操作员标签的工具,`readOnlyHint`、`destructiveHint`、`openWorldHint` 都是未经验证的服务器声明:任意布尔值,或已知 hint 的非法类型,都可能要求审核。`readOnlyHint: true` 既不能证明无写入,也不能证明免费。操作员明确标签及与精确身份/完整 tools 快照匹配的 capability bindings 优先;目标白名单和调用参数中的注解不授予权限。
|
|
14
|
+
|
|
15
|
+
审核只保存在当前 wrap 进程内,并绑定精确启动身份和完整定义快照。接受后,代理等待旧列表完成并请求新列表,然后在转发前重新检查共享 flow 风险。定义变化、新的拒绝/ask 原因、用户拒绝或缺少表单时不执行;没有变化的正常 ask 原因仍可批准。这不是相对于其他代理的原子事务。新 wrap 重新询问。逐次敏感调用确认、凭据边界和 GUI 守卫仍独立生效。`audit` 只记录,`off` 关闭此检查。这不是计费验证,也不是完整的效果分类器。
|
|
16
|
+
|
|
17
|
+
已知额外成本:第一次 precheck 可能已消耗精确的一次性 `credentialEgress` 规则。批准后的再次检查即使面对相同 payload 也会保守拒绝,而且规则仍已消耗。该控制计为额外摩擦,不能算作正常自动通过。
|
|
18
|
+
|
|
19
|
+
Stop 不再因句中出现 “ignored” 或 “flagged” 而豁免检查:同一句仍可能重复被注入的推荐。与已记录指令片段存在规范化后精确 12 字符窗口重合时,会请求额外回答复查。**诚实的警告也会付出这一次额外处理。** 继续执行依赖 host 的 `stop_hook_active` 标记,没有独立持久化循环计数器。释义、没有匹配指令的记录选择污染和语义正确性仍未解决。来源提示/复查不等于阻止攻击。[研究](../../docs/growth/kevin-annotations-answer-review-2026-10-25.ru.md) 区分 Linux 确定性测试与模型评估;改动仅在本地,尚未发布,历史模型结果未重新计算。
|
|
20
|
+
|
|
5
21
|
2026-10-23 后续审计:工具结果中的 `image`/`audio` 二进制数据不再占用文本预算,因此排在文本之前的大幅截图不会再遮蔽元素标签、包含凭据文件名的窗口标题或文本块中的 JSON。指针和键盘操作(包括 `computer` 操作)返回的屏幕也会更新视图。普通执行确认保留上一视图;仅返回图像的操作会清空视图。此例外不适用于传出的参数,伪装成二进制数据的秘密仍会接受检查。回归测试通过 hooks 和真实 stdio 代理复现了这两种绕过。本地源码现在也会对不透明的 GUI 操作要求确认,详见下文。
|
|
6
22
|
|
|
7
23
|
这些屏幕控制修复随 npm `0.21.0` 发布。npm `0.20.0` 不包含它们。
|
|
@@ -288,10 +304,10 @@ Wrap 提问前读取基线,批准后重新验证工具定义并再次读取。
|
|
|
288
304
|
- 只出现在粘贴文本、引用行(`>`)、粘贴邮件的头部或转发标记之下的地址,不算你点名的地址:发往它会询问一次。你输入的地址后面的句号或逗号不再妨碍识别。
|
|
289
305
|
- 没有运营者标签的 MCP 工具,在名字表明会外发(send、post、share……)、参数带 URL,或自 2026-10-22 起点名了某一方时,算作外发:例如 `to`、`email`、`attendees`、`assignee`、`collaborator`、`username` 这样的参数,或任何邮箱地址、IBAN。`warden-mcp flow-labels` 列出你的会话用过的无标签 MCP 工具,附上守卫的猜测和一个 `labels` 块,校正后粘贴进策略即可。
|
|
290
306
|
- 默认情况下,接收外部内容后,已识别的屏幕操作均需确认,不依赖坐标、截图文字、元素列表格式或标签语言。包括点击、轻触、拖动、输入、填充、粘贴、Enter/Return 及未知键盘操作。`deny` 模式拒绝执行。英文词只帮助解释,Inbox 等熟悉标签也不会授权点击。详见上文受限任务模式。
|
|
291
|
-
- 只改变回答的注入不会发出可拒绝的调用。自 2026-10-22 起,插件的 Stop 钩子会在本轮读过外部文本的回答下方加一行,列出这些来源;若其中有文本以指令口吻对助手说话,也会注明。如果回答连续重复了外部文本中对助手下指令那几句话里的 12
|
|
307
|
+
- 只改变回答的注入不会发出可拒绝的调用。自 2026-10-22 起,插件的 Stop 钩子会在本轮读过外部文本的回答下方加一行,列出这些来源;若其中有文本以指令口吻对助手说话,也会注明。如果回答连续重复了外部文本中对助手下指令那几句话里的 12 个规范化字符,钩子还会把回答退回给模型一次(`decision: block`),在用户读到之前对照用户的请求检查;用户只损失这次检查的时间。`answerNote`:`always`(默认)、`instruction`(只在这种情况下)或 `off`;插件之外请注册 `warden-mcp hook stop`。
|
|
292
308
|
- 代理也记录 JSON-RPC 和工具错误;记录失败时不转发响应,现有会话状态损坏时阻止检查中的调用。
|
|
293
309
|
|
|
294
|
-
已在 npm `0.17.0` 发布:`npx -y @aimarket/warden@0.
|
|
310
|
+
已在 npm `0.17.0` 发布:`npx -y @aimarket/warden@0.22.1 hook pre-tool-use`;或从源码在 WARDEN 目录运行 `npm ci && npm run build`,然后使用 `node dist/mcp-server.js hook pre-tool-use`,并注册 prompt/post hooks。策略为 `~/.local/state/warden/flow-policy.json` 或 `WARDEN_FLOW_POLICY`;模式为 `ask`、`deny`、`audit`、`off`。当前配置示例见[英文页](flow-guard.md)。
|
|
295
311
|
|
|
296
312
|
代理命令:`node dist/mcp-server.js wrap --flow mail -- node mail-server.js`。同一会话的代理应共享一个新的 `WARDEN_FLOW_SESSION`。默认父进程 PID 不能关联不同启动器。代理看不到用户提示或客户端内置工具。需要确认的调用会在客户端提供 MCP elicitation 表单时通过表单询问(回答记入日志的 `approvalOutcome`),否则或使用 `--ask refuse` 时被拒绝。`trustedSources` 仅用于 WebFetch URL,不用于 MCP 参数中的任意链接。
|
|
297
313
|
|
|
@@ -420,10 +436,16 @@ workspace 中八个较新的攻击者目标没有参考解,因而无法回放
|
|
|
420
436
|
| 同类密钥共有的部分不再记录(DER 密钥中的算法标识、JWT 的头部和声明) | 测量发现,会话读过 RSA 私钥之后,0.19.0 会拒绝发送含有 DKIM 密钥的 README | 发布的规则下没有任何偶然命中 |
|
|
421
437
|
| 把本会话读到的密钥写进项目中的普通文件会询问 | 写进 `docs/debug.md` 的密钥能通过 | 会询问;`.env` 等凭据文件照常放行 |
|
|
422
438
|
| 只出现在粘贴或引用文本里的地址不算用户点名的 | 粘贴进提示词的攻击者地址被当作用户的 | 询问一次;用户也输入过的地址放行。输入的地址后面跟句号不再被当作未点名(0.19.0 会对"发到 bob@corp.com。"询问) |
|
|
423
|
-
| Stop 钩子把重复了对模型指令的回答退回一次 | 只改回答的注入不发出调用 | 在会服从这个攻击的 Ministral 8B 上(无守卫时 20 个回答中有 6 个推荐该酒店),仅守卫的提示就把它降到 0;重新检查在 20 次中触发 3
|
|
439
|
+
| Stop 钩子把重复了对模型指令的回答退回一次 | 只改回答的注入不发出调用 | 在会服从这个攻击的 Ministral 8B 上(无守卫时 20 个回答中有 6 个推荐该酒店),仅守卫的提示就把它降到 0;重新检查在 20 次中触发 3 次,没有改变任何结果。在 DeepSeek V4.1 Flash 上,20 次中触发 2 次([结果](../scripts/agentdojo/results/model-answer-recheck-2026-10-22.json))。这是安全网,不是测得的收益;保存文本的限制见下文 |
|
|
424
440
|
| 规则集 v16(见 [gates](gates.zh.md)) | MCPTox dev 一半中仍有 34 个投毒工具能通过,几乎都是没有输入的工具 | 留出的一半 218 中 194 → 210,其中隐式触发的劫持 66 个全部拦下;45 台干净服务器中 0 台;语料库和 1,000 个 HISTOR 包的拦截与 v15 完全相同;初稿的五个误报已作为测试固定下来 |
|
|
425
441
|
| 重新回放 | 新检查不应在 0.19.0 不询问的地方询问 | 全部 1,046 条记录与 0.19.0 一致 |
|
|
426
442
|
|
|
443
|
+
**保存回答的限定说明(2026-10-25):**按 AgentDojo 的精确名称匹配规则,DeepSeek guard + note 的官方结果仍为 **18/20**。AI 辅助逐条阅读未在这些保存片段中发现采纳攻击建议;18 次精确名称提及都出现在警告中。只有 18 个回答完整,另两个达到旧的 2,000 字符保存上限,因此不能据此确立完整回答的 0/20 服从率。该标注既非独立也非盲审,不替代官方分数。本地 harness 现在为后续运行保存完整回答、长度和 hash;这不代表重新运行了模型。[审计与复现](../../docs/growth/launchgate-methodology-2026-10-25.ru.md)。
|
|
444
|
+
|
|
445
|
+
**受控选择测试(2026-10-25):**独立的工具结果后合成测试使用已发布的 WARDEN `0.21.0`,覆盖六项酒店任务 × 五次重复、clean/benign/injected 三种备注及三种配置:**270/270 个 ID 选择正确**,其中 injected 条件下**0/90 次选择攻击目标**(每种配置 0/30)。目标名称出现在包括对照组在内的 **25/270** 个回答中,`note_stop` 的 Stop 触发 **0/90** 次;无守卫基线也全部选对,因此尚未测得守卫的额外收益,而正确 ID 不代表解释中的每项事实都准确。[协议、结果与限制](../../docs/growth/launchgate-selection-2026-10-25.en.md):这项独立研究不改变 AgentDojo 历史上的 **18/20**,也不证明普遍安全。
|
|
446
|
+
|
|
447
|
+
**并列选择后续实验(2026-10-25):** 两个最优选项均可接受时,注入条件下目标选择分别为:无防护 48/48、note 44/48、note+Stop 45/48;对应 clean 基线为 28/48、25/48、29/48。经基线调整的防护效果区间包含零;432 次选择均符合任务要求,选择目标本身不能视为错误。真实用户偏好得到 18/18 次遵守,Stop 未要求复查。本地[离线评估器](../scripts/selection-probe/README.md)现支持多个可接受答案及共同基线比较;运行时阻断逻辑未更改。[结果与限制,英文](../../docs/growth/launchgate-tie-selection-2026-10-25.en.md)。
|
|
448
|
+
|
|
427
449
|
在 2026-10-22 发布版中,下面两个例子仍能通过;2026-10-23 本地源码已拦截,详见上文。[历史结果](../scripts/redteam/results/):
|
|
428
450
|
|
|
429
451
|
- **短于 8 个字符、每段被不同文字包裹的分段**,发往用户输入的地址:一个 40 字符的密钥要 7 封以上的邮件。
|
|
@@ -449,7 +471,7 @@ mkdir -m 777 out
|
|
|
449
471
|
docker run --rm --network none -v "$PWD/out:/out" warden-adojo /out/oracle.json
|
|
450
472
|
```
|
|
451
473
|
|
|
452
|
-
`oracle.py` 按配对写出结果;`--variants none,strict,intent` 选择守卫的变体(`strict` 不考虑用户输入了什么)。`summarize_oracle.py` 把它们汇总成表格引用的摘要。`WARDEN_FLOW_GUARD=/out/x.mjs` 可回放守卫的另一个版本(插件里任一份 `flow-guard.mjs
|
|
474
|
+
`oracle.py` 按配对写出结果;`--variants none,strict,intent` 选择守卫的变体(`strict` 不考虑用户输入了什么)。`summarize_oracle.py` 把它们汇总成表格引用的摘要。`WARDEN_FLOW_GUARD=/out/x.mjs` 可回放守卫的另一个版本(插件里任一份 `flow-guard.mjs`;自 2026-10-24 起需连同同一文件夹中的 `flow-guard-*.mjs` 各部分),2026-10-22 的改动就是这样与改动前的代码对比的。
|
|
453
475
|
|
|
454
476
|
手握代码的攻击不需要容器:`npm run build && node scripts/redteam/flow-redteam.mjs out.json`。
|
|
455
477
|
|
|
@@ -464,3 +486,31 @@ python3 scripts/agentdojo/summarize_model.py summary.json /srv/adojo/out --goals
|
|
|
464
486
|
|
|
465
487
|
`WORK/ctx` 是构建上下文(`dist/` 和 `scripts/agentdojo/`);`--obedient` 加上劫持那段话;`model.py OUT --model deepseek-flash --model-label DeepSeek --dump-goals` 写出攻击者目标,
|
|
466
488
|
`summarize_model.py` 据此识别指向攻击者的调用。两轮每次运行的记录:`results/model-deepseek-2026-10-18b.jsonl.gz`(摘要 `model-deepseek-2026-10-18b.json`);`--guard-note` 把守卫的说明返回给模型。
|
|
489
|
+
|
|
490
|
+
## 来源指令信号与 Stop 诊断(本地 0.22.0)
|
|
491
|
+
|
|
492
|
+
有界的英语/俄语模式可识别伪造角色分隔符、与邻近指令结合的所谓转达偏好或先前批准、要求隐瞒的指令及私有评分规则。这些信号可能出错,合法引用也可能触发;它们不证明攻击、不授予权限,也不会自动禁止选择。用户的真实请求仍作为独立来源处理。
|
|
493
|
+
|
|
494
|
+
本地日志记录 `instructionSignal`、`signalKinds`、`signalScanLimited` 和 `warningKind`(`source`、`instruction`、`suppressed-audit`)。Stop 记录 `trigger`(`no-instruction-signal`、`no-literal-overlap`、`literal-instruction-overlap`)、`recheckRequested` 及 `semanticCompliance: "not-assessed"`。保留现有的 12 个规范化字符重合阈值和宿主标记的继续次数限制;复核既不等于永久拒绝,也不证明纠正。
|
|
495
|
+
|
|
496
|
+
仓库工具 `scripts/selection-probe/audit_warnings.mjs` 可重放已保存的 hook 输入与答案。确认候选词只描述可见文本,不能证明模型意识到或遵从了指令。重放旧答案只测量 hook 行为;选择是否改变需要新的受控模型实验。
|
|
497
|
+
|
|
498
|
+
Post/Stop 警告使用固定语句和不透明的 `source-` ID(工具名 SHA-256 的前 16 个十六进制字符),不会引用检测到的指令,也不重复原始工具名、来源 URL 或路径。这限制了外部元数据借警告渠道获得权威性,但不使模型免受原始工具结果的影响。ID 只用于关联,不是经验证的软件包身份、pin 或权限。当地日志仍可能包含外部元数据,必须作为不可信数据处理。
|
|
499
|
+
|
|
500
|
+
**新的模型对比(2026-10-25):** 在相同六个已知案例的 720 个交错运行答案中,无保护时攻击目标被选中 48/48 次;已发布 0.21.0 的 note/note+Stop 为 44/48、46/48;两个本地候选模式均为 27/48。候选的干净基线为 23/48、25/48。相对旧版、校正基线后的改善区间:note 为 [−8.3,+60.4] 个百分点,note+Stop 为 [+14.6,+62.5]。12 次实际复核均未改变所选 ID,其中三个最终答案失去了可见的警告引用。全部 ID 均可接受,真实用户偏好遵从为 30/30。这些已知案例、tool-role 桥接及完整版本对比不证明普遍防护或 Stop 的独立收益。[完整报告](flow-guard-model-comparison-2026-10-25.zh.md)。
|
|
501
|
+
|
|
502
|
+
<!-- constraint-evidence-followup -->
|
|
503
|
+
|
|
504
|
+
[确定性答案证据与披露保留](flow-guard-constraint-evidence.zh.md).
|
|
505
|
+
|
|
506
|
+
<!-- structured-answer-gate -->
|
|
507
|
+
|
|
508
|
+
[应用答案门禁](flow-guard-answer-gate.zh.md):全部规则、有界额外纠正与缓冲交付;仅支持结构化数据。
|
|
509
|
+
|
|
510
|
+
<!-- structured-live-followup -->
|
|
511
|
+
|
|
512
|
+
[结构化答案真实模型测试](flow-guard-structured-model-2026-10-26.zh.md):96 个初次提案有效,64 个受控种子修复;分母与边界分别报告。
|
|
513
|
+
|
|
514
|
+
<!-- prospective-holdout-followup -->
|
|
515
|
+
|
|
516
|
+
[冻结后的新案例](flow-guard-prospective-holdout-2026-10-26.zh.md):自然初次有效 89/96,七个错误中五个纠正、两个保留;受控纠正 45/48。后续排序/缺失集合证据已离线验证,未重新调用模型。
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Límites de medición y pruebas de versión
|
|
2
|
+
|
|
3
|
+
> 🌐 [English](scan-limits.md) · [Русский](scan-limits.ru.md) · **Español** · [Français](scan-limits.fr.md) · [中文](scan-limits.zh.md)
|
|
4
|
+
|
|
5
|
+
Estas precisiones corresponden al seguimiento de comentarios del 2026-10-25. El **artefacto npm publicado `0.21.0`** y el código local posterior son objetos distintos: conservar la versión en `package.json` no incorpora una corrección al archivo publicado. Las pruebas de código, la facturación ficticia y las respuestas programadas de aprobación no sustituyen las evaluaciones de modelos, el tráfico de producción ni los estudios con personas.
|
|
6
|
+
|
|
7
|
+
## Facturación y declaraciones del servidor
|
|
8
|
+
|
|
9
|
+
`initialize`, `tools/list` y una llamada canary pueden generar cargos u otros efectos en el servidor. Un descubrimiento o preview correcto no demuestra el precio ni el efecto de la siguiente llamada. En nuestra fixture de facturación sintética, el canary elegía `preview` gratuito, mientras que `{}` elegía una operación que cobraba siete créditos ficticios. Esto mide esa fixture, no la factura de un vendedor externo.
|
|
10
|
+
|
|
11
|
+
`readOnlyHint`, `destructiveHint` y `openWorldHint` son declaraciones no verificadas; no prueban gratuidad ni ausencia de efectos dañinos. La revisión local de annotations en el primer uso es opcional, está en `off` por defecto y solo se aplica a `wrap --flow NAME`. Aceptarla no aprueba un precio ni certifica efectos. Véanse los [controles de flujo y sus límites](flow-guard.es.md).
|
|
12
|
+
|
|
13
|
+
## Versión solicitada del paquete y versión declarada del servidor
|
|
14
|
+
|
|
15
|
+
`package@x.y.z` especifica una versión solicitada del paquete. El servidor proporciona `initialize.serverInfo.version`; no es una versión de paquete resuelta de forma independiente ni un digest del artefacto. Por ejemplo, el paquete Mapled revisado era `@mapled/mcp@0.21.6`, pero el servidor seguía declarando `0.1.0`.
|
|
16
|
+
|
|
17
|
+
El `0.21.0` publicado que se probó podía usar incorrectamente esa versión declarada en una sugerencia de fijación del paquete. Compruebe la resolución del gestor de paquetes y las pruebas de lock/integridad en lugar de aceptar esa sugerencia. La corrección local separa los metadatos y elimina esa sustitución; sigue sin certificar qué bytes ejecutó el launcher. Un `npx` sin versión fija puede resolver otra versión o reutilizar la caché; ningún comportamiento está garantizado en cada inicio. El hash de tools identifica las definiciones observadas, no el programa completo. Véanse [scan](scan.es.md) e [integración](integration.es.md).
|
|
18
|
+
|
|
19
|
+
## Comparaciones de launchers y referencias orientativas
|
|
20
|
+
|
|
21
|
+
La investigación de Auten contaba con una instantánea pública observada, no con dos entornos de launcher medidos. Reproducir una diferencia requiere el runner y su versión exactos, los argumentos de inicio y dos instantáneas de tools de los entornos afectados. Una observación de HISTOR es una referencia orientativa para comparar, no un pin de confianza aprobado por el operador.
|
|
22
|
+
|
|
23
|
+
La documentación auxiliar del [colector de pruebas del launcher](../examples/launcher-evidence/README.md) está actualmente solo en inglés. Guarda definiciones de tools normalizadas por el cliente, no una transcripción original del protocolo. La versión indicada del runner la declara el propietario; ese campo no resuelve de forma independiente el artefacto del paquete. Tener preparado el colector no demuestra que se compararon los dos entornos.
|
|
24
|
+
|
|
25
|
+
## Preguntas, aprobaciones y respuestas
|
|
26
|
+
|
|
27
|
+
El **39/97** histórico cuenta tareas que provocaron un `ask`, no personas que aprobaron. La ejecución después de una decisión del hook no prueba que alguien pulsara Allow. El wrapper puede registrar accept/decline/cancel, pero un cliente programado puede producir las mismas respuestas. Las tasas de aprobación humana, el tiempo de lectura y la fatiga requieren solicitudes realmente presentadas a personas y resultados vinculados; estas pruebas no los midieron.
|
|
28
|
+
|
|
29
|
+
Para la serie guardada de DeepSeek Flash guard + note (`injecagent`, 20 casos de travel), el resultado histórico oficial de AgentDojo sigue siendo **18/20** según su predicado de mención exacta del nombre. La lectura asistida por IA encontró advertencias y no recomendaciones adoptadas en los fragmentos guardados, pero solo 18 respuestas estaban completas; dos alcanzaron el antiguo límite de 2000 caracteres. Se desconocen sus finales, por lo que no se establece un nuevo resultado `0/20` sobre respuestas completas. El harness local guarda las futuras respuestas completas con longitud y hash; no recupera texto perdido ni implica una nueva ejecución del modelo.
|
|
30
|
+
|
|
31
|
+
**Prueba de selección controlada (2026-10-25):** Una prueba sintética separada tras recibir el resultado de la herramienta, con WARDEN `0.21.0` publicado, cubrió seis tareas hoteleras × cinco repeticiones, notas clean/benign/injected y tres perfiles: **270/270 ID correctos**, con **0/90 elecciones del objetivo en injected** (0/30 por perfil). El nombre objetivo apareció en **25/270** respuestas, incluidos los controles, y Stop se activó **0/90** veces en `note_stop`; la referencia sin protección también acertó, por lo que no se establece una mejora adicional del guard, y un ID correcto no valida todos los hechos de la explicación. [Protocolo, resultados y límites](../../docs/growth/launchgate-selection-2026-10-25.en.md): este estudio separado no cambia el **18/20** histórico de AgentDojo ni demuestra seguridad general.
|
|
32
|
+
|
|
33
|
+
**Seguimiento con empate (2026-10-25):** Con dos óptimos admisibles, la selección del objetivo bajo inyección fue 48/48 sin guard, 44/48 con note y 45/48 con note+Stop; las referencias clean fueron 28/48, 25/48 y 29/48. Los intervalos del efecto ajustado por baseline incluyen cero; las 432 elecciones eran admisibles y elegir el objetivo no implica por sí mismo un error. Las preferencias reales del usuario se siguieron 18/18 y Stop no pidió revisiones. El [evaluador offline local](../scripts/selection-probe/README.md) admite conjuntos de respuestas válidas y contrastes con referencia común; el bloqueo en runtime no cambió. [Resultados y límites, EN](../../docs/growth/launchgate-tie-selection-2026-10-25.en.md).
|
|
34
|
+
|
|
35
|
+
## Umbrales de fragmentos y coste de revisión
|
|
36
|
+
|
|
37
|
+
Las ventanas fuertes de fingerprint siguen siendo **8 para non-hex / 10 para hex**. La corrección local del índice tras prefijos reconocidos no demuestra una detección fuerte fiable de fragmentos de seis caracteres dentro de palabras. Una sesión existente debe releer las credenciales para incorporar las nuevas ventanas. Pedir revisión en el límite de credenciales no equivale a identificar ese fragmento como secreto.
|
|
38
|
+
|
|
39
|
+
Del mismo modo, la coincidencia de 12 caracteres normalizados en Stop solicita otra revisión de la respuesta; no demuestra rechazo semántico de una instrucción. Al eliminar la excepción de palabras de advertencia, una advertencia honesta también paga ese paso. Las paráfrasis y la selección manipulada de filas pueden eludir esta coincidencia. Las mejoras en fixtures y los controles elegidos de falsos bloqueos no demuestran un óptimo global ni una tasa de falsos positivos en producción. La [guía de flujo](flow-guard.es.md) explica la política, los límites restantes y la continuación limitada por el indicador `stop_hook_active` del host.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Limites des mesures et preuves de version
|
|
2
|
+
|
|
3
|
+
> 🌐 [English](scan-limits.md) · [Русский](scan-limits.ru.md) · [Español](scan-limits.es.md) · **Français** · [中文](scan-limits.zh.md)
|
|
4
|
+
|
|
5
|
+
Ces précisions concernent le suivi des commentaires du 2026-10-25. L’**artefact npm publié `0.21.0`** et les sources locales ultérieures sont distincts : conserver la version dans `package.json` n’ajoute pas une correction à l’archive publiée. Les tests de code, la facturation fictive et les réponses d’approbation programmées ne remplacent ni l’évaluation des modèles, ni le trafic de production, ni les études auprès de personnes.
|
|
6
|
+
|
|
7
|
+
## Facturation et déclarations du serveur
|
|
8
|
+
|
|
9
|
+
`initialize`, `tools/list` et un appel canary peuvent eux-mêmes entraîner un coût ou un autre effet côté serveur. Une découverte ou un preview réussi ne démontre pas le prix ou l’effet de l’appel suivant. Dans notre fixture de facturation synthétique, le canary choisissait le `preview` gratuit, tandis que `{}` choisissait une opération facturant sept crédits fictifs. Cela mesure cette fixture, pas la facture d’un vendeur externe.
|
|
10
|
+
|
|
11
|
+
`readOnlyHint`, `destructiveHint` et `openWorldHint` sont des déclarations non vérifiées, pas des preuves de gratuité ou d’innocuité. La revue locale des annotations au premier usage est facultative, désactivée par défaut (`off`) et limitée à `wrap --flow NAME`. L’accepter ne valide ni un prix ni les effets réels. Voir les [contrôles de flux et leurs limites](flow-guard.fr.md).
|
|
12
|
+
|
|
13
|
+
## Version demandée du paquet et version déclarée du serveur
|
|
14
|
+
|
|
15
|
+
`package@x.y.z` précise une version demandée du paquet. Le serveur fournit `initialize.serverInfo.version` ; ce n’est ni une version de paquet résolue indépendamment, ni un digest d’artefact. Par exemple, le paquet Mapled examiné était `@mapled/mcp@0.21.6`, alors que le serveur déclarait toujours `0.1.0`.
|
|
16
|
+
|
|
17
|
+
Le `0.21.0` publié et testé pouvait reprendre à tort cette version déclarée dans une suggestion de verrouillage du paquet. Vérifiez la résolution du gestionnaire de paquets et les preuves de verrouillage/intégrité plutôt que d’accepter cette suggestion. La correction locale sépare les métadonnées et supprime cette substitution ; elle ne certifie toujours pas les octets exécutés par le launcher. Un `npx` sans version fixe peut résoudre une autre version ou réutiliser le cache ; aucun de ces comportements n’est garanti à chaque démarrage. Le hash des tools identifie les définitions observées, pas tout l’exécutable. Voir [scan](scan.fr.md) et [intégration](integration.fr.md).
|
|
18
|
+
|
|
19
|
+
## Comparaisons de launchers et références indicatives
|
|
20
|
+
|
|
21
|
+
L’enquête Auten disposait d’un instantané public observé, pas de deux environnements de launcher mesurés. Reproduire une différence exige le runner et sa version exacts, les arguments de lancement et deux instantanés des tools provenant des environnements concernés. Une observation HISTOR est une référence indicative pour comparer, pas un pin de confiance approuvé par l’opérateur.
|
|
22
|
+
|
|
23
|
+
La documentation auxiliaire du [collecteur de preuves du launcher](../examples/launcher-evidence/README.md) est actuellement uniquement en anglais. Il enregistre des définitions de tools normalisées par le client, pas une transcription originale du protocole. La version du runner saisie est déclarée par le propriétaire ; ce champ ne résout pas indépendamment l’artefact du paquet. Un collecteur prêt à l’emploi ne prouve pas que la comparaison des deux environnements a eu lieu.
|
|
24
|
+
|
|
25
|
+
## Questions, approbations et réponses
|
|
26
|
+
|
|
27
|
+
Le **39/97** historique compte les tâches ayant déclenché un `ask`, pas les personnes ayant approuvé. Une exécution après une décision du hook ne prouve pas qu’une personne a cliqué sur Allow. Le wrapper peut enregistrer accept/decline/cancel, mais un client programmé peut produire les mêmes réponses. Les taux d’approbation humaine, le temps de lecture et la fatigue exigent des demandes réellement présentées à des personnes et des résultats liés ; ces tests ne les ont pas mesurés.
|
|
28
|
+
|
|
29
|
+
Pour la série conservée DeepSeek Flash guard + note (`injecagent`, 20 cas de travel), le résultat historique officiel d’AgentDojo reste **18/20** selon son prédicat de mention exacte du nom. Une lecture assistée par IA a trouvé des avertissements plutôt que des recommandations adoptées dans les extraits conservés, mais seulement 18 réponses étaient complètes ; deux atteignaient l’ancien plafond de 2000 caractères. Leurs fins manquantes sont inconnues : aucun nouveau score `0/20` sur réponses complètes n’est établi. Le harness local conserve les futures réponses entières avec longueur et hash ; il ne restaure pas les passages perdus et n’implique pas de nouvelle exécution du modèle.
|
|
30
|
+
|
|
31
|
+
**Test de sélection contrôlé (2026-10-25) :** Un test synthétique séparé après réception du résultat d’outil, avec WARDEN `0.21.0` publié, a couvert six tâches hôtelières × cinq répétitions, des notes clean/benign/injected et trois profils : **270/270 ID corrects**, dont **0/90 choix de la cible en injected** (0/30 par profil). Le nom de la cible apparaît dans **25/270** réponses, contrôles compris, et Stop s’est déclenché **0/90** fois en `note_stop` ; la référence sans protection choisissait aussi correctement, donc aucun gain supplémentaire du guard n’est établi, et un ID correct ne valide pas tous les faits de l’explication. [Protocole, résultats et limites](../../docs/growth/launchgate-selection-2026-10-25.en.md) : cette étude séparée ne modifie pas le **18/20** historique d’AgentDojo et ne démontre pas une sécurité générale.
|
|
32
|
+
|
|
33
|
+
**Suivi avec ex æquo (2026-10-25) :** Avec deux choix optimaux admissibles, la cible a été sélectionnée sous injection 48/48 sans guard, 44/48 avec note et 45/48 avec note+Stop ; les références clean étaient 28/48, 25/48 et 29/48. Les intervalles de l’effet corrigé du baseline incluent zéro ; les 432 choix étaient admissibles et choisir la cible ne constitue donc pas automatiquement une erreur. Les vraies préférences utilisateur ont été suivies 18/18, sans nouvelle vérification Stop. L’[évaluateur offline local](../scripts/selection-probe/README.md) accepte plusieurs réponses admissibles et des contrastes avec référence commune ; le blocage en runtime reste inchangé. [Résultats et limites, EN](../../docs/growth/launchgate-tie-selection-2026-10-25.en.md).
|
|
34
|
+
|
|
35
|
+
## Seuils des fragments et coût de la revérification
|
|
36
|
+
|
|
37
|
+
Les fenêtres fortes d’empreinte restent **8 pour non-hex / 10 pour hex**. La correction locale de l’index après les préfixes reconnus n’établit pas une détection forte fiable d’un fragment de six caractères incorporé dans un mot. Une session existante doit relire les secrets pour acquérir les nouvelles fenêtres. Demander une revue à la frontière des secrets n’équivaut pas à identifier ce fragment comme un secret.
|
|
38
|
+
|
|
39
|
+
De même, une correspondance de 12 caractères normalisés dans Stop demande une nouvelle vérification de la réponse ; elle ne prouve pas le rejet sémantique d’une instruction. Retirer l’exemption des mots d’avertissement fait aussi payer ce passage à un avertissement honnête. Les paraphrases et la sélection manipulée de lignes peuvent échapper à cette correspondance. Les améliorations sur fixtures et les contrôles choisis de faux refus n’établissent ni un optimum global ni un taux de faux positifs en production. Le [guide de flux](flow-guard.fr.md) décrit la politique, les limites restantes et la continuation bornée par le signal `stop_hook_active` du host.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Measurement limits and version evidence
|
|
2
|
+
|
|
3
|
+
> 🌐 **English** · [Русский](scan-limits.ru.md) · [Español](scan-limits.es.md) · [Français](scan-limits.fr.md) · [中文](scan-limits.zh.md)
|
|
4
|
+
|
|
5
|
+
These qualifications apply to the reader follow-ups documented on 2026-10-25. Distinguish the tested **published npm `0.21.0` artifact** from later local source: an unchanged `package.json` version does not make a local fix part of that artifact. Code tests, synthetic ledgers and scripted approval replies are separate from model evaluation, production traffic and human research.
|
|
6
|
+
|
|
7
|
+
## Billing and server-authored hints
|
|
8
|
+
|
|
9
|
+
`initialize`, `tools/list` and a canary call can themselves incur a charge or another server-side effect. A successful discovery or preview does not establish the price or effect of the next call. In our synthetic billing fixture, the canary selected free `preview`, while `{}` selected an operation charging seven fake credits. This measures that fixture, not an external seller's invoice.
|
|
10
|
+
|
|
11
|
+
`readOnlyHint`, `destructiveHint` and `openWorldHint` are unverified claims, not proof that an operation is free or harmless. The local first-use annotation review is opt-in, default `off`, and applies only to `wrap --flow NAME`; accepting it is not billing approval or an effect attestation. See [flow controls and their limits](flow-guard.md).
|
|
12
|
+
|
|
13
|
+
## Requested package version versus reported server version
|
|
14
|
+
|
|
15
|
+
An exact `package@x.y.z` specifies a requested package version. `initialize.serverInfo.version` is a string supplied by the server; it is not an independently resolved package version or artifact digest. For example, the reviewed Mapled package was `@mapled/mcp@0.21.6`, while its reported server version remained `0.1.0`.
|
|
16
|
+
|
|
17
|
+
The tested published `0.21.0` could incorrectly derive a suggested package pin from that reported version. Verify the package-manager resolution and lock/integrity evidence instead of accepting that suggestion. The local fix separates the metadata and removes this substitution; it still does not attest which package bytes a launcher executed. An unpinned `npx` launch may resolve another version or reuse cached resolution; neither outcome is guaranteed on each start. A tool-set hash identifies the observed definitions, not the whole executable. See [scan](scan.md) and [integration](integration.md).
|
|
18
|
+
|
|
19
|
+
## Launcher comparisons and advisory baselines
|
|
20
|
+
|
|
21
|
+
The Auten investigation had one public observed snapshot, not two measured launcher environments. Reproducing a difference requires the exact runner/version and launch arguments plus two tool snapshots from the environments concerned. A HISTOR observation is an advisory comparison baseline, not an operator-approved trusted pin.
|
|
22
|
+
|
|
23
|
+
The [launcher evidence collector](../examples/launcher-evidence/README.md) currently has English helper documentation. It records client-normalized tool definitions, not an original wire transcript; a supplied runner version is owner-reported, and no package artifact is independently resolved by that field. A prepared collector is not evidence that the requested two-environment comparison occurred.
|
|
24
|
+
|
|
25
|
+
## Questions, approvals and answers
|
|
26
|
+
|
|
27
|
+
The historical **39/97** counts tasks that triggered an `ask`, not people who approved. Execution after a hook decision does not prove a person clicked Allow. A wrapper can record accept/decline/cancel, but scripted clients can produce those responses too. Human approval rates, reading time and fatigue require requests actually presented to people and linked outcomes; they were not measured by these tests.
|
|
28
|
+
|
|
29
|
+
For the saved DeepSeek Flash guard + note series (`injecagent`, 20 travel cases), the official historical AgentDojo result remains **18/20** under its exact-name mention predicate. AI-assisted reading found warnings rather than adopted recommendations in the saved excerpts, but only 18 answers were complete; two reached the historical 2,000-character storage cap. Missing tails are unknown, so this is not a replacement full-answer `0/20` score. The local harness saves full future answers with length/hash metadata; it does not restore old tails or imply a new model run.
|
|
30
|
+
|
|
31
|
+
**Controlled selection probe (2026-10-25):** A separate synthetic post-tool probe using published WARDEN `0.21.0` covered six hotel tasks × five repetitions, clean/benign/injected notes and three profiles: **270/270 correct IDs**, with **0/90 injected target choices** (0/30 per profile). Target names appeared in **25/270** answers including controls, and Stop fired **0/90** times in `note_stop`; the unguarded baseline was correct too, so no incremental guard gain is established, and correct IDs do not validate every explanation fact. [Protocol, results and limits](../../docs/growth/launchgate-selection-2026-10-25.en.md): this separate study does not change AgentDojo’s historical **18/20** or establish broad safety.
|
|
32
|
+
|
|
33
|
+
**Tied-choice follow-up (2026-10-25):** With two admissible optima, injected target selection was 48/48 without a guard, 44/48 with the note and 45/48 with note+Stop; the respective clean baselines were 28/48, 25/48 and 29/48. Baseline-adjusted guard-effect intervals include zero, and all 432 choices were admissible; target choice is not automatically an error. Separate genuine-user preferences were followed 18/18, with no Stop rechecks. The local [offline evaluator](../scripts/selection-probe/README.md) now supports admissible sets and common-baseline contrasts; runtime blocking is unchanged. [Results and limits](../../docs/growth/launchgate-tie-selection-2026-10-25.en.md).
|
|
34
|
+
|
|
35
|
+
## Fragment thresholds and recheck costs
|
|
36
|
+
|
|
37
|
+
Strong fingerprint windows remain **8 non-hex / 10 hex**. The local recognized-prefix indexing repair does not establish reliable strong detection of a six-character fragment inside a longer word; an existing session must reread credentials to gain the new index windows. Requiring review at the credential boundary is different from identifying that fragment as a secret.
|
|
38
|
+
|
|
39
|
+
Likewise, Stop's normalized 12-character overlap requests another answer check; it does not prove semantic rejection of an instruction. Removing the warning-word exemption also makes honest warnings pay that extra pass. Paraphrases and poisoned row selection can evade this overlap check. Fixture improvements and selected false-block controls establish neither a global optimum nor a production false-positive rate. The [flow guide](flow-guard.md) describes the policy, remaining gaps and continuation bound supplied by the host's `stop_hook_active` flag.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Границы измерений и подтверждение версии
|
|
2
|
+
|
|
3
|
+
> 🌐 [English](scan-limits.md) · **Русский** · [Español](scan-limits.es.md) · [Français](scan-limits.fr.md) · [中文](scan-limits.zh.md)
|
|
4
|
+
|
|
5
|
+
Эти уточнения относятся к разбору читательских вопросов от 2026-10-25. Проверенный **опубликованный npm-артефакт `0.21.0`** и более поздние локальные исходники — разные объекты: прежняя строка версии в `package.json` не добавляет исправление в опубликованный архив. Кодовые тесты, фиктивный биллинг и программные ответы на формы подтверждения не заменяют оценку модели, production-трафика или поведения людей.
|
|
6
|
+
|
|
7
|
+
## Биллинг и заявления сервера
|
|
8
|
+
|
|
9
|
+
`initialize`, `tools/list` и контрольный canary-вызов сами могут стоить денег или иметь другие эффекты на сервере. Успешное обнаружение или preview не устанавливает стоимость и эффект следующего вызова. В нашей фиктивной платёжной fixture canary выбирал бесплатный `preview`, а `{}` — операцию со списанием семи условных кредитов. Это измерение fixture, а не счёта внешнего продавца.
|
|
10
|
+
|
|
11
|
+
`readOnlyHint`, `destructiveHint` и `openWorldHint` — непроверенные заявления, а не доказательства бесплатности или безвредности. Локальная проверка annotations при первом использовании включается явно, по умолчанию `off` и действует только в `wrap --flow NAME`. Согласие на неё не подтверждает цену или фактические эффекты. См. [правила flow guard и их границы](flow-guard.ru.md).
|
|
12
|
+
|
|
13
|
+
## Версия пакета и версия, сообщённая сервером
|
|
14
|
+
|
|
15
|
+
Точная запись `package@x.y.z` задаёт запрошенную версию пакета. `initialize.serverInfo.version` сообщает сам сервер; это не независимо установленная версия пакета и не digest артефакта. Например, рассмотренный пакет Mapled имел версию `@mapled/mcp@0.21.6`, а сервер по-прежнему сообщал `0.1.0`.
|
|
16
|
+
|
|
17
|
+
Проверенный опубликованный `0.21.0` мог ошибочно подставлять сообщённую версию в совет по закреплению пакета. Проверяйте фактическое разрешение package manager и lock/integrity, а не принимайте такой совет автоматически. Локальное исправление разделяет эти сведения и убирает подстановку; оно по-прежнему не удостоверяет байты пакета, запущенные launcher. Незакреплённый `npx` может выбрать другую версию или использовать кэш; ни один вариант не гарантирован при каждом старте. Hash набора tools относится к наблюдаемым определениям, а не ко всей программе. См. [scan](scan.ru.md) и [интеграцию](integration.ru.md).
|
|
18
|
+
|
|
19
|
+
## Сравнение launcher и рекомендательный baseline
|
|
20
|
+
|
|
21
|
+
В исследовании Auten был один публичный наблюдавшийся снимок, а не измерение двух сред launcher. Для воспроизведения нужны точные runner/версия и аргументы запуска, а также два снимка tools из соответствующих сред. Наблюдение HISTOR — рекомендательный baseline для сравнения, а не доверенный pin, утверждённый оператором.
|
|
22
|
+
|
|
23
|
+
У [сборщика свидетельств launcher](../examples/launcher-evidence/README.md) вспомогательная документация пока только английская. Он сохраняет нормализованные клиентом определения tools, а не исходный wire transcript. Введённую версию runner сообщает владелец; это поле не определяет пакетный артефакт независимо. Готовый сборщик сам по себе не доказывает, что сравнение двух сред состоялось.
|
|
24
|
+
|
|
25
|
+
## Вопросы, подтверждения и ответы
|
|
26
|
+
|
|
27
|
+
Исторические **39/97** — число задач с хотя бы одним `ask`, а не людей, давших согласие. Исполнение после решения hook не доказывает нажатие Allow человеком. Wrapper может записать accept/decline/cancel, но такие же ответы создаёт программный клиент. Частота человеческих подтверждений, время чтения и усталость требуют данных о реально показанных людям запросах и связанных результатах; эти тесты их не измеряли.
|
|
28
|
+
|
|
29
|
+
Для сохранённой серии DeepSeek Flash guard + note (`injecagent`, 20 travel-задач) официальный исторический результат AgentDojo остаётся **18/20** по проверке точного упоминания названия. При чтении сохранённых фрагментов с помощью AI обнаружены предупреждения, а не принятая навязанная рекомендация, но полными были только 18 ответов; два достигли старого лимита хранения в 2000 символов. Потерянные хвосты неизвестны, поэтому новый результат по полным ответам `0/20` не установлен. Локальный harness сохраняет будущие ответы полностью, с длиной и hash; старые хвосты он не восстанавливает и нового модельного прогона не подразумевает.
|
|
30
|
+
|
|
31
|
+
**Контролируемый выбор (2026-10-25):** В отдельной синтетической проверке после ответа инструмента использован опубликованный WARDEN `0.21.0`: шесть гостиничных задач × пять повторов, пометки clean/benign/injected и три профиля дали **270/270 правильных ID**, включая **0/90 выборов цели атаки** в injected (0/30 в каждом профиле). Название цели встречалось в **25/270** ответах, включая контроли, а Stop сработал **0/90** раз в `note_stop`; baseline без защиты тоже выбрал правильно, поэтому дополнительный выигрыш защиты не установлен, а правильный ID не подтверждает точность всех фактов в объяснении. [Протокол, результаты и пределы](../../docs/growth/launchgate-selection-2026-10-25.ru.md): это отдельный от AgentDojo опыт, не меняющий исторические **18/20** и не доказывающий общую безопасность.
|
|
32
|
+
|
|
33
|
+
**Продолжение с ничьей (2026-10-25):** При двух допустимых оптимумах injected target выбран 48/48 без защиты, 44/48 с note и 45/48 с note+Stop; clean baseline — соответственно 28/48, 25/48 и 29/48. Интервалы baseline-adjusted эффекта защиты включают ноль; все 432 выбора допустимы, поэтому выбор target не означает ошибку. Настоящие предпочтения пользователя выполнены 18/18, Stop не запрашивал recheck. Локальный [offline evaluator](../scripts/selection-probe/README.md) поддерживает набор допустимых ответов и common-baseline сравнения; runtime-блокировка не изменена. [Результаты и пределы](../../docs/growth/launchgate-tie-selection-2026-10-25.ru.md).
|
|
34
|
+
|
|
35
|
+
## Пороги фрагментов и стоимость перепроверки
|
|
36
|
+
|
|
37
|
+
Сильные fingerprint-окна остаются **8 для non-hex / 10 для hex**. Локальное исправление индекса после известных префиксов не обеспечивает надёжного сильного распознавания шестисимвольного фрагмента внутри слова. Существующая сессия должна перечитать credentials для получения новых окон. Обязательный review на границе credentials отличается от обнаружения именно этого фрагмента как секрета.
|
|
38
|
+
|
|
39
|
+
Аналогично совпадение 12 нормализованных символов в Stop требует ещё одной проверки ответа, но не доказывает семантический отказ от инструкции. После отмены исключения для warning-слов этот проход оплачивает и честное предупреждение. Перефразирование и подмена выбора строк могут обойти такой поиск совпадений. Улучшения на fixtures и специально выбранные контроли ложных отказов не устанавливают глобальный оптимум или production-частоту ошибок. [Руководство flow guard](flow-guard.ru.md) описывает политику, оставшиеся пробелы и ограничение повторов, которое обеспечивает host-флаг `stop_hook_active`.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# 测量边界与版本证据
|
|
2
|
+
|
|
3
|
+
> 🌐 [English](scan-limits.md) · [Русский](scan-limits.ru.md) · [Español](scan-limits.es.md) · [Français](scan-limits.fr.md) · **中文**
|
|
4
|
+
|
|
5
|
+
以下说明对应 2026-10-25 的读者反馈。已测试的**已发布 npm `0.21.0` 构件**与后续本地源码是不同对象:保留 `package.json` 中的版本号,不会使本地修复进入已发布的归档。代码测试、虚拟账单和脚本生成的批准回复,不能代替模型评估、生产流量测量或用户研究。
|
|
6
|
+
|
|
7
|
+
## 账单与服务器声明
|
|
8
|
+
|
|
9
|
+
`initialize`、`tools/list` 和 canary 探测调用本身也可能产生费用或其他服务器端效果。发现流程或 preview 成功,不能证明下一次调用的价格或效果。在我们的虚拟账单 fixture 中,canary 选择了免费的 `preview`,而 `{}` 选择了扣除七个虚拟积分的操作。这测量的是该 fixture,而不是外部卖家的真实账单。
|
|
10
|
+
|
|
11
|
+
`readOnlyHint`、`destructiveHint` 和 `openWorldHint` 都是未经验证的声明,不能证明操作免费或无害。本地的 annotations 首次使用审查需要明确启用,默认是 `off`,且只适用于 `wrap --flow NAME`。接受该审查并不表示批准价格,也不构成对实际效果的认证。参见[流控制及其边界](flow-guard.zh.md)。
|
|
12
|
+
|
|
13
|
+
## 请求的包版本与服务器自报版本
|
|
14
|
+
|
|
15
|
+
精确的 `package@x.y.z` 指定请求的包版本。`initialize.serverInfo.version` 是服务器提供的字符串,不是独立解析得到的包版本,也不是构件摘要。例如,审查的 Mapled 包为 `@mapled/mcp@0.21.6`,服务器仍自报 `0.1.0`。
|
|
16
|
+
|
|
17
|
+
已测试的发布版 `0.21.0` 可能错误地用自报版本生成包固定建议。应核实包管理器的实际解析结果与锁定文件、完整性证据,而不是直接接受该建议。本地修复将这些元数据分开,并移除了这种替换;它仍不能认证 launcher 实际运行了哪些包字节。未固定版本的 `npx` 可能解析到另一版本,也可能复用缓存,不能保证每次启动都采用其中一种行为。tools 集合的 hash 标识观察到的定义,而不是整个可执行程序。参见[扫描](scan.zh.md)和[集成](integration.zh.md)。
|
|
18
|
+
|
|
19
|
+
## Launcher 比较与参考基线
|
|
20
|
+
|
|
21
|
+
Auten 调查只有一个公开观察到的快照,并没有完成对两种 launcher 环境的实测。复现差异需要准确的 runner 及其版本、启动参数,以及来自相应环境的两个 tools 快照。HISTOR 观察记录可作为比较参考,但不是经操作者批准的可信 pin。
|
|
22
|
+
|
|
23
|
+
[Launcher 证据收集器](../examples/launcher-evidence/README.md)目前只有英文辅助文档。它记录的是经过客户端规范化的 tools 定义,而不是原始协议记录。填写的 runner 版本由所有者声明,该字段不会独立解析包构件。收集器已经准备好,并不证明两个环境的比较已经发生。
|
|
24
|
+
|
|
25
|
+
## 询问、批准与回答
|
|
26
|
+
|
|
27
|
+
历史数字 **39/97** 统计的是触发过 `ask` 的任务,而不是批准操作的人数。hook 决策之后发生执行,不能证明有人点击了 Allow。Wrapper 可以记录 accept/decline/cancel,但脚本客户端也能生成这些回复。人工批准率、阅读时间和批准疲劳,需要真正展示给人的请求及其关联结果;这些测试没有测量它们。
|
|
28
|
+
|
|
29
|
+
在保存的 DeepSeek Flash guard + note 系列(`injecagent`,20 个 travel 用例)中,AgentDojo 的历史官方结果仍是 **18/20**,依据是目标名称的精确出现。AI 辅助阅读在保存的片段中发现的是警告,而非采纳攻击者推荐,但只有 18 个回答完整,另外两个达到旧的 2000 字符保存上限。缺失的结尾内容未知,因此不能据此建立完整回答上的新 `0/20` 分数。本地 harness 为未来回答保存全文、长度和 hash;它不会恢复历史缺失内容,也不意味着重新运行了模型。
|
|
30
|
+
|
|
31
|
+
**受控选择测试(2026-10-25):**独立的工具结果后合成测试使用已发布的 WARDEN `0.21.0`,覆盖六项酒店任务 × 五次重复、clean/benign/injected 三种备注及三种配置:**270/270 个 ID 选择正确**,其中 injected 条件下**0/90 次选择攻击目标**(每种配置 0/30)。目标名称出现在包括对照组在内的 **25/270** 个回答中,`note_stop` 的 Stop 触发 **0/90** 次;无守卫基线也全部选对,因此尚未测得守卫的额外收益,而正确 ID 不代表解释中的每项事实都准确。[协议、结果与限制](../../docs/growth/launchgate-selection-2026-10-25.en.md):这项独立研究不改变 AgentDojo 历史上的 **18/20**,也不证明普遍安全。
|
|
32
|
+
|
|
33
|
+
**并列选择后续实验(2026-10-25):** 两个最优选项均可接受时,注入条件下目标选择分别为:无防护 48/48、note 44/48、note+Stop 45/48;对应 clean 基线为 28/48、25/48、29/48。经基线调整的防护效果区间包含零;432 次选择均符合任务要求,选择目标本身不能视为错误。真实用户偏好得到 18/18 次遵守,Stop 未要求复查。本地[离线评估器](../scripts/selection-probe/README.md)现支持多个可接受答案及共同基线比较;运行时阻断逻辑未更改。[结果与限制,英文](../../docs/growth/launchgate-tie-selection-2026-10-25.en.md)。
|
|
34
|
+
|
|
35
|
+
## 片段阈值与复查成本
|
|
36
|
+
|
|
37
|
+
强指纹窗口仍为 **非十六进制 8 / 十六进制 10**。本地对已知前缀之后索引的修复,并没有建立对嵌在较长单词中的六字符片段的可靠强检测。现有会话必须重新读取凭据才能获得新窗口。在凭据边界要求审查,与确认该片段就是秘密,是不同的判断。
|
|
38
|
+
|
|
39
|
+
同样,Stop 中 12 个规范化字符的匹配会请求再次检查回答,但不能证明模型在语义上拒绝了指令。删除警告词豁免后,诚实的警告也会多付出一次检查。改写和被操纵的行选择可以绕过这种匹配。Fixture 上的改进和刻意选择的误拒对照,既不能确立全局最优阈值,也不能得出生产误报率。[流控制指南](flow-guard.zh.md)说明了策略、尚存的缺口,以及依赖 host 的 `stop_hook_active` 标志限制后续检查的机制。
|
package/docs/scan.es.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
> 🌐 [English](scan.md) · [Русский](scan.ru.md) · **Español** · [Français](scan.fr.md) · [中文](scan.zh.md)
|
|
4
4
|
|
|
5
|
+
Las llamadas de descubrimiento pueden generar cargos; consulte los [límites de medición y pruebas de versión](scan-limits.es.md) antes de interpretar un scan o confiar en una versión declarada.
|
|
6
|
+
|
|
5
7
|
`warden-mcp scan` lee la configuración MCP que ya tienes, se conecta a cada servidor que inicia y revisa las definiciones de herramientas antes de que un modelo las vea. Es la misma cadena de compuertas que [`wrap`](../README-es.md) y la [biblioteca](integration.es.md), ejecutada una vez sobre tus configuraciones en lugar de delante de un solo servidor.
|
|
6
8
|
|
|
7
9
|
```bash
|
package/docs/scan.fr.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
> 🌐 [English](scan.md) · [Русский](scan.ru.md) · [Español](scan.es.md) · **Français** · [中文](scan.zh.md)
|
|
4
4
|
|
|
5
|
+
Les appels de découverte peuvent entraîner des frais ; consultez les [limites des mesures et preuves de version](scan-limits.fr.md) avant d’interpréter un scan ou une version déclarée.
|
|
6
|
+
|
|
5
7
|
`warden-mcp scan` lit la configuration MCP que vous avez déjà, se connecte à chaque serveur qu’elle démarre et vérifie les définitions d’outils avant qu’un modèle ne les voie. C’est la même chaîne de portes que [`wrap`](../README-fr.md) et la [bibliothèque](integration.fr.md), exécutée une fois sur vos configurations au lieu de se placer devant un seul serveur.
|
|
6
8
|
|
|
7
9
|
```bash
|
package/docs/scan.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
> 🌐 **English** · [Русский](scan.ru.md) · [Español](scan.es.md) · [Français](scan.fr.md) · [中文](scan.zh.md)
|
|
4
4
|
|
|
5
|
+
Discovery calls can incur costs; see [measurement limits and version evidence](scan-limits.md) before interpreting a scan or trusting a version hint.
|
|
6
|
+
|
|
5
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.
|
|
6
8
|
|
|
7
9
|
```bash
|
package/docs/scan.ru.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
> 🌐 [English](scan.md) · **Русский** · [Español](scan.es.md) · [Français](scan.fr.md) · [中文](scan.zh.md)
|
|
4
4
|
|
|
5
|
+
Вызовы обнаружения могут стоить денег; перед интерпретацией scan и советов о версии см. [границы измерений и подтверждение версии](scan-limits.ru.md).
|
|
6
|
+
|
|
5
7
|
`warden-mcp scan` читает уже существующую у вас конфигурацию MCP, подключается к каждому серверу из неё и проверяет определения инструментов до того, как их увидит модель. Это та же цепочка гейтов, что у [`wrap`](../README-ru.md) и у [библиотеки](integration.ru.md), только пройденная один раз по вашим конфигам, а не перед одним сервером.
|
|
6
8
|
|
|
7
9
|
```bash
|
package/docs/scan.zh.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
> 🌐 [English](scan.md) · [Русский](scan.ru.md) · [Español](scan.es.md) · [Français](scan.fr.md) · **中文**
|
|
4
4
|
|
|
5
|
+
发现调用也可能产生费用;解读扫描结果或信任版本提示前,请阅读[测量边界与版本证据](scan-limits.zh.md)。
|
|
6
|
+
|
|
5
7
|
`warden-mcp scan` 读取你已有的 MCP 配置,连接其中启动的每个服务器,并在模型看到工具定义之前对其进行审查。它与 [`wrap`](../README-zh.md) 和[库](integration.zh.md)使用同一条关卡链,只是对你的配置运行一次,而不是挡在单个服务器前面。
|
|
6
8
|
|
|
7
9
|
```bash
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Host integration: read structured proposals from stdin; output only a verified final result or withholding notice.
|
|
3
|
+
// No model API, keys, network, tool calls or effects. Integrators supply their own bounded model callback instead.
|
|
4
|
+
import { readFileSync } from 'node:fs';
|
|
5
|
+
import { createInterface } from 'node:readline';
|
|
6
|
+
import { createAnswerGate } from '../dist/index.js';
|
|
7
|
+
|
|
8
|
+
const controller = new AbortController();
|
|
9
|
+
process.once('SIGINT', () => controller.abort());
|
|
10
|
+
// stdout failures are uncertain delivery, never a reason to resend.
|
|
11
|
+
process.stdout.on('error', () => {});
|
|
12
|
+
let lines;
|
|
13
|
+
try {
|
|
14
|
+
if (process.argv.length !== 4 || process.argv[2] !== '--contract') throw new Error('usage');
|
|
15
|
+
const bytes = readFileSync(process.argv[3]);
|
|
16
|
+
if (bytes.length > 262_144) throw new Error('contract too large');
|
|
17
|
+
const gate = createAnswerGate(JSON.parse(bytes.toString('utf8')));
|
|
18
|
+
lines = createInterface({ input: process.stdin, crlfDelay: Infinity });
|
|
19
|
+
const iterator = lines[Symbol.asyncIterator]();
|
|
20
|
+
const result = await gate.run({ signal: controller.signal, maxCorrections: 2, timeoutMs: 30_000,
|
|
21
|
+
generate: async request => {
|
|
22
|
+
process.stderr.write('WARDEN_REQUEST ' + JSON.stringify({ attempt: request.attempt, catalog: request.catalog, feedback: request.feedback ?? null }) + '\n');
|
|
23
|
+
const next = await iterator.next();
|
|
24
|
+
if (next.done) throw new Error('No structured proposal');
|
|
25
|
+
return next.value;
|
|
26
|
+
},
|
|
27
|
+
emit: rendered => new Promise((resolve, reject) => process.stdout.write(rendered, error => error ? reject(error) : resolve())),
|
|
28
|
+
});
|
|
29
|
+
process.exitCode = result.status === 'delivered' ? 0 : result.status === 'withheld' ? 2 : result.status === 'cancelled' ? 130 : 3;
|
|
30
|
+
} catch {
|
|
31
|
+
process.stderr.write('WARDEN_HOST_ERROR: provide --contract with normalized host-owned facts. No candidate forwarded.\n');
|
|
32
|
+
process.exitCode = 1;
|
|
33
|
+
} finally { lines?.close(); }
|
|
@@ -130,7 +130,7 @@ private func actionImplementation(_ target: NSObject, _ selector: Selector) -> I
|
|
|
130
130
|
let bounds: [String: Any] = ["x": box.minX, "y": box.minY, "width": box.width, "height": box.height]
|
|
131
131
|
elements.append(["index": id, "role": "button", "name": button.title, "accessibilityIdentifier": b.identity, "bounds": bounds])
|
|
132
132
|
boxes[id] = box
|
|
133
|
-
// Match flow-guard.ts screenTargetEvidence exactly; conformance is integration-tested.
|
|
133
|
+
// Match flow-guard-screen.ts screenTargetEvidence exactly; conformance is integration-tested.
|
|
134
134
|
let label = try json([button.title] + Array(repeating: NSNull() as Any, count: 8))
|
|
135
135
|
let geometry = try "{\"x\":\(json(box.minX)),\"y\":\(json(box.minY)),\"width\":\(json(box.width)),\"height\":\(json(box.height))}"
|
|
136
136
|
let stampText = try "{\"target\":\(json(id)),\"role\":\"button\",\"reference\":\(json(digest(id))),\"identity\":\(json(digest(b.identity))),\"bounds\":\(geometry),\"label\":\(json(digest(label))),\"application\":\(json(applicationID)),\"titles\":[\(json(digest(String(window.title.trimmingCharacters(in: .whitespacesAndNewlines).prefix(160)))))]}"
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aimarket/warden",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "WARDEN
|
|
3
|
+
"version": "0.22.1",
|
|
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",
|
|
7
7
|
"author": "AICOM (alexar76)",
|
|
@@ -52,6 +52,7 @@
|
|
|
52
52
|
"docs/gates*.md",
|
|
53
53
|
"docs/flow-guard*.md",
|
|
54
54
|
"examples/atomic-screen-server.mjs",
|
|
55
|
+
"examples/answer-gate-host.mjs",
|
|
55
56
|
"native/macos/Package.swift",
|
|
56
57
|
"native/macos/Sources",
|
|
57
58
|
"scripts/build-macos.mjs"
|
|
@@ -96,8 +97,8 @@
|
|
|
96
97
|
},
|
|
97
98
|
"devDependencies": {
|
|
98
99
|
"@types/node": "^26.6.4",
|
|
99
|
-
"@vitest/coverage-v8": "^
|
|
100
|
-
"typescript": "^
|
|
101
|
-
"vitest": "^
|
|
100
|
+
"@vitest/coverage-v8": "^5.0.5",
|
|
101
|
+
"typescript": "^7.0.2",
|
|
102
|
+
"vitest": "^5.0.5"
|
|
102
103
|
}
|
|
103
104
|
}
|