Skip to content

fix(scheduler): preserve queued discard reasons - #3656

Open
AoHanBei wants to merge 2 commits into
makecindy:mainfrom
AoHanBei:fix/3581-scheduler-discard-reasons
Open

fix(scheduler): preserve queued discard reasons#3656
AoHanBei wants to merge 2 commits into
makecindy:mainfrom
AoHanBei:fix/3581-scheduler-discard-reasons

Conversation

@AoHanBei

Copy link
Copy Markdown

这次改了什么

摘要

修复自动化排队输入在实际派发前被丢弃时,运行历史误报为 cancelled by user (schedule deleted or paused) 的问题。

此前 coordinator 的多个队列丢弃入口共用无参数回调,scheduler runner 会统一生成包含 aborted 的错误文本;scheduler 随后通过 /abort/i 匹配错误内容,并将真实原因覆盖为暂停或删除任务的固定文案。

本 PR 将队列丢弃原因以结构化字段贯穿 coordinator、IPC bridge、scheduler runner 和 scheduler engine:

  • schedule pause/delete 继续以真实 AbortSignal 为准;
  • 用户显式删除排队自动化输入时,使用独立的用户取消类型和文案;
  • 用户消息接管、Stop、clearSession、hook 拦截、队列合并、恢复清理和派发超时等场景保留各自的真实原因;
  • 普通错误即使包含 abort,也不再被误判为用户取消;
  • 增加不包含消息正文的结构化诊断日志。

变更类型

  • feat 新功能
  • fix 缺陷修复
  • refactor / perf 重构或性能优化
  • docs / test / chore 文档、测试或工程维护
  • 其他:

范围

  • 关联 Issue / 需求:Fixes 自动化排队输入被丢弃时会误报为用户暂停或删除任务 #3581
  • 本 PR 包含:
    • 为 queued prompt discard 增加结构化 reason;
    • 将 discard reason 从 AgentInputCoordinator 贯穿到 scheduler runner;
    • 引入 ScheduleRunCancellationError,区分用户显式删除排队消息和普通失败;
    • 移除 scheduler 对错误文本的 /abort/i 取消判断;
    • 保留真实 pause/delete AbortSignal 的既有终态和文案;
    • 增加 coordinator、runner、scheduler engine 的回归测试;
    • 增加不记录消息正文的 discard 审计字段。
  • 明确不包含:
    • 不调整人工消息与自动化输入之间的优先级策略;
    • 不改变自动化排队、顺延或超时策略;
    • 不增加或修改 UI;
    • 不涉及数据库 schema 或 migration。
  • 用户可见变化:
    • 非 pause/delete 的队列丢弃不再显示“用户暂停或删除任务”;
    • 用户显式删除排队自动化输入时显示独立的取消原因;
    • 内部队列竞争或清理失败在运行历史中保留可诊断原因。
  • 是否存在 breaking change:无。结构化 reason 和取消错误类型仅用于仓库内部 coordinator/scheduler 边界。

UI 变化

不涉及。本 PR 仅修改主进程队列协调、scheduler runner 和 scheduler engine 的终态归类及诊断信息,没有视觉、交互或 UI 文案结构变更。

  • 引用的设计规范:不涉及

怎么验证的

自动验证

以下命令在 Windows PowerShell、Node.js 22、pnpm 10.33.2 环境执行。

# cwd: apps/desktop
..\..\node_modules\.bin\vitest.CMD run src/main/maker-ipc/__tests__/agent-input-coordinator.test.ts
结果:346 passed

# cwd: apps/desktop
..\..\node_modules\.bin\vitest.CMD run src/main/scheduler-host/__tests__/runnerQueuedDispatch.test.ts
结果:51 passed

# cwd: packages/maker-scheduler
..\..\node_modules\.bin\vitest.CMD run src/__tests__/scheduler.test.ts
结果:147 passed

# cwd: apps/desktop
..\..\node_modules\.bin\vitest.CMD run src/main/__tests__/interruptedContinuationContract.test.ts
结果:12 passed

pnpm --filter desktop typecheck
结果:通过

pnpm --filter @cindy/maker-scheduler build
结果:通过

# cwd: packages/maker-scheduler
..\..\node_modules\.bin\eslint.CMD src/engine/scheduler.ts src/interfaces/schedule-runner.ts src/__tests__/scheduler.test.ts
结果:通过

git diff --check
结果:通过

