从 2024 年 10 月的第一行代码到 2026 年 9 月的 V6.0.2:六阶段演进、五类反复出现的问题、被证明有效的方法、验证手段的演化,以及面向未来的展望。所有结论由 git 全史与版本记录写成——没有回忆,没有美化,只有证据。
本仓(UHRR_mac,2026-03-06 起)206 commits;父项目 UHRR(2024-10 起)约 208 commits。合计 400+ 次提交、35 个版本。
3月 48 / 4月 4 / 5月 35 / 6月 32 / 7月 1 / 8月 55(最狠月份)/ 9月 31。低谷期是"用出来的"——产品在真实通联中跑,问题在积累。
2026-08-09 单日 5 个版本(V5.7.1 → V5.8.2):RagChew 修复、ATR SWR 守卫、IOLoop 去阻塞、线程错位修复,一场集中爆发的大整修。
树莓派/Linux(父项目)→ macOS(本仓起点,2026-03)→ Windows 安装包(V6.0.0,2026-09)。一套代码三个平台。
每个阶段都由 git 提交链直接写成。
每一类都有"修了多次才根治"的完整故事。
| 时间 | 战役 | 修的什么 |
|---|---|---|
| 2026-03-06 | ba66892 / 1a072b3 | TX 主线程阻塞、ATR 广播线程安全 |
| 2026-03-07 | d4a40c2 | 新架构回滚(过度工程化的代价) |
| 2026-08-09 | V5.8.1 / V5.8.2 | rigctld I/O 进执行器(F3)、MAIN_IOLOOP 固定 |
| 2026-08-28 | F2 | stream.write() 挪出 IOLoop |
| 2026-09-14 | RC-001 F4/F4b | 构造函数 p.open()——最后一个漏网的阻塞点 |
RNNoise → WDSP → EMNR Gaussian 重写(数码音)→ 采样率之争(水音)→ NR2 SSB 语音保护(吃语音,C 补丁)。从"听着不对"进化到四个指标断言:voiceΔ / noiseΔ / LSD / jitter。
ATR-1000 的 SYNC 节流、防断连、学习污染、SWR 守卫,加上蓝牙 DAC——模式是同一套:代理隔离 + 缓存应答 + 压力控制 + 异常观测。协议边界永远假设对端会卡。
PTT Safety Monitor(释放失败重试 + TOT 硬上限)、5 秒无帧收 PTT、方向感知状态机(R3)、SWR>2 自动调谐守卫、RC-001 丢弃路径强制释放。软件状态可能骗你,电台不会——判据最终下沉到物理量。
RC-001 首次把根因钉在系统外:杂牌蓝牙固件不应答 Jitter Buffer 配置(error 312)→ CoreAudio 全局阻塞 → 拖住无关的 USB 声卡。观测手段随之装进系统层(unified log / bluetoothd / 功率计 A/B)。
每条都有提交或文档证据;并诚实列出没有证明有效的做法。
| 做法 | 证据 | 判定 |
|---|---|---|
| spec → design → plan → tasks 链条 | 08-28 录音四连提交、09-13 NR2 任务 1-6 | ✅ 复杂改动零返工 |
| 红绿验收(先写会失败的基线) | 3dc6319 "基线均失败" → 任务逐个通过 | ✅ 感觉型质量的唯一可靠路径 |
| 指标化音频评估(A/B + 拉丁方 + 四指标) | 09-13 全套 NR2 验收 | ✅ 耳朵会漂移,指标不会 |
| Postmortem 文化 | PTT_Audio_Postmortem → RC-001 案例编号制 | ✅ 事故变资产 |
| revert 纪律 | d4a40c2、dab904a 两次果断回滚 | ✅ 新不如旧就退 |
| 功能裁剪 | V5.7 删 FT8/CW 后整体更稳 | ✅ 功能熵与可靠性负相关 |
| CHANGELOG + tag 纪律 | 35 个版本全程记录 | ✅ 本复盘的数据基础 |
| 数据即真相 | ATR 功率计判调制(软件每层都"正常"时) | ✅ 物理量击穿日志幻觉 |
| code-first docs + audit | docs/current/ + 交叉核对 | ✅ 文档不过期 |
| 大而全的新架构重构 | 两次回滚(AudioWorklet/Worker、缓冲策略) | ❌ 未证明有效 |
| 无验收标准的"优化" | 多次音质回归后靠用户耳朵报警 | ❌ 未证明有效 |
方向始终一致:离物理真相更近,离猜测更远。
手工试错(父项目早期)——有什么修什么。
日志 + 功率计观察(V4.5 ATR saga)——第一次用设备读数对照软件行为。
spec/plan + 手动验收(V5.x)——复杂改动开始有文档链。
红绿测试 + 四指标 + A/B 试听(V6.0.1)——感觉型质量变成测试断言。
运行时遥测(V6.0.2)——IOLoop 看门狗 / ⏱️ 耗时打点 / .prev 死亡现场轮转。
环境 A/B 隔离实验(V6.0.2)——断开蓝牙 DAC 对照,11 段发射全部正常调制。
每一条都由真实事故或回归换来。
修点不修面,问题会换着面孔回来。线程阻塞修了 5 次才变成纪律。对反复出现的同类问题:枚举所有可能点 + 立规矩 + 装探针,而不是等下一次事故。
异步化移动 bug,不消灭 bug。每把一个阻塞点挪出关键线程,必须先回答"阻塞窗口内到达的数据和事件去哪了"。
环境问题不等于代码问题。改代码之前,把观测做到系统边界(OS 日志、硬件读数)。ATR 功率计和 bluetoothd 日志比任何 Python 日志都更快定位真相。
物理量是终极断言。软件每一层都可以"看起来正常",发射功率不会撒谎。怀疑软件链路时,先找一个硬件读数对照。
1 人 + AI 的形态被验证了,但纪律不能省。AI 加速的是执行,不是判断;没有纪律的 AI 加速只是把债还得更快。
减法是架构能力。删 FT8/CW、两次回滚、菜单瘦身——每次"砍"都对应可靠性或可用性的上升。敢于删功能的项目才有长期演进空间。
文档的复利。CHANGELOG 35 版 + 案例库 + code-first docs,让这份复盘完全由数据写成——没有回忆,没有美化,只有 git 里的证据。
本复盘的数据源:git log、CHANGELOG.md(35 个版本)、RC-001 可靠性案例、FDE 实践指导书、阿拉丁 V2 方法论——全部开源在 GitHub。