Work Summary
本周期(2月16日-18日)工作集中在 fenshululu 项目,共 44 条有效交互记录。主要战场是语音识别(STT)功能的端到端调试,从后端 API 400 错误、音频格式兼容性问题到 STT 服务全部失败,经历了完整的排查链路。
第二条主线是对 E2E/BDD 测试质量的深度反思。在语音识别功能调试过程中发现,已有的测试用例未能覆盖实际 bug(音频格式校验、STT 服务降级),根因是测试中存在 mock 代码导致测试与真实行为脱节。由此触发了一次测试策略改造计划,目标是消除 mock 依赖,建立真实的端到端验证流程。
此外还处理了 config.yaml 模板语法清理、数据库 seed 补充、服务状态检查等日常运维工作。
Improvement Areas
1. STT 服务集成缺乏容错设计
现象:语音识别功能上线后,出现 "all STT services failed" 错误,音频格式校验不完整(webm 格式未正确处理),多次重启才恢复。
根因:STT 服务集成层缺少健康检查、格式预校验和降级策略。错误信息不够具体,排查耗时长。
行动项:
- 为 STT 服务添加启动时健康检查(probe),fail-fast 暴露配置问题
- 在 API 入口层增加音频格式白名单校验,返回明确错误信息
- 实现 STT 服务的 circuit breaker 模式,单个服务失败时快速切换
2. E2E 测试中 Mock 滥用导致测试失效
现象:BDD/E2E 测试全部通过,但实际功能存在严重 bug(音频格式 400 错误)。测试形同虚设。
根因:测试中 mock 了关键的外部服务调用,导致测试只验证了 "mock 返回了预设值",而非真实行为。这是典型的 testing antipattern。
行动项:
- 清理所有 E2E 测试中的 mock 代码,改用真实服务或 test container
- 建立测试分层规范:unit test 可 mock,E2E/BDD 禁止 mock 外部服务
- 增加 CI 检查:扫描 E2E 测试目录中的 mock/stub 关键词,发现即阻断
3. 缺乏自动化端到端验证手段
现象:多次尝试用 curl、CDP 协议、Playwright 等方式验证语音识别功能,流程不顺畅,反复切换工具。
根因:项目缺少标准化的 E2E 验证流程,特别是涉及文件上传、多媒体处理的场景没有自动化方案。
行动项:
- 建立基于 Playwright 的 E2E 测试套件,覆盖文件上传类功能
- 准备标准测试音频文件(wav/mp3/webm),纳入测试 fixtures
- 在 Makefile 中添加
make e2etarget,一键运行端到端验证
4. 调试效率:日志和错误信息不够结构化
现象:排查过程中多次需要"看最新日志"、"重启一下"、"再试试",说明日志信息不足以快速定位问题。
根因:错误日志缺少上下文(请求 ID、音频格式、文件大小等),需要多次交互才能拼凑完整信息。
行动项:
- 为 STT 相关 API 增加结构化日志(request_id, audio_format, file_size, stt_provider, latency)
- 错误响应体中包含 trace_id,方便从前端错误直接关联后端日志
Strengths
- 问题追踪韧性:语音识别问题经历多轮排查,没有放弃,最终定位到根因并修复
- 测试反思意识:主动发现测试未覆盖 bug 后,立即反思测试策略并制定改造计划,而非仅修复当前 bug
- 工具探索精神:尝试 CDP 协议、Playwright 等多种自动化验证手段,寻找最佳实践
Action Items
- P0 - 清理 E2E 测试中所有 mock 代码 → 测试能真实反映功能状态
- P0 - STT 服务添加健康检查和格式预校验 → 启动时暴露配置问题
- P1 - 建立 Playwright E2E 测试套件(含音频上传场景) →
make e2e一键验证 - P1 - STT API 增加结构化日志和 trace_id → 排查时间减半
- P2 - 编写 ADR 记录测试策略改造决策 → docs/adr/003-e2e-no-mock.md
Tech Trends
今日 HackerNews 热门技术话题精选。
1. Using go fix to modernize Go code
Points: 278 | Comments: 63
Go 1.26 发布了完全重写的 go fix 子命令。新版 go fix 使用一套算法识别代码中可以改进的地方,通常是利用语言和标准库的新特性来现代化代码。文章介绍了如何使用 go fix ./... 一键更新整个项目,推荐在每次升级 Go 工具链后运行。还介绍了 "self-service" 分析工具的理念,帮助模块维护者编码自己的最佳实践。
Key Takeaways:
- 每次升级 Go 版本后运行
go fix ./...,从干净的 git 状态开始,方便 code review - 使用
-diff标志预览变更,go fix -diff ./... - 可以编写自定义 fix 规则,编码团队内部的代码规范
2. Claude Sonnet 4.6
Points: 855 | Comments: 754
Anthropic 发布 Claude Sonnet 4.6,号称最强 Sonnet 模型。在编码、计算机使用、长上下文推理、Agent 规划等方面全面升级。OSWorld 基准测试显示,Sonnet 系列在 AI 计算机使用能力上持续进步,已接近人类水平完成复杂的电子表格操作和多步骤 Web 表单填写。定价与 Sonnet 4.5 相同($3/$15 per million tokens),1M token 上下文窗口进入 beta。
Key Takeaways:
- Sonnet 4.6 在实际任务中常被偏好超过 Opus 4.5,性价比显著提升
- 计算机使用能力大幅进步,可用于自动化传统软件操作
- 对 AI Agent 开发者来说,更强的 planning 能力意味着更可靠的多步骤任务执行
3. Async/Await on the GPU
Points: 154 | Comments: 45
VectorWare 宣布在 GPU 上成功实现 Rust 的 async/await。传统 GPU 编程聚焦数据并行(所有线程做相同操作),而 warp specialization 引入了任务并行但需要手动管理并发。文章对比了 JAX(计算图模型)、Triton(块级抽象)等方案,提出用 Rust 的 Future trait 在 GPU 上实现结构化并发,让开发者用熟悉的 async/await 语法编写高性能 GPU 程序。
Key Takeaways:
- GPU 编程正从纯数据并行向任务并行演进,async/await 是自然的抽象层
- Rust 的零成本抽象理念延伸到 GPU 领域,值得关注 GPU-native 编程范式的发展
- 对 ML 推理服务优化有潜在影响,更灵活的 GPU 调度可能提升吞吐
4. Pg-typesafe: Strongly typed queries for PostgreSQL and TypeScript
Points: 43 | Comments: 18
一个为 PostgreSQL + TypeScript 提供强类型查询的库。通过类型推导确保 SQL 查询的参数和返回值在编译期类型安全,减少运行时错误。
Key Takeaways:
- 类型安全的数据库查询是趋势,Go 生态中 sqlc 是类似思路
- 编译期捕获 SQL 错误比运行时发现成本低得多
5. Sonarly (YC W26): AI agent to triage and fix production alerts
Points: 25 | Comments: 9
YC W26 项目,用 AI Agent 自动分诊和修复生产告警。将 AI Agent 应用于 DevOps 领域的 on-call 场景。
Key Takeaways:
- AI Agent 在 DevOps 领域的落地方向:告警分诊、根因分析、自动修复
- 与你的安全检测引擎领域有交叉,可关注其 Agent 架构设计
Learning Resources
测试策略与 Mock 反模式
- Show HN: Finic - Open source platform for building browser automations
- Why Playwright Is Dominating Browser Automation: A Deep Dive
语音识别与 STT 集成
- Show HN: Phi-3-MLX - Language and Vision Models for Apple Silicon
- Show HN: Integration of ChatGPT+Stable Diffusion+Eleven Labs APIs