回归测试覆盖:

  • 普通用户输入接管排队自动续跑时传播 queue-replaced
  • 用户显式删除排队自动化输入时抛出结构化用户取消;
  • 非用户 discard reason 保留为可诊断失败;
  • schedule abort 和 dispatch timeout 传播各自的结构化 reason;
  • 普通错误文本包含 abort 时仍归类为 failed,不会覆盖真实错误;
  • 结构化用户取消归类为 aborted,但不会冒充 schedule pause/delete;
  • coordinator 清理、合并和自动续跑放弃路径传播对应 reason。

手工验证

不涉及 UI 操作。

原问题依赖重叠运行结束与人工输入之间的毫秒级竞争,目前没有稳定的手工复现方法。本 PR 使用 coordinator、runner 和 scheduler 三层定向测试覆盖该竞争路径的关键终态,并验证在 AbortSignal 未触发时不会显示 pause/delete 文案。

未执行的验证

  • 未执行全仓测试套件;已执行本次改动涉及的 coordinator、scheduler runner、scheduler engine 和 continuation contract 定向测试,共 556 项。
  • 未执行完整 Desktop lint。对本次涉及的 Desktop 文件执行定向 lint 时,报告了 11 个位于未修改行的既有 no-unused-vars 错误;本次新增和修改代码没有产生新的 lint 诊断。
  • 未进行 UI 截图或录屏,因为本 PR 不涉及 UI,且原始毫秒级竞争没有稳定的手工复现步骤。

风险

风险分类

  • 无已知风险
  • SQLite / migration
  • system prompt
  • 协议兼容
  • 权限 / 安全 / 用户数据
  • 存量插件兼容(批准状态 / 指纹 / manifest 校验 / 安装布局 / 包格式)
  • 原生层 / fingerprint / OTA
  • 跨平台差异
  • 其他:scheduler 运行终态归类与 queued prompt discard reason 传播

影响与回滚

  • 影响范围:
    • 仅影响自动化输入在 vendor dispatch 前被移除时的运行终态、错误文案和诊断日志;
    • schedule pause/delete 的真实 AbortSignal 路径保持原有 aborted 终态和固定文案;
    • 用户显式删除排队自动化输入仍归类为用户取消,但使用独立文案;
    • 其他 discard reason 将保留为可诊断失败,可能使此前被错误显示为 aborted 的运行改为 failed
    • 不涉及数据库、用户数据格式、插件、权限、原生层或跨平台实现。
  • 回滚 / 降级方式:
    • 可整体 revert 本 PR;
    • 不需要数据库回滚、数据迁移或客户端状态清理。

