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 trail | I-07' TaskMinimumFieldSet(按 product-def §7 表 2)/ I-09' MCA-7Axes-Naming / I-12' ProfileDoesNotShrinkFactSpace |
| 工程约束 | 按 PR / ADR 可灵活调整 | 普通 PR + 三阶段 SOP | I-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 模板):
- 精确陈述
- 战略原文锚点
- 硬度级别
- 正向 Build-Y 必含产出
- 负向边界(仅在硬度允许时)
- 反例 + 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 trail | ADR-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 关联资产
- ADR-012 · SVA-9 战略愿景对齐九层防御方案(L0.5 层落地物方法论 SOP)
- ADR-011 · FB-RESUME 长周期 Session 失忆防御协议
- ADR-003 supplement · 三阶段实施 SOP(plan/verify 段对称改造)
- 战略立场降级 audit trail · ADR-009(三级硬度源)
- MP-4 · 任务→必含字段动态组合契约(B1.2 落地,同 commit)
- MP-5 · 字段暴露面分层契约(B1.3 落地,同 commit)
- 13 条契约型不变量 deep design spec(drafts/):13 条契约型不变量 deep design spec
- 战略不变量 codify · L0.5 层(10 条核心)(B2 重写为 13 条契约型)
- 变更协议 · 体系级变更流程