# S06 Amend Group Code Skill

## 1. Skill Identity

- catalog_code: `S06`
- skill_id: `amend_group_code_skill`
- skill_name: `Amend Group Code Skill`
- task_type: `Amend Group Code`

Supported action:

- `amend_group_code`

## 2. Purpose

本 Skill 用于判断一条来自 `body_current` 的当前邮件事件，是否明确要求把已有 booking / group block / reservation 的 Group Code 从旧值改为新值，并生成 Amend Group Code 任务卡候选。

第一版保持窄口径：

- 当前事件明确存在旧 Group Code 改为新 Group Code 的业务动作：输出 `normal_task`。
- 当前事件只有模糊改团号语义但没有明确 old / new 关系，或 `AMEND GROUP CODE TO` 后的新 Group Code 识别不清：输出 `manual_review`。

本 Skill 不直接写数据库，不直接写 Opera，不直接调用 Group Code / Reservation / Group Block 更新 API，不直接创建真实 TaskCard，不确认订单状态。

如果本 Skill 输出 `ai_task_result` 且通过统一输出校验，AI Runtime / Main Agent / Skill Orchestrator 后续可调用信息系统提供的统一受控 Tool / API 创建 Amend Group Code 任务卡或人工复核 / 人工处理任务卡。真实 TaskCard ID、状态机、幂等、并发、执行前硬校验和 Group Code 更新均由信息系统负责。

## 3. Scope

本 Skill 覆盖 current 邮件中的 Group Code 修改事件：

- 邮件正文明确写旧 Group Code 改为新 Group Code。
- Excel / table 当前事件明确写 `AMEND GROUP CODE` 或 `AMEND GROUP CODE TO`。
- PDF / 图片 OCR 中明确出现 Group Code 修改动作。
- 中文、英文、泰文中明确表达旧团号 / Group Code 改为新团号 / Group Code。

S06 只处理 Group Code 修改本身。同行、同句或同段中出现的房型、房量、日期、餐食、备注、凭证、名单等其他业务信息，不改变 S06 的主任务类型。

任务卡前端展示字段只包含：

- `old_group_code`
- `new_group_code`

统一输出契约所需的 source、evidence、routing context、target validation、same-event details 等字段可以进入后台 payload 或 `context_used` / `extracted_fields`，但不作为 Amend Group Code 任务卡前端展示字段。

## 4. When To Use

当 `body_current` 中的当前邮件事件满足以下任一条件时，Main Agent 可以调用本 Skill：

- 当前正文明确写 `AMEND GROUP CODE TO : <new_group_code>`。
- 当前正文明确写 `AMEND GROUP CODE`，并能从同一当前事件识别 old / new 关系。
- 当前附件表格、PDF 或图片 OCR 的当前事件明确写 `AMEND GROUP CODE TO : <new_group_code>`。
- 当前事件中有明确方向关系，例如 `A to B`、`A change to B`、`A 改为 B`、`A เปลี่ยนเป็น B`，且语义是修改 Group Code。

其中 `AMEND GROUP CODE TO : <new_group_code>` 是强信号。

触发来源不能限定为附件或表格；正文、附件表格、PDF、图片 OCR 都可以作为 current 证据。

## 5. Must Not Use When

不得在以下情况下使用本 Skill 生成 Amend Group Code `normal_task`：

