merge: v2-on-ui 追平至 task/P1-10-test-fw(含 A-3 卡5~7 与 B-3 记录 reader)

按 lead 信号 sync 追平:主干 59da40b(cal-lockout-dim)+ 891ca81(UI-rec-reader)+
383b450(台账与凭证回填)合入本任务分支,为下一轮台架做准备(台架镜像必须建立在
追平后的代码上,否则烧进去的 hex 与主干不同码,体积门禁的凭证也对不上)。

唯一冲突:scripts/size_attestation.json —— **取主干侧**(383b450 刚按合并后的固件重盖
过,数字更新;本分支侧是 7c4628b 的 v2 格式戳,覆盖的是追平前的树)。取完即
`git add` 解决,没有手工拼接。**已知副作用**:主干那份是 v1 格式(schema=1),而本
分支的 check_size_gate.py 已升到 schema=2 → 在下一步 `ram_baseline.py --update` 重盖
之前,ci_local 的 L0c 会按设计报"凭证 schema 不符"。这不是回归,是合并两侧脚本版本
差一步,下面第 4 步就把它治好(也正是要请 lead 合这笔的原因:合完主干两边同版)。

合并后产品构建(实跑,非推演):@build 0 错误 0 警告,
Code=215744 RO=21396 RW=1224 ZI=131984 —— 与 lead 在信号里给的主干数字**逐项相同**;
RW_IRAM1=75,784 B / 57.82%(追平前 75,632 B / 57.70%,+152 B 与"两笔合计 +152B"吻合)、
RW_CCM=57,376 B / 87.89% 未动、ER_IROM1 22.62%。说明本树固件内容已与主干同码。

本分支带来的(前四笔已在分支上,这里只登记合并面):
- 7c4628b 体积凭证指纹改索引 blob;16917bf CH395F 三档实测 + 阶段开关注释陷阱;
- adabb6a 主机单测/覆盖率产物按工作树分家 + runs 独占(task-10);
- a9ba8ec 看门狗 HW 层掩码死分支复活(App/util,lead 背书写域)+ 存活基线 --write;
- 5f1057a 套件 forbidden 换显式四 Fault 标签(GD5F 旧豁免的漏口一并堵上)。
与主干侧的文件交集只有 size_attestation.json 一处,已按上解决;.pre-commit-config.yaml
本轮是主干侧改的(道A 加了钩子相关条目),本分支没碰它,无并集冲突。

