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

# 动作契约

> 说清一项动作的名称、参数、前置条件、结果和完成证据。

动作契约是 FSP 服务对一项设备动作的稳定定义。它回答“这项动作是什么、输入什么、什么情况算完成”，不包含某台设备的串口地址、厂商命令或连接密码。

## 一份契约要说清什么

| 内容    | 需要说明                             |
| ----- | -------------------------------- |
| 标识和版本 | 动作名称、契约版本和命名范围                   |
| 输入    | 参数类型、必填项、单位、范围、枚举和跨字段限制          |
| 对象条件  | 需要哪些容器或样品，各自承担什么角色，动作前必须是什么状态    |
| 系统条件  | 设备状态、安全限制、资源占用和超时规则              |
| 结果    | 实际参数、对象变化、设备状态和诊断的返回格式           |
| 完成条件  | 哪些可观测结果都满足时才能返回 `succeeded`      |
| 证据    | 使用哪个传感器、设备读数或人工检查，以及时间、单位、误差和有效期 |

## 契约怎样对应到设备

在同一命名范围内，`operation_id` 和 `contract_version` 共同确定动作含义。不同设备使用同名同版契约时，参数含义、单位和完成要求必须一致。

契约对应到具体设备实现时，绑定键至少包含：

```text theme={null}
设备编号 + 动作名称 + 契约版本 → 指定适配器实现
```

找不到目标设备的实现时必须拒绝，不能改用另一台设备的同名动作。设备可以使用比契约更严格的参数范围，但不能扩大范围、改变单位或降低完成要求。

例如，某设备只能确认“命令已收到”，就不能绑定到要求“液体已加入且体积已核验”的契约。

## 版本怎样更新

协议版本、动作契约版本、设备定义版本、对象状态版本和系统状态版本记录不同的变化，不能混用。

字段位置、单位、必填性或“成功”的含义改变时，应使用新契约版本，或提供明确的转换规则。不认识的版本必须拒绝，不能猜测着执行。

流程伪代码见[适配器：动作契约](/docs/specification/fsp/adapter#1-动作契约把动作的意思写清楚)，可运行实现见 [GitCode 示例源码](https://gitcode.com/mimedal/all/blob/main/examples/fsp_three_parts.py)。
