@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.
Files changed (156) hide show
  1. package/README.md +572 -465
  2. package/docs/README.md +1 -0
  3. 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
  4. 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
  5. package/docs/eval/DSH/347/253/257/347/274/272/351/231/267/344/270/223/351/241/271_v1.0.md +254 -0
  6. 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
  7. package/docs/eval/bench_lingshu_self/bench_self.py +140 -0
  8. package/docs/eval/bench_lingshu_self/self_bench_result.json +404 -0
  9. 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
  10. 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
  11. 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
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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
  17. 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
  18. 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
  19. 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
  20. 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
  21. 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
  22. 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
  23. 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
  24. 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
  25. 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
  26. 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
  27. 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
  28. 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
  29. 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
  30. 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
  31. 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
  32. 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
  33. 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
  34. 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
  35. 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
  36. package/docs/images/lingshu-moonlight-covenant-poster-preview.jpg +0 -0
  37. package/docs/images/lingshu-moonlight-covenant-poster.png +0 -0
  38. 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
  39. 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
  40. 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
  41. package/dsh/cordis-patch-profile-web.example.yml +35 -0
  42. package/lib/bridge.d.ts +9 -0
  43. package/lib/bridge.js +35 -0
  44. package/lib/cli.d.ts +3 -0
  45. package/lib/cli.js +66 -0
  46. package/lib/index.js +7 -1
  47. package/lib/init.d.ts +88 -0
  48. package/lib/init.js +287 -0
  49. package/lib/lib/roleplay_web.js +530 -443
  50. package/lib/lib/token_store.d.ts +7 -1
  51. package/lib/lib/token_store.js +12 -3
  52. package/md_cg/audit.py +12 -1
  53. package/md_cg/backfill.py +16 -15
  54. package/md_cg/backfill_bucket_zh.py +35 -0
  55. package/md_cg/bench_e2e_judge.py +532 -0
  56. package/md_cg/bench_e2e_locomo_qa.py +368 -0
  57. package/md_cg/bench_e2e_qa.py +256 -0
  58. package/md_cg/branches.py +18 -2
  59. package/md_cg/ccgc.py +3 -2
  60. package/md_cg/chain.py +19 -4
  61. package/md_cg/consolidate.py +7 -6
  62. package/md_cg/crosscheck.py +4 -3
  63. package/md_cg/crypto.py +439 -437
  64. package/md_cg/datapath.py +395 -335
  65. package/md_cg/evidence.py +8 -3
  66. package/md_cg/export.py +3 -1
  67. package/md_cg/forgetting.py +2 -2
  68. package/md_cg/fsutil.py +48 -0
  69. package/md_cg/hotcache.py +255 -238
  70. package/md_cg/interop.py +161 -22
  71. package/md_cg/judgment_manifest.py +177 -0
  72. package/md_cg/links.py +655 -622
  73. package/md_cg/mcp_server.py +282 -31
  74. package/md_cg/mdcg.py +702 -126
  75. package/md_cg/mdcos.py +454 -68
  76. package/md_cg/mreview/govern.py +5 -4
  77. package/md_cg/postings.py +4 -2
  78. package/md_cg/readcache.py +76 -18
  79. package/md_cg/reconcile.py +228 -0
  80. package/md_cg/review_cli.py +215 -0
  81. package/md_cg/routing.py +28 -0
  82. package/md_cg/run_tests.py +211 -0
  83. package/md_cg/scrub.py +862 -852
  84. package/md_cg/security.py +385 -275
  85. package/md_cg/selfreport.py +3 -2
  86. package/md_cg/signer.py +565 -562
  87. package/md_cg/sources.py +3 -2
  88. package/md_cg/stg.py +6 -0
  89. package/md_cg/sustain.py +1168 -1138
  90. package/md_cg/test_access_hints.py +147 -0
  91. package/md_cg/test_branch_discard_tombstone.py +136 -0
  92. package/md_cg/test_branches.py +259 -249
  93. package/md_cg/test_chain_read_isolate.py +168 -0
  94. package/md_cg/test_datapath_device_name.py +203 -0
  95. package/md_cg/test_emit_negtail_cache.py +156 -0
  96. package/md_cg/test_en_pipeline.py +186 -166
  97. package/md_cg/test_govern_directread.py +421 -0
  98. package/md_cg/test_i32_hotcache_env_key.py +218 -0
  99. package/md_cg/test_identity_attribution.py +228 -147
  100. package/md_cg/test_index_crossprocess_reload.py +301 -0
  101. package/md_cg/test_index_durability.py +238 -224
  102. package/md_cg/test_interop.py +4 -2
  103. package/md_cg/test_interop_judgment.py +228 -0
  104. package/md_cg/test_issue39_utf8_stdio.py +273 -0
  105. package/md_cg/test_links_concurrent_write.py +188 -0
  106. package/md_cg/test_merge_upsert.py +168 -0
  107. package/md_cg/test_n123_derive_expiry_chain.py +205 -0
  108. package/md_cg/test_n130_verify_falsified_protect.py +185 -0
  109. package/md_cg/test_n131_merge_gate.py +205 -0
  110. package/md_cg/test_none_id_write_guard.py +165 -0
  111. package/md_cg/test_p1x_ref_root.py +160 -0
  112. package/md_cg/test_p27_docindex.py +774 -765
  113. package/md_cg/test_p2_mcp.py +3 -0
  114. package/md_cg/test_p32_backfill.py +304 -298
  115. package/md_cg/test_p39_verify_flow.py +90 -50
  116. package/md_cg/test_p47_session_view.py +60 -25
  117. package/md_cg/test_propose_tail_index.py +157 -0
  118. package/md_cg/test_read_scope_b27.py +277 -0
  119. package/md_cg/test_readcache_default_on.py +168 -0
  120. package/md_cg/test_readcache_precise_inval.py +270 -0
  121. package/md_cg/test_readcache_prodpath.py +55 -7
  122. package/md_cg/test_reconcile_v0.py +294 -0
  123. package/md_cg/test_retr_s1.py +6 -2
  124. package/md_cg/test_retr_s1b.py +67 -0
  125. package/md_cg/test_retr_s7.py +8 -0
  126. package/md_cg/test_retr_s9_entity_ctx.py +181 -175
  127. package/md_cg/test_retr_score_once.py +208 -0
  128. package/md_cg/test_review_cli_attribution.py +177 -0
  129. package/md_cg/test_review_cli_visibility.py +235 -0
  130. package/md_cg/test_review_onepass.py +170 -0
  131. package/md_cg/test_rrf_graph_seed_cache.py +154 -0
  132. package/md_cg/test_security_audit.py +155 -0
  133. package/md_cg/test_security_audit_b26.py +161 -0
  134. package/md_cg/test_security_audit_v21.py +250 -0
  135. package/md_cg/test_semantic_canonical.py +255 -241
  136. package/md_cg/test_session_isolation.py +168 -0
  137. package/md_cg/test_snapshot_autoclose.py +187 -0
  138. package/md_cg/test_tail_watermark_race.py +208 -0
  139. package/md_cg/test_tenant_env_override_warn.py +139 -0
  140. package/md_cg/test_tenant_registry_corrupt_warn.py +151 -0
  141. package/md_cg/test_v14_fixes.py +415 -397
  142. package/md_cg/test_verify_dirty_reconcile.py +157 -0
  143. package/md_cg/theory.py +276 -273
  144. package/md_cg/tokens.py +734 -677
  145. package/md_cg/units.py +3 -2
  146. package/md_cg/vision_evidence.py +4 -3
  147. package/md_cg/whitebox_kb/wisdom/code_solidified.json +6195 -6195
  148. package/md_cg/whitebox_kb/wisdom/multilang_ir.py +128 -124
  149. package/md_cg/writepipe.py +554 -550
  150. package/package.json +11 -2
  151. package/src/bridge.ts +434 -401
  152. package/src/cli.ts +65 -0
  153. package/src/index.ts +526 -518
  154. package/src/init.ts +347 -0
  155. package/src/lib/roleplay_web.ts +1019 -932
  156. package/src/lib/token_store.ts +202 -192
