# S08 TA Recorder Skill

## 1. Skill Identity

- catalog_code: `S08`
- skill_id: `ta_recorder_skill`
- skill_name: `TA Recorder Skill`
- task_type: `TA Recorder`

Supported action:

- `maintain_ta_recorder`

## 2. Purpose

本 Skill 用于在 Rooming List / Name List 成功识别后，为对应目标对象生成 TA Recorder 任务卡候选。

第一版核心口径：

- S08 主要不是普通邮件触发 Skill，而是 S05 Rooming List / Name List 的后置 linked task。
- 一个目标 `group_code` 派生一张 TA Recorder 任务卡。
- 同一个 Rooming List / Name List workbook、文件链接或 `file_reference` 可以被多张 S08 任务卡共享。
- Sheet 只作为绑定证据，不直接决定 `group_code`。
- 如果 current 邮件明确要求维护 TA Recorder，且能识别唯一目标 `group_code` 和名单 / 分房文件引用，可以直接输出 S08。

本 Skill 不直接写数据库，不直接写 Opera，不直接写 TA Recorder，不导入名单，不创建 PM room，不维护 Routing Instruction，不维护 Note，不更新 Block Status。

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

## 3. Scope

本 Skill 覆盖两类 current 业务场景：

1. S05 Rooming List / Name List `normal_task` 后派生 TA Recorder linked task。
2. current 邮件明确要求维护 TA Recorder，并提供可绑定的目标 `group_code` 和名单 / 分房文件引用。

S08 的任务卡前端展示字段应保持简单：

- `group_code`
- `attachment`
- `ta_recorder_status`

其中：

- `group_code` 默认取 S05 识别出的目标 Group Code，允许用户在信息系统中人工修改。
- `attachment` 默认绑定对应 Rooming List / Name List 文件。
- `ta_recorder_status` 默认 `未维护`，后续可由信息系统更新为 `已维护`。

## 4. When To Use

当满足以下任一条件时，Main Agent 可以调用本 Skill：

- S05 已确认 current 邮件提交 Rooming List / Name List，并已拆分出一个或多个唯一目标 `group_code`。
- S05 的一个目标对象需要派生 TA Recorder linked task。
- current 邮件明确写 `TA Recorder`、`TA RECORDER`、`maintain TA Recorder`、`update TA Recorder`，且同时有唯一目标 `group_code` 和名单 / 分房文件引用。

优先触发方式：

- 由 S05 派生。
- S05 每确认一个目标 `group_code`，派生一张 S08。
- S08 使用 S05 的附件 / 文件 / sheet 绑定结果，不自行重新判断文件是不是名单。

少数直接触发方式：

- current 邮件明确要求维护 TA Recorder。
- 目标 `group_code` 唯一。
- 有可绑定的名单 / 分房附件、Google Drive / 网盘链接、系统已下载 `file_reference`、workbook 或 sheet / range evidence。

## 5. Must Not Use When

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

- 只是普通 Rooming List / Name List 邮件，但 S05 尚未确认目标对象绑定。
- S05 输出 `manual_review`，文件类型、目标对象或附件归属仍不清。
- 只是出现 `TA`、travel agent、旅行社、agent 名称或 Source / Reservation Type 中的 `TA`，但没有 TA Recorder 维护动作。
- 只有 workbook / sheet 名，无法确认它绑定哪个目标 `group_code`。
- 只有 Google Drive / 网盘链接，但文件不可下载、无权限或未确认是名单 / 分房文件。
- current 邮件只是 thank you、FYI、acknowledgement、noted、received、confirmed receipt、转发说明、仅同步信息或无新业务动作。
- TA Recorder 动作只出现在 `body_thread`，不在 `body_current` 或 S05 confirmed linked context。

S08 不得把以下内容当作 `group_code`：

- `IN9-17` 这类入住日期 / sheet 名。
- `总名单`、summary、all guests 等汇总 sheet。
- `WpsReserved_CellImgList` 等系统保留 sheet。
- 任何仅从 sheet 名、文件名或附件名猜出的不可靠 code。

