chore(编号): 存量编号全量转语义短语,门禁识别面与语料同批重打

登记簿、文档与代码注释里的存量字母加数字编号(N-x / S-x / T-x / E-x / A-x / 卡号)
一律改写为语义短语,净删 2,028 处引用;删除基线与待确认、并行分道方案、排期详述、
采集保护收尾 4 篇(内容已并入 docs/任务规划/README 与登记簿)。

门禁机器与三张账同批重打:check_ids.py 新增变更记录行豁免与第二根护栏
undecidable_total_ceiling;check_test_traceability.py 只加 stdout/stderr UTF-8
reconfigure(TC_RE 未动);check_cubemx_survival.py 的 --write 固定 newline=LF;
id_registry / id_aliases(+19 条 retired-to-phrase)/ id_known_backlog 重打。

test/ 56 个文件同步 TC 标签语义化,其中 18 个 TU 改了 CHECK / printf 里的标签文字,
是本批唯一改变构建产物的文件集合。

为什么合成一笔、不拆四笔(实测撞闸,非偏好):pre-commit 跑钩子前会 stash 未 staged
部分,拆开后中间提交必然是「新规则 + 旧语料」——实跑可判定 85.15% < 基线 86.00%、
不可判定 1,453 > 上限 1,166,编号门禁直接拦下。编号识别面与它描述的语料只能同码移动。

实跑基线(工作区全量):754 文件 / 8,230 处编号字面量 / 可判定 7,079 = 86.01%
(基线 86.0%,容差 0.1pp)/ 不可判定绝对数 1,151(上限 1,166)/ 校验 1-6 错误级 0 /
告警 = 悬空 2(App/algo/freq.c 的 S2,属 §4.4 同号不同义)+ 孤儿 50。

基线从 84.0 抬到 86.0 的理由见 docs/门禁说明/id-check.md §7.6:本批真删了 2,028 处
引用,可判定面随真实内容上升,不是把分母做小。同批新增排除 docs/硬件平台/ 语料,使
识别面少 264 处——芯片手册位号与网表料号不属编号空间(registry 有 excluded_paths_note)。

⚠ 余量只剩 0.11pp(约 10 处)与绝对数 15 处:把「可判定的引用」改成散文会立刻撞第二
根护栏。另遗留一项:id_aliases 里 retired 的 N / S / T / A 别名没有 scope(U1~U5 有),
今后有人新写一个 A-4,校验 3 不会响,只能靠人,建议下批补 scope。

固件不变证据:115 个 .c/.h 剥注释并归一字符串后与 HEAD 逐字节全等,残留代码差异 0;
App / Src / Drivers 的字符串字面量零改动。@build 0 错误 0 警告;40/40 主机套件、2,889
断言全通过;覆盖率 line 89.2% / func 92.6%;pre-commit 48 钩子 --all-files 全绿;
check_doc_links --all 通过(176 文档,章节引用无法判定 0);逐字节卫生核过:14 个带
BOM 文件与 HEAD 一致、0 个 CR、0 个 U+FFFD,字符串字面量纯 ASCII。

.cubemx_survival_baseline.json 的 watchdog-module 哈希 56bf27 变 2bb051 属合法:
Src/freertos.c 的 USER CODE 区内只有注释文字随编号改写,代码未变。

