> ## Documentation Index
> Fetch the complete documentation index at: https://automationlaboratoryprotocol.mimedal.cn/llms.txt
> Use this file to discover all available pages before exploring further.

# 验证

> 优化、状态仿真、科学评审和版本阻断

## 验证顺序

```text theme={null}
候选方法
  → 代码安全与规范化检查
  → 函数和参数可计算性检查
  → 容器与样品状态仿真
  → 科学语义评审
  → 通过后转换
```

任一强制检查失败时，不提交研究对象状态，也不生成可供下游执行的最终 JSON。

## 输入

仿真器接收 `.py` 实验方案路径，并加载同一版本的：

* 函数式技能；
* 公共参数类型；
* 仿真器函数；
* 状态模型。

### 输入示例

```json theme={null}
{
  "method_file": "A01_最小闭环实验方案.py",
  "entrypoint": "generate_recipe",
  "capability_snapshot": {
    "2002186824385539": "12",
    "1664783667397632": "5"
  },
  "initial_state": {
    "1": {"container_status": "有盖", "sample_status": "空"},
    "2": {"container_status": "有盖", "sample_status": "空"}
  },
  "required_checks": [
    "registered_function",
    "parameter_constraint",
    "state_transition",
    "version_compatibility"
  ]
}
```

| 输入字段                  | 作用                              |
| --------------------- | ------------------------------- |
| `method_file`         | 指定待验证的代码式方法                     |
| `entrypoint`          | 指定仿真器调用入口，固定为 `generate_recipe` |
| `capability_snapshot` | 防止函数签名、公共类型和方法使用不同版本            |
| `initial_state`       | 提供仿真开始前的容器与样品状态                 |
| `required_checks[]`   | 指定必须全部通过的机器检查                   |

## 验证实现逻辑

验证器在隔离的状态副本上运行候选方法，原始研究对象状态在验证完成前保持不变。实现依次完成：

1. 解析候选方法入口和调用结构，拒绝未准入函数、未知命名空间和不允许的调用形式；
2. 根据冻结版本加载函数签名和公共类型，检查每个实参的类型、单位、范围、枚举及跨参数约束；
3. 依照调用顺序读取前置状态，并在状态副本中模拟每个操作的 `State Changes`；
4. 将硬性条件失败写入 `errors[]`，将建议性问题写入 `warnings[]`；只有 `errors[]` 为空时才提交本次模拟状态；
5. 对通过结构校验的候选方法进行科学语义审查，并输出可转换或阻断的结论。

```text theme={null}
候选方法 + 版本快照 + 初始状态副本
  → 调用白名单检查
  → 参数与约束检查
  → 状态链仿真
  → 科学语义审查
  → 通过 / 带诊断阻断
```

阻断时，验证器必须返回出错步骤、约束或状态条件及修订方向。方法生成器依据诊断重新生成候选方法，再进入完整验证；不得仅修改最终 JSON 绕过验证。

## 仿真通过输出

以下示例展示最小闭环仿真报告：

```json theme={null}
{
  "example_id": "A01-minimal-closed-loop",
  "source_question": "A01 不同 Fe 配位环境对 NiFe 基催化剂碱性 OER 活性演化的影响",
  "scope": "研究对象样品准备与 UV-Vis 表征子流程，不代表完整 A01 实验",
  "simulation_status": "passed",
  "verified_by": "run_simulation.py",
  "command_exit_code": 0,
  "workflow_file": "A01_最小闭环实验方案.py",
  "operation_count": 6,
  "checks": [
    "调用仅使用已准入设备函数",
    "容器总数固定为 2，实际作用对象由 container_ids 指定",
    "开盖、加液、关盖和检测构成研究对象从 St 到 St+1 的状态演化",
    "强制条件失败时不提交研究对象的模拟状态"
  ],
  "limitations": [
    "未连接真实实验室或设备",
    "未验证催化剂制备、OER 测试和真实测量结果",
    "未替代现场安全与设备联锁"
  ]
}
```

`workflow_file` 是兼容字段，仅表示被验证的方法文件路径，不代表存在独立的工作流模块。

### 仿真输出字段

| 字段                  | 作用                            |
| ------------------- | ----------------------------- |
| `example_id`        | 标识本次验证案例                      |
| `source_question`   | 关联产生方法的实验问题                   |
| `scope`             | 限定本次仿真覆盖的实验边界                 |
| `simulation_status` | `passed` 或 `blocked`，决定是否允许转换 |
| `verified_by`       | 记录执行校验的工具                     |
| `command_exit_code` | 保存校验进程退出码                     |
| `workflow_file`     | 保存被验证的方法文件                    |
| `operation_count`   | 记录进入仿真的操作数量                   |
| `checks[]`          | 列出已经通过的机器检查                   |
| `limitations[]`     | 明确仿真不能证明的事项                   |

## 版本不兼容输出

```json theme={null}
{
  "example_id": "A01-full-candidate",
  "workflow_file": "A01_CoFeNi_HEO_实验方案.py",
  "simulation_status": "blocked",
  "stage": "函数库导入",
  "observed_error": "ImportError: 当前函数式技能快照中缺少原始方案导入的 SourceBottle 或 ElectrochemicalTask 类型",
  "meaning": "方案代码与函数式技能、公共数据类型并非同一冻结版本，无法建立可执行调用环境。",
  "state_commit": "未开始仿真，不存在研究对象状态提交。",
  "required_fix": [
    "为方案、函数式技能、公共类型和仿真器固定同一版本快照",
    "重新执行 AST 准入和状态仿真",
    "只有无强制错误的版本才能生成可下游消费的执行 JSON"
  ]
}
```

## 科学语义评审

仿真验证结构、参数和状态链，不能证明科学方案合理。仿真通过后还需要检查：

* 是否覆盖用户核心实验目标；
* 操作顺序是否具有明显科学逻辑错误；
* 参数是否违反已经声明的硬约束；
* 是否遗漏必要处理或表征。

评审结果分为 `block`、`warn` 和 `info`。只有 `block` 阻止转换；`warn` 和 `info` 保留为建议。