- 只是提到 Group Code，但没有修改 Group Code 的业务动作。
- 只有一个 Group Code，且无法判断它是旧值还是新值。
- 当前邮件是在全新创建预订，且没有旧 Group Code 改新 Group Code 的动作，应走 `new_booking_skill`。
- 当前邮件只是普通修改日期、晚数、房型、房量、人数、价格或备注，且没有 Group Code 修改动作，应走 `update_booking_amendment_skill`。
- 当前邮件只是取消 booking / group / allotment / control block，且没有 Group Code 修改动作，应走 `cancel_booking_skill`。
- 当前邮件只是收到 Voucher / payment slip / payment confirmation，应走 `voucher_received_skill`。
- 当前邮件只是提交 Rooming List / Name List，应走 `rooming_list_name_list_skill`。
- 主语义是 `CANCEL BOOKING`、cut allotment、release allotment 或 CXL，只是顺带提到 moved / join group / เปลี่ยนเป็นกรุ๊ป，不得硬判为 S06。
- Group Code 修改动作只出现在 `body_thread`，不在 `body_current`。
- 当前邮件只是 thank you、FYI、acknowledgement、noted、received、confirmed receipt、确认收到、转发说明、仅同步信息或无新业务动作。

固定列位置、固定单元格位置或固定 sheet 名不得作为 S06 的业务识别规则。

例如，不得写死：

- 某一列一定是 action / remark 列。
- 某一列一定是旧 Group Code。
- 某个 sheet 的固定单元格一定代表 Group Code 修改。

列号、行号、单元格地址、sheet 名只可作为 evidence location 或后台溯源字段，不能作为业务识别规则本身。S06 必须依赖文本语义、old / new 关系、`AMEND GROUP CODE TO` 等业务表达。

## 6. Allowed Result Types

第一版只允许：

- `normal_task`
- `manual_review`

第一版不输出：

- `exception_task`
- `no_action`
- `informational_message`

## 7. Key Context Needed

Main Agent 应尽量提供以下上下文：

- `source_message_id`
- `source_event_index`
- 当前邮件 subject
- `body_current` 中当前 Group Code 修改事件原文片段
- 当前附件摘要、表格摘要、PDF / 图片 OCR 摘要
- `old_group_code`
- `new_group_code`
- 可用引用历史正文，作为 evidence context
- `routing_context`
- 已写入 reservation / group block / booking record 查询结果
- 可关联待完善 New Booking / 上游任务卡查询结果
- 如果同一不可拆分事件中还有其他业务动作，提供其原文摘要供后台 payload 保留

`body_thread` 只能作为 evidence context，不得单独触发 S06。

路由级查询时，如果能识别 `old_group_code`，`case_keys.group_code` 应优先使用旧 Group Code，因为它通常用于定位当前已存在对象；新 Group Code 应作为 S06 业务字段传入。

## 8. Input Requirements Summary

本 Skill 输入应包含：

- 当前 Group Code 修改请求摘要。
- `body_current` 相关原文片段。
- 当前附件 / 表格 / OCR 摘要。
- 已识别的 `old_group_code` 和 `new_group_code`。
- old / new 关系的证据说明。
- routing context，如有。
- 可用历史证据上下文，如有。
- 同一事件中附带的其他业务动作原文摘要，如有。

本 Skill 不要求 Main Agent 在输入阶段固定完整 `extracted_fields` schema。

### 8.1 Bundled / Shared References

当 current message、attachment、sender、subject 或 extracted evidence 显示 QBD / LianTai Excel / table workflow 时，Main Agent 应读取：

- `../references/qbd_liantai_email_table_rules.md`

使用该 reference 的目的：

- 区分 current / history。
- 判断当前有效高亮 / 黄色行。
- 遵守一行一个 `source_event_index`、一个 `ai_task_result`、一个任务卡候选。
- 保留 row-level evidence 作为后台溯源。
- 避免把历史 AMD / CXL 行误判成当前任务。

注意：

- QBD / LianTai reference 可以帮助定位当前行和解释删除线、红字、before / after 线索。
- Reference 中的列、行、单元格位置不得被 S06 写死为业务识别规则。
- S06 不读取房型映射或 Rate Code reference 来处理同行房型、房量、价格；这些同事件信息只作为后台附带业务信息保留。
- 如果同一 current 邮件或附件中存在可拆分的独立房型 / 房量 / 价格修改事件，应拆分 `source_event_index` 并交给 S02。

## 9. Decision Rules

### 9.1 Current Event Rule