同批带上体积同码凭证与 RAM 台账行(@build 之后盖戳):RW_IRAM1 79,008 B / 60.3%,
RW_CCM 57,376 B / 87.9%,阈值 92%。
This commit is contained in:
2026-10-26 12:28:14 +08:00
parent 7635480e06
commit 0f7b5a87fb
253 changed files with 2234 additions and 4541 deletions
+11 -11
View File
@@ -38,7 +38,7 @@ typedef enum {
NET_MSG_CONNECT,
NET_MSG_LISTEN,
NET_MSG_ACCEPT,
NET_MSG_DROP_CONN, /* E-02 收口:主动拆会话、保监听(见 net_drop_conn) */
NET_MSG_DROP_CONN, /* 主动拆会话、保监听(见 net_drop_conn) */
/* F-NET-2/3:NET_MSG_RESYNC_LISTEN / NET_MSG_RELISTEN 已删——
* 静默回收由对账⑤自动认领(net_reconcile_tick),重建由 reconciler
* 形态③④/D10 单一
@@ -186,7 +186,7 @@ int net_accept(int sockfd, struct net_sockaddr *addr, int *addrlen);
* 函数说明:1. 不变量 II(单一重建所有者;补齐 ESTABLISHED 放行):取代已退役的
* `net_can_accept()`(只认 ESTABLISHED)作为监听 accept 门控——原门控使
* :7003 永不进 `net_accept()`,
* `net_lost_connect_probe`(CONNECT 事件未收到补 accept,N-30 实证的
* `net_lost_connect_probe`(CONNECT 事件未收到补 accept,TRAP-NET-20 实证的
* "数据被吞/425"主根因修复)对该端口等于从未运行
* 2. 放行 LISTENING:探针与 "closed-but-readable 接受" 都发生在
* `net_accept_locked` **内部**,门控挡在外面就永远到不了
@@ -196,7 +196,7 @@ int net_accept(int sockfd, struct net_sockaddr *addr, int *addrlen);
* (i104 200ms 抢不过对账② ~400ms 去抖)永不 accept、会话整场饿死
* (实测全 18 项 FAIL)。此态 accept 必返 fd,无风暴风险
* 3. 放行 CLOSED+auto_relisten **且 readable≠0**(有残留数据):
* 保住 N-30 的 "closed-but-readable" 接受;**无残留时必须返回 0**,
* 保住 TRAP-NET-20 的 "closed-but-readable" 接受;**无残留时必须返回 0**,
* 否则调用方会在整个 CLOSED 窗口内每轮发起 `net_accept`(RPC 无上界)
* → 队列积压 → 喂不上狗(2026-10-12 P2a 台架实测 48 条 task stall)。
* 重建由 `net_reconcile_tick` 形态③④ 负责,调用方无需催促
@@ -251,7 +251,7 @@ int net_connect(int sockfd, const struct net_sockaddr *addr, int addrlen);
* 拷贝数据后触发发送——健康链路下(实测 219us 量级)行为与旧版逐字节一致
* 2. 慢路径:自旋超预算后把请求**挂起登记**给 netTask,由
* net_send_pending_tick 在发送缓冲区空闲时续传(分片 NET_SEND_CHUNK_MAX),
* 调用方在任务通知上睡眠——**不再占用 netTask 执行者**(消除 E-02 队头阻塞)
* 调用方在任务通知上睡眠——**不再占用 netTask 执行者**(消除队头阻塞)
* 3. 短写语义:无论快路径超时还是挂起完成,只要存在未写完字节即按已发数返回,
* 不假装全部成功;调用方按短写重试剩余部分(见 BSD_Socket_API 使用指南 §3.5)
* 4. ⚠ 禁止在 IWDG required_mask 内任务做**无预算**的整块发送;挂起路径本身
@@ -319,7 +319,7 @@ int net_setblocking(int sockfd, int on);
* 函数说明:1. **显式预算**便捷入口(等价 Python settimeout,
* 不再有隐藏默认值):net_recv 的无限阻塞 + 本接口的显式预算构成
* 超时语义的全部来源;超时首选仍是 net_select
* 2. E-02 修复配套:lftpd 等"等对端下一行/下一块数据"的调用方
* 2. 修复配套:lftpd 等"等对端下一行/下一块数据"的调用方
* 若无限阻塞 recv,会把 netTask(全部 socket 操作的唯一执行者)长期占住
* 3. 用本接口把等待切成 ≤timeout_ms 的片,调用方自行累计总预算:总超时语义不变、单次占用有界
* 4. 超时用独立返回码 -2(而非靠 errno 区分)→ 无跨任务 errno 竞态
@@ -394,7 +394,7 @@ int net_recvfrom(int sockfd, void *buf, int len, int flags,
int net_close(int sockfd);
/*
* 函数功能:主动拆掉当前 TCP 会话,**保留监听**(E-02 收口)
* 函数功能:主动拆掉当前 TCP 会话,**保留监听**
* 入口参数:sockfd - socket 描述符
* 返回值:0 成功(**监听型 fd 的“成功”= 拆除与重建已登记**,芯片未必已拆完,
* 见函数说明 2;含幂等:无活动会话),-1 失败
@@ -403,14 +403,14 @@ int net_close(int sockfd);
* 单连接模型禁止对监听 fd net_close(连监听一起毁,AGENTS 约定),
* 而挂起但 TCP 仍活的客户端会永久占住单连接监听(PC 内核自动
* ACK keepalive,芯片僵尸判不死——《网络自愈架构设计》§5.2 E13 定案缺口)
* 2. 实现(2026-10-25 N-17 起):auto_relisten fd = 登记 QUARANTINE 隔离
* 2. 实现(2026-10-25 探针窗口心跳缺口修复起):auto_relisten fd = 登记 QUARANTINE 隔离
* 沉降 + REQ_DROP 重建请求,**登记即返**——“FIN 关闭 + 排渣 + 排空
* 事件 + 等 byte0=00H”(TRAP-NET-18 异常释放语义)与重建由
* net_listener_tick 按 30ms 节奏异步执行,端口恢复窗 ~0.4-1s 与被动
* 断连同型;**调用方不得按旧语义假设“返回即芯片已 CLOSED”**——返回
* 后 accept/recv 得 WOULDBLOCK 直至重建完成(time_sync 既有轮询天然
* 容忍)。旧同步形态曾使 netTask 占用 400-600ms、五任务心跳同窗
* 缺席声明 stall(《网络自愈架构设计》§4.6 N-17 记录,勿复活)。
* 缺席声明 stall(《网络自愈架构设计》§4.6 记录,勿复活)。
* 非 auto_relisten(client fd)无监听可保,仍同步排渣(600ms 封顶)
* 3. 幂等:非 ESTABLISHED/CONNECTING 直接返 0,不动监听
*/
@@ -441,7 +441,7 @@ int net_set_event_cb(int sockfd, net_event_cb_t cb, void *arg);
* 出口参数:无
* 返回值:错误码(NET_ERR_xxx);本任务尚无失败记录时为 NET_OK(0)
* 限定条件:无(任何上下文可调用,含中断——查询为纯本任务索引读)
* 函数说明:1. **按任务隔离**(2026-09-25 E-03 修复):错误码存在每个任务自己的
* 函数说明:1. **按任务隔离**(2026-09-25):错误码存在每个任务自己的
* 槽位里,任务间互不干扰,不存在跨任务覆写竞态——旧实现的单一全局
* 变量会被 netTask/其他任务的 net 调用交错覆盖,调用方可能读到别人的码
* 2. 语义:本任务最后一次返回 -1 的 net_*() 调用所对应的精确码;
@@ -562,13 +562,13 @@ net_sock_t *net_sock_raw(int sockfd);
* 返回值:err 原值(便于写成 `return net_set_errno(NET_ERR_XXX);`)
* 限定条件:无
* 函数说明:1. 只写本任务的槽位,其他任务读不到、也改不了 → 消除跨任务覆写竞态
* 2. N-32 §10 模块化:由 net_socket.c 的 static 提升为**模块间可见**,
* 2. 监听生命周期模块化:由 net_socket.c 的 static 提升为**模块间可见**,
* 供 net_listener.c 等同目录内部模块复用(定义仍在 net_socket.c)
*/
int net_set_errno(int err);
/* 「记本任务错误码 + 统一失败返回 -1」的紧凑写法(取代 `s_net_errno = X; return -1;`)
* N-32 §10:原定义在 net_socket.c,随 net_set_errno 一并提升到本头文件 */
* 监听生命周期模块化:原定义在 net_socket.c,随 net_set_errno 一并提升到本头文件 */
#define NET_ERR_RETURN_1(err) (net_set_errno(err), -1)
/*