Files
wangjia b5ab92a57e
ci / server (push) Failing after 13s
ci / design-tokens (push) Failing after 11s
fix: 应用 xhigh 代码评审的跨端修复
来自 xhigh code review 的正确性/健壮性修复,覆盖全部五端:
- server:鉴权 fail-closed、计量交叉校验与配额扣穿处理、WS 网关并发与关闭顺序、
  billing 行锁、redis Lua 过期与设备槽刷新、config 解析
- desktop:会话 epoch 防串话、WS 重连与 401 处理、api 客户端复用、统一 usePoll 轮询
- android:握手时序、请求头封装、账户状态派生、按需重组
- ios:finalize 宽限、串行采集、错误文案服务端优先、删除死代码 CommitController

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 11:50:08 +08:00

1242 lines
38 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"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 流式接入 demoGo 直连 DashScope WSwav 推流收 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/protocolWS 帧结构(start/stop/cancel/partial/final/usage/error+ 错误码常量",
"tier": 1,
"deps": [],
"status": "done",
"created_at": "2026-06-11T01:24:10.847Z"
},
{
"sid": "3B",
"title": "pkg/protocolREST DTOme/packs/orders/feedback/metrics",
"tier": 1,
"deps": [],
"status": "done",
"created_at": "2026-06-11T01:24:10.898Z"
},
{
"sid": "3C",
"title": "design-pipelinetokens.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 composepg/redis",
"tier": 2,
"deps": [],
"status": "done",
"created_at": "2026-06-11T01:24:11.048Z"
},
{
"sid": "4B",
"title": "store:全部表 migration + gorm models11 张表,见后端文档第六章)",
"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/qrRedis 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 providerDashScope 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 依赖:#47C/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": "quotaRedis 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": "billingGET /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": "feedbackmultipart 接收 + magic bytes 校验 + OSS 转存 + 10 条/天限频",
"tier": 2,
"deps": [],
"status": "done",
"created_at": "2026-06-11T01:24:11.913Z"
},
{
"sid": "8D",
"title": "telemetrymetrics/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 E2Ewav 推流断言 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-talkpress/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": "反馈页 + metricsApp 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-closedRedis 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/limitstate/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
}
]
}