实现M002 V3 P0.1 Parent Group路由修订

This commit is contained in:
andy
2026-07-12 11:42:01 +08:00
parent 0358b34159
commit 92489af18e
42 changed files with 3971 additions and 79 deletions

View File

@@ -31,7 +31,7 @@
| `requirements/M001-source-message-inbox-prd.md` | 当前有效 | M001 邮件来源入口 PRD记录 AgentBus 邮件 JSON 入库、历史查询、原文读取和媒体引用边界。 |
| `requirements/M002-order-task-workflow-v1.md` | 历史参考 | M002 订单任务主流程 V1已由 V2 承接,保留用于理解早期流程。 |
| `requirements/M002-order-task-workflow-v2.md` | 阶段记录 | M002 订单任务主流程 V2记录当前已阶段实现的 AI 过渡层、S000/S999 兼容、订单任务流转、任务确认和 OPERA 模拟骨架。 |
| `requirements/M002-order-task-workflow-v3.md` | 当前有效 | M002 订单任务主流程 V3基于 2026-07-11 P0 冻结基线,记录 S10/S99、42 路由、方案 C、type-known manual review 同卡解阻和 fail-closed 边界。 |
| `requirements/M002-order-task-workflow-v3.md` | 当前有效 | M002 订单任务主流程 V3基于 2026-07-11 P0 冻结基线和 2026-07-12 P0.1 Parent Group 修订,记录 S10/S99、40 路由、方案 C、type-known manual review 同卡解阻和 fail-closed 边界。 |
| `requirements/M002-superagent-task-result-api-contract.md` | 阶段记录 | M002 SuperAgent 任务结果入站接口契约阶段记录;对外总契约以 `integrations/superagent-api-contract.md` 为准。 |
| `requirements/M002-ai-query-minimal-fields.md` | 阶段记录 | M002 SuperAgent 查询上下文接口 1、2 最小字段落地记录;对外总契约以 `integrations/superagent-api-contract.md` 为准。 |
| `requirements/M002-backend-data-model-design.md` | 阶段记录 | M002 后端数据模型设计,记录 AI 过渡层、订单、任务、任务卡、审计和 OPERA 模拟结果表。 |

View File

@@ -19,7 +19,7 @@
| 来源 | 当前用途 |
| --- | --- |
| `docs/import/20260711/开发交付_P0冻结基线_2026-07-11/01_Adapter_Frontend/任务卡前端字段变更与路由说明_3.0_to_current.md` | 0711 P0 前端 / Adapter 路由说明。前端后续按 42 路由、S10/S99、type-known manual review 和 fail-closed 口径调整页面。 |
| `docs/import/20260711/开发交付_P0冻结基线_2026-07-11/01_Adapter_Frontend/任务卡前端字段变更与路由说明_3.0_to_current.md` | 0711 P0 前端 / Adapter 路由说明。Parent split / 42 路由部分已被 0712 P0.1 覆盖;前端后续按 40 路由、S10/S99、type-known manual review 和 fail-closed 口径调整页面。 |
| `docs/import/20260711/开发交付_P0冻结基线_2026-07-11/01_Adapter_Frontend/任务卡前端字段变更说明_3.0_to_当前版_2026-07-10.xlsx` | 最新前端任务卡展示 / 编辑白名单和三元组路由表。文件名保留 7 月 10 日,内部基线为 7 月 11 日。 |
| `docs/import/20260708/任务卡前端展示字段表 3.0.xlsx` | 历史前端字段白名单,已被 0711 P0 冻结基线承接。 |
| `docs/import/20260706/任务卡展示编辑矩阵.xlsx` | 后端完整规则来源。用于后端校验、最终确认写入、OPERA 映射、展示条件和任务卡完整约束。 |
@@ -39,7 +39,7 @@
| SuperAgent MCP tools | `docs/project/integrations/superagent-mcp/README.md` | MCP 对外交付资料包tools 字段语义应跟随 SuperAgent HTTP 对外总契约。 |
| SuperAgent 任务结果入站接口 | `docs/project/requirements/M002-superagent-task-result-api-contract.md` | 阶段记录,用于理解 M002 接收 AI 结果的落地细节;如与总契约冲突,以总契约为准。 |
| SuperAgent 查询上下文接口 1、2 | `docs/project/requirements/M002-ai-query-minimal-fields.md` | 阶段记录,用于理解接口 1、2 的最小字段实现;如与总契约冲突,以总契约为准。 |
| 订单任务主流程 V3 | `docs/project/requirements/M002-order-task-workflow-v3.md` | 当前开发基线,基于 0711 P0 冻结基线,覆盖 S10/S99、42 路由、方案 C、type-known manual review 同卡解阻和 fail-closed。 |
| 订单任务主流程 V3 | `docs/project/requirements/M002-order-task-workflow-v3.md` | 当前开发基线,基于 0711 P0 冻结基线和 0712 P0.1 Parent Group 修订,覆盖 S10/S99、40 路由、方案 C、type-known manual review 同卡解阻和 fail-closed。 |
| 订单任务主流程 V2 | `docs/project/requirements/M002-order-task-workflow-v2.md` | 已实现阶段记录,保留用于理解当前代码中的 S000/S999、订单任务流转和 OPERA 模拟骨架。 |
| 后端 checkpoint | `docs/project/requirements/M002-backend-checkpoint-plan.md` | 阶段记录,用于理解后端拆分和验收。 |
| 前端可用接口与待补接口 | `docs/project/frontend-backend/frontend-to-backend-api-requests.md` | 前后端协作清单,已区分可用、后置和历史候选路径,不替代后端权威契约。 |

View File

