多人协作与社会交互设计规范
面向设计师与工程师:当两个以上的人在同一份东西上共事,让每个人知道别人在做什么而不至于被监视,让每个人的输入不被别人的操作静默吃掉,并且让"我撤销"永远只撤销我做的那一步。
6 条原则 · 40 条规则 · 必须 35 · 应当 5
目录
面向设计师与工程师:当两个以上的人在同一份东西上共事,让每个人知道别人在做什么而不至于被监视,让每个人的输入不被别人的操作静默吃掉,并且让"我撤销"永远只撤销我做的那一步。
多人协作产品做的事,是让一份东西同时属于好几个人:一份文档、一块画布、一条任务、一个空间。这件事一旦发生,单人产品不需要回答的问题就全部出现了——别人现在在不在、在看哪儿、正在改哪一块;这份东西现在谁能看见、下一秒谁又能看见了;两个人同时改同一处算谁的;我按下撤销,撤掉的是我刚才那一步还是别人刚才那一步;这件事现在归谁负责,那个人离职之后又归谁;以及,在一个所有人都看得见的地方,我还有没有地方可以先试一下。本规范从"同一个对象上出现了第二个人"这一刻开始管辖。
这个领域最常见的设计错误,是把它当成一张实时协作编辑的功能清单:把多人光标、头像栏、评论气泡、修改历史逐个做出来,就认为协作做完了。这些是机制,不是承诺。真正会伤到人的地方不在机制清单上——是"谁看过这份文档"被做成了一个没人能关的默认功能,是有人把分享范围从三个人改成了链接可见而已经在里面的三个人毫不知情,是自动合并把两个人的修改拼成了含义错误却已生效的结果,是一个新人按了两次 Ctrl+Z 把资深同事十分钟的工作退回去了,是负责人离职之后他名下的三十个任务既没有转移也没有报错、只是安静地不再有人看。这些失败都不是缺功能,是缺对后果的规定。
本规范由六条原则和 40 条规则组成:原则说明设计方向,规则规定适用情境、行为要求与验证方式。每条规则归属且仅归属一条原则,规则编号即原则编号(C3-2 就是第三条原则下的第二条规则)。六条原则按规范对象切分:协作中的感知信息、内容的可见范围、并发修改的裁决、共享操作的作用与结果、责任与决定的归属、私人状态与参与选择。
范围声明本规范约束产品在多人共事能力上对用户作出的体验承诺及其兑现机制的性质,不预设唯一的技术架构,不指定同步算法、数据模型或权限模型。它适用于文档、白板、任务看板、评审与围绕共享对象的讨论,不要求所有产品提供全部能力。采用本规范不能替代下列专项评估与合规判定:隐私与个人信息保护(成员活动记录可能涉及个人信息处理,须按目标市场与功能评估)、劳动与雇佣相关的监控合规、企业信息安全与访问控制的技术审计、数据保留与电子取证要求,以及完整的无障碍符合性评估;本文直接规定协作过程特有的无障碍要求。明确不在本规范范围内的三件事:开放社交平台的内容审核与推荐排序(本文只规定协作空间内的参与、免打扰及求助边界);组织的岗位、汇报关系与绩效管理制度(本规范只管产品里的责任字段怎么表达,不管组织怎么分工);端到端加密的密码学实现与密钥管理(本文要求访问控制实际生效,不规定密码学方案)。
正文从第 0 章任务与事实入口开始,第 1 章原则,第 2 章规则的读法与速查,第 3 章规则详解,第 4 章术语;验证清单与论据说明见附录 A、B,组合场景与验收记录见附录 C,完整来源见 reference.md,可配置项见《多人协作与社会交互 Design Token》。
0. 从一个协作任务开始
先选一个真实任务,列出发起者、协作者、裁决者、外部成员及会受到影响的人,再决定需要哪些能力。纯只读共享不必实现编辑锁;普通评论不必实现正式投票。
| 设计步骤 | 最小产出 | 用来回答的问题 |
|---|---|---|
| 定义对象与结果 | 对象、成功条件、正式生效点 | 一起完成什么,什么算做完? |
| 画出主体与受众 | 读、写、分享、裁决、移除的权限矩阵 | 谁能做什么,谁会看见结果? |
| 选择协作方式 | 实时、异步、轮流编辑及私人探索入口 | 是否真需要同时编辑?等待与冲突由谁承担? |
| 写清行为与失败 | 并发、撤权、重试、交接及退出路径 | 网络断了、人走了、意见变了怎么办? |
| 配置并验证 | Token 有效值、机制证据、双方界面 | 参数能否兑现,用户是否理解? |
状态文案必须有证据。以下是运行事实,不是可配置的 Token 值;“未知”与“失败”分别呈现,不能用旧事实填补缺失。
| 表达 | 最少证据 | 不证明什么 |
|---|---|---|
| 在场 | 会话主体、观察来源、最近有效时间、到期点 | 本人正在看、愿意响应或已经同意 |
| 已保存 / 已接受 | 对象快照、操作标识、持久化位置、接受回执 | 他人已收到或已读 |
| 已撤权 | 主体与资源范围、生效时点、机制执行结果 | 已下载副本被擦除 |
| 已锁定 | 对象、持有人、有效锁凭据、到期点 | 断网后仍能持续独占 |
| 已承接 | 当前交接请求、接收主体、承接证据与生效结果 | 已失效请求仍能改变当前责任 |
| 已批准 | 决定者、资格、批准范围、对象快照、失效条件 | 后续新增内容也获批 |
对界面上每一个“已……”分别记录对象、证据来源、观察时点和有效边界。无法提供这些证据时,应使用“正在核对”“已在本机保存”“等待承接”等与事实相称的表达。
1. 六条原则
六条原则按规范对象切分设计责任:每条原则管辖一类对象上的义务,每条规则按其义务的直接规范对象归属唯一原则。对象不同,原则就不会互相替代——这是切分的依据,也是检验切分的方式。
| 原则 | 规范对象 | 设计方向 | 管辖规则 |
|---|---|---|---|
| C1 感知他人有边界 | 系统向成员呈现的协作感知信息及其可达性(在场、位置、变更与评论) | 协作需要知道别人在做什么,但感知信息本身就是一种暴露。给出的粒度只够协作用,不够拿来考核人 | C1-1 ~ C1-7 |
| C2 可见性是内容的属性 | 一份共享内容对每个主体的可见范围与权限,及其变更 | 谁能看到什么,是内容自己带着的属性,不是界面上藏没藏那个按钮。范围变了,已经在里面的人有权知道 | C2-1 ~ C2-7 |
| C3 并发修改不吞输入 | 多个人同时修改同一处时的裁决 | 两个人同时改不是异常分支,是常态。任何策略下都不得让谁的输入无声消失,也不得把裁决丢给不该裁决的人 | C3-1 ~ C3-6 |
| C4 个人操作有明确作用范围 | 一个人的一次操作在共享对象上产生的效果、结果证据及其归属 | 在共享空间里按下的每一个键都有别人在承受。撤销必须是"撤销我做的",不是"撤销最后一步";改了什么、影响到谁,操作者要在按下去之前知道 | C4-1 ~ C4-7 |
| C5 责任有归属且可交接 | 任务与内容的责任主体、讨论结论与有效决定 | 参与不等于负责。谁现在负责这件事,必须有答案;人会离开,责任不能跟着人一起消失 | C5-1 ~ C5-6 |
| C6 共享空间里有私人余地 | 在共享工作区内的私人状态与参与选择:草稿、未发布的意见、个人视图、尚未定稿的尝试、参与和接收提醒的选择 | 所有东西都立刻对所有人可见,人就不敢做事了。在共享空间里"试一下",不得默认对所有人生效 | C6-1 ~ C6-7 |
同一个场景可以触及多条原则——一位成员在共享看板上把某列的筛选条件改掉、顺手把三张卡片批量指派给了刚离职同事的账号,然后按了撤销:产品同时面对这次筛选改动是个人视图还是共享视图(C6-3)、批量指派是否在执行前说明了作用范围与打扰后果(C4-4、C4-6)、被指派方已不在组织内时责任的去向(C5-3)、以及这次撤销撤掉的是他自己的三次指派还是包含了别人在这期间的改动(C4-1、C4-2)。这不是分类错误:这些规则约束的是不同规范对象上的义务,一个是个人状态的默认归属,一个是操作的作用范围,一个是责任的去向,一个是撤销的作用域。互斥与穷尽是这套切分接受检验的主张,不是宣布即成立的事实:规则增删或归属存疑时,按附录 A 的分类检验验证。检验不过,修改的是原则的切分。
本切分中最需要持续检验的两处边界,在此明示:C1 与 C2——C1 管"关于人的信息给谁看",C2 管"关于内容的可见范围"。"谁看过这份文档"两边都沾,归属依据是它的直接规范对象是一个人的阅读行为这项关于人的信息,因此归 C1;而"这份文档现在对谁可见"的直接规范对象是内容的可见范围,归 C2。C4 与 C6——C4 管"我的操作对别人产生了什么效果",C6 管"我的状态什么时候开始对别人可见"。同一次"改了但还没想好",若问题是这次改动已经生效并波及了他人的工作,归 C4;若问题是产品根本没给出一条不影响他人的尝试路径、逼着人直接改共享态,归 C6。这两处若在实践中反复出现归属争议,应当调整原则而不是增设中间层。
原则用于理解规则与裁决归属,本身不作为单独的判定条目。当原则与具体条款的解读出现冲突时,以适用条款为准,并记录需要澄清的歧义。
规则归属唯一,不等于机制不能复用。一套"变更记录"既是操作归属的依据(C4-3)、也是冲突裁决的证据(C3-4)、还是责任交接后历史不被改写的保障(C5-4);一套"主体解析"既决定可见范围能不能被查明(C2-1)、也决定在场信息给谁看(C1-4)、还决定离职后内容归谁(C5-3)。同一机制一物多用是常态,写在哪条取决于义务的直接规范对象。
2. 规则的读法
2.1 每条规则的结构
| 部分 | 作用 |
|---|---|
| 一句话 | 规则的记忆版,不替代正文 |
| 适用 | 这条规则在什么情境下生效。不落在适用范围内的产品记录"不适用"即可,不必勉强套用 |
| 规则 | 规范正文,规定这条规则的要求 |
| 边界条件 | 与适用共同限定要求的适用范围:说明这条规则不要求什么、例外在什么条件下成立(仅部分规则有) |
| 设计应用 / 验证示例 / 反例 | 帮助落地的说明,不另行增加义务,也不指定唯一实现 |
| 依据与参考 | 失败记录与实现参考(仅部分规则有;论据类型与出处见附录 B 与 reference.md) |
一句话概括各部分的效力:规则正文规定要求;适用与边界条件共同限定要求的适用范围;设计应用、验证示例、反例与依据参考不另行增加义务。
规则写行为性质、不写实现方式:两个人同时改同一段落之后谁的输入都还在、并且都能认出哪部分是自己写的,这是产品行为;用操作转换、无冲突复制数据类型、悲观锁还是三方合并实现,是工程方案——两者必须对得上,但不是同一份交付物。本规范因此不指定同步协议、数据结构或一致性模型。
2.2 约束词
规则正文使用三级约束词:
- 必须:不满足即不符合本规范。缺了它,某条对用户的承诺会在可预见的情境下失效——这是标「必须」的唯一依据。
- 禁止:与「必须」同等强度的反向表述,指明不得出现的行为;正文中的「不得」与「禁止」等价。
- 应当:默认遵循;确有理由偏离时,记录理由与替代做法,并接受同样的验证。偏离不需要审批,但需要留痕。「不应当」是「应当」的反向表述。
合规判定以正文中的独立义务子句为单位:无约束词的陈述句承接所在规则标题的强度;显式标注约束词的子句按其自身强度判定——【应当】规则内的「禁止/不得」子句仍是硬约束(C2-6、C3-6、C4-6、C5-5、C6-5 含此类子句),规则标题与速查表的强度标注不替代子句约束力。正文中的「不能」仅用于能力或事实陈述,不表达义务。
强度表示约束力,不表示重要性。
2.3 反例的两侧
反例分两侧:"做不到"是漏掉这条要求,"做过头"是为了满足它而把协作做成了报批流程。多人协作被做坏的方式在两端都很密集:一端是把所有人的一举一动实时广播给所有人、把工作区变成监控室,另一端是为了保护每个人而给每次改动都加一道审核、让两个人改一句话要走三次通知。让人能一起干活,与让人不被互相伤害,是同一件事的两面;只顾一面都算没做对。
特别提示一处最容易做过头的地方:冲突提示不是越多越好。把任何两个人先后动过同一份文件都判成冲突、每天弹十几次合并界面,与静默丢弃输入一样,都会导致人不再看提示。
2.4 规则速查:40 条
下表是全部规则的一句话记忆版,点击规则名可跳到第 3 章的完整正文。速查不替代各条的适用条件与完整要求;个别【应当】规则内含禁止级子句(C2-6、C3-6、C4-6、C5-5、C6-5),判定以正文为准(见 2.2)。
C1 感知他人有边界
| 规则 | 强度 | 一句话 |
|---|---|---|
| C1-1 在场状态来自当前判定 | 必须 | 头像亮着,就该是真的在;不确定就写不确定。 |
| C1-2 账号在场不等于本人在场 | 必须 | 那个头像后面不一定是那个人。 |
| C1-3 感知粒度只够协作用 | 必须 | 够我知道别人在改哪块就行,不必知道他敲了几下键。 |
| C1-4 被感知方可知可控 | 必须 | 我的行踪被谁看着,我要知道,并且能收起来。 |
| C1-5 "谁看过"与"谁在线"分别决定 | 必须 | 在线是此刻的暴露,看过是回溯的暴露,不能一个开关捆了。 |
| C1-6 感知信息不反向用于评价 | 必须 | 在线时长、阅读记录、改动条数,不许拿去打分。 |
| C1-7 协作变化可被平等感知 | 必须 | 不看颜色、不用鼠标,也能跟上变化并完成协作。 |
C2 可见性是内容的属性
| 规则 | 强度 | 一句话 |
|---|---|---|
| C2-1 可见范围可解析到主体 | 必须 | "已共享"不是答案,"谁"才是答案。 |
| C2-2 范围变更告知在其中的人 | 必须 | 房间里多了人、或者门开了,屋里的人有权知道。 |
| C2-3 链接分享的传播性显式 | 必须 | 链接会被转发,受众从此点不完也收不回。 |
| C2-4 权限在机制层生效 | 必须 | 藏起来的按钮不是权限,取不到才是。 |
| C2-5 继承与例外可追溯 | 必须 | 他为什么能看见这一份,要答得出来。 |
| C2-6 无权访问给出正常路径 | 应当 | 让人知道该找谁要,而不是撞上一堵白墙。 |
| C2-7 撤权覆盖在途动作与派生内容 | 必须 | 门关上以后,旧页面和待发消息也不能继续放行。 |
C3 并发修改不吞输入
| 规则 | 强度 | 一句话 |
|---|---|---|
| C3-1 并发策略事先声明并与行为一致 | 必须 | 同时改会怎么样,是设计决定,不是运气。 |
| C3-2 正在被改的部分事先可见 | 必须 | 别等我写完了才告诉我这块有人在写。 |
| C3-3 自动合并有边界且结果可识别 | 必须 | 合得拢不等于合得对。 |
| C3-4 冲突交给能裁决的人 | 必须 | 冲突不该由最后一个提交的倒霉蛋独自决定。 |
| C3-5 独占锁定有持有人有期限 | 必须 | 锁上的人下班了,文件不能就此锁死。 |
| C3-6 收敛承诺与他人可见分开表述 | 应当 | "我看到的是最新的"和"我改的别人看到了"是两件事。 |
C4 个人操作有明确作用范围
| 规则 | 强度 | 一句话 |
|---|---|---|
| C4-1 撤销撤的是自己那一步 | 必须 | 撤销是"撤销我做的",不是"撤销最后一步"。 |
| C4-2 撤销不静默回退他人成果 | 必须 | 要连别人的改动一起退,先说清楚再退。 |
| C4-3 每次变更有可解析的作者 | 必须 | 这行字是谁写的、是人写的还是 Agent 写的,查得到。 |
| C4-4 作用范围在执行前显式 | 必须 | 按下去之前就知道这是改我自己的还是改所有人的。 |
| C4-5 共享对象的破坏性操作加严 | 必须 | 删自己的东西和删大家的东西,不是一回事。 |
| C4-6 批量操作不产生等量打扰 | 应当 | 改一百条不等于给人发一百条通知。 |
| C4-7 重复与部分成功有独立结果 | 必须 | 没收到回执,不等于没做过;做了一部分,要说清哪部分。 |
C5 责任有归属且可交接
| 规则 | 强度 | 一句话 |
|---|---|---|
| C5-1 当前责任主体可解析 | 必须 | 参与者名单不回答"现在归谁"。 |
| C5-2 交接是双方事件 | 必须 | 派下去不等于接下来。 |
| C5-3 离开与移交对称 | 必须 | 人走了,他名下的东西不能就地失联。 |
| C5-4 责任变更不改写历史归属 | 必须 | 换了负责人,以前是谁写的还是谁写的。 |
| C5-5 外部与临时成员的边界显式 | 应当 | 访客什么时候到期,到期后他留下的东西归谁。 |
| C5-6 讨论、解决与决定分别留痕 | 必须 | 结束讨论不等于大家同意,批准只覆盖当时的内容。 |
C6 共享空间里有私人余地
| 规则 | 强度 | 一句话 |
|---|---|---|
| C6-1 未定稿默认不外发 | 必须 | 没写完的东西,别人不该已经看见了。 |
| C6-2 探索性操作有不影响他人的路径 | 必须 | 想试一下,不必先惊动所有人。 |
| C6-3 个人视图不改变他人所见 | 必须 | 我折叠了一列,不该把别人的屏幕也折了。 |
| C6-4 私人区与共享区的转移显式且不可假装撤回 | 必须 | 撤回删得掉内容,删不掉"已经被看见"。 |
| C6-5 私下沟通不并入共享记录 | 应当 | 私聊不因为导出、检索或汇总而变成公开材料。 |
| C6-6 提醒可收敛且提及不扩权 | 必须 | 可以少受打扰;被提及不等于被授予访问权。 |
| C6-7 参与限制有作用域与退出路径 | 必须 | 屏蔽、退出和撤权各有后果,限制也要有解除路径。 |
3. 规则详解
本章按六条原则展开全部 40 条规则。每条的结构与各部分的约束力见 2.1;其中的设计应用、验证示例与反例只是帮助落地的说明,不指定唯一组件,也不要求新增独立交付文档。
3.1 C1 感知他人有边界
协作需要知道别人在做什么:知道同事已经在改第三节,我就不去改第三节;知道方案没人看过,我就再催一次。这类信息是协作效率的来源,也是这个领域最早被做过头的地方——同一份信息,粒度粗一点是协作,细一点就是监控。这条原则管的是关于其他人的信息怎么产生、给到什么粒度、给谁看,以及被感知的那个人有没有说话的余地。它不管内容本身的可见范围,那是 C2。
C1-1在场状态来自当前判定必须
一句话:头像亮着,就该是真的在;不确定就写不确定。
适用向用户呈现其他成员是否在线、是否在当前对象上、是否可被立即联系的产品。
规则呈现给用户的他人在场状态必须来自当前有效的判定(连接、近期交互、显式设置之一以上),并明确该判定的有效期。有效心跳指属于当前连接世代、顺序有效且未被判过期的证据;延迟到达的缓冲包不得在重连后重新延长旧会话的在线声明。接收时刻只用于本端计时,不替代来源身份与时效检查。判定过期后必须呈现为状态未知或离线,禁止把最后一次活跃时间直接呈现为当前在场(见 collab.presence.freshness.ttl)。用户显式设置的在场状态(忙碌、勿扰、隐身)优先于系统探测结果,系统禁止以探测结果覆盖或"纠正"用户的显式设置。在场状态不可得时,必须呈现为未知,不得以默认在线填补。
边界条件本条不要求实时探测,也不禁止把探测做成用户触发的刷新;它约束的是呈现与实际判定之间的一致性。查看头像本身不续期;当前在场也不证明具体的人正在关注。
设计应用把"离线""状态未知""最后活跃于某时"设计成三种可分辨的呈现,而不是把后两者都画成灰色圆点。给"正在此对象上"和"在产品内但不在此对象上"分别的表达,前者的时效通常远短于后者。
验证示例
- 用户侧:让一名成员关闭客户端或断网,观察其他成员看到的状态在多长时间内变化,以及是否会据此发起一次注定无人应答的联系。
- 实现侧:检查在场判定的信号来源与有效期配置;验证过期状态不被缓存复用,且用户显式设置不被探测结果覆盖。
反例做不到——同事三小时前关了电脑,协作者列表里他的头像仍然亮着绿点,别人在文档里 @ 他等回复;做过头——为了状态精确,每两秒向所有成员广播一次心跳,把在场做成了活跃度直播。
C1-2账号在场不等于本人在场必须
一句话:那个头像后面不一定是那个人。
适用以在场状态作为联系、指派、审批或权限判断依据的产品。
规则系统禁止把账号的在场状态作为本人在场的证据向其他成员断言。共享设备、共享账号、会议室终端、代理登录与自动化会话产生的在场,必须与个人在场可区分(见 collab.presence.identity.mode)。需要本人确认的操作禁止仅以在场状态作为已获知的依据;由 Agent 或自动化代表某人产生的活动,其呈现必须可被识别为非本人操作。
边界条件本条不要求产品实现身份核验,也不禁止把在场作为"值得一试"的联系提示;它禁止的是把在场当成"这个人已经知道了"或"这个人同意了"。
设计应用把共享终端上的会话呈现为设备而非人;把由自动化维持的长连接排除在人的在场判定之外,否则一台永不休眠的服务器会让一个人永远在线。
验证示例
- 用户侧:在共享会议室终端上以某人账号登录,观察其他成员看到的是"某人在线"还是"某设备在线"。
- 实现侧:核查在场信号的来源分类;验证自动化会话不计入个人在场。
反例做不到——同事的账号在办公室公用大屏上登着,看板显示他一整天在线,任务全被指派给他;做过头——为了确保是本人,每次查看协作者列表都要求所有成员重新验证身份。
C1-3感知粒度只够协作用必须
一句话:够我知道别人在改哪块就行,不必知道他敲了几下键。
适用向成员呈现其他成员活动信息的产品。
规则每一类感知信息必须绑定它要解决的协作问题,其粒度不得超过解决该问题所需(见 collab.presence.awareness.granularity)。禁止把逐次输入、停留时长、光标空闲时间、切窗行为、单位时间操作次数等过程数据作为面向其他成员的常规感知信息呈现。需要更细粒度的场景(如同步演示、结对操作、事故排查)必须是被感知方显式开启的一次性或有期限的状态,不得作为默认。感知信息的呈现范围必须与该协作问题的相关方一致,不得向与该对象无关的成员广播。
边界条件本条不禁止呈现"某人正在编辑这一段""某人在此文档中"这类定位到对象与区块的信息——那正是协作所需的粒度。它也不约束被感知方自己看到的自身数据。审计与安全日志按各自的合规要求处理,不属于本条所指的面向成员的感知信息,但它们同样受 C1-6 的用途约束。
设计应用先写出"这条感知信息帮别人避免了什么具体麻烦",写不出来的就删掉。同一个信号可以有两个粒度:给协作者看"正在第三节",给本人看"你在此停留了四十分钟",后者不外发。
验证示例
- 用户侧:列出产品中所有会被其他成员看到的活动信息,逐条问"少了它,协作会出什么具体问题"。
- 实现侧:核对面向成员的感知字段清单与内部埋点清单是否被混用;检查是否存在未声明的细粒度活动被前端消费。
反例做不到——协作侧栏实时显示"张三已闲置 12 分钟""李四今日编辑 47 次";做过头——为了避免监控嫌疑,连"有人正在编辑这一段"也不显示,两个人反复覆盖对方的修改。
C1-4被感知方可知可控必须
一句话:我的行踪被谁看着,我要知道,并且能收起来。
适用产生并向他人呈现成员活动信息的产品。
规则每个成员必须能查明自己的哪些活动信息正在被呈现给谁(见 collab.presence.subject.view)。产品必须提供收敛自身可见性的档位(至少含一档不向其他成员呈现实时在场与位置的取值),且采用该档位禁止导致核心协作功能不可用或产生功能性惩罚(见 collab.presence.visibility.self)。当某成员的活动信息被呈现给此前不在范围内的主体时(新成员加入、范围扩大、导出到外部),必须遵循 C2-2 的告知要求。
边界条件不呈现实时在场与位置不等于匿名协作:成员仍可看见共享贡献的作者、有效锁的持有人和当前责任人。组织策略可规定受控审计,但不能取消正文要求的实时感知收敛档位,或把使用该档位标为异常。本条不豁免记录本身的合规义务:安全审计所需的记录不因成员收敛可见性而免于保存,它们只是不向其他成员呈现。
设计应用把"我看得见谁"与"谁看得见我"做成两份可分别查看的清单——多数产品只做了前者。收敛档位的措辞要说明代价("其他人将无法看到你是否在线,也无法知道你在看这份文档"),让人在知情下选择。
验证示例
- 用户侧:让一名成员尝试回答"公司里谁能看到我现在在读哪份文档",记录他需要多少步、是否能得到确定答案。
- 实现侧:开启收敛档位后,核查所有面向他人的接口是否确实不再返回该成员的实时位置与在场。
反例做不到——阅读记录默认对全部有权访问者可见,产品里找不到任何入口说明这件事,也关不掉;做过头——把可见性做成每次打开文档都要选一次的弹窗,选完还要确认。
C1-5"谁看过"与"谁在线"分别决定必须
一句话:在线是此刻的暴露,看过是回溯的暴露,不能一个开关捆了。
适用同时提供实时在场信息与阅读、查看、已读记录的产品。
规则实时在场信息与回溯性的查看记录必须作为两类信息分别管理:其开启与关闭、可见受众、保留期限必须可分别决定(见 collab.presence.seen.mode、collab.record.retention.ttl)。禁止以单一开关同时决定两者,也禁止在关闭其一时以另一类信息重建等价结论(如关闭已读回执后,用在场时间与文档打开次数拼出等价的已读列表)。查看记录的保留期限必须明确并可查;超期后禁止继续向其他成员呈现。查看记录的存在本身必须在成员首次可能被记录之前可获知,不得仅存在于条款。
边界条件本条不禁止提供已读回执或查看记录——它们在很多协作场景中确有价值。它要求的是这两类暴露被分别决定。法定或合同要求的送达证明(如正式通知的签收)不受本条"可关闭"要求约束,但仍须遵守可获知与保留期限的要求。
设计应用把两者的差别写进设置项本身的措辞——"其他人可以看到你现在是否在线"与"其他人可以看到你在什么时候看过哪些内容"是两句不同的话,写在一起就等于没写。已读记录的默认受众通常应当限于内容的责任主体,而非全部有权访问者。
验证示例
- 用户侧:关闭查看记录后,检查其他成员是否仍能通过在场历史、通知已读、评论浏览位置等旁路推断出等价信息。
- 实现侧:核对两类信息的开关、受众与保留期是否为独立配置;验证超期记录不再对外返回。
反例做不到——一个"协作可见性"开关同时管在线状态与阅读记录,关掉之后连自己的在线状态也没了,于是没人敢关;做过头——每次打开一份共享文档都先弹一次"是否允许记录本次查看"。
C1-6感知信息不反向用于评价必须
一句话:在线时长、阅读记录、改动条数,不许拿去打分。
适用采集成员在场、查看或操作信息的产品。
规则为协作感知目的产生的信息,禁止用于对成员的绩效评价、能力评分、任务分配优先级、排序权重、准入判定或差别定价(见 collab.presence.purpose.scope)。每一类感知信息必须绑定明确用途与下游消费方,未列出的模块不得读取;禁止以聚合、排名或"团队活跃度"等形式对个人产生同等效果的呈现。将协作活动数据用于管理用途的场景(如工时统计),须由该场景自身的合规依据支撑并对被采集者明示,不得以本产品的协作功能为由默认开启。
边界条件本条不禁止面向成员本人的自我统计,也不禁止不指向个人的容量与性能度量。它约束的是把感知信息变成对人的判定。组织出于安全或审计目的的日志访问按各自制度处理,不属于本条所指的评价用途,但其访问同样须有依据与记录。
设计应用把感知字段的下游消费方写成显式清单并定期核对——这类越界通常不是有意设计的,是某个报表模块直接读了协作库。给"团队仪表盘"类功能设一条硬约束:可以显示对象的进展,不显示人的活跃度排名。
验证示例
- 用户侧:检查产品中是否存在按成员排序的活跃度、编辑量或响应速度榜单。
- 实现侧:审计在场与查看记录的下游读取方清单是否与声明一致;有无旁路导出到人事或绩效系统。
反例做不到——协作平台给管理者提供"成员在线时长与文档编辑次数周报",并按此排名;做过头——为避免被用于评价,连"这份文档最近三十天无人查看"这类对象级信息也不提供,导致过期内容无法被识别。
C1-7协作变化可被平等感知必须
一句话:不看颜色、不用鼠标,也能跟上变化并完成协作。
适用呈现在场、变更、评论、冲突或权限变化的产品。
规则
- 系统必须提供不依赖颜色、头像或瞬时动画的辨识方式;姓名或可访问名称、对象位置、变化类型与可执行入口必须能被辅助技术获取,且不得超过成员当前获准查看的范围。
- 评论、差异、冲突与处理入口必须可由键盘定位和操作,关联内容被移动或删除时必须说明定位变化,不把焦点移到无关内容。
- 远端编辑不得无提示地抢走本人的输入焦点。产品必须提供控制非关键活动播报的方式,并保留主动查询变化的入口;暂停播报不等于暂停同步,也不关闭输入保护。
- 提供跟随他人视角时,必须由跟随者主动进入,持续呈现跟随状态并允许随时退出;发起方不能替他人同意跟随。
相关配置:collab.presence.presentation。
边界条件本条要求信息与操作可达,不要求每次光标移动都播报,也不要求提供跟随功能。
验证示例用屏幕阅读器和键盘完成“定位评论—阅读所指内容—回复—返回原编辑处”;并发插入内容时检查焦点、选区及输入是否保留;暂停活动播报后仍可查到关键冲突。
反例做不到——只用红绿光标区分成员,评论只能鼠标悬停查看。做过头——逐次朗读所有远端按键,用户无法完成自己的句子。
3.2 C2 可见性是内容的属性
谁能看到什么,是内容自己带着的属性:它跟着内容走,被复制时跟着复制品走,被嵌入时跟着嵌入关系走,被导出时决定能不能导出。它不是界面上的一个开关——把菜单项藏起来、把按钮置灰、把搜索结果过滤掉,这些都不是可见性,只是可见性的呈现。这条原则管的是可见范围本身怎么被定义、怎么被查明、变更时谁有权知道,以及"看不到"这件事在机制上成不成立。它不管关于人的感知信息,那是 C1。
C2-1可见范围可解析到主体必须
一句话:"已共享"不是答案,"谁"才是答案。
适用提供内容共享能力的产品。
规则任何共享对象在任何时刻,其可见范围必须能被有权查看该范围的成员解析到具体主体类别:具名个人、可枚举的群组、链接持有者、外部访客、组织内全体(见 collab.visibility.audience)。禁止仅以"已共享""公开""团队可见"作为可见范围的完整表述而不提供其解析结果。群组作为主体时,其当前成员必须可展开或至少可知其规模与来源;不可枚举的受众(如链接持有者)必须被明确标注为不可枚举(见 C2-3)。可见范围与编辑权限是两个维度,必须分别表达,禁止用单一等级同时表示两者。
边界条件本条不要求向所有成员公开完整的访问者名单——查看范围本身也可能是敏感信息;它要求的是有权者能得到确定答案,以及无权者得到的是明确的"你无权查看此信息"而不是一个看似完整实则被过滤过的名单。大规模组织中的"全体可见"不要求逐人枚举。
设计应用把共享面板的默认答案从状态词改成主体列表。对嵌套结构(文件夹内的文件、页面内的子页面),要能回答"这一份"的实际范围,而不只回答父级的设置。
验证示例
- 用户侧:随机取十个共享对象,让所有者在三十秒内说出各自的确切可见范围,记录答不出的比例与原因。
- 实现侧:核对界面呈现的范围与后端实际授权列表是否一致,特别是群组嵌套与继承叠加之后。
反例做不到——分享面板只显示"已开启共享"和一个复制链接按钮,谁能打开这份文档无从得知;做过头——把每一次访问都做成需要所有者逐个批准的申请,团队日常协作被卡住。
C2-2范围变更告知在其中的人必须
一句话:房间里多了人、或者门开了,屋里的人有权知道。
适用允许在内容创建后变更其可见范围的产品。
规则共享对象的可见范围扩大时,已在该范围内的成员必须能获知这一变更(见 collab.visibility.change.notice)。扩大包括:新增具名主体、加入新群组、从具名共享转为链接可见、从内部转为对外、被复制或嵌入到范围更大的对象中。告知必须说明变更后的范围而不只是"权限已更新",变更记录与告知待办必须不晚于新主体取得访问时生成;在线贡献者继续提交前必须得到新受众提示,离线者在恢复提交前先核对。可见范围缩小时,被移除的主体必须获知其访问已终止,或产品必须确保其界面不再呈现该对象为可访问——联网界面禁止继续显示可提交状态;离线界面必须说明权限未能核验,重连不得凭缓存权限提交。范围变更必须记录变更主体与时间,并在保留期内可查(见 collab.record.categories)。
边界条件本条不要求逐次实时打扰:告知待办与变更记录在权限生效时点生成,其呈现可以聚合、可以延后到成员下次进入该对象时——在线且正在贡献的成员应在继续输入前看到,离线成员在下次进入时先看到新范围再继续贡献;产品选择延迟通知的,须记录该策略。它不要求把变更告知给内容的全部历史访问者,只要求告知变更时仍在范围内的成员。安全事件处置中的紧急撤权可以先执行后告知,但事后告知不可省略。本条要求的是界面送达或拦截新提交的可验证回执,不承诺证明任何人在心理上已经知道(见 C5-2 的证据分级)。
设计应用把"范围扩大"与"权限调整"在告知上分开——前者改变了谁能看见,后者可能只是把某人从可评论改成可编辑。对"转为链接可见"这一步单独设计提示,因为它是范围变更中不可逆性最强的一种(见 C2-3)。
验证示例
- 用户侧:在一份三人共享的文档上打开链接共享,观察原有三人是否、何时、以何种形式得知。
- 实现侧:核查每一类范围扩大动作是否都触发了告知;验证告知内容包含变更后的范围而非仅"设置已更改"。
反例做不到——文档所有者把内部文档改成"知道链接的任何人可编辑",其他协作者毫不知情,继续在里面写内部信息;做过头——每次新增一名协作者都给全部现有成员推送一条即时通知,十人协作的文档一天几十条。
C2-3链接分享的传播性显式必须
一句话:链接会被转发,受众从此点不完也收不回。
适用提供以链接作为访问凭证的共享方式的产品。
规则创建以链接为凭证的共享时,必须在创建动作发生处说明其受众是不可枚举且可被转发的,而不仅说明当前的权限等级(见 collab.visibility.link.mode)。链接共享必须提供撤销手段,并声明有效期与附加访问限制;限定域或需登录不能替代撤销。撤销后,已建立的会话与此前取得的直接资源地址不得继续获得新的服务端访问(见 C2-4、C2-7)。已下载到终端的副本不因此被远程擦除。产品禁止把链接共享设为新建对象的默认可见范围。已通过链接访问过的主体,其访问记录的可获知性按 C1-5 与 C2-1 处理;不得以"链接是私密的"表述暗示受众可控。
边界条件本条不否定链接共享的价值——它常常是与外部协作唯一可行的方式。它约束的是这一选择的后果被如实说明。对已经离开产品边界的内容(他人另存的副本、截图、导出文件),撤销链接不构成对这些副本的控制,这一限制必须在撤销动作处说明,不得让用户以为撤销等于收回。
设计应用把"任何知道链接的人"这句话写在开关旁边,而不是写在帮助文档里;给链接共享一个非永久的默认有效期,让不作为的结果是收紧而不是放开。
验证示例
- 用户侧:让用户在开启链接共享后回答"现在有多少人能打开它",记录有多少人给出了具体数字(这说明说明文案没起作用)。
- 实现侧:撤销链接后,用此前已获取的直接资源地址与已建立的会话重试访问,验证确实被拒绝。
反例做不到——一键"复制链接"默认生成组织外可访问的编辑链接,界面只写"链接已复制";做过头——每次通过链接访问都要求访问者填写身份与用途表单,外部协作实际不可用。
C2-4权限在机制层生效必须
一句话:藏起来的按钮不是权限,取不到才是。
适用对不同主体呈现不同内容或不同操作能力的产品。
规则可见性与操作权限必须在数据与接口层强制,界面上的隐藏、置灰、过滤只作为呈现,禁止作为唯一的实施手段。无权主体禁止通过接口、导出、搜索索引、缩略图、预览、通知摘要、引用卡片或错误信息取得受限内容或其片段。部分可见的对象必须明确其部分性:当一个人看到的是被过滤后的列表、被截断的历史或被隐藏了若干条目的视图时,该事实必须可被知道(见 collab.visibility.partial.disclosure),否则他会把不完整当成完整并据此决策。
边界条件本条不要求对存在性本身保密——是否隐藏对象的存在是产品决定,见 C2-6 的两种取值。它不要求为每类内容实现独立的鉴权服务,只要求实际的取得路径都受同一套判定约束。存在性敏感时采用稳定的“仅显示你有权访问的范围”说明,不暴露隐藏条目的数量或是否存在。
设计应用把"这里还有 3 条你无权查看的评论"作为一种正常呈现,而不是把它们悄悄抹掉——抹掉会让人误以为讨论已经结束。对搜索与通知这两个最常见的泄露口,单独做越权用例。
验证示例
- 用户侧:以无权成员身份检查搜索结果、通知摘要、引用预览与导出文件中是否出现受限内容片段。
- 实现侧:绕过前端直接调用列表、详情、导出与索引接口,验证返回结果与权限判定一致。
反例做不到——评论区对无权成员隐藏了三条讨论,但通知摘要把其中一条的前两行原文推送了出去;做过头——为了绝对隔离,连"该内容存在但你无权访问"也不返回,用户收到的链接永远打不开也不知道为什么(见 C2-6)。
C2-5继承与例外可追溯必须
一句话:他为什么能看见这一份,要答得出来。
适用可见范围存在层级继承、群组授权或规则派生的产品。
规则当某主体对某对象的可见性来自继承、群组成员身份或规则派生时,该来源必须可被查明(见 collab.visibility.inheritance.trace):是从哪一层继承的、经由哪个群组、被哪条例外放宽或收紧。禁止只呈现最终结果而无法追溯其成因。在层级上单独设置的例外必须在父层级发生变更时仍然可被发现,不得静默失效或静默扩大。收紧与放宽的叠加规则必须显式定义并与实际行为一致(取最严、取最宽或按层级优先之一以上),产品不得在不同入口采用不同的叠加结果。
边界条件本条不要求向所有成员展示完整的授权拓扑;查明的权利与查看范围本身的权限一致。它不规定采用哪种叠加规则,只要求这一选择被写明并被一致执行。
设计应用在权限面板里给每个主体加一行来源说明("经由『产品组』继承自上级文件夹"),这一行常常比整套权限模型更能防止误配。移动对象到新父级时,把继承结果的变化在移动前呈现出来。
验证示例
- 用户侧:对一个继承层级较深的对象,让管理员说明某位成员的访问来源,记录是否需要跨多个界面拼凑。
- 实现侧:修改父层级权限后,核对子层级的例外是否按声明的叠加规则生效;检查不同入口(界面、接口、导出)的判定是否一致。
反例做不到——某人能编辑一份财务文档,权限面板只显示"可编辑",无人知道这是三层之前某个群组带来的;做过头——把每个对象的完整授权推导树默认展开在共享面板上,日常共享变成阅读理解。
C2-6无权访问给出正常路径应当
一句话:让人知道该找谁要,而不是撞上一堵白墙。
适用成员可能访问到自身权限之外对象的产品。
规则成员访问无权对象时,产品应当给出可执行的下一步:说明访问被拒绝的性质、指出可申请的对象或责任主体、提供申请入口(见 collab.visibility.request.mode)。申请必须有明确的接收方与结果回执,禁止发出后无任何状态。当对象的存在本身属于受限信息时,产品可以采用不透露存在性的应答;此时禁止以模糊应答掩盖可授权而未授权的普通情形——两种应答的适用条件必须预先定义,不得逐次由实现随意决定。
边界条件本条不要求所有产品都提供访问申请功能;不提供时应当至少给出责任主体或联系路径。安全敏感场景采用不透露存在性的应答是正当的,其适用范围须被记录。
设计应用把"你没有权限"与"此内容不存在"的选择做成对象类别上的策略而不是逐条判断。申请入口里预填对象标识,让接收方不必反问"你说的是哪一份"。
验证示例
- 用户侧:点开一条同事转发的无权链接,记录用户能否在不另外发消息询问的情况下知道该找谁。
- 实现侧:核对两类应答的适用条件是否按预定义策略执行;验证申请提交后存在可查询的状态与结果回执。
反例做不到——点开链接只显示"403",既不说是谁的,也不说能不能申请;做过头——对所有无权访问一律返回"内容不存在",包括本可以一键申请的普通团队文档,导致成员反复怀疑链接发错了。
C2-7撤权覆盖在途动作与派生内容必须
一句话:门关上以后,旧页面和待发消息也不能继续放行。
适用权限可能在编辑、排队通知或外部集成运行期间变化的产品。
规则
- 撤权生效后,服务端必须拒绝受影响主体的新读取与新提交;长连接、旧页面、后台队列和重连请求必须重新核对权限。客户端保留的旧授权不得作为继续写入的凭据。
- 搜索、缩略图、评论摘录、摘要及待发送通知必须依据当前接收方权限过滤;生成时有权不代表发送时仍有权。
- 产品必须分别表达撤权已受理、机制已生效及哪些外部副本无法收回。无法确认完成时保留处理中或未知,并阻止受影响的新动作,禁止先显示“全部收回”。
- 被拒绝的本次输入必须按既定保存边界保护;恢复、导出与移交路径不得重新授予已失去的访问权。
相关配置:collab.visibility.revocation.policy。
边界条件无法远程抹除已被合法下载的副本;仍须阻断后续服务端访问,并明确本地缓存及离线访问的实际控制边界。
验证示例乙离线编辑期间撤销乙的权限,同时保留一条待发摘要;乙重连不得提交,摘要投递不得泄露内容,甲能查到撤权是否生效。
反例做不到——分享面板已显示移除成员,旧 WebSocket 仍接受其写入。做过头——为收回截图而要求管理员等待所有离线终端确认,撤权迟迟不生效。
3.3 C3 并发修改不吞输入
两个人同时改同一处,在多人产品里不是异常分支,是日常。这条原则管的是这件事发生时的裁决:策略是什么、发生前能不能看见、自动合并到哪儿为止、合不了时交给谁。冲突双方有各自的意图、权限与责任;裁决必须遵守预先声明的策略并保留贡献,不能仅用时间戳掩盖输入丢失。
C3-1并发策略事先声明并与行为一致必须
一句话:同时改会怎么样,是设计决定,不是运气。
适用同一对象可能被两名及以上成员同时修改的产品。
规则产品必须为每类可共同编辑的对象预先定义并发策略(独占锁定、先提交生效且保留被拒输入、后写覆盖并保留被覆盖内容且告知、按语义自动合并、保留双方输入交由裁决之一以上),并使实际行为与声明一致(见 collab.concurrency.policy)。任何策略下都禁止静默丢弃任一成员已被其本人认可的输入:采用先提交生效时,被拒绝的一方必须保有其内容并能重新应用;采用后写覆盖时,被覆盖的一方必须能发现差异并取回原贡献;采用自动合并时,合并结果按 C3-3 处理。策略在同一产品内因对象类型而异是允许的,但同一类对象上禁止出现不可预期的策略切换。
边界条件本条不规定应当选择哪种策略——不同内容类型的正确答案不同(结构化表单与自由文本的合适策略通常不同)。它不要求所有对象都支持同时编辑;选择独占锁定是合法策略,其要求见 C3-5。
设计应用按内容的语义而不是按技术便利决定策略:不同段落的新增通常可以合并,同一个数值字段、同一个收款方、删除与编辑的组合通常不能。短内容不天然比长内容安全——两个人同时改一个金额,比同时改两千字更危险。
验证示例
- 用户侧:让两名成员在同一对象上同时作出修改,观察结果是否与产品声明的策略一致,以及双方是否都能理解发生了什么。
- 实现侧:注入并发写入与时钟偏差,验证不出现静默丢失;核对各对象类型的实际策略与声明清单。
反例做不到——两人同时保存表单,后保存者覆盖前者,前者不知道自己的修改没了;做过头——为求稳妥对所有对象一律独占锁定,两个人连改不同段落都要排队。
C3-2正在被改的部分事先可见必须
一句话:别等我写完了才告诉我这块有人在写。
适用支持多人同时编辑同一对象的产品。
规则在已取得有效且获准呈现的占用事实时,该事实必须在其他成员开始修改该区块之前可被察觉(见 collab.concurrency.editing.indicator)。提示的定位粒度必须足以让人避开——定位到对象而不定位到区块,在长内容上不满足本条。
占用事实未知、或因隐私设置不可展示时,禁止呈现为"无人编辑";此时产品仍须以 C3-1 声明的并发策略保护输入。感知提示不构成互斥:产品若承诺"不会发生同时编辑",必须采用真实的互斥准入(见 C3-5),不得由提示推导互斥。匿名化的占用提示同样须评估可推断的身份暴露——在两人空间里,"有人正在改第三段"就是指名道姓。采用独占锁定的对象,锁定状态与持有人必须在尝试编辑前可见,禁止在用户输入完成后才告知内容已被锁定。本条呈现的是编辑活动的存在与位置,其粒度上限受 C1-3 约束。
边界条件本条不要求实时精确到字符位置;它要求的是提示出现的时机早于冲突产生。本条不要求消除传播竞态:两人几乎同时开始编辑而提示尚未传播到位,不构成本条的违反——该情形由并发策略承接。网络中断、对端信息不可得,或成员已按 C1-4 收敛自身可见性时,产品应当呈现该信息为未知而非无人编辑(见 C3-6);隐私限制下不展示占用事实是合法边界,但必须如实呈现未知并继续保护输入;不得一面不提供有效提示,一面声称“已保证避开他人的编辑”。
设计应用把提示放在编辑入口而不是内容旁边——人是先点击再输入的,提示出现在点击的位置才来得及。对表单类对象,字段级的占用提示比整表的协作者列表有用得多。
验证示例
- 用户侧:让一名成员在长文档中段编辑,另一名成员从文档顶部滚动至该处并开始输入,记录后者在何时得知该处有人在改。
- 实现侧:验证编辑活动信息的传播延迟与提示时机;核对定位粒度是否达到可避让的程度。
反例做不到——两人各写了一段,保存时才弹出"检测到冲突",此时两段都已经写完;做过头——只要有人的光标落在同一屏内就锁死输入框,正常协作被判为冲突。
C3-3自动合并有边界且结果可识别必须
一句话:合得拢不等于合得对。
适用采用自动合并策略的产品。
规则自动合并的适用范围必须按内容语义预先定义,禁止把"技术上能收敛"直接当作"业务上可合并"(见 collab.concurrency.merge.scope)。落在自动合并范围内的变更,其合并结果必须能被识别为合并产物:参与合并的各方必须能看出结果与自己提交的内容有何差异,并能更正(见 C3-4)。自动合并必须定义业务风险单元与可检测的不相容组合:同一原子值的并发修改、删除与依赖该内容的编辑、以及已定义的关联字段组,禁止未经既定裁决直接提交为权威结果。自由文本若不能可靠判定语义不相容,产品必须保留各方的原始贡献、使合并差异可被发现,并按用途在正式发布或提交之前进行相称的核对;禁止承诺"自动保证所有语义正确"。
"最终句子不是任何一方单独写过的"本身不构成违例——多人协作的正常产物往往就是新组合;本条禁止的是产生新的有害业务含义且未经裁决即成为权威结果。合并的发生必须被记录并可追溯到各方的原始贡献(见 C4-3)。
边界条件本条不要求把每次合并都呈现给用户确认——那会使实时协同编辑无法使用。它要求的是合并结果可被事后识别与更正,以及高风险组合被排除在自动范围之外。收敛性算法保证的是各副本最终一致,它不保证一致的那个结果是任何一方想要的,这一区别不得在产品文案中被混淆。
设计应用把自动合并范围写成一份显式清单(可合并:不同段落的新增、不同字段的填写、两人分别补充不同的背景事实而组合成此前无人完整写过的一段话;不可自动合并:同一原子值的并发修改、删除与编辑的组合、有依赖关系的字段组)。配置记录含对象类型、风险单元、检测依据、允许的组合、清单外的处理路径、正式生效点与验证用例。给合并产物一个可回看的差异视图,而不只是一条"已同步"。
验证示例
- 用户侧:构造两人分别修改同一句话不同部分的场景,检查结果是否成为一句谁都没写过的话,以及双方能否发现。
- 实现侧:核对自动合并范围清单与实际合并行为;验证合并记录能还原各方原始贡献。
反例做不到——两人分别把"下周三上线"改成"下周五上线"和"本周三上线",系统合并出"本周五上线"并显示同步完成;做过头——任何两人先后编辑同一文档都进入人工合并界面,实时协作退化为逐次审批。
C3-4冲突交给能裁决的人必须
一句话:冲突不该由最后一个提交的倒霉蛋独自决定。
适用可能产生需要人工裁决的冲突的产品。
规则无法自动裁决的冲突必须保留各方内容,并交由对该内容有权限且有责任的主体处理(见 collab.concurrency.arbiter)。禁止默认把裁决责任分配给最后一个提交的人,除非该人正是责任主体;裁决者不具备判断依据时(不了解另一方的意图、无权查看另一方的内容),产品必须提供联系或转交路径,而不是要求其在无依据的情况下二选一。裁决结果必须让被影响的各方可知,禁止让贡献被否决的一方在无告知的情况下发现自己的内容消失。冲突处于待裁决状态期间,各方内容必须均可访问,不得只保留其中一份。
边界条件本条不要求产品实现审批流程或指派仲裁人;在无明确责任主体的对象上,把裁决交给发起方并同时告知另一方是可接受的。它禁止的是把裁决伪装成一次普通的保存冲突提示。
设计应用把裁决界面做成"两份内容并列 + 各自作者 + 可联系",而不是"保留我的/保留他的"两个按钮——后者在裁决者不了解对方意图时是无效选择。责任主体的解析见 C5-1。
验证示例
- 用户侧:制造一次真实冲突,观察裁决界面出现在谁那里、他是否具备作出选择的信息、另一方在多久之后得知结果。
- 实现侧:核对裁决者的解析规则与责任主体字段是否一致;验证待裁决期间双方内容均可取回。
反例做不到——实习生最后一个保存,系统弹出"保留你的内容还是服务器内容",他选了自己的,架构师两小时的修改就此消失且无人被告知;做过头——每次冲突都强制走一轮跨部门确认,简单的文字冲突要等两天。
C3-5独占锁定有持有人有期限必须
一句话:锁上的人下班了,文件不能就此锁死。
适用采用独占锁定或签出机制的产品。
规则每一个锁必须有可见的持有人、获取时间与有效期(见 collab.concurrency.lock.ttl)。禁止存在无期限且无解除路径的锁:产品必须提供至少一条强制解除路径,其触发条件(超时、持有人离线、责任主体或管理员操作)必须预先定义并对成员可知。强制解除不得删除已经持久化的草稿或主动清空持有人的本地输入。产品必须说明草稿保存的位置、保留边界与取回条件;仅存于离线终端的输入不得被宣称已由服务器备份。持有人重连后先验证当前编辑权与锁凭据,再把原输入作为待处理草稿恢复,禁止以过期锁覆盖他人成果。取回仍受当前权限约束,撤权后不得借恢复草稿重新读取受限源内容。锁的获取与解除必须被记录并可追溯。持有人所在账号被停用或移出(见 C5-3)时,其持有的锁必须进入可解除状态。
边界条件本条不要求锁具备短超时——长有效期在某些工作流中是正确的;它要求期限存在、可见且有解除路径。它不适用于毫秒级的内部并发控制,只适用于对用户可见、会阻止他人工作的锁定状态。
设计应用把"谁锁的、什么时候锁的、还剩多久、怎么联系他"四件事放在同一处呈现。解除前提示影响;可连接时通知持有人,离线时保留可查事件。在权限允许范围内保留已保存的私有草稿,不能声称已取回只存在于离线终端的内容。
验证示例
- 用户侧:让持有人在锁定状态下关机,观察其他成员在多久之后能继续工作,以及需要走什么路径。
- 实现侧:执行强制解除后,核对原持有人在权限允许范围内取回已保存草稿;检查离线终端未备份输入的限制已说明;核对锁记录的完整性。
反例做不到——同事签出了一份设计源文件然后休了两周年假,团队只能新建一份副本重来;做过头——锁在五分钟无操作后自动释放,正在思考的人一回神发现内容已被别人改了。
C3-6收敛承诺与他人可见分开表述应当
一句话:"我看到的是最新的"和"我改的别人看到了"是两件事。
适用存在同步延迟或离线编辑能力的多人产品。
规则产品应当分别表达入站(本人所见是否已包含他人的最新变更)与出站(本人的变更是否已持久化、是否已被服务端接受、是否已分发到目标范围)这两组状态,不以单一的"已同步"同时承担两者(见 collab.concurrency.convergence.presentation)。本人的提交被接受不证明本人已收到他人的并发或较早变更——这两件事由不同证据支撑。各维度均须有"未知"与"失效"语义;对端接收回执只能证明相应客户端接收,禁止据此表述为“所有人都已看到”。本人的查看证据仅按 C1-5 获准的记录提供,不从分发回执推断。某次同步的对象快照、更新时间、回执与目标成员集合是运行事实,不由配置写入。他人变更不可得时(网络中断、对端离线),禁止把此状态呈现为无人编辑或内容为最新(见 C3-2)。离线期间作出的修改在重新连接时的处理方式必须与 C3-1 声明的策略一致,且禁止把离线期间未见到的他人变更静默覆盖。
边界条件本条不要求为每次按键呈现两种状态;聚合到区块级或会话级是可接受的。它不要求给出延迟的具体数值承诺——那由产品按其架构测定并记录依据。"收敛"是各副本执行同一组操作后最终一致这一技术性质,不是任何人已经读到的保证,两者不得在文案中混用。
设计应用给"未连接"设计一个明确的编辑态提示,而不是让界面看起来一切正常。重新连接后,把"你离线期间他人做了什么"作为一次可回看的呈现,而不是直接把结果合并进来了事。
验证示例
- 用户侧:断网后继续编辑,恢复连接,记录用户能否说出哪些是自己的改动、哪些是别人在这期间的改动。
- 实现侧:验证断连状态下的编辑活动指示不呈现为"无人编辑";核对离线变更的合并路径与声明策略一致。
反例做不到——离线两小时后重连,界面只显示"已同步",用户不知道自己覆盖了别人的三处修改;做过头——每一次微小延迟都弹出同步状态提示,编辑过程被状态条淹没。
3.4 C4 个人操作有明确作用范围
在单人产品里,一次操作的后果只落在操作者自己身上;在共享空间里,同一个动作有别人在承受。这条原则管的是一个人的一次操作在共享对象上产生的效果、这个效果的边界,以及它归谁。本领域最容易做错的一条在这里:撤销在单人产品里等于"回到上一个状态",在多人产品里这个等式不成立——上一个状态里有别人的工作。
C4-1撤销撤的是自己那一步必须
一句话:撤销是"撤销我做的",不是"撤销最后一步"。
适用在共享对象上提供撤销能力的产品。
规则共享对象上的撤销必须解析为撤销执行撤销的这名成员在该对象上的上一步(或指定的某一步)操作,禁止实现为回退该对象的全局最后一次变更(见 collab.action.undo.scope)。撤销必须选中执行者本人在已声明撤销上下文中的贡献,禁止选中他人的全局最近变更;实现方式不限——按成员隔离的撤销历史、按操作来源过滤或等价机制均可,本条不规定数据结构或存储键。产品必须预先声明"本人"这一操作来源的边界:同一成员的多个标签页、代为执行的操作与 Agent 后续改写各自是否计入。撤销的作用对象与作用范围必须在执行前可解析。当本人没有可撤销的操作时,撤销必须无效果并如实说明,禁止改为撤销他人的最近变更。
边界条件本条不规定撤销栈的深度,也不要求撤销跨会话保持。它不排除产品另行提供"回退到某个历史快照"的能力——那是历史恢复,不是撤销,两者禁止共用同一入口与同一快捷键。本人的某一步无法在不影响他人的前提下单独撤销时,按 C4-2 处理。
设计应用先写清"什么算本人的这一步"——是按成员、按会话、还是按操作来源过滤;这是本条在实现上的核心,具体用哪种机制由产品决定。对结构性操作(移动、重排、批量指派),要能回答"撤销它会把哪些人的后续动作一起带走",答不出来就先按 C4-2 呈现范围。
验证示例
- 用户侧:成员甲作出一次编辑,成员乙随后在同一对象作出编辑,然后甲按撤销,检查被撤销的是甲的编辑还是乙的编辑。
- 实现侧:核对撤销的选择规则是否以执行者本人的贡献为对象、上下文边界是否已声明;验证无自身可撤销操作时的行为是"无效果并说明"。另构造甲乙交错编辑、本人无历史、同一人两个标签页、代为执行、Agent 后续改写五种情形,逐一核对取回结果。
反例做不到——新人在共享白板上按了两次撤销,把资深同事刚画完的整块流程图撤没了,而且没人知道是谁干的;做过头——为了绝对不影响他人,任何在他人有后续操作之后的撤销一律禁止,用户连自己刚打错的字都退不回去。
C4-2撤销不静默回退他人成果必须
一句话:要连别人的改动一起退,先说清楚再退。
适用共享对象上的撤销可能影响他人后续变更的产品。
规则当本人的某一步操作与他人的后续变更存在依赖,使得撤销该步必然影响他人变更时,产品必须在执行前说明将被影响的范围(涉及哪些变更、来自哪些成员),并取得执行者的确认;禁止静默连带回退(见 collab.action.undo.cascade)。发生连带回退后,被影响成员必须能获知这一事实并取回其被回退的内容。产品选择不支持此类撤销时,必须如实说明不支持的原因与可行的替代路径,禁止表现为已撤销但实际未生效。
边界条件仅在撤销目标存在他人后续依赖、或无法排除该依赖时提示影响;不能以对象曾有他人编辑为由拦截所有撤销。没有连带影响时直接执行。实现不能安全撤销时,保留当前成果并提供更正或取回路径,不要求采用某种依赖分析算法。
设计应用把提示写成后果而不是术语——"撤销这一步会同时移除李四之后添加的两条评论",而不是"存在依赖冲突"。被回退方的取回入口应当出现在其自己的变更记录里,而不是要求其到回收站里翻找。
验证示例
- 用户侧:构造甲的操作被乙的后续操作依赖的场景,让甲执行撤销,检查提示是否说明了影响范围,乙是否得知。
- 实现侧:验证连带回退的内容可由被影响成员取回;核对无他人后续变更时不产生多余确认。
反例做不到——撤销一次表格结构调整,把别人在新列里填的二十行数据一并清空,界面只显示"已撤销";做过头——只要对象上有过任何他人操作,每次撤销都弹出一段冗长的影响分析让用户勾选确认。
C4-3每次变更有可解析的作者必须
一句话:这行字是谁写的、是人写的还是 Agent 写的,查得到。
适用多名成员可修改同一对象的产品。
规则共享对象上的每一次变更必须可解析到作者主体,并在声明的保留期内可查(见 collab.record.authorship、collab.record.retention.ttl)。作者主体必须区分至少三类:成员本人操作、由他人代为执行的操作(代理、模拟登录、管理员代操作)、由自动化或 Agent 执行的操作;自动化或 Agent 产物必须标示其执行来源,代为执行的操作必须同时记录实际执行者与被代表者。作者的主体归属禁止在责任交接、成员改名或账号停用时被改写(见 C5-4)。保留期届满后不再可查是允许的,但该期限必须预先声明,不得表现为"从未记录"。
边界条件本条不要求向所有成员展示完整变更历史——查看历史的权限按 C2 判定。它不要求记录每一次按键:记录的粒度应当与撤销单位和裁决需要相称,与 C1-3 的感知粒度上限并行适用(变更记录是给内容用的,不是给评价人用的,用途约束见 C1-6)。
设计应用把"某某(通过自动化)"和"某某(由管理员代操作)"做成与普通署名可区分的呈现,而不是都显示成同一个名字——事后追查时,这个区别常常就是全部问题所在。
验证示例
- 用户侧:让管理员代某成员执行一次修改,检查其他成员看到的作者是谁,能否看出这是代操作。
- 实现侧:核对三类作者主体是否分别记录;验证成员改名或停用后历史作者的主体归属未被改写。
反例做不到——集成机器人以某个共用账号的名义批量修改了两百条记录,历史里全部显示为该账号,无从知道是哪次自动化触发的;做过头——把每一次光标移动与选中都写入变更历史,历史面板长到无法使用(这同时违反 C1-3)。
C4-4作用范围在执行前显式必须
一句话:按下去之前就知道这是改我自己的还是改所有人的。
适用存在不同成员作用范围的操作的产品。
规则一次操作是仅对本人、指定成员还是全体成员生效,必须在执行前可被操作者知道(见 collab.action.effect.scope)。共享视图与个人视图的默认归属必须显式定义:改变筛选、排序、分组、折叠、显示密度、列宽等呈现状态时,产品必须明确该改动落在何处,禁止让两类改动共用同一入口而结果不同(个人状态的默认归属见 C6-3)。影响全体的结构性操作(重命名、移动、改变层级、批量修改、套用模板、变更工作流状态)必须在执行前给出其作用对象数量与影响范围。禁止以"操作后可撤销"为由省略作用范围的说明——撤销在多人场景下不是无代价的(见 C4-2)。
边界条件本条不要求为每次操作弹出确认;说明可以是入口处的常驻标识("正在编辑共享视图"),确认的分级要求见 C4-5。它不要求列出受影响的全部对象,给出数量与类别即可。
设计应用把"共享视图"与"我的视图"做成两个可见的、始终显示当前所在位置的状态,而不是一个隐藏在菜单深处的开关——大部分误改共享视图的事故,都是因为人不知道自己此刻在哪一边。
验证示例
- 用户侧:让成员在看板上调整筛选条件,记录他是否知道其他人的看板是否也变了,以及他从哪里得知。
- 实现侧:核对每类呈现状态的归属定义与实际存储位置一致;验证结构性操作在执行前给出影响数量。
反例做不到——成员为了找一张卡片改了筛选器,全组三十个人的看板一起变了,他自己也不知道;做过头——每次调整列宽都弹窗询问"这次改动应用于你自己还是所有人"。
C4-5共享对象的破坏性操作加严必须
一句话:删自己的东西和删大家的东西,不是一回事。
适用允许删除、归档或使他人正在使用的对象失效的产品。
规则破坏性操作的后果分级必须把该对象是否对他人可见、是否被他人引用、是否有他人正在其中工作作为分级输入(见 collab.action.destructive.level)。删除或归档存在他人贡献的对象时,必须在执行前说明将影响到哪些成员的内容;禁止把他人的贡献随对象一并不可恢复地移除而不给出该贡献的保留或导出路径。被删除对象的引用方(链接、嵌入、任务依赖)必须能得知该对象已不可用,禁止呈现为空白或静默失效。对他人正在编辑的对象执行删除,必须先向可连接的编辑界面呈现失效提示并保护输入;未确认界面送达的会话必须停止接受其后续共享写入,重连时先核对状态再继续。送达不证明本人已经阅读;紧急撤权不等待用户确认。
边界条件本条不要求禁止删除共享对象,也不要求所有删除都走审批。它不改变对无他人贡献、无他人引用对象的一般处理。数据保留与合规删除请求(如个人信息删除)按其自身规则执行,其与本条的"贡献保留"冲突时以适用法规为准。
设计应用把"这份文档里有三位同事的十七条评论"写进删除确认,比"此操作不可撤销"有用得多。给引用方一个明确的失效呈现("所引用的内容已被删除"),而不是让链接静默失活。
验证示例
- 用户侧:删除一份有多人评论与他人引用的文档,检查删除者是否被告知影响范围,评论者与引用方是否得知。
- 实现侧:核对分级输入是否包含可见性、引用与在线编辑状态;验证他人贡献存在可取回路径。
反例做不到——项目归档时连同五名成员的全部讨论一并清除,成员事后既收不到通知也找不回内容;做过头——删除任何一条自己刚建的空白卡片都要求填写理由并等待管理员审批。
C4-6批量操作不产生等量打扰应当
一句话:改一百条不等于给人发一百条通知。
适用提供批量操作且操作会产生对他人的提醒的产品。
规则一次批量操作对每位受影响成员产生的提醒应当被聚合为可理解的整体,而不是按受影响对象数量逐条发出(见 collab.action.batch.notice)。聚合后的提醒仍必须让接收者看出与自己相关的具体项,禁止聚合到"有 47 项更新"这种无法判断是否需要处理的程度。禁止把提醒的产生作为操作的静默副作用:执行批量指派、批量状态变更、批量 @ 时,操作者应当在执行前知道这次操作会打扰到哪些人(见 C4-4)。
边界条件本条不要求抑制个别关键提醒(如被指派了需要立即处理的任务);紧急例外必须预先定义事件条件、可触发的主体与接收方知情方式。它不禁止提供"不通知本次变更"的选项,但该选项不得成为规避 C2-2 范围变更告知的手段。
设计应用把"这次操作将通知 12 人"放在批量操作的确认里。给受影响者的聚合提醒保留可展开的明细,让人能在一屏内判断哪些需要自己动手。
验证示例
- 用户侧:批量把三十张卡片指派给同一人,记录该人收到几条提醒、能否快速看出哪些需要今天处理。
- 实现侧:核对批量路径是否复用了单条操作的提醒逻辑;验证聚合后的提醒仍包含可判断的明细。
反例做不到——批量调整三十张卡片的截止日期,被指派人收到三十条推送;做过头——把所有变更都聚合成每日一条摘要,紧急指派也要等到第二天早上。
C4-7重复与部分成功有独立结果必须
一句话:没收到回执,不等于没做过;做了一部分,要说清哪部分。
适用发送评论、邀请、批量修改、责任转移等可能重试或部分完成的协作操作。
规则
- 系统必须区分操作请求、实际生效和结果回执。超时或回执丢失不得直接解释为未执行;查询到实际结果后才能判定成功或失败。
- 重复提交同一操作必须识别其操作标识,或以等效机制防止重复评论、重复邀请、重复责任转移等副作用。结果未知且不能证明安全重试时,必须提供核对或人工处理入口,禁止自动整批重放。
- 批量操作必须按对象记录成功、失败、未执行与未知,展示有权查看的明细;部分完成不得呈现为全部成功。重试仅处理已确认可重试的项,并重新核对当前权限及对象快照。
- 同一业务事件的多通道提醒必须关联到同一事件,失败后的补发不得绕过接收方的静音和投递权限。
相关配置:collab.action.retry.policy、collab.action.delivery.policy。
边界条件本条不要求跨所有系统实现绝对一次投递;要求重复可识别、结果不虚报、未知不盲重试。
验证示例批量改派十项,三项成功后断连;重试前查询各项结果,成功项不重复改派或通知,未知项继续核对。
反例做不到——用户见“发送失败”再点一次,评论和邮件各出现两份。做过头——网络稍有延迟就禁止所有协作操作且不提供查结果入口。
3.5 C5 责任有归属且可交接
参与不等于负责。一份文档有八个协作者,不回答"这件事现在归谁";一张任务卡上有五个关注者,不回答"谁在推进它"。这条原则管的是责任与决定的归属,包括讨论结束是否形成有效决定;责任主体这个字段:它必须存在、必须有答案(包括"无人负责"这个合法答案)、必须能在人之间转移,并且必须在人离开时有明确去向。它不管组织怎么分工——那是管理制度,不在本规范范围内;它管的是产品里的责任表达不制造出无人负责却看不出来的状态。
C5-1当前责任主体可解析必须
一句话:参与者名单不回答"现在归谁"。
适用存在需要有人推进或维护的对象(任务、审批、内容、空间)的产品。
规则每一个需要有人负责的对象在任何时刻必须能解析出其当前责任主体,或明确解析为无人负责(见 collab.ownership.assignee)。禁止以参与者列表、关注者列表、最近编辑者或创建者代替责任主体。"无人负责"必须是一个可被查询与呈现的显式状态,不得表现为字段为空且无人可见。责任主体为群组时,必须说明该群组内的认领规则(先到先得、轮值、需指定之一以上),否则群组责任等同于无人负责。对象的责任主体与其可见范围是两个维度,禁止相互推定(能看见不等于负责,负责不等于能看见全部)。
边界条件本条不要求所有对象都有责任主体——纯参考性内容记为不适用即可。它不规定责任主体的数量上限,但多主体时必须能回答"其中谁的动作构成推进"。
设计应用把"未指派"做成一个可被筛选、可被统计的正常状态,而不是一个空白。定期让"无人负责且长期未变更"的对象浮现出来——这类对象是协作系统里最常见的静默失效。
验证示例
- 用户侧:随机取二十个进行中的任务,让团队说出各自的当前责任人,记录答案不一致或答不出的比例。
- 实现侧:核对责任主体字段是否独立于参与者与创建者;验证"无人负责"可被查询与筛选。
反例做不到——任务卡上有六个头像,谁都以为别人在做,两周后无人推进也没人发现;做过头——要求每个文档、每条评论都必须指定一名责任人才能创建。
C5-2交接是双方事件必须
一句话:派下去不等于接下来。
适用允许把责任从一个主体转移到另一个主体的产品。
规则责任转移必须记录接收方的知悉证据与当前责任的实际生效状态,禁止把单方面的指派动作直接呈现为交接已完成(见 collab.ownership.handoff.mode)。产品必须分别表达四个事实维度:已发起/已送达或可访问/知悉证据状态/是否已承接。送达、客户端展示、阅读回执、本人确认与承接是不同的证据,不得互相代替:未取得有效知悉证据时显示"知悉情况未知",禁止据此断言"尚未查看";已知悉也不自动等于已承接。采用不需要接收方确认的指派模型时,必须预先定义责任生效规则,并使"知悉情况未知"可被发起方与责任查询者看到。阅读记录被关闭时(见 C1-5),可由与该次交接绑定的显式确认或履行行为证明承接,禁止为此重建通用的已读记录。接收方拒绝或长时间未取得知悉证据时,责任必须回到明确状态(退回发起方、回到无人负责或按预定义规则转交),禁止停留在既不属于发起方也不属于接收方的悬空状态;该回落要求适用于全部指派模型,含单方指派。拒绝、撤销、被再次改派、到期回落、重复确认与针对已失效请求的确认,其各自的效果必须预先声明;责任的解除只按当前有效的交接请求标识判断,针对已被改派请求的确认不承接新责任。采用需承接的模型时,承接前保留原责任或明确的临时责任人;采用单方指派时按预先声明的时点转移责任,但不得把该生效事实表述为接收方已知悉或已承接。
边界条件本条不要求实现确认式指派——很多团队的工作方式不适合逐次确认;它要求的是知悉证据不足不能被隐藏,也不能被改写成未查看。系统按规则自动分配(轮询、负载均衡)时,同样适用知悉要求。
设计应用把指派后的默认呈现从"已指派给李四"改成"已指派给李四 · 知悉情况未知"——不要写成"尚未查看":没有回执只说明产品没有拿到证据,不说明人没看。
验证示例
- 用户侧:把一个任务指派给一位当天休假的成员,观察发起方在界面上看到的状态,以及一周后该任务的归属。
- 实现侧:核对四种状态是否分别存储与呈现;验证长时间未取得知悉证据时的回落规则确实执行。另构造:关闭已读记录后从通知获取任务、明确承接、过期后承接、两人同时改派、被停用后确认——任一缺回执的情形都不得显示"尚未查看",针对已失效请求的确认不得接受新责任。
反例做不到——把任务指派给已经离职半个月的同事,看板上一直显示"进行中 · 负责人张三";做过头——每次指派都要求接收方点确认,接收方在开会时任务就一直卡在待确认。
C5-3离开与移交对称必须
一句话:人走了,他名下的东西不能就地失联。
适用成员可能退出、被移除或账号被停用的产品。
规则成员退出、被移除或账号停用时,其名下的责任、内容与权限必须各自有明确去向:转移给指定主体、转为组织或空间所有、归档、或明确记为无主(见 collab.ownership.offboarding)。禁止在成员消失后使其名下内容不可访问且无处置路径,也禁止由系统静默把所有权转给某个未被告知的主体。处置必须可被查明:谁在何时把哪些对象转给了谁,须在保留期内可查(见 C5-4)。成员被移除时其持有的锁必须进入可解除状态(见 C3-5),其未完成的交接按 C5-2 的回落规则处理。权限终止不得以移交完成为前提;失败对象进入受限且可查询的保管状态,由明确责任人处理。成员本人产生的、属于其个人的内容(私人草稿、私人笔记)与属于共享空间的内容必须分别处置,前者的默认处置不得是并入共享空间(见 C6-1)。
边界条件本条不规定处置的具体归属——那由组织策略与适用法规决定;它要求处置路径存在、被执行且可查。它不豁免个人信息删除等法定义务;这些义务与"内容保留"冲突时,以适用法规为准,冲突的存在应当在产品文档中说明。
设计应用把离开流程做成一份清单而不是一个删除按钮:名下责任 N 项、独占持有 M 项、私人内容 K 项,逐类给出处置选项。正常退出时预先检查可处置的对象;紧急撤权先终止访问。移交失败时保留受限保管状态、处理责任人与下一步,不扩大私人内容受众。
验证示例
- 用户侧:停用一个持有多项任务、多个独占锁与若干私人草稿的账号,检查每一类的实际去向与是否可被查明。
- 实现侧:核对处置记录的完整性;验证移除后不存在既不可访问又无处置入口的对象。
反例做不到——同事离职,他建的十几个共享文档变成无所有者状态,谁都改不了权限也删不掉;做过头——成员一被移出项目组,其全部历史评论与变更记录一并删除,讨论上下文消失。
C5-4责任变更不改写历史归属必须
一句话:换了负责人,以前是谁写的还是谁写的。
适用记录变更历史或贡献归属的产品。
规则责任主体变更、成员改名、账号合并或停用时,已发生变更的作者归属禁止被改写为新的责任主体(见 C4-3、collab.record.authorship)。历史记录中的成员标识在其显示名变化后应当解析到同一主体,但禁止把一个人的历史贡献重新署名给另一个人。因法定删除请求或组织策略必须移除历史中的个人标识时,处置方式必须是明确的匿名化或移除,并使该处置本身可被识别,禁止以替换为他人姓名的方式实现。责任交接的时点必须可查,使"这次变更发生在谁负责期间"可以被回答。
边界条件本条不要求永久保留历史——保留期按 collab.record.retention.ttl 声明。它不禁止在界面上突出当前责任主体,只禁止用当前责任主体覆盖历史作者。
设计应用把成员标识与显示名分开存储,这是本条在实现上的前提。给"该成员已离开"设计一个专门的历史呈现,而不是把名字换成空白或换成接手人。
验证示例
- 用户侧:把一个有多人历史贡献的任务转交给新负责人,检查历史记录中此前各次变更的作者是否仍为原作者。
- 实现侧:执行成员改名、账号停用与责任交接后,逐一核对历史作者字段;验证匿名化处置可被识别。
反例做不到——任务转交后,历史里之前所有操作的执行人都显示成了新负责人,追责时完全失真;做过头——为保历史完整,离职成员的姓名与联系方式在系统内永久保留且无任何处置路径,与个人信息处理要求冲突。
C5-5外部与临时成员的边界显式应当
一句话:访客什么时候到期,到期后他留下的东西归谁。
适用允许组织外成员、访客或临时权限参与协作的产品。
规则外部与临时成员的参与范围、有效期与到期后的处置应当在授予时被显式定义(见 collab.ownership.guest.policy)。临时权限必须有明确到期点;长期外部授权必须有复核责任人与复核周期。到期或退出后,其此前产生的内容与其对共享内容的贡献必须有明确归属(保留并标注来源、转为组织所有、或按约定移除),且该归属对内部成员可知。外部成员在场时,产品应当使内部成员可察觉该事实——在有外部参与者的空间里,内部成员对"谁能看到这句话"的判断会系统性偏乐观。
边界条件本条不要求区分所有成员类别;不区分内外的产品记为不适用。它不规定有效期的长度——由产品与组织按其风险测定并记录依据。本条内部的强度不一:"临时权限到期、长期外部授权复核"与"贡献归属须明确"是不可关闭的底线;"外部参与对内部成员可察觉"是应当级,确有理由偏离时记录理由与替代做法。长期的外部合作身份不因被归入外部主体而一律按临时访客处理——其期限与复核方式按其实际关系声明。
设计应用把外部参与者的标识做成持续可见的呈现(而不只是在成员列表里的一个小标签),尤其在评论、提及与通知的上下文里。到期前给责任主体一次续期或处置的机会,而不是到期直接失联。
验证示例
- 用户侧:邀请一名外部访客加入一个讨论,让内部成员回答"现在这个讨论有谁能看到",记录答对的比例。
- 实现侧:核对临时权限是否存在有效期与复核;验证到期后其内容的归属按声明执行。
反例做不到——两年前一次外部评审临时开的账号至今有效,仍能打开当时那批文档的当前内容;做过头——外部成员每次发言前都要求内部成员确认,评审会开不下去。
C5-6讨论、解决与决定分别留痕必须
一句话:结束讨论不等于大家同意,批准只覆盖当时的内容。
适用提供评论线程、建议、评审、投票或共同决策的产品。
规则
- 评论必须绑定稳定的对象和内容锚点;锚点失效时保留原有上下文或明确标注无法定位,禁止静默挂到其他内容。保留与取回受当前访问权限约束。
- 线程必须区分开放、已解决、重新打开、被删除或受限;解决动作必须可追溯到操作者及时间,有权成员必须有重开或提出异议的路径。解决不删除分歧,也不自动证明所有参与者同意。
- 当批准、投票或确认将触发后续执行时,产品必须定义有资格的决定者、所需条件、所针对的对象快照与范围;无回复、已读、点赞和关闭线程禁止被自行换算成批准。若表态本身就是正式投票,必须在参与前明确其含义。
- 批准后其覆盖内容或关键条件改变时,必须按预先定义的失效条件重新核验;过期决定不能自动批准新增内容。自动摘要必须标识来源、保留未决事项,且不得把少数意见改写成一致同意。
相关配置:collab.ownership.discussion.policy、collab.ownership.decision.policy。
边界条件不要求所有讨论走投票或审批;普通聊天无需设置决策门槛。需要正式决定时才启用相应规则。
验证示例乙对某段提出异议后甲删除该段,线程仍能说明原目标;甲标记解决不显示全员同意;批准后改动关键内容须重新核验。
反例做不到——任务讨论的三个点赞被自动记为三人批准,原反对意见从摘要消失。做过头——修正一个错字也需要所有评论者重新签字。
3.6 C6 共享空间里有私人余地
如果一个人敲下的每一个字立刻对全组可见,他就不会去尝试。这条原则管的是共享工作区里属于个人的那部分状态:还没写完的草稿、还没想好的评论、只想给自己看的筛选条件、以及那句"我先试一下"。它规定这些状态什么时候开始对别人可见,以及成员如何控制自己的注意力、跟随行为和参与范围。它与 C4 的差别在规范对象:C4 管我的操作对别人产生了什么效果,C6 管我的状态什么时候开始被别人看见。
C6-1未定稿默认不外发必须
一句话:没写完的东西,别人不该已经看见了。
适用提供内容创作、评论或提交能力的多人产品。
规则未完成的输入必须默认只对本人可见:草稿、未发送的评论、未提交的编辑、未发布的更改(见 collab.private.draft.default)。从未定稿转为共享可见必须是一次显式动作,禁止以自动保存、失焦、超时或页面关闭作为发布动作。产品提供实时协同编辑(内容随输入即时对他人可见)时,该性质必须在进入编辑前可被知道,且必须存在至少一条产出未定稿内容的路径。"私人未定稿"的判据是内容的实际访问范围仅限作者本人:建议、分支或副本只有在其访问范围确实仅作者时才满足本条;共享的建议模式满足"不直接改变正式内容"的需求,不满足私人草稿的需求——它对所有者可见,且可被接受或拒绝。未定稿内容禁止进入面向他人的搜索、通知、摘要与导出(见 C2-4)。
输入保留:产品必须声明私人草稿的保存位置与恢复边界;页面切换、发布失败或权限变化不得主动清空已保存输入。无法持久保存时,必须在离开编辑前提示风险并提供受权限约束的保留路径,禁止用“已保存”掩盖保存失败。
边界条件本条不否定实时协同编辑——它是这类产品的核心价值;它要求的是这一性质被知道,并且不是唯一可用的方式。协作过程中他人可见的编辑活动指示(C3-2)不属于本条所指的内容外发。
设计应用把"草稿"与"已发布"做成内容自身的状态而不是两个不同的存放位置——放在不同位置会导致人把草稿留在原地忘记发布。对评论这类高频未定稿,保留跨会话的本地草稿,并明确它没有被发出去。
验证示例
- 用户侧:在评论框输入一半后关闭页面,检查该内容是否已对他人可见,以及重新打开时是否还在。
- 实现侧:核对未定稿内容是否被排除在搜索索引、通知摘要与导出之外;验证不存在以超时或失焦触发的发布路径。用两个账户逐一检查建议、分支、副本、通知、搜索与导出六条路径:在一个账户写入未发布内容后,另一账户不得由任一路径取得该内容。另取一项可撤销的共享筛选操作,核对它未被判为合格的探索路径。
反例做不到——评论框内容随输入实时对全组可见,一句话说了三遍改了两次全被人看在眼里;做过头——所有编辑都必须先写在私有草稿里再手动发布,实时协作能力形同虚设。
C6-2探索性操作有不影响他人的路径必须
一句话:想试一下,不必先惊动所有人。
适用共享对象上的修改会立即对他人生效的产品。
规则产品必须提供至少一条在共享对象上进行探索性修改而不立即影响他人的路径:个人视图、建议模式、分支或副本、沙盒或预览之一以上(见 collab.private.sandbox.mode)。禁止把"直接修改共享态"作为尝试某个改动的唯一可行方式。路径是否合格,按它是否产生他人可见的内容、通知或共享状态变化分别验证;"该操作可被完全撤销"不构成合格的探索路径——可撤销的共享筛选或结构变更在撤销之前已经改变了别人所见。探索性修改转为对他人生效必须是显式动作;探索被放弃时,禁止留下部分生效的结果。探索路径本身的存在必须在共享对象的编辑入口处可被发现,禁止只存在于文档中而在界面上无迹可寻。
边界条件本条不要求实现分支与合并——对多数产品,一个仅自己可见的预览即可满足要求;建议模式只有内容、活动通知和共享状态都不向他人暴露时才满足。它不适用于结构上不可能有私有中间态的对象(如已明确即时公开的实时投票结果),此类对象记为不适用并说明理由。
设计应用按修改的代价选择路径:改一个数字用个人预览就够,改一套模板或一个工作流需要副本。把探索路径的入口放在编辑入口旁边——放进菜单第三层等于没有。
验证示例
- 用户侧:让成员尝试"看看把这一列去掉是什么效果",记录他实际采用了什么方式、是否影响了别人。
- 实现侧:验证探索性修改在放弃后不残留部分结果;核对探索路径的入口可发现性。
反例做不到——想看看换个分组方式好不好看,只能直接改共享看板,改完发现不好又改回来,全组的界面跳了两次;做过头——任何修改都必须先建分支再发起合并请求,改一个错别字要走三步。
C6-3个人视图不改变他人所见必须
一句话:我折叠了一列,不该把别人的屏幕也折了。
适用提供筛选、排序、分组、折叠、缩放或显示密度等呈现控制的多人产品。
规则成员对呈现状态的调整必须默认只作用于其本人(见 collab.private.view.ownership)。改变共享呈现状态必须是与个人调整可区分的显式动作,并按 C4-4 在执行前说明其作用范围。共享呈现状态被改变时,正在查看该视图的其他成员必须能察觉发生了变化,禁止让他人的界面在无任何提示的情况下改变。产品同时提供个人视图与共享视图时,当前所处的视图必须持续可见(见 C4-4 的设计应用)。
边界条件本条不禁止提供共享视图——共享视图在多数团队工具中是必要的;它规定的是默认归属与切换的显式性。因数据本身变化导致的呈现变化(新增了一条记录)不属于本条所指的呈现状态改变。
设计应用把"共享视图"设为需要主动进入的模式,把个人调整设为默认——反过来做的产品,每一次误操作都会波及全组。给共享视图的改动加上作者与时间,让人知道界面为什么变了。
验证示例
- 用户侧:让一名成员调整筛选条件,检查其他成员的界面是否变化;若变化,检查他们是否能看出原因。
- 实现侧:核对每类呈现状态的存储位置(个人级或共享级)与声明一致;验证共享视图变更对在线查看者产生可察觉的呈现。
反例做不到——成员为找一条记录设了个筛选,全组看板同时被筛掉了大半,别人以为数据丢了;做过头——完全不提供共享视图,每次会议前所有人都要手动把筛选条件调成一样。
C6-4私人区与共享区的转移显式且不可假装撤回必须
一句话:撤回删得掉内容,删不掉"已经被看见"。
适用提供撤回、删除已发送内容或从共享区移回私人区能力的产品。
规则内容从私人状态转入共享状态是一次显式动作(见 C6-1);反向转移——撤回、删除已发送内容、从共享区移回私人区——必须如实呈现已经发生的暴露(见 collab.private.recall.disclosure)。产品禁止以"已撤回""对方未读"等表述暗示内容未被看见,除非该判定来自可靠依据且其依据的局限被说明。撤回后,产品必须说明其作用边界:已被他人复制、导出、截图、通过通知摘要送达或已被外部系统接收的内容不在撤回范围内。撤回动作本身对他人的可见性(是否留下"已撤回一条消息"的痕迹)必须预先定义并一致执行,不得逐次由实现决定。
边界条件本条不否定撤回功能的价值;它约束的是对撤回效果的表述不制造错误预期。它不要求产品追踪内容在其边界之外的传播——恰恰相反,正因为做不到,才要求如实说明。
设计应用把撤回后的提示从"已撤回"改成说明性的一句话("已从对话中移除;若对方已收到通知,内容可能已被看到")。这一句话的成本很低,它防止的是基于错误预期的后续行为。
验证示例
- 用户侧:发送一条内容触发推送后立即撤回,检查接收方的通知栏是否仍保留内容,撤回方是否被告知这一可能。
- 实现侧:核对撤回的实际作用范围与文案表述一致;验证通知摘要、邮件送达与外部集成中的副本处理方式被说明。
反例做不到——发错了消息点撤回,界面显示"已撤回",实际上对方的手机推送里原文还在,发送方毫不知情;做过头——因为撤回不彻底就完全不提供撤回,发错内容只能留在那里。
C6-5私下沟通不并入共享记录应当
一句话:私聊不因为导出、检索或汇总而变成公开材料。
适用同时提供私下沟通(私信、私有评论、个人笔记)与共享记录的产品。
规则私下沟通的内容不应当因为导出、检索、汇总、摘要生成或跨功能引用而进入更大的可见范围(见 collab.private.channel.scope)。禁止在生成面向共享空间的摘要、报告或知识汇总时纳入未被授权共享的私下内容;由 Agent 或自动化生成此类汇总时,其可读取范围同样受本条约束。私下内容因合规、审计或法定要求被访问时,其访问依据与范围应当被记录;禁止以产品功能的形式把这类访问变成常规可得。私下沟通被转入共享空间时,必须是发起方的显式动作,并使原对话方可知。
边界条件本条不禁止用户自己引用或转发其私下内容——那是用户的处置权。它不改变组织依法定或制度要求进行的合规访问,只要求这类访问不被做成一个日常可用的按钮。
设计应用给汇总与摘要类功能设一条硬性的读取边界,并在生成结果处标明其数据来源范围。把"转发到共享空间"做成有对话方可见痕迹的动作。
验证示例
- 用户侧:在项目里进行一段私信讨论,然后触发项目摘要生成,检查私信内容是否出现在摘要中。
- 实现侧:审计汇总类功能与检索索引的读取范围;验证私下内容不在共享导出结果内。
反例做不到——项目周报自动汇总功能把两名成员关于第三人的私聊一并写进了发给全组的摘要;做过头——为了隔离,私下讨论中的结论无法以任何方式带入共享文档,用户只能手动复制粘贴。
C6-6提醒可收敛且提及不扩权必须
一句话:可以少受打扰;被提及不等于被授予访问权。
适用提供提及、订阅、线程通知、邮件摘要或推送的协作产品。
规则
- 成员必须能按对象或线程停止非必要提醒,并设置个人免打扰时段;跨时区显示截止与静音恢复时间时必须可查时区。静音只改变提醒,不能把已分配责任标为已处理或删除待办。
- 提及必须在发送前解析接收对象及授权范围;禁止因 @ 某人或群组自动给其新增内容访问权。需要邀请时,必须明确展示授予范围并执行独立的授权动作。
- 群组提及必须让发送者知道实际通知范围;无权查看成员名单时不暴露名单。紧急突破静音的条件、主体、频率约束与记录必须预先明确,不能以反复 @ 自动突破。
- 权限变化、责任回落等必要事件必须留在可查询的位置;暂停推送不能丢掉事件,也不能被当作接收方已知悉。
相关配置:collab.private.attention.policy、collab.action.delivery.policy。
边界条件不要求所有通知都可删除;必要事件可以保留在产品内,但外部强打扰必须符合声明的紧急条件。
验证示例静音线程后多次 @,普通推送不恢复;无访问权者被提及时不收到内容摘录,也不自动加入共享范围。
反例做不到——点击 @ 外部同事便把整个项目授予对方。做过头——静音后连权限收紧提示和待处理任务都不再显示。
C6-7参与限制有作用域与退出路径必须
一句话:屏蔽、退出和撤权各有后果,限制也要有解除路径。
适用提供共享讨论、定向互动或成员参与限制的产品。
规则
- 产品必须区分个人静音或屏蔽、限制某人的参与、将人移出空间与撤销其访问权;操作前说明影响哪些互动与内容,禁止用“屏蔽”暗示共享对象已对该人不可见。
- 成员必须有停止不必要定向互动及向明确责任方求助的路径;求助材料只向获准处理者披露,不能默认广播给全体成员或被求助对象。
- 有权者限制发言、评论或加入时,必须记录作用范围、生效条件、期限或复核条件及解除路径。受限者必须得到不泄露敏感材料的状态说明与可用的复核入口。
- 退出空间必须说明责任、内容和权限的后续处理;个人屏蔽与退出不得静默删除他人贡献,成员退出也不表示其历史内容被全部撤回。
相关配置:collab.private.participation.policy。
边界条件本条规定产品中的参与控制,不规定哪些言论违规或组织应如何裁决;紧急限制可以先执行,不能因此省略受控记录与复核路径。
验证示例甲屏蔽乙后核对双方共享文件权限不变;限制评论后测试时限、复核及解除;退出时核对任务交接与私人内容。
反例做不到——屏蔽按钮让人误以为对方再也看不到共享看板。做过头——遭遇反复骚扰时必须先公开说明全部细节才允许静音。
4. 术语和定义
本章定义本规范内用于判断行为与结果的词。
| 术语 | 定义 | 关键边界 |
|---|---|---|
| 共享对象 | 两个及以上主体可访问或可修改的产品对象:文档、画布、任务、看板、空间、对话。 | 是否共享由其可见范围决定,不由存放位置决定。一个放在共享文件夹里但只对一人可见的对象不是共享对象。 |
| 感知信息 | 系统向一个成员呈现的、关于其他成员的信息:在场、位置、正在进行的操作、查看记录。 | 是给协作用的,不是给评价用的(C1-6)。它的粒度上限由协作需要决定,不由技术可得性决定。 |
| 在场 | 某主体当前可被联系或正在某对象上的状态。 | 是有时效的判定,不是一个持续为真的属性。账号在场不等于本人在场(C1-2)。 |
| 查看记录 | 某主体在何时访问过某对象的回溯性记录。 | 与在场是两类信息,分别决定开关、受众与保留期(C1-5)。它是回溯性暴露,删除它不等于删除内容。 |
| 可见范围 | 一份内容当前可被哪些主体访问的完整集合。 | 是内容的属性,跟着内容走;界面上的隐藏不构成可见范围。链接持有者是一个不可枚举的主体类别(C2-3)。 |
| 并发策略 | 同一对象被多人同时修改时的预定义裁决方式。 | 必须与实际行为一致(C3-1)。收敛(各副本最终一致)不等于正确(结果是某一方想要的)。 |
| 自动合并 | 系统在无人介入下把多方变更组合为一个结果。 | 适用范围按内容语义定义,不按技术可行性定义(C3-3)。合并产物必须可被识别与更正。 |
| 裁决者 | 冲突无法自动处理时,由其决定采用哪一方内容的主体。 | 不等于最后提交者。必须对该内容有权限且有责任,并具备判断依据(C3-4)。 |
| 撤销 | 成员对自身此前某一步操作的回退。 | 在共享对象上等于"撤销我做的那一步",不等于"回退对象的最后一次变更"(C4-1)。与历史恢复是两件事,不共用入口。 |
| 作用范围 | 一次操作生效于本人、指定成员还是全体成员。 | 必须在执行前可知(C4-4)。个人视图与共享视图的默认归属属于本项。 |
| 责任主体 | 某对象当前由谁负责推进或维护。 | 不等于参与者、关注者、创建者或最近编辑者。"无人负责"是一个必须可被查询的合法取值(C5-1)。 |
| 交接 | 责任从一个主体转移到另一个主体的过程。 | 包含发起、送达、知悉证据与承接四个独立维度(C5-2)。单方指派不构成交接完成。 |
| 未定稿 | 已产生但尚未由本人显式转为共享可见的内容。 | 默认只对本人可见(C6-1)。它不是"保存失败",也不是"待审核"。 |
| 探索性修改 | 为判断某个改动是否合适而进行的、意在可被放弃的修改。 | 必须存在不立即影响他人的路径(C6-2)。放弃后不留部分结果。 |
| 个人视图状态 | 筛选、排序、分组、折叠、缩放、显示密度等呈现控制的当前取值。 | 默认属于个人(C6-3)。改变共享呈现状态是另一个需要显式表达的动作。 |
4.1 符合性判定
按每条适用规则中的独立义务判定“通过 / 不通过 / 不适用 / 未验证”;不适用必须写出能力与情境依据。应当级偏离需说明理由、替代机制及对应验证。示例中的人数、样本数和时长是测试设置,不是通用性能门槛。
文档审查、机制验证和用户理解验证分别留证,不能互相替代。越权、丢失贡献、把未知呈现为成功、把静音或未回复视为同意,任一适用用例失败即不通过,不用平均分抵消。改变受众、并发、保存或通知策略后,重验受影响的组合场景。
附录 A:故障注入验证清单
本清单用于检验条款是否真的生效,不新增义务。逐项注入,记录系统的实际行为;记录"不适用"是合格结果,记录"没测"不是。
A.1 感知与可见
| 注入 | 期望行为 | 相关规则 |
|---|---|---|
| 成员关机或断网后观察其在他人处的呈现 | 在有效期内转为未知或离线,不沿用历史状态 | C1-1 |
| 以某人账号在共享终端登录 | 呈现为设备在场而非个人在场 | C1-2 |
| 列出所有对其他成员可见的活动字段 | 每一条都能说出它避免了什么具体协作问题 | C1-3 |
| 成员开启最收敛的可见性档位 | 核心协作功能仍可用,无功能性惩罚 | C1-4 |
| 关闭查看记录后用在场历史与打开次数拼接 | 无法重建等价的已读结论 | C1-5 |
| 检索产品内是否存在成员活跃度排名 | 不存在按人排序的活跃度、编辑量或响应速度榜单 | C1-6 |
| 对十个共享对象询问其确切可见范围 | 有权者能解析到具体主体类别 | C2-1 |
| 把三人共享文档改为链接可编辑 | 原有三人获知变更后的范围 | C2-2 |
| 撤销链接后用已缓存会话与直接资源地址重试 | 访问被拒绝 | C2-3 |
| 以无权成员身份检查搜索、通知摘要、引用预览与导出 | 无受限内容片段泄出;部分可见处标明其部分性 | C2-4 |
| 修改父层级权限后核对子层级例外 | 按声明的叠加规则生效,且来源可追溯 | C2-5 |
| 打开一条无权链接 | 得到可执行的下一步或按预定义策略的不透露应答 | C2-6 |
A.2 并发与冲突
| 注入 | 期望行为 | 相关规则 |
|---|---|---|
| 两名成员同时修改同一对象 | 行为与声明的并发策略一致,无输入静默丢失 | C3-1 |
| 一人在长文档中段编辑,另一人滚动至此处输入 | 有效且获准呈现的占用事实在输入前可察觉;不可得时显示未知并保护输入 | C3-2 |
| 两人分别修改同一句话的不同部分 | 保留原始贡献与差异;已定义的不相容组合按既定裁决处理,不承诺普遍语义正确 | C3-3 |
| 制造一次需人工裁决的冲突 | 裁决出现在有权且有责的主体处,另一方获知结果 | C3-4 |
| 锁持有人关机后其他成员尝试编辑 | 存在解除路径;已保存草稿不被清空,离线输入的恢复边界如实说明,过期锁不能提交 | C3-5 |
| 断网编辑两小时后重新连接 | 分别呈现他人变更与自身变更的状态,无静默覆盖 | C3-6 |
A.3 操作与责任
| 注入 | 期望行为 | 相关规则 |
|---|---|---|
| 甲编辑,乙随后编辑,甲按撤销 | 撤销的是甲的编辑 | C4-1 |
| 甲撤销一步,而乙在其基础上已有后续修改 | 执行前说明影响范围,乙可取回被回退内容 | C4-2 |
| 管理员代某成员执行一次修改 | 作者呈现可识别为代操作 | C4-3 |
| 自动化或 Agent 批量修改记录 | 作者可识别为非本人操作 | C4-3 |
| 在看板上调整筛选条件 | 作用范围在执行前可知;默认落在个人视图 | C4-4、C6-3 |
| 删除一份有多人评论与外部引用的文档 | 说明影响范围;他人贡献有保留或导出路径;引用方得知失效 | C4-5 |
| 批量指派三十张卡片给同一人 | 提醒被聚合且仍可判断哪些需要处理 | C4-6 |
| 随机取二十个进行中任务询问当前责任人 | 每一个都能解析到主体或明确解析为无人负责 | C5-1 |
| 把任务指派给当天休假的成员 | 分别表达发起、送达、知悉证据与承接;长期未知悉有回落 | C5-2 |
| 停用一个持有任务、独占锁与私人草稿的账号 | 三类各有明确去向且处置可查;私人内容不默认并入共享 | C5-3、C3-5 |
| 转交责任后查看历史 | 此前变更的作者仍为原作者 | C5-4 |
| 邀请外部访客后询问内部成员"谁能看到" | 外部参与按应当级规则说明;临时权限有到期点,长期授权有复核 | C5-5 |
A.4 私人余地
| 注入 | 期望行为 | 相关规则 |
|---|---|---|
| 评论框输入一半后关闭页面 | 内容未对他人可见,且重新打开时仍在 | C6-1 |
| 检查未定稿内容是否进入搜索、通知与导出 | 均不包含 | C6-1、C2-4 |
| 尝试"看看去掉这一列的效果" | 存在不立即影响他人的路径,且入口可被发现 | C6-2 |
| 中途放弃一次探索性修改 | 不残留部分生效的结果 | C6-2 |
| 一名成员调整筛选、排序或折叠 | 默认不改变他人所见;若改变共享视图,他人可察觉 | C6-3 |
| 触发推送后立即撤回内容 | 如实说明推送副本可能已被看到 | C6-4 |
| 私信讨论后触发项目摘要生成 | 私下内容不出现在共享摘要中 | C6-5 |
A.5 分类检验
用于检验第 1 章的切分是否成立:取 10 至 15 条具体要求(可来自本规范条款,也可来自真实评审意见),让至少三名未参与撰写的评审者独立判断其归属原则。归属分歧集中在某两条原则之间,说明这两条原则的规范对象没有切开——此时应当调整原则,而不是增设中间层或映射说明。已知需要重点检验的两处见第 1 章的明示(C1 与 C2、C4 与 C6)。
附录 B:论据边界与来源类型
B.1 约束词的判据
标「必须」的唯一依据是:缺了它,某条对用户的承诺会在可预见的情境下失效。下列三类论据提供不同支持,不是三种独立的强制性来源;实现参考本身不足以决定标「必须」——
| 来源 | 说明 | 例 |
|---|---|---|
| 有证据的失效 | 已有研究或公开记录表明该承诺会失效 | C3-3(收敛不等于语义正确)、C4-1(共用撤销栈导致他人工作被回退)、C1-5(感知功能的隐私影响) |
| 从承诺反推 | 产品既然作出该承诺,缺了这项机制承诺必然落空 | C2-4("看不到"必须真的取不到)、C5-2(指派不等于承接)、C6-4(撤回不等于未被看见) |
| 协作研究中的既有问题模型 | 领域研究已刻画的失败模式,用于确认问题存在,不用于证明某个解法普适 | C1-3、C1-6(感知与监控的连续性)、C5-1(责任落空)、C6-2(探索成本) |
标「应当」的五条(C2-6、C3-6、C4-6、C5-5、C6-5)都是取舍问题而非底线问题:偏离可能有正当理由,但要留痕并接受同样的验证。其中 C2-6 的两种应答策略、C4-6 的聚合粒度都依赖产品的具体风险判断,本规范不给统一取值。
B.2 本规范证据最薄的三处
明确列出,不用条款语气掩盖:
- C3-3 的"可自动合并范围"缺少跨产品的通用判据。什么样的语义组合可以安全自动合并,目前没有可直接引用的公认清单;本规范要求产品声明业务风险单元、不相容组合和范围外路径,并验证原始贡献保留;文中的组合是检查起点,不是穷尽清单。这是本规范中最可能被形式化应付的一条。
- C1-3 与 C1-6 的粒度界线依赖场景判断。"够协作用"与"够拿来考核"之间没有一条可以写进条款的普适分界;本规范给出的是判据(能否说出它避免了什么具体协作问题、用途是否流向对人的评价),不是字段清单。不同组织文化下的可接受范围差异很大。
- C4-1 的实现代价未被本规范评估。按成员维护撤销栈、并处理跨成员依赖,在不同数据模型下的实现难度差异很大;本规范只规定行为性质,未评估在何种架构下这一要求的代价可能高到需要另设边界条件。不能安全处理依赖时,可以拒绝该次撤销并说明替代路径;不能因此禁止所有不影响他人的撤销。
B.3 本规范未做的事
不给同步算法(不采用操作转换、无冲突复制数据类型或锁定中的任何一种作为规定),不给权限模型(不规定采用基于角色、基于属性还是访问控制列表),不给组织结构,不给保留期数值,不给冲突提示的频率上限。这些是产品与组织的决定;本规范只规定这些决定必须被作出、必须可被检验,以及哪些取值不被允许。
B.4 来源
完整的来源对照、核验状态与检索记录见 reference.md。规范中的条款不因为某个产品这样做过就成立;产品做法是"这类机制在真实产品中可行"的证据,不是"应当这样要求"的依据。
附录 C:组合场景与验收记录
本附录是应用示例,不新增义务。每次验证同时检查发起方、接收方、受影响第三方与实际数据结果;只看一个成功提示不能判定通过。
| 场景 | 触发与故障 | 预期与观察证据 | 规则 |
|---|---|---|---|
| 三人文档引入访客 | 乙离线编辑,甲扩大受众,丙关闭推送 | 记录与告知待办同时产生;在线者继续贡献前可见新范围,乙重连先核对,丙仍能在对象内查询 | C2-2、C3-6、C6-6 |
| 私人草稿参与评审 | 乙在私有预览修改后发布建议,甲将线程解决 | 草稿不进入通知与摘要;发布后受众明确;解决不等于批准,异议可追溯 | C6-1、C6-2、C5-6 |
| 并发改派 | 甲乙同时改责任人,旧确认稍后到达 | 只有当前有效请求可改变责任;旧确认不接下新任务,未知悉有明确回落 | C3-1、C5-2 |
| 交错编辑与撤销 | 乙在甲新增列中输入,甲撤销新增列 | 明确连带内容与作者,保留乙可取回的贡献,不误撤其他步骤 | C4-1、C4-2 |
| 离职与在途摘要 | 撤权后移交失败,外部摘要仍排队 | 撤权先执行;受限保管与责任人可查;投递重新鉴权,不泄露私人内容 | C2-7、C5-3 |
| 强制解锁与重连 | 乙离线、锁已被解除,乙持旧凭据提交 | 不接受旧锁写入;已保存输入按声明边界可恢复,不覆盖甲的成果 | C3-5、C3-6 |
| 无障碍编辑 | 远端持续插入内容,用户用键盘查看评论 | 评论与锚点可定位,焦点不被抢走,可减少活动播报且仍发现冲突 | C1-7 |
| 部分成功与补发 | 批量指派部分生效后回执丢失 | 按项核对;不重复成功项;静音仍生效;未知不写成失败 | C4-7、C6-6 |
| 屏蔽与权限 | 屏蔽反复提及者后继续查看共享对象 | 清楚说明只是互动受限;求助不广播,限制有解除路径,不冒充撤权 | C6-7、C2-4 |
| 正式决定失效 | 批准后更改关键范围或收件人 | 保留历史决定但重新核验当前执行条件;未回应不计赞成 | C5-6 |
最小验收记录:任务与对象、适用规则、角色和权限、配置实际值及来源、操作序列、注入故障、各方可见状态、后端或本地结果证据、通过结论、未验证项和处理责任人。用户侧观察再记录是否理解受众、结果与下一步;不能以用户猜对掩盖机制失败。
实施验收场景
以下场景把已有条款转成可复核的验收输入,不另设通用性能阈值。按产品适用能力选取,补充真实设备、用户、输入序列和证据;不适用记录原因,未执行不得记为通过。
| 条款 | 测试输入与异常 | 预期行为与失败判据 |
|---|---|---|
| C1-1 | 连接已更换世代,旧心跳随后到达。 | 旧包不使原主体显示在线,不延长当前资格。 |
| C4-1 | 甲乙交错编辑同一段落后甲撤销一步。 | 撤销甲的相关操作,不静默覆盖乙的贡献。 |
| C2-7 | 撤权时旧浏览器仍排队提交共享修改。 | 执行端按当前权限裁决,不用界面隐藏代替撤权。 |
每个场景分别核对配置的有效值、执行记录与用户可理解的结果。保留版本、目标、事件时点、失败范围和恢复结果;外部结果未知不填作成功或失败。
使用说明
本字典记录协作行为的设计决定:感知、受众、并发、操作、责任、记录和私人参与。它不是视觉样式表,也不存放某次操作是否成功、谁当前在线等运行事实。
配套设计规范使用。先明确任务、角色、受众和正式生效点,再选择适用字段;每项配置说明谁决定、为何选值、何时生效及依赖的机制。填写完成不等于行为已经实现。
七类速览
| 类别 | 前缀 | 必选 | 可选 | 合计 | 负责什么 |
|---|---|---|---|---|---|
| 在场与感知 | collab.presence | 6 | 2 | 8 | 关于别人的信息给谁看、给到什么粒度、被看的人能不能收起来 |
| 可见性 | collab.visibility | 2 | 6 | 8 | 这份内容对谁可见、范围变了谁知道、部分可见怎么表示 |
| 并发 | collab.concurrency | 1 | 6 | 7 | 同时改了算谁的、谁来裁决、锁多久、收敛到哪一步 |
| 操作作用范围 | collab.action | 2 | 6 | 8 | 撤销撤的是谁那一步、这次操作影响到谁、破坏性操作怎么分级 |
| 责任归属 | collab.ownership | 2 | 6 | 8 | 这件事归谁、怎么交出去、人走了归谁 |
| 记录 | collab.record | 3 | 2 | 5 | 记什么、记多久、作者怎么标、能不能被导出去 |
| 私人余地 | collab.private | 2 | 6 | 8 | 未定稿默认给谁看、在哪里试、什么时候转成共享 |
合计 52 项,其中必选 18 项、可选 34 项。
必选与可选
| 级别 | 含义 | 配置方式 |
|---|---|---|
| 必选 | 对应能力存在时必须明确的基础决策;同一字段仍按其适用条件判断,例如不呈现在场时无需配置心跳期限。 | 可以继承产品预设,也可以用合法的关闭、空集合或最保守取值表达限制;不要求用户逐项填写。完全单人、无共享对象的产品,整份字典记"不适用"即可。 |
| 可选 | 仅在特定能力或差异化需求下采用的参数。 | 无对应能力时不配置;启用能力后,必要依赖必须有明确值或可执行的继承规则(见第八节)。 |
感知信息、可见范围、并发裁决、作用范围、责任与私人状态的边界
| 对象 | 负责什么 | 关键边界 |
|---|---|---|
| 感知信息 | 系统向一个成员呈现的、关于其他成员的信息:在不在、在看哪儿、改了什么、什么时候看过。 | 是给协作用的,不是给评价用的。粒度上限由协作需要决定,不由技术可得性决定——能采到不等于能呈现,能呈现不等于能留存。 |
| 可见范围 | 一份内容当前可被哪些主体访问的完整集合。 | 是内容的属性,跟着内容走。界面上的隐藏、置灰、过滤不构成可见范围。链接持有者是一个不可枚举的主体类别,它进入范围之后不能靠枚举来回答"谁能看见"。 |
| 并发裁决 | 同一对象被多人同时修改时的预定义处理方式。 | 收敛不等于正确:各副本最终一致是技术性质,结果是某一方想要的是语义性质,两者由不同字段表达,不互相蕴含。 |
| 作用范围 | 一次操作生效于本人、指定成员还是全体成员。 | 必须在执行前可解析。撤销的作用范围是"本人的上一步",不是"对象的最后一次变更"——这是本领域最容易被实现反了的一处默认值。 |
| 责任主体 | 某对象当前由谁负责推进或维护。 | 不等于参与者、关注者、创建者或最近编辑者。"无人负责"是一个必须可被表达和查询的合法取值,不是空值。 |
| 私人状态 | 在共享工作区内属于个人的状态:未定稿、探索性修改、个人视图、私下沟通。 | 默认归个人,转为共享须是显式动作。它不是"待审核",也不是"保存失败"——产品不得把私人状态实现为共享状态的一个中间阶段。 |
字段读取约定
- 节内表格中的 Token 字段写相对字段名(如
mode、purpose.scope),完整名称为collab.<类别>.<相对字段名>。 - 枚举取值以"/"分隔。本字典不设"按收敛到扩张排序、未配置取第一档"的全局规则——独占锁定、后写保留、语义合并与人工裁决不构成单调的风险序列,取第一档会在缺配置时静默改变同类对象的既定语义。各行末列给出适用条件,即
required_when;未另列默认值的字段统一为“无默认,适用时必须显式配置或解析继承值”。只有下列明确默认生效:private.draft.default为仅本人可见;private.view.ownership的呈现控制为个人;action.effect.scope中视图控制为仅本人;其他配置不得依赖枚举的排列顺序。 - 四种解析结果互不等同:适用且缺必需配置 → 配置无效,停用受影响的新能力并记为待修复,不按任一档静默放行;无对应能力 → 不适用(记录判断依据);有明确关闭值 → 能力关闭;运行状态未取得 → 事实未知,保留未知,不转换为上述任何一种。
- 时长一律写成"非负或正数值 + 明确单位",并逐项写明:起算事件、是否续期与如何续期、到期比较取严格大于还是大于等于、时钟来源、以及配置被修改后对存量实例的效果。期限是策略;某个实例的实际持有人、有效到期点、有效凭据与"此刻是否仍然有效"是运行事实,不由本字典保存,也不得仅凭期限推断实例仍然存在或已经释放。
- “引用”必须指向已注册的产品策略条目,解析得到标识、正文、责任人与生效范围。引用缺失、循环或适用范围冲突时,该配置无效——停用依赖它的能力并记为待修复,不得静默按空值或最宽松档处理。
- 本字典不给出具体数值:时长、条数、比例、频率上限一律写"由产品定义并记录依据"。协作产品之间的对象体量、成员规模与组织文化差异极大,本字典未找到可跨产品直接引用的通用取值,要求的是这些值被显式定义、有依据、可复核。
- 标注(对应 C3-2)的括号回指《设计规范》中的规则编号,表示该字段是那条规则要求被明确的决策;一个字段可回指多条规则。
决策、事实与呈现
| 层 | 示例 | 不可替代的内容 |
|---|---|---|
| 行为配置 | 允许区域级活动提示、锁的期限、需承接的交接模型 | 不表示某人正在编辑、某把锁有效或某人已承接 |
| 运行事实 | 主体、对象快照、操作或交接请求标识、观察时间、有效性及回执 | 不能从默认值、头像颜色或旧回执推断 |
| 界面呈现 | 未知、待核对、已在本机保存、交接待承接 | 必须忠实于事实,提供适合辅助技术的名称和操作入口 |
设计每个组件时回答:需要什么证据、用户操作改变什么、如何知道已生效。协作者、差异、评论锚点及状态不能只靠颜色表达;播报可聚合,关键状态仍须可查。
配置的共同结构与决策权
每个实际采用的字段使用以下记录结构;这是一份产品实现契约模板,不声明任何 Token 交换格式兼容性。
key: 完整的 collab.* 字段名
value: 表内合法值或可解析的策略引用
source: 产品预设 / 组织限制 / 个人偏好 / 本次操作选择
scope: 对象类别、操作类别、适用成员范围
reason: 任务依据、数据依据或明确的设计取舍
owner: 决定与维护该配置的责任方
effective_at: 生效事件或带时区的时间
existing_instances: 对进行中的锁、交接、队列或记录如何生效
evidence: 机制和界面验证入口
组织限制只能在其权限内约束行为,个人偏好不能扩权;多个硬限制取共同允许的范围。个人隐私收敛、免打扰和退出跟随不能被操作者的偏好覆盖。读写权限的继承模型由 visibility.inheritance.trace 定义,配置层的覆盖不能绕过实际鉴权。管理员与产品预设冲突或引用无法解析时,阻止受影响的新动作并提供修复路径,不延迟必要撤权。
时长使用明确单位与时钟。推荐以权威时间的 now >= expires_at 判断到期;采用其他比较方式须声明理由并验证恰好到期的情况。客户端倒计时只作显示,不能决定锁或权限继续有效。
一、在场与感知:关于别人的信息给谁看、给到什么粒度、被看的人能不能收起来
前缀:collab.presence
| 级别 | 设计决定 | Token 字段 | 类型与合法取值 | 适用条件与作用 |
|---|---|---|---|---|
| 必选 | 在场判定的有效期 | freshness.ttl | 非负时长(单位明确)+起算事件(最近一次有效心跳的接收时刻)+续期规则+到期比较为"严格大于"还是"大于等于"+时钟来源。由产品按其心跳与网络特性测定并记录依据。超期后状态转为"未知"或"离线",不得沿用历史状态继续呈现为在线。仅被他人查看不续期。required_when:identity.mode 非"不呈现在场";不呈现在场时记"不适用"。 | 决定"头像亮着"能亮多久;在场是有时效的判定,不是持续为真的属性(对应 C1-1)。 |
| 必选 | 在场主体的口径 | identity.mode | 枚举:不呈现在场/呈现为会话或设备在场/呈现为个人在场。第三档要求产品能说明其身份确信的依据;共享终端、长期挂起的会话、自动化会话不得计入第三档。 | 选择是否呈现在场的产品须明确;划定"那个头像后面是不是那个人";账号在场不等于本人在场(对应 C1-2)。 |
| 必选 | 感知粒度上限 | awareness.granularity | 枚举:不呈现/在不在/在哪个对象/在对象内的哪一区域/正在进行的编辑活动。每提高一档须能说出它避免了哪个具体的协作问题。击键节奏、停留时长、切窗与空闲时长不属于本枚举的任何一档。 | 呈现他人活动时必须配置;决定关于别人的信息给到多细;这是本类与视觉 token 的接口之一(对应 C1-3、C1-6)。 |
| 必选 | 感知信息的用途与消费方 | purpose.scope | 集合;每项含用途描述与明确的下游消费方。未列出的模块不得读取感知信息。禁止列入绩效评估、活跃度排名、晋升与考核、工时核算、纪律处分依据(对应 C1-6)。 | 呈现或保留他人协作活动时必须配置;绑定感知信息的流向;用途变更须重新声明,不由新模块自行接入(对应 C1-3、C1-6)。 |
| 必选 | 被感知方的可见性控制 | visibility.self | 枚举档位集合,至少含一档不向其他成员呈现实时在场与位置。采用最收敛档位不得导致核心协作功能不可用、不得产生功能性惩罚(如被排除在协作提示之外)、不得被呈现为异常状态。 | 向他人呈现在场与位置时必须配置;让被看的人能收起来;这是 C1-4 的机制载体,不是一项增值设置(对应 C1-4)。 |
| 必选 | 自身暴露面的可查询性 | subject.view | 引用:成员查询"我的哪些活动信息正在被呈现给谁"的入口与其覆盖范围。覆盖范围须与实际呈现一致;未覆盖的字段须列出。 | 向他人呈现活动信息时必须配置;让暴露面可被本人查明;缺此字段时 visibility.self 的档位无法被有意义地选择(对应 C1-4)。 |
| 可选 | 查看记录模式 | seen.mode | 枚举:不记录/记录但仅本人可见/记录且对指定范围可见。任一记录档均须声明受众与保留期,不得与实时在场共用同一开关。关闭后不得以在场历史、打开次数或通知回执拼接出等价的已读结论。 | 提供"谁看过"能力时配置;在线是此刻的暴露,看过是回溯的暴露,两者分别决定(对应 C1-5)。 |
| 可选 | 协作变化的可访问呈现 | presentation | 呈现策略引用:成员及差异的非颜色标识、评论/差异键盘导航、焦点与选区保护、活动播报范围与主动查询入口。跟随需本人启动、持续标记且可退出。减少播报不得关闭冲突保护。 | 呈现任何协作变化时必须配置;对应 C1-7。 |
边界:判定有效期决定在场信息何时失真,粒度决定它有多细,用途决定它流向哪里,可见性控制决定被看的人有没有退路。四者各自独立收紧,任一项放宽不放宽其余三项。采集能力的存在不产生呈现的资格,呈现的存在不产生留存的资格,留存的存在不产生用于评价的资格。
二、可见性:这份内容对谁可见、范围变了谁知道、部分可见怎么表示
前缀:collab.visibility
| 级别 | 设计决定 | Token 字段 | 类型与合法取值 | 适用条件与作用 |
|---|---|---|---|---|
| 必选 | 可见范围的表达方式 | audience | 集合:具名主体、群组、组织范围、链接持有者、公开。每一项须可被有权者解析到具体主体或明确的主体类别;"已共享"不构成合法取值。链接持有者与公开两项须标明其为不可枚举类别。 | 提供共享访问时必须配置;让"谁能看到这份东西"有答案;可见范围是内容的属性,不是界面状态(对应 C2-1)。 |
| 必选 | 范围变更的告知策略 | change.notice | 引用:范围扩大与缩小时的告知对象、告知内容与时点。变更记录与告知待办在权限生效时点生成;扩大时事件生成不晚于新主体取得访问,告知对象覆盖原有成员;说明变更后的范围而非仅“权限已更新”。呈现时点与事件时点分别记录:在线且正在贡献者在继续输入前可见,离线者在下次进入该对象时先看到新范围;选择延迟通知的须记录策略。本字段要求的是界面送达或停止新写入的回执,不承诺证明任何人已经读到。紧急撤权可先执行后告知。缩小时联网界面不得继续呈现为可提交;离线界面说明权限未核验,重连拒绝凭缓存授权提交。 | 允许改变受众时必须配置;让屋里的人知道门开了;这是 C2-2 的机制载体(对应 C2-2、C1-4)。 |
| 可选 | 链接分享模式 | link.mode | 枚举:不提供链接分享/需登录且需在范围内/需登录不限范围/任何持有者。第三档起须在创建处说明其可转发性与受众不可枚举;须提供撤销,声明有效期与附加访问限制;登录和密码不替代撤销。说明撤销不及于已离开产品边界的副本这一限制。 | 提供链接共享时配置;这是可见范围最常被低估的扩张路径(对应 C2-3)。 |
| 可选 | 部分可见的标示 | partial.disclosure | 枚举:标示存在被过滤内容/标示数量。required_when:存在按权限过滤的列表、历史或搜索结果;不存在过滤视图时记"不适用","不标示"不是合法取值。对象的存在本身敏感时,采用稳定的"仅显示你有权访问的范围"说明——该说明在有隐藏项与无隐藏项时表述一致,使是否存在隐藏项及其数量不可由差异推断。判据:当成员看到的是被过滤后的列表、被截断的历史或被隐藏了条目的视图时,该事实须可被知道,否则他会把不完整当成完整并据此决策。标示本身不得泄露被隐藏内容。 | 存在按权限过滤的列表、历史或搜索结果时配置(对应 C2-4)。 |
| 可选 | 继承与例外的可追溯性 | inheritance.trace | 引用:层级继承规则、例外叠加顺序与冲突时的取值原则;须能对单个主体回答"他为什么能看见这一份"。叠加规则须预先声明,不由实现顺序偶然决定。 | 存在文件夹、空间、群组等层级结构时配置(对应 C2-5)。 |
| 可选 | 无权访问的应答策略 | request.mode | 枚举:按对象类别不透露存在/告知无权并给出申请入口/告知无权并给出可联系的授权方。无默认档——required_when:存在可被外部触达的访问入口;取值按对象类别的实际风险选择并记录依据。"不透露存在"只适用于其存在本身即为敏感信息的对象类别,不得作为全部普通对象的统一取值(见 C2-6 对普通情况模糊处理的禁止)。同一对象类别内须一致,不逐条判断。申请入口须预填对象标识,使接收方不必反问是哪一份。 | 存在可被外部触达的访问入口时配置;策略选择依赖产品的具体风险判断,本字典不给统一取值(对应 C2-6)。 |
| 可选 | 可见范围的复核 | audience.review | 引用:复核周期、复核范围与责任人;至少覆盖链接分享、外部主体与长期未访问的授权。复核结果须可查。 | 存在长期存续的共享对象时配置;缺此字段时长期授权缺少主动复核路径(对应 C2-1、C5-5)。 |
| 可选 | 撤权的生效与在途处置 | revocation.policy | 策略引用:执行边界、旧会话与长连接失效方式、待发内容再鉴权、离线输入保护、结果核对及失败责任人;区分受理与实际生效。声明无法收回的缓存与外部副本,不以超时当成功。 | 权限可在运行中收紧时必须配置;对应 C2-7、C5-3。 |
边界:可见范围是内容的属性,界面的隐藏是呈现。两者的分工不可互换:audience 声明的范围必须在数据与接口层强制,界面上的隐藏、置灰与过滤只作为呈现,不作为唯一的实施手段。范围的扩大与缩小是两类事件,分别有告知对象,不共用一条策略。
三、并发:同时改了算谁的、谁来裁决、锁多久、收敛到哪一步
前缀:collab.concurrency
| 级别 | 设计决定 | Token 字段 | 类型与合法取值 | 适用条件与作用 |
|---|---|---|---|---|
| 必选 | 并发策略 | policy | 策略引用:按对象类型与操作类别解析到一档主策略(独占锁定/先提交生效且保留被拒输入/后写覆盖并保留被覆盖内容且告知/按语义自动合并/保留双方输入交由裁决),并可显式定义异常路径。不存在"后写静默覆盖且不保留"的合法取值;没有默认档——required_when:产品存在任何可被两人同时修改的对象。所选取值须与实际行为一致,并在成员开始修改前可获知。依赖缺失时不得临时改用另一档算法:该对象类的并发能力停用并记为配置无效,同类对象的语义不因缺参数而静默改变。 | 明确同时改会发生什么;这是设计决定,不是实现的偶然结果(对应 C3-1)。 |
| 可选 | 正在编辑的指示 | editing.indicator | 条件化呈现策略:在已取得有效且获准呈现的占用事实时,按所选粒度(对象级/区域级)在成员开始输入之前呈现;并须一并声明不可得时的说明方式(未知、不可展示、对端不可达在内部可区分,对外采用不暴露隐私选择的中性表述)与该情形下的编辑保护路径。未知或不允许展示时不得呈现为“无人编辑”。对外不细分隐藏原因,避免暴露隐私选择。指示的信息量受 presence.awareness.granularity 约束,两者取更收敛的一方;匿名化呈现须评估小规模空间内可推断身份的暴露。不提供实时提示时记录其适用原因;隐私限制下保护输入的责任仍由 policy 承担。 | 提供实时并发编辑时配置;事后告知冲突不能替代事前提示(对应 C3-2、C1-3)。 |
| 可选 | 自动合并的适用范围 | merge.scope | 引用:按内容语义定义的业务风险单元与可检测的不相容组合,可自动合并的变更组合清单,及清单外的处理路径;须含对象类型、检测依据、正式生效点与验证用例。同一原子值的并发修改、删除与依赖该内容的编辑、已定义的关联字段组,不得未经既定裁决直接成为权威结果。自由文本不能可靠判定语义不相容时,须保留各方原始贡献、使合并差异可发现,并按用途在正式发布或提交前作相称核对;不得配置为"自动保证语义正确"。合并产物须可被识别为合并结果并可更正。"结果不是任一方单独写过的"本身不作为不合法的判据。 | policy 含自动合并时必须配置;合得拢不等于合得对(对应 C3-3)。 |
| 可选 | 裁决者的解析规则 | arbiter | 引用:冲突需人工裁决时裁决者的解析规则与回落路径。裁决者须对该内容有权限且有责任。不得仅因为某人是最后提交者而指派为裁决者;按权限与责任独立解析后恰好是最后提交者,是合法结果(对应 C3-4 的责任主体情形)。须声明裁决依据的最小集合(各方内容、作者、时间)与另一方的获知方式。 | 存在需人工裁决的冲突时配置(对应 C3-4、C5-1)。 |
| 可选 | 独占锁定的持有与期限 | lock.ttl | 正时长(单位明确)+起算事件(锁被授予的时刻)+刷新方式与刷新是否重置起算+到期比较+时钟来源,由产品按其典型编辑时长测定并记录依据;须同时声明持有人的可解析性、到期行为与强制解除路径。本字段是期限策略:某把锁的持有人、有效到期点、有效凭据与当前是否仍然有效是运行事实,须另行查询,不得仅凭期限推断锁仍在或已解除。配置变更对存量锁的效果须声明。强制解除不删除已持久化草稿、不主动清空本地输入;须声明保存位置、取回条件及权限边界。离线终端独有输入不宣称已由服务器备份;重连提交须校验当前锁凭据。 | policy 含独占锁定时必须配置;锁上的人下班了,文件不能就此锁死(对应 C3-5)。 |
| 可选 | 收敛状态的表达 | convergence.presentation | 呈现合同引用(可由产品既有合同承担),须覆盖四个维度:入站基线(本人所见已包含他人变更到哪个快照)、出站持久化(本机已保存)、服务端接受、目标范围分发的可证程度。每一维须有"未知"与"失效"语义;任一维不得代替其余维——本人的写入已被接受,不证明他人的并发或较早变更已入站。对端接收回执仅能证明客户端收到,不能表述为“所有人已看到”;实际查看证据须遵守 presence.seen.mode。某次同步的对象快照、更新时间、回执与目标成员集合是运行事实,不由本字段写入。 | 存在网络延迟或离线编辑时配置;"我看到的是最新的"和"我改的别人看到了"是两件事(对应 C3-6)。 |
| 可选 | 离线编辑的处理窗口 | offline.window | 正时长(单位明确)+起算事件(最后一次成功同步的时刻)+到期比较+超期处理方式,由产品按其使用情境测定并记录依据。超期后的变更进入按 policy 声明的路径处理,不得静默丢弃,也不得静默覆盖期间的他人变更。窗口内外的行为差异须在离线开始时可获知。 | 支持离线或弱网编辑时配置;离线时长越长,回归时与他人变更相遇的概率越高(对应 C3-6、C3-1)。 |
边界:convergence.presentation 表达的是技术性质(各副本是否一致),merge.scope 与 arbiter 表达的是语义性质(结果是不是某一方想要的)。收敛不蕴含正确,两者由不同字段承担,任一项达成不免除另一项。冲突提示的频率上限本字典不设:把任何两人先后动过同一份内容都判成冲突,与静默丢弃输入一样会导致人不再看提示。
四、操作作用范围:撤销撤的是谁那一步、这次操作影响到谁、破坏性操作怎么分级
前缀:collab.action
| 级别 | 设计决定 | Token 字段 | 类型与合法取值 | 适用条件与作用 |
|---|---|---|---|---|
| 必选 | 撤销的作用域 | undo.scope | 枚举:不提供撤销能力(产品在共享对象上不提供撤销时的合法取值)/撤销本人在已声明上下文中的上一步/撤销本人在已声明上下文中的指定历史步骤。不存在"回退对象全局最后一次变更"的合法取值。取后两档时须一并声明撤销上下文的边界:同一成员的多个标签页、代为执行的操作、Agent 后续改写各自是否计入。本字典不规定实现结构——按成员隔离的历史、按操作来源过滤或等价机制均可。本人无可撤销操作时行为须为"无效果并说明",不得改为撤销他人变更。历史恢复是另一能力,不共用入口与快捷键。 | 提供共享编辑时须明确有无撤销;明确"撤销"在共享对象上解析成什么;这是本领域最容易被实现反的一处默认值(对应 C4-1)。 |
| 必选 | 操作作用范围的表达 | effect.scope | 集合,每项操作类别标注其生效范围:仅本人/指定成员/全体成员。须在执行前可辨。视图控制类操作默认落在"仅本人";改变共享呈现是另一个需要显式表达的动作。 | 存在不同成员作用范围的操作时必须配置;让人在按下去之前知道这一下影响谁;这是本类与视觉 token 的接口之一(对应 C4-4、C6-3)。 |
| 可选 | 连带回退的处理 | undo.cascade | 枚举:不支持并说明替代路径/执行前说明影响范围并取得确认后回退。不存在"静默连带回退"的合法取值。采用第二档须同时声明被影响成员的获知方式与被回退内容的取回入口。无他人后续变更时不得叠加确认。 | 本人的某一步与他人后续变更存在依赖时配置(对应 C4-2)。 |
| 可选 | 破坏性操作的分级 | destructive.level | 集合,按后果分级并声明各级的前置说明与可恢复期:共享对象的分级须计入他人可见、他人引用、他人在场与他人贡献的存在,不沿用单人场景的分级。他人贡献须有保留或导出路径,引用方须能得知失效。 | 提供删除、归档、移出、解散一类操作时配置(对应 C4-5)。 |
| 可选 | 批量操作的提醒聚合 | batch.notice | 引用:聚合粒度、聚合窗口与明细保留方式,由产品定义并记录依据。聚合后须仍能让接收者看出与自己相关的具体项,不得聚合到无法判断是否需要处理的程度。操作者须在执行前知道这次操作会打扰到哪些人。 | 提供批量操作且操作产生对他人的提醒时配置;聚合粒度依赖产品的具体判断,本字典不给统一取值(对应 C4-6)。 |
| 可选 | 撤销栈的保留范围 | undo.retention | 引用:撤销历史的深度、跨会话保持与失效条件(含失效的起算事件),由产品定义并记录依据,可继承会话级规则。承诺任何撤销能力时均须可解析到实际边界——短会话产品同样要能回答"撤销历史在什么时刻失效"。失效后的行为须为"无效果并说明",不得回落为全局撤销。 | undo.scope 非"不提供撤销能力"时必须配置;缺此字段时 undo.scope 的实际边界不可解析(对应 C4-1)。 |
| 可选 | 协作事件投递与提及 | delivery.policy | 策略引用:事件到接收范围的解析、发送前鉴权、跨通道去重、投递回执及补发范围;提及不得隐式授予权限,群组提及须说明范围;待发送内容按当前权限过滤。 | 存在提及、通知或外发集成时必须配置;对应 C2-7、C4-7、C6-6。 |
| 可选 | 重试与部分结果 | retry.policy | 策略引用:操作标识、防重范围与保留窗口、成功/失败/未执行/未知的判据、结果核对入口及部分重试条件。防重窗口须覆盖实际重试与排队窗口;超过窗口先核对,未知且不能证明安全时不得自动重放。 | 存在可能重试或部分完成的协作写操作时必须配置;对应 C4-7。 |
边界:undo.scope 管"撤销撤掉了谁的东西",effect.scope 管"这次操作生效在谁身上",destructive.level 管"这次操作有多难收回"。三者独立:一次作用范围仅本人的操作也可以是不可恢复的,一次影响全体的操作也可以是可撤销的。把它们合成一个"操作风险等级"会同时失去三处控制。
五、责任归属:这件事归谁、怎么交出去、人走了归谁
前缀:collab.ownership
| 级别 | 设计决定 | Token 字段 | 类型与合法取值 | 适用条件与作用 |
|---|---|---|---|---|
| 必选 | 责任主体字段 | assignee | 引用:责任主体的取值域与解析规则。取值域须包含"无人负责"这一合法且可查询的取值;不得以参与者、关注者、创建者或最近编辑者推定。解析结果须可被查询到具体主体或明确的"无人负责"。 | 存在需人推进的任务或对象时必须配置;让"这件事现在归谁"有答案;参与不等于负责(对应 C5-1)。 |
| 必选 | 成员离开时的处置 | offboarding | 集合,按对象类别声明去向:责任对象、独占锁定、未定稿与私人内容、授权与外部分享。每类须有明确去向且处置可查;私人内容不得默认并入共享。不得留下既不可访问又无处置入口的对象。 | 成员退出、停用或移除时配置;撤权不等待移交,失败对象须有受限保管路径与责任人(对应 C5-3、C6-1、C3-5)。 |
| 可选 | 交接的状态模型 | handoff.mode | 枚举:单方指派/指派并需知悉/指派需承接。各档均须分别表达四个事实维度:已发起/已送达或可访问/知悉证据状态/是否已承接。未取得有效知悉证据时记"知悉情况未知",不得记为"尚未查看"。单方指派不构成交接完成,且须预先定义其责任生效规则。拒绝、撤销、被再次改派、到期回落、重复确认与针对已失效请求的确认,各自效果须预先声明;责任解除只按当前有效的交接请求标识判断。 | 提供任务指派或责任转移时配置;交接是双方事件(对应 C5-2)。 |
| 可选 | 未知悉的回落 | handoff.timeout | 正时长(单位明确)+起算事件(交接发起时刻)+是否续期+到期比较+回落路径,由产品按其响应节奏测定并记录依据。长期未取得知悉或承接证据须回落到发起方或声明的备选主体,不得停留在"已指派"而实际无人推进。回落须使发起方获知。 | 配置 handoff.mode 的任一档时均须明确——单方指派同样可能等待知悉与承接(对应 C5-2、C5-1)。 |
| 可选 | 无人负责状态的处置 | unassigned.policy | 引用:进入"无人负责"的触发条件、呈现方式与复核周期。该状态须是可见的而非静默的:不得表现为一个正常推进中的对象。复核责任人须可解析。 | 存在长期存续的任务或责任对象时配置(对应 C5-1、C5-3)。 |
| 可选 | 外部与临时成员的边界 | guest.policy | 引用:外部主体的可见范围上限、权限有效期与复核方式,并逐项标注其强度:"临时权限有到期点、长期外部授权有复核周期与责任人"与"贡献归属须明确且对内部成员可知"是不可关闭的底线;"外部参与对内部成员持续可察觉"是应当级,偏离须记录理由与替代做法(与 C5-5 同一口径)。长期的外部合作身份按其实际关系声明期限与复核方式,不一律按临时访客处理。不区分内外的产品记"不适用"。 | 存在外部访客、临时协作者或跨组织协作时配置(对应 C5-5、C2-1)。 |
| 可选 | 讨论的锚点与生命周期 | discussion.policy | 策略引用:锚点定位及失效呈现、解决/重开/删除/受限的权限和记录、异议入口、摘要来源与未决事项;已解决不得等于全员同意。 | 存在评论线程、建议或评审时必须配置;对应 C5-6。 |
| 可选 | 正式决定的有效条件 | decision.policy | 策略引用:决定者资格、通过条件、快照与范围绑定、有效期限或失效事件、内容变化后的重新核验;沉默与一般互动不得计为批准。门槛按业务定义,不给通用人数。 | 表态、批准或投票将触发后续执行时必须配置;对应 C5-6。 |
边界:责任主体是状态,不是活跃度的函数。它的输入是一次明确的指派或承接,不是谁最近改过、谁发言最多、谁在线时间最长——用活跃度推定责任主体,是本类最典型的一处设计错误,它同时违反 C5-1 与 C1-6。本字典只规定产品里的责任表达,不规定组织如何分工。
六、记录:记什么、记多久、作者怎么标、能不能被导出去
前缀:collab.record
| 级别 | 设计决定 | Token 字段 | 类型与合法取值 | 适用条件与作用 |
|---|---|---|---|---|
| 必选 | 作者主体的区分 | authorship | 枚举须至少区分三类:成员本人操作/由他人代为执行的操作(代理、模拟登录、管理员代操作)/由自动化或 Agent 执行的操作。代为执行须同时记录实际执行者与被代表者;自动化产物须标示执行来源。主体归属禁止因责任交接、成员改名或账号停用而被改写。 | 多名成员可修改同一对象时必须配置;让"这行字是谁写的"查得到;事后追查时,这个区别常常就是全部问题所在(对应 C4-3、C5-4)。 |
| 必选 | 记录类别 | categories | 集合:内容变更、可见范围变更、责任变更、成员进出(基础四类);条件类别:查看记录(presence.seen.mode 任一记录档均必需)、锁事件(concurrency.policy 含独占锁定时必需)、讨论与决定(启用相应能力时)、参与限制(启用限制时)、操作结果(有重试或批量时)。产品新增类别须按同一规则登记。每个实际存在的类别都必须有其独立的保留期与对外可查上限;配置了查看记录却未给出其对应保留期的配置无效。各类分别声明保留期与可查范围。记录的粒度须与撤销单位和裁决需要相称,不按技术可得性扩张。 | 产生日志义务对应的事件时必须配置;仅登记实际存在的类别;明确记什么;这是 C3-4 的裁决依据、C4-3 的归属依据与 C5-4 的历史保障共用的机制(对应 C2-2、C3-4、C4-3)。 |
| 必选 | 保留期限 | retention.ttl | 时长集合(单位明确),按 categories 中每一个实际存在的类别分别设定,各含起算事件(该条记录产生的时刻)与到期比较;由产品按其审计与协作需要测定并记录依据;均须可查。配置改变不得重置既有记录的年龄。届满后不再可查是允许的,但该期限须预先声明,不得表现为"从未记录"。仅被查看不续期。 | 记录任何协作事件时必须配置;明确各类记录留多久;期限与对外表述不一致即为违规(对应 C4-3、C1-5)。 |
| 可选 | 记录的可导出与可检索范围 | export.scope | 引用:变更记录可被导出、检索与汇总的范围及其权限要求。范围受 presence.purpose.scope 约束:禁止导出或检索路径成为绕过协作用途限制、用于评价个人活动的通道。 | 提供历史导出、审计报表或跨对象检索时配置(对应 C1-6、C2-4)。 |
| 可选 | 历史中个人标识的处置 | anonymization.mode | 枚举:不处置(仅在未触发处置要求时适用)/匿名化并标示处置事实/移除并标示处置事实。处置要求一经触发,不得取"不处置":无法自动处置时须转交有权限的人工路径、记录未完成并指定责任人,不得以常规 retention.ttl 到期代替专项处置决定。不存在"替换为他人姓名"的合法取值。处置本身须可被识别,不得使历史看起来从未变更过。 | 存在法定删除请求或组织策略要求移除历史标识时配置(对应 C5-4)。 |
边界:记录是给内容用的,不是给评价人用的。同一套记录同时承担操作归属、冲突裁决与历史保障三种用途,但它的可读取范围由 presence.purpose.scope 统一约束——机制一物多用是常态,用途扩张不是。记录的完整性与感知信息的收敛不冲突:记下来与呈现给别人看是两个决定。
七、私人余地:未定稿默认给谁看、在哪里试、什么时候转成共享
前缀:collab.private
| 级别 | 设计决定 | Token 字段 | 类型与合法取值 | 适用条件与作用 |
|---|---|---|---|---|
| 必选 | 未定稿内容的默认可见性 | draft.default | 固定值:仅本人可见。指定受众的草稿须由本人另行显式分享,不写入新草稿默认配置。转为共享可见须是显式动作,不得由超时、失焦、关闭页面或自动保存触发。私人未定稿须被排除在面向他人的搜索、通知摘要与导出之外;本人获准使用的私有检索与备份不受此限。保存位置、恢复边界及失败保留路径须由产品明确,已保存输入不得因导航或发布失败被主动清空。 | 提供创作、评论或提交时必须配置;让人敢在共享空间里写下没想好的话;未定稿不是"待审核",也不是"保存失败"(对应 C6-1)。 |
| 必选 | 个人视图状态的归属 | view.ownership | 集合,列出筛选、排序、分组、折叠、缩放、显示密度等呈现控制的归属:默认须为"个人"。改变共享呈现状态须是显式动作且对他人可察觉。共享档位的存在不改变默认归属。 | 提供视图控制时必须配置;让"我调一下筛选"不至于改掉全组的视图(对应 C6-3、C4-4)。 |
| 可选 | 探索路径模式 | sandbox.mode | 集合,至少含一项:个人视图/访问范围仅作者的草稿或分支/沙盒预览/建议模式。每一项须按"是否产生他人可见的内容、通知或共享状态变化"分别验证——共享的建议模式满足"不直接改变正式内容",不满足"不影响他人";只提供共享建议模式不满足本字段,必须另有私人预览或草稿路径。不得为空集合;"该操作可被完全撤销"不构成合格路径。路径须在共享对象的编辑入口处可被发现,不得只存在于文档中。放弃探索时不得留下部分生效的结果。 | required_when:共享对象上的修改会立即影响他人,且不属于已记录的结构性不适用情形(对应 C6-2)。 |
| 可选 | 撤回能力的如实表述 | recall.disclosure | 引用:内容被撤回、删除或编辑后,其已投递副本(推送、邮件摘要、外部集成、他人缓存)的实际状态与表述方式。须如实说明撤回不及于已被看到的副本,不得以"已撤回"覆盖这一事实。 | 存在推送、邮件或外部集成的转发路径时配置(对应 C6-4、C2-3)。 |
| 可选 | 私下沟通的范围边界 | channel.scope | 引用:私下沟通内容可被读取的范围,及其在导出、检索、汇总与摘要生成中的处理。禁止在生成面向共享空间的摘要、报告或知识汇总时纳入未被授权共享的私下内容;Agent 或自动化生成此类汇总时读取范围同样受限。 | 同时提供私下沟通与共享记录时配置(对应 C6-5)。 |
| 可选 | 私人区到共享区的转移 | transfer.mode | 枚举:仅本人显式动作(仅适用于单人私有笔记等不含对话方内容的对象)/本人显式动作且原对话方可知(含私信、私有评论等有对话方内容的对象时的唯一合法取值)。复制与移动都须执行目标受众判定:转发副本可能不改变原对象的访问控制,因此告知义务不得只依赖 visibility.change.notice。转移须是显式动作,不得由检索、引用、汇总或跨功能读取实现。转移后原始内容的可见范围变更按 visibility.change.notice 处理。 | 存在私人笔记、私有评论或私信可被带入共享空间的路径时配置(对应 C6-4、C6-5、C2-2)。 |
| 可选 | 个人提醒节奏 | attention.policy | 偏好策略引用:可静音的对象/线程与通知类别、带时区的免打扰计划、恢复方式、必要事件的查询入口;紧急例外声明触发主体、条件、频率及记录。静音不解除责任、不同于已读,也不允许抹去必要事件。 | 存在协作通知时必须配置;对应 C6-6、C4-6。 |
| 可选 | 参与控制与求助 | participation.policy | 策略引用:静音/屏蔽/限制/移出的区别,作用于哪些互动,操作者权限、生效与解除、期限或复核、受限说明、求助接收者及材料范围。个人屏蔽不自动改变共享内容权限。 | 存在共享讨论、定向互动或成员限制时必须配置;对应 C6-7。 |
边界:私人状态的默认归属以"不做任何显式动作时,这份东西对谁可见"为判定标准,不以"产品有没有提供一个私人档位"为判定标准。提供了草稿功能但默认实时同步给所有人,不满足 draft.default 的第一档。协作过程中他人可见的编辑活动指示(concurrency.editing.indicator)不属于本类所指的内容外发,两者由不同字段管辖。
八、可选项的联动要求
能力可以不启用;启用后,依赖必须完整。下表不新增字段或第三种级别,相关值可由产品规则继承。表内省略共同前缀 collab.。
| 能力或承诺 | 必须明确的依赖 | 未满足时 |
|---|---|---|
| 呈现他人在场 | presence.identity.mode 非"不呈现在场"时须有 presence.freshness.ttl、presence.awareness.granularity、presence.purpose.scope、presence.visibility.self 与 presence.subject.view。 | 不呈现在场;协作提示只依据内容变更本身。 |
| 提供"谁看过" | presence.seen.mode 非"不记录"时须单独声明受众与 record.retention.ttl 中对应的保留期;关闭后无法由在场历史拼接等价结论。 | 不记录查看行为;已记录的按声明期限删除。 |
| 呈现区域级或编辑活动级的感知 | presence.awareness.granularity 取“在对象内的哪一区域”或“正在进行的编辑活动”时须逐项说明其避免的具体协作问题,且 presence.purpose.scope 已排除评价类用途。 | 只呈现"在不在"或"在哪个对象"。 |
| 链接分享 | visibility.link.mode 非"不提供链接分享"时须声明期限、撤销能力与撤销的不及范围;visibility.audience 中链接持有者一项标明为不可枚举类别;visibility.audience.review 覆盖链接授权。 | 仅保留已声明且有效的具名主体或群组共享,不静默扩大或替换既有授权。 |
| 按权限过滤的列表、历史或搜索 | visibility.partial.disclosure 非"不标示",且标示本身不泄露被隐藏内容。 | 暂停该视图或采用不泄露存在性的范围说明;不能取消权限过滤。 |
| 层级继承的权限结构 | visibility.inheritance.trace 可解析到叠加规则与冲突取值原则。 | 阻止受影响的授权变更;只有既有有效授权仍可核对时继续其范围,不能静默改为另一权限模型。 |
| 自动合并 | concurrency.policy 含自动合并时须有 concurrency.merge.scope 的语义清单、合并产物的可识别性与更正路径;清单外的组合有明确的处理路径。 | 停用依赖自动合并的新提交并保留输入;仅使用已声明且依赖齐备的异常路径,不临时切换算法。 |
| 独占锁定 | concurrency.lock.ttl 须含持有人可解析性、到期行为与强制解除路径,且强制解除保护已保存草稿、声明离线恢复边界并拒绝过期锁写入;ownership.offboarding 覆盖锁定对象。 | 暂停依赖锁的新编辑准入,保留现存输入并提供修复;不临时切换算法。 |
| 离线或弱网编辑 | concurrency.offline.window 与 concurrency.convergence.presentation 的四个维度齐备(含未知与失效语义);回归时的处理路径与 concurrency.policy 一致。 | 不支持离线编辑;无连接时不接受修改并如实说明。 |
| 需人工裁决的冲突 | concurrency.arbiter 不因最后提交这一事实指派裁决者,裁决依据的最小集合与另一方的获知方式已声明;ownership.assignee 可解析。 | 保留冲突双方输入并阻止覆盖;设置可查的待处理状态和有权限的升级入口。 |
| 共享对象上的撤销 | action.undo.scope 解析为本人贡献,且 action.undo.retention 的失效行为不回落为全局撤销;可能连带影响他人时须有 action.undo.cascade。 | 不提供撤销;提供历史恢复时使用独立入口与独立表述。 |
| 批量操作 | action.batch.notice 的聚合粒度与明细保留已明确,且 action.effect.scope 覆盖该操作类别。 | 不提供批量路径;逐条操作各自按单条规则处理。 |
| 删除、归档或解散共享对象 | action.destructive.level 的分级已计入他人可见、引用与贡献;他人贡献有保留或导出路径。 | 不提供该操作,或限定为可完全恢复的操作。 |
| 任务指派或责任转移 | ownership.handoff.mode 与 ownership.handoff.timeout 齐备;未知悉有回落且发起方获知。 | 不表达责任主体的转移;ownership.assignee 仅由本人认领改变。 |
| 成员可被停用或移出 | ownership.offboarding 覆盖责任对象、独占锁定、私人内容与外部授权四类,且各类处置可查。 | 权限终止按已授权的生效要求执行,不以内容移交完成为前提。无法自动移交时,把待处理对象置于受限、可查、不默认扩大受众的保管状态,指定处理责任人与下一步;原成员的访问仍然终止。 |
| 外部访客或跨组织协作 | ownership.guest.policy 的可见范围上限与权限期限已明确;外部参与对内部成员可察觉;visibility.audience.review 覆盖外部授权。 | 不启用新的外部访问授权;导出同样是对外暴露,须独立核对授权,不能作为绕过方式。 |
| 历史记录导出、审计报表或跨对象检索 | record.export.scope 已明确且不超出 presence.purpose.scope。 | 不提供导出与跨对象检索;记录只在对象内可查。 |
| 移除历史中的个人标识 | record.anonymization.mode 非"不处置",且处置事实可被识别。 | 处置要求已触发而无法自动完成时,转交有权限的人工路径并记录未完成;不得以 record.retention.ttl 到期覆盖专项处置决定。未触发处置要求时方可取"不处置"。 |
| 共享修改会立即影响他人 | private.sandbox.mode 非空集合,各项已按"是否产生他人可见的内容、通知或共享状态变化"验证,且路径在编辑入口处可被发现。 | 暂停该共享修改能力,或提供真正不影响他人的预览/草稿;"该操作可完全撤销"不构成替代。 |
| 推送、邮件或外部集成转发 | private.recall.disclosure 已明确,撤回表述与实际能力一致。 | 不外发内容副本;若提供提醒,仅发送获准披露且不泄露对象存在性的入口。 |
| 私下沟通与共享空间并存 | private.channel.scope 与 private.transfer.mode 齐备;汇总类功能的读取范围可审计。 | 不提供私下沟通,或私下内容不参与面向更大受众的汇总与检索。 |
| 协作变化与跟随视角 | presence.presentation 覆盖键盘、辅助技术、焦点保护及跟随退出。 | 保留可访问的列表与操作入口;不得以关闭无障碍入口作为降级。 |
| 运行中撤权 | visibility.revocation.policy 覆盖在途请求、长连接与队列。 | 拦截受影响的新读取和写入;保留受限核对路径,不能继续放行。 |
| 提及与外发通知 | action.delivery.policy 与 private.attention.policy 共同解析受众、权限、静音与紧急例外。 | 停止新的外部投递,事件仍在有权成员可查的产品内保留。 |
| 重试或部分成功 | action.retry.policy、对应操作结果记录与保留窗口齐备。 | 不自动重试未知项,提供结果核对及人工路径。 |
| 评论与正式决定 | ownership.discussion.policy;触发执行时再需 ownership.decision.policy。 | 不把讨论状态当作决定,不执行缺少有效批准的后续动作。 |
| 参与限制与求助 | private.participation.policy 覆盖作用域、复核、解除与材料权限。 | 不实施未定义的扩展限制;保留个人静音及向明确责任方求助的路径。 |
"继承默认"必须能解析到明确的值、来源与生效范围,不能只是一句说明。
九、配置生效与运行事实
每份配置声明适用对象与成员范围、责任人、取值来源、生效事件、继承链和实际值。配置变更必须说明对进行中的锁、交接、通知队列及记录的影响;不能未经显式授权扩大既有受众、恢复已撤权限或重置记录年龄。
- 收紧权限:在执行边界拦截尚未提交的动作;长连接与待发队列重新鉴权,不等待内容移交。
- 改变协作策略:先保护正在编辑的输入,明确适用对象与切换时点;不得因缺配置静默换成另一种并发算法。
- 调整个人偏好:按声明的生效时点影响后续投递;不撤销责任,不伪造过去事件已读。
- 依赖失效:阻止受影响的新动作,保留已经产生的贡献、待处理记录和修复入口;既有有效行为是否可继续须逐项说明依据。
配置记录里的期限、默认受众和裁决者解析规则都是策略;实际到期点、ACL、裁决结果与回执来自运行系统,不能由设计稿填成成功值。
十、固定底线与配置验收
以下是不可关闭要求的摘要;适用范围、例外与强度以设计规范正文为准。
| 领域 | 任何配置都不能允许 |
|---|---|
| 感知与参与 | 把会话当本人,把无回执当未读,把协作活动用于个人绩效评价;以关闭在场、静音或辅助技术模式惩罚成员 |
| 权限 | 仅靠隐藏按钮鉴权;以提及、摘要或导出扩权;撤权后凭旧会话继续提交;把外部副本说成已收回 |
| 并发与保存 | 静默丢弃输入;把收敛当语义正确;用过期锁提交;宣称已备份实际只存于离线终端的输入 |
| 操作结果 | 撤销他人全局最近一步;结果未知时盲目重试;部分成功显示全部成功;重复补发绕过静音 |
| 责任与决定 | 指派等于承接;旧请求改变新责任;已解决等于一致同意;沉默等于批准;移交失败阻止撤权 |
| 私人余地 | 自动保存变成发布;共享建议冒充私人草稿;个人筛选改变他人视图;私人讨论自动进入公共摘要 |
配置验收顺序:识别适用能力 → 检查字段类型与合法值 → 解析来源和继承 → 检查全部依赖 → 核验机制与运行事实 → 检验各方界面和辅助技术入口。逐字段记录通过、不通过、不适用或未验证;缺关键机制时不能把“配置完整”写成“设计通过”。
推荐取两个相反配置测试同一场景:开/关在场、正常/静音投递、共享/私人草稿、有权/撤权后的重连。变化应只影响配置负责的范围,不得顺带改变责任、内容权限或并发策略。
配置交付与校验
草稿默认受众不等于所有共享文档必须延迟同步;用户明确进入实时共享编辑时,其已声明的共享范围继续成立。个人草稿转共享需明确动作,已经传播的副本不能因本端撤销而承诺全收回。当前作者、责任人和在线状态仍是独立事实。
随附的可执行样例只覆盖 collab.private.draft.default,其余字段按本字典逐项校验;未覆盖不等于不适用或已通过。样例是所选字段的格式正反例,不是可直接启用全部能力的产品预设。完整产品交付另外包含适用性、依赖、证据、执行映射及进行中操作的生效边界。
字段名、类型或含义变更时更新引用方与验收样例;仅修改说明且不改变合法行为的,保留已有字段名。调用方读取解析后的有效配置,不由 UI 控件、动画或模型文字反推权限、测量或完成事实。参见对应场景。
参考来源
本文件为设计规范与Design Token提供来源。外部资料用于证明问题存在、解释机制或说明实现限制;本领域的强制要求由规范正文自行定义,不能把一家产品的行为直接当成通用要求。
一、直接核验的公开资料
以下官方页面已读取相关正文。研究说明、无障碍成功标准和产品帮助文档的效力不同;本表不构成产品实测或法律评估,也不把厂商的时长、人数、默认开关移植为本字典的默认值。
| 来源 | 阅读范围与可支持事实 | 对应设计落点 | 限制 |
|---|---|---|---|
| W3C — Collaboration Tools Accessibility User Requirements | 实时共编、批注、差异、通知与访问控制章节;提出控制活动提示、导航评论及提供非颜色区别等用户需求 | C1-7;collab.presence.presentation | 属于 Group Note,所列用户需求非规范性;不能宣称本文因此满足全部无障碍要求 |
| W3C — Understanding Status Messages | 状态消息的意图、边界与辅助技术呈现说明 | C1-7 的状态可达;变化提示不能只靠视觉 | 此页解释状态消息成功标准,不要求播报所有协作事件 |
| Yjs — Awareness | Awareness CRDT、状态传播、超时与断连处理;感知是独立的可选机制 | C1-1、C1-2、C3-2;时效信息不能当互斥保障 | 证明会话活动传播,不证明真实本人在线或已经知悉;实现时长不作通用推荐 |
| Yjs — Y.UndoManager | selective undo、scope、trackedOrigins 与 stopCapturing | C4-1;撤销按贡献来源选择,单位需明确 | 来源过滤是可用机制,不证明所有跨人依赖都可安全撤销,也不规定数据结构 |
| OWASP — Authorization Cheat Sheet | 最小权限、默认拒绝、逐请求鉴权、服务端执行、失败处理及测试 | C2-4、C2-7;撤权覆盖在途路径 | 是安全实践资料;本规范的告知、输入保护与回执规则是进一步的产品设计推导 |
| GitHub — Commenting on a pull request | 批量评论减少多次通知;解决会话折叠线程;可导航未解决、已解决与过时讨论 | C4-6、C5-6;线程状态与定位 | 不能从“已解决”推断所有参与者赞成;重新打开与异议路径是本规范的要求 |
| GitHub — About protected branches | required reviews;可选的 stale approval dismissal 与最近提交再审机制 | C5-6;批准绑定当时内容,变更后核验 | 这些是可配置的仓库策略,不是所有讨论都应走审批的依据 |
| Slack — Pause your Slack notifications | 暂停、恢复、通知计划与紧急突破限制;暂停期间收到的消息可在恢复后查看 | C6-6;免打扰不删除协作事件 | 不照搬其紧急次数、身份提示或默认设置;具体边界由产品定义 |
| GitHub — Limiting interactions in your organization | 限制的操作者、活动范围、期限与排除对象 | C6-7;参与限制须有范围与解除条件 | 页面针对组织的公开仓库,不能据此要求内部团队采用同样的成员分层 |
二、学术问题空间与既有阅读记录
| 编号与来源 | 核验范围 | 可支持的事实与落点 | 不能据此推出 |
|---|---|---|---|
| R01 Gutwin & Greenberg,A Descriptive Framework of Workspace Awareness for Real-Time Groupware,CSCW(期刊)11(3–4),2002大学站点 PDF | 既有阅读记录:相关章节(第 3 节、4.1–4.4 节、第 5 节开头,PDF 第 5–13 页);历史研究 | 工作区感知的基本信息集合是回答 "who, what, where, when, and how" 的元素;框架分三部分——构成感知的信息、收集信息的机制、感知在协作中的用途。原文明确"感知是任务中的次级目标",且群件的技术条件本身就削减了可感知的信息。支持 C1-3 把感知粒度绑定到"要解决哪个协作问题",以及 C3-2 的定位粒度要求。 | 该框架是描述性的,用于刻画设计空间,不规定应当呈现哪些字段、呈现到什么粒度。原文的对象是 2–5 人的同步共享工作区,不覆盖大规模异步协作。它没有提出本规范的"粒度上限"主张——那是本规范的设计判断。 |
| R02 Grudin,Groupware and Social Dynamics: Eight Challenges for Developers,Communications of the ACM,1994课程站点转载正文 | 既有阅读记录:相关章节(八项挑战的全部标题与相关段落);转载件,非出版方页面;历史研究 | 八项挑战的前两项是"做事的人与获益的人不一致""临界规模与囚徒困境",第四项是"工作组中的例外处理",第六项是"群件评估的难度被低估"。原文写明"多数群件要求一部分人做额外的工作,去录入或处理应用所需要的信息"。支持 C1-4 的"收敛档位不得产生功能性惩罚"(成本与收益错配是既有失败模式)、C5-2 的交接证据的区分(例外处理),以及规范 2.3 节"做过头"一侧的存在性。 | 这是 1994 年的经验综述,不是实证研究,没有量化数据。它不支持任何关于当代产品采纳率的断言,也不指定本规范采用的任何具体机制。此前读的是课程站点转载件,正文与 CACM 定稿的逐字一致性未再核对。 |
| R03 Dourish & Bellotti,Awareness and Coordination in Shared Workspaces,CSCW'92作者站点 PDF | 既有阅读记录:相关章节(第 4 节 shared feedback、4.1 ShrEdit 描述、4.2 方法、4.3 观察,PDF 第 4–5 页);历史研究 | ShrEdit 在文本选区级别加锁,两人不能同时选中同一段文本;编辑动作低延迟地显示在共享窗口中,光标"碰撞"以声音与弹窗提示;同时每位用户可拥有只有自己能看见与编辑的私有窗口,用于记笔记或先写草稿再粘入共享文档。三人一组的设计师、四组录像分析。支持 C3-2(冲突提示的时机早于冲突产生)、C3-5(区块级锁定是既有做法)、C6-1 与 C6-2("共享区里的私人窗口"不是新发明,是 1992 年已有的设计)。 | 四组、每组三人、单一系统的定性观察,不能推广为普遍效果,也不能据此断言被动感知优于显式协调。它没有研究权限、责任归属或离职处置,这些落点与本文献无关。 |
| R04 Ellis & Gibbs,Concurrency Control in Groupware Systems,ACM SIGMOD 1989,pp. 399–407大学课程站点 PDF | 既有阅读记录:相关章节(摘要、第 1 节、2.1 Issues、2.2 Other Approaches,PDF 第 399–401 页);历史研究 | 明确列出锁定方案的三个问题:获取锁的开销与等待、粒度难定(该锁段落、句子、词还是字符)、以及何时请求与释放锁难以判定;并记录 "tickle locks" 这一既有做法——当前持有者不活跃时,对被锁资源的请求可被授予。原文还写明群件必须能从"参与者不告而别(突然离开会话、去倒杯咖啡)"中恢复。支持 C3-1(并发策略是预先的设计决定)、C3-5(锁必须有持有人、期限与强制解除路径)。 | 这是算法论文,其目标是收敛与响应时间,不是用户体验要求。它不支持"应当选择哪种并发策略",本规范也明确不作此规定(C3-1 边界条件)。1989 年的系统条件与今天不同。 |
| R05 Sun、Jia、Zhang、Yang、Chen,Achieving Convergence, Causality Preservation, and Intention Preservation in Real-Time Cooperative Editing Systems,ACM ToCHI 5(1),1998作者机构 PDF | 既有阅读记录:相关章节(第 1 节末的语义不一致示例、第 2 节一致性模型定义 1–3,印刷页 67–68) | 原文用一个具体例子说明:两人分别在 "student" 前后插入 "a" 与 "s",各站点内容完全一致、两个操作的意图也都被保留,结果 "There will be a students here" 仍然语义错误;作者写明这类语义不一致"无法由底层一致性维护机制在没有协作中的人介入的情况下解决"。这是 C3-3(禁止把"技术上能收敛"当作"业务上可合并")与术语表"收敛不等于正确"最直接的论据,也支持 C3-4 把裁决交回给人。 | 该文的范围是文本编辑操作的语法一致性;它证明收敛不蕴含语义正确,不提供"哪些语义组合可以安全自动合并"的清单——这正是规范附录 B.2 第 1 项自陈的薄弱处。它也不涉及权限、责任与感知。 |
| R06 Yu、André、Ignat,A CRDT Supporting Selective Undo for Collaborative Text Editing,DAIS 2015作者机构 PDF | 既有阅读记录:相关章节(第 1 节引言、第 2 节相关工作、第 3 节 Undo Effects,PDF 第 1–2 页) | 明确记录 该论文写作时 Google Drive 只允许用户撤销本人产生的操作——即"按成员维护撤销栈"在主流产品中已是既成做法,而非本规范的发明;同时引述用户研究称人们确实期望能撤销他人操作,说明这是一个取舍而不是一个已解决的问题。第 3 节给出"无根据修改"(groundless modification):撤销一次插入,而他人后续的修改依赖于它,会留下谁都没打算留下的残余。支持 C4-1(撤销解析为本人的某一步)与 C4-2(连带影响须先说明再执行)。 | 这是算法与性能论文,其用户期望一句转引自他文,此前未回溯该出处。它不评估任何撤销界面的可用性,也不支持规范附录 B.2 第 3 项所缺的实现代价评估。Google Drive 的行为以该文写作时为准,此前未在产品上复测。 |
| R07 Mazurek、Klemperer、Shay、Takabi、Bauer、Cranor,Exploring Reactive Access Control,CHI 2011作者机构 PDF | 既有阅读记录:摘要与引言(PDF 第 1 页);历史研究 | 为期一周的经验取样研究,参与者使用模拟的"响应式访问控制"系统。引言写明:现实中人们请求访问是常态,但"多数情况下响应式的策略创建并不被访问控制系统直接支持,于是用户绕到系统之外,通过邮件或电话提出请求"。结论支持响应式授权作为一种可用模式,同时指出该模式有明确缺点。直接支持 C2-6(无权访问给出可执行的下一步与申请入口,申请须有接收方与回执)。 | 研究对象是家庭数据共享,不是组织协作;参与者规模与时长有限,且系统是模拟的。它不证明所有产品都应提供申请功能——规范 C2-6 因此标【应当】并允许不透露存在性的应答。 |
| R08 Rashidi、Vaniea、Camp,Understanding Saudis' Privacy Concerns When Using WhatsApp,USEC'16(2016-02-21)NDSS 站点 PDF | 既有阅读记录:摘要与引言(PDF 第 1 页) | 626 名沙特 WhatsApp 用户的问卷(滚雪球抽样)。摘要写明用户熟悉隐私设置并尤其用它来限制"最后活跃时间"的可见性;83.9% 的受访者曾被陌生人联系;受访者希望在被拉进群组前被询问,并希望能控制个人资料信息(如电话号码)的可见性。支持 C1-1(最后活跃时间是一类独立的暴露)、C1-4(被感知方需要可查明且可收敛)、C1-5(在场与回溯记录分别决定)、C2-2(把人加入范围前后的告知)。 | 单一国家、单一即时通讯产品、滚雪球样本、2016 年数据;比例数字不可迁移到工作协作产品或其他文化。原文研究的是社交通讯的隐私,不是工作场所的监控合规。它不支持任何默认值的具体选择。 |
| R09 Hudson & Smith,Techniques for Addressing Fundamental Privacy and Disruption Tradeoffs in Awareness Support Systems,CSCW'96 | 待核验(此前未取得可访问的公开原文) | 作为 C1-3"同一份信息,粗一点是协作、细一点是监控"这一取舍的经典线索保留。 | 本规范未从中取用任何机制、术语或结论。引用前必须获取原文。 |
| R10 Why Did You/I Read but Not Reply? IM Users' Unresponded-to Read-receipt Practices and Explanations of Them,CHI 2022,DOI 10.1145/3491102.3517496 | 待核验(全文页返回 403,仅见检索摘要) | 作为 C1-5"已读回执是一类回溯性暴露并会产生回应压力"的问题来源线索。 | 方法、样本与全部结论均未核验;规范正文与字典因此未引用其任何发现或数值。 |
三、从资料到条款的设计推导
| 需要解决的问题 | 本规范的选择 | 证据边界 |
|---|---|---|
| 协作提示存在却无法操作 | 信息、评论和差异具备非颜色呈现与键盘入口;活动播报可收敛 | 无障碍资料支持需求;具体交互仍须辅助技术与用户验证 |
| 讨论关闭被当成大家同意 | 分开线程解决、正式决定与执行;正式决定绑定内容快照及资格 | GitHub 展示这些机制可以分开;本规范不要求复制其审批人数 |
| 撤权后仍有旧会话或队列 | 在执行与投递边界重新鉴权,并区分受理与生效 | OWASP 支持逐请求与失败安全;跨系统传播时限须实际验证 |
| 短时网络错误造成重复副作用 | 查询实际结果、防重、按项重试,未知保留未知 | 从操作承诺推导,不宣称任何协议可保证跨所有系统绝对一次投递 |
| 过多提及、静音与任务脱节 | 接收偏好独立于权限、责任和事件记录,提及不隐式授权 | 通知控制有平台实例;“提及不扩权”是本规范的保护要求 |
| 参与控制产生错误安全感 | 分开个人屏蔽、限制参与与撤销访问,提供求助及复核 | 公开平台证明限制有作用域;内部协作仍需按组织流程验证 |
| 私人建议与公开草稿混淆 | 是否私有按实际可见范围及通知/检索路径判断 | 来自承诺反推;功能名、建议样式和“可撤销”不能证明私有 |
四、尚未被证明的部分
- 没有跨产品通用的自动合并语义清单、锁时长、交接超时、记录保留期或紧急通知频率;配置必须附任务依据和验证。
- 此次未开展用户研究、产品故障注入或系统性文献综述。看板、白板及评审的组合用例是评审材料,不是已经通过的测试结果。
- 原有研究多数来自文本共编和小型群组;不能外推为所有组织文化、社交平台或实时会议的行为规律。
- 员工监控、个人信息处理、数据保留、电子取证与跨境处理未做法规核验;文档不作法域结论。
- “感知数据不用于评价个人”、私人草稿默认和未回应不构成批准属于明确的产品承诺,不能伪装成文献已经证明的唯一设计。
- 原则归属仍需通过真实评审检验;本次补充的规则及 Token 字段是本领域词汇,不是外部标准的既有字段。