Group Code 修改动作必须来自 `body_current` 或 current 附件 / current OCR 证据。

如果修改动作只出现在 `body_thread`，不得输出 S06 `normal_task`。

### 9.2 Trigger Rule

`AMEND GROUP CODE TO : <new_group_code>` 是强信号。

其他表达也可以触发，但必须能表达 Group Code 修改动作，例如：

- `AMEND GROUP CODE`
- `change group code to`
- `change from <old_group_code> to <new_group_code>`
- `改团号`
- `改 Group Code`
- `เปลี่ยน group code`

不得仅因出现类似 Group Code 的字符串就触发。

### 9.3 Old / New Extraction Rule

S06 只抽取两个真正业务字段：

- `old_group_code`
- `new_group_code`

抽取原则：

- `new_group_code` 优先来自 `AMEND GROUP CODE TO :` 后面的明确 code。
- `old_group_code` 来自同一 current 事件中表达“被改掉的旧 code”的上下文。
- 正文中可以从 `A to B`、`A change to B`、`old A new B`、`A 改为 B`、`A เปลี่ยนเป็น B` 等方向关系识别。
- 表格中可以结合删除线、红字、before / after、同一行上下文判断旧 code，但不得把固定列位置写成规则。
- 如果只出现一个 code，且无法判断它是旧 code 还是新 code，不得硬猜。

### 9.4 Target Validation Rule

S06 需要像 S02 一样把 routing context / 历史上下文带进去校验：

1. 是否存在对应有效 reservation / group block / booking record。
2. 如果没有现成记录，是否存在可承接的待完善 New Booking 任务卡或上游任务。
3. 新 Group Code 是否已经关联其他对象。

这些校验结果传给信息系统或用于后台判断，不作为 S06 扩大 `manual_review` 的理由。信息系统在用户确认和后续执行前仍需做硬校验。

### 9.5 Multiple Task Rule

S06 可以和其他任务同时发生，其他任务不限于 S02，也可能包括：

- S01 New Booking
- S02 Update Booking
- S03 Cancel Booking
- S04 Voucher Received
- S05 Rooming List / Name List
- S07 Trace / Reservation Notes
- 其他后续 Skill

如果多个业务动作可以清楚拆分，例如不同段落、不同附件、不同表格行、不同凭证、不同当前事件，应拆成多个 `source_event_index`，分别走对应 Skill。

如果 S06 和其他业务动作在同一个不可拆分事件里，例如同一表格行、同一句正文、同一段连续业务指令、同一个 OCR 区块，则一个 `ai_task_result` 只能有一个主任务：

- 主任务优先为 `Amend Group Code`。
- `skill_id` 使用 `amend_group_code_skill`。
- 其他业务动作通常作为后台关联信息传给信息系统。
- 不额外拆出 S01 / S02 / S03 / S04 / S05 任务卡。
- 任务卡前端仍只展示 `old_group_code` 和 `new_group_code`。

原因：Group Code 修改会影响后续业务动作绑定到哪个 reservation / group block / booking record。

受控例外：

- 如果同一不可拆分事件中同时存在 Trace / Guest Request / extra bed，必须生成 S06 主任务和 S07 linked task。
- S06 先执行，S07 后执行。
- S07 linked task 应保留 `parent_source_event_index`、`linked_task_group_id`、`depends_on_task_type=Amend Group Code`、`blocked_until_parent_completed=true`、`execution_order=2` 等后台关系字段。

### 9.6 Table Row Rule

QBD / LianTai 表格继续遵守：

- 一行一个 `source_event_index`。
- 一行一个 `ai_task_result`。
- 一行一个任务卡候选。
- 不跨行合并。

同一当前有效表格行中出现明确 `AMEND GROUP CODE TO`，并同时出现房型、房量、日期、餐食、备注等信息时，该行主任务为 S06；其他信息只进入后台 payload，不作为任务卡前端展示字段，也不单独拆成 S02，除非它们是另一个可拆分当前事件。