## 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`
- `body_current` 中 TA Recorder 或 Rooming List / Name List 相关原文片段
- S05 parent task context
- `source_rooming_list_task_id`，如有
- `parent_source_event_index`
- `linked_task_group_id`
- 目标 `group_code`
- 目标对象绑定证据
- Rooming List / Name List 文件引用
- 附件、Google Drive / 网盘链接、系统已下载 `file_reference`
- workbook 名、sheet 名、sheet / range 绑定证据
- shared evidence sheets，例如 `总名单`
- ignored system sheets，例如 `WpsReserved_CellImgList`
- file read / download / permission status
- routing context

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

## 8. Input Requirements Summary

本 Skill 输入应包含：

- S05 派生上下文，或 current 邮件中的 TA Recorder 维护请求摘要。
- 唯一目标 `group_code`。
- 名单 / 分房附件或文件引用。
- 文件与目标对象的绑定证据。
- 如果来自 workbook，提供对应 sheet / range evidence。
- 如果同一 workbook 对应多个目标，提供 S05 已拆分后的目标对象列表和当前 S08 目标。
- routing context，如有。

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

### 8.1 Bundled / Shared References

当 S08 来自 S05 派生时，Main Agent 应优先使用 S05 已完成的文件类型判断、目标对象绑定和拆分结果。

如需回看 QBD / LianTai Excel / table workflow 证据，可读取：

- `../references/qbd_liantai_email_table_rules.md`

使用该 reference 的目的：

- 区分名单文件和 booking update 表。
- 识别 current / history。
- 保留 workbook / sheet / row evidence。
- 避免把 sheet 名、文件名或历史 code 误判为当前 `group_code`。

S08 不读取房型映射、Rate Code 或价格 reference。

## 9. Decision Rules

### 9.1 S05 Linked Task Rule

S08 默认由 S05 派生。

如果 S05 输出 `normal_task`，且已确认一个或多个目标 `group_code`，则每个目标 `group_code` 应派生一张 S08 TA Recorder linked task。

S08 linked task 必须保留父任务关系：

- `source_rooming_list_task_id`
- `parent_source_event_index`
- `linked_task_group_id`
- `depends_on_task_type: Rooming List`
- `blocked_until_parent_completed: true`
- `execution_order`

执行顺序：

- 先处理 S05 Rooming List / Name List。
- 再处理 S08 TA Recorder。

### 9.2 Target Split Rule

S08 不是：

- 一封邮件一张卡。
- 一个 workbook 一张卡。
- 一个 sheet 一张卡。

S08 是：

- 一个目标 `group_code` 一张卡。

如果一个 workbook 包含多个目标，例如：

- `HD260510A-1`
- `HD260510A-2`
- `HD260510A-3`
- `HD260510A-4`

则应生成 4 张 S08 linked task。每张只绑定一个 `group_code`，但可以共享同一个 workbook / file_reference。

不得用数组型 `case_keys.group_code` 把多个 TA Recorder 合并为一张任务卡。

### 9.3 Sheet Rule

S08 必须跟随 S05 的目标对象绑定结果，不得自己从 sheet 名猜 `group_code`。

规则：

- `HD260510A-1`、`HD260510A-2` 等 sheet 名可以作为绑定证据。
- `IN9-17` 这类 sheet 名不是 `group_code`，不能生成 `group_code = IN9-17`。
- `总名单` 默认是 shared evidence，不单独生成 S08。
- `WpsReserved_CellImgList` 等系统保留 sheet 不生成 S08。
- 如果 sheet 名与正文 group code / S05 target binding 冲突，输出 `manual_review` 或等待 S05 先人工确认。

### 9.4 Attachment / File Source Rule

S08 的附件来源不限于邮件普通附件。

可接受来源：

- email attachment
- inline file
- Google Drive / 网盘链接
- 系统下载后的 `file_reference`
- workbook
- workbook 中对应 sheet / range 的绑定证据

S08 必须绑定名单 / 分房文件引用。没有文件引用时，不得输出 `normal_task`。

