一句话内核:每条数据只有一个拥有者;拥有者独占写,其他人只读;写入口唯一;所有权转移必须在线且原子;数据活在作用域内,作用域结束即冻结;服务器是这套规则的强制者。
一、核心思想
整个平台以 Rust 的所有权 / 借用 / 生命周期为唯一内核:
text
任何时刻,任何一份数据,有且仅有一个拥有者(Owner)。
拥有者 = 唯一可写者 = 唯一责任人。
其他人对这份数据,只能"借用"(读)或"申请"(提案)。
所有模块、所有规则,都是这一条的直接推论。
二、概念映射
| Rust 概念 | 平台对应 | 作用 |
|---|---|---|
所有权 T |
数据的唯一负责人(人/角色/节点) | 定归属 |
可变借用 &mut T |
拥有者本人在写 | 独占写 |
共享借用 &T |
其他人只读 | 共享读 |
移动 move |
所有权移交(交接、审批流转) | 换归属 |
生命周期 'a |
数据存活的作用域 | 定生死 |
三、作用域层级(生命周期落地)
text
'static 企业层 组织、人员、权限、行政规则 长期,滚动维护
'project 项目层 聊天、流程、计划 明确起止,到期归档
'scope 计划层 周 / 月 / 年滚动计划 项目内滚动,定期更新
规则:内层数据不能比外层作用域活得久。
- 项目归档 → 项目内一切转只读
- 企业清理 → 按行政规则处理
四、四种数据形态(按可变性分)
| 形态 | Rust 类比 | 平台实例 | 写规则 |
|---|---|---|---|
| 不可变追加 | Vec::push |
聊天消息 | 发出即不可改,撤回=追加 |
| 独占可变 | &mut T |
通讯录、当前计划 | 单一拥有者写 |
| 版本追加 | Vec<Version> |
计划滚动版本 | 每次更新追加,不覆盖 |
| 只读归档 | &T |
归档项目、历史流程 | 冻结,不可写 |
五、三种访问方式
text
拥有者 → &mut T 直接写
协作者 → &T 只读
无权限者 → 无引用 看不见
提建议者 → 工作流消息 不进数据层,人工转达
关键 :提建议不产生数据层对象,只在流程层传递。数据层永远只有拥有者一个写入口。
六、所有权转移(move)
text
移交 = 在线 + 锁定旧拥有者 + 快照 + 授予新拥有者 + 解锁
- 必须是在线事务,不能离线移交
- 锁定期间禁止任何写入(包括旧拥有者)
- 移交记录本身是正式记录(所有权接替链)
- 移交后旧拥有者 token 失效,任何残留本地编辑无法上行
七、服务器 = 编译器
Rust 的保证来自编译器;平台没有编译器,所以服务器端规则引擎就是 borrow checker。
| Rust 编译期 | 平台服务器端 |
|---|---|
| 借用检查 | 权限校验 |
| 生命周期检查 | 作用域校验(项目是否归档) |
| 移动后失效 | 移交后旧拥有者 token 失效 |
& / &mut 互斥 |
写锁 + 读版本 |
服务器必须"拒绝"违规请求,而不是"提示"或"警告"。
八、三模块 = 一个内核,三种形态
text
拥有者模式(唯一内核)
│
┌──────────┼──────────┐
│ │ │
聊天 流程 计划
(追加日志) (状态机) (版本列表)
│ │ │
└──────────┼──────────┘
│
服务器 = 编译器
(强制所有权、借用、生命周期)
三模块差异只在于 T 的形态,所有权规则完全一致。
| 模块 | Rust 类比 | 特征 |
|---|---|---|
| 聊天 | append-only log | 发出即不可变,可"提升"为正式记录 |
| 流程 | move chain(状态机) | 单据在节点间独占转移 |
| 计划 | 版本列表 + 当前视图 | 定期滚动,追加版本,不覆盖历史 |
九、模块联动关系
text
计划(驱动)──触发──> 流程(必要 / 突发过程)──产生沟通──> 聊天(补充)
↑ │
└──────────────── 可提升为计划 / 流程 / 附件 ────────────────┘
- 计划是主驱动:定义做什么、什么时候做
- 流程是被触发的:计划节点触发(必要)或突发触发(变更/事故)
- 聊天是补充:非正式协调,默认不长期保存
- 聊天可提升:有价值的消息可"晋升"到正式层,保留证据链
十、计划滚动更新
text
年计划 ──细化──> 月计划 ──细化──> 周计划
↑ │
└────── 根据实际执行反馈修正 ───────┘
- 粗粒度稳定,细粒度滚动
- 越近越细,越远越粗
- 建议追加版本而非原地覆盖(EPC 场景计划变更有追溯价值)
- 当前视图
&T只读,版本历史 append-only
十一、生命周期三态
| 状态 | 含义 | 可写 | 可查 |
|---|---|---|---|
| 进行中 | 项目活跃 | ✅ | ✅ |
| 归档 | 项目结束,冻结 | ❌ | ✅ |
| 清理 | 按策略删除 | ❌ | 仅元数据 |
- 归档 ≠ 删除,中间态必须有
- 清理需二次确认 + 高权限
- 企业层行政规则用"固定时间滚动 + 人工清理"
十二、设计宪法(五条铁律)
- 唯一拥有者:每条数据只有一个拥有者,唯一可写者
- 借用分离 :其他人只读(
&T),无权限者不可见 - 写入口唯一:建议走流程,不产生数据层对象
- 移交原子化:在线 + 锁定 + 快照 + 授权 + 解锁,一步不省
- 作用域约束:数据不能比作用域活得久,归档即冻结
十三、Rust 伪代码内核
rust
// 数据 = 有拥有者的值
struct Owned<T> {
owner: OwnerId,
value: T,
frozen: bool,
}
impl<T> Owned<T> {
fn write(&mut self, actor: ActorId) -> Result<&mut T> {
if actor != self.owner { return Err(NotOwner); }
if self.frozen { return Err(Archived); }
Ok(&mut self.value)
}
fn read(&self, actor: ActorId) -> Result<&T> {
Ok(&self.value)
}
fn transfer(&mut self, new_owner: OwnerId) -> Result<()> {
// 在线 + 原子 + 记录接替链
self.owner = new_owner;
Ok(())
}
}
平台所有模块都是 Owned<T> 的不同 T。
十四、待定项(下一步)
- 三种形态的
T具体结构(消息 / 流程单 / 计划条目) - "计划如何触发流程"的接口定义(联动核心)
- 所有权接替链的存储格式与查询接口
- 聊天"提升"动作的留痕规范
- 企业层行政规则的具体清单(滚动周期、清理策略)
附:核心类比速查
| 平台对象 | Rust 类比 |
|---|---|
| 单位 / 企业 | 'static 模块 |
| 项目 | 'project 作用域内的结构体实例 |
| 计划 | 主状态字段 + 版本列表 |
| 流程 | 状态机,单据在节点间 move |
| 聊天 | append-only Vec<Message>,栈上临时值可提升到堆 |
| 拥有者 | &mut 持有者 |
| 协作者 | & 借用者 |
| 移交 | Option::take / mem::replace |
| 归档 | 转 &T |
| 清理 | drop |
| 服务器 | borrow checker |