I3.04.1conflict surfacing设计

冲突需暴露给用户而非自动取一

别名: 冲突暴露 · 自动选边 · hidden conflict · 同步冲突可见

概念解释

同一份数据在两边被改成了不能并存的样子,系统必须把这件事说成冲突,交给人看,而不是在两份里悄悄挑一份留下。冲突暴露(conflict surfacing)是把分歧从同步管道里拿出来,变成界面上的一个事件。自动取一(按时间戳、按设备、按「看起来更新」)不是解决,是把选择权从作者手里拿走,还假装没有选择发生过。

这条不管合并粒度有多细、也不规定解决时要不要并排保留原文。它只判定:冲突发生的那一刻,人知不知道发生了冲突。

机制

同步的默认故事是「最后会变成同一份」。人按这个故事离开:在手机上改标题,在电脑上改正文,以为会合成一篇。当两处改的是同一处意义,故事破产。破产若不被命名,界面仍呈现一份完整文档,模型继续当它是「双方都接受的那份」。被丢掉的那一侧作者回来,看见自己的句子不在了,会去怪自己没保存,而不是怪一次未出示的裁决。

自动取一之所以诱人,是因为它让同步管道保持「总是有一个值」。管道开心,作者的因果断了:我写过的字没有失败事件就消失。暴露冲突是故意让管道在这一格停住,用一个未决状态替换那个假的单一值。未决不舒服,但它是真的。

边界

真正正交的改动(一人改标题、一人改封面图)可以自动并,不必喊冲突——那不是取一,是两处都留下。机器能确定「这是同一字符级补丁的重放」(同一操作从离线队列打了两遍)应去重,不是冲突。安全策略可以在暴露之前先挡住(恶意设备、被盗会话写入),但挡住仍要留下「有一份写入没被接受」的痕迹,不能静默丢。只读副本、备份回放、审计日志里出现分叉,面对的是运维而不是文档作者,暴露通道可以不是编辑器里的横幅。实时共同光标下的字符级碰撞若每秒都弹冲突对话框,人会关掉提示;那种碰撞要用更细的合并,而不是用自动取一来假装没有碰撞。

怎么落地

  • 当两份写入不能并存时,进入明确的冲突态:文档、记录、消息都要能看得出「未决」,不要继续显示单一干净版本。
  • 禁止用时间戳或「这台设备优先」在无提示的情况下丢掉另一侧。
  • 冲突态要打断下一步依赖这份数据的发布或提交,直到人见过分歧。
  • 验证:两台设备同时改同一句,然后同步。若结果是其中一句加上一句消失、且没有任何「发生了冲突」的界面,判定失败。再找消失那一句的作者来看屏幕,问「你的那句去哪了」——若他们只能猜「大概没保存」,就是自动取一。

延伸

  • 同组I3.04.2 冲突解决需保留双方内容 · I3.04.3 最后写入胜出会造成静默数据丢失
  • 相邻I3.11 同步冲突与合并 · I3.10 离线状态与本地优先
  • 站内检索conflict surfacing · sync conflict · automatic resolution

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/I3.04.1