Skip to content

feat(scheduler): once trigger + lifecycle notifications (#415)#416

Merged
zts212653 merged 14 commits intomainfrom
feat/415-once-trigger
Apr 10, 2026
Merged

feat(scheduler): once trigger + lifecycle notifications (#415)#416
zts212653 merged 14 commits intomainfrom
feat/415-once-trigger

Conversation

@mindfn
Copy link
Copy Markdown
Collaborator

@mindfn mindfn commented Apr 10, 2026

What

  • Add { type: 'once', fireAt: number } as a first-class trigger for one-shot scheduled tasks
  • Complete lifecycle notifications for scheduled tasks:
    • register
    • pause
    • resume
    • delete
    • execution success
    • execution failure
    • missed execution window after restart
  • Keep one-shot task semantics correct across restart and governance paths:
    • auto-retire only after an actual execution
    • cancel overdue hydrated once tasks instead of replaying them
    • retry once tasks correctly after governance skips
  • Harden runtime behavior found during review:
    • cap long setTimeout waits via chunked re-scheduling
    • validate delayMs / fireAt as finite numbers
    • roll back persisted enabled=true when resume fails
    • guard once-task callbacks after runtime unregistration

Why

The original scheduler only handled recurring triggers and left lifecycle feedback incomplete. Users could not create a true one-shot task, and they had no consistent system notification for key state transitions. This PR closes that gap so scheduled tasks behave like a full lifecycle feature instead of a partial mechanism.

Issue Closure

Original Requirements

  • 原始需求摘录

    "当前的定时任务好像是只有周期执行;没有那种一次性的定时任务的;比如两分钟后帮我查询下天气并通知我"

    "设置或者执行完成后是不是系统自动触发一个通知一下用户下次的执行时间的;如果因为重启导致定时任务错过了应该自动取消并通知用户"

  • 铲屎官核心痛点:
    • 定时任务不支持一次性执行
    • 生命周期状态变更缺少统一系统反馈

Tradeoffs

  • Persist once as absolute fireAt epoch ms instead of relative delay to avoid restart drift
  • Remove completed one-shot tasks instead of tombstoning because run_ledger is already the audit trail
  • Deliver lifecycle notifications fire-and-forget so notification failure does not block the primary task flow

Scope Covered

  • packages/api/src/infrastructure/scheduler/types.ts
  • packages/api/src/infrastructure/scheduler/TaskRunnerV2.ts
  • packages/api/src/infrastructure/scheduler/execute-pipeline.ts
  • packages/api/src/infrastructure/scheduler/schedule-notify.ts
  • packages/api/src/routes/schedule.ts
  • packages/api/src/index.ts
  • packages/mcp-server/src/tools/schedule-tools.ts
  • packages/web/src/components/workspace/schedule-helpers.ts
  • cat-cafe-skills/schedule-tasks/SKILL.md
  • scheduler test coverage for once-trigger, lifecycle notifications, missed-window behavior, and review-driven edge cases

Verification

  • pnpm --filter @cat-cafe/api test
  • pnpm -r --if-present run build
  • pnpm check
  • pnpm lint
  • PR CI checks green on latest head

Notes

  • Non-blocking test debt remains for the resume-template-missing branch in schedule.ts; current behavior is fixed, but there is not yet a dedicated regression test for that route branch.
  • Cloud review findings from intermediate rounds were addressed in-PR; the final review returned no major issues.

本地 Review: [x] gpt52 已 review 并放行(多轮)
云端 Review: [x] latest round 无 major issues

@mindfn mindfn requested a review from zts212653 as a code owner April 10, 2026 02:56
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: bbc64c3f6c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 0cbb9d611e

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@mindfn mindfn changed the title feat(scheduler): support one-shot scheduled tasks (once trigger) (#415) feat(scheduler): once trigger + lifecycle notifications (#415) Apr 10, 2026
@mindfn
Copy link
Copy Markdown
Collaborator Author

mindfn commented Apr 10, 2026

@codex review

Please review latest commit 7c68cc4 for P1/P2 only.

规则:任何 P1/P2 必须给"可执行复现":

  • 优先:新增/更新一个 failing test(最小复现)
  • 否则:给确定性复现步骤(命令 + 输入 + 预期/实际)
    没有证据的一律降级为 P3 建议,不算缺陷。

审查标准(详见 AGENTS.md "Review guidelines" section):

  • P0 数据丢失/安全漏洞 | P1 逻辑错误/测试缺失/架构违规
  • P2 性能/重复/命名 | P3 风格偏好
  • 禁止 any、文件 200 行警告/350 硬上限、新功能必须有测试

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 7c68cc41de

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@mindfn
Copy link
Copy Markdown
Collaborator Author

mindfn commented Apr 10, 2026

@codex review

Please review latest commit cb09a53 for P1/P2 only.

This commit addresses the 2 P1s and 1 P2 from the previous round:

  • P1 fix: setTimeout delay capped at 2^31-1 ms with chunked re-scheduling
  • P1 fix: setEnabled rolled back on failed resume (template missing)
  • P2 fix: fireAt/delayMs validated as finite positive numbers
  • P2 (createdBy): acknowledged as pre-existing pattern, out of scope (see inline reply)

规则:任何 P1/P2 必须给"可执行复现":

  • 优先:新增/更新一个 failing test(最小复现)
  • 否则:给确定性复现步骤(命令 + 输入 + 预期/实际)
    没有证据的一律降级为 P3 建议,不算缺陷。

审查标准(详见 AGENTS.md "Review guidelines" section):

  • P0 数据丢失/安全漏洞 | P1 逻辑错误/测试缺失/架构违规
  • P2 性能/重复/命名 | P3 风格偏好
  • 禁止 any、文件 200 行警告/350 硬上限、新功能必须有测试

@chatgpt-codex-connector
Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Nice work!

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

mindfn and others added 7 commits April 10, 2026 14:46
)

Add `{ type: 'once', fireAt: number }` trigger type for one-time delayed execution.
Tasks auto-retire after firing (unregister from runtime + delete from SQLite).
Route layer normalizes `delayMs` → absolute `fireAt` to prevent restart drift.

[宪宪/Opus-46🐾]
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…uting (#415)

P1: once tasks with fireAt in the past are now cancelled during
hydrateDynamic (restart scenario) — records SKIP_MISSED_WINDOW
in ledger, sends notification to delivery thread, removes from store.
Live registration with slightly-past fireAt still fires immediately.

P2: handleMissedOnceTask delivers user notification via fire-and-forget
deliver() with task label and original fireAt in the message.

[宪宪/Opus-46🐾]
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…itions (#415)

Complete the scheduled task lifecycle by notifying users on register,
pause, resume, delete, and execution failure. Extract schedule-notify.ts
helper, wire onItemOutcome callback in execute-pipeline for failure
detection, and pass deliver into schedule routes for lifecycle events.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…istration (#415)

When template is missing from registry, the task cannot actually resume.
Move notifyTaskResumed inside the template-found branch and return 500
when the template is absent, preventing false "resumed" notifications.

[宪宪/Opus-46🐾]
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
P1: Cap setTimeout delay at 2^31-1 ms to prevent Node overflow misfire
    on once tasks scheduled >24.8 days out. Uses chunked re-scheduling.
P1: Roll back setEnabled on failed resume when template is missing,
    preventing storage/runtime inconsistency.
P2: Validate once trigger fireAt/delayMs as finite positive numbers
    before persisting.

[宪宪/Opus-46🐾]
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Notify users after successful task execution: recurring tasks report
next fire time, once tasks confirm completion and auto-retirement.
Closes the last lifecycle feedback gap identified by review.

[宪宪/Opus-46🐾]
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Pre-existing formatting issue exposed after rebase onto latest main.

[宪宪/Opus-46🐾]
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@mindfn mindfn force-pushed the feat/415-once-trigger branch from 6c00fcf to d6054cc Compare April 10, 2026 06:48
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: d6054ccb10

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 90b0adcf11

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

P1: Don't retire once tasks on governance skip (SKIP_GLOBAL_PAUSE,
    SKIP_TASK_OVERRIDE). Track actual execution via onceTaskExecuted
    set, only retire when work items were processed.
P2: Use taskId directly in retireOnceTask instead of dynamicTaskIds
    map lookup, preventing orphaned DB rows when task is paused
    during in-flight execution.

[宪宪/Opus-46🐾]
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@mindfn
Copy link
Copy Markdown
Collaborator Author

mindfn commented Apr 10, 2026

@codex review

Please review latest commit 1cf3c58 for P1/P2 only.

Fixes from previous round:

  • P1: Once tasks no longer retire on governance skip (SKIP_GLOBAL_PAUSE/SKIP_TASK_OVERRIDE). Uses onceTaskExecuted tracking set — only retires after actual work item execution.
  • P2: retireOnceTask now uses taskId directly instead of dynamicTaskIds map lookup, preventing orphaned DB rows when task is paused during in-flight execution.

规则:任何 P1/P2 必须给"可执行复现":

  • 优先:新增/更新一个 failing test(最小复现)
  • 否则:给确定性复现步骤(命令 + 输入 + 预期/实际)
    没有证据的一律降级为 P3 建议,不算缺陷。

审查标准(详见 AGENTS.md "Review guidelines" section):

  • P0 数据丢失/安全漏洞 | P1 逻辑错误/测试缺失/架构违规
  • P2 性能/重复/命名 | P3 风格偏好
  • 禁止 any、文件 200 行警告/350 硬上限、新功能必须有测试

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 1cf3c58366

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

…set (#415)

P1: Once tasks now retry every 30s after governance skip until controls
    are lifted, instead of being stranded with no follow-up execution.
P2: onceTaskExecuted set is now restricted to once-trigger tasks only,
    preventing stale entries from interval/cron tasks accumulating.

[宪宪/Opus-46🐾]
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@mindfn
Copy link
Copy Markdown
Collaborator Author

mindfn commented Apr 10, 2026

@codex review

Please review latest commit ecb1eba for P1/P2 only.

Fixes from previous round:

  • P1: Governance-skipped once tasks now retry every 30s until controls are lifted (was: stranded with no follow-up)
  • P2: onceTaskExecuted tracking set restricted to once-trigger tasks only (was: all task types accumulated)

规则:任何 P1/P2 必须给"可执行复现":

  • 优先:新增/更新一个 failing test(最小复现)
  • 否则:给确定性复现步骤(命令 + 输入 + 预期/实际)
    没有证据的一律降级为 P3 建议,不算缺陷。

审查标准(详见 AGENTS.md "Review guidelines" section):

  • P0 数据丢失/安全漏洞 | P1 逻辑错误/测试缺失/架构违规
  • P2 性能/重复/命名 | P3 风格偏好
  • 禁止 any、文件 200 行警告/350 硬上限、新功能必须有测试

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ecb1eba03f

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

… once task (#415)

Prevent ghost retries after runner.stop() by guarding the retry
callback with this.started check.

[宪宪/Opus-46🐾]
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@mindfn
Copy link
Copy Markdown
Collaborator Author

mindfn commented Apr 10, 2026

@codex review

Please review latest commit ce474ce for P1/P2 only.

Fix: added this.started guard to once-task governance retry callback, preventing ghost retries after runner.stop().

规则:任何 P1/P2 必须给"可执行复现":

  • 优先:新增/更新一个 failing test(最小复现)
  • 否则:给确定性复现步骤(命令 + 输入 + 预期/实际)
    没有证据的一律降级为 P3 建议,不算缺陷。

审查标准(详见 AGENTS.md "Review guidelines" section):

  • P0 数据丢失/安全漏洞 | P1 逻辑错误/测试缺失/架构违规
  • P2 性能/重复/命名 | P3 风格偏好
  • 禁止 any、文件 200 行警告/350 硬上限、新功能必须有测试

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ce474ce73f

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 54fbaf121b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

…415)

P2: Replace onceTaskExecuted set with ledger query — only retry on
    SKIP_GLOBAL_PAUSE/SKIP_TASK_OVERRIDE, retire on all other outcomes
    (gate-no-signal, gate-throw, etc.). Removes stale-set accumulation.
P2: Add timers.has guard to once timer callback to prevent ghost
    execution after task unregistration.

[宪宪/Opus-46🐾]
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@mindfn
Copy link
Copy Markdown
Collaborator Author

mindfn commented Apr 10, 2026

@codex review

Please review latest commit 1fe5210 for P1/P2 only.

Fixes from previous round:

  • P2-1: Replaced onceTaskExecuted Set with ledger-based retry detection — queries RunLedger for actual outcome, only retries on governance skip (SKIP_GLOBAL_PAUSE/SKIP_TASK_OVERRIDE), retires on everything else
  • P2-2: Added this.timers.has(task.id) guard to once timer callback to skip execution if task was unregistered before timeout fires

规则:任何 P1/P2 必须给"可执行复现":

  • 优先:新增/更新一个 failing test(最小复现)
  • 否则:给确定性复现步骤(命令 + 输入 + 预期/实际)
    没有证据的一律降级为 P3 建议,不算缺陷。

审查标准(详见 AGENTS.md "Review guidelines" section):

  • P0 数据丢失/安全漏洞 | P1 逻辑错误/测试缺失/架构违规
  • P2 性能/重复/命名 | P3 风格偏好
  • 禁止 any、文件 200 行警告/350 硬上限、新功能必须有测试

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 1fe5210292

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@mindfn
Copy link
Copy Markdown
Collaborator Author

mindfn commented Apr 10, 2026

@codex review

@zts212653
Copy link
Copy Markdown
Owner

Maintainer Review — Consolidated Feedback

Two independent reviewers evaluated this PR. Here's our consolidated assessment.

Verdict: WELCOME — merge after addressing blockers

The direction is solid. once trigger fills a real gap in our schedule abstraction (F139/ADR-022 explicitly identified one-shot as planned but unshipped). Lifecycle notifications are table-stakes UX. Test coverage is thorough (18 new tests). We want this in.

Blockers (must fix before merge)

B1: Accepted Issue gate
#415 currently only has feature label — missing triaged / feature anchor. Our inbound merge gate requires accepted-issue status.

B2: Sender identity in lifecycle notifications (P1 Security)
schedule-notify.ts and TaskRunnerV2.ts use catId: def.createdBy as the notification sender. createdBy is client-supplied at registration time. This means a caller can forge createdBy and make system notifications appear to come from any cat — an impersonation path.

Fix: Use a server-authoritative identity for lifecycle notifications (e.g. 'scheduler' or 'system'), not the client-supplied createdBy.

Suggestions (P2/P3 — non-blocking, can be follow-up)

Item Severity Detail
Governance-skip retry P2 30s hardcoded poll → consider event-driven (listen for governance-lifted)
Silent notification failure P2 deliver().catch(() => {}) swallows errors — at least logger.error
setTimeout overflow P3 Chunked re-schedule works but we'd prefer capping once-trigger max delay (e.g. 7 days)
zh-CN + Asia/Shanghai hardcoded P3 Acceptable for now, but long-term needs i18n/timezone abstraction

Architecture note

The schedule-notify.ts extraction is clean. Our long-term preference is a centralized TaskLifecycleEvent emitter + dedicated notifier (handling sender identity, locale, delivery error logging, thread policy in one place), but the current incremental approach is a reasonable step that can evolve.

What we'll do after merge

  • Intake back to internal repo (absorbed for packages/*, manual-port for cat-cafe-skills/)
  • Update F139 feature doc with once-trigger + lifecycle notifications as community-contributed capability

Thanks for the thorough work and multiple review rounds. Please address B1 + B2 and we're good to merge. 🐾

— 宪宪 (Opus) + 砚砚 (GPT-5.4)

…tions (#415)

Replace client-supplied `def.createdBy` with `'system'` in schedule-notify
fire() to prevent sender impersonation. Matches codebase convention used in
reminder.ts and other server-generated messages.

[宪宪/Opus-46🐾]
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@mindfn
Copy link
Copy Markdown
Collaborator Author

mindfn commented Apr 10, 2026

Blocker Response

B1: Accepted Issue gate
Added triaged label to #415.

B2: Sender identity in lifecycle notifications (P1 Security)
Fixed in 36cbd0d4: replaced catId: def.createdBy with catId: 'system' in schedule-notify.ts:fire(). This matches the codebase convention used in templates/reminder.ts and other server-generated messages. Test updated accordingly (220/220 pass).

Suggestions noted — all P2/P3 items are valid follow-ups:

  • Governance-skip event-driven retry (P2)
  • Silent notification failure logging (P2)
  • Once-trigger max delay cap (P3)
  • i18n/timezone abstraction (P3)

These can be tracked as backlog items post-merge.


[宪宪/Opus-46🐾]

@mindfn
Copy link
Copy Markdown
Collaborator Author

mindfn commented Apr 10, 2026

@codex review

Please review latest commit 36cbd0d for P1/P2 only.

Fix: replaced client-supplied `def.createdBy` with server-authoritative `'system'` in `schedule-notify.ts:fire()` to prevent sender impersonation (B2 blocker from maintainer review).

规则:任何 P1/P2 必须给"可执行复现":

  • 优先:新增/更新一个 failing test(最小复现)
  • 否则:给确定性复现步骤(命令 + 输入 + 预期/实际)
    没有证据的一律降级为 P3 建议,不算缺陷。

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 1fe5210292

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@zts212653
Copy link
Copy Markdown
Owner

Maintainer Decision

B1 (feature anchor): Waived. #415 issue body contains Related: F139 — sufficient semantic anchor. We won't require feature:F139 label for community PRs.

B2 (sender identity): Verified fixed in 36cbd0d — lifecycle notifications now use catId: 'system'.

Code review: Passed by 砚砚 (GPT-5.4). No P1/P2 findings on latest head.

CI: All green (Lint, Build, Test, Windows Smoke).

Merging now. Thank you @mindfn for the thorough work and responsive fixes. 🐾

— 宪宪 (Opus), maintainer

@zts212653 zts212653 merged commit 57936e2 into main Apr 10, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support one-shot scheduled tasks + complete task lifecycle notifications

2 participants