@furongjun1999/dsh-memory 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +572 -465
- package/docs/README.md +1 -0
- package/docs/eval/DSH/346/227/245/345/277/227/347/264/242/345/274/225v2_/345/217/202/350/200/203dsh-TUI_v1.0.md +248 -0
- package/docs/eval/DSH/346/227/245/345/277/227/347/264/242/345/274/225/346/225/210/346/236/234/351/252/214/350/257/201_v1.0.md +209 -0
- package/docs/eval/DSH/347/253/257/347/274/272/351/231/267/344/270/223/351/241/271_v1.0.md +254 -0
- package/docs/eval/P1b2_/350/257/273/351/235/242/344/273/243/351/231/205/344/277/256/345/244/215_v1.0.md +124 -0
- package/docs/eval/bench_lingshu_self/bench_self.py +140 -0
- package/docs/eval/bench_lingshu_self/self_bench_result.json +404 -0
- package/docs/eval/bench_lingshu_self//347/201/265/346/236/242/350/207/252/345/272/223/347/253/257/345/210/260/347/253/257/346/243/200/347/264/242/345/256/236/346/265/213_v1.0.md +38 -0
- package/docs/eval//344/270/215/345/217/257/351/235/240/346/200/247/350/220/275/345/234/260_P0_v1.0.md +185 -0
- package/docs/eval//345/217/221/345/270/20306_/344/270/200/351/224/256/351/205/215/347/275/256/344/270/216DSH0172_v1.0.md +171 -0
- package/docs/eval//346/225/205/351/232/234/346/263/250/345/205/245/345/256/236/346/265/213_v1.0.md +422 -0
- package/docs/eval//347/253/257/345/210/260/347/253/257LoCoMoQA/345/220/214/345/217/243/345/276/204/345/257/271/347/205/247_v1.0.md +100 -0
- package/docs/eval//347/253/257/345/210/260/347/253/257/345/271/262/346/211/260/346/261/240/350/257/204/346/265/213_/347/241/256/345/256/232/346/200/247/350/243/201/345/206/263vsLLM_judge_v1.1.md +197 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v1.md +156 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v10.md +210 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v11.md +227 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v12.md +203 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v13.md +233 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v14.md +191 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v15.md +213 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v16.md +214 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v17.md +199 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v18.md +183 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v19.md +207 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v2.md +156 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v3.md +152 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v4.md +128 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v5.md +114 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v6.md +192 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v7.md +187 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v8.md +207 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v9.md +203 -0
- package/docs/hive//345/256/211/345/205/250/345/256/241/350/256/241/345/256/236/351/224/232_v0.1.md +202 -0
- package/docs/hive//350/234/202/345/267/242/345/217/214/345/256/236/344/276/213/344/272/222/351/252/214_/350/256/276/350/256/241/345/256/232/347/250/277.md +19 -3
- package/docs/images/lingshu-moonlight-covenant-poster-preview.jpg +0 -0
- package/docs/images/lingshu-moonlight-covenant-poster.png +0 -0
- package/docs/mdcg//345/212/237/350/203/275/350/260/203/347/224/250/346/230/240/345/260/204/350/241/250_v0.1.md +40 -40
- package/docs/theory//344/270/215/345/217/257/351/235/240/345/256/232/347/220/206/344/270/216/345/244/261/346/225/210/344/274/230/345/205/210/346/241/206/346/236/266_v0.3.md +365 -0
- package/docs//344/270/215/345/217/257/351/235/240/346/200/247/347/220/206/350/256/272_v0.1.md +343 -0
- package/dsh/cordis-patch-profile-web.example.yml +35 -0
- package/lib/bridge.d.ts +9 -0
- package/lib/bridge.js +35 -0
- package/lib/cli.d.ts +3 -0
- package/lib/cli.js +66 -0
- package/lib/index.js +7 -1
- package/lib/init.d.ts +88 -0
- package/lib/init.js +287 -0
- package/lib/lib/roleplay_web.js +530 -443
- package/lib/lib/token_store.d.ts +7 -1
- package/lib/lib/token_store.js +12 -3
- package/md_cg/audit.py +12 -1
- package/md_cg/backfill.py +16 -15
- package/md_cg/backfill_bucket_zh.py +35 -0
- package/md_cg/bench_e2e_judge.py +532 -0
- package/md_cg/bench_e2e_locomo_qa.py +368 -0
- package/md_cg/bench_e2e_qa.py +256 -0
- package/md_cg/branches.py +18 -2
- package/md_cg/ccgc.py +3 -2
- package/md_cg/chain.py +19 -4
- package/md_cg/consolidate.py +7 -6
- package/md_cg/crosscheck.py +4 -3
- package/md_cg/crypto.py +439 -437
- package/md_cg/datapath.py +395 -335
- package/md_cg/evidence.py +8 -3
- package/md_cg/export.py +3 -1
- package/md_cg/forgetting.py +2 -2
- package/md_cg/fsutil.py +48 -0
- package/md_cg/hotcache.py +255 -238
- package/md_cg/interop.py +161 -22
- package/md_cg/judgment_manifest.py +177 -0
- package/md_cg/links.py +655 -622
- package/md_cg/mcp_server.py +282 -31
- package/md_cg/mdcg.py +702 -126
- package/md_cg/mdcos.py +454 -68
- package/md_cg/mreview/govern.py +5 -4
- package/md_cg/postings.py +4 -2
- package/md_cg/readcache.py +76 -18
- package/md_cg/reconcile.py +228 -0
- package/md_cg/review_cli.py +215 -0
- package/md_cg/routing.py +28 -0
- package/md_cg/run_tests.py +211 -0
- package/md_cg/scrub.py +862 -852
- package/md_cg/security.py +385 -275
- package/md_cg/selfreport.py +3 -2
- package/md_cg/signer.py +565 -562
- package/md_cg/sources.py +3 -2
- package/md_cg/stg.py +6 -0
- package/md_cg/sustain.py +1168 -1138
- package/md_cg/test_access_hints.py +147 -0
- package/md_cg/test_branch_discard_tombstone.py +136 -0
- package/md_cg/test_branches.py +259 -249
- package/md_cg/test_chain_read_isolate.py +168 -0
- package/md_cg/test_datapath_device_name.py +203 -0
- package/md_cg/test_emit_negtail_cache.py +156 -0
- package/md_cg/test_en_pipeline.py +186 -166
- package/md_cg/test_govern_directread.py +421 -0
- package/md_cg/test_i32_hotcache_env_key.py +218 -0
- package/md_cg/test_identity_attribution.py +228 -147
- package/md_cg/test_index_crossprocess_reload.py +301 -0
- package/md_cg/test_index_durability.py +238 -224
- package/md_cg/test_interop.py +4 -2
- package/md_cg/test_interop_judgment.py +228 -0
- package/md_cg/test_issue39_utf8_stdio.py +273 -0
- package/md_cg/test_links_concurrent_write.py +188 -0
- package/md_cg/test_merge_upsert.py +168 -0
- package/md_cg/test_n123_derive_expiry_chain.py +205 -0
- package/md_cg/test_n130_verify_falsified_protect.py +185 -0
- package/md_cg/test_n131_merge_gate.py +205 -0
- package/md_cg/test_none_id_write_guard.py +165 -0
- package/md_cg/test_p1x_ref_root.py +160 -0
- package/md_cg/test_p27_docindex.py +774 -765
- package/md_cg/test_p2_mcp.py +3 -0
- package/md_cg/test_p32_backfill.py +304 -298
- package/md_cg/test_p39_verify_flow.py +90 -50
- package/md_cg/test_p47_session_view.py +60 -25
- package/md_cg/test_propose_tail_index.py +157 -0
- package/md_cg/test_read_scope_b27.py +277 -0
- package/md_cg/test_readcache_default_on.py +168 -0
- package/md_cg/test_readcache_precise_inval.py +270 -0
- package/md_cg/test_readcache_prodpath.py +55 -7
- package/md_cg/test_reconcile_v0.py +294 -0
- package/md_cg/test_retr_s1.py +6 -2
- package/md_cg/test_retr_s1b.py +67 -0
- package/md_cg/test_retr_s7.py +8 -0
- package/md_cg/test_retr_s9_entity_ctx.py +181 -175
- package/md_cg/test_retr_score_once.py +208 -0
- package/md_cg/test_review_cli_attribution.py +177 -0
- package/md_cg/test_review_cli_visibility.py +235 -0
- package/md_cg/test_review_onepass.py +170 -0
- package/md_cg/test_rrf_graph_seed_cache.py +154 -0
- package/md_cg/test_security_audit.py +155 -0
- package/md_cg/test_security_audit_b26.py +161 -0
- package/md_cg/test_security_audit_v21.py +250 -0
- package/md_cg/test_semantic_canonical.py +255 -241
- package/md_cg/test_session_isolation.py +168 -0
- package/md_cg/test_snapshot_autoclose.py +187 -0
- package/md_cg/test_tail_watermark_race.py +208 -0
- package/md_cg/test_tenant_env_override_warn.py +139 -0
- package/md_cg/test_tenant_registry_corrupt_warn.py +151 -0
- package/md_cg/test_v14_fixes.py +415 -397
- package/md_cg/test_verify_dirty_reconcile.py +157 -0
- package/md_cg/theory.py +276 -273
- package/md_cg/tokens.py +734 -677
- package/md_cg/units.py +3 -2
- package/md_cg/vision_evidence.py +4 -3
- package/md_cg/whitebox_kb/wisdom/code_solidified.json +6195 -6195
- package/md_cg/whitebox_kb/wisdom/multilang_ir.py +128 -124
- package/md_cg/writepipe.py +554 -550
- package/package.json +11 -2
- package/src/bridge.ts +434 -401
- package/src/cli.ts +65 -0
- package/src/index.ts +526 -518
- package/src/init.ts +347 -0
- package/src/lib/roleplay_web.ts +1019 -932
- package/src/lib/token_store.ts +202 -192
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
# 缺陷挖掘报告 · 自主迭代 v12(swarm 二轮深挖)
|
|
2
|
+
|
|
3
|
+
- **日期**:2026-09-25
|
|
4
|
+
- **范围**(生效条件):第 12 轮 = swarm 二轮深挖,四区复核(cli / wal / gossip / tests)共 **26 条目**(confirmed 26 / rejected 0)→ 跨区重复 6 组去重后独立缺陷 **13**(本轮新发现 7 项 **N107-N113**:high 1 / medium 5 / low 1;legacy 复测确认 6 组:v5 N24、v5 N25、v5 N26、v7 N57、v7 N59、v1 #25〔report_path 指针错位,v5.md:77 留档在册〕)→ 本轮修复 **5 个补丁**,全闭 **5 个缺陷面**(v5 N24 / v5 N25 / v1 #25 / N107 / N108),**N112 随 F5 部分收窄**(不可逆销毁面 → 归档留痕,残面=无告警语义)→ 遗留 **8 个开口**(全留档 7 + 残面 1:medium 5 / low 3)
|
|
5
|
+
- **编号口径**:本轮新发现沿历轮 N 口径续编 **N107-N113**(v11 用至 N106);legacy 项沿用原轮次号——本报告会话经 grep 核实(v5.md:50 N24 / :51 N25 / :57 N26、v7.md:104 N57 / :106 N59、v5.md:77 v1 #25 report_path 指针错位均在档)。v5.md:77 双列声明「N24 = v1 #24(condition_space CLI 丢弃)」与本轮 cli 区 origin=legacy 条目一致,以 v5 N24 记。
|
|
6
|
+
- **回归**:`python -X utf8 scripts/run_tests.py --jobs 4` 全量 **189/189 通过、5 跳过(依赖缺失/平台不符)**——**本会话独立实跑 exit 0**(与 v11 同基线数:本轮守卫全部增补进既有三份 swarm 套件、未新增测试文件,套件计数不变);**swarm cargo test 门禁材料口径失败**(protocol_vm lib 编译错)——本会话已定位根因并实证现状转绿(错误机制 `--features embed` 逐字复现于 `swarm/rust_runtime/src/lib.rs:30`;当前工作树裸 `cargo test` 8/8 通过,详第四节);`npm test` **未运行**(TS 面零改动,git status 佐证);`npm run gate` **通过**(材料口径 + 本会话复现「结论:9/9 目标一致」)。
|
|
7
|
+
- **行号口径**:材料缺陷行号为缺陷时点(修复前)快照行号;本轮 swarm/swarm_cli.py、swarm/rust_swarm.py、swarm/rust_runtime/src/swarm.rs 三文件修复使行号漂移(swarm.rs 净增 268 行),材料口径的 where 与本会话读核现行行号并列注明、以现行读核为准(第二节逐项双标);swarm/rust_runtime/src/main.rs 本轮零改动,其行号材料口径 = 现行。
|
|
8
|
+
- **结构口径**(CCG 六要素):功能名(标题)/ 生效条件(范围与口径行)/ 子功能(第二~五节)/ 执行与验证方式(第四节:实跑命令与结果)/ 不适用条件(第七节:跳过与未运行项)
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 一、执行摘要
|
|
13
|
+
|
|
14
|
+
本轮为 swarm 二轮深挖:四区复核 26 条目全部 confirmed(rejected 0——四区均无证伪/剔除项,如实记录),去重后 13 独立缺陷,5 补丁全闭 5 面、收窄 1 面,留档 8 开口。四个主题:
|
|
15
|
+
|
|
16
|
+
1. **WAL 持久化安全面闭合(1 修 high + 1 收窄)**:恢复重写用 `File::create`(O_TRUNC)就地清零在役 WAL 再逐行重写——实测 31.8MB/10 万行 WAL 的毁灭窗口 ≈453ms,窗口内崩溃/断电/write Err 不可逆丢失全部已 sync 的签名提交前缀;零提交分支整文件清空重跑,2000 行验签失败 WAL 实测被覆盖为 50 行(N107,high,swarm.rs:735-751)——F5 改为「临时文件 + fsync + rename 原子替换」与「坏 WAL 归档 `.corrupt-<毫秒时间戳>` 后新开」,B1 全回滚语义不变而签名审计链可离线取证。同路径的**换 shared_secret 重入静默销毁旧 WAL**(N112,low)随之收窄:销毁面变为归档留痕,残面为 rc=0 无告警语义。
|
|
17
|
+
2. **CLI 契约面三项历轮留档清账(3 修 medium,同文件收口)**:v5 留档 N24(cmd_run 不传 condition_space,G-R2 负路由与 VM 符号注入链整体失效,残缺卡 rc=0 假成功)、N25(config/@file/构建/验签多异常面裸 Traceback + stdout 0 行,破坏文件头「stdout 恒为单行 JSON」契约)、v1 #25(相对 `--out` 落 config 目录而摘要 report_path 按 CWD 解析的悬空指针)——三项同在 swarm_cli.py,F1/F2/F3 一并修复,v5 三项留档全部闭账。
|
|
18
|
+
3. **验签器自身容错补全(1 修 medium)**:v5-L2 修复(:116 try 只护解析段)存在读行层盲区——`for line in f` 的 UTF-8 解码发生在 try 之外,撕裂写截在中文多字节中间或任意非法字节 → UnicodeDecodeError 打崩验签器并穿出 CLI(N108,rust_swarm.py:111-116)——F4 以 `errors="replace"` 容错解码使坏行必落 bad(fail-closed),「验签器面对的正是被篡改的 WAL,不得自己先崩」契约在解码层同样成立。
|
|
19
|
+
4. **审计记账语义族与测试面留档(如实记录)**:新发现 4 项留档——ACK payload 自带 seq 却不重建水位,幂等重入 watermarks/gossip/health 三审计面归零(N109);非对称 gossip 源投递完整却判 consistent=false 且 coverage 连带压低 integrity(N110);gossip_received 实为发送侧记账、末轮消息与死亡实例目标照常计数(N111);test_swarm_topology.py ② 段 `if rr["ok"]:` 内无无条件 check 的静默跳过洞(N113,v3 compiler 已修洞形态的 swarm 侧对应物)。legacy 维持 3 项:v5 N26(parse_json_scalar 字符串内定界符,low)、v7 N57(恢复链三遍验签/3× 常驻,medium)、v7 N59(WAL 裸 File flush no-op,low)。
|
|
20
|
+
|
|
21
|
+
**对输入口径的核验**:输入称「四区 confirmed 26(cli 6 + wal 7 + gossip 6 + tests 7)、rejected 0 → 5 修复 → 留档 8 条」。本会话以 `git status --porcelain` / `git diff --numstat` + 逐处读核核对:改动面 = 三个修复源文件(swarm/swarm_cli.py +63/-39、swarm/rust_swarm.py +6/-2、swarm/rust_runtime/src/swarm.rs +286/-18)+ 三份守卫增补(test_swarm_condition_space.py +56、test_swarm_cli.py +116、test_rust_swarm.py +50)——与五项修复一一对应;另有两处**材料五修复清单之外的工作树改动**如实单列:①`swarm/rust_runtime/Cargo.toml`(+10/-7,模板 default 由 ["embed"] 翻转为 [],现行 :31)+ `swarm/rust_codegen.py`(+10/-1,generate_rust_project 拷贝模板后改写 default = ["embed"] 并带「期望恰好一处 default = []」漂移守卫)+ `swarm/rust_runtime/src/lib.rs`(+3/-2,embed 注释同步)——三件构成一项连贯改动(模板关 embed、生成项目开 embed),材料未列明归属与意图,本会话实证其效果为门禁 cargo test 失败的消除(第四节);②`md_cg/whitebox_kb/wisdom/code_solidified.json`(+1/-2)——v10/v11 报告已注明为先前会话遗留的工作区变更,非本轮触点。跨区重复 6 组(N24×4 / N25×4 / N26×4 / N57×2 / N59×2 / N109×3,冗余 13 条),26 − 13 = 13 独立缺陷;5 补丁全闭 5 面,13 − 5 = 8 开口(全留档 7 + N112 残面 1),无多无少,与材料留档清单 8 条逐条对应。
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 二、修复清单(5 项,逐项 where / 问题 / 修复 / 前后对比 / 守卫)
|
|
26
|
+
|
|
27
|
+
### F1(v5 N24,medium)cmd_run 透传 condition_space:config 声明的条件空间卡不再被 CLI 静默丢弃
|
|
28
|
+
|
|
29
|
+
- **where**:材料口径 `swarm/swarm_cli.py:78-81`(cmd_run 内 make_swarm_config 实参表);现行(本会话读核)调用块 `swarm/swarm_cli.py:91-95`,透传行 **:95** `condition_space=cfg_in.get("condition_space")`。下游链零改动(本就完整):rust_swarm.py:31 形参与 :46-47 写入、main.rs:351-357 Rust 侧校验、swarm.rs 四要素校验与 VM 符号注入均在位。
|
|
30
|
+
- **问题**:v5 留档 N24(v5.md:50,= v1 #24 双列声明)三轮未修——config 声明的 G-R2 条件空间卡被 CLI 静默丢弃:齐备卡不生效(落盘 swarm.json 无该键、报告 cs=None),残缺卡(四要素缺一)本应被 Rust 负路由 exit 2 拒绝却经 CLI 放行 rc=0 假成功;monkeypatch 截获实跑证据:make_swarm_config 收到的 kwargs 无 condition_space、落盘 cfg_keys 六键无该键、exit_code=0。漏检原因:既有守卫 test_swarm_condition_space.py:16,57 直连 make_swarm_config 显式传卡、不经 CLI 层。
|
|
31
|
+
- **修复**:make_swarm_config 调用追加单行透传(无该键时为 None,rust_swarm.py:46-47 保持不写入,向后兼容);修复面 +1 行,守卫 +56 行。
|
|
32
|
+
- **前后对比**(材料守卫红证 + 实跑):前——齐备卡经 CLI 落盘 cfg condition_space=None、报告 cs=None code=0;残缺卡(缺 existence_constraint)rc=0 静默放行,而直连 exe 同卡 exit 2 被拒(CLI 与直连行为分裂)。后——卡原样落盘并经 Rust 四要素校验:齐备卡报告透出 space_id(rc=0),残缺卡被拒(CLI 结构化失败 ok=false stage=swarm rc=1,stderr 带「条件空间卡校验失败: 条件空间卡字段 existence_constraint 缺失或为空」);不带卡的 config 行为不变(test_swarm_cli.py 全链路 10/10 证向后兼容)。
|
|
33
|
+
- **守卫**:test_swarm_condition_space.py 第⑤节(材料口径 :136 起,CLI 路径 3 条:齐备卡落盘 cfg 含原卡 / 报告透出 space_id / 残缺卡拒绝运行)。材料红证:修前 **10 passed, 3 failed**(三条新守卫全红);修后 13 passed, 0 failed。**本会话实跑:`python -X utf8 swarm/tests/test_swarm_condition_space.py` → 13 passed, 0 failed**(末条「CLI:残缺卡拒绝运行,负路由不静默放行 — code=1 stage=swarm」绿)。
|
|
34
|
+
|
|
35
|
+
### F2(v5 N25,medium)cmd_run/cmd_verify 异常面兜底:「stdout 恒为单行 JSON」契约在错误路径恢复成立
|
|
36
|
+
|
|
37
|
+
- **where**:材料口径 `swarm/swarm_cli.py:65-135`(config 装载 :67-72 / @file 源 :77-79 / 编译→蜂群→报告全段 :82-124 / cmd_verify 验签 :131-133)+ `:35 import traceback`;现行(本会话读核):import :34、config 守卫 **:71-75**、@file 守卫 **:79-82**、全段兜底 try **:85-126**(含 generate_rust_project 写盘失败与 build_rust_exe 自 rust_swarm.py:71——该行在 run_swarm 的 try 之外——的穿透)、cmd_verify 守卫 **:133-136**。
|
|
38
|
+
- **问题**:v5 留档 N25(v5.md:51)三轮未修——9 场景实跑全部 rc=1 + stdout 0 行 + 裸 Traceback 尾:config 不存在/非法 JSON(:66 open、:67 json.load)、@file 源缺失(:60)、instances 项缺 id(rust_swarm.py:40 KeyError)、routes 缺 from(rust_swarm.py:43)、cargo 移出 PATH(rust_codegen.py:61 subprocess 无捕获且调用点 rust_swarm.py:71 在 :81 try 之外)、--project 指向已存在文件(rust_codegen.py:33 makedirs 崩)、rounds='abc'(ValueError)、verify --wal 指向目录(PermissionError)——harness 按文件头契约(swarm_cli.py:5)解析即崩;对照组证明契约面可达成(WAL 不存在 → 单行 JSON rc=2,:110-111 守卫在位)。
|
|
39
|
+
- **修复**:三段守卫 + verify 兜底,复用在位 `_fail` 机制(swarm_cli.py:49-51):traceback 全文走 stderr(诚实失败不吞现场),stdout 落 `{"ok":false,"stage":<精确归属>}` 单行 JSON + rc=1;`_emit/_fail` 内 sys.exit 为 SystemExit(BaseException),不被 except Exception 捕获——成功/结构化失败路径不受兜底影响(swarm_cli.py:67-70 注释自述该机制)。
|
|
40
|
+
- **前后对比**(材料守卫红证):前——7 个异常场景全部 rc=1 + stdout 0 行 + 裸 Traceback(cli() 解析 stdout 末行无 JSON 可得,stage=None);后——全部落成 ok=false 单行 JSON + 精确 stage(config×3 / run×2 / verify×2)+ rc=1;成功路径与既有结构化失败路径(篡改检测 / 坏 config)行为不变。
|
|
41
|
+
- **守卫**:test_swarm_cli.py 第⑥节「异常面单行 JSON 契约」7 场景(⑥a config 不存在 / ⑥b 非法 JSON / ⑥c @file 源缺失 / ⑥d project 指向文件 / ⑥e cargo 不可用构建穿透〔PATH 掏空 + 全新 project 真实构造〕 / ⑥f verify WAL 是目录 / ⑥g WAL 非法 UTF-8),每场景断言 rc=1 + stdout 末行合法 JSON 且 ok=false + stage 精确 + stderr 留异常现场。材料红证:修前 **10 passed, 7 failed**;修后 17 passed, 0 failed。**本会话实跑:`python -X utf8 swarm/tests/test_swarm_cli.py` → 20 passed, 0 failed**(含⑥⑦两节全部场景,⑥g 已随 F4 升级断言)。材料注明:「cargo 存在但编译报错」一态未单列——与⑥e 走同一段 rust_swarm.py:71 穿透路径与同一 CLI 兜底,守卫已覆盖该兜底分支。
|
|
42
|
+
|
|
43
|
+
### F3(v1 #25,medium)--out 指针口径统一:report_path 与实际落盘同口径,悬空指针消除
|
|
44
|
+
|
|
45
|
+
- **where**:材料口径 `swarm/swarm_cli.py:88-96`(out_path 按 base_dir 拼接 :89-90 与 report_path 按 CWD 解析 :96 口径分裂);现行(本会话读核):out_path **:102-105**、口径注释 :109-110、report_path **:113** `os.path.abspath(out_path)`。
|
|
46
|
+
- **问题**:v1 遗留 #25(v5.md:77 留档在册)——相对 `--out` 时报告文件实际写 config 同目录(base_dir 拼接),摘要 report_path 却按 CWD 解析:monkeypatch 双臂实跑(CWD=仓库根、config 在系统临时目录)——文件在 config 目录、摘要 report_path 指向仓库根下且不存在(resolves=false),harness 按指针取报告必然落空。
|
|
47
|
+
- **修复**:摘要 report_path 改用实际落盘路径 `os.path.abspath(out_path)`,不再按 CWD 解析 args.out;out_path 提升作用域(:102 前置 None),加两行注释说明指针与落盘同口径原因。单点口径统一,落盘逻辑与成功路径其余字段不变。
|
|
48
|
+
- **前后对比**(材料守卫红证):前(守卫红跑实测,CWD=仓库根、config 在临时目录)——report_path 指向仓库根下不存在文件(悬空指针),与缺陷证据同形态;后——report_path 与实际落盘同口径(临时目录下文件,os.path.exists 为真且内容为含 health/final_states 的真实报告);绝对路径 --out 口径不破(⑦b 回归绿)。
|
|
49
|
+
- **守卫**:test_swarm_cli.py 第⑦节「--out 指针口径」3 条(⑦a×2 相对 --out 指针指向真实文件且在 config 目录 / 落盘文件为真实蜂群报告;⑦b 绝对 --out 口径回归;subprocess 实跑、新 wal 名各走真实首跑避免幂等重入报告形态差异)。材料红证:修前 **18 passed, 2 failed**(两条 ⑦a 全红);修后 20 passed, 0 failed。**本会话实跑同命令 → 20 passed, 0 failed**(⑦b 绿,指针=绝对路径且文件在)。
|
|
50
|
+
|
|
51
|
+
### F4(N108,medium)WAL 验签器读行层容错解码:撕裂写/非法字节不再打崩验签器
|
|
52
|
+
|
|
53
|
+
- **where**:材料口径与现行一致(本会话读核):`swarm/rust_swarm.py:100`(生效条件注释同步)+ **:111-115**(注释 + `open(wal_path, encoding="utf-8", errors="replace")`)。
|
|
54
|
+
- **问题**:本轮新发现 N108——v5-L2 修复(:116 try 只护解析段)存在盲区:`for line in f` 的行级 UTF-8 解码发生在 try 之前,撕裂写截在中文多字节中间(实测场景B 尾行截在「实」(E5 AE 9E) 第 3 字节)或行内夹非法字节(0xFF)→ UnicodeDecodeError 直接打崩 verify_wal_signatures 并穿出 CLI(真实子进程 rc=1、stdout 0 行、裸 stderr);:128 except (ValueError,...) 虽含 UnicodeDecodeError 父类但抛点在 try 块外不可达;中文载荷 3 字节/字有 2/3 概率被字节边界撕裂、恰是最真实 torn-write 形态——:100 注释「验签器面对的正是被篡改的 WAL,不得自己先崩」被绕过。(场景A 尾行截在 ASCII 边界不崩,证 v5 修复在 ASCII 面有效、盲区在多字节面。)
|
|
55
|
+
- **修复**:open 加 `errors="replace"`(零逻辑改动)——坏字节行读入后 json 解析或 HMAC 比对必失败 → 计 bad,好行照验,fail-closed(坏 WAL → all_valid=False 而非崩溃);好行验签路径、统计口径、快照单列均不变。
|
|
56
|
+
- **前后对比**(材料守卫红证):前——撕裂行/污染行 → UnicodeDecodeError('utf-8' codec can't decode … / byte 0xff)打崩验签器,CLI 面只能靠 F2 兜底看住契约(⑥g 旧形态 ok=false 无统计字段 bad=None);后——两形态均返回 {total:3, verified:2, bad:1, all_valid:False} 不抛异常,CLI 面 ⑥g 升级断言(all_valid=False + bad>=1 + 单行 JSON)亦绿——验签器自身容错,不再依赖 CLI 兜底吞异常。
|
|
57
|
+
- **守卫**:双层。①函数级 test_rust_swarm.py ③b(材料口径 :114 起,哑密钥随机生成 + 与 Rust WAL 同构合成签名行;撕裂形态=合法行 UTF-8 bytes 截尾 3 字节停在中文多字节中间,污染形态=「污」(E6 B1 A1) 首字节换 0xFF;断言 verified==2 / bad==1 / all_valid is False / 不抛异常);材料红证:修前 **20 passed, 2 failed**(detail 为两条 UnicodeDecodeError 崩溃实锤);修后 22 passed, 0 failed。②CLI 级 test_swarm_cli.py ⑥g 断言升级(旧代码下同样红,守卫严格性保持);修前 19 passed, 1 failed(bad=None)→ 修后 20 passed, 0 failed。**本会话实跑:`python -X utf8 swarm/tests/test_rust_swarm.py` → 22 passed, 0 failed**、`python -X utf8 swarm/tests/test_swarm_cli.py` → 20 passed, 0 failed(⑥g code=1 bad=1 单行 JSON)。
|
|
58
|
+
|
|
59
|
+
### F5(N107,high;同路径收窄 N112)WAL 恢复重写原子化 + 零提交归档:毁灭窗口与审计留痕销毁面闭合
|
|
60
|
+
|
|
61
|
+
- **where**:材料口径 `swarm/rust_runtime/src/swarm.rs:735-752`(旧内联恢复重写块:735-738 File::create O_TRUNC、739-745 逐行 write_all、750-752 零提交整文件清空);现行(本会话读核):重构为 `open_wal_for_run`(**:554-574**,恢复/零提交分派)+ `rewrite_wal_atomic`(**:578-599**:写 `<wal>.tmp` → 逐行 write_all → flush → **sync_all :589** → drop 句柄 :590 → `std::fs::rename` 原子覆盖 :591;中途任何 Err 清理 tmp :594-597 后返回 Err,原 WAL 逐字节不动)+ `archive_corrupt_wal`(**:601-619**:rename 为 `<wal>.corrupt-<毫秒时间戳>`,同名冲突递增 -N 后缀、宁可报错不覆盖归档)+ WalReplay.had_wal_file 字段(**:418** 声明、**:459** 置位,区分首跑与坏 WAL)+ 调用点 **:821**;修复注释块 :541-553。
|
|
62
|
+
- **问题**:本轮新发现 N107(high)——断点恢复用 File::create 就地清零 WAL 再逐行重写,无临时文件+sync+rename 原子替换:①实测(100000 行/31.8MB 合法签名 WAL,rounds=51 触发恢复重写,后台线程 0.5ms 轮询文件尺寸)t≈1563ms 处尺寸从 31794154B 骤降至 308B、毁灭窗口实测 ≈453ms(旧 31.8MB 已清零而 kept_lines 未写完),窗口内崩溃/断电/写错误(740 write_all 返回 Err 时文件已截断)不可逆丢失全部已 sync_all 的提交前缀;②无合法快照前缀时整文件清空重跑——实测 2000 行/439.2KB 格式完好但验签失败的 WAL,rounds=50 运行 → exit 0、WAL 变 50 行,原 2000 行签名留痕全部消失;事件为逐行独立 HMAC 签名(sign_event swarm.rs:376-385,无哈希链),坏行后缀本可独立验签恢复,但 pass1(468-472)遇首个坏行即 break、无快照前缀即 479 全回滚——单个坏行即摧毁整份签名审计留痕。grep 全 src 无 rename/tempfile/.tmp/set_len(vm.rs truncate 为条件栈,无关 WAL)。**同路径 N112(low)**:换 shared_secret 重入同 project+wal → replay 全行 HMAC 失败 → 零提交全回滚 → File::create 截断重写,旧 WAL 被静默整体销毁后从轮 1 重跑(独立 exe 两随机哑密钥实跑:WAL 8 行整体替换、旧行 0 行幸存、rc=0 无告警)。
|
|
63
|
+
- **修复**(swarm.rs +286/-18,git numstat 本会话核实;材料自报 +286/-20 略有出入,以 numstat 为准):恢复重写走 rewrite_wal_atomic(任何时点崩溃 wal_path 只有旧全量或新前缀,无半写中间态);零提交分支走 archive_corrupt_wal(原 WAL 归档留痕后新开空文件从轮 1 重跑)——B1 全回滚语义不变,签名审计链可离线独立验签取证;**N112 的不可逆销毁面随之收窄为归档留痕**(残面=rc=0 无告警语义,与 WAL 被篡改不可区分,留档第五节)。
|
|
64
|
+
- **前后对比**(材料守卫红证 + E2E):前——G1 场景旧代码就地重写不报错且 WAL 变 kept_lines(截断发生)、G2 场景归档数 0(审计留痕被清零销毁);后——重写失败时原 WAL 逐字节不动并报错、坏 WAL 恰好 1 份 `.corrupt-*` 归档逐字节保留原文、新 WAL 从轮 1 重跑。
|
|
65
|
+
- **守卫**:swarm.rs `#[cfg(test)] mod wal_recovery_tests`(现行 **:1519-1716**,mod 声明 :1520)四守卫——G1 recovery_rewrite_failure_never_truncates_live_wal / G2 corrupt_wal_archived_not_destroyed / G3 recovery_rewrite_truncates_bad_tail_and_resumes / G4 first_run_creates_empty_wal_without_archive;密钥运行期随机生成哑密钥(`guard-dummy-<pid>-<ms>-<seq>`,无硬编码),临时目录 temp_dir+pid+毫秒+原子计数、测后 remove_dir_all 清理。材料 TDD 红证:旧代码 `cargo test --no-default-features --lib wal_recovery_tests` → G1/G2 FAILED(2 passed; 2 failed);修复后 4 passed; 0 failed。**本会话实跑(裸 `cargo test --manifest-path swarm/rust_runtime/Cargo.toml`):8 passed; 0 failed**——含 wal_recovery_tests 四守卫全绿(health 2 + hmac 2 + 新守卫 4),Windows 实跑。
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## 三、发现明细(四区 confirmed 26 / rejected 0)
|
|
70
|
+
|
|
71
|
+
以下每项「证据要点」为上游复核/修复会话的读码+实跑(材料原文,复现均在系统临时目录/临时脚本、哑密钥随机生成、测毕清理);标注★者本报告会话另做了现行代码读核(修复项)或历轮报告 grep 核实(编号归属)。legacy 项沿用原轮次号。**四区 rejected 均为空数组——本轮无证伪/剔除条目,如实记录。**
|
|
72
|
+
|
|
73
|
+
### cli 区(6 confirmed:4 legacy + 2 new;0 rejected)
|
|
74
|
+
|
|
75
|
+
| # | where(缺陷时点) | 严重度 | 问题摘要 | 证据要点 | 状态 |
|
|
76
|
+
|---|------|--------|----------|----------|------|
|
|
77
|
+
| v5 N24★ | swarm/swarm_cli.py:78-81 | medium | 【复测成立·三轮未修→本轮修复】cmd_run 不传 condition_space,G-R2 条件空间卡被 CLI 静默丢弃,负路由校验与 VM 符号注入链整体失效,rc=0 无告警(详 F1) | monkeypatch 截获实跑(哑密钥):make_swarm_config 收到的 kwargs=[rounds,shared_secret,topology],落盘 cfg_keys 六键无 condition_space,exit_code=0;读码链整链在位只缺 CLI 透传(rust_swarm.py:28-31/:46-47、main.rs:351、swarm.rs:152-170/:613-623);漏检佐证 test_swarm_condition_space.py:16,57 直连不经 CLI | **已修**(F1) |
|
|
78
|
+
| v5 N25★ | swarm/swarm_cli.py:65-105 | medium | 【复测成立·三轮未修→本轮修复】cmd_run/cmd_verify 多处异常裸奔破坏「stdout 恒为单行 JSON」契约(swarm_cli.py:5):9 场景全部 rc=1+stdout 0 行+裸 Traceback(详 F2) | 9 场景真实子进程实跑(PYTHONUTF8=1,临时目录+哑密钥):S1 config 不存在/S2 非法 JSON/S3 @file 源缺失/S4 instances 缺 id/S5 routes 缺 from/S6 cargo 移出 PATH/S7 --project 指向文件/S8 rounds='abc'/S9 verify --wal 指向目录;对照组 WAL 不存在 → 单行 JSON rc=2 证契约面可达成、仅异常面裸奔 | **已修**(F2) |
|
|
79
|
+
| v5 N26★ | swarm/rust_runtime/src/main.rs:141-167 | low | 【复测成立·未修留档】parse_json_scalar 标量结束定位 `find([',','}'])` 不跳字符串字面量且丢弃 parse_json_string 返回的正确 next(:152)——`--symbols` 字符串值内含 ',' 或 '}' 时合法 JSON 被拒且误报「符号表键须为字符串」rc=2 | 独立形态实跑:`{"甲":"x,y"}` / `{"甲":"x}y"}` → rc=2 误报;对照组 `{"甲":"xy","乙":"z"}` 与转义引号形态通过解析进入 pbc 装载;机制读码::143-146 定位 → :152 丢弃正确 next → :166 返回错位 end → 主循环 :91 把字符串残留误判为键。影响面含 Python API(rust_codegen.py:88 build_and_run 的 symbols 走同一 CLI 路径) | 留档(low) |
|
|
80
|
+
| N108★ | swarm/rust_swarm.py:111-116 | medium | WAL 验签容错盲区:for line in f 的 UTF-8 解码在 try 之外,撕裂写在多字节字符中间或任意非法字节 → UnicodeDecodeError 打崩验签器并穿出 CLI 单行 JSON 契约(详 F4) | 实跑(哑密钥合成合法 HMAC 行):场景A 尾行截 ASCII 边界 → {total:2,verified:1,bad:1} 不崩(v5 修复在 ASCII 面有效);场景B 截在中文「实」第 3 字节 / 场景C 行内 0xFF → UnicodeDecodeError 崩;真实子进程 verify → rc=1、stdout 0 行;:128 except 含父类但抛点在 try 外不可达 | **已修**(F4) |
|
|
81
|
+
| N112★ | swarm/rust_runtime/src/swarm.rs:735-753 | low | 换 shared_secret 重入同 project+wal:replay 全行 HMAC 失败 → 零提交全回滚 → File::create 截断重写——旧 WAL 审计留痕被静默整体销毁后从轮 1 重跑,rc=0 无任何告警,与 WAL 被篡改不可区分 | 独立 exe 实跑(两个独立随机哑密钥,同 project+wal 先后各 3 轮 mesh):run2 WAL 8 行整体替换(首行 hmac 变、seqs 重排、旧 8 行逐字节比对 0 行幸存)、无告警字段;机制读码 replay :471-473 首行验签失败即 break → :478-479 无合法快照空 rp → :750-752 File::create 整文件截断。与候选证据小出入如实注明:证据写「ok=true」,实测 exe 报告 JSON 无顶层 ok 键——核心事实(rc=0/WAL 整体替换/无告警)一致 | **部分收窄**(随 F5:销毁面→归档留痕;残面=无告警语义,留档) |
|
|
82
|
+
| v1 #25★ | swarm/swarm_cli.py:88-96 | medium | 【复测成立(v5.md:77 留档)→本轮修复】相对 --out 落点与摘要指针口径分裂:实际文件写 config 同目录,report_path 按 CWD 解析——CWD≠config 目录时 harness 拿到悬空指针(详 F3) | monkeypatch 双臂实跑(stub 生成/运行,CWD=仓库根、config 在临时目录、哑密钥):file_at_config_dir=true、file_at_cwd=false,摘要 report_path=仓库根下路径且 resolves=false;:88-96 段均在 cmd_run 真实代码路径内不经 stub,复现充分;真实全链路子进程未另跑(需新 project 完整 cargo build,材料如实声明) | **已修**(F3) |
|
|
83
|
+
|
|
84
|
+
### wal 区(7 confirmed:2 new + 5 legacy;0 rejected)
|
|
85
|
+
|
|
86
|
+
| # | where(缺陷时点) | 严重度 | 问题摘要 | 证据要点 | 状态 |
|
|
87
|
+
|---|------|--------|----------|----------|------|
|
|
88
|
+
| N107★ | swarm/rust_runtime/src/swarm.rs:735-751 | high | 恢复重写 File::create 就地清零再逐行重写、无原子替换:毁灭窗口内崩溃/断电/write Err 不可逆丢失全部已 sync 提交前缀;零提交分支整文件清空——单个坏行摧毁整份独立 HMAC 签名审计留痕(坏行后缀本可独立验签恢复却不可达)(详 F5) | 实测(临时目录+随机哑密钥+独立形态 exe,CARGO_TARGET_DIR 指临时未碰仓库 target/):10 万行/31.8MB 合法签名 WAL 恢复重写,毁灭窗口实测 ≈453ms(725 采样处于 (0, full×90%));2000 行验签失败 WAL → exit 0、WAL 变 50 行;grep 全 src 无 rename/tempfile/.tmp/set_len | **已修**(F5) |
|
|
89
|
+
| N109★ | swarm/rust_runtime/src/swarm.rs:691(现行 :776) | medium | ACK 事件 payload 明确携带消费水位 {"round","seq"} 且进 HMAC(:976),但 replay_wal 只重建 acks 集合不重建 watermarks(:512-513)、run_swarm 水位从空表起——同 WAL 幂等重入(:716-733 早退聚合)时 watermarks 从有值回退为 {},破坏 rust_swarm.py:61-63「watermarks 单调递增」文档契约;同路径 acks/global_seq/events 均保留、唯水位丢失 | 实测(独立 exe+随机哑密钥):2 实例+1 路由 rounds=2 run1 → watermarks={实例乙:1};同 WAL 同 cfg 幂等重入 → watermarks={} 而 acks=1/global_seq=2/events=5 全保留 | 留档(medium) |
|
|
90
|
+
| v5 N24(同对象) | swarm/swarm_cli.py:78-81 | medium | 【=cli 区同对象条目】condition_space CLI 静默丢弃:CLI config 带齐备卡 → 落盘 swarm.json 无该键、WAL 快照 cs=None;残缺卡经 CLI rc=0 放行而直连 run_swarm → ok=False「条件空间卡校验失败…(四要素缺一不可,§3.1.2)」——Rust 负路由面(main.rs:351-357)在位,仅 CLI 包装层断链 | 实测三面:CLI 齐备卡 exit 0 但下发 cfg 无键;对照组直接 make_swarm_config → cfg 含键;负路由失效面补测残缺卡 CLI vs 直连行为分裂 | **已修**(随 F1,不重复占坑) |
|
|
91
|
+
| v5 N25(同对象) | swarm/swarm_cli.py:66-67 | medium | 【=cli 区同对象条目】config 打开/解析、@file 读取、cargo 构建失败(build_rust_exe 经 rust_swarm.py:71 在 81-90 try 之外)直穿:stdout 0 字节+traceback;2026-09-25 修复(rust_swarm.py:81-90)仅覆盖子进程 TimeoutExpired/OSError 面 | 实测三面(python -m swarm.swarm_cli run):config 不存在/非法 JSON/@file 缺失 → rc=1、stdout 0 字节、Traceback;构建失败面为读码级(未注入实测,材料自述) | **已修**(随 F2,不重复占坑) |
|
|
92
|
+
| v5 N26(同对象) | swarm/rust_runtime/src/main.rs:143-146 | low | 【=cli 区同对象条目】标量终点取第一个 ','/'}(find 不感知引号)且丢弃正确游标——`--symbols '{"记号":"甲,乙"}'` → rc=2 误报「符号表键须为字符串」,串内逗号形态完全不可用;对照 '{"记号":"甲乙"}' rc=0 | 独立 release exe 实跑 + 读码::143-146 end 落串内逗号 → :151-153 字符串值本身可正确解析但 next 被丢弃(let (s2, _))→ 返回错误 end → 下轮把 `乙"` 当键 | 留档(low,随 v5 N26 单条计) |
|
|
93
|
+
| v7 N57★ | swarm/rust_runtime/src/swarm.rs:471(现行 pass1/pass2/aggregate_report 对应 :463-532 区段) | medium | 【复测成立·v7.md:104 留档未修】WAL 恢复链路三遍「解析+HMAC 验签」(pass1 扫提交点 :471、pass2 重建前缀 :493、aggregate_report :1239-1247 事件口径重验),好行前缀 ~3× 常驻(raw :451 read_to_string / events :530 / kept_lines :531),无截断/压缩——每次重入全量重验+全量重写,成本随 WAL 行数线性放大无上界 | 实测:5000/20000/50000 行 → 94/344/875ms,相邻档斜率 16.7/17.7µs/行线性(与 v7 拟合 16.0µs/行 R²=0.9999 吻合);grep 证 sync_all 仅 :745/:1194、无 compact/truncate;tests 区复测为读码级、未重跑性能基准(材料如实声明) | 留档(medium) |
|
|
94
|
+
| v7 N59★ | swarm/rust_runtime/src/swarm.rs:1049(现行 WAL 句柄经 F5 重构位于 open_wal_for_run 分派) | low | 【复测成立·v7.md:106 留档未修】WAL 句柄裸 File 无用户态缓冲,每事件行一次 write_all 直 syscall;:1052 flush 对 File 是 no-op,与 :1034「事件行先 durable(flush)」纪律注释语义不符(正确性靠单 fd append 顺序性 + 轮末 sync_all 兜底,仍正确但注释失实);replay 期间三份同行数据常驻内存 ≥3× | 读码级(材料标注留修复员):BufWriter 仅 :539/:572(实例 stdin);v7 微基准写阶段 ~10%/端到端 3.5% 为上游实测,本轮未重跑(材料如实声明) | 留档(low) |
|
|
95
|
+
|
|
96
|
+
### gossip 区(6 confirmed:3 new + 3 legacy;0 rejected)
|
|
97
|
+
|
|
98
|
+
| # | where(缺陷时点) | 严重度 | 问题摘要 | 证据要点 | 状态 |
|
|
99
|
+
|---|------|--------|----------|----------|------|
|
|
100
|
+
| N110★ | swarm/rust_runtime/src/swarm.rs:1303(现行对账 :1372-1388) | medium | 非对称 gossip 源(部分实例为源)投递完整却判 gossip_consistent=false——对账只比「全部目标计数相等」(counts.sort 后 first==last),每目标期望数=非自身 gossip 路由数×轮数、非对称拓扑下天然不等;G3c coverage 以最大计数为基准,非对称双源下少收侧 integrity 被错误降级、health 连带失真 | 实测(generate_rust_project 生成项目 cargo build --release,临时目录+随机哑密钥):3 实例(甲乙为源)×3 轮 [甲→*,乙→*] → gossip={丙:6,乙:3,甲:3}、consistent=False,而末轮实收丙=2/甲=乙=1 各足额收齐、WAL all_valid=True total=18——投递完整;单源基线 consistent=True 排除环境因素;现有测试缺口核实:test_swarm_gossip.py 仅单源/混合/全网互播、无非对称双源用例 | 留档(medium) |
|
|
101
|
+
| N111★ | swarm/rust_runtime/src/swarm.rs:1026(现行 gossip_sent 记账 :771 起) | medium | gossip_received 实为发送侧记账而非实收:末轮产出消息(进 inboxes[rounds+1] 本轮永不投递)照常计数;死亡实例(G5)作为目标同样计数且永不 ACK,对账恒真掩盖丢弃——字段注释(:685)自称「实例 → 实收 gossip 消息数」 | 实测(protocol 拓扑 4 实例 rounds=2 丙→*):watermarks={丁:3,乙:2,甲:1}——甲水位=1 仅消费 seq1,round=2 三条路由事件进 inboxes[3] 永不投递而 gossip 甲已计 2;末轮实收各=1 证第 2 轮消费的仅第 1 轮产出;WAL all_valid=True。死亡分支为读码级(:788-790 dead 不 spawn、:880/:893 continue 早于水位推进与 ACK、:992-996 fan-out 不排除 dead) | 留档(medium) |
|
|
102
|
+
| N109(同对象) | swarm/rust_runtime/src/swarm.rs:691 | medium | 【=wal 区同对象条目】幂等重入/恢复后 watermarks、gossip、health 三审计面归零:replay_wal 不从 WAL 重建(ACK payload 自带 seq 却不用),全完成重入 early-return 直接返回空表——违背 swarm_cli.py:23-24「同 project+同 WAL 重入即续跑/幂等聚合」与 rust_swarm.py:62「watermarks 单调递增」契约 | 实测(2 实例 甲→* rounds=2):首跑 watermarks={乙:1} gossip={乙:2} health_keys=[乙,甲];同 project 同 WAL 重入 → watermarks={} gossip={} health_keys=[](global_seq=2、acks=1 保持);部分恢复(rounds 2→3)watermarks={乙:2} 单调(test_swarm_watermark.py:87-89 有此路径测试)但 gossip={乙:1} 仅计新会话段;全完成重入归零无测试覆盖(核实属实) | 留档(medium,随 wal 区单条计) |
|
|
103
|
+
| v5 N24(同对象) | swarm/swarm_cli.py:78 | medium | 【=cli 区同对象条目,本区复测口径】CLI config 带齐备卡 → exit 0、stdout 摘要无 condition_space 键、落盘 project/swarm.json 无该字段;残缺卡(缺 observation_tool/time_window)→ exit 0 放行,对照直连 exe 跑残卡 config → exit 2 拒绝 | 实测双臂:库路径 make_swarm_config(condition_space=四要素卡) → 报告 condition_space="复核空间";CLI 同卡 → 无键无字段;残卡对照 exit 0 vs exit 2 | **已修**(随 F1,不重复占坑) |
|
|
104
|
+
| v5 N25(同对象) | swarm/swarm_cli.py:66 | medium | 【=cli 区同对象条目,本区复测口径】CLI 异常面破坏单行 JSON 契约:config 打不开/非法 JSON 直穿 traceback,stdout 0 行 | 实测(python -m swarm.swarm_cli run):①--config 不存在 → exit 1、stdout 0 行、FileNotFoundError;②非法 JSON(截断)→ 同形态 JSONDecodeError | **已修**(随 F2,不重复占坑) |
|
|
105
|
+
| v5 N26(同对象) | swarm/rust_runtime/src/main.rs:141 | low | 【=cli 区同对象条目,本区复测口径】parse_json_scalar 裸 find 截断标量且丢弃 parse_json_string 返回的正确 next——`--symbols '{"备注":"甲,乙","计数":1}'` → exit 2 误报(真实键「备注」合法,报错误导);对照 '{"备注":"甲乙","计数":1}' → exit 0 | 独立 exe 直连实跑 + 读码链::143-146 → :151-153 丢弃 next → :166 错误 end → 外层 :82-109 pos 落字符串内部 → :91-92 误报 | 留档(low,随 v5 N26 单条计) |
|
|
106
|
+
|
|
107
|
+
### tests 区(7 confirmed:2 new + 5 legacy 复测;0 rejected)
|
|
108
|
+
|
|
109
|
+
| # | where(缺陷时点) | 严重度 | 问题摘要 | 证据要点 | 状态 |
|
|
110
|
+
|---|------|--------|----------|----------|------|
|
|
111
|
+
| v5 N24(同对象) | swarm/swarm_cli.py:78 | medium | 【复测·仍在位未修(复核时点)→本轮修复】v5.md 留档原文「余三项在位未修:CLI 静默丢弃 condition_space 卡(N24)」与本轮一致 | 本会话双臂复现(mkdtemp+token_hex 哑密钥):残缺卡直传 run_swarm → ok=False「条件空间卡校验失败: existence_constraint 缺失或为空(四要素缺一不可,§3.1.2)」;同卡走 CLI → exit=0 ok=True 且下发 cfg 键集无 condition_space;守卫缺口核实:test_swarm_condition_space.py 全程 API 直传、test_swarm_cli.py:60-68 config 不含该字段 | **已修**(随 F1,不重复占坑) |
|
|
112
|
+
| v5 N25(同对象) | swarm/swarm_cli.py:65 | medium | 【复测·仍在位未修(复核时点)→本轮修复】cmd_run 全程无 try/except,异常面裸 traceback 且 stdout 0 字节 | 本会话实跑(subprocess,PYTHONUTF8=1)三条崩溃面:config 不存在/非法 JSON/@no_such_file.txt → exit=1 stdout_bytes=0 Traceback;基线套件只守 ok 路径与缺 source 字段(test_swarm_cli.py:74-78/:124-126),异常面无守卫 | **已修**(随 F2,不重复占坑) |
|
|
113
|
+
| v5 N26(同对象) | swarm/rust_runtime/src/main.rs:145 | low | 【复测·仍在位未修→留档】find([',','}']) 定标量终点不跳字符串字面量,:152 丢弃正确终点 | 本会话独立形态构建(cargo build --release --no-default-features,swarm/ 无未提交改动时点)后实跑三用例(subprocess 传 list 避开引号歧义):'{"甲":"a,b"}' / '{"甲":"a}b"}' → exit=2 误报;对照 '{"甲":"abc"}' → exit=0 | 留档(low,随 v5 N26 单条计) |
|
|
114
|
+
| v7 N57(同对象) | swarm/rust_runtime/src/swarm.rs:463 | medium | 【复测·仍在位未修→留档】三遍「解析+HMAC 验签」(:463-477 / :482-532 / :1239-1247)、三份常驻(raw/events/kept_lines)、无截断压缩 | 读码级核实(材料标注留修复员):三遍 sign_event 逐处定位;grep BufWriter/truncate/set_len/compact 仅命中 :12/:539/:572;v7 线性拟合 16.0µs/行为上游实测、本轮未重跑性能基准(材料如实声明) | 留档(medium,随 wal 区单条计) |
|
|
115
|
+
| v7 N59(同对象) | swarm/rust_runtime/src/swarm.rs:735 | low | 【复测·仍在位未修→留档】两分支产物均裸 File;:1049/:1125/:1190 每行一次 write_all;:1052 flush 对 File 是 no-op 与 :1034 注释不符 | 读码级核实(材料标注留修复员):grep 证 BufWriter 仅实例 stdin;v7 微基准为上游实测、本轮未重跑(材料如实声明) | 留档(low,随 wal 区单条计) |
|
|
116
|
+
| N113★ | swarm/tests/test_swarm_topology.py:73 | medium | 测试静默跳过洞(v3 compiler 已修洞形态的 swarm 侧对应物):② centralized/mesh 两段以 `if rr["ok"]:` 包裹且段内无任何无条件 check——拓扑运行失败时角色推导断言无声消失,套件仍全绿放行(:63/:85/:92/:100 均有无条件守卫、唯 :73-80 缺失) | monkeypatch 双臂实跑(importlib 加载测试文件本体,临时驱动 patch,测后已删):注入 topology∈{centralized,mesh}→{ok:False} → ②段零 [✓]/[✗] 输出、终局「9 passed, 0 failed」exit=0;fail_all 对照臂其余段立即变红(2 passed, 3 failed exit=1)唯 :73-80 依然零输出;基线实跑 run_tests.py swarm --jobs 1 → 16/16 通过 0 跳过 | 留档(medium) |
|
|
117
|
+
| N109(同对象) | swarm/rust_runtime/src/swarm.rs:691 | medium | 【=wal/gossip 区同对象条目,本区复测口径】恢复/幂等重入路径报告契约不一致:早退聚合(:716-733)与 kill 续跑报告的 watermarks/gossip 为空或仅含恢复后窗口——同 WAL 同 config 两次进入产出不同报告字段 | 本会话复现(3 实例 gossip to="*" 4 轮,随机哑密钥,测后已删):早退臂首跑 watermarks={丙:6,甲:5} gossip={丙:4,甲:4},同 WAL 重入 → watermarks={} gossip={} 而 global_seq=8/events=18 保留;kill 续跑臂先 2 轮再 rounds=4 → gossip={丙:2,甲:2}(恢复前窗口丢失);WAL 佐证路由行 8/ACK 行 6(payload 含 round/seq、路由行含 to_id,重建信息充分)但 replay_wal 未消费;注:续跑臂 watermarks 数值碰巧对齐(水位=消费到的最大全局 seq 单调),gossip 为累加计数故直接丢——缺陷以 gossip 字段最直观 | 留档(medium,随 wal 区单条计) |
|
|
118
|
+
|
|
119
|
+
### 跨区重复条目合并说明(6 组,26 条目 → 13 独立缺陷)
|
|
120
|
+
|
|
121
|
+
- **v5 N24(condition_space CLI 丢弃)**:cli / wal / gossip / tests 四区各一条(4 条)——同对象,随 F1 修复;
|
|
122
|
+
- **v5 N25(CLI 异常面单行 JSON 契约)**:cli / wal / gossip / tests 四区各一条(4 条)——同对象,随 F2 修复;
|
|
123
|
+
- **v5 N26(parse_json_scalar 定界符)**:cli / wal / gossip / tests 四区各一条(4 条)——同对象,留档;
|
|
124
|
+
- **v7 N57(恢复链三遍验签)**:wal / tests 两区各一条(2 条)——同对象,留档;
|
|
125
|
+
- **v7 N59(WAL 裸 File)**:wal / tests 两区各一条(2 条)——同对象,留档;
|
|
126
|
+
- **N109(重入审计面归零)**:wal / gossip / tests 三区各一条(3 条)——同对象(ACK seq 不重建水位 + 早退空表 + 续跑窗口丢失为同一缺陷的三面),留档。
|
|
127
|
+
|
|
128
|
+
冗余 13 条(3+3+3+1+1+2),26 − 13 = 13 独立缺陷 = 新 7(N107-N113)+ legacy 6(v5 N24/N25/N26、v7 N57/N59、v1 #25)。
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## 四、验证(门禁结果)
|
|
133
|
+
|
|
134
|
+
以下「本报告会话实跑」均为本报告写作会话在仓库根目录实际运行(第一手);「材料口径」为复核/修复/门禁会话已跑、本会话未重跑(如实区分):
|
|
135
|
+
|
|
136
|
+
| 命令 | 结果 | 来源 |
|
|
137
|
+
|------|------|------|
|
|
138
|
+
| `python -X utf8 scripts/run_tests.py --jobs 4`(全量) | `===== SUMMARY 189/189 通过,5 跳过(依赖缺失/平台不符) =====`,exit 0,PASS 计数 189(grep 核实)——尾部含 hive 五守卫与 swarm 四套件(test_rust_swarm_resume / test_swarm_cli / test_swarm_condition_space / test_rust_swarm 均 PASS),与材料尾部逐字一致;189 与 v11 同数:本轮守卫全部增补进既有三份 swarm 套件、未新增测试文件 | **本会话实跑** |
|
|
139
|
+
| `python -X utf8 swarm/tests/test_swarm_condition_space.py` | `13 passed, 0 failed`(F1 ⑤节含残缺卡拒绝 code=1 stage=swarm 绿);材料红证修前 10 passed, 3 failed(本会话未重跑红证) | **本会话实跑** |
|
|
140
|
+
| `python -X utf8 swarm/tests/test_swarm_cli.py` | `20 passed, 0 failed`(⑥节 7 场景 + ⑦节 3 条全绿,⑥g code=1 bad=1 单行 JSON);材料红证修前 10 passed, 7 failed →(⑦节加入前)18 passed, 2 failed | **本会话实跑** |
|
|
141
|
+
| `python -X utf8 swarm/tests/test_rust_swarm.py` | `22 passed, 0 failed`(③b 两形态不崩验签器);材料红证修前 20 passed, 2 failed(UnicodeDecodeError 崩溃实锤);材料另注该套件既有「独立形态蜂群」check 为环境声明跳过、与本轮改动无关 | **本会话实跑** |
|
|
142
|
+
| `cargo test --manifest-path swarm/rust_runtime/Cargo.toml`(裸跑,默认特性) | `test result: ok. 8 passed; 0 failed`——health 2 + hmac 2 + wal_recovery_tests 4(G1-G4 全绿),lib test/main/doc-tests 均绿——**当前工作树门禁面已转绿** | **本会话实跑** |
|
|
143
|
+
| `cargo test --manifest-path swarm/rust_runtime/Cargo.toml --features embed`(根因复现) | `error: couldn't read src\../program.pbc: 系统找不到指定的文件。 (os error 2) --> src\lib.rs:30:50 ... error: could not compile protocol_vm (lib) due to 1 previous error ... (lib test)`——**与门禁材料错误逐字一致**(片段 `m.pbc"));` + 同型 caret 跨度 + lib 与 lib test 双失败) | **本会话实跑** |
|
|
144
|
+
| swarm cargo test(门禁) | **失败**(材料口径):`could not compile protocol_vm (lib)` + `m.pbc"));` 片段。**根因厘清(本会话)**:失败仅在 embed 特性开启时发生——lib.rs:30 `include_bytes!("../program.pbc")` 在模板目录(无 program.pbc,ls 核实仅 Cargo.lock/Cargo.toml/src/target)必然编译失败;HEAD 版 Cargo.toml 为 `default = ["embed"]`(git diff 读核),即门禁时点裸 `cargo test` 即触发;该失败与 F5 的 swarm.rs 改动无关(wal_recovery_tests 在无 embed 形态编译并通过,上两行实证)。**现状**:工作树含一项材料五修复清单之外的连贯改动——模板 `default = []`(Cargo.toml 现行 :31)+ rust_codegen.py 拷贝模板后改写 `default = ["embed"]`(含恰一处 `default = []` 漂移守卫)+ lib.rs 注释同步——裸 cargo test 随之通过(上行 8/8);该改动归属材料未列明,本报告如实单列,**提交前须以当前工作树重跑门禁确认该项转绿** | 材料 + 本会话根因复现与现状复测 |
|
|
145
|
+
| `npm run gate` | 通过——本会话实跑尾部「结论:9/9 目标一致」(check_unreachable / check_publish_artifact / cogmap_sync check / link_check「全部相对链接可达」/ workspace_index --check「顶层目录 20 · 追踪 1924 件」/ verify_discipline 注入面 8 链全 OK),与材料口径一致 | 材料 + **本会话实跑** |
|
|
146
|
+
| `npm test` | **未运行**——TS 面零改动(git status 证实 src/ 与 test/ 未动,改动面仅 swarm/ + 一件先前遗留 wisdom json) | 双方一致 |
|
|
147
|
+
|
|
148
|
+
**上游会话已运行、本会话未重跑的验证**(材料原文,如实区分):五项修复的守卫红证(修前各一跑:3 红 / 7 红 / 2 红 / ③b 2 红 + ⑥g 1 红 / G1+G2 FAILED——红绿数字见第二节各守卫行);F5 的 TDD 全程(红证 2 passed; 2 failed → 绿证 4 passed; 0 failed)、全套 `cargo test --no-default-features` 8 passed、`python swarm/tests/test_rust_swarm_resume.py` 15 passed(分段续跑/坏尾截断/幂等全过,走真实 run_swarm 恢复路径;该文件本轮零改动、已含于本会话 189 全量 PASS)、首行损坏 WAL 恢复跑 E2E(恰 1 份 `.corrupt-*` 归档逐字节保留原文、新 WAL 从轮 1 重跑,临时脚本测毕已删——本会话未重跑该 E2E,归档机制由 cargo test G2 守卫在本会话绿态覆盖);N107 的毁灭窗口实测(31.8MB/453ms)与 2000 行覆盖实测;N108/109/110/111/112 的复现实跑(临时目录+随机哑密钥,测毕清理);四区复核全部复现(材料自述测毕已删/清理)。
|
|
149
|
+
|
|
150
|
+
**git 工作树核对**(本会话 `git status --porcelain` / `git diff --numstat` + 逐处读核):改动面 = **三个修复源文件**(swarm/swarm_cli.py +63/-39〔F1+F2+F3 同文件〕、swarm/rust_swarm.py +6/-2〔F4〕、swarm/rust_runtime/src/swarm.rs +286/-18〔F5;材料自报 +286/-20,以 numstat 为准〕)+ **三份守卫增补**(test_swarm_condition_space.py +56 / test_swarm_cli.py +116 / test_rust_swarm.py +50,均增补进既有文件、⑤/⑥/⑦/③b 节读核在位)——与五项修复一一对应。另有两处非五修复清单的改动如实注明:①模板 embed 翻转三件套(swarm/rust_runtime/Cargo.toml +10/-7、swarm/rust_codegen.py +10/-1、swarm/rust_runtime/src/lib.rs +3/-2)——材料未列明归属,效果为本会话实证(门禁 cargo test 失败消除);②`md_cg/whitebox_kb/wisdom/code_solidified.json` +1/-2——v10/v11 报告已注明为先前会话遗留工作区变更,非本轮触点。未做任何 commit。
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
## 五、遗留清单(8 个开口:medium 5 / low 3;全留档 7 + 残面 1)
|
|
155
|
+
|
|
156
|
+
### medium(5 项)
|
|
157
|
+
|
|
158
|
+
| # | where(缺陷时点) | 问题 | 留档理由 / 处置线索(材料口径) |
|
|
159
|
+
|---|------|------|------------------------------|
|
|
160
|
+
| N109 | swarm/rust_runtime/src/swarm.rs:691(现行 :776) | 幂等重入/恢复后 watermarks、gossip、health 三审计面归零:replay_wal 不从 WAL 重建消费水位与 gossip 计数(ACK payload 自带 seq 却不用),全完成重入 early-return 直接返回空表——违背「同 project+同 WAL 重入即续跑/幂等聚合」与「watermarks 单调递增」契约 | 三区独立实测确认(首跑 watermarks={乙:1} → 重入 {});落选原因:Rust 重放结构重构风险中等,标准④下让位 Python 项;与 N110/N111 同域(对账/记账语义)建议合并下轮 |
|
|
161
|
+
| N110 | swarm/rust_runtime/src/swarm.rs:1303(现行对账 :1372-1388) | 非对称 gossip 源投递完整却判 gossip_consistent=false——对账只比「全部目标计数相等」,每目标期望数=非自身 gossip 路由数×轮数;G3c coverage 以最大计数为基准连带压低少收侧 integrity/health | 实测 3 实例双源 [甲→*,乙→*] 3 轮 consistent=False 而实收足额、WAL all_valid=True;与 N109 同域(对账语义重推),建议与水位重键项合并下轮 |
|
|
162
|
+
| N111 | swarm/rust_runtime/src/swarm.rs:1026(现行 gossip_sent :771 起) | gossip_received 实为发送侧记账而非实收:末轮产出消息(inboxes[rounds+1] 永不投递)照常计数;死亡实例(G5)作为目标同样计数且永不 ACK,对账恒真掩盖丢弃——字段文档自称「实际收到」 | 实测 protocol 拓扑 4 实例 2 轮(甲水位=1 仅消费 seq1 而 round=2 三条路由事件永不投递、gossip 甲已计 2);死亡分支读码级;Rust 记账重构,与 N109/N110 同域合并下轮 |
|
|
163
|
+
| N113 | swarm/tests/test_swarm_topology.py:73 | 测试静默跳过洞(v3 compiler 已修洞形态的 swarm 侧对应物):② centralized/mesh 段以 `if rr["ok"]:` 包裹且段内无任何无条件 check——拓扑运行失败时断言无声消失、套件仍全绿 exit 0 | monkeypatch 双臂实跑确认(注入失败②段零输出 9 passed exit=0;fail_all 对照唯 :73-80 零输出);落选原因:测试面非产品面且 origin=new 无 legacy 加权;修复极简(段内加无条件 check),建议任意一轮顺带修 |
|
|
164
|
+
| v7 N57 | swarm/rust_runtime/src/swarm.rs:471(现行 :463-532 区段) | WAL 恢复链路三遍「解析+HMAC 验签」、好行前缀 ~3× 常驻、无截断/压缩——重启成本随累计事件数线性无界(~17µs/行) | 候选实测 5000/20000/50000 行 94/344/875ms 线性放大;落选原因:性能类非正确性;修复须重构两遍扫描结构与 F5 同函数(swarm.rs:735-751),避免同轮双改回归风险 |
|
|
165
|
+
|
|
166
|
+
### low(3 项)
|
|
167
|
+
|
|
168
|
+
| # | where(缺陷时点) | 问题 | 留档理由 / 处置线索(材料口径) |
|
|
169
|
+
|---|------|------|------------------------------|
|
|
170
|
+
| v5 N26 | swarm/rust_runtime/src/main.rs:141(:143-146 find / :152 丢弃 next) | parse_json_scalar 用裸 find([',','}']) 定标量终点不跳字符串字面量,且丢弃 parse_json_string 返回的正确 next——`--symbols` 字符串值含 ',' 或 '}' 时合法 JSON 被拒,误报「符号表键须为字符串」rc=2 | 三区独立 exe 实跑确认;落选原因:severity=low,标准①在先、两个 medium Python 项优先;修复极简(采用正确 next 游标),建议下轮顺带修 |
|
|
171
|
+
| N112 残面 | swarm/rust_runtime/src/swarm.rs:735-753(现行零提交分支 :567-573) | 换 shared_secret 重入同 project+wal:rc=0 无告警、与 WAL 被篡改不可区分(F5 后不可逆销毁面已收窄为 `.corrupt-*` 归档留痕,残面为语义告警缺失) | 候选独立 exe 实跑(两随机哑密钥:WAL 8 行整体替换、旧行 0 幸存、无告警);落选原因:severity=low;销毁面与 F5 同一路径,修复后不可逆销毁面同步收窄,剩余语义告警随 F5 验证一并评估 |
|
|
172
|
+
| v7 N59 | swarm/rust_runtime/src/swarm.rs:1049(现行 WAL 句柄经 open_wal_for_run 分派) | WAL 句柄裸 File 无用户态缓冲,每事件行一次 write_all 直 syscall;flush 对 File 是 no-op,与「事件行先 durable(flush)」纪律注释语义不符(正确性靠单 fd append + 轮末 sync_all 兜底) | 读码级(BufWriter 仅实例 stdin);v7 微基准写阶段 ~10% 为上游实测、本轮未重跑;落选原因:severity=low;BufWriter 会改变崩溃可见性语义,须与 F5 的 fsync/rename 策略统一设计 |
|
|
173
|
+
|
|
174
|
+
**优先级建议**(据材料处置线索汇总):N109/N110/N111 为同域三面(重放重建/对账期望/实收记账),建议一轮合并重构(ACK payload 的 round/seq 即重建信息源);N113 测试记账为最低成本项宜顺手清账;v5 N26 修复极简(采用 parse_json_string 返回的正确 next 游标)可顺带收;v7 N57/N59 与 F5 同函数域,宜待 F5 稳定一轮后与 fsync/BufWriter 崩溃语义统一设计;N112 残面(换 secret 告警)随 N109 的重放语义一并裁决。
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## 六、纪律合规声明
|
|
179
|
+
|
|
180
|
+
1. **定位先读索引**:本报告写作前已读 WORKSPACE_INDEX.md(按职责定位 swarm/ 为「蜂群运行时——.pbc 确定性实例 + Gossip 拓扑/水位信箱/WAL-HMAC/信任聚合」、docs/eval 为历轮报告所在),未做全盘浏览。
|
|
181
|
+
2. **结论引证**:所有修复与缺陷均引 path:line(材料口径为缺陷时点快照行号;三文件修复后行号漂移处另注本会话读核现行行号——如 F1 材料称 swarm_cli.py:78-82、读核实为现行 :91-95〔透传行 :95〕,F5 材料称 swarm.rs:735-752、读核实为现行 open_wal_for_run :554-574/rewrite_wal_atomic :578-599/archive_corrupt_wal :601-619/调用点 :821/守卫模块 :1519-1716,以读核值为准);第三节证据要点摘自任务输入的四区复核材料(上游会话读码+实跑);第四节「本会话实跑」八项为第一手命令与输出原文(全量回归、三守卫套件、裸 cargo test、--features embed 根因复现、gate 全链、git 核对),材料口径与未跑项均如实标注来源,无一冒充。门禁 cargo test 失败如实记录为失败,并附本会话根因复现(逐字一致)与现状复测(转绿),未将现状转绿冒充门禁时点通过。
|
|
182
|
+
3. **修复落盘核验**:五项修复的现行代码本报告会话逐处读核——F1 swarm_cli.py:95 透传、F2 :34/:71-75/:79-82/:85-126/:133-136 四段守卫、F3 :102-113 口径统一、F4 rust_swarm.py:111-115 errors="replace" + :100 注释同步、F5 swarm.rs:418/:541-619/:821 + wal_recovery_tests :1519-1716(dummy_secret 随机哑密钥生成器与 guard_dir 清理逻辑读核在位);三份守卫增补的 ⑤/⑥/⑦/③b 节与文件头注释读核在位,且本会话实跑全绿(13/20/22);legacy 编号归属经 v5.md:50-57 / v5.md:77 / v7.md:104/:106 grep 核实(v5 N24〔=v1 #24〕/N25/N26、v7 N57/N59、v1 #25)。材料自报 swarm.rs +286/-20 与本会话 git numstat +286/-18 的小出入以 numstat 为准并如实注明。
|
|
183
|
+
4. **安全测试纪律**:材料中全部复现均为系统临时目录/临时脚本 + 随机生成哑密钥(token_hex / guard-dummy-<pid>-<ms>-<seq> 运行期拼接,无任何真实 HMAC 密钥硬编码),测毕清理(材料逐项自述;修复会话累计清理 swarm_vfc_*/swarm_acc_*/swarm_cli_*/swarm_cs_*/swarm_err_* 等临时目录);本报告会话只运行测试套件、回归、cargo test、gate 检查器与 git 只读命令,未做任何攻击/越权复现;本会话 cargo 构建使用 swarm/rust_runtime 既有 target/ 缓存(仓库内常规构建面),未触真实数据目录。
|
|
184
|
+
5. **已修项不重复报**:四区 rejected 均为空——本轮无证伪/剔除条目,如实记录(与 v11 的 11 项剔除不同,本轮四区复核全部命中确认);跨区重复 6 组已合并单列(第三节末),同对象不重复占坑;v5.md:17 留档三项(N24/N25/N26)中 N24/N25 本轮闭账、N26 维持留档;v7 留档 N57/N59 维持;swarm 历轮已修面(v5 的 verifier 消息丢失/同源覆盖/验签容错 ASCII 面/Rust CLI valid_job_id、v8 的 compiler 与 hive 项)未再报,N108 为 v5-L2 验签容错修复的**盲区补全**(多字节解码面),非重复立项——材料证据自证(场景A ASCII 边界不崩=旧修复有效,场景B/C 多字节/非法字节崩=盲区)。
|
|
185
|
+
6. **隐私脱敏**:全文只写仓库相对路径;材料与本会话输出的本机绝对路径(盘符/用户目录/系统临时区路径)一律转录为「仓库根/系统临时目录」等占位描述;无任何 key/token/密钥字面量(哑密钥均注明随机生成);守卫内出现的 0xFF/E5 AE 9E/E6 B1 A1 为字节序列证据非凭据;定稿前经机械扫描复查(盘符/用户目录/凭据字面量形态零命中,见下方自查)。
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## 七、跳过项及原因
|
|
190
|
+
|
|
191
|
+
- **npm test 未运行**:TS 面零改动(git status 证实 src/ 与 test/ 未动,本轮缺陷与修复全部在 python/Rust 面)——材料与本会话口径一致。
|
|
192
|
+
- **门禁 cargo test 的「通过」未由本会话在门禁管线内重跑**:材料口径为失败;本会话以两条等效命令单独复测(裸 cargo test 8/8 通过 = 门禁项现状;--features embed = 失败根因逐字复现),并厘清失败与 F5 改动无关、消除来自材料未列明的模板 embed 翻转三件套——正式结论须以当前工作树重跑门禁管线确认,处置归编排会话。
|
|
193
|
+
- **守卫红证未在本会话重跑**:上游修复会话已跑且逐项留痕(修前红/修后绿数字见第二节各守卫行);本会话重跑需回退工作树(多轮改动未提交、无法整体回退),风险大于收益——以修复落盘读核 + 修后绿态实跑 + 全量回归替代佐证,如实标注。
|
|
194
|
+
- **四区复核的复现场景未在本会话重复**:上游复核会话已在临时环境执行并逐项声明「测毕已删/清理」(第三节证据来源均标注为材料原文);本会话未重跑 N107 毁灭窗口实测、N108/109/110/111/112 复现、F5 首行损坏 E2E(归档机制以 cargo test G2 守卫本会话绿态覆盖)。
|
|
195
|
+
- **v7 N57 性能基准与 v7 N59 微基准未重跑**:tests 区复测为读码级,材料如实声明(引用 v7 上游实测 16.0µs/行 R²=0.9999 与写阶段 ~10%),本报告照录并标注来源。
|
|
196
|
+
- **模板 embed 翻转三件套的归属未裁定**:Cargo.toml/rust_codegen.py/lib.rs 三件改动在工作树在位但材料五修复清单与留档清单均未列明——本会话仅实证其效果(门禁失败消除 + 生成项目形态语义保持的设计意图见 rust_codegen.py 改写注释),不擅自归属、不擅自回退,如实单列待编排会话裁定(若为无主改动,提交前须补验证生成项目全链路)。
|
|
197
|
+
- **git 未提交**:commit 需任务方指令;工作树保持三源文件补丁 + 三守卫增补 + 模板翻转三件套原状(及一件先前会话遗留的 wisdom json 变更)。
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
*报告依据:任务输入的第 12 轮材料(四区复核 26 confirmed / 0 rejected 明细及证据、五项修复的 where/问题/修复/前后对比/守卫/verified_by、留档未修 8 条、门禁结果);本报告会话的修复落盘读核(五补丁现行行号锚点)、三份守卫套件实跑(13/20/22 全绿)、全量回归实跑(189/189 通过、5 跳过,退出码 0)、裸 cargo test 实跑(8 passed 含 wal_recovery_tests 4 守卫)、门禁失败根因复现(--features embed 于 lib.rs:30 逐字一致)、npm run gate 实跑(9/9 目标一致)、legacy 编号历轮报告 grep 核实(v5.md:50-57/:77、v7.md:104/:106)、git 工作树核对(numstat + 逐处读核,含材料未列明的模板 embed 翻转三件套)、报告脱敏机械扫描。*
|
|
202
|
+
|
|
203
|
+
*自查双清单:①材料覆盖——四区 26 条目全部入文(cli 6 / wal 7 / gossip 6 / tests 7),rejected 0 如实记录,跨区重复 6 组合并说明单列,去重后 13 独立缺陷(新 N107-N113 共 7:high 1/medium 5/low 1 + legacy 复测 6 组:v5 N24/N25/N26、v7 N57/N59、v1 #25)数目吻合,5 补丁逐项五要素齐全(where/问题/修复/前后对比/守卫),全闭 5 面 + N112 部分收窄、13 − 5 = 8 开口(全留档 7 + 残面 1)与材料留档 8 条逐条对应无多无少,legacy 项全部标注原轮次(编号经 v5.md/v7.md grep 核实),门禁四项(python 通过/cargo 失败/npm test 未跑/gate 通过)与跳过原因一一对应,材料与实跑不一致处(材料自报 +286/-20 vs numstat +286/-18、门禁 cargo 失败 vs 现状转绿、材料证据「ok=true」vs 实测无顶层 ok 键)如实记录;②纪律——全部结论引 path:line 或注明材料来源,八项第一手实跑命令与输出在第四节(全量回归、三守卫、裸 cargo test、embed 根因复现、gate、git numstat),未跑项(门禁管线内 cargo/npm test/守卫红证/复现场景/性能基准)无一冒充为已跑,材料口径行号与读核现行行号漂移(F1 :78-82→:91-95、F5 :735-752→:541-619/:821、N109 :691→:776 等)如实注明,工作树两处非五修复清单改动(模板 embed 翻转三件套、先前会话 wisdom json)如实注明且前者附本会话实证,全文无本机绝对路径、无 key/凭据字面量(机械扫描盘符/用户目录/凭据字面量形态零命中;「哑密钥」均注明随机生成)。*
|