@@ -18,7 +18,8 @@
## 3. 字段来源注意事项
- `docs/import/20260711/开发交付_P0冻结基线_2026-07-11/01_Adapter_Frontend/任务卡前端字段变更与路由说明_3.0_to_current.md`当前前端 / Adapter 路由说明,覆盖 42 路由、S10/S99、type-known manual review 和 fail-closed 口径。
- `docs/import/20260711/开发交付_P0冻结基线_2026-07-11/01_Adapter_Frontend/任务卡前端字段变更与路由说明_3.0_to_current.md` 0711 P0 前端 / Adapter 路由说明,覆盖 S10/S99、type-known manual review 和 fail-closed 口径;其中 Parent split / 42 路由口径已被 0712 P0.1 覆盖
- `docs/project/requirements/M002-v3-p0.1-parent-group-routing-update.md` 是当前 Parent Group / Allotment 路由修订说明:前端应按 40 路由口径处理 Parent split。
- `docs/import/20260711/开发交付_P0冻结基线_2026-07-11/01_Adapter_Frontend/任务卡前端字段变更说明_3.0_to_当前版_2026-07-10.xlsx` 是当前前端展示 / 编辑白名单和三元组路由表。
- `docs/import/20260708/任务卡前端展示字段表 3.0.xlsx` 是历史前端展示 / 编辑白名单,已被 0711 P0 冻结基线承接。
- `docs/import/20260706/任务卡展示编辑矩阵.xlsx` 是后端校验、最终确认写入、OPERA 映射和展示条件的完整规则来源。
@@ -145,6 +146,8 @@ POST /api/auth/logout
- 任务列表里旧 `task_type=SOURCE_MESSAGE_ONLY``task_subtype=S000/S999` 或新 `task_subtype=S10/S99` 的记录只展示邮件来源和 SuperAgent 入口结果,不展示处理按钮。
- 任务详情里 `source_message_only_result` 仅对 `SOURCE_MESSAGE_ONLY` 返回,包含 `entry_result_code``entry_result_meaning``entry_result_description``entry_result_source_message_id``result_type``route_code``agent_assessment``notification``manual_review``raw_answer`;普通业务任务该字段为空。
- 任务列表、订单任务时间线和任务详情顶层已透出 `result_type``ai_task_type``route_code``system_process_category`。前端展示任务卡标题和标签时优先用这些稳定 code不要只靠旧 `task_type` 判断。
- P0.1 后Parent split 父事件不再是独立 Parent Cancel Booking 卡;前端应展示为 `Cancel Allotment / cancel_allotment_control_block``linked_parent_release_after_child_split` 只作为关系字段或详情信息,不作为任务 subtype 筛选项。
- P0.1 的“40 条路由”表示当前合法 route definition 数量;`route_code` 保持历史稳定且不连续重编号,因此 `R41_FALLBACK_BUSINESS_EVENT_REVIEW``R42_UNHANDLED_CURRENT_INTENT` 仍是合法展示 code。
- `adapter_contract_errors[]``unhandled_intents[]` 只在任务详情返回,表示同一 SuperAgent 入站批次中没有生成业务任务的诊断块;前端只读展示并提供来源邮件入口,不显示保存、确认、执行或重试按钮。
### 5.5.1 Type-known manual review 同卡复核解阻接入注意
@@ -308,7 +311,7 @@ run_label: 可选调试标签
## 7. 需要持续提醒的后置事项
- 普通任务切换订单接口继续后置。
- M002 V3 的结构化 `S10/S99` 入站、42 路由枚举 / 稳定配置、`UNHANDLED_CURRENT_INTENT``adapter_contract_error` transition 最小落库、任务列表 / 订单时间线 / 任务详情 V3 路由字段和只读诊断块透出、type-known manual review 同卡解阻第一版、typed infrastructure errorP0 fixtures 回归基线均已完成。
- M002 V3 的结构化 `S10/S99` 入站、40 条 P0.1 路由枚举 / 稳定配置、`UNHANDLED_CURRENT_INTENT``adapter_contract_error` transition 最小落库、任务列表 / 订单时间线 / 任务详情 V3 路由字段和只读诊断块透出、type-known manual review 同卡解阻第一版、typed infrastructure errorP0 fixtures 回归基线和 Parent Group / Cancel Allotment 路由修订均已完成。
- 系统管理后台 V1 已完成后续若要做用户搜索更多筛选、批量操作、密码策略增强、MFA、登录设备管理应单独开需求。
- 现有 Reservation / SourceMessage 业务接口的强制登录、强制权限和业务审计 actor 全量迁移仍后置。
- 真实 OPERA / OHIP 接入继续后置。

View File

@@ -114,12 +114,12 @@ GET /api/reservation/tasks
"temporary_order_no": "TMP-20260708-001",
"task_type": "UPDATE_BOOKING",
"result_type": "normal_task",
"ai_task_type": "Update Booking",
"task_subtype": "RATE_CHANGE",
"route_code": "R07_UPDATE_RATE_CODE_NORMAL",
"ai_task_type": "Payment Evidence",
"task_subtype": "payment_evidence",
"route_code": "R10_PAYMENT_EVIDENCE_NORMAL",
"system_process_category": "BUSINESS_TASK",
"task_status": "PENDING_CONFIRM",
"card_name": "Rate Change",
"card_name": "Payment Evidence",
"queue_sequence": 2,
"queue_participation": true,
"can_process": false,
@@ -325,7 +325,9 @@ POST /api/system/reservation/demo-data
| --- | --- | --- | --- |
| 结构化 `S10/S99` 入站 | 任务列表、任务详情、Debug EML 结果展示 | 已完成第一版 | 后端接收 `result_type=source_message_review_notification + route_code=S10/S99`,创建只读源邮件通知卡;任务列表可见,订单列表不可见;返回 `route_code`、入口说明、`agent_assessment``notification` 和 S99 的入口 `manual_review`。 |
| 旧 `S000/S999` 兼容映射 | 任务列表、任务详情 | 已完成第一版 | 旧数据继续可见;前端可按 `S000→S10``S999→S99` 展示统一文案。 |
| 42 路由元数据 | 任务列表筛选、订单任务时间线、任务详情标题、字段展示 | 已完成第一版 | 后端保存并返回 AI 原始 `result_type/ai_task_type/task_subtype``route_code` 和系统处理分类;前端不要只依赖系统主任务类型判断卡片。 |
| 40 条 P0.1 路由元数据 | 任务列表筛选、订单任务时间线、任务详情标题、字段展示 | 已完成第一版 | 后端保存并返回 AI 原始 `result_type/ai_task_type/task_subtype``route_code` 和系统处理分类;前端不要只依赖系统主任务类型判断卡片。 |
| P0.1 稳定 route_code | 任务列表筛选、订单任务时间线、任务详情标题 | 已完成第一版 | `route_code` 保持历史稳定,不因路由总数变 40 而连续重编号;前端仍可能看到 `R41_FALLBACK_BUSINESS_EVENT_REVIEW``R42_UNHANDLED_CURRENT_INTENT`。 |
| Parent split 父事件卡型 | 任务列表、订单任务时间线、任务详情标题 | 已完成第一版 | 0712 P0.1 后Parent split 父事件展示为 `Cancel Allotment / cancel_allotment_control_block``linked_parent_release_after_child_split` 仅作为关系字段,不作为任务 subtype 筛选项。 |
| `unhandled_current_intents[]` 展示块 | 任务详情 | 已完成第一版 | 后端保存并在任务详情 `unhandled_intents[]` 返回未覆盖业务意图,只用于展示和源邮件查看,不自动建业务任务卡。 |
| `adapter_contract_error` | 任务详情、错误提示 | 已完成第一版 | 命中 P1/P2 未闭合或路由冲突时,任务详情 `adapter_contract_errors[]` 返回稳定错误 code 和原始片段,不转成 Fallback。 |
| type-known manual review 同卡解阻 | 任务详情复核 | 已完成第一版 | `manual_review` 不再全部等同 Fallback已知业务卡型返回原业务卡信息、`review_status``review_resolution` 和可编辑 pointer 字段,解阻后进入 `READY`。 |

View File

