> ## 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.

# 执行

> 最终执行计划、FSP 下发、状态提交和执行证据

## 输入：最终执行计划

最终执行计划必须采用以下结构。示例展示两份样品加液并进行光谱表征的最小闭环：

```json theme={null}
{
  "实验名称": "A01 CoFeNi 高熵氧化物：样品准备与 UV-Vis 表征最小闭环",
  "plan_name": "A01 CoFeNi 高熵氧化物：样品准备与 UV-Vis 表征最小闭环",
  "实验流程": [
    "1. 开盖 (离心瓶 2个)",
    "2. 加液_物料绑定 (离心瓶 2个)",
    "3. 加液_物料绑定 (离心瓶 2个)",
    "4. 关盖 (离心瓶 2个)",
    "5. 开盖 (离心瓶 2个)",
    "6. 紫外光谱离心绘图 (离心瓶 2个)"
  ],
  "涉及设备": [
    "移液平台_1ml_V2 (关盖, 加液_物料绑定, 开盖)",
    "紫外可见光谱仪_V1 (紫外光谱离心绘图)"
  ],
  "path": {
    "开始节点id": ["移液平台_1ml_V20节点id"],
    "移液平台_1ml_V20节点id": ["紫外可见光谱仪_V10节点id"],
    "紫外可见光谱仪_V10节点id": ["结束节点id"]
  },
  "steps": [
    {
      "step_number": 1,
      "id": "2002186824385539",
      "device_name": "移液平台_1ml_V2",
      "command_id": "open_caps",
      "request_class": "invoke",
      "operation": "开盖",
      "parameters": {
        "container_type": "离心瓶",
        "container_count": 2,
        "container_ids": [1, 2]
      }
    },
    {
      "step_number": 2,
      "id": "2002186824385539",
      "device_name": "移液平台_1ml_V2",
      "command_id": "add_liquid_with_material",
      "request_class": "invoke",
      "operation": "加液_物料绑定",
      "parameters": {
        "container_type": "离心瓶",
        "container_count": 2,
        "container_ids": [1],
        "dispensing_plan": [
          {"原液瓶编号": 1, "加液体积": 0.5}
        ]
      }
    },
    {
      "step_number": 3,
      "id": "2002186824385539",
      "device_name": "移液平台_1ml_V2",
      "command_id": "add_liquid_with_material",
      "request_class": "invoke",
      "operation": "加液_物料绑定",
      "parameters": {
        "container_type": "离心瓶",
        "container_count": 2,
        "container_ids": [2],
        "dispensing_plan": [
          {"原液瓶编号": 2, "加液体积": 0.5}
        ]
      }
    },
    {
      "step_number": 4,
      "id": "2002186824385539",
      "device_name": "移液平台_1ml_V2",
      "command_id": "close_caps",
      "request_class": "invoke",
      "operation": "关盖",
      "parameters": {
        "container_type": "离心瓶",
        "container_count": 2,
        "container_ids": [1, 2]
      }
    },
    {
      "step_number": 5,
      "id": "2002186824385539",
      "device_name": "移液平台_1ml_V2",
      "command_id": "open_caps",
      "request_class": "invoke",
      "operation": "开盖",
      "parameters": {
        "container_type": "离心瓶",
        "container_count": 2,
        "container_ids": [1, 2]
      }
    },
    {
      "step_number": 6,
      "id": "1664783667397632",
      "device_name": "紫外可见光谱仪_V1",
      "command_id": "measure_uv_vis",
      "request_class": "invoke",
      "operation": "紫外光谱离心绘图",
      "parameters": {
        "container_type": "离心瓶",
        "container_count": 2,
        "container_ids": [1, 2],
        "start_wavelength": 200,
        "end_wavelength": 800
      }
    }
  ],
  "unknown_steps": null
}
```

`steps` 使用[绑定](/specification/methods/binding)中的结构。

### 执行计划字段

| 字段                      | 作用                  |
| ----------------------- | ------------------- |
| `实验名称`、`plan_name`      | 提供面向人员与程序的计划名称      |
| `实验流程[]`                | 提供可读的步骤摘要，不作为设备调用依据 |
| `涉及设备[]`                | 汇总计划绑定的设备及操作        |
| `path`                  | 表达设备之间的有向依赖关系       |
| `steps[]`               | 保存可下发步骤的设备、操作和参数    |
| `steps[].step_number`   | 确定步骤顺序              |
| `steps[].id`            | 绑定 FSP `device_id`  |
| `steps[].device_name`   | 提供设备显示名称            |
| `steps[].command_id`    | 指定完整技能定义中的稳定技能标识    |
| `steps[].request_class` | 指定请求分类并决定下发入口与安全规则  |
| `steps[].operation`     | 保存已绑定的操作名称          |
| `steps[].parameters`    | 保存通过校验的操作实参         |
| `unknown_steps`         | 保存无法绑定的步骤；非空时禁止执行   |

