性质:只监测、不重复执行的核查。本轮未启动任何同步、未走同步桥、未 claim、未抢租约、未删除目录锁、未读取或输出任何凭据。
业务日 2026-11-01(Asia/Shanghai)夜间同步:未运行(not_run),无成功回执。
未运行的原因经定位为 用户主动停用:用户于 2026-11-01 16:57(本地时间)要求「从今天起先停止每日 23:00 的同步任务」,并执行了 launchctl disable + launchctl unload。LaunchAgent 处于 disabled 状态属预期状态,不构成同步系统故障。
因此本轮不判定为失败,也不触发打扰式通知;仅按核查要求留档。
需要留意的前提事实:业务日 2026-11-01 全天没有任何一次同步执行,新系统该日数据未从旧系统补齐。
| 项目 | 核查结果 |
|---|---|
| plist 路径 | /Users/mac/Library/LaunchAgents/cn.xiaoshu.legacy-direct-sync-nightly.plist(存在,mtime 2026-10-15 00:04) |
| ProgramArguments | /usr/local/bin/node + --env-file=/Users/mac/.config/xiaoshu/legacy-sync-nightly.env + ~/Library/Application Support/XiaoshuSync/scripts/run-nightly-direct-sync.mjs + --scheduled —— 与预期一致 |
| EnvironmentVariables.TZ | Asia/Shanghai —— 与预期一致 |
| StartCalendarInterval | Hour=23 / Minute=0 —— 与预期一致 |
| RunAtLoad / KeepAlive / ThrottleInterval | true / SuccessfulExit=false / 300 —— 每 5 分钟失败重试的定义仍在 |
| node 可用性 | /usr/local/bin/node 存在,v22.17.0 |
| 独立运行目录 | ~/Library/Application Support/XiaoshuSync/scripts/ 完整,含 lib/legacy-direct-projection.mjs、lib/legacy-direct-specs.mjs、lib/sync-alerts.mjs |
实际触发情况:
launchctl print gui/501/cn.xiaoshu.legacy-direct-sync-nightly → Could not find service ... in domain for user gui: 501,即该 job 未注册(已被 unload)。launchctl list 中 530 个 job 内无该服务。launchctl print gui/501 的 disabled 列表中明确列出 "cn.xiaoshu.legacy-direct-sync-nightly" => disabled。/var/db/com.apple.xpc.launchd/disabled.501.plist 中该键值为 <true/>,文件 mtime 2026-11-01 16:57(本地时间)。runs 计数与 last exit code 无法取得。停用来源(关键): 工作区日志 .workbuddy/memory/2026-11-01.md(mtime 同为 2026-11-01 16:57)记载:用户要求「从今天起先停止每日 23:00 的同步任务」,已执行 launchctl disable gui/501/cn.xiaoshu.legacy-direct-sync-nightly 与 launchctl unload 同 plist,当前会话已卸载、无运行实例,plist 文件保留可恢复。
环境前提核查(排除「未开机/未登录」误判): 机器 uptime 2 天 15 小时,控制台会话自 2026-10-30 07:51 起持续存在。本次未运行不是关机或未登录造成,也与凭据、网络、桥无关,纯粹是调度被主动停用。
23:08 观察点复验(确认 23:00 确未触发): 23:08:42 CST 复查 —— 22:55 之后无新报告文件;launchagent.log mtime 仍为 2026-11-01 01:29:26(未追加);launchctl print gui/501 仍显示 disabled;无残留目录锁。属确定性终态,无需继续轮询。
业务日 2026-11-01 共 5 份运行报告,全部为 blocked,均发生在停用之前(当日凌晨),被上一业务日运行的服务端租约阻塞:
| 报告文件 | 起(CST) | 状态 | 原因 | failed |
|---|---|---|---|---|
2026-11-01-direct-1ff12f46….json |
11-01 00:05:10 | blocked | another_sync_running |
1 |
2026-11-01-direct-e4d663c5….json |
11-01 00:15:11 | blocked | another_sync_running |
1 |
2026-11-01-direct-5cf5ba2a….json |
11-01 00:25:11 | blocked | another_sync_running |
1 |
2026-11-01-direct-ce49018b….json |
11-01 00:35:11 | blocked | another_sync_running |
1 |
2026-11-01-direct-645dd2fe….json |
11-01 00:45:13 | blocked | another_sync_running |
1 |
这 5 次为 5 分钟间隔重试,被业务日 2026-10-31 的 runId 579148c2…(直至 11-01 01:29 才完成)所持的服务端租约阻塞。按约束,本轮未干预该租约。
~/.local/state/xiaoshu/legacy-sync/direct-nightly.lock 不存在,无残留锁需要清理,本轮未删除任何锁。direct-alert-state.json 仍为 {"failed":false,"lastKey":"recovered",...}(01:29 成功时写入),尚未反映本日未运行——告警状态只在进程实际运行时更新,本次因进程从未启动而无更新。后续核查应以服务端 runs 与本机报告为准,不以该文件判定当日结果。launchagent-error.log 的排除说明错误日志尾部存在 ERR_MODULE_NOT_FOUND: …/scripts/lib/sync-alerts.mjs。经核对,该日志文件 mtime 为 2026-10-17 23:01,属 10-17 的历史错误;当前 lib/sync-alerts.mjs 实际存在(1,989 字节,mtime 2026-10-15 00:04)。该错误与 2026-11-01 状态无关,不作为本次根因。
action:'status',无写操作)只读查询 xiaoshu/sync/direct-v1,返回 version=2026-10-14-finance-ledger-v3、source=old-api/WXAPP、bridgeUsed=false。运行记录仅 3 条:
| 业务日 | runId | 状态 | startedAt(Z) | finishedAt(Z) | failed | 9 数据集 reconciled |
|---|---|---|---|---|---|---|
| 2026-10-31 | 579148c2… |
completed-with-preserved-conflicts | 2026-10-31T15:00:06.098Z | 2026-10-31T17:29:15.274Z | 0 | 全部 true |
| 2026-10-30 | fcb3e9d7… |
completed-with-preserved-conflicts | 2026-10-30T15:00:07.266Z | 2026-10-30T16:06:17.358Z | 0 | 全部 true |
| 2026-10-29 | 5a26a6c5… |
completed-with-preserved-conflicts | 2026-10-29T15:00:04.935Z | 2026-10-29T15:35:05.711Z | 0 | 全部 true |
服务端不存在业务日 2026-11-01 的任何运行记录(无 runId、无 startedAt、无 finishedAt、无回执)。这与本机「零次成功执行」完全一致。最近一次成功回执仍为业务日 2026-10-31。
| 验收项 | 结果 | 说明 |
|---|---|---|
| 9 个业务数据集(专项训练、词库、课程绑定、每日学习、练习、抗遗忘、预约、上课、测评)业务 ID / 主附表 / 校验和核验 | ✗ 未执行 | 服务端与本机均无当日数据集记录 |
每个数据集 reconciled=true 且每业务编号恰一份主表 |
✗ 未执行 | 同上 |
| 账号只新增并匹配旧用户编号、栏目只补缺 | ✗ 未执行 | 无补缺结果 |
| 财务分组(stype=1/2/3/4)回读核对 | ✗ 未执行 | 当日回执不包含 |
failed=0 |
✗ | 5 次尝试均 failed=1(blocked) |
| 锁已释放 | ✓ | 目录锁不存在;但非因成功释放 |
来源 old-api/WXAPP 且 bridgeUsed=false |
— | 未产生运行,无从判定 |
settlementReady |
— | 未设置(本方案本就不设置) |
结论:验收清单全部不满足,不存在 2026-11-01 成功回执,不得报成功。
completed-with-preserved-conflicts,runId 579148c2…,新增 1,072 / 更新 182 / 失败 0 / 保留冲突 4,204,9 数据集与财务分组全部 reconciled,锁已释放,真实 23:00 触发(23:00:06 起)。身份冲突(旧编号 1871)已于 11-01 00:50 处置完成。launchagent_disabled_by_user_request。success_to_stopped_by_user_request —— 由成功转为主动停运,非系统故障。上一阻塞项 legacy_account_identity_conflict 已彻底消除(10-31 处置后 identityConflicts=0),当前不存在任何数据层阻塞。恢复命令(本轮未执行,需用户决定):
launchctl enable gui/$(id -u)/cn.xiaoshu.legacy-direct-sync-nightly
launchctl load ~/Library/LaunchAgents/cn.xiaoshu.legacy-direct-sync-nightly.plist
提示:该 plist 含 RunAtLoad=true,启用并加载后 launchd 会立即补跑一次当前业务日的同步。这是真实执行动作,超出「只监测」边界,故本轮未执行。
停运期间逐日缺口:2026-11-01 已产生 1 天空档;恢复后如需补齐,应按业务日逐日回溯执行,而非一次性覆盖。
夜间核查自动化本身未被停用,仍会每夜留档。若用户希望一并停止核查自动化,需另行处理。
本次不触发打扰式通知。依据:未运行系用户当日 16:57 明确要求停用所致,属预期状态,非「重大失败变化」;用户已知晓该操作,重复提醒属噪音。本结果仅写入本地私有报告、本核查记录与自动化概览。
本报告不含任何凭据、会话令牌或主密钥内容。