跳到主要内容

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.yaml line 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_evidenceM3 时钟相位必(M3 激活)
causal_graphM5 传导图必(M5 激活)
regulation_statusM5.4 制度摩擦可(F2/F3 必)
applicability_flagsM6 三支柱适用性
posterior(含 kelly_capM7.uq 双峰后验
s1S1 叙事-数字一致性必(横切)

注 1s1 是 ADR-008-supplement §2.6 唯一明确的"全任务硬约束"(见 I-13')—— 7 任务全部

注 2posterior 在解释 / 分析 / 比较 / 复盘 / 风险 / 交易准备类下置 (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.1 BaseCognitionResult 的公共必填字段: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 关联资产