适用范围
约束所有功能的状态轴设计、审计记录与对外投影。
不约束:具体状态机取值(由各功能定义);界面样式;内部日志格式。
规范条款
状态轴分离
- 每个功能必须声明它拥有几条状态轴,并必须为每条轴给出:取值集合、终态集合、迁移规则、owner。
- 业务状态与执行状态(或其它派生轴)必须彼此独立:必须不因一条轴的迁移而自动迁移另一条轴。
- 跨轴联动必须是显式动作的结果,且必须在文档中写明"由谁、在什么条件下"触发。
- 终态必须不可逆;必须不存在"终态回到非终态"的迁移。
- 状态迁移必须是原子的:必须不出现中间态对外可见。
- 需要审计的对象必须记录:操作者、时间、动作、作用域、依据的期望修订、结果。
- 审计记录必须只追加;必须不可改写、不可删除(必须遵循数据与持久化的只追加要求)。
- 审计必须记录判定结果,而不只是"发生了什么":被拒绝的操作必须同样留下记录(谁在什么时候尝试了什么、为何被拒)。
- 审计必须能回答"是谁做的":人类操作归属到人类身份,服务操作归属到服务身份;必须不含糊。
- 审计时间必须由服务端写入。
公开投影
- 公开投影是对外可见的派生视图;必须只包含经审核可外露的字段。
- 投影必须不包含下列任何内容:
| 禁止进入投影 | 说明 |
|---|
| 凭据与密钥 | 值、路径、引用名 |
| 内部标识符 | 仅用于内部关联的标识 |
| 宿主与进程信息 | 主机、进程、服务标签、路径、命令、参数 |
| 执行内部结构 | 会话、执行段、句柄等内部对象 |
| 原始错误与堆栈 | 只允许稳定错误标识 |
| 其它作用域的存在性 | 含对象数量、名称、失败差异 |
- 投影必须显式声明谁能看什么;同一对象对不同角色的可见字段差异必须写明。
- 读取不可确认时必须呈现"未知";必须不呈现猜测值或沿用旧缓存。
- 投影的数据必须来自权威事实源;必须不由投影自身维护独立真相。
观测义务
- 每个功能必须声明:哪些状态必须能从外部观测到,以及由谁消费。
- 需要外部监督的过程(长时执行、跨系统推进)必须提供服务端可观测的进展信号;必须不只提供"已接受"这类过程信号作为成功依据。
- 成功判定必须基于结果信号(例如有效租约或终态结果);必须不基于过程信号(进程存在、本地健康检查通过、服务管理器返回成功)。
违反时的失败语义
| 违反情形 | 必须的行为 |
|---|
| 未声明状态轴与终态 | 视为规格违反;评审阶段必须拦截 |
| 跨轴自动联动 | 必须改为显式动作 |
| 审计可改写 | 必须改为只追加 |
| 被拒操作无审计 | 必须补记录 |
| 投影含禁止项 | 必须视为安全缺陷处理 |
| 以过程信号判定成功 | 必须改为结果信号 |
校验方式
| 校验对象 | 判据 | 失败表现 |
|---|
| 状态轴声明 | 每条轴必须有取值集合、终态集合与 owner | 缺失即失败 |
| 终态不可逆 | 构造终态回迁必须被拒绝 | 被接受即失败 |
| 审计只追加 | 对审计记录发起更新或删除必须被拒绝 | 被接受即失败 |
| 拒绝留痕 | 被拒绝的操作必须能在审计中查到 | 查不到即失败 |
| 投影字段白名单 | 投影响应不得含禁止项清单中的任一项 | 出现即失败 |
| 角色可见性 | 不同角色的可见字段差异必须与声明一致 | 不一致即失败 |
| 读失败语义 | 读取不可确认时必须呈现未知,不得给猜测值 | 给值即失败 |
| 成功判据 | 过程信号不得单独构成成功 | 构成成功即失败 |
相关规格