@@ -140,6 +140,7 @@
- 任务结果通知接口 JSON body 里的 `source_message_id` 是外部来源消息 ID对应 AgentBus `source.external_message_id`SuperAgent 默认不传 `hotel_id`,后端用系统酒店 `hotel_id + provider + channel + external_message_id` 反查内部 SourceMessage Inbox。
- 当前代码的任务结果通知接口也支持 `text/plain``S000,source_message_id``S999,source_message_id`。这类请求不在 body 里带 `hotel_id`,后端同样使用平台酒店表唯一 `ACTIVE` 酒店查询 SourceMessage Inbox。
- M002 V3 已支持结构化 `S10/S99`、V3 业务根基础解析、`UNHANDLED_CURRENT_INTENT``adapter_contract_error` 最小落库:上线前必须单独验证新 JSON 入站、旧 S000/S999 兼容、隐藏技术订单、任务列表可见、订单列表不可见和只读限制。
- 0712 P0.1 后SuperAgent runtime 必须同步使用 P0.1 Main Agent prompt / booking-desk-event skill。完整 Parent split 的父事件必须提交为 `Cancel Allotment + cancel_allotment_control_block`;当前新入站 `Cancel Booking + linked_parent_release_after_child_split` 会被后端按 `adapter_contract_error` 处理,不创建业务任务。旧历史 payload 只读兼容,不做批量迁移。
- `application/json``text/plain` 都必须使用原始请求体计算 SHA-256 并参与 HMAC 签名SuperAgent 侧不能签名格式化后的 JSON 或二次拼接字符串。
- 旧 S000/S999 会创建 `SOURCE_MESSAGE_ONLY` 只读特殊任务和隐藏技术订单,任务列表可见,订单列表不可见,不允许编辑、确认、转换订单或执行 OPERA。V3 S10/S99 应保持同等只读和不可执行边界。
- SuperAgent 查询上下文接口中的 `source_message_id``source_event_index` 第一版仅兼容接收,不参与查询和校验;不要依赖它们限制查询范围。

View File

@@ -107,23 +107,25 @@ SuperAgent 不应知道或依赖内部 SourceMessage Inbox ID。任务结果通
## 3.1 M002 V3 迁移提醒
2026-07-11 起,项目需求基线已确认采用 `docs/project/requirements/M002-order-task-workflow-v3.md`
2026-07-11 起,项目需求基线已确认采用 `docs/project/requirements/M002-order-task-workflow-v3.md`2026-07-12 起Parent Group / Allotment 路由采用 `docs/project/requirements/M002-v3-p0.1-parent-group-routing-update.md`
- 新入口结果将从旧文本 `S000/S999` 迁移为结构化 `S10/S99`
- 新业务输出将从旧 `ai_task_results[]` 迁移为 `source_message + message_events[] + case_candidates[] + extraction_warnings[] + unhandled_current_intents[]`
- 后端会完整保存 AI 三元组、`route_code` 和系统处理分类;`S10/S99` 仍以只读源邮件通知卡展示,任务列表可见,订单列表不可见。
-`S000/S999` 数据继续兼容展示,语义上分别映射到 `S10/S99`
- 完整 Parent split 的父事件必须使用 `Cancel Allotment + cancel_allotment_control_block``relationship_type=linked_parent_release_after_child_split` 只用于关联和 Preflight不再作为独立任务 subtype。
- 当前新入站不接受 `Cancel Booking + linked_parent_release_after_child_split` 作为合法业务任务;该组合仅允许历史数据只读兼容。
当前后端已完成 M002 V3 CP1-CP6
- 已建立 42 条 P0 路由枚举 / 稳定配置。
- 已建立 40 条 P0.1 路由枚举 / 稳定配置`route_code` 保持历史稳定,不按总数连续重编号,`R41/R42` 仍可能出现在响应和历史 transition 中
- 已支持结构化 `S10/S99` 入站,创建只读 `SOURCE_MESSAGE_ONLY` 任务。
- 已支持 V3 业务根 `source_message + message_events[]` 的基础解析;可派生到现有任务模型的 event 会创建业务任务,无法派生、显式契约错误或基础 manual_review / parent split 结构不完整的 event 只落 `adapter_contract_error` transition不创建业务任务。
- 已支持 `unhandled_current_intents[]` 最小落库:只写 `UNHANDLED_CURRENT_INTENT` transition不创建业务任务也不按 adapter 契约错误返回。
- 已在 `workflow_reservation_ai_transition` 保存 `route_code``system_process_category``adapter_error_code``adapter_error_message`
- 已支持 type-known manual review 同卡解阻、当前订单归属确认、P0 fixtures 回归测试和 V3 typed `infrastructure_input_error` 响应。
尚未完成:真实 OPERA / OHIP、普通任务切换订单、字段矩阵从当前扁平结构整体迁移到 0711 P0 新结构。
尚未完成:真实 OPERA / OHIP、普通任务切换订单、字段矩阵从当前扁平结构整体迁移到 0711 P0 新结构、历史旧 Parent Cancel Booking payload 批量迁移
## 4. 接口 1查询订单上下文
@@ -559,9 +561,13 @@ V3 字段说明:
当前已支持的 V3 行为:
- 42 条 P0 路由进入后端枚举 / 稳定配置。
- 40 条 P0.1 路由进入后端枚举 / 稳定配置。
- `route_code` 是稳定代码,不因路由总数从 42 调整为 40 而重编号;联调方不要按数字连续性判断合法性。
- 结构化 `S10/S99` 创建只读 `SOURCE_MESSAGE_ONLY` 任务,任务列表可见,订单列表不可见。
- 业务 event 能派生到稳定路由时,复用现有订单 / 任务 / 任务卡创建链路。
- 完整 Parent split 父事件必须提交为 `event_type=Cancel Allotment``extracted_fields.cancel_scope=entire_allotment_control_block``task_subtype=cancel_allotment_control_block`,并保留 `relationship_type=linked_parent_release_after_child_split` 作为关系字段。
- 当前新入站若提交 `event_type=Cancel Booking``relationship_type=linked_parent_release_after_child_split`,写入 `adapter_contract_error` transition不创建业务任务旧 V2 兼容 `ai_task_results[]` 中的同等三元组按请求级 `ADAPTER_CONTRACT_ERROR` 拒绝。
- 同一个 Parent split cluster 重复提交 Parent 候选时,后续重复 Parent 写入 `adapter_contract_error` transition不创建第二张 Parent 业务任务。
- event 判别字段不完整、显式携带 `contract_errors`、根 `missing_fields`、不完整 `manual_review` 或不完整 parent split 候选时,写入 `adapter_contract_error` transition不创建订单和任务同一邮件其他 sibling event 继续处理。
- `unhandled_current_intents[]` 写入 `UNHANDLED_CURRENT_INTENT` transition不返回 `adapter_error_code`
- V3 `message_events[].relevant_message_excerpt` 入站后会归一化到任务卡 AI payload 根路径供旧字段矩阵读取证据字段SuperAgent 仍只需要按 V3 event 契约提供该字段。

