Skip to content

Latest commit

 

History

History
191 lines (164 loc) · 96.9 KB

TASKS.md

File metadata and controls

191 lines (164 loc) · 96.9 KB

Echo Loop 当前任务清单

当前待办与本次完成记录;此前完成任务“随心听字幕列表按当前句定位和自动聚焦”(2026-09-29)已归档,详见 2026-09-29 归档。

本次完成

  • 开发者选项增加服务地区切换(2026-10-28):开发者选项新增「服务地区」行(自动 / 中国区 / 全球区),持久化到 SharedPreferences,下次启动生效;强制地区时启动只请求该区域的 Config API,忽略系统 Region 与返回的国家码,Config 拉取失败也保持所选地区并使用缓存配置;关闭开发者选项时恢复为自动。行内显示本次启动实际生效地区。按 macOS 运行日志复核:强制全球区后 Config、偏好、权益、合集与 CDN 请求均走全球域名;修复强制地区下启动已拉到 Config 仍被首轮定时刷新重复强制请求的问题(启动结果新增 configFetched,拉取失败时仍强制刷新)。新增 bootstrapper 强制地区(含失败路径)、覆盖值存取/无效值、启动 Provider 接线到路由器、设置行交互共 6 项测试;user_region 与设置页测试全部通过,相关文件定向 flutter analyze 无问题,dart format 与 git diff --check 通过。未运行全量 flutter test(既有失败基线)与 macOS 集成测试(本机环境问题)。完成时间: 2026-10-28

  • 在社区合集详情素材行展示并优化简介层级(2026-10-25):标题提升为主信息,简介使用更小字号、常规字重和浅化的次级色,最多显示两行,行高根据实际简介行数自适应;标题前增加固定 24dp 的音频/视频图标,并提供本地化语义标签,音频使用主题蓝、视频使用适配深浅主题的紫色,图标与简介共用原左边距,图标在保留 24dp 槽宽的同时左对齐,避免额外居中留白且不影响标题和简介位置;图形尺寸调整为 22dp,缩小图标与标题间的可见空隙;将单条预览行提取为独立 widget,确保切换主题时标题、简介、时长和媒体类型图标即时刷新;移除素材行前置播放图标及“名称 / 时长”列标题,保留行内时长与难度信息;在合集信息卡与素材列表间增加分割线;空白简介不显示。新增 Widget 回归覆盖简介层级、音频/视频图标颜色及语义标签、图标标题顺序和对齐、停留详情页切换主题时行内容颜色即时刷新、无前置播放图标、无列标题、分割线、空白简介、单行/多行简介行高、两行省略和 390dp 窄屏无溢出。合集详情测试 7 项通过;相关 Dart 文件定向分析无问题,dart format 与 git diff --check 通过。未运行 scripts/check.sh:改动局限于详情列表 UI,定向测试与分析覆盖本次范围。未运行 Maestro:Flutter 设备枚举无法写入 SDK engine.stamp,CoreSimulator/CoreDevice 初始化失败,ADB 服务启动被权限阻止,没有可用目标设备。完成时间: 2026-10-25 17:47

  • 升级应用版本至 1.0.44(2026-10-25):将 pubspec.yaml 中的应用版本由 1.0.43 提升至 1.0.44。版本元数据变更,无需运行测试。完成时间: 2026-10-25 15:56

  • 修复学习入口预计时长忽略重复遍数(2026-10-25):逐句精听计划/自由入口按生效遍数估时;段落复述与全文复述将设置遍数用于动态估时,无限循环不显示有限时长;难句补练按盲听和跟读各自的遍数累计,手动模式按每阶段一遍估算。新增估时边界、复述弹窗有限/无限遍数以及精听入口自定义遍数回归测试。定向测试覆盖学习计划页、复述弹窗、盲听弹窗和估时器共 96 项通过;11 个相关 Dart 文件定向 flutter analyze 无问题,dart format 与 git diff --check 通过。测试输出 media_kit 原生依赖初始化告警,但用例全部通过。未运行 scripts/check.sh:改动限定于学习入口估时,定向测试和分析覆盖相关范围。未运行 Maestro:只调整现有弹窗的预计时长文案及其计算,未改路由或启动流程;没有覆盖该估时行为且可安全运行的现有 Flow。完成时间: 2026-10-25 15:56

  • 修复难句跟读播放中修改遍数后标签不刷新(2026-10-25):设置变更若等待当前原句播完再进入等待态,会即时刷新流程状态的目标总遍数,同时保留当前播放阶段和遍数索引。新增受控播放回归测试,先确认旧实现下总遍数仍为 3 而期望为 5,再验证修复后原句播完仍进入等待态。跟读流程引擎与控制器测试共 44 项通过;3 个相关 Dart 文件定向 flutter analyze 无问题,dart format 与 git diff --check 通过。测试输出 media_kit 原生依赖初始化告警,但用例全部通过。未运行 scripts/check.sh:改动局限于流程状态同步,定向测试和分析覆盖本次范围。未运行 Maestro:现有 Flow 会清除 App 数据,且没有覆盖播放中修改跟读遍数的安全 Flow。完成时间: 2026-10-25 15:39

  • 修复难句跟读入口遍数显示未跟随设置(2026-10-25):计划学习与自由练习入口统一使用跟读偏好解析后的每句循环次数,难度遍数仅作为未设置时的默认值;预计时长同步按最终遍数计算,无限循环显示“无限 ∞”且不显示时长。新增入口回归用例覆盖计划/自由练习、自定义 5 遍、无限循环和默认遍数。学习计划页与简报弹窗定向测试共 81 项通过;4 个相关 Dart 文件 flutter analyze 无问题,dart format 与 git diff --check 通过。测试输出 media_kit 原生依赖初始化告警,但用例全部通过。未运行 scripts/check.sh:改动局限于跟读入口摘要,定向测试与分析覆盖本次范围。未运行 Maestro:当前设备可用,但仓库现存 Flow 使用 clearState: true 会清除设备 App 数据,且没有覆盖此入口的安全 Flow。完成时间: 2026-10-25 15:25

  • 修复社区合集文件详情覆盖本地排序(2026-10-24):下载和更新字幕收到文件详情后只刷新音频元数据,不再写入 collection_audio_items.sort_order;合集排序仍由合集列表加入/同步流程维护。新增回归断言:本地排序为 220、文件详情返回 0 时,下载后排序仍为 220;合集同步则以列表返回的 0 更新原有排序 220。下载通知与合集同步两个定向测试文件共 13 项通过;3 个改动 Dart 文件定向分析无问题,dart format 与 git diff --check 通过。测试输出 media_kit 原生依赖初始化告警,但用例全部通过。未运行 scripts/check.sh:改动局限于客户端元数据持久化,定向测试覆盖受影响流程;未运行 Maestro:未改 UI、路由或首启流程。完成时间: 2026-10-24 13:44

  • 修复复述后台取消转录处理中回合时遗留录音文件(2026-10-24):RecordingService.cancelRecording 新增显式 discardStoppedRecording 选项;复述后台收尾启用该选项,删除 stopSession 已结束但尚未完成转录的录音文件,同时默认取消路径仍保留已停止录音。新增 RecordingService 与复述控制器回归断言;先确认旧实现下控制器用例因删除列表为空而失败,修复后两个定向测试文件共 16 项通过。4 个相关 Dart 文件定向分析无问题,格式与 git diff --check 通过。测试输出 media_kit 原生依赖初始化告警,但用例全部通过。未运行 scripts/check.sh:改动局限于后台取消的临时录音清理,定向测试与分析覆盖受影响路径。完成时间: 2026-10-24 12:52

  • 修复复述后台取消的处理中与启动竞态(2026-10-24):后台事件现在让当前录音回合代际失效,取消录音中、启动中及识别处理中底层会话;旧识别结果不能在状态重置后写回。保存后台收尾 future,新录音等待旧启动/识别收尾后再开始。新增录音中取消、处理中取消与丢弃迟到结果、取消收尾期间立即重试三项回归测试;旧实现下处理中状态迟到写回和立即重试均复现失败,修复后复述录音控制器与播放器测试共 40 项通过。4 个相关 Dart 文件定向分析无问题,格式与 git diff --check 通过。测试有 media_kit 原生依赖初始化告警,但用例全部通过。未运行 scripts/check.sh:改动范围局限于复述后台录音收尾,定向测试与分析覆盖相关路径。完成时间: 2026-10-24 12:45

  • 修复复述以外的后台事件污染复述录音状态(2026-10-24):移除复述录音控制器的全局生命周期监听,改由仍活动的 RetellPlayer 在进入后台时显式通知录音控制器取消当前录音并设置等待开口超时标记;释放播放器后的生命周期事件仍由现有播放器守卫忽略。检查跟读与难句补练共用的 SpeechRecordingController:它保留自身后台取消录音并回到 idle 的行为,没有复述专用的粘性超时标记,因此未见同类状态泄漏。新增录音控制器与播放器生命周期回归断言。复述录音、复述播放器、跟读录音、跟读流程及难句补练测试共 120 项通过;4 个改动 Dart 文件定向分析无问题,格式与 git diff --check 通过。测试运行有 media_kit 原生依赖初始化告警,但用例全部通过。未运行 scripts/check.sh:改动限于复述生命周期所有权与状态隔离,定向测试覆盖受影响链路。完成时间: 2026-10-24 12:36

  • 修复复述播放器退出后的后台生命周期状态污染(2026-10-24):RetellPlayer Provider 为 keep-alive,退出时播放驱动清空、状态重置,但生命周期监听仍存活;现仅在存在活动播放驱动时处理后台事件,避免释放后的默认 listening 状态被改为 retelling。新增释放后忽略后台事件及活动播放器仍正常暂停的回归测试。复述播放器 Provider 测试 28 项通过,2 个相关 Dart 文件定向分析无问题,dart format 与 git diff --check 通过。测试运行有 media_kit 原生依赖初始化告警,但用例全部通过。未运行 scripts/check.sh:改动局限于复述播放器生命周期入口,定向测试和分析覆盖本次范围。完成时间: 2026-10-24 12:22

  • 修复复述录音中点击主播放按钮未取消录音(2026-10-24):主播放按钮、视频播放控制及键盘播放快捷键统一经过页面处理器;录音中先阻止自动录音监听器重启,再取消并清理录音,随后按播放器阶段执行暂停/续播或重播。新增“听原文暂停态仍有录音”及“复述录音取消后不自动重启”两项页面回归测试。复述页面测试 25 项、定向静态分析通过,git diff --check 通过。未运行 scripts/check.sh:修复范围限定在复述页交互链路,定向测试和分析覆盖本次改动。常规 flutter 命令无法写入 Flutter SDK 的 engine stamp,测试通过直接调用本机 Flutter 工具快照完成。完成时间: 2026-10-24

  • 修复播放暂停检查点串用(2026-10-24):确认并修复难句补练切句/盲听切跟读后复用旧暂停位置,以及逐句精听重置后残留盲听断点。复核意群 UI 后确认页面仅支持点击单个意群后自动播放,playAllSenseGroups 没有页面调用入口;撤回基于该未接入方法推导的意群续播代码与测试,不将意群播放列为用户暂停验证场景。新增整句精确续播、切句、切模式和重置回归测试。逐句精听 Provider 58 项、难句补练 Provider 21 项、逐句精听页面 52 项测试通过;4 个相关 Dart 文件定向分析无问题,git diff --check 通过。测试环境输出 media_kit 初始化告警及页面测试依赖告警,但测试全部通过。未运行 scripts/check.sh:改动局限于两个播放 Provider 的暂停状态与检查点清理,定向测试和分析覆盖受影响链路;未运行 Maestro:未改变布局、路由或首启流程。完成时间: 2026-10-24

  • 修复逐句精听讲解页播放按钮无响应(2026-10-23):暂停断点按盲听/讲解模式隔离;进入讲解页和切换句子时清理旧检查点,避免讲解页误将盲听断点当作可恢复位置而调用空操作。新增跨模式回归测试。播放器 Provider 测试 55 项、页面测试 52 项通过;3 个相关 Dart 文件定向分析无问题,git diff --check 通过。未运行 scripts/check.sh:改动限定在精听播放状态恢复链路,定向检查覆盖受影响范围;未运行 Maestro:未改变布局、路由或首启流程。完成时间: 2026-10-23 23:29

  • 统一播放暂停与恢复位置(2026-10-23):随心听、逐句精听、盲听、难句补练和复述暂停时在内存保存当前媒体位置,恢复时从该位置继续;流程引擎为恢复提供独立入口,保留重复次数及 prompt 状态。段落播放恢复到暂停时间,句子自然结束后再次播放仍从句首开始;切句/切段会丢弃旧检查点。8 个 Provider/引擎测试文件共 201 项通过;2 个页面测试文件 93 项通过、5 项跳过;24 个相关 Dart 文件定向分析无问题,git diff --check 通过。后续复审修复盲听与跟读流程在异步开播前检查期间切句时可能串用暂停位置的问题:恢复位置改为局部传入本次开播调用,盲听流程在异步检查后校验 flowToken;新增受控时序回归测试。两个流程引擎测试文件共 17 项通过,4 个相关 Dart 文件定向分析无问题,git diff --check 通过。scripts/check.sh 已尝试,但全仓分析被既有集成测试类型错误阻断,未进入全量测试或 macOS 构建;本次修复未重跑:范围限于两个流程引擎,定向测试和分析覆盖修改。未运行 Maestro:未改变布局、路由或首启流程。原完成时间: 2026-10-23 19:57;竞态修复完成时间: 2026-10-23 20:21;复查用户截图后补齐句子详情页:暂停时快照区间播放器绝对位置并通过可选续播能力从该位置恢复,纯音频路径改为 pause 而非 stop;自然完成后检查点已消费,下次仍从句首播放,意群试听仍从区间起点播放。新增句子详情页暂停续播与自然结束重播回归测试。句子详情页与两个播放适配器测试目标共 38 项通过,7 个相关 Dart 文件定向分析无问题,git diff --check 通过。未运行 scripts/check.sh:变更限于本地播放恢复链路;未运行 Maestro:未改变布局、路由或首启流程。详情页补齐完成时间: 2026-10-23 20:33;难句跟读页复测发现其独立播放链路仍把暂停映射为 enterWaitingForUser、恢复映射为 replayCurrentSentence。现在控制器在显式暂停时快照当前位置,下一次播放走 RepeatFlowEngine.resumeCurrentSentence 与 SentencePlaybackDriver.startAt;无暂停位置仍按原行为从句首重播,并保留键盘快捷键“播完当前句再暂停”的语义。新增控制器暂停续播/自然结束重播回归测试和页面按钮分发测试。相关 Provider 与 Screen 测试目标共 58 项通过;4 个相关 Dart 文件定向分析无问题,git diff --check 通过。未运行 scripts/check.sh:改动局限于难句跟读暂停恢复链路,定向验证已覆盖;未运行 Maestro:未改布局、路由或首启流程。难句跟读补齐完成时间: 2026-10-23 23:05

  • ECH-26 AI 助教支持更多学习上下文(2026-10-23):句子聊天请求在当前句之外附带所在材料前 5 句和后 2 句,跨段落取句并保持字幕顺序;材料首尾按实际范围截取,空白句跳过,字幕缺失、索引无效或没有有效邻句时回退为单句请求。句子讲解、学习页入口及文本选区追问复用同一段落上下文;聊天会话身份包含段落,避免相同句子在不同材料间串用历史。按后端契约发送可选 context.passage。新增上下文截取、边界与请求载荷测试;3 个定向测试文件共 21 项通过,18 个相关 Dart 文件定向分析无问题,git diff --check 通过。后续复审修复收藏模式、难句跟读和难句补练将筛选列表误用为完整字幕的问题:分页显示/练习队列仍按原逻辑过滤,邻句只从完整字幕序列选取;空白句会向两侧继续扫描,以有效句补足最多 5/2 句。日志复核进一步发现跟读会话的 prepareSession 曾用难句练习子集覆盖完整字幕;现已显式传入并保留完整上下文源。新增收藏分页器与难句补练入口回归覆盖;上下文单测 5 项、随心听页面 44 项、难句补练 Provider 18 项、跟读 Provider 34 项及难句补练入口 1 项通过,13 个相关 Dart 文件定向分析无问题,git diff --check 通过。未运行 scripts/check.sh:改动仅限句子上下文来源,定向验证覆盖相关链路;未运行 Maestro:未改变页面布局、路由或首启流程。完成时间: 2026-10-23 16:07

    统一链路复审 (2026-10-23):改为由 SentenceChatTarget 统一携带目标文本与来源音频/句索引;chatbot 入口通过 audioSentencesProvider 读取完整字幕并集中构造 passage、请求配置和会话身份。AppBar、选区/意群追问、收藏句复习和收藏词汇复习共用该链路;字幕不可用时退回单句。移除播放器和练习 Provider 中重复保存的上下文列表,避免筛选队列及重练流程改变邻句。新增解析失败/缺失来源与跨来源会话回归测试;定向测试 286 项通过、5 项跳过,19 个相关 Dart 文件定向分析无问题,git diff --check 通过。scripts/check.sh 未运行:改动限于句子聊天上下文链路;Maestro 未运行:CLI 在初始化时无法修改用户目录下的依赖权限。复审完成时间: 2026-10-23

  • ECH-27 合集列表显示材料难度(2026-10-23):社区合集同步时将 API 返回的 CEFR 难度持久化到材料记录;已加入合集列表在时长/日期元信息前显示徽标,公开合集预览保持标题旁徽标;无难度数据时不显示。A1–C2 各使用不同色相,并为浅色/深色主题配置高对比前景色。补充 v59→v60 数据库迁移、模型序列化、重新加入/同步更新与清空难度、列表及预览展示测试。原始定向测试 147 项和合集 API 测试 3 项通过;布局调整测试目标 61 项、难度徽标/列表/预览回归测试目标 63 项均通过,6 个相关 Dart 文件定向分析无问题,git diff --check 通过。未运行 scripts/check.sh:本次为合集功能局部改动,定向测试与分析覆盖改动范围。未运行 Maestro:仓库现有 Flow 均会清空 App 状态,且没有覆盖合集列表的安全 Flow。完成时间: 2026-10-23 14:39;布局调整: 2026-10-23 14:52;难度配色: 2026-10-23 14:56

  • 用远程配置控制原生评分提醒(2026-10-22):解析 features.inAppReview.enabled 并接入评分协调器,缺省或无效时默认关闭;每个异步边界读取最新开关,关闭后不发起评分请求,冷却落盘后关闭则恢复此前记录。新增配置解析、序列化、Provider 和协调器开关竞态测试。远程配置与评分协调器定向测试共 36 项通过,5 个相关 Dart 文件定向分析无问题,格式与 git diff --check 通过。未运行 scripts/check.sh:本次为远程配置与评分提醒的局部改动,定向测试和分析覆盖相关范围。完成时间: 2026-10-22 17:55

  • 修复评分邀请冷却备份隔离与异步展示竞态(2026-10-22):备份导入导出排除 rating_prompt_ 设备元数据,保留本机冷却;练习返回后的评分检查通过展示资格回调复核原页面、当前路由位置、root 覆盖与应用前台状态,数据库查询或冷却落盘期间失效即跳过,尚未调用原生 API 时恢复此前冷却。将 PracticeCompletionResult 移至学习公共 models,播放器不再依赖评分功能。新增切 Tab/后台/卸载、查询与落盘竞态、原生调用失败保留冷却回归,并验证旧备份与其他设备备份不覆盖本机记录。TZ=America/New_York 下相关 6 个测试目标共 148 项通过,8 个相关源码/测试范围定向分析无问题,格式与 git diff --check 通过。未运行 scripts/check.sh:本次是评分邀请的局部修复,定向检查已覆盖。未运行 Maestro:检测到 Android 真机,但 CLI 初始化因用户目录 deps/applesimutils 写权限受限而失败,现有 Flow 也均含 clearState。完成时间: 2026-10-22 16:36

  • 修复复述补练音视频回归测试等待失败(2026-10-22):异步点击回调启动复述说明页前会等待权限与安装状态检查,pumpAndSettle 可能在 Future 完成前认为页面已稳定;测试改用即时完成的 ASR 安装 Gate,并等待“Start Practicing”实际出现、弹层动画完成且按钮滚动到可视区域后再点击。音频与视频补练测试均验证统一媒体启动状态。学习计划页面测试 68 项全部通过,测试文件 flutter analyze 无问题,格式与 git diff --check 通过。未运行 scripts/check.sh:本次只修复两个 Widget 测试的测试夹具和异步等待,定向完整测试文件与分析已覆盖。完成时间: 2026-10-22 16:19

  • 修复评分邀请审查发现的时间边界与弹窗时机(2026-10-22):冷却后的学习日范围按本地自然日推进,避免夏令时回拨时把上次请求日重复计入;由于播放器在 root Navigator、学习计划页在分支 Navigator,等待器跟踪本次播放器路由 push/pop 并等待其退场完成,忽略练习中的确认路由;退场后若原 root 页面不再位于顶层则跳过评分。协调器测试(TZ=America/New_York)4 项、嵌套 Navigator 路由测试 1 项、跟读/复述播放器回归测试 44 项通过;6 个相关 Dart 文件定向分析无问题。学习计划页面测试 66 项中 2 项失败,仍为已有测试无法在进入播放器前找到 Start Practicing;其余 64 项通过。未运行 scripts/check.sh:本次是评分邀请模块的定向修复,相关测试与分析已覆盖改动范围。完成时间: 2026-10-22 15:56

  • 增加商店安装用户的原生评分邀请(2026-10-22):新建独立评分邀请模块,以可扩展规则组支持“组内 AND、组间 OR”,当前配置为安装满 7 天、累计 3 个有效学习日(每日有效学习至少 10 分钟)、刚完成跟读或复述,并且来自 App Store / Google Play;直装、TestFlight、iOS 模拟器及缺失安装来源/时间均不触发。学习页面只在用户确认完成并返回计划页后检查资格,取消、重播和自动进入下一任务不弹窗。按设备本地持久化请求尝试时间,调用原生 API 前先记录,至少间隔 120 天;不会假定系统返回了评价提交结果。评分策略/协调器测试 8 项、跟读与复述页面回归测试 44 项通过;5 个改动 Dart 范围静态分析无问题,格式检查和 git diff --check 通过。学习计划页面测试有 2 项失败:测试在进入播放器前找不到 Start Practicing 按钮,未到达本次评分路由逻辑。未运行 Maestro:可用的现有 Flow 均包含 clearState: true,会清除设备 App 数据;Maestro CLI 初始化也被用户目录依赖缓存的写权限阻止。未运行 scripts/check.sh:本次为独立评分模块,定向测试和分析覆盖相关范围。完成时间: 2026-10-22 15:34

  • 登录后上传 onboarding 问卷数据(2026-10-22):新增认证 PUT /api/v1/me/onboarding 客户端,只发送本地已保存且有效的非空答案;兼容已完成问卷但缺少新字段的存量用户,不补造答案。设备级布尔标记仅在服务端成功后写入,账号切换不会重复上传;失败不影响问卷导航,并在后续登录、应用恢复或本地完成问卷时重试。新增 API、同步服务、旧答案补传、失败重试及问卷提交触发测试。4 个定向测试文件共 41 项通过,11 个相关 Dart 文件定向静态分析无问题,格式检查与 git diff --check 通过。未运行 scripts/check.sh:本次仅涉及 onboarding 上传链路,定向测试和分析覆盖改动范围。未运行 Maestro:现有 Flow 会清空 App 状态,且没有覆盖登录后上传的安全既有 Flow;iOS CoreSimulatorService 不可用。完成时间: 2026-10-22 14:07

  • 修复随心听进度时间标签换行与水平跳动(2026-10-22):根因是左右时间 Text 分别被限制在 34/42 像素宽的固定区域内,但允许自动换行;不同秒数字形宽度稍有差异,文本刚好超过边界时会变成两行,使进度区域高度跳动。左右固定时间列统一为 48 像素,文字强制单行并在超宽时缩放,使用等宽数字;标签在各自固定列中居中显示,不额外添加水平留白,并移除时间列与进度条之间的 8 px 间距,进度条保持居中且宽度稳定。新增秒数字变化、分钟位数变化、固定列宽及标签居中回归测试。媒体随心听页面测试 43 项通过,两个相关 Dart 文件静态分析通过,git diff --check 通过。未运行 scripts/check.sh:本次只改播放器时间标签布局。未运行 Maestro:现有 Flow 均会清空 App 状态,且没有覆盖此页面的安全 Flow。完成时间: 2026-10-22 12:41

  • 为用户偏好同步增加 revision 条件 GET(2026-10-22):客户端仅在本地持有对应基线时发送 If-Preference-Revision,收到 304 后复用本地快照;按账号持久化 revision,旧元数据无 revision 时继续使用完整 GET。Dio 显式接受 304,并记录条件请求 revision;同步 fake 接口同步更新。偏好 API / 同步定向测试 10 项通过;5 个相关 Dart 文件静态分析无问题,格式和 git diff --check 通过。

  • 修复收藏句复习关闭 AI 自动展示后仍显示讲解(2026-10-21):收藏句复习将专属 AI 自动展示开关传入句子讲解视图,切换设置时重建卡片并清除旧的自动展示状态;全局开关继续只控制学习任务。回归测试验证全局总开关关闭时收藏句专属开关仍生效,也覆盖专属开关关闭后缓存翻译/解析隐藏,以及收藏词汇关闭 AI 查词后保持折叠。收藏复习页面测试 24 项、收藏词汇复习页面测试 20 项、句子讲解鉴权/自动加载测试 21 项通过;改动文件定向 flutter analyze 通过,git diff --check 通过。未运行 Maestro:仓库现有 Flow 均会 clearState 清空应用数据,且没有覆盖收藏复习的安全既有 Flow。未运行 scripts/check.sh:改动局限于收藏复习显示设置,定向测试和分析覆盖相关路径。完成时间: 2026-10-21 23:21

  • 复核并补齐开发者功能冗余清理(2026-10-21):按规范和需求双轴复查,补删 ASR 测试页独占的 availableAsrModelsProvider,以及 Analytics 展示专用的 channelName → AnalyticsChannel.name 依赖链、4 个通道实现和测试/集成测试替身中的对应 getter;删除两个纯 getter 测试,将初始化与失败降级测试改为验证真实事件分发和 LogOnly 日志。复核未发现正式版本更新、字幕校准失败回退、录音/模型管理、订阅恢复/身份同步和原有偏好同步被破坏;相关源码与测试中的删除符号无残留引用。扩大回归共覆盖 586 项测试(新增事件断言修正 Map/Record 对象比较后,Analytics Provider 文件 4 项复跑全部通过,其余 582 项已通过),30 个相关 Dart 文件定向分析与最终测试文件复查通过,最终 Android dev APK 重新构建成功,格式与 git diff --check 通过。本次补清未改 UI 行为;此前 Maestro 未进入菜单的首启问卷文字识别阻塞仍作为真机覆盖限制保留。未运行 scripts/check.sh:使用本次受影响模块及保留工具的定向回归。完成时间: 2026-10-21 18:18

  • 清理低价值开发者功能及专用代码(2026-10-21):移除 Analytics 展示、版本号覆盖、ASR 引擎测试页、字幕自动校准开关和整个订阅调试页;删除关联 Provider、调试覆盖状态、PurchaseService 调试专用接口及专属测试,清理订阅配置文档中的旧入口说明。字幕在满足原条件时自动校准,清理旧关闭偏好并保留失败回退;正式版本更新、录音识别、购买恢复、账号退出与权益同步的共享实现保留,未覆盖工作区已有的偏好同步改动。相关回归覆盖 439 项测试(首次 403 项非转录测试通过;新增夹具修正后转录文件 36 项复跑全部通过),14 个改动 Dart 文件定向静态分析通过,最终转录测试复查、格式检查及 git diff --check 通过。Android dev APK 构建、安装成功;不清空数据的 Maestro 验证因无法识别可见首启问卷文字而阻塞,未进入开发者菜单,未修改问卷实现。未运行 scripts/check.sh:本次为开发者功能清理,相关业务链路由定向测试和分析覆盖。完成时间: 2026-10-21 17:45

  • 实现用户偏好设置跨设备同步(2026-10-21):客户端新增偏好文档、白名单本地存储、认证 API 和同步协调器;登录后按初次同步规则合并,偏好修改去抖推送,回前台拉取;用 JSON revision / If-Preference-Revision 和 412 字段级合并处理多设备并发,按账号隔离本地快照,离线保留待同步状态。现有设置 Provider 在云端回写后同步重载,备份导入导出排除设备级同步元数据;初次实现未改后端或 UI,后端并发契约现由后续修复更新。新增文档合并、本地白名单、API 条件写入、账号切换/离线/冲突、并发首同步与备份回归。偏好/备份/设置 Provider 定向测试 83 项通过,书签/收藏复习和复述消费者测试通过;本次相关代码和测试的定向静态分析无问题,格式检查和 git diff --check 通过。未运行 scripts/check.sh:改动集中在客户端偏好同步,定向测试与分析覆盖了相关范围。全仓 flutter analyze 仍报告 integration_test/groups/review_sub_stage_tests.dart、integration_test/kokoro_tts_test.dart 的既有类型错误,本次变更文件无相关错误。完成时间: 2026-10-21 15:30

  • 修复用户偏好同步在 Vercel 上的 ETag 弱化问题(2026-10-21):GET、PUT 成功与 412 响应在 JSON 中携带数据库 revision;PUT 使用 If-Preference-Revision,数据库原子 CAS 继续比较并递增 revision;Flutter 客户端及冲突重试改用整数 revision,移除该同步路径对 ETag / If-Match 的依赖。偏好 API 和同步协调器定向测试 9 项通过,4 个相关 Dart 文件静态分析无问题,后端 pnpm --filter app typecheck 通过。未运行 scripts/check.sh;定向检查覆盖了本次改动。未做本地已认证 API 联调,当前没有有效 Supabase JWT。

  • 修复 GitHub Actions 全量测试失败(2026-10-21):设置弹窗 Widget 测试改为验证设置展示与状态更新,不再断言已迁移掉的 AudioEngine 速度同步;盲听 fake 显式处理设置更新,并新增速度传给段落播放驱动的回归测试;聊天气泡测试同步当前额度本地化文案。5 个定向测试文件 56 项通过,5 个改动 Dart 文件 flutter analyze --no-pub 无问题;CI 同款串行全量测试 5573 项通过、11 项跳过,git diff --check 通过。未运行 scripts/check.sh:CI 同款全量测试和相关分析已覆盖本次修复。完成时间: 2026-10-21

  • 升级应用版本至 1.0.43(2026-10-21):将 pubspec.yaml 中的版本从 1.0.42 提升至 1.0.43。版本元数据变更已通过 git diff --check,无需运行测试;未运行 scripts/check.sh。完成时间: 2026-10-21

  • 统一段落复述音视频学习链路到 MediaEngine(2026-10-21):音频和视频复述入口共用 MediaLearningStartup、MediaEngine 与 MediaParagraphPlaybackDriver;复述状态机必须注入共享驱动,移除前台专用段落驱动,详情播放和逐词高亮统一读取 MediaEngine。复核修复:音频进入时停止默认 AudioEngine,清理遗留系统媒体卡片但不让 MediaEngine 发布系统控制;新进入正确接管监听恢复 lease;退出会使等待中的播放器初始化失效;设置快照只解析一次。音视频入口、加载失败/取消/退出和监听恢复均有回归覆盖。6 个定向测试文件共 221 项通过、4 项跳过;14 个相关 Dart 文件 flutter analyze 无问题,git diff --check 通过。Android dev APK 构建、安装成功;不清理 App 状态的 Maestro 启动 Flow 通过。未运行 scripts/check.sh:定向测试和分析覆盖本次复核修复范围。完成时间: 2026-10-21

  • 记录难句补练跟读统计口径(2026-10-21):在统计回调注释中明确学习统计只累计有效跟读时长,不累计跟读词数或总次数;录音完成次数由 UsageTracker 独立计数。仅补充注释,未改变行为。完成时间: 2026-10-21

  • 统一难句跟读与难句补练音视频学习链路到 MediaEngine(2026-10-20):音视频难句跟读与难句补练共用 MediaLearningStartup、MediaEngine 和媒体句子/意群区间播放驱动;保留各自流程状态机、录音统计、断点和书签行为。系统媒体控制与后台播放状态接入共享驱动,视频画面仅视频条目显示;统一进入取消、加载失败和退出时的媒体清理及 ListeningPractice 监听恢复。6 个定向测试文件 172 项通过、9 项跳过;15 个相关 Dart 文件 flutter analyze 无问题,git diff --check 通过。Android 真机 dev 包构建并安装成功;Study Maestro Flow 在新手引导阶段因目标问卷题未显示而失败,未到达本次改动页面。未运行 scripts/check.sh:本次改动局限于两个学习任务的媒体进入链路和播放器驱动,定向测试与分析覆盖了相关范围。完成时间: 2026-10-20

  • 修复盲听倒计时期间点上一段仍重播当前段(2026-10-20):根因是 goToPreviousParagraph 在倒计时状态单独重播当前段,绕过正常的上一段导航。移除重复分支,倒计时取消继续由 _cancelAll 统一处理;更新回归测试,验证倒计时中从段落 1 点上一段会从段落 0 首句播放。盲听 Provider 测试 38 项通过,2 个相关 Dart 文件 flutter analyze 无问题,dart format 无改动。未运行 scripts/check.sh:改动仅涉及盲听上一段状态流,定向测试和分析覆盖了受影响范围。完成时间: 2026-10-20

  • 修复 MediaEngine 区间播放在自然结束时误报失败(2026-10-20):根因是 media_kit 的 EOF 事件可能先于最后一条位置更新到达;MediaEngine 仅比较缓存位置与区间终点,导致媒体实际时长覆盖区间时仍返回 failed。现在由共享 range 结束语义结合自然 EOF 和已确认媒体时长判定结果;媒体时长不足时仍返回 failed,未在盲听页面增加特判或时间容差。新增位置缓存滞后回归测试,并保留媒体时长不足的失败边界测试;MediaEngine、盲听、精听、复述、随心听 6 个定向测试文件共 189 项通过,2 个相关 Dart 文件 flutter analyze --no-pub 无问题,git diff --check 通过。未运行 scripts/check.sh:改动集中在共享区间结束判定,定向测试和分析已覆盖相关调用方。完成时间: 2026-10-20

  • 统一盲听音视频学习链路到 MediaEngine(2026-10-20):音频和视频盲听共用 MediaLearningStartup、MediaEngine 会话和 MediaParagraphPlaybackDriver;移除盲听默认 AudioEngine 驱动,句子详情区间播放与逐词高亮统一读取 MediaEngine,视频画面仍仅用于视频条目。保留断点、收藏快照、统计、段间停顿和自由练习补做语义。复核修复:媒体释放报错时仍恢复 ListeningPractice 监听并重置学习状态;统一盲听失败清理,增加媒体进入日志,删除迁移后无调用方的 AudioEngine 加载分支并修正旧注释。相关定向测试 166 项通过、4 项跳过;11 个相关 Dart 文件 flutter analyze --no-pub 无问题,git diff --check 通过。未运行 scripts/check.sh:改动局限于盲听媒体生命周期清理,定向测试和分析覆盖了受影响代码。未运行 Maestro:Android ADB server 启动被 Operation not permitted 阻止,且现有启动 Flow 会清空应用状态。完成时间: 2026-10-20

  • 更新 AI 额度提示和最近完成任务标题文案(2026-10-20):中文提示改为“升级会员,获得无限 AI 额度和 AI 功能。”、标题改为“最近完成任务”;英文对应改为“Upgrade to Premium for unlimited AI quota and AI features.”和“Recently Completed Tasks”。本地化代码已重新生成,学习页测试中的英文标题查找同步更新。study_screen_test.dart 23 项通过,相关 Dart 文件静态分析通过。完成时间: 2026-10-20 14:45

  • 精听讲解页按模式显示“继续”或“下一句”(2026-10-18):自动模式保留“继续”重播与自动推进;手动模式使用共享页脚现有下一句导航,推进时沿用原切句动画和手动播放设置。新增精听页交互回归测试,并将 Provider 测试更新为覆盖手动从讲解页切句。播放器 Provider 与页面定向测试共 106 项通过;3 个相关 Dart 文件定向分析无问题,格式检查与 git diff --check 通过。未运行 scripts/check.sh:改动限于精听讲解页控件选择和现有导航复用。未运行 Maestro:Android ADB server 启动被 Operation not permitted 阻止。完成时间: 2026-10-18 18:30

  • 精听手动模式支持循环次数和停顿设置(2026-10-18):设置面板在手动模式下继续复用现有循环、停顿控件与偏好;精听沿用 BlindPracticeFlowEngine,按所选次数循环并在循环间停顿,结束后停在当前句等待用户切句,重听从第一遍开始,无限循环可由用户切句打断。共享遍数提示统一显示手动/自动模式与当前遍数,本地化说明同步更新。新增设置面板、播放器流程、遍数提示及精听页回归测试。4 个定向测试文件共 86 项通过,精听页测试 51 项通过,13 个相关 Dart 文件 flutter analyze --no-pub 无问题,flutter gen-l10n 与 git diff --check 通过。未运行 scripts/check.sh:改动范围局限于精听设置和共享循环/提示组件,定向检查已覆盖。未运行 Maestro:Android ADB 服务启动被 Operation not permitted 阻止;iOS Maestro CLI 初始化因无法修改工作区外依赖权限而失败,且现有 Flow 会清理应用状态。完成时间: 2026-10-18 17:51

  • 修复逐句播放中调整速度未即时生效(2026-10-18):MediaSentencePlaybackDriver.setSpeed 更新保存速度的同时调用 MediaEngine,使当前播放立即采用新速度,后续句子继续沿用该速度。新增回归测试覆盖播放中变速和下一句速度继承。test/providers/media_engine/media_engine_provider_test.dart 25 项通过,两个相关 Dart 文件定向分析无问题,格式与 git diff --check 通过。未运行 scripts/check.sh:改动局限于播放速度驱动与对应回归测试,已完成定向验证。

  • 社区合集按地区使用中国镜像 URL(2026-10-18):App 解析并缓存 API 返回的 coverUrlChina / mediaUrlChina;中国用户在镜像 URL 可用时使用中国地址,否则使用全球地址,其他地区继续使用全球地址。已加入合集持久化中国封面 URL,数据库升级至 v59;媒体下载按地区选地址,失败时不跨区重试。社区合集 API、DTO、缓存、封面、下载、同步和 v58→v59 迁移相关测试通过(首次 71 项;后续 UI 回归 40 项),23 个相关 Dart 文件定向分析通过,git diff --check 通过。未运行 scripts/check.sh:改动局限于社区合集 URL 与封面数据链路,定向测试和分析已覆盖。未运行 Maestro:当前环境 adb server 启动被 Operation not permitted 阻止;现有 Flow 会清理 App 状态。完成时间: 2026-10-18

    • 审查修复(2026-10-18):SharedPreferences 迁移解析 coverUrlChina 改用字符串模式匹配,畸形非字符串值安全回退为 null;新增回归测试。test/models/collection_test.dart 16 项通过,相关 Dart 分析无问题。
  • 修复随心听全文列表点击后句首首词重复高亮(2026-10-18):日志确认 iOS seek 后位置会短暂回退,导致首词索引 0 → null → 0,另一次回退让焦点从目标句切到前一句再切回。句首前 250ms 内的位置回退按句首解析,并在同一窗口保持目标句焦点;更早的陈旧位置不会提前高亮。热重启后的日志中,点选句子后首词连续进入后续词,没有再次出现上述高亮或焦点跳转;用户确认表现正常。相关回归测试和定向分析通过。完成时间: 2026-10-18

  • 修复句子/意群首词偶发重复高亮(2026-10-18):用户确认 iPhone 上问题解决。日志确认区间起点 18085 ms 已高亮首词,随后 iOS 位置流短暂回退到 18045 ms,索引从 0 变为 null,再回到 0;句子和意群播放都出现相同序列。MediaEngine 向逐词高亮提供独立位置流,仅在区间播放中将起点前的样本映射到区间起点,播放器原始位置流保持不变。移除临时 [DEBUG-wh-dup] 日志,新增 40 ms 回退回归测试;相关测试 27 项通过,15 个相关 Dart 文件 flutter analyze --no-pub 无问题,git diff --check 通过。未运行 scripts/check.sh:改动局限于高亮时间轴输入。完成时间: 2026-10-18

  • 修复意群末尾数字时间未显示逐词高亮(2026-10-18):回归测试复现 02:30, 与 03:30. 的活动掩码已正确命中,但句尾非英文文本段沿用前一个空格的状态而未获得高亮背景。间隔 span 现按活动词掩码边界切分,并继续与收藏掩码叠加。组件回归测试通过;用户确认 iPhone 实机问题已解决。意群组件测试 9 项通过,2 个相关 Dart 文件 flutter analyze --no-pub 无问题,git diff --check 通过。未运行 scripts/check.sh:改动局限于意群富文本渲染。完成时间: 2026-10-18

  • 修复 iOS 意群起播逐词高亮闪回上一组末词(2026-10-18):iPhone 日志确认 seek 目标位置事件后位置流可能短暂回退;高亮绑定携带当前意群起点,起点前的事件不再映射到前一组末词。用户已确认实机问题解决。新增 widget 回归测试;本轮组件与 MediaEngine 定向测试通过,相关 Dart 文件静态分析无问题。完成时间: 2026-10-18

  • 撤回导致播放阻塞的 iOS seek 状态等待(2026-10-17):最新设备日志显示区间 seek 后原生 seeking 属性始终为 idle,等待器因此超时 10 秒并阻止正常播放。移除该等待器与对应测试,恢复 media_kit 原有 seek 调用;保留用于比较目标起点与 seek 回执后位置的 range-ready 诊断日志。MediaEngine 与 media_kit backend 定向测试共 23 项通过,5 个相关 Dart 文件 flutter analyze --no-pub 无问题,git diff --check 通过。未启动 iPhone:由用户自行操作;未运行 scripts/check.sh:本次是撤回局部 seek 回归,定向测试和分析已覆盖。完成时间: 2026-10-17

  • 删除低价值的意群 badge 样式单测(2026-10-17):移除只断言普通态/播放态填充及精确边框色值和透明度的两个用例与专用辅助函数,保留意群高亮、收藏标记等行为测试。意群组件测试 8 项通过,测试文件 flutter analyze --no-pub 无问题,dart format 与 git diff --check 通过;未运行 scripts/check.sh:本次仅删除样式常量断言,定向检查已覆盖。完成时间: 2026-10-17 15:21

  • 修复 GitHub CI 中七个测试失败(2026-10-17):完整 App 路由回归测试改用确定性的启动、收藏列表和学习推荐 provider 替身,避免真实启动流程阻塞路由挂载及 Drift 查询流留下 pending timer;收藏词汇页面测试固定地区配置结果,日志保留测试滚动到懒加载列表中的最新记录再断言。CI 失败涉及的四个测试文件共 30 项通过;随后全仓 flutter test --no-pub --reporter=compact 共 5536 项通过、11 项跳过,五个修改 Dart 文件定向 flutter analyze --no-pub 无问题,dart format 与 git diff --check 通过。未运行 scripts/check.sh:改动只涉及测试 harness 和断言,全量测试与定向分析已覆盖;未运行 Maestro:未修改应用 UI 或路由行为。完成时间: 2026-10-17 15:26

  • 提高夜间意群边框可见度(2026-10-17):暗色主题下普通态与已播放态边框不透明度从 0.3 提高到 0.6;亮色主题、播放中状态和收藏态保持原样。新增暗色主题边框回归测试;意群组件定向测试 10 项通过,相关 Dart 文件 flutter analyze --no-pub 无问题,git diff --check 通过。未运行 Maestro:现有 Flow 会 clearState 且不覆盖该组件;未运行 scripts/check.sh:改动局限于意群边框样式,定向验证已覆盖。完成时间: 2026-10-17 12:48

  • 移除未收藏意群普通态与播放态的背景填充(2026-10-17):普通态与播放态改为透明底,继续由边框颜色区分;已收藏意群保留橙色背景。新增组件回归测试,普通态和播放态无填充且边框不同;定向 widget 测试 9 项通过,相关 Dart 文件 flutter analyze --no-pub 无问题,git diff --check 通过。未运行 Maestro:现有 Flow 均会 clearState 且不覆盖意群组件,为避免清除设备应用数据而跳过;未运行 scripts/check.sh:改动局限于意群 badge 样式,定向验证已覆盖。完成时间: 2026-10-17 12:37

  • 精听音频与视频统一到 MediaEngine(2026-10-17):音频和视频精听共用 MediaSentencePlaybackDriver、媒体加载/重试/取消入口及页面加载状态;仅视频显示画面,保留音频普通加载反馈。进入时暂停并移交 Free Player 监听,失败、取消和退出时按会话生命周期恢复;保留断点、收藏、意群试听和自动补做语义。补充结构化日志,覆盖入口、材料类型、断点、媒体 session、逐句索引/区间/速度/结果/耗时、停顿、暂停/续播/切句、取消和退出,不记录句子正文;修正冷启动日志将空 backend 显示为 uninitialized。Provider、状态机、页面和 MediaEngine 定向测试分别通过(38 项通过/4 项跳过、54 项、50 项、22 项),相关 Dart 文件 flutter analyze --no-pub 无问题,git diff --check 通过。Android dev 包构建安装成功;SM A065F 上无清理数据的 Maestro 启动 Flow 通过。未运行 scripts/check.sh:改动范围局限于精听播放链路,定向测试、分析和设备启动验证已覆盖受影响代码。完成时间: 2026-10-17 11:29

  • 复核并收敛精听播放链路命名(2026-10-17):播放链路枚举改为 audioEngine / mediaEngine,精听状态以 hasVideo 表达画面条件,注解会话与 MediaEngine 播放会话使用各自明确的 ID 名称;精听生产驱动移除旧 AudioEngine 适配器和媒体驱动旧别名,把可控音频替身移到测试文件。修正失败分支残留旧局部变量名。17 个 Dart 源码/测试文件定向 flutter analyze --no-pub 通过;精听 Provider、MediaEngine、学习会话、学习计划、盲听、复述及难句补练相关测试共 232 项通过、4 项跳过,git diff --check 通过。未运行 scripts/check.sh:此次仅收敛命名和测试替身边界,定向分析与测试覆盖了受影响接口。完成时间: 2026-10-17 11:53

  • 复核精听音视频实机播放日志(2026-10-17):flutter_run.log 12:15 音频精听和 12:17 视频精听均通过 MediaEngine 加载,并由 MediaSentencePlayback 发起区间播放;自然完成、暂停取消、快速切句后的旧回调忽略均符合预期,本次日志范围内未见旧 AudioEngine 播放或异常。视频最后暂停后 App 转入后台,未记录视频会话的退出释放,因此本次只确认了视频播放链路。完成时间: 2026-10-17 12:21

  • 按播放生命周期控制逐词高亮并修复区间起播闪回旧词(2026-10-16):为逐词高亮播放源加入 idle、playing、paused、completed 状态;音频、视频和短音频统一在播放/手动暂停时保留高亮,自然结束后清除,seek 或新播放恢复,并用 session 校验丢弃旧完成事件。根因是 completed/idle 时高亮组件卸载了位置流订阅,区间 seek 到新意群开头的事件被漏掉,重新启用时又用旧位置快照先显示中间词;现在持续接收位置,只按生命周期状态决定是否解析高亮。新增组件、播放器状态及边界回归测试;7 个定向测试文件共 54 项通过,21 个相关 Dart 文件 flutter analyze 无问题,格式检查与 git diff --check 通过。未运行 Maestro:仓库现有 Flow 都会 clearState,且没有覆盖播放高亮的 Flow;未运行 scripts/check.sh:改动范围局限于高亮状态和相关播放器来源,定向检查已覆盖。完成时间: 2026-10-16 22:51

  • 修复难句补练讲解模式切句后未自动播放(2026-10-16):flutter_run.log 显示“下一句”已提交到目标索引并调用盲听播放,但 41ms 后目标请求变为 cancelled。根因是讲解组件切句时无条件延迟取消意群试听;取消通过共享前台播放器的 pause() 使新句 session 失效。现在意群播放器只取消自己仍持有的 session,并在异步加载/调速后校验请求仍有效;新增 session 所有权、迟到取消和加载中取消日志。新增 4 项适配器回归测试;适配器测试 4 项、前台音频引擎测试 6 项、难句补练 Provider 测试 17 项、难句补练页面测试 41 项通过(另 5 项跳过);11 个相关 Dart 文件定向 flutter analyze 无问题,格式检查与 git diff --check 通过。未运行 scripts/check.sh:改动限于前台意群播放与难句补练切句链路,定向测试和分析已覆盖相关逻辑。完成时间: 2026-10-16 16:55

  • 补充难句补练切句链路诊断日志(2026-10-16):页面记录上一句/下一句来源及模式,分页器记录动画开始、提交、忽略及原因;Provider 用导航编号记录起止索引、模式、播放器失效耗时和结果;盲听/跟读记录句子索引、flow token、播放器 session、取消/失败/自动推进原因。复现后可用 rg "RDP-Navigation|SentencePager|RDP-Blind|RDP-Repeat" flutter_run.log 按链路检查。4 个相关 Dart 文件定向 flutter analyze 无问题,格式与 git diff --check 通过。未运行测试:本次只补充诊断日志和来源标记,没有改变业务行为;未运行 scripts/check.sh:改动范围局限于难句补练导航诊断。完成时间: 2026-10-16 16:44

  • 修复难句补练音频切句跳过目标句(2026-10-16):flutter_run.log 显示导航后目标句刚开始播放便返回 cancelled,旧逻辑把取消当作不可播放而跳过;同时新句播放可能早于旧音频暂停完成。盲听流程现区分 cancelled 与 failed,取消时停留等待;启动新句前等待播放器失效/暂停完成,并校验 flow token。增加播放取消、音频收尾顺序、跟读模式下一句单次提交回归测试。4 个相关测试文件 117 项通过、5 项跳过;provider 测试复跑 17 项通过;6 个修改 Dart 文件定向分析无问题,格式与 git diff --check 通过。未运行 scripts/check.sh:改动限于难句补练导航播放链路,定向测试和分析已覆盖受影响逻辑。完成时间: 2026-10-16 16:36

  • 对齐句子练习意群试听与逐词高亮的播放源(2026-10-16):精听、难句补练和跟读视图显式使用各自会话的区间播放器;音频难句补练与跟读使用前台播放器,媒体练习使用 MediaEngine。收藏复习意群试听改为通过与句子重播相同的 LocalAudioClipPlayer 播放,避免试听和高亮脱离。收藏复习新增回归断言;精听页面 49 项、难句补练页面 40 项(5 项跳过)、跟读页面 21 项、收藏复习页面 23 项及两个相关 controller 测试文件共 49 项通过;10 个相关 Dart 文件定向分析无问题,git diff --check 通过。未运行设备 Flow:现有 smoke/study Flow 使用 clearState 清空应用数据,且没有覆盖意群试听的既有 Flow。未运行 scripts/check.sh:改动限于练习页面的播放源绑定,定向测试已覆盖受影响页面和 controller。完成时间: 2026-10-16 15:50

  • 将逐词高亮默认改为开启(2026-10-16):新安装/无已保存值时默认开启,保留用户已保存的关闭选择;更新设置说明及默认值、持久化回归测试。Provider 测试 37 项、设置页 Widget 测试 1 项通过;4 个相关 Dart 文件定向 flutter analyze 无问题。Android dev APK 构建安装成功;临时 Maestro Flow 未能从学习页导航到设置页,真机断言未完成且未清除应用数据。未运行 scripts/check.sh:改动仅限逐词高亮默认设置,定向验证已覆盖代码路径。完成时间: 2026-10-16 15:37

  • 升级应用版本至 1.0.42(2026-10-16):将 pubspec.yaml 中的版本从 1.0.41 提升至 1.0.42。已核对版本字段并通过 git diff --check;版本元数据变更无需运行测试,未运行 scripts/check.sh。完成时间: 2026-10-16 12:16

  • 修复进入随心听时日志页触发的构建异常(2026-10-16):flutter_run.log 显示播放器初始化写入学习计时日志时,仍挂载在下层路由的 LogViewerScreen 同步 setState,导致 setState() or markNeedsBuild() called during build。日志页现将实时刷新合并并延后到帧结束,避免跨路由构建期刷新;新增兄弟路由构建时写日志的回归测试。两个定向 widget 用例通过,改动文件定向 flutter analyze 无问题,git diff --check 通过。完整日志页测试重跑被 Flutter SDK engine.stamp 写权限阻止;未运行 scripts/check.sh:本次仅涉及日志监听刷新。完成时间: 2026-10-16 11:29

  • 修复随心听进入/返回句子讲解时逐词高亮跳到首词(2026-10-16):根因是实际使用的 MediaPlaybackScreen 在进入讲解前选中点选句并 seek 到句首,返回后又按当前焦点 seek 一次;讲解正文订阅同一 MediaEngine 位置流,因此两次操作都会高亮首词。现在进入时只暂停并记录精确位置,不切换随心听焦点或 seek;返回时同步收藏,若讲解期间播放改动位置才恢复原位置。provider 测试 41 项、随心听页面测试 42 项通过;4 个相关 Dart 文件定向 flutter analyze 无问题,格式检查与 git diff --check 通过。未运行 scripts/check.sh:本次仅修改随心听讲解导航和播放位置恢复链路。完成时间: 2026-10-16 11:39

  • 修复逐词高亮 review 中确认的问题(2026-10-15):讲解视图与正文高亮共用词级时间戳 provider,避免对同一音频并发重复请求;设置异步加载不再覆盖加载期间用户刚切换的值;本地短音频播放器仅在有位置流订阅者时转发后端事件。将设置加载用例改为等待状态变化,并为无订阅者时不监听位置流增加回归用例。按用户要求未运行测试、分析或 scripts/check.sh。完成时间: 2026-10-15

  • 修复纯音频随心听句子详情逐词高亮进度源(2026-10-15):音频与视频随心听详情统一接收 MediaEngine 的 WordHighlightSource;所有详情入口显式注入当前实际播放来源,并移除详情页隐式回退到 AudioEngine 的逻辑。核对并修复纯音频复述详情:句子播放与高亮都绑定 ForegroundAudioEngine。六个页面测试共 152 项通过;详情页/随心听复跑 48 项、详情页复跑 6 项、复述页新增回归后复跑 23 项通过。相关 flutter analyze 无问题,格式与 git diff --check 通过。Android dev APK 构建安装成功,SM A065F 上 Maestro 启动截图 Flow 通过(此后只改来源参数,没有视觉变更,未重跑设备 Flow)。未运行 scripts/check.sh:本次改动局限于详情页播放时间源。完成时间: 2026-10-15 23:28

  • 增加可复用的逐词播放高亮(2026-10-15):在播放设置新增默认关闭的逐词高亮开关;通过共享的播放时间源、词级时间戳解析和文本渲染组件接入随心听、音视频播放、听力练习及句子复习等场景,关闭时保留原显示路径,缺少或不匹配时间戳时不高亮。定向设置、时间解析、共享组件、播放器与复习回归测试均在用户要求自行测试前通过;改动文件 flutter analyze 与 git diff --check 通过。按用户要求未继续设备验证;Maestro Flow 未运行,Android APK 安装阶段已启动后中止,安装结果不确定。未运行 scripts/check.sh:本次为限定功能改动,且用户选择自行进行设备验证。完成时间: 2026-10-15 22:02

  • 核对启动国家判定与精选 Podcast API 日志(2026-10-15):10:02 启动先按系统 Region 选择中国候选,Config API 369ms 返回 CN,随后 Supabase、版本检查、权益和社区合集请求均走中国区地址;缓存国家码 JP 未覆盖本次启动决策。该次未进入 Podcast 发现页,因此没有精选 API 请求,符合“仅进入发现页/下拉刷新、不在启动或恢复前台时刷新”的约定;日志中的 /api/v1/catalog 仅出现在 10-13 的旧启动记录。源码仍使用 /api/v1/featured-podcasts、cursor 分页与运行时地区路由。4 个相关定向测试因 Flutter 测试 harness 在加载前连接本机 127.0.0.1 失败,串行重跑仍失败;未运行 flutter analyze 或 scripts/check.sh(本次为只读核对,无代码改动)。完成时间: 2026-10-15 10:06

  • 精选 Podcast API 迁移、缓存与刷新分页(2026-10-14):改用 /api/v1/featured-podcasts,先显示本地缓存;进入发现页和用户下拉时刷新第一页,空列表也支持下拉刷新,滚动时按 cursor 加载后续页;不传 locale,也不在应用启动或恢复前台时后台刷新。provider 串行处理第一页刷新与分页,避免旧分页结果混入新列表;Apple Podcasts 入口不依赖精选列表缓存。移除旧 /api/v1/catalog 网络调用及无用 service/provider/model/状态,保留仅用于读取和迁移旧本地缓存的兼容路径,并确保新 API 不解析旧响应格式。服务、分页与页面测试 19 项通过;后续服务兼容测试 5 项、下拉刷新 widget 测试 12 项(含空列表刷新)通过;相关分析、生成代码、格式与 git diff --check 均通过。未运行 scripts/check.sh 或 scripts/ 下脚本。完成时间: 2026-10-14 13:12

  • 精选 Podcast 日志诊断与命名收尾(2026-10-14):热重启日志确认打开 Apple Podcasts 后精选第一页和两次 cursor 请求均返回 200,未见旧 /api/v1/catalog 请求;为搜索补充请求开始、结果条数/耗时和失败类型日志(不记录搜索词),为分页阈值增加首次触发的限频日志。命名复核删除仅转发的 _triggerBackgroundSync 包装函数,直接调用 _triggerCommunitySync,并将第一页在途请求字段统一命名为 _firstPageRefreshRequest。搜索服务测试 9 项、分页诊断 widget 测试 11 项通过;相关定向分析、格式与 git diff --check 通过。未运行 scripts/check.sh 或 scripts/ 下脚本。完成时间: 2026-10-14 12:59

  • 保留订阅关键回归并精简重复启动测试(2026-10-13):保留覆盖套餐刷新、结账门控和恢复购买的 Paywall 测试,并为 Remote Config fake 补齐新接口;删除重复验证 Session future 正常结束的用例,以及已由启动顺序 widget 测试覆盖的简单 Supabase URL loading 用例。Paywall、认证和启动编排测试共 77 项通过,3 个相关测试文件定向 flutter analyze 无问题,git diff --check 通过。按要求未运行 scripts/check.sh 或 scripts/ 下的脚本。完成时间: 2026-10-13 15:19

  • 修复启动认证门控与地区决策状态一致性(2026-10-13):Session 流等待地区配置和 Supabase SDK 启动结果后再发出首值,配置解析失败、SDK 不可用或启动失败时回退匿名;地区判断直接派生自启动地区结果并移除重复快照;拒绝 Cloudflare 无定位哨兵码 XX 并尝试备用地址;同步 Remote Config 测试替身签名。7 个相关测试文件共 74 项通过,10 个相关 Dart 文件定向分析无问题,格式检查与 git diff --check 通过。未运行 scripts/check.sh:本次修复局限于启动认证/地区 gate 与其测试。完成时间: 2026-10-13 14:30

  • 修复 Config 地区结果尚未决定时提前选取 Supabase URL(2026-10-13):Supabase URL provider 改为等待本次地区决策,第三方启动器改为在本地数据和地区 gate 通过后接收 URL;认证配置状态显式区分 pending,地区未决时 Session 不提前发出匿名值。新增启动顺序与认证 pending 回归测试。5 个改动 Dart 文件定向分析通过,dart format 与 git diff --check 通过;定向 flutter test 在测试加载前因 flutter_tester 无法连接本机测试 harness(127.0.0.1)退出,提权重跑结果相同,测试结果受环境阻塞。ADB 设备可见但仍处于锁屏,未运行会清除应用状态的现有 Maestro 首启 Flow。未运行 scripts/check.sh:改动限于启动地区与 Supabase 初始化顺序。完成时间: 2026-10-13 12:03

  • 启动时按 Config API 确定服务地区(2026-10-13):首帧后先请求系统 Region 对应 API,单次最多 5 秒;失败或国家码无效时再请求另一区域,均无有效地区时使用系统 Region。地区与本地启动就绪后释放业务路由,再按最终地区初始化 Supabase;Supabase 不阻塞首页。启动配置复用到运行期状态,避免重复首轮请求;地区回退时保留后台立即重试。5 个相关测试文件共 43 项通过,10 个改动 Dart 文件 flutter analyze 与 git diff --check 通过。Android dev 包构建并安装成功;非清理 Maestro 启动验证因真机处于锁屏界面而无法断言业务页,需解锁设备后重跑。Maestro 同时按自身清理策略删除了 ~/.maestro/tests 下较早的测试报告。未运行 scripts/check.sh:改动限于启动地区、配置与第三方初始化顺序。完成时间: 2026-10-13 11:36

  • 发现资源卡片显示上传者(2026-10-12):卡片第三行改为显示目录中的上传者昵称,描述不再展示;空或空白昵称显示“未知上传者”,新增中英文本地化。卡片 Widget 测试 7 项通过(测试初始化输出 media_kit 环境提示,不影响结果);5 个 Dart 文件定向分析和 git diff --check 通过。未运行 scripts/check.sh:改动仅限发现资源卡片展示与本地化。完成时间: 2026-10-12 22:56

  • 升级应用版本至 1.0.41(2026-10-12):将 pubspec.yaml 版本从 1.0.40 提升至 1.0.41。核对版本字段并通过 git diff --check;版本元数据变更无需运行测试,未运行 scripts/check.sh。完成时间: 2026-10-12 12:43

  • 中国用户优先使用中国区 APK 下载链接(2026-10-12):解析 platforms.android.apk.downloadUrlChina;中国区非 Google Play 更新检查用 5 秒 HEAD 探测,只有 404/410 时回退到原默认 APK 链接,超时及其他响应保留中国链接;全球用户、Google Play 和未配置中国链接时不探测。模型与更新检查器定向测试共 38 项通过,4 个相关 Dart 文件 flutter analyze 通过,git diff --check 通过。未运行 scripts/check.sh:改动限于 APK 更新链接解析与选择。仍需在中国区 Android 设备验证 CDN 对 HEAD 的实际响应。完成时间: 2026-10-12 12:42

  • 将学习页首次学习区替换为「为你推荐」(2026-10-11):优先推荐最近有播放/学习活动、学习流程未完成且不在最近 24 小时完成列表中的材料;无候选时按材料展示名称不区分大小写排序,从最近完成材料之后选择下一条,不循环,无锚点时取首条,并跳过已完成材料;全部材料已完成时不显示推荐。增加播放断点与全历史子步骤完成时间监听,更新中英文区段标题和单卡操作;任务卡与推荐卡共用布局,保留首次学习任务调度,不再渲染旧任务卡。定向 provider、DAO、widget 测试共 67 项通过;8 个 Dart 文件定向分析通过;Android dev 包构建并安装成功,非清理 Maestro Flow 确认 Study 页与推荐卡显示。后续顺序调整:可立即复习任务仍置前,推荐卡移到待解锁任务之前;后续配色调整:推荐区浅色模式使用蓝紫、深色模式使用提亮紫。Study 页 widget 测试 23 项、两个 Dart 文件定向分析及 Android 非清理 Maestro Flow 均通过。未运行 scripts/check.sh:改动限定在学习页推荐区展示与配色及相关 DAO/provider。完成时间: 2026-10-11 16:50

  • 简化网页词典子资源访问日志(2026-10-11):资源加载时仅打印 URL,移除来源、资源类型及耗时字段,便于查看 WebView 实际访问地址且避免冗长日志。定向 flutter analyze lib/widgets/dictionary/web_dictionary_view.dart 与 git diff --check 通过;未运行测试:仅调整日志内容;未运行 scripts/check.sh:改动局限于网页词典诊断日志。完成时间: 2026-10-11 13:54

  • 恢复网页词典广告屏蔽开关(2026-10-11):结果视图订阅已持久化的 adFilteringEnabled,切换时重建 WebView;关闭时不传网络规则且不注入广告隐藏 CSS,开启时 Android/iOS/macOS 使用网络规则、Windows 使用 CSS 隐藏。页面清理、Cookie 同意与滚动条样式保持独立。定向广告过滤 Widget 测试 4 项通过,相关 3 个 Dart 文件 flutter analyze 通过,dart format 与 git diff --check 通过。未运行 scripts/check.sh:改动限于词典 WebView;未运行 Maestro:没有网页词典专用 Flow,现有首次启动 Flow 会清理应用状态。仍需在 macOS 实测开关开/关及页面加载。完成时间: 2026-10-11 13:42

  • 修复 macOS 网页词典广告规则编译失败(2026-10-11):移除 WebKit 不支持的广告脚本 URL 正则分支,保留脚本路径匹配;增加规则集回归测试,确保交给原生拦截器的 URL 过滤器不含正则分支。定向 Widget 测试 2 项通过,相关 3 个 Dart 文件 flutter analyze 通过,dart format 与 git diff --check 通过。未运行 scripts/check.sh:改动只涉及网页词典广告规则。仍需在 macOS 重启 App 确认 WKContentRuleList 成功编译并正常显示词典页面。完成时间: 2026-10-11 12:17

  • 恢复网页词典默认页面清理与 Cookie 同意脚本(2026-10-11):恢复隐藏常见页眉、页脚及 Cookie 横幅的默认 CSS,并自动点击 OneTrust 或通用 Cookie 接受按钮;在页面提交和加载完成时执行,保留提前展示内容的加载行为。回归测试确认 WebView 注入清理 CSS 并执行接受脚本;定向 flutter analyze、该测试、dart format 与 git diff --check 通过。未运行 scripts/check.sh:改动仅限网页词典视图。仍需在 macOS/移动端确认站点布局及 Cookie 提示表现。完成时间: 2026-10-11 12:14

  • 恢复网页词典广告过滤(2026-10-11):将已有规则接回 WebView,Android/iOS/macOS 启用广告请求拦截与广告元素隐藏;所有平台在页面样式注入时隐藏匹配的广告元素,Windows 插件不支持网络请求拦截,因此仅隐藏页面广告。新增 Widget 回归测试确认规则传入 WebView。flutter test test/widgets/dictionary/web_dictionary_ad_filter_test.dart、相关文件定向 flutter analyze、dart format 与 git diff --check 通过;未运行 scripts/check.sh,改动只涉及网页词典广告过滤。仍需在 macOS/移动端实际确认广告展示效果。完成时间: 2026-10-11 12:08

  • 升级应用版本至 1.0.40(2026-10-11):将 pubspec.yaml 中的版本从 1.0.39 提升至 1.0.40。已核对版本字段并通过 git diff --check;版本元数据变更无需运行测试,未运行 scripts/check.sh。完成时间: 2026-10-11 12:01

  • 缩小网页词典弹窗左右留白(2026-10-11):网页词典面板左右内边距从 24dp 调至 16dp,其他词典面板保持原间距。dart format、定向 flutter analyze lib/widgets/dictionary/dictionary_panel.dart 与 git diff --check 通过;未运行测试和 scripts/check.sh。需用户在 macOS 确认视觉效果。完成时间: 2026-10-11 11:58

  • 隐藏网页词典滚动条(2026-10-11):Android/iOS 关闭原生竖向滚动指示器,并在页面提交及加载完成时注入隐藏 WebKit 滚动条的 CSS,覆盖 macOS 页面滚动条。定向 flutter analyze lib/widgets/dictionary/web_dictionary_view.dart 与 git diff --check 通过;未运行测试和 scripts/check.sh。需用户在 macOS 确认视觉效果。完成时间: 2026-10-11 11:55

  • 为网页词典设置移动 Safari User-Agent(2026-10-11):移动内容模式仍返回桌面布局后,为 WebView 配置移动 Safari UA;macOS 插件将该设置映射到 WKWebView 的 customUserAgent。定向 flutter analyze lib/widgets/dictionary/web_dictionary_view.dart 与 git diff --check 通过;未运行测试和 scripts/check.sh。仍需用户重启 App 实测。完成时间: 2026-10-11 11:52

  • 网页词典显式请求移动版布局(2026-10-11):当前 WebView 未设置移动端内容模式,Apple WKWebView 默认模式可能让词典站点返回桌面布局。为 Android、iOS、macOS 设置 preferredContentMode=MOBILE,不改 URL 模板或手动伪造 UA。定向 flutter analyze lib/widgets/dictionary/web_dictionary_view.dart 与 git diff --check 通过;未运行测试和 scripts/check.sh。仍需在 macOS 实测确认页面布局。完成时间: 2026-10-11 11:49

  • 更新有道词典移动版地址(2026-10-11):将旧版 m.youdao.com/dict?le=eng&q=... 改为 dict.youdao.com/m/result?word=...&lang=en,查询词继续使用既有 URL 编码。dart format、定向 flutter analyze lib/services/dictionary/web_dictionary_source.dart 与 git diff --check 通过;未运行测试,未运行 scripts/check.sh。完成时间: 2026-10-11 11:47

  • 补充网页词典 URL 诊断日志(2026-10-11):主框架开始、提交、完成、失败和超时事件打印完整 URL;Android、iOS、macOS 额外记录已加载子资源的类型和 URL。定向 flutter analyze lib/widgets/dictionary/web_dictionary_view.dart 与 git diff --check 通过。未运行测试:本次只增加诊断日志;未运行 scripts/check.sh。完成时间: 2026-10-11 11:44

  • 确认 macOS 网页词典黑闪与原生视图路径相关(2026-10-11):临时将 AppKitView 替换为占据同一布局的 Flutter 色块;用户实测黑闪消失,说明黑帧来自原生 WebView 创建/呈现路径。对照期间不创建 WebView,因此一直显示加载遮罩是预期结果;现已恢复网页加载。静态分析与 git diff --check 通过。精确到原生创建还是合成时序仍待继续排查。完成时间: 2026-10-11 10:55

  • 统一放宽 Apple 平台 ATS 网络限制(2026-10-11):macOS 与 iOS 的 Info.plist 均配置 NSAllowsArbitraryLoads=true,允许应用通过 ATS 加载任意网络连接;macOS Debug/Release 沙盒客户端网络权限已存在,无需修改。两个 Info.plist 校验通过。未运行 scripts/check.sh:本次仅修改 Apple 平台网络策略配置,Plist 校验覆盖变更;仍需重新构建 macOS/iOS App 实测有道页面。完成时间: 2026-10-11 10:34

  • 优化网页词典跨平台首屏加载(2026-10-11):WebView 全程挂载,上覆跟随 App 主题的加载遮罩;onPageCommitVisible 到达时提前展示页面,onLoadStop 为 Windows 等平台兜底。仅主框架错误显示重试界面,30 秒超时也会退出无限加载态;用导航 URL 和代际隔离过期回调与计时器。将 underPageBackgroundColor 限定配置到 iOS/macOS,并关闭透明背景;启用 Windows 内嵌 WebView。新增 9 项加载状态测试,连同网页词典弹窗高度测试共 15 项通过;4 个 Dart 文件定向分析通过,git diff --check 通过。未运行 scripts/check.sh:改动局限于网页词典加载链路,定向检查覆盖相关状态和弹窗。未运行 Maestro:需要用户在 macOS/iOS/Android/Windows 实机验证页面首次绘制,且当前 Maestro 首启 smoke flow 会清空应用数据。完成时间: 2026-10-11 10:02

  • 修正欧路词典词条链接(2026-10-11):将链接路径从 /dicts/en/ 改为 /mdicts/en/,符合欧路词典的词条地址格式。定向测试 53 项通过,2 个 Dart 文件定向分析通过,git diff --check 通过。未运行 scripts/check.sh:改动仅涉及词条 URL 与其回归测试,定向检查已覆盖。完成时间: 2026-10-11 00:37

  • 移除词典广告过滤说明(2026-10-10):删除设置页说明及中英文文案;本地化生成、diff 检查通过,未运行测试。完成时间 22:37

  • 扩展网页词典广告过滤规则(2026-10-10):新增国际与中国广告域名、第三方广告路径和 CSS 隐藏规则;格式化、diff 检查通过,未运行测试。完成时间: 2026-10-10 22:17

  • 网页词典新增欧路词典(2026-10-10):新增可配置网页源 eudic,使用欧路英汉词条页 URL,支持词组空格编码;来源自动出现在词典切换器与设置列表,默认可见且可禁用,默认源仍为本地词典。新增 URL、注册表可见性及禁用行为回归测试。两个定向测试文件共 58 项通过,3 个 Dart 文件定向分析通过,git diff --check 通过。未运行 scripts/check.sh:改动限于网页词典配置与来源可见性,定向检查覆盖相关行为。未运行 Maestro:沙箱内 ADB 守护进程启动失败(Operation not permitted),现有首启 smoke flow 会清空应用数据;未在设备验证 WebView 实际加载。完成时间: 2026-10-10 19:05

  • 限制共享后台文件下载进度更新频率(2026-10-10):百度网盘和播客共用的 BackgroundFileDownloadService 按任务将应用层进度回调限制为最多每 100ms 一次;初始进度、已知总量下的完成进度,以及任务终态的最终字节数仍会及时发布,失败/异常路径会冲刷最后待发布进度。新增 1000 次突发进度回调回归测试,确认通知被合并且最终字节数保留;完整下载服务测试 10 项通过,改动的 2 个 Dart 文件定向分析通过,git diff --check 通过。未运行 scripts/check.sh:改动仅限共享下载进度通知,定向测试覆盖修改范围;尚未做真机下载速度前后对比。完成时间: 2026-10-10 09:54

  • 定位并压制 ASR 下载进度回调造成的吞吐下降(2026-10-10):日志中的 App 是 sidecar 优化后重新构建的版本;同 URL 的 Dart/Dio 流式写盘复测为 2.01 秒、约 31.0 MB/s,收到 11,414 个数据块;App 日志为 62,337,248 字节、14.110 秒、约 4.42 MB/s。根因是每个数据块都触发 ASR provider 状态更新,而设置页订阅整个状态;限频前的 10,000 次回调回归用例产生了 10,000 次状态更新。现将 UI 进度状态更新限制为每 100ms 至多一次,100% 仍立即发布。Dio 同 URL 无重定向且无内容编码,直连 curl 复测约 24.9 MB/s。Provider 与设置页定向测试 15 项通过,2 个 Dart 文件定向分析通过,git diff --check 通过。未运行 scripts/check.sh:改动限于 ASR 进度通知频率,定向测试覆盖相关状态流。完成时间: 2026-10-10 09:16

  • 复核限频后 ASR 下载速度差距(2026-10-10):最新 flutter_run.log 中 95,051,629 字节下载耗时 7.717 秒,约 12.32 MB/s;同 URL 的 curl --noproxy '*' 为 3.56 秒。查到启动 shell 的小写 http_proxy、https_proxy、all_proxy 均指向 127.0.0.1:7897,Dart TCP 连接也确实经过该端口;scutil --proxy 为空不能覆盖 shell 环境变量。普通 Dart Dio 探针保留变量为 5.14 秒,清除变量直连为 3.61 秒;curl 走本地代理仍能达到 2.34 秒,因此已确认 App 与此前直连对比的路径不同,但代理因素尚不足以解释全部差值。未改代码强制绕过代理,避免破坏用户显式代理配置;需在清除变量后重新启动 App 并用现有设置流程验证一次新下载。只做日志与网络诊断,未运行 scripts/check.sh。完成时间: 2026-10-10 09:32

  • 优化共享 HTTP 下载器的续传元数据写入(2026-10-10):续传 sidecar 改为在读取响应体前最多写一次,只保存恢复所需的 identityKey;读取时继续兼容旧 sidecar 的额外字段。移除逐数据块元数据写入,保留逐块落盘与进度回调;元数据写入失败仍归类为存储错误,并取消未消费的响应流。下载器、ASR、词典、Kokoro、Piper 与发音库 6 个测试文件共 52 项通过;2 个改动 Dart 文件定向分析通过,git diff --check 通过。未运行 scripts/check.sh:改动限于共享下载器的流式落盘路径,相关调用方定向测试覆盖。未做真机 CDN 吞吐对比。完成时间: 2026-10-10 00:39

  • 修复并复核地区端点路由(2026-10-09):所有构建模式共用端点配置;启动日志确认中国 API 在首次请求前选中。定向测试 18 项通过;社区音频响应含全球 CDN URL,本次未见实际下载。完成时间: 2026-10-09 22:58

  • 简化地区判定并统一服务路由(2026-10-09):中国区只按系统 Region 的 CN 判定;冷启动同步选区,resume 不切换;API/CDN 不跨区回退。生命周期与路由定向测试通过。完成时间: 2026-10-09 22:30

  • 分析 Android 首装启动日志(2026-10-09):启动与首屏正常;发现中国区 Paddle 首次请求先返回 JP/USD,随后刷新为 CN/CNY。完成时间: 2026-10-09 21:17

  • 删除低价值 WAV 指标公式单测(2026-10-09):移除只用固定 250ms 样本验证 PCM 字节数和时长换算的断言;保留验证录音诊断能进入持久化应用日志的行为测试。未改生产代码。完成时间: 2026-10-09

  • 补充 Android 跟读录音取证日志(2026-10-09):记录 AudioRecord 初始化/启动状态、正帧数、0/负返回次数及最后非正返回值、停止时录音协程等待是否超时,并记录写入字节/时长、采集耗时和 WAV 裁剪前后文件大小/时长;通过现有持久化应用日志与日志支持包收集。只增加观测,不改变录音、裁剪、停止或识别行为,也不记录音频/识别文本;复核时增加诊断类型容错并在每轮会话清空旧统计。RecordingService 日志测试 3 项通过,4 个 Dart 文件定向分析无问题,Android WavRecorderTrimTest 通过,git diff --check 通过。未运行 scripts/check.sh:本次限于 Android 录音诊断日志与指标计算,定向验证覆盖改动范围。未在 vivo X100s Pro 上复现,根因仍待用户日志确认。完成时间: 2026-10-09 11:21

  • 修复 iOS Apple AI 合成音频无法播放(2026-10-08):平台 TTS 默认输出统一为 WAV,iOS 继续调用 flutter_tts.synthesizeToFile,macOS 保持现有原生合成路径;缓存命名空间升级至 v3,避免命中旧 CAF 缓存。新增默认 WAV 和旧缓存 key 失效回归测试。TTS 定向测试 28 项通过,4 个相关 Dart 文件定向分析通过,git diff --check 通过。未运行 scripts/check.sh:仅改动 TTS 格式和缓存兼容性,定向测试覆盖范围足够;未在 iPhone 上安装运行,真实设备播放需手动验证。完成时间: 2026-10-08 23:57

  • 删除低价值的复述状态单测(2026-10-08):移除仅检查 RetellPlayerState.stepFinished 默认值和 copyWith 行为的用例;保留段落切段及最后一段重复遍数的行为回归测试。此次仅删除测试,未运行测试。完成时间: 2026-10-08 23:55

  • 修复段落复述播放中无法切换段落(2026-10-08):切段和重复播放在旧播放取消后异步启动新播放并立即返回,页面仅在 Provider 标记 stepFinished 后处理最后一段完成。新增受控播放时序与最后一段重复遍数回归测试。Provider 25 项测试、页面 Widget 22 项通过;3 个 Dart 文件定向分析和 git diff --check 通过。未运行 scripts/check.sh:局部播放器异步边界修复由定向测试覆盖。未运行 Maestro:当前仅连接两台无线 iPhone、无模拟器;仓库 smoke flow 会清除应用数据且不覆盖复述切段,页面 Widget 测试已通过。完成时间: 2026-10-08 23:46

  • 补充登录初始化诊断日志(2026-10-08):记录地区选择、脱敏入口、配置状态和初始化结果;日志仅显示服务 origin,不包含 URL 凭据、路径和查询参数。新增脱敏测试。配置与启动测试 10 项通过,3 个 Dart 文件定向分析通过,git diff --check 通过。未运行 scripts/check.sh:改动仅涉及启动诊断日志,定向验证覆盖修改范围。完成时间: 2026-10-08 23:19

  • 优化中国地区登录连接(2026-10-08):完成客户端登录连接调整及相关验证。完成时间: 2026-10-08 21:20

  • 为账号入口添加中国区路由角标(2026-10-08):在“我的”页账号行图标右上角复用 assets/icon/china_flag.svg,仅 isChinaUser 为 true 时显示,并补充中英文无障碍提示与地区状态切换 Widget 回归测试。设置页测试 34 项通过,相关文件定向分析无问题,git diff --check 通过。未运行 scripts/check.sh:改动范围仅限设置页和资源注册;未运行 Maestro:查询已连接 iPhone 上的安装包时 CoreDevice 初始化超时,无法确认可运行的目标包。完成时间: 2026-10-08 18:23

  • 移除 CI/Release API 地址必填校验(2026-10-08):按用户要求删除 CI 中的校验及校验测试步骤、Release 中的校验步骤,并删除只服务于这些步骤的两个脚本;构建参数直接引用 GitHub Variables,不增加 API 地址的 env 映射。完成时间: 2026-10-08 16:39

  • 为 CI/Release API 地址补齐必填校验并修正文档注释(2026-10-08):CI 与 Release 在构建前通过共享脚本校验 API_BASE_URL 和 API_CHINA_BASE_URL 非空,避免缺变量时以空值覆盖 Dart 源码默认地址并静默关闭地区路由;为缺少两项、缺少任一项、纯空白及有效值添加脚本回归测试。修正 Client Config 端点回退、并发强制刷新和 Dio/HTTP2 拦截器的中文注释。脚本测试通过;远程配置测试 22 项通过;4 个改动 Dart 文件定向分析无问题;CI/Release YAML 解析、shell 语法检查和 git diff --check 通过。未运行 scripts/check.sh:改动局限于 workflow 必填校验和注释,定向验证覆盖其行为。完成时间: 2026-10-08 16:17

  • 修复 Client Config 国家码缺失时默认填充 US(2026-10-06):countryCode 改为可空;缺失、null、非字符串、空白和 unknown 均保留为未知,不再伪造 US。补充解析边界与 UserRegion 聚合回归测试。相关 2 个测试文件共 32 项通过,6 个 Dart 文件定向分析通过,git diff --check 通过。未运行 scripts/check.sh:改动限于远程配置国家码解析与地区判定,定向测试和分析覆盖修改范围。完成时间: 2026-10-06 19:57

  • 分析用户反馈的 AI 转录按钮无响应日志(2026-10-06):日志显示视频音轨抽取成功,但上传请求因认证刷新失败而未到达服务端;同期多个需要认证的请求也出现刷新失败,说明问题不局限于转录。日志缺少底层错误类型,暂时无法区分凭据失效与认证服务或网络异常。仅完成日志分析,未改代码、未运行测试。完成时间: 2026-10-06 13:35

  • 恢复全球 API 构建变量并加入中国 API workflow 注入(2026-10-05):CI 的 iOS/Android 构建使用直接 --dart-define=${{ vars.* }} 写法;Release 的 APK/AAB/iOS 构建遵循原有 env 与 DART_DEFINES 数组写法。两个 workflow 均以前置检查确保缺少任一必填变量时失败。恢复 API 地址的编译期覆盖能力,并同步更新 env 模板、发布脚本说明和中英文文档。端点路由测试默认配置与两个自定义地址配置各 7 项通过;3 个 Dart 文件定向分析通过;两个 workflow YAML 与 5 个构建脚本语法检查通过,git diff --check 通过。未运行 scripts/check.sh:本次限于构建变量和端点配置,已运行直接相关测试与分析。完成时间: 2026-10-05 23:19

  • 补充用户地区、API/CDN 路由和配置回退诊断日志(2026-10-05):记录启动地区证据快照、刷新触发与完成结果、Client Config 国家码更新前后值、isChinaUser 结论变化和触发的强制配置刷新;端点日志输出首选/当前 API 与 CDN 的地址及回退状态,配置请求记录首选端点、备用端点和跳过回退的原因,URL 隐去 credentials 与 query。原有 ApiLogInterceptor 已记录每个 API 请求的实际 URL,下载器也记录模型资源 URL。地区、配置刷新、endpoint router 和后端请求 4 个测试文件共 48 项通过;4 个改动 Dart 文件定向分析无问题,git diff --check 通过。未运行 scripts/check.sh:本轮仅补诊断日志,定向测试覆盖国家获取/更新、端点选择、配置回退及 API 请求路径。完成时间: 2026-10-05 21:43

  • 为中国 API 增加编译期地址覆盖并清理旧地区 Cookie 缓存(2026-10-05):API_CHINA_BASE_URL 控制中国 API 地址,release 包由统一 isChinaUser 在全球/中国 API 间动态选择,API_BASE_URL 仍仅用于 debug/profile。移除已无生产消费者的地区 Cookie 缓存及相关拦截、初始化依赖和测试;备份仍排除旧版本遗留的地区偏好项。环境模板提供编译期配置示例,默认值和自定义地址均由端点注册表测试验证。路由、后端和客户端构造相关测试 30 项通过;端点注册表在默认值与自定义地址下各 7 项通过;10 个相关 Dart 文件分析无问题,git diff --check 通过。未运行 scripts/check.sh:本次变更限定于路由配置和无消费者缓存清理,定向测试与分析覆盖了修改范围;此前全量分析有未修改 integration test 的既有错误。完成时间: 2026-10-05 21:09

  • 统一 UserRegion 动态选择全球/中国 API 与模型 CDN(2026-10-05):单一 isChinaUser 结论聚合 Apple Storefront、设备国家码和远程配置国家码,任一 CN/CHN 即选择中国。冷启动使用已缓存配置和设备国家码先初始化路由;地区结论变化时探测新首选 API,网络错误或 5xx 时只回退另一区域一次,4xx 不回退;备用成功后当前会话使用可用地址,后续配置刷新重探首选。CDN 跟随 isChinaUser,Paddle 显示门控逻辑未改。release 包支持中国 API 编译期覆盖;debug/profile 保留全球 API 覆盖。路由、地区、后端、模型和下载相关 9 个测试文件共 81 项通过;Paywall、订阅可用性和 Paddle 计费 4 个测试文件通过;44 个相关 Dart 文件定向分析无问题,git diff --check 通过。scripts/check.sh 本轮未重跑:先前全量分析已被未修改的 integration_test/kokoro_tts_test.dart 既有类型错误阻断,本轮验证覆盖全部改动 Dart 文件和相关测试。完成时间: 2026-10-05 11:55

  • 修复收藏意群 widget 测试未注入数据库导致 CI 失败(2026-10-03):该测试触发真实 FavoriteVocabularyLifecycle 数据库事务,但测试容器未覆盖 appDatabaseProvider,导致 _appDatabase 未初始化。为该用例注入独立的内存 Drift 数据库并在测试结束时关闭;未改生产逻辑。相关 4 组单测共 62 项通过,目标回归用例单独复跑通过,测试文件定向分析通过。完成时间: 2026-10-03 23:40

  • 修复收藏页 fake 接口不匹配导致的 CI 分析失败(2026-10-03):将两个 BookmarkReview fake 的 initialize 签名同步为无参接口。CI 同款全量 Flutter 分析通过;剩余 warning/info 非致命。按用户要求未运行测试。完成时间: 2026-10-03 23:17

  • 移除已退役的 SharedPreferences→Drift 旧版数据导入(2026-10-03):从启动流程移除导入调用,删除仅供旧版 SP 数据迁移使用的实现及专属测试;当前 Drift 数据库初始化和应用内数据流程不变。相关启动测试与定向分析通过。完成时间: 2026-10-03 22:10

  • 收藏复习队列直接从到期调度读取(2026-10-03):句子和词汇复习分别通过单条联表查询,从 memory_schedules 读取到期 active schedule 及对应收藏内容;内存中继续执行现有排序,避免遍历所有收藏并逐张读取 schedule。新增三个部分索引,并在 v58 升级中补齐旧版本可能缺失的收藏 subject ID 和 schedule;复习加载与重排日志记录来源、耗时和队列数量。定向测试 70 项通过,相关文件 dart analyze 通过。完成时间: 2026-10-03 21:41

  • 增加收藏与复习计划一致性诊断日志(2026-10-03):记录单词/意群收藏生命周期事务开始、提交、回滚及复习计划创建、无变化、归档、恢复和跳过原因;回滚日志标出失败阶段与异常类型,不输出数据库异常文本或收藏原文。生命周期测试 5 项通过,并验证成功事件顺序、失败阶段和日志不包含收藏原文;相关文件定向分析通过。完成时间: 2026-10-03 20:40

  • 修复收藏与复习计划一致性并删除绕行书签写入(2026-10-03):单词、意群的保存/删除/恢复与 schedule 变更统一放入同一数据库事务;移除依赖补偿写入的逻辑。删除 BookmarkManager 中无生产调用方的直接书签写入方法,持久化测试改走收藏生命周期。生命周期测试 5 项、书签持久化测试 6 项、选区收藏 widget 测试 41 项、词汇复习测试 19 项通过;相关文件 flutter analyze 通过。完成时间: 2026-10-03 20:28

  • 修复复习中切换复习顺序不立即生效(2026-10-03):句子复习与词汇/意群复习会重排尚未评分的队列,并立即显示新顺序的首张卡;提交结果未知时保留当前卡与幂等快照,成功重试或明确拒绝后才应用暂存顺序。评分总结只记录已确认成功的提交,队列未改变当前卡时保留翻面及预览状态。日志记录排序加载、暂存/应用结果、提交重试与未知结果,并限制队列日志只显示前 5 张卡。重排只读取 active 调度快照,不会恢复已取消收藏。相关测试与定向分析通过。完成时间: 2026-10-03 10:36

  • 清理 VS Code 扩展推荐中的重复项(2026-10-01):删除重复的 Git Graph 推荐。完成时间: 2026-10-01 18:12

  • 升级应用版本至 1.0.39(2026-10-01):将 pubspec.yaml 中的版本从 1.0.38 提升至 1.0.39。完成时间: 2026-10-01 17:53

  • 修复 MKV 视频时长未显示并统一音视频时长探测(2026-10-01):根因是视频也统一经 just_audio 探测,macOS set_file_path 抛出 PlayerException 后将 0 入库。音频和视频现统一使用 media_kit 暂停探测;启动回填修复旧的 0 时长记录并防止路径竞态。探测流错误统一转为失败结果,无 trace 时仍记录脱敏错误日志。新增探测、注册和回填回归测试。完成时间: 2026-10-01 17:32

  • 修复 GitHub CI 难句补练测试与返回手势测试失败,并删除低价值单测(2026-09-29):为难句页面测试关闭依赖 SharedPreferences 的新手引导;媒体页面 dispose 收尾改为微任务,返回手势测试显式卸载路由树并推进收尾;删除仅验证 AppUpdateState 构造和类型的 5 项单测,保留更新信息解析边界测试。相关测试 49 项通过、5 项跳过,修改文件定向分析通过。完成时间: 2026-09-29 23:45

  • 删除低价值播放器测试(2026-09-29):移除只验证分割线固定颜色与像素宽度的 widget 用例,删去已由行为测试覆盖的内部定位参数断言;保留滚动、播放、生命周期及有明确产品要求的控件断言。相关测试共 153 项通过。完成时间: 2026-09-29 23:07

  • 修复 GitHub CI 分析失败及近期播放器回归测试异常(2026-09-29):为全文与收藏 tab 分别注入分页控制器;新手引导总开关关闭时不创建 Showcase 目标;媒体页面测试等待真实文件 IO 和对应加载状态,兼容音频及字幕仍在加载的用例。CI 相关测试共 154 项通过,修改文件定向分析通过(现存 warning/info 非致命)。完成时间: 2026-09-29 22:57

  • 统一 Android 随心听锁屏媒体控制布局(2026-09-29):有无字幕时均使用上一项、播放/暂停、下一项三键布局;无字幕时上一项/下一项仍执行前后 10 秒 seek。新增字幕与无字幕模式回归断言,相关测试和文件分析通过。完成时间: 2026-09-29 22:04

  • 修复视频随心听锁屏后自动暂停(2026-09-29):关闭 media_kit_video 默认的后台暂停行为,使锁屏期间视频音轨继续播放;增加视频组件后台暂停配置回归测试。相关测试通过。完成时间: 2026-09-29 21:47

  • 修复随心听精听切卡未完成就播放(2026-09-29):横滑在分页滚动结束后才提交选句;页面上一句/下一句按钮先等待卡片动画完成,再按原播放状态切句。日志覆盖触发来源、起止句、卡片移动方向、动画耗时、选句对齐和后端播放开始。补充播放中横滑、播放中按钮和暂停按钮回归用例。相关文件分析通过;播放器页面 widget 测试运行卡在媒体页面就绪阶段,未能取得测试结果。完成时间: 2026-09-29 21:00

  • 修复随心听锁屏媒体信息未显示(2026-09-29):媒体路由切换后等待系统会话收到当前曲目和 ready 状态再报告加载完成;记录 AudioService 异步平台错误;补充路由元数据、播放态和释放回归。相关测试 23 项通过。完成时间: 2026-09-29 20:36

  • 随心听精听与列表切换保留字幕列表状态(2026-09-29):每种播放列表首次显示后保持挂载;隐藏期间暂停自动聚焦,焦点未变化时保留滚动位置,切句或显式恢复时直接定位最新句;补充往返切换回归。播放器页面 39 项与列表组件 16 项测试通过。完成时间: 2026-09-29 19:36

  • 修复随心听退出时在 widget 生命周期内修改 provider 的异常(2026-09-29):dispose 兜底延后到事件循环执行,保留页面代际校验,并记录、处理后台收尾失败;补充真实卸载与暂停失败回归,播放器页面 37 项测试通过。按用户要求不运行真机构建或 Maestro;本次局部修复不运行 scripts/check.sh。

