跳到主要内容

13 条契约型不变量 · deep design spec(draft 待用户审定)

本文是 spec / draft,不是 final。基于 A1 战略原意打捞 + A2 范式扫描 + A3 字段集审计三份诊断报告综合产出,待用户审定后才会重写 strategic-invariants-codified.md

codify 哲学换轨:从禁令型(Prevent-X)→ 契约型(Require-X-when-Y),借鉴 ADR-009 三级硬度:

  • identity(永不变 / 改即非 FinBayes)
  • 当前版本立场(v3 版本约定,未来 ADR 可重审)
  • 工程约束(按 PR / ADR 可灵活调整)

§0 13 条速览

ID名称硬度主类型
I-01'ExecutionBoundary(执行边界)identityBuild-Y + 边界
I-02'ConditionalJudgmentContract(条件化判断契约)identityBuild-Y
I-03'UserSovereignty(用户主权三维)identityBuild-Y
I-04'RuntimeReasoningCompleteness(runtime reasoning 完整性)identityBuild-Y
I-05'UserFacingFieldRedaction(用户面字段名收敛)工程约束边界
I-06'KellyCapTaskConditional(kelly_cap 任务条件化)工程约束Require-X-when-Y
I-07'TaskMinimumFieldSet(任务最小必含字段集)当前版本立场Require-X-when-Y
I-08'TaskTypeRequired(schema 顶层 task_type 显式)工程约束Build-Y
I-09'MCA-7Axes-Naming(MCA 7 轴名稳定)当前版本立场命名稳定
I-10'MechanismsSingleSource(8 机制单一事实源)工程约束Build-Y
I-11'CredentialFiltering(输出端凭证过滤双处)identity边界
I-12'ProfileDoesNotShrinkFactSpace(画像不裁剪事实空间)当前版本立场(v2→v3 降级 audit)Build-Y + 边界
I-13'S1AlwaysActive(S1 每次综合输出必跑)identityBuild-Y

候选但本 spec 未列入的额外约束(待你看完 13 条后决定是否补):

  • I-14(候选)TwoStepWriteContract 候选→用户确认两步写入 —— 在战略 §9 line 1106 列为 UserSovereignty 的工程承接点;可以选择并入 I-03',也可独立成条
  • I-15(候选)OutputQualityConstantAcrossTiers 输出质量跨付费层级一致 —— ADR-009 列明,但 M0 阶段可能尚无付费层级,可推到 M1+

§1 每条不变量详 spec


§I-01' · ExecutionBoundary(执行边界)

硬度:identity 级(永不变 / 改即非 FinBayes)

精确陈述:FinBayes 是金融认知层,输出认知材料(结构化分析、条件化结论、判断检验材料),不直接调用交易执行 API、不持有用户账户凭证、不替用户做最终下单。任何"FinBayes → 下游执行端"的链路必须有用户拍板这一步。

战略原文锚点

  • strategic-whitepaper.md §9 line 1080-1088("identity 级别 不可变"段)
  • strategic-whitepaper.md §6 line 745("不直接下单、不持有账户凭证")
  • ADR-009 §1 line 24("唯一保留为 identity 级别的是:认知与执行分工")

