diff --git a/docs/任务规划/README.md b/docs/任务规划/README.md index 429aaa66..b1f49bdb 100644 --- a/docs/任务规划/README.md +++ b/docs/任务规划/README.md @@ -73,7 +73,7 @@ | 结构 / 健壮性 | 5 | N-22(写回 flush)· N-23(注册校验残余白名单)· N-25(性能/语义簇)· N-28(Flash 死代码簇)· **N-33(栈余量收口,W1)** | | 仓库 | 1 | N-29(`.git` **235 MB**,**已决策暂不处理、登记观察**) | | 硬件 | 1 | N-18(V0.2 改版项) | -| 测试 / 基础设施 | 6 | T-7(CI runner + 推送闭环 + 第二机交叉验证)· S12(断言宏)· S1-c(可选单测)· A-4(采集链路测试约束,RS485 侧随 B2 暂缓)· A-5 残余(CI 体积门禁盲区)· D7(串口助手 A6/A7 待 CH340) | +| 测试 / 基础设施 | 5 | T-7(CI runner + 推送闭环 + 第二机交叉验证)· S12(断言宏)· A-4(采集链路测试约束,RS485 侧随 B2 暂缓)· A-5 残余(CI 体积门禁盲区)· D7(串口助手 A6/A7 待 CH340) | | UI | 1 簇 | U 簇(27 页标准化,**本轮不排期**) | | **暂缓** | 2 簇 | **B2 RS-485 整簇**(2026-10-12 用户决定,`暂缓-RS485.md`)· **N-27 内存优化簇剩余部分**(2026-10-15 用户裁定:R-2 后半 / R-3 / R-4 / R-6 不排期,理由与重开条件见 `../问题记录/项目审查与优化建议报告.md` §5.3;**已落地的 R-9 与 `mem-budget` 门禁、台账、趋势、观测不回退也不暂缓**) | | **数据可信(W8)** | 1 簇 · **14 张卡** | 已知电压注入验证 · 端子变比确认 · 通道标定系数与折算 · 标定落盘 · 未标定即闭锁 · 下游三常数重定 · 量纲回归 · 遥测快照 200 ms · 运行参数段 · 频率点绑定(详表 `W8-数据可信.md`) | @@ -108,7 +108,7 @@ | **W8 数据可信** | **通道标定 → 遥测链 → 运行参数**:M4 系数与量纲 / M5 遥测链 / M6 运行参数与点表;14 张卡与事实基线见 `W8-数据可信.md` | **用户决定(2026-10-23):下一步做通道标定,先于 UI 页面与结构债**。它是唯一"改一处、全链受益"的入口(`App/task/adc_task.c:335` 是码值→工程量的唯一位置),也是 W6 页面与 104 遥测的共同前置——先做页面则 `ui_data_feed` 组装的码值帧要返工。**编号是分配序,执行序以本表从上到下为准**:本波紧随 W1,排在 W3/W4 之前。⚠ 2026-10-23 补记:ADC 至今**从未采过已知电压**(连极性都没验过,见 `W8-数据可信.md` §2.6),故第一张卡是"已知电压注入验证"——只需一块万用表,不需要信号源/示波器,是开工的第一刀 | | **W3 预算与内存** | ⏸ **整簇暂缓**(用户裁定 2026-10-15):~~缩堆 56→32 KB → R-2 后半(29.5 KB→CCM)→ R-3 / R-4 / R-6 逐项评估~~。本簇已落地的只有 **R-9 ✅(2026-10-15)**;R-5 已判定不可行 | **不再排期**:没有功能在等这块预算,而搬迁要动 scatter、要逐条过 DMA 可达性清单、缩堆还要上板复测。**W3 槽位保留、不重编号**(避免全库改 W4~W7 引用)。重开条件 → `../问题记录/项目审查与优化建议报告.md` §5.3 | | **W4 结构债** | **C6(S-3)→ C3(N-2)→ C1 net 层跨上下文收口 → C5(含 N-23 残余)→ N-22/N-25/N-28**(详表 `排期详述.md` §1) | 无紧急,按性价比排:C6 灭 IWDG 误复位机制根源;C1 消化 E-27/E-28(原 ACCEPT+SEND pending 化已收口),体量大、验证重,放后(N-23 钩子已落地 2026-10-12,残余并入 C5)。⚠ 原挂 C3 的 **N-24(日志逐条开关)已于 2026-10-15 单独修复销项**,C3 只剩 N-2 观察项 | -| **W5 验证常态** | P1-10 收尾 · T-7 CI · D2 N-3 · D5 N-16 · D6 N-17 · D7 串口助手 · S12 · S1-c · A-5(详表 `排期详述.md` §2) | 窗口性,逢机顺带,不单独排期 | +| **W5 验证常态** | P1-10 收尾 · T-7 CI · D2 N-3 · D5 N-16 · D6 N-17 · D7 串口助手 · S12 · A-5(详表 `排期详述.md` §2) | 窗口性,逢机顺带,不单独排期 | | **W6 UI 扩展** | U4 残余(golden + 字符集差集挂门禁)→ U1 令牌层 → U2/U3 → **27 页**落地 | 产品驱动、体量大,需单独立项(顺序按 `docs/问题记录/项目审查与优化建议报告.md` §6.5)。**2026-10-15 用户裁定启动**(覆盖 2026-10-11 的「本轮不排期」):已开智能体团队,第一波 **U1 令牌层 ∥ U4 门禁补强** 并行进行中;U3 为地基串行段(独占注册文件),U2/U5 排在 U3 之后 ⚠ **U5 暂缓(2026-10-20 用户裁定)**:剩余页面**已出规划(`docs/UI设计/页面补齐规划.md`,2026-10-23:27 个空叶子归并为 7 模块 + 2 项前置能力),但仍未排期**,本轮不补页 —— 现存 7 个 `ui_page_*.c` 即当前全部内容,报告"27 页"是目标数不可当差集清单。U1–U4 已全部落地,故 U5 未来开工时是纯增量活(实测新增一页 = 3 处人工 + 1 条生成器命令,且 `ui-golden` 已在提交门禁兜像素)。**2026-10-23 补充**:U5 的 `ui_data` / `ui_data_feed` 需要真数据才有意义,故 **U5 最早在 W8 的 M4 之后开工**(依据见 `W8-数据可信.md` §10) | | **W7 仓库决策** | **N-29** `.git` **235 MB** + 图片 36.3 MB | **已决策(2026-10-11):暂不处理、登记观察**——推送/协作前重评(`git filter-repo` 历史重写影响未推送提交与协作者) | | **暂缓** | **B2 RS-485 整簇**(`暂缓-RS485.md`) | **用户决定(2026-10-12):当前不处理 RS-485** | @@ -129,7 +129,7 @@ W3 预算 ⏸ 整簇暂缓(2026-10-15 用户裁定);R-9 池瘦身 ✅ ↓ W4 结构 C6(S-3) → C3(N-2) → C1 net 层跨上下文收口 → C5(含 N-23 残余) → N-22/25/28 ↓ -W5 验证 P1-10 · T-7 CI · D2/D5/D6/D7 · S12 · S1-c · A-5 +W5 验证 P1-10 · T-7 CI · D2/D5/D6/D7 · S12 · A-5 ↓ W6 UI U4 残余 → U1 令牌层 → U2/U3 → 27 页(单独立项,本轮不排期) W7 仓库 N-29 .git 149MB(已决策暂不处理) 硬件:N-18 V0.2 diff --git a/docs/任务规划/并行分道方案.md b/docs/任务规划/并行分道方案.md index fc59b3a3..af62818c 100644 --- a/docs/任务规划/并行分道方案.md +++ b/docs/任务规划/并行分道方案.md @@ -15,9 +15,12 @@ ## 1. 一句话结论 +> **起跑状态(2026-10-25 实测)**:`task list` 报"没有任务空间",`git worktree list` 只剩主树 → +> **3 个名额全空,批 1 可直接开三棵**。 +> 道C 已不含主机单测——S1-c 于 2026-10-24 销项(`test/host/sys_log_mcu/` 106 例 + +> `test/host/time_sync/` 4 例已落地),故道C 缩为"断言宏 + 门禁 + 构建实测"三件。 + ``` -批 0 回收在途分支(cov,已领先 10 提交) ← 必须先做,它占着一个工作树位 - ↓ 批 1 道A 标定与量纲 ∥ 道B UI 组件层 ∥ 道C 工具链与验证 ↓ 批 2 道D 遥测链 ∥ 道E UI 页面 ∥ 道F 结构债与网络 @@ -33,7 +36,7 @@ C6 独占一轮(USART1 TX-only,CubeMX 重生成,不能与任何分支并 |---|---|---|---| | **道A** | 标定与量纲(W8 M4,关键路径) | 1 | 域1+域2+域3+域4 | | **道B** | UI 组件层(等数据时先做的活) | 1 | 域5 | -| **道C** | 工具链与验证(单测/门禁/断言) | 1 | 域8 | +| **道C** | 工具链与验证(断言/门禁/构建实测) | 1 | 域8 | | **道D** | 遥测链(W8 M5/M6) | 2 | 域1+域4+域2 | | **道E** | UI 页面(27 叶 + 3 页回炉) | 2 | 域5 | | **道F** | 结构债与网络(C1/C3/N-17/N-22) | 2 | 域6+域7 | @@ -163,13 +166,12 @@ C6 独占一轮(USART1 TX-only,CubeMX 重生成,不能与任何分支并 | C3 / N-2 日志管线合并评估 | 域6 | **道F 结构债** | 2 | | N-22 写回缓存空闲 flush | 域6 | **道F 结构债** | 2 | | N-17 探针窗口心跳缺口(排期详述里的 D6) | 域7 + `App/sync/` | **道F 结构债** | 2 | -| C1 / E-25·E-27·E-28 net 跨上下文收口 | 域7 | **道F 结构债** | 3 | +| C1 / E-27·E-28 net 跨上下文收口 | 域7 | **道F 结构债** | 3 | | N-25 性能与语义簇(PASV/PHY/SOCKETS) | 域7 | **道F 结构债** | 3 | | S-4 dhara 重试自旋 | 域6 | **道F 结构债** | 3 | | S-5 全序列卷锁评估 | 域6 | **道F 结构债** | 3 | | `docs/任务规划/测试与架构专项.md` 的 P1-10 测试固件构建实测 | `MDK-ARM/` 测试配置 | **道C 工具链** | 1 | | S12 模块级断言宏 | `App/util/app_assert.h`(新增)+ 试点 | **道C 工具链** | 1 | -| S1-c `sys_log` / `time_sync` 主机单测 | `test/host/`(新增) | **道C 工具链** | 1 | | A-5 残余 CI 体积门禁盲区 | `.gitea/` + `scripts/` | **道C 工具链** | 1 | | N-3 / D2 L5 基线重锁 | 无码(需 PC peer) | **台架道** | 3 | | N-16 / D5 A2/A4 负向台架 | 无码 | **台架道** | 3 | @@ -219,16 +221,20 @@ C6 独占一轮(USART1 TX-only,CubeMX 重生成,不能与任何分支并 ### 5.3 道C「工具链与验证」(零交集) **目标**:补门禁与测试底座,让后两批的合并更安全。 -**含**:S12 断言宏 → S1-c 单测 → A-5 体积门禁 → 测试固件构建实测(详见 `docs/任务规划/测试与架构专项.md`)。 +**含**:S12 断言宏 → A-5 体积门禁 → 测试固件构建实测(详见 `docs/任务规划/测试与架构专项.md`)。 + +> **S1-c 已于 2026-10-24 销项,不再是本道内容**:`test/host/sys_log_mcu/`(106 例)与 +> `test/host/time_sync/`(4 例)已落地,且被 `test-coverage` 总闸(`^App/|^Drivers/BSP/|^test/host/`) +> 全量跑到,比专属钩子覆盖面更宽。证据见 `docs/测试说明/主机单测覆盖率口径.md` §9。 | 分支 | 内容 | 预计 | 写域 | |---|---|---|---| | `task/S12-assert` | `app_assert.h` + 1~2 处试点(`net_socket` 状态机不变量) | 0.5 d | `App/util/` + 域7 单点 | -| `task/S1c-host-tests` | `sys_log` / `time_sync` 主机单测 | 1 d | `test/host/`(新增 2 目录) | | `task/A5-size-gate` | 体积门禁的强制路径 | 0.5 d | `.gitea/` + `scripts/` | | `task/P1-10-test-fw` | CH395F 套件构建确认 + `@test` | 1 d | `MDK-ARM/` 测试配置 + 台架 | -**与谁撞**:`test/host/**` 与在途的 `cov` 分支同域 → **批 0 必须先回收 `cov`**(见 §6.1)。 +**与谁撞**:`test/host/**` 现由主工作树的 `test-coverage` 总闸统一守着,本道**不再新增** +`test/host/` 目录 → 与道A/道B 零文件交集。 ### 5.4 台架道(主工作树,不占工作树名额) @@ -253,37 +259,21 @@ C6 独占一轮(USART1 TX-only,CubeMX 重生成,不能与任何分支并 ## 6. 合并次序与冲突预判 -### 6.1 批 0:先回收在途分支(必做) - -现状(2026-10-23 实测 `task_worktree.py list`): - -``` -任务 分支 落后 领先 脏 台架 -cov task/cov-host-line-coverage 4 10 2 - -``` - -`cov` 是主机单测覆盖率扩展(60 个文件,`test/host/**` + `.pre-commit-config.yaml` + 文档), -**领先主干 10 个提交、落后 4 个、2 个文件未提交**。它占着 3 个工作树名额里的 1 个, -且与道C 的 `test/host/**` 同域。 - -**处置**:先 `sync cov` → 清脏文件 → `done cov`。理由不是"它更重要",而是 -**不回收它就没有第三个名额给道C**,且两条道同时加 `test/host/` 会让 `done` 的并集审计变复杂。 - -### 6.2 冲突矩阵(批 1 三道) +### 6.1 冲突矩阵(批 1 三道) | 文件 | 道A | 道B | 道C | 处理 | |---|---|---|---|---| | `MDK-ARM/*.uvprojx` | 加 `adc_cal.c` | 加 3 对 UI 文件 | 不动 | 每次 `done` 手工并 `` → `registration-check` | | `docs/内存管理/RAM使用分析与优化方案.md` | RAM +≈100 B | RAM +≈300 B | 不动 | 每次 `done` 后 `check_mem_numbers.py --write` | -| `.pre-commit-config.yaml` | 加 adc_cal 钩子 | 加 UI 钩子 | 加 2 个钩子 | 并集;三处各自 `git add` 自己的行 | +| `.pre-commit-config.yaml` | 加 adc_cal 钩子 | 加 UI 钩子 | 不动(S12 走既有 `coding-standard` 面) | 并集;各自 `git add` 自己的行 | | `scripts/check_layer_deps.py` | 不动 | **减 3 条基线** | 不动 | 道B 独占 | -| `test/host/**` | 新增 `adc_cal/` | 不动 | 新增 2 目录 | 目录不重叠,安全 | +| `test/host/**` | 新增 `adc_cal/` | 不动 | 不动 | 道A 独占(道C 已无单测活) | | `docs/任务规划/**` | 不动 | 不动 | 不动 | 主工作树统一销项 | **合并次序**:`道A → 道B → 道C`。理由是道A 在关键路径上、且它决定道D 与道G 的前置; 道B 与道C 无先后依赖,按"改动小的先合"以减少 rebase 面(道B 的 `ui-golden` 基线更新是独立提交,好回退)。 -### 6.3 每次 `done` 的固定动作 +### 6.2 每次 `done` 的固定动作 1. `done --dry-run` 预演(`git merge-tree`,rc≠0 就先在任务分支解冲突) 2. `done `:合入 → 并集残留审计(三方对比,不用 `tail` 目测)→ 重生成产物 → 门禁 @@ -302,32 +292,44 @@ cov task/cov-host-line-coverage 4 10 2 - --- -## 8. 执行清单(批 0 + 批 1 起步) +## 8. 执行清单(批 1 起步) ```powershell $PY = ".venv\Scripts\python.exe" $WT = ".dsh\skills\task-worktree\scripts\task_worktree.py" -# 批 0:回收在途分支(先 sync 再 done,done 只在主工作树) -& $PY $WT sync cov -& $PY $WT status cov # 看清 2 个脏文件是什么 -& $PY $WT done cov --dry-run -& $PY $WT done cov +# 批 1 道A(ID 必须唯一:台账按 ID 落盘,branch = task/-) +& $PY $WT new W8-scale doc +& $PY $WT new W8-adc cal +& $PY $WT new W8-lockout dim -# 批 1 道A -& $PY $WT new W8-scale-doc -& $PY $WT new W8-adc-cal # 批 1 道B -& $PY $WT new UI-font-subset -# 批 1 道C(等 cov 回收后再开) +& $PY $WT new UI-font subset +& $PY $WT new UI widgets +& $PY $WT new UI-rec reader + +# 批 1 道C & $PY $WT new S12 assert # 台架(在主工作树,验证已合入镜像) -& $PY $WT lock acquire bench --task W8-adc-cal +& $PY $WT lock acquire bench --task W8-adc # ……注入验证 / @test…… -& $PY $WT lock release bench --task W8-adc-cal --bench-pass +& $PY $WT lock release bench --task W8-adc --bench-pass ``` +> ⚠ **`new` 必须给两个参数**(` `),少一个直接 rc=3;**ID 不能重复**—— +> 台账是 `.state/.json`,同 ID 第二次 `new` 会报"任务已存在"。所以同簇多任务要靠 +> ID 区分(上面 `W8-scale` / `W8-adc` / `W8-lockout` 三段即三个不同 ID,分支名恰好是 +> `task/W8-scale-doc` / `task/W8-adc-cal` / `task/W8-lockout-dim`)。 +> +> ⚠ **活跃任务数按"台账 + 目录是否存在"统计**,不是按 git 注册表。遗留目录会让名额被白占—— +> 开工前先 `list` 确认没有 `` 显示 `? ?`(那是分支已删、目录还在的残骸)。 +> 处置:`& $PY $WT abort `;若该目录的 `.git` 已失效,`abort` 会停在 +> `失败:移除工作树失败:fatal: '' is not a working tree`(git 已不认识它), +> 此时脚本**不会**替你 `rmtree`,退化为"删目录 + 删 `.state/.json`"两件事, +> 删完补一条 `git worktree prune`。 +> **删前先确认目录里没有联接**(`.venv` / `simulator/SDL2`)——直接删会把主工作树的 `.venv` 带走。 + > 分支 ID 用语义 slug(`W8-scale-doc` / `UI-font-subset`),与 `docs/任务规划/README.md` §0 的 > "新条目用语义标识"一致;存量编号(N-x / S-x / C-x)仍可直接当 ID 用。 diff --git a/docs/任务规划/暂缓-RS485.md b/docs/任务规划/暂缓-RS485.md index 0ae7547b..2b9c9f25 100644 --- a/docs/任务规划/暂缓-RS485.md +++ b/docs/任务规划/暂缓-RS485.md @@ -7,6 +7,6 @@ |---|---|---| | **B2** | **RS-485 采集链路实现**(消化 E-50、E-49):双缓冲 + 序号(防包撕裂)+ DE 收尾(超时路径等 TC)+ ModBus RTU 状态机(`App/protocol/` 正是为此预留) | **E-59 门禁尚未满足**:先修 E-50(单缓冲包撕裂)、E-49(TX 超时拉 DE 未等 TC),修完驱动契约才允许接消费者 | | E-49 | RS485 DE 收尾(原 C5 一档剩余,已移出) | 同上 | -| A-4 RS485 侧 | 采集链路测试可验证性约束(双缓冲 + 序号、DE 超时路径覆盖,`测试与架构专项.md` §2.3) | 随 B2 设计文档落地 | +| A-4 RS485 侧 | 采集链路测试可验证性约束(双缓冲 + 序号、DE 超时路径覆盖,`测试与架构专项.md` §2.2) | 随 B2 设计文档落地 | | 待确认-3 | RS-485 PD0 DE 半双工方向语义硬件实测确认(`基线与待确认.md` §1 第 3 项) | 需硬件实测窗口 | | N-25 中 DE 项 | `HAL_Delay(1)` 阻塞 DE | 随 B2 | diff --git a/docs/任务规划/测试与架构专项.md b/docs/任务规划/测试与架构专项.md index 39bb535d..2dd41c3e 100644 --- a/docs/任务规划/测试与架构专项.md +++ b/docs/任务规划/测试与架构专项.md @@ -5,7 +5,9 @@ > 其他文档若引用这些编号,其证据见对应模块文档与 `git log`。已完成事项的证据沉淀: > `../测试说明/系统时钟单元测试说明.md`(S1-a)、`../测试说明/配置文件单元测试说明.md`(S1-b)、 > `../测试说明/测试开发标准流程.md` §4.2.1(L0.5 适格台账)、`../测试说明/模拟器差距清单.md`(S13)、 -> `../测试说明/实机测试实施指南.md`(S4/S5/S7/S9/S11)、`../问题记录/GD5F2GQ5UE_Trap_Records.md`(S9)。 +> `../测试说明/实机测试实施指南.md`(S4/S5/S7/S9/S11)、`../问题记录/GD5F2GQ5UE_Trap_Records.md`(S9)、 +> `../测试说明/主机单测覆盖率口径.md` §9「P1 落地」与「P2 落地」(S1-c:`sys_log_mcu` 106 例、 +> `time_sync` 既有 4 例,两套均已被 `test-coverage` 总闸覆盖)。 ## 1. P1 收尾(1 项:P1-10 剩构建实测闭环) @@ -24,9 +26,8 @@ | 编号 | 事项 | 状态 | 详述 | |---|---|---|---| | **S12** | 模块级轻量断言宏 | ⬜ 待做(第 4 波按需) | §2.1 | -| **S1-c** | `sys_log` / `time_sync` 主机侧单测 | ⬜ 可选(价值递减) | §2.2 | -| **A-4** | ADC / RS485 采集链路的**测试可验证性约束** | ⏸ ADC 侧随 B1 闭环;**RS485 侧随 B2 暂缓(`暂缓-RS485.md`)** | §2.3 | -| **A-5 残余** | CI 体积门禁盲区(`mem-numbers` 在 CI 被跳过) | ⬜ 未消除 | §2.4 | +| **A-4** | ADC / RS485 采集链路的**测试可验证性约束** | ⏸ ADC 侧随 B1 闭环;**RS485 侧随 B2 暂缓(`暂缓-RS485.md`)** | §2.2 | +| **A-5 残余** | CI 体积门禁盲区(`mem-numbers` 在 CI 被跳过) | ⬜ 未消除 | §2.3 | ### 2.1 S12:模块级轻量断言宏 ⬜ @@ -54,18 +55,7 @@ **完成判据**:宏存在 + 生产构建 `@build` 0/0 且 `.map` 无新增符号;试点处有实际使用。 -### 2.2 S1-c(可选):`sys_log` / `time_sync` 主机侧单测 ⬜ - -**范围**:`App/log/sys_log_mcu.c`(定长 64B 记录编解码;落盘部分需桩)、 -`App/sync/time_sync.c`(协议帧编解码;与网络耦合,需先判定可解耦面)。 - -**为何低优先**:两者边界密度低于 `sys_clock` / `cfg_file`,且已有真机路径覆盖 -(`@test` 标记 / `time_sync_server.py`)。**按剩余收益评估后再决定是否做**, -范式完全复用 `../测试说明/看门狗单元测试说明.md`。 - -**完成判据**:`test/host/<模块>/run_unit_test.py` 退出码 0 + 挂 pre-commit 钩子。 - -### 2.3 A-4:ADC / RS485 采集链路的测试可验证性约束 ⏸ +### 2.2 A-4:ADC / RS485 采集链路的测试可验证性约束 ⏸ **背景**:`adc_task.c` 已实现(B1,2026-10-10),`rs485_task.c` 仍是空桩,`App/protocol/` 只有 README 与 `.gitkeep`。 本项不是"缺陷",而是**对上游 B2 的设计约束**(B1 已完成;**B2 暂缓中,见 `暂缓-RS485.md`——重启 B2 动手前必须先落实本约束**,否则后续无法补测)。 @@ -81,7 +71,7 @@ **完成判据**:B2 设计文档体现上述三条;协议解析函数有对应 L0.5 单测。(B1 侧:ADC 无协议解析面,其"同一时刻性"由原子快照保证、已闭环。) -### 2.4 A-5 残余:CI 体积门禁盲区 ⬜ +### 2.3 A-5 残余:CI 体积门禁盲区 ⬜ **现状**:`mem-numbers` 钩子**在 CI 上被跳过**(CI 无 `.map`)→ **CI 不守体积门禁**。 S14 已在 workflow 显式提示"体积门禁未执行"(`::notice::`)并在 `../环境与部署/CI配置指南.md` 声明, diff --git a/docs/测试说明/主机单测覆盖率口径.md b/docs/测试说明/主机单测覆盖率口径.md index bb0a638b..0e32fdec 100644 --- a/docs/测试说明/主机单测覆盖率口径.md +++ b/docs/测试说明/主机单测覆盖率口径.md @@ -56,7 +56,7 @@ ## 3. 怎么跑 ```powershell -# 全量:16 套单测逐套"编译(带 PDB)→ 插桩运行 → 解析 Cobertura",最后并集 + 比基线 +# 全量:33 套单测逐套"编译(带 PDB)→ 插桩运行 → 解析 Cobertura",最后并集 + 比基线 & '.venv\Scripts\python.exe' scripts/check_test_coverage.py # 只跑一套(调试用;子集会跳过"在测文件消失"类回退判定,见 §5) @@ -75,7 +75,8 @@ 所以"include 目录 / 桩顺序 / 测试单元路径"只有一处定义,覆盖率脚本不会漂成第二套口径。 退出码:`0` 全过且无回退 / `1` 有单测失败或覆盖率回退 / `2` 环境错误(无 cl、无 mscoverage、 -编译失败、XML 缺失)/ `3` 用法错误。全量实测约 **25 s**(16 套 × 编译 + 插桩运行)。 +编译失败、XML 缺失)/ `3` 用法错误。全量实测约 **67 s**(33 套 × 编译 + 插桩运行; +2026-10-25 实测;16 套时约 25 s、28 套时约 45 s,套件数涨了耗时就涨,别拿旧数当预算)。 中间产物(exe / PDB / Cobertura XML)一律落 `%TEMP%\dtu_test_cov\<模块>`,**不进仓库**, 所以本脚本不需要新增任何 `.gitignore` 规则。 @@ -150,7 +151,7 @@ 宁可红,也不给可疑的数字。 6. **只覆盖跑到的进程树。** 一次 `collect` 只看一次运行;没跑到的套件不进分母 (全量跑时以"模块未跑到"判 REGRESS),子集运行明确降级(§5)。 -7. **头文件里的代码归 `.h`。** 统计面含 `.h`(静态内联与被展开的行落在头文件上);当前 16 套 +7. **头文件里的代码归 `.h`。** 统计面含 `.h`(静态内联与被展开的行落在头文件上);当前 33 套 几乎没触及 `.h`,表里看不到它们——不要以为头文件"天生 100%"。 8. **依赖 `Microsoft.CodeCoverage.Console.exe`。** 探测顺序:`DTU_MS_COVERAGE`(设了就必须 有效、**不静默回退**)→ 各 VS 安装根的 `Common7\IDE\Extensions\Microsoft\CodeCoverage.Console` → @@ -176,14 +177,14 @@ 件事做两遍,还要多约 25 s; ⚠ **这条理由的事实基础已变(2026-10-24,P1 落地后)**:本仓现有 - `test/host/**/run_unit_test.py` **28 套**,而钩子只挂 **16 套**——另外 12 套(P1 新增的 + `test/host/**/run_unit_test.py` **33 套**,而钩子只挂 **16 套**——另外 17 套(P1/P2 新增的 全部模块)目前只被 `ci_local.py`(L0.5 自动发现)与 `check_test_coverage.py` 跑到, **不在提交钩子里**。所以现状不是"重复两遍",而是**有一遍没做**。 当时唯一没解的是第 2 条:必须先定"缺 VS 组件时 skip 还是 FAIL"——那是要用户裁定的事(选 skip 等于造一根会静默失效的门禁,与 `always: true 已失效` 同类)。**2026-10-24 用户选 FAIL,本闸已挂**, - 缺口关闭。接线时的两个实测数:全闸跑完 **45 s**(28 套;本文别处写的"约 25 s"是只有 16 套时 - 的值,已过时);缺组件时钩子 **Failed**、脚本退出码 2 并打印 `[ENV]` 提示(合成自证)。 + 缺口关闭。接线时的两个实测数:全闸跑完 **67 s**(33 套;本文别处写的"约 25 s"是只有 16 套、 + "45 s"是 28 套时的值,都已过时);缺组件时钩子 **Failed**、脚本退出码 2 并打印 `[ENV]` 提示(合成自证)。 2. 它依赖 VS 可选组件(§7 第 8 条)。挂之前必须先定"缺组件时 skip 还是 FAIL"—— 选 skip 就是一个会静默失效的门禁(与 `AGENTS.md` 里那条 `always: true 已失效、必须靠 files: 覆盖` 是同一类坑); @@ -464,7 +465,7 @@ uint16_t ch395f_link_change_count(void); 那会整批落进通用 `TC` 族(属主 `docs/测试说明/*_Test_Guide.md`、**无** `allow_orphans`) = 458 条台账外新账直接拦提交;正名为 `TC-NETSOCK-` 是 bytes 级替换(465 处 / 0 残留 / 兄弟目录 `git diff` 全空 / 复跑 420 全绿)。**写死成纪律**:队友起手就按 Lead 给的模块码写号,两字母不可检索的码(`NS`)不要取。 -本批**未**给新套件单挂 `*-unit-test` 钩子(与 P1 那 12 套同口径):聚合闸 `test-coverage` 的触发面 +本批**未**给新套件单挂 `*-unit-test` 钩子(与 P1/P2 那 17 套同口径):聚合闸 `test-coverage` 的触发面 `^(App/|Drivers/BSP/|test/host/|…)` 已自动发现新模块并按基线守回退。 **假件常量必须与真头逐字对齐(本批最值钱的机制结论)**:共享假芯片里 `CH395F_SOCKET_OPEN` 曾是 `0x01U`