跳到主要内容

ADR-013 — codify 哲学换轨:Build-Y 优先 + Require-X-when-Y 条件式 + 三级硬度

§0 决策简述

决议:FinBayes 工程化 codify(把战略价值 / 产品约束翻译成"机器可断言不变量与契约")的哲学,从"Prevent-X 优先(禁令型)" 换轨为"Build-Y 优先(正向契约型) + Require-X-when-Y(条件式) + 最小化 Prevent-X(仅 identity 级边界)"

触发:Batch A 落地后用户反馈 + 4 份 fresh-eyes 诊断报告(A1 战略原意 / A2 范式扫描 / A3 字段集 / A4 加码扫描)共同坐实——之前 codify 把 战略原文里大量正向能力契约("FinBayes 输出条件化判断 / 按任务动态组合 / 内部完整 reasoning")误翻译成"禁止说应该买入 / 禁止字段 stub 缺失 / 用户面必须暴露 reasoning",单点合规但集成产品柔性丧失

§1 上下文:Prevent-X 优先漂移的根因

§1.1 漂移的具体证据

战略原文我(主控)Prevent-X codify诊断证据来源
白皮书 §5 line 509:"这 10 个要素不是固化字段表——按任务动态组合"I-07 "10 字段缺一不可,M0 stub 也必须存在"A1 + A3 闭合
白皮书 §5 line 525:"在以下条件下加仓的逻辑成立"I-02 grep (应该|建议)(买入|卖出) 必须空A1
白皮书 §5 line 570:"用户产品不暴露体系本身"I-04 "用户面必须暴露 reasoning"A1 + A2
ADR-008-sup §2.5:"M7.uq 解释/比较/复盘类任务可选"I-06 "kelly_cap 全 milestone 不允许 ≥ 1"A3

§1.2 漂移的根因(5 个)

根因 R1 · Prevent-X 有 affordance

  • 翻译"禁止 X"能 grep / Pydantic validate / 简单 assert
  • 翻译"做到 Y"需要正向能力建构,没有一行 assert 能覆盖
  • AI 的眼睛被"可机器校验"affordance 吸走,把所有价值压扁成禁令

根因 R2 · "保真度" 框架天然偏 Prevent

  • Step 6-9 用"保真度 100%"作为目标 → 自然引出"防漂移" → 引出"禁令兜底"
  • ADR-012 SVA-9 把目标升级为"战略愿景对齐",但 codify 工具集没跟着升级

根因 R3 · 缺三级硬度区分

  • ADR-009 已 codify"identity(永不变)/ 当前版本立场(v3) / 工程约束(可调)"三级
  • 但 Batch A 把所有 10 条不变量都写到 identity 级硬度 → 柔性丧失
  • 例如 I-06 kelly_cap 值域是工程约束级,被错放到了 identity 级;I-02 "不替决策"原意是 identity 但被翻成"语言禁令"也是工程约束级

根因 R4 · 缺暴露面分层意识

  • 12 份工程化文档没有任何一份显式声明字段 surface
  • 工程默认"全字段都用户面" → I-04 误读的根因(A2 / A4 共同发现)

根因 R5 · 缺任务驱动意识

  • product-definition.md §7 表 2 早已 codify 任务→字段映射
  • 但工程层 contracts/ + invariants 把"动态组合"压成"扁平 schema 全部必选"
  • 7 类任务(解释 / 分析 / 比较 / 复盘 / 风险识别 / 交易准备 / 决策辅助)维度在工程层失语

§1.3 风险(不修则会发生)

  • 单点合规集成失败:所有不变量过审,集成产品柔性丧失,达不到战略愿景
  • 过度通用化 schema 导致 EvalHarness / 综合层 / Output Pipeline 全部假定单一统一 schema,下游级联漂移
  • 评测维度兼任战略执行(A4 发现 D5/D6/D7 + §7 防 gaming 表 6 条事实上是战略拦截被压成评分公式)—— Build-Y 反过来变 Anti-X

§2 三级硬度(继承自 ADR-009 + 扩展为 codify 规范)

硬度级含义修改路径示例
identity 级永不变 / 改即非 FinBayes只能 fork 项目重起I-01' ExecutionBoundary(不直接下单)/ I-02' ConditionalJudgmentContract(条件化判断核心交付物)/ I-13' S1AlwaysActive
当前版本立场v3 版本约定,未来 ADR 可重审走 governance/change-protocol.md L3 流程,新 ADR audit trailI-07' TaskMinimumFieldSet(按 product-def §7 表 2)/ I-09' MCA-7Axes-Naming / I-12' ProfileDoesNotShrinkFactSpace
工程约束按 PR / ADR 可灵活调整普通 PR + 三阶段 SOPI-05' UserFacingFieldRedaction(产品迭代可调)/ I-06' KellyCapTaskConditional / I-08' TaskTypeRequired / I-10' MechanismsSingleSource

