P0 任务分解(汇报口径)¶
| 版本 | v1.0 / 2026-07-24 |
| 用途 | 向上汇报的任务分解:P0-B2 有哪些大块、每块的量化目标。执行层工单另行拆分,不在本文 |
| 依据 | 北极星、技术方案 v2.0、ADR-0001~0014 |
P0-B2(热修通道建设与首次真实修复,Week 3~6)分为 七个大块。前四块互相独立、可并行启动;第五块被外部依赖阻塞;第六块与前四块并行;第七块是总验收。
大块一:跨平台决策引擎与共享契约¶
做什么:热修的全部策略判定收敛为一个纯函数模块——验签、清单单调性、过期、基线匹配、灰度分桶、exclude、本地隔离、幂等、urgent、回退阈值;配一份双端共享的测试向量(契约)。这是其余各块的共同前置。十项判定逐条讲什么、防什么,见附录:十项判定详解。
量化目标:
- 10 项判定全部落地,每项有独立单元测试;
- 攻击与边界场景用例 ≥ 20 条全绿(篡改签名 / 旧清单重放 / 过期清单 / 基线不匹配 / 分桶 0%·100%·边界稳定性 / 隔离命中 / 逃生门 / 回退阈值达到与未达);
- 1 套共享测试向量在 Windows 侧与 CI 侧同时跑通(契约测试,ADR-0010)。
大块二:Windows 客户端改造¶
做什么:在 LiveUpdate 机器上加热修模式(ADR-0007):验签插入、Copy.exe 事务化、换后首启监视、启动标记、隔离名单、完整升级解除武装、优雅退出、传输加固、崩溃注解——共 13 项改造(技术方案 §4.1)。
量化目标:
- §4.1 改造清单 13/13 完成;
- 替换事务 3 类场景测试通过(全部成功 / 中途失败回滚 / 复核失败回滚),不留半新半旧状态;
- 测试机上模拟"坏热修起不来":首启监视 + 启动标记自动回退成功率 100%,回退后隔离名单生效(同一坏热修不再被应用);
- 端到端演练 1 次跑通:下载 → 验签 → 替换 → 重启 → 坏热修自动回退 → 上报。
大块三:macOS 客户端(Sparkle + 看门狗)¶
做什么:Sparkle 接入(Obj-C++ 桥、动态 feed、签名公证)+ LaunchDaemon 回退看门狗 + safe bundle 备份(ADR-0010、Sparkle 集成指南)。
量化目标:
- 用真实旧版本完成 1 次完整更新链路测试(检查 → 下载 → 验签 → CEF 干净退出 → 替换 → 重启新版本);
- 集成指南检查表(签名/公证/CEF 多进程)全项通过,含一台干净 Mac 上的最终验证;
- 看门狗回退演练 1 次成功(模拟启动标记连续未清 → 自动换回 safe bundle);
- 用户感知全程 ≤ 1 次管理员密码输入(首装/首更授权,之后全静默)。
大块四:CI 两条流水线¶
做什么:包流水线(hotfix 类型、Ed25519 签名、契约测试 + TEST_MODE 自动化门槛、失败通知)+ 新增清单流水线(灰度参数 → 签清单 → 发布 → 飞书广播),ADR-0013。
量化目标:
- 包流水线端到端跑通,产物经客户端验签通过;自动化门槛验证:故意注入坏产物,流水线必须拦截;
- 清单流水线三类操作各演练 1 次(放量 / 归零 / 强制回滚),从触发到新清单签发 ≤ 10 分钟;
- 每次发布/放量/回滚动作,飞书广播 100% 可见;两条流水线失败通知均触发验证 1 次。
大块五:服务端清单接口与灰度下发 ⚠️ 阻塞于 Q1¶
做什么:app-api 家族新增热修清单接口,灰度参数存储与下发。
量化目标:
- 清单接口上线,客户端拉取 + 验签通过;
- 缓存行为实测:percent 归零后,新清单到达客户端 ≤ 15 分钟(这是"分钟级止血"的服务端前提;若实测不满足,回滚设计需按 Q1 预案调整);
- 前置动作(本周即可做):找到下发服务归属人,拿到 7 个问题的答案或源码。
大块六:遥测与告警¶
做什么:6 类热修事件上报、命中/未命中分组看板、主警报飞书阈值告警、崩溃报告热修版本注解(ADR-0012)。
量化目标:
fetch/verify/firstboot/swap/rollback/quarantine6 类事件全部上报且在 ELK 可查;- 看板支持按热修版本聚合 + 命中 vs 未命中分组对比;
- 主警报告警演练 1 次(模拟阈值触发 → 飞书推送值班人);
- 崩溃报告可按热修版本(5 段号)过滤;
- 硬性门槛:以上全部就绪是首次真实热修的前置条件(没有仪表盘不上路)。
大块七:端到端演练与首次真实修复(P0-B2 总验收)¶
做什么:全链路演练一次,然后等待真实 P0/P1 故障完成首次实战。
量化目标(即北极星的通过判定):
- 完整演练 1 次:canary(内部机)→ 10% → 全量 → 强制回滚,全程按 技术方案 §3.8 时序走通;
- 真实 P0/P1 站点故障修复 1 次:故障确认后 D+1 全量送达;
- 质量护栏全部守住:热修引入的新 P0/P1 故障 = 0、签名覆盖率 = 100%、跳过 canary 次数 = 0。
依赖与风险一览(汇报用)¶
| 外部依赖 | 阻塞什么 | 状态 |
|---|---|---|
| Q1 下发服务接口与缓存 | 大块五全部、大块四清单流水线的落点 | 待找归属人(最高优先) |
| Q2 PRD 三处出入 | 评审口径(含审批流变更需产品确认) | 待产品负责人 |
| Q10 通知后台公告能力 | 故障公告方案(ADR-0011)的运营侧前提 | 待通知后台负责人 |
| Q3 主 exe 体积实测 | 下发带宽评估(不阻塞开发) | 客户端开发顺手测 |
时间窗对照(北极星):大块一~四、六 = Week 3~4 开发;大块二/三的演练 + 大块七演练 = Week 5 测试;大块七实战 = Week 6+ 上线运行。
附录:大块一展开——决策引擎的十项判定¶
决策引擎像机场安检:一份清单(服务端发来的"有热修 X,请更新")到达客户端,要连过十关才会被执行;任何一关不过,就地拒绝或跳过。它是个纯函数——不联网、不碰文件、不拉进程,进去的是"清单 + 本机状态",出来的是"应用 / 跳过 / 拒绝 + 原因码"——所以每一关都能穷举测试,这正是大块一"攻击与边界用例 ≥ 20 条"要测的东西。
十关分四组。
第一组:这份清单可信吗?(安全三关,不过 = 拒绝)¶
| # | 判定 | 问的问题 | 防什么 |
|---|---|---|---|
| 1 | Ed25519 验签 | 这份清单和文件,真是我们盖的章吗? | 防投毒:CDN/下发通道被攻破塞假热修——没有私钥盖的章,内容再像也是废纸(ADR-0003) |
| 2 | 清单版本单调性 | 这份清单比我见过的最新的还新吗? | 防"重放降级":攻击者把旧的合法清单再发一遍,想把用户退回有漏洞的老版本。编号只认比上次大的 |
| 3 | 过期时间检查 | 这份清单过保质期了吗? | 防"冻结":攻击者永远喂同一份旧清单,让用户停在旧状态、错过后续修复 |
第二组:该不该装到我这台机?(定向五关,不过 = 跳过)¶
| # | 判定 | 问的问题 | 大白话 |
|---|---|---|---|
| 4 | 基线版本匹配 | 这个热修是给我这个版本的吗? | 7.0.4.1 的热修不能装到 7.0.3.9 上——exe 必须和已装资源严格配套(ADR-0002) |
| 5 | 灰度分桶 | 这轮放量,轮到我了吗? | hash(分桶种子+热修ID)%100 < percent,抽签抽中才装;没中就等下轮 percent 提高。应用即粘住(ADR-0004) |
| 6 | exclude 名单 | 运营有没有点名把我排除? | 客服处理个例:某台设备特殊,按 machine_id 排除 |
| 7 | 本地隔离名单 | 这个热修曾把我搞坏过吗? | 被它坑过、自动换回过 → 拉黑,哪怕签名合法、分桶命中也不装,直到更新的修复版取代它。防"换回后又被灌回来"的死循环(ADR-0004) |
| 8 | 幂等判定 | 我现在跑的,是不是已经就是清单要的? | 比对文件哈希,一致就"您已到达目的地",记个账、什么都不做。强制回滚广播全员时,没中招的大多数靠这关不被白折腾(ADR-0013) |
第三组:怎么装?(一关)¶
| # | 判定 | 问的问题 |
|---|---|---|
| 9 | urgent 判定 | 装好后要不要提醒用户重启?读清单的加急戳:标了就弹轻提示(守"下载中不打扰、最多提示 1~2 次"),没标就完全静默等自然重启(ADR-0005) |
第四组:装坏了要不要撤?(一关,审的不是清单,是自己)¶
| # | 判定 | 问的问题 |
|---|---|---|
| 10 | 启动标记回退判定 | 看自己的"体检记录":启动标记连续未清的次数到 3 了吗?到了就输出"回退"决策——由外部执行者(liveupdate / 看门狗)把 safe 版换回来,并把该热修写进第 7 关的隔离名单(ADR-0004、ADR-0009) |
为什么把十关捏在一个模块里¶
它们是热修通道全部的安全与灰度大脑,且都能做成"给输入、看输出"的纯逻辑——篡改的清单、重放的旧清单、边界百分比、隔离命中……每种攻击都能直接构造成测试用例,在流水线里验完,不用等上线。Windows 自己实现十关;macOS 上第 1 关由 Sparkle 代劳、其余九关走同一套逻辑,两端靠同一份测试向量保证行为一致(ADR-0010 的共享契约)。