---
name: metadata-validator
description: 当需要确认候选表、字段、字段归属、字段类型、时间列、分区列和 join key 是否真实存在于工作区元数据中时使用。消费 requirements-analysis 的 requirements_output，产出 validation_result 和 field_mapping；不写 SQL，不调用 MCP。
---

# Metadata Validator（元数据校验）

## 目标

把需求里“想用的表和字段”与真实元数据对齐，防止模型凭感觉编表名、字段名和关联键。下游只能使用本 skill 确认过的字段映射。

## 输入

```yaml
requirements_output:
  status: READY_FOR_METADATA
  candidate_tables: []
  candidate_fields: []
  join_hints: []
metadata_files: "当前工作区中的数据字典、DDL、schema、CSV 表头、Markdown 表格、Excel 等"
```

如果 `requirements_output.status` 不是 `READY_FOR_METADATA`，停止并回到 `requirements-analysis`。

## 元数据查找顺序

1. 递归查看工作区中的元数据文件，不只相信文件名。
2. 优先读取结构化文件：DDL、JSON/YAML schema、CSV/Excel 数据字典、Markdown 表格。
3. 对每张表记录证据：文件路径、表名出现位置、字段名、类型、注释、枚举。
4. 文件名只能作为线索，不能作为存在性证据。

## 校验规则

- 字段在别的表里存在，不等于在目标表里存在。
- 字段名相似不等于字段可替换，必须保留候选并让用户确认。
- 时间字段有多个时必须问清楚事件时间、分区时间和统计归属。
- join key 有多个候选时必须问清楚，并标注基数风险。
- 金额、数量、比率类指标要确认类型、单位和精度。
- 结果表如果要写入，必须校验目标表存在性和字段兼容性；`INSERT OVERWRITE` 还需要用户显式确认。

## 工作顺序

1. 整理所有候选表和候选字段。
2. 从元数据中确认表是否存在。
3. 校验字段是否存在于正确表中，并记录类型和来源。
4. 校验指标字段是否适合聚合，时间字段是否适合时间过滤。
5. 校验 join key 两边都存在，记录类型一致性和基数假设。
6. 校验分区字段、状态枚举、金额单位等会影响结果的细节。
7. 对缺失项给出证据和候选替代，不猜。
8. 如果缺表、缺字段或 join/time 不明确，停止。

## 输出格式

```yaml
validation_result:
  status: VALIDATED | NEED_USER_CONFIRMATION
  metadata_sources:
    - path: "元数据文件路径"
      evidence: "表/字段证据摘要"
  validated_tables:
    - table: "物理表名"
      role: fact | dimension | lookup | target | unknown
      source_file: "元数据来源"
  validated_fields:
    - table: "表名"
      column: "字段名"
      type: "字段类型"
      comment: "字段注释"
      source_file: "元数据来源"
  field_mapping:
    "业务字段名":
      table: "物理表名"
      column: "物理字段名"
      type: "字段类型"
      role: dimension | metric | filter | time | partition | join_key | output
      source_file: "元数据来源"
      confidence: high | medium | low
  joins:
    - left: "表A.字段"
      right: "表B.字段"
      type: inner | left | right | full | unknown
      cardinality: "1:1 | 1:N | N:1 | N:N | unknown"
      confidence: high | medium | low
  time_fields:
    - table: "表名"
      event_time: "事件时间字段"
      partition_time: "分区字段，可为空"
  missing_tables: []
  missing_fields: []
  alternatives:
    "缺失项": ["可能候选"]
  pending_questions:
    - "需要用户确认的问题"
```

## 停止条件

只在所有必需表、字段、join key、时间字段和目标写入字段都确认后输出 `VALIDATED`。否则输出 `NEED_USER_CONFIRMATION`。