View File

@@ -4,8 +4,8 @@
| 项目 | 内容 |
| --- | --- |
| 文档版本 | 0.3 |
| 日期 | 2026-07-11 |
| 文档版本 | 0.4 |
| 日期 | 2026-07-12 |
| 状态 | V2 后端 checkpoint 阶段记录V3 新开发和当前实现状态以 `M002-order-task-workflow-v3.md` 为准 |
| 适用范围 | M002 后端实现拆分、交付物和验收标准 |
| 主要读者 | 后端、测试、产品、后续协作 agent |
@@ -14,7 +14,7 @@
本文把 `M002-order-task-workflow-v2.md``M002-superagent-task-result-api-contract.md``M002-backend-data-model-design.md` 拆成可执行后端 checkpoint用于理解当前已阶段实现的 M002 V2 能力。
2026-07-11 后M002 后续新开发必须先读 `M002-order-task-workflow-v3.md`。V3 已确认采用 0711 P0 冻结基线,新增结构化 `S10/S99`42 路由、方案 C、type-known manual review 同卡解阻、复核场景订单归属确认和 P1/P2 fail-closed 边界。本文下方 V2 checkpoint 不再覆盖这些新需求。
2026-07-11 后M002 后续新开发必须先读 `M002-order-task-workflow-v3.md`。V3 已确认采用 0711 P0 冻结基线,新增结构化 `S10/S99`、方案 C、type-known manual review 同卡解阻、复核场景订单归属确认和 P1/P2 fail-closed 边界。2026-07-12 后Parent Group / Allotment 语义按 P0.1 修订,路由总数从 42 调整为 40完整 Parent split 父事件从旧 `Cancel Booking + linked_parent_release_after_child_split` 改为 `Cancel Allotment + cancel_allotment_control_block`本文下方 V2 checkpoint 不再覆盖这些新需求。
每个 checkpoint 都应先读项目规范,再按本项目包结构和注释要求实现。不要一次性把完整后端做完,也不要在不确定字段或目录归属时先写再重构。
@@ -30,11 +30,13 @@
- `docs/import/reusable/alibaba-java-coding-guidelines-summary.md`
- `docs/project/requirements/M002-order-task-workflow-v2.md`
- `docs/project/requirements/M002-order-task-workflow-v3.md`
- `docs/project/requirements/M002-v3-p0.1-parent-group-routing-update.md`
- `docs/project/requirements/M002-superagent-task-result-api-contract.md`
- `docs/project/requirements/M002-backend-data-model-design.md`
- `docs/import/20260711/开发交付_P0冻结基线_2026-07-11/README_交付说明.md`
- `docs/import/20260711/开发交付_P0冻结基线_2026-07-11/01_Adapter_Frontend/任务卡前端字段变更与路由说明_3.0_to_current.md`
- `docs/import/20260711/开发交付_P0冻结基线_2026-07-11/01_Adapter_Frontend/任务卡前端字段变更说明_3.0_to_当前版_2026-07-10.xlsx`
- `docs/import/20260712/开发交付_P0_to_P0.1_增量修订说明_给开发Codex_2026-07-11.md`
- `docs/import/20260706/开发AI先读_工作顺序.md`
- `docs/import/20260706/AI输出参数并集字典.xlsx`
- `docs/import/20260706/任务卡展示编辑矩阵.xlsx`

View File

@@ -16,7 +16,7 @@
本文不是完整最终模型。当前后端已经按本模型落地第一阶段 Flyway migration、Entity、Mapper、Repository、Service 和测试;后续真实 OPERA、前端页面和 SuperAgent 查询上下文接口仍需继续补充。
2026-07-11 后M002 V3 已确认采用 0711 P0 冻结基线。后续数据模型扩展必须支持结构化 `S10/S99``message_events[]`、42 路由、方案 C 中的 AI 原始三元组 / 系统处理分类分离、type-known manual review 同卡解阻和 `adapter_contract_error`,不能只沿用本文的 `ai_task_results[]` 阶段模型。
2026-07-11 后M002 V3 已确认采用 0711 P0 冻结基线2026-07-12 后Parent Group / Allotment 语义按 P0.1 修订。后续数据模型扩展必须支持结构化 `S10/S99``message_events[]`、40 路由、方案 C 中的 AI 原始三元组 / 系统处理分类分离、type-known manual review 同卡解阻和 `adapter_contract_error`,不能只沿用本文的 `ai_task_results[]` 阶段模型。
## 2. 设计原则

View File

