26 Commits
Author SHA1 Message Date
cooper c77e235d96 fix style pack prefs sync consistency 2026-05-13 22:22:38 +08:00
cooper ae2c7e4e74 fix style pack export guard and switch-style sync 2026-05-13 21:45:13 +08:00
cooper a4c4cc224b fix tray style activation and streamed text consistency 2026-05-13 21:14:46 +08:00
cooper 16dd99cf67 refine style store runtime clarity and card layout 2026-05-13 19:18:58 +08:00
cooper 0c6cc8b292 refine style pack runtime semantics and editor clarity 2026-05-13 17:53:29 +08:00
cooper 0a19ad316e fix: surface style store editor action 2026-05-13 17:09:41 +08:00
cooper c77d9f42ed fix: restore backend test prompt stub 2026-05-13 16:42:37 +08:00
cooper 7616ef0422 fix: align polish streaming test signature 2026-05-13 16:11:18 +08:00
cooper b5001dc78f fix: streamline style store editor flow 2026-05-13 15:43:40 +08:00
cooper 4127fe6a28 fix: align style pack branch with beta settings 2026-05-13 14:12:19 +08:00
cooper 8174cb4e8c feat: add style pack management UI 2026-05-13 14:08:10 +08:00
cooper 8baf160ea2 feat: add style pack runtime and persistence 2026-05-13 14:06:29 +08:00
cooper e331784b3b docs: add Cooper's circular avatar image
- Add assets/people/cooper.png (circular avatar)
- Replace GitHub API link with local image file
- Match TRIP and Chris233's avatar style
2026-05-08 00:34:48 +08:00
cooper 620e817939 docs: make Cooper avatar circular
Add border-radius: 50% to Cooper's avatar to match TRIP and Chris233's circular style.
2026-05-08 00:32:29 +08:00
cooper dd96d64672 docs: add website URLs back to developer section
- Add website URLs below each developer's name
- Increase cell width from 110 to 140 to accommodate URLs
- Keep circular avatars and table layout
2026-05-08 00:27:31 +08:00
cooper 712e9564f2 docs: refine developer section 2026-05-08 00:02:23 +08:00
cooper 188efa7e68 docs: add Cooper to developer list 2026-05-07 19:59:38 +08:00
cooperandClaude Sonnet 4.6 27451298da audit(system): 完成系统级多尺度审计 - 发现 3 大架构风险和 13 项技术债务
建立多尺度审计框架(4 个尺度):
- 尺度 1: 系统级(架构、安全、扩展性)
- 尺度 2: 模块级(设计、接口、依赖)
- 尺度 3: 功能级(实现、体验、边界)
- 尺度 4: 代码级(bug、风格、性能)

**系统级审计关键发现**:

架构风险(3 项):
- 🔴 Coordinator 过于庞大(3462 行)
- 🔴 缺少统一的 ASR Provider trait
- 🔴 测试基础设施缺失(覆盖率接近 0%)

技术债务(13 项):
- P0: 2 项(测试相关)
- P1: 5 项(架构 + 测试 + 代码)
- P2: 4 项(架构 + 文档 + 代码)
- P3: 2 项(文档)
- 预计偿还成本: 14 周(3.5 个月)

**关键决策**:
1. ✅ 需要架构重构
2. ⏸️  暂停低尺度审计(先解决高尺度问题)

**下一步行动**:
1. 编写测试策略文档
2. 编写 Coordinator 拆分设计文档
3. 编写 ASR Provider trait 设计文档

**审计产出**:
- 多尺度审计框架文档
- 架构风险地图
- 技术债务矩阵
- 系统级审计总结
- 系统级审计脚本

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 23:16:12 +08:00
cooperandClaude Sonnet 4.6 7e7b200198 docs(epic): 建立 Cooper 贡献体系 - 两大 EPIC 母体与 Finding 流程
建立完整的贡献规划体系:

**两大 EPIC 母体**:
- EPIC-001: 测试基础设施建设 (41 tasks, 6 weeks)
  - 目标:测试覆盖率 0% → 60%+
  - Phase 1: 核心模块单元测试
  - Phase 2: 集成测试
  - Phase 3: CI 自动化

