Files
dudu/todo/todo.json
T
wangjia 40760aa884
ci / server (push) Failing after 14s
ci / design-tokens (push) Failing after 11s
dudu MVP:五端语音输入法初始提交
- server:Go 网关(WS 流式识别中继/计费配额/微信登录支付 mock/反馈/埋点),gummy provider 已真实联调
- desktop:Tauri 2(全局快捷键 push-to-talk/浮层/托盘/设置/登录购买/反馈/首启引导)
- android:Compose 主 App + IME(键盘内录音直传)
- ios:App + 键盘扩展(1A spike 实证键盘内不可录音,走 deep link 听写)
- design/design-pipeline:设计系统 + token 导出 iOS/Android 主题
- doc:前后端设计文档(HTML);web:官网宣传页;todo:任务看板

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 00:38:37 +08:00

794 lines
22 KiB
JSON
Raw 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-11T16:34:46.039Z"
},
"seq": 15,
"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
}
]
}