# 法规规则包加载Skill 设计

## 1. Skill 定位

`法规规则包加载Skill` 负责加载、校验和展开本地结构化法规规则包，是完整性检查的规则来源入口。

英文实现标识建议使用 `RegulationRulePackageLoadSkill`。

本 Skill 不读取用户资料，不做匹配判断，只处理法规规则本身。

## 2. 输入

```python
@dataclass
class RegulationRulePackageLoadInput:
    rule_package_id: str
    workflow_type: str
    chapter_scope: list[str] = field(default_factory=list)
```

## 3. 输出

```python
@dataclass
class RegulationRulePackageLoadOutput:
    rule_package_id: str
    version: str
    workflow_type: str
    source_documents: list[dict]
    requirements: list[dict]
    risk_rules: dict
    validation_warnings: list[dict]
```

## 4. 规则包来源

V1 默认来源：

```text
docs/原始材料/关于公布体外诊断试剂注册申报资料要求和批准证明文件格式的公告/
```

结构化规则建议维护在：

```text
configs/registration/rules/
  nmpa_ivd_registration_v1.yaml
  chapter_catalog.yaml
  risk_mapping.yaml
```

## 5. 核心方法

### 5.1 `run(input) -> RegulationRulePackageLoadOutput`

主入口方法。

执行顺序：

1. 根据 `rule_package_id` 定位规则文件。
2. 读取 YAML。
3. 校验规则包元数据。
4. 校验规则包是否支持当前 `workflow_type`。
5. 展开章节范围。
6. 返回要求项和风险规则。

### 5.2 `load_yaml_rule_file(path) -> dict`

读取 YAML 文件。

### 5.3 `validate_rule_package(raw_rules) -> RulePackageValidationResult`

校验：

1. 是否有规则包 ID。
2. 是否有版本。
3. 是否有适用流程。
4. 是否有章节。
5. 每个必交项是否有风险等级。
6. 每个要求项是否有稳定 `requirement_id`。

### 5.4 `expand_requirements(rule_package, chapter_scope) -> list[RequirementItem]`

展开要求项。

如果 `chapter_scope = ["CH1"]`，只返回第 1 章要求项。

### 5.5 `load_risk_rules(rule_package) -> dict`

读取缺失、错放、待复核对应的风险映射规则。

## 6. 技术实现

使用技术：

1. `PyYAML`
2. Pydantic schema
3. Django cache
4. 文件修改时间检测

## 7. 异常处理

| 异常 | 处理 |
|---|---|
| 规则文件不存在 | 返回 `rule_package_not_found` |
| YAML 格式错误 | 返回 `rule_package_invalid` |
| 流程不匹配 | 返回 `workflow_not_supported` |
| 缺少风险配置 | 规则包校验失败 |
| 章节范围为空 | 使用默认范围 |

## 8. 测试要点

1. 成功加载规则包。
2. 规则包版本正确。
3. `CH1` 范围展开正确。
4. 不支持流程被拒绝。
5. 缺少必填字段时报校验错误。

