wandering1
|
7c8669e52a
|
feat(屏板): USART1 700 kbaud + 收中断传输层 sb_link(1-2/1-3)
批 1 的 1-2 / 1-3:把屏板(DTU-LCD)发来的 6 B 帧 A 在 USART1 上稳定收下来。
1-2 波特率:.ioc 不保存任何 UART 的波特率(只有
USART1.IPParameters=VirtualMode),GUI 里改也不落盘,所以只能在
Src/usart.c 的 USER CODE BEGIN USART1_Init 2 区覆盖 huart1.Init.BaudRate
后重调一次 HAL_UART_Init(第二次调用时 gState 已非 RESET,HAL 只重算
BRR、不再跑 MspInit,GPIO/DMA/NVIC 不会被重配)。开机日志实测
BRR=0x0078,与理论值 84 MHz/(16x700 kHz)=7.5 逐位相符,误差 0%。
1-3 收中断:新建 Drivers/BSP/ScreenLink/sb_link.c/h——16 B 缓冲 + IDLE
中断断帧、帧 A 校验、错误中断里按 RM0090 清 ORE/NE/FE/PE、周期统计上报。
HAL_UARTEx_RxEventCallback / HAL_UART_ErrorCallback 是全局单例(唯一实现
在 rs485.c),故只在那里各加一行转发,按句柄过滤放在 sb_link 内。
台架实测(PC + USB 转 TTL 顶替屏板,COM6@700000)撞出两个真问题:
- 错误回调里无条件重挂 -> 出现 err=160 / rearm=160 同步增长,看着像每帧
都重挂失败。真因是 HAL 把 NE/FE/PE 归为非阻塞型(接收照跑、RxState 仍是
BUSY_RX),此时 ReceiveToIdle_IT 只会返回 HAL_BUSY。改为仅当
RxState == HAL_UART_STATE_READY(ORE 那类阻塞型)时才重挂。
- 日志字面量里带中文 -> ARMCC #870-D invalid multibyte character
sequence。字面量一律纯 ASCII,中文只写注释。
验证:主机单测 81/81 PASSED(test/host/sb_link/,其中按 RM0090 的清除语义
把"必须 SR->DR 顺序才清得掉 ORE"钉成断言);Keil 0 错误 0 警告;台架
rx == 发送帧数、ok == rx、crc=0、len=0、size=6、keys 随按键帧递增;先用
错波特率灌 64 B 垃圾(len=31、bits=0x06)后自动恢复且 rearm=0。
新增 test/host/screenlink_bench.py 作为可复跑的屏板激励(--key / --glitch-baud)。
|
2026-10-29 20:13:18 +08:00 |
|
wandering1
|
2c69a6ca07
|
docs(屏板): 订正 CRC 字节序口径(低字节在前)
写 1-1 时用屏板自己的算法复算了线上字节,发现文档里"CRC 高字节在前"的说法
与真实顺序相反,一并订正。
事实:屏板 Calculate_CRC() 返回的不是标准 CRC-16/MODBUS 值,而是高低互换后
的「线上字」("123456789" 它返回 0x374B,标准值 0x4B37)。于是
RS485_RefreshScreenCMD() 里 cmdbuf[4] = crc>>8(注释写"CRC校验高字节")
实际写出去的是低字节——两处命名都反,线上字节是对的(标准 Modbus 低字节在前)。
照字面实现会让屏板把每一帧都判成 CRC 错,而它的超时判定只看"收没收到一整
包"、不看 CRC,现场只表现为画面不刷新,极易误判成波特率或时序问题。
- 产品需求 §5.16.2:帧 A 表的 4/5 偏移改成低/高,补一段字节序说明与实测值;
帧 B 的 CRC 行、§5.16 的通道概述、实施清单第 11 条同步。
- 产品需求 §5.16.2:RT_CMD 周期 275 -> 280 ms(判据 RT_count > 55 即第 56
拍 x 5 ms;屏板源码注释里的 275 是少算一拍)。
- 屏板链路.md:4.2 的帧 B 布局与 0-3 的验收命令示例同步,并指向单测向量;
1-1 标完成。
|
2026-10-29 19:18:11 +08:00 |
|
wandering1
|
71b6a5fa14
|
docs(屏板): 批 0 的 0-3 接法落纸
0-3 的交付物是"接法与验收方式写清楚"。网表核对结果:ST_TX0 / ST_RX0 只连
U5.A10 / U5.B10 与 MCU 的 101/102 脚(U17 就是 MCU 本体,101/102 = PA9/PA10),
CN1 上没有任何 USART1 端子——USART1 的 TTL 唯一出口是 U5 子板连接器。
- 决策一下方新增「接法与验收」:三行接线表(U5.A10 -> 屏板 PA3、
U5.B10 -> 屏板 PA2、共地),加三条易错点(必须交叉、别去 CN1 找、
别抓错同一连接器上 USART3 的 ST_TX2 / ST_RX2)。
- 验收方式写死:无实物时用 PC + USB 转 TTL 顶替屏板发 6 B RT_CMD 帧,
判据 Size==6 / CRC 100% / 10 min 无丢帧 / 拔插 TX 线后自愈。
"6 B 能被收到"这条要等 1-3 的接收中断落地,实测随 1-3 做。
- 0-3 标记完成(落纸部分),§0 的执行顺序段落改成已完成口径。
|
2026-10-29 19:04:20 +08:00 |
|
wandering1
|
6531c4a4bc
|
chore(台架): 台架串口默认口改 COM3
日志口迁到 RS232#1/UART5 之后,台架那根线接在 CN1 的 RS-232 端子上,枚举
出来是 COM3;.serialtest/config.json 还写着 COM6,@test / @build /
serial-assistant 不显式指端口时就会去开一个已经没人说话的口,抓到空日志。
- .serialtest/config.json:portName COM6 -> COM3。
- 产品需求 §9.13:物理前置改成已完成口径,写明台架口由 COM6 变 COM3。
- 数据可信:资源图例里的台架串口同步成 COM3。
docs/测试说明/m2_data/README.md 里的 COM6 是 2026-09-22 那次运行记录,按当时
事实保留不改。
|
2026-10-29 19:04:08 +08:00 |
|
wandering1
|
7dbc8f8676
|
docs(屏板): 批 0 的 0-1 / 0-2 标记完成
0-1:台架线已换成 USB 转 RS-232 适配器,接 CN1.10 / CN1.12 / CN1.8,
COM3 在 RS-232 侧可读可抓。
0-2:提交 f5161e15,控制台端口收口到 huart5。判据全部实测:
开机日志 8 个锚点全中、启动到 net init: OK 用时 661 ms、
连续 10 分钟 1218 行零 [ERR] 零 dropped、USART1 已无控制台写入。
|
2026-10-29 18:46:25 +08:00 |
|
wandering1
|
f5161e1567
|
feat(日志): 控制台迁到 RS232#1/UART5,USART1 让位给屏板链路
批 0 的第 2 项。USART1 是唯一 MCU 引脚直出的 TTL 通道,700 kbaud 的屏板
链路要用它,控制台必须先让开。
console_log.c 加一处端口收口块,换口只改这一段:
CON_UART / CON_UART_IRQN / CON_UART_CLK_DISABLE/ENABLE / CON_UART_INIT
代码实际改动 4 处:con_tx_bounded 的 huart1.Instance(NULL 判据、counted
回退、赋值)与 con_uart_reinit 全函数体。其余是把描述当前行为的注释里的
USART1 换成「控制台串口」;历史变更记录(2026-10-02 / 10-24)里的 USART1
保持原样,那是当时的实况。
注意事项:UART5 在 APB1、USART1 在 APB2,时钟宏不能照抄;
__HAL_RCC_UART5_CLK_ENABLE 定义在 stm32f4xx_hal_rcc_ex.h。
不改 UART 模式(2026-10-26 裁定:保持 UART_MODE_TX_RX,不动 RX 配置)。
MX_UART5_Init 在 Src/main.c:135,比 MX_USART1_UART_Init 晚几个初始化调用,
该窗口内的日志由 CON_UART.Instance == NULL 短路接住(记 dropped,不崩)。
构建:Code=236,460 RO=28,124 RW=1,876 ZI=137,084(Code 较迁移前 +4 B)。
台架验证(COM3 @115200,RS232#1 经 CN1.10/CN1.12):
- 烧录回读 no difference found;8 个 required 锚点全中,无 forbidden;
启动到 net init: OK 用时 661 ms
- 连续 10 分钟长稳:1218 行,零 [ERR]、零 dropped、零 tx_fault,
末行仍在正常 PROF 输出
- USART1 已无任何控制台写入(全文件 grep 只剩历史注释)
|
2026-10-29 18:45:59 +08:00 |
|
wandering1
|
27a700b0d8
|
docs(屏板): 删掉「日志口改 UART_MODE_TX」的说法
2026-10-26 已裁定不改 RX 配置,ORE 由 console_log.c 既有的 drain 预算与
300 ms 冷却兜住(docs/子系统设计/控制台单写者日志设计说明.md §4.4.1、§12)。
两处文档仍在要求把新日志口设成 UART_MODE_TX,会误导实现,直接删除:
- 屏板链路.md 批 0 的 0-2 第 ② 项、风险表「日志口又染上 ORE 锁存」整行、
验收清单第 0 条的「无 ORE 锁存」
- 产品需求设计文档.md 的 §5.16 硬要求 ②、端口重排第 2 条、
§9.13 第 16 条的第 ② 项
0-2 因此只剩「把 huart1 收口成一处端口宏指向 huart5」。
判据里的「无 ORE 锁存」一并去掉——ORE 是已知残余,不按它判。
|
2026-10-29 18:21:17 +08:00 |
|
wandering1
|
50c75eb516
|
docs(屏板): 批 0 日志口定为 RS232#1(UART5),落定 CN1 端子与适配器要求
2026-10-29 用户裁定:台架线走 ST_TX1 / ST_RX1 这一对,即 RS232#1,
对应 UART5(PC12 / PD2)。此前文档把默认日志口写成 USART2(RS232#3),
与这次裁定不符,一并改掉。
网表核对(docs/硬件平台/V0.1.tel 逐段可查):
PC12 -ST_TX1- U9.3 -> U9.6 -TX1- U13.11 -> U13.14 -RS232_TX1- CN1.12
PD2 -ST_RX1- U9.2 <- U9.7 -RX1- U13.12 <- U13.13 -RS232_RX1- CN1.10
由此落定三件事:
1. 台架端子:适配器 TXD 接 CN1.10、RXD 接 CN1.12、GND 接 CN1.7 或
CN1.8(CGND)。方向是交叉的——CN1.10 是板子的接收端。
2. RS232#1 没有 TTL 出口:ST_TX1 / ST_RX1 在网表里只连 U9 的 3 脚 /
2 脚与 MCU 两个脚,既无连接器也无测试点。唯一外部出口是 CN1 的
RS-232 端子,所以必须换 USB 转 RS-232 适配器;现有那根 TTL CH340
直连不了,接上去轻则不通信、重则打坏 U13 或适配器。
3. U14 是 RS232#3 的网口座(3 脚 RS232_TX3 / 6 脚 RS232_RX3),本通道
用不上。原文「改接 CN1(或 U14)」会把接线引到错误的通道上,删掉。
0-2 的目标端口随之从 huart2 收窄为 huart5(不再二选一)。huart5 现为
115200 8N1 / UART_MODE_TX_RX,业务代码无人使用,仅 Src/stm32f4xx_it.c:565
挂着 IRQ 入口;改 UART_MODE_TX 要在 .ioc 里做,Src/usart.c 是生成物。
改动面:屏板链路.md(决策二表、批 0 的 0-1 / 0-2、台架步骤 0、风险表各
一条)与产品需求设计文档.md 的 §9.13 物理前置段(原文同样写着「或 U14」)。
|
2026-10-29 18:14:44 +08:00 |
|
wandering1
|
9191c1d966
|
取窗竞态的原因
|
2026-10-29 18:06:33 +08:00 |
|
wandering1
|
126c4bf57f
|
docs(algo): 5.3 节补窗首下标的圆周图(三种写法对照)
- 新增配图 采样环缓冲_窗首下标.svg:左侧 40 格圆环走一遍 head = 5、n = 20
的「往回退 19 步」(跨过 0 与 39),右侧把直接减 / 16 位回绕后再取模 /
先加 DEPTH 三种写法的结果并列,只有第三种落在 25。
- 与 5.2 的环形布局图分工:那张讲「窗在哪几格」,这张讲「下标怎么算出来」,
不重复同一张图的语义。
- 生成器 gen_sample_ring_start_svg.py 顺带把 OVERFLOW 明细改到末尾统一打印
(原先只在开头打,折行类告警只报计数、看不出是哪一条)。
- 门禁:doc-links --sections-strict 通过;id-check 新增行无未登记编号;
generated-fresh 22 个生成器 17 一致、0 新漂移;产物连跑两次 sha1 不变。
|
2026-10-29 17:29:15 +08:00 |
|
wandering1
|
e71d623e60
|
docs(algo): 5.3 节补窗首下标的圆周图(三种写法对照)
- 新增配图 采样环缓冲_窗首下标.svg:左侧 40 格圆环走一遍 head = 5、n = 20
的「往回退 19 步」(跨过 0 与 39),右侧把直接减 / 16 位回绕后再取模 /
先加 DEPTH 三种写法的结果并列,只有第三种落在 25。
- 与 5.2 的环形布局图分工:那张讲「窗在哪几格」,这张讲「下标怎么算出来」,
不重复同一张图的语义。
- 生成器 gen_sample_ring_start_svg.py 顺带把 OVERFLOW 明细改到末尾统一打印
(原先只在开头打,折行类告警只报计数、看不出是哪一条)。
- 门禁:doc-links --sections-strict 通过;id-check 新增行无未登记编号;
generated-fresh 22 个生成器 17 一致、0 新漂移;产物连跑两次 sha1 不变。
|
2026-10-29 17:28:48 +08:00 |
|
wandering1
|
c377fc8c15
|
docs(algo): 采样环缓冲补「为什么需要/设计思想」两节与两张配图
- 采集与算法层设计说明第 5 节由单段说明拆成 5.1~5.5:为什么需要这一层
(三个缺口 + 两个被否决的替代方案)、设计思想(五条不变量)、环内布局
与 start 推导、API 契约、要点与禁令。
- 新增两张配图(生成器 + 产物同批提交):
采样环缓冲_为什么需要.svg —— 上游 1 kHz 覆盖写只交最新一帧 vs 下游
20 点滑窗,缺口 19 点,以及三个消费者必须同源;
采样环缓冲_环形布局.svg —— 40 格环里哪 20 格是本窗、写指针指「下一格」、
回绕方向与三条设计不变量。
- 5.5 补一条「读者与写者必须同任务」,与故障录波设计说明的取窗竞态口径一致。
- 门禁:doc-links --sections-strict 通过(28 处章节引用全部可判定);
id-check 新增行无未登记编号;generated-fresh 21 个生成器 16 一致、0 新漂移。
|
2026-10-29 17:15:48 +08:00 |
|
wandering1
|
c63bd029a9
|
feat(门禁): 新增 skill-size 钩子——SKILL.md 不得超插件写侧上限 65536
dsh-mnemon 的 MAX_SKILL_BYTES = 65536 只在写侧校验,加载侧从不检查,
所以正文越界的技能照常加载、却永远生成不出草案:同日两次卡死
(83194 字节与 72601 字节)都是这个形态,复位台账无效,只能瘦身。
故把上限机械化,越界与悬空指针在提交期就拦下。
- scripts/check_skill_size.py:纯标准库(裸 python 也能跑,故不解析
.venv);FAIL >65536、FAIL reference/ 指针悬空、FAIL UTF-8 BOM、
WARN ≥49152(75%——实测一次「采纳」把主文从 49821 顶到 62806);
总是全树扫,只拿 reference/x.md 触发的提交正是漏网场景;
--root 可复指到用户级 ~/.dsh/skills;--selftest 五形态(干净 0 /
临界 0+WARN / 超限 1 / 悬空+BOM 1 / 根不存在 2)全过
- .pre-commit-config.yaml 加 skill-size,files: ^\.dsh/skills/
- 新增 docs/门禁说明/skill-size.md,含盲区:拦不住插件自身的采纳写盘、
用户级技能目录不在触发面、不解析 frontmatter、不查 U+FFFD
- 计数同步 51 -> 52(实跑 48 -> 49,索引 28 -> 29 篇):AGENTS.md 与
门禁索引,另 7 处文档旧计数改写、CI 指南带日期实测行只加注
本笔先落地,技能正文的渐进展开拆分在下一笔。
|
2026-10-29 15:02:23 +08:00 |
|
wandering1
|
325abe4337
|
merge: task/screenlink-doc-factfix 合入 v2-on-ui
按代码实况校正屏板链路方案文档(docs/任务规划/屏板链路.md)决策三的三处
口径,并补 DMA 收尾必须自写的三个全局回调、新建任务的正确落点、第四名目
「数秒量级的等待」及其推导/实测区分,另按「文档只写现状」清掉三处自我纠错措辞。
31c71295 单笔提交,1 文件 +30 / -12;树内逐文件门禁 RC 0。
|
2026-10-29 13:30:35 +08:00 |
|
wandering1
|
31c7129562
|
docs(屏板链路): 按代码实况校正决策三的三处口径
三处口径按仓库实况改写:
- 看门狗必需位掩码现值是 0x1F7(App/util/task_watchdog.c 的
wd_required_mask:default/net/ftp/ui/timesync/adc/iec104/protect),
本项的口径是「一个位都不加」,不是引用某个掩码常量。
- RTOS 堆是「紧张」不是「动态任务必然创建失败」:抬栈后台架实测
free 16,400 / min_ever 8,464 B(口径 内存使用分析 §2.3);768 字的
退路任务只剩几 KB 余量,所以仍首选不新建。
- uiTask 那族阻塞里的「约 4 s」标成**推导上界**(netTask 内
ch395f_poll_cmd_status(4000U) 六处调用 + 调用方 portMAX_DELAY),
并补实测锚点:uis 峰 183 ms、uip 地板 61.3 ms、对时突发单轮 800 ms+。
补 DMA 收尾的现实约束:全工程没有任何 HAL_UART_TxCpltCallback /
RxCpltCallback 实现,HAL_UART_ErrorCallback 只有一处且只分发它自己
那条通道的句柄 → 三个回调都得自写并按 huart 句柄分发(写进 §1.3、
批 2 的 2-4、§6 风险行)。另记 .ioc 在仓库根、DMA2_Stream7 三处自洽。
§1.1 补新建任务的正确落点:Src/freertos.c 的 USER CODE 区 osThreadNew
是仓内先例,app_main_init 跑在 osKernelStart 之前、禁调创建类 API。
名目表加第四名目「数秒量级的等待」;defaultTask 的否决理由改挂到这
一族;§6 补一行采纳方案继承的 uiTask 挤占面(250 ms 日志排空、对时
突发);§7 加第三条另测:7003 拥塞时串口侧照常应答。
同时按「文档只写现状」清掉决策三里三处自我纠错措辞。
只改方案文档一份;需求文档不含这三处口径,本轮未动。
gate: 逐文件 check_doc_links --sections-strict(29 处引用 / 27 可判定)
与 check_ids_new 均 RC 0;合并后全量 ci_local 待他人技能文件
提交后补跑(主树仍有他人未提交的在飞文件)。
|
2026-10-29 13:30:06 +08:00 |
|
wandering1
|
f251162593
|
merge: task/data-trust-restructure 合入 v2-on-ui
任务:数据可信文档台阶化重构(含信号发生器动态波形验证方案)+ 故障录波立项。
两笔提交共 19 个文件:新增两份录波文档与三张配图的生成器,重写数据可信并同步
索引、登记簿、需求与 UI 状态行。代码一行未动。
主工作树在本次合并前压着四个并发会话留下的未提交项(三个 skill 文件、AGENTS.md)
与一个未跟踪目录(task-worktree 的 reference/),本任务全部未触碰;合并前后用
blob id 与 diff --stat 对账,证据在 ci-artifacts/ext-blob-before/after.txt。
跳过的 done 前置由以下证据逐项补回:merge-tree 预演打出结果树且 RC=0;两笔树内
提交已过全部门禁(doc-links / id-check-new / generated-fresh / gitlint);合并后
在主树跑全库 check_doc_links.py --all。
|
2026-10-29 13:20:05 +08:00 |
|
wandering1
|
d0e73d6553
|
docs: 录波立项波及的口径同步(索引、登记簿、需求与 UI 状态行)
任务规划 README 顺序表:录波从「当前不排」移到独立行;动态波形验证让位给录波
数据面(段文件是现成的样本出口)。
登记簿:录波与 104 文件传输拆成两行,前者解除暂缓并指向新文档。
产品需求:立项未排行、录波文件存储行、文件传输行、录波采样率行补偏离登记指针。
UI:页面补齐规划第 26 叶与 UI补齐「不做」表改指故障录波立项,旧重开条件已满足。
短板评测记录链行、ADC前端注入验证流程的读数出口注、图形绘制流程与
tools/arch_diagram/README 的生成器清单同步。
|
2026-10-29 13:19:12 +08:00 |
|
wandering1
|
b46e44d92c
|
docs(采集可信): 数据可信文档台阶化重构并立项故障录波
两份工作互锁(互相引用),故同一笔提交。
数据可信:全文按「五级台阶」重排(§1 全局 → §2 信度现状 → §3 M4 退出判据逐条 →
§4 设计约束 → §5 任务卡 → §6 顺序 → §7 决策 → §8 风险 → §9 边界 → §10 关系)。
恢复 §2.2 量纲错配(该节此前被瘦身删掉,test/host/prot_dim 的两处引用一直悬空);
新增 §2.7 与 §4.6:ADC 只验过直流静态标定,正弦动态波形一次也没采过——用信号发生
器在既有注入点注 ±2 V 以内的正弦即可验全周傅氏、测频、快照与削顶路由,不必往端子
加压、也不需要标准源。§6 手绘框图改 Mermaid。章节编号未重排:§2 / §4 / §7 / §10 被
App 与 test 的头注释当规范引用。
故障录波:用户裁定 2026-10-29 录波先行,三条口径——1 kHz(每周波 20 点)、8 路
电气量全录、一屏只画一路共 8 路可切换。新增设计说明(与产品需求 80 点/周波口径的
偏离显式登记;存原始码值而非工程量,绕开未标定闭锁与测频幅值门;四个所有者的跨
任务边界与三条并发陷阱;段文件字节布局;单通道回放显示契约;约 5.9 KB 静态增量
触发 R6)与卡片登记簿(数据面最小闭环 → 手动与保护启动触发 → 现场单通道回放页,
二期的 4 kHz、突变量启动、COMTRADE、104 文件传输不返工的结构约束写进设计文档)。
两张旧配图与一张新配图改由 tools/arch_diagram/ 的生成器产出,脚本与产物同笔提交。
代码一行未动:本波只交付文档与设计。
|
2026-10-29 13:18:28 +08:00 |
|
wandering1
|
93e057abf2
|
docs(屏板链路): 决策三改判为 uiTask 组帧 + 中断点 DMA 起发
用户问「那 200 ms 的阻塞一定存在吗」→ 逐条核屏板固件与主机侧观测面后改判。
- 拆名目:约 60 ms 是整帧的线上占用时间(硬),任务态轮询才是实现选择(可归零),
200 / 280 ms 是屏板自己的计时器,不是成本
- §1.3:DMA 从「不是必须的」改为「整帧不断帧的唯一保证」,补 USART1 TX DMA 现成、
全工程无人用、Stream7 无冲突的证据;缓冲必须落 SRAM 不落 CCM
- 决策三:采纳 uiTask 组帧 + USART1 空闲中断点 DMA 起发;不新建任务、不占堆,
看门狗位掩码不动。原否决理由换成「起发不能挂在有 portMAX_DELAY 等待的循环里,
抬优先级无效」——业务归属 uiTask 是对的,错的只是把起发挂在它的循环里
- 批 1 / 批 2 判据同步:起发在中断、整帧 59.6 ms 且无 2 字符以上间隙、组帧 ≤0.3 ms,
2-4 由建任务改为帧缓冲归属与 DMA 收尾
- §4.4 补三条「不要做」、§6 补五行风险、§7 补两项实测;周期口径 275 → 280 ms
- 需求文档 §5.16.2:200 ms 由「硬指标」改为软放弃计时,硬约束改为零间隙 /
正好 4208 B / 绝不让屏板溢出;补屏板实跑 705 882 bps(BRR=0x33,+0.84 %)
- 需求文档:时序表补第 41 / 56 拍与「有按键待报时最早 205 ms 再召唤」的撞总线窗口,
判据 8、FR-UI 判据与 §9.13 批次表同步 280 ms 与主机侧计数口径
|
2026-10-29 12:52:40 +08:00 |
|
wandering1
|
fb359af5f6
|
docs(屏板链路): 删除自我纠错叙述与冗余论证,文档只写现状
范围:产品需求设计文档 §5.16 全节(另清 §5.9 一处旧口径、
§9.13 一处旧阻塞)+ 方案文档 §0/§1.3/决策一/批 0/§5 收尾表。
删掉的历史错误叙述:
- 旧版本 BRR 推算写错那一整块(42 000 000 / 700 000 = 60 → 0x3C0);
- "PA10 未接线这条旧结论已撤销"三段 → 压成一句现状;
- "原四项未知已消解"三处、"上表保留作为取证过程";
- 调用契约表里四行已被屏板源码推翻的条目(下行长度、按键 TAG、
面板指示灯、背光对比度)与"四项未知消解"块;
- 上行表键号 1~10 就地改成语义正确的 1~9,不再用更正注解释;
- 待确认清单里已定版的帧长一条(5 项 → 4 项,重新编号);
- "第 14 条从待决定改为已决定不做" → 只写"已决定不做";
- §9.13 末尾"已消解的旧阻塞"整块;§5.9 "旧口径…作废" 一句。
压缩:readme 3208 B 冲突注 5 行 → 4 行;16 B/29 B 论证 15 行 → 6 行。
顺带修掉上一轮删除后留下的三处悬空表述("比换收发器便宜"、
"原来的速率死结因此消失"、"§0 第 2 行")。
刻意保留:屏板固件源码符号与常量(275 ms / 200 ms / 4208 B /
700000 8N1 的出处)、UART4 冻结簇那一行与"为什么是 USART1"的
选型依据——它们是依据不是历史。
口径依据:docs/文档规范.md 已裁定"新文档不再设变更记录节,
文档只写现状"。
核验:doc-links --sections-strict 两份文件均 RC 0(161 处章节引用,
98 % 可判定);新增行编号门禁 [OK];无 BOM / CR 0 / U+FFFD 0 /
无连续空行 / 单个 LF 结尾;表格列数与 HEAD 逐项比对 0 处不一致。
净变化:需求文档 +36 −73,方案文档 +7 −9。
|
2026-10-29 11:16:19 +08:00 |
|
wandering1
|
1c39785b72
|
docs(屏板链路): 删除与本方案无关的其它串口通道对照内容
用户裁定:屏板链路方案只讲 USART1 屏板通道本身,全文不得再
出现另一条采集通道的任何内容。四类处理:
- 整段删除:外部总线模块的条件任务(原 1-4)、总线极性与
方向切换两条风险行、方向控制「并进 sb_link.c」一句、两条
以另一通道驱动为对象的禁区(改它的缓冲常量、用 HAL_Delay
做建立延时)、§8 开头「与暂缓专项无关」的对照说明、决策二
表里另一通道那一行及其网表考据警示、决策一里两条已作废的
历史换方案与选型告诫。
- 改为不点名表述:全局 UART 回调的现有分发对象(给按回调名
全库检索的定位方法)、屏板接收侧 CRC 错静默丢弃。
- 术语平实化:半双工方向控制 → TX / RX 两根独立线(全双工)。
- 顺带修 4 处批 0 序号引用(0-1 挪线、0-2 迁日志口),其中
2 处是本次删除后暴露的前后不一致。
校验:被删主题的全部关键词(通道名、驱动文件名与常量名、
器件型号、总线与方向术语)全文 0 命中;Markdown 表列数一致;
UTF-8 无 BOM / LF / 无 U+FFFD;check_doc_links 逐文件通过、
check_ids_new 通过;333 → 310 行。纯文档,不动代码,不涉及
RAM / Flash 数字与 @build。
|
2026-10-29 09:25:26 +08:00 |
|
wandering1
|
49cddac0dd
|
docs(门禁计数): 工作树方案的「31 钩子」改回声明的 51——同文件第 22 行本就写着 51
真值三源互证:YAML 解析条目数 51(仓库口径的自查命令)、带 stages:[manual] 的 3 根、AGENTS.md 的
「共 51 个钩子 / 提交期实跑 48 根」、门禁说明 README 的「声明的 51」与「51 个 hook → 28 篇」、
pre-commit 使用说明的「51 声明数,一次 git commit 实跑 48 根」——全部一致,唯一离群值就是方案文档
那条表格行里的 31;而同一份文档第 22 行自己写着 51,属文档内部自相矛盾,这是最硬的判据。
:248 取 51 而不是 48:该行主语是 ci_local,本次实跑日志实证它覆盖静态 passed=47 + manual 三根 rc=0
+ gitlint 十条,正好是声明的 51 根全跑;48 是「一次 git commit 实跑」的口径(47 静态 + gitlint),
两个数分列、不许混写。同时把裸数字改成带出处指向的写法,下次加钩子这里少一个查不到来源的数。
远程CI 指南那处只加「当时」两个字:26 是 2026-10-12 那次 gitlint 环境事故的观测值,数字本身不算错,
但句子是现在语气,会被读成今天静态段的条数(现 47)。按计数同步 playbook 的最小动作加注,不重述数字。
冻结并写明类别:pre-commit 使用说明的「当时 40 个 hook」、主机单测覆盖率口径的 39/16(句中已有
「当时」);同数不同义不动——run_boot_test.py 的「31 份 boot_log」是日志份数、verify_log.py 的
rec[31:59] 是字节偏移;命中面之外不动——.venv/ 与 Lib/ 第三方、.git/ 内的 stray 报告。
邻族实测自洽、本轮未碰:22 根专属钩子 + 19 套无专属 = 41 套、28 篇索引、51/48/47 三分列。
门禁:编号门禁 [OK];doc-links --all --sections-strict RC=0(2602 处引用、无法判定 0、194 文档,
章节引用 +1 就是新增的这处 §2 指向);两文件无 BOM、CR=0、无 U+FFFD、无行尾空格、结尾单 LF、
表格仍为 5 列;旧形态复扫「31 钩子 / 31 个钩子 / 31钩子」全仓命中 0。改动不落体积门禁指纹面,
不需要 @build。
|
2026-10-29 08:54:41 +08:00 |
|
wandering1
|
8cab390aa7
|
chore(task-worktree): 活跃任务上限 3 提到 8——磁盘不是依据,锁排队才是(引用面 15 处同步)
唯一事实源是脚本常量 MAX_CONCURRENT(task_worktree.py:30),报错文案与 new 的插件树提示都插值它;
其余全是引用面同步:SKILL.md 12 行(含 frontmatter 的 description 与 whenToUse——它会进技能目录)、
方案文档表格行 + 依据段重写、启动日志原子性复验流程 1 行去掉数字。
依据段按今天的实测重写,不再拿磁盘当理由:一棵纯净检出 84.0 MiB / 2857 个受控文件(docs 独占
46 MiB),.venv 与 simulator/SDL2 走目录联接共享、不随树复制,D 盘余 1.4 TB → 8 棵全开最坏约
3.2 GB(每棵再叠一次构建产物:Keil 中间件 289 MB + 模拟器 35 MB)。真正随并行数上涨的是排队:
build 锁 TTL 1.0h、bench 锁 TTL 6.0h 分别串行化 @build 与 @test,done 的合并也必须串行——8 棵是
8 个空间,仍是一套 Keil 授权 + 一块板。
扫描按全形态跑(上限 3 / 最多 3 / 第 4 棵 / MAX_CONCURRENT = 3 / 硬上限 3 / 名额),整行打印后
另抓到两处只按数字搜不到的形态:whenToUse 里的「白占 3 个名额之一」、「确实要同时开第 4 棵」
(上限变了它必须跟着变第 9 棵,否则自相矛盾)。
冻结不改并写明类别:带日期戳的历史测量(2026-10-28 一次回收 3 棵、各 89 MB)、用户原话引语、
列表与步骤序号。「83 MB」是当时 du 口径、与本次内容字节和 84.0 MiB 同数不同义 → 只补口径注并
指回方案 §4,不合并成同一个数;方案 §2 的「对象库 234 MB」保留——今天的 294 MB 含待两周宽限期
过期的不可达对象,不把临时态钉进文档。
本轮我自己写错并已改掉:新段落引用了不存在的子命令 lock list,真命令是 lock status(全仓零残留)。
验证:上限生效用 %TEMP% 隔离小仓实测(脚本按同深度拷贝,因 REPO_ROOT 由 __file__ 反推)——前 8 棵
全成功,第 9 棵 exit 2 且文案为「已有 8 个活跃任务(上限 8)」,--force 照旧放行,list 9 行;真仓
零副作用(worktree list 仍 1 条、同级 _wt 无新建目录、无 t0* 残留)。门禁:doc-links --all
--sections-strict RC=0(2601 处、无法判定 0)、编号门禁 [OK]、py_compile RC=0、四文件无 BOM、
纯 LF、无 U+FFFD、无行尾空格。改动不落体积门禁指纹面,不需要 @build。
|
2026-10-29 08:44:03 +08:00 |
|
wandering1
|
21c68521ff
|
feat(task-worktree): 桥接 DSH worktree 插件——补共享联接、锁归属 pw:<name>、修释放不掉
诉求最初是升级 dsh-task-worktree:实测已装 0.4.6 = npm dist-tags.latest,无需升级;
真正的缺口是本仓 skill 看不见插件建的树(.dsh-worktrees/),故按用户追加指令把两套
系统接起来。回收方向刻意不打通:本 skill 永不删插件的树。
脚本 task_worktree.py:新增 plugin 子命令 list/adopt/unadopt,事实源是 git worktree
list(不是插件 manifest,免得被绕过);adopt 只补缺失的 .venv 与 simulator/SDL2
联接,已有联接跳过、实体目录绝不碰;锁归属用 pw:<name> 前缀;new 顺带提示另有 N 棵
插件树、不占活跃上限 3。
一并修一处真 bug:lock release --bench-pass 在任务无台账时先 EnvError 退出、锁释放
不掉,导致每个任务的 done 收口连坐失败;现在改为警告后仍然释放。
keil-build:default_lock_task() 增加 .dsh-worktrees/ 反推分支,插件树内的构建归属
pw:<name> 而不是兜底的 build-cli(主树行为未变,本次 @build 实测仍走 build-cli)。
.gitignore 预先忽略 .dsh-worktrees/,让插件的 ensureIgnored() 找到同一字面量、不再
改写这份受控文件。check_doc_links / check_layer_deps / gen_refgraph 三处扫描面同步
排除:仓里再放一份仓会让 doc-links 假红、并让生成的配图字节漂移到 generated-fresh。
文档:并行任务工作树方案新增 §3.4 两套系统边界对照;SKILL.md 加 §F 共存一节,同时把
§B 从 53 行压到 29 行(净 +39,用户此前在飞的改写已 rebase 保留、未被覆盖)。
验证:@build 0 错误 0 警告;scripts/ci_local.py 48 根提交期钩子与 gitlint 全绿;
check_doc_links --all --sections-strict 通过(2596 章节引用、无法判定 0);id-check-new
通过;改动文件字节体检无 BOM、CRLF 与 U+FFFD。桥接行为在临时 scratch 仓端到端跑过
(adopt 建两个 reparse、unadopt 只摘联接、pw 锁取放、缺台账也能释放、越界 name 退 2)。
|
2026-10-29 07:50:05 +08:00 |
|
wandering1
|
5f69f38dfd
|
chore(term): 并发会话收尾四处——注释术语、引用路径、计数解绑
这四处是并发会话留在工作区的完成态改动,按用户「全部都提交」一并
入库,逐项依据如下。
- App/task/protect_task.c:三处静态变量注释「上拍」→「上一拍」,
纯注释无语义变化。@build 实测 0 错误 0 警告(Code=236456
RO-data=28124 → ER_IROM1 264580,与 scripts/size_attestation.json
同数;RW=1876 / ZI=137084)。
- docs/UI设计/RemoDispBus协议与接收设计说明.md:补术语同义说明
(「远程显示」与「远程画面推送」同义,都指 RemoDispBus 推流)。
- docs/测试说明/m2_data/README.md:对端脚本路径改为
test/host/latency_peer.py——原写的 test\latency_peer.py 已不存在
(实测 No such file,脚本现落在 test/host/ 下)。
- docs/环境与部署/并行任务工作树方案.md:408:索引行改为「提交门禁
钩子逐项详解」,不在文档里写死钩子条数(声明数唯一口径源 =
docs/门禁说明/README.md §2,加钩子时少一处必改点)。
门禁:pre-commit run --all-files = 47 根 Passed、0 Failed,rc=0。
|
2026-10-29 00:58:23 +08:00 |
|
wandering1
|
41670a1cc6
|
docs(gates): 主机单测套数复点同步——41 套 / 无专属钩子 19 套
第 41 套 boot_stats 由 728d6067(2026-10-27 11:29)入库,全仓写的
「40 套 / 18 套无专属钩子」从那天起过期;本轮按实测复点同步。
真值双源互证:test/host/*/run_unit_test.py 实数 41(43 个目录,除
common 与 __pycache__)= scripts/check_test_coverage.py 自报
suites=41/41。专属钩子 22 根(YAML 解析 id 以 -unit-test 结尾,
22 条全对得上有 runner 的目录)⇒ 无专属钩子 19 套 = 41 − 22。
改当前态共 18 处:AGENTS.md 提交门禁节三处、.pre-commit-config.yaml
test-coverage 注释、docs/门禁说明/host-unit-tests.md §6 第 4 条六处
(无钩子名单首位补 boot_stats、目录数 42→43、裁定句改「裁定当时
18 套,2026-10-28 现值 19 套」)、docs/门禁说明/README.md、
docs/代码规范/pre-commit使用说明.md 两处、docs/编号规范.md、
scripts/README.md、docs/任务规划/分工说明-20261028 一条、
docs/测试说明/主机单测覆盖率口径.md 追加 2026-10-28 = 41 套 ~105 s
新实测点、test/host/sys_log_mcu/sys_log_mcu_test.c 注释行。
刻意不动:带日期戳的历史耗时与套数行(只追加新的实测点,不覆写)、
host-unit-tests.md 里「22 根 / 40 套 / 18 套无专属钩子」这句复核原文
(只在后面追加更正)、scripts/archive/id_gate/ 留档两处、
同数不同义的五处(40KB 级 / −20~40% / 不到 40 行 / 18 断言点 /
板端 RTC 套件)。钩子数 51、专属 22 根、提交期实跑 48 根本轮实测
未变,相关句一字未动。
门禁:doc-links --all --sections-strict / id-check-new --worktree /
no-mojibake / bom-drift / validate-config 全 rc=0,
test/host/sys_log_mcu 单测 rc=0;改后复扫「40 套」仅剩 3 处
(1 处刻意保留 + 2 处留档)、「42 个目录」0 处、「18 套」仅剩 2 处
(都带「当时」口径)。
|
2026-10-29 00:58:23 +08:00 |
|
wandering1
|
295eb9911f
|
ci(gates): 覆盖率总闸与全量 cppcheck 移到远端 CI 强制(提交期实跑 48 根)
用户裁定 2026-10-28:慢钩子不再压在每个 git commit 上,由远端
CI 强制;本地等价入口 = scripts/ci_local.py 的 manual 段。
实测三根耗时:cppcheck 20.5 s、test-cppcheck 38.1 s、
test-coverage 105.2 s,合计 ~165 s ≈ 一次带代码提交耗时的
三分之二(test-coverage 的 files: 覆盖 App/,改一行就跑光 40 套)。
- .pre-commit-config.yaml:cppcheck / test-cppcheck /
test-coverage 加 stages: [manual] + 理由注释;替换掉
test-coverage 上方「没写 stages → 所有阶段都跑、输出出现两次」
的旧坑注释(固定 manual 后不再有这一坑)。
- .gitea/workflows/ci.yml:static-gates job 在静态门禁步之后
新增「手动阶段门禁(覆盖率总闸 + 全量 cppcheck)」步,
if: always(),逐根 --hook-stage manual(pre_commit run 不支持
多 id),日志 ci-artifacts/manual-stage.log + 归档 + STEP_SUMMARY,
rc≠0 即失败;run 块纯 ASCII。
- scripts/ci_local.py:新增 MANUAL_STAGE_HOOKS 与 run_manual_stage()
(静态段之后默认跑),删 run_coverage() 死代码,--coverage
降级为兼容别名。
- AGENTS.md + 12 篇 docs/scripts/README:三数同源口径改为
声明 51 / 提交期 --all-files 实跑 47 / +gitlint = 48,
其余 3 根在 manual 阶段;历史测量数字只加「当时」不回改。
验证:pre-commit run --all-files = 47 Passed / 0 Failed rc=0;
manual 三根 Passed(test-coverage line 89.8% func 93.2% 41/41 套);
ci_local.py --static-only 全绿;check_doc_links --all
--sections-strict rc=0、mojibake / bom-drift / id-check-new rc=0;
ci.yml yaml.safe_load 通过。未改任何 .c/.h,故未跑 @build。
|
2026-10-28 23:04:59 +08:00 |
|
wandering1
|
16be01915d
|
chore(docs): 补齐文件末尾换行(end-of-file-fixer 实测 18 篇)
CI / 静态门禁 (pre-commit) (push) Failing after 46s
CI / 主机侧单测 (MSVC) (push) Failing after 43s
提交后台跑 scripts/ci_local.py 时 end-of-file-fixer 报 Failed 并就地修复:
17 篇补文件末尾换行、1 篇去掉行尾空行。
内容零变化:git diff --ignore-all-space 只有 1 处空行删除;18 篇均在
上一笔流水清理里被改过,恢复补丁时把上一轮的 EOF 修复冲掉了,这一
笔补回。
|
2026-10-28 22:12:59 +08:00 |
|
wandering1
|
94cce8b615
|
docs+scripts: 删除测试与架构专项文档并把引用改成就地口径
这是并行的另一路在飞的改动(本会话按用户「全部提交」指示代为落盘):
移除 docs/任务规划/测试与架构专项.md,并把指向它的引用改成就地口径
(app_assert.h / net_socket.c / ch395f_test.h 头注释改指本文件注释或
对应文档,check_size_gate.py 与 ram_baseline.py 的出处改指 CI 文档,
RAM预算台账、暂缓-RS485、采集与算法层设计说明、cubemx-survival、
id-check、两份 README 同步改引)。
如要拆回:git reset --soft HEAD~1 即可把这一笔退回工作区。
合树后 @build 0 错 0 警(Code=236456 RO=28124 RW=1876 ZI=137084)。
|
2026-10-28 22:00:34 +08:00 |
|
wandering1
|
511fd30cc6
|
docs: 清理全仓变更记录流水(43 篇整节删 / 23 篇留一行 / 5 篇保留)
用户裁定:文档只写现状,历史流水一律删掉,过程查 git log。
- 43 篇「变更记录 / 修订记录」整节删除:继电保护规划 12.6 KB、产品
需求 11.8 KB、项目部署环境 5.5 KB、BSD Socket 指南 5.3 KB、架构
总览 5.0 KB、实机测试实施指南 3.8 KB 等
- 23 篇别处仍有指向:只留节名 + 一行「本文件不再记流水账,过程查
git log」,节号与锚点不位移(doc-links 不因此断链)
- 5 篇整表保留(被当唯一证据 / 活台账引用):看门狗设计说明、配置
文件设计说明、RAM预算台账、内容页架构、本地工具路径环境变量方案
- 规范同步:文档规范 §5.1 改新裁定;测试文档模板规范删示例节与
登记句;测试开发标准流程 / UI 两篇 / 实机测试实施指南 / 四篇单测
说明 / 并行任务工作树方案 / 编号规范 的「登记变更记录」改「写进
正文」
- 技能同步:stale-doc-count-sweep / ui-verify / id-family 三个 SKILL
正文不再要求追加流水行(顺带消掉 SKILL.md:121「产品需求 §12」
失效引用)
- 修 5 处悬空指针:采样有效性校验目录锚点、BSD 指南「文末变更
记录」、docs/README 过期描述、网络自愈架构两处指向面
72 篇文档净减 600 余行;check_doc_links --all --sections-strict 可判
定比例 61% → 78%、失效引用 0;静态门禁 passed=50 failed=0;gitlint
10 条历史提交信息 0 failed。
未提交他人在飞改动:.dsh/skills/keil-build/*(%SystemDrive% 守卫)。
|
2026-10-28 22:00:34 +08:00 |
|
wandering1
|
0e4cc03c2d
|
docs(ADC): 更正注入验证口径——已知电压注入 2026-10-27 台架已闭环
数据可信.md §2.6 原写「ADC 从未采过已知电压」,那是 2026-10-23 挂账
时的现状,与 2026-10-27 的台架实测矛盾——按现状重写:实测 × 判据表 +
④ 段(端子 → AINn 子板变比)缺口 + M4 承诺边界(只到 ADC 引脚电压、
eng = 0);§2.6 节号与「承诺边界」口径保留,代码头注释的引用不断。
同族陈旧现在时一并更正:继电保护规划「引脚级注入验证仍为待做项」、
ADC通道映射 §7.1「不填任何实测数值」、ADC输入层单测说明「板端无信
号源、无法验证读到的是哪只脚」、adc_input.c 与 test/host/adc_input
两份注释「注入验证做不了」→ 统一改成「台架已一次性验过(§8.1),
主机单测与开机自检仍必要」。首帧悬案等历史叙述删除,只留结论。
顺带:ADC 输入层单测计数 101 → 103(runner 报 103/103 与 CHECK 调用
点 103 处双源互证),test/host/README.md 同数同步。
验证:@build 0 错 0 警(Code=236456 RO=28124 RW=1876 ZI=137084);
test/host/adc_input 103/103 rc=0;check_doc_links --all 0 处失效;
该批文件里的变更记录节按同日裁定一并清理。
|
2026-10-28 22:00:33 +08:00 |
|
wandering1
|
8f8d97b3d8
|
docs(编号): 批次六余账文档面——CubeMX 层号、双写疤、采集链旧层名共 61 站点
CI / 静态门禁 (pre-commit) (push) Failing after 8m4s
CI / 主机侧单测 (MSVC) (push) Successful in 27s
- CubeMX 防丢失三层优先级 L1/L2/L3(批次 3c 漏网 30 处):看门狗设计说明 25、
门禁说明/cubemx-survival 3(含「优先 L1/L2」→「优先写进 .ioc 与搬进 USER CODE
区」)、ADC通道映射 2。
- 改名遗留的中文重叠双写 14 处:菜单页面设计「一级菜单菜单」×6、「二级菜单菜单」
×2;README「语义取数与有效性」重复;存储架构「3字节字节地址」;链路延迟
「队列往返队列往返」;继电保护「出口出口与记录层」;产品需求「全周傅氏相量」重复。
- 采集链旧层名 5 处:「L2 相量层」→ 全周傅氏相量、「L0 采样驱动」→ 采样驱动层、
「L2-x 前缀」→ 相量输出标签前缀、「L1 层 v2.3」→ 语义取数与有效性层 v2.3。
- UI 菜单层级 2 处:产品需求「4 级(L0~L3)」→「4 级(主界面 / 一级 / 二级 /
三级菜单)」、「主界面 (L0)」→「主界面」。
- 登记簿条目改名「L5 队列往返基线待重验」→「队列往返基线待重验」+ 引用侧 5 处
同步(登记簿 §1/§7、实机测试实施指南 §7.3 与步骤表、编号规范 §1 好例子清单——
那个混在短语里的 L5 恰恰是个坏例子)。归档里的历史 note 原文不动。
- 归档 §10.3:四族收口记录 + 边界与裁定(peer JSON 键属冻结证据 schema 不改;
REQ2FIRST / FULLFRAME 不并入 FRAME_RT;L1-3/L1-4 属不可还原死号,就地删号留
事实;「原 L2 基线 3/10」按上下文读作主机侧回归的早期基线)。
- 判族保留(永久):硬件位号与封装尺寸 27 处(网表 L1~L3 磁珠电感、
SOT-23_L2.9-W1.3、CRYSTAL-L3.2)、芯片手册原文 3 处双写;伪命中 4 条没删
(「遥测量 测量值」「已登记登记簿」「谁来监视监视者」×2)——那些是正常词组。
- 门禁:check_doc_links --all --sections-strict 通过(195 篇、章节引用 3292 处);
git diff --check 干净;逐文件 BOM / U+FFFD / CRLF 与 HEAD 一致。
|
2026-10-28 18:57:03 +08:00 |
|
wandering1
|
83011abb16
|
docs(编号): 测试验证层级文档面清号 + 修上一批改名留下的双写与错族疤(27 篇)
同族第三道(文档面)。上一批只改了 10 篇测试文档,本笔清掉余下 27 篇的层级号,并修
那批机械替换留下的两类疤。
- 层级号改语义名:各单元测试说明的「**门禁层级** | L0.5 层(介于 L0 静态门禁与 L1
板端套件之间)」→「主机侧纯逻辑单测(介于静态门禁与板端测试套件之间)」;
「板端(L1)」「L1/L2」「L3 人工」等表头与列值同批改写;测试文档模板规范的模板
字段同步(它决定以后每篇测试说明怎么写这一栏)。
- 「模拟器回归」旧号(原文标 L3/L2)**不映射**成新语义名,就地写「模拟器回归」:
它与「主机侧回归」是两回事,硬映射等于造一处新的口径错。
- 修双写疤 17 处(替换串套替换串的产物):文档道改完 Lead 点名的 8 处后中途失败,
Lead 接手余下 9 处——测试开发标准流程 7、CI README 1、门禁说明/host-unit-tests 1、
任务规划/测试与架构专项 1。
- 修**错族替换疤**(比双写更坏:字面改对、意思改错):ADC输入层单元测试说明与
相量层单元测试说明的「介于 L0 静态门禁与 语义取数与有效性板端套件之间」——上一批
把测试层的 L1 换成了采集链层名;本笔随该行改写一并修正。产品需求 §7.4 同类问题
在上一笔(代码道)修。
- 变更记录历史行按「行内换号、日期与技术事实不动」处理(与「卡」族先例一致),
换算表与撞族警示在 scripts/archive/id_gate/编号治理历史.md §10 / §10.1。
- 刻意未动:docs/芯片手册(外部手册原文)、UI 菜单层级残留 2 处与采集链旧层名残留
(已登记 task-12)、test/board 的链路时延段号残留(task-11)。
- 门禁:check_doc_links --all --sections-strict 通过(195 篇、章节引用 3292 处);
id-check-new --worktree rc=0(剩 2 处 WARN 是变更记录行里的已停发测试专项号,
不拦提交,本笔不越族去动它);112 个改动文件 U+FFFD=0、无 CR、BOM 与 HEAD 一致;
git diff --check 干净。
|
2026-10-28 17:56:21 +08:00 |
|
wandering1
|
842d711ed6
|
refactor(编号): 测试验证层级去号——CI job / 门禁输出 / 命令行旗标换语义名 + ASCII 段名
用户裁定「我不想看到编号」。测试验证层级这一族的整族清退分三道并行:本笔是**代码与 CI 道**
(CI 步骤与门禁输出面),代码注释面另走、文档面由文档道走。
口径(旧 → 语义名 → ASCII 段名,段名只进日志/旗标/job id/文件名):
L0 静态门禁 static | L0a 钩子解释器预检 preflight | L0b 提交信息门禁 commitmsg
L0c 体积门禁 size | L0.5 主机侧纯逻辑单测 host-unit | L0.5c 覆盖率 coverage
- scripts/ci_local.py 43 站点:段标题与 [SUMMARY] 标签改 ASCII 段名(static: /
host-unit:),函数 run_l0/run_l05 → run_static_gates/run_host_unit_tests,
收尾「已跑:」列表用段名。旗标改 --static-only / --host-unit-only,**旧旗标
--l0-only / --l05-only 保留为 argparse 别名**(肌肉记忆与既有脚本片段不断档,
实测 --help 两名列出)。
- .gitea/workflows/ci.yml 42 站点:job id l0-gates → static-gates、
l05-host-unit-tests → host-unit-tests;步骤名与 step-summary 标题改语义名;
日志名 l0-pre-commit.log → static-pre-commit.log、l05-<模块>.log →
host-unit-<模块>.log;::error::/::notice:: 文案同步。yaml.safe_load 核过
两个 job id 与步骤名。
host-unit-tests;步骤名与 step-summary 标题改语义名;日志名 l0-pre-commit.log →
static-pre-commit.log、l05-<模块>.log → host-unit-<模块>.log;::error::/::notice::
文案同步。yaml.safe_load 核过两个 job id 与步骤名。
- 门禁脚本 18 站点:check_registration(登记簿理由串 7)、check_test_coverage 5、
README 8、check_generated_fresh 2、ram_baseline 2、check_size_gate 1、
ci_find_python.ps1 2、ci_runner_bootstrap.ps1 2、.pre-commit-config.yaml 2、
requirements.txt 1(保持纯 ASCII)。
- skills 7 站点:task-worktree(含 [SUMMARY] 样例两行)、mem-budget、ui-verify、
task_worktree.py 的实跑标签。
- AGENTS.md 3 站点:CI 段「只跑静态门禁 + 主机侧纯逻辑单测」、自查命令段、
「2026-10-11 静态门禁全灭」事件名。
- 归档:编号治理历史.md 新增 §10 换算表 + **撞族警示**(同形 L0/L1/L2/L3 还属 UI 设计
令牌层 / UI 菜单层级 / 采集链 / 链路时延段 / CubeMX 三层 / 硬件位号与 FTP 应答字面量
等六个族,其中 6 处在字符串字面量里,改了就是改行为——故全程只按行内置换、先判族)。
- docs/产品需求 §7.4 测试分层表:去号 + 顺带修掉上一批**错族替换疤**(该表 L1/L2 行曾被
采集链层名「语义取数与有效性 / 全周傅氏相量」「保护判据」顶替,现按内容改写为板端测试
套件 / 主机侧回归两行)。同文档 §1.5 G5 判据行同步。
门禁:ci_local --help 两面旗标并列;py_compile 7 个 .py 全过;yaml 解析通过;
check_ids_new --worktree rc=0;git diff --check 干净;17 个改动文件 FFFD=0、无 CR、
BOM 与原文件一致(含 requirements.txt 纯 ASCII)。本族无机器识别面(单字母+数字是
新增行门禁的自述盲区),口径来自自建逐行扫描器,复扫本族形态归零。
- 交接说明:文档道 teammate 在改 CI 指南时中断,剩余 9 处双写疤与 29 处 CI 标识
(job id / 日志名 / 汇总行字面量)由 Lead 接手改完,逐处仍走断言式行内置换。
|
2026-10-28 17:46:52 +08:00 |
|
wandering1
|
078a27a096
|
docs(补漏): 提交后复扫逮到两处——张数口径漏网 + 绑定叶数口径闭合
这一笔是**提交之后**按全部旧形态复扫才揪出来的(复扫是收尾硬步骤):
- docs/任务规划/README.md §1:当前态仍写「内容页黄金参考 53 → 60 页」,
与前两笔刚定的口径(当前态一律报「张」)自相矛盾 → 改报 60 张,并把
换算式写进同一句(张数 = 页面个数 + 分页页多拍的那一张)。
- docs/UI设计/页面补齐规划.md §2.3 复核行:本表说「22 叶已落地」、而
全树实测已绑 28 叶,两个数不同口径却并存在读者面前 → 补闭合式:本表
22 叶 + 立项前就已绑定、不在本表内的 6 叶(装置信息 / 交流量 / 直流量
/ 网口设置 / 自检记录 / 运行记录)= 28 叶 = UI_PAGE_MAP_COUNT;本表
未落地 5 叶 = 菜单树未绑 5 叶(33 − 28)。同时把可复核的重算方法写进
文档(按缩进判叶子:有更深缩进后继者即非叶子;再按行内 #page= 数已绑),
避免下轮再把 42 个节点行当叶子数。
刻意不动(本轮复扫的其余 37 处命中,逐条都能归类):
- 变更记录历史行(27 → 40 → 47 → 53→60 / 59、122/217、179/274、185/280、
183/278)按当日事实冻结,只追加不回填;
- 带日期戳的实测已加「当时」(font-charset.md §6.1、generated-fresh.md §7、
check_font_charset.py 注释、UI_自动化测试流程.md §2、主机单测覆盖率口径.md);
- 同数不同义:绘制缓冲红线 < 40KB、网表引脚号 119/122、字节数 262144、
覆盖率分数 97/97、uinav 快检档自己的 18 张参考帧;
- Drivers/BSP/UI/ 三个 .c 注释里的「183 字子集」是当时的 font-charset
实测注记:实测「天」「率」至今仍不在 218 字清单里,结论未失效,
而改 .c 注释按 AGENTS 须先 @build 0 错 0 警,不混进文档同步这笔。
|
2026-10-28 15:45:43 +08:00 |
|
wandering1
|
c0fcf4c4f7
|
docs(口径): 三处带日期戳的实测只补「当时」锁口径,不臆改成现值
三条命中都不是陈旧值、而是**当时的实测记录**,改成现值等于把历史测量
冒充现状;动作 = 只补「当时」二字(并按需注明现值出处):
- docs/内存管理/RAM使用分析与优化方案.md §4.1.1:2026-10-15 缩池那次的
验证口径里「11 页黄金参考」→「当时 11 页」;该集合现按入库张数报 60 张。
- docs/门禁说明/generated-fresh.md §7:2026-10-26 接线基线里的「183 字」
→「当时 183 字」(现值 = ui_cn_chars.txt 唯一码点 218,ASCII 区 0 个),
并按日期升序在 §9 末行追加当日一行说明本次只锁口径、没动旧数。
- docs/UI设计/UI_数据供给设计说明.md §9 判据表:2026-10-26 双次逐字节
一致那次写的是「当时下限 27 页」,同句现值改报 60 张(与判据本体同源)。
同数不同义、刻意不动(写明理由):docs/UI设计/UI_界面制作流程.md 的
「最坏路径 < 40KB」是绘制缓冲红线;docs/硬件平台/V0.1_网表详细分析报告.md
的 119/122 是引脚号;docs/测试说明/CH395F_Test_Guide.md 的 262144/4097
是字节数;docs/测试说明/主机单测覆盖率口径.md 的 97/97 是覆盖率分数。
|
2026-10-28 15:40:40 +08:00 |
|
wandering1
|
4ba02212eb
|
docs(门禁): 钩子计数与门禁索引同步到实测口径(51 / 50+1 / 22 / 28 篇)
实测口径(三数同源):
- YAML 解析后的 hook 条目数 = 51(不是文本 grep 声明行)。
- gitlint 未声明 stages(实测 stages = None)→ 按默认属全阶段计,
pre-commit 阶段 50 + commit-msg 阶段 gitlint 1 = 51。
- 带 -unit-test 后缀的专属钩子实测 22 根(AGENTS 的 Lead 裁定 2026-10-27:
不补第 23 根)。
- docs/门禁说明/ 下除 README 外实测 28 篇(上一轮加钩子没同步篇数)。
逐处:AGENTS.md 补齐 2026-10-25 道E 三根钩子的逐项枚举(补齐后该行
各项相加才等于 51);docs/代码规范/pre-commit使用说明.md 两阶段表
49/50 → 50/51、§5 文件表 40 → 51 并注当日 51 → 52 → 51 净零;
docs/门禁说明/gitlint.md 的 --no-verify 跳过面 39 → 50(= 51 减自身);
docs/门禁说明/README.md 索引 27 → 28 篇、grep 自查口径改为锚定行首的
实测结果、硬拦截行 16 → 22 个主机单测;test/host/README.md 16 → 22 两处;
docs/环境与部署/并行任务工作树方案.md 30 / 40 → 51;
docs/测试说明/测试开发标准流程.md 那条 2026-10-11 审计的「18 个钩子」
加「当时」锁口径、不臆改成现值;两份 skill 正文里的 id-check 说法改为
「已于 2026-10-28 退役、现行只查新增行」。
|
2026-10-28 15:37:02 +08:00 |
|
wandering1
|
dc214e1426
|
docs(UI): 内容页黄金参考当前态改报「60 张」,三数按双源实测同步
三数实测真值(每项两个独立来源互证):
- 张数 60:simulator/tests/ref/ 入库 shot_*.bin 实数 60 =
check_content_pages.py 的 PAGES 条目数 60(id 逐一对齐)。
- 已绑 28 叶 / 未绑 5 叶:ui_page_registry.h 的 UI_PAGE_MAP_COUNT 28 =
ui_menu_tree.txt 剔掉文件头注释示例行后的 #page= 实数(不剔是 29)。
- 字体 218 唯一字 / 313 字形:ui_cn_chars.txt 唯一码点 218(ASCII 区 0
个,ASCII 0x20~0x7E 由生成器子集参数另计、不算进字数);
ui_font_cn_12.c 的 .bitmap_index 条目 314 条含 notdef,剔掉 notdef →
313 = 218 + ASCII 95。
口径更正(数字一律不动):当前态计数单位由「页」改报「张」——张数 =
页面个数 + 分页页多拍的第 2 屏(runreport_p2 / sparam_p2 两张),两个数
不许互相冒充。同日先前那行「53 → 59 页」是页面个数口径、与判据本体
不同源,原文冻结不回改,只在各文件变更记录末行追加当日更正。
历史一律冻结:变更记录里的 27 / 40 / 47 / 53→60 / 59 与字库 122/217、
179/274、185/280、183/278 都是当日快照,只追加、不回改。
夹带说明:.pre-commit-config.yaml 一并入本笔——pre-commit 要求配置本身
已 staged 才允许提交;该文件的改动是 ui-golden 显示名(60 页→60 张)与
一条钩子计数口径注释(同日 51 → 52 → 51 净零,属另一类,已在此点名)。
|
2026-10-28 15:33:42 +08:00 |
|
wandering1
|
a75bc03ab5
|
docs(任务规划): 菜单树叶数实测复核 42/33/28/5 全部成立,只补判定方法与「当时」口径
按 ui_menu_tree.txt 文件头规则实测(缩进即层级、每级 2 空格、# 开头为
注释、空行忽略):节点行 42 = 9 个菜单节点 + 33 叶;叶行行尾带 #page=
的已绑 28、未绑 5(遥信类型 / 遥信防抖 / 双点遥信 / 手动录波 / SNTP设置)。
双源互证:tools/menu_gen/gen_menu.py 的 parse_tree 重跑得
nodes=42 leaves=33 bound=28 unbound=5;生成物 ui_menu_tab.h 的
UI_MENU_TAB_COUNT=42 与 ui_page_registry.h 的 UI_PAGE_MAP_COUNT=28
——两源逐项一致。剔伪命中:grep -c #page= 得 29,多的 1 是文件头第 5 行
注释里的示例行,不算节点行,故真值取 28 而不是 29。
结论:两份规划文档的当前态叶数本来就对,本笔不改任何数字,只补口径与方法:
- UI补齐.md §1 判定新增第 4、5 条:未绑 = 待做 + 不做(0 + 5 = 5)闭合式;
并写明按文本计数会把头部注释示例行算进来(29 = 28 + 1),真值以生成物为准。
- UI补齐.md §1 三个错算法:21 / 23 两个错数分属 2026-10-27「已绑 21 叶」
与「已绑 22 叶」两个时点,加「当时」锁口径,并补同一错法今天的重跑值
(未绑 14、grep 29、去重 29),注明两个 29 只是撞号、都与真值 28 无关。
- README.md §1:同步闭合式 +「42 是节点行数、不是叶数」+ 伪命中提示。
两份文档都没有变更记录表(UI补齐.md §2 明示不留完成史)→ 无历史行可追加。
未动:docs/UI设计/页面补齐规划.md 的「27 空叶子 / 6 叶落地」与
docs/UI设计/页面扩充详细方案.md §1.1 的「已绑 6 叶」都是立项快照,
文内已有 2026-10-28 复核对齐行;id_aliases.json 的「UI 剩余 21 叶」是
退役别名留档;「最坏路径 < 40KB」一类绘制缓冲红线与叶数同数不同义。
并发提示:仓库另有在飞批次(黄金参考张/页口径,含本文件 60 页→60 张一行),
本笔只含叶数相关三处改动,未带走他人内容与他人暂存的文件。
门禁:check_doc_links.py --all --sections-strict 打印「文档路径检查通过
(195 个文档)」;check_ids_new.py 查暂存区 [OK] 新增行无未登记编号。
|
2026-10-28 15:03:21 +08:00 |
|
wandering1
|
599f05be22
|
refactor(编号): 测试验证层级 L0/L0.5/L1/L2/L3 → 语义名(批次 3d·文档层)
这族是验证层级:静态门禁 / 主机侧纯逻辑单测 / 板端测试套件 / 主机侧回归 / 人工目检。
实测它出现在 **97 个文件**(40+ 个 test/host 的 run_unit_test.py、.gitea workflow、
ci_local.py 的阶段标签、以及十来篇文档)。本批只做**文档层**,代码层单列一批(见下)。
改动:10 篇文档 110 行 + 三处收尾——
测试开发标准流程 / 实机测试实施指南 / 主机单测覆盖率口径 / 门禁说明 README 与
host-unit-tests / CI README 与远程CI完整指南 / docs README / 测试与架构专项 /
pre-commit 使用说明。
映射:L0 → 静态门禁、L0.5 → 主机侧纯逻辑单测、L1 → 板端测试套件、L2 → 主机侧回归、
L3 → 人工目检;`L0b`(ci_local 的内部阶段标签)在文档里写成「提交信息门禁」。
测试层级那张表的「层级」列被删掉(名称列已承载同一信息,留着就是两列重复)。
**未做(代码层,单列批次 3d-2)**:`scripts/ci_local.py` 的阶段标签、`.gitea` workflow、
`test/host/*/run_unit_test.py` 的输出前缀、以及代码头注释里的 L0/L0.5 —— 那些是**程序标识**,
改名要连带 CI 日志格式与文档里对 `[SUMMARY] L0: ...` 的引用,属跨端改动,需单独验证。
验证:三篇主文档的层号残留 = 0;doc-links 通过;mojibake / git diff --check 干净;
表格列数已收敛为 3 列(名称 / 载体 / 抓住什么)。
|
2026-10-28 13:20:28 +08:00 |
|
wandering1
|
b9f5df5d28
|
refactor(编号): 链路延迟分段 L1~L11 → 段名(文档中文名 / C 日志 ASCII 短码,批次 3b)
这族是延迟测试的分段号(L1 SPI 字节命令 … L11 uiTask 节拍)。特殊之处:**号直接打进
串口日志字符串**,而 C 字符串必须纯 ASCII(AGENTS 铁律)——所以两份落地面用两套名:
文档(人读):SPI 字节命令 / SPI DMA / 发送分块握手 / 芯片→线上+PC / 队列往返 /
请求→首字节 / 整帧 3209B 往返 / 生产路径帧周期 / 连接/重监听 / 日志税 / uiTask 节拍
C 日志(ASCII):SPI_CMD / SPI_DMA / CHUNK_WAIT / TO_PC / QUEUE_RT / ECHO_RT /
FRAME_RT / PROD_CYCLE / RELISTEN / LOGTAX / UI_LOOP
改动:`链路延迟测试说明.md` 84 行(分段定义表的「段」列删掉、名称列即段名;正文与
基线表同步);`test/board/net_latency_test.c` 61 行(日志串与注释,行数不变、逐行替换)。
标识符一律不碰:`LAT_P13_OP_L5_RECV` / `P13_ST_L5_SEND` 这类宏与枚举仍在(它们是代码符号,
不是给人读的段号)——7 处已核完整。
一次事故:第一版把该 .c 写坏了(整篇被同名表格行覆盖),已 `git checkout` 回滚,改成
「只改命中行 + 行数断言」重做,本次 61 行、1313→1313 行不变。
验证:文档与 C 两侧段号残留为 0;doc-links / mojibake / 新编号门禁 / git diff --check 全绿。
该文件属板级测试套件(产品构建不编译它),本次只动注释与字符串,不改任何逻辑。
|
2026-10-28 13:19:04 +08:00 |
|
wandering1
|
7e15f49ff3
|
refactor(编号): UI 菜单层级 L0~L3 → 主界面/一级/二级/三级菜单(批次 3a)
这族是菜单深度号:L0 根、L1 一级、L2 二级、L3 三级。用户 2026-10-28:「编号看不懂」,
且与采集链分层的 L1~L5 撞形(同一份文档里两套 L 号,读的人得先猜是哪套)。
改法(生成物走生成器,不手改):
- `tools/menu_gen/gen_menu.py`:加 MENU_LEVEL_NAMES 常量,生成 ui_menu_tab.c 的注释从
`/* 12 L2 */` 变成 `/* 12 二级菜单 */`;重跑生成器,生成物 42 行注释随之更新。
- 文档 4 篇 113 行:菜单页面设计(94)、内容页架构(10)、01_主界面_说明(8)、
中文字体生成与配置(1)。映射:L0 → 主界面(根)、L1/L2/L3 → 一级/二级/三级菜单;
`4 级(L0~L3)` → `4 级(主界面 → 三级菜单)`;括号里的 `(L1)` → `(一级菜单)`。
范围纪律:只动 UI 菜单这一族。同名的测试层级族(L0/L0.5/L1/L2/L3,见测试开发标准流程)
与链路延迟分段 L1~L8 不动——那两个属批次 3 的另两族。
验证:@build 0 错 0 警;check_menu_rows 8 状态 PASS(5368 B 池不变);生成器重跑幂等
(rc=0,生成物只剩注释差异 42/42 行);doc-links 通过(195 文档);mojibake / bom-guard /
新编号门禁 / git diff --check 全绿。
|
2026-10-28 13:12:06 +08:00 |
|
wandering1
|
ed997a76a2
|
refactor(编号): 层内条目号 L1-1…L5-4 清退成语义层名(批次 2)
这族是保护规划的功能子号(层号-子项号),2026-10-27 已整族退役;本批把残留清掉。
实测:24 个唯一号 / 55 站点,分布极窄——52 站点在变更记录行(冻结历史)、1 行在
相量层单测说明、1 行在技能手册正文举例,其余为 .pre-commit 注释。
判据按《编号规范》§5.5「唯一例外」办:变更记录行里已停发族的号改写成层名/形态描述,
历史事实与数字一律不动。映射:
L1-* → 语义取数与有效性层 L2-* → 全周傅氏相量层
L3-* → 保护判据层 L4-* → 出口与记录层
L5-* → 动作留痕层
并列写法(L1-3/L1-4、L4-4/L4-5、L1-1~L1-3)折叠成一个层名,不留「第几项」。
改法要点:**只改命中的行**。第一版按整文件做,把无关行的中文间空格也吃掉(6 个文件
被误伤),已整体回滚重做;本版最终 14 行 / 3 文件,并自证「纯空格变化 = 0」。
顺带修掉批次 1 遗留的「测频与遥测快照测频」重复词。
有意不动:docs/测试说明/boot_log_data/ 里的真机日志与说明(现场证据,改它等于篡改);
docs/硬件平台/ 里的电感/磁珠位号(L1~L4 同形但另一族)。
验证:doc-links --all --sections-strict 通过;mojibake / git diff --check 干净;
新编号门禁自查通过;本批无 C/H 改动,@build 不涉及(上一批代码尺寸未变)。
|
2026-10-28 13:08:24 +08:00 |
|
wandering1
|
593c5d0c84
|
refactor(编号): 采集链分层 L1/L1.5/L2/L2.5/L3/L4/L5 → 语义名(批次 1)
用户裁定(2026-10-28):L1/L1.5/L2/L2.5/L3 这套层号「谁能看懂」,改用语义名。
映射(同一批定稿,含 L4/L5):
L1 → 语义取数与有效性
L1.5 → 标定折算
L2 → 全周傅氏相量
L2.5 → 测频与遥测快照
L3 → 保护判据
L4 → 出口与记录
L5 → 动作留痕
实测规模:384 站点 / 62 文件(App/algo、App/task、test/host 六个套件、docs/算法、
产品需求、架构总览、启动顺序、ADC 采样节拍、IEC104 上行、采集短板评测、内存管理、
AGENTS.md、README.md、docs/README.md、.pre-commit-config.yaml 与 scripts 里的注释)。
改法(不是全局替换,逐模式有上下文规则):
- 先吃同位语再落裸词:L1 有效性校验 → 语义取数与有效性校验、L2 相量层 → 全周傅氏
相量层、L3 保护 → 保护判据、L2.5 遥测快照 → 测频与遥测快照,避免「保护判据保护判据」
这类重复(第一版就是这么坏掉的,已整体回滚重做)。
- .c/.h 只改注释:先把字符串字面量切出去(引号数为奇数的跨行注释按整行处理),
C 字符串里的 L2-in ring 之类原样保留——AGENTS 铁律「字符串字面量必须纯 ASCII」。
- 层内条目号(L1-3 / L2-3 这类)**本批不动**,属批次 2;另外三族(UI 菜单层级
L0~L3、链路延迟分段 L1~L8、CubeMX 防丢失三层)也不动,属批次 3。
- 顺手修的措辞:范围写法 L1~L3 → 「分层(语义取数与有效性 → 保护判据)」、
CI 段「不含 L1/L2/L3」→「不含采集链分层」、目录地图里同一处并列表述。
验证:@build 0 错 0 警(Code=236456,与改前逐字节同尺寸——纯注释改动);
内存布局配图已按新脚本重生成(自检通过);doc-links --all --sections-strict 通过
(195 文档);mojibake / bom-guard / coding-standard / 新编号门禁自查 全 rc=0;
git diff --check 干净。
|
2026-10-28 13:04:02 +08:00 |
|
wandering1
|
89b6132c1f
|
docs(编号): 瘦身——58 KB/473 行 → 22 KB/222 行,过程记录进归档
用户裁定 A 方案:这份文档的「规范体系」部分已随门禁退役而死,但四件仍活着的东西
只有这里写着——① §1 政策(默认不发号 / 先问三句);② §3.3 语义标识怎么写;
③ §4.1 族总表 + §4.1.1 已停发栏(现行门禁白名单的机器投影源头);
④ §4.4 这些不是编号(防把 YX15 / 元件位号当垃圾清)。再留 §5.5 销项、
§8 门禁现状与 §8.5 退役路线、§10 速查。
其余 16 节逐字搬进 scripts/archive/id_gate/编号治理历史.md(40 KB):
1.2 / 2 八条原则 / 4.2 / 4.5 / 6 模块码表 / 7+7.1~7.3 / 8.1 基线 / 8.3 批次 /
8.4 台账 / 9+9.1~9.3(含「数据可信」任务卡号换算表),以及原变更记录 17 行流水。
归档文件带「这不是现行口径」横幅 + 归档目录,写清哪些节对应哪段历史。
两处刻意的选择:
- 节号沿用旧编号、不重排——外部文档与脚本引的是 §4.1 / §8.5 这些号,重排等于
制造一批假链接;文首加「本文范围」说明跳号去哪了。
- 文首那段「机器面才是事实源」改写:现行机器面是 check_ids_new.py 的两张
前缀级白名单(KNOWN_DASH / KNOWN_BARE),旧的 registry / 别名表 / 八项校验脚本
已随全库审计退役进归档,只在手工复查存量时才用。
引用重修(6 份文档、10 处):AGENTS 的 §9.3 换算表、数据可信 §9.3 ×2、
门禁说明 id-check 与 host-unit-tests、docs/README 的 §4.5、技能手册的 §9、
以及正文里 §4.2 / §4.5 / §8.1 / §8.3 / §8.4 / §1.2 的裸引用。
验证:doc-links --all --sections-strict 通过(195 文档);mojibake / bom-guard /
git diff --check 全 rc=0;新门禁 --worktree 自查通过;钩子数仍 51。
|
2026-10-28 12:51:17 +08:00 |
|
wandering1
|
967d29e633
|
docs(id-check-new): 补一条盲区——--all-files 下它是空转的
本门禁自己读 git diff,不看钩子传进来的文件名:pre-commit run --all-files
(也就是 ci_local.py 的 L0)把文件当全量传入、暂存区却是空的 → 它打印通过。
这与 §6 第 4 条(未跟踪文件不在扫描面)同源,但后果不同:那条只影响手工自查,
这条会让 L0 全绿被误读成「没有新编号」。写进文档,别让人踩。
|
2026-10-28 12:42:15 +08:00 |
|
wandering1
|
1668842d61
|
chore(id-check): 退役全库编号语料审计(钩子 52 → 51)
第三步(用户裁定跳过观察期直接做)。第一步 bf2a5c21 把两根护栏转报告制,
第二步 a5832788 立起只查新增行的新门禁,本笔把旧的全库语料审计整体退役:
语义标识已是默认形态,这套 99 族语料不再有人需要维护。
移动(保留可复现性,不再进提交门禁):
- scripts/check_ids.py → scripts/archive/id_gate/check_ids.py
- id_registry.json(87.6 KB,99 族)/ id_aliases.json(187 KB)/ id_known_backlog.json
一并归档;新写 archive README:为什么退役、现在用什么、怎么手工跑、归档纪律。
- 归档脚本改了自定位(仓库根往上 4 层、语料与脚本同目录)与一行退役横幅;
从新路径实跑:811 文件 / 8,051 字面量,--strict rc=0。
钩子:删 id-check(52 → 51)。现役编号门禁只剩 id-check-new(只查新增行、零语料)。
声明数 51 = commit 阶段 50 + gitlint 1,三数已对齐(AGENTS / 门禁索引 / YAML)。
连带改动:
- rename_ids.py 的别名表路径指向归档(改名工具本身没退役);
- check_ids_new.py 排除面加 scripts/archive/(语料里全是编号字面量,天经地义);
- doc-links 跳过 .mnemon/ 与 ci-artifacts/(本地记忆状态与草稿,非项目文档)——
语料搬家后这些目录里的旧路径引用会假红,它们本来就不该参与文档门禁;
- 全库 .md 里的旧路径引用改指 scripts/archive/id_gate/(含两份 skill 手册);
- id-check.md 加退役横幅并保留原文作留档;门禁索引把该行标成已退役;
- 编号规范 §8 改成「现行只有一道门禁」+ §8.1~§8.4 标为退役留档 + §8.5 ③ 置已完成;
各加一条 2026-10-28 变更记录行。
验证(实测):YAML 口径 51 个钩子、id-check 不在其中;doc-links --all --sections-strict
通过(194 文档);mojibake / bom-guard / coding-standard / git diff --check 全 rc=0;
新门禁自检 5 正例 + 29 反例仍全过。
|
2026-10-28 12:38:38 +08:00 |
|
wandering1
|
a5832788e9
|
feat(id-check): 编号门禁第二步——新增行拦截(零语料)
背景:第一步(bf2a5c21)把两根护栏转成报告制,但全库语料审计仍在跑。
它真正的用途只有一个——拦住「新写一个自造编号」;这件事不需要 99 族语料。
所以本笔落第二步:只查 git diff 的新增行,判据收窄成两张前缀表。
新增 scripts/check_ids_new.py(241 行,零语料):
- 破折形态:首段不在 KNOWN_DASH(活族 + 标准名,11 条)→ FAIL;
在 RETIRED_DASH(已停发族)→ 只 WARN,提示改语义短语。
- 裸形态:前缀不在 KNOWN_BARE(外设/器件/协议/点号,约 90 条)→ FAIL。
- 单字母 + 数字一律放行(元件位号与层次号同形,显式盲区)。
- 算术排除(SIZE-2 / LEN-1 这类是减法不是编号);跳过 [示例]/[计划] 行;
行内 [编号豁免] 为最后手段。默认查暂存区,另有 --worktree / --range / --self-test。
接线:新钩子 id-check-new(钩子数 51 → 52,AGENTS 与门禁索引已同批改),
与 id-check 双跑一个观察期;观察期后按 docs/编号规范.md §8.5 ③ 退役旧语料。
旧门禁的排除面加上新脚本(它必然写着示例令牌,否则自己拦自己)。
白名单是按真实数据调出来的,不是拍脑袋:回放最近 80 笔提交,未知形态只有 15 种,
其中 12 种是设备/协议名(RS232、RS485、OVER8、YT/YH 点号等,已进白名单)、
3 种是已停发族(P-8、N-1、F-NET-*,只 WARN)→ 调好后回放误报 0。
自证(实测):
- 自检 5 正例全部拦下、29 反例全部放行(含 TC-NET-204 / TRAP-ADC-01 / TPAFE5160 /
GD5F2GQ5UE / C12 / U15 / L3 / SIZE-2 / GPIO_PIN_5)。
- 端到端:暂存一个自造前缀 + 数字 → 钩子 FAIL;清理后 Passed。
- 反向:本页文档里举的反例自己也被拦过一次,改成带 [示例] 标记后才过——
这条正好证明它没有「文档路径」的例外面。
- 两条门禁互不干扰:old-gate rc=0、new-gate rc=0、doc-links 通过(211 文档)。
|
2026-10-28 12:27:57 +08:00 |
|
wandering1
|
2f70230646
|
docs(id-check): 记一条实测盲区——未跟踪文件不在扫描面
做 ①②③ 第一步时给两根护栏做反向自证(往一个新文件里写自造前缀 + 数字)发现:
第一版探针文件没被 git 追踪,门禁报 0 处——因为 iter_files() 走 git ls-files。
提交时跑不受影响(要提交的文件必然已进索引),但手动在暂存前跑会得到假绿。
补进 §6 限制与盲区第 11 条,免得下次有人拿手工跑的结果当门禁结论。
|
2026-10-28 12:18:18 +08:00 |
|
wandering1
|
bf2a5c21b0
|
chore(id-check): 两根护栏转报告制——编号门禁减负第一步
背景(用户裁定 2026-10-28):语义标识已是默认形态,编号体系本身不再产生价值,
而门禁每次都花时间。实测拆账:单次运行只有 1.8 s,但 近 80 笔提交里 61 笔 改了
id_registry.json / id_aliases.json / check_ids.py / docs/编号规范.md;语料共 99 族
(78 族已冻结、8 族快照、21 族未冻结),registry 87.6 KB + 别名表 187 KB。
结论:贵在养语料,不在跑检查。故先摘掉语料审计的强制面。
本笔只做第一步(①②③ 路线见 docs/编号规范.md §8.5):
- 护栏 1(可判定比例基线)与护栏 2(不可判定引用绝对数上限)改为 只打印、不影响退出码;
输出标签由 [比例] 改 [比例·报告],越线打 [报告] 两行并指向 §8.5。
--update-baseline 保留(只用来把当前值记成新记录基线)。
- 校验 1~6 不动:台账外新账照旧拦提交,这是本次减负的边界。
- 同步改口径文档:docs/编号规范.md §8 表与 §8.1 护栏行 + 新增 §8.5 退役路线,
docs/门禁说明/id-check.md §1 表 + §6 限制第 7 条 + 新增 §7.6.1,AGENTS.md 门禁段,
id_registry.json 两条 note,各加一条 2026-10-28 变更记录行。
自证(实测):
- 把 decidable_ratio_baseline 临时改 99.9、undecidable_total_ceiling 临时改 1 →
两护栏必然越线,实跑 退出码 0,只出 [报告] 两行;字节级还原 registry 后复跑正常。
- 反向自证牙还在:往一个新文件写一个自造前缀 + 数字(让 git 看见该文件)→
校验 1 报 1 处错误 + 增量拦截 FAIL,退出码 1。
- 全门禁:check_ids --strict 校验 1~6 无错误(可判定 87.15% / 不可判定 1033,仅报告);
doc-links --all --sections-strict 通过(210 文档);mojibake / bom-guard /
coding-standard / git diff --check 全 rc=0。钩子数不变(替换口径,不加不减)。
|
2026-10-28 12:18:00 +08:00 |
|