Skip to content

meta skeleton walkthrough

ZP edited this page Aug 29, 2026 · 1 revision

← 返回 Wiki 首页 | 元文档 · 骨架走查记录 | 上一篇:实现记录 | 下一篇:DSH 装载验证 →


P0-a 最小可运行骨架走查记录

本文件由 packages/chat/kernel/src/skeleton.host.spec.ts 在测试运行时自动生成, 记录 P0-a 承担的 9 个骨架步骤的实际执行结果。不是手写的。

生成时间:2026-08-29T18:01:23.875Z

本文件是提交进仓库的快照。 权威来源是测试本身 —— 运行 corepack yarn vitest run packages/chat/kernel 会在 build/ 下重新生成。 若两者不一致,以测试的实际输出为准并更新本文件。

第 1 步 · 一次性注册邀请码

  • 管理员签发 2 个邀请码,甲乙各消费 1 个
  • 重复消费同一个码被拒绝,返回 NOT_FOUND_OR_FORBIDDEN
  • 被拒绝的尝试同样写入审计(第 14 步要求)

第 3 步 · 组织、工作区、项目与成员邀请

  • 甲创建组织 Acme → 工作区 研发 → 项目 dsh-chat
  • 乙以 developer 角色被邀请进项目,初始状态 invited
  • invited 状态下授权判定拒绝发言,接受邀请转 active 后通过

第 5 步 · 工作项分派与持久化通知

  • 工作项 wi-1 分派给乙,状态 assigned
  • 签收状态独立为 offered —— 分派只是「提出」,不代表乙已知晓或同意
  • 乙的收件箱有 1 条未读通知,与领域写入同事务落库

第 6 步 · 联系人请求与接受

  • 未建立联系人时私聊准入判定拒绝
  • 仅有 pending 请求时仍然拒绝 —— 必须 accepted 才放行
  • 乙接受后 contactAccepted(a,b) && !Block(a,b) && !Block(b,a) 成立

第 7 步 · 离线投递

  • 乙未在线,消息与队列项在同一事务写入 relay
  • 分配 DeliverySeq = 1
  • 正文为中文,落库后可原样读回

第 11 步 · 队列满

  • 队列达到容量上限后,新发送返回 RECIPIENT_QUEUE_FULL
  • 被拒绝的消息完全不存在 —— 该错误码的幂等语义是「发送未被接收」
  • 早期未 ACK 的消息未被淘汰,正文原样保留
  • 被拒绝的尝试写入审计并记录错误码

第 8 步 · relay 重启

  • 关闭数据库连接后重新打开同一磁盘文件(不是内存库)
  • 未 ACK 队列项 2 条、未读通知 1 条、工作项状态 assigned、审计 15 条
  • 重启后逐项核对,全部一致

第 9 步 · 持久化、ACK 与重启幂等

  • 乙的设备拉取一个带租约的批次,取到 2 条消息
  • ACK 后再次重启 relay
  • 重启后重新拉取返回 0 条 —— 已 ACK 的消息不再重复投递
  • 收件箱仍只有 1 条通知,未因重启而重复

第 14 步 · 审计完整性

  • 全流程共写入 16 条审计事件
  • 其中 2 条为被拒绝的尝试,各自记录了错误码
  • 审计表结构中没有 body / content 列
  • 审计事件序列化后不含任何已发送的消息正文

← 上一篇:实现记录 | 返回 Wiki 首页 | 下一篇:DSH 装载验证 →

Clone this wiki locally