【BUG/建议】排班目标干员不可派遣时无限重试,建议自动降级补位

问题概述

当排班目标干员因训练室专精等原因暂时不可派遣、因此不出现在进驻选人列表中时,Mower-NG 会反复执行相同的选人计划,无法自动跳过该干员或降级补位,形成高频重试的“活锁”。

这类情况在长期无人值守时并不罕见:训练室通常持续有人,被训练者无法中途换下;只要该干员恰好又是当前排班需要的主力或替补,就可能阻塞整套基建调度。

复现步骤

  1. 在固定排班中为某岗位设置主力 A,并设置替补 B。
  2. 将 B 放入训练室作为被训练者进行专精,使其无法换下,也不出现在其他设施的进驻选人列表中。
  3. 等待 A 需要休息,调度器选择 B 顶班。
  4. Mower-NG 搜遍选人列表后提示缺少 B,房间验证失败。
  5. 随后再次生成并执行同样的计划,仍然寻找 B;约二十余秒重复一轮,可持续到训练结束或人工干预。

当前行为

  • 选人失败后没有顺延到其他替补;
  • 同一不可派遣干员被高频重复搜索;
  • 重试期间可能延误其他房间、无人机或收菜任务;
  • 进程并未退出,但调度器事实上陷入活锁,不适合长期无人值守。

借助本地 Codex 梳理运行日志与调用链后,初步发现:选人求解器会返回“是否完整选中目标干员”,但上层调用未利用该结果切换候选人;后续房间验证失败后仍会重复原计划。

期望的最小容错

建议增加一个简单的 fail-open 降级流程:

  1. 同一目标干员连续两次未找到后,本轮将其标记为“临时不可用”,避免将一次识别波动直接判成缺员。
  2. 优先顺延到该岗位配置中的下一名替补。
  3. 所有配置替补都不可用时,从以下候选池中临时补位:
    • 当前空闲且心情足够;
    • 未出现在任何固定主力/替补排班名单中;
    • 具备对应设施的通用效率提升或心情消耗降低技能。
  4. 如果仍然无法补位,尽量保留当前在岗干员,并对该任务设置重试上限与退避时间,不阻塞其他调度任务。
  5. 经过一定冷却时间(例如 30~60 分钟)后重新检测原目标干员,使其在专精结束后自动回归。
  6. 对必须成组工作的组合,可整组回退到预设散件班,避免只替换一人破坏组合。

核心诉求并非限定具体实现方式,而是:单个目标干员暂时不可派遣时,不应让整个基建调度无限重复同一失败计划。

环境

  • Mower-NG main 分支
  • 可在 2026-10-01 附近版本复现
  • 未附原始日志、排班表和截图;如开发者需要,可再提供去除本机路径及账户信息后的最小日志片段。