xb-sync:多 Agent 记忆同步
调用前先读 ../xbskill/references/interaction-settings.md,按用户已选调用强度和保存提示执行;明确指定其他技能或拒绝 XB 时退出。未初始化时只允许配置与说明,禁止代选或先执行后确认。
直调契约:完整读取 ../xbskill/references/contracts.md、../xbskill/references/resolution-standard.md、../xbskill/references/context-protocol.md、../xbskill/references/session-memory-protocol.md 与 ../xbskill/references/runtime-compatibility.md。任一文件缺失时,报告精确路径并停止,不得凭记忆补造。本体查询依赖 ../xb-memory/scripts/memory_ontology.py;缺失时报 E_DEPENDENCY 并只停用 query 子命令。
安装约定:随 xbskill 完整套件安装,xb-sync、xbskill、xb-memory 保持同级。Python 3.10+,仅标准库。不得单独复制本目录后假定依赖齐全。
触发与适用边界
用户主结果是:同一台机器上多个 AI 宿主(Kimi/daimon、Codex、ZCode、Claude Code 等)各自项目里散落的 xbskill 记忆需要被发现、归集或跨根检索。
不适用:跨机器同步(交给人工拷贝或用户自行安排的文件同步,本 Skill 不联网);把记忆写入 ~/.codex、~/.claude、~/.zcode 等工具私有目录(明确禁止);合并两个本体存储(见下);替用户裁决冲突内容。
核心模型:登记簿 + 唯一真源 + 扇出查询
- 登记簿(registry):一个
memory-homes.json,记录本机所有已知记忆根的路径、角色(canonical/satellite)、登记时间。位置由用户在首次discover时指定,建议放在真源旁边。 - 唯一真源(canonical home):一个用户确认的
<project>/memory/xbskill/。登记簿记录这个选择;各 Agent 的保存与恢复仍须在当前会话显式选定对应项目路径。脚本不修改宿主配置,也不自动让其他专科读取登记簿。跨根 query 继续查询原根。 - 只增不覆盖归集:
sync把真源缺失的完整会话复制进来;相同会话 ID 只有整组路径和哈希完全一致才跳过,任一差异将整组放入<home>/conflicts/<来源路径SHA256>/sessions/。同名来源与旧冲突版本各自保留。context、知识包及散文件放入<home>/imports/<来源路径SHA256>/待核对区,保留来源作用域;它们不直接进入真源的活跃背景。收据记录原根、相对路径、SHA256、去向与日期。 - 扇出查询代替本体合并:两个
ontology/存储的断言 ID、作用域和敏感级各自独立,机械合并会破坏来源链。跨根检索用query对每个登记根分别执行memory_ontology.py query,结果带来源根标签并列返回,按候选事实处理,不静默合并。 - 项目本地文件不动:
progress.md、memory-settings.md绑定项目线,永远不参与归集。
记忆作用域分账保持不变:人物/公司档案是带日期的候选事实,同步只改变它们的存放位置,不提高任何断言的证据等级;restricted + session_only 内容随会话目录移动后仍是会话级。
流程
- 发现:
discover --scan-root <用户确认的扫描范围>。扫描范围必须由用户确认(通常是一个工作区父目录),不全盘扫。输出每个根的会话数、context 文件数、是否有本体存储。已有授权可直接沿用;--registry只预览登记,增加--apply才写入。扫描深度默认 8,可用--max-depth调整;裁剪目录逐条显示。 - 定真源:向用户列出候选根的内容摘要,由用户指定 canonical home;通过
sync --home指定已登记且已存在的根,成功 apply 后持久化 canonical。比较项目边界、日期与内容相关性;内容数量只能作为线索。缺少合法根时报错,由用户给出已有项目,禁止初始化空白来冒充已存档。 - 归集:
sync --registry <登记簿> --home <真源>先跑 dry-run,把计划(复制/跳过/冲突/排除/本体手工项)逐条展示给用户;沿用用户已给出的准确目录与迁移授权;授权范围不足时一次展示路径和影响。加--apply执行前暂停所有参与目录的写入者。执行使用独占新建文件,不覆盖、不删除卫星根;不宣称跨进程事务,失败显式列出部分完成文件并停下,保留来源供复核和重跑预览。 - 跨根检索:
query --registry <登记簿> --request <查询请求.json>,请求文件格式同xb-memory。输出按根分组并标注"并列候选事实"。 - 收尾:向用户报告真源路径、复制数、冲突数、未处理项;提醒各 Agent 后续把保存/恢复对准真源(这属于各专科运行时的用户决定,本 Skill 不替它们改配置)。
分支闸门
- 私有工具路径、符号链接或 junction/reparse point:报
E_PRIVATE_PATH/E_LINK并停止;所有参与目录先暂停写入,避免扫描期间路径被其他进程替换。 - 登记簿缺失或格式非法:报
E_REGISTRY_MISSING/E_REGISTRY_SCHEMA;仅 discover 可创建登记簿。 - query 子进程失败、超时或输出损坏:按根输出
E_QUERY并非零退出;无本体根逐条标注未初始化,绝不伪报无匹配。每根默认 20 秒,上限 60 秒。 - 登记根在磁盘上消失:报
E_ROOT_MISSING,保留登记,不静默移除。 - 真源参数不是
<...>/memory/xbskill结构:报E_HOME_INVALID,拒绝执行。 - apply 过程中目标文件突然出现:
E_RACE,非零退出并列出部分完成文件。 - 用户要求删除卫星根或合并本体存储:属于删除/批量迁移,按 session-memory-protocol 第 7 节单独授权,执行前复述绝对路径和影响。
- 宿主为 Windows 版 Codex Desktop 时,遵守 session-memory-protocol 第 2 节安全分支:不读取宿主私有状态,只操作用户明确给出的目录。
直接产物
- DiscoveryReport:扫描范围、发现的根、各根内容摘要、登记动作。
- SyncPlan / SyncResult:逐条的复制/跳过/冲突/排除/本体手工项清单;apply 后的实际复制数与收件箱路径。
- FanoutResult:按来源根分组的查询命中,带来源标签与日期。
- 产物状态只证明文件动作完成;只有另一个 Agent 的新会话真的从真源命中旧记忆、用户确认少重述,才算现实采用。
正例、反例与边界例
- 正例:用户在 Kimi 里发现 Codex 项目存过档。discover 找到两个根,用户指定内容多的为真源,dry-run 显示 3 个会话可复制、1 个 context 文件进入待核对区,apply 后会话并入、context 保留原项目来源。下个会话用 query 扇出检索。
- 反例:不加区分地把两个
ontology/的assertions.json拼接成一个文件。这会混掉断言来源与作用域,禁止;跨根检索走扇出。 - 边界例:用户要求"把记忆同步到另一台电脑"。本 Skill 不联网、不管跨机;只输出本机真源路径,由用户自行决定拷贝方式,并提示敏感内容边界不变。
验证、失败与翻转
- 脚本验收:discover 对已知目录必须找出全部
memory/xbskill;sync dry-run 不写任何文件;apply 后每个目标哈希与来源相同,另有一份来源收据,卫星根零改动;同会话 ID 的差异整组进收件箱;context 原样归档到待核对区。 - 失败信号:出现覆盖、静默跳过冲突、项目本地文件被复制、无标签合并查询结果。
- 完成范围:只可声明"记忆根已发现/登记/归集"。多 Agent 真正共用记忆,要等另一个宿主的新会话实际命中后才算。
机械命令
<PYTHON3> -B <xb-sync目录>/scripts/xb_sync.py discover --scan-root <目录> [--registry <登记簿.json>] [--apply]
<PYTHON3> -B <xb-sync目录>/scripts/xb_sync.py status --registry <登记簿.json>
<PYTHON3> -B <xb-sync目录>/scripts/xb_sync.py sync --registry <登记簿.json> --home <真源.../memory/xbskill> [--apply]
<PYTHON3> -B <xb-sync目录>/scripts/xb_sync.py query --registry <登记簿.json> --request <查询请求.json> [--memory-script <memory_ontology.py路径>] [--timeout 20]
query 默认在 <xb-sync目录>/../xb-memory/scripts/memory_ontology.py 找依赖;非标准安装位置用 --memory-script 显式指定。
观察字段与竞争解释
先区分:记忆位于另一个根、同一根的检索请求不匹配、本体未初始化或索引损坏、不同项目恰好同名。记录用户授权范围、根路径、项目用途、canonical、会话 ID、文件哈希、本体状态与查询错误。用 discover/status 核对路径,再对同一请求按根 query;同根查询失效交给 xb-memory 检查,新增复制不能修复索引。
跨项目人物同名或组织背景不同,保留来源标签并请求用户在需要采用时消歧。受限与会话级数据仍保持原作用域。调用子技能保持 xb-sync,其他专科只提供支持结果。用户决定真源、迁移范围与冲突采用项,脚本负责报告和可验证复制;公司规则或目录权限不足时停止受影响动作。
来源与验收
机制由本项目独立实现,基于既有 session-memory-protocol 和 xb-memory 的公开接口;无新增外部依赖。保留登记与扇出机制,重推导会话整体冲突与跨项目隔离,拒绝自动合并本体及按文件数推断唯一正确背景。陌生试用与独立评审见 references/validation.md。维护者运行 scripts/test_sync.py 验证复制、冲突、失败返回与真实查询;临时样本与真实记忆隔离。