## 下发方式

执行服务按 `steps[].request_class` 选择 FSP 分类入口：

```text theme={null}
steps[].id         → device_id
steps[].command_id → command_id
steps[].request_class → read  → fsp/read
                      write → fsp/write
                      invoke → fsp/invoke
steps[].parameters → 通过参数绑定解析为 arguments
```

执行服务不得根据操作名称猜测请求分类。设备技能是否同步或异步，由 FSP 完整技能定义和实际返回决定。

## 仿真输出

方法在进入物理执行前必须生成仿真报告：

```json theme={null}
{
  "simulation_status": "passed",
  "verified_by": "run_simulation.py",
  "command_exit_code": 0,
  "operation_count": 6,
  "checks": [
    "调用仅使用已准入设备函数",
    "开盖、加液、关盖和检测构成研究对象从 St 到 St+1 的状态演化",
    "强制条件失败时不提交研究对象的模拟状态"
  ]
}
```

仿真通过只证明方案在当前函数和状态模型中可运行，不证明物理设备已经执行。

## 状态提交

```text theme={null}
仿真或执行成功且完成条件满足
  → 保存结果和诊断
  → 提交实际状态变化

强制校验失败、仿真阻断或设备结果未知
  → 不提交预期成功状态
  → 保留原状态或重新读取实际状态
  → 返回诊断并重新生成或修订方法
```

## 失败回退与再验证

执行服务不能把计划中的预期状态当作真实结果。`read` 完成后保存观测时间和数据新鲜度；`write` 完成后回读或取得等价确认；`invoke` 完成后按技能的系统维度验证实际结果。只有验证通过后才能决定是否提交研究对象状态。

1. 设备成功且返回值满足操作完成条件：保存结果、诊断和证据引用，提交实际状态变化；
2. 设备失败、取消或返回未知结果：不提交预期状态，保留已确认状态并读取对象和系统最新值；
3. 将失败步骤、实际状态、能力修订号和诊断反馈给方法生成与验证阶段；
4. 只有重新生成的方法通过完整验证并重新绑定后，才允许形成新的执行任务。

这使“生成—验证—执行”形成可追溯闭环：重新执行前必须以设备实际状态为新的输入，而不是沿用失败前的状态假设。

## 真实执行证据边界

真实执行至少应当返回：

* 实际调用的操作和参数；
* 开始和完成状态；
* 实际对象和系统状态；
* 结果或诊断；
* 可以关联到研究对象来源记录的执行引用。

### 执行证据输出示例

```json theme={null}
{
  "execution_id": "exec-a01-001",
  "plan_name": "A01 CoFeNi 高熵氧化物：样品准备与 UV-Vis 表征最小闭环",
  "status": "succeeded",
  "started_at": "2026-09-01T12:00:00Z",
  "completed_at": "2026-09-01T12:08:00Z",
  "step_results": [
    {
      "step_number": 1,
      "device_id": "2002186824385539",
      "command_id": "open_caps",
      "status": "succeeded",
      "task_id": null,
      "result": {"opened_bottles": [1, 2], "opened_bottles_count": 2},
      "diagnostics": []
    }
  ],
  "state_committed": true,
  "evidence_refs": ["evidence://exec-a01-001/step-1"]
}
```

| 输出字段                        | 作用                     |
| --------------------------- | ---------------------- |
| `execution_id`              | 唯一标识一次计划执行             |
| `status`                    | 汇总执行是否成功、失败、取消或结果未知    |
| `started_at`、`completed_at` | 记录真实运行时间边界             |
| `step_results[]`            | 保存每步实际设备、指令、任务、结果和诊断   |
| `state_committed`           | 表示是否已经依据设备确认结果提交研究对象状态 |
| `evidence_refs[]`           | 把执行结果关联到可审计证据位置        |

执行服务必须使用[异步任务](/specification/fsp/async-tasks)定义的任务状态和本页定义的证据记录，不得以执行计划中的预期状态代替设备确认结果。
