实现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

@@ -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 路由。