docs(net): N34 E8 风暴态深查 + T6 核实 + E9 M3 记录

- 实验方案:E8(状态依赖矩阵 2%~54%、风暴签名、三缺陷机制)
  + E9(M3 三轮迭代判据演进表与裁决、遗留观察归因)
- 盘点:F-NET-17 风暴态节 + T6 补充节(TC-NET-204 模式 C 证伪
  "close 产生锁存"强形式,锁存生成者=拆链完成事件;泵/救回同
  缓冲竞态证实;M3 补丁设计与 M5 drain-until-quiescent 状态机草案)
- 实施方案:§1.5 E8 修正(残余非稳定 3% 而是风暴态,M3/M5 互补)
This commit is contained in:
2026-10-13 05:38:21 +08:00
parent 9ac9879527
commit b8d87c62d7
3 changed files with 197 additions and 3 deletions
@@ -233,3 +233,108 @@
### 回归集建议
把 `n30_repro`(背靠背 STOR)纳入常备回归集——Trap 25 终版回归只含有间隔的 `ftp_regression`,背靠背形态不在集内,这是本次 9/10 能潜伏的测试面原因(实验方案对照台账已登记)。验收线建议:`n30_repro --n 50` 通过数与 `:21 @0ms×50`、`ftp_regression`、`ftp_abort_probe` 同时全绿,由台架定具体门槛。
## F-NET-17 残余偶发的真身:风暴态(E8 深查,2026-10-13)
E7b 的"残余 ~3%"不是稳定值:同固件同负载,故障率随设备状态在 **2%(全新启动)~ 54%(残渣累积)~ 12%(仅复位)** 间摆动(实验方案 E8 矩阵)。"偶发"的真身是**可自持的风暴态**,三个缺陷叠加:
1. **沉降自再生锁存**(M1 的硬币):沉降段 `net_listener.c:174` close 之后,拆链收尾在 ~10-20ms 后(Trap 14 延迟锁存)**重新置位** DISCONNECT;`:176` 的 SINT 读清与 close 同轮发生,读不清这枚迟到的锁存 → 沉降最后一轮"清干净"的假象下,relisten 完成后 11ms 首条连接被杀。30ms 重试粒度 vs 10-20ms 锁存延迟 = 每次重建一次硬币——E7b 的 2% 即此。
2. **泵与救回互抢**(风暴燃料):沉降段 `:172` `net_drain_chip_rx` 排空的正是 closed-with-data 救回(net_socket.c:1317)依赖的 RX 数据;救回 accept 成功返回 fd(:1352)但会话随即被杀/数据被排空 → lftpd 短读 → 425。E8 窗口 31 次 accept timeout 与 38 次救回并存为直接证据。
3. **芯片 OPEN 卡死放大**(自持结构):被杀会话芯片侧仍 OPEN(0x05),新 SYN 被接进卡死 socket(TCP 槽 0x00)→ accept → 下一枚锁存再杀 → 直到 800ms 强制放行 + close 真正落拆链才出簇。风暴期时间线(0.75s 内 3 轮"救回→杀→救回")见实验方案 E8 节。
**设计修正(覆盖 T5 版 M3/M5 表述)**:
- **M3 判据**:`chip=0x05/0x00`(Socket OPEN + TCP 槽 0x00)+ 连接年轻(<1s)= 逻辑矛盾态(活连接应 0x04)→ 不吃边沿,交对账①电平去抖二次确认。风暴窗口 100% 命中、健康路径(0x00/0x00 或 0x07)零误伤。
- **M5 语义**:`sock_reset` 必须 **drain-until-quiescent**(close 后轮询 SINT 直到 DISCONNECT 锁存出现并读清、连续两轮无新锁存才 open+listen);固定时间窗在锁存延迟抖动下必输硬币。
- **新红线**:RX 有数据 = 消费者资产——沉降/pump 重建前必须让位 accept 救回路径,排空后才准 reset;救回与重建必须单一所有者(`sock_reset` 内联裁决)。
## F-NET-17 补充:风暴态三机制代码级核实与 M3/M5 设计(T6,2026-10-13)
> 行号 = 提交 9ac9879(M1+M2+M4-lite)后的实测行号。只读核实,未改产品代码。
### T6-① 「close 已 CLOSED 的芯片 Socket 产生 DISCONNECT 锁存」——基石**修正**而非照单确认
**手册口径**:§5.35「关闭 Socket 前 CH395 会自动断开 TCP 连接」(Trap 记录定案更正引用)——close 的动作序是"先断链再关 Socket";若 TCP 已 CLOSED,断链环节无事可做。§5.52② bit3=1 只豁免 DISCONNECT/TIMEOUT 场景的自动关闭/清缓冲,**不豁免 CLOSE_SOCKET 命令本身**(close 仍清缓冲——net_socket.c:1311 注释"close+open 清缓冲"同此)。SINT bit4=DISCONNECT(ch395f.h:268)。
**证伪强形式(干净情形)**:TC-NET-204(Trap 07 定案更正,Trap 记录实测表)模式 C 正是本问题的受控实验——DISCONNECT 已发生、芯片停在 `0x05/0x00`(与风暴签名逐位相同),补 `close` → **+0 ms 回 CLOSED**、重开重连 5/5 OK;且"15 轮重开均未观察到残留 DISCONNECT(0x10)——close 顺带清掉了锁存"。即:**close 一个已 CLOSED 的 Socket 不产生新锁存,反而顺带清掉已锁存的位**。模式 A(close 一条活连接,主动拆链)5 轮同样无残留锁存。
**与 Trap 14 的张力消解**:Trap 14 的残留锁存不是 close 命令制造的,而是**拆链完成事件**——"DISCONNECT 可能在与 CLOSED 状态达成几乎同时、甚至之后才锁存"(Trap 记录 Trap 14 根因节),粘滞跨会话(B3 条目"SINT 粘滞到被读")。锁存的生成者是拆链过程(多为对端 FIN 的被动拆链收尾),不是 close 命令。
**风暴窗口的直接反证**:E8 时间线里 kill 发生在 `auto-relisten ok` **之前**(窗口内 relisten 尚未完成,沉降段 close 还没跑或没再跑)——那几枚 11ms 杀连接锁存**不可能由沉降段 close 产生**。真实来源两条:(a) 上一条 STOR 的客户端 FIN(FTP 正常行为,发完即关,Trap 25 定案)的被动拆链收尾迟到完成(Trap 14/23 的 10~20ms,Trap 25 的 >2s 不可观测窗);(b) 卡死 socket(0x05/0x00)把新 SYN 接进来又自行拆掉(§5.29 语义域),每轮自产一对 CONNECT/DISCONNECT。
**但"沉降末轮 SINT 读清不能保证静默"的实操结论仍成立**,经两条路径:
1. 拆链完成滞后于末轮读清(lead 说的硬币——生成者是拆链,不是 close);
2. **搁浅**:剩余两处全局读清(net_socket.c:1670 `net_connect_locked`、:2334 `net_close_locked` 等待环)焊死 net_poll 全局门(:441→:464)→ 锁存被搁到下一条连接的 CONNECT 全局位被读到那一刻,net_poll 同轮读 SINT 见 CONNECT|DISCONNECT 双置 → 先 CONNECT(:480-483)后 DISCONNECT(:486-489)→ accept 后毫秒级被杀。这是"锁存跨越整个沉降窗落到下条连接"的投递机制(F-NET-7 残余的实测代价)。
**基石判定**:现象成立、机制表述须修正——"close 已 CLOSED Socket 会再锁存"应改写为"**TCP 槽 0x00 不证明拆链已完成;拆链完成事件滞后且粘滞;close 命令本身对死 Socket 不产生锁存(TC-NET-204 模式 C),对活连接的主动拆链在该实验窗口内亦无残留(模式 A)**"。此修正直接改写 M5:静默判据必须是"**等到预期锁存出现并读清 + 连续静默轮**",而不是"close 后假设会生成锁存然后清掉";且静默可被新连接自身流量打破(无界窗)→ **M3 是结构性必需,不是可选加固**。
### T6-② 泵与救回抢同一 RX 缓冲——**证实**,排空后救回判据必然失败(对已存在数据)
- 同一缓冲:`net_drain_chip_rx`(net_listener.c:102-121)经 GET_RECV_LEN+READ_RECV_BUF 消费(读即推进);closed-with-data 救回判据 net_socket.c:1317 `ch395f_get_recv_len(sockfd) > 0` 读同一寄存器源。两者都在 netTask 上下文(accept RPC 与 pump/relisten 串行)→ **不是数据竞态,是先后竞态**:谁先跑谁定生死。
- 排空后 `recv_len==0` → :1317 判据对"排空时已存在的数据"**必然失败** → accept CLOSED 分支落到 :1327 即时 relisten(同样进沉降段)→ 资产二次销毁(close 清缓冲)。唯一例外:引擎仍活、客户端续发,可在两次排空间隙回填 RX——但沉降段每 30ms 排一次(:172 每重试轮)、lftpd 100ms 轮询一次 → 泵压倒性赢。
- E8 佐证:风暴窗 31 次 accept timeout 与 38 次救回并存 = 竞态双峰的直接证据(赢一次的救回拿到的也常是被排空半份的数据 → 短读 425)。
- 结论:lead 的新红线成立。裁决点收进 sock_reset 第一步(见 T6-④ QUIESCE 第 1 步):RX>0 且芯片 st[0]==OPEN 且本层 CLOSED+auto_relisten → **让位 accept**(返 BUSY 不排空),RX==0 或强制放行后才准排空+reset。
### T6-③ M3 最小补丁设计(一行级判据 + 一行级前置清零)
**字段选型:复用 `lost_conn_seen`(net_types.h:190)作 ESTABLISHED 期"可疑电平"(0/1),零 RAM**。
- 生命周期兼容:探针只在 LISTENING 期跑(accept 门 :1298),与 ESTABLISHED 期不重叠;relisten(net_listener.c:249)/pump③(:538)/listen(:1121)/RESYNC(:792)已有清零点。
- **前置一行(必须)**:`handle_connect_event` 现**不清** lost_conn_seen(grep 实测:清零点无此函数)——LISTENING 期探针残留的计数会带进新连接,使可疑判据首轮即被旁路、M3 失效。须在两个转 ESTABLISHED 分支(:3306/:3344 附近)补 `p_sock->lost_conn_seen = 0U;`。
- 备选(新增 `uint32_t estab_ms` 支持"<1s 年轻窗",32B/8 sock)不推荐:矛盾判据本身即判别器,flag 比时钟更准——滞后锁存同样能杀老年连接,age 窗会漏;代价仅为真 RST 释放也延 ~400ms(可接受,见误伤分析)。
**判据插入点**:`handle_disconnect_event` ESTABLISHED 分支,D20 甄别(:3410-3415)之后、释放留痕(:3418)之前——`st[]` 已在 :3408 读过,**零额外 SPI**:
```c
if ((st[0] == CH395F_SOCKET_OPEN) && (st[1] == CH395F_TCP_CLOSED) &&
(p_sock->lost_conn_seen == 0U)) {
p_sock->lost_conn_seen = 1U;
DBG_WARN("sock%d suspect DISCONNECT on live conn (chip 0x05/0x00), defer to reconcile", sockfd);
return;
}
```
**交对账①的衔接语义——现有代码可直接认领,对账零改动**:对账①判据(:588-589)`ESTABLISHED && (st[0]==CLOSED || st[1]==CLOSED)`,0x05/0x00 经 `st[1]==CLOSED` 命中;去抖 `s_bad` 连续 2 轮(200ms×2≈400ms)后复用 `handle_disconnect_event`(:633)再入——此时 `lost_conn_seen==1` 旁路可疑判据 → 正常释放(GRACEFUL 登记、session_dead、CLOSED、回调全套不变)。双锁存场景(第二枚边沿到来)同样因 flag 已置而直接释放:双锁存=强证据,不再三确认。
**去抖期间的状态摆位——保持 ESTABLISHED、session_dead 保持 0,这正是收益所在**:
1. lftpd accept 轮询见 ESTABLISHED → :1305 门通过 → **accept 正常返 fd**(不再依赖 closed-with-data 救回);
2. recv 快路径无状态门槛 → 消费者在 400ms 租约内排空 RX(引擎活则数据续到);
3. 对 n30 的小段 STOR:400ms 租约足以让传输完成 + 客户端正常 FIN(0x07 健康释放)→ **风暴链被"会话正常完成"掐断**;
4. 槽恢复 0x04 的形态(Trap 20 时代可恢复类):对账① bad=0 → 连接存活,flag 由 relisten/connect 清;
5. 引擎真死:消费者排空后 WOULDBLOCK,对账①释放后得 EOF——EOF 晚 ~400ms,语义不变。
**:21 @0ms 快复连为何零误伤**:
1. 健康 FIN 释放:芯片处 CLOSE_WAIT(0x07)(bit3=1 芯片不关 Socket,CLOSE_WAIT 等 MCU 关——D20 注释 :3403),判据要求恰 `0x05/0x00`,0x07 不命中;
2. 芯片静默回收形态 `0x00/0x00`:判据要求 st[0]==0x05,不命中;
3. 真 RST(恰 0x05/0x00)会命中可疑 → 代价仅释放延 ~400ms(对账①两轮),不是错状态;且 @0ms 复连时序已被 pump 窗主导(E7b `:7003` p50=1011ms),400ms 落在窗内不可见;
4. E5 健康 FIN 20/20 样本走 ①②的形态,均在可疑集合之外。
**成本**:判据 4 行 + connect 清零 1 行 + 1 条 DBG(~90B Flash),零 RAM。
### T6-④ M5 `sock_reset` drain-until-quiescent 状态机草案(阶段 2)
替换现三数组 `s_relisten_quarantine/_settle_start/_settle_dead`(net_listener.c:150-208)为 per-socket 相位机;五个重建入口(pump/D10/accept CLOSED 分支/recv EOF/pending③)已全部收敛到 `net_listener_try`,状态机天然单所有者。
```
IDLE ──(settle 登记或 try 进入)──▶ CLOSE
CLOSE: 发一次 CLOSE_SOCKET(TC-NET-204:顺带清已锁存位,保留此动作);t0=now;latch_seen=0;quiet=0
QUIESCE(每 30ms 重试轮,非阻塞):
1. RX 裁决(红线): GET_RECV_LEN>0 且芯片 st[0]==OPEN 且本层 CLOSED+auto_relisten
→ 让位 accept:返 BUSY,本轮不排空不 close
否则 → net_drain_chip_rx 排空
2. GET_INT_STATUS_SN 读即清: 见 DISCONNECT 位 → latch_seen=1, quiet=0;
否则若 latch_seen → quiet++
3. GET_SOCKET_STATUS: 记 st
4. 静默成立 := st[0]==CLOSED
&& (latch_seen || now-t0 >= LATCH_GRACE_MS) // 等过锁存延迟窗
&& quiet >= QUIET_ROUNDS // 连续两轮无新锁存
&& RX==0
&& now-t0 >= hold_min // GRACEFUL 100 / QUARANTINE 400(沿用)
→ OPEN
5. now-t0 >= RESET_MAX_MS → 强制放行 OPEN(留痕,沿用现兜底)
OPEN: SET_PROTO_TYPE/SET_SOUR_PORT/OPEN/TCP_LISTEN + 成功尾(现 :207-267 不动);
失败 → D10 30ms 重试,每轮先回 QUIESCE 第 2/3 步轻量复核(1 条 SINT + 1 条状态)
```
- 参数建议:`LATCH_GRACE_MS=50`(实测锁存延迟 10~20ms,×2.5 余量)、`QUIET_ROUNDS=2`(2×30ms)、`RESET_MAX_MS=800`(保持"必须 < 2000 放弃时限"规则)、`hold_min` 沿用两级。
- **诚实边界(来自 T6-① 修正)**:静默不是有界保证——拆链完成可被**新连接自身流量**触发(Trap 25 窗口 >2s 不可观测),状态机只能静默"已在途的拆链";"未来流量触发的拆链"只有 M3 的电平确认能接住。**M5 与 M3 互补成对,不是替代关系**:M5 消灭"沉降窗内可静默"的绝大多数锁存(E7b 的 2% 硬币),M3 兜住无界残余(风暴态)。
- RAM:三数组(uint8 + 2×uint32 ≈ 9B/sock)→ 相位 uint8 + t0 uint32 + 打包 flags ≈ 6B/sock,微负,预算友好。
- 与 T6-② 的闭环:QUIESCE 第 1 步即红线裁决点——"泵与救回互抢"在状态机内单点裁决,五入口不再各自竞速。
+4 -3
View File
@@ -27,9 +27,10 @@
| M4-lite | 删沉降段全局读即清(模块约定违规点) | net_listener.c:178 | 断"沉降热路径搁浅他 Socket 事件"放大器(**必须与 M1 同批**,E7 实证) |
回归:n30 116/120(残余偶发自愈)+ ftp_regression 11/11 + :7003 50/50 + iec104 18/18 +
Trap 23 RST/FIN 5/5+5/5 + @test PASS + 0 错 0 警。**剩余 ~3% 偶发由 M3 治本**(并入阶段 1
对账①:年轻连接(accept 后 <1s)收 DISCONNECT 且芯片非 ESTABLISHED 时,不立即释放,
交对账去抖二次确认——D20 结构性失明的电平化替代)。
Trap 23 RST/FIN 5/5+5/5 + @test PASS + 0 错 0 警。**E8 深查修正**(见实验方案 E8 节与
盘点 F-NET-17):残余并非稳定 3%,而是**风暴态**——同固件故障率随残渣存量 2%~54% 摆动;
治本 = M3(`0x05/0x00`+年轻连接的电平确认,交对账①去抖)+ M5(drain-until-quiescent 的
`sock_reset`,沉降/pump 让位 closed-with-data 救回)。M3/M5 属阶段 1/2,非止血包范围。
**常备回归补挂**:`n30_repro --n 20` 纳入 Ch395F 回归集(本轮 46/50 潜伏的测试面根因);
`MDK-ARM/ftp_abort_probe.py` 迁 `test/host/`。
@@ -215,3 +215,91 @@ CONNECT/RECV_OK(net_poll 门控焊死)→ 数据连接事件永不到达 lft
② `n30_repro` 纳入常备回归集(本轮 4 连败的测试面根因);③ `ftp_abort_probe.py` 落在
`MDK-ARM/` 目录(应迁 `test/host/`,与"脚本在库"证据通则一致);
④ 设备现跑实验固件,转正或回退由用户裁决。
### E8 残余偶发深度排查(2026-10-13 00:06–00:2x,提交 9ac9879 后固件,台架锁 N34)
**背景**:E7b 报"残余 ~3%"后,Trap 23 abort 探针(RST×5+FIN×5)再跑 n30 → **27/50**
(两个持续簇 #6-25、#44-50)——"3%"不是稳定值,故障率随设备状态在 2%~54% 间摆动。
**实验矩阵(同固件、同负载,仅设备状态不同)**:
| 设备状态 | n30 结果 | 簇形态 |
|---|---|---|
| 烧录后全新启动(E7b) | 3/50、1/50、0/20 | 偶发、自愈 |
| abort 探针 + 多轮压测累积后 | **27/50** | 两个持续簇 |
| 仅 ST-Link 复位(不重烧) | **6/50** | 两小簇(#37-38、#47-50) |
→ **状态依赖确证**:故障率 ∝ 芯片侧残留(OPEN 卡死 socket + 粘滞 DISCONNECT 锁存)存量。
**风暴签名(污染态,00:07:14.5–15.2 窗口,全部在 0.75s 内)**:
```
closed-with-data accept (drain pending) ← 救回:RX 有数据,accept 返 fd 给 lftpd
settle ×2 ← pump 的沉降插进来
standalone accept ← 下一条 SYN 进卡死芯片 socket
DISCONNECTED, releasing (chip st=0x05/0x00) ← accept 后 11ms 被杀
closed-with-data accept (drain pending) ← 又救回……循环 ×3
pump → settle ×4 → auto-relisten ok ← 800ms 强制放行才出簇
→ 5.6s 后 accept timeout (425)
```
**机制链(三个叠加缺陷,登记 F-NET-17)**:
1. **沉降自再生锁存**:沉降段 `net_listener.c:174` 的 `close_socket` 在芯片已 CLOSED
后再 close 仍会(经拆链收尾)重新锁存 DISCONNECT;`:176` 的 SINT 读清发生在
close 后**同一轮**,而锁存在 close 后 ~10-20ms 才落(Trap 14 实证)→ 沉降最后一轮
读清后残留一枚"迟到锁存",relisten 完成后 11ms 杀死首条连接。30ms 重试粒度 vs
10-20ms 锁存延迟 = 每次重建掷一次硬币(E7b 的 ~2% 偶发即此)。
2. **泵与救回互抢**:沉降段 `:172` `net_drain_chip_rx` 排空的正是 closed-with-data
救回(`net_socket.c:1317`)依赖的 RX 数据;pump 沉降与 lftpd 救回在同一 socket 上
竞速——救回 accept 成功返回(`:1352`)但 lftpd 拿到的是**被杀会话/被排空半份的数据**
→ 短读 → 425。风暴期 31 次 accept timeout 与 38 次救回并存即此矛盾的直接证据。
3. **芯片 OPEN 卡死放大**:被杀会话芯片侧仍 OPEN(0x05),新 SYN 被芯片接进卡死
socket(TCP 槽仍 0x00)→ net 层 accept → 又被下一枚锁存杀 → 风暴自持,直到
800ms 强制放行 + close 真正落拆链才出簇。
**对 M3/M5 设计的修正(比 T5 版更锐)**:
- **M3 判据升级**:杀事件时刻 `chip=0x05/0x00`(socket OPEN + TCP 槽 0x00)与
"连接年轻(<1s)"组合 = **逻辑矛盾态**(活连接应 0x04)→ 不释放,交对账①电平
去抖二次确认。该判据在风暴窗口 100% 命中、健康路径 0 误伤(健康断连芯片为
0x00/0x00 或 0x07)。
- **M5 语义升级**:`sock_reset` 必须 **drain-until-quiescent**(close 后轮询 SINT
直到 DISCONNECT 锁存出现并读清、连续两轮无新锁存才 open+listen),固定 100ms
窗在锁存延迟抖动下必输硬币。
- **新增红线**:沉降/pump 重建前**必须让位**于 closed-with-data 救回(RX 有数据
= 消费者资产,先交还 accept 路径,排空后才准 reset)——泵与救回必须单一所有者,
归 `sock_reset` 内联裁决。
### E9 结果(2026-10-13 00:30–00:47,M3 原型三轮迭代,台架锁 N34)
**T6 先修正了 E8 的机制表述**(详见盘点「F-NET-17 补充」):close 已 CLOSED socket
**不产生**锁存(TC-NET-204 模式 C 证伪强形式);锁存生成者=拆链完成事件(滞后+粘滞);
"沉降末轮读清不保证静默"仍成立,经"拆链滞后于末轮读清"+"剩余两处全局读清搁浅"两路径。
M3 因此从"可选加固"升格为**结构性必需**(静默可被新连接自身流量打破=无界窗)。
**M3 判据三轮迭代(每轮都是台架数据说话)**:
| 轮 | 判据 | n30(预置残渣后) | Trap23 探针 | :21 @0ms×50 |
|---|---|---|---|---|
| R1 | `0x05/0x00 + flag==0` | **0/50** ✓ | **0/5+0/5** ✗ | — |
| R2 | +`recv_bytes==0` | **0/50** ✓ | 5/5+5/5 ✓ | **46/50**(4 refused,p90=1540)✗ |
| R3 | +`芯片 RX>0` | **0/50** ✓ | 5/5+5/5 ✓ | **50/50** ✓ |
- **R1→R2 教训**:已读数据的会话(探针控制通道)遇 0x05/0x00 多为真死(RST/槽污染),
延迟它实测 **~1.2s**(对账 1s 冷却,非 T6 估的 400ms)打破应用窗口。
- **R2→R3 语义修正**:延迟保护的本质=**"芯片 RX 有在途数据"=不可毁的消费者资产**
(closed-with-data 救回同源红线)。@0ms 快复连(连上即关零数据)RX 空 → 立即释放,
误杀也无数据损失,后到数据由救回接住。
- 最终判据四条件:`st=0x05/0x00 && lost_conn_seen==0 && recv_bytes==0 && RX>0`;
前置补 `handle_connect_event` 清 `lost_conn_seen`(两处,T6 发现的必要前置);
对账①**零改动**认领(E9 实测 71 suspect → 全部正确接管/释放)。
**E9b 全套回归(R3 固件,Code=209552,0 错 0 警,@test PASS 回读无差异)**:
n30 ×50(预置后)**0/50** + ×20 **0/20**;ftp_regression 11/11;:21 @0ms×50 **50/50**;
:7003 50/50 p50=1007/p90=1037(回到 E7b 水平);iec104 18/18;Trap23 RST/FIN 5/5+5/5。
**遗留观察(非 E9 阻塞,已归因)**::21 @0ms×50 窗口有 `[WD] task stall`(多任务 miss)
——该窗 M3 suspect **零触发**(资产门正确让位),归因于 :21 暴力用例本身的断连 churn
(40 DISCONNECTED + 157 settle 行/20s,E7b 时代已有 MISS start 前例);列入阶段 2
`sock_reset` 沉降内联后的复验项。B10 的 :21 守护口径(50/50)通过;stall 是否先于
M1 存在无基线可考(历史日志未入库,又一"脚本在库、日志未入库"实例)。
**裁决**:M3(R3 资产门版)具备转正条件;风暴态免疫在"探针预置残渣"最恶劣前置下实证。