用途与实际影响
这项功能怎样使用
为什么需要它
私有代码仓库能找回已经提交的规则,但救不了还在写、没提交的修改。G 盘这份工作文件副本为故障恢复提供另一条线索;它只是某次复制的结果,不能当成当前规则或实时备份。
举个实际例子
遇到故障,我会问:“我那批还没提交的规则修改,G 盘现在到底还能找回哪些?”系统先核对 G 卷、镜像时间、日志和实际文件,再从 PRIVATE(私有) Git 取回提交历史,只把确认过的 G 工作树文件叠加进去。我得到的是可用文件清单和不确定项,不是“实时备份、完整恢复”的空头保证。
最后我会得到什么
我会得到 G 盘实际还能读到哪些未提交文件、最后复制时间和哪些内容仍不确定。复制中断可能已经改了 G 盘的一部分,不能只看旧的成功记录;现有每日任务和最新覆盖仍未得到确认。
正常时
这一次复制完成且目标文件可核对时,说明该次 G 盘副本可用,不外推下一次或实时覆盖。
发现问题时
复制中断时先看 G 盘实际文件,再决定能叠加什么;旧成功记录不能证明失败前的副本保持原样。
入口不可用或证据不足时
G 盘不在、目标路径不符或任务没有运行证据时,明确说最新副本无法确认,不改从其他未登记磁盘取。
从哪里开始
这是 .agents 的历史热镜像能力;需要找回未提交规则文件时,在已接入本机的 AI 对话中提出恢复检查,由 PCConfig 与镜像状态分别核对。
需要准备什么
- 故障前的大致时间
- 要找的规则文件或修改
- 可用的 G 盘与 Git 历史
从开始到拿到结果
- 1
先确认恢复材料
AI 查看 G 盘、最后回执、日志和实际文件,确认这次镜像是否真的覆盖目标时间。
- 2
比较两种来源
已提交历史从私有 Git 取,未提交文件从已核对的 G 盘副本比较,不直接覆盖当前生效的规则文件。
- 3
谨慎恢复
交回可恢复文件和缺口;原地镜像失败可能已部分改变 G,现有每日任务和最新覆盖不能凭旧回执宣称正常。
技术实现与依据
这里保留实现、关键条件、精确入口、历史记录和验证结果。
可选热镜像源码与历史状态存在;受管任务当前无此入口,最新这份镜像覆盖未证关键规则与设计选择
固定 source/destination 之外不允许 /MIR。
PRIVATE(私有) Git 与 G 热镜像互不冒充;H 不在自动链中。
原地/MIR不是原子代际切换,也没有previous或自动rollback;开始复制后的失败可能已覆盖或删除目标文件。
旧状态回执不能证明当前工作树已覆盖,也不能证明失败后的旧G镜像完整。
每日任务是可选安装层,当前受管登记无此名称或动作;不据旧installer恢复任务,源码/测试存在也不能证明当前安装。
本模块用到的名词
- Working-tree hot mirror(工作树热镜像)
- 保存当前文件和未提交状态的固定 E→G 镜像;不是 Git 仓库副本。
- Hot mirror status(热镜像状态回执)
- 记录一次镜像的时间、HEAD、dirty 数、排除项和 robocopy 结果;不是最新覆盖或任务安装证明。
- robocopy /MIR(目录镜像)
- 在目标原地复制、覆盖并删除多余项,让目标趋近源;没有事务回滚,失败可能留下部分变化,因此只允许固定路径。
专业定义
PRIVATE(私有) Git 保存已提交历史;G 盘热镜像补充保存工作树和未提交文件,但当前最新覆盖仍是 Unknown(未验证),也不等于实时或完整仓库备份。
解决什么
解决未提交工作只有一个故障域、镜像目标漂移、并发镜像互相覆盖、陈旧回执冒充当前覆盖,以及热备越界复制 Git 历史或 H 冷备的问题。
当前怎样实现
- Sync-AgentsHotMirror.ps1 只接受固定 E:\.agents 与 G:\80_Backup\ControlPlane\.agents,先验证 G 卷 Healthy/OK,再取得 Global\CodexAgentsHotMirrorLock,最多等待 30 分钟。
- 镜像使用有界 robocopy /MIR、/COPY:DAT、/DCOPY:DAT、/XJ、/R:2、/W:3、/MT:8;排除 .git、临时目录、pytest cache 和 Codex Remote(远端仓库) 附件,退出码 >=8 才失败。
- /MIR在固定G目录原地执行,既覆盖变化文件,也删除源端已不存在的目标项;没有独立staging、previous代际、原子切换或失败回滚。>=8或进程中断时必须把G视为待核对的部分结果,不能承诺旧副本未变。
- 仅robocopy退出码低于8且非ListOnly时写agents.hot-mirror-status.v1,记录时间、固定源/目标、模式、exit、source Git HEAD、dirty entry count与排除项。失败先抛错,不更新成功状态JSON,已有旧状态可能留存;追加日志与实际文件才帮助判断这次做过什么。脚本不做全树hash(内容指纹)/零差异验收。
- 可选 AgentsHotMirror-Daily 为每日20:30、StartWhenAvailable=true、Limited交互用户、wscript无窗口、IgnoreNew、3次/10分钟重试、2小时上限且 WakeToRun=false;明确不写 H。
执行流程
- 1
只读检查G卷、任务、最后状态和本次日志
- 2
验证固定E/G路径并取得全局互斥;此时失败尚未修改镜像文件
- 3
在G目标原地运行/MIR,允许覆盖和删除;中断不回滚
- 4
退出码低于8才写status v1;失败则保留E源并检查G实际部分结果
- 5
恢复先从PRIVATE(私有) Git取得提交历史
- 6
核对镜像时间、源HEAD、日志和实际文件后,再比较并叠加G工作树文件
边界
- 不复制 .git、临时目录、pytest cache 和附件
- 不访问或写入 H 冷备
- 不创建第二规则权威
- 不从旧回执推断当前已覆盖或失败后的旧G完整
- 原地镜像不保留上一代、不保证原子快照、不提供失败回滚;一次 /MIR 没有先完成新增/修改复制核验再清理的独立阶段,E131 保留集同步要求与当前实现缺口分别陈述
- 未核对时间、HEAD、失败日志和实际文件前不把G镜像覆盖回E
失败与恢复
- G 卷不健康、不可用或镜像互斥超时
- 不运行 robocopy;保留 E 源和既有 G 镜像,报告精确门禁。
- robocopy返回8或更高,或执行中断
- 判本次镜像失败或未完成,保留E源与日志;G可能已部分复制、覆盖或删除,旧成功JSON也可能仍在。先核对实际目标,不把它称为完整旧恢复点,不盲目反向覆盖E。
- 每日任务未安装或状态回执陈旧
- 只报告源码合同和历史镜像存在,自动热备状态保持 Unknown(未验证)。
- 恢复镜像 HEAD/时间与当前源冲突
- 停止覆盖,先保留两份文件并由 Owner 比较;不使用 /MIR 反向猜测。
真实入口
E:\.agents\tools\Sync-AgentsHotMirror.ps1固定E→G镜像、卷健康、互斥、robocopy边界与状态回执
E:\.agents\tools\Install-AgentsHotMirrorTask.ps1每日20:30、错过补跑、无窗口、Limited和有界重试任务合同
E:\.agents\tests\Test-AgentsHotMirror.ps1固定路径、排除项、无H盘、任务设置与回读合同回归
如何验证
- Test-AgentsHotMirror.ps1 验证固定E/G路径、/MIR与.git排除、任务网络独立/错过补跑/3次重试/不唤醒/2小时上限、隐藏launcher与不触碰H。
- 2026-09-08零写核对:G卷Healthy/OK,历史status仍在;源installer的精确任务名确为AgentsHotMirror-Daily。PCConfig当前89个登记项既无此名称,也无Sync-AgentsHotMirror动作;08:12:57Z管理员完整观察与89/89定义一致,不是由普通权限单次未找到推断全机状态。
- 历史 status 最后镜像时间为 2026-07-30、HEAD=c96dbf1、dirty=21;因此当前安装和最新工作树覆盖保持 Unknown(未验证)。
与其他模块的关系
Git 历史由 PRIVATE(私有) 仓库负责;本模块只补未提交工作树恢复层。context-evidence 模块负责判断这份回执属于哪一证据层,PCConfig 机器备份和 H 冷备不由本模块替代。
