产品支持生命周期

发版 → 升级 → 诊断 → AI 分析 → 答复:五段一条链,最后一步你自己就能看到。

🛟 五段一条链

每段都写清:做法、判据、产物、细则在哪。

阶段做法判据产物细则
1. 开发发版
构建与发布
• 版本唯一权威:MRRC.iss → 安装目录 version.txt
• 发布前三道闸门:单元测试(含内联 JS 语法守卫)、全站结构审计、产物级热修验收 3/3
• Windows 包在真实 Windows 上构建(WDSP DLL → PyInstaller → Inno)
• 站点维护 latest.json(升级)与 patch.json(热修)
判据 = 服务器侧 SHA256 与清单一致(本机下载链路不可信)MRRC-Setup.exe · MRRC-Setup-<ver>.exe · 上一版归档(三者都必须在 git 里)· latest.json · patch.json发版流程 · 全站审计工具
2. 版本升级
一次点击,或重启即热修
• 页面菜单 ⬆️ 软件更新 →【立即升级】,或在启动器窗口输入 U
• 后台下载(SHA256 校验 + 原子改名)→ 停服务 → 一次 UAC → 静默安装 → 自动重启
• 【回退到上一版】走同一条路径
• 热修通道覆盖 www/**、可热修模块与 vendor:重启即生效、无需重装
成功判据:state.json.lastResult.status == "ok"(由新版本自己在启动时自证)updates/state.json、upgrade.request、updates/install-<ver>.log一键升级与排障 · 10 个 Windows 陷阱(RC-002) · 可热修范围
3. 问题诊断
一键诊断包
• 菜单 🐞 遇到问题 → 填现象 → 一键生成诊断包
• 包含日志尾部 + 脱敏配置(白名单、密钥替换)+ 环境快照 + 自动体检摘要
• 永不打包:用户数据库、证书与私钥、会话密钥;**只有用户点击才上传**
• 摘要要能一眼读:数据新鲜度、音频健康、热修/WDSP 状态、启动次数与时间跨度(区分重启与崩溃)、音频设备判定
判据 = 用户和维护者都能不读原始日志就分清"环境问题"与"产品缺陷"diagnostics/summary.txt · diagnostics/env.json · logs/ · state/config-redacted.ini诊断包与自动分诊
4. AI 分析
定时、证据优先
• 定时任务轮询接收端 → 取新上报 → 生成摘要 → 交给项目 AI(带分诊 skill)分析
• skill 固定判定纪律:保守判定、无证据不下结论、环境类不算缺陷、每条答复必须可执行
• 产出结构化 JSON(verdict/status/category/diagnosis/solution/evidence/keys)
• 护栏:幂等、默认不发布、半包跳过、单轮上限、超时控制、适配 cron 的窄 PATH
材料不足 → need_more_info(绝不猜);确认缺陷 → needs_code_change + 文件/函数dist/support_answers/<编号>.{digest.md,answer.json,card.html} + 已发布的答复卡自动分诊工具 · 分诊 skill
5. 回复解决
公开、可搜索、自助解决
• 每条结论成为一张答复卡:编号 / 症状 / 诊断(附证据)/ 结论 / 你要做的 / 状态
• 发布到公开答复页:按编号或关键词搜索,#编号 直达并自动填入搜索框
• 已知问题卡面向用户看到的现象写(例:"🐞 页面按钮点不动" → 重启 MRRC 拉热修即修复)
• 确认是缺陷:先给临时规避,再修代码;能热修就热修,否则发版;卡片随后标注"已修复 · 版本号"
判据 = 用户照着卡片就能自己解决;不能解决的,带着已定位的证据进入修复流程website/answers/index.html(公开),一个上报编号一张卡公开答复页 · 功能页 → 支持生命周期

✅ 闭环不变量(可直接当验收清单)

  1. 安装版本唯一权威 = version.txt;升级成功唯一判据 = lastResult == "ok"。
  2. 每次发布都有可用的回退目标(已入库,且不是已知有问题的版本)。
  3. 发布前三道闸门:单测 + 内联 JS 守卫、全站审计、产物级热修验收。
  4. 热修范围是明确的(www/**、可热修模块、vendor);其余一律发版。
  5. 诊断包永不包含用户数据库 / 证书 / 密钥,且只有用户点击上传才离开本机。
  6. 自动分诊默认不发布、幂等,材料不足一律 need_more_info。
  7. 每条答复都可被用户照着做,并可按上报编号检索。
  8. 每次事故都要留下一条守卫(测试 / 工具 / 检查),否则不算修完。

🛡️ 事故驱动的守卫

每次事故都要留下一条守卫 —— 没有守卫就不算修完。

事故新增的守卫
IOLoop 楔死 / 蓝牙 DAC 致 TX 静默(RC-001)心跳看门狗 + 线程栈转储 + 发射初始化耗时打点
升级链路 10 个静默失效(RC-002)10 项修复 + 回归测试 + "新版启动自证成功"
打包漏 upgrade_core → /api/update 报 ModuleNotFoundError加入 spec 的 _APP_MODULES;规则:函数内新 import 的模块必须登记
GBK 控制台 emoji 杀死日志转发线程启动器 stdio 统一 UTF-8 + _safe_print + 行缓冲
页面少写一个引号 → 整页按钮失效(6.1.12)内联 JS 语法守卫:所有页面逐段 node --check
站点漂移:断链 / 样式不统一 / 中文滞后dev_tools/site_audit.py + 严格模式测试接入测试套件

🚪 入口