问题概述
当排班目标干员因训练室专精等原因暂时不可派遣、因此不出现在进驻选人列表中时,Mower-NG 会反复执行相同的选人计划,无法自动跳过该干员或降级补位,形成高频重试的“活锁”。
这类情况在长期无人值守时并不罕见:训练室通常持续有人,被训练者无法中途换下;只要该干员恰好又是当前排班需要的主力或替补,就可能阻塞整套基建调度。
复现步骤
- 在固定排班中为某岗位设置主力 A,并设置替补 B。
- 将 B 放入训练室作为被训练者进行专精,使其无法换下,也不出现在其他设施的进驻选人列表中。
- 等待 A 需要休息,调度器选择 B 顶班。
- Mower-NG 搜遍选人列表后提示缺少 B,房间验证失败。
- 随后再次生成并执行同样的计划,仍然寻找 B;约二十余秒重复一轮,可持续到训练结束或人工干预。
当前行为
- 选人失败后没有顺延到其他替补;
- 同一不可派遣干员被高频重复搜索;
- 重试期间可能延误其他房间、无人机或收菜任务;
- 进程并未退出,但调度器事实上陷入活锁,不适合长期无人值守。
借助本地 Codex 梳理运行日志与调用链后,初步发现:选人求解器会返回“是否完整选中目标干员”,但上层调用未利用该结果切换候选人;后续房间验证失败后仍会重复原计划。
期望的最小容错
建议增加一个简单的 fail-open 降级流程:
- 同一目标干员连续两次未找到后,本轮将其标记为“临时不可用”,避免将一次识别波动直接判成缺员。
- 优先顺延到该岗位配置中的下一名替补。
- 所有配置替补都不可用时,从以下候选池中临时补位:
- 当前空闲且心情足够;
- 未出现在任何固定主力/替补排班名单中;
- 具备对应设施的通用效率提升或心情消耗降低技能。
- 如果仍然无法补位,尽量保留当前在岗干员,并对该任务设置重试上限与退避时间,不阻塞其他调度任务。
- 经过一定冷却时间(例如 30~60 分钟)后重新检测原目标干员,使其在专精结束后自动回归。
- 对必须成组工作的组合,可整组回退到预设散件班,避免只替换一人破坏组合。
核心诉求并非限定具体实现方式,而是:单个目标干员暂时不可派遣时,不应让整个基建调度无限重复同一失败计划。
环境
- Mower-NG
main分支 - 可在 2026-10-01 附近版本复现
- 未附原始日志、排班表和截图;如开发者需要,可再提供去除本机路径及账户信息后的最小日志片段。