diff --git a/Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.c b/Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.c index 069ea82c..8eaab2b2 100644 --- a/Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.c +++ b/Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.c @@ -271,7 +271,7 @@ static void gd5f_page_read_issue(uint32_t page_addr) { * 函数说明:13h 单次发令 + WIP 轮询(与 Linux 主线 / GigaDevice 厂商驱动 * 形状完全一致:13h×1 → OIP 轮询 → 0Bh)。 * 2026-09-20 台架异常史实(归因、证伪、沉降/二次发令的加与除) - * 统一记于 docs/问题记录/GD5F2GQ5UE_Trap_Records.md Trap 05, + * 统一记于 docs/问题记录/GD5F2GQ5UE_Trap_Records.md TRAP-GD5F-05, * 复现手段见测试 Phase 11 用例。 */ int32_t gd5f_page_read(uint32_t page_addr) { diff --git a/Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.h b/Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.h index df53eb51..9e72971d 100644 --- a/Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.h +++ b/Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.h @@ -62,7 +62,7 @@ extern "C" { /* * 页读取就绪判定 = WIP 轮询(与 Linux 主线 / GigaDevice 厂商驱动完全一致, * 单发令形状)。2026-09-20 沉降 / 13h 二次发令史实统一记于 - * GD5F2GQ5UE_Trap_Records.md Trap 05。 + * GD5F2GQ5UE_Trap_Records.md TRAP-GD5F-05。 */ #define GD5F_TOTAL_BLOCKS 2048 #define GD5F_TOTAL_SIZE (GD5F_TOTAL_BLOCKS * GD5F_BLOCK_SIZE) diff --git a/Drivers/BSP/GD5F2GQ5UE/nand_ftl.c b/Drivers/BSP/GD5F2GQ5UE/nand_ftl.c index 632aa6e2..ff744565 100644 --- a/Drivers/BSP/GD5F2GQ5UE/nand_ftl.c +++ b/Drivers/BSP/GD5F2GQ5UE/nand_ftl.c @@ -54,7 +54,7 @@ #define FTL_NUM_BLOCKS (GD5F_TOTAL_BLOCKS - FTL_START_BLOCK) #define FTL_START_PAGE (FTL_START_BLOCK * GD5F_PAGES_PER_BLOCK) -/* dhara 几何字面量的**单一真源**(Trap 07 遗留 3 的收口):disk_initialize 与 +/* dhara 几何字面量的**单一真源**(TRAP-GD5F-07 遗留 3 的收口):disk_initialize 与 * 下方守卫都取这两个宏,不再各写一遍 11 / 6。 */ #define FTL_LOG2_PAGE_SIZE 11u #define FTL_LOG2_PPB 6u @@ -222,7 +222,7 @@ int dhara_nand_prog(const struct dhara_nand *n, dhara_page_t p, const uint8_t *d /* 编程正确性以 P_FAIL 状态位(gd5f_program_exec 内检查)+ 读时 ECC + * journal 读时门(magic/CRC)为准;数据路径不做整页回读比对—— * 2026-09-20 曾加回读校验(GD5F_PROG_VERIFY),2026-09-21 经评估整体 - * 移除(依据见 docs/内存管理/存储栈RAM优化调研.md 与 GD5F Trap Records Trap 05) */ + * 移除(依据见 docs/内存管理/存储栈RAM优化调研.md 与 GD5F Trap Records TRAP-GD5F-05) */ return 0; } diff --git a/MDK-ARM/retracted_bench_20260922/README.txt b/MDK-ARM/retracted_bench_20260922/README.txt index 0d375808..56f97810 100644 --- a/MDK-ARM/retracted_bench_20260922/README.txt +++ b/MDK-ARM/retracted_bench_20260922/README.txt @@ -1,5 +1,5 @@ RETRACTED 2026-09-22 bench artifacts (TC-NET-604 'freeze' campaign). Their 'STALL/WEDGE' verdicts were artifacts: (1) in-firmware non-echoing readers (Phase 9/11, probe) ate the peer's bytes; (2) probe_classify.py mode A/C misreported passing runs as STALL. -TC-NET-604 is CLOSED as NOT-A-DEFECT (see docs/问题记录/CH395F_Trap_Records.md Trap 21). +TC-NET-604 is CLOSED as NOT-A-DEFECT (see docs/问题记录/CH395F_Trap_Records.md TRAP-NET-21). Do NOT use these recipes/verdicts for freeze detection. Trustworthy tools (kept one level up): ftp_freeze_probe.py (real FTP path + RETR SHA-256), ftp_abort_probe.py (abort/reconnect), bench_verdict.py (script-level STEP truth). diff --git a/docs/UI设计/菜单页面设计.md b/docs/UI设计/菜单页面设计.md index 6b53f772..9917caf9 100644 --- a/docs/UI设计/菜单页面设计.md +++ b/docs/UI设计/菜单页面设计.md @@ -498,7 +498,7 @@ python tools/menu_gen/gen_menu.py **① 框宽 w = 最宽行 + 2 条边框**(图①) -一行横向构成:`边框1 | 留白2 | 文本 |(菜单行: 间距2 + ▶10)| 留白2 | 边框1`。文本宽按字体实际步进量(`lv_text_get_width`,⚠️ 见 §8.2 陷阱 1);同框各行宽度可以不同,**框宽只由最宽的一行决定**,窄行左对齐、右侧留空: +一行横向构成:`边框1 | 留白2 | 文本 |(菜单行: 间距2 + ▶10)| 留白2 | 边框1`。文本宽按字体实际步进量(`lv_text_get_width`,⚠️ 见本文 §8.2 第 1 条(`lv_text_get_width` 的 `length=0` 陷阱));同框各行宽度可以不同,**框宽只由最宽的一行决定**,窄行左对齐、右侧留空: w = max_行( PAD_L + 文本_w + [GAP + ▶_w] + PAD_R ) + 2×BORDER diff --git a/docs/测试说明/GD5F2GQ5UE_Test_Guide.md b/docs/测试说明/GD5F2GQ5UE_Test_Guide.md index 7a566160..949a5edc 100644 --- a/docs/测试说明/GD5F2GQ5UE_Test_Guide.md +++ b/docs/测试说明/GD5F2GQ5UE_Test_Guide.md @@ -411,7 +411,7 @@ ECC 状态(`ECCS1:ECCS0`):`00`=无错;`01/10/11`=纠正 1/2/3 bit;`10` | **类型** | 功能测试 | | **标题** | 原语级块擦除(地址=块首页地址) | | **前置条件** | SPI 已初始化 | -| **测试步骤** | `gd5f_block_erase(block)`(注意传**块编号**,内部转块首页地址,见陷阱 01) | +| **测试步骤** | `gd5f_block_erase(block)`(注意传**块编号**,内部转块首页地址,见TRAP-GD5F-01) | | **通过标准** | 返回 `GD5F_OK`,无 `E_FAIL` | | **覆盖原则** | `gd5f_block_erase`(TRAP-GD5F-01 修复点) | diff --git a/docs/编号规范.md b/docs/编号规范.md index 1d5ea1fd..54aee175 100644 --- a/docs/编号规范.md +++ b/docs/编号规范.md @@ -36,7 +36,7 @@ | **跨文档同号不同义** | `Trap 02` 在 CH395F 是"缓冲区重叠"、在 GD5F 是"测试缓冲越界";`B10` 在规划是"送检窗口"、在陷阱审计是"孤儿监听" | | **语义进编号 → 事实一变编号就撒谎** | `P1-x` 把严重度写进号里,而审计中大量条目事后降级(`E-59` P0→P1、dhara `is_free` P1→P2):改号则引用全断,不改则号实不符 | | **孤儿编号(代码有、文档无)** | `I-1`/`I-2`、`Task #32` 会话号、`P1-01~P1-09`、`TC-GD5F-1100/1101/1102`、`TC-STORAGE-06`、`TC-AH-*`、`TC-PE-*`(前两项项目已在 `docs/测试说明/实机测试实施指南.md` 自行承认) | -| **悬空引用(引用了不存在的号)** | `Trap 19` 从未存在却被 `docs/测试说明/CH395F_Test_Guide.md` 引用;`N-5/N-8/N-19/N-30/N-31/N-32` 销项删行后仍被引用(`N-32` = 监听生命周期模块化,被 `docs/网络/` 三篇与代码注释多处引用) | +| **悬空引用(引用了不存在的号)** | `Trap 19`(裸形;**当时的 NET 域在册表里没有这一号**——别误读成"这个坑不存在",2026-10-13 全库重排后该域确有 `TRAP-NET-19` 这条真实条目,两回事)曾被 `docs/测试说明/CH395F_Test_Guide.md` 引用;`N-5/N-8/N-19/N-30/N-31/N-32` 销项删行后仍被引用(`N-32` = 监听生命周期模块化,被 `docs/网络/` 三篇与代码注释多处引用) | | **同一事物多种字面** | `Trap 07` / `TRAP-07` / `陷阱 1`;`gen 181` / `gen-288` / `gen68`;`TC-NET-704` / `TC704` / `TC-203` | | **规范自身就不自洽** | `docs/测试说明/测试文档模板规范.md` §6.3 同一行并列 `TC-STORAGE-03`(2 位)与 `TC-RTC-001`(3 位);`docs/测试说明/测试文档模板规范.md` §6.2 已废止 `PHY` 模块码,而阶段 ID 至今仍是 `TM-PHY-01` | | **机器校验只覆盖一个族** | (2026-10-15 现状,2026-10-20 已由 §8.1 收口)当时 31 个 pre-commit 钩子中只有 `TC` 有 `scripts/check_test_traceability.py`,且**未挂钩子、warn-only、正则 `TC-[A-Za-z0-9]+-\d+` 匹配不到大写后缀形态**;`E/N/S/B/C/D/A/U/O/gen/Trap` 全部裸奔 | @@ -322,7 +322,7 @@ | `P0-x`~`P3-x` 在册项 | `DEF-*` | 严重度转列 | | 设计说明 `D1~D10` | `DR-001`~`DR-010` | 数字对齐 | | `B0-a/b/c`、`待确认-N` | `OQ-001`… | — | -| `Trap NN` / `陷阱 N` | `TRAP--` | 数字不变,补模块码 | +| `Trap NN` / `陷阱 N` | `TRAP--` | 数字不变,补模块码 —— **批 4 已做(2026-10-21)**:GD5F `01~07`、RTC `01`、NET `19`/`21`;`docs/硬件平台/` 属排除语料,里面的 `Trap05` 未动(见 §8.3 批 4 说明) | | `H-1~H-7`、`L-1~L-4`、差距 `N-1~N-6` | `GAP-01`~`GAP-17` | 按文档内出现顺序 | | 实机 `A1~A8`、看门狗 `V2/V4/V5` | `SC-01`… | — | | 测试分层 `L0/L0.5/L1/L2/L3` | `T0/T0.5/T1/T2/T3` | 门禁 `G0~G3` 不动(两套不同尺度,不合并) | @@ -448,6 +448,7 @@ git grep -n '<旧字面量>' # 零残留 | 批 | 日期 | 族 | 旧 → 新 | 处数 / 文件 | 别名 | |---|---|---|---|---|---| +| **批 4(Trap)** | 2026-10-21 | 陷阱号形态 | `Trap 01~07` → `TRAP-GD5F-01~07`、`陷阱 1` → `TRAP-RTC-01`、`Trap 21`/`Trap 19` → `TRAP-NET-21`/`TRAP-NET-19`、`见陷阱 01` → `TRAP-GD5F-01` | 23 处 / 11 文件(含 `Drivers/BSP/GD5F2GQ5UE/*` 注释 4 处、`test/board/*` 2 处) | 11 条全部带 scope;映射表即审计轨迹 `scripts/rename_maps/batch3-trap.json` | | **批 1** | 2026-10-20 | 代码规范条款 | `S1`~`S19` → `CODE-RULE-01`~`19` | 78 处 / 2 文件 | 18 条(scoped:`scripts/check_coding_standard.py`、`docs/代码规范/pre-commit使用说明.md`) | | **批 3(口径)** | 2026-10-21 | 主机侧单测归属 | 建 9 族 `TC-HOST-*`(代码即属主)+ `subitem_ok` + `snapshot_only` + 补 README 属主 + `T-x` 入别名 | 判据与注册表改动,未改任何存量号 | 见 §8.1 口径修正记录 | | **批 2** | 2026-10-20 | 测试用例模块码 | 16 个码 → 单词化(见 §6) | 1,146 处 / 约 30 文件 | 全局别名(字面量已完全限定,无歧义) | @@ -457,6 +458,18 @@ git grep -n '<旧字面量>' # 零残留 --- +**批 4 刻意不改的三处(写清楚,别被当成漏网)** + +- `docs/环境与部署/并行任务工作树方案.md` 里的 `wip/trap22-fix` 是 **git 分支名**,不是编号—— + 这类「非编号字面量」要靠**类型识别**处理(与位号 `T1`、IEEE 负序 `S2`、gitlint 规则 ID 同一批), + 不靠白名单硬豁免,也不许为它改分支名。 +- `docs/UI设计/菜单页面设计.md` 的变更记录行「陷阱 3」按 §8.1 冻结不改写;正文里指向本文自己小节的 + 那处(原「见 §8.2 陷阱 1」)**本来就不是 `TRAP-*` 族的号**,已改写成 + 「见本文 §8.2 第 1 条(`lv_text_get_width` 的 `length=0` 陷阱)」——引用要能当问题读, + 不必为两处文档内自指另立一族。 +- `docs/硬件平台/` 网表分析报告里 6 处 `Trap05`(语义 = `TRAP-NET-05`)留在排除语料里不动, + 盲区已登记进 `id_registry.json` 的 TRAP 族 `cursor_note`。 + ### 8.4 债务台账与增量拦截(2026-10-21 关闸) **为什么不照 §8 原节奏「清零后再 `--strict`」**:存量 710 处(② 形态迁移 398 + ⑥ 裸引写全属主 269 + ③ 真悬空 44), @@ -474,7 +487,7 @@ git grep -n '<旧字面量>' # 零残留 | 初始化 | `--write-backlog` 全量快照(关闸那次用过;之后再跑等于豁免新债,须显式确认) | | `--only` 与 `--strict` | **互斥**(局部扫描不能当门禁结论),同时给直接返回 2 | | 缺台账 | `--strict` 直接返回 2 并提示先生成,**绝不退化成「一次性拦死全部存量」**(那样必然逼人 `--no-verify`) | -| 台账自身不得当语料 | 关闸第一次提交就被自己的台账咬了:`id_known_backlog.json` 里必然写着 `P1-3` / `Trap 05` 这些号,扫描器当成新引用 → 报 10 类新账、提交被拦。已把台账加入 `excluded_paths`(与 `id_aliases.json` / `id_registry.json` 同一条道理:**登记号的表不是引用号的文档**) | +| 台账自身不得当语料 | 关闸第一次提交就被自己的台账咬了:`id_known_backlog.json` 里必然写着 `P1-3` / `Trap 05` 这些号,扫描器当成新引用 → 报 10 类新账、提交被拦。已把台账加入 `excluded_paths`(与 `id_aliases.json` / `id_registry.json` 同一条道理:**登记号的表不是引用号的文档**。第 4 次同样自循环:改名映射表 `scripts/rename_maps/batch3-trap.json` 里必然写着 `Trap 21` / `陷阱 1` 这些旧形态,关闸后第一次提交就被它自己拦下 6 类「新账」→ 整个 `scripts/rename_maps/` 目录一并入 `excluded_paths`(它是审计轨迹,不是引用语料) | **关闸验收(三例,2026-10-21 实测)**: @@ -521,6 +534,7 @@ git grep -n '<旧字面量>' # 零残留 |---|---|---| | 2026-10-14 | 新增 P-7 与引用可读性规则 | §2 加 **P-7「编号不语义,引用必语义」**(编号本体保持无语义并冻结,但正文引用必须带语义括注、禁裸 ID 独担信息)→ 六条原则变**七条**;§5.1 加前置步"先问能不能不加号";新增 **§5.6「编号密集文档的对照节(强制)」**(≥3 个编号族必须加「导读:编号与术语」);§4.1 补登记 **`E\d+`**(N34 自愈实验编号族,已封闭)并把 `N-\d{2}` 的在册范围订正为「曾用最大 `N-33`,现存至 `N-29`」;§1.2 悬空引用示例补 `N-32`;§7.1 同步订正。起因:`docs/网络/网络自愈架构设计.md` 合并与导读节实践暴露"裸编号引用不可读",用户裁定以后尽量用语义标识 | | (规划稿) | 建立本文档 | 全库扫描 1,385 个不同编号 / 19,306 处出现后定稿的两层编号体系(全局编号 + 文档内编号)、六条原则、目标前缀总表、三批迁移映射与 `check_ids.py` 门禁设计;用户决策:`E-xx` 冻结保留、严重度档位词 `P0~P3` 不变、文档落 `docs/编号规范.md`、阶段 1 三批全做 | +| 2026-10-21 | **批 4:陷阱号统一(② 清的第一族)** | 23 处 / 11 文件:`Trap 01~07` → `TRAP-GD5F-01~07`(属主文档 7 个标题行从此成为定义位)、`陷阱 1` → `TRAP-RTC-01`、`Trap 21`/`Trap 19` → `TRAP-NET-21`/`TRAP-NET-19`;UI 文档自指改写成平实语言。别名 11 条全部带 scope。改名后 `TRAP-GD5F-01/05/06` 三处历史悬空引用自动落地为已定义;三处刻意不改与 `docs/硬件平台/` 盲区写进 §8.3 批 4 | | 2026-10-21 | **关闸:`id-check` 转增量拦截** | `check_ids.py` 新增 `--write-backlog` / `--prune-backlog` 与按台账比对的 `--strict`(指纹 = 文件 + 校验号 + 字面量 + 计数,**不含行号**);生成 `scripts/id_known_backlog.json`(340 条覆盖 710 处存量);钩子 `entry` 加 `--strict`。验收三例:新字面量拦、同号计数增长拦、干净态放行,全通过。新增 §8.4 说明机制与「为什么不照清零再升 strict 的原节奏」 | | 2026-10-21 | **追溯脚本同口径对齐** | `check_test_traceability.py` 差异定义改为 DOC-ONLY / CODE-ONLY / IN-CODE 三档(真差异 45 = 38 + 7;弱保证 238 单列示数);顺带修 `TC_RE` 模块码上界 `{0,4}`→`{0,8}`——**同一个坑第二次踩**(代码侧一度从 556 缩到 217),已写进 §8.1 | | 2026-10-21 | **B 层口径落地(批 3)** | 主机侧单测 118 号实测在代码目录外零消费者 → 建 9 族 `TC-HOST-*` 认代码为属主登记处(不逐号补文档);新增 `subitem_ok`(小写子项后缀母号在册即算已定义)、`snapshot_only`(§4.3 冻结快照族不参与定义位优先)、`allow_orphans` 旗标与 `excluded_paths` 补两项;补 `docs/任务规划/README.md` 为 `N`/`S-LDG`/`T-LDG` 属主(**我的配置漏项,曾误判 74 处真条目悬空**);`T-2`/`T-3`/`T-4`/`T-6` 入别名表标 `void`。错误级 1318 → 711(其中 504 处属口径修正、74 处属修 bug,**真正变好 0 处**)。新增 §8.1 口径修正记录表 | diff --git a/docs/问题记录/GD5F2GQ5UE_Trap_Records.md b/docs/问题记录/GD5F2GQ5UE_Trap_Records.md index 0850c6f6..8f08ed06 100644 --- a/docs/问题记录/GD5F2GQ5UE_Trap_Records.md +++ b/docs/问题记录/GD5F2GQ5UE_Trap_Records.md @@ -1,6 +1,6 @@ # GD5F2GQ5UE 陷阱记录 -## Trap 01 — 块擦除地址错误(有效) +## TRAP-GD5F-01 — 块擦除地址错误(有效) **发现时间**:2026-07-21 @@ -30,7 +30,7 @@ - 块擦除不使用 `block × block_size`(字节偏移),而用块首页地址 - 芯片手册的 memory mapping 必须严格遵守 -## Trap 02 — 测试缓冲越界导致跨页比对误判(有效) +## TRAP-GD5F-02 — 测试缓冲越界导致跨页比对误判(有效) **发现时间**:2026-08-26 @@ -64,7 +64,7 @@ static uint8_t s_rbuf[GD5F_PAGE_SIZE * 2]; - 任何“跨页 / 大于单页”的读写测试,缓冲必须按**实际长度上限**而非单页大小分配 - 越界写会污染相邻全局变量,可能引起其它用例莫名失败,定位时优先怀疑缓冲尺寸 -## Trap 03 — 驱动读写擦缺越界检查(有效 / 健壮性缺口) +## TRAP-GD5F-03 — 驱动读写擦缺越界检查(有效 / 健壮性缺口) **发现时间**:2026-08-26 @@ -90,19 +90,19 @@ if (offset < 0 || (unsigned long)offset + size > (unsigned long)GD5F_TOTAL_SIZE) **验证结果**: - TC-GD5F-1001 read/write 越界均被拒绝(ret=-1),测试 PASS - TC-GD5F-1002 size=0 仍返回 `GD5F_OK`(offset 合法且 size=0 不越界),符合预期 -- 该检查还顺带逮到 Trap 04 的测试越界擦除(见下) +- 该检查还顺带逮到 TRAP-GD5F-04 的测试越界擦除(见下) **经验教训**: - 面向字节偏移的裸 NAND 接口必须做容量边界检查,调用方传错参数时尽早失败 - 无越界检查的驱动容易“静默回绕”,问题极难定位 -## Trap 04 — gd5f_find_run 返回语义与多块擦除窗口错位(测试 bug) +## TRAP-GD5F-04 — gd5f_find_run 返回语义与多块擦除窗口错位(测试 bug) **发现时间**:2026-08-26 **现象**: TC-GD5F-402 多块擦除(`gd5f_find_run(3)` 后擦 3 块)返回 `ret=-1`。 -经 Trap 03 的边界检查定位:实际要擦的块超出了设备末尾。 +经 TRAP-GD5F-03 的边界检查定位:实际要擦的块超出了设备末尾。 **根因**: `gd5f_find_run(n)` 原实现返回的是**连续好块的末尾块号** `top` @@ -133,7 +133,7 @@ if (ok) { 调用方与实现必须一致 - 这类错位 bug 往往只在“区间贴到设备边界”时才触发,正常情况能过,建议测试覆盖边界块 -## Trap 05 — FatFs 探针文件名非法 → 无限重格式化(已修复,2026-09-20) +## TRAP-GD5F-05 — FatFs 探针文件名非法 → 无限重格式化(已修复,2026-09-20) **发现时间**:2026-09-20(症状自卷健康探针引入之日起长期存在) @@ -197,7 +197,7 @@ if (ok) { - 探针自身也可能有 bug:错误码要记录"是哪次调用返回的 + 枚举语义"—— 本例 fr=6 在日志里挂了几十个 boot 没人查过枚举表 -## Trap 06 — 轮询路径"伪完成":HAL 失败被伪装成操作完成(已修复,2026-10-03) +## TRAP-GD5F-06 — 轮询路径"伪完成":HAL 失败被伪装成操作完成(已修复,2026-10-03) **发现时间**:2026-10-03(错误码传播审计 E-10/E-42/E-53/E-54/E-56/E-57 复核 + 台架套件回归) @@ -232,7 +232,7 @@ if (ok) { 保护既有好副本比刷新更重要; - 使能类配置(ECC)必须**回读校验**,不能只信写命令的返回。 -## Trap 07 — dhara 移植层:`is_free` 只看页首 + HAL 无几何校验(已修复,2026-10-15) +## TRAP-GD5F-07 — dhara 移植层:`is_free` 只看页首 + HAL 无几何校验(已修复,2026-10-15) **发现时间**:2026-10-15(`项目审查与优化建议报告.md` N-12 / N-13 复核,登记簿原 N-21) @@ -249,7 +249,7 @@ if (ok) { 加完 `FTL_START_BLOCK` 偏移送进 SPI 命令后,被芯片地址位**截断成某个真实页** → 静默读写、甚至把无辜页的数据 GC 搬走。 -**与 Trap 03 的关系(本条的核心教训)**:Trap 03 已为**裸驱动字节偏移 API** +**与 TRAP-GD5F-03 的关系(本条的核心教训)**:TRAP-GD5F-03 已为**裸驱动字节偏移 API** (`gd5f2gq5ue_read/write/erase`)补过容量检查,但**dhara 移植层是另一个入口**,同一教训在那儿 原样重演。边界校验必须**逐层**做——"下层查过了"推不出"上层调用也安全",何况本例下层查的是 字节偏移、上层传的是页号,两者根本不是同一个量。 @@ -267,7 +267,7 @@ if (ok) { - 无错误通道的两个函数取**保守值**:`is_free` 越界返回 0(判非空,最多少用一页)、 `is_bad` 越界返回 1(判坏,绝不读写)、`mark_bad` 越界直接返回(绝不标无辜好块)。 - `is_free` 内 `gd5f_page_read` / `gd5f_read_from_cache` 任一失败 → 返回 0 - (Trap 06 同族:读失败**不得**伪装成"空闲")。 + (TRAP-GD5F-06 同族:读失败**不得**伪装成"空闲")。 **验证**: diff --git a/docs/问题记录/SD2506_Trap_Records.md b/docs/问题记录/SD2506_Trap_Records.md index fa332907..036d3155 100644 --- a/docs/问题记录/SD2506_Trap_Records.md +++ b/docs/问题记录/SD2506_Trap_Records.md @@ -1,6 +1,6 @@ # SD2506API-G 陷阱记录 (Trap Records) -## 陷阱 1:KEIL/ARMCC 下十六进制字面量 `H` 后缀被编译为 0(严重) +## TRAP-RTC-01:KEIL/ARMCC 下十六进制字面量 `H` 后缀被编译为 0(严重) ### 现象 SD2506 RTC 时间写不进去:`sd2506_set_time()` 返回 OK,但回读 / 示波器 / 重启后时间不更新。 diff --git a/docs/问题记录/项目审查与优化建议报告.md b/docs/问题记录/项目审查与优化建议报告.md index 709a2a41..3bf19430 100644 --- a/docs/问题记录/项目审查与优化建议报告.md +++ b/docs/问题记录/项目审查与优化建议报告.md @@ -25,7 +25,7 @@ |------|------|-----------|-----------------| | 项目结构 | **A−** | 六层分层真实可执行、命名一致、门禁到位;反向依赖控制在 4 处 | `NETCFG`/`UI` 语义层错位(S-1)、4 处裸 `extern`(S-2)、`rs485_task.c` 仍在注册白名单里等 B2 | | 文档分布 | **A−** | 工程文档 **87 篇 / 30,781 行**(2026-10-15 随 `错误码传播审计.md` 删除而 −1 篇 / −635 行),`docs/README.md` 索引 + `docs/文档规范.md` + 三档一致性门禁全部落地,`check_doc_links --all` = 0 失效 | **D-1**:`docs/` 占仓库 **71.8%**、手册图片 **36.3 MB**、`.git` 已 **235 MB**(已决策暂不处理,登记观察) | -| 模块设计 | **A−** | 看门狗(IWDG + 心跳位图 + 4 个 Fault 现场 + `.noinit`)、就绪屏障、卷锁、FTP 鉴权、`Error_Handler` 自恢复、ADC 全链均已落地;**原列的 dhara 移植层两处缺陷(N-12/N-13)与日志逐条开关(N-16)已于 2026-10-15 修复** → `GD5F2GQ5UE_Trap_Records.md` Trap 07、`../架构设计/STM32F4-Base存储架构说明.md` §5.3、`../子系统设计/运行与自检记录设计说明.md` §4.4/§4.5 | 驱动层无统一错误码约定(S-5)、RS485 无协议栈(随 B2 暂缓) | +| 模块设计 | **A−** | 看门狗(IWDG + 心跳位图 + 4 个 Fault 现场 + `.noinit`)、就绪屏障、卷锁、FTP 鉴权、`Error_Handler` 自恢复、ADC 全链均已落地;**原列的 dhara 移植层两处缺陷(N-12/N-13)与日志逐条开关(N-16)已于 2026-10-15 修复** → `GD5F2GQ5UE_Trap_Records.md` TRAP-GD5F-07、`../架构设计/STM32F4-Base存储架构说明.md` §5.3、`../子系统设计/运行与自检记录设计说明.md` §4.4/§4.5 | 驱动层无统一错误码约定(S-5)、RS485 无协议栈(随 B2 暂缓) | | 内存使用 | **B+** | 堆迁 CCM + 栈/堆三面观测常开 + `mem-budget` 92% 门禁 + 预算台账与趋势基线;**R-9 已落地(2026-10-15)→ SRAM1 由 74.9% 降到 56.1%;同日移植层与日志修复 +1.6 KB → 现 **57.4%(余 55,840 B)**,不再是卡点** | **内存优化簇已整簇暂缓**(用户裁定 2026-10-15):R-2 后半(待迁 29,570 B → CCM,只差缩堆 56→32 KB)与 R-3 / R-4 / R-6 不再排期,理由与重开条件见 §5.3;**当前真正的约束是 CCM 只剩 7,904 B**——加任务 / 抬栈 / 加堆会先在这里撞墙,届时按 §5.3 重开;MicroLIB 512 B C 堆仍无机械检查(§5.5) | | Flash 使用 | **A−** | F-1/F-2/F-3 落地省 64,576 B → 占用 **22.2%(232,280 B)** | F-4/F-5/F-6 ≈10 KB + 编译时长(§5.4) | | UI 标准化 | **B+** | W6 第一波已落地(2026-10-15):**L0 设计令牌层** `ui_tokens.h` 建成、**L2 页面注册表** `ui_page_registry.{c,h}` 由生成器产出并**删除了手写 `case` 分发**、`font-charset` 钩子 + `registration-check` 第 ④ 类接线校验上线、字体子集瘦身 −80 B | L1 组件库已起步(U2 首个 `ui_w_records`,2026-10-20),但仅此 1 个组件、**目标页未落地**(现存 7 个 `ui_page_*.c`)、**golden 像素回归已于 2026-10-20 挂入提交门禁**(`ui-golden`)、`ui_w_form` 推迟 U5(§6) | diff --git a/scripts/README.md b/scripts/README.md index c10f4668..1e192a31 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -15,7 +15,7 @@ | `section_aliases.json` | (被 `check_doc_links.py` 读) | 文档**昵称别名表**:「内存方案」→ `docs/内存管理/RAM使用分析与优化方案.md`。只登记无歧义昵称;登记一次即把该昵称的引用纳入硬门禁 | | `check_ids.py` | `id-check` | **编号门禁**:`docs/编号规范.md` §8 的八项校验(未登记前缀 / 形态 / 悬空 / 重复定义 / 越游标 / 未紧邻文档名 / 孤儿 / 可判定比例)。**warn-only**,`--strict` 才拦提交;比例跌破基线任何模式都失败。详表 → `docs/代码规范/pre-commit使用说明.md` §2.25 | | `id_registry.json` | (被 `check_ids.py` 读) | 前缀族**注册表**:属主登记处 / 形态正则 / 冻结 / 游标,逐项来自 `docs/编号规范.md` §4;`decidable_ratio_baseline` = 校验 8 的基线(只许涨)。与 `section_aliases.json` 同一套"别名表 + 可判定比例"范式 | -| `id_aliases.json` | (被 `check_ids.py` 读) | 编号**别名/作废表**:旧字面量 → 现行字面量或 `status: void`(如 `N-32` 销项后仍被引用、`Trap 19` 从未存在、模块码 `PHY→NET`) | +| `id_aliases.json` | (被 `check_ids.py` 读) | 编号**别名/作废表**:旧字面量 → 现行字面量或 `status: void`(如 `N-32` 销项后仍被引用、`T-4` 随销项永久作废、模块码 `PHY→NET`) | | `check_test_traceability.py` | (被 `id-check` 顺带调用) | **TC 用例双向追溯**:文档 ↔ 代码两侧的 TC 编号集合比对;2026-10-20 起范围扩到 `test/host/` 与 7 篇「单元测试说明.md」(`--board-only` 回退旧板级口径)。此前该脚本**未挂任何钩子** | | `gen_task_table.py` | `task-table` | FreeRTOS 任务表以 `Src/freertos.c` 为**唯一事实源**生成/校验(D-2/D-7) | | `check_mem_numbers.py` | `mem-numbers` | 内存/Flash 数字以 `.map` 为唯一事实源校验(D-7 体积档) | diff --git a/scripts/id_aliases.json b/scripts/id_aliases.json index d15947bf..2d9f53ec 100644 --- a/scripts/id_aliases.json +++ b/scripts/id_aliases.json @@ -1,7 +1,7 @@ { "schema": 1, "generated_from": "docs/编号规范.md §7 迁移映射 + §4.3 冻结前缀;本表只登记**仓库里已实际出现**的旧字面量 → 现行字面量,不做尚未落地的批量改写(§7.2 阶段 1 一律保留存量)", - "note": "旧号引用不因本表而改写:本表只让门禁把「旧号引用」判成可解析(校验 3 悬空引用 / 校验 4 重复定义)。批量改写属 §9 阶段 1,须逐批 dry-run + 三重复核(§7.3)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。", + "note": "旧号引用不因本表而改写:本表只让门禁把「旧号引用」判成可解析(校验 3 悬空引用 / 校验 4 重复定义)。批量改写属 §9 阶段 1,须逐批 dry-run + 三重复核(§7.3)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。", "aliases": { "N-31": { "to": null, @@ -23,11 +23,22 @@ "status": "resolved-in-place", "note": "sock_reset 原语收口受阻项:登记簿行仍在(2026-10-14 建档),编号规范 §4.1 误记为已销项 → 以登记簿为准" }, - "Trap 19": { - "to": null, - "status": "void", - "note": "从未存在的陷阱号被 docs/测试说明/CH395F_Test_Guide.md 引用(§1.2 / §7.2:删除或改指实际条目)" - }, + "Trap 19": [ + { + "to": null, + "status": "void", + "note": "从未存在的陷阱号被 docs/测试说明/CH395F_Test_Guide.md 引用(§1.2 / §7.2:删除或改指实际条目)" + }, + { + "to": "TRAP-NET-19", + "status": "renamed", + "note": "NET(CH395F)域:Trap 21 → TRAP-NET-21、Trap 19 → TRAP-NET-19;两处引用的都是 CH395F_Trap_Records.md 这个活登记处,号本身不变(scripts/rename_ids.py 批:族 TRAP)|旧号仅在本批 scope 内指向新号;scope 外同字面量属其它族,不受本条影响", + "scope": [ + "MDK-ARM/retracted_bench_20260922/README.txt", + "scripts/README.md" + ] + } + ], "PHY": { "to": "NET", "status": "module-code", @@ -2688,6 +2699,136 @@ "to": null, "status": "void", "note": "2026-10-02 版复审专项条目号(docs/任务规划/测试与架构专项.md 卷首声明「编号不随条目删除而回收」)。该条目已按「完成即销项」删行,仓内现存 T-1 仍在册;引用本号的 .dsh/skills 脚本与 test/ 文档属**引用未清**(§5.5 只做了一半)。本条只让门禁停止把它当自造号并如实指路:改写成语义标识(§3.3)或写全出处,**不要新发一个 T-2 号**(号不回收)" + }, + "Trap 01": { + "to": "TRAP-GD5F-01", + "status": "renamed", + "note": "GD5F 存储域:Trap 01~07 → TRAP-GD5F-01~07(属主文档 7 个标题行为定义位,其余为引用)(scripts/rename_ids.py 批:族 TRAP)|旧号仅在本批 scope 内指向新号;scope 外同字面量属其它族,不受本条影响", + "scope": [ + "docs/问题记录/GD5F2GQ5UE_Trap_Records.md", + "docs/问题记录/项目审查与优化建议报告.md", + "docs/测试说明/GD5F2GQ5UE_Test_Guide.md", + "Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.c", + "Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.h", + "Drivers/BSP/GD5F2GQ5UE/nand_ftl.c", + "test/board/gd5f_test_task.c", + "test/board/storage_test_task.c" + ] + }, + "Trap 02": { + "to": "TRAP-GD5F-02", + "status": "renamed", + "note": "GD5F 存储域:Trap 01~07 → TRAP-GD5F-01~07(属主文档 7 个标题行为定义位,其余为引用)(scripts/rename_ids.py 批:族 TRAP)|旧号仅在本批 scope 内指向新号;scope 外同字面量属其它族,不受本条影响", + "scope": [ + "docs/问题记录/GD5F2GQ5UE_Trap_Records.md", + "docs/问题记录/项目审查与优化建议报告.md", + "docs/测试说明/GD5F2GQ5UE_Test_Guide.md", + "Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.c", + "Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.h", + "Drivers/BSP/GD5F2GQ5UE/nand_ftl.c", + "test/board/gd5f_test_task.c", + "test/board/storage_test_task.c" + ] + }, + "Trap 03": { + "to": "TRAP-GD5F-03", + "status": "renamed", + "note": "GD5F 存储域:Trap 01~07 → TRAP-GD5F-01~07(属主文档 7 个标题行为定义位,其余为引用)(scripts/rename_ids.py 批:族 TRAP)|旧号仅在本批 scope 内指向新号;scope 外同字面量属其它族,不受本条影响", + "scope": [ + "docs/问题记录/GD5F2GQ5UE_Trap_Records.md", + "docs/问题记录/项目审查与优化建议报告.md", + "docs/测试说明/GD5F2GQ5UE_Test_Guide.md", + "Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.c", + "Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.h", + "Drivers/BSP/GD5F2GQ5UE/nand_ftl.c", + "test/board/gd5f_test_task.c", + "test/board/storage_test_task.c" + ] + }, + "Trap 04": { + "to": "TRAP-GD5F-04", + "status": "renamed", + "note": "GD5F 存储域:Trap 01~07 → TRAP-GD5F-01~07(属主文档 7 个标题行为定义位,其余为引用)(scripts/rename_ids.py 批:族 TRAP)|旧号仅在本批 scope 内指向新号;scope 外同字面量属其它族,不受本条影响", + "scope": [ + "docs/问题记录/GD5F2GQ5UE_Trap_Records.md", + "docs/问题记录/项目审查与优化建议报告.md", + "docs/测试说明/GD5F2GQ5UE_Test_Guide.md", + "Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.c", + "Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.h", + "Drivers/BSP/GD5F2GQ5UE/nand_ftl.c", + "test/board/gd5f_test_task.c", + "test/board/storage_test_task.c" + ] + }, + "Trap 05": { + "to": "TRAP-GD5F-05", + "status": "renamed", + "note": "GD5F 存储域:Trap 01~07 → TRAP-GD5F-01~07(属主文档 7 个标题行为定义位,其余为引用)(scripts/rename_ids.py 批:族 TRAP)|旧号仅在本批 scope 内指向新号;scope 外同字面量属其它族,不受本条影响", + "scope": [ + "docs/问题记录/GD5F2GQ5UE_Trap_Records.md", + "docs/问题记录/项目审查与优化建议报告.md", + "docs/测试说明/GD5F2GQ5UE_Test_Guide.md", + "Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.c", + "Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.h", + "Drivers/BSP/GD5F2GQ5UE/nand_ftl.c", + "test/board/gd5f_test_task.c", + "test/board/storage_test_task.c" + ] + }, + "Trap 06": { + "to": "TRAP-GD5F-06", + "status": "renamed", + "note": "GD5F 存储域:Trap 01~07 → TRAP-GD5F-01~07(属主文档 7 个标题行为定义位,其余为引用)(scripts/rename_ids.py 批:族 TRAP)|旧号仅在本批 scope 内指向新号;scope 外同字面量属其它族,不受本条影响", + "scope": [ + "docs/问题记录/GD5F2GQ5UE_Trap_Records.md", + "docs/问题记录/项目审查与优化建议报告.md", + "docs/测试说明/GD5F2GQ5UE_Test_Guide.md", + "Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.c", + "Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.h", + "Drivers/BSP/GD5F2GQ5UE/nand_ftl.c", + "test/board/gd5f_test_task.c", + "test/board/storage_test_task.c" + ] + }, + "Trap 07": { + "to": "TRAP-GD5F-07", + "status": "renamed", + "note": "GD5F 存储域:Trap 01~07 → TRAP-GD5F-01~07(属主文档 7 个标题行为定义位,其余为引用)(scripts/rename_ids.py 批:族 TRAP)|旧号仅在本批 scope 内指向新号;scope 外同字面量属其它族,不受本条影响", + "scope": [ + "docs/问题记录/GD5F2GQ5UE_Trap_Records.md", + "docs/问题记录/项目审查与优化建议报告.md", + "docs/测试说明/GD5F2GQ5UE_Test_Guide.md", + "Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.c", + "Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.h", + "Drivers/BSP/GD5F2GQ5UE/nand_ftl.c", + "test/board/gd5f_test_task.c", + "test/board/storage_test_task.c" + ] + }, + "陷阱 01": { + "to": "TRAP-GD5F-01", + "status": "renamed", + "note": "同一属主的中文形「见陷阱 01」→ 与空格形合并成同一个号(scripts/rename_ids.py 批:族 TRAP)|旧号仅在本批 scope 内指向新号;scope 外同字面量属其它族,不受本条影响", + "scope": [ + "docs/测试说明/GD5F2GQ5UE_Test_Guide.md" + ] + }, + "陷阱 1": { + "to": "TRAP-RTC-01", + "status": "renamed", + "note": "SD2506(RTC 芯片)域:陷阱 1 → TRAP-RTC-01(§4.2 该域按 RTC 编号)(scripts/rename_ids.py 批:族 TRAP)|旧号仅在本批 scope 内指向新号;scope 外同字面量属其它族,不受本条影响", + "scope": [ + "docs/问题记录/SD2506_Trap_Records.md" + ] + }, + "Trap 21": { + "to": "TRAP-NET-21", + "status": "renamed", + "note": "NET(CH395F)域:Trap 21 → TRAP-NET-21、Trap 19 → TRAP-NET-19;两处引用的都是 CH395F_Trap_Records.md 这个活登记处,号本身不变(scripts/rename_ids.py 批:族 TRAP)|旧号仅在本批 scope 内指向新号;scope 外同字面量属其它族,不受本条影响", + "scope": [ + "MDK-ARM/retracted_bench_20260922/README.txt", + "scripts/README.md" + ] } }, "id_aliases": {} diff --git a/scripts/id_known_backlog.json b/scripts/id_known_backlog.json index fc40a3e8..57ce5de5 100644 --- a/scripts/id_known_backlog.json +++ b/scripts/id_known_backlog.json @@ -2,8 +2,8 @@ "schema": 1, "note": "编号债务台账(docs/编号规范.md §8.4):--strict 只对**台账之外**的新错误级问题拦提交。台账只许减不许增——还清的用 --prune-backlog 收掉;确需新增一条必须写 reason 字段说明这笔债为什么该存在,默认禁止顺手加行(否则一周后台账就变成第二个 backlog)。指纹 = 文件 + 校验号 + 字面量,不含行号(行号会漂,用它台账天天假新增)。", "generated_by": "scripts/check_ids.py --write-backlog", - "total_error_findings": 710, - "decidable_ratio_at_generation": 82.73, + "total_error_findings": 632, + "decidable_ratio_at_generation": 82.99, "entries": [ { "file": ".dsh/skills/serial-assistant/scripts/serial_tool.py", @@ -119,48 +119,12 @@ "literal": "P2-9", "count": 4 }, - { - "file": "App/task/adc_task.c", - "code": 2, - "literal": "Task #32", - "count": 8 - }, - { - "file": "App/task/adc_task.c", - "code": 6, - "literal": "P0-2", - "count": 2 - }, - { - "file": "App/task/adc_task.c", - "code": 6, - "literal": "P1-5", - "count": 4 - }, { "file": "App/task/adc_task.c", "code": 6, "literal": "P3-11", "count": 1 }, - { - "file": "App/task/adc_task.h", - "code": 2, - "literal": "Task #32", - "count": 2 - }, - { - "file": "App/task/adc_task.h", - "code": 6, - "literal": "P1-5", - "count": 2 - }, - { - "file": "App/task/default_task.c", - "code": 2, - "literal": "Task #32", - "count": 4 - }, { "file": "App/task/default_task.c", "code": 6, @@ -179,12 +143,6 @@ "literal": "I-1", "count": 1 }, - { - "file": "App/task/net_task.c", - "code": 2, - "literal": "Task #32", - "count": 2 - }, { "file": "App/task/net_task.c", "code": 6, @@ -221,30 +179,6 @@ "literal": "P3-11", "count": 1 }, - { - "file": "App/task/ui_task.c", - "code": 2, - "literal": "P1-4a", - "count": 2 - }, - { - "file": "App/task/ui_task.c", - "code": 2, - "literal": "Task #32", - "count": 3 - }, - { - "file": "App/util/task_prof.c", - "code": 2, - "literal": "Task #32", - "count": 1 - }, - { - "file": "App/util/task_prof.h", - "code": 2, - "literal": "Task #32", - "count": 1 - }, { "file": "Drivers/BSP/CH395F/ch395f.c", "code": 6, @@ -263,30 +197,6 @@ "literal": "P2-2", "count": 1 }, - { - "file": "Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.c", - "code": 2, - "literal": "Trap 05", - "count": 1 - }, - { - "file": "Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.h", - "code": 2, - "literal": "Trap 05", - "count": 1 - }, - { - "file": "Drivers/BSP/GD5F2GQ5UE/nand_ftl.c", - "code": 2, - "literal": "Trap 05", - "count": 1 - }, - { - "file": "Drivers/BSP/GD5F2GQ5UE/nand_ftl.c", - "code": 2, - "literal": "Trap 07", - "count": 1 - }, { "file": "Drivers/BSP/NET/net_select.c", "code": 6, @@ -329,30 +239,6 @@ "literal": "I-2", "count": 3 }, - { - "file": "Drivers/BSP/UI/ui_net_sink.c", - "code": 2, - "literal": "Task #32", - "count": 1 - }, - { - "file": "MDK-ARM/retracted_bench_20260922/README.txt", - "code": 2, - "literal": "Trap 21", - "count": 1 - }, - { - "file": "Src/freertos.c", - "code": 2, - "literal": "Task #32", - "count": 1 - }, - { - "file": "Src/freertos.c", - "code": 6, - "literal": "P1-5", - "count": 1 - }, { "file": "Src/freertos.c", "code": 6, @@ -365,18 +251,6 @@ "literal": "P2-13", "count": 1 }, - { - "file": "Src/main.c", - "code": 2, - "literal": "Task #32", - "count": 1 - }, - { - "file": "Src/main.c", - "code": 6, - "literal": "P1-5", - "count": 2 - }, { "file": "docs/CI/远程CI完整指南.md", "code": 2, @@ -437,12 +311,6 @@ "literal": "P1-3", "count": 1 }, - { - "file": "docs/UI设计/菜单页面设计.md", - "code": 2, - "literal": "陷阱 1", - "count": 1 - }, { "file": "docs/UI设计/菜单页面设计.md", "code": 2, @@ -623,12 +491,6 @@ "literal": "R-4", "count": 1 }, - { - "file": "docs/内存管理/存储栈RAM优化调研.md", - "code": 3, - "literal": "TRAP-GD5F-05", - "count": 1 - }, { "file": "docs/内存管理/存储栈RAM优化调研.md", "code": 6, @@ -677,30 +539,6 @@ "literal": "P2-8", "count": 1 }, - { - "file": "docs/子系统设计/ADC采样节拍设计说明.md", - "code": 2, - "literal": "Task #32", - "count": 6 - }, - { - "file": "docs/子系统设计/ADC采样节拍设计说明.md", - "code": 6, - "literal": "P0-1", - "count": 2 - }, - { - "file": "docs/子系统设计/ADC采样节拍设计说明.md", - "code": 6, - "literal": "P0-2", - "count": 2 - }, - { - "file": "docs/子系统设计/ADC采样节拍设计说明.md", - "code": 6, - "literal": "P1-5", - "count": 4 - }, { "file": "docs/子系统设计/IEC104上行设计说明.md", "code": 2, @@ -923,24 +761,6 @@ "literal": "TC-704", "count": 2 }, - { - "file": "docs/测试说明/GD5F2GQ5UE_Test_Guide.md", - "code": 2, - "literal": "陷阱 01", - "count": 1 - }, - { - "file": "docs/测试说明/GD5F2GQ5UE_Test_Guide.md", - "code": 3, - "literal": "TRAP-GD5F-01", - "count": 1 - }, - { - "file": "docs/测试说明/GD5F2GQ5UE_Test_Guide.md", - "code": 3, - "literal": "TRAP-GD5F-06", - "count": 1 - }, { "file": "docs/测试说明/串口助手设计说明.md", "code": 2, @@ -1133,66 +953,12 @@ "literal": "round 1", "count": 1 }, - { - "file": "docs/问题记录/GD5F2GQ5UE_Trap_Records.md", - "code": 2, - "literal": "Trap 01", - "count": 1 - }, - { - "file": "docs/问题记录/GD5F2GQ5UE_Trap_Records.md", - "code": 2, - "literal": "Trap 02", - "count": 1 - }, - { - "file": "docs/问题记录/GD5F2GQ5UE_Trap_Records.md", - "code": 2, - "literal": "Trap 03", - "count": 4 - }, - { - "file": "docs/问题记录/GD5F2GQ5UE_Trap_Records.md", - "code": 2, - "literal": "Trap 04", - "count": 2 - }, - { - "file": "docs/问题记录/GD5F2GQ5UE_Trap_Records.md", - "code": 2, - "literal": "Trap 05", - "count": 1 - }, - { - "file": "docs/问题记录/GD5F2GQ5UE_Trap_Records.md", - "code": 2, - "literal": "Trap 06", - "count": 2 - }, - { - "file": "docs/问题记录/GD5F2GQ5UE_Trap_Records.md", - "code": 2, - "literal": "Trap 07", - "count": 1 - }, { "file": "docs/问题记录/GD5F2GQ5UE_Trap_Records.md", "code": 2, "literal": "gen 45", "count": 1 }, - { - "file": "docs/问题记录/SD2506_Trap_Records.md", - "code": 2, - "literal": "陷阱 1", - "count": 1 - }, - { - "file": "docs/问题记录/项目审查与优化建议报告.md", - "code": 2, - "literal": "Trap 07", - "count": 1 - }, { "file": "docs/问题记录/项目审查与优化建议报告.md", "code": 2, @@ -1253,12 +1019,6 @@ "literal": "P2-9", "count": 2 }, - { - "file": "scripts/README.md", - "code": 2, - "literal": "Trap 19", - "count": 1 - }, { "file": "scripts/README.md", "code": 6, @@ -1481,12 +1241,6 @@ "literal": "P1-09", "count": 5 }, - { - "file": "test/board/gd5f_test_task.c", - "code": 2, - "literal": "Trap 05", - "count": 1 - }, { "file": "test/board/gd5f_test_task.c", "code": 3, @@ -1511,12 +1265,6 @@ "literal": "P1-9", "count": 1 }, - { - "file": "test/board/storage_test_task.c", - "code": 2, - "literal": "Trap 05", - "count": 1 - }, { "file": "test/board/test_config.h", "code": 6, diff --git a/scripts/id_registry.json b/scripts/id_registry.json index b5a8a8b3..ded9da97 100644 --- a/scripts/id_registry.json +++ b/scripts/id_registry.json @@ -58,7 +58,8 @@ ".dsh/skills/*/scripts/state/", ".dsh/n31_neg_inject_gen217.log", ".dsh/n31_neg_inject_gen221_form5.log", - "scripts/id_known_backlog.json" + "scripts/id_known_backlog.json", + "scripts/rename_maps/" ], "excluded_suffixes": [ ".svg", @@ -513,7 +514,7 @@ 2 ], "check_dangling": true, - "cursor_note": "分模块各自递增:NET 01~21、GD5F 01~06、RTC 01~(§4.2);NET 域 2026-10-13 已全库重排连续", + "cursor_note": "分模块各自递增:NET 01~21(属主 docs/问题记录/CH395F_Trap_Records.md)、GD5F 01~07(GD5F2GQ5UE_Trap_Records.md)、RTC 01(SD2506_Trap_Records.md)。批 4(2026-10-21)已把空格形 `Trap NN` 与中文形 `陷阱 N` 统一成 `TRAP--`,数字不变、只补模块码(§7.1)。**已知盲区(登记而非静默放过)**:docs/硬件平台/V0.0_网表详细分析报告.md(5 处)与 V0.1_网表详细分析报告.md(1 处)里的 `Trap05` 语义确指 `TRAP-NET-05`(CH395F 与 RTL8305 自动协商不兼容),但 docs/硬件平台/ 与 docs/芯片手册/ 同为门禁语料与本工具的共同排除目录,故本批不动笔、也不声称已合规。", "adjacent_cues": [ "Trap", "trap", diff --git a/scripts/rename_maps/batch3-trap.json b/scripts/rename_maps/batch3-trap.json new file mode 100644 index 00000000..35d37ed3 --- /dev/null +++ b/scripts/rename_maps/batch3-trap.json @@ -0,0 +1,53 @@ +{ + "schema": 1, + "batch": "批 3-Trap(2026-10-21)", + "applied_by": "scripts/rename_ids.py", + "record": "docs/编号规范.md §8.3 / §7.1", + "note": "陷阱号统一为 TRAP-<模块码>-:数字不变、只补模块码(§7.1)。作用域按文件切分,因为同一空格形在不同文件里指向不同族的属主文档——GD5F 的属主是 GD5F2GQ5UE_Trap_Records.md,README.txt/scripts/README.md 里的 Trap 21/19 指向 CH395F_Trap_Records.md(NET 域),SD2506 的中文形按 §4.2 归 RTC 域。刻意不改:docs/环境与部署/并行任务工作树方案.md:39 的 wip/trap22-fix 是分支名不是编号;docs/UI设计/菜单页面设计.md:501 的「§8.2 陷阱 1」是本文小节内第 1 条(另走平实语言改写);:896 是变更记录行(§8.1 冻结不改写)。", + "batches": [ + { + "family": "TRAP", + "old": "\\bTrap (?P\\d{2})\\b", + "new": "TRAP-GD5F-{n:02d}", + "files": [ + "docs/问题记录/GD5F2GQ5UE_Trap_Records.md", + "docs/问题记录/项目审查与优化建议报告.md", + "docs/测试说明/GD5F2GQ5UE_Test_Guide.md", + "Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.c", + "Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.h", + "Drivers/BSP/GD5F2GQ5UE/nand_ftl.c", + "test/board/gd5f_test_task.c", + "test/board/storage_test_task.c" + ], + "note": "GD5F 存储域:Trap 01~07 → TRAP-GD5F-01~07(属主文档 7 个标题行为定义位,其余为引用)" + }, + { + "family": "TRAP", + "old": "陷阱 (?P\\d{2})\\b", + "new": "TRAP-GD5F-{n:02d}", + "files": [ + "docs/测试说明/GD5F2GQ5UE_Test_Guide.md" + ], + "note": "同一属主的中文形「见陷阱 01」→ 与空格形合并成同一个号" + }, + { + "family": "TRAP", + "old": "陷阱 (?P\\d{1,2})\\b", + "new": "TRAP-RTC-{n:02d}", + "files": [ + "docs/问题记录/SD2506_Trap_Records.md" + ], + "note": "SD2506(RTC 芯片)域:陷阱 1 → TRAP-RTC-01(§4.2 该域按 RTC 编号)" + }, + { + "family": "TRAP", + "old": "\\bTrap (?P\\d{1,2})\\b", + "new": "TRAP-NET-{n:02d}", + "files": [ + "MDK-ARM/retracted_bench_20260922/README.txt", + "scripts/README.md" + ], + "note": "NET(CH395F)域:Trap 21 → TRAP-NET-21、Trap 19 → TRAP-NET-19;两处引用的都是 CH395F_Trap_Records.md 这个活登记处,号本身不变" + } + ] +} diff --git a/test/board/gd5f_test_task.c b/test/board/gd5f_test_task.c index 099ad6b4..d23a2290 100644 --- a/test/board/gd5f_test_task.c +++ b/test/board/gd5f_test_task.c @@ -789,7 +789,7 @@ static void gd5f_phase10(void) * Phase 11 — 13h 锁存 / WIP 提前清零对照复现(2026-09-21 台架实验) * * 复现对象 = 09-20 两项读异常(归因/证伪史实见 GD5F Trap_Records - * Trap 05,本用例只承担复现职能): + * TRAP-GD5F-05,本用例只承担复现职能): * H1: 编程/擦除风暴后 13h 命令未被锁存(空操作)→ 0Bh 读残留缓存 * H2: WIP 早于 array→cache 整页装载完成而清零 → 0Bh 读混合页 * 设计: diff --git a/test/board/storage_test_task.c b/test/board/storage_test_task.c index 4c7bafc6..dc15ba2f 100644 --- a/test/board/storage_test_task.c +++ b/test/board/storage_test_task.c @@ -261,7 +261,7 @@ static void storage_test_badblock(void) * 非法名字 f_open 必返 FR_INVALID_NAME(纯 RAM 名字判定、不碰盘);合法但 * 不存在的名字返 FR_NO_FILE。本测试断言两类严格可区分——一旦哪天有人把 * FR_INVALID_NAME 误归入"卷损坏"自愈集合,这条测试就是最后的机械防线。 - * (详见 docs/问题记录/GD5F2GQ5UE_Trap_Records.md Trap 05 / AGENTS.md) + * (详见 docs/问题记录/GD5F2GQ5UE_Trap_Records.md TRAP-GD5F-05 / AGENTS.md) */ static void storage_test_name_validation(void) {