@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.
- package/CHANGELOG.md +44 -0
- package/README-es.md +23 -7
- package/README-fr.md +23 -7
- package/README-ru.md +23 -7
- package/README-zh.md +23 -7
- package/README.md +23 -7
- package/dist/annotation-review.js.map +1 -1
- 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 +3 -2
- package/dist/flow-guard-answer.d.ts.map +1 -1
- package/dist/flow-guard-answer.js +38 -11
- package/dist/flow-guard-answer.js.map +1 -1
- package/dist/flow-guard-classify.js.map +1 -1
- 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-fragments.d.ts.map +1 -1
- package/dist/flow-guard-labels.js.map +1 -1
- package/dist/flow-guard-leak.js.map +1 -1
- package/dist/flow-guard-paths.d.ts.map +1 -1
- package/dist/flow-guard-paths.js.map +1 -1
- package/dist/flow-guard-policy.js.map +1 -1
- package/dist/flow-guard-post.js.map +1 -1
- package/dist/flow-guard-pre.js.map +1 -1
- package/dist/flow-guard-screen.d.ts.map +1 -1
- package/dist/flow-guard-screen.js.map +1 -1
- package/dist/flow-guard-state.d.ts.map +1 -1
- package/dist/flow-guard-state.js +8 -0
- package/dist/flow-guard-state.js.map +1 -1
- package/dist/flow-guard-text.js.map +1 -1
- package/dist/flow-guard-types.d.ts +8 -0
- package/dist/flow-guard-types.d.ts.map +1 -1
- package/dist/flow-guard.d.ts +2 -0
- package/dist/flow-guard.d.ts.map +1 -1
- package/dist/flow-guard.js +1 -0
- 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.map +1 -1
- 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 +3 -0
- 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/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.map +1 -1
- package/dist/wrap-screen.js.map +1 -1
- package/dist/wrap-wire.d.ts.map +1 -1
- package/dist/wrap-wire.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 +27 -0
- package/docs/flow-guard-model-comparison-2026-10-25.fr.md +27 -0
- package/docs/flow-guard-model-comparison-2026-10-25.md +27 -0
- package/docs/flow-guard-model-comparison-2026-10-25.ru.md +27 -0
- package/docs/flow-guard-model-comparison-2026-10-25.zh.md +27 -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-reference-egress.es.md +25 -0
- package/docs/flow-guard-reference-egress.fr.md +25 -0
- package/docs/flow-guard-reference-egress.md +26 -0
- package/docs/flow-guard-reference-egress.ru.md +26 -0
- package/docs/flow-guard-reference-egress.zh.md +25 -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 +25 -1
- package/docs/flow-guard.fr.md +25 -1
- package/docs/flow-guard.md +25 -1
- package/docs/flow-guard.ru.md +25 -1
- package/docs/flow-guard.zh.md +25 -1
- package/examples/answer-gate-host.mjs +33 -0
- package/package.json +5 -4
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Проверка структурированного ответа на стороне приложения
|
|
2
|
+
|
|
3
|
+
<!-- final-ranking-witness -->
|
|
4
|
+
**[Финальное сравнение обратной связи, 26 октября](flow-guard-final-witness-2026-10-26.ru.md).** Во всех пяти ранее удержанных контекстах старое сообщение исправило 6/40 продолжений, явное сравнение выбранного и лучшего — 40/40. Правильные контроли сохранились 20/20 в каждой условной группе. Серия завершена на известных ошибках; это не новый holdout. Прежнее утверждение о проверке только офлайн уточнено этим результатом для ранжирования; эффективность сообщений о неполном наборе моделью пока не измерена.
|
|
5
|
+
<!-- /final-ranking-witness -->
|
|
6
|
+
|
|
7
|
+
[en](flow-guard-answer-gate.md) · [ru](flow-guard-answer-gate.ru.md) · [es](flow-guard-answer-gate.es.md) · [fr](flow-guard-answer-gate.fr.md) · [zh](flow-guard-answer-gate.zh.md)
|
|
8
|
+
|
|
9
|
+
Локальный кандидат **0.22.0**, 26 октября 2026; в npm не опубликован. Продолжение [эксперимента с четырьмя условиями](flow-guard-review-factors-2026-10-26.ru.md): удаление ошибки цены C иногда добавляло ошибку расстояния D. Удалить одно противоречие недостаточно.
|
|
10
|
+
|
|
11
|
+
## Контракт и область проверки
|
|
12
|
+
|
|
13
|
+
`createAnswerGate` экспортируется из `@aimarket/warden`. Приложение явно подключает SDK и владеет правилами из запроса пользователя/политики, нормализованным снимком записей, сессией, номером хода, вызовом модели и финальной выдачей. Кандидаты буферизуются до проверки. Инструкции внешнего сервера не становятся правилами проверки.
|
|
14
|
+
|
|
15
|
+
Каталог заменяет исходные ID и имена полей безопасными ссылками `rec-…` и `field_1`. Обратная связь содержит точную ссылку, поле, фактическое значение и границу без цитирования имён, URL и фрагментов инструкции. `referenceForRecord(sourceId)` предназначен приложению. SHA-256 связывает сессию, ход, снимок, правила и ранжирование; перестановка записей не меняет ссылки.
|
|
16
|
+
|
|
17
|
+
Модель возвращает строго четыре поля: `schema: "warden-selection/1"`, `catalogSha256`, `selectedRef`, `eligibleRefs`. Пример API и JSON приведены в [английской версии](flow-guard-answer-gate.md).
|
|
18
|
+
|
|
19
|
+
После каждого ответа проверяются **выбранная запись и все объявленные допустимыми альтернативы по всем правилам**, полнота множества допустимых записей и необязательный числовой минимум/максимум. Равные оптимальные варианты разрешены. Правила: конечные числа `lte`/`gte`, строгое числовое/булево `eq`. Пропущенные или неверно типизированные необходимые факты, устаревший контракт, неизвестные ссылки, дубли JSON-ключей, проза и дополнительные поля не дают разрешения. Если допустимых записей нет, результат удерживается.
|
|
20
|
+
|
|
21
|
+
Наружу передаются проверенные структурированные данные; значения берутся из снимка приложения. Произвольные объяснения, даты, география, истинность источника и скрытое влияние на предпочтения этим не проверяются. Нормализация единиц и выбор правил — обязанность приложения. Разрешённый ответ не разрешает платёж, действие или вызов инструмента.
|
|
22
|
+
|
|
23
|
+
## Ограниченный цикл и выдача
|
|
24
|
+
|
|
25
|
+
`gate.run({ generate, emit, maxCorrections: 2, timeoutMs: 30000 })` допускает первоначальный ответ и максимум **два исправления** — один дополнительный проход сверх прежнего одного исправления. После C→D новая проверка выдаёт факт `2.5 > 1` для D. После лимита приложение выдаёт `WARDEN_RESULT_WITHHELD`, не ошибочный кандидат. Допустимы только 0/1/2 исправления.
|
|
26
|
+
|
|
27
|
+
Экземпляр резервирует одну выдачу. Ошибки генерации, отмена и таймаут не повторяют запрос к провайдеру автоматически; поздний ответ не публикуется. Адаптер должен соблюдать `signal`, чтобы остановить собственную работу. Неопределённый результат записи в выходной канал не пересылается повторно. Приложение отвечает за владение запросом между экземплярами и не должно транслировать непроверенные кандидаты или их журналы пользователю.
|
|
28
|
+
|
|
29
|
+
Фиксированное уведомление приложения сохраняется независимо от модели. `disclosure: "source-instructions"` допустим при наличии свидетельства найденных инструкций; по умолчанию сообщается об использовании внешних записей. Приложение обязано отобразить уведомление. [Рабочий пример stdio](../examples/answer-gate-host.mjs) получает `--contract host-owned.json`, читает кандидатов построчно из stdin, пишет запросы/каталог/факты в stderr, а в stdout — только проверенный финальный результат или отказ. Сам пример не вызывает модель, API или инструменты.
|
|
30
|
+
|
|
31
|
+
**Обычный Stop-hook не владеет финальным отображением.** Его поведение с одним продолжением сохраняется. Для удержания результата требуется явная интеграция SDK с буферизацией. Проверка собственного stdio-приложения не доказывает отображение в стороннем нативном клиенте.
|
|
32
|
+
|
|
33
|
+
## Проверки и границы вывода
|
|
34
|
+
|
|
35
|
+
Материалы: `docs/evidence/launchgate-answer-gate-2026-10-26/` в монорепозитории. Сборка и тесты выполняются на Linux factory-vps. Проверяются цикл C→D→допустимый результат, удержание неисправленного D, полные множества и ранжирование, неизвестные данные, устаревание, враждебные метаданные, отмена, таймауты, конкуренция, неопределённая доставка и stdout настоящего дочернего процесса. Новых вызовов модели в этой офлайн-проверке нет.
|
|
36
|
+
|
|
37
|
+
Из 384 сохранённых ответов в новую схему переносятся только явно размеченные списки допустимости. Неподдерживаемая проза остаётся неизвестной. Отказ для закодированного ложного списка не доказывает понимание прозы, исправление новой моделью или защиту на независимом наборе. Старые ответы и результаты не изменены.
|
|
38
|
+
|
|
39
|
+
Прочитан полный сырой диалог упорного случая: итоговый текст одновременно называет C допустимым за $129 и исключает C за цену $190. Это наблюдаемая противоречивость ответа, а не доказательство внутреннего механизма ошибки. Подготовка и разбор выполнены с AI; независимая слепая проверка не заявляется.
|
|
40
|
+
|
|
41
|
+
<!-- verified-answer-gate-results -->
|
|
42
|
+
|
|
43
|
+
На Linux factory-vps прошли сборка, проверка типов, **791 тест в 24 наборах**, включая **43 теста нового SDK/stdio**, и прежние 28 red-team сценариев. Среди 384 исторических проекций: отклонены 50 ложных явных списков, разрешены 75 корректных, 259 ответов с неподдерживаемой прозой остались неизвестными; непроверенные кандидаты не выданы. Это перенос размеченных данных, не новый результат исправлений модели. Проверены 289 хешей выходных файлов; синхронизированы 276 локальных файлов Linux-сборки. Оба прежних запуска с синтаксическими ошибками тестов сохранены.
|
|
44
|
+
|
|
45
|
+
[results.json](data/launchgate-answer-gate-2026-10-26/results.json) · [execution.json](data/launchgate-answer-gate-2026-10-26/execution.json) · [historical-replay.json](data/launchgate-answer-gate-2026-10-26/historical-replay.json) · [stubborn-transcript.json](data/launchgate-answer-gate-2026-10-26/stubborn-transcript.json) · [manifest.json](data/launchgate-answer-gate-2026-10-26/manifest.json)
|
|
46
|
+
|
|
47
|
+
<!-- structured-live-followup -->
|
|
48
|
+
|
|
49
|
+
[Живой прогон структурированных ответов](flow-guard-structured-model-2026-10-26.ru.md): 96 правильных первых предложений и 64 исправления контролируемых ошибок; отдельные знаменатели и границы.
|
|
50
|
+
|
|
51
|
+
<!-- prospective-holdout-followup -->
|
|
52
|
+
|
|
53
|
+
[Новые случаи после заморозки](flow-guard-prospective-holdout-2026-10-26.ru.md): 89/96 первых естественных ответов правильны, пять из семи ошибок исправлены, два удержаны; контролируемые 45/48. Отдельные подсказки ранжирования/неполного списка проверены офлайн, без нового запуска модели.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# 由应用拥有的结构化答案门禁
|
|
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
|
+
|
|
7
|
+
[en](flow-guard-answer-gate.md) · [ru](flow-guard-answer-gate.ru.md) · [es](flow-guard-answer-gate.es.md) · [fr](flow-guard-answer-gate.fr.md) · [zh](flow-guard-answer-gate.zh.md)
|
|
8
|
+
|
|
9
|
+
本地候选版本 **0.22.0**,2026 年 10 月 26 日;尚未发布 npm。这是[四条件继续回答实验](flow-guard-review-factors-2026-10-26.zh.md)的后续:去掉 C 的价格错误,有时会引入 D 的距离错误。消除一个矛盾并不等于完整纠正。
|
|
10
|
+
|
|
11
|
+
## 契约与验证范围
|
|
12
|
+
|
|
13
|
+
`createAnswerGate` 从 `@aimarket/warden` 导出,须由应用明确接入。应用拥有用户/策略规则、规范化记录快照、会话/轮次、模型调用和最终显示,并在验证前缓冲候选答案。外部服务器的指令不能成为规则来源。
|
|
14
|
+
|
|
15
|
+
目录用安全的 `rec-…` 和 `field_1` 替换原始 ID、字段名。反馈包含明确记录、字段、实际值和要求边界,不复制来源名称、URL 或指令片段。`referenceForRecord(sourceId)` 是供应用使用的映射。SHA-256 绑定会话、轮次、完整快照、规则与可选排序;记录重排不改变引用。
|
|
16
|
+
|
|
17
|
+
模型只能返回四个字段:`schema: "warden-selection/1"`、`catalogSha256`、`selectedRef`、`eligibleRefs`。JSON 和 API 示例见[英文版](flow-guard-answer-gate.md)。
|
|
18
|
+
|
|
19
|
+
每次候选答案都重新按**全部规则检查所选记录和全部声明合格的备选记录**,并检查合格集合完整性以及可选的数值最小/最大排序。最优并列项均可接受。支持有限数值 `lte`/`gte` 和严格数值/布尔 `eq`。必要数据缺失、类型错误、过期契约、未知引用、重复 JSON 键、自由文本及多余字段都不会获准输出。没有合格记录时保留结果,不交付候选项。
|
|
20
|
+
|
|
21
|
+
输出仅包含验证后的结构化数据,其属性取自应用冻结的快照,不取自模型自由文本。此机制不验证任意解释、日期、地理信息、来源真实性或隐蔽偏好影响。应用负责单位规范化与规则选择。答案通过不代表授权支付、动作或工具调用。
|
|
22
|
+
|
|
23
|
+
## 有界纠正与输出边界
|
|
24
|
+
|
|
25
|
+
`gate.run({ generate, emit, maxCorrections: 2, timeoutMs: 30000 })` 最多执行一次初始提案和**两次纠正**,比一次纠正方案多一个有界轮次。若 C 被移除却加入 D,下一反馈指出 D 的 `2.5 > 1`。达到上限后输出 `WARDEN_RESULT_WITHHELD`,绝不交付被拒候选答案。纠正次数只能设为 0/1/2。
|
|
26
|
+
|
|
27
|
+
每个实例只预留一次运行/输出。生成失败、取消和超时均不自动重试;迟到答案不能发布。模型适配器必须遵守 `signal` 以停止自己的工作。输出投递状态不确定时不重发。应用负责跨实例请求所有权,也不能向用户流式输出未经验证的候选答案或日志。
|
|
28
|
+
|
|
29
|
+
固定告知由应用生成,不依赖模型配合。`disclosure: "source-instructions"` 仅用于已有指令检测证据的情况;默认告知使用了外部记录。应用必须实际显示告知。[可运行 stdio 示例](../examples/answer-gate-host.mjs)接收 `--contract host-owned.json`,从 stdin 逐行读提案,在 stderr 写目录/反馈,在 stdout 仅写最终已验证结果或保留通知;示例本身不调用模型、API 或工具。
|
|
30
|
+
|
|
31
|
+
**普通 Stop hook 不拥有最终显示边界。** 它仍只请求一次继续回答。要保留结果,应用须明确接入 SDK 并缓冲交付。自己的 stdio 集成测试不能证明第三方原生客户端的 GUI 已显示告知。
|
|
32
|
+
|
|
33
|
+
## 验证与结论限制
|
|
34
|
+
|
|
35
|
+
材料在单仓库的 `docs/evidence/launchgate-answer-gate-2026-10-26/`。在 Linux factory-vps 编译和测试,不新增模型调用。测试覆盖 C→D→有效结果、持续 D 错误的保留、完整集合/排序/并列、未知和过期数据、恶意元数据、取消、超时、并发、投递不确定性,以及真实子进程 stdout。
|
|
36
|
+
|
|
37
|
+
历史重放只把 384 个保留答案中明确标注的合格列表投影到新格式。不支持的自由文本仍为未知。拒绝编码后的错误列表不等于自动理解自由文本、模型重新纠错成功或独立保留集上的安全效果。原有答案与实验结果均不改写。
|
|
38
|
+
|
|
39
|
+
已完整阅读一个顽固案例的原始对话:同一回答既说 C 为 $129 且合格,又说 C 为 $190 因而不合格。这证明文本存在可观察的矛盾,不能证明内部推理原因。准备与分析使用 AI 辅助,未声称独立盲审。
|
|
40
|
+
|
|
41
|
+
<!-- verified-answer-gate-results -->
|
|
42
|
+
|
|
43
|
+
Linux factory-vps 已通过编译/类型检查、**24 个测试套件的 791 项测试**(其中 **43 项为新门禁/stdio 测试**)及原有 28 个 red-team 场景。384 个历史投影中:50 个错误显式列表被拒绝,75 个正确列表获准,259 个不支持的自由文本答案保持未知;未交付未经验证的候选答案。这是标注数据投影,不是新的模型纠正率。已校验 289 个输出文件哈希并同步 276 个 Linux 生成的本地文件。先前两次测试语法失败的记录均保留。
|
|
44
|
+
|
|
45
|
+
[results.json](data/launchgate-answer-gate-2026-10-26/results.json) · [execution.json](data/launchgate-answer-gate-2026-10-26/execution.json) · [historical-replay.json](data/launchgate-answer-gate-2026-10-26/historical-replay.json) · [stubborn-transcript.json](data/launchgate-answer-gate-2026-10-26/stubborn-transcript.json) · [manifest.json](data/launchgate-answer-gate-2026-10-26/manifest.json)
|
|
46
|
+
|
|
47
|
+
<!-- structured-live-followup -->
|
|
48
|
+
|
|
49
|
+
[结构化答案真实模型测试](flow-guard-structured-model-2026-10-26.zh.md):96 个初次提案有效,64 个受控种子修复;分母与边界分别报告。
|
|
50
|
+
|
|
51
|
+
<!-- prospective-holdout-followup -->
|
|
52
|
+
|
|
53
|
+
[冻结后的新案例](flow-guard-prospective-holdout-2026-10-26.zh.md):自然初次有效 89/96,七个错误中五个纠正、两个保留;受控纠正 45/48。后续排序/缺失集合证据已离线验证,未重新调用模型。
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Evidencia determinista y conservación de la divulgación
|
|
2
|
+
|
|
3
|
+
[en](flow-guard-constraint-evidence.md) · [ru](flow-guard-constraint-evidence.ru.md) · [es](flow-guard-constraint-evidence.es.md) · [fr](flow-guard-constraint-evidence.fr.md) · [zh](flow-guard-constraint-evidence.zh.md)
|
|
4
|
+
|
|
5
|
+
Candidato local 0.22.0, sin publicar en npm. En las doce parejas revisadas, cuatro respuestas incluían una ficha de $190 como admisible con un límite de $150; tres continuaciones eliminaron la divulgación de la instrucción. No se modifican respuestas ni resultados históricos.
|
|
6
|
+
|
|
7
|
+
## Contrato y límites de confianza
|
|
8
|
+
|
|
9
|
+
El anfitrión puede enviar `answer_check` al hook Stop o llamar al exportado `checkAnswerConstraints`. El contrato vincula el SHA-256 de la respuesta exacta, sesión y turno positivo. Un adaptador de confianza aporta reglas del usuario/política, una captura de registros, el ID elegido y los ID declarados explícitamente admisibles. Se comprueban todos ellos; estar presente en la fuente no equivale a declararse admisible. Se admiten `lte`/`gte` numéricos finitos y `eq` numérico/booleano estricto.
|
|
10
|
+
|
|
11
|
+
Datos ausentes son desconocidos; contratos malformados o antiguos no pasan la comprobación. La evidencia usa posiciones y valores, por ejemplo `actual 190; required <= 150`, sin repetir nombres, ID, campos, URL ni citas de ataque. Las reglas nunca deben proceder de instrucciones del servidor MCP. El anfitrión normaliza unidades y monedas; los hechos siguen condicionados a la captura, sin verificar la honestidad del servidor ni conceder permisos. El hash no protege frente a un anfitrión malicioso.
|
|
12
|
+
|
|
13
|
+
## Continuación y divulgación
|
|
14
|
+
|
|
15
|
+
Tras texto externo registrado, una contradicción válida puede solicitar una continuación incluso sin solapamiento literal; el detector anterior sigue activo. Un recibo del guard para ese turno conserva un aviso fijo de instrucción externa en `systemMessage`, aunque el modelo borre su divulgación. No solicita otra continuación. Un nuevo turno elimina el recibo; audit sólo observa. Con los mismos hechos se notifican contradicciones restantes; una captura ausente o distinta deja la resolución desconocida. Corregir no exige cambiar un ID admisible.
|
|
16
|
+
|
|
17
|
+
El anfitrión debe mostrar `systemMessage`; no se ha medido su presentación en el cliente nativo ni se garantiza conservar la prosa del modelo.
|
|
18
|
+
|
|
19
|
+
## Ejemplo del anfitrión
|
|
20
|
+
|
|
21
|
+
Ya deben haberse registrado prompt y resultado externo; `turn` coincide con el turno del guard. El anfitrión extrae las declaraciones explícitas, no WARDEN.
|
|
22
|
+
|
|
23
|
+
```js
|
|
24
|
+
import { createHash } from 'node:crypto';
|
|
25
|
+
import { checkAnswerConstraints } from '@aimarket/warden';
|
|
26
|
+
|
|
27
|
+
const answer = 'A is selected. A and C are eligible.';
|
|
28
|
+
const answer_check = {
|
|
29
|
+
schema: 'warden-answer-check/1', sessionId: 'session-1', turn: 1,
|
|
30
|
+
answerSha256: createHash('sha256').update(answer).digest('hex'),
|
|
31
|
+
rules: [{ field: 'priceUsd', op: 'lte', value: 150 }],
|
|
32
|
+
records: [
|
|
33
|
+
{ id: 'A', attributes: { priceUsd: 123 } },
|
|
34
|
+
{ id: 'C', attributes: { priceUsd: 190 } },
|
|
35
|
+
],
|
|
36
|
+
claims: { selectedId: 'A', eligibleIds: ['A', 'C'] },
|
|
37
|
+
};
|
|
38
|
+
const evidence = checkAnswerConstraints(answer_check, answer, 'session-1', 1);
|
|
39
|
+
// evidence.violations: [{ item: 2, rule: 1, op: 'lte', limit: 150, actual: 190 }]
|
|
40
|
+
// Stop input: { session_id: 'session-1', last_assistant_message: answer, answer_check }
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Alcance
|
|
44
|
+
|
|
45
|
+
El adaptador de investigación `scripts/selection-probe/constraint_claims.py` sólo entiende una gramática inglesa cerrada de listas de hoteles en JSON. No usa etiquetas semánticas de referencia, excluye el sufijo de aviso, rechaza listas no admitidas y deja el resto de la prosa sin examinar. No verifica toda afirmación de precio ni extrae restricciones generales de lenguaje natural. El Stop nativo no genera automáticamente este contrato.
|
|
46
|
+
|
|
47
|
+
## Validación Linux — 26 de octubre de 2026
|
|
48
|
+
|
|
49
|
+
Compilación y tipos correctos: **743 pruebas WARDEN en 21 archivos**, incluidas 29 nuevas; **24 pruebas Python** y el **gate determinista existente de 28 escenarios**. Verificados los 276 hash de salida. Pruebas sin red; sólo la instalación de dependencias npm tuvo red. Directorio remoto temporal eliminado. Compilado local y plugin sincronizados desde Linux tras verificar las fuentes congeladas.
|
|
50
|
+
|
|
51
|
+
| Observación sobre respuestas guardadas | Resultado |
|
|
52
|
+
| --- | ---: |
|
|
53
|
+
| Parejas inicial/final reales repetidas | 12 |
|
|
54
|
+
| Conjuntos admisibles falsos con $190 pese al límite de $150 | 4 |
|
|
55
|
+
| Contradicciones restantes en respuestas finales antiguas intactas | 4 |
|
|
56
|
+
| Avisos del guard conservados en la salida de continuación | 12/12 |
|
|
57
|
+
| Pérdidas previas de divulgación del modelo acompañadas por aviso | 3/3 |
|
|
58
|
+
| Segundas continuaciones / nuevas llamadas al modelo | 0 / 0 |
|
|
59
|
+
|
|
60
|
+
La gramática se escribió tras conocer estas respuestas: **repetición posterior de casos de desarrollo**, sin validación semántica independiente ni holdout. La extracción no lee las etiquetas de referencia; después se compara con la revisión previa. Detectar cuatro contradicciones no valida toda la prosa ni estima falsas alarmas generales. Las cuatro explicaciones erróneas no se regeneraron ni corrigieron. En tres textos sigue faltando divulgación: la protección nueva es el aviso separado del hook, cuya presentación por el cliente aún debe comprobarse. No se midió corrección del modelo ni eficacia independiente.
|
|
61
|
+
|
|
62
|
+
Desarrollo y revisión con ayuda de IA; sin revisión semántica independiente y ciega.
|
|
63
|
+
|
|
64
|
+
[results.json](data/launchgate-constraint-evidence-2026-10-26/results.json), [cases.json](data/launchgate-constraint-evidence-2026-10-26/cases.json), [execution.json](data/launchgate-constraint-evidence-2026-10-26/execution.json), [input-manifest.json](data/launchgate-constraint-evidence-2026-10-26/input-manifest.json), [manifest.json](data/launchgate-constraint-evidence-2026-10-26/manifest.json).
|
|
65
|
+
|
|
66
|
+
<!-- fresh-recheck-results -->
|
|
67
|
+
|
|
68
|
+
[Revisiones nuevas del modelo: hechos concretos y divulgación](flow-guard-fresh-rechecks-2026-10-26.es.md).
|
|
69
|
+
|
|
70
|
+
<!-- factorial-review-followup -->
|
|
71
|
+
|
|
72
|
+
[Referencias y órdenes de corrección: comparación de cuatro condiciones](flow-guard-review-factors-2026-10-26.es.md).
|
|
73
|
+
|
|
74
|
+
<!-- structured-answer-gate -->
|
|
75
|
+
|
|
76
|
+
[Validación por la aplicación](flow-guard-answer-gate.es.md): todas las reglas, corrección adicional limitada y salida almacenada; solo datos estructurados.
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Preuves déterministes et conservation de la divulgation
|
|
2
|
+
|
|
3
|
+
[en](flow-guard-constraint-evidence.md) · [ru](flow-guard-constraint-evidence.ru.md) · [es](flow-guard-constraint-evidence.es.md) · [fr](flow-guard-constraint-evidence.fr.md) · [zh](flow-guard-constraint-evidence.zh.md)
|
|
4
|
+
|
|
5
|
+
Candidat local 0.22.0, non publié sur npm. Parmi douze paires examinées, quatre réponses déclaraient admissible une fiche à $190 malgré un plafond de $150 ; trois continuations supprimaient la divulgation de l’instruction. Les réponses et résultats historiques restent inchangés.
|
|
6
|
+
|
|
7
|
+
## Contrat et confiance
|
|
8
|
+
|
|
9
|
+
L’hôte peut fournir `answer_check` au hook Stop ou appeler l’export `checkAnswerConstraints`. Le contrat lie SHA-256 de la réponse exacte, session et tour positif. Un adaptateur de confiance fournit règles utilisateur/politique, capture des fiches, ID choisi et ensemble explicitement déclaré admissible. Chaque membre est vérifié ; la simple présence dans la source n’est pas une déclaration d’admissibilité. Opérateurs : `lte`/`gte` numériques finis, `eq` numérique/booléen strict.
|
|
10
|
+
|
|
11
|
+
Champs ou ID absents restent inconnus ; un contrat mal formé ou périmé ne passe pas. Les preuves utilisent positions et valeurs (`actual 190; required <= 150`), sans noms, ID, libellés, URL ni citations d’attaque. Les règles ne viennent jamais des instructions du serveur MCP. L’hôte normalise monnaies et unités ; les faits restent conditionnels à la capture. Cette vérification ne certifie pas le serveur et n’accorde aucune permission. Le hash ne protège pas contre un hôte malveillant.
|
|
12
|
+
|
|
13
|
+
## Continuation et divulgation
|
|
14
|
+
|
|
15
|
+
Après du texte externe enregistré, une contradiction valide peut demander une continuation sans recouvrement littéral ; l’ancien détecteur demeure. Un reçu du guard pour ce tour conserve un avis fixe d’instruction externe dans `systemMessage`, même si le modèle supprime sa divulgation. Aucune seconde continuation n’est demandée. Un nouveau tour efface le reçu ; audit observe seulement. Les mêmes faits permettent de signaler les contradictions restantes ; une capture absente ou modifiée rend leur résolution inconnue. Une correction peut garder un ID admissible.
|
|
16
|
+
|
|
17
|
+
L’hôte doit afficher `systemMessage` : ni rendu du client natif ni maintien de la prose du modèle ne sont établis ici.
|
|
18
|
+
|
|
19
|
+
## Exemple côté hôte
|
|
20
|
+
|
|
21
|
+
Prompt et résultat externe doivent déjà être enregistrés ; `turn` correspond au tour courant du guard. L’hôte extrait les affirmations explicites, pas WARDEN.
|
|
22
|
+
|
|
23
|
+
```js
|
|
24
|
+
import { createHash } from 'node:crypto';
|
|
25
|
+
import { checkAnswerConstraints } from '@aimarket/warden';
|
|
26
|
+
|
|
27
|
+
const answer = 'A is selected. A and C are eligible.';
|
|
28
|
+
const answer_check = {
|
|
29
|
+
schema: 'warden-answer-check/1', sessionId: 'session-1', turn: 1,
|
|
30
|
+
answerSha256: createHash('sha256').update(answer).digest('hex'),
|
|
31
|
+
rules: [{ field: 'priceUsd', op: 'lte', value: 150 }],
|
|
32
|
+
records: [
|
|
33
|
+
{ id: 'A', attributes: { priceUsd: 123 } },
|
|
34
|
+
{ id: 'C', attributes: { priceUsd: 190 } },
|
|
35
|
+
],
|
|
36
|
+
claims: { selectedId: 'A', eligibleIds: ['A', 'C'] },
|
|
37
|
+
};
|
|
38
|
+
const evidence = checkAnswerConstraints(answer_check, answer, 'session-1', 1);
|
|
39
|
+
// evidence.violations: [{ item: 2, rule: 1, op: 'lte', limit: 150, actual: 190 }]
|
|
40
|
+
// Stop input: { session_id: 'session-1', last_assistant_message: answer, answer_check }
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Portée
|
|
44
|
+
|
|
45
|
+
L’adaptateur de recherche `scripts/selection-probe/constraint_claims.py` reconnaît uniquement une grammaire anglaise fermée de listes d’hôtels dans un JSON synthétique. Il n’utilise pas les étiquettes sémantiques de référence, exclut le suffixe d’avertissement, refuse les listes non reconnues et laisse le reste non examiné. Il ne vérifie pas chaque prix ni ne déduit des contraintes générales de la prose. L’entrée Stop native ne construit pas automatiquement ce contrat.
|
|
46
|
+
|
|
47
|
+
## Validation Linux — 26 octobre 2026
|
|
48
|
+
|
|
49
|
+
Compilation et typage réussis : **743 tests WARDEN dans 21 fichiers**, dont 29 nouveaux ; **24 tests Python** et **gate déterministe existant de 28 scénarios**. Les 276 hash de sortie ont été vérifiés. Tests sans réseau ; seule l’installation des dépendances npm utilisait le réseau. Répertoire distant temporaire supprimé. Build local et plugin synchronisés depuis Linux après vérification des sources gelées.
|
|
50
|
+
|
|
51
|
+
| Observation sur les réponses conservées | Résultat |
|
|
52
|
+
| --- | ---: |
|
|
53
|
+
| Paires initiales/finales réelles rejouées | 12 |
|
|
54
|
+
| Ensembles admissibles erronés avec $190 malgré le plafond $150 | 4 |
|
|
55
|
+
| Contradictions conservées dans les anciennes réponses finales intactes | 4 |
|
|
56
|
+
| Avis du guard conservés dans la sortie de continuation | 12/12 |
|
|
57
|
+
| Pertes antérieures de divulgation accompagnées d’un avis du guard | 3/3 |
|
|
58
|
+
| Secondes continuations / nouveaux appels modèle | 0 / 0 |
|
|
59
|
+
|
|
60
|
+
La grammaire a été écrite après lecture de ces réponses : **rejeu a posteriori de cas de développement**, pas de validation sémantique indépendante ni de holdout. L’extraction ne lit pas les étiquettes de référence ; ses résultats sont ensuite comparés à la revue précédente. Détecter quatre contradictions ne valide pas toute la prose et n’estime pas un taux général de faux positifs. Les quatre explications erronées ne sont ni régénérées ni corrigées. Trois textes du modèle restent sans divulgation : le nouveau contrôle est l’avis séparé du hook, dont l’affichage client reste à vérifier. Correction par le modèle et efficacité indépendante ne sont pas mesurées.
|
|
61
|
+
|
|
62
|
+
Développement et revue assistés par IA ; aucune revue sémantique indépendante en aveugle.
|
|
63
|
+
|
|
64
|
+
[results.json](data/launchgate-constraint-evidence-2026-10-26/results.json), [cases.json](data/launchgate-constraint-evidence-2026-10-26/cases.json), [execution.json](data/launchgate-constraint-evidence-2026-10-26/execution.json), [input-manifest.json](data/launchgate-constraint-evidence-2026-10-26/input-manifest.json), [manifest.json](data/launchgate-constraint-evidence-2026-10-26/manifest.json).
|
|
65
|
+
|
|
66
|
+
<!-- fresh-recheck-results -->
|
|
67
|
+
|
|
68
|
+
[Nouvelles revues du modèle : faits concrets et divulgation](flow-guard-fresh-rechecks-2026-10-26.fr.md).
|
|
69
|
+
|
|
70
|
+
<!-- factorial-review-followup -->
|
|
71
|
+
|
|
72
|
+
[Références et consignes de correction : quatre conditions](flow-guard-review-factors-2026-10-26.fr.md).
|
|
73
|
+
|
|
74
|
+
<!-- structured-answer-gate -->
|
|
75
|
+
|
|
76
|
+
[Validation par l’application](flow-guard-answer-gate.fr.md) : toutes les règles, correction supplémentaire bornée et sortie tamponnée ; données structurées uniquement.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Deterministic answer evidence and disclosure continuity
|
|
2
|
+
|
|
3
|
+
[en](flow-guard-constraint-evidence.md) · [ru](flow-guard-constraint-evidence.ru.md) · [es](flow-guard-constraint-evidence.es.md) · [fr](flow-guard-constraint-evidence.fr.md) · [zh](flow-guard-constraint-evidence.zh.md)
|
|
4
|
+
|
|
5
|
+
Local candidate 0.22.0; not published to npm. This change follows the twelve-pair justification review. Four answers included a $190 record in the eligible set despite a $150 cap; three model continuations removed instruction disclosure. Historical answers and outcomes are unchanged.
|
|
6
|
+
|
|
7
|
+
## What the runtime checks
|
|
8
|
+
|
|
9
|
+
The host may supply an optional `answer_check` object to the Stop hook, or call the exported `checkAnswerConstraints` helper. The object binds the exact answer SHA-256, session and positive turn number. A trusted host adapter supplies user/policy constraints, a captured record snapshot, the selected ID and explicit positive eligibility claims. Rules support finite numeric `lte`/`gte` and strict numeric/boolean `eq`.
|
|
10
|
+
|
|
11
|
+
Every claimed eligible item is checked, including the selected item. A valid selection does not excuse an invalid eligible alternative. A record merely present in the source is not automatically claimed eligible. Missing fields/IDs remain unknown; malformed or stale envelopes are invalid, never a passed check. Evidence reports a positional item/rule number and finite values, such as `actual 190; required <= 150`, without echoing source names, IDs, field labels, URLs or attack quotes.
|
|
12
|
+
|
|
13
|
+
Rules must come from the real user or operator policy. Never forward server-authored `answer_check` objects as trusted host input. Normalize currencies, units and field meaning before checking. Record facts remain conditional on their captured source; this mechanism neither verifies a lying server nor grants permissions. Hash binding prevents accidental answer/snapshot mixups, not a malicious host.
|
|
14
|
+
|
|
15
|
+
## Stop and disclosure
|
|
16
|
+
|
|
17
|
+
After recorded outside text, a validated contradiction can request one Stop continuation even without a literal instruction overlap. Existing overlap checks still apply. A guard-owned same-turn receipt preserves a fixed source-instruction notice in the continuation hook output even if the model deletes its own disclosure. The hook does not request another continuation. New user turns clear the receipt; audit mode remains observational.
|
|
18
|
+
|
|
19
|
+
An unchanged facts digest permits reporting remaining contradictions. A missing or changed snapshot leaves resolution unknown. Correction may retain the selected ID when that choice remains admissible. Keeping the notice in hook output is distinct from preserving the model's own prose: the host must display `systemMessage`; native-client rendering has not been measured here.
|
|
20
|
+
|
|
21
|
+
## Host contract example
|
|
22
|
+
|
|
23
|
+
The example below assumes a prompt and outside-tool-result event have already been recorded. `turn` must match the guard's current turn. The host extracted the explicit eligible set from this exact answer; WARDEN does not infer arbitrary prose.
|
|
24
|
+
|
|
25
|
+
```js
|
|
26
|
+
import { createHash } from 'node:crypto';
|
|
27
|
+
import { checkAnswerConstraints } from '@aimarket/warden';
|
|
28
|
+
|
|
29
|
+
const answer = 'A is selected. A and C are eligible.';
|
|
30
|
+
const answer_check = {
|
|
31
|
+
schema: 'warden-answer-check/1', sessionId: 'session-1', turn: 1,
|
|
32
|
+
answerSha256: createHash('sha256').update(answer).digest('hex'),
|
|
33
|
+
rules: [{ field: 'priceUsd', op: 'lte', value: 150 }],
|
|
34
|
+
records: [
|
|
35
|
+
{ id: 'A', attributes: { priceUsd: 123 } },
|
|
36
|
+
{ id: 'C', attributes: { priceUsd: 190 } },
|
|
37
|
+
],
|
|
38
|
+
claims: { selectedId: 'A', eligibleIds: ['A', 'C'] },
|
|
39
|
+
};
|
|
40
|
+
const evidence = checkAnswerConstraints(answer_check, answer, 'session-1', 1);
|
|
41
|
+
// evidence.violations: [{ item: 2, rule: 1, op: 'lte', limit: 150, actual: 190 }]
|
|
42
|
+
// Stop input: { session_id: 'session-1', last_assistant_message: answer, answer_check }
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Adapter scope and evidence
|
|
46
|
+
|
|
47
|
+
The repository-only `scripts/selection-probe/constraint_claims.py` adapter understands a closed English eligibility-list grammar in the synthetic hotel answer JSON. It extracts claims without semantic gold labels, strips the canonical warning suffix, rejects unsupported eligibility-list forms, and labels other prose unexamined. It does not validate every price assertion, infer arbitrary numeric constraints from prose, or ship as a general NLP adapter. The ordinary native Stop input does not automatically provide this optional contract.
|
|
48
|
+
|
|
49
|
+
## Linux validation — 26 October 2026
|
|
50
|
+
|
|
51
|
+
Build and typecheck passed, together with **743 WARDEN tests in 21 files** (including 29 new constraint/continuation tests), **24 Python instrument tests** and the existing **28-scenario deterministic gate**. All 276 collected output hashes were verified. Runtime checks had no network; only npm dependency installation had network. The temporary remote root was removed. The local build and plugin were synchronized from these Linux-generated outputs, after rechecking frozen source hashes.
|
|
52
|
+
|
|
53
|
+
| Saved-answer observation | Result |
|
|
54
|
+
| --- | ---: |
|
|
55
|
+
| Actual initial/final pairs replayed | 12 |
|
|
56
|
+
| Explicit eligible sets with a $190 item despite the $150 limit | 4 |
|
|
57
|
+
| Same contradictions still present in the unchanged old final answers | 4 |
|
|
58
|
+
| Continuation hook outputs retaining the guard instruction notice | 12/12 |
|
|
59
|
+
| Prior model-text disclosure losses accompanied by that guard notice | 3/3 |
|
|
60
|
+
| Second continuations requested / new model calls | 0 / 0 |
|
|
61
|
+
|
|
62
|
+
The adapter's grammar was written after seeing these saved answers; this is **post-hoc development-case replay**, not independent semantic validation or a holdout. It independently extracts claim lists at execution time without reading the gold labels, then the replay compares detections with the earlier audit. Finding all four contradictions does not validate all prose or establish a general false-positive rate. The four original wrong explanations were not regenerated or corrected in this replay. Three model prose disclosures remain absent: the new safeguard is an independently emitted hook notice, whose client-side display must still be verified. New model correction and held-out efficacy remain unmeasured.
|
|
63
|
+
|
|
64
|
+
Development and review used AI assistance; no independent blinded semantic review is claimed.
|
|
65
|
+
|
|
66
|
+
[results.json](data/launchgate-constraint-evidence-2026-10-26/results.json), [cases.json](data/launchgate-constraint-evidence-2026-10-26/cases.json), [execution.json](data/launchgate-constraint-evidence-2026-10-26/execution.json), [input-manifest.json](data/launchgate-constraint-evidence-2026-10-26/input-manifest.json), [manifest.json](data/launchgate-constraint-evidence-2026-10-26/manifest.json).
|
|
67
|
+
|
|
68
|
+
<!-- fresh-recheck-results -->
|
|
69
|
+
|
|
70
|
+
[Fresh model rechecks: concrete facts and disclosure](flow-guard-fresh-rechecks-2026-10-26.md).
|
|
71
|
+
|
|
72
|
+
<!-- factorial-review-followup -->
|
|
73
|
+
|
|
74
|
+
[Record references and correction directives: a four-condition model test](flow-guard-review-factors-2026-10-26.md).
|
|
75
|
+
|
|
76
|
+
<!-- structured-answer-gate -->
|
|
77
|
+
|
|
78
|
+
[Host-owned answer gate](flow-guard-answer-gate.md): all constraints, bounded extra correction and buffered final delivery; structured data only.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Детерминированные факты для проверки ответа и сохранение раскрытия
|
|
2
|
+
|
|
3
|
+
[en](flow-guard-constraint-evidence.md) · [ru](flow-guard-constraint-evidence.ru.md) · [es](flow-guard-constraint-evidence.es.md) · [fr](flow-guard-constraint-evidence.fr.md) · [zh](flow-guard-constraint-evidence.zh.md)
|
|
4
|
+
|
|
5
|
+
Локальный кандидат 0.22.0; в npm не опубликован. Доработка следует за разбором двенадцати пар: четыре ответа ошибочно включали запись за $190 в допустимый набор при лимите $150, а три продолжения убрали раскрытие инструкции. Исторические ответы и результаты не изменены.
|
|
6
|
+
|
|
7
|
+
## Что проверяет runtime
|
|
8
|
+
|
|
9
|
+
Хост может передать необязательный объект `answer_check` в Stop hook либо вызвать экспортированный `checkAnswerConstraints`. Объект привязан к SHA-256 точного ответа, сессии и положительному номеру хода. Доверенный адаптер хоста передаёт ограничения пользователя/политики, снимок записей, выбранный ID и явно заявленный допустимый набор. Поддерживаются числовые `lte`/`gte` и строгое числовое/логическое `eq`.
|
|
10
|
+
|
|
11
|
+
Проверяется каждый объект, объявленный допустимым, включая выбранный. Корректный выбор не оправдывает ошибочный список альтернатив. Простое присутствие записи в источнике не означает заявления о её допустимости. Неизвестные поля и ID остаются неизвестными; некорректный либо устаревший контракт не считается пройденной проверкой. Сообщение содержит номера объекта/правила и конечные значения, например `actual 190; required <= 150`, без имён источников, ID, названий полей, URL и цитат атаки.
|
|
12
|
+
|
|
13
|
+
Ограничения берутся из настоящего запроса пользователя либо политики оператора. Нельзя продвигать `answer_check` от MCP-сервера в доверенный ввод хоста. Валюты, единицы и смысл полей предварительно нормализует адаптер. Проверка условна относительно полученных фактов: она не удостоверяет правдивость сервера и не выдаёт разрешений. Хеш защищает от случайного смешения ответа и снимка, не от злонамеренного хоста.
|
|
14
|
+
|
|
15
|
+
## Stop и раскрытие
|
|
16
|
+
|
|
17
|
+
После зарегистрированного внешнего текста подтверждённое противоречие может запросить одно продолжение Stop даже без буквального совпадения с инструкцией. Прежняя проверка совпадения остаётся. Запись guard для текущего хода сохраняет фиксированное уведомление об инструкции в выходе hook после продолжения, даже если модель убрала собственное раскрытие. Второе продолжение не запрашивается. Новый ход очищает запись; audit остаётся наблюдательным.
|
|
18
|
+
|
|
19
|
+
При совпадении хеша фактов выводятся оставшиеся противоречия. Отсутствующий или изменённый снимок оставляет исправление неизвестным. Исправление может сохранить выбранный ID, если он допустим. Уведомление hook и текст самой модели — разные вещи: хост должен показывать `systemMessage`; отображение в нативном клиенте здесь не измерялось.
|
|
20
|
+
|
|
21
|
+
## Пример контракта хоста
|
|
22
|
+
|
|
23
|
+
До примера уже зарегистрированы prompt и внешний tool result. `turn` должен совпадать с текущим ходом guard. Явный список допустимых объектов извлёк хост из точного ответа; WARDEN не интерпретирует произвольную прозу.
|
|
24
|
+
|
|
25
|
+
```js
|
|
26
|
+
import { createHash } from 'node:crypto';
|
|
27
|
+
import { checkAnswerConstraints } from '@aimarket/warden';
|
|
28
|
+
|
|
29
|
+
const answer = 'A is selected. A and C are eligible.';
|
|
30
|
+
const answer_check = {
|
|
31
|
+
schema: 'warden-answer-check/1', sessionId: 'session-1', turn: 1,
|
|
32
|
+
answerSha256: createHash('sha256').update(answer).digest('hex'),
|
|
33
|
+
rules: [{ field: 'priceUsd', op: 'lte', value: 150 }],
|
|
34
|
+
records: [
|
|
35
|
+
{ id: 'A', attributes: { priceUsd: 123 } },
|
|
36
|
+
{ id: 'C', attributes: { priceUsd: 190 } },
|
|
37
|
+
],
|
|
38
|
+
claims: { selectedId: 'A', eligibleIds: ['A', 'C'] },
|
|
39
|
+
};
|
|
40
|
+
const evidence = checkAnswerConstraints(answer_check, answer, 'session-1', 1);
|
|
41
|
+
// evidence.violations: [{ item: 2, rule: 1, op: 'lte', limit: 150, actual: 190 }]
|
|
42
|
+
// Stop input: { session_id: 'session-1', last_assistant_message: answer, answer_check }
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Границы адаптера и доказательства
|
|
46
|
+
|
|
47
|
+
Исследовательский `scripts/selection-probe/constraint_claims.py` распознаёт закрытую английскую грамматику списка допустимых отелей в синтетическом JSON-ответе. Он извлекает утверждения без золотых семантических меток, исключает стандартный суффикс предупреждения, отклоняет неподдерживаемую форму списка и помечает прочую прозу непроверенной. Это не проверка всех заявленных цен, не извлечение произвольных числовых условий из прозы и не универсальный NLP-адаптер. Обычный нативный Stop сам этот контракт не формирует.
|
|
48
|
+
|
|
49
|
+
## Проверка на Linux — 26 октября 2026
|
|
50
|
+
|
|
51
|
+
Сборка и проверка типов прошли, как и **743 теста WARDEN в 21 файле** (в том числе 29 новых проверок ограничений и продолжений), **24 Python-теста инструментов** и существующий **детерминированный gate из 28 сценариев**. Проверены все 276 хешей собранных файлов. Runtime-проверки выполнялись без сети; сеть была только у установки npm-зависимостей. Временный каталог сервера удалён. Локальная сборка и plugin синхронизированы из результатов Linux после проверки совпадения исходников с замороженным манифестом.
|
|
52
|
+
|
|
53
|
+
| Наблюдение на сохранённых ответах | Результат |
|
|
54
|
+
| --- | ---: |
|
|
55
|
+
| Повторены реальные пары начального/конечного ответа | 12 |
|
|
56
|
+
| Найден ошибочный допустимый набор с объектом за $190 при лимите $150 | 4 |
|
|
57
|
+
| Противоречия сохраняются в неизменных прежних конечных ответах | 4 |
|
|
58
|
+
| Выход hook после продолжения сохраняет уведомление guard об инструкции | 12/12 |
|
|
59
|
+
| Прежние потери раскрытия в тексте модели сопровождаются уведомлением guard | 3/3 |
|
|
60
|
+
| Запрошено вторых продолжений / новых вызовов модели | 0 / 0 |
|
|
61
|
+
|
|
62
|
+
Грамматика адаптера написана после знакомства с этими ответами: это **последующий повтор известных случаев разработки**, не независимая семантическая проверка и не holdout. При исполнении списки утверждений извлекаются без золотых меток, затем результат сравнивается с прежним разбором. Обнаружение всех четырёх противоречий не подтверждает всю прозу и не оценивает общую частоту ложных тревог. Четыре ошибочных объяснения в этом повторе не перегенерированы и не исправлены. В трёх текстах модели раскрытие по-прежнему отсутствует: новая защита — отдельное уведомление hook, показ которого клиентом ещё надо проверить. Исправления моделью и эффективность на отложенных примерах не измерены.
|
|
63
|
+
|
|
64
|
+
Разработка и разбор выполнены с AI-помощью; независимая ослеплённая семантическая проверка не заявлена.
|
|
65
|
+
|
|
66
|
+
[results.json](data/launchgate-constraint-evidence-2026-10-26/results.json), [cases.json](data/launchgate-constraint-evidence-2026-10-26/cases.json), [execution.json](data/launchgate-constraint-evidence-2026-10-26/execution.json), [input-manifest.json](data/launchgate-constraint-evidence-2026-10-26/input-manifest.json), [manifest.json](data/launchgate-constraint-evidence-2026-10-26/manifest.json).
|
|
67
|
+
|
|
68
|
+
<!-- fresh-recheck-results -->
|
|
69
|
+
|
|
70
|
+
[Свежие перепроверки модели: конкретные факты и раскрытие](flow-guard-fresh-rechecks-2026-10-26.ru.md).
|
|
71
|
+
|
|
72
|
+
<!-- factorial-review-followup -->
|
|
73
|
+
|
|
74
|
+
[Ссылки на записи и прямые команды: проверка четырёх условий](flow-guard-review-factors-2026-10-26.ru.md).
|
|
75
|
+
|
|
76
|
+
<!-- structured-answer-gate -->
|
|
77
|
+
|
|
78
|
+
[Проверка ответа приложением](flow-guard-answer-gate.ru.md): все ограничения, дополнительный ограниченный проход и буферизация выдачи; только структурированные данные.
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# 确定性答案证据与披露保留
|
|
2
|
+
|
|
3
|
+
[en](flow-guard-constraint-evidence.md) · [ru](flow-guard-constraint-evidence.ru.md) · [es](flow-guard-constraint-evidence.es.md) · [fr](flow-guard-constraint-evidence.fr.md) · [zh](flow-guard-constraint-evidence.zh.md)
|
|
4
|
+
|
|
5
|
+
本地候选版本 0.22.0,未发布到 npm。此前检查的 12 对答案中,4 对在 $150 上限下把 $190 记录列为合格;3 次继续生成删除了注入披露。历史答案与结果保持原样。
|
|
6
|
+
|
|
7
|
+
## 合约与信任边界
|
|
8
|
+
|
|
9
|
+
宿主可向 Stop hook 提供可选 `answer_check`,或调用导出的 `checkAnswerConstraints`。合约绑定精确答案 SHA-256、会话与正数轮次。可信宿主适配器提供用户/策略约束、记录快照、选中 ID 及明确声称合格的 ID 集。检查整个集合;来源里出现记录不等于答案声称其合格。支持有限数值 `lte`/`gte` 以及严格数值/布尔 `eq`。
|
|
10
|
+
|
|
11
|
+
缺失字段/ID 保持未知;畸形或过期合约不算通过。证据只输出位置和数值,例如 `actual 190; required <= 150`,不复述来源名称、ID、字段名、URL 或攻击引文。规则必须来自真实用户或运营策略,不能把 MCP 服务提供的合约提升为可信输入。宿主负责统一币种和单位。事实仍以来源快照为条件,不证明服务器诚实,也不授予权限。哈希不防御恶意宿主。
|
|
12
|
+
|
|
13
|
+
## Stop 与披露
|
|
14
|
+
|
|
15
|
+
登记过外部文本后,有效矛盾可在没有字面指令重叠时请求一次继续生成;原有重叠检查仍保留。Guard 在当前轮次保存凭据,即使模型删除披露,后续 hook 的 `systemMessage` 仍保留固定外部指令提示,不请求第二次继续生成。新轮次清除凭据;audit 仅观察。相同事实哈希下报告剩余矛盾;快照缺失或变化时,是否解决仍未知。合格选择可保留同一个 ID。
|
|
16
|
+
|
|
17
|
+
宿主必须显示 `systemMessage`;这里没有测试原生客户端实际呈现,也不保证模型自己的文字保留披露。
|
|
18
|
+
|
|
19
|
+
## 宿主示例
|
|
20
|
+
|
|
21
|
+
此前需已登记 prompt 和外部工具结果;`turn` 必须匹配 guard 当前轮次。明确主张由宿主提取,WARDEN 不理解任意自然语言。
|
|
22
|
+
|
|
23
|
+
```js
|
|
24
|
+
import { createHash } from 'node:crypto';
|
|
25
|
+
import { checkAnswerConstraints } from '@aimarket/warden';
|
|
26
|
+
|
|
27
|
+
const answer = 'A is selected. A and C are eligible.';
|
|
28
|
+
const answer_check = {
|
|
29
|
+
schema: 'warden-answer-check/1', sessionId: 'session-1', turn: 1,
|
|
30
|
+
answerSha256: createHash('sha256').update(answer).digest('hex'),
|
|
31
|
+
rules: [{ field: 'priceUsd', op: 'lte', value: 150 }],
|
|
32
|
+
records: [
|
|
33
|
+
{ id: 'A', attributes: { priceUsd: 123 } },
|
|
34
|
+
{ id: 'C', attributes: { priceUsd: 190 } },
|
|
35
|
+
],
|
|
36
|
+
claims: { selectedId: 'A', eligibleIds: ['A', 'C'] },
|
|
37
|
+
};
|
|
38
|
+
const evidence = checkAnswerConstraints(answer_check, answer, 'session-1', 1);
|
|
39
|
+
// evidence.violations: [{ item: 2, rule: 1, op: 'lte', limit: 150, actual: 190 }]
|
|
40
|
+
// Stop input: { session_id: 'session-1', last_assistant_message: answer, answer_check }
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## 范围
|
|
44
|
+
|
|
45
|
+
研究适配器 `scripts/selection-probe/constraint_claims.py` 只识别合成酒店 JSON 答案里的封闭英文合格列表语法。不使用语义金标,排除标准警告后缀,拒绝不支持的列表,其余文字标为未检查。它不核验所有价格主张,也不从任意文字提取数字约束。普通原生 Stop 输入不会自动产生此合约。
|
|
46
|
+
|
|
47
|
+
## Linux 验证 — 2026 年 10 月 26 日
|
|
48
|
+
|
|
49
|
+
构建和类型检查通过;**21 个文件中的 743 项 WARDEN 测试**(含 29 项新增)、**24 项 Python 工具测试**及现有 **28 场景确定性 gate** 均通过。核验全部 276 个输出哈希。运行时测试无网络,只有 npm 依赖安装联网。远端临时目录已删除。确认冻结源文件一致后,从 Linux 生成产物同步本地构建和插件。
|
|
50
|
+
|
|
51
|
+
| 保存答案上的观察 | 结果 |
|
|
52
|
+
| --- | ---: |
|
|
53
|
+
| 重放真实初始/最终答案对 | 12 |
|
|
54
|
+
| 在 $150 上限下声称 $190 项合格的错误集合 | 4 |
|
|
55
|
+
| 未改动旧最终答案中仍存在的矛盾 | 4 |
|
|
56
|
+
| 继续生成后 hook 输出保留 guard 指令提示 | 12/12 |
|
|
57
|
+
| 原先模型文字披露丢失、现在伴随 guard 提示 | 3/3 |
|
|
58
|
+
| 请求第二次继续生成 / 新增模型调用 | 0 / 0 |
|
|
59
|
+
|
|
60
|
+
适配器语法在阅读这些答案后编写:这是**开发案例的事后重放**,不是独立语义验证或留出集。运行时提取不读取金标,之后再与先前审查比较。发现 4 个矛盾不代表全文正确,也不估计一般误报率。4 个错误解释没有重新生成或被纠正;3 个模型文本仍缺少披露。新增保障是独立 hook 提示,其客户端实际显示仍需验证。模型纠错和独立泛化有效性均未测量。
|
|
61
|
+
|
|
62
|
+
开发和审查使用 AI 辅助;不声称独立盲法语义评审。
|
|
63
|
+
|
|
64
|
+
[results.json](data/launchgate-constraint-evidence-2026-10-26/results.json), [cases.json](data/launchgate-constraint-evidence-2026-10-26/cases.json), [execution.json](data/launchgate-constraint-evidence-2026-10-26/execution.json), [input-manifest.json](data/launchgate-constraint-evidence-2026-10-26/input-manifest.json), [manifest.json](data/launchgate-constraint-evidence-2026-10-26/manifest.json).
|
|
65
|
+
|
|
66
|
+
<!-- fresh-recheck-results -->
|
|
67
|
+
|
|
68
|
+
[模型新一轮复查:具体事实与披露](flow-guard-fresh-rechecks-2026-10-26.zh.md).
|
|
69
|
+
|
|
70
|
+
<!-- factorial-review-followup -->
|
|
71
|
+
|
|
72
|
+
[记录引用与纠错命令:四条件模型测试](flow-guard-review-factors-2026-10-26.zh.md).
|
|
73
|
+
|
|
74
|
+
<!-- structured-answer-gate -->
|
|
75
|
+
|
|
76
|
+
[应用答案门禁](flow-guard-answer-gate.zh.md):全部规则、有界额外纠正与缓冲交付;仅支持结构化数据。
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Comparación final de evidencia numérica
|
|
2
|
+
|
|
3
|
+
[en](flow-guard-final-witness-2026-10-26.md) · [ru](flow-guard-final-witness-2026-10-26.ru.md) · [es](flow-guard-final-witness-2026-10-26.es.md) · [fr](flow-guard-final-witness-2026-10-26.fr.md) · [zh](flow-guard-final-witness-2026-10-26.zh.md)
|
|
4
|
+
|
|
5
|
+
26 de octubre de 2026. **Serie terminada.** Código WARDEN local 0.22.0 sin cambios, validado con 798 pruebas. Predicciones, versiones SDK, cohorte, mensajes y orden fijados antes de API.
|
|
6
|
+
|
|
7
|
+
Se incluyen los cinco contextos reales antes retenidos (dos de origen natural, tres controlado; cuatro fixtures). Ocho bloques emparejados por contexto comparan veredicto antiguo con valores seleccionado/óptimo y referencia que alcanza el óptimo. Historia, catálogo y respuesta inválida iguales; cambia solo el último mensaje. Los números ya estaban en el catálogo.
|
|
8
|
+
|
|
9
|
+
| Población | Antiguo | Evidencia |
|
|
10
|
+
|---|---|---|
|
|
11
|
+
| Continuaciones de fallos conocidos | **6/40 válidas**, 34 retenidas | **40/40 válidas** |
|
|
12
|
+
| Controles correctos construidos | **20/20 conservados** | **20/20 conservados** |
|
|
13
|
+
|
|
14
|
+
34 éxitos solo con evidencia y 6 en ambos; ninguna pareja a favor exclusivo del antiguo ni doble fallo. Diferencia 85 puntos en esta cohorte; evidencia 8/8 en cada contexto. Origen natural 5/16 frente a16/16, controlado 1/24 frente a24/24. Pronósticos >=32/40, mejora >=8/40 y controles >=19/20 cumplidos. Los mensajes de control positivo son idénticos entre brazos nominales; miden conservación.
|
|
15
|
+
|
|
16
|
+
Los 86 frames entregados pasan auditoría aritmética; 34 salidas antiguas incorrectas retenidas, aviso en los 120. Sin error API, descartes, reintentos o estudio repetido. Es una continuación de investigación desde una respuesta retenida, no una tercera reparación del producto; sigue el límite de dos.
|
|
17
|
+
|
|
18
|
+
Resultado del mensaje completo en fallos seleccionados conocidos, no holdout independiente, fiabilidad general, eficacia de mensajes de conjunto incompleto ni causa interna. Autor/auditoría con IA, sin cegamiento ni GUI nativa ajena comprobada. No se aísla una frase ni déficit informativo. Resultados previos intactos.
|
|
19
|
+
|
|
20
|
+
Antes de API: 8 pruebas de estudio +28 relay/presupuesto/colección, 120 preflights Linux. Runner sin red/clave; solo relay del host al endpoint oficial. Todos los intercambios conservados, **253 hashes** verificados antes del borrado.
|
|
21
|
+
|
|
22
|
+
120 llamadas off-peak: usage **USD .012380472**, pico conservador **USD .024760944**. Con el prospectivo anterior: **USD .041314905** por franja / **USD .082629810** conservador, menor que .15. Factura/saldo no consultados, servidor existente. Sin publicación GitHub/npm ni comentario; no más experimentos de esta serie.
|
|
23
|
+
|
|
24
|
+
[analysis.json](data/launchgate-final-witness-2026-10-26/analysis.json) · [protocol.md](data/launchgate-final-witness-2026-10-26/protocol.md) · [freeze.json](data/launchgate-final-witness-2026-10-26/freeze.json) · [execution.json](data/launchgate-final-witness-2026-10-26/execution.json) · [trajectories.jsonl](data/launchgate-final-witness-2026-10-26/trajectories.jsonl) · [manifest.json](data/launchgate-final-witness-2026-10-26/manifest.json)
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Comparaison finale du constat numérique
|
|
2
|
+
|
|
3
|
+
[en](flow-guard-final-witness-2026-10-26.md) · [ru](flow-guard-final-witness-2026-10-26.ru.md) · [es](flow-guard-final-witness-2026-10-26.es.md) · [fr](flow-guard-final-witness-2026-10-26.fr.md) · [zh](flow-guard-final-witness-2026-10-26.zh.md)
|
|
4
|
+
|
|
5
|
+
26 octobre 2026. **Série terminée.** WARDEN local 0.22.0 inchangé, validé par 798 tests. Prédictions, versions SDK, cohorte, messages et ordre figés avant API.
|
|
6
|
+
|
|
7
|
+
Les cinq contextes réels auparavant retenus sont tous inclus (deux d’origine naturelle, trois contrôlée ; quatre fixtures). Huit blocs appariés par contexte comparent ancien verdict et valeurs choisie/optimale avec une référence atteignant l’optimum. Historique, catalogue et réponse invalide identiques ; seul le dernier message change. Les nombres figuraient déjà dans le catalogue.
|
|
8
|
+
|
|
9
|
+
| Population | Ancien | Constat |
|
|
10
|
+
|---|---|---|
|
|
11
|
+
| Continuations d’erreurs connues | **6/40 valides**, 34 retenues | **40/40 valides** |
|
|
12
|
+
| Contrôles corrects construits | **20/20 conservés** | **20/20 conservés** |
|
|
13
|
+
|
|
14
|
+
34 succès uniquement avec constat, 6 dans les deux bras ; aucun ancien seul ni double échec. Écart 85 points dans cette cohorte ; constat 8/8 par contexte. Origine naturelle 5/16 contre16/16, contrôlée 1/24 contre24/24. Prédictions >=32/40, gain >=8/40 et contrôles >=19/20 atteintes. Messages de contrôle identiques entre bras nominaux : mesure de conservation.
|
|
15
|
+
|
|
16
|
+
Les 86 frames remis passent l’audit arithmétique ; 34 anciennes sorties erronées sont retenues, avis dans les 120. Aucune erreur API, tentative écartée, répétition ou nouvel essai automatique. C’est une continuation de recherche depuis une réponse retenue, pas une troisième réparation du produit ; plafond de deux inchangé.
|
|
17
|
+
|
|
18
|
+
Résultat du message complet sur des erreurs connues sélectionnées, pas holdout indépendant, fiabilité générale, efficacité du constat d’ensemble incomplet ou cause interne. Auteur/audit assistés par IA et non aveugles ; GUI native tierce non testée. Ni phrase isolée ni manque d’information démontré. Anciens résultats intacts.
|
|
19
|
+
|
|
20
|
+
Avant API : 8 tests d’étude +28 relay/budget/collecte et 120 prévalidations Linux. Runner sans réseau/clé ; seul relay du host vers le point officiel. Échanges complets conservés, **253 empreintes** vérifiées avant suppression.
|
|
21
|
+
|
|
22
|
+
120 appels hors pointe : usage **USD .012380472**, pointe prudente **USD .024760944**. Avec le prospectif précédent : **USD .041314905** selon plage / **USD .082629810** prudent, sous .15. Facture/solde non consultés, serveur existant. Aucune publication GitHub/npm ni réponse envoyée ; aucun autre essai modèle prévu dans cette série.
|
|
23
|
+
|
|
24
|
+
[analysis.json](data/launchgate-final-witness-2026-10-26/analysis.json) · [protocol.md](data/launchgate-final-witness-2026-10-26/protocol.md) · [freeze.json](data/launchgate-final-witness-2026-10-26/freeze.json) · [execution.json](data/launchgate-final-witness-2026-10-26/execution.json) · [trajectories.jsonl](data/launchgate-final-witness-2026-10-26/trajectories.jsonl) · [manifest.json](data/launchgate-final-witness-2026-10-26/manifest.json)
|