MP-4 — 任务→必含字段动态组合契约(task-driven field composition protocol)
⚠️ 2026-06-04 更新(ADR-021):
kelly_cap已退役并从代码移除。 本契约中posterior块不再含kelly_cap,所有kelly_cap/kelly_cap_policy相关条目作废;其余字段组合约定不变。
§0 决策简述
决议:StructuredCognitionResult 不再以"扁平 superset + Optional[X]=None 占位"形式存在,改为按 7 个 task_type 拆 schema variant + 显式字段组合矩阵,并将该矩阵机器可读化为 contracts/tasks-fields-mapping.yaml(新单一事实源)。
触发:
- 战略白皮书 §5 line 509 明示"10 要素不是固化字段表——按任务类型动态组合"
- product-definition.md §7 表 2 早已锁定"任务→默认必含认知要素"映射
- ADR-008-supplement §3 表 line 166 明示"6 新字段按机制激活动态可选(不强制全量出现)"
- A3 + A4 诊断报告共同坐实:当前
contracts/structured-cognition-result.yamlline 84 的posterior: required_at: [M0]与 ADR-008-sup §2.5 "解释 / 比较 / 复盘类任务可选"自相矛盾 - Batch A I-07 "10 字段缺一不可"是 codify 漂移的最严重 case(A1 / A3 共同发现)
定位:ADR-013 §3.2 "Require-X-when-Y 条件式契约"的核心落地物;SVA-9 L1 契约源 + L2 contract test + L5 D 维度评测 + L7 V 维度评测全部依赖本契约。
§1 7 类金融认知任务(task_type)
来源:product-definition.md §4.2 line 201-209 + strategic-whitepaper.md §5 line 513-519(双源一致):
| task_type 英文 ID | 中文 | 一句话语义 |
|---|---|---|
explanation | 解释类 | 解释金融概念 / 工具 / 现象 |
analysis | 分析类 | 分析事件 / 数据 / 市场变化 |
comparison | 比较类 | 多对象多维度比较 |
review | 复盘类 | 历史判断检查 / 事后审视 |
risk_identification | 风险识别类 | 识别下行风险来源 |
trade_preparation | 交易准备类 | 事件前条件检查 / 仓位前置评估 |
trade_decision_aid | 交易决策辅助类 | 具体决策点的条件化材料 |
task_type 由 schema 顶层显式承载(见 I-08' TaskTypeRequired)。
§2 17 字段 × 7 任务 覆盖矩阵
来源:综合 product-definition.md §7 表 2 + ADR-008-supplement §2.x 各字段必选可选条款 + cognition-1.1-contract.md §4 字段间约束 + A3 诊断报告矩阵。
Legend:
- 必 = 必含(schema 中 required)
- 可 = 可选(schema 中 optional)
- 无 = 该任务下字段不存在于 schema(缺省 / 不渲染 / 不评测)
§2.1 10 既有要素(1.0 + 1.1)
| 字段 | 解释 | 分析 | 比较 | 复盘 | 风险识别 | 交易准备 | 决策辅助 |
|---|---|---|---|---|---|---|---|
main_answer | 必 | 必 | 必 | 必 | 必 | 必 | 必 |
supporting_evidence | 必 | 必 | 必 | 必 | 必 | 必 | 必 |
multi_perspectives | 可 | 必 | 可 | 可 | 必 | 可 | 可 |
counter_evidence | 可 | 必 | 必 | 必 | 可 | 必 | 必 |
prerequisites | 可 | 必 | 可 | 必 | 可 | 必 | 必 |
invalidation_conditions | 可 | 可 | 可 | 必 | 必 | 必 | 必 |
uncertainty_and_gaps | 可 | 必 | 必 | 必 | 必 | 必 | 必 |
sources | 必 | 必 | 必 | 必 | 必 | 必 | 必 |
follow_up_questions | 必 | 可 | 可 | 可 | 可 | 可 | 可 |
historical_judgment_links | 无 | 可 | 可 | 必 | 可 | 可 | 可 |
§2.2 6 个机制层新字段(ADR-008-supplement §2.x)
| 字段 | 来源机制 | 解释 | 分析 | 比较 | 复盘 | 风险识别 | 交易准备 | 决策辅助 |
|---|---|---|---|---|---|---|---|---|
phase_evidence | M3 时钟相位 | 无 | 必(M3 激活) | 可 | 可 | 必 | 必 | 可 |
causal_graph | M5 传导图 | 无 | 必(M5 激活) | 可 | 可 | 必 | 必 | 可 |
regulation_status | M5.4 制度摩擦 | 无 | 可(F2/F3 必) | 可 | 无 | 必 | 必 | 必 |
applicability_flags | M6 三支柱适用性 | 无 | 必 | 必 | 可 | 必 | 必 | 必 |
posterior(含 kelly_cap) | M7.uq 双峰后验 | 无 | 可 | 可 | 可 | 可 | 可 | 必 |
s1 | S1 叙事-数字一致性 | 必(横切) | 必 | 必 | 必 | 必 | 必 | 必 |
注 1:s1 是 ADR-008-supplement §2.6 唯一明确的"全任务硬约束"(见 I-13')—— 7 任务全部 必。
注 2:posterior 在解释 / 分析 / 比较 / 复盘 / 风险 / 交易准备类下置 可(M7.uq 激活时),但产品默认逻辑是仅决策辅助类输出 posterior 块;其他类如需要可显式启用(I-06' KellyCapTaskConditional)。
§2.3 1 元数据(任务元数据层,不入 result body)
| 字段 | 解释 | 分析 | 比较 | 复盘 | 风险识别 | 交易准备 | 决策辅助 |
|---|---|---|---|---|---|---|---|
mca_bucket | 必(Task 层) | 必(Task 层) | 必(Task 层) | 必(Task 层) | 必(Task 层) | 必(Task 层) | 必(Task 层) |
注:mca_bucket 已在 ADR-008-supplement §2.7 锁定为"任务元数据层,不入 StructuredCognitionResult"。所有 7 任务都必须有 mca_bucket 标注,由 Task 发起时刻横切上下文决定。
§3 schema variant 设计
§3.1 7 个 Pydantic 模型变体
# 公共基类
class BaseCognitionResult(BaseModel):
task_type: Literal[
"explanation", "analysis", "comparison", "review",
"risk_identification", "trade_preparation", "trade_decision_aid"
]
main_answer: str
supporting_evidence: list[Evidence] = Field(min_length=1)
sources: list[Source] = Field(min_length=1)
s1: S1Check # 全任务硬约束(I-13')
structured_result_version: str = "1.1"
# 7 个 task variant
class ExplanationResult(BaseCognitionResult):
task_type: Literal["explanation"] = "explanation"
follow_up_questions: list[str] = Field(min_length=1)
# 不含 multi_perspectives / counter_evidence / prerequisites / kelly_cap 等
class AnalysisResult(BaseCognitionResult):
task_type: Literal["analysis"] = "analysis"
multi_perspectives: list[Perspective] = Field(min_length=2)
counter_evidence: list[Evidence] = Field(min_length=1)
prerequisites: list[Prerequisite] = Field(min_length=1)
uncertainty_and_gaps: list[Gap] = Field(min_length=1)
applicability_flags: ApplicabilityFlags
# phase_evidence / causal_graph 按 M3/M5 激活
class ComparisonResult(BaseCognitionResult):
task_type: Literal["comparison"] = "comparison"
counter_evidence: list[Evidence] = Field(min_length=1)
uncertainty_and_gaps: list[Gap] = Field(min_length=1)
applicability_flags: ApplicabilityFlags
class ReviewResult(BaseCognitionResult):
task_type: Literal["review"] = "review"
historical_judgment_links: list[JudgmentLink] = Field(min_length=1)
prerequisites: list[Prerequisite] = Field(min_length=1)
invalidation_conditions: list[InvalidationCondition] = Field(min_length=1)
counter_evidence: list[Evidence] = Field(min_length=1)
uncertainty_and_gaps: list[Gap] = Field(min_length=1)
class RiskIdentificationResult(BaseCognitionResult):
task_type: Literal["risk_identification"] = "risk_identification"
multi_perspectives: list[Perspective] = Field(min_length=2)
prerequisites: list[Prerequisite] = Field(min_length=1)
invalidation_conditions: list[InvalidationCondition] = Field(min_length=1)
uncertainty_and_gaps: list[Gap] = Field(min_length=1)
applicability_flags: ApplicabilityFlags
regulation_status: RegulationStatus
phase_evidence: PhaseEvidence
causal_graph: CausalGraph
class TradePreparationResult(BaseCognitionResult):
task_type: Literal["trade_preparation"] = "trade_preparation"
counter_evidence: list[Evidence] = Field(min_length=1)
prerequisites: list[Prerequisite] = Field(min_length=1)
invalidation_conditions: list[InvalidationCondition] = Field(min_length=1)
uncertainty_and_gaps: list[Gap] = Field(min_length=1)
applicability_flags: ApplicabilityFlags
regulation_status: RegulationStatus
causal_graph: CausalGraph
phase_evidence: PhaseEvidence
class TradeDecisionAidResult(BaseCognitionResult):
task_type: Literal["trade_decision_aid"] = "trade_decision_aid"
counter_evidence: list[Evidence] = Field(min_length=1)
prerequisites: list[Prerequisite] = Field(min_length=1)
invalidation_conditions: list[InvalidationCondition] = Field(min_length=1)
uncertainty_and_gaps: list[Gap] = Field(min_length=1)
applicability_flags: ApplicabilityFlags
regulation_status: RegulationStatus
posterior: Posterior # 含 kelly_cap
# phase_evidence / causal_graph 按 M3/M5 激活
# Discriminated union(FastAPI 自动 dispatch)
StructuredCognitionResult = Annotated[
Union[
ExplanationResult, AnalysisResult, ComparisonResult, ReviewResult,
RiskIdentificationResult, TradePreparationResult, TradeDecisionAidResult,
],
Field(discriminator="task_type")
]
§3.2 与 ADR-008-supplement 的兼容性
- 10 既有要素全部保留(按 task 必/可/无 重新分配)
- 6 新字段全部保留(按 task + 机制激活 双条件)
- 1 元数据
mca_bucket在 Task schema 层(不入 result body,与 ADR-008-supplement §2.7 一致) - Discriminated union 让 FastAPI / Pydantic / OpenAPI 自动生成 7 个 schema branch
- 旧的"扁平 superset Optional[X]"形态作为 1.x → 2.0 迁移期 union 兼容层保留 1 个 milestone(M0 实施期允许同时维护,M1 起强制 discriminated union)
§3.2bis M0 中间态实施说明(承接 2026-05-29 fresh review W3)
问题:M0 第一个 PR 若一步到位实现 7 个 discriminated union variant(含各自必/可/机制激活字段、discriminator dispatch),落地复杂度高、首个 PR 风险大。
M0 中间态(第一个 PR 落地目标)——走"统一 schema + task_type 必填校验":
- 一个
StructuredCognitionResult统一模型(沿用 §3.1BaseCognitionResult的公共必填字段:main_answer/supporting_evidence/sources/s1/structured_result_version) task_type字段必填(Literal[7 个 task_type],对齐 I-08' TaskTypeRequired),由 contract test 断言"缺 task_type 即 fail"- 任务相关的差异字段在 M0 以
Optional承载,字段的必/可由contracts/tasks-fields-mapping.yaml驱动的运行期 validator 校验(读 yaml 而非 hardcode),而不是先靠 7 个独立 Pydantic variant 在类型层强制 - 这样 M0 第一个 PR 只需"统一 schema + task_type 必填 + 一个读 yaml 的 task-conditional validator",把 7 个 variant 的类型层拆分推迟到 M1
M1+ 演进目标:升级为 §3.1 完整的 7 个 discriminated union variant(类型层强制各任务必/可字段),并删除 M0 统一 schema 兼容层。tasks-fields-mapping.yaml 是两阶段共享的单一事实源——M0 validator 读它、M1 variant 也由它生成,迁移不改事实源。
不变的结论:§0 决议(按 7 task_type 拆 schema variant + 矩阵机器可读化为 tasks-fields-mapping.yaml)不变;M0 中间态只是落地节奏——先统一 schema + task_type 必填 + yaml 驱动 validator,再演进到 7 variant,不是降低最终目标。
§3.3 与 cognition-1.1-contract.md §4 字段间约束的关系
cognition-1.1-contract.md §4 既有 12 条字段间约束(如"derivatives.level=not-applicable ⇒ posterior.fit_method 不得 bayesian-module")在 B4 重写时移到综合层 validator,不再混在契约层(A4 发现的"契约层做执行拦截"反范式)。
§4 落地物:contracts/tasks-fields-mapping.yaml
新单一事实源 yaml,机器可读,由 EvalHarness / 综合层 / Output Pipeline / D 维度评测 / V 维度评测 / vibe check 共同消费。
# contracts/tasks-fields-mapping.yaml
schema_version: 1.0
last-updated: 2026-05-29
upstream-anchor: governance/workstreams/finbayes-arch-rewrite/decisions/MP-4-task-driven-field-composition-protocol.md
# 7 task_type → 字段组合矩阵
task_types:
- id: explanation
cn_name: 解释类
required_fields:
- main_answer
- supporting_evidence
- sources
- follow_up_questions
- s1
optional_fields:
- multi_perspectives
- counter_evidence
- prerequisites
- invalidation_conditions
- uncertainty_and_gaps
excluded_fields:
- historical_judgment_links
- phase_evidence
- causal_graph
- regulation_status
- applicability_flags
- posterior
- id: analysis
cn_name: 分析类
required_fields:
- main_answer
- supporting_evidence
- multi_perspectives
- counter_evidence
- prerequisites
- uncertainty_and_gaps
- sources
- applicability_flags
- s1
optional_fields:
- invalidation_conditions
- follow_up_questions
- historical_judgment_links
- phase_evidence # M3 激活时必,否则可
- causal_graph # M5 激活时必,否则可
- regulation_status # F2/F3 时必
- posterior # M7.uq 启用时可
mechanism_conditional:
- field: phase_evidence
required_when: mechanism_M3_active
- field: causal_graph
required_when: mechanism_M5_active
- field: regulation_status
required_when: "mca_bucket.institutional_friction in ['F2','F3']"
- id: comparison
cn_name: 比较类
required_fields:
- main_answer
- supporting_evidence
- counter_evidence
- uncertainty_and_gaps
- sources
- applicability_flags
- s1
optional_fields:
- multi_perspectives
- prerequisites
- invalidation_conditions
- follow_up_questions
- historical_judgment_links
- phase_evidence
- causal_graph
- posterior
excluded_fields:
- regulation_status
- id: review
cn_name: 复盘类
required_fields:
- main_answer
- supporting_evidence
- historical_judgment_links
- prerequisites
- invalidation_conditions
- counter_evidence
- uncertainty_and_gaps
- sources
- s1
optional_fields:
- multi_perspectives
- follow_up_questions
- phase_evidence
- causal_graph
- applicability_flags
- posterior
excluded_fields:
- regulation_status
- id: risk_identification
cn_name: 风险识别类
required_fields:
- main_answer
- supporting_evidence
- multi_perspectives
- prerequisites
- invalidation_conditions
- uncertainty_and_gaps
- sources
- applicability_flags
- regulation_status
- phase_evidence
- causal_graph
- s1
optional_fields:
- counter_evidence
- follow_up_questions
- historical_judgment_links
- posterior
- id: trade_preparation
cn_name: 交易准备类
required_fields:
- main_answer
- supporting_evidence
- counter_evidence
- prerequisites
- invalidation_conditions
- uncertainty_and_gaps
- sources
- applicability_flags
- regulation_status
- causal_graph
- phase_evidence
- s1
optional_fields:
- multi_perspectives
- follow_up_questions
- historical_judgment_links
- posterior
- id: trade_decision_aid
cn_name: 交易决策辅助类
required_fields:
- main_answer
- supporting_evidence
- counter_evidence
- prerequisites
- invalidation_conditions
- uncertainty_and_gaps
- sources
- applicability_flags
- regulation_status
- posterior
- s1
optional_fields:
- multi_perspectives
- follow_up_questions
- historical_judgment_links
- phase_evidence
- causal_graph
# 全任务硬约束
universal_required_fields:
- s1 # ADR-008-supplement §2.6 全任务必跑
- main_answer
- supporting_evidence
- sources
# 任务元数据层(不入 result body,在 Task schema 层)
task_metadata_fields:
- mca_bucket # ADR-008-supplement §2.7
- task_type # I-08' TaskTypeRequired
# 与 MP-3 kelly_cap 协议的衔接
kelly_cap_policy:
task_types_where_posterior_required: [trade_decision_aid]
task_types_where_posterior_optional: [analysis, comparison, review, risk_identification, trade_preparation]
task_types_where_posterior_excluded: [explanation]
value_range:
M0: {min: 0.0, max: 0.25, exclusive_upper_bound: true}
M1_plus: {min: 0.0, max: 0.5, exclusive_upper_bound: true}
signed_by: MP-3
§5 实施路径与 milestone 时间线
| Milestone | 动作 |
|---|---|
| M0(C-1 第一个 PR,走中间态,见 §3.2bis) | • 落地 contracts/tasks-fields-mapping.yaml(本 MP-4 同 commit)• 统一 StructuredCognitionResult schema + task_type 必填(暂不拆 7 个 variant)• 一个读 yaml 的 task-conditional validator 按矩阵校验必/可字段(不 hardcode) • tests/contract_v1_1.py 断言 task_type 缺失即 fail + 跑 7 任务各 3 mock 过 validator |
| M1 | • 升级为 7 个 discriminated union variant(§3.1);删除 M0 统一 schema 兼容层 • 6 新字段(phase_evidence / causal_graph / regulation_status / applicability_flags / posterior / s1)M0 阶段 stub 改实跑 • Mechanism 激活条件(M3 / M5 / F2 / F3)driver |
| M2+ | • 按用户反馈调整字段必/可分布(走 ADR-013 §2 当前版本立场流程) |
§6 与既有协议的关系
| 既有 | MP-4 怎么承接 |
|---|---|
| ADR-008-supplement §3 "10 要素动态组合 + 6 新字段动态可选" | MP-4 是该原意的工程层 codify 落地(machine-readable yaml + Pydantic discriminated union) |
| product-definition.md §7 表 2 "任务→必含要素映射" | MP-4 §2 矩阵完整继承并扩展至 17 字段;表 2 是 MP-4 §2.1 的事实源 |
| MP-3 kelly_cap 协议 | MP-4 §4 kelly_cap_policy 段对齐 MP-3 推荐组合签字 |
| ADR-010 输出端凭证过滤 | 与 MP-4 正交(凭证过滤跨 task variant 一致) |
| ADR-013 codify 哲学换轨 | MP-4 是 ADR-013 §3.2 "Require-X-when-Y 条件式契约"的核心落地物 |
| cognition-1.1-contract.md §4 字段间约束 | B4 重写时移到综合层 validator,与 MP-4 schema variant 分层 |
§7 反模式(禁止)
- ❌ 回退到"扁平 superset + Optional[X]=None 占位"且不校验必/可 —— M1+ 不允许。注意:M0 中间态(§3.2bis)的统一 schema 虽用 Optional 承载差异字段,但必须由 yaml 驱动的 task-conditional validator 强制校验必/可,与"放任 Optional 不校验"的扁平 superset 反模式不同;M0 兼容层带 deprecated 警告
- ❌ 代码层 hardcode 任务→字段映射 —— 必须读
contracts/tasks-fields-mapping.yaml - ❌ 新增 task_type 不走本契约 —— 任何第 8 个任务类型必须走 ADR L3 流程 + 更新 yaml + 更新 Pydantic + 更新 EvalHarness + 更新 V 维度 judge prompt
- ❌ 跨 task variant 字段名漂移 —— 同名字段(如
prerequisites)在 7 个 variant 必须语义一致;不允许"分析类的 prerequisites 是市场假设、复盘类的 prerequisites 是当时持仓"两套语义 - ❌ 在解释类 schema 中放 posterior / kelly_cap —— 直接 schema 层禁止
§7bis Audit trail / Changelog
| 日期 | 调整 | 理由 | 原签署结论是否保留 |
|---|---|---|---|
| 2026-05-29 | 承接 fresh review W3 · 补 M0 中间态:新增 §3.2bis"M0 中间态实施说明"——M0 第一个 PR 走"统一 schema + task_type 必填 + 读 yaml 的 task-conditional validator",7 个 discriminated union variant 作为 M1+ 演进目标;§5 milestone 表 M0/M1 行同步;§7 反模式补"M0 统一 schema 须 yaml 驱动校验必/可,区别于放任不校验的扁平 superset" | M0 第一个 PR 一步到位 7 个 discriminated union variant 落地复杂度高、首个 PR 风险大(作者签署时已有疑虑)。改为先中间态再演进,降低首 PR 风险,最终目标不变 | 保留。§0 决议(按 7 task_type 拆 variant + 矩阵机器可读化为 yaml)不变;本次只补"M0 落地走中间态"的实施节奏说明,最终演进目标仍是 7 variant discriminated union |
§8 关联资产
- ADR-013 · codify 哲学换轨(本 MP 是 §3.2 落地物)
- ADR-012 · SVA-9 战略愿景对齐九层防御方案(L1 契约源层)
- MP-3 · kelly_cap 字段语义与下游消费协议(§4 衔接)
- ADR-008 supplement · 机制层输出契约扩展(§3 动态组合源)
- MP-5 · 字段暴露面分层契约(B1.3 落地,同 commit)
- 13 条契约型不变量 deep design spec(drafts/):13 条契约型不变量 deep design spec
- FinBayes 产品定义(§4.2 任务清单 + §7 表 2 字段映射)
- FinBayes 战略白皮书 v3(§5 line 509 动态组合原话)
- 变更协议 · 体系级变更流程