提交前检查

  • 已 review 完整 diff
  • 每个 commit 都带 DCO 签名(git commit -s,见 DCO
  • UI 改动已在「UI 变化」注明引用的设计规范章节(不涉及 UI则跳过)
  • 未提交凭证、令牌或授权文件
  • 已补充必要文档
  • 已确认测试结果或说明未执行原因

Signed-off-by: AoHanBei <dongaohan21@gmail.com>
@AoHanBei
AoHanBei requested a review from a team as a code owner August 31, 2026 01:14
@greptile-apps

greptile-apps Bot commented Aug 31, 2026

Copy link
Copy Markdown

Greptile Summary

本 PR 为排队自动化输入的丢弃操作增加结构化原因,并在 coordinator、IPC bridge、runner 与 scheduler engine 之间传递该原因。

  • 使用 ScheduleRunCancellationError 区分显式删除队列项与普通运行失败
  • 移除基于错误文本 /abort/i 的终态推断
  • 为 queue replace、stop、clear、hook、restore、timeout 等路径保留具体丢弃原因并补充诊断日志和回归测试
  • 当前实现仍会让删除单个排队输入停止 active recurring schedule,并在队列删除与 pause/delete 并发时保存错误的取消来源

Confidence Score: 3/5

此 PR 暂不适合合并,因为删除单个排队输入会让仍处于 active 状态的周期任务永久停止,且并发 pause/delete 时可能记录错误的取消来源。

新的结构化取消被映射到原本仅为 schedule pause/delete 设计的 aborted 分支;该分支不会恢复 claim 时清空的 nextFireAt,同时取消消息选择没有在 AbortSignal 已触发时优先采用 pause/delete 来源。

Files Needing Attention: packages/maker-scheduler/src/engine/scheduler.ts, apps/desktop/src/main/scheduler-host/runner.ts

Important Files Changed

Filename Overview
apps/desktop/src/main/maker-ipc/agent-input-coordinator.ts 为所有主要队列移除入口补充结构化 discard reason,并将其传给 host 回调。
apps/desktop/src/main/maker-ipc/register.ts 扩展 scheduler queue bridge 与 watcher,使 coordinator 的丢弃原因到达 runner,并记录脱敏诊断字段。
apps/desktop/src/main/scheduler-host/runner.ts 将 user-remove 转为结构化取消、其它原因转为失败,但该取消类型会触发 scheduler 的“不重排”终态语义。
packages/maker-scheduler/src/interfaces/schedule-runner.ts 新增 ScheduleRunCancellationError,明确 AbortSignal 与显式用户取消的结构化协议。
packages/maker-scheduler/src/engine/scheduler.ts 移除错误文本推断并识别结构化取消,但错误地让 active recurring schedule 的单项删除跳过重排,且未让真实 AbortSignal 优先决定文案。

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
  A[排队的自动化输入] --> B{丢弃原因}
  B -->|user-remove| C[ScheduleRunCancellationError]
  B -->|其它原因| D[普通 Error]
  B -->|pause/delete| E[AbortSignal]
  C --> F[Scheduler 识别为 aborted]
  E --> F
  D --> G[Scheduler 识别为 failed]
  F --> H{Schedule 是否仍 active}
  H -->|user-remove 后仍 active| I[nextFireAt 未恢复]
  H -->|pause/delete| J[保持暂停或删除]
  G --> K[正常重新规划 recurring cadence]
Loading
Prompt To Fix All With AI
### Issue 1
packages/maker-scheduler/src/engine/scheduler.ts:818-823
**单项取消破坏周期重排**

当用户删除仍处于 active/recurring 状态的日程所排队的自动化输入时,`ScheduleRunCancellationError` 会将本轮归为 `aborted`;该分支不会恢复 `claimDueFire` 已清空的 `nextFireAt`,导致任务保持 active 却不再自动运行。

### Issue 2
packages/maker-scheduler/src/engine/scheduler.ts:821-823
**信号取消文案被覆盖**

当用户先删除排队输入、随后暂停或删除同一日程时,结构化队列取消会先 settle runner,但 scheduler 随后同时看到已触发的 `AbortSignal`;这里仍优先保存队列删除文案,导致运行历史将实际的 pause/delete 收口误报为删除排队输入。

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Reviews (1): Last reviewed commit: "fix(scheduler): preserve queued discard ..." | Re-trigger Greptile

Comment thread packages/maker-scheduler/src/engine/scheduler.ts Outdated
Comment thread packages/maker-scheduler/src/engine/scheduler.ts Outdated
@MagicLizi MagicLizi added the touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) label Aug 31, 2026
Signed-off-by: AoHanBei <dongaohan21@gmail.com>
@MagicLizi

Copy link
Copy Markdown
Contributor

@AoHanBei 👋 这个 PR 还有 2 条 review conversation 没 resolve(packages/maker-scheduler/src/engine/scheduler.ts),auto-review 因此暂时跳过、没法继续审查 / 合并。

如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。

@MagicLizi MagicLizi added awaiting-discussion 等待维护者讨论(review-pr) and removed awaiting-discussion 等待维护者讨论(review-pr) labels Aug 31, 2026
@MagicLizi

Copy link
Copy Markdown
Contributor

这条 PR 需要一次维护者确认(架构:跨包排队 discard 回调契约变了)。

讨论 issue:#3664

请维护者:

  • 没问题 → 直接在本 PR Approve
  • 要改 → Request Changes,作者改完后再 Approve

评论里表态不算通过。在确认完成前本流程不会合并。

@AoHanBei

Copy link
Copy Markdown
Author

补充状态:#3656 的两个 Greptile P1 已在 36bed05 修复并补充回归测试;active recurring 会恢复 nextFireAt,真实 AbortSignal 会优先采用 pause/delete 文案。两条 review conversation 已 resolve,Linux/Windows CI 与 DCO 当前全部通过,等待维护者在 PR 上正式 Approve 或 Request Changes。

@MagicLizi

Copy link
Copy Markdown
Contributor

@AoHanBei 👋 这个 PR 目前与 main 有合并冲突,auto-review 因此暂时跳过、没法继续审查 / 合并。

请在本地 merge 最新的 origin/main 解决冲突后推送;冲突解除后,下一轮 auto-review 会自动重新处理这个 PR。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

awaiting-discussion 等待维护者讨论(review-pr) touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

自动化排队输入被丢弃时会误报为用户暂停或删除任务

2 participants