@@ -0,0 +1,207 @@
1
+ # 缺陷挖掘报告 · 自主迭代 v19(swarm 三轮深挖·三圈第四站)
2
+
3
+ - **日期**:2026-09-26(批次 58)
4
+ - **范围**(生效条件):第 19 轮 = swarm/hive 交界三轮深挖第四站,四区复核(legacy / recent / rustcore / pybridge)共 **28 条目**(confirmed 28 / rejected 0)→ 跨区重复合并 **5 条**(N143 三区 ×2、N113 两区 ×1、v5 N26 两区 ×1、v17 N146 两区 ×1、R02 与 pybridge serve.rs:201 复核条交叠归并 ×1)→ 独立条目 **23**(新发现 **13** = 本轮新编号 **N154-N166**〔high 1 / medium 5 / low 7,其中 N159 当场修复〕+ legacy 复测缺陷条 **7**〔其中 4 条 6 个缺陷面本轮首修〕+ 复测结案/台账条 **3**)→ 本轮修复 **5 个补丁**(闭 6 个缺陷面:R02 矛盾态 / v12 N109-111① / N143 验证面 / v12 N113 / v5 N26① / N159——全 swarm 与 hive 交界域,Rust+Python 双面)→ 遗留 **19 个开口**(medium 9 / low 10,含本报告补账 2 项)+rejected 0
5
+ - **编号口径**:**v18 实际用至 N153**(v18.md:4-5/:78-79 核实——其头部自述「本轮新发现自 N148 续编」,新发现表实列 N148-N153,其中 N152 系该报告会话补账、N153 系三区冲突族编裁决);本轮任务书「v18 用至 N151、自 N152 续编」与 v18.md 不符(N152/N153 已被 v18 报告会话占用),按「编号全局唯一」不变量本轮自 **N154 续编**。**材料四区候选暂编号冲突及本报告会话统一裁决**(如实记录,全部重编逐项标注原暂编号,非暗改):rustcore 区五项原暂编整体 +2 顺延——N152(protocol ACK verifier 记名)→ **N154**、N153(kill_tree taskkill 退出码)→ **N155**、N154(信任 NaN 夹取)→ **N156**、N155(vm CALL 帧深)→ **N157**、N156(HMAC '|' 裸连接)→ **N158**;pybridge 区三项与 rustcore 暂编冲突顺延——N152(build_rust_exe 短路)→ **N159**、N153(恒真断言)→ **N160**、N154(篡改断言脱钩)→ **N161**;recent 区四项未编号新发现按列示顺序编 **N162-N166**(content_hash 未含 cwd / seq 坏行两路径 / seq 首行基准 / MCP 幂等旁路 / 无锁 check-then-create)。legacy 区 R02 条候选自标「N154」系冲突暂编,按 legacy 口径不占新号(原报=故障注入实测_v1.0.md:192-193/:416 留档、N92 同型〔v10 首报、v17 F2 已修其 serve stop 杀树面〕,v17/DSH 专项两轮确认,本轮第 3 次复核)。
6
+ - **材料账目遗漏补账声明**(本报告会话第一手读核):四区 confirmed 中有 **2 项新发现既不在材料修复清单也不在材料留档未修清单**——①rustcore 区 protocol 拓扑 verifier 记名条(→N154)②recent 区幂等键 content_hash 未含 cwd 条(→N162)。本会话读核现行代码:两病灶均在位未修(swarm.rs:899-921 verifier 收件箱记名面、hive/src/main.rs:299-300 哈希只含 canonical spec 文本)——按第一手证据补账入第五节开口清单(均 medium),非修复项、非已闭项。
7
+ - **回归**:门禁四项为**编排会话实跑**(任务材料提供,本报告如实标注来源):python 全量 215/215 通过 5 跳过(依赖缺失/平台不符)退出码 0(尾部 PASS hive.test_wm_progress / swarm.tests.test_rust_swarm / hive.test_exec_tools);swarm cargo test 通过(退出码 0);npm test 通过(退出码 0);npm run gate 通过。**本报告会话实跑**:五项修复的常驻守卫逐一独立复跑全绿(hive.test_wm_conflict **7/7**、test_swarm_topology **13 passed 0 failed**、test_rust_swarm **24 passed 0 failed**、test_swarm_cli **22 passed 0 failed**、test_rust_codegen **22 passed 0 failed**——⑩节真实 cargo 构建:⑩b delta=62.1s、⑩c 重建语义 trust=0.9,与修复材料一致;⑦/⑨按套件自身环境声明跳过)+ 双侧 cargo 全量复跑(swarm/rust_runtime **lib 10 passed 0 failed** 含 F2 两新守卫;hive **29 lib + 9 bin + 6 integration = 44 passed 0 failed** 含 F1 两新守卫)+ python 全量后台复跑(结果见第四节末注①)+ npm run gate 落盘后复跑(分轮记录见第四节末注②③④)。
8
+ - **行号口径**:材料行号为上游复核/修复会话时点快照;修复 2 对 swarm.rs 净增 ~272 行使该文件后续行号整体下移,本会话对全部落点逐一读核并**双标**(例:verifier 记名面材料 :896 → 读核现行 :899-921;trust clamp 材料 :508/:1033/:1349 → 现行 :530/:1086/:1091/:1407;gossip_consistent counts 判据材料 :1372-1376 → 现行 :1431 附近;gossip_received 冒充材料 :1387 → 现行 :1445)——以读核为准。其余修复落点读核与材料口径吻合(第二节逐项标注)。
9
+ - **结构口径**(CCG 六要素):功能名(标题)/ 生效条件(范围与口径行)/ 子功能(第二~五节)/ 执行与验证方式(第四节:实跑命令与结果)/ 不适用条件(第七节:跳过与未运行项)
10
+
11
+ ---
12
+
13
+ ## 一、执行摘要
14
+
15
+ 本轮为 swarm/hive 交界三轮深挖第四站:四区复核 28 条目(rejected 0),跨区去重后 23 独立条目(新发现 13 + legacy 复测缺陷条 7 + 结案/台账条 3),5 补丁闭合 6 个缺陷面,遗留 19 开口(含补账 2)。四个主题:
16
+
17
+ 1. **交界「假成功」双主题收口**:①R02 矛盾态(v17/DSH 专项两轮确认的欠账,N92 同型)——杀 serve 后孤儿执行器补写 ok 产物与 state=error 终态在 poll 面同屏且无任何矛盾裁决字段,wm.py 凭证闸只按 result.ok 放行:观测面报失败、记账面记成功,双消费面结论相反。修复双落:Rust 观测面(result_summary 补透 ok 凭证位 + one_job_view 矛盾检测置 conflict="late_result_after_error"——state 不翻转、result 不吞、裁决权交消费面)+ Python 消费面(cmd_snapshot 记账面核查拒放行 + status 不可读 fail-closed)。②N159(high,本轮最重新发现)——build_rust_exe『exe 存在即返回』短路:同 project 换源重跑静默执行**旧嵌入字节码**(embed 是编译期 include_bytes! 嵌 exe 的),CLI 全绿假成功,审计元数据 build_meta.json 还被覆写加重误导——正常运维路径即触发、无需攻击者。修复=pbc 较新强制重建 + 构建后重探真实 .exe(v5 N26① 同面顺修)。
18
+ 2. **幂等聚合契约修复 + 验签面 fail-closed**:v12 N109-111①——同 project+同 WAL 重入后 watermarks/gossip 审计面归零(ACK payload 自带 {round,seq} 即重建信息源却未消费),违背重入幂等聚合契约;修复=WalReplay 增两审计面重建字段 + gossip 路由指纹回填 + 两表播种(health 面维持在线窗口口径的诚实边界见 F2)。N143 验证面最小形态——空串密钥验签 fail-open(空串自签伪造行 + `verify --secret ""` 全绿 rc=0):库面入口与 CLI 双落 fail-closed;run 侧缺省密钥来源维持**语义决策 deferred**。
19
+ 3. **守卫可信度修复 + 测试基建新发现**:v12 N113——拓扑测试②centralized/mesh 段运行失败时断言无声消失、套件全绿放行(恰是最需守卫的场景零防线);修复=段内补两条前置无条件 check。新发现同族两件留档:N160 恒真断言(`all(True for _ in [1])`,level 字段零校验——v18 compiler 测试基建同型发现模式)、N161 篡改断言与现行七字段签名串脱钩(两态恒真、检验力≈0)。
20
+ 4. **新发现 13 项全景(N154-N166)**:rust 运行时归因/资源面 5 项(N154 protocol ACK 记名〔补账〕、N155 kill_tree 不查 taskkill 退出码、N156 信任 NaN 夹取失效跨恢复永久存活、N157 vm CALL 帧深无上限峰值内存≈10GB、N158 HMAC 签名串 '|' 裸连接可平移字段边界);幂等键面 3 项(N162 content_hash 未含 cwd〔补账〕、N165 MCP hive_spawn 提交面整面旁路、N166 无锁 check-then-create);seq 取证面 2 项(N163 坏行占位两路径不一致——伪行可制造指向无辜行的明细、N164 首行基准删首部不可检);测试基建 2 项(N160/N161)+ 修复 1 项(N159)。
21
+
22
+ **对输入口径的核验**:输入称「四区复核 confirmed 28 条(四区各 7、rejected 空)+ 5 修复 + 留档未修 17 条」。本会话以 `git diff --stat`/`git status` + 全落点读核核对:改动面 = 12 文件 +588/-41 + untracked hive/test_wm_conflict.py——与五项修复一一对应(第二节逐项标注),**exec.rs 零改动与 N155 留档不修一致**,无越域改动。条目账目:28 confirmed − 跨区冗余 5 = 23 独立条目 = 13 新发现 + 7 legacy 复测缺陷条 + 3 结案/台账条;材料留档 17 条 + 本报告补账 2 项(N154/N162)= 19 开口,与第三/五节状态联动无多无少(其中 N159 已修不计开口、legacy 4 条含已修面部分闭合)。五项修复由上游修复会话完成,本报告会话未修改任何源文件,仅读核 + 守卫/门禁实跑。**需明示的口径偏差**:①任务书编号续编基准与 v18.md 不符已按全局唯一原则裁决(见编号口径行);②材料留档清单遗漏 N154/N162 两开口已补账;③候选暂编号冲突 8 处已统一重编(逐项标注)。
23
+
24
+ ---
25
+
26
+ ## 二、修复清单(5 项,逐项 where / 缺陷面 / 修复 / 攻防前后对比 / 守卫)
27
+
28
+ ### F1(R02 矛盾态·hive 面,medium,v17/DSH 专项两轮留档→本轮第 3 次复核坐实→本轮首修)杀 serve 后孤儿执行器补写 ok 产物与 state=error 终态同屏无裁决——wm 凭证闸只按 result.ok 放行
29
+
30
+ - **where**:`hive/src/main.rs`(**读核现行**:result_summary :371-413——:384-387 补透 ok 凭证位,注释自述「观测面此前只透 content/usage,凭证字段不可见——矛盾裁决无从在 poll 面成立」;one_job_view :415-449——:436-445 检测 state=error × result.ok=true 并存即 `kv.push conflict="late_result_after_error"`,:417-422 注释载明「不静默翻转 state、不静默吞 result:两张脸同屏 + 矛盾位显式置起,裁决权交给消费面」)+ `hive/wm.py`(:113 生效条件注释 + :133-154 矛盾态闸:status.state=error → ok:False + conflict + verdict;status 解析失败 → conflict=status_unreadable fail-closed;status 缺失按旧口径仅凭 ok 门放行)。守卫:main.rs bin 测试 2 项(one_job_view_flags_late_result_after_error / one_job_view_no_conflict_without_contradiction)+ `hive/test_wm_conflict.py`(新文件,G/Z/C 三组 7 检查,run_tests.py 的 hive/test_*.py glob 自动纳入 CI)。
31
+ - **缺陷面**:serve 被外部硬杀(kill -9/断电)→ 执行器成孤儿继续跑 → serve 重启时 recover_orphans 因产物未落盘标 error(scheduler.rs:342-356),此后 error 终态落入 `match _ => {}`(:358)永不再回看——孤儿自然完成时补写的 ok 产物矛盾固化。wm.py:124 `result.get("ok") is not True` 是唯一凭证门、全程不读 status.json。攻击向量:触发无需攻击者,窗口=任务剩余执行时长。
32
+ - **修复**:①Rust 观测面 result_summary 新增 ok 凭证字段透出(此前 poll 面凭证位不可见)+ one_job_view 合体时矛盾检测置 conflict(其余组合 done+ok / error+ok=false / error+无产物不置位零扰动);②Python 消费面 cmd_snapshot 在 ok 门之后新增记账面核查:state=error 拒放行(须人工核实产物后改写记账终态)、status 解析失败 fail-closed(conflict=status_unreadable,事故信号不静默)、status 缺失按旧口径零回归。拒绝发生在 staging 之前,无 wm/jobs/<job_id> 残留、无 task 分支产出。**未动 scheduler.rs recover_orphans 本体**(error 永不回看的根源留待上层裁决语义定夺——诚实边界)。
33
+ - **攻防前后对比**:修复前(材料第一手实测:哑 job status.json={"state":"error","error":"serve 中断:任务执行被重置"}〔与 scheduler.rs:343-355 逐字同字段〕)——`hive poll` 输出 {"state":"error","result":null};补写 result.json {"ok":true,...} 后再 poll 同屏输出 state=error + result.content_head="ORPHAN-LATE-WRITE-OK" + completed=true,键集无任何 conflict/warning(main.rs:425-427 修复前 status 与 result 直接合体无消解);同 job 调 wm cmd_snapshot 返回 ok=True 且 git commit 成功——产物借 ok 皮入库。修复后:poll 同屏透出 {"state":"error","result":{...ok:true...},"conflict":"late_result_after_error"};wm snapshot 函数面+CLI 均 rc!=0 拒绝且 wm 仓零残留零分支。
34
+ - **守卫**:红→绿两轮实跑(材料口径):cargo test --bin hive one_job_view 旧码 1 FAILED('矛盾态必须透出 conflict 裁决字段' left:None)→ 新码 2 passed;hive.test_wm_conflict 旧码 4 FAIL/3 ok → 新码 7/7。全量回归(材料口径):hive cargo 44/44(29 lib+9 bin+6 integration)+ scripts/run_tests.py hive 17/17。**本会话实跑(绿态)**:`python -X utf8 -m hive.test_wm_conflict` → G1 矛盾态拒绝/G2 staging 前无残留/G3 无 task 分支/Z1 done+ok 放行/Z2 无 status.json 放行/Z3 坏 status fail-closed/C1 CLI rc!=0 共 **7/7 通过**;`cargo test --manifest-path hive/Cargo.toml` → **29 lib + 9 bin(含两新守卫)+ 6 judgment_surface = 44 passed 0 failed**。注(材料如实转述):本改动不含 swarm 域代码,修复会话跑的是 hive crate 全量(CI hive-check.yml 同款)。
35
+
36
+ ### F2(v12 N109-111①面,medium,v12 首报→v14 复测→本轮第 3 次复核三面全复现→本轮首修①面)同 project+同 WAL 重入后 watermarks/gossip 审计面归零——ACK payload 自带 {round,seq} 即重建信息源却未消费
37
+
38
+ - **where**:`swarm/rust_runtime/src/swarm.rs`(**读核现行,修复后行号**:WalReplay 增补 gossip_sent 重建字段 :425-430〔注释载明「与在线 gossip_sent 记账同源同口径」〕;replay_wal 签名增 gossip_fps 指纹参数 :456-461、初始化 :475;重放回填:路由指纹计数 :567-573、ACK 分支回填水位;run_swarm 据 cfg.routes 计算指纹 :804-812、两表从 replay 播种 :824、早退分支传重建表 :870;守卫 wal_reentry_keeps_watermark_and_gossip_faces :1836 + replay_backfills_watermarks_and_gossip_exactly :1917-1964;既有 4 处 replay_wal 调用点同步新签名)。材料口径(修复前):402-419 WalReplay 无 watermarks/gossip_sent 字段、:769-776 空表起步、:801-818 早退传空表。
39
+ - **缺陷面**:同 project+同 WAL 重入的任何运维动作(重启聚合/断点续跑)即触发三审计面归零(health 面本轮不重建,见诚实边界)——重入报告与首跑报告矛盾,违背幂等聚合契约;部分恢复(续跑)路径同源丢失。触发无需攻击者。
40
+ - **修复**:①watermarks 重建=ACK 行 payload {"round","seq"} 的 seq 取 per 实例最大值(与在线水位推进写入面同源同值);②gossip_sent 重建=(from,type) 命中 gossip 路由指纹的路由行计数(与在线 fan-out 记账同口径——含 N111 已留档的发送侧语义,重入口径=与首跑报告一致;同源同型单播/gossip 病理重叠配置的歧义边界已如实声明);③run_swarm 两表播种:watermarks 在线推进带 > 守卫单调不回退、gossip 续跑累加新会话段;④守卫自亦修复一处潜病(新测试行构造 helper 单次取样 ts)。**诚实边界(未修项明说)**:health 面维持在线窗口口径——逐轮终态质量未持久化进 WAL(快照只存末轮 states,ACK 对 error 终态照发,参与性重建会把 error 轮伪造成 success,违背 G5「不伪造终态」纪律),精确重建须快照负载扩展持久化逐轮 outcomes,属协议变更非本轮最小修复,与②③同列 deferred;红守卫因此只断言 watermarks/gossip。
41
+ - **攻防前后对比**:修复前(材料红证,进程内合成 2 轮已完成 WAL 重入早退聚合)——report.watermarks.get("乙")==None、gossip 空表(与 v12/v14 留档实测「首跑 {乙:1}/{乙:2} → 重入 {}」逐字同象)。修复后——同 WAL 重入 watermarks={乙:1}、gossip={乙:2}、acks=1/global_seq=2 全保留、gossip_consistent=true——重入报告审计面与首跑一致。
42
+ - **守卫**:红→绿两轮实跑(材料口径):红证 cargo test --lib wal_reentry 旧码 FAILED('重入 watermarks 须从 ACK payload 重建' left:None right:Some(1))→ 新码 10/10 passed ×2 轮稳定;回归 scripts/run_tests.py swarm 14/14 + hive cargo 44/44 未受扰。**本会话实跑(绿态)**:`cargo test --manifest-path swarm/rust_runtime/Cargo.toml` → **lib 10 passed 0 failed**(含 wal_reentry_keeps_watermark_and_gossip_faces 与 replay_backfills_watermarks_and_gossip_exactly 两新守卫输出 ok 在案)。
43
+
44
+ ### F3(N143 验证面最小形态,medium,v15 N128 首报→v17 N143 留档→本轮第 3 次复核→本轮首修验证面)verify 空串密钥 fail-open:空串自签伪造行整条洗白、CLI --secret "" 全绿 rc=0
45
+
46
+ - **where**:`swarm/rust_swarm.py`(**读核现行**:verify_wal_signatures 生效条件注释 :103 + docstring :110-112 + 入口前置拒绝 :126-128 `if not shared_secret: raise ValueError("WAL 验签密钥不得为空(空串/None 密钥拒绝——fail-closed,N143)")`——读 WAL 之前即拒,非空密钥路径零改动)+ `swarm/swarm_cli.py`(:129 生效条件注释 + :131-134 `if not args.secret: _fail("verify", ..., 2)`——空串显式拒绝 rc=2 用法错口径,不透传验签器)。守卫:test_rust_swarm.py ③c 节(:164 起,③c-1 空串/③c-2 None)+ test_swarm_cli.py ⑧节(⑧a/⑧b)+ FI-R08 同步(test/chaos_injection/registry.py、test_fi_r08_default_secret_forge.py——git diff 佐证)。
47
+ - **缺陷面**:任何能写 WAL 的本机组件以空串自签伪造行(读过源码即知,无需特殊权限),`verify_wal_signatures(wal, '')` 返回 all_valid=True、CLI `verify --secret ""` rc=0——伪造信任/路由历史整条洗白。最小改动 18 行(两文件 diff 12+6)。
48
+ - **修复**:两入口空串/None 结构化拒绝(库面 ValueError / CLI rc=2);**未触 run 侧缺省密钥**——本会话读核佐证:rust_swarm.py:27 `DEFAULT_SECRET = "蜂群默认密钥"` 公开常量、:32 缺省形参、swarm_cli.py:93 `cfg_in.get("shared_secret", "")`、rust_runtime/src/main.rs:279 `.unwrap_or("蜂群默认密钥")` 全部原样在位——「缺省密钥从何而来」三入口统一(fail-closed 拒启动 vs 首启随机落盘)维持**语义决策 deferred**,已在 FI-R08 notes 与 registry 注释留档。
49
+ - **攻防前后对比**:修复前(材料第一手实测)——空串自签伪造行 verified=1 all_valid=True;CLI rc=0 ok=true 全绿;对照错密钥 rc=1 bad=1(防线本体判别力本就完好)。修复后——库面同入口抛 ValueError;CLI rc=2 ok=false stage=verify 带结构化 error;非空错密钥对照腿不变。
50
+ - **守卫**:红→绿四层(材料口径):临时守卫 exit=1→0;test_rust_swarm 修复前 22 passed 2 failed → 修复后 24 passed 0 failed;test_swarm_cli 修复前 20 passed 2 failed → 修复后 22 passed 0 failed;FI-R08 空串腿由缺口断言改写为修复面确认(verdict=gap 与 registry 期望一致 exit=0);无回归(FI-R04/R05/R06 exit=0、resume 15/0、fault 9/0、protocol 12/0)。**本会话实跑(绿态)**:test_rust_swarm → **24 passed 0 failed**(③c-1 抛 ValueError 文案输出在案);test_swarm_cli → **22 passed 0 failed**(⑧a rc=2 + ⑧b 结构化报错输出在案)。
51
+
52
+ ### F4(v12 N113,medium,v12 首报→本轮第 2 次复核双区坐实→本轮首修)拓扑测试②centralized/mesh 段静默跳过洞:运行失败时断言无声消失、套件仍全绿
53
+
54
+ - **where**:`swarm/tests/test_swarm_topology.py`(**读核现行**::72-74 N113 注释载明「若运行失败……仅有的角色断言被 if 静默跳过、套件全绿放行」;:77 `check("centralized 运行", rr["ok"], …)` 与 :83 `check("mesh 运行", rr["ok"], …)` 两条前置无条件 check——写法对照①段 :63、③段 :90/:97 同款);if 内角色推导断言原样保留。仅改测试文件一处段(+5 行,无生产代码改动——git diff --stat 佐证)。
55
+ - **缺陷面**:centralized/mesh 两拓扑运行失败时(恰是拓扑推导回归最需守卫的场景),②段零断言执行、套件仍全绿 exit 0——回归静默入库。注入臂第一手复现(材料双臂:legacy 区替换 run_topo 返回值 / pybridge 区 stub sys.modules['swarm.rust_swarm']):②段零 check 行输出、9 passed exit 0。
56
+ - **修复**:②段两处 run_topo 之后、if 之前各加一条前置无条件 check(对照其余三段既有写法),附 N113 注释说明成因。
57
+ - **攻防前后对比**:同一注入(run_swarm 对 centralized/mesh 返回 ok=False):修复前②段零断言行、9 passed 0 failed SUITE_EXIT=0;修复后②段两条 ✘(带注入 stderr 现场)、9 passed 2 failed SUITE_EXIT=1——套件变红。基线臂 11 passed → 13 passed(健康路径 +2✓ 无回归)。
58
+ - **守卫**:双臂注入 harness 四象限实测(材料口径)+ 按套件自身入口直跑。**本会话实跑(绿态)**:`python -X utf8 swarm/tests/test_swarm_topology.py` → **13 passed, 0 failed** exit 0(②段「centralized 运行」「mesh 运行」两✓输出在案)。临时 harness 已删(材料申报 0 leftover)。
59
+
60
+ ### F5(N159 本轮新发现当场修〔high〕+ v5 N26① 同面顺修〔low〕)build_rust_exe『exe 存在即返回』短路:换源重跑静默执行旧嵌入字节码 CLI 全绿假成功;fresh build 返回无后缀不存在路径
61
+
62
+ - **where**:`swarm/rust_codegen.py`(**读核现行,修复后行号**:generate_rust_project pbc 写入前与现存文件字节比对、内容一致不覆写 :34-42〔防 cmd_run 幂等重入无谓翻新 pbc mtime 触发假重建〕;build_rust_exe :69-101——`_probe()` .exe 优先/无后缀回落/缺失返回 None :73-78、exe 存在但 program.pbc 较新(getmtime 严格大于,相等不触发)置 exe=None 强制 cargo build :82-88、构建后重探真实产物、失败抛 RuntimeError :95-100;生效条件注释 :68 载明「embed 字节码是编译期 include_bytes! 嵌 exe 的……旧 exe 照跑旧程序」)。守卫:test_rust_codegen.py ⑩节 :234-291(⑩0/⑩a/⑩a'/⑩0'/⑩b/⑩c/⑩d/⑩e 8 腿)。
63
+ - **缺陷面**(N159,high):正常运维路径即触发——同一 config 目录改 source(或 --project 复用同目录)重跑 CLI run,generate 只覆写 program.pbc/build_meta.json,build_rust_exe『exe 存在即返回』短路(缺陷时点 :67/:69 两处 os.path.exists)→ exe 不重建;embed 项目实例 spawn --serve 无 --pbc 走 load_code(None) 拿旧 EMBEDDED_PROGRAM——用户以为跑了新逻辑,报告/信任曲线/WAL 全是旧程序产物,审计元数据 build_meta.json 还被覆写加重误导。历轮报告定向 grep『换源|旧字节码』0 文件命中,确为新发现。
64
+ - **修复**:①探测逻辑抽 _probe(返回 None 而非存疑路径变量);②pbc 较新即强制 cargo build(cargo 经 dep-info 感知 include_bytes! 依赖变化自动重建嵌入字节码);③构建后重探真实产物路径、失败抛 RuntimeError(v5 N26① 无后缀路径返回值同面修复);④generate 配套同内容不覆写 pbc。
65
+ - **攻防前后对比**:修复前(材料第一手实测,临时目录+哑密钥占位):A 源(德 0.5)首跑 rc=0 T_avg=0.6 → 换 B 源(德 0.9)同 --project 重跑 rc=0 ok=true 但 T_avg=0.6(旧 A 程序产物)+ 幂等聚合 health={};--wal 新文件名强制真实执行仍 0.6;对照 B 源+全新 project → T_avg=1.0(正确);exe mtime < program.pbc mtime 坐实未重建;fresh build 还返回无后缀不存在路径(os.path.exists(返回值)=False)。修复后同一形态 → pbc 较新被强制重建(mtime_delta=62s)、exe 语义翻转为新源 trust=0.9、fresh build 返回真实 protocol_vm.exe;健康重入(exe 新于 pbc)短路保持不重建(防修复过度化)。
66
+ - **守卫**:红→绿四腿双面(材料口径):临时守卫旧码 fails=['leg1','leg2','leg3'](含腿3 trust=0.5 实锤旧程序照跑)→ 新码 fails=[];常驻守卫 test_rust_codegen ⑩节 8 腿全绿;无回归 test_rust_swarm 24/0 + test_swarm_cli 22/0(③幂等重入腿 events 5→5 零重复=同内容不覆写配套面实测)。**本会话实跑(绿态)**:`python -X utf8 swarm/tests/test_rust_codegen.py` → **22 passed 0 failed**(⑩a 返回真实 .exe、⑩b delta=62.1s、⑩c 重建后语义 trust=0.9、⑩d 重入短路、⑩e 同源不覆写 pbc——输出在案;⑦/⑨按套件自身环境声明跳过,与⑩真实构建可用并存的探测口径差异如实照录)。语义腿以直接子进程跑 exe 读 trust 值——重建是否真换了嵌入字节码以行为实测为准。
67
+
68
+ ---
69
+
70
+ ## 三、发现明细(四区 confirmed 28 / rejected 0;去重后 23 独立条目 = 新发现 13 + legacy 复测 7 + 结案/台账 3)
71
+
72
+ 以下「证据要点」为上游复核/修复会话的读码+实跑(材料原文;攻击复现均在系统临时目录/哑密钥占位环境,测毕清理为材料逐项申报);标注★者本报告会话另做了现行代码读核(行号双标以读核为准)。legacy 项标注原轮次与复测轮数;新发现编号裁决见头部「编号口径」行(逐项标注原暂编号)。
73
+
74
+ ### 新发现 13 项(N154-N166;★=本报告会话读核在位;N159 已修经本会话守卫实跑)
75
+
76
+ | #(原暂编号) | where(读核现行行号) | 严重度 | 问题摘要 | 证据要点 | 状态 |
77
+ |---|------|--------|----------|----------|------|
78
+ | N154(rustcore 区暂编 N152;**材料双清单遗漏,本报告补账**)★ | swarm/rust_runtime/src/swarm.rs:899-921(verifier 收件箱记名面;材料口径 :862-902,F2 插入行下移) | medium | protocol 拓扑下 verifier 的 ACK 与消费水位把 primary 的收件箱消息记到自己名下(has_inbox/max_seq 直接取 primary_inbox 的全局 seq),G4b「实例消费水位=最后 ACK 的收件箱消息 seq」契约被破坏;primary 死亡轮(G5 跳过,无 primary ACK)其未消费消息仍被 verifier ACK——死亡轮投递丢失可被 verifier 假成功掩盖 | 实跑复现(材料,临时目录哑密钥,2 实例 protocol 拓扑路由乙→甲 2 轮):WAL 第3行 ACK from=甲 seq=1、第4行 ACK from=乙 seq=1(同一条仅投递给甲的消息双 ACK),报告 watermarks={乙:1,甲:1}——乙从未收到任何属于自己的路由消息,水位却与甲相同;acks=2。配置即触发、单机/跨机均污染报告 watermarks/acks 审计面。本会话读核:记名面在位未修 | **开口(补账,medium)** |
79
+ | N155(rustcore 区暂编 N153)★ | hive/src/exec.rs:63-76(:73 `if cmd.status().is_err()`;契约自述 :58) | medium | kill_tree 只在 taskkill 无法启动(spawn/wait IO 错)时回落 child.kill(),**不检查 taskkill 退出码**——:58『taskkill 失败回落 child.kill()』契约对退出码失败形态未实现;命中时强杀整体静默空转,scheduler.rs:456/:462 照记 killed/timeout 假成功,孙进程孤儿存活 | 哑进程树实测(材料,1:1 复刻 exec.rs:63-76):parent 派生 DETACHED 孙进程后即退 → 复刻件输出「status()=Ok(exit_code=128) → is_err()=false → 回落【不】触发」→ 孙进程杀后仍 ALIVE;裸跑 taskkill rc=128「没有找到进程」;存活 pid 对照 rc=0。**诚实收窄**:执行器在轮询点之前退出根本不进 kill_tree(下轮 try_wait=Ok(Some) 走 classify_exit),实际触发窗=判活后毫秒竞窗+pid 复用,窄于候选描述,但契约破坏与静默空转后果属实;测试进程 tasklist 10 pid 清点归零 | **开口(medium)** |
80
+ | N156(rustcore 区暂编 N154) | swarm/rust_runtime/src/swarm.rs 四处 clamp(读核现行 :530/:1086/:1091/:1407;材料口径 :508/:1033/:1349)+ 快照写出面(材料口径 :1207) | medium | 信任防操纵 0-1 夹取对 **NaN 失效**(f64::clamp(NaN,0,1)=NaN 穿透)且经快照持久化、跨恢复永久存活——last_trust=NaN 经 format! 写出**裸 NaN 快照**(非合法 JSON),@trust 路由载荷同被污染,严格 JSON 消费方解析失败 | rustc 原语实测(材料):parse("NaN").is_nan=true;NaN.clamp(0,1).is_nan=true(对照 inf.clamp(0,1)=1 正常——唯 NaN 穿透);format! 出 "NaN"。实跑复现(材料):配置 trust=NaN 双实例+@trust 路由 → WAL 路由行 payload=NaN、快照行 trusts 含 NaN;rounds=2 续跑触发恢复重放后路由/快照仍 NaN——污染跨恢复永久(重放 clamp 存活)。触发①:协调器配置 "trust":NaN(宽松解析+取值无 clamp);触发②:输出裸 NaN trust 终态的实例——夹取正是为不可信实例而设的防线。诚实标注:T_avg=NaN 子路径为读码+原语实测未端到端复现(vm.rs:557-562 非有限浮点序列化为 null 挡住 state_json 回流) | **开口(medium;修复极简,建议下轮 rust 面优先)** |
81
+ | N157(rustcore 区暂编 N155)★ | swarm/rust_runtime/src/vm.rs:470-476(CallFrame{symbols:self.symbols.clone(), cond:self.condition_stack.clone()}) | low | CALL 每帧**全量克隆** symbols+condition_stack 且无帧深上限(唯一防线 max_steps=100_000 只限步数不约束内存),深递归×大符号表峰值内存=帧深×符号表大小,可达 GB 级——批次56 编译器 VM N149 防线(Python 侧)同族缺口在 Rust 运行时侧 | 实跑复现(材料):手工构造嵌套 CALL×10000+RETURN 的 .pbc,serve 模式 stdin 喂 1MB 符号请求,tasklist 每 0.1s 采样峰值工作集≈10048 MB(≈10 GB);同深度 1KB 符号表对照≈0 MB——内存≈帧深×符号表放大实锤;终态为结构化步数上限报错(证明步数防线不约束内存);abort 终态未单独触发(避免持续压机)。.pbc 由用户源编译,运行时 VM 是沙箱边界层 | **开口(low)** |
82
+ | N158(rustcore 区暂编 N156)★ | swarm/rust_runtime/src/swarm.rs:376-385(fn sign_event :376;七字段 '|' 裸连接)+ rust_swarm.py:153-155 同构 | low | HMAC 签名串以 '|' 裸连接七字段且无字段校验/转义(Rust/Python 同构)——id/event_type 含 '|' 时 WAL 篡改者可平移 from/to 字段边界而验签仍过,**事件归因可被篡改** | 对拍实测(材料,Python hmac+仓库真实 verify_wal_signatures):sign(7,"ACK","a\|b","c",…) 与 sign(7,"ACK","a","b\|c",…) 渲染串逐位相同(7\|ACK\|a\|b\|c\|2\|1234\|null)→ HMAC 相同;两行分别以 from="a\|b",to="c" 与 from="a",to="b\|c" 写入临时 WAL → verified=2 bad=0 all_valid=True——边界平移对验签完全不可见。payload 居末位不受影响,暴露面限 type/from/to 三字段;属 canonicalization 加固缺口非直接可利用面 | **开口(low)** |
83
+ | N159(pybridge 区暂编 N152,冲突顺延)★ | swarm/rust_codegen.py:66-75 缺陷时点(读核现行修复面 :68-101) | **high** | build_rust_exe 以『exe 存在即返回』短路(:67/:69 两处 os.path.exists),同 project 换 source 重跑时 generate_rust_project 覆写 program.pbc/build_meta.json 但 exe 不重建——embed 字节码是编译期 include_bytes!(lib.rs:30)嵌入 exe 的,实例 spawn --serve 无 --pbc 走 load_code(None) 拿旧 EMBEDDED_PROGRAM,**静默执行旧程序且 CLI 全绿假成功** | 端到端实测(材料):A 源(德 0.5)首跑 T_avg=0.6 → 换 B 源(德 0.9)同 --project 重跑 rc=0 但 T_avg=0.6(旧 A 产物)+ 幂等聚合 health={};--wal 新文件名强制真实执行仍 0.6;对照 B 源全新 project → 1.0(正确);exe mtime < pbc mtime 坐实。历轮定向 grep 0 命中确为新发现。CLI 对『重入同程序』与『换源重跑』无任何区分/告警 | **已修**(F5,本会话守卫实跑 22/0) |
84
+ | N160(pybridge 区暂编 N153)★ | swarm/tests/test_swarm_reflect_signal.py:72-73(读核现行 `all(True for _ in [1])` 在位) | low | **恒真断言**——修正信号行 level 字段从未被任何测试实际校验(文件内 sig_rounds :52-54 只取 round 键),level 回归(误写 P1/P0)套件照绿;对照 v18 对 compiler 测试基建恒真断言的发现模式,属同型 | 实跑(材料)12 passed rc=0 且输出『[✓] 修正信号 level=2(P2 观察级,维生边界) — level 固定 2』**假证据打印在案** | **开口(low;一行修:读 WAL 断言 level==2)** |
85
+ | N161(pybridge 区暂编 N154)★ | swarm/tests/test_rust_swarm.py:107-112(读核现行六字段串 :107 在位) | low | 『篡改 payload → 签名不匹配』断言按旧 **6 字段**格式构造(缺 seq、未剥行尾 `}`),与现行七字段签名串(rust_swarm.py:153-155 / swarm.rs:376-385,seq\|type\|from\|to\|round\|ts\|payload)脱钩,:106 注释『验签逻辑同 verify』已失真——篡改/未篡改两态恒真、检验力≈0 | 双态实测(材料,F5 实验产出的真实签名 WAL+真实密钥):未篡改态断言通过=True、篡改态通过=True;现行七字段+剥尾}算法验同一未篡改原行匹配=True。真实篡改检测在 test_swarm_cli.py:104-117 ④段有有效覆盖(本会话读核在位:改 payload 一字符 → verify rc=1 bad≥1)——冗余弱断言非漏检 | **开口(low;顺批)** |
86
+ | N162(recent 区未编号;**材料双清单遗漏,本报告补账**)★ | hive/src/main.rs:299-301(读核现行::299-300 hash=sha256(v.to_canonical_string())、:301 find_active_by_hash) | medium | 幂等键 content_hash 只对**原始 spec 文本**的 canonical 形态做 sha256,未含 cwd/解析后路径视图——含相对 context_files 的同一 spec 模板在不同目录向同一 jobs 池提交时语义不同(spec.rs:68-87 base_dir=workdir 优先否则提交 cwd;exec.py:444 执行侧第三处路径)却被折叠为同一哈希,第二任务不建池**静默丢失**,调用方拿到他人 job_id | 实测(材料,临时区+哑密钥占位):两项目目录各放不同内容 notes.md,同一 spec 文本以 release 二进制依次向同一池 submit → 第一次 deduplicated=false 新建、第二次 deduplicated=true 返回同 job_id 同 content_hash=804a3a78…、池中仅 1 个 job 目录;两目录校验均通过证明语义不同却被去重。共用池路径三条常态可达(exe 锚定池 main.rs:57-62 / HIVE_JOBS_DIR env :51-54 / 编排脚本显式 --jobs) | **开口(补账,medium)** |
87
+ | N163(recent 区未编号)★ | swarm/rust_swarm.py:155-156(不可解析行 continue 不占位)+ :178-185(验签无效可解析行按占位推进;:103 生效条件注释自述) | medium | seq 连续性判定对坏行**两路径不一致**:HMAC 无效但 JSON 可解析的行按占位推进 expected,不可解析行 continue 不占位——中插一行伪 JSON 即可制造指向紧随其后无辜合法行的 continuity_break 明细(真伪行自身仅计 HMAC bad 无 break),且篡改现有行 payload(占槽+HMAC 失效)反而 breaks=[] 报告最干净,**取证归因被系统性误导**;附带 :175-177 首行分支信不可信 seq 定链基准 | 实测(材料,wal_line 同源构造器造合法 seq1-4):E-B 中插伪行(seq=99 HMAC 全零)→ bad=2、breaks=[{line:4,…}] 冤枉无辜 seq=3 行;E-C 同位置插非 JSON → bad=1 breaks=[];E-D 篡改现有行 payload → bad=1 breaks=[](真篡改最干净);E-E 伪行做首行 → 以伪 seq=99 定链基准,breaks 指向无辜 seq=1 行(expected=100)。all_valid 恒 False(fail-closed 检出能力未损),受损的是明细归因可信度 | **开口(medium;坏行占位策略=归因语义设计)** |
88
+ | N164(recent 区未编号)★ | swarm/rust_swarm.py:175-177(首行为基准)+ rust_runtime/src/swarm.rs event_seq 写序(先自增后写行,首行恒 seq=1) | low | seq 连续性判据以**首行 seq 为基准**——删除首部 k 行或清空整个 WAL 均不可检(all_valid=True);Rust 侧绝对锚存在(首跑起点 0)但 Python 判定未利用 | 实测(材料):删 seq=1 首行 → all_valid=True bad=0 breaks=[];仅留 seq=4 尾行 → all_valid=True;空文件 → all_valid=True total=0 且 CLI verify rc=0 ok=true。属批次53 注释在案的已知取舍(rust_swarm.py:114-117),维持加固项定级 | **开口(low)** |
89
+ | N165(recent 区未编号)★ | hive/hive_mcp/mcp_server.py:280-308(读核现行 _submit 直接生成 job_id 建目录写 spec/status,无 content_hash 无同哈希查询) | low | 批次53 幂等键只落地 CLI submit 面(main.rs:297-316),MCP hive_spawn 主提交面 _submit 无幂等——_t_spawn(:401-450):450 直接调用,**同内容重复 spawn 不去重,两条提交面行为分叉,修复存在整面旁路** | grep content_hash/dedup/幂等 于 mcp_server.py 零命中(材料);实测(材料,纯函数面——_t_spawn 会经 :421 _ensure_serve 起 serve 故未跑):同一 spec dict 连调 _submit 两次 → 2 个不同 job_id 目录、status.json 无 content_hash;对照 CLI 同内容二次 submit deduplicated=true——同部署两面保护不对称实测坐实 | **开口(low)** |
90
+ | N166(recent 区未编号)★ | hive/src/main.rs:301-333(读核现行::301 读判据 → :323 init_job_with_anchor → :327-333 patch_status 补写 content_hash;:325-326 注释自认「补写失败仅损去重能力不损任务本体——诚实取舍」) | low | 幂等去重为**无锁 check-then-create**:读判据与写判据之间无锁、判据落盘滞后于建池,并发同内容提交互相看不见即双建(降级为旧行为重复任务,不损任务本体) | 读码确认窗口真实存在(材料+本会话读核);实测 20 并发同内容 submit ×1 轮(材料,临时池)→ 1 份 deduplicated=false + 19 份 deduplicated=true、池中 1 个 job 目录无错误——窗口在案本轮未捕获双建,如实按 low 留档 | **开口(low)** |
91
+
92
+ ### legacy 复测 7 缺陷条(多区独立复核互为佐证——N143 三区、N113/N26/N146 各两区)
93
+
94
+ | # | where | 严重度 | 问题摘要(原轮次→复测轮数) | 证据要点 | 状态 |
95
+ |---|------|--------|----------|----------|------|
96
+ | R02 矛盾态(hive 面) | hive/src/main.rs:414-429 + hive/src/scheduler.rs:342-356 + hive/wm.py:113-127(缺陷时点) | medium | 【故障注入实测_v1.0.md:192-193/:416 留档(本会话 grep 核实在位);N92 同型(v10 首报、v17 F2 已修其 serve stop 杀树面);v17/DSH 专项两轮确认→本轮第 3 次复核第一手坐实】杀 serve 后孤儿执行器补写 result.json ok=true 与已定 state=error 终态在 poll 面同屏且无任何矛盾裁决字段,wm.py 凭证闸只按 result.ok 放行——观测面报失败、记账面记成功,双消费面结论相反 | 第一手实测(材料):哑 job status=error → poll {"state":"error","result":null};补写 ok 产物 → 同屏 error+content_head=ORPHAN…+completed=true 无 conflict 键;wm cmd_snapshot ok=True commit 成功。触发无需攻击者,窗口=任务剩余执行时长 | **已修**(F1)。候选区自标 N154 系编号冲突暂编,按 legacy 不占新号 |
97
+ | N143 WAL 缺省密钥三入口 fail-open | rust_swarm.py:27/:32 + swarm_cli.py:93 + rust_runtime/src/main.rs:279(本会话读核全部在位) | medium | 【v15 N128 首报(v15.md:18/:113 核实)→v17 N143 留档→本轮第 3 次复核(legacy/recent/pybridge 三区同报)】API 缺省=公开常量「蜂群默认密钥」、CLI 缺省=空串照签、Rust 键缺失回落公开常量/空串直接采用;cmd_verify 对显式空串无拒绝——缺省部署下审计签名可伪造且 verify 全绿;跨机部署 swarm.json 明文同盘泄露密钥 | 本轮三向实测(材料):空串自签 verify('')→{total:1,verified:1,bad:0,all_valid:True}、错密钥对照 bad=1(防线本体完好,缺口仅缺省密钥面);CLI run 无 shared_secret → swarm.json 落盘空串、追加接续 seq 伪造行 → verify --secret "" rc=0 all_valid=true、--secret 别的密钥 rc=1 bad=1 | **验证面已修**(F3 空串拒绝 fail-closed);run 侧缺省密钥与三入口统一=**语义专项 deferred**(第五节),v15/v17 留档口径维持,本轮零变更 |
98
+ | v12 N109+N110+N111 合并条 | swarm.rs(材料口径 :402-419/:769-776/:801-818/:1372-1376/:1095-1097/:1387;读核现行②face :1431 附近、③face :1445) | medium | 【v12 首报→v14 复测留档→本轮第 3 次复核三面全复现】①同 project+同 WAL 重入后 watermarks/gossip/health 三审计面归零(ACK payload 自带 {round,seq} 即重建信息源却未消费),违背重入幂等聚合契约;②非对称 gossip 拓扑(部分实例为源)投递完整却判 gossip_consistent=false;③gossip_received 实为发送侧 fan-out 计数(末轮产出与死亡目标照常计数,对账恒真掩盖丢弃) | 三面第一手复现(材料):①rounds=2 gossip 场景重入后三项全部归零 {};②三实例甲乙双源、丙纯汇总:实收足额 gossip={丙:2,乙:1,甲:1} 却 gossip_consistent=False(counts 排序后首尾相等判据,非对称拓扑期望数天然不等);③单轮场景 acks=0(零消息实际到达)而 gossip 计数照常透出非空(:1387 `gossip_received: gossip_sent`) | **①面已修**(F2);②③面 **deferred**(一致性判据语义+接收侧记账协议面,第五节) |
99
+ | v12 N113 拓扑测试静默跳过洞 | swarm/tests/test_swarm_topology.py:73-80(缺陷时点) | medium | 【v12 首报→本轮第 2 次复核(legacy/pybridge 双区双臂坐实)】②centralized/mesh 段两处 `if rr["ok"]:` 包裹且段内无任何前置无条件 check(对照①:63/③:85/:92/:100 均有)——拓扑运行失败时角色推导断言无声消失、套件仍全绿 exit 0,回归静默入库 | 双臂实测(材料):绿态基线 11 passed exit 0;注入臂(run_topo 对②段两拓扑返回 ok=False)→ ②段零 check 行、9 passed exit 0——被守护能力失效而套件全绿,静默放行坐实 | **已修**(F4,本会话 13 passed 0 failed) |
100
+ | v7 N57+N59 与 v12 N112 残面合并条 | swarm.rs:455-537/:1308-1315/:1105-1121/:568-618(材料口径) | medium | 【v7 N57/N59 首报+v12 N112→本轮复核维持】①恢复链路三遍「解析+HMAC 验签」+多份常驻+无压缩,重启成本随累计事件数线性无界;②WAL 写路径裸 File、flush 为 no-op 与 :1103-1104 纪律注释语义不符(正确性靠单 fd append+轮末 sync_all 兜底);③换 shared_secret 重入同 project+同 WAL:replay 全行验签失败→零提交→旧 WAL 静默归档 .corrupt-* 后从轮 1 重跑,rc=0 且报告无任何告警——与 WAL 被篡改在观测面不可区分 | ①第一手计量(材料):50,001 行合法签名 WAL 重入 0.678s vs 2 行对照 0.007s(≈13.4µs/行);三遍 sign_event 调用点读核在位;③密钥A 首跑→密钥B 重入 → rc=0、归档 .corrupt-<毫秒戳>、新 WAL 从轮 1 重跑、报告键集无 corrupt/archive/warning 任何字段 | **开口(medium)**——修复面大(压缩/性能/告警观测面),deferred |
101
+ | v17 N146 timeout/killed 标签不查产物 | hive/src/scheduler.rs:459-463(:453-457 killed 同面) | low | 【v17 首报→本轮读核确认在位+危害收敛】超时/kill 强杀分支 kill_tree 后**无条件** final_state=timeout/killed 不查产物(无 classify_result 调用)——执行器在最后心跳间隔内已原子写完 result.json(ok=true) 但进程尚在退出尾段被杀时,落成 status=timeout + result.ok=true 矛盾终态,与 R02 同族「标签与产物背离」 | 本轮读核 :459-463 无条件定态在位(材料+本会话);pybridge 区 serve.rs:201 复核升级(材料):swarm 交界无孤儿补写(见下「证伪」条),kill_tree 进程树回收后产物已不可能后出现——实际危害=亚秒竞窗误标非伪造面,低于 v17 留档评估;亚秒窗口未做动态复现(不可确定性构造,如实标注为读码确认) | **开口(low 维持留档)** |
102
+ | v5 N26 + v1 #26/#27 三件合并 | rust_codegen.py:63-75 + rust_swarm.py:250 + rust_runtime/src/main.rs:141-167(缺陷时点) | low | 【v1 #26/#27 + v5 N26 首报→本轮复核:①随 F5 已修、②③开口】①build_rust_exe 首建返回无后缀不存在路径——主链路靠 CreateProcess 自动补 .exe 未崩,任何对返回值 exists/copy/hash 的调用方必失败;②aggregate_health_python integrity 分子无 saturating_sub,verify_fail>total_events 时 integrity_rate 负值透出而 Rust 侧恒≥0——交叉验证参照实现在异常输入下数值分歧;③parse_json_scalar :143-146 裸 find([',','}']) 不跳字符串字面量、:152 丢弃 parse_json_string 返回的正确 next 游标——--symbols 字符串值含 ',' 或 '}' 时合法 JSON 被误拒 rc=2 | ③本轮升级真 exe 实测(材料):--symbols '{"符号":"你好,世界"}' → 「参数错误: 符号表键须为字符串」rc=2;'{"符号":"x}y"}' 同错;无分隔符对照 rc=0。②探针 integrity_rate=-0.6667 负值透出(score 因外层夹取仍 0.667,分项字段失真)。①第一手坐实返回 'protocol_vm' 不存在 | **①已修**(F5 同面);②③ **deferred**(各一行级修,顺批) |
103
+
104
+ ### 复测结案/台账条 3(不占缺陷数)
105
+
106
+ | 条目 | 结论与证据 |
107
+ |---|---|
108
+ | 批次53 R05/R06 seq 连续性修复复测(台账条) | **通过**(材料本轮实跑):test_fi_r05_wal_drop_line → verdict=pass consistent=true RC=0;test_fi_r06_wal_reorder_dep → verdict=pass RC=0;hive cargo test --lib 29 passed + --bin 7 passed 与候选声称逐一吻合;E8 补验:快照行+3 事件行 WAL 删快照行 → breaks 指位正确(row_type 报后继行类型,系判据表达力边界非缺陷);E8b 空 WAL 行夹中间删 seq=2 → break.line=3 空行计数证实。两附带对抗点:skip_continuity 全仓 grep 仅定义面与 chaos 测试三文件显式传 True,生产面 swarm_cli.py 严格缺省;continuity_breaks.line 按当前文件物理行号指位 |
109
+ | rustcore 焦点⑥:hmac.rs 纯 std SHA256+HMAC 对 RFC/Python 偏离复测(结案条) | **通过、未发现偏离**(材料):cargo build --release && cargo test --release——lib 8/8 全绿(FIPS 空消息/"abc" 向量、RFC 4231 TC1/TC2、WAL 恢复守卫、health 2 件);临时哑 cargo 工程与 Python hmac/hashlib 差分对拍 k∈{0,63,64,65,200}×m∈{0,55,56,63,64,65,10000} 共 35/35 逐字节一致(覆盖空消息/padding 边界/密钥折叠/万字节消息);对拍工程与临时目录已删(材料申报)。本会话复跑 cargo test lib 10/10(8 旧 + F2 两新)含同批向量,一致 |
110
+ | rustcore 焦点③④:health 四因子除零/NaN/溢出与同轮重建幂等复测(结案条) | **通过、未发现可报缺陷**(材料):分母 total/p 均 .max(1)(health.rs:58/:62)、saturating_sub(:69)、score clamp 0-1(:72-76)、gossip_base==0→coverage 1.0;权重硬编码无外部输入面;trust 不进 health 且 vm.rs:557-562 把非有限浮点序列化为 null 挡住实例侧 NaN 回流。两遍扫描前缀重建(swarm.rs:460-539)+管道断裂后每轮完整环境重跑读码复核未见轮次计数竞态/重复投递。焦点②(N146 timeout 标签)未修维持开口(上表) |
111
+
112
+ ### 证伪/剔除(rejected)
113
+
114
+ 四区复核 rejected 数组均为空——**本轮 0 条证伪剔除**(与 v16/v17/v18 的 0 条一致,如实记录)。已修剔除:无新剔除项。**边界证伪记录 1 条**(非条目剔除,供 DSH 专项第三轮免重复排查):**R02 同型在 swarm 交界不成立**——WAL 单写者=协调器(swarm.rs 五处 event_seq+=1 与写盘全在 run_swarm 体内,本轮读核;材料读核同结论),Python 侧超时 kill 协调器(rust_swarm.py:88-90)后实例 stdin 写端关闭 → serve.rs:201 `for line in stdin.lock().lines()` EOF break 自退(:289-291 写失败同 break;test_rust_swarm_kill.py:97 注释同证)——无孤儿补写者、poll 面无矛盾态可产生。活体强杀复现(材料):Popen protocol_vm(600 轮配置)→ 快照轮 K=17(真实中途点)tasklist 计 3 进程 → p.kill() 协调器 → 1.5s 后存活进程数=0、WAL 行数 360→360 无变化(无孤儿补写)、verify_wal_signatures all_valid=true breaks=0(链完好无撕裂)。**诚实收窄记录 4 条**:N155 触发窗窄于候选描述(见上表);N166 并发双建未捕获(窗口读码在案);N156 T_avg=NaN 子路径未端到端复现;N157 abort 终态未单独触发。
115
+
116
+ ---
117
+
118
+ ## 四、验证(门禁结果)
119
+
120
+ 下表区分**来源**:「编排实跑」=任务材料提供的编排会话门禁结果(本报告会话未重跑该项时如实标注);「本会话实跑」=本报告写作会话在仓库根目录实际运行(第一手命令与输出):
121
+
122
+ | 命令 | 结果 | 来源 |
123
+ |------|------|------|
124
+ | `python -X utf8 scripts/run_tests.py --jobs 4`(python 全量回归) | `===== SUMMARY 215/215 通过,5 跳过(依赖缺失/平台不符) =====` 退出码 0(尾部含 PASS hive.test_wm_progress / swarm.tests.test_rust_swarm / hive.test_exec_tools) | 编排实跑(材料);本会话后台复跑见本节末注① |
125
+ | swarm cargo test | 通过(退出码 0) | 编排实跑(材料);本会话复跑一致(下行) |
126
+ | `cargo test --manifest-path swarm/rust_runtime/Cargo.toml` | **lib 10 passed 0 failed**(含 F2 两新守卫 wal_reentry_keeps_watermark_and_gossip_faces / replay_backfills_watermarks_and_gossip_exactly、hmac FIPS/RFC 向量、health 2 件、WAL 恢复守卫组);bin/doc 0 用例 | **本会话实跑** |
127
+ | `cargo test --manifest-path hive/Cargo.toml` | **lib 29 + bin 9(含 F1 两新守卫 one_job_view_flags_late_result_after_error / one_job_view_no_conflict_without_contradiction 及 dedup_scan_active_only / content_hash_canonical_insensitive)+ judgment_surface 6(含 kill_tree_kills_grandchildren)= 44 passed 0 failed**——与 F1 材料口径 29+9+6 一致 | **本会话实跑** |
128
+ | `python -X utf8 -m hive.test_wm_conflict` | **7/7 通过**(G1 矛盾态拒绝/G2 staging 前无残留/G3 无 task 分支/Z1 done+ok 放行/Z2 无 status.json 放行/Z3 坏 status fail-closed/C1 CLI rc!=0)——与 F1 修后口径一致 | **本会话实跑** |
129
+ | `python -X utf8 swarm/tests/test_swarm_topology.py` | **13 passed, 0 failed** exit 0(②段「centralized 运行」「mesh 运行」两前置 check ✓——F4 守卫生效且无回归) | **本会话实跑** |
130
+ | `python -X utf8 swarm/tests/test_rust_swarm.py` | **24 passed, 0 failed**(③c-1/③c-2 空串/None 密钥拒绝 ValueError 文案在案——F3 守卫;篡改检测、验签容错、run_swarm 错误契约全绿) | **本会话实跑** |
131
+ | `python -X utf8 swarm/tests/test_swarm_cli.py` | **22 passed, 0 failed**(⑧a/⑧b N143 rc=2 守卫;③幂等重入 events 5→5 零重复=F5 配套面;④篡改检测) | **本会话实跑** |
132
+ | `python -X utf8 swarm/tests/test_rust_codegen.py` | **22 passed, 0 failed**(⑩节 8 腿全✓:⑩a 返回真实 .exe、⑩b delta=62.1s 重建、⑩c 重建语义 trust=0.9、⑩d 重入短路、⑩e 同源不覆写——F5 守卫,真实 cargo 构建;⑦/⑨按套件自身环境声明跳过——其探测与⑩实际构建可用并存的口径差异如实照录) | **本会话实跑** |
133
+ | npm test | 通过(退出码 0) | 编排实跑(材料);本会话未复跑(TS 面零改动——git diff --stat 证实无 src/ 触点) |
134
+ | npm run gate | 通过(编排实跑,材料口径,报告落盘前) | 编排实跑;本会话落盘后复跑分轮记录见末注②③④ |
135
+ | `git diff --stat` + `git status --porcelain` | 改动面=12 文件 +588/-41 + untracked hive/test_wm_conflict.py:main.rs +101/wm.py +27(F1)、swarm.rs +272(F2)、rust_swarm.py +12/swarm_cli.py +6/test_rust_swarm.py +39/test_swarm_cli.py +17/registry.py +4/test_fi_r08 +40(F3)、test_swarm_topology.py +5(F4)、rust_codegen.py +44/test_rust_codegen.py +62(F5)——与五项修复一一对应、**exec.rs 零改动与 N155 留档不修一致**、无越域改动 | **本会话实跑** |
136
+ | 落点读核(Read/grep) | 五项修复落点、两处补账病灶(swarm.rs verifier 记名面/main.rs:299-300)、17 项留档病灶代表性在位性(exec.rs:73、vm.rs:470-476、swarm.rs clamp 四处/sign_event :376/:1431/:1445、mcp_server.py:280-308、test_swarm_reflect_signal.py:72-73、test_rust_swarm.py:107-112、rust_swarm.py:27/:32/:126-128、swarm_cli.py:93/:131-134、main.rs:279、test_swarm_topology.py:72-84、rust_codegen.py:34-101、hive/test_wm_conflict.py)逐一看码在位——与材料「在位/开口」结论一致 | **本会话实跑** |
137
+
138
+ **末注(本会话后台/落盘后复跑,分轮如实记录)**:①python 全量后台复跑(`python -X utf8 scripts/run_tests.py --jobs 4`,后台完成)——`===== SUMMARY 215/215 通过,5 跳过(依赖缺失/平台不符) =====`,真实退出码 0,与编排实跑(材料口径)逐字一致;②npm run gate 落盘后首复跑——R1 凭据/密钥面(文件面=0 内容面=0)/R2 私有数据面/R3 隐私文本全 **PASS**(内容隐私零命中),unreachable 扫描 427 文件命中 0、发布清单/cogmap/链接检查/工作区索引/纪律渲染各环节过;**R4 非追踪件面 FAIL 命中=1(非追踪=25,允许=24),唯一命中件=本报告文件自身**——规则实现=`scripts/check_publish_artifact.py:431-435`(npm 包内 git 非追踪件仅允许 lib/;本报告 untracked 且在 npm 包内即超限),属产出文件待登记的结构状态、非内容违规(`git status --porcelain` 核实 untracked 共 2 件:本报告 + hive/test_wm_conflict.py,后者不在 npm 包内故未命中);③修正:本报告文件 `git add` 登记(仅暂存非提交,v18 同象先例);hive/test_wm_conflict.py 与 12 个修复改动文件保持工作树原状,归编排会话随批次处置;④登记后复跑:VERDICT=PASS(R1/R2/R3/R4 全 PASS,R4 命中=0)。
139
+
140
+ **上游会话已运行、本会话未重跑的验证**(材料口径,如实区分):五项修复的全部红证(修前各一跑,红绿数字见第二节——红证需旧码回退,多轮未提交改动的工作树上反复回退风险大于收益);四区复核全部攻击复现(protocol 拓扑双 ACK/哑进程树 taskkill rc=128/NaN 跨恢复/CALL×10000 内存采样/HMAC 边界平移对拍/换源旧字节码端到端/两目录同哈希去重/伪行冤枉无辜行/20 并发 submit/_submit 双建/50,001 行 WAL 计时/换密钥静默归档/活体强杀 EOF 自退等形态,均哑数据临时环境,材料逐项申报清理);FI-R04/R05/R06/resume/fault/protocol 无回归 sweep;35 组 HMAC 差分对拍。
141
+
142
+ ---
143
+
144
+ ## 五、遗留清单(19 个开口:medium 9 / low 10;rejected 0;含本报告补账 2 项)
145
+
146
+ | # | where | 严重度 | 问题 | 处置建议 |
147
+ |---|------|--------|------|----------|
148
+ | **N154**★(补账) | swarm.rs:899-921 | medium | protocol 拓扑 verifier ACK/水位把 primary 收件箱消息记到自己名下,G4b 契约破坏;primary 死亡轮投递丢失可被假成功掩盖 | verifier 记名面最小修=ACK/水位只记 verifier 自身收件箱(primary 载荷仅进复算输入);红守卫现成(protocol 双 ACK 复现形态)。**下轮 rust 面优先候选** |
149
+ | N155 | hive/src/exec.rs:73 | medium | kill_tree 不检查 taskkill 退出码,退出码失败形态静默空转、假成功、孤儿存活 | 一行级修(退出码非零也回落 child.kill());红守卫可覆盖死 pid 分支(rc=128 形态现成);竞窗/pid 复用不可确定性构造=诚实边界随守卫注明 |
150
+ | **N156** | swarm.rs clamp 面(现行 :530/:1086/:1091/:1407)+ 快照写出 | medium | 信任 0-1 夹取对 NaN 失效且经快照跨恢复永久存活,裸 NaN 非法 JSON 污染 WAL/快照/@trust 载荷 | **修复极简**(clamp 前 NaN 归零或配置面拒绝 NaN 字面量——含 Python json.dump allow_nan 面),红守卫可 cargo test;**建议下轮 rust 面优先速收** |
151
+ | **N162**★(补账) | hive/src/main.rs:299-301 | medium | 幂等键 content_hash 未含 cwd/解析后路径视图,相对 context_files 跨目录提交被折叠去重、任务静默丢失 | 修法=哈希混入 workdir/cwd 解析视图;**注意语义迁移**:改哈希口径使存量活跃任务判据换底,需与 find_active_by_hash 迁移策略一并设计——非纯一行,小专项 |
152
+ | N163 | rust_swarm.py:155-185 | medium | seq 连续性对坏行占位/不占位两路径不一致——伪行可制造指向无辜行的明细、真篡改反而最干净,取证归因误导 | 坏行占位策略语义设计(占槽行自身标注 + 明细不指向无辜行);all_valid 检出能力未损,属审计明细可信度专项 |
153
+ | v12 N109-111② | swarm.rs counts 判据(现行 :1431 附近) | medium | 非对称 gossip 拓扑投递完整却判 gossip_consistent=false(假 inconsistent) | 一致性判据须先拍板定义(按源期望数 / min-coverage / 角色加权三案选一)——**语义决策 deferred**,与③同一协议评审拍板 |
154
+ | v12 N109-111③ | swarm.rs:1445 `gossip_received: gossip_sent` | medium | gossip_received 实为发送侧 fan-out 计数,对账恒真掩盖丢弃 | 需接收侧记账(协议面/报告键变更);与②及 F2 诚实边界的 health 逐轮 outcomes 持久化同场拍板 |
155
+ | v7 N57+N59+v12 N112 残面合并条 | swarm.rs 恢复链路 | medium | 三遍验签线性无界成本 / 裸 File flush no-op / 换密钥重入静默归档重跑无告警 | 面大(压缩/性能/告警观测面)deferred;③最小起步=报告增 corrupt/archive/warning 字段使观测面可区分 |
156
+ | N143 全量语义专项(须拍板) | rust_swarm.py:27/:32 + swarm_cli.py:93 + main.rs:279 | medium | 缺省密钥从何而来 + 三入口口径不一致(CLI 空串/API 公开常量/Rust 键缺失回落且空串直接采用);跨机部署密钥明文同盘 | **三选一拍板**:fail-closed 拒启动 / 首启随机密钥生成落盘+权限收紧 / 显式必填;建议一轮专项统一三入口并定 swarm.json 密钥面边界。**验证面已 fail-closed(F3),run 侧拍板前维持现状=WAL 仍可能以空串/公开常量签名——诚实提示**;seq 连续性判据独立于密钥保密性仍可检出跳号/乱序 |
157
+ | N157 | vm.rs:470-476 | low | CALL 每帧全量克隆且无帧深上限,深递归×大符号表 GB 级内存 | 帧深上限取值(如 call_stack cap)拍板 + 克隆策略(COW/引用计数)评估;与批次56 Python VM N149 防线对齐 |
158
+ | N158 | swarm.rs:376-385 | low | HMAC 签名串 '|' 裸连接无转义,字段边界可平移且验签仍过 | canonicalization 加固(长度前缀/转义方案)——涉 WAL 格式兼容性决策;暴露面限 type/from/to |
159
+ | N160 | test_swarm_reflect_signal.py:72-73 | low | 恒真断言,level 字段零校验 | 一行修(读 WAL 修正信号行断言 level==2),顺批 |
160
+ | N161 | test_rust_swarm.py:107-112 | low | 篡改断言按旧 6 字段构造与七字段脱钩,两态恒真 | 一行修(对齐七字段+剥行尾},或直接删除断言改引 test_swarm_cli ④段),顺批 |
161
+ | N164 | rust_swarm.py:175-177 | low | seq 判据首行基准,删首部/清空不可检(绝对锚 seq==1 在 Rust 侧存在未用) | 加固项:绝对锚校验(新 WAL 首行须 seq=1)+空 WAL 明示;批次53 已知取舍升级 |
162
+ | N165 | mcp_server.py:280-308 | low | MCP hive_spawn 提交面无幂等键,与 CLI 面行为分叉(整面旁路) | _submit 接同哈希查询+content_hash 落盘,与 CLI 面共用判据;顺批 |
163
+ | N166 | hive/src/main.rs:301-333 | low | 幂等去重无锁 check-then-create,并发窗口双建 | 原子建池(先占位后写判据)或文件锁;注释已自认诚实取舍,low 维持 |
164
+ | v17 N146 | scheduler.rs:459-463 | low | timeout/killed 强杀分支不查产物无条件定态(亚秒竞窗误标) | 终态前 classify_result、有产物按产物定态;与 R02 已修面同域可搭车;kill 后产物已不可后出现,危害=误标非伪造 |
165
+ | v5 N26② | rust_swarm.py:250 | low | integrity 分子无 saturating_sub,异常输入负值透出(Rust 侧恒≥0) | 一行夹取对齐 health.rs:69,顺批 |
166
+ | v5 N26③ | main.rs:141-167 | low | parse_json_scalar 丢弃正确 next 游标,--symbols 值含 ,/} 被误拒 rc=2 | 一行修(采用 parse_json_string 返回的 next),顺批 |
167
+
168
+ ### 语义决策项与批次分诊(汇总)
169
+
170
+ 1. **下轮 rust 面速收批次(低风险、守卫现成)**:N156 NaN 归零夹取 → N154 verifier 记名面 → N155 kill_tree 退出码回落 → N157 帧深上限。四项均 medium/low、红守卫形态在材料中现成。
171
+ 2. **顺批一行族(单轮可清)**:N160/N161 测试记账、v5 N26②③、N165 MCP 幂等对齐、N166 原子建池、N164 绝对锚。
172
+ 3. **须先拍板后代码**:N143 缺省密钥来源与三入口统一(三选一,见上表);v12 N109-111②③ gossip 一致性判据+接收侧记账+health 逐轮 outcomes 持久化(同一协议评审);N163 坏行占位归因语义;N162 哈希口径迁移;N157 帧深上限取值;N158 canonicalization 编码方案(WAL 兼容性)。
173
+ 4. **交叠提示**:N154 与 F2 同在 WalReplay/ACK 面(修 F2 时行号已漂移,修 N154 时以读核现行 :899-921 为准);N156 与 N158 同在信任/WAL 完整性面;v5 N26③ 与 N158 同涉 main.rs/swarm.rs 参数与签名面。
174
+
175
+ ---
176
+
177
+ ## 六、纪律合规声明
178
+
179
+ 1. **定位先读索引**:本报告写作前已读 WORKSPACE_INDEX.md(按职责定位 swarm/ =「蜂群运行时——.pbc 确定性实例 + Gossip 拓扑/水位信箱/WAL-HMAC/信任聚合」、hive/ =「蜂巢并发引擎」),未做全盘浏览;材料指定的留档源头(故障注入实测_v1.0.md:192-193/:416、v17.md N143 口径、v15.md N128、v18.md 编号链)均 grep/读核核实。
180
+ 2. **结论引证**:所有修复与缺陷均引 path:line;材料行号为上游时点快照,本会话对五项修复落点与全部补账/留档开口逐一看码,F2 引起的 swarm.rs 行号下移(~+272)处双标(第三节/第四节逐项标注,以读核现行为准);第三节证据要点摘自任务输入的四区复核材料(上游会话读码+实跑),本会话读核一致的逐项标注★。
181
+ 3. **编号续编与冲突裁决声明**:v18 实际用至 N153(v18.md:4-5/:78-79 核实),任务书「v18 用至 N151」与在库报告不符——按「编号全局唯一」不变量本轮自 **N154 续编**;材料四区候选暂编号冲突 8 处由本报告会话统一裁决(rustcore 五项 +2 顺延 N154-N158、pybridge 三项冲突顺延 N159-N161、recent 四项未编号顺延 N162-N166),legacy R02 条候选自标不占新号——全部重编逐项标注原暂编号,非暗改。
182
+ 4. **材料账目遗漏如实补账**:N154(protocol verifier 记名)与 N162(content_hash 未含 cwd)两项四区 confirmed 却不在材料修复清单与留档清单——本报告未将其升格为已修、未伪造其缺失,而是第一手读核两病灶现行在位(swarm.rs:899-921、main.rs:299-300)后补账入第五节并显式标注「材料双清单遗漏,本报告补账」。
183
+ 5. **实验纪律**:材料全部攻击复现均在系统临时目录/哑密钥占位环境且逐项申报测毕清理(含 tasklist 10 pid 清点归零、mkdtemp 目录删除、0 leftover 申报);本报告会话仅运行常驻守卫/门禁/读码——未修改任何源文件、未做任何攻击性复现、未触任何真实令牌库/真实 serve/真实数据目录。
184
+ 6. **已修项勿重复报**:第 5 轮(swarm 深挖 7 修)、第 12 轮(WAL 原子化/验签 UTF-8/CLI 条件卡透传/异常面/embed 倒序修正)、批次53(R05/R06 seq 连续性、幂等键 CLI 面)已修清单未再报;本轮 5 修中 R02/v12 N109①/v12 N113/v5 N26① 为历轮留档面首修、N159 为新发现首修、N143 为留档缺陷的验证面首修(run 侧语义维持留档不重复立项);v17 N146 按留档口径维持不重复修复,仅复测在位性。
185
+ 7. **如实记录**:四区 rejected 均空(0 条证伪)如实声明;R02 同型在 swarm 交界不成立的边界证伪单列(供 DSH 专项第三轮免重复排查);四条诚实收窄(N155 触发窗/N166 双建未捕获/N156 T_avg 子路径/N157 abort 未触发)照录;门禁来源区分「编排实跑(材料)」与「本会话实跑」,守卫红证为材料口径未重跑(回退风险大于收益,绿态本会话逐一实跑一致);gate 首复跑 R4 结构命中与登记修正全程分轮留痕(第四节末注)——无一升格、无一虚闭。
186
+ 8. **隐私脱敏**:全文只写仓库相对路径;材料的本机绝对路径与本会话守卫输出中的系统临时目录路径形态一律以「系统临时目录/临时区/哑密钥占位」转录,不写入任何盘符/用户目录形态;哑密钥一律占位符(如「哑密钥-…」「API 键=dummy 占位」),无任何真实凭据字面量——本稿内容隐私面经 gate R1(文件面=0 内容面=0)/R2/R3 两轮实测 PASS(第四节末注②④)。
187
+ 9. **双清单自查**(写完自查):①**编号清单**——本轮新编号 N154-N166 共 13 项连续、无重号、无跳号,与 v18 终点 N153 衔接,与 v17 终点 N147(v17.md:5 核实)链条一致;候选冲突映射全部在第三节逐项留痕;②**修复/遗留互斥完备清单**——四区 confirmed 28 条目逐条归位:13 新发现(1 已修 N159 + 12 开口)+ 7 legacy 复测缺陷条(4 条含已修面、其余开口)+ 3 结案/台账条 + 5 条跨区重复合并 + 0 条证伪剔除 = 28;修复清单 5 补丁闭 6 面,遗留清单 19 开口(材料 17 + 补账 2),两清单无交集、无遗漏条目。
188
+
189
+ ---
190
+
191
+ ## 七、跳过项及原因
192
+
193
+ - **npm test 未复跑**:TS 面零改动(本会话 `git diff --stat` 证实无 src/ 触点,改动面仅 hive/swarm 交界域 12 文件+1 新守卫)——编排实跑通过(材料),如实标注来源。
194
+ - **五项修复的红证未重跑**:红证需旧码回退(回退多文件未提交工作树风险大于收益)——红绿数字为材料口径(第二节各守卫行),本会话以绿态逐一实跑一致 + 落点读核替代佐证。
195
+ - **四区复核的攻击复现未在本会话重跑**:全部动态复现(protocol 双 ACK/NaN 跨恢复/CALL 内存采样/HMAC 边界平移/换源旧字节码/两目录同哈希/伪行冤枉/并发 submit/50,001 行计时/换密钥归档/活体强杀等)为上游会话在临时环境执行且逐项申报清理;本会话以落点读核 + 五守卫实跑 + 双 cargo 全量替代,未重跑任何攻击场景。
196
+ - **MCP _t_spawn 端到端未实测**(N165 证据面):会经 _ensure_serve 拉起真实 serve,违反哑环境边界——材料以 _submit 纯函数面双建实测替代,本会话读核 _submit :280-308 无幂等在位佐证。
197
+ - **v17 N146 亚秒竞窗未动态复现**:不可确定性构造——读码确认无条件定态在位,如实标注为读码确认(历轮口径维持)。
198
+ - **N156 的 T_avg=NaN 子路径未端到端复现**:vm.rs:557-562 把非有限浮点序列化为 null 挡住 state_json 回流——以 rustc 原语实测(NaN.clamp 穿透/format! 出裸 NaN)+ 读码替代,如实区分「复现」与「读码+原语实测」。
199
+ - **N157 的 abort 终态未单独触发**:避免持续压机(10 GB 级工作集)——放大已实测(帧深×符号表),结构化步数上限报错终态在案。
200
+ - **N166 的并发双建未捕获**:20 并发一轮未命中毫秒级窗口——窗口读码在案(:301 读判据 → :327 写判据之间无锁),按 low 如实留档。
201
+ - **codegen ⑦/⑨ 两腿按套件自身环境声明跳过**:其 cargo 探测在本机环境未过(与⑩节实际构建可用并存的探测口径差异,照录不裁);⑩节真实 cargo 构建全绿。
202
+ - **python 全量后台复跑与撰写并行**:本会话另起 `scripts/run_tests.py --jobs 4` 后台复跑,报告撰写期间完成——`===== SUMMARY 215/215 通过,5 跳过 =====` 退出码 0,与编排实跑(材料口径)一致(第四节末注①已回填)。
203
+ - **gate 首复跑 R4 结构命中的修正**:命中件=本报告文件自身(untracked 非 Tracking 面规则 `check_publish_artifact.py:431-435`——npm 包内非追踪件仅允许 lib/),内容隐私 R1/R2/R3 同轮零命中——修正=本报告 `git add` 登记(仅暂存非提交),登记后复跑 VERDICT=PASS(第四节末注④);hive/test_wm_conflict.py 不在 npm 包内未命中,随修复批次归编排会话处置。
204
+ - **git 未提交**:commit 需任务方指令;本报告文件已登记(暂存区),12 个修复改动文件与 hive/test_wm_conflict.py 保持工作树原状,登记/提交归编排会话裁决。
205
+ - **19 项留档未修**:分诊与处置建议见第五节(rust 速收 4 项 + 顺批一行族 6 项 + 拍板后代码 6 族);本报告会话为报告撰写会话,不做修复。
206
+
207
+ ---
@@ -0,0 +1,156 @@
1
+ # 缺陷挖掘报告 · 自主迭代 v2
2
+
3
+ - **日期**:2026-09-25
4
+ - **范围**(生效条件):第 1 轮遗留收口(hive 域 4 项,v1 报告第四节全部遗留 hive 项)+ 第 2 轮新挖掘(hive CLI/Rust 侧/执行器/编排/MCP 面、swarm 封装、md_cg 互验互操作面)
5
+ - **总量**:第 1 轮遗留修复 4/4 落盘;新挖掘候选 20 → 确认 18 → 修复 4(口径说明见第一节)→ 遗留 14
6
+ - **严重度分布**(确认 18 项):high 2 / medium 13 / low 3
7
+ - **回归**:7 套全绿(本会话实跑,见第六节)
8
+ - **行号口径**:下文缺陷行号为挖掘时快照行号;修复落盘后行号有漂移,凡本报告写作者本会话复核过的位置均另注现行行号。
9
+ - **结构口径**(CCG 六要素):本报告按仓库惯例组织——功能名(标题)/ 生效条件(范围与口径行)/ 子功能(第二~五节:遗留收口、发现、修复、遗留)/ 执行与验证方式(第六节:实跑命令与结果)/ 不适用条件(第七节:跳过与未运行项)。
10
+
11
+ ---
12
+
13
+ ## 一、执行摘要
14
+
15
+ 本轮自主迭代做两件事:先收口 v1 报告全部 4 项 hive 域遗留缺陷(越权读、穿越删库、文档矛盾、死分支),再做第 2 轮全量挖掘,产出 20 个候选、确认 18 个。确认项按问题族分布:
16
+
17
+ 1. **路径穿越/输入校验族**(6 项):rust CLI `kill/poll` 与 MCP 面 `hive_kill/hive_poll` 的 job_id 裸拼路径(N1、N15,均已修)、verify_runner 的 iter_id 裸拼读写路径(N5,与 N11 同路径双列)、wm 快照 job_id 校验只防穿越不防文件系统敌对字符(N14);
18
+ 2. **错误契约违反族**(4 项):run_swarm 超时异常穿透(N3,已修)、WAL 验签器对畸形行零容错(N4)、编排工具裸 `int()` 使脏参数打死整个 job(N13)、MCP server 一行非 dict JSON 即崩(N16);
19
+ 3. **假成功/语义口径族**(3 项):LLM 单发路径空回包写 ok=True(N7)、套件空跑全绿放行(N9)、make_verdict 断言面误标(N12);
20
+ 4. **生命周期/配置分裂族**(3 项):`--stop/--status` 丢弃 config 池(N2,已修)、config 的 jobs 目录 serve/MCP 两面分裂(N17)、wm 快照失败后 HEAD 永久残留任务分支绕过合并审查(N10);
21
+ 5. **数据一致性族**(2 项):exec.py result.json 非原子写(N6)、read_roots 单串按字符切分(N8);另 MCP 工具 schema 与代码脱节 1 项(N18)。
22
+
23
+ **修复口径说明**:任务输入报「新修复 3」。本会话以 `git diff`(工作树未提交改动)逐文件核对:确认清单内被完整修复的为 **4 项**(N1、N2、N3、N15)。多出的第 4 项 N15(MCP 面 job_id 结构闸 `_valid_job_id`,注释明示与 rust 侧 `valid_job_id` 同口径成对落盘)同样有完整 diff 与冒烟证据,本报告如实计入修复、不截断到输入口径的 3。
24
+
25
+ **重复记录说明**:N5 与 N11 指向**同一代码路径**(verify_runner `main` 的 iter_id::90 取值、:103 读路径、:161-162 写路径),系同一缺陷的两条记录(严重度一 high 一 medium,N11 补充了姊妹入口防御不一致证据)。18 项清单去重后独立缺陷 17 个;本报告按输入原样双列并在此声明,不擅自合并编号。
26
+
27
+ 另:候选 20 与确认 18 之间的 2 项差值为复核阶段未获确认的候选,明细未随任务输入提供,本报告不虚构展开。
28
+
29
+ ---
30
+
31
+ ## 二、第 1 轮遗留修复(4 项全部落盘)
32
+
33
+ 即 v1 报告第四节 hive 组全部 4 项(#10/#11/#12/#13)。证据均为本会话 `git diff` 工作树核对 + 对应套件实跑(见第六节):
34
+
35
+ | # | v1 编号 | 位置 | 修复内容 | 证据 |
36
+ |---|---------|------|----------|------|
37
+ | L1 | #10(medium) | hive/orch.py `_poll` | 越权读+穿越封死:任一传入 id 不属于 `_known_children()` 即整体 `{'ok':False,'error':'越权读被拒'}`——与 `_read_full`(现行 orch.py:464-471)同款 fail-closed,混入穿越 id 不部分放行;`../` 形态天然不在已知子任务清单,一并封死。同步更新 `_poll_schema` 对外契约描述与 `_poll` 上方生效条件注释 | 本会话验证(现行 orch.py:444-460::451-455 归属闸在位;test_orch 85/0) |
38
+ | L2 | #11(medium) | hive/wm.py `cmd_snapshot` | 穿越删库封死:job_id 取自 result.json 后、join+rmtree 前新增路径段校验——为 `.`/`..` 或含 `/`/`\` 即 fail-closed 拒绝(不净化:产物文件内容不可信)。同步更新生效条件注释 | 本会话验证(现行 wm.py:133-136;test_wm_progress 44/0) |
39
+ | L3 | #12(low) | hive/exec_cmd.py:15-17 | 文档与实现矛盾:实现是刻意设计(批次 23 D-5/v19 两守卫解耦防同值撞车,不继承 spec.timeout_s),故修文档不修代码——docstring 改为「缺省 600;**不继承 spec.timeout_s**」。实现三段回落表达式未动 | 本会话验证(exec_cmd.py:16-17 现行文案;test_exec_cmd ALL_PASS) |
40
+ | L4 | #13(low) | hive/orch.py `_spawn` | 死分支删除:移除不可达的 `if not tools: tools = list(SUB_TOOLS_ALLOW)`(:402 的 `a.get('tools') or list(SUB_TOOLS_ALLOW)` 已结构性保证非空且经白名单校验);同步删除生效条件注释中「若 tools 为空也回落」短语。tools 回落表达式保留,行为等价 | 本会话验证(现行 orch.py:395-411 无该分支;test_orch 85/0 含 B8/B13) |
41
+
42
+ ---
43
+
44
+ ## 三、第 2 轮新发现(确认 18 项)
45
+
46
+ 状态取值:**已修复** / **未修复(遗留)**。证据标注:18 项全部经本报告写作者本会话读码核实(N10 另有确定性复现脚本),4 项已修复者兼有 `git diff` 修复证据——即本表无「仅输入复核」项。
47
+
48
+ ### high(2 项)
49
+
50
+ | # | 位置 | 缺陷摘要 | 状态 | 证据 |
51
+ |---|------|----------|------|------|
52
+ | N5 | hive/verify_runner.py:90 | iter_id 未验证即拼接读/写路径::90 取 `argv[1]`,:103 裸拼读 frozen.json、:161-162 裸拼写 verdict.json 且 `os.makedirs` 建目录链——`../x` 形态可越界读仓内任意 frozen.json、在仓库外任意目录创建+写 verdict.json | 未修复(遗留) | 本会话验证(现行 verify_runner.py:90、:103、:161-162 均无校验;姊妹入口 write_verdict_to_repo 对同一字段有 `re.fullmatch(r"[A-Za-z0-9_.-]{1,80}")` 显式校验,interop.py:315-317——防御不一致属实) |
53
+ | N10 | hive/wm.py:166-173 | cmd_snapshot 无 try/finally 还原 HEAD:`checkout -B`(:166)之后的任一 git 步骤失败即把 HEAD 永久留在 task/<job_id> 分支(`checkout main` 在 :173,位于失败点之后)。确定性触发:重复快照已合并任务 → commit "nothing to commit" 退出码 1 → `_git_ok` 抛 WmError(wm.py:73-77 非 0 即抛)。残留态下后续任务分支以残留分支为祖先,合并新任务会把前一任务未经审查的产物静默带进 main,绕过三级闸合并审查 | 未修复(遗留) | 本会话验证 + **确定性复现**(临时目录脚本:init → snap1 ok → merge task 分支入 main → snap2 抛 `WmError: git commit -m 失败: On branch task/h1758000000000_ab12 nothing to commit` → 终态 HEAD=`task/h1758000000000_ab12` ≠ main,缺陷机制逐一吻合) |
54
+
55
+ ### medium(13 项)
56
+
57
+ | # | 位置 | 缺陷摘要 | 状态 | 证据 |
58
+ |---|------|----------|------|------|
59
+ | N1 | hive/src/main.rs:367 | cmd_kill/cmd_poll 的 job_id 完全未校验,`job::job_dir` 直接 join——路径穿越写(池外创建 kill 文件)与读(任意目录 status/result 全文) | **已修复**(F1) | 本会话验证(git diff + cargo test,见第四节 F1) |
60
+ | N2 | hive/serve_start.py:413 | `--stop/--status` 不经 `_jobs_from` 解析 jobs,config 的 HIVE_JOBS_DIR 被静默丢弃——D-1 修复只覆盖 start/restart/rebuild,两条 CLI 生命周期路径仍 fail-silent(config-only 设该键时 serve 跑在池 B、`--stop` 永远盯着池 A 报「未在运行」) | **已修复**(F2) | 本会话验证(git diff + test_serve_entry ⑨a-d 全过) |
61
+ | N3 | swarm/rust_swarm.py:78 | run_swarm 的 subprocess.run 带 timeout= 但未捕获 TimeoutExpired,违反自身「失败返回 {ok:False,stage} dict」的错误契约,异常直接穿透调用方(swarm_cli 整条 CLI traceback) | **已修复**(F3) | 本会话验证(git diff + test_rust_swarm ⑤:超时与 exe 缺失两条均返回结构化 dict) |
62
+ | N6 | hive/exec.py:103 | result.json 非原子写:`write_result` 直接 `open('w')` 覆盖(:103-105),并发读者读到截断 JSON 时 rust 侧直接判 error 终态;exec_cmd.py 同契约已用 tmp+fsync+os.replace(exec_cmd.py:39-48),exec.py 漏修 | 未修复(遗留) | 本会话验证(exec.py:103-105 裸 open;对照 exec_cmd.py:39-48 原子写在位) |
63
+ | N7 | hive/exec.py:1516 | call_llm 单发路径(无 tools)缺 `_empty_turn` 防护:call_llm 对空 choices 回 `content=""`(:1174-1179,`(data.get("choices") or [{}])[0]`),:1516-1517 拿到后 :1518-1527 无条件 `ok=True` 落盘——假成功。`_empty_turn` 存在(:1200)但仅工具路径使用(:1348) | 未修复(遗留) | 本会话验证(exec.py:1174-1179、:1200、:1348、:1516-1527 逐点读码) |
64
+ | N8 | hive/exec.py:931 | `_worker_scope` 对 spec.read_roots 单串形态按**字符**切分成垃圾根(:931 `list(spec.get("read_roots") or [])`——单串进 list() 得到逐字符列表),docstring(:928)声称的「列表/单串」单串支持完全失效,worker 读定制目录被 fail-closed 拒绝 | 未修复(遗留) | 本会话验证(exec.py:928-936:docstring 与实现矛盾在位) |
65
+ | N9 | hive/verify_runner.py:134 | suite_ok 不要求 passed>0:`suite_ok = rc_cargo==0 and rc_py==0 and failed==0`(:134)——套件命令 rc=0 且输出无计数命中时(脚本静默成功、输出格式漂移、空探针)判 suite_ok=True,验证器空跑全绿放行 | 未修复(遗留) | 本会话验证(verify_runner.py:134 无 passed 门;`--smoke` 探针 :126-127 靠打印计数才被 `_parse_counts` 认到——格式漂移即 passed=0/failed=0/rc=0 → suite_ok=True) |
66
+ | N11 | hive/verify_runner.py:103,161-164 | iter_id 取自 argv[1] 完全未校验,经 os.path.join 直接拼进读/写路径——与 N5 同一代码路径(双列记录,见第一节重复记录说明)。姊妹写入口 write_verdict_to_repo 对同一字段做了显式正则校验并注明理由,本处防御不一致 | 未修复(遗留) | 本会话验证(同 N5;interop.py:315-317 对照在位) |
67
+ | N12 | md_cg/interop.py:236-245 | make_verdict 的 `assertions_ok = (int(failed)==0)`(:236)由套件失败计数推导,缺少断言面输入:断言全过但套件失败时误标为 (assertions_ok=False, failure_reason='assertions_failed')(:243-245 阶梯),与其 docstring 声称的「J1/J3 语义与 verify_runner._compose_semantics 同口径」(:227-230)直接矛盾——参照实现 `_compose_semantics`(verify_runner.py:68-76)对该象限给出 (assertions_ok=True, 'suite_failed')。verify_runner 落盘前覆写三字段(:155-157)侥幸纠正,但 docstring 明示支持的直连路径(make_verdict → write_verdict_to_repo)会拿到错标字段,误导合并裁决者 | 未修复(遗留) | 本会话验证(interop.py:227-245 与 verify_runner.py:68-76、:148、:155-157 两口径逐行比对:verify_runner 传给 make_verdict 的 failed 已含套件败 +1(:148),直连路径无此纠正) |
68
+ | N13 | hive/orch.py:422,424-425,472 | 编排工具对模型可控参数做裸 `int()`(timeout_s :422、context_budget_tokens :424-425、read_full 的 max_chars :472),非数字字符串('600s'、'20k' 等 function calling 常见脏参数)抛 ValueError 逃出工具处理器:exec.py 对 _EXTRA_TOOLS 分派无 try 包裹(:1118-1119,:1106-1109 的 try 只包 json.loads),异常穿透 run_with_tools 直达 main 兜底 except → 整个编排 job 以 EXIT_API 判死、已派发子任务全部成为孤儿,模型失去当场改参重试机会。exec.py:940-946 现成的 `_int_arg`(「工具面不因参数脏而崩」)未被使用 | 未修复(遗留) | 本会话验证(orch.py:422/:424-425/:472 裸 int();exec.py:1106-1109、:1118-1119 分派无守卫;:940-946 `_int_arg` 在位未接) |
69
+ | N15 | hive/hive_mcp/mcp_server.py:375-384 | hive_kill/hive_poll 的 job_id 无任何格式校验即拼路径,路径穿越可跨池写 kill 标志(杀其它部署池的任务)或在任意已存在目录写空文件 | **已修复**(F4) | 本会话验证(git diff + smoke_test 21/0,见第四节 F4) |
70
+ | N16 | hive/hive_mcp/mcp_server.py:583-591 | 一行 JSON-RPC 2.0 规范允许的批量请求(数组)或任何非 dict JSON 行使整个 MCP server 进程崩溃退出(一行即 DoS):`_rpc` 入口 `req.get("method")`(现行 :565-566)对 list/str/int 形态抛 AttributeError,早于 :589-592 只包工具调用的 try;main 的循环(:607-611)只护 json.loads 的 ValueError | 未修复(遗留) | 本会话验证(mcp_server.py:565-566、:589-592、:607-611 逐点读码:崩溃点在 :566,先于工具层兜底) |
71
+ | N17 | hive/hive_mcp/mcp_server.py:85-88 | config.local.json 的 HIVE_JOBS_DIR 只影响 serve 面不影响 MCP 面:`_jobs_dir`(:84-88)只读进程 env,`_load_config_local`(:75-81)存在但不为 _jobs_dir 所用——两面指向不同 jobs 池时任务提交后永远无人消费,doctor 与 spawn 报出自相矛盾的 serve 状态 | 未修复(遗留) | 本会话验证(mcp_server.py:75-88 两入口分裂在位;:550 doctor 描述自证两面 env 来源分列) |
72
+
73
+ ### low(3 项)
74
+
75
+ | # | 位置 | 缺陷摘要 | 状态 | 证据 |
76
+ |---|------|----------|------|------|
77
+ | N4 | swarm/rust_swarm.py:106 | verify_wal_signatures(WAL 防篡改验签器)对畸形/被篡改行零容错:`json.loads`(现行 :116)、`line.index('"payload":')`(:119)、`rec["type"]` 等键访问(:121-126)均未捕获——单行损坏(半行截断/篡改成非法 JSON/缺 hmac 字段)即打崩整个验签循环,违反 stdout 恒为单行 JSON 契约 | 未修复(遗留) | 本会话验证(rust_swarm.py:100-139 生效条件注释与实现均无守卫) |
78
+ | N14 | hive/wm.py:133-143 | job_id 穿越校验(L2 修复)只拦 `/ \ . ..` 四种形态,Windows 文件系统非法字符(`a:b` 的冒号、保留名 con/nul、通配符)穿过校验后在 os.makedirs/shutil.copy2 抛出非 WmError 的 OSError,main 的 `except WmError`(wm.py:381)不捕获 → CLI 裸 traceback 崩溃,违反「输出统一单行 JSON」契约(wm.py:16);该输入(result.json 自报 job_id)被模块自己声明为不可信,但只防了路径穿越、未防文件系统敌对字符 | 未修复(遗留) | 本会话验证(wm.py:133-136 现行闸仅四形态;:381 兜底仅 WmError) |
79
+ | N18 | hive/hive_mcp/mcp_server.py:305 | timeout_s 入参 schema 承诺 5..3600(现行 :511)但代码零校验(:319 `int(a.get("timeout_s") or DEFAULT_TIMEOUT_S)` 无范围夹取),越界值(负数/1 秒)直通 spec,负值在执行器侧必抛 ValueError 任务必败 | 未修复(遗留) | 本会话验证(mcp_server.py:511 schema 文案与 :319 实现脱节在位;行号较挖掘快照 +14,系 N15 修复插入所致) |
80
+
81
+ ---
82
+
83
+ ## 四、新修复清单(4 项——输入口径 3,diff 核实 4,见第一节口径说明)
84
+
85
+ 以下均为工作树未提交改动(`git diff` 本会话核对):
86
+
87
+ ### F1(对应 N1,medium)rust 侧 job_id 结构闸(4 文件成套)
88
+ - hive/src/job.rs:49-60 新增 `valid_job_id`:`h` 开头 + 其余字符限于 ASCII 字母数字/下划线——结构上排除 `/`、`\`、`..`、盘符 `:` 等一切可逃出 jobs 池的成分(与 `new_job_id` 生成形态及 list_jobs 前缀过滤同口径)。
89
+ - 应用点三处:main.rs:348(cmd_poll,单查给全量——正是穿越读全文的放大器)、main.rs:385(cmd_kill,结构闸先行、存在性检查在后)、scheduler.rs:554(deps_gate——spec.json 是池内落盘文件可被手工改写,submit 侧校验不构成运行时保证)。
90
+ - spec.rs:203 depends_on 校验由「仅 h 前缀」升级为全量 `valid_job_id`(旧检查 `h/../../x` 可过)。
91
+ - 配套测试:job.rs `valid_job_id_rejects_traversal`(`..`/`../victim`/`h/../../x`/`h:x`/`/etc` 等 12 形态全拒)、spec.rs `depends_on_traversal_rejected`——本会话 cargo test 实跑均 ok。
92
+
93
+ ### F2(对应 N2,medium)serve_start.py 生命周期命令目标池统一
94
+ - 新增 `_lifecycle_jobs(cfg)`(:371-380):与 start/restart/rebuild 同口径经 `_jobs_from` 吃进 config 的 HIVE_JOBS_DIR;config 加载失败降级为仅 env 决策(注释明示取舍:stop 须尽力,不因 config 笔误停不掉 serve)。
95
+ - `status` 参数化为 `status(jobs=None)`(:385),心跳/判活/job_states 全部以给定池为准;main() 接线 `--stop`/`--status` 均经 `_lifecycle_jobs`(:429/:431)。
96
+ - 配套测试 test_serve_entry.py ⑨a-⑨d(config 读到/缺失降级/指定池盯梢/源接线断言)本会话实跑全 OK。
97
+
98
+ ### F3(对应 N3,medium)rust_swarm.py run_swarm 错误契约补全
99
+ - :79-90 子进程调用包 try/except:TimeoutExpired 与 OSError(exe 缺失)均返回 `{ok:False, stage:'swarm', stderr:...}` 结构化 dict,不再穿透调用方;stderr 保留现场(超时秒数/命令行)。
100
+ - 配套测试 test_rust_swarm.py ⑤(30s 慢执行器 + timeout=1s、不存在 exe 各一条)本会话实跑 2 组断言全过。
101
+
102
+ ### F4(对应 N15,medium)mcp_server.py MCP 面 job_id 结构闸
103
+ - 新增 `_valid_job_id`(:100-112):与 rust 侧 `job::valid_job_id` 同口径(注释明示「跨语言靠注释约定对齐,勿自持第二判据」)。
104
+ - 应用点两处:`_t_poll` :361、`_t_kill` :395——job_id 先过结构闸再拼路径,`../victim` 读池外全文与 `..` 池外写 kill 标志两条通道一并封死;同步更新两函数生效条件注释。
105
+ - hive/hive_mcp/smoke_test.py 本会话实跑 21/0。
106
+
107
+ ---
108
+
109
+ ## 五、遗留项(未修复 14 项)
110
+
111
+ 按模块分组,供后续批次排期:
112
+
113
+ | 模块 | 数量 | 编号(严重度) |
114
+ |------|------|----------------|
115
+ | hive/verify_runner.py | 3 | N5 iter_id 穿越读写(high,与 N11 同路径)、N9 suite 空跑放行(medium)、N11 防御不一致(medium,同 N5 修复即消) |
116
+ | hive/exec.py | 3 | N6 result 非原子写(medium)、N7 单发空回包假成功(medium)、N8 read_roots 单串切分(medium) |
117
+ | hive/wm.py | 2 | N10 HEAD 残留绕过合并审查(high,已有确定性复现)、N14 敌对字符裸崩(low) |
118
+ | hive/hive_mcp/mcp_server.py | 2 | N16 一行 DoS(medium)、N17 两面 jobs 池分裂(medium)、(N18 见下) |
119
+ | hive/orch.py | 1 | N13 裸 int() 打死编排 job(medium) |
120
+ | md_cg/interop.py | 1 | N12 断言面误标(medium) |
121
+ | swarm/rust_swarm.py | 1 | N4 WAL 验签零容错(low) |
122
+ | hive/hive_mcp(schema) | 1 | N18 timeout_s 承诺无校验(low) |
123
+
124
+ 去重口径:N5/N11 合并后 13 个独立缺陷。优先级建议:N5(high,一次修复消两条记录,且姊妹入口已有可对齐的校验范式)与 N10(high,已有复现脚本、修法明确——commit 失败也要走 try/finally 还原 HEAD)为下一批首选;N13/N7(模型面稳定性,`_int_arg`/`_empty_turn` 现成构件未接)次之;N12 修复成本极低(make_verdict 补断言面入参)。
125
+
126
+ ---
127
+
128
+ ## 六、测试验证结果
129
+
130
+ 以下命令均为本会话实际运行(Windows,仓库根目录),非转述:
131
+
132
+ | 命令 | 结果 | 退出码 |
133
+ |------|------|--------|
134
+ | `python hive/test_serve_entry.py` | ALL OK(含新增 ⑨a-⑨d:--stop/--status 目标池与 start 同口径) | 0 |
135
+ | `python swarm/tests/test_rust_swarm.py` | 20 passed, 0 failed(含新增 ⑤:超时/exe 缺失返回结构化 dict) | 0 |
136
+ | `python hive/test_orch.py` | 85 passed, 0 failed(L1/L4 回归) | 0 |
137
+ | `python hive/test_exec_cmd.py` | ALL_PASS(L3 回归) | 0 |
138
+ | `python hive/test_wm_progress.py` | PASS=44 FAIL=0(L2 回归) | 0 |
139
+ | `cargo test --manifest-path hive/Cargo.toml` | 21+5+3 passed, 0 failed(含 `job::tests::valid_job_id_rejects_traversal`、`spec::tests::depends_on_traversal_rejected`) | 0 |
140
+ | `python hive/hive_mcp/smoke_test.py` | 21 pass / 0 fail(F4 回归:spawn/poll/kill/restart/doctor 全链路) | 0 |
141
+ | wm HEAD 残留复现脚本(临时目录,非测试套件) | N10 机制复现:snap2 抛 WmError(nothing to commit)、终态 HEAD 停留任务分支 | —(复现脚本) |
142
+
143
+ **合计**:本轮全部改动文件(orch/wm/exec_cmd/serve_start/rust_swarm/main.rs+job.rs+spec.rs+scheduler.rs/mcp_server)均有对应套件覆盖,7 套全绿,与任务输入「回归:全绿」一致。
144
+
145
+ **未运行项(如实说明)**:compiler 面本轮零改动,其 8 套(v1 第六节)未复跑——工作树仍携带 v1 的 compiler 修复,正确性证据沿用 v1 报告;N10 之外的遗留缺陷未写复现脚本(N5/N7/N9/N12/N13/N16 等以读码取证为准,标注见第三节证据列)。
146
+
147
+ ---
148
+
149
+ ## 七、跳过项及原因
150
+
151
+ **无**。本轮无任何确认缺陷被主动跳过:18 项确认中 4 项已修复(第四节)、14 项列入遗留清单(第五节)。
152
+ 另:候选 20 与确认 18 的 2 项差值为复核未确认候选,明细未随任务输入提供,本报告不虚构展开。
153
+
154
+ ---
155
+
156
+ *报告依据:任务输入的第 1 轮遗留修复 4 项结论与第 2 轮缺陷清单(候选 20/确认 18/新修复 3/回归全绿);本会话的 `git diff` 工作树核对(4 项修复 + 4 项第 1 轮收口逐一比对)、18 处缺陷位置现行代码读码复核、N10 确定性复现脚本(临时目录),以及 7 套回归实跑。*