@@ -4,9 +4,9 @@
| 项目 | 内容 |
| --- | --- |
| 文档版本 | 0.1 |
| 日期 | 2026-07-11 |
| 状态 | 0711 P0 基线确认版;后端已完成 M002 V3 CP1-CP6 入站、路由持久化、列表 / 详情展示、同卡复核解阻和 P0 fixtures 回归第一版 |
| 文档版本 | 0.2 |
| 日期 | 2026-07-12 |
| 状态 | 0712 P0.1 增量确认版;后端已完成 M002 V3 CP1-CP6 第一版Parent Group / Cancel Allotment 路由按 P0.1 修订 |
| 适用范围 | SourceMessage 之后的 SuperAgent 输出适配、任务路由、只读通知卡、人工复核同卡解阻、前后端协作边界 |
| 主要读者 | 产品、后端、前端、测试、SuperAgent 对接方、后续协作 agent |
@@ -14,7 +14,7 @@
本文是 `M002-order-task-workflow-v2.md` 的第三版修正。V2 记录了当前后端阶段实现:`ai_task_results[]``S000/S999` 文本结果、订单任务基础流转、任务草稿确认、OPERA 模拟骨架、SuperAgent 查询上下文接口和前端 P0 查询接口。
V3 记录 2026-07-11 导入的 SuperAgent P0 冻结基线,以及本项目已经确认的产品决策。后续 M002 新开发应优先按本文执行;当前代码中已经存在的 V2 行为,需要按 checkpoint 逐步兼容迁移,不能在未实现前对外宣称已经完成。
V3 记录 2026-07-11 导入的 SuperAgent P0 冻结基线、2026-07-12 导入的 P0.1 Parent Group 语义修订,以及本项目已经确认的产品决策。后续 M002 新开发应优先按本文和 `M002-v3-p0.1-parent-group-routing-update.md` 执行;当前代码中已经存在的 V2 行为,需要按 checkpoint 逐步兼容迁移,不能在未实现前对外宣称已经完成。
本文不替代 `docs/project/integrations/superagent-api-contract.md` 的线上联调接口说明。若要给 SuperAgent 联调方使用,必须在对应接口实现完成后同步更新该对外契约。
@@ -25,23 +25,27 @@ V3 以以下资料和决策为输入:
| 资料 | 用途 |
| --- | --- |
| `docs/import/20260711/开发交付_P0冻结基线_2026-07-11/README_交付说明.md` | 0711 P0 交付边界、可先实现范围、P1/P2 暂缓范围 |
| `docs/import/20260711/开发交付_P0冻结基线_2026-07-11/01_Adapter_Frontend/任务卡前端字段变更与路由说明_3.0_to_current.md` | Adapter / Frontend 的 42 路由、人工复核、Parent split、fail-closed 规则 |
| `docs/import/20260711/开发交付_P0冻结基线_2026-07-11/01_Adapter_Frontend/任务卡前端字段变更与路由说明_3.0_to_current.md` | Adapter / Frontend 的 P0 路由、人工复核、fail-closed 规则;其中 Parent split / 42 路由部分已被 0712 P0.1 覆盖 |
| `docs/import/20260711/开发交付_P0冻结基线_2026-07-11/01_Adapter_Frontend/任务卡前端字段变更说明_3.0_to_当前版_2026-07-10.xlsx` | P0 字段、三元组路由、旧枚举迁移、非法组合和验收用例 |
| `docs/import/20260711/开发交付_P0冻结基线_2026-07-11/02_AI_Runtime/main_agent_prompt.md` | 当前 Main Agent 运行提示词 |
| `docs/import/20260711/开发交付_P0冻结基线_2026-07-11/02_AI_Runtime/booking-desk-event.skill` | 当前 Skill 包 |
| `docs/import/20260711/开发交付_P0冻结基线_2026-07-11/02_AI_Runtime/核心契约_展开阅读/*.md` | 输出契约、事件路由、内容完整性、Main 到 Skill 输入、人工复核规则 |
| `docs/import/20260711/开发交付_P0冻结基线_2026-07-11/03_P0_Acceptance/` | P0 fixtures 和轻量 validator |
| `docs/import/20260711/开发交付_P0冻结基线_2026-07-11/04_Known_Issues_非契约/` | P1/P2 未闭合范围,只用于识别暂缓和 fail-closed不作为生产规则源 |
| `docs/import/20260712/开发交付_P0_to_P0.1_增量修订说明_给开发Codex_2026-07-11.md` | Parent Group / Allotment 语义修订、40 路由、当前 producer 禁止旧 Parent Cancel Booking |
| `docs/import/20260712/Agent 0711 1743/**` | P0.1 Main Agent prompt、booking-desk-event skill 和 references |
| `docs/project/requirements/M002-v3-p0.1-parent-group-routing-update.md` | 本项目对 P0.1 增量的落地说明和验收清单 |
本项目确认的产品决策:
- M002 V3 正式采用 0711 P0 基线。
- M002 V3 正式采用 0711 P0 基线,并从 2026-07-12 起采用 P0.1 Parent Group / Allotment 增量修订
- 旧数据 `S000/S999` 继续在任务列表可见;新数据迁移为 `S10/S99`
- `S10/S99` 继续复用隐藏技术订单 + 任务列表只读卡,不进入订单列表和订单执行队列。
- 缺少 `source_message.source_message_id` 时,后端已按 `HTTP 400 + infrastructure_input_error + retryable=true` 的技术错误响应返回,不创建 SourceMessage、AI transition、订单、任务或通知卡。
- 内部任务模型采用“方案 C”完整保存 AI 三元组,系统处理分类和前端展示分类单独维护。
- type-known manual review 使用同一张业务卡复核解阻,不生成第二张 normal task。
- 第一版保存全部 42 条路由 / 枚举,先支持保存和列表展示。
- 第一版保存全部 40 P0.1 路由 / 枚举,先支持保存和列表展示。
- `Allotment / Control Block = Parent Group`;完整 Parent split 的父事件必须是 `Cancel Allotment + cancel_allotment_control_block`,不是普通 `Cancel Booking`
- P1/P2 未闭合范围命中时 fail closed不由本系统发明字段或业务规则。
- 普通任务切换订单继续后置P0 仅支持“复核场景下确认订单归属”。
@@ -51,7 +55,7 @@ V3 以以下资料和决策为输入:
| --- | --- | --- |
| SuperAgent 业务输出 | 顶层 `source_message_id + ai_task_results[]` | 顶层 `source_message + message_events[] + case_candidates[] + extraction_warnings[] + unhandled_current_intents[]` |
| 信息类 / 入口问题 | `text/plain``S000,source_message_id` / `S999,source_message_id` | 结构化 JSON`S10` / `S99``result_type=source_message_review_notification` |
| 任务路由 | 以 `result_type + task_type + task_subtype` 粗映射系统主任务 | 按每个 `message_events[i]` 派生 42 条 P0 三元组 |
| 任务路由 | 以 `result_type + task_type + task_subtype` 粗映射系统主任务 | 按每个 `message_events[i]` 派生 40 条 P0.1 三元组 |
| 人工复核 | Fallback / manual_review 可转换为业务任务 | type-known review 保留原业务卡;只有类型或 subtype 未知才走 Fallback |
| 复核解阻 | 偏“转换”思路 | 同卡 `review_status + review_resolution.field_overrides[]` 解阻 |
| Message Notification | 历史信息提醒任务 | 新入口统一使用 `S10/S99` 只读源邮件通知卡;历史数据兼容展示 |
@@ -159,21 +163,35 @@ V3 接收端按根结构分流:
## 7. Adapter 路由模型
### 7.1 42 条 P0 路由
### 7.1 40 条 P0.1 路由
V3 第一版必须保存并支持以下路由类别:
- 19 个业务 subtype每个 subtype 都有 normal 和 type-known manual review 两条路由,共 38 条。
- 18 个业务 subtype每个 subtype 都有 normal 和 type-known manual review 两条路由,共 36 条。
- `S10``S99` 两条源邮件通知路由。
- 类型或 subtype 未知的 Fallback 路由:`manual_review + Fallback + business_event_review`
- `unhandled_current_intent + Unhandled Current Intent + requires_business_approval_or_unsupported_task_card` 展示路由。
第一版后端要求:
- 42 条路由全部进入枚举或稳定配置,不能只硬编码已实现的少数几条。
- 40 条路由全部进入枚举或稳定配置,不能只硬编码已实现的少数几条。
- `route_code` 是历史稳定码,不因 P0.1 总数从 42 调整为 40 而重编号;`R41_FALLBACK_BUSINESS_EVENT_REVIEW``R42_UNHANDLED_CURRENT_INTENT` 继续保留。
- 每条入站 event 都按自己的 `message_events[i]` 独立派生,不能在邮件根只生成一个任务。
- 同一封邮件多个任务按 SuperAgent 返回数组顺序和事件顺序生成执行顺序。
- `Note``Allotment Maintenance``update_allotment_control_block` 仅历史兼容,不允许新数据生成。
- 当前 producer 不允许再生成 `normal_task/manual_review + Cancel Booking + linked_parent_release_after_child_split`
- `relationship_type=linked_parent_release_after_child_split` 只用于 Parent / Child 关联和 Preflight不再决定 `task_subtype`
- 旧 V2 兼容 `ai_task_results[]` 若继续提交 `Cancel Booking + linked_parent_release_after_child_split`,也按当前 producer 契约错误处理。
P0.1 Parent Group 路由规则:
| 场景 | 合法事件 / 三元组 | 系统处理 |
| --- | --- | --- |
| Child Group 创建 | `normal_task/manual_review + New Booking + new_group_block` | 创建 New Booking 业务任务 |
| Parent Group 完整释放 / 取消 | `normal_task/manual_review + Cancel Allotment + cancel_allotment_control_block` | 创建 Cancel Allotment 业务任务卡 |
| 旧 Parent split 新入站 | `Cancel Booking + linked_parent_release_after_child_split` | `adapter_contract_error`,不创建业务任务 |
| 重复 Parent 候选 | 同一 Parent Group 再次输出合法 Parent 候选 | 第二个及后续 Parent 写入 `adapter_contract_error` |
| 历史旧 payload 只读展示 | `Cancel Booking + linked_parent_release_after_child_split` | reader / adapter 展示层可归一为 Cancel Allotment不改写原 payload |
### 7.2 方案 CAI 三元组和系统处理分类分离
@@ -341,10 +359,11 @@ Content-Type: application/json
命中以下情况时,第一版应 fail closed
- 42 路由与 runtime 输出不一致或无法唯一匹配。
- 40 路由与 runtime 输出不一致或无法唯一匹配。
- `manual_review` 九字段不完整。
- `missing_fields[]` 不是 RFC 6901 pointer或无法映射到可编辑字段。
- Parent split 关系字段不完整或无法一一对应。
- 当前 producer 输出 `Cancel Booking + linked_parent_release_after_child_split`
- `Note``Allotment Maintenance``update_allotment_control_block` 新数据出现。
- Fix Charge、Preflight/lock、Fallback 非字段解阻、Voucher 文件对象缺失、Manual RateCode 边界等 P1/P2 未闭合场景。
@@ -366,6 +385,8 @@ Content-Type: application/json
- 复核解阻页需要能提交 `field_overrides[]`,并在复核场景下确认订单归属。
- `unhandled_current_intents[]` 只作为展示块,不提供执行按钮。
- P1/P2 fail-closed 返回时,前端展示稳定错误和源邮件入口,不让用户误以为可以确认执行。
- Parent split 父事件展示为 `Cancel Allotment / cancel_allotment_control_block`,不再展示独立 Parent Cancel Booking 卡。
- 任务列表筛选不提供 `linked_parent_release_after_child_split`;新开发阶段只展示 `S10/S99` 筛选,不再展示旧 `S000/S999` 筛选项。
## 12. 后端实施 checkpoint 建议
@@ -373,16 +394,17 @@ V3 建议拆成以下 checkpoint避免一次性重构过大
| Checkpoint | 目标 | 说明 |
| --- | --- | --- |
| M002-V3-CP1 | 文档和枚举基线 | 已完成:建立 42 路由枚举 / 稳定配置,作为入站路由唯一代码源 |
| M002-V3-CP1 | 文档和枚举基线 | 已完成:建立 0711 P0 42 路由枚举 / 稳定配置P0.1 后已调整为 40 路由 |
| M002-V3-CP2 | 入站解析兼容 | 已完成:正式回调支持结构化 S10/S99 和 V3 业务根,保留旧 S000/S999 兼容 |
| M002-V3-CP3 | 路由持久化 | 已完成第一版:已保存 AI 原始三元组、route_code、system_process_category、unhandled_current_intents 和 adapter_contract_error |
| M002-V3-CP4 | 列表 / 详情展示 | 已完成第一版:任务列表、订单任务时间线和任务详情透出 V3 路由字段;任务详情支持 S10/S99 入口通知结构、unhandled intent 展示块和 adapter contract error 展示块 |
| M002-V3-CP5 | 同卡复核解阻 | 已完成第一版:支持 review_status、review_resolution.field_overrides[]、复核场景订单归属确认、JSON Pointer 校验和 READY 流转 |
| M002-V3-CP6 | P0 fixtures 回归 | 已完成第一版:引入 0711 P0 fixtures / validator 作为后端适配测试参考,覆盖 main_outcomes、candidate_gate、manual_review_resolution、source_identity_errors、parent_split_two_children、row_multiple_derived、allotment_scope其中 candidate_gate 是 Main Agent 调 Skill 前契约,后端以 validator 和 fixture reference 固化,不作为任务结果回调直接建任务 |
| M002-V3-CP7 | P0.1 Parent Group 路由修订 | 当前 checkpoint将 Parent split 父事件从旧 Cancel Booking 迁移为 Cancel Allotment路由总数 42 → 40并保留旧 payload 只读兼容 |
## 13. 明确不做
V3 P0 不做以下事项:
V3 P0.1 不做以下事项:
- 不做真实 OPERA / OHIP 写入。
- 不做普通任务任意切换订单。
@@ -394,12 +416,12 @@ V3 P0 不做以下事项:
## 14. 当前代码现状提醒
截至 M002 V3 CP6 落地后,当前后端已经实现:
截至 M002 V3 CP7 落地后,当前后端已经实现:
- `S000/S999` 文本结果兼容处理。
- 结构化 `S10/S99` 入站处理,复用 `SOURCE_MESSAGE_ONLY` 只读特殊任务。
- 42 条 P0 路由枚举 / 稳定配置。
- V3 业务根 `source_message + message_events[]` 基础解析;能派生到稳定路由的 event 创建业务任务,无法派生的 event、显式 `contract_errors`、根 `missing_fields`、不完整 `manual_review` 和不完整 parent split 候选只落 `adapter_contract_error` transition。
- 40 条 P0.1 路由枚举 / 稳定配置。
- V3 业务根 `source_message + message_events[]` 基础解析;能派生到稳定路由的 event 创建业务任务,无法派生的 event、显式 `contract_errors`、根 `missing_fields`、不完整 `manual_review`、当前 producer 旧 Parent Cancel Booking 和不完整 parent split 候选只落 `adapter_contract_error` transition。
- `unhandled_current_intents[]` 只落 `UNHANDLED_CURRENT_INTENT` transition不创建订单和任务也不伪装成 adapter 契约错误。
- AI transition 最小保存 `route_code``system_process_category``adapter_error_code``adapter_error_message`
- 任务列表、订单任务时间线和任务详情顶层透出 `result_type``ai_task_type``task_subtype``route_code``system_process_category`
@@ -409,11 +431,11 @@ V3 P0 不做以下事项:
- `POST /api/reservation/tasks/{taskId}/manual-review-resolutions` 支持字段修正、当前订单归属确认、JSON Pointer 到可编辑字段校验、READY 流转、confirmed payload 写入、两条 OPERA 模拟操作创建和审计记录。
- `POST /api/reservation/tasks/{taskId}/manual-review-resolutions``field_overrides[]` 已支持 `field_pointer``field_path` 两种定位方式;`field_path` 可为 P0 主路径或旧扁平路径,成功后响应归一化到 P0 主 `field_path`
- `source_message.source_message_id` 缺失时按 V3 typed `infrastructure_input_error` 结构响应。
- 0711 P0 fixtures 已纳入后端回归测试参考,并补齐 S10/S99 严格契约、P0 type-known manual review 解阻、candidate_gate reference 和当前扁平字段矩阵兼容。
- 0711 P0 fixtures 已纳入后端回归测试参考,并补齐 S10/S99 严格契约、P0 type-known manual review 解阻、candidate_gate reference 和当前扁平字段矩阵兼容Parent split 相关用例按 0712 P0.1 增量改为 Cancel Allotment
- `field_contract_version` 历史迁移已收紧V18 只把没有 `draft_payload_json` 且没有 `confirmed_payload_json``code-v1` 任务卡标记为 `20260711-p0`;已经存在用户草稿或确认 payload 的历史任务卡保留旧版本,等待重新保存、确认或后续专项 backfill。
- 订单 / 任务列表、任务详情、草稿保存、最终确认、OPERA 模拟骨架和审计列表。
- SuperAgent 查询上下文接口 1、2以及邮件会话相关查询。
仍需后续 checkpoint 实现:
- 真实 OPERA / OHIP、普通任务任意切换订单、字段矩阵从当前扁平结构整体迁移到 0711 P0 新结构。
- 真实 OPERA / OHIP、普通任务任意切换订单、字段矩阵从当前扁平结构整体迁移到 0711 P0 新结构、历史旧 Parent Cancel Booking payload 批量迁移

