实现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,82 @@
# 事件路由地图
## 用途
从 current evidence 建立粗候选,再由 Skill 选择最终业务 event type、subtype、目标拆分和派生事件。Main Agent 与 Skill 的内部接口遵循 `04-main-skill-input-contract.md`
`00-output-contract.md` 中的三个集合具有不同用途:
- `active_emittable_event_types`:可以进入 `candidate_events` 并由当前邮件新生成。
- `legacy_accepted_event_types`:只读历史兼容,不得作为当前 producer 或粗候选。
- `business_review_outcomes`:业务类型未知时的复核 outcome不得作为粗候选或 Skill 调用门槛。
## 路由顺序
0. Main Agent 先校验 `source_message.source_message_id`。缺失或空白时形成并校验 `infrastructure_input_error`;不得读取正文、附件、历史或系统上下文,不得进入 S10/S99也不得调用 Skill。冻结该 error 后,按 `00-output-contract.md` 的 Constitutional Final Submission Lifecycle 调用一次 mandatory submit再原样返回。
1. Main Agent 按 `03-current-content-completeness.md` 盘点全部 current 业务内容,不得识别一个信号后停止。
2. Main Agent 按 `04-main-skill-input-contract.md` 只形成 current evidence 支持的粗候选。它可以取得附件、OCR、表格和原始字段但不作最终文件 subtype、event type 或拆分裁决。
3. 输入可理解且没有 active 业务信号时,输出 `S10`,不调用 Skill。输入不足、无法判断是否存在任何 active 业务信号时,输出 `S99`,不调用 Skill。
4. `candidate_events` 至少包含一个合法粗候选时才调用 Skill同时存在的清楚但不受支持内容保留在 `unknowns`
5. Skill 重新验证 current evidence并对最终 event type、subtype、目标拆分、事件合并和 linked/derived events 作唯一裁决。
6. event type 和 subtype 已知但目标、字段、映射或证据不安全时,保留原 active `event_type`,并附非空 `manual_review`。只有 active 业务方向已确认但 event type 或 subtype 仍无法确定时,才输出 type-unknown `Need Manual Review`
7. Skill 确认所有粗候选均没有 active 事件时,返回内部 `no_supported_event`,由 Main Agent 转换为 S10该内部结构不得直接对外。素材包结构非法时返回内部 `candidate_package_contract_error`,不得映射成 S10、S99 或业务复核。
8. 能安全拆分时按目标独立路由,并把未覆盖当前意图一对一输出到顶层 `unhandled_current_intents`
只有 Thank you、裸 FYI、acknowledgement、Noted、Received 等没有具体预订业务信息的文字不匹配 Trace。FYI 或单纯告知只要包含与明确预订对象相关的具体补充信息,就路由为 `Trace`。一般咨询、Booking Confirmation Request、部分配额维护和当前不支持的业务请求不得伪装成 Trace。
当一封邮件同时包含 active 事件和当前不支持的业务请求时,不得因为 active 事件已命中而忽略剩余请求,也不得把整封邮件降级为 S10。支持部分正常路由未覆盖部分进入 `unhandled_current_intents`
## Active 路由表
下表只能产生 `active_emittable_event_types` 中的精确 event type
| 当前信号 | 最终事件类型 | 读取 |
| --- | --- | --- |
| 新建 FIT、Group Block、Allotment、Control Block | `New Booking` | `10-new-booking.md` |
| Parent-to-child allocation creation | child `New Booking` + linked parent `Cancel Allotment` candidate | `31-allotment-control-block.md` |
| 修改已有 FIT/Group 订单的日期、晚数、房型、房量、人数、价格或其他主订单字段;不含独立部分配额维护 | `Update Booking / Amendment` | `11-update-booking.md` |
| 整单取消、CXL、release/cancel reservation 或 group block | `Cancel Booking` | `12-cancel-booking.md` |
| 明确整块取消 Allotment / Control Block | `Cancel Allotment` | `12-cancel-booking.md` |
| 当前 credit voucher 文件 | `Voucher Received` | `13-voucher-payment.md` |
| 当前 bank transfer、cash deposit 或 transaction receipt 文件 | `Payment Evidence` | `13-voucher-payment.md` |
| 当前名单、分房表、guest list | `Rooming List` | `14-rooming-list.md` |
| 旧 Group Code 改新 Group Code | `AMEND GROUP CODE` | `15-amend-group-code.md` |
| 与具体预订对象相关、但不属于主任务核心参数的当前补充信息 | `Trace` | `16-trace-notes.md` |
| Rooming List 目标需要 TA Recorder | `TA RECORDER` | `17-ta-recorder-note.md` |
| 明确请求生成 Proforma Invoice | `Invoice Generation` | `18-invoice.md` |
| 当前收到已有或 revised invoice | `Invoice Received` | `18-invoice.md` |
| 当前清楚的付款通知,不是付款政策审批 | `Payment Notice` | `18-invoice.md` |
| 单独手工价格或 Rate Code 维护 | `Manual RateCode` | `53-manual-rate-code.md` |
## Legacy 与范围外内容
- `Note``Allotment Maintenance` 属于 `legacy_accepted_event_types`,不得进入 `candidate_events`,不得由当前邮件新生成。
- 部分配额维护、减少但保留余量、部分日期或部分房量 release 当前不受支持。单独出现时由 Main Agent 输出 S10与 active 事件同现时原文进入 `unknowns`,最终展示在 `unhandled_current_intents`
- 独立新建 Allotment / Control Block 与明确整块 `Cancel Allotment` 仍属于 active 范围。
- `Need Manual Review` 属于 `business_review_outcomes`,不是 active event type不能独立满足 Skill 调用门槛。
## 冲突优先级
先按独立 current 意图拆分,再只对同一意图的多个候选应用以下优先级:
- 当前只有 voucher/payment proof即使标题像 NEW也优先 voucher/payment。
- Rooming List 文件不得当成 booking update 表。
- `AMEND GROUP CODE TO` 且 old/new 清楚时,优先 `AMEND GROUP CODE`
- Parent-to-child allocation creation 不因出现 `AMEND` 字样就当普通改单。
- Extra bed alone 是 Trace不是房量修改。
- 先识别主任务完整承接的核心参数,再把剩余的具体预订补充信息按目标生成 Trace不得为同一核心参数重复生成 Trace。
- 已确定、需要随预订保留的补充付款安排可以是 Trace付款凭证、到账结果、Payment Notice、Invoice、催款或需要酒店批准的价格、退款、减免、账期、付款政策、合同条件询问不是 Trace。
- Cancel 行不会因为历史上有 guest request 就自动生成 Trace。
## 行级隔离与拆分
- QBD/LianTai 每个 current effective row 必须独立处理,不得跨行合并主事件。
- “一行”是隔离边界,不是绝对事件数量。普通情况下每行 × 每目标一个主事件;同一行可以按多个目标拆分,也可以产生契约明确的 linked/derived events。
- Parent-to-child allocation 按 child group code 拆,并额外输出且只输出一个 parent linked `Cancel Allotment` candidate。显式取消同一 parent 时合并证据,不重复输出。
- Extra bed、Meeting、meal、arrival notice、guest request 或其他预订补充信息与主业务同现时,按目标拆 linked Trace。
- 同一封邮件、同一目标对象的多条补充信息合并成一个 Trace多个目标对象分别生成 Trace。
- Rooming List 按目标 group 拆,并按业务规则派生 TA Recorder。
拆分后业务类型已知但字段或目标不安全时,保留对应业务 event 并附 `manual_review`。只有 event type 或 subtype 本身无法确定时才使用 `Need Manual Review`
不符合 Trace 但具有当前业务意义的内容必须以 `unknowns[].category=unhandled_current_business_content` 保留原文。同邮件存在至少一个 active 事件时输出到顶层 `unhandled_current_intents`;整封邮件没有 active 事件时由 Main Agent 输出 S10。不得静默忽略。