- EPIC-002: ASR 功能扩展与优化 (71 tasks, 6 weeks)
  - Phase 1: 混淆词纠错层 (对应 #89)
  - Phase 2: 本地 ASR 支持 (对应 #211)
  - Phase 3: ASR 架构优化

**Finding 基础设施**:
- finding-helper.sh: 自动化分析脚本
- 生成 4 份 finding 报告:
  - 测试覆盖率分析
  - ASR 模块分析
  - 依赖关系分析
  - Finding 总结

**工作流程文档**:
- COOPER_README.md: 快速开始指南
- COOPER_WORKFLOW.md: 详细工作流程
- COOPER_CONTRIBUTION_STRATEGY.md: 贡献策略分析

**关键指标**:
- 包含测试的文件数: 15
- 测试函数数: 76
- ASR 模块代码量: 1164 行

下一步:开始实现混淆词纠错层(EPIC-002 Phase 1)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 23:00:25 +08:00
cooper 84e1649681 docs: 添加 Watchdog 线程影响分析与风险评估
- 分析了 5 个潜在风险点
- 验证了 ASR 资源清理逻辑
- 结论:当前实现完全安全,可以合并
2026-05-04 22:31:08 +08:00
cooper d1c68f0f30 test: 添加实机测试报告(仅保留在 fork)
- BUILD_TEST_REPORT.md: 构建和启动测试
- P1_TEST_REPORT.md: 麦克风异常恢复测试
- TEST_VERIFICATION.md: 代码审查验证

这些文档仅用于 fork 仓库的测试记录,不提交到上游 PR
2026-05-04 22:21:14 +08:00
cooper 4e66c91e07 docs: 添加 Issue #238 修复的代码审查验证报告 2026-05-04 21:54:35 +08:00
cooper a8741dd568 fix(recorder): watchdog 从播放开始时计时,避免慢启动误报
- 移除 StreamState::stream_start_time 字段
- 在 watchdog 线程内部记录启动时间
- 确保首次回调截止时间从 stream.play() 成功后开始计时
- 修复慢速后端可能导致的过早超时问题
2026-05-04 21:46:07 +08:00
cooperandClaude Sonnet 4.6 87838617f8 fix(recorder): 添加首次回调截止时间检测
根据 code review 反馈,修复 watchdog 的行为缺口:

## 问题
修复 Finding 3 后,虽然避免了误报慢启动设备,但也失去了对
"第一个回调永远不到达"这种失效模式的检测能力。

如果 stream.play() 成功但 CPAL 从未发送任何回调,watchdog
的 `if let Some(last_time)` 分支永远不会执行,session 仍然
可能无限期挂起。

## 修复方案
添加"首次回调截止时间"机制,watchdog 现在检查两种情况:

1. **首次回调未到达**(last_callback_time = None)
   - 检查是否超过 FIRST_CALLBACK_DEADLINE_SECS (5秒)
   - 如果超过,报错:"录音启动后 X 秒内未收到回调"

2. **回调中途停止**(last_callback_time = Some)
   - 检查是否超过 CALLBACK_TIMEOUT_SECS (3秒)
   - 如果超过,报错:"录音回调静默停止 X 秒"

## 技术细节
- 在 StreamState 中添加 stream_start_time 字段
- 在 watchdog 中使用 match 语句区分两种情况
- 5 秒首次回调截止时间足够慢启动设备,但能捕获永不回调的失败

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 21:39:52 +08:00
cooperandClaude Sonnet 4.6 2050524cbf fix: 根据 code review 修复三个问题
根据 code review 反馈,修复以下问题:

## 1. High: 超时后未清理 ASR session
- 在全局超时分支中添加 asr.cancel() 调用
- 避免 websocket/read tasks 继续运行造成资源泄漏
- 影响文件:coordinator.rs (dictation 和 QA 路径)

## 2. Medium: QA 路径缺少超时保护
- 为 QA 路径的 await_final_result() 添加相同的超时保护
- 保持 dictation 和 QA 路径的一致性
- 影响文件:coordinator.rs:2288-2298

## 3. Medium: Watchdog 误报慢启动设备
- 将 last_callback_time 初始化从 Some(Instant::now()) 改为 None
- 只有在第一次回调后才开始计时
- 避免慢启动设备被误判为"静默停止"
- 影响文件:recorder.rs:333

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 19:43:34 +08:00
cooperandClaude Sonnet 4.6 e0d459bbd0 fix(recorder): 添加 liveness watchdog 和全局超时保护以修复 #238
根据 Issue #238 的分析,录音器异常停止后会导致胶囊卡在 processing 状态。
本次修复实施了两层防护机制:

## 修复 1: Recorder Liveness Watchdog
- 在 StreamState 中添加 last_callback_time 字段跟踪最后一次回调时间
- 在 process_callback 中更新时间戳
- 在 run_audio_thread 中启动 watchdog 线程,每秒检查一次
- 如果 3 秒没有回调,主动触发 runtime_error 通知 coordinator
- 解决了"录音回调静默停止"的根本问题

## 修复 2: Coordinator 全局超时保护
- 添加 COORDINATOR_GLOBAL_TIMEOUT_SECS = 15 秒常量
- 在 end_session() 中为 await_final_result() 和 transcribe() 添加超时保护
- 超时时强制恢复到 Idle 状态,显示错误胶囊
- 作为最后的防线,即使 ASR 超时机制失效也能恢复

## 技术细节
- Watchdog 使用独立线程,避免阻塞主线程
- 超时时间设置为 15 秒(比 ASR 的 12 秒 FINAL_RESULT_TIMEOUT 稍长)
- 保持与现有错误处理机制的一致性

Fixes #238

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 19:06:08 +08:00