-
Notifications
You must be signed in to change notification settings - Fork 0
meta feature inventory
← 返回 Wiki 首页 | 元文档 · 功能全量清单 | 上一篇:DSH 装载验证
把设计文档里所有功能逐条列出并标注实现状态。与 TODO.md 的分工:
TODO 跟踪 P0-a 的实现顺序,本文件回答「文档一共要求了多少,做到哪儿了」。
本文件按文档条目组织,不按代码结构。 因此会出现「一个代码模块对应多条」 或「一条横跨多个模块」的情况 —— 那是对的,清单要对得上文档才有对账价值。
最后核对:2026-08-30 · 插件侧 574 个测试、relay 侧 295 个测试
P0-a 已完成,P0-b 未开始,P1–P4 全部未开始。
按条目粗数:文档共约 180 项可辨识的功能条目,已实现约 65 项(36%)。 P0 之后的三个阶段体量都大于 P0,所以「完成度 34%」这个数字会随后续阶段推进而 先降后升 —— 现在它主要说明基础设施已就位,业务面还很窄。
§44.1.1 定义的第一个验收关口。骨架第 1、3、5、6、7、8、9、11、14 步与 §44.1.2 的 13 条失败路径全部覆盖。
| 领域 | 条目 | 状态 |
|---|---|---|
| 契约 | §46 错误码目录 32 条,与文档双向锁定 | ✅ |
| 契约 | 11 组领域状态集合,与文档双向锁定 | ✅ |
| 契约 | 品牌化标识符与持久化类型 | ✅ |
| 契约 | 命令与 16 个领域事件的定义 | ✅ |
| 契约 |
AuditEvent 结构(§37 的 16 个字段) |
✅ |
| 契约 |
ProtocolVersion 与协议版本协商编解码 |
✅ |
| 服务端 |
/protocol/negotiate 端点(认证之前) |
✅ |
| host | relay 客户端与转发层 | ✅ |
| 集成 | 插件经真实 relay 进程的端到端验收 | ✅ |
| 持久化 | SQLite schema,§27 要求的七类必备字段 | ✅ |
| 持久化 | 迁移单调递增、单事务原子、只做扩展 | ✅ |
| 身份 | 邀请码签发与一次性消费 | ✅ |
| 身份 | 设备注册(Ed25519,私钥不上传) | ✅ |
| 身份 | 请求签名校验(§7.1 的五条拒绝路径) | ✅ |
| 身份 | nonce 去重与时间偏移容忍窗口 | ✅ |
| 组织 | 组织/工作区/项目三级层次 | ✅ |
| 组织 | 双层授权判定,10 个角色的能力表 | ✅ |
| 组织 | 成员邀请与接受,版本冲突检测 | ✅ |
| 组织 | 组织切换时的缓存隔离(§9) | ✅ |
| 私聊 | 联系人请求、接受、拒绝、删除 | ✅ |
| 私聊 | 有向拉黑,双向独立判定 | ✅ |
| 私聊 | 准入判定 contactAccepted && !Block×2
|
✅ |
| 私聊 | 消息与队列项同事务,DeliverySeq 单调 |
✅ |
| 私聊 |
(senderId, messageId) 幂等 |
✅ |
| 私聊 | 队列满在写入前拒绝,不淘汰未 ACK | ✅ |
| 私聊 | 按设备租约拉取,ACK 幂等,到期重投 | ✅ |
| 私聊 | 消息编辑与撤回(追加事件) | ✅ |
| 私聊 | 发送方本地三态状态机 | ✅ |
| 私聊 | 会话列表与消息记录查询 | ✅ |
| 私聊 | 打开会话标记已读 | ✅ |
| 工作项 | 创建、分派、版本控制 | ✅ |
| 工作项 | 签收状态机(独立于工作项状态) | ✅ |
| 工作项 | 依赖成环检测,返回环路径 | ✅ |
| 工作项 | 评审关口与产物变化自动 superseded
|
✅ |
| 工作项 | 评论与 CommentRevision
|
✅ |
| 通知 | 收件箱、去重键、游标补拉 | ✅ |
| 通知 | 聚合(5 分钟窗口,四类不参与) | ✅ |
| 通知 | outbox 消费、抖动退避、dead_letter
|
✅ |
| 通知 | SSE 事件流 | ✅ |
| 审计 | 仅追加、与领域写入同事务 | ✅ |
| 审计 | 被拒绝的尝试同样留痕、表中无正文 | ✅ |
| 审计 | 序列缺口检测 | ✅ |
| 限流 | 多维度按最严格者生效 | ✅ |
| 客户端 | 离线三态呈现、错误按可重试性分级 | ✅ |
| 客户端 | 会话列表、消息视图、输入框 | ✅ |
| 客户端 | 右侧抽屉与「聊天」标签页 | ✅ |
| 客户端 | 打包为 DSH 闭包工厂产物 | ✅ |
| 集成 | 三进程验收(relay + 两个 host) | ✅ |
| 集成 | §44.1.2 的 13 条失败路径 | ✅ |
| 工程 | 仓库治理、CI、分支保护、双语文档 | ✅ |
| 工程 | vendored 运行时带外锚点校验 | ✅ |
| 服务端 | relay 拆为独立仓库 | ✅ |
小计:约 53 项。
这些不阻塞关口,但确实没做完。
| 条目 | 现状 |
|---|---|
已接通。配 relayUrl + relaySharedSecret 即走 relay,含 §41 协议协商与真实进程间的端到端验收 |
|
| relay 无账号开通端点 | §7 规定注册走邀请码,消费逻辑已实现但没有 HTTP 入口,账号目前要直接写库 |
| relay 认证只到「授权接入的 host」 | 共享密钥不证明请求来自哪个账号。设备签名校验侧已实现,缺会话建立与 token 下发 |
| contract 未发布成包 | 两仓各持一份,靠带外锚点校验防漂移。发布需要 write:packages 凭证 |
| host 端的本地身份是临时口子 | 单机模式直接用配置里的账号充当已认证主体 |
| 「聊天」标签页下原生输入框仍在 | DSH 的输入框永远存在,conversation.view 只换正文区。详见下方「已确认做不到的事」 |
| SSE 未接到界面 | 端点已实现,界面是打开时拉一次,没有订阅 |
| 组织与成员的部分端点缺失 | 有创建/邀请/接受/查自己,缺列出全部成员、改角色、移除成员 |
| 测试偶发 worker 崩溃 | 全量 vitest run 约每 12 次一次,改动前即存在 |
§44.1.1 的第二个验收关口。骨架第 2、4、10、12、13 步。
| 领域 | 条目 |
|---|---|
| 第二因素 | TOTP 登记与校验、备用码、已消费时间步防重放 |
| 第二因素 | 组织强制策略(未登记前只能访问账号安全设置) |
| 恢复 |
RecoveryKit 生成与恢复口令加密导出 |
| 恢复 | 守护人阈值拆分(2/3 之类)与批准流程 |
| 恢复 |
recovery_pending 状态、冻结旧设备、安全通知 |
| 在线状态 | 在线/空闲/离线阈值与可见范围设置 |
| 在线状态 | 状态过期与订阅变化通知 |
| 搜索 | host 本地索引与查询 |
| 搜索 | 索引条目状态机(pending→indexed→suppressed/purged) |
| 搜索 | 撤回消息不在索引中残留 |
| 协议 | 版本协商的完整验收(编解码已实现,端到端未验) |
| 安全 | 凭证重放与时间偏移滥用的验收(实现已有,验收未做) |
| 观测 | §40 指标面与 SLO 基线实测值 |
小计:约 13 项。
§44.2。交付 L2 团队 bundle,是体量最大的一个阶段。
| 领域 | 条目 |
|---|---|
| 部署 | PostgreSQL / Redis / 对象存储 / SMTP 提供者替换 L1 默认实现 |
| 群聊 | 群创建、绑定项目、群主管理、群成员版本 |
| 群聊 |
GroupLog、GroupMessageSeq、成员游标、群事件 |
| 群聊 | 群邀请状态机(pending/accepted/rejected/expired/withdrawn) |
| 群聊 | 历史授权、续期、按范围授予 |
| 群聊 | 群日志容量与 GROUP_LOG_CAPACITY_EXCEEDED
|
| 消息 | 引用快照(非递归、标记原消息已编辑/已撤回) |
| 消息 | 受限 Markdown 与安全渲染 |
| 消息 | 表情回应(四元组幂等、白名单、撤回后隐藏) |
| 附件 | 上传预约、并发限额、单文件大小限额 |
| 附件 |
BlobObject、去重、MessageContentGrant
|
| 附件 | 下载授权、attachmentState = pending 与重试 |
| 附件 | 图片/文件传输、保留期与稳定下载授权 |
| 资源库 | 版本化资源、同名覆盖创建新版本 |
| 资源库 | 目录权限、快照禁止策略 |
| 资源库 | 共享对象与选择性共享 |
| 仓库 | 仓库链接登记、EgressService 来源验证 |
| 仓库 | webhook 签名验证、提交更新进群与工作项 |
| 仓库 | 已验证 hash 去重、CodeChangeRecord
|
| 搜索 | 群消息与资源元数据的服务端索引 |
| 搜索 | 结果逐条复检 ACL |
| 通知 | 团队版 notification 插件(邮件等外部通道) |
| 组织 | 多组织成员关系、邀请过期 |
小计:约 23 项。
§44.3。协作会话、群 Bot、富文件。
| 领域 | 条目 |
|---|---|
| 协作会话 | 个人会话选择性公开、隔离协作会话 |
| 协作会话 | 只读输入快照、可写执行租约 |
| 协作会话 | 候选产物与接受流程、ARTIFACT_NOT_ACCEPTED
|
| 协作会话 | 分支/版本合并、VERSION_CONFLICT 处理 |
| 执行 | 沙箱执行 provider、配额与终止 |
| 执行 | 无 host 文件系统/环境变量/未授权网络访问 |
| Bot | 显式安装、隔离的 (GroupId, BotId) 会话 |
| Bot | 调用策略、上下文冻结、工具能力授权 |
| Bot | 预算 BOT_BUDGET_EXCEEDED、审计与结果发布 |
| Bot | 输出不触发二次命令解析 |
| 消息 | 线程(ThreadId、ThreadMessageSeq、不扩大可见范围) |
| 消息 | 转发(逐条复检读取权、跨组织拒绝、复用 BlobObject) |
| 消息 | 群公告、置顶、只读群 |
| 文件 | 文件预览、受控视频 |
小计:约 14 项。
§44.4。团队版、治理、分析。
| 领域 | 条目 |
|---|---|
| 订阅 | 自建/团队版 PlanLimits、订阅状态、容量 |
| 订阅 |
MEMBER_LIMIT_REACHED / STORAGE_QUOTA_EXCEEDED
|
| 插件目录 | 公共插件提交、审核、发布、撤销 |
| 插件目录 | 撤销后停止排队任务、终止运行实例、PLUGIN_REVOKED
|
| 分析 | 原始用量事件、最小化与匿名化 |
| 分析 | 组织成本大屏、按项目/模型/插件/Bot 分布 |
| 分析 | 个人 token 工作台、预算告警 |
| 分析 | 周报/月报草稿 |
| 分析 | 同层级可解释排行(样本不足不展示名次) |
| 治理 | 第二因素的组织强制策略与按角色分级 |
| 治理 | 数据导出流程(按请求者权限逐条裁剪) |
| 治理 | 账号注销宽限期与匿名化 |
| 治理 | 组织删除宽限期、双人确认、物理清理 |
| 搜索 | 工作项、代码更新与插件目录搜索 |
| 代码 | 已验证代码更新与提交关联 |
小计:约 15 项。
§44.5。企业版、安全、分片、E2EE。
| 领域 | 条目 |
|---|---|
| 分片 | 按组织分片、分片健康与故障转移 |
| 基础设施 | DDoS/WAF、KMS/HSM、加密备份 |
| 基础设施 | 受控出口、隔离执行 |
| 审计 | 逐条哈希链、每日锚点、外部不可篡改归档 |
| 审计 | 哈希链断裂检测 audit_chain_broken
|
| 身份 |
webauthn、企业单点登录与强度传递 |
| 身份 | 目录同步(成员与部门) |
| 安全 | 密钥轮换、风险地理位置管制、黑名单 |
| 安全 | relay 指纹变更与 SERVER_IDENTITY_MISMATCH 端到端 |
| 安全 | 异地登录安全邮件与一键停止设备 |
| 安全 | SSRF 拒绝(私有地址、DNS rebinding) |
| 恢复 | 恢复演练、备份回滚后的水位对账 |
| 恢复 |
sync_diverged 对账与 read_only_recovery
|
| E2EE | 私聊/群端到端加密(需独立审计) |
| E2EE | 密钥 epoch、成员变化后的新旧隔离 |
| E2EE | 离线成员的密钥轮换 |
| E2EE | 按 OrganizationEncryptionPolicy 的功能矩阵降级 |
| E2EE | 服务端正文索引强制禁用、设备侧索引区间可见 |
小计:约 18 项。
不是「还没做」,是在当前上游契约下做不了,需要上游改动。
| 想做的 | 为什么做不了 |
|---|---|
| 一个输入框切换「对 AI / 对同事」 |
conversation.composer 是 chain 槽,其选择器契约要求「MUST be pure — a function of the owner props only, no external mutable reads」。官方 ui-approval 靠 pendingInteraction instanceof PendingApproval 选中 —— 那是框架塞进 props 的状态;而「用户切了聊天模式」不在 props 里,表达不出来。conversation.composer.bar 是 single 槽且已被 ui-conversation 自己的 InputBar 占用。值得给上游提 issue:让插件能驱动一个 pendingInteraction
|
| 切到「聊天」标签后隐藏原生输入框 | 试过了 —— 官方的「轨迹」标签同样保留原生输入框。conversation.view 只替换正文区,输入框由 ConversationRoot 常驻渲染,没有 opt-out |
| 右侧栏 slot | DSH 一共 58 个 slot,没有 rail/aside 这类。当前用会话头部工具区 + position: fixed portal 变通 |
| 拖拽文件发给同事 | 前端可做(DSH 有 drop target 类 slot),但后端整套附件子系统(预约上传、BlobObject、MessageContentGrant、保留策略)属 P1,一行都没有。硬做只能把文件塞进消息正文,绕过大小限额与内容授权 |
需要文档变更 PR才能关闭,实现里刻意没有自行发明。
| 缺口 | 影响 |
|---|---|
| 字段类型标注与非 ID 字段的英文名 | 契约层只能按中文描述推断 |
| 设备状态枚举没有集中声明 | P0 只用 active/restricted/revoked
|
| 工作项完整转换矩阵未定义 | 只实现了文档明确约束的 in_review → done
|
| 签收状态与工作项状态的耦合未说明 | 两台状态机各自独立演进 |
| 非消息命令的幂等键字段名 | 只有消息侧明确 |
| 角色的英文标识符 | §11.1 的 10 个角色全为中文 |
| 联系人关系状态枚举不完整 |
removed 单列在实现侧 |
| 消息编辑窗口的默认值与起算点 | 实现取 15 分钟、从创建时间算,两个取值都无依据 |
| 合规撤回权限对应的能力名 | §11.1 能力表中没有对应条目 |
另有两条 §50 开放决策标注为 (P0) 但尚未关闭(第二因素是否对组织所有者强制、
在线状态阈值)—— 按文档维护规范 §3.3,
它们本应在 P0-a 启动前关闭。
按「解锁后续工作的程度」排序,不按工作量:
-
接通 plugin ↔ relay—— 已完成。 -
relay 的账号开通与设备会话。
P0-b的恢复、第二因素全都建立在 「有真实的设备身份」之上,先做这个后面才有地方挂。 -
contract 发布成包。两仓各持一份副本靠校验和防漂移,能撑一阵,
但每次改协议都要手动同步一次。需要
write:packages凭证。 -
关闭那两条 (P0) 开放决策,否则
P0-b一启动就踩在未定义的需求上。 - 然后才是 P1 的群聊与附件 —— 那是体量最大的一块,值得单独排期。