优先处理

  • 在 iPhone 实机验证意群起播高亮(2026-10-18):日志确认 seek 后短暂回退样本会导致上一组末词闪回;意群起点边界修复后用户确认问题解决。
  • 实测 WebView 移动内容模式与 User-Agent:macOS 完整重启 App 后确认有道等词典是否显示移动布局;如仍为桌面版,再收集页面实际 User-Agent 与 viewport 宽度。
  • 修复 macOS 网页词典首帧黑闪:继续隔离原生 WebView 创建与 Flutter 合成时序,保持内容尽早显示且不修改插件源码。
  • Android 离线 ASR 结束录音闪退:获取真机 logcat 与 /data/tombstones,定位并修复 Silero VAD native 崩溃。
  • 段落复述页面复用统一录音识别模块。
  • 意群操作栏切换收藏时其他按钮闪烁,继续定位根因。
  • 在发布包手动验证数据采集:核对 onboarding、页面访问、权限快照、生命周期事件及应用版本信息。

后续产品体验

  • 查词归一化 Unicode 化,并迁移已有收藏 key(需产品与数据决策)。
  • 计算并展示每个学习任务的预计/实际耗时。
  • 学习 Tab 点击学习/复习后直接进入学习页面,跳过学习计划页。
  • 学习 Tab 展示“今日完成任务”折叠区。
  • 句子增加复制能力:移动端长按、桌面端右键。
  • 支持自定义背景和背景音。
  • 增加播放完成音效、任务完成动画与音效。
  • 埋点能力按中国大陆 / 全球环境拆分落地。

后端与发布

  • 后端账号登录会话能力。
  • 完成跨平台验证与发布准备。