148 lines
7.8 KiB
Markdown
148 lines
7.8 KiB
Markdown
# 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 路由。
|