# 选择 Register、Lease 或 CRDT

## When to use

在状态已被确认属于可修复协同状态之后，用本任务选择集合语义。

## Inspect first

- 明确 key、值、更新者、并发形式和冲突后果。
- 找出现有 locator、codec、resolver、租期或 CRDT 类型。
- 阅读[集合选择](/zh-CN/09-choosing-collections.html)。

## Required inputs

取得“当前值”“排他所有权”“并发可合并更新”三类不变量中的实际需求，以及外部资源如何拒绝陈旧 owner。

## Implementation path

1. 当前元数据选择 Register，并定义确定性 resolver。
2. 有期限所有权选择 Lease，并把 fencing token 送到外部资源。
3. 可交换、可结合、幂等合并的本地更新选择 CRDT。
4. 同一状态需要多个互相冲突的不变量时，拆分模型或拒绝 DSM。
5. 为选择和拒绝理由各写一个失败实验。

## Constraints

- Register 的收敛不提供外部事务回滚。
- Lease 需要外部资源执行 fencing；仅持有 Lease 不能阻止旧 owner 写入外部系统。
- CRDT 合并函数需要满足对应代数性质，不能用任意业务更新替代。

## Failure patterns

- 用 Register 表达排他锁。
- 把 Lease 的本地 holder 状态当作全局永久所有权。
- 为不可交换副作用选择 CRDT。

## Validation

运行对应章节的聚焦验证，并加入并发、陈旧 owner 或重复 delta 反例。记录当前证据达到 E1、E2、E3 或 E4 的哪一层。

## Evidence

- [状态与集合合同](/agent/zh-CN/v/0.1.2/reference/state-and-collection-contracts.md)
- [验证范围](/agent/zh-CN/v/0.1.2/reference/validation-scopes.md)
- [DSM 固定源码](https://github.com/xbdotl/dsm/tree/505e7557da94e3f74da84ecf75bc8a9282732e4f)