受控例外：如果该行同时出现 Trace / Guest Request / extra bed，应在 S06 主任务之外生成 S07 linked task；这不是跨行合并，也不是把 S06 前端展示字段扩大。

## 10. Normal Task Output

仅当可以安全创建 Amend Group Code 任务卡候选时，输出：

```json
{
  "result_type": "normal_task",
  "task_type": "Amend Group Code",
  "current_or_history": "current"
}
```

必须同时满足：

- Group Code 修改动作来自 current 事件。
- 当前事件明确是旧 Group Code 改为新 Group Code。
- `old_group_code` 可识别。
- `new_group_code` 可识别。
- old / new 方向清楚。

完整输出必须符合统一输出契约。关键要求：

- `source_message_id` 必须原样带回。
- `source_event_index` 必须原样带回。
- `case_keys.group_code` 应优先填 `old_group_code`。
- `visible_reason` 应说明为什么这是 current 邮件中的 Amend Group Code 任务。
- `relevant_message_excerpt` 必须来自 `body_current` 或 current 附件 / OCR 摘要。
- `context_used` 应记录 routing context 摘要和使用的 reference 文件。
- `extracted_fields.old_group_code` 必须填入。
- `extracted_fields.new_group_code` 必须填入。
- 如果来自 QBD / LianTai 表格行，应在后台 payload 中保留 row-level evidence，但任务卡前端不展示这些字段。
- 如果同一事件还有其他业务动作，应在后台 payload 中保留 same-event 原文摘要或后续联动意图，但任务卡前端不展示这些字段。
- 如果同一事件还有 Trace / Guest Request / extra bed，应生成 S07 linked task，并在后台 payload 保留父子任务关系。

任务卡前端展示字段仅限：

```json
{
  "old_group_code": "",
  "new_group_code": ""
}
```

## 11. Manual Review Output

当 current 邮件疑似要求修改 Group Code，但不能安全创建 `normal_task` 时，输出：

```json
{
  "result_type": "manual_review",
  "task_type": "Amend Group Code",
  "current_or_history": "current"
}
```

S06 只在以下情况输出 `manual_review`：

- 只有模糊“改团号 / amend group code”语义，但没有明确 old / new 关系。
- `AMEND GROUP CODE TO` 后的新 Group Code 识别不清。

其他问题，例如 routing context 没查到目标对象、目标状态不确定、同一事件同时出现其他业务动作，不直接作为 S06 的 `manual_review` 条件。它们应作为后台校验结果或后续信息系统硬校验处理。

S06 的 `manual_review` 采用项目默认结构，除非后续用户另行确认精简结构。

建议结构：

```json
{
  "manual_review": {
    "reason_code": "",
    "visible_reason": "",
    "review_record_type": "amend_group_code_manual_review",
    "blocking_points": [],
    "missing_fields": [],
    "conflicting_points": [],
    "suggested_human_actions": [],
    "evidence_to_check": []
  }
}
```

典型 `reason_code`：

- `group_code_change_direction_unclear`
- `new_group_code_unreadable`

注意：

- `manual_review` 不能写成空泛的“人工看一下”。
- 能确定的 `old_group_code` 或 `new_group_code` 应尽量保留。
- 不能可靠确认的字段不要猜，填 `null`、空字符串或空数组。

## 12. Tool Invocation Placeholder

当前创建任务卡 / 可见记录的具体 Tool / API 尚未实现，本节只预留对接位置和语义契约，不定义最终 endpoint、鉴权方式或完整返回结构。

