# 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 的 `case_keys.group_code` 与 `case_keys.block_code` 原始候选冲突时，adapter 不猜测目标对象；如 SuperAgent 已输出 `manual_review.reason_code=target_object_unclear` 且 `context_used.parent_identity_candidates[]` 非空，则创建同卡 type-known manual review，否则写入 adapter contract error。
- 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。
- 当前 V3 `message_events[]` 入站 `Cancel Booking + linked_parent_release_after_child_split` 按 event 记录 `adapter_contract_error` transition，不创建业务任务。
- 旧 V2 兼容 `ai_task_results[]` 若提交 `Cancel Booking + linked_parent_release_after_child_split`，按请求级 `ADAPTER_CONTRACT_ERROR` 拒绝，不创建业务任务，也不创建 AI transition。
- 当前入站 `Cancel Allotment + cancel_allotment_control_block + linked_parent_release_after_child_split` 可以创建 `CANCEL_ALLOTMENT` 业务卡。
- 同一个 Parent split cluster 重复提交 Parent 候选时，后续重复 Parent 记录为 `adapter_contract_error`，不再创建第二张 Parent 任务卡。
- Parent 只提供 `group_code` 或只提供 `block_code` 时，adapter 可在派生副本中补齐另一边；原始 payload 不回写。
- Parent 双 key 不一致时不猜测，满足 `target_object_unclear + parent_identity_candidates[]` 时进入 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 路由。
