/-! # Run —— AgentRun 状态机 一次 `@Claude` 创建一个 `AgentRun`(ADR-0001),它在生命周期里经历若干状态,并在 **终止时释放项目锁**(ADR-0002)。本模块固定 run 的**状态**与**终止判定**——后者 是 Lock 排他不变式(见 `Spec.System.Lock`)的依赖。 完整的合法转移关系**未在任何 ADR / likec4 散文里定下**,故本模块不臆造转移边, 只刻画状态本身与"何为终止"。 -/ namespace Spec.System /-- AgentRun 的运行状态(状态名 `PINNED` 取自 ADR-0001..0003 + likec4 散文; **集合完整性 `OPEN`**)。 各状态来源:`active`(run 进行中)、`waitingForUser`(likec4 Run Orchestrator "等待用户")、`completed` / `failed` / `timedOut` / `canceled`(ADR-0002 列出的 释放锁时机)。 ⚠ **完整性是 OPEN**:散文从未声明"状态恰好这些"。这里用 `inductive` 是为了能 谈终止判定与不变式,**不等于**封闭授权——若实现侧发现还需要别的状态(如排队中 的 pending),那是一个待 surface 的分歧点,**不得**默认本枚举已穷尽。这与 element-kind 那种**明示开放**的宇宙性质不同:那里"开放"是决策,这里"未封闭"是 尚未决策。 -/ inductive RunState where | active | waitingForUser | completed | failed | timedOut | canceled /-- run 处于**终止态**(`PINNED`, ADR-0002)。 ADR-0002 钉死:锁在 run `completes / fails / times out / is canceled` 时释放。 这四个状态即终止态;锁的释放时机由它定义(见 `Spec.System.Lock.LockTable.WellFormed`)。 `active` 与 `waitingForUser` 非终止——后者虽在等待,run 仍占用项目(锁未释放)。 -/ def RunState.Terminal : RunState → Prop | .completed | .failed | .timedOut | .canceled => True | .active | .waitingForUser => False end Spec.System