术语与状态
已被取代(2026-10-21):本文的术语表、状态枚举和颜色已被通用模型的词表取代:词表轴生成在
contracts/generated/vocabulary.ts,标签只经labelOf取得,不手写枚举。见通用模型;本文只作记录保留。
术语进 F 的契约,中英一一对应;状态一律枚举,固定词和颜色;列表一律是查询。页面因身份不同只改计数,不改结构。
术语表
| 术语 | 标识 | 含义 | 不再使用 |
|---|---|---|---|
| 记录 | Record | 对象自己拥有、有 id 前缀和版本的条目 | — |
| 资产 | Asset | 可插拔的东西;kind · version · sha256 · declaration · configuration · lifecycle | 包、插件、配置 |
| 审批策略 | Approval policy | 对象级:哪些动作需要独立审批人 | 变更门 |
| 审批请求 | Approval request · pin_ |
实例级:一次待决定的申请,绑定三项 | 待批、单子、待办 |
| 决定 | Decision | 审批请求的结果与记录:approved / declined | 批了、驳了 |
| 绑定三项 | Binding · inputRevisionId / targetIdentity / actionDigest | 请求钉住的三个值,任一变化即失效 | 钉住三样 |
| 独立审批人 | Independent reviewer | 申请人以外、在该范围持有 approve 权限的人 | 另一个人、他人 |
| 审批资格 | Eligibility | 当前身份能否对该请求做决定,及原因 | 你能不能批 |
| 平台核验 | Verification | 平台自己算出的事实:工具一致、SHA、派发前重核 | hub 核过的 |
| 申请内容 | Submission | 申请人提交的动作与参数,原样展示,不验证 | 提交者声明的 |
| 证据 | Evidence · evd_ |
与外界每次交互的原样记录 | 回执、返回 |
| 扩展点 | Extension point | 对象允许插入的接口类型 | 接入 |
| 工作队列 | Work queue | 按当前身份计算的待处理集合 | 待办、等你 |
| 等待原因 | waitingReason | 任务停住的原因,独立字段,不是状态 | 把原因写成状态 |
| 平台约束 | Platform invariant | 平台无条件执行的规则 | hub 强制 |
| 登记簿 | Registry | 对象页:分面 + 计数 + 搜索,不是样本列表 | 列表 |
| 变更集 | Change set | 一次提交的一个或多个资产版本;一次决定,原子生效;引用的资产不重批 | 逐个资产批 |
| 执行链 | Enforcement chain | 运行时平台做的五步:权限 · 绑定 · 核验 · 租约 · 审计。结果只有通过 / 报错 / 未知;没有审批,平台不是审批人 | 运行审批、预授权、异常审批 |
| 运行报错 | Run error · 可证真 | 执行链里脚本能确定的失败,带错误码和事实返回 Circle | 让审批人决定 |
| 结果未知 | Unknown outcome · 如实披露 | 脚本确定不了的结果:披露观察到的一切,不重发;申请人选择核对、标记失败或放弃 | 当成失败或成功 |
| 错误码 | Error code | 可证真失败的固定标识,目录见审批与执行链 | 自由文本的失败原因 |
状态枚举
灰 = 未生效或终态 · 橙 = 等人 · 蓝 = 进行中 · 绿 = 通过 · 红 = 拒绝或异常。
| 字段 | 值 |
|---|---|
task.phase |
received · running · waiting-input · waiting-review · delivered · failed · cancelled |
approval.status |
open · approved · declined · expired · superseded |
asset.lifecycle |
draft · approved · running · retired · declined |
operation.status |
queued · claimed · running · succeeded · failed · unknown · reconciled |
claim.origin |
script · model(候选用 approval.status,不另造词) |
行里永远是「状态 + 等待原因」:waiting-input 加 waitingReason: gateway-configuration;不把「等网关配置」写成状态。
规模下的处理与显示
任务上千、审批上百、证据上万时仍成立:
- 列表即查询:每个列表都是服务端查询 + 分面(范围 · 产品线 · 流程 · 状态 · 负责人 · 年龄)+ 计数 + 游标分页 + 可保存视图。没有「全部」。
- 队列是首页:待我审批 / 待我回应 / 我提交的 / 我负责的 / 异常。默认按年龄排序,显示最久和超 SLA。
- 对象页是登记簿:左栏是分面与计数,不是样本;详情五格不变。
- 聚合层级:租户 → 范围 → 产品线 → 流程 → 任务。概览只显示计数与异常。
- 异常先行:unknown、expired、superseded、failed、worker 离线各成一队,带老化时间。
- 逐条审阅,不批量批准:每个决定绑定各自摘要;队列提供上一条 / 下一条。
- 状态是枚举,原因是字段:筛选只按枚举。
- 身份只改计数:管理员、成员看同一页面,结构不变。
- 审批在变更时,不在运行时:变更集批一次;运行走执行链,可证真的直接报错,不可证真的如实披露。记录里只写「按规则核验」,不写「hub approved」。
列表即查询的契约
每个登记簿的集合读取带 view=page 时返回 {total, items, cursor};不带 view 保留各接口原有形状。契约对所有登记簿一致:
- limit 默认 20、范围 1–100;cursor 是不透明令牌,原样回传续读,不手工拼接。分面只取记录已声明的维度(scopeId、productLineId、flowVersion、status、lifecycle、owner),不从产品名或平台名猜分类;没有该维度的登记簿对该分面返回
INVALID_PAYLOAD,不把空值比较当空页。minAgeMs/maxAgeMs 非负且最小不大于最大;sort 为 updatedAt 或 age,age 按创建时间排。 - 权限、私有边界与分面先过滤,再算总数与分页,权限每页重核。跨身份、或改变了筛选/排序/limit 的游标是
INVALID_PAYLOAD;越权范围是FORBIDDEN_SCOPE。 - owner 的归属逐登记簿固定:任务、变更集、技能是申请人;资产、工具是资产所有者;企业对象是观测登记人;角色、服务客户端是其主体;词表是登记人。范围和租户级记录没有个人 owner 维度,该分面对它们不匹配。状态用各登记簿自己的枚举(任务 phase、资产 lifecycle、技能 status、变更集 status、服务客户端 active/revoked、词表 registered),不另造。
- 时间游标保存数据库完整精度的锚点与稳定 id:锚点之后的更新进下一次查询,同一刻的记录仍有独立位置;总数是锚点下当前可见的匹配数,不承诺跨请求的永久快照。显式回填时间或时钟回拨可能让已交出的行再次出现,客户端按稳定记录 id 合并去重;要严格不重复的扫描,用不可变的创建时间排序,并在扫描后发起新查询补更新。
- 待批审批在页面上把 open 且已到期的投影为 expired,原记录与旧数组的状态不改。
- 没有管理资格的集合查询返回同形空集合,仍校验 limit、游标与分面;详情与管理操作继续要求资格,不因集合可查而授权。
- 分页的诚实规则对连接器与平台一致:nextPage=null 才表示匹配结果的末尾;hasMore 为真时当前页不是全量。coverage.complete=false 时不能说「全范围无命中」,只有游标耗尽且无跳过项才完整。超出上限明确
RESULT_TOO_LARGE,不截断冒充全量。跨页之间源修订变化时重新读取,不混用不同修订的页。列表投影只带精简字段,完整历史与定位不进入列表回复,原件与完整投影照常保留。
hub 要补的字段:task.priority · task.assignee · task.dueAt · task.waitingReason · approval.supersededBy · operation.unknownSince · asset.productLineId,保存视图,变更集,审批策略数据化,执行链错误码与披露格式,通知流。
本文是 circle-hub 的设计规范之一,按 CC BY 4.0 授权:引用、借鉴须署名 Circle Hub 与 qingshanfeihu 并注明原始出处链接。见设计规范索引。