跳到主要内容

ADR-026 INV-13 S1AlwaysActive 语义重定义:从「主回路外强制必跑 + N=3 强制回路」改为「输出要素规范」

状态

accepted(owner 2026-06-07 拍板)。本 ADR 承接 ADR-025 的头号铁律「不在 ReAct 之外另架控制墙」,将 INV-13 解绑两层混淆语义。

背景

ADR-025 落定 FinBayes 骨架范式后,独立 reviewer 复审发现:strategic-invariants-codifiedINV-13「S1AlwaysActive」 与 ADR-025 §决策5「自检 audit 不 blocking」直接冲突。INV-13 原文混淆了两件性质完全不同的事:

  1. 输出要素规范:每个综合输出的 schema 必须含 s1 字段(这是 ADR-025 §决策3「输出要素规范」的合理诉求,与骨架铁律完全兼容)。
  2. 主回路外的强制控制墙:ConsistencyMiddleware 在「认知结论产出前必须运行一次」+ N=3 强制回路上限 + 反向触发强制重算(这与 ADR-025 头号铁律直接冲突——它在 ReAct 主回路外架了 blocking validator)。

事实源链上的具体编码:

  • strategic-invariants-codified.md:501-510 INV-13 § 表述为 identity 级硬约束「S1 每次综合输出必跑」。
  • ADR-008-supplement §2.6 描述 s1 schema 时锁定 convergence_flag.loop_count ∈ [0, 3] + N=3 回路上限。
  • contracts/structured-cognition-result.yaml 规则 c10 把 N=3 写成 Pydantic 强制约束(Field(ge=0, le=3)),并把 s1 标为「横切必选」。
  • contracts/tasks-fields-mapping.yaml + MP-4 universal_required_fields 把 s1 列为「全任务必跑」。
  • cognition 1.1 契约源 engineering-pack 同样锁 N=3。
  • EvalHarness 子系统设计 D7 评测维度按「反向触发 M5/M6/M7」+ Hit_backtrig 指标设计。

命名注记:本 ADR 之前 ADR-022 已把 S1 原称「横切子流程」改称「跨机制子流程」;本 ADR 在引用 ADR-008-supplement §2.6 历史措辞时保留「横切」原词以指向那一节,正文用 ADR-022 新词。

决策

决策 1 · 解绑 INV-13 的两层语义

INV-13「S1AlwaysActive」重定义为「输出要素规范级」约束:每个综合输出的 schema 必须含 s1 字段(包括 8 子字段非空 / 非占位符)。这与 ADR-025 §决策3 的输出要素规范完全一致——它约束输出长什么样,不约束主回路怎么生成它。

废除的部分(与 ADR-025 头号铁律冲突):

  • 「ConsistencyMiddleware 在认知结论产出前必须运行一次」式 blocking 语义。
  • convergence_flag.loop_count ∈ [0, 3] 强制上限与 N=3 强制回路。
  • 「反向触发强制 M5 / M6 / M7 重算」 + 「第二轮 ConsistencyMiddleware 重评」的回路语义。

改写为(与 ADR-025 §决策5 对齐):

  • S1 作为 ReAct 主回路里 LLM 可主动调用的「叙事-数字一致性自检工具」+ 非阻断 audit hook。
  • LLM 自主决定调用时机、是否重复调用、是否采纳 suggest_followups 给出的后续动作建议。
  • convergence_flag.loop_count 改为非负整数(observability 记录 LLM 已自检次数),工程上设安全上限(assess_stability(safety_cap) 默认 8,防失控)。
  • s1 输出在 schema 层仍必填——LLM 输出最终答案时若未自检,s1 字段诚实标 loop_count=0 / converged=false / convergence_method=null-not-checked,不允许空字段。

决策 2 · 硬度等级保留 identity,但执行机制改为 schema validation

INV-13 仍是 identity 级硬约束,但其测试与守护改为:

  • L1(Pydantic required):所有 task 变体 schema require s1(保留不变)。
  • L2(contract test):S1 的 8 子字段非空 / 非占位符——仍保留作 schema 完整性检查;不再断言"S1 实际跑了主动一致性裁决回路"。
  • 不再:在 ReAct 主回路外架强制 ConsistencyMiddleware blocking gate 拦截输出。

决策 3 · ADR-008-supplement §2.6 同步矫正

ADR-008-supplement §2.6 关于 s1 schema 字段定义的部分(字段名 / 类型 / 枚举值)保留不动作 schema 事实源;其中"每次综合输出前必跑"+loop_count ∈ [0, 3]两条控制流语义直接改正文到正确形态——按 ADR-025 §70 不留 marker / 失效标记式脚手架的纪律,正文措辞改对(loop_count 改非负 + 加 null-not-checked + 必选可选改"字段必含输出 + 自检本身是可选工具"+ trade-off 改"安全上限"),审计轨在本 ADR + git。

后果与边界

同步矫正清单(本 ADR 落地时一并改)

#位置现状矫正
C-1strategic-invariants-codified.md:501-510INV-13「S1 每次综合输出必跑」改成「s1 字段必含输出 schema」+ 引用本 ADR
C-2ADR-008-supplement §2.6s1 schema 含 N=3 + 每次必跑字段定义保留;控制流语义直接改正文到正确形态(按 ADR-025 §70 不留 marker,正文 :129 / :130 / :164 / :198 / :207 已直接改对)
C-3contracts/structured-cognition-result.yaml规则 c10 loop_count [0,3] N=3 上限 + s1「横切必选」c10 改非负 + 安全上限;s1 「字段必含输出」(schema 层)
C-4contracts/tasks-fields-mapping.yaml + MP-4 universal_required_fieldss1「全任务必跑」注释注释从「必跑」改「必含」
C-5cognition-1.1-contract.mdN=3 锁改非负 + 安全上限
C-6eval-harness.md D7 + eval-harness-formulas.md反向触发 M5/M6/M7 + Hit_backtrig 指标改成「后续动作建议命中率」
C-7代号与编号索引.md INV-13 行"S1 每次综合输出必跑"改"s1 字段必含输出"
C-8CURRENT-MILESTONE.md 等散文引用 INV-13 旧措辞处同步矫正

不受影响的资产

  • S1 跨机制子流程的 4 失败模式判别知识、attention 二阶分支、正向耦合标签(领域知识全保留)。
  • s1 输出的 8 子字段 schema 定义(schema 事实源不动)。
  • D7 评测维度本身(评测什么仍是 S1 识别能力,仅指标定义改为命中"后续动作建议是否合理")。
  • ADR-008 supplement 的字段口径 / 必填性 / 枚举值层(这是 ADR-025 §决策6 明确保留的代码层工程术语)。

阶段 1 / 阶段 2 边界

  • 阶段 1(基线不退化)不动 cognition 真实现,本 ADR 只改文档与契约口径。
  • 阶段 2 工程实施按本 ADR 落地:ConsistencyMiddleware 从 blocking validator 重构为 ReAct 内 LLM 可选自检工具;contracts/yaml 的 Pydantic schema 同步去 N=3 上限。

关联资产

  • 骨架范式定型:ADR-025
  • 输出契约工程锁定:ADR-008 supplement(本 ADR §决策3 superseded §2.6 控制流语义)
  • 不变量事实源:strategic-invariants-codified(本 ADR §决策1 重定义 INV-13)
  • contracts 单一事实源:/contracts/structured-cognition-result.yaml + /contracts/tasks-fields-mapping.yaml
  • 变更协议:变更协议