核对日期:2026-10-29。本页记录公开客户端的本地实现与检查边界,不代表生产推送或全部平台已验收。终态设计和批次方案在本地 misc/,公开合同见 dmsg-notifications/1。
提醒页与铃铛弹层只列当前账号,顶部角标却使用安装内所有账号的合计,导致当前账号已无未读或待办时仍显示其他账号的数字。现从 notifications/status.accounts 读取当前账号的未读与待办数;没有当前账号或对应计数时归零。计数绑定会话与账号,切换后重新加载;旧响应不能覆盖新会话。铃铛弹层在会话变化时销毁,关闭旧列表并丢弃迟到响应。Dock 与托盘继续使用安装级计数,查看提醒不修改业务已读或完成状态。
- 修复前在 Electron 中复现“当前账号暂无提醒,铃铛仍为 1”;修复后
reminders、accounts、完整notifications流程通过。覆盖他账号残留、未读归零、待办合计、99+、关闭系统通知仍显示当前账号计数、缺失账号、切换/锁定/退出及旧弹层响应。 pnpm check通过(0 错误、0 警告),pnpm test192 项通过,pnpm build通过,pnpm audit:controls无未批准用法。类型检查初次遇到并行收件箱改动的 5 个缺失翻译键,翻译补齐后复测通过;本次未改动那组文件。- 检查 760×540 的提醒页与铃铛弹层截图:中文明暗主题、德文长翻译、阿拉伯语 RTL;无新增溢出。键盘打开、切换账号、Escape 关闭及焦点返回通过。截图位于本地
test-results/reminders-unverified-*.png与test-results/accounts-bell-*.png。 - Electron 使用隔离用户目录与模拟 daemon;完整通知流程显式模拟原生焦点和系统通知。未替换已安装应用,未验证签名发布包、真实推送、Windows 或 Linux。未修改 Rust,未运行 Rust 测试。
macOS 主进程在 daemon 返回角标数量 0 后,又因 counts.unverified 设置 •,导致没有已知未读或待办时仍显示红点;“仅待办”模式也会被待核验的消息点亮。现在图标统一使用 daemon 已应用偏好的 badge:0 清除、1–99 显示数字、更大显示 99+。待核验元数据、最后可信未读数和业务已读状态不因此被清除。
- 新增 Electron 角标回归,修复前实际复现
count: 0, label: "•";修复后覆盖未读归零、待核验时保留可信计数、待办与未读合计、仅待办、关闭角标及99+。macOS 调用真实角标 API 并读取app.dock.getBadge(),daemon 使用隔离 fixture。 pnpm check通过(0 错误、0 警告)、pnpm test169 项通过、pnpm build通过。- 完整
notificationsElectron 流程通过,包括上述角标回归及既有通知设置、失败重试、键盘操作和原账户导航。检查 760×540 下中文明暗、德文长文案与阿拉伯语 RTL 截图,未发现新增布局问题;截图位于本地test-results/notifications-*.png。 - 本轮通知横幅与原生焦点仍使用模拟;没有替换已安装应用,未验证签名发布包、真实通知投递、Windows 或 Linux。未修改 Rust,未运行 Rust 测试。
角标短流程:DMSG_DESKTOP_SMOKE=notification-badge node scripts/smoke.mjs。完整流程:DMSG_DESKTOP_SHOW=1 DMSG_DESKTOP_NOTIFICATION_FOCUS=mock DMSG_DESKTOP_SMOKE=notifications node scripts/smoke.mjs;两者均先在桌面目录运行 pnpm build。
桌面仅侧栏账号菜单切换工作区;移除提醒页的账号选择与切换按钮、设置页的本机账号列表和其他身份登录入口,以及命令面板的其他身份登录命令。iOS 仅保留“我的 → 切换账号”,移除提醒页的账号选择与切换按钮、浏览器请求页的直接切换按钮。通知设置、收件对象、绑定目标等不改变当前工作区的设置和输入保持各自语义。
两端提醒列表直接使用当前会话账号,没有独立账号状态,也不会在没有会话时回退到其他本机账号。通知中的原账户仅用于提示与校验打开目标,不能决定列表读取或清理的账号。切换后的旧列表响应被丢弃;查看列表不产生业务已读或完成回执。
- 桌面
pnpm check无错误、无警告;pnpm test151 项通过;pnpm build通过;pnpm audit:controls无未批准用法。 DMSG_DESKTOP_SMOKE=accounts node scripts/smoke.mjs通过:真实 Electron、隔离 daemon fixture,覆盖唯一入口、键盘切换、原账户路由、锁定、迟到响应、按当前账号清理及退出后的空列表。已检查 760×540 下中文明暗、德文长文案、阿拉伯语 RTL 的提醒与设置截图,保存在本地test-results/accounts-*.png。- iOS 原生桥接产物与源码指纹核对通过,Debug 构建通过。iPhone 17e / iOS 27.0 上 47 项单元测试、9 项
NotificationUITests最终通过。首次运行的两项新增用例因未匹配 SwiftUI 合并后的可访问性标签失败;根据实际层级修正定位后单独复测通过。已检查英文、中文深色、德文、阿拉伯语及跨账号提示截图。 - 23 种语言资源及通知文案一致性检查通过。本轮未运行完整 Electron 业务流程、全部 iOS UI 测试、Rust 测试、真机或线上多账号推送验收;未改变 Rust 核心、OS 认证或通知授权边界。
实现与验证:Codex codex@openai.com。
客户端核心保存账户通知投影、设置、阶段与展示记录,daemon 通过 owner 接口提供列表、计数、实际查看、稍后提醒和原生展示计划。原生消费者取得计划前先登记尝试;系统提交与用户查看、业务已读、审批完成相互独立。仅运行 daemon 不消费展示资格。
桌面只通过 主进程适配器 提交通知。文案是固定本地化文本,不显示账户、频道、发信人、正文或审批载荷。消息、审批、恢复与服务的频率和声音预算来自共享 Rust 核心,不由 renderer 再计算。
全局工具区提供“提醒”,设置提供通知子页。锁定时仍能读取最小元数据;通知点击绑定原账户,切换和解锁由用户明确完成。浏览提醒列表不提交查看回执,业务详情的回报还须通过可见区域、页面焦点、主进程窗口焦点和会话代次检查。
旧 RecoveryNotifications、notifyChannel、MCP/Agent Mail/hint 的独立通知分支、remindPlan 及其定时器已经移除。旧 reminders.json 只在迁移入口读取一次,无法确认账户归属的合同阶段保留在安装运行状态中,直到认证业务读取确认合同。
| 检查 | 本轮结果与边界 |
|---|---|
| Rust 核心与 daemon 通知测试 | 覆盖持久化、重放、静音、阶段、期限、预算、实际查看、账户边界、收件箱分页及旧阶段导入 |
pnpm check |
Svelte 和 TypeScript 检查通过;仍须在后续改动后按需复测 |
pnpm test |
136 项通过;一次既有断线时序测试失败后,单独复测和全套复测通过,未修改其断线语义 |
| Electron 构建 | 通过 |
| 隔离 Electron 通知流程 | 通过,原生焦点显式模拟;覆盖等待、冲突草稿、禁用、空账户、前台提示、实际查看与业务已读分离、原账户路由及键盘操作 |
| Electron 恢复告警短流程 | 通过,系统通知 API 为模拟;未执行该脚本的其余业务流程 |
| 760 × 540 界面截图 | 已生成中文明暗、德文、法文、阿拉伯语及乌尔都语截图;检查代表性截图,没有页面横向溢出;控件沿用共享组件 |
| 实际原生焦点 | 本机测试窗口可见且可获得 DOM 焦点,但 BrowserWindow.isFocused() 仍为 false;未通过真实原生焦点验收 |
| OS 通知和提供者 | Electron 测试替换了系统通知 API。未据此认定真实 macOS、Windows、Linux、APNs 或 FCM 投递成功 |
原生焦点模拟只存在于测试脚本的显式开关中,产品校验没有被放宽。测试同时确认:仅有 DOM 焦点时主进程不接受实际查看回报。原生焦点模拟不能代替安装包、OS 权限、Focus、锁屏或真实通知中心的测试。
在桌面目录运行:
pnpm check
pnpm test
pnpm build
DMSG_DESKTOP_SHOW=1 DMSG_DESKTOP_SMOKE=notifications node scripts/smoke.mjs测试宿主无法提供原生焦点时,只为界面与协议集成验证显式使用:
DMSG_DESKTOP_SHOW=1 DMSG_DESKTOP_NOTIFICATION_FOCUS=mock DMSG_DESKTOP_SMOKE=notifications node scripts/smoke.mjs该流程使用临时用户目录、模拟 daemon 与模拟系统通知,检查草稿保留、乐观版本冲突、权限边界、查看与业务已读分离、前台提示和原账户导航。生成的截图位于已忽略的 test-results/。
- 登记、偏好确认、多账户接收与多设备回执已有 B5 实现;服务是否可用仍以能力响应为准。iOS 接入与本次验证见下文及 iOS 验证。Android 仍等待宿主合入 main。
- 完成真实签名安装包下的原生焦点、权限拒绝、通知展示、历史点击和冷启动验证。Electron 的 macOS 通知需要代码签名,API 支持不等于权限或投递成功。参见 Electron Notification。
- Windows、Linux 与移动真机验证独立记录,不能由 macOS 的模拟通知结果替代。
新增安装持有证明、限用途接收凭据、非活动账户最小 feed、按账户提示连接、实际查看回执、远程偏好 CAS、完整快照缺口重建及退出撤销。频道定时静音保留旧 keyring 格式,确认版本另用现有根加密对象同步;迟到的旧偏好不会恢复通知。
桌面 pnpm check(0 错误/警告)、pnpm test(136 项)和 pnpm build 通过。扩展的 notifications Electron 流程通过:远程冲突保留草稿且必须显式重试,远程确认不让表单变脏;频道定时静音使用共享菜单,并显示待同步状态。760×540 下生成并检查中文明暗、德文长翻译、阿拉伯语 RTL 菜单截图,菜单可滚动、文案换行,无横向溢出。
该 Electron 环境无法可靠获得 macOS 原生焦点,DMSG_DESKTOP_NOTIFICATION_FOCUS=mock 明确模拟主窗口与 DOM 焦点,并保留“DOM 可见但原生焦点被拒绝时不能上报查看”的负例。菜单截图禁用动画后检查。此结果不代表真实原生焦点或 OS 横幅验收。
B5 最终 Rust 验证:cargo clippy -p dmsg_client -p dmsg_cli --all-targets -- -D warnings 通过;客户端完整单元测试 415 项通过、5 项既有测试忽略;daemon 通知测试 4 项通过。完整快照测试验证失败页不推进游标,缺口重建必须等全部页成功后才能结束缺失的旧事项。
接续公开 main@00dbfdf7 及既有未提交通知改动,未核对远端或部署。
iOS 命名门面、原生提醒列表/设置、实际查看、定时静音、原账户路由和旧开关导入已接入。
共享核心保留未知新水位之前的可信计数;桌面与移动列表复用同一分页逻辑,
近期历史上限或清理不淘汰未解决待办。恢复执行时间不再误作安全事项失效时间。
本轮桌面 check(0 错误/警告)、136 测试、build 和 notifications Electron 流程通过。 Electron 首次运行发生 WebSocket UTF-8 帧异常,第二次相同流程通过,未修改传输校验。 本轮仍显式模拟原生焦点和系统通知 API;检查中文明亮、阿拉伯语深色和德文长文案 760×540 截图,未发现内容横向溢出。系统原生权限、横幅和焦点验收仍未完成。 Rust 完整回归:客户端 417 项通过/5 项原有忽略,daemon 96 项通过/6 项原有忽略, 移动门面 10 项通过;fmt 与三包 all-targets Clippy(拒绝 warnings)通过。 共享策略现为 29 场景和 3 个身份向量。iOS 原生结果单列于其验证文档。
以下是终态 N01–N32 的证据索引,不是全平台通过声明。 “核心”是可控时钟/状态测试,“Electron”使用模拟 daemon 与原生 API; 真实账户、OS 或提供者条件未验证的场景继续保留门禁。
| 场景 | 已有证据与剩余边界 |
|---|---|
| N01 当前会话连续收信 | 核心查看过滤、Electron 可见回报;iOS 接上真实可见消息行,未做真机 100 条收信验证 |
| N02 前台其他页面来信 | 来信后台同步与核心应用内分支;真实账户端到端未跑 |
| N03 隐藏窗口来信 | Electron 模拟后台计划与原账户路由;真实 OS 未跑 |
| N04 突发与持续消息 | 3 秒/60 秒向量及持久计划测试;OS 静默替换能力另验 |
| N05 多账户预算 | 核心安装预算与服务端本地集成;真多设备未跑 |
| N06 静音跨锁定/重启 | 持久偏好、定时静音、隐藏过滤、CAS;手机后台真机未跑 |
| N07 自己消息/编辑/控制 | 频道分类与签名回归;不能把旧无分类提示当作已识别新消息 |
| N08 同来源不同审批 | 核心按请求身份与来源合并;钱包远程来源尚未接入 |
| N09 Agent 机器事件 | 保留已验证 Mail 的本地投影和默认关闭;不将 available/MCP 当作提醒 |
| N10 来源自述紧急 | 固定类型/策略与来源合同;不接受任意类别或通知正文 |
| N11 非活动账户安全 | 核心受限 feed、不切账户测试;iOS 真多账户未跑 |
| N12 恢复未知/旧状态 | 核心摘要、版本与期限保留;服务端本地核验前像和公开状态 |
| N13 跨过期限阶段 | 核心当前阶段向量,恢复 TTL 回归 |
| N14 免打扰 | 核心与服务端策略向量;真实系统 Focus 另验 |
| N15 时区/夏令时 | 服务端 DST 测试、Swift 日历测试;真实系统改时钟未跑 |
| N16 他端查看/完成 | 受限回执和 provider 前过滤;原生通知撤回只按平台能力尽力处理 |
| N17 在线不等于查看 | 核心与服务端只读实际查看水位;不选主设备 |
| N18 安全查看不取消临期 | 共享策略及服务端跨安装隔离回归 |
| N19 切账户后点击 | Electron 原账户流程、Swift opaque 目标解析;真实推送点击未跑 |
| N20 冷启动/失效事项 | 受限路由和失效/网络重试界面;真实 OS 冷启动点击未跑 |
| N21 展示不改业务 | 核心展示/查看/业务分离,Electron 与服务端查看不读业务测试 |
| N22 崩溃/重放/缺口 | 原 ID 静音重试、完整快照重建、失败页不推进游标 |
| N23 登记/撤销/等待竞争 | 核心会话与登记代次,服务端最后一次等待后重查;真实 token 更新未跑 |
| N24 权限/Focus/无 GMS | 本机权限与未就绪状态;Focus、Android 和无 GMS 尚未验收 |
| N25 设置离线/冲突 | 本机 CAS、保留草稿、远程待同步与显式重试;真多设备冲突未跑 |
| N26 提供者失败 | 服务端本地有界重试与独立安装结果;真实 APNs/FCM 未跑 |
| N27 关闭/退出/daemon | 唯一 Electron 所有者、daemon 不消费展示资格;真实安装包退出行为未跑 |
| N28 历史清理与未决 | 核心清理/数量上限不截断未决事项;锁定保留计数回归 |
| N29 隐私 | 固定文案与最小 payload 测试、截图检查;不声明生产日志审计完成 |
| N30 旧协议/hint | 原消息字节与能力协商回归;旧通用提示只作待核对 |
| N31 移动唯一展示路径 | remote_owner 向量与 willPresent 抑制;真实同步/APNs 同时到达未跑 |
| N32 首次导入基线 | 初次静默汇总、旧阶段迁移测试;真实新设备登记未跑 |
B7 尚不能关闭全部发布门禁:钱包远程认证来源未接入,Android 按既有决定等待宿主; 真实 macOS/Windows/Linux、APNs/FCM、锁屏/冷启动/Focus/撤销和多账户多设备联调未完成。 提交源码不等于部署服务或完成这些验收。
独立审查 29b37f46^..4e93a9af,含起始提交;未使用 subagents。
修复账户关闭后的受限撤销、重新登记时的偏好确认与 CAS 重建、迟到撤销响应的登记校验,
以及删除工作区后丢失撤销任务的问题。删除只保留撤销所需的受限凭据和待清理系统 ID;
网络失败保留重试,确认撤销或租约到期后清理。安装运行文件不保存接收凭据。
同来源审批在跨来源汇总后仍执行 60 秒间隔;重试重新检查 Agent Mail 开关与实际可见事项。 桌面汇总提示通过受限通知 IPC 打开原账户列表,消息和服务汇总进入近期提醒。 iOS 不再用本地提醒缓存缺失或已结束阻止原业务读取,并按实际时间区间处理夏令时免打扰。
验证:客户端 425 项通过 / 5 项既有忽略,移动核心 10 项通过;通知定向 35 项通过, 其中新增 8 项覆盖来源限流、重试抑制、关闭/删除账户与登记竞争。 桌面使用仓库固定的 pnpm 10.15.1:check 无错误/警告、136 项测试、build 通过。 扩展的 Electron 通知流程通过,新增主窗口汇总点击用例;已检查 760×540 中文明暗、 德文长文案、阿拉伯语 RTL 截图。该流程仍显式模拟原生焦点和系统通知 API。 daemon 96 项通过 / 6 项既有忽略;三包 fmt 与 all-targets Clippy(拒绝 warnings)通过。 iOS 两个 ARM64 slice、绑定和源码指纹重建核验通过;iPhone 16 Pro / iOS 18.4 构建、39 原生单元测试及 3 通知 UI 流程通过(含夏令时新增断言)。 23 语言、31 图标和 12 Python 测试通过。真实 OS/APNs/FCM 与多设备发布门禁保持开放。
审查与修复署名:Codex codex@openai.com。
审查 29b37f46–0fd158d0 后修正以下问题:
- 锁定或没有接收凭据时,通用待核对占位(
Summary)从不结束。第一次网页请求提示后,该账户以后的同类提示全部被忽略,“待核对”角标标记也一直保留。现由解锁后的本地对账结束占位并把阶段归零,再次锁定时的提示能重新出现。 - 角标、托盘和顶部提醒数只统计已开启提醒的账户,默认关闭时全部归零。现在当前所选账户始终计入。
- 从旧版升级的桌面默认关闭全部系统通知,包括恢复告警。现在首次迁移时若已有绑定的所选账户,为它沿用旧版的默认开启;新安装保持关闭。
- 能力探测网络失败时把发布元数据和远程接收写成不支持。现在保留上次结果。
- 每次后台频道读取都会唤醒远程 feed 读取。现在只由服务提示、偏好修改、查看回执和稍后提醒唤醒;收件箱与接收循环的兜底间隔从 60 秒改为 10 分钟。
- 墓碑清理时没有删除每事项的接收、查看与稍后提醒标记。现在一并删除。
已运行:cargo fmt --all -- --check;cargo clippy -p dmsg_client -p dmsg_cli -p dmsg_mobile --all-targets -- -D warnings;cargo test -p dmsg_client --lib(429 通过,5 项既有忽略,含新增 4 项通知测试);cargo test -p dmsg_cli(99 通过,6 项既有忽略,含新增 2 项迁移测试);cargo check -p dmsg_mobile。
未运行:本次没有改动桌面 TypeScript/Svelte,未重跑 pnpm check/pnpm test 和 Electron 流程;未重建 iOS XCFramework,也未运行 Xcode 测试(移动门面只改了内部计数实现,导出接口不变);未验证真实 OS 通知与推送提供者。
审查与修复署名:Claude Opus 5.5。
按终态设计 v1.1 第 4.1、7.2、9.3 节补齐三项客户端缺口,未改通知策略语义:
- 隐私说明:网站 23 种语言隐私政策(iOS 离线副本逐字节相同)写明通知服务处理的元数据——不透明资源 ID、频道静音与隐藏、免打扰时段与时区、实际查看回执的时间与水位、同一安装登记的账户,以及为恢复临期提醒上传的恢复记录(含新的登录身份与设备公钥);撤销登记、移除账户或删除服务账户时清除这些数据。iOS
PrivacyInfo.xcprivacy增加产品交互(查看回执),标签对照见 iOS README。 - 多账户同意:在已有其他本机账户接收通知时开启某账户,保存前先由共享
Confirm(Dialog)说明通知服务和推送提供者会知道这些账户在同一设备上,并列出已接收的账户;取消不提交且保留草稿。 - 新装引导:已设置好的当前账户若安全提醒未开启,账户安全页和提醒页显示非模态提示,只跳转通知设置,不请求系统权限;“暂不”按账户记在本窗口存储,账户安全页发现新绑定的登录后再次显示。
已运行:pnpm check(0 错误/警告)、pnpm test(137 项,含新增安全提醒判定)、pnpm build,以及 DMSG_DESKTOP_SHOW=1 DMSG_DESKTOP_NOTIFICATION_FOCUS=mock DMSG_DESKTOP_SMOKE=notifications node scripts/smoke.mjs。扩展流程覆盖:打开设置不写偏好;键盘 Enter 进入设置;同意框 Escape 取消不提交且保留勾选;确认后按账户范围提交;“暂不”在两页同时隐藏;模拟新增绑定登录后重新显示;开启后提示消失。760×540 下检查了中文明暗、德文长文案和阿拉伯语 RTL 深色的提示与同意框截图,无横向溢出。原生焦点与系统通知 API 仍为模拟,未做真实 OS 验收。