- tool_status: `TBD`
- suggested_tool_name: `create_task_card` / `TBD`
- tool_purpose: 根据信息系统统一任务卡创建接口，创建 Amend Group Code 任务卡或人工复核 / 人工处理任务卡。
- tool_owner: 信息系统。
- caller: AI Runtime / Main Agent / Skill Orchestrator，最终由系统架构确认。
- invocation_timing: Skill 输出 `ai_task_result` 并通过 Unified Output Contract 校验后。
- payload_rule: Skill 能识别出的 `old_group_code`、`new_group_code`、routing context、后台证据和同事件附带业务信息照实填入；任务卡前端只展示 `old_group_code` 和 `new_group_code`。
- must_not_call_when:
  - Skill 输出不符合统一契约
  - current 事件完全不应进入 AI 工作台记录
  - 输出内容缺少任务卡 / 可见记录创建所需的最低溯源字段
- minimum_payload_should_include:
  - `source_message_id`
  - `source_event_index`
  - `catalog_code`
  - `skill_id`
  - `result_type`
  - `task_type`
  - `case_keys`
  - `visible_reason`
  - `relevant_message_excerpt`
  - `attachments`
  - `context_used`
  - `extracted_fields`
  - `manual_review`
  - `additional_operations`
  - `idempotency_key` / `TBD`
- expected_tool_result: `TBD`

Tool 设计原则：

- Amend Group Code Skill 只调用一个统一任务卡创建 Tool：`create_task_card`。
- Group Code 更新是用户确认后的信息系统后续执行动作，不是本 Skill 直接执行动作。
- 如果同一事件还有其他业务动作，它们通常只是后台联动意图或原文摘要，不拆成 S06 专属 Tool；Trace / Guest Request / extra bed 需要另建 S07 linked task。
- AI 不直接写数据库，只调用信息系统暴露的受控 Tool / API。
- 信息系统负责真实任务卡 ID、人工复核任务卡 ID、幂等、并发、状态机、最终落库和执行前硬校验。
- 如果 Tool 尚不可用，本 Skill 仍应输出合格的 `ai_task_result`；不得编造 Tool 调用结果。

## 13. Conflict Or Fallback Rule

- 如果 current 邮件同时包含 Amend Group Code 和其他业务动作，能拆则按 `source_event_index` 拆分，分别走对应 Skill。
- 如果 Amend Group Code 与其他业务动作属于同一不可拆分事件，主任务走 S06，其他动作通常只进入后台 payload 或后续联动意图。
- 如果同一不可拆分事件中还有 Trace / Guest Request / extra bed，应生成 S06 主任务和 S07 linked task。
- 如果同一表格行明确是 `AMEND GROUP CODE TO`，主任务走 S06，不因同行房型、房量、日期、餐食或备注改走 S02。
- 如果当前事件只有普通 update，没有 Group Code 修改动作，走 S02。
- 如果当前事件主语义是 cancel / CXL，且没有明确 old Group Code 改 new Group Code，不走 S06。
- 如果当前 / history 边界不清且无法确认 Group Code 修改来自 current，交由 `exception_detection_skill` 或 structured `manual_review`。
- 如果多个 Skill 冲突且无法安全拆分，也无法按“同一不可拆分事件主任务 S06”规则判断，交由 `exception_detection_skill`。

## 14. Must Not

- 不从 `body_thread` 生成 `normal_task`。
- 不把固定列位置、固定单元格或固定 sheet 名当成业务识别规则。
- 不因为一个字符串像 Group Code 就触发 S06。
- 不猜 `old_group_code`。
- 不猜 `new_group_code`。
- 不把主语义为 cancel 的事件硬判成 S06。
- 不把同一当前有效表格行拆成多个无关任务卡；S06 + S07 linked task 是受控例外。
- 不把多个表格行合并成一个任务卡。
- 不把同行房型、房量、日期、餐食、备注作为任务卡前端展示字段。
- 不输出 `informational_message`。
- 不输出 `no_action`。
- 不输出 `exception_task`。
- 不直接调用 Group Code 更新 API。
- 不直接写 Opera。
- 不直接写数据库。
- 不编造 Tool endpoint、鉴权、返回结构或调用结果。
- 不把 `manual_review` 输出成空泛的“人工看一下”。