View File

@@ -8,9 +8,9 @@
| 项目 | 内容 |
| --- | --- |
| 文档版本 | 0.5 |
| 日期 | 2026-07-11 |
| 状态 | V2 兼容 + M002 V3 CP1-CP6 入站解析、同卡复核P0 fixtures 回归基线;后续业务流程以 `M002-order-task-workflow-v3.md` 为准 |
| 文档版本 | 0.6 |
| 日期 | 2026-07-12 |
| 状态 | V2 兼容 + M002 V3 CP1-CP7 入站解析、同卡复核P0 fixtures 回归和 P0.1 Parent Group 路由修订;后续业务流程以 `M002-order-task-workflow-v3.md` 为准 |
| 适用范围 | SuperAgent / Main Agent 调用本系统提交 AI 任务结果 |
| 主要读者 | 后端、SuperAgent 对接方、测试、后续协作 agent |
@@ -20,7 +20,7 @@
本文承接 `M002-order-task-workflow-v2.md`,只定义本系统入站接口、鉴权、幂等、请求响应和技术校验边界,不定义 SuperAgent 内部 prompt、Skill 实现、OPERA 真实接口或前端展示细节。
2026-07-11 后M002 后续开发基线已迁移到 `M002-order-task-workflow-v3.md`当前后端已完成 CP1-CP6结构化 `S10/S99` 入站、V3 业务根基础解析、42 路由枚举 / 稳定配置、`UNHANDLED_CURRENT_INTENT` 和 route 相关字段最小落库、type-known manual review 同卡解阻第一版、typed `infrastructure_input_error` 响应P0 fixtures 回归基线。旧 `S000/S999``ai_task_results[]` 仍作为兼容路径保留。对外联调以 `docs/project/integrations/superagent-api-contract.md` 为准。
2026-07-11 后M002 后续开发基线已迁移到 `M002-order-task-workflow-v3.md`2026-07-12 起Parent Group / Allotment 路由采用 P0.1 增量修订:当前后端目标为结构化 `S10/S99` 入站、V3 业务根基础解析、40 路由枚举 / 稳定配置、`UNHANDLED_CURRENT_INTENT` 和 route 相关字段最小落库、type-known manual review 同卡解阻第一版、typed `infrastructure_input_error` 响应P0 fixtures 回归基线和 Parent split `Cancel Allotment` 路由。旧 `S000/S999``ai_task_results[]` 仍作为兼容路径保留。对外联调以 `docs/project/integrations/superagent-api-contract.md` 为准。
## 2. 接口概览
@@ -41,6 +41,7 @@
- 本接口只做技术校验和系统接收,不替代用户确认和 OPERA 模拟操作。
- `application/json` 用于 V3 结构化 `S10/S99`、V3 业务根或 V2 `normal_task` / `manual_review` 兼容结构化任务。
- `text/plain` 用于旧 `S000,source_message_id` / `S999,source_message_id` 特殊入口结果兼容。
- P0.1 后V3 业务根中的完整 Parent split 父事件必须使用 `event_type=Cancel Allotment``task_subtype=cancel_allotment_control_block`;当前新入站不接受 `Cancel Booking + linked_parent_release_after_child_split` 作为合法业务任务,旧 V2 `ai_task_results[]` 兼容入口也不能继续提交该三元组。
### 2.1 SourceMessage ID 口径
@@ -251,6 +252,8 @@ S999,mail-20260708-0001
- `task_type` 属于当前系统可识别的稳定值或可进入 Fallback 处理。
- 同一个请求内 `source_event_index` 和数组顺序可保存。
- 关键字符串长度不超过数据库限制。
- V3 P0.1 Parent split 当前合法结构必须是 `Cancel Allotment + cancel_allotment_control_block``Cancel Booking + linked_parent_release_after_child_split` 属于当前 producer 契约错误,只能作为历史 payload 只读兼容。
- 同一个 Parent split cluster 只能有一个 Parent 候选;重复 Parent 候选不创建第二张业务任务卡。
### 5.2 不在本接口判断
@@ -260,6 +263,7 @@ S999,mail-20260708-0001
- 不因为字段缺失自动改成 Fallback。
- 不直接执行 OPERA 模拟。
- 不直接把 AI 原始值写入 OPERA 参数。
- 不把 Parent split 的 adapter 契约校验理解为业务成功;即使生成 `Cancel Allotment` 任务也必须等待用户确认、Preflight 和后续 OPERA/OHIP 接入。
## 6. 幂等设计