关键原则

  • codify 时第一步是明示硬度级(不允许默认;默认 = 隐式提到 identity 级)
  • 不变量陈述里必含"硬度: identity / 当前版本立场 / 工程约束"段
  • 高硬度级承担更高 review 门槛(修改 identity 级 = 实质性触发 ADR-009 audit)

§3 三个翻译范式(Build-Y / Require-X-when-Y / Prevent-X)

§3.1 Build-Y · 正向能力契约(主体,应占 ≥ 60%)

句式:FinBayes 是什么 / 必须输出什么 / 必须配什么 / 能做到什么

示例

  • ✅ "FinBayes 输出结构化认知材料(结论 + 证据 + 条件 + 失效条件 + 不确定性)"
  • ✅ "task_type ∈ {交易准备 / 决策辅助 / 风险识别} 时输出含 posterior 块"
  • ✅ "runtime 层任何 score 字段同级必有 reasoning 字段"

Test 表达

  • Pydantic model 字段必填 + 类型约束
  • contract test 跑 N mock,断言每个输出含必要字段
  • task_type → schema variant 映射 grep 一致性

§3.2 Require-X-when-Y · 条件式契约(辅助,应占 ~30%)

句式 Y 必须 X(或:仅在 Y 时存在)

示例

  • ✅ "当 main_answer 含方向词时,prerequisites + invalidation_conditions + counter_evidence 字段必须 ≥ 1 条"
  • ✅ "task_type=解释类 时,schema 不含 posterior 块(kelly_cap 字段缺省)"
  • ✅ "当字段含 score / confidence / kelly_cap 时,同级必有 reasoning"

Test 表达

  • Pydantic inter_field_constraint
  • contract test 跑分类 case,断言条件分支
  • task-conditional schema variant

§3.3 Prevent-X · 禁令型契约(最小化,仅 identity 级用 + 应占 ≤ 10%)

句式不允许 X / 禁止 X

示例(保留的合理 Prevent):

  • ✅ I-01' identity 级:"不允许 import 交易执行 SDK"(执行边界)
  • ✅ I-11' identity 级:"输出端不允许泄漏 API key"(凭证安全)
  • ✅ I-12' 当前版本立场:"runtime 证据收集器不允许依赖 user_profile"(画像不裁剪事实空间)

示例(删除 / 降级的过宽 Prevent):

  • ❌ Batch A 的 I-02 "禁 (应该\|建议)(买入\|卖出) grep" → 删除(会误伤合规条件化输出)
  • ❌ Batch A 的 I-04 "用户面必须暴露 reasoning" → 改为 I-05' "用户面字段名收敛"(更精确)
  • ❌ Batch A 的 I-05 ForbiddenLexicon → 降级为 verify:kb hook(不进 L0.5)

§4 翻译 SOP("战略价值 → 不变量" 5 步)

每条新不变量必须按以下 5 步翻译,否则不收录:

Step 1 · 锚定战略原文

  • 引用 ≥ 1 处战略白皮书 / 产品定义 / ADR 原文(含 §X line N)
  • 不允许"凭印象总结" / "AI 自我演绎"

Step 2 · 评估硬度级

  • identity / 当前版本立场 / 工程约束 三选一
  • 默认禁止;必须明示

Step 3 · Build-Y 表达优先

  • 写"FinBayes 必须做到 Y"(正向能力)
  • 此步未通过不允许进入 Step 4

Step 4 · 加 Require-X-when-Y 条件式(如适用)

  • 哪些任务类型适用 / 哪些不适用
  • 哪些 surface 暴露面 / 哪些不暴露
  • 不允许"全任务一刀切"

Step 5 · 仅在 identity 级补 Prevent-X 边界(如必要)

  • 严格限制 Prevent-X 至执行边界 / 凭证安全 / 事实空间裁剪等少数 case
  • 必须给出"违反时长什么样"反例

最终 codify 必含 6 字段(见 13 条 spec 模板):

  1. 精确陈述
  2. 战略原文锚点
  3. 硬度级别
  4. 正向 Build-Y 必含产出
  5. 负向边界(仅在硬度允许时)
  6. 反例 + test 规格

§5 与 SVA-9 / FB-RESUME / ADR-009 的关系

