Repository navigation
feat(desktop): 任务级「消息免打扰」,单条任务不再发通知 - #6244
Conversation
会话右键菜单新增「消息免打扰」:开着的任务不再发系统 toast(含提示音)、 不上 Agent 灵动岛、不推手机、不发飞书;任务内的未读与角标照常,任务照常跑。 菜单项是开关,设过之后文案变成「允许消息通知」。 实现走一个进程内同步索引(原 hiddenSessionRegistry 泛化为 sessionFlagRegistry) 而不是逐事件查库,四道门都在发出侧: - notificationService 的 notification:show-session-event:桌面 / 手机 / 飞书一次挡住; - maker-ipc/register 的 shouldNotifyAgentIslandForSession:挡在进岛之前,岛态不进入即无声; - device-link 的 sendMobileSessionNotify:覆盖代输入等不走会话终态路径的调用方; - scheduler-host 的 DesktopNotifier:自动化 run 的桌面 / 飞书通道(共享群通知不跟个人静音走)。 数据库加 sessions.notifications_muted(migration 0129,默认 false,存量任务全部按未静音)。 Signed-off-by: WZBbiao <16611004+WZBbiao@users.noreply.github.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
[High impact] Adds a database column and notification muting logic across the app. 合并前需要修复灵动岛残留运行状态,以及索引加载后静音设置持续不生效的问题。 FindingsFix with agent prompt### Issue 1
apps/desktop/src/main/maker-ipc/register.ts:4821-4823
用户在任务已经上岛后开启「消息免打扰」,这里只阻断后续事件,没有移除已有条目。任务完成或被停止时,清理事件也会被同一个判断丢弃。写入 `notificationsMuted` 时又没有清理岛态,导致已结束任务一直显示为运行中。请在开启免打扰时主动移除已有条目,而不只是阻止新事件进入。
### Issue 2
apps/desktop/src/main/localDb/sessionFlagRegistry.ts:73-75
`touchedDuringLoad` 现在被两个字段共用,但加载时仍按整个任务跳过。例如,已有静音设置的任务在索引首次加载前或加载期间被 `setSessionHidden` 恢复显示,只会登记隐藏状态。这里随后跳过整行,原有静音设置就不会进入 `mutedIds`。即使加载完成,该任务仍会继续发通知。请分别记录两个字段的改动,加载时只跳过已改动的字段。
### Issue 3
apps/desktop/src/main/notificationService.ts:244
静音只在收到通知请求时检查一次,但 `done` 通知还要等待预览读取、写入队列和协作任务判断。如果用户在等待期间成功开启免打扰,后面的桌面通知和飞书消息仍会发出。请在这些等待结束、真正发送前再次检查静音;手机出口已经做了这层检查。
### Issue 4
apps/desktop/src/renderer/features/cc-agent/sidebar/sessionNotificationMute.ts:24
失败回滚无条件写回调用开始时的 `previous`,会覆盖另一个窗口刚保存的设置。例如窗口 A 的静音请求仍在等待,窗口 B 成功开启静音并广播给 A,随后 A 的旧请求失败,这里就把 A 改回未静音,而数据库仍是静音。请给乐观更新记录版本,只有没有收到更新的设置时才回滚,或失败后重读当前值。
---
For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 3602339c8d
ℹ️ About Codex in GitHub
Codex has been enabled to automatically 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 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
makecindy#6244 的 review 后续: - 已经上岛的任务现在才被静音时,主动把它从岛上收走。只挡后续事件会让卡片永远停在 「运行中」——终态事件也被同一道门挡住,岛态再也不会被清掉。 - sessionFlagRegistry 的加载期改动登记按字段分开。原来两列共用一个 id 集合,加载窗口 内改过 hidden 会连带丢掉那一行原有的静音标记,加载完成后这条任务会继续发通知。 - notification:show-session-event 的 done 分支在取正文、等交接判定之后、真正发之前 再确认一次静音:等待期间用户开了免打扰,桌面与飞书仍然会发出去。 - 渲染侧的失败回滚只在「值还是我们写进去的那个」时才回滚,避免盖掉期间别的窗口刚 保存的新值。 Signed-off-by: WZBbiao <16611004+WZBbiao@users.noreply.github.com>
|
已按 review 补了一版(commit
本地已重跑:定向 7 个文件 139 通过、全量 |
|
维护者确认门在拦:本 PR(任务级「消息免打扰」)触发 product(feat + 生产 UI 路径)、rules(规则文档 讨论 issue 已建(见下方链接)。请维护者直接在本 PR 上 Approve 确认;需要作者修改则 Request Changes 写明要求。在维护者确认前,自动流程不进入代码审查、不合并。 讨论 issue:#6248 |
makecindy#6244 的 review 后续(chatgpt-codex-connector 在 device-link/index.ts:2035 的 P2): 「消息免打扰」只掐掉了手机 push,代输入与桌面专属确认卡的 IM 提示照发。 - im/desktopConfirmNotice 新增 isSuppressed 注入:静音任务的确认卡/代输入指引 飞书提示直接零动作(连 openId 都不查)。桌面卡片本身只在桌面出现,不受影响。 接线处(desktopConfirmNoticeWiring)传 sessionFlagRegistry 的同一判定, 于是 issue / 批量重命名 / 插件文件授权三张确认卡与代输入飞书兜底一起收口。 - maker-ipc/register 的 notifyInputHandoffOwner 最早处早退:静音任务连渠道内的 「去 Cindy 打开」一行指引也不发(手机 push 另有 sendMobileSessionNotify 的同一道门)。 判定成立的理由:PR 声明的行为是静音任务「不发飞书」,而这两条路径对静音任务照发; 且同一次代输入里手机 push 已被掐掉、IM 指引还在发,本身就是自相矛盾。判定仍走 进程内同步索引(未加载按未静音),不在事件路径上查库。 Signed-off-by: WZBbiao <16611004+WZBbiao@users.noreply.github.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: da5685baf7
ℹ️ About Codex in GitHub
Codex has been enabled to automatically 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 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
…相邻冲突 Signed-off-by: WZBbiao <16611004+WZBbiao@users.noreply.github.com> # Conflicts: # apps/desktop/src/main/localDb/ipc/sessions.ts
makecindy#6244 在 da5685b 之后新来的 5 条 review: 1. 静音不该清掉任务的实时活动(register.ts:4826)。岛面抑制改成展示面过滤: AgentIslandState 新增 displaySuppressedSessionIds,shouldDisplaySession 排除 静音任务;事件照常进状态机,侧栏卡片的逐步活动、等待交互态与远端活动镜像 不再跟着消失。shouldNotifyAgentIslandForSession 不再按静音挡摄取,岛面收敛 由 publish() 从同步索引对齐后重发(账号切换/索引重载自愈)。 2. main 严格校验静音字段(mapper.ts:500):local-db:sessions:update 出现 notificationsMuted 就必须是真 boolean;字符串 "false" 不再被 `!!` 存成已静音。 3. 桌面确认提示在解析 openId 之后、真正发送之前再判一次静音 (desktopConfirmNotice.ts:73)。 4. 代输入指引在读标题/预览之后、发送之前再判一次静音(register.ts:3014)。 5. 渲染侧回滚加操作序号(sessionNotificationMute.ts:27):同向并发(两个窗口 都在关静音)时,先失败的那次不再把后一次的成功翻回去。 测试:agent-island 与四个发送侧门相关的 16 个测试文件 479 用例全绿,desktop typecheck 通过。 Signed-off-by: WZBbiao <16611004+WZBbiao@users.noreply.github.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 91adaaf3e8
ℹ️ About Codex in GitHub
Codex has been enabled to automatically 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 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
codex 在 state.ts:2700 的 P2:只在 shouldDisplaySession 里过滤不够。 buildAgentIslandDisplayState 之后还会用 getActiveTransientSession 取回 state.activeTransientSessionId 指向的任务,再由 orderSessionsForAutomaticTransientStack prepend 回列表——静音任务一旦完成/报错(或它的完成卡还在驻留时被静音),仍会生成 completion/error 卡片并触发提示音。 补三处同口径的抑制: - enqueueTransientReveal:静音任务不揭示、不进揭示队列(清掉它自己的 reveal 标记); - getActiveTransientSession:静音任务即使被排成 active transient 也不返回; - promoteNextTransientReveal:跳过揭示队列里的静音任务; - restoreSessionScopedReveal(user prompt 回滚)同样不把静音任务重新激活。 活动快照与未读账本走另一条路,静音不影响(侧栏仍能看到它已完成)。 测试:state.test.ts 新增「静音任务的完成卡不回到岛面,也不占 active transient / 揭示队列」 与「完成卡已经在岛上时再静音,下一次展示面就不再包含它」;把这几处抑制临时去掉时 这两条会失败(已验证),加上后 12 个文件 390 用例全绿,desktop typecheck 通过。 Signed-off-by: WZBbiao <16611004+WZBbiao@users.noreply.github.com>
…t 与术语表冲突 Signed-off-by: WZBbiao <16611004+WZBbiao@users.noreply.github.com>
Signed-off-by: WZBbiao <16611004+WZBbiao@users.noreply.github.com>
Signed-off-by: WZBbiao <16611004+WZBbiao@users.noreply.github.com>
- 撞号:main 的 0129_chemical_thor 已在主干,本分支的 sessions.notifications_muted 按规则以主干链重新生成,落到 0130_heavy_iron_patriot(SQL 与原来一致), 删除旧的 0129_dizzy_yellowjacket。 - migrationReplay:回放区间改为 125..130,同时断言 scheduled_model_baseline 与 notifications_muted 两列;免打扰回填用例的起点改为 129。 - 三个会话 IPC 用例补 electron 的 app mock:main 给 localDb 静态引入了 WorktreeManager → workdir-probe-host,该模块顶层读 app.once,缺 app 会在 收集阶段整文件失败。 验证:db:validate、migrationReplay、PR 相关 16 个用例文件、pnpm --filter desktop typecheck 均通过。 Signed-off-by: WZBbiao <16611004+WZBbiao@users.noreply.github.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 5f81100946
ℹ️ About Codex in GitHub
Codex has been enabled to automatically 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 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
|
已再次同步 main 至 migration 再次撞号:main 已占用 测试:
CI 现状: |
0132_abnormal_dazzler / 0133_chat_history_cache 进入主干后,两条从更早版本回放的用例 需要 fixture 里先有 sessions 与 plugin_usage_events 表;断言口径不变(回放序列到 0134)。 Signed-off-by: WZBbiao <16611004+WZBbiao@users.noreply.github.com>
按自动审查的两条 P2 收口: - `notification:show-session-event` 与预览后的复查都改成 `markAttention` 门控: 其它设备(device-link)任务传 `markAttention: false`,本机库里可能恰有同 id 的 无关任务行(还原/复制过的库),那一行的静音标记不该压掉远端提醒。手机通道的 唯一出口 `sendMobileSessionNotify` 收到 `muteExempt` 时同样跳过该判定。 - `getActiveBlockingReveal()` 也排除 `displaySuppressedSessionIds`:静音任务不上 岛面,但仍是 needs-interaction,排在前面时会被选成「当前阻塞卡」,导致 `dismissPublishedBlockingReveal()` 因 id 与真实展示卡不一致而拒绝,点岛外只收起 hover、确认卡一直展开。与 `hasBlockingSession()` 用同一集合。 测试:新增 notificationService(远端事件不被本地静音压掉)与 agent-island state (静音把前一张阻塞卡挤出仲裁位后,点岛外仍能收起可见卡)各一条;两条在修复前 分别以「spy 未被调用」和「dismiss 返回 false」失败。 Signed-off-by: WZBbiao <16611004+WZBbiao@users.noreply.github.com>
|
第二轮:自动审查的 3 条 P2 已逐条处理( 已修两条
判定超范围一条:把执行机的静音位投影进 验证
CI:15 项全绿(含之前红过的 |
|
确认任务级「消息免打扰」的产品行为与当前实现范围,同意推进。
本次 Approve 确认 #6248 涉及的产品、规则与架构范围。后续独立代码审查、数据库迁移和各通知出口验证继续按仓库流程推进。 |
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: bd98675e60
ℹ️ About Codex in GitHub
Codex has been enabled to automatically 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 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
按自动审查的两条 P1 收口: - `sessionService.patchMeta()` 在查 sticky origin 之前先放行 `notificationsMuted`: 免打扰是本机属性(提醒由任务所在设备发,入口也对 device-link 任务隐藏), 被控端 `patch-meta` 的 allowlist 只有 status/title/pinnedAt,隧道过去必然抛 INVALID_PARAMS,让开关白回滚一次。 - `syncDisplaySuppression()` 只对 `sourceDeviceId === null` 的条目查本机静音索引: 远端投影进来的任务可能与本机被静音的旧行同 id(还原/复制的库),不能拿本机 标记压掉远端卡片与提示音。 测试:sessionService(sticky origin 下静音走本机 update、status 仍走隧道)与 agent-island device sessions(同 id 本地行静音不影响远端卡片)各一条;两条在 修复前分别以 update 未被调用、岛面为空失败。 Signed-off-by: WZBbiao <16611004+WZBbiao@users.noreply.github.com>
Signed-off-by: WZBbiao <16611004+WZBbiao@users.noreply.github.com>
check:test-hygiene 禁止在 beforeEach/helper 里重载模块,基线只允许该文件 2 次。 用例内 loadSessionService() 已自带一次重载,describe 级 beforeEach 多余。 顺带给 describe 补 afterEach 的 unstubAllGlobals,避免 stub 的 window 泄漏到后续用例。 Signed-off-by: WZBbiao <16611004+WZBbiao@users.noreply.github.com>
main 已占用 0134_schedule_model_location,本分支的 sessions.notifications_muted 按 database-and-migrations.md 用 db:generate 重落为 0135_tranquil_triton,SQL 不变; migrationReplay 的回放序列断言跟到 135。 Signed-off-by: WZBbiao <16611004+WZBbiao@users.noreply.github.com>
|
@codex review |
|
Codex Review: Something went wrong. Try again later by commenting “@codex review”. ℹ️ About Codex in GitHubCodex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback". |
|
CI 唯一红项与本 PR 无关,记录一下供重跑参考:
自动审查(Codex)在 另:本轮又把 main 同步进分支(main 占了 |
|
@codex review |
|
Codex Review: Something went wrong. Try again later by commenting “@codex review”. ℹ️ About Codex in GitHubCodex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback". |
Signed-off-by: WZBbiao <16611004+WZBbiao@users.noreply.github.com>
|
已再次同步 main 到 失败项: 证据:
我这边 token 只有 |
Signed-off-by: WZBbiao <16611004+WZBbiao@users.noreply.github.com> # Conflicts: # apps/desktop/src/main/localDb/ipc/__tests__/sessionsPerTaskFlags.test.ts # apps/desktop/src/main/localDb/ipc/__tests__/sessionsRestoreIfArchived.test.ts
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 5a0741376f
ℹ️ About Codex in GitHub
Codex has been enabled to automatically 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 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
Signed-off-by: WZBbiao <16611004+WZBbiao@users.noreply.github.com> # Conflicts: # i18n/GLOSSARY.md
codex review P2:`notification:show-session-event` 的 `channels` 与 `markAttention` 都由 renderer 自报,而 `markAttention === false` 正好跳过 「消息免打扰」门禁(并把手机通道标成 `muteExempt`)。这条 handler 之前没有任何 来源断言,插件 webview 等其它 webContents 也能调到同一个 channel。 改法:handler 入口先 `assertTrustedAppRendererEvent(event)`,不通过直接 PERMISSION_DENIED,早于 payload 校验、角标记账和任何通道发送。这是仓库里 184 个高权限 IPC 的既有口径,只放行 Cindy 自有顶层 renderer(主窗口 / 副窗口 / 右栏窗口都已登记为 app-content)。 没做的事(如实说明):「从 Main 持有的远端会话/设备关系判定豁免」做不到 —— device-link 的远端会话镜像是 renderer 的 remoteProjectsStore,main 侧没有 session→device 的权威映射(岛上的 sourceDeviceId 也是 renderer 喂进来的)。 要让 main 自己判定,需要 main 维护一份由 peer push 派生的 session→device 登记, 属于跨设备协议语义变更,得单独裁决。所以这一位仍由 renderer 报,边界靠上面那道 来源断言;XSS 前提下的纵深防御也一并写进了代码注释。 测试:`npx vitest run --project standard src/main/__tests__/notificationService.test.ts` (63 通过,新增「rejects a caller that is not the Cindy renderer before any channel or badge work」:来源断言失败时不记角标、不弹 toast、不发手机/飞书);同批跑了 im / agent-island / localDb 的相关文件(434 通过);typecheck、check:test-hygiene、 check:i18n、check:i18n-glossary 均通过。 Signed-off-by: WZBbiao <16611004+WZBbiao@users.noreply.github.com>
PR #6244 自动代码审查报告(heavy 档)
Findings没有 P0/P1。以下仅为不阻断的 P2 级观察,按口径不列为 finding、不发 thread:
UI 证据(非阻断提醒):本 PR 命中 UI 路径但描述未附截图 / 录屏 / HTML 界面证据( Rule coverage按 rule-map 命中并读取以下规则原文及其 Review 清单,逐项结论(只审新增 / 正在修改的代码):
Verification在审查 worktree(detached = PR head)实际执行,保留真实退出码:
未执行项(如实说明):
Intent alignment
Overallpass —— 没有 P0/P1。原意一致性复核完成且一致;讨论 issue 的明确要求逐条落实;维护门已由维护者 MagicLizi 的 Approve 放行(product / rules / arch 三触发 released,确认 issue #6248 已关闭),0 未解决 thread,CI 双源全绿(client-ci、pr-design-basis 均 success)。 补充提醒(不阻断):
|
|
合了。四道门都收在发送侧、连同 id 远端任务的误伤和并发回滚这些边角都处理得很干净,审查里能看出是真推敲过的——以后一屏挂着好几个任务,终于只让要紧的那条叫人了。 |
这次改了什么
摘要
任务右键菜单新增「消息免打扰」:开了之后这条任务不再发系统通知(toast / 提示音)、
不上 Agent 灵动岛、不推手机、不发飞书;任务里的未读与角标照常,任务照常跑。
菜单项自己就是开关,设过之后同一位置文案变成「允许消息通知」。
四道门都加在发出侧,而不是让每个调用方自己判断:
notificationService.ts的notification:show-session-event一个早退agent-island/state.ts的shouldDisplaySession:静音任务只从展示面排除(displaySuppressedSessionIds),岛面/菜单栏/提示音不出现;事件仍进状态机device-link/index.ts的sendMobileSessionNotify,覆盖代输入这类不走会话终态路径的调用方scheduler-host/notifier.ts,只掐个人通道;wecomGroup 是共享群通知,不跟个人静音走判定不能逐事件查库(灵动岛与通知都在同步事件路径上),所以复用插件后台隐藏任务那套
进程内索引:
hiddenSessionRegistry泛化成sessionFlagRegistry,一次加载同时索引hidden_at与notifications_muted。加载完成前按「未静音」处理,宁可多提醒一次。变更类型
feat新功能范围
sessions.notifications_muted列与 migration 0130(最初排到 0129,与 main 的 0129_chemical_thor 撞号后按 migration 规则以主干链重新生成);四道发送侧门;任务右键菜单项与其乐观更新/回滚;五语文案;术语表 proposed 条目。UI 变化
docs/design-rules/DESIGN.md §4 Select & Dropdown(菜单面板与菜单行)。新项直接复用共享的DropdownMenuItem与侧栏menuStyles.ts的MENU_ITEM_CLASS,没有引入任何新的颜色、字号、间距或圆角 token,因此 Light / Dark 由既有语义 token 一并覆盖(本次未做双模式实机目检,也没有新增颜色)。文案按docs/design-rules/DESIGN.md的双模式要求只走t(),五语齐备。怎么验证的
自动验证
手工验证
隔离 dev 沙箱实机(
pnpm restart:desktop:remote --region=cn --isolated=@worktree,沙箱
Cindy-dev2-notify-mute-40b5a3,与正式 profile 完全隔离),全程走 CDP 驱动真实 UI:schema_version = 129(换号前实测;现为 130),sessions.notifications_muted存在(
INTEGER NOT NULL DEFAULT false),应用正常起窗、正常登录。置顶 | 重命名 | 消息免打扰 | 复制任务链接 | 共享任务 | 移动任务 | 导出任务… | 在新窗口打开 | 归档 | 删除。notifications_muted由 0 变 1。review 后续(自动审查两轮)
自动审查在首轮之后又提了若干条,已按「成立就改、不成立就回帖说明」处理:
6bcfd237csessionFlagRegistry加载期按字段分别登记;done通知在异步富化后、真正发送前再判一次静音;渲染侧回滚不再盖掉期间别处写入的新值da5685bafim/desktopConfirmNotice注入isSuppressed,notifyInputHandoffOwner早退)6c9b34a21main(db24db2aa),解决localDb/ipc/sessions.ts里静音写入块与clearSessionAttention的相邻冲突91adaaf3elocal-db:sessions:update严格校验notificationsMuted只接受真 boolean;两处异步等待后补发送前复查;渲染侧回滚加操作序号91adaaf3e之后的验证:未执行的验证
document.hasFocus()恒为 true(窗口在另一个 Space、document.hidden === true,activate 其它 App /
Page.bringToFront/window.blur()都没能把它翻成 false),而这个状态本身就在通知发送的前置门里,抹不掉它就无法做出「有通知 vs 无通知」的对照。
换真机(把 dev 窗口放到当前 Space 并失焦)就能补; 目前这部分的证据是直接打在四道门上的单测。
风险
风险分类
影响与回滚
sessions加一列(notifications_muted,NOT NULL DEFAULT false)。存量任务全部回填为「未静音」,升级后行为与升级前完全一致;不改任何既有列的语义,
不重写历史 migration,不改任务列表/搜索/用量等任何口径。
(旧版 SELECT 走显式列/整表投影,多余列不影响),不需要回滚 migration,
也不需要恢复历史库。
patch-metaallowlist,不会经隧道下发——旧版对端不会收到它不认识的 patch 字段,因此没有协议兼容风险。
提交前检查
git commit -s,见 DCO)docs/dev-rules/plugin-task-api-implementation.md里的注册表名跟着改了)