View File

@@ -0,0 +1,144 @@
# M002 V3 P0.1 Parent Group Routing Update
## 文档信息
| 项目 | 内容 |
| --- | --- |
| 文档版本 | 0.1 |
| 日期 | 2026-07-12 |
| 状态 | P0.1 增量修订确认版,作为 M002 V3 后续 Parent Group / Allotment 路由开发依据 |
| 适用范围 | SuperAgent V3 入站、Adapter 路由、Parent split、前端卡型映射、后端回归测试 |
| 主要读者 | 后端、前端、测试、SuperAgent 对接方、后续协作 agent |
## 1. 背景
2026-07-12 导入的 P0.1 资料修正了 0711 P0 中 Parent split 的建模方式。旧 P0 曾把 Parent split 父事件建模为 `Cancel Booking + linked_parent_release_after_child_split`。P0.1 明确要求:
```text
Allotment / Control Block = Parent Group
Allotment code = Parent Group code
Parent Group 的 block_code = group_code
```
因此 Parent split 的父事件不再是普通 `Cancel Booking`,而是 Parent Group 整块取消:
```text
N 个 Child New Booking + 1 个 Parent Cancel Allotment
```
本文只记录 P0 到 P0.1 的增量差异,不重写完整 M002 V3 业务流程。完整流程仍以 `M002-order-task-workflow-v3.md` 为主文档。
## 2. 权威输入
本次增量以以下导入资料为准:
| 资料 | 用途 |
| --- | --- |
| `docs/import/20260712/开发交付_P0_to_P0.1_增量修订说明_给开发Codex_2026-07-11.md` | P0.1 Parent Group 语义修订、路由数量、验收清单 |
| `docs/import/20260712/Agent 0711 1743/prompts/main_agent_prompt.md` | P0.1 Main Agent prompt |
| `docs/import/20260712/Agent 0711 1743/skills/booking-desk-event/SKILL.md` | P0.1 booking-desk-event skill 入口 |
| `docs/import/20260712/Agent 0711 1743/skills/booking-desk-event/references/00-output-contract.md` | 输出契约、S10/S99、Parent candidate 结构 |
| `docs/import/20260712/Agent 0711 1743/skills/booking-desk-event/references/31-allotment-control-block.md` | Allotment / Control Block 与 Parent Group 权威定义 |
`docs/import/20260711/**` 仍作为 P0 基线和 fixtures 参考,但其中 Parent Cancel Booking / 42 路由口径已被 P0.1 覆盖。
## 3. 路由差异
P0.1 删除两条当前合法路由:
| 旧三元组 | P0.1 当前处理 |
| --- | --- |
| `normal_task + Cancel Booking + linked_parent_release_after_child_split` | 当前新入站必须 `adapter_contract_error`,仅 legacy reader 可只读识别 |
| `manual_review + Cancel Booking + linked_parent_release_after_child_split` | 当前新入站必须 `adapter_contract_error`,仅 legacy reader 可只读识别 |
P0.1 复用已有 Cancel Allotment 卡:
| Agent event | Adapter 三元组 |
| --- | --- |
| `Cancel Allotment``manual_review=null` | `normal_task + Cancel Allotment + cancel_allotment_control_block` |
| `Cancel Allotment``manual_review!=null` | `manual_review + Cancel Allotment + cancel_allotment_control_block` |
`relationship_type=linked_parent_release_after_child_split` 只表示 Parent 与 Child 的关联关系和后续 Preflight 校验,不再选择独立 task subtype。
最新路由统计:
```text
18 个业务 subtype × normal/manual = 36 条
S10、S99、Fallback、unhandled display = 4 条
总计 = 40 条
```
注意:`route_code` 是对外接口和历史 transition 都会看到的稳定代码不按总数重编号。P0.1 的“40 条”表示当前合法 route definition 数量为 40历史稳定码 `R41_FALLBACK_BUSINESS_EVENT_REVIEW``R42_UNHANDLED_CURRENT_INTENT` 继续保留。
## 4. Parent Split 当前合法结构
完整 Parent split 必须满足:
- 每个 Child 输出一个 `New Booking`,且 `extracted_fields.booking_object_type=Group Block`
- Parent 输出且只输出一个 `Cancel Allotment`
- Parent 的 `extracted_fields.cancel_scope=entire_allotment_control_block`
- Parent 的 `extracted_fields.parent_release_or_cancel_candidate=true``release_reason=parent_to_child_allocation_split``allocation_split_from_parent=true`
- Parent 的 `relationship_type=linked_parent_release_after_child_split`
- Parent 的 `requires_downstream_hard_validation=true`
- Parent 的 `case_keys.group_code``case_keys.block_code` 必须同时存在且完全相等;只取得一边时复制到另一边。
- Parent 的 `extracted_fields.parent_group_code` 必须与归一后的 Parent code 一致。
- Parent 的 `related_source_event_indices[]` 必须与 `extracted_fields.child_group_codes[]` 数量一致、顺序一一对应,并指向同根 `message_events[]` 中的 Child New Booking。
如果当前 producer 输出:
```text
Cancel Booking + linked_parent_release_after_child_split
```
后端不得按 legacy 兼容路径放行,应作为当前入站契约错误处理。
## 5. Legacy 只读兼容
历史已经保存的旧 payload
```text
Cancel Booking
+ cancel_object_type=group_block
+ relationship_type=linked_parent_release_after_child_split
```
处理规则:
- 不批量迁移历史 JSON。
- 不改写或回写原历史 payload。
- 审计或原始 AI payload 查看仍展示旧数据。
- reader / adapter 展示层可以只读归一为 `Cancel Allotment + cancel_allotment_control_block`
- 当前新入站不能借 legacy reader 分支继续生成旧组合。
## 6. 前端影响
前端应按以下口径展示:
- 不再注册或展示独立 Parent Cancel Booking 卡型。
- Parent split 父事件展示为 `Cancel Allotment / cancel_allotment_control_block`
- `relationship_type=linked_parent_release_after_child_split` 可以作为关联标签或详情字段展示,但不能作为任务 subtype 筛选项。
- 任务筛选项不应出现 `linked_parent_release_after_child_split`
- 新开发阶段任务列表筛选只保留 `S10/S99`,不再展示旧 `S000/S999` 筛选项;旧数据展示兼容仍由详情和只读卡逻辑兜底。
## 7. 后端验收清单
后端实现 P0.1 时至少覆盖:
- 路由枚举为 40 条。
-`linked_parent_release_after_child_split` 不再是当前合法 route definition。
- 当前入站 `Cancel Booking + linked_parent_release_after_child_split` 记录为 `adapter_contract_error`,不创建业务任务;该规则同时适用于 V3 `message_events[]` 和旧 V2 兼容 `ai_task_results[]`
- 当前入站 `Cancel Allotment + cancel_allotment_control_block + linked_parent_release_after_child_split` 可以创建 `CANCEL_ALLOTMENT` 业务卡。
- 同一个 Parent split cluster 重复提交 Parent 候选时,后续重复 Parent 记录为 `adapter_contract_error`,不再创建第二张 Parent 任务卡。
- Parent 双 key 不一致时不猜测,进入 type-known manual review 或 adapter contract error不能改成普通 Cancel Booking。
- Parent `child_group_codes[]``related_source_event_indices[]` 数量、顺序和 Child New Booking 目标一致。
- 普通 FIT / Group Block 的 `Cancel Booking` 不受影响。
- 旧历史数据只读兼容,不迁移、不改写原 payload。
- 项目文档、对外 SuperAgent 契约、前后端沟通文档和测试断言全部从 42 路由更新为 40 路由。
## 8. 不做范围
- 不实现真实 OPERA / OHIP。
- 不做普通任务任意切换订单。
- 不批量迁移历史旧 payload。
- 不扩大 P1/P2 未闭合规则。
- 不把部分 Allotment / Control Block 维护重新开放为 active 路由。