gate:本笔合并提交走完整 pre-commit(含 16 根单测钩子与 test-coverage 全量覆盖率
基线比对);未用 --no-verify。
This commit is contained in:
2026-10-25 05:41:49 +08:00
48 changed files with 3958 additions and 182 deletions
+4 -4
View File
@@ -43,15 +43,15 @@ ALLOW = {
"App/util/sha256.h", # 纯算法工具:无状态、不依赖任何上层服务
}
# 存量基线(2026-10-22 清点,只减不增)。每条 = (引用方, 被引用的 App 头)。
# 存量基线(2026-10-22 清点 6 条,只减不增)。每条 = (引用方, 被引用的 App 头)。
# 修法是"注入/传参",不是把上层服务搬进 BSP——详见报告 §0.4 的 S-1 行。
# 2026-10-25 道B(task/UI-rec-reader)还清 UI 记录 3 条:ui_w_records 改注入式
# ui_rec_reader_t(契约 UI_数据供给设计说明.md §7.2),runlog/selftest/records.h
# 不再 include sys_log.h,绑定在 App/task/ui_task.c 与 simulator/main.c。
BASELINE = {
("Drivers/BSP/NETCFG/net_cfg.c", "App/cfg/cfg_file.h"), # 配置引擎属主 = defaultTask
("Drivers/BSP/NETCFG/ftp_cfg.c", "App/cfg/cfg_file.h"), # 同上([ftp] 段注册)
("Drivers/BSP/NET/lftpd/lftpd_io.c", "App/fs/vol_lock.h"), # 卷锁在 App/fs
("Drivers/BSP/UI/ui_page_runlog.c", "App/log/sys_log.h"), # 记录读取应由上层递进来
("Drivers/BSP/UI/ui_page_selftest.c", "App/log/sys_log.h"), # 同上
("Drivers/BSP/UI/ui_w_records.h", "App/log/sys_log.h"), # 同上(组件头,会外溢到 include 链)
}
INC_RE = re.compile(r'^[ \t]*#[ \t]*include[ \t]*"([^"]+)"', re.M)
+1
View File
@@ -94,6 +94,7 @@ SIM_EXEMPT = [
("App/log/soe_rec.c", "SOE 记录编解码纯逻辑(B9),L0.5 主机单测覆盖,模拟器无消费路径"),
("App/log/soe_store.c", "SOE 落盘 MCU 胶水(队列+FatFs 单写者,B9),模拟器无消费路径"),
("App/algo/sample_ring.c", "L2 环形缓冲纯算法,模拟器无消费路径"),
("App/algo/adc_cal.c", "L1.5 标定折算纯算法 + cfg 段注册(消费者 = MCU 侧 adcTask 每拍;模拟器不跑采样任务),模拟器无消费路径"),
("App/app/app_main.c", "固件启动/就绪屏障,MCU 专属"),
("App/fs/vol_lock.c", "FreeRTOS 互斥量卷锁,MCU 专属"),
("App/log/console_log.c", "MCU 控制台输出,模拟器无消费路径"),
+44
View File
@@ -1686,6 +1686,50 @@
"owner_note": "B 层口径(用户裁定 2026-10-21):这些号实测在代码目录外零消费者(唯一外部引用是 id_aliases.json 自己),故属主登记处 = 单测代码本身,不逐号补文档;class 仍为 TC → 跨模块同号由校验 4 抓",
"cursor_note": "游标按实测最大号收录(2026-10-21):越界即视为未登记的冒号牌"
},
{
"name": "TC-HOST-ADCCAL",
"class": "TC",
"title": "主机侧单测用例号:L1.5 通道标定折算(test/host/adc_cal,道A 卡2/4)",
"pattern": "\\bTC-ADCCAL-[0-9]{1,4}[a-z]?\\b",
"digit_width": [
2,
4
],
"owner_docs_glob": [
"test/host/adc_cal/*"
],
"scope": "global",
"frozen": false,
"cursor": "TC-ADCCAL-017",
"cursor_owner_only": true,
"check_dangling": true,
"allow_orphans": true,
"subitem_ok": true,
"owner_note": "B 层口径(用户裁定 2026-10-21,同 TC-HOST-ADCHEALTH 先例;2026-10-25 道A 卡2 建族):属主登记处 = 单测代码目录,不逐号补文档",
"cursor_note": "游标按建族时实测最大号收录(2026-10-25):越界即视为未登记的冒号牌"
},
{
"name": "TC-HOST-PROTDIM",
"class": "TC",
"title": "主机侧单测用例号:量纲回归(test/host/prot_dim,道A 卡7)",
"pattern": "\\bTC-PROTDIM-[0-9]{1,4}[a-z]?\\b",
"digit_width": [
2,
4
],
"owner_docs_glob": [
"test/host/prot_dim/*"
],
"scope": "global",
"frozen": false,
"cursor": "TC-PROTDIM-010",
"cursor_owner_only": true,
"check_dangling": true,
"allow_orphans": true,
"subitem_ok": true,
"owner_note": "B 层口径(用户裁定 2026-10-21,同 TC-HOST-ADCHEALTH/TC-HOST-ADCCAL 先例;2026-10-25 道A 卡7 建族):属主登记处 = 单测代码目录,不逐号补文档",
"cursor_note": "游标按建族时实测最大号收录(2026-10-25):越界即视为未登记的冒号牌"
},
{
"name": "TC-HOST-IEC104",
"class": "TC",
+1 -1
View File
@@ -7,4 +7,4 @@ date code ro rw zi er_irom1 er_pct iram1 iram1_pct ccm ccm_pct top_rwzi
2026-10-22 213436 18652 1188 131500 232088 22.1 75264 57.4 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4120;sys_log_mcu.o=3588;default_task.o=2736
2026-10-23 213676 18860 1188 131500 232536 22.2 75264 57.4 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4120;sys_log_mcu.o=3588;default_task.o=2736
2026-10-24 213780 18860 1204 131852 232640 22.2 75632 57.7 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4128;sys_log_mcu.o=3944;default_task.o=2736
2026-10-25 214104 20388 1204 131852 234492 22.4 75632 57.7 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4128;sys_log_mcu.o=3944;default_task.o=2736
2026-10-25 215744 21396 1224 131984 237140 22.6 75784 57.8 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4128;sys_log_mcu.o=3944;default_task.o=2736
1 date code ro rw zi er_irom1 er_pct iram1 iram1_pct ccm ccm_pct top_rwzi
7 2026-10-22 213436 18652 1188 131500 232088 22.1 75264 57.4 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4120;sys_log_mcu.o=3588;default_task.o=2736
8 2026-10-23 213676 18860 1188 131500 232536 22.2 75264 57.4 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4120;sys_log_mcu.o=3588;default_task.o=2736
9 2026-10-24 213780 18860 1204 131852 232640 22.2 75632 57.7 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4128;sys_log_mcu.o=3944;default_task.o=2736
10 2026-10-25 214104 215744 20388 21396 1204 1224 131852 131984 234492 237140 22.4 22.6 75632 75784 57.7 57.8 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4128;sys_log_mcu.o=3944;default_task.o=2736
+15 -16
View File
@@ -1,25 +1,25 @@
{
"built_at": "2026-10-25T04:15:33+08:00",
"fingerprint": "bf6ec94a761eacd8e3bcbc590e8780c2293462d384b9b33094e5d0fd6411f295",
"fingerprint_files": 1388,
"fingerprint_source": "git-index",
"built_at": "2026-10-25T05:31:08+08:00",
"fingerprint": "548011fc4a68e087a855c952e73c6d8d85c6f4a4dee28702f29dfa858ff3577c",
"fingerprint_files": 1396,
"fingerprint_missing": 0,
"gated_regions": [
"RW_IRAM1",
"RW_CCM"
],
"git_head": "e1967cf2eac70b794c920774715c6fe78dc30ac2",
"git_head": "59da40bb4a53db082953164a9d7c58bb342f8c19",
"map": "MDK-ARM/STM32F407-Demo/STM32F407-Demo.map",
"map_mtime": 1792872260,
"map_mtime": 1792877445,
"pct": {
"ER_IROM1": 22.36,
"ER_IROM1": 22.62,
"RW_CCM": 87.89,
"RW_IRAM1": 57.7,
"RW_IRAM1": 57.82,
"UNINIT_CCM": 18.75
},
"regions": {
"ER_IROM1": {
"max": 1048576,
"size": 234492
"size": 237140
},
"RW_CCM": {
"max": 65280,
@@ -27,22 +27,21 @@
},
"RW_IRAM1": {
"max": 131072,
"size": 75632
"size": 75784
},
"UNINIT_CCM": {
"max": 256,
"size": 48
}
},
"schema": 2,
"schema": 1,
"scope_note": "\u540c\u7801\u51ed\u8bc1\uff1a\u6307\u7eb9\u8986\u76d6\u56fa\u4ef6\u4f53\u79ef\u76f8\u5173\u6e90\u7801\uff0c\u53e3\u5f84\u89c1\u672c\u811a\u672c docstring",
"sizes": {
"code": 214104,
"ro_data": 20388,
"rw_data": 1204,
"zi_data": 131852
"code": 215744,
"ro_data": 21396,
"rw_data": 1224,
"zi_data": 131984
},
"threshold_pct": 92.0,
"worktree_dirt_at_stamp": 0,
"written_by": "scripts/check_size_gate.py --stamp"
}
+116 -55
View File
@@ -1,12 +1,20 @@
{
"files": {
"App/algo/adc_cal.c": {
"func_rate": 1.0,
"funcs_covered": 12,
"funcs_valid": 12,
"line_rate": 0.9916,
"lines_covered": 118,
"lines_valid": 119
},
"App/algo/adc_health.c": {
"func_rate": 1.0,
"funcs_covered": 6,
"funcs_valid": 6,
"funcs_covered": 9,
"funcs_valid": 9,
"line_rate": 1.0,
"lines_covered": 108,
"lines_valid": 108
"lines_covered": 143,
"lines_valid": 143
},
"App/algo/adc_input.c": {
"func_rate": 1.0,
@@ -57,12 +65,12 @@
"lines_valid": 41
},
"App/cfg/cfg_file.c": {
"func_rate": 0.9615,
"funcs_covered": 25,
"funcs_valid": 26,
"line_rate": 0.8773,
"lines_covered": 572,
"lines_valid": 652
"func_rate": 0.963,
"funcs_covered": 26,
"funcs_valid": 27,
"line_rate": 0.8853,
"lines_covered": 610,
"lines_valid": 689
},
"App/cfg/cfg_file_store_mcu.c": {
"func_rate": 1.0,
@@ -117,8 +125,8 @@
"funcs_covered": 13,
"funcs_valid": 13,
"line_rate": 0.9939,
"lines_covered": 324,
"lines_valid": 326
"lines_covered": 328,
"lines_valid": 330
},
"App/protocol/iec104/iec104_asdu.c": {
"func_rate": 1.0,
@@ -277,8 +285,8 @@
"funcs_covered": 53,
"funcs_valid": 53,
"line_rate": 0.9978,
"lines_covered": 887,
"lines_valid": 889
"lines_covered": 889,
"lines_valid": 891
},
"Drivers/BSP/NETCFG/ftp_cfg.c": {
"func_rate": 1.0,
@@ -299,11 +307,19 @@
},
"generated_by": "scripts/check_test_coverage.py --update-baseline",
"modules": {
"adc_cal": {
"files": {
"App/algo/adc_cal.c": 119,
"App/cfg/cfg_file.c": 689
},
"lines_total": 808,
"ok": true
},
"adc_health": {
"files": {
"App/algo/adc_health.c": 108
"App/algo/adc_health.c": 143
},
"lines_total": 108,
"lines_total": 143,
"ok": true
},
"adc_input": {
@@ -315,9 +331,9 @@
},
"cfg_file": {
"files": {
"App/cfg/cfg_file.c": 652
"App/cfg/cfg_file.c": 689
},
"lines_total": 652,
"lines_total": 689,
"ok": true
},
"cfg_file_store_mcu": {
@@ -446,9 +462,9 @@
},
"net_socket": {
"files": {
"Drivers/BSP/NET/net_socket.c": 889
"Drivers/BSP/NET/net_socket.c": 891
},
"lines_total": 889,
"lines_total": 891,
"ok": true
},
"phasor": {
@@ -459,6 +475,18 @@
"lines_total": 96,
"ok": true
},
"prot_dim": {
"files": {
"App/algo/adc_cal.c": 119,
"App/algo/freq.c": 130,
"App/algo/phasor.c": 55,
"App/algo/prot_elm.c": 106,
"App/algo/prot_set.c": 179,
"App/algo/sample_ring.c": 41
},
"lines_total": 630,
"ok": true
},
"prot_elm": {
"files": {
"App/algo/freq.c": 130,
@@ -517,9 +545,9 @@
},
"sys_log_mcu": {
"files": {
"App/log/sys_log_mcu.c": 326
"App/log/sys_log_mcu.c": 330
},
"lines_total": 326,
"lines_total": 330,
"ok": true
},
"task_prof": {
@@ -554,6 +582,7 @@
"note": "主机单测覆盖率基线。口径与工具链限制见 docs/测试说明/主机单测覆盖率口径.md。门禁判据:files[].lines_covered 与 funcs_covered 只增不减,下降即拦提交。",
"schema": 1,
"tested_sources": [
"App/algo/adc_cal.c",
"App/algo/adc_health.c",
"App/algo/adc_input.c",
"App/algo/freq.c",
@@ -594,16 +623,16 @@
],
"totals": {
"files_generated_excluded": 5,
"files_tested": 37,
"files_untested": 107,
"func_rate": 0.9231,
"funcs_covered": 396,
"funcs_valid": 429,
"line_rate": 0.8932,
"lines_covered": 5605,
"lines_valid": 6275,
"modules_ok": 33,
"modules_total": 33
"files_tested": 38,
"files_untested": 115,
"func_rate": 0.9258,
"funcs_covered": 412,
"funcs_valid": 445,
"line_rate": 0.8965,
"lines_covered": 5802,
"lines_valid": 6472,
"modules_ok": 35,
"modules_total": 35
},
"untested_sources": [
{
@@ -630,10 +659,18 @@
"code_lines": 281,
"path": "App/task/default_task.c"
},
{
"code_lines": 265,
"path": "Drivers/BSP/UI/ui_w_editor.c"
},
{
"code_lines": 264,
"path": "Drivers/BSP/SD2506/sd2506.c"
},
{
"code_lines": 224,
"path": "App/task/adc_task.c"
},
{
"code_lines": 206,
"path": "Drivers/BSP/CH395F/ch395f.h"
@@ -647,8 +684,8 @@
"path": "Drivers/BSP/UI/ui_standby.c"
},
{
"code_lines": 171,
"path": "App/task/adc_task.c"
"code_lines": 204,
"path": "Drivers/BSP/UI/ui_w_setlist.c"
},
{
"code_lines": 157,
@@ -659,7 +696,7 @@
"path": "Drivers/BSP/UI/ui_page_password.c"
},
{
"code_lines": 135,
"code_lines": 138,
"path": "App/app/app_main.c"
},
{
@@ -670,6 +707,14 @@
"code_lines": 123,
"path": "App/task/net_task.c"
},
{
"code_lines": 117,
"path": "App/task/protect_task.c"
},
{
"code_lines": 113,
"path": "Drivers/BSP/UI/ui_page_action.c"
},
{
"code_lines": 101,
"path": "Drivers/BSP/NET/net_types.h"
@@ -683,8 +728,8 @@
"path": "Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.h"
},
{
"code_lines": 90,
"path": "App/task/protect_task.c"
"code_lines": 92,
"path": "App/task/ui_task.c"
},
{
"code_lines": 83,
@@ -706,10 +751,6 @@
"code_lines": 77,
"path": "Drivers/BSP/dbg_log.h"
},
{
"code_lines": 71,
"path": "App/task/ui_task.c"
},
{
"code_lines": 62,
"path": "App/protocol/iec104/iec104_asdu.h"
@@ -718,6 +759,10 @@
"code_lines": 56,
"path": "App/protocol/iec104/iec104_link.h"
},
{
"code_lines": 55,
"path": "App/algo/adc_health.h"
},
{
"code_lines": 54,
"path": "Drivers/BSP/TPAFE5160/tpafe5160.h"
@@ -728,24 +773,24 @@
},
{
"code_lines": 50,
"path": "App/algo/adc_health.h"
"path": "Drivers/BSP/UI/ui_w_setlist.h"
},
{
"code_lines": 46,
"path": "App/log/soe_rec.h"
},
{
"code_lines": 44,
"path": "App/algo/adc_input.h"
},
{
"code_lines": 44,
"path": "App/log/soe_rec.h"
"code_lines": 42,
"path": "App/cfg/cfg_file.h"
},
{
"code_lines": 42,
"path": "Drivers/BSP/UI/ui_content_page.h"
},
{
"code_lines": 41,
"path": "App/cfg/cfg_file.h"
},
{
"code_lines": 41,
"path": "Drivers/BSP/NET/lftpd/private/lftpd_status.h"
@@ -755,12 +800,12 @@
"path": "Drivers/BSP/UI/ui_page_ac.c"
},
{
"code_lines": 34,
"path": "Drivers/BSP/NETCFG/net_cfg.h"
"code_lines": 39,
"path": "Drivers/BSP/UI/ui_w_records.c"
},
{
"code_lines": 34,
"path": "Drivers/BSP/UI/ui_w_records.c"
"path": "Drivers/BSP/NETCFG/net_cfg.h"
},
{
"code_lines": 33,
@@ -782,10 +827,18 @@
"code_lines": 31,
"path": "Drivers/BSP/UI/ui_deco.c"
},
{
"code_lines": 31,
"path": "Drivers/BSP/UI/ui_w_editor.h"
},
{
"code_lines": 29,
"path": "Drivers/BSP/NET/lftpd/lftpd_auth.h"
},
{
"code_lines": 29,
"path": "Drivers/BSP/UI/ui_w_records.h"
},
{
"code_lines": 28,
"path": "App/algo/prot_elm.h"
@@ -794,6 +847,10 @@
"code_lines": 28,
"path": "App/protocol/iec104/iec104_pts.h"
},
{
"code_lines": 28,
"path": "Drivers/BSP/app_assert.h"
},
{
"code_lines": 27,
"path": "App/algo/phasor.h"
@@ -826,6 +883,10 @@
"code_lines": 24,
"path": "Drivers/BSP/UI/ui_tokens.h"
},
{
"code_lines": 22,
"path": "App/algo/adc_cal.h"
},
{
"code_lines": 22,
"path": "App/cfg/cfg_file_store.h"
@@ -838,6 +899,10 @@
"code_lines": 22,
"path": "Drivers/BSP/NETCFG/ftp_cfg.h"
},
{
"code_lines": 22,
"path": "Drivers/BSP/UI/ui_page_action.h"
},
{
"code_lines": 22,
"path": "Drivers/BSP/UI/ui_page_runlog.c"
@@ -854,10 +919,6 @@
"code_lines": 20,
"path": "Drivers/BSP/UI/ui_page_dc.c"
},
{
"code_lines": 19,
"path": "Drivers/BSP/UI/ui_w_records.h"
},
{
"code_lines": 18,
"path": "App/app/sys_events.h"