正向 Build-Y 必含产出

  • 输出包含 main_answer(结论 / 倾向 / 方向)、supporting_evidence(支撑证据)、sources(来源 + 时间戳)三个核心字段(详见 I-07')
  • 当 task_type 在 {交易准备 / 决策辅助 / 风险识别} 时,输出可包含方向性建议("应该 / 建议 + 买入 / 卖出 / 持有 / 加仓 / 减仓"),但必须同时携带 I-02' 要求的条件化要素

负向边界

  • code-base 不允许 import 任何交易执行 SDK(如 ccxt / interactive-brokers-api / etc)
  • StructuredCognitionResult 不允许出现 order_id / place_order / execute_trade / account_credential 等字段

反例

# 错(直接调交易 API)
broker.place_order(symbol="NVDA", qty=100)
# 错(字段含执行语义)
result.order_id = "ord_xxx"

Test 规格

  • L1(grep)grep -rE "(ccxt|interactive_brokers|alpaca_trade_api)" src/ 必须空
  • L2(Pydantic):StructuredCognitionResult 模型禁止注册 order_* / place_* / execute_trade 类字段
  • L3(codebase audit):第三方依赖白名单(dependency check),交易执行类 package 不在白名单

test 文件路径tests/invariants/test_i01_execution_boundary.py


§I-02' · ConditionalJudgmentContract(条件化判断契约)

硬度:identity 级

精确陈述:FinBayes 输出任何带方向的判断或建议("应该 / 建议 / 倾向 + 买入 / 卖出 / 持有 / 加仓 / 减仓"),必须同时携带

  • 成立条件(prerequisites)≥ 1 条
  • 失效条件(invalidation_conditions)≥ 1 条
  • 反方证据(counter_evidence)≥ 1 条(task_type ∈ {分析 / 复盘 / 风险识别 / 交易准备 / 交易辅助} 时)
  • 不确定性 / 缺口(uncertainty_and_gaps)≥ 1 条

战略禁止的是"封闭式答案"(无条件喊单),不是"语言中性"。FinBayes 允许说"应该买入 NVDA"——只要 4 个条件化字段齐备。

战略原文锚点

  • strategic-whitepaper.md §5 line 525("FinBayes 不给'BTC 现在该买'这种封闭答案,而是给'在以下条件下加仓的逻辑成立……'")
  • strategic-whitepaper.md §5 line 560(典型场景 3:有条件的结论)
  • product-definition.md §4.4 line 234-240("交易准备/决策辅助类问题可以回答"三条规则)

正向 Build-Y 必含产出

  • main_answer 含方向词时,并联字段 prerequisites / invalidation_conditions / uncertainty_and_gaps 非空(min_length: 1 each)
  • 当 task_type ∈ 5 类(见上)时,counter_evidence 非空
  • reasoning 链路必须显式连接"证据 → 条件 → 结论方向",不允许"证据 → 结论"短路

负向边界

  • 禁止"封闭式答案"(仅 main_answer 含方向词但 4 个条件化字段全空 / 全为占位符)

反例

错(封闭答案):
{
"main_answer": "应该买入 NVDA 100 股",
"prerequisites": [],
"invalidation_conditions": [],
"counter_evidence": []
}

对(条件化判断):
{
"main_answer": "在以下条件下加仓 NVDA 逻辑成立(建议方向:增持)",
"prerequisites": ["AI 资本支出指引未下修", "硬件供给约束未缓解"],
"invalidation_conditions": ["数据中心订单同比转负", "竞争性 ASIC 显著替代"],
"counter_evidence": ["估值已隐含高速增长,PE 分位 95%"],
"uncertainty_and_gaps": ["DGX Spark 早期占比未披露"],
"posterior": {"kelly_cap": 0.25, "reasoning": "..."}
}

Test 规格

  • L1(Pydantic inter_field_constraint):当 main_answer 正则匹配方向词(应该/建议/倾向 + 买入/卖出/持有/加仓/减仓),断言 4 个条件字段 length ≥ 1
  • L2(semantic check, M1+):方向词附近 N tokens 内必须存在条件标记("如果" / "在……前提下" / "假设" / "前提是")
  • L3(V 维度 V1 judge):Claude judge 对 10 个 mock 输出打分 V1 ≥ 2.5(V1 = 条件化判断符合度)

注意删除粗暴的 (应该|建议)(买入|卖出) grep(会一刀切误伤合规输出)

test 文件路径tests/invariants/test_i02_conditional_judgment.py


§I-03' · UserSovereignty(用户主权三维)

硬度:identity 级

精确陈述:用户对 FinBayes 拥有三维主权:

  1. 数据主权:可查看 / 修改 / 清空 / 导出全部数据(含历史判断、偏好、个性化参数)
  2. 执行自主权:FinBayes 不替用户决策最终交易;判断到执行之间必须有用户拍板这一步
  3. 候选→确认两步写入契约:任何写入用户档案 / 偏好 / 持仓配置的动作,必须先生成 candidate,再由用户 confirm,FinBayes 不静默写入

战略原文锚点

  • strategic-whitepaper.md §9 line 1080-1144(identity 级不可变)
  • strategic-whitepaper.md §9 line 1106("两步写入契约(候选→用户确认)")
  • product-definition.md §3 用户产品形态
  • ADR-009(保留 identity 级 = 认知与执行分工)

正向 Build-Y 必含产出

  • API GET /api/v1/me/export → zip 含全部数据
  • API DELETE /api/v1/me → 注销 + 软删除 30 天后硬删
  • API PATCH /api/v1/me/profile → 必须先返回 candidate, 用户 confirm 后才真正应用
  • 用户面 UI 不强制用户按 FinBayes 给的框架重述自己问题

负向边界

  • 任何写入用户档案的代码路径不允许跳过 candidate→confirm 两步

反例

# 错(静默写入)
user.profile.risk_appetite = 0.8
db.commit()

# 对(两步写入)
candidate = build_candidate(user, change={"risk_appetite": 0.8})
return {"candidate_id": "...", "preview": ..., "confirm_required": True}
# 用户 confirm 后才:apply_candidate(candidate_id)

Test 规格

  • L1(unit test 数据主权):API export / delete 单元测试
  • L2(unit test 候选→确认):写入路径必经 candidate→confirm,断言短路写入会 raise
  • L3(prompt audit, M1+):用户面 prompt 模板 review 必含"不强制框架"检查

test 文件路径tests/invariants/test_i03_user_sovereignty.py

待定:I-12(候选→确认)当前并入 I-03'。如果你认为应独立成条(用于 M0 第一个 PR 单独抓出),可拆分。


§I-04' · RuntimeReasoningCompleteness(runtime reasoning 完整性)

硬度:identity 级

精确陈述runtime 层任何含 confidence / score / posterior / kelly_cap 等数值字段的输出,必须同时含对应 reasoning(推理链路文字)。这是工程层可观测 / 复盘 / 优化的基础,不是用户面 UI 要求(用户面要求见 I-05')。

战略原文锚点

  • strategic-whitepaper.md §2(制胜逻辑 - 结构化输出)
  • strategic-whitepaper.md §4 line 402("判断的可学习性")
  • strategic-whitepaper.md §5 line 570("用户产品不暴露体系本身"——明确分层)
  • product-definition.md §6.4 line 303("产品文案不暴露体系细节")

正向 Build-Y 必含产出

  • Pydantic validator:含 *_score / *_confidence / kelly_cap 字段时同级必有 *_reasoning 字段
  • reasoning 内容非占位符(不是 ... / TODO / placeholder
  • reasoning 必须包含至少 1 个证据引用(指向 supporting_evidencesources 字段)

负向边界

  • 禁止"裸 score"(只有数字无推理)

反例

# 错
{"confidence_score": 0.73}
# 错(reasoning 占位)
{"confidence_score": 0.73, "confidence_reasoning": "..."}
# 错(reasoning 不引用证据)
{"confidence_score": 0.73, "confidence_reasoning": "感觉挺有信心的"}

# 对
{
"confidence_score": 0.73,
"confidence_reasoning": "基于 supporting_evidence[0](Q3 财报订单同比 +25%)+ [1](DGX 出货节奏),与典型周期顶部相比,当前供需仍偏紧(参见 phase_evidence.cycle_position)"
}

Test 规格

  • L1(Pydantic validator):score / reasoning 字段配对约束
  • L2(contract test):10 mock query 跑后断言每个输出的 reasoning 段 ≥ N 字(N 不再硬编 30,改为按 product-definition.md §7.1 表达密度策略决定,分用户层级 L0/L1/L2/L3 各自有最小长度策略)
  • L3(grep):reasoning 内容 grep \.\.\.|TODO|placeholder|感觉 必须空

注意:删除原 codify 中的"用户面必须暴露 reasoning"——那是 I-05' 的反向,runtime 完整不等于用户面暴露

test 文件路径tests/invariants/test_i04_runtime_reasoning.py


§I-05' · UserFacingFieldRedaction(用户面字段名收敛)

硬度:工程约束(可随 product / UI 迭代调整)

精确陈述:用户面 UI / API 响应 / 产品文案中不暴露体系字段名——包括但不限于 M1-M8 机制名、phase_matrix / correlation_regime / mca_bucket / kelly_cap / posterior 等内部字段名。用户面看到的是按产品意图组织的 widget 内容,体系字段名仅在 internal_audit 暴露面出现。

战略原文锚点

  • strategic-whitepaper.md §5 line 570("用户产品不暴露体系本身")
  • product-definition.md §6.4 line 303("M1-M8 / MCA 等术语不进入用户界面")
  • product-definition.md §7.3 line 370("用户可见层不直接展示上述字段名")

正向 Build-Y 必含产出

  • 每个字段在 contracts/structured-cognition-result.yaml 必须有 surface: {user_widget | internal_audit | both} 元数据
  • 用户面 renderer 只渲染 surface ∈ {user_widget, both} 的字段
  • 产品文案 / UI 文案 grep 禁词列表必含体系字段名

负向边界

  • 用户面字符串不允许出现 M[1-8]_ / phase_matrix / correlation_regime / mca_bucket / kelly_cap / posterior 等 token

反例

错(用户面文案):
"根据 phase_matrix 分析,M5 传导图显示..."

对(用户面文案):
"根据当前市场周期位置和资金传导路径..."(同样信息,用户语言)

Test 规格

  • L1(grep on UI bundle):产品 UI 编译输出 + 文案 i18n 文件 grep 体系字段名必须空
  • L2(contract test renderer):mock 一个含 surface: internal_audit 字段的 result,喂给用户面 renderer,断言该字段不渲染
  • L3(API response 校验):用户面 API 响应 schema 不允许 surface 为 internal_audit 的字段

依赖:依赖 MP-5(字段暴露面分层契约)落地。

test 文件路径tests/invariants/test_i05_user_facing_redaction.py


§I-06' · KellyCapTaskConditional(kelly_cap 任务条件化)

硬度:工程约束

精确陈述kelly_cap 字段(含其载体 posterior仅在 task_type ∈ {交易决策辅助, 交易准备, 风险识别} 时存在;其他 4 类任务(解释 / 分析 / 比较 / 复盘)字段缺省 / schema 中不出现。当存在时,值域 ∈ [0, 1);M0 推荐 0.25。

战略原文锚点

  • ADR-008-supplement §2.5 line 102-113("M7.uq 启用时必选(决策辅助 / 交易准备 / 风险识别);解释 / 比较 / 复盘类任务可选")
  • MP-3 · kelly_cap 字段语义与下游消费协议(签字推荐组合 = M0 上限 0.25)

正向 Build-Y 必含产出

  • StructuredCognitionResult schema 按 task_type 拆出 6 个变体(解释 / 分析 / 比较 / 复盘 / 风险识别 / 交易准备 / 决策辅助),3 类包含 posterior 块,4 类不包含
  • 在产品层,问"什么是 ETF 折溢价"返回不含 kelly_cap 的 schema

负向边界

  • 解释类任务输出不允许出现 posterior.kelly_cap
  • kelly_cap 值若存在必须 ∈ [0, 1),M0 ≤ 0.25

反例

# 错(解释类任务输出 kelly_cap)
{"task_type": "explanation", "posterior": {"kelly_cap": 0.25}}
# 错(值越界)
{"task_type": "trade_decision_aid", "posterior": {"kelly_cap": 1.0}}

Test 规格

  • L1(schema-by-task):task_type → schema 变体映射;解释类 schema 不包含 posterior 块
  • L2(Pydantic Field validator)Field(ge=0.0, lt=1.0)
  • L3(contract test):跑 7 类任务各 1 个 mock,断言解释/分析/比较/复盘 4 类不含 posterior

依赖:依赖 MP-4(任务→必含字段动态组合)落地。

test 文件路径tests/invariants/test_i06_kelly_cap_task_conditional.py


§I-07' · TaskMinimumFieldSet(任务最小必含字段集)

硬度:当前版本立场(v3 当前,未来 ADR 可调)

精确陈述:每个 task_type 必须有最小必含字段集(基于 product-definition.md §7 表 2 锁定)。Schema 顶层不允许"全字段都必填"或"全字段都 Optional"两种极端;必须按任务分层。

task_type最小必含字段集
解释类main_answer, supporting_evidence, sources, follow_up_questions
分析类+ multi_perspectives, counter_evidence, prerequisites, uncertainty_and_gaps, applicability_flags
比较类+ counter_evidence, uncertainty_and_gaps, applicability_flags
复盘类+ historical_judgment_links, prerequisites, invalidation_conditions, counter_evidence, uncertainty_and_gaps
风险识别+ multi_perspectives, prerequisites, invalidation_conditions, uncertainty_and_gaps, applicability_flags, regulation_status
交易准备+ counter_evidence, prerequisites, invalidation_conditions, uncertainty_and_gaps, applicability_flags, regulation_status, causal_graph
交易决策辅助+ counter_evidence, prerequisites, invalidation_conditions, uncertainty_and_gaps, applicability_flags, regulation_status, posterior

全任务硬约束:每个任务都必须含 s1(叙事-数字一致性 - 见 I-13')+ mca_bucket(任务元数据,不入 result body)

战略原文锚点

  • strategic-whitepaper.md §5 line 509-521("10 要素不是固化字段表,动态组合")
  • product-definition.md §7 line 324-372(任务→必含要素映射表)
  • ADR-008-supplement §3 line 166("动态可选,不强制全量出现")

正向 Build-Y 必含产出

  • MP-4 文件(machine-readable yaml)登记 7 任务 × 17 字段 的覆盖矩阵
  • contracts/structured-cognition-result.yaml 按 task_type 输出 7 个 schema 变体

负向边界

  • 不允许"扁平 schema 全部 Optional[X]=None 占位"——会破坏 schema 表达力

反例

# 错(10 字段全 stub)
class StructuredCognitionResult(BaseModel):
main_answer: str
multi_perspectives: list[str] = Field(default_factory=list) # 解释类也强制留 stub
...

# 对(按 task 变体)
class ExplanationResult(BaseModel):
main_answer: str
supporting_evidence: list[...]
sources: list[...]
follow_up_questions: list[...]
# 不含 multi_perspectives / kelly_cap 等

class TradeDecisionAidResult(BaseModel):
main_answer: str
... # 含 posterior, applicability_flags, regulation_status, ...

Test 规格

  • L1(schema-by-task):每个 task_type 单独 Pydantic model
  • L2(contract test):跑 7 类任务各 N 个 mock,断言对应 schema 通过、错配 schema 失败
  • L3(cross-section grep):contracts/structured-cognition-result.yaml 与 MP-4 yaml 一致

依赖:MP-4 落地。

test 文件路径tests/invariants/test_i07_task_min_field_set.py


§I-08' · TaskTypeRequired(schema 顶层 task_type 显式)

硬度:工程约束

精确陈述:StructuredCognitionResult schema 顶层必须含显式字段 task_type: Literal["explanation", "analysis", "comparison", "review", "risk_identification", "trade_preparation", "trade_decision_aid"]。下游 consumer 凭 task_type dispatch,不依赖"机制激活 flag 间接推断"

战略原文锚点

  • product-definition.md §4.2 line 201-209(7 类任务清单)
  • A3 诊断报告 §5.3:当前 schema 无 task_type 字段是设计漏洞

正向 Build-Y 必含产出

  • Pydantic field task_type: Literal[...] 必填
  • API 响应 schema 顶层必含 task_type
  • task_type 在产品入口由"任务识别策略"(ADR-004 LLM Function Calling 主导)决定

负向边界

  • 不允许 task_type 缺失或 None

反例

# 错(无 task_type,下游靠机制激活反推)
{"main_answer": "...", "applicability_flags": {...}, "posterior": {...}}

Test 规格

  • L1(Pydantic required):task_type 必填,缺失 raise
  • L2(cross-validate):task_type 与字段组合一致性校验(如 task_type=explanation 不应携带 posterior)

依赖:MP-4 + I-07' 落地。

test 文件路径tests/invariants/test_i08_task_type_required.py


§I-09' · MCA-7Axes-Naming(MCA 7 轴名稳定)

硬度:当前版本立场(v3)

精确陈述:MCA 7 轴名称稳定为 investor_structure / derivatives_maturity / institutional_friction / non_market_actor / credit_environment / information_availability / currency_cross_border。所有代码 / contract / engineering-pack / fixture 用此 7 名。

(与原 I-08 相同,保留)

Test 规格:见原版 strategic-invariants-codified.md I-08。


§I-10' · MechanismsSingleSource(8 机制单一事实源)

硬度:工程约束

精确陈述:8 机制(M1-M8)的语义定义在单一事实源(contracts/structured-cognition-result.yaml + ADR-007 supplement §8 机制升级定义;M1+ 视情况派生独立 mechanisms contract 文件)。代码 / engineering-pack / 测试不能本地重定义机制语义。

(与原 I-09 相同,保留)

Test 规格:见原版 I-09。


§I-11' · CredentialFiltering(输出端凭证过滤双处)

硬度:identity(凭证泄漏是安全 identity 级问题)

精确陈述:输出端凭证(API key / OAuth token / 数据库密码 / 内部 trace_id)过滤必须在两个位置同时存在:

  1. 综合层语义级:构造 StructuredCognitionResult 时不收录凭证字段
  2. Output Pipeline 格式级:出口处 regex 过滤 + 字段黑名单

(与原 I-10 相同,保留)

Test 规格:见原版 I-10。


§I-12' · ProfileDoesNotShrinkFactSpace(画像不裁剪事实空间)

硬度:当前版本立场(v2→v3 audit 降级,但仍是 v3 立场)

精确陈述:用户画像(risk_appetite / sector_preference / time_horizon 等)仅用于呈现层组织 / 排序 / 表达密度不裁剪 FinBayes 的事实空间或证据集。同一查询对不同画像用户,底层 reasoning + evidence 应一致,只在 widget 表达密度 / 顺序 / 术语深度上差异。

战略原文锚点

  • strategic-whitepaper.md §9(v2 不可妥协边界 → v3 降级 audit)
  • ADR-009(立场降级 audit trail)

正向 Build-Y 必含产出

  • runtime 层证据收集 / reasoning 生成不依赖 user_profile
  • 呈现层(widget renderer)允许按 profile 调整表达密度 / 字段顺序 / 术语深度
  • 测试:同一 query 对 3 个画像用户跑,runtime layer 输出的 evidence set 完全一致

负向边界

  • runtime 层 evidence 收集器不允许 if user_profile.risk_appetite < 0.3: skip_evidence(...) 这种条件分支

反例

# 错(画像裁剪事实空间)
if user.risk_appetite < 0.3:
evidence = filter_out_aggressive_evidence(evidence)

# 对(画像仅影响呈现)
runtime_result = analyze(query) # 不依赖 profile
ui_view = render(runtime_result, density=profile.get_density()) # 呈现层用 profile

Test 规格

  • L1(unit test):3 个画像用户跑同 query,断言 runtime evidence set 完全一致
  • L2(code path audit):evidence 收集模块不允许 import user_profile

注意:这是 A1 漏发现的关键正向不变量,必须独立成条。

test 文件路径tests/invariants/test_i12_profile_no_shrink.py


§I-13' · S1AlwaysActive(S1 每次综合输出必跑)

硬度:identity(唯一全任务硬约束 - ADR-008-supplement §2.6 明示)

精确陈述:S1(叙事-数字一致性检查)字段在每次综合输出中必须 active,无 task_type 例外。这是 ADR-008-supplement §2.6 唯一明确的"全任务硬约束"。

战略原文锚点

  • ADR-008-supplement §2.6(S1 每次综合输出必跑)

正向 Build-Y 必含产出

  • StructuredCognitionResult 7 个 task 变体 schema 全部含 s1 字段必填
  • S1 字段 8 子字段全填(按 ADR-008-supplement §2.6 规定)

负向边界

  • 任何 task 类型缺 s1 字段 → schema validation fail

Test 规格

  • L1(Pydantic required):所有 task 变体 schema 均 require s1
  • L2(contract test):S1 8 子字段非空 / 非占位符

注意:这是 A1 漏发现的最重要正向不变量。

test 文件路径tests/invariants/test_i13_s1_always_active.py


§2 与原版 10 条的差分总结

原 ID处理说明
I-01 NoOrderPlacement→ I-01' ExecutionBoundary(重写)从"禁字段"扩展到"禁字段 + 禁依赖 + 禁路径"
I-02 NotDeciding→ I-02' ConditionalJudgmentContract(重写从禁"应该买入" → 允许带条件方向性建议;删除粗暴 grep
I-03 UserSovereignty→ I-03' UserSovereignty(扩展)加候选→确认两步写入契约
I-04 CognitiveTransparency→ I-04' RuntimeReasoningCompleteness + I-05' UserFacingFieldRedaction(拆分runtime 完整 vs 用户面收敛分层
I-05 ForbiddenLexicon删除(独立成 I-05'?)禁用词扫描属 product 层 lint,不是 L0.5 不变量;可放进 verify:kb hook 不进 L0.5
I-06 KellyCapBound→ I-06' KellyCapTaskConditional(重写从值域约束扩展到"任务条件化存在性"
I-07 SCR-1.1-Required→ I-07' TaskMinimumFieldSet(重写从"10 字段必填" → "按任务最小必含子集"
I-08 MCA-7Axes-Naming→ I-09' (重编号)保留
I-09 8-Mechanisms-Source→ I-10' (重编号)保留
I-10 CredentialFiltering→ I-11' (重编号)保留
-+ I-08' TaskTypeRequired(新增)schema 顶层 task_type 必填
-+ I-12' ProfileDoesNotShrinkFactSpace(新增)A1 漏发现
-+ I-13' S1AlwaysActive(新增)A1 漏发现 + ADR-008-sup §2.6 唯一硬约束

净变化:原 10 条 → 新 13 条。其中:

  • 重写(语义大改):4 条(I-01 / I-02 / I-06 / I-07)
  • 拆分:1 条 → 2 条(I-04 拆为 I-04' + I-05')
  • 删除 / 降级:1 条(I-05 ForbiddenLexicon 降为 verify:kb hook)
  • 保留 / 重编号:3 条(I-08/09/10 → I-09'/10'/11')
  • 新增:3 条(I-08' TaskTypeRequired / I-12' Profile / I-13' S1)
  • I-03 扩展:1 条

§3 待你审定的开放问题

  1. I-12'(候选→确认两步写入)独立成条 vs 并入 I-03':当前 spec 把它放在 I-03' 里。如果你认为 M0 第一个 PR 要单独抓出做 test,可以拆分为独立 I-14'。
  2. I-05 ForbiddenLexicon 处理:当前 spec 提议降级为 verify:kb hook(不进 L0.5)。如果你认为禁用词扫描仍是战略级硬约束,可保留为 I-XX'。
  3. I-15(输出质量跨付费层级一致):ADR-009 列明但 M0 阶段可能尚无付费层级。当前 spec 不列入,推到 M1+。是否同意?
  4. task_type 命名:当前 spec 用英文(explanation/analysis/comparison/review/risk_identification/trade_preparation/trade_decision_aid)。是否同意?还是用中文(如 explanation_zh / fenxi_zh)?
  5. I-07' schema 拆分:当前 spec 提议拆 7 个 task 变体 schema。这是大改动,C-1 PR 工作量从 1 schema → 7 schema。是否同意,还是先做"统一 schema + task_type 触发的字段必填校验"中间态?

§4 关联资产