ADR-026 INV-13 S1AlwaysActive 语义重定义:从「主回路外强制必跑 + N=3 强制回路」改为「输出要素规范」
状态
accepted(owner 2026-06-07 拍板)。本 ADR 承接 ADR-025 的头号铁律「不在 ReAct 之外另架控制墙」,将 INV-13 解绑两层混淆语义。
背景
ADR-025 落定 FinBayes 骨架范式后,独立 reviewer 复审发现:strategic-invariants-codified 的 INV-13「S1AlwaysActive」 与 ADR-025 §决策5「自检 audit 不 blocking」直接冲突。INV-13 原文混淆了两件性质完全不同的事:
- 输出要素规范:每个综合输出的 schema 必须含
s1字段(这是 ADR-025 §决策3「输出要素规范」的合理诉求,与骨架铁律完全兼容)。 - 主回路外的强制控制墙:ConsistencyMiddleware 在「认知结论产出前必须运行一次」+
N=3强制回路上限 + 反向触发强制重算(这与 ADR-025 头号铁律直接冲突——它在 ReAct 主回路外架了 blocking validator)。
事实源链上的具体编码:
strategic-invariants-codified.md:501-510INV-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-4universal_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-1 | strategic-invariants-codified.md:501-510 | INV-13「S1 每次综合输出必跑」 | 改成「s1 字段必含输出 schema」+ 引用本 ADR |
| C-2 | ADR-008-supplement §2.6 | s1 schema 含 N=3 + 每次必跑 | 字段定义保留;控制流语义直接改正文到正确形态(按 ADR-025 §70 不留 marker,正文 :129 / :130 / :164 / :198 / :207 已直接改对) |
| C-3 | contracts/structured-cognition-result.yaml | 规则 c10 loop_count [0,3] N=3 上限 + s1「横切必选」 | c10 改非负 + 安全上限;s1 「字段必含输出」(schema 层) |
| C-4 | contracts/tasks-fields-mapping.yaml + MP-4 universal_required_fields | s1「全任务必跑」注释 | 注释从「必跑」改「必含」 |
| C-5 | cognition-1.1-contract.md | N=3 锁 | 改非负 + 安全上限 |
| C-6 | eval-harness.md D7 + eval-harness-formulas.md | 反向触发 M5/M6/M7 + Hit_backtrig 指标 | 改成「后续动作建议命中率」 |
| C-7 | 代号与编号索引.md INV-13 行 | "S1 每次综合输出必跑" | 改"s1 字段必含输出" |
| C-8 | CURRENT-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 - 变更协议:变更协议