Files
th-hotel-simple/docs/project/requirements/M002-v3-p0.1-parent-group-routing-update.md

148 lines
7.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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