### 9.5 Direct Current TA Recorder Rule

如果 current 邮件直接要求维护 TA Recorder，可以直接输出 S08，但必须同时满足：

- TA Recorder 维护动作来自 `body_current`。
- 目标 `group_code` 唯一。
- 有名单 / 分房附件或文件引用。
- 文件与目标对象绑定清楚。

如果只是出现 `TA` 字样、travel agent、Source TA、Reservation Type TA，不得触发 S08。

### 9.6 S05 Manual Review / Locked Downstream Rule

如果 S05 本身是 `manual_review`，S08 不应直接输出可执行 `normal_task`。

可处理方式：

- 作为 `locked_downstream_actions` / `derived_task_candidates` 保留在 S05 payload。
- 或输出 S08 `manual_review`，说明父任务未确认、目标对象或附件绑定不清。

只有 S05 人工确认文件类型、目标对象和附件绑定后，S08 才能进入可执行状态。

## 10. Normal Task Output

仅当可以安全创建 TA Recorder 任务卡候选时，输出：

```json
{
  "result_type": "normal_task",
  "task_type": "TA Recorder",
  "current_or_history": "current"
}
```

必须同时满足：

- 来自 S05 confirmed linked context，或 current 邮件明确要求 TA Recorder。
- 目标 `group_code` 唯一。
- 名单 / 分房附件或文件引用明确。
- 文件与目标 `group_code` 的绑定关系清楚。
- 如果一个 workbook 对应多个 group，已经按 S05 target binding 拆成多个 S08。
- 如果是 linked task，父任务和执行顺序清楚。

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

- `source_message_id` 必须原样带回。
- `source_event_index` 必须原样带回。
- `case_keys.group_code` 必须只填当前 S08 任务绑定的一个 `group_code`。
- `visible_reason` 应说明为什么这是 TA Recorder 任务。
- `relevant_message_excerpt` 来自 S05 linked context 或 `body_current`。
- `attachments` / `file_references` 应保留名单 / 分房文件引用。
- `context_used` 应记录 S05 派生上下文、routing context 和使用的 reference。
- `extracted_fields.group_code` 必须填入。
- `extracted_fields.attachment` 或 `file_reference` 必须填入。
- `extracted_fields.ta_recorder_status` 默认 `未维护`。

任务卡前端展示字段建议：

```json
{
  "group_code": "",
  "attachment": "",
  "ta_recorder_status": "未维护"
}
```

后台 payload 可保留：

- `source_rooming_list_task_id`
- `parent_source_event_index`
- `linked_task_group_id`
- `depends_on_task_type`
- `blocked_until_parent_completed`
- `execution_order`
- `file_reference`
- `workbook_name`
- `sheet_name`
- `sheet_names`
- `shared_evidence_sheets`
- `ignored_system_sheets`
- `attachment_binding`
- `target_key_source`

## 11. Manual Review Output

当 current 邮件或 S05 派生上下文疑似需要 TA Recorder，但不能安全创建 `normal_task` 时，输出：

```json
{
  "result_type": "manual_review",
  "task_type": "TA Recorder",
  "current_or_history": "current"
}
```

典型 `manual_review` 条件：

- S05 确认是名单，但无法识别唯一目标 `group_code`。
- 一个附件 / workbook 可能对应多个 group，但 S05 未能拆分绑定。
- 只有 sheet 名候选，不能确认 `group_code`。
- 文件不可读、无权限、下载失败，导致无法确认附件。
- current 邮件明确提 TA Recorder，但没有名单 / 分房附件或文件引用。
- current 邮件明确提 TA Recorder，但目标对象不清。
- S05 本身是 `manual_review`，S08 需要等待 S05 人工确认。
- sheet 名、正文 group code、S05 target binding 或 routing context 互相冲突。

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

建议结构：

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

典型 `reason_code`：

- `target_group_code_unclear`
- `attachment_binding_unclear`
- `multiple_group_binding_unclear`
- `sheet_name_not_group_code`
- `file_unreadable_or_no_permission`
- `parent_rooming_list_not_confirmed`
- `direct_ta_recorder_context_insufficient`