既有ADR-013 怎么承接
ADR-012 SVA-9 九层防御ADR-013 是 SVA-9 L0.5 层落地的方法论 SOP——9 层结构不变,L0.5 不变量按本 ADR 重写
ADR-011 FB-RESUME 协议FB-RESUME 是会话连续性层;ADR-013 是 codify 哲学层。互不交叠
ADR-009 战略立场降级 audit trailADR-009 已 codify 三级硬度;本 ADR 把三级硬度从"战略立场"扩展到"codify 翻译"框架
ADR-003 supplement 3-phase SOP三阶段 SOP 的 plan 段加 §"必含正向产出"对称段;verify checklist 改为双向(Build-Y 验证 + 仅 identity 级 Prevent-X 验证)
MP-4 任务→字段动态组合契约ADR-013 §3.2 Require-X-when-Y 的具体落地物
MP-5 字段暴露面分层契约解决 A4 发现"暴露面零声明"问题;I-05' 落地依赖

§6 正向准则(应当 Build-Y)

本节用正向句式表述 codify 应当做到什么——刻意不用"❌ 禁止"反模式句式,避免"用 Prevent 反 Prevent"的自我打脸(与本 ADR §0 Build-Y 优先口径一致)。每条括号内附"若不这样会回到哪个旧问题",保留原反模式的实质警示。

  • Build-Y 优先翻译:每条战略价值先翻译成"FinBayes 必须做到 Y"(正向能力),Prevent-X 仅作 identity 级边界补充(否则会回到把价值压扁成禁令的系统性漂移)
  • 硬度级按实质归位:工程约束级不变量留在工程约束级、identity 级只留真正"改即非 FinBayes"的约束,让修改成本与权限匹配(否则 identity 级泛滥导致柔性丧失)
  • 据原文 codify:每条不变量锚定战略白皮书 / 产品定义 / ADR 原文 §X line N(否则凭印象总结演绎会引入 AI 自我演绎漂移)
  • 声明暴露面:每个字段显式标注 surface(user_widget / internal_audit),让"内部完整 vs 用户面收敛"分层清晰(否则会重演 I-04"全字段都用户面"误读)
  • 任务驱动组合:schema 按 7 task_type 拆 variant / 条件式承载字段,让任务分支充分表达(否则扁平 schema 全 Optional 占位会让 7 任务分支退化)
  • 评测维度与战略执行分层:D 维度评分公式只评功能对错,战略不变量拦截留给 L0.5 / V 维度 judge(否则评测维度兼任战略执行,即 A4 发现的 Build-Y 反成 Anti-X)
  • 翻译后留 review 一轮再 final:过完 5 步 SOP 先入 draft,经 fresh-eyes review 一轮再 final(否则立刻 final 会放过 AI 自我演绎漂移)

§7 后果

收益

  • codify 反映战略原意而非 AI 的 Prevent affordance 偏好
  • 三级硬度框架让"修改成本"与"修改权限"匹配
  • Build-Y 主导让单点合规 + 集成体验同时成立
  • 7 任务驱动让产品柔性表达成立
  • 暴露面分层让"内部完整 vs 用户面收敛"不再混淆

成本

  • 翻译 SOP 5 步比直接写 Prevent-X 慢 2-3 倍(每条 ~15-30min vs ~5min)
  • 需要 fresh-eyes review 才能避免 AI 自我演绎漂移
  • 已 codify 的 Batch A 10 条全部按本 ADR 重写

风险与缓解

  • 风险 1:Build-Y 表达难以 grep / assert → 无 affordance 困境
    • 缓解:用 Pydantic model 字段必填 / contract test 跑 mock / Claude judge V 维度三层补
  • 风险 2:三级硬度判定主观性
    • 缓解:identity 级必须 ADR-009 类 audit;其他级 PR review 即可
  • 风险 3:5 步 SOP 在紧急 hotfix 不可行
    • 缓解:hotfix 允许 Step 1-3 缩减,事后补 Step 4-5(与 ADR-003-supplement hotfix 豁免对齐)

§7bis Audit trail / Changelog

日期调整理由原结论是否保留
2026-05-29承接 fresh review W3 · §6 句式正向化:§6 标题从"反模式(禁止)"改为"正向准则(应当 Build-Y)",7 条"❌ 禁止…"逐条改写为"✅ 应当 Build-Y…"正向句式,每条括号内保留原反模式的实质警示§6 用 7 条"❌ 禁止"反模式句式去反"防御过重",等于用 Prevent 句式反 Prevent,与本 ADR §0 Build-Y 优先口径自我打脸保留。7 条的实质警示全部保留(括号内"若不这样会回到哪个旧问题"),只把句式从禁令转为正向准则

§8 关联资产