{ "meta": { "title": "dudu — 项目 TODO", "updated_at": "2026-06-11T17:26:45.125Z" }, "seq": 22, "items": [ { "id": 1, "title": "M0 风险验证 spike", "desc": "三项风险验证并行:iOS 键盘录音、Gummy 流式、macOS 注入。无前置依赖,第一波启动", "level": "high", "tier": 2, "tags": [ "跨端" ], "status": "open", "created_at": "2026-06-11T01:24:09.849Z", "done": false, "completed_at": null, "version": null, "subtasks": [ { "sid": "1A", "title": "iOS 键盘扩展内录音可行性 spike(真机验证完全访问下 AVAudioSession;不可行则确认 deep link 降级)", "tier": 2, "deps": [], "status": "done", "created_at": "2026-06-11T01:24:10.547Z" }, { "sid": "1B", "title": "Gummy 流式接入 demo(Go 直连 DashScope WS,wav 推流收 partial/final)", "tier": 2, "deps": [], "status": "done", "created_at": "2026-06-11T01:24:10.598Z" }, { "sid": "1C", "title": "macOS 注入 + 不抢焦点浮层 demo(剪贴板+CGEvent、focusable:false 验证微信/浏览器/IDE)", "tier": 2, "deps": [], "status": "open", "created_at": "2026-06-11T01:24:10.647Z" } ] }, { "id": 2, "title": "微信开放平台与商户号申请", "desc": "人工/外部流程,周期数周,是支付联调(#7)与上架的关键路径,第一天启动", "level": "high", "tier": 3, "tags": [ "外部" ], "status": "open", "created_at": "2026-06-11T01:24:09.900Z", "done": false, "completed_at": null, "version": null, "subtasks": [ { "sid": "2A", "title": "开放平台网站应用 + 移动应用注册提审", "tier": 3, "deps": [], "status": "open", "created_at": "2026-06-11T01:24:10.700Z" }, { "sid": "2B", "title": "微信支付商户号申请 + API 证书/密钥配置(入 Bitwarden)", "tier": 3, "deps": [], "status": "open", "created_at": "2026-06-11T01:24:10.749Z" }, { "sid": "2C", "title": "软件著作权申请(输入法上架需要)", "tier": 3, "deps": [], "status": "open", "created_at": "2026-06-11T01:24:10.798Z" } ] }, { "id": 3, "title": "协议与共享基建", "desc": "pkg/protocol 是 5 端对齐的唯一真相源,多数任务前置。设计依据 doc/backend-architecture.html 第四章", "level": "high", "tier": 1, "tags": [ "后端", "跨端" ], "status": "done", "created_at": "2026-06-11T01:24:09.951Z", "done": false, "completed_at": null, "version": null, "subtasks": [ { "sid": "3A", "title": "pkg/protocol:WS 帧结构(start/stop/cancel/partial/final/usage/error)+ 错误码常量", "tier": 1, "deps": [], "status": "done", "created_at": "2026-06-11T01:24:10.847Z" }, { "sid": "3B", "title": "pkg/protocol:REST DTO(me/packs/orders/feedback/metrics)", "tier": 1, "deps": [], "status": "done", "created_at": "2026-06-11T01:24:10.898Z" }, { "sid": "3C", "title": "design-pipeline:tokens.css 导出 DuduTheme.swift / DuduTheme.kt + CI 校验", "tier": 2, "deps": [], "status": "done", "created_at": "2026-06-11T01:24:10.947Z" }, { "sid": "3D", "title": "monorepo 骨架(server/desktop/android/ios 目录 + 根 README + CI 雏形)", "tier": 3, "deps": [], "status": "done", "created_at": "2026-06-11T01:24:10.997Z" } ] }, { "id": 4, "title": "后端·工程与数据层", "desc": "schema 见 doc/backend-architecture.html 第六章", "level": "high", "tier": 1, "tags": [ "后端", "数据库" ], "status": "done", "created_at": "2026-06-11T01:24:10.002Z", "done": false, "completed_at": null, "version": null, "subtasks": [ { "sid": "4A", "title": "Go 工程骨架:gin + 配置加载 + 日志 + Docker compose(pg/redis)", "tier": 2, "deps": [], "status": "done", "created_at": "2026-06-11T01:24:11.048Z" }, { "sid": "4B", "title": "store:全部表 migration + gorm models(11 张表,见后端文档第六章)", "tier": 1, "deps": [ "4A" ], "status": "done", "created_at": "2026-06-11T01:24:11.099Z" }, { "sid": "4C", "title": "Redis 接入 + Key 封装(quota/authqr/jwt:block/rate 滑动窗口)", "tier": 2, "deps": [ "4A" ], "status": "done", "created_at": "2026-06-11T01:24:11.152Z" } ] }, { "id": 5, "title": "后端·认证", "desc": "跨 epic 依赖:#4 骨架;5C 需 #2A 微信凭证(开发期可用测试号 mock)", "level": "high", "tier": 2, "tags": [ "后端" ], "status": "done", "created_at": "2026-06-11T01:24:10.051Z", "done": false, "completed_at": null, "version": null, "subtasks": [ { "sid": "5A", "title": "JWT 签发/校验中间件 + jti 黑名单 + logout", "tier": 2, "deps": [], "status": "done", "created_at": "2026-06-11T01:24:11.203Z" }, { "sid": "5B", "title": "扫码登录状态机(POST/GET /v1/auth/qr,Redis state TTL 120s)", "tier": 2, "deps": [ "5A" ], "status": "done", "created_at": "2026-06-11T01:24:11.254Z" }, { "sid": "5C", "title": "微信网页授权回调 + 移动端 code 换 token + unionid 关联建号", "tier": 2, "deps": [ "5A" ], "status": "done", "created_at": "2026-06-11T01:24:11.304Z" } ] }, { "id": 6, "title": "后端·识别网关", "desc": "跨 epic 依赖:#3A 协议、#4 骨架。含 Provider 抽象/中继/计量/识别限制", "level": "high", "tier": 1, "tags": [ "后端" ], "status": "done", "created_at": "2026-06-11T01:24:10.101Z", "done": false, "completed_at": null, "version": null, "subtasks": [ { "sid": "6A", "title": "ASR Provider 接口 + mock provider(脚本化回放 partial/final 供测试)", "tier": 1, "deps": [], "status": "done", "created_at": "2026-06-11T01:24:11.355Z" }, { "sid": "6B", "title": "gummy provider(DashScope WS 对接,含断连重建,基于 1B demo)", "tier": 2, "deps": [ "6A" ], "status": "done", "created_at": "2026-06-11T01:24:11.405Z" }, { "sid": "6C", "title": "WS 网关:连接鉴权 + 会话状态机 + 上下行双泵中继", "tier": 1, "deps": [ "6A" ], "status": "done", "created_at": "2026-06-11T01:24:11.454Z" }, { "sid": "6D", "title": "计量与 usage 帧(实收帧时长累计、provider 时间戳交叉校验、2s 下发)", "tier": 2, "deps": [ "6C" ], "status": "done", "created_at": "2026-06-11T01:24:11.505Z" }, { "sid": "6E", "title": "识别限制:3 分钟截断定稿 + 单设备单路 + 30 分钟滑动窗口(次数/时长)", "tier": 2, "deps": [ "6C" ], "status": "done", "created_at": "2026-06-11T01:24:11.556Z" } ] }, { "id": 7, "title": "后端·计费与配额", "desc": "跨 epic 依赖:#4;7C/7D 真实支付需 #2B 商户号(可先沙箱)。时长账本设计见后端文档第五章", "level": "high", "tier": 1, "tags": [ "后端", "数据库" ], "status": "done", "created_at": "2026-06-11T01:24:10.150Z", "done": false, "completed_at": null, "version": null, "subtasks": [ { "sid": "7A", "title": "quota:Redis Lua 原子扣减(先试用后余额)+ start 预检 + 扣穿当句不掐断", "tier": 1, "deps": [], "status": "done", "created_at": "2026-06-11T01:24:11.606Z" }, { "sid": "7B", "title": "quota:异步落库 ledger/asr_sessions + 余额冗余列 + 每日对账任务", "tier": 2, "deps": [ "7A" ], "status": "done", "created_at": "2026-06-11T01:24:11.656Z" }, { "sid": "7C", "title": "billing:GET /v1/packs + 下单(native code_url / app 支付参数)", "tier": 2, "deps": [], "status": "done", "created_at": "2026-06-11T01:24:11.709Z" }, { "sid": "7D", "title": "billing:回调验签幂等入账(transaction_id 唯一)+ 订单轮询 + 5 分钟查单兜底", "tier": 1, "deps": [ "7C" ], "status": "done", "created_at": "2026-06-11T01:24:11.760Z" } ] }, { "id": 8, "title": "后端·用户与周边", "desc": "跨 epic 依赖:#4。含 v1.1 新增 feedback/telemetry", "level": "mid", "tier": 2, "tags": [ "后端" ], "status": "done", "created_at": "2026-06-11T01:24:10.200Z", "done": false, "completed_at": null, "version": null, "subtasks": [ { "sid": "8A", "title": "GET /v1/me 聚合(balance/trial/account_state 判定)+ devices 登记", "tier": 2, "deps": [], "status": "done", "created_at": "2026-06-11T01:24:11.810Z" }, { "sid": "8B", "title": "GET /v1/app/latest 版本检查", "tier": 3, "deps": [], "status": "done", "created_at": "2026-06-11T01:24:11.862Z" }, { "sid": "8C", "title": "feedback:multipart 接收 + magic bytes 校验 + OSS 转存 + 10 条/天限频", "tier": 2, "deps": [], "status": "done", "created_at": "2026-06-11T01:24:11.913Z" }, { "sid": "8D", "title": "telemetry:metrics/batch(白名单/截断/异步入库)+ 每日聚合 P50/P95 + 超标告警", "tier": 2, "deps": [], "status": "done", "created_at": "2026-06-11T01:24:11.964Z" } ] }, { "id": 9, "title": "后端·集成测试", "desc": "汇聚点:依赖 #5 #6 #7 #8 主体完成", "level": "mid", "tier": 2, "tags": [ "后端", "CI/CD" ], "status": "done", "created_at": "2026-06-11T01:24:10.251Z", "done": false, "completed_at": null, "version": null, "subtasks": [ { "sid": "9A", "title": "WS E2E:wav 推流断言 partial/final/usage 序列与扣费正确(mock+gummy 双跑)", "tier": 2, "deps": [], "status": "done", "created_at": "2026-06-11T01:24:12.015Z" }, { "sid": "9B", "title": "支付 E2E:沙箱/构造回调测幂等、金额校验、入账 + 限频用例(31 次/超 1800s)", "tier": 2, "deps": [], "status": "done", "created_at": "2026-06-11T01:24:12.067Z" } ] }, { "id": 10, "title": "桌面·Rust 系统能力", "desc": "六项系统能力九成可并行;10C 依赖 #3A 协议", "level": "high", "tier": 2, "tags": [ "mac", "Windows" ], "status": "done", "created_at": "2026-06-11T01:24:10.300Z", "done": false, "completed_at": null, "version": null, "subtasks": [ { "sid": "10A", "title": "Tauri 2 工程 + @dudu/design 接入 + data-theme 主题切换", "tier": 2, "deps": [], "status": "done", "created_at": "2026-06-11T01:24:12.118Z" }, { "sid": "10B", "title": "全局快捷键 push-to-talk(press/release 事件 + 自定义改键)", "tier": 2, "deps": [], "status": "done", "created_at": "2026-06-11T01:24:12.171Z" }, { "sid": "10C", "title": "WS 客户端:预连接/心跳/指数退避重连 + 协议编解码", "tier": 2, "deps": [], "status": "done", "created_at": "2026-06-11T01:24:12.222Z" }, { "sid": "10D", "title": "cpal 音频采集 + 16k 重采样 + 100ms 分帧 + 设备枚举/切换", "tier": 2, "deps": [], "status": "done", "created_at": "2026-06-11T01:24:12.272Z" }, { "sid": "10E", "title": "macOS 文字注入(剪贴板+CGEvent+恢复)+ 辅助功能权限检测(基于 1C demo)", "tier": 2, "deps": [], "status": "done", "created_at": "2026-06-11T01:24:12.321Z" }, { "sid": "10F", "title": "Windows 文字注入(SendInput KEYEVENTF_UNICODE)", "tier": 2, "deps": [], "status": "done", "created_at": "2026-06-11T01:24:12.373Z" }, { "sid": "10G", "title": "Rust↔Web 事件桥(hotkey/asr/account/audio 事件 + invoke 命令集)", "tier": 2, "deps": [ "10B", "10C" ], "status": "done", "created_at": "2026-06-11T01:24:12.431Z" }, { "sid": "10H", "title": "metrics 模块:本地队列(20 条/60s)+ 批量上报 + 漏斗事件汇入", "tier": 2, "deps": [ "10C" ], "status": "done", "created_at": "2026-06-11T01:24:12.481Z" } ] }, { "id": 11, "title": "桌面·界面", "desc": "直接复用 design/ React 组件;可用 mock 事件与 #10 并行,最终联调依赖 10G 事件桥", "level": "high", "tier": 2, "tags": [ "mac", "Windows", "前端" ], "status": "done", "created_at": "2026-06-11T01:24:10.349Z", "done": false, "completed_at": null, "version": null, "subtasks": [ { "sid": "11A", "title": "识别浮层窗口(透明/置顶/不抢焦点 + RecognitionOverlay 两态 + 错误态文案)", "tier": 2, "deps": [], "status": "done", "created_at": "2026-06-11T01:24:12.531Z" }, { "sid": "11B", "title": "托盘 + 自绘托盘菜单(248px、accent 反白、检查更新入口)", "tier": 2, "deps": [], "status": "done", "created_at": "2026-06-11T01:24:12.582Z" }, { "sid": "11C", "title": "设置窗口(四分组:输入/通用/账号与时长/帮助 + 持久化)", "tier": 2, "deps": [], "status": "done", "created_at": "2026-06-11T01:24:12.635Z" }, { "sid": "11D", "title": "登录/购买窗口(扫码轮询 → 时长包 → 支付二维码轮询 → 完成)", "tier": 2, "deps": [], "status": "done", "created_at": "2026-06-11T01:24:12.688Z" }, { "sid": "11E", "title": "反馈窗口(文字 + 图片粘贴/拖拽 + 诊断 Switch + 成功态)", "tier": 2, "deps": [], "status": "done", "created_at": "2026-06-11T01:24:12.739Z" }, { "sid": "11F", "title": "首次启动引导(欢迎 → 权限 → 登录 → 试一试)", "tier": 2, "deps": [ "11C" ], "status": "done", "created_at": "2026-06-11T01:24:12.789Z" } ] }, { "id": 12, "title": "桌面·联调与验收", "desc": "汇聚点:依赖 #10 #11 全部与后端 #5 #6 #7", "level": "high", "tier": 2, "tags": [ "mac", "Windows" ], "status": "open", "created_at": "2026-06-11T01:24:10.398Z", "done": false, "completed_at": null, "version": null, "subtasks": [ { "sid": "12A", "title": "全链路联调:快捷键→采集→流式→浮层→注入(mac+win 双平台)", "tier": 2, "deps": [], "status": "open", "created_at": "2026-06-11T01:24:12.841Z" }, { "sid": "12B", "title": "延迟验收:first_partial P95<500ms / release_to_commit<300ms 实测调优", "tier": 2, "deps": [ "12A" ], "status": "open", "created_at": "2026-06-11T01:24:12.893Z" }, { "sid": "12C", "title": "异常路径:断网重连/QUOTA/RATE_LIMITED/3 分钟截断逐项验证", "tier": 2, "deps": [ "12A" ], "status": "open", "created_at": "2026-06-11T01:24:12.943Z" } ] }, { "id": 13, "title": "Android 输入法", "desc": "先于 iOS。UI 依赖 #3C 主题导出;联网依赖 #3A 与后端 #5 #6", "level": "mid", "tier": 2, "tags": [ "Android" ], "status": "done", "created_at": "2026-06-11T01:24:10.447Z", "done": false, "completed_at": null, "version": null, "subtasks": [ { "sid": "13A", "title": "工程骨架 + DuduTheme.kt 接入(light/dark)", "tier": 2, "deps": [], "status": "done", "created_at": "2026-06-11T01:24:12.992Z" }, { "sid": "13B", "title": "主 App:微信登录 + 启用引导三步 + 我的页(权限自检/试用进度/反馈入口)", "tier": 2, "deps": [ "13A" ], "status": "done", "created_at": "2026-06-11T01:24:13.044Z" }, { "sid": "13C", "title": "主 App:购买时长页 + 微信 APP 支付", "tier": 2, "deps": [ "13B" ], "status": "done", "created_at": "2026-06-11T01:24:13.093Z" }, { "sid": "13D", "title": "IME Service:键盘 UI 四态(工具条/功能键行/MicBar/partial 文本条)", "tier": 2, "deps": [ "13A" ], "status": "done", "created_at": "2026-06-11T01:24:13.144Z" }, { "sid": "13E", "title": "IME:录音 + WS 推流 + commitText 上屏 + 上滑取消", "tier": 2, "deps": [ "13D" ], "status": "done", "created_at": "2026-06-11T01:24:13.198Z" }, { "sid": "13F", "title": "反馈页 + metrics 队列(WorkManager flush)", "tier": 3, "deps": [ "13B" ], "status": "done", "created_at": "2026-06-11T01:24:13.250Z" } ] }, { "id": 14, "title": "iOS 输入法", "desc": "14D 依赖 #1A spike 结论(主路径或 deep link 降级)。UI 依赖 #3C", "level": "mid", "tier": 2, "tags": [ "iOS" ], "status": "done", "created_at": "2026-06-11T01:24:10.497Z", "done": false, "completed_at": null, "version": null, "subtasks": [ { "sid": "14A", "title": "工程骨架(App+Keyboard Extension+App Group)+ DuduTheme.swift 接入", "tier": 2, "deps": [], "status": "done", "created_at": "2026-06-11T01:24:13.302Z" }, { "sid": "14B", "title": "主 App:微信登录 + 引导(含完全访问步)+ 我的 + 购买(APP 支付)", "tier": 2, "deps": [ "14A" ], "status": "done", "created_at": "2026-06-11T01:24:13.354Z" }, { "sid": "14C", "title": "键盘扩展:UI 四态 + textDocumentProxy 上屏框架", "tier": 2, "deps": [ "14A" ], "status": "done", "created_at": "2026-06-11T01:24:13.406Z" }, { "sid": "14D", "title": "键盘扩展:录音 + WS 推流(按 1A 结论实现主路径或 deep link 降级)", "tier": 2, "deps": [ "14C" ], "status": "done", "created_at": "2026-06-11T01:24:13.461Z" }, { "sid": "14E", "title": "反馈页 + metrics(App Group 队列)+ iPad 布局适配", "tier": 3, "deps": [ "14B", "14C" ], "status": "done", "created_at": "2026-06-11T01:24:13.516Z" } ] }, { "id": 15, "title": "官网宣传页(web/index.html)", "desc": "单页静态宣传页,复用设计系统品牌语言,含按住说话交互演示;后续接真实下载链接与备案号", "level": "mid", "tier": 3, "tags": [ "Web", "前端" ], "status": "done", "created_at": "2026-06-11T13:40:06.825Z", "done": false, "completed_at": null, "version": null }, { "id": 16, "title": "后端·网关与计费正确性修复", "desc": "code-review 发现的网关/计费严重 bug:截断或 provider 死亡后仍扣费、WriteJSON 无写超时致 goroutine 泄漏、WaitGroup Add 竞态、finish 漏在途扣费、扣穿当句未掐断致白嫖、GORM v2 锁失效、usage 帧 omitempty 吞合法 0 值", "level": "high", "tier": 2, "tags": [ "后端", "数据库" ], "status": "done", "created_at": "2026-06-11T17:15:07.520Z", "done": false, "completed_at": null, "version": null, "subtasks": [ { "sid": "16A", "title": "feed 先判截断再累计;provider 死亡/截断后终结会话停止扣费", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:15:23.816Z" }, { "sid": "16B", "title": "wsConn 写超时(SetWriteDeadline)+finish 的 Wait 加超时+修 defer 顺序避免 goroutine 泄漏", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:15:23.886Z" }, { "sid": "16C", "title": "resultsDone.Add(1) 移到 go 语句之前,消除 WaitGroup 竞态", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:15:23.954Z" }, { "sid": "16D", "title": "finish 等待在途 consumeDelta 完成后再取 settle 快照,避免漏账", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:15:24.026Z" }, { "sid": "16E", "title": "扣穿当句不掐断:consumeDelta 扣穿后置标志,本句 final 后下发 QUOTA_EXCEEDED 结束会话", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:15:24.099Z" }, { "sid": "16F", "title": "billing.MarkPaid 改用 GORM v2 Clauses(锁)写法,恢复行锁", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:15:24.168Z" }, { "sid": "16G", "title": "usage 帧 SessionSeconds/BalanceSeconds/TrialRemaining 去掉 omitempty,让 0 显式下发", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:15:24.237Z" } ] }, { "id": 17, "title": "后端·认证限流与依赖装配修复", "desc": "JWT 黑名单 fail-open、logout TTL 硬编码 8 天、滑动窗口 seq 键永不过期、设备槽 4min TTL 不续期、pickProvider 永远 mock(gummy 永不装配)、/v1/pay/notify 无鉴权+pickPay 永远 mock=免费充值、metrics/batch 无可选鉴权 user_id 恒空、AppLatest 裸读 env、死代码清理", "level": "high", "tier": 2, "tags": [ "后端" ], "status": "done", "created_at": "2026-06-11T17:15:07.591Z", "done": false, "completed_at": null, "version": null, "subtasks": [ { "sid": "17A", "title": "JWT 黑名单检查 fail-closed:Redis Exists 出错时拒绝并记录,不放行", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:15:37.952Z" }, { "sid": "17B", "title": "logout Revoke TTL 用 token 实际过期时间(claims.ExpiresAt),不硬编码 8 天", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:15:38.022Z" }, { "sid": "17C", "title": "滑动窗口 Lua 给 key:seq 计数器设 EXPIRE,消除永久泄漏键", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:15:38.093Z" }, { "sid": "17D", "title": "设备槽会话期间续期 TTL(usageLoop 里 EXPIRE),避免长会话槽过期致多路", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:15:38.163Z" }, { "sid": "17E", "title": "pickProvider 真正按 ASR_PROVIDER 装配 gummy(有 key 用 gummy),启动日志打印 real/mock", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:15:38.234Z" }, { "sid": "17F", "title": "metrics/batch 挂可选鉴权中间件,注入 user_id", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:15:38.306Z" }, { "sid": "17G", "title": "AppLatest 配置进 config.Load 启动校验,避免每请求裸读 env", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:15:38.377Z" }, { "sid": "17H", "title": "清理死代码:AllowAudioSeconds、fmt 占位行、gummy lastText 字段", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:15:38.448Z" }, { "sid": "17I", "title": "pay/notify 鉴权与验签:MockPay 加共享密钥校验或文档标注部署前必换真实验签", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:15:38.521Z" } ] }, { "id": 18, "title": "桌面 Rust 客户端正确性修复", "desc": "取消后晚到 final 残留 CommitBuffer 错上下文注入、stop spawn 无 abort/代际校验、350ms 固定延迟改事件驱动、token/device_id parse unwrap panic、重连不重建会话丢音频、UNAUTHORIZED 无处理+unbounded channel 堆积、emit 全局广播 6 窗口、reqwest Client 每次新建、platform=macos 不符约定、check_update 忽略 force", "level": "high", "tier": 2, "tags": [ "mac", "Windows" ], "status": "done", "created_at": "2026-06-11T17:15:07.663Z", "done": false, "completed_at": null, "version": null, "subtasks": [ { "sid": "18A", "title": "dictation 会话代际+取消守卫:取消后晚到 final 不残留、不注入错上下文", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:15:53.259Z" }, { "sid": "18B", "title": "stop spawn 任务加代际校验,快速连说不串文本/不误隐藏新会话浮层", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:15:53.331Z" }, { "sid": "18C", "title": "收尾注入改事件驱动(收到 stop 后 final/usage 即注入),350ms 仅作超时兜底", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:15:53.400Z" }, { "sid": "18D", "title": "ws.rs token/device_id 用 HeaderValue::from_str 优雅处理非法值,不 unwrap panic", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:15:53.470Z" }, { "sid": "18E", "title": "ws.rs 重连后若会话进行中重发 start 或通知客户端会话失败,避免静默丢音频", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:15:53.540Z" }, { "sid": "18F", "title": "ws.rs 处理 UNAUTHORIZED(emit+清 token 引导登录)+音频 channel 改 bounded", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:15:53.611Z" }, { "sid": "18G", "title": "asr/hotkey 事件改 emit_to(overlay) 定向,不广播 6 窗口", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:15:53.683Z" }, { "sid": "18H", "title": "reqwest::Client 改 OnceLock 共享实例;metrics platform 改 mac/win;check_update 处理 force", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:15:53.754Z" } ] }, { "id": 19, "title": "桌面前端正确性修复", "desc": "登录 QR 不处理 expired+隐藏窗口永久轮询、设置整结构回写覆盖 token 致登出、overlay 错误帧 BAD_REQUEST/INTERNAL 无文案 setError 空、tray/login 窗口主题未初始化、轮询样板收敛 usePoll", "level": "mid", "tier": 2, "tags": [ "前端" ], "status": "done", "created_at": "2026-06-11T17:15:07.736Z", "done": false, "completed_at": null, "version": null, "subtasks": [ { "sid": "19A", "title": "登录 QR 轮询处理 expired 自动换码;窗口隐藏(非卸载)时停止轮询", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:16:06.711Z" }, { "sid": "19B", "title": "设置窗口改增量写(set_settings 仅传改动项),不整结构覆盖 token", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:16:06.784Z" }, { "sid": "19C", "title": "overlay 错误帧兜底文案(BAD_REQUEST/INTERNAL/未知码),不 setError 空串", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:16:06.858Z" }, { "sid": "19D", "title": "tray/login 入口补主题初始化(get_settings→setThemePref)", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:16:06.927Z" }, { "sid": "19E", "title": "收敛轮询样板为 shared/usePoll 钩子(存活标志+清理+在途去重)", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:16:06.996Z" } ] }, { "id": 20, "title": "Android 客户端正确性修复", "desc": "onRelease 在 onOpen 前 sendStop 时序错乱致空文本、/v1/me 未发 X-Device-ID 致 touchDevice no-op、错误文案改 server-first、AccountRepository 冗余派生状态简化、KeyboardScreen partial 全屏重组收窄", "level": "mid", "tier": 2, "tags": [ "Android" ], "status": "done", "created_at": "2026-06-11T17:15:07.807Z", "done": false, "completed_at": null, "version": null, "subtasks": [ { "sid": "20A", "title": "onRelease 等 onOpen 后再 sendStop(或缓冲 stop 待 start 后补发),修握手时序", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:16:07.065Z" }, { "sid": "20B", "title": "/v1/me 请求带 X-Device-ID 头,使 touchDevice 生效", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:16:07.137Z" }, { "sid": "20C", "title": "错误文案改 server message 优先、本地表仅兜底未知码", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:16:07.207Z" }, { "sid": "20D", "title": "AccountRepository 只存 token/balance/trialUsed/limit,state/trialRemaining 推导", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:16:07.279Z" }, { "sid": "20E", "title": "KeyboardScreen 拆分状态流,partial 只重组 PartialBar", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:16:07.350Z" } ] }, { "id": 21, "title": "iOS 客户端正确性修复", "desc": "finishing 阶段周期 usage 帧误判 stop 结算致丢字、AsrAudioCapture stop 与 tap 回调数据竞争崩溃、usage omitempty 0 值处理、CommitController 死代码删除、180s 本地计时器双轨移除、MetricsQueue 每事件全目录扫描、错误文案 server-first、deep link 剪贴板无条件覆盖", "level": "mid", "tier": 2, "tags": [ "iOS" ], "status": "done", "created_at": "2026-06-11T17:15:07.880Z", "done": false, "completed_at": null, "version": null, "subtasks": [ { "sid": "21A", "title": "finishing 阶段只用收尾标志/final 结束会话,不把周期 usage 帧当 stop 结算致丢字", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:16:21.039Z" }, { "sid": "21B", "title": "AsrAudioCapture stop 与 tap 回调同步(串行队列/锁),消除数据竞争崩溃", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:16:21.112Z" }, { "sid": "21C", "title": "applyUsage 处理 usage 0 值(协议去 omitempty 后按 0 覆盖余额/试用)", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:16:21.187Z" }, { "sid": "21D", "title": "删除 CommitController 死代码(移出键盘 target)", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:16:21.260Z" }, { "sid": "21E", "title": "移除 iOS 180s 本地强制定稿计时器,统一以服务端 SESSION_LIMIT 为准", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:16:21.336Z" }, { "sid": "21F", "title": "MetricsQueue 改近似计数/flush 时 trim,不每事件全目录扫描", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:16:21.410Z" }, { "sid": "21G", "title": "错误文案 server message 优先;deep link 剪贴板覆盖降级为兜底", "tier": null, "deps": [], "status": "done", "created_at": "2026-06-11T17:16:21.483Z" } ] }, { "id": 22, "title": "跨端架构改进 backlog(评审后再做)", "desc": "本轮不改代码,仅记录待评审:限制常量(180s/30次/1800s)服务端下发、gummy 断连重建分层、三端 WS 连接策略统一、错误码文案服务端下发、web 价格表第三份副本与 SeedPacks 单源、设备准入校验防随机 device_id 绕过限流", "level": "mid", "tier": 1, "tags": [ "跨端", "文档" ], "status": "open", "created_at": "2026-06-11T17:15:07.950Z", "done": false, "completed_at": null, "version": null } ] }