注意：

- `manual_review` 不能写成空泛的“人工看一下”。
- 能确定的 `group_code` 候选、附件引用、sheet 名、workbook 名、S05 父任务信息应尽量保留。
- 不能可靠确认的字段不要猜，填 `null`、空字符串或空数组。

## 12. Tool Invocation Placeholder

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

- tool_status: `TBD`
- suggested_tool_name: `create_task_card` / `TBD`
- tool_purpose: 根据信息系统统一任务卡创建接口，创建 TA Recorder 任务卡或人工复核 / 人工处理任务卡。
- tool_owner: 信息系统。
- caller: AI Runtime / Main Agent / Skill Orchestrator，最终由系统架构确认。
- invocation_timing: Skill 输出 `ai_task_result` 并通过 Unified Output Contract 校验后。
- payload_rule: Skill 能识别出的 `group_code`、附件 / 文件引用、父任务关系和后台证据照实填入；任务卡前端展示 `group_code`、`attachment`、`ta_recorder_status`。
- 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` / `file_references`
  - `context_used`
  - `extracted_fields`
  - `manual_review`
  - `idempotency_key` / `TBD`
- expected_tool_result: `TBD`

Tool 设计原则：

- S08 只调用一个统一任务卡创建 Tool：`create_task_card`。
- 真实 TA Recorder 写入是用户确认后的信息系统后续执行动作，不是本 Skill 直接执行动作。
- 如果 S08 是 S05 linked task，信息系统必须等 S05 完成并确认目标对象后再执行。
- AI 不直接写数据库，只调用信息系统暴露的受控 Tool / API。
- 信息系统负责真实任务卡 ID、人工复核任务卡 ID、幂等、并发、状态机、最终落库和执行前硬校验。
- 如果 Tool 尚不可用，本 Skill 仍应输出合格的 `ai_task_result`；不得编造 Tool 调用结果。

## 13. Conflict Or Fallback Rule

- 如果 S05 已按多个目标 `group_code` 拆分，S08 必须按相同目标拆成多张 linked task。
- 如果一个 workbook / file_reference 被多个目标共享，S08 可以共享附件引用，但每个 `ai_task_result` 只能绑定一个 `group_code`。
- 如果 sheet 名像 group code 但 S05 未确认目标绑定，不得硬走 S08 `normal_task`。
- 如果 current 邮件同时包含 Rooming List 和直接 TA Recorder 维护要求，应优先让 S05 确认名单与目标对象，再派生 S08。
- 如果当前 / history 边界不清且无法确认 TA Recorder 动作来自 current 或 S05 linked context，交由 `exception_detection_skill` 或 structured `manual_review`。
- 如果无法判断是消息通知还是可执行 TA Recorder 维护任务，交由 S99 structured `manual_review`，不得硬走 S08。

## 14. Must Not

- 不从 `body_thread` 生成 `normal_task`。
- 不因出现 `TA` 字符串触发 S08。
- 不因出现 travel agent / 旅行社名称触发 S08。
- 不把 Source / Reservation Type 的 `TA` 当作 TA Recorder。
- 不直接判断文件是不是 Rooming List；该判断归 S05。
- 不直接导入名单到 Opera。
- 不直接创建 PM room。
- 不直接维护 Routing Instruction。
- 不直接写 TA Recorder。
- 不直接写 Note。
- 不直接更新 Block Status。
- 不猜 Rate Code。
- 不猜 Breakfast location。
- 不从 sheet 名猜 `group_code`。
- 不把 `IN9-17`、`总名单`、`WpsReserved_CellImgList` 生成 TA Recorder 任务。
- 不把多个 `group_code` 合并进一张 TA Recorder 任务卡。
- 不输出 `informational_message`。
- 不输出 `no_action`。
- 不输出 `exception_task`。
- 不编造 Tool endpoint、鉴权、返回结构或调用结果。
- 不把 `manual_review` 输出成空泛的“人工看一下”。
