@furongjun1999/dsh-memory 0.5.1 → 0.6.1

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 (187) hide show
  1. package/README.md +588 -552
  2. package/codebuddy/CODEBUDDY.md +10 -10
  3. package/data/policy.json +27 -0
  4. package/docs/discipline/harnesses.yaml +31 -0
  5. package/docs/discipline/templates/full.md.tmpl +1 -1
  6. package/docs/discipline/templates/rules.mdc.tmpl +1 -1
  7. 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
  8. 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
  9. package/docs/eval/DSH/347/253/257/347/274/272/351/231/267/344/270/223/351/241/271_v1.0.md +254 -0
  10. package/docs/eval/N225_/347/264/242/345/274/225/346/227/245/345/277/227/351/235/236/345/257/271/350/261/241/350/243/205/350/275/275/351/235/242/347/261/273/345/236/213/351/227/270_v1.0.md +418 -0
  11. 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
  12. package/docs/eval/issue43_/351/273/230/350/256/244/347/255/226/347/225/245/344/270/216/351/224/256/347/261/273/345/236/213/351/227/270_v1.1.md +441 -0
  13. package/docs/eval/issue43_/351/273/230/350/256/244/347/255/226/347/225/245/345/212/240/350/275/275/344/270/216/345/207/255/346/215/256/346/230/216/346/226/207/351/230/237/345/210/227_v1.0.md +398 -0
  14. package/docs/eval//344/274/230/345/214/226/347/254/254/344/270/200/346/211/271_/346/216/245/347/272/277/344/270/216/347/255/211/344/273/267/345/217/230/346/215/242_v1.0.md +498 -0
  15. package/docs/eval//344/274/230/345/214/226/347/254/254/344/270/211/346/211/271_/351/227/250/347/246/201/350/275/254/346/255/243/344/270/216/350/260/203/345/272/246/346/255/242/350/241/200/344/270/216/351/227/250/346/216/247/346/224/266/345/217/243_v1.0.md +669 -0
  16. package/docs/eval//344/274/230/345/214/226/347/254/254/344/272/214/346/211/271_/344/276/235/350/265/226/351/200/217/344/274/240/344/270/216/345/257/271/346/213/215/345/217/243/345/276/204/344/270/216/350/264/237/347/274/223/345/255/230_v1.0.md +683 -0
  17. 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
  18. package/docs/eval//345/217/221/345/270/20307_/345/244/226/351/203/250/346/212/245/345/221/212/345/233/233/346/211/271/344/277/256/345/244/215/344/270/216/346/217/222/344/273/266/351/235/242/345/212/240/345/233/272_v1.0.md +205 -0
  19. package/docs/eval//346/200/247/350/203/275/344/270/223/351/241/271_/345/206/267/346/237/245/350/257/242/344/270/216/345/206/205/345/255/230_v1.0.md +218 -0
  20. package/docs/eval//346/225/205/351/232/234/346/263/250/345/205/245/345/256/236/346/265/213_v1.0.md +10 -0
  21. package/docs/eval//347/274/226/347/240/201/351/235/242/345/211/215/347/275/256_/345/205/245/345/217/243/350/207/252/344/277/235/350/257/201UTF8/344/270/216/346/226/207/346/234/254open/345/256/210/345/215/253_v1.0.md +646 -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_v18.md +183 -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_v19.md +207 -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_v20.md +283 -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_v21.md +224 -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_v22.md +223 -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_v23.md +293 -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_v24.md +303 -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_v25.md +230 -0
  30. package/docs/hive//346/243/200/347/264/242/350/267/257/345/276/204/344/270/216/350/256/244/347/237/245/347/273/223/346/236/204/345/245/221/347/272/246_v0.1.md +20 -0
  31. package/docs/hive//350/234/202/345/267/242M6_ingest/345/256/236/346/226/275/350/256/241/345/210/222_v0.1.md +1 -1
  32. package/docs/mdcg/README/350/257/246/347/273/206/347/211/210_v0.4.10.md +12 -0
  33. 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
  34. package/docs/mdcg//345/217/221/345/270/203/351/227/250/347/246/201/351/223/276_v0.1.md +21 -9
  35. package/docs/mdcg//347/201/265/346/236/242/350/256/260/345/277/206/345/212/250/350/257/215/345/215/217/350/256/256_v1.0-draft.md +7 -2
  36. package/docs/mdcg//350/256/244/347/237/245/345/233/276_/347/264/242/345/274/225/344/270/216/345/267/245/347/250/213/350/247/204/350/214/203/345/214/226_/350/256/241/345/210/222_v0.1.md +39 -3
  37. package/docs/plans//345/205/250/344/270/255/346/226/207/347/274/226/347/240/201/344/270/216/350/234/202/345/267/242/344/273/273/345/212/241/346/240/207/350/257/206/345/245/221/347/272/246_v2.0.md +220 -0
  38. package/docs/plans//347/234/237/346/272/220/347/264/242/345/274/225_/351/200/232/347/224/250/346/234/272/345/210/266_v0.3.md +227 -0
  39. package/docs/plans//350/234/202/345/267/242/346/250/241/345/236/213/345/257/206/351/222/245/351/205/215/347/275/256/351/235/242_v1.0.md +385 -0
  40. package/docs//345/267/245/344/275/234/347/272/252/345/276/213_/350/256/244/347/237/245/345/233/276/346/235/241/347/233/256_v1.1.json +460 -460
  41. package/dsh/cordis-patch-profile-web.example.yml +35 -0
  42. package/lib/bridge.js +24 -2
  43. package/lib/cli.d.ts +3 -0
  44. package/lib/cli.js +66 -0
  45. package/lib/hooks.d.ts +31 -2
  46. package/lib/hooks.js +219 -16
  47. package/lib/init.d.ts +88 -0
  48. package/lib/init.js +302 -0
  49. package/lib/lib/prompt_safety.d.ts +52 -1
  50. package/lib/lib/prompt_safety.js +76 -1
  51. package/md_cg/audit.py +652 -379
  52. package/md_cg/bench6_arms.py +1 -1
  53. package/md_cg/bench_p0.py +1 -1
  54. package/md_cg/branches.py +2 -2
  55. package/md_cg/ccgc.py +1071 -1006
  56. package/md_cg/chain.py +1 -1
  57. package/md_cg/consistency.py +97 -9
  58. package/md_cg/consolidate.py +34 -9
  59. package/md_cg/crypto.py +59 -26
  60. package/md_cg/docindex.py +16 -1
  61. package/md_cg/evidence.py +585 -582
  62. package/md_cg/evolution.py +17 -1
  63. package/md_cg/export.py +1 -1
  64. package/md_cg/forgetting.py +309 -13
  65. package/md_cg/fsutil.py +454 -8
  66. package/md_cg/identity.py +3 -3
  67. package/md_cg/insight.py +24 -3
  68. package/md_cg/linkref.py +1 -1
  69. package/md_cg/logref.py +327 -0
  70. package/md_cg/mcp_server.py +4152 -3818
  71. package/md_cg/mdcg.py +4208 -3462
  72. package/md_cg/mdcos.py +4491 -4137
  73. package/md_cg/mreview/pipeline.py +15 -1
  74. package/md_cg/nodefile.py +639 -575
  75. package/md_cg/protect.py +158 -11
  76. package/md_cg/protocol.py +41 -2
  77. package/md_cg/provenance.py +22 -4
  78. package/md_cg/reach.py +4 -4
  79. package/md_cg/readcache.py +76 -15
  80. package/md_cg/reconcile.py +1 -1
  81. package/md_cg/refindex.py +246 -37
  82. package/md_cg/refine.py +1 -1
  83. package/md_cg/review_cli.py +49 -4
  84. package/md_cg/routing.py +32 -5
  85. package/md_cg/run_tests.py +17 -0
  86. package/md_cg/scrub.py +30 -3
  87. package/md_cg/security.py +47 -1
  88. package/md_cg/self_state.py +5 -5
  89. package/md_cg/sources.py +23 -6
  90. package/md_cg/srcindex.py +352 -0
  91. package/md_cg/stg.py +47 -3
  92. package/md_cg/subgraph.py +2 -2
  93. package/md_cg/sustain.py +1299 -1168
  94. package/md_cg/tasks.py +469 -470
  95. package/md_cg/test_b1_auto_id_multiproc.py +277 -0
  96. package/md_cg/test_b1b2_write_face.py +417 -0
  97. package/md_cg/test_b2_sensitivity_landing.py +223 -0
  98. package/md_cg/test_b3_merge_keeps_content.py +576 -0
  99. package/md_cg/test_b4_shard_dir_selfheal.py +843 -0
  100. package/md_cg/test_b4_shard_dir_selfheal_guard.py +238 -0
  101. package/md_cg/test_c3_transient_read_negative.py +793 -0
  102. package/md_cg/test_c8_search_rrf_gates.py +502 -0
  103. package/md_cg/test_ccg_form_parity.py +188 -0
  104. package/md_cg/test_ccgc.py +28 -3
  105. package/md_cg/test_govern_directread.py +17 -4
  106. package/md_cg/test_h2_session_view_norm.py +233 -0
  107. package/md_cg/test_h4_sustain_snapshot.py +1377 -0
  108. package/md_cg/test_hive_ingest.py +285 -285
  109. package/md_cg/test_index_crossprocess_reload.py +301 -0
  110. package/md_cg/test_issue39_utf8_stdio.py +307 -16
  111. package/md_cg/test_issue43_default_policy.py +865 -0
  112. package/md_cg/test_legacy_p3_node_id_type.py +375 -0
  113. package/md_cg/test_linkref.py +10 -3
  114. package/md_cg/test_lock.py +2 -2
  115. package/md_cg/test_logref.py +1109 -0
  116. package/md_cg/test_m3_h9_bucket_health_protect_mark.py +301 -0
  117. package/md_cg/test_m3_h9_semantic_guard.py +525 -0
  118. package/md_cg/test_mr_m2.py +15 -3
  119. package/md_cg/test_n130_verify_falsified_protect.py +1 -1
  120. package/md_cg/test_n139_dek_provision_failclosed.py +185 -0
  121. package/md_cg/test_n176_link_trust.py +221 -0
  122. package/md_cg/test_n178_units_jobid_gate.py +212 -0
  123. package/md_cg/test_n184_keys_concurrent_provision.py +307 -0
  124. package/md_cg/test_n195_writepath_reload.py +283 -0
  125. package/md_cg/test_n196_stale_gate_skip.py +169 -0
  126. package/md_cg/test_n197_n208_write_face_gates.py +471 -0
  127. package/md_cg/test_n198_tokens_corrupt_failclosed.py +225 -0
  128. package/md_cg/test_n199_tokens_concurrent_write.py +378 -0
  129. package/md_cg/test_n201_proposal_visibility.py +382 -0
  130. package/md_cg/test_n202_session_notes_visibility.py +461 -0
  131. package/md_cg/test_n204_n205_n226_n227_n228_n229_exit_gates.py +542 -0
  132. package/md_cg/test_n206_stdio_jsonrpc_type.py +403 -0
  133. package/md_cg/test_n209_verify_write_face_gates.py +461 -0
  134. package/md_cg/test_n212_n213_n224_generation_gates.py +513 -0
  135. package/md_cg/test_n214_n215_n221_n222_write_face_gates.py +563 -0
  136. package/md_cg/test_n225_nonobject_load.py +1110 -0
  137. package/md_cg/test_n62_tenant_bind_failclosed.py +200 -0
  138. package/md_cg/test_neg_condition_hits.py +333 -0
  139. package/md_cg/test_neg_tail_honesty.py +663 -0
  140. package/md_cg/test_none_id_write_guard.py +166 -0
  141. package/md_cg/test_opt_batch1_md_cg.py +451 -0
  142. package/md_cg/test_p1.py +5 -5
  143. package/md_cg/test_p11_consistency.py +161 -12
  144. package/md_cg/test_p26_refindex.py +2 -2
  145. package/md_cg/test_p27_docindex.py +777 -774
  146. package/md_cg/test_p28_refcheck.py +740 -13
  147. package/md_cg/test_p29_session_ingest_export.py +2 -2
  148. package/md_cg/test_p2_mcp.py +12 -1
  149. package/md_cg/test_p30_maintain.py +33 -2
  150. package/md_cg/test_p31_insight.py +1 -0
  151. package/md_cg/test_p9c_dedup_hints.py +276 -0
  152. package/md_cg/test_policy_required_ccg.py +426 -0
  153. package/md_cg/test_protocol.py +22 -0
  154. package/md_cg/test_rank_parity_score_mode.py +516 -0
  155. package/md_cg/test_read_face_input_gates.py +363 -0
  156. package/md_cg/test_read_face_semantics.py +489 -0
  157. package/md_cg/test_recall_face_guards.py +812 -0
  158. package/md_cg/test_rejected_credential_forms.py +188 -0
  159. package/md_cg/test_rejected_redact.py +146 -0
  160. package/md_cg/test_retr_s1b.py +2 -2
  161. package/md_cg/test_retr_s5.py +20 -7
  162. package/md_cg/test_review_cli_attribution.py +177 -0
  163. package/md_cg/test_review_cli_visibility.py +235 -0
  164. package/md_cg/test_review_conformance.py +21 -3
  165. package/md_cg/test_security_audit_v21.py +2 -2
  166. package/md_cg/test_server_version.py +67 -0
  167. package/md_cg/test_srcindex.py +171 -0
  168. package/md_cg/test_tenant_env_override_warn.py +63 -50
  169. package/md_cg/test_token_lowercase_form.py +315 -0
  170. package/md_cg/test_v21r1_package_version.py +310 -0
  171. package/md_cg/test_writepipe.py +10 -4
  172. package/md_cg/tokens.py +225 -95
  173. package/md_cg/tool_face.py +4 -4
  174. package/md_cg/trust.py +49 -5
  175. package/md_cg/units.py +204 -6
  176. package/md_cg/weights.py +4 -4
  177. package/md_cg/whitebox_kb/wisdom/knowledge_points.py +1 -1
  178. package/md_cg/writelimit.py +42 -8
  179. package/md_cg/writepipe.py +651 -554
  180. package/package.json +8 -2
  181. package/skills/plugin.json +1 -1
  182. package/src/bridge.ts +25 -2
  183. package/src/cli.ts +65 -0
  184. package/src/hooks.ts +229 -16
  185. package/src/init.ts +361 -0
  186. package/src/lib/prompt_safety.ts +88 -1
  187. package/zcode/AGENTS.md +10 -10
@@ -0,0 +1,223 @@
1
+ # 缺陷挖掘·自主迭代 第 23 轮报告(hive 四轮深挖·三圈第八站)
2
+
3
+ > **元信息**:第 23 轮 = hive 四轮深挖·三圈第八站(承接 v21=第 22 轮安全专项·三圈第七站〔编号用至 N182〕);落盘文件名 `缺陷挖掘_自主迭代_v22.md` 为编排指定(v21 之后顺延)。基线 HEAD `977a710f`(第 22 轮落码提交,批次 64);本轮 5 修落工作区未提交(注释按第 23 轮/批次 65 口径混标,批次号以编排提交为准)。日期 2026-09-28。
4
+ > **报告会话核验口径**:编号基线、源码树占号、历轮考证、3 件新守卫复跑、python 全量 228/228、hive/rust 两 crate cargo test、`npm run gate` 逐面归因均由本报告会话第一手实跑(命令与输出见第四节与第六节);四区攻防复现与修复红绿双态(git stash)为复核/修复会话第一手实测(材料附命令与输出),按材料转述并逐项标注归属,未复跑项如实声明。
5
+
6
+ ---
7
+
8
+ ## 一、执行摘要
9
+
10
+ 本轮为四区复核(recent / legacy / orch / rust)+ 五项修复落闸的 hive 四轮深挖轮:
11
+
12
+ - **四区确认 21 条**(条目口径:recent 5 / legacy 7 / orch 3 / rust 6),去重后恰为 **21 项独立缺陷 = 新发现 12(N183–N194)+ legacy 9**(N144、N145、N68、N90、N91、N177、v21-R1、N178、A1-e);另 3 条闭合复测记录(N89 已修复核、A1-a 已修复核、A6-b 核销维持)并入 legacy 合并条目。**证伪·剔除 3 条**(见 3.3)。
13
+ - **修复 5 项**(全部红→绿守卫落工作区,未 commit):
14
+ - **3 项 high**:N184(`_keys.json` 并发 provision 丢失更新——信封无痕抹除+静默重签致旧密文永久不可解)、N189(零依赖 JSON 解析器深嵌套栈溢出——文件协议投毒使 serve 持久崩溃循环且重启必复崩)、N190(spawn env 密钥扩散——`HIVE_ORCH_TOKEN`/`HIVE_API_KEY` 随执行器子进程扩散,P11 不可伪造性与「密钥归 serve 侧」书面边界对最暴露进程失效)。
15
+ - **2 项 legacy medium 欠账闭合**:N144(确定性执行器写结果竞态——v17 首报第 2 轮落闸)、N145(编排器池解析双源分叉——v17 首报第 2 轮落闸)。
16
+ - **留档 15 条**(分诊条目口径)= **16 项在档独立缺陷**(新未修 9:N183/N185/N186/N187/N188/N191/N192/N193/N194 + legacy 未修 7:N68/N90/N91/N177/v21-R1/N178/A1-e)+ 3 条闭合记录;N183 双面同号条目去重。其中 **2 项大设计决策**(N183 锚绑定口径、N68 mdcg_root 去留/加闸)、**1 项次轮首补候选**(N191,修复面明确)。
17
+ - **编号裁定(本轮核心工程事实)**:四区清单 hive 面与 rust 面各自自 N183 起暂编致 N184–N187 双条同号;两个并行修复会话又各自 grep 选号、双双取 N184(撞号)。本报告按 v16/v17/v21 先例裁决消歧(见 3.0),N183–N194 全局唯一经本会话扫描核对,次轮自 **N195** 续编;源码树 2 处编号残留如实注记(3.0-③)。
18
+ - **门禁**:python 全量回归通过(本会话第一手复跑 228/228 通过 3 跳过,exit 0);cargo 通过(hive 48/48、rust 16/16,本会话第一手复跑 exit 0);**`npm run gate` 内容面(R1 凭据/R2 私有数据/R3 隐私文本)全 PASS——本报告内容零命中(本会话对落盘稿实跑复核)**;唯一 FAIL 为 **R4 非追踪件面命中=2**(本报告与 md_cg 新守卫均为发布清单内未追踪新件所致,编排会话入库提交后转绿,v21 同因先例,非内容缺陷)。
19
+ - **纪律**:全部复现在系统临时目录/哑令牌/哑密钥环境,未触真实令牌库/真实在役 serve/在役数据目录;测毕清理(见第六节)。
20
+
21
+ ---
22
+
23
+ ## 二、修复清单(5 项,落工作区未 commit)
24
+
25
+ ### 修复① N184(high):`_keys.json` 并发 provision 丢失更新——写锁 + 写前对账双闸
26
+
27
+ - **where**:`md_cg/crypto.py:299-329`(修复前)provision_dek 先 `_load_keys` 读快照(:306)→ AEAD 签发 → 按**陈旧快照**经 `_save_keys`(:287-290,fsutil.atomic_write 仅 tmp+rename 防撕裂、无文件锁、无写前对账)整份写回——两写者交错即无痕抹除对方信封。触发面 `hive/exec.py:845` 每次工具调用新建 MdCGSecure→`_init_crypto`→provision_dek(`md_cg/mdcos.py:3694-3696`)。N139(第 22 轮)只堵「损坏回落→静默重签」形态,并发写回形态无闸。**编号裁定**:N184 经修复会话 grep 核对空闲(当时源内最大 N176,N177–N183 全仓无占用);守卫文件名 `test_n184_keys_concurrent_provision.py` 实占——本报告维持 N184 归属本条(与 json.rs 修复会话的撞号消歧见 3.0)。
28
+ - **攻击面**:无需攻击者——fresh 部署冷启动时 worker 首次 lingshu_cg 与设计者会话首条 private 写或 rotate_dek 并发即触发;也可由低权进程故意高频新建身份 provision 挤掉在签信封。
29
+ - **修复**:①`crypto.py:50` 新增 `from .fsutil import FileLock`(fsutil 纯 stdlib 无环,fresh import 实测通过);②`crypto.py:288-303` `_save_keys` 写前对账:先读盘面——盘面带 load_error 抛 LockedError(N139 同闸延申到写点,解析不了的密钥库绝不整份覆盖);盘面已有而本次快照没有的信封逐键并入(键同存以本次写回为准,rotate 语义不受影响);仍经 atomic_write 原子替换;③`crypto.py:306-345` provision_dek 读快照→签发→写回全程置于 `FileLock(keys_path(root), timeout=10.0, strict=True)` 跨进程互斥临界区(Windows msvcrt / POSIX flock 双平台同语义);不沿用默认超时放行——strict 下锁竞争超时经 TimeoutError 转 LockedError fail-closed(⊂CryptoError,`mdcos._init_crypto` 既有 `except (CryptoError, OSError)` 直接降级 dek=None);临界区内互见使同身份并发 provision 幂等(第二写者 unwrap 同一 DEK);④`_keys.json` 全仓唯一写点即 `_save_keys`(grep 证实),双闸(锁+对账)覆盖全部写形态。未改 `hive/exec.py`(触发面在位即可,修复在 crypto 单点收口);生效条件注释同步更新(crypto.py:287/:295/:309/:347)。
30
+ - **攻防前后对比**:修复前(红,哑 KEK=os.urandom(32)+系统临时根+哑环境;一次性 `_load_keys` 桩定格 t0 真实空快照仅对齐调度不伪造数据,save 点 Barrier 对齐桩等价 OS 竞态窗,provision/_save/解封全真实代码路径;测毕 rmtree 清理、零真实令牌/零用户密钥目录触碰):worker 按 t0 快照写回后盘面 envelopes 仅剩 worker——designer 信封无痕抹除;designer 重进 provision_dek **无告警静默重签新 DEK**;已密封节点 open_node 返回 None(mdcos.py:3777-3782 口径,永久静默丢失)。真并发 12/12 轮**每轮丢一方信封**;同身份并发得 2 种 DEK(非幂等,一方 DEK 被抹);`_save_keys` 对损坏盘面直接覆盖。守卫红 9 项 EXIT=1。修复后(绿):交错窗被写锁消除——designer 信封幸存、重进取回同一 DEK、已密封节点可解;真并发 12 轮零丢失(aligned=0 恰是锁挡住交错的直接证据);同身份并发幂等同 DEK;写前对账保留盘面信封、load_error 拒写且坏字节原样;rotate 换新生效且不被对账复活旧信封。**16/16 绿 EXIT=0**。
31
+ - **守卫**:`md_cg/test_n184_keys_concurrent_provision.py`(16 断言):R1 交错复现 7 断言(信封幸存/解封/重进幂等/密封节点可解全链);R2 真并发跨身份 12 轮双线程(save 点 Barrier 对齐,对齐窗 0.3s < 锁超时 10s 无死锁,任一轮任一信封丢失即红)+ R2b 对齐桩自证(绕开写锁直呼写点必同窗落盘——红条件有效性自证,防假红);R3 同身份并发 provision 幂等;R4 写前对账机制断言(陈旧快照写不抹盘面信封 + load_error 拒写且字节不动);R5 rotate 零误伤。哑 KEK+tempfile 临时根+finally 清理。
32
+ - **红→绿(修复会话,git stash 双态机械证据)**:`git stash push -- md_cg/crypto.py && python -X utf8 -m md_cg.test_n184_keys_concurrent_provision` → FAILED 9 项 EXIT=1(R2 对齐达成 12/12 轮)→ `git stash pop` 还原后复跑同命令 → ALL OK 16 项 EXIT=0。既有测试(修后逐一实跑):test_p13_encryption 42/42、test_n139_dek_provision_failclosed 14/14、test_lock 300 互斥正常、test_md_writepath 52/52、test_read_scope_b27 44/44、test_hive_ingest 27/27、test_p38_concurrent_flush 3/3。热路径实测:幂等 provision_dek 0.29 ms/call(含锁开+锁+解锁与 2 次读盘),hive 每工具调用一次形态下开销可忽略。**本报告会话复跑:`python -X utf8 -m md_cg.test_n184_keys_concurrent_provision` → ALL OK 16 项 EXIT=0**;且在全量套件内 PASS(第四节)。
33
+
34
+ ### 修复② N144(medium-legacy,第 2 轮落闸):确定性执行器写结果竞态——移植 N82 两层防护
35
+
36
+ - **where**:`hive/exec_cmd.py:40-53`(修复前)`_write_result` 固定共享临时名 `p+".tmp"` + 裸 `os.replace` 无重试 × `:55-70` `_fail` 直写 `{"ok":false}` 无成功终态回看 × `:269-272` main 顶层兜底 `_fail` 复用同一坏路径可二次抛出。同族 `hive/exec.py:138-167`(mkstemp+PermissionError/FileNotFoundError 重试)与 `:171-191`(write_error_result 成功终态拒覆写)的 N82 三件套(commit `1d022a6b` 批次 47)只落 exec.py——`git log -S mkstemp` / `-S write_error_result -- hive/exec_cmd.py` 均空、末触批次 53(be88744c),欠账实证。**编号裁定**:报告双条 N141/N144 取 **N144**——N141 现行注册已被批次 49 凭据漏检缺陷实际占用(exec.py:1002/:1025 + `hive/test_sensitive_read_names.py`);v17 报告曾以 N141 暂编本条目(属编号复用沿革),N144 全仓 grep 无占用。
37
+ - **攻击面**:serve 硬崩留孤儿执行器 → 新 serve recover_orphans 对 claimed 无产物任务删锁重投(scheduler.rs:306-315)或 spec.rerun_on_recover 强制重投(scheduler.rs:283-292/:321-329)→ 双执行器并发写同一 job_dir:共享 tmp 撞车 PermissionError 外逃或成功终态被兜底 error 覆写(数据丢失面);wm.py:127-131 凭证闸下游对 result.ok 非 true 拒收。
38
+ - **修复**:①`exec_cmd.py:32` 新增 `import tempfile`;②`_write_result`(修后 :40-85)移植 N82 第一件:`tempfile.mkstemp(prefix="result.json.", suffix=".tmp", dir=job_dir)` 唯一临时名(同目录保 rename 原子性)+ 原 fsync 语义与 HIVE_RESULT_ANCHOR 透传不变;os.replace 撞 PermissionError 按 10ms×递增重试至多 50 次,撞 FileNotFoundError(tmp 被对撞者抢先消费)重建唯一名重写再试,重试耗尽才外抛(失败时旧完整结果仍在位,fail-safe);finally best-effort 清残留 tmp;③新增 `_log`(:88-94,对齐 exec.py log:log.txt 留痕、失败降级 stderr 不打断任务);④`_fail`(修后 :97-116)移植 N82 第二件:写前回看 result.json——存在且可解析且 ok 为 True 时拒写并留痕「成功终态已在位,兜底 error 改写被拒(重投对撞保护,N144)」,退出码照实返回(rc 语义零变化);error→error 更新不受限;main 兜底与 spec/delegate 各 `_fail` 调用点自动受保护(全仓错误写唯一漏斗即 `_fail`);run_cmd 真实终态写(:256)不经回看保护,与 exec.py「只护 error 写」口径一致。生效条件注释三处同步。
39
+ - **攻防前后对比**:修复前(红,git stash 双态验证):T1 共享 tmp 被对撞者持握 → 裸 replace 抛 PermissionError(13) 外逃,result.json 未落地;T1b 预置成功终态 `{ok:true}` 被 `_fail` 覆写为 ok=False(成功被记死)且无留痕;T1c run_cmd 注入异常+共享 tmp 持握 → main 兜底 `_fail` 二次抛 PermissionError 外逃(rc=None 无终态);T2 双子进程×20 轮×256KB 写同一 job_dir → 外逃合计 34(对齐缺陷报告复现口径 29/27)。红 6 项 EXIT=1。修复后(绿):同一 job_dir 双执行器并发写互不相踩(mkstemp 唯一名),瞬态句柄对撞被重试窗吸收;落败者 error 终态不再覆写对撞写者已落地的成功终态(拒写留痕、退出码照实);main 兜底单次落地不再二次外抛。**10 项绿 EXIT=0,T2 外逃 34→0**。任务无终态与成功被记死两条数据丢失面均关闭。
40
+ - **守卫**:`hive/test_n144_exec_cmd_terminal_race.py`(10 断言):T1 共享 tmp 被持握不外逃+落地正确+自有 .tmp 零残留(3);T1b 成功终态拒覆写(rc 照实/终态在位/log.txt 留痕/error→error 零闸变对照)(4);T1c main 兜底二次抛出消除(1);T2 跨进程真并发零外逃+终态可解析+零 .tmp 残留(2)。临时 job 目录+finally 清理。
41
+ - **红→绿(修复会话)**:stash 后 `python -X utf8 hive/test_n144_exec_cmd_terminal_race.py` → FAILED 6 项(T1/T1a/T1b-2/T1b-3/T1c/T2,T2 外逃 34)EXIT=1;pop 后同命令 → RESULT: ALL_PASS(10/10)EXIT=0。既有测试(修复会话实跑):`hive/test_exec_cmd.py` → ALL_PASS(9 例);`test/chaos_injection/test_fi_r09_replace_handle_collision.py`(exec.py N82 同族源守卫)→ verdict pass(移植未伤源)。**本报告会话复跑:RESULT: ALL_PASS EXIT=0**;且在全量套件内 PASS(第四节)。
42
+ - **原轮次与复测轮数(本报告会话 grep 考证)**:报告面以 N144 编号现身仅 v17(前身口径自 v17 起为历轮速收候选;编号字样计数为下限)→ 本轮第 2 轮记录落闸。v17 当时另证 PermissionError [WinError 32]/撕裂 JSON 两变体本轮未重跑(第七节跳过项 3)。
43
+
44
+ ### 修复③ N145(medium-legacy,第 2 轮落闸):编排器池解析双源分叉——job_dir 父目录推导兜底
45
+
46
+ - **where**:`hive/orch.py:477`(修复前)`_spawn` 池解析唯一池源 `_hm._jobs_dir()`(只吃进程 env+config,:662 `_CFG['jobs']` 同源快照供 :377/:527 读面),不从自身 job_dir 父目录推导真实池;rust 侧 `hive/src/exec.rs:91-107` Command 继承 serve env 且仅注入 HIVE_RESULT_ANCHOR 不注入 HIVE_JOBS_DIR。**编号裁定**:报告双条 N142/N145 取 **N145**——N142 现行注册已被批次 49 children/spec 原子写占用(orch.py:271-313 + test_orch.py:471-566);N145 全仓 grep 无占用。
47
+ - **攻击面**:CLI `hive serve --jobs X` 启动且 env/config 均未设 HIVE_JOBS_DIR → 编排者 worker 内池解析回落仓内默认池 ≠ X → spawn_subtask 把子任务提交进默认池,serve 在池 X 无人领取、子任务永久饿死,且 spawn 返回 ok=True(编排者模型无感知)。
48
+ - **修复**:①`orch.py` 新增 `_resolve_jobs_dir(job_dir=None)`(修后 :425-456):env 或 config 任一显式设 HIVE_JOBS_DIR → 返回 `_hm._jobs_dir()` 原样(N89 批次 49 一致语义不动,config 胜出合并语义经委托保留);两键皆空且 job_dir 非空 → 返回 `os.path.dirname(os.path.abspath(job_dir))`(serve 以 `hive serve --jobs X` 钉池启动时编排器 job_dir 必在真实池 X 之下,父目录即 serve 实际监听池);推导池不是目录回落①,不引入新失败面;诚实边界写入 docstring(独立直跑编排时父目录与旧默认同为约定面,生产面 serve spawn 推导即真实池);②`:511` spawn 写面同走新函数;③`:696` 读面快照 `"jobs": _resolve_jobs_dir(job_dir)`——显式传 main() 局部 job_dir,避开 N87 同款求值顺序陷阱;④生效条件注释三处同步。
49
+ - **攻防前后对比**:修复前(红,git stash 双态验证;子进程隔离:env 弹 HIVE_JOBS_DIR + 空临时 config 经 HIVE_CONFIG 指定防触仓内真实 config):CLI `hive serve --jobs X` 且 env/config 均未设键 → 编排 worker 内池解析回落仓内默认池 ≠ 临时池 X(与缺陷报告独立子进程复现口径 DIVERGED=True 一致);R6 源码装配面三断言红(:477/:662 无推导函数)。红 4 项 EXIT=1。修复后(绿):同形态解析 = X 的父目录即真实池(spawn 写面与 `_card`/`_read_full` 读面同走 `_resolve_jobs_dir`,无池错位);R2 env 设键 / R3 config 设键 / R4 config 优先三组零闸变断言全绿(设键形态 N89 语义逐字不动);R5 job_dir 未就位回落默认池不崩。**9/9 绿 EXIT=0**。子任务静默饿死面关闭。
50
+ - **守卫**:`hive/test_n145_orch_pool_derive.py`(9 断言):R1 核心红面(子进程隔离+真实 orch 模块+真实解析路径——旧代码回落 :477 原内联表达式逐字同路非第二实现);R2/R3/R4 设键三组零闸变;R5 回落不崩;R6 源码装配面三断言(双点位同修防只修单面;源码断言为仓内既有家法——test_mcp_jobs_pool.py:162、test_orch.py:572-575 先例)。全程只做解析面观测零提交,临时目录 finally 清理。
51
+ - **红→绿(修复会话)**:stash 后同命令 → FAILED 4 项 EXIT=1;pop 后 → RESULT: ALL_PASS(9/9)EXIT=0。既有测试(修复会话实跑):`hive/test_orch.py` → 94 passed 0 failed;`hive/test_mcp_jobs_pool.py`(N89 决策函数同族守卫)→ 15 pass;`hive/test_orch_poll_cache.py` → PASS 12。**本报告会话复跑:RESULT: ALL_PASS EXIT=0**;且在全量套件内 PASS(第四节)。
52
+ - **原轮次与复测轮数(本报告会话 grep 考证)**:报告面以 N145 编号现身仅 v17 → 本轮第 2 轮记录落闸。诚实边界(修复会话声明):未做真实 serve 全链路复现(在役 serve 不可动),机制读码+同函数子进程模拟闭链(第七节跳过项 2)。
53
+
54
+ ### 修复④ N189(high):零依赖 JSON 解析器深嵌套栈溢出——MAX_DEPTH=256 深度闸(两 crate 同步)
55
+
56
+ - **where**:`hive/src/json.rs:133`(修复前)parse 底座 `value()↔object()/array()` 互递归无深度计数——深嵌套输入栈溢出 abort(Rust 栈溢出不可捕获、整进程终止)。该解析器是文件协议全部 JSON 的底座:主循环 deps_gate 每 400ms 读 spec.json(scheduler.rs:658)、classify_result 读 result.json(scheduler.rs:516)、poll 读 result.json(main.rs:376→job.rs:93 唯一入口);job.rs 模块头定义 spec/status/result 为跨语言文件协议接口(kill 标志更注明「任意宿主创建」)——投毒文件使 serve 崩溃且每次重启必复崩,无自愈路径。同源复制件 `rust/src/json.rs:123` 同缺陷一并修(hive 版文件头注明「两处改动需同步」)。**编号裁定**:原四区清单 rust 面暂编 N184——该号已被 crypto 守卫文件名实占(两修复会话并行各自 grep 选号撞号,见 3.0),本报告重编为 **N189**。
57
+ - **攻击面**:任何能写 jobs 池的组件落盘 10 万层嵌套(约 100KB)即可:①pending 任务深 spec.json → serve 主循环 deps_gate 崩;②claimed/running 任务深 result.json → serve 启动即崩(recover_orphans→classify_result 中招);③`hive poll <id>` 观测面即崩——serve 持久崩溃循环直至人工删目录。
58
+ - **修复**(最小修,两份 json.rs 同步):①新增常量 `MAX_DEPTH=256` 及取值依据注释;②Parser 增 depth 字段,parse() 初始化 depth:0;③value() 入口检查 depth>=MAX_DEPTH 即返回 `Err("嵌套超深(>256 层)@<偏移>")`,出口 depth-=1(所有 Ok/Err 路径对称归还)。崩溃面转为解析失败面,调用方既有契约(job.rs:93「坏文件按错误返回」、deps_gate「spec 读不到→交给领取路径」)无需改动。修后锚点:hive/src/json.rs:123(MAX_DEPTH)/:147-157(value 深度计数)/:511/:518(守卫测试);rust/src/json.rs:109/:134-146/:402/:409。**256 而非 1024 的依据**:初版 1024 经端到端实测在主线程仍溢栈(debug 构建主线程栈预算下 768 层过、1024 层溢出,约 1KB/层),256 对实测上界留 ≥3× 余量且远超合法任务文件嵌套(≤10 层);注释同时警示 libtest 线程栈(8MiB)不代表生产主线程面。
59
+ - **攻防前后对比**:修复前(红,本轮复核会话实测):①守卫测试(10 万层 `[`)→ `thread … has overflowed its stack` + exit 0xc00000fd STATUS_STACK_OVERFLOW;②临时目录端到端(MAX_DEPTH=1024 初版二进制):投毒 claimed 任务 result.json 后 `hive poll` → 主线程栈溢出;`hive serve` 起跑 6 秒窗口内溢出崩溃;重启必复崩的持久 DoS 成立。修复后(MAX_DEPTH=256 重建,全在系统临时目录哑环境,测毕清理、测试 hive 进程按 PID 终止、在役 serve 未触碰):①`hive poll` exit=0,result 透出「result.json 解析失败: …嵌套超深(>256 层)@256」;②`hive serve --workers 1` 于投毒池(pending 深 spec + claimed 深 result)存活 6s,坏 spec 任务被领取路径判 state=error(error 文本含嵌套超深),无执行无崩;③反复重启均 ALIVE,四份日志 grep overflow 全 0——「重启必复崩」攻击链断裂;④主线程深度边界实测:256/512/768 过、1024/1536 溢出(定 256 的直接依据)。
60
+ - **守卫**:红转绿守卫 2 件×两 crate:`deep_nesting_beyond_limit_is_err_not_abort`(10 万层嵌套必须 Err 非 abort——修复前实测 0xc00000fd 红)+ `nesting_within_limit_parses`(上限内 64 层正常解析防误伤)。
61
+ - **红→绿(修复会话 + 本报告会话复跑)**:修复会话:红守卫 0xc00000fd → 绿 `cd hive && cargo test` lib 31/31(含守卫 2)+ 集成 9/9 + 6/6 = 46/46 exit 0;`cd rust && cargo test` 16/16 exit 0(MAX_DEPTH=256 终版后重跑)。**本报告会话复跑(第一手)**:`cd hive && cargo test` → 退出码 0,lib 33/33(含 N189 守卫 2 件与 N190 守卫 2 件)+ 集成 9/9 + judgment_surface 6/6 = 48/48;`cd rust && cargo test` → 16/16 退出码 0(第四节)。
62
+
63
+ ### 修复⑤ N190(high):spawn env 密钥扩散——serve 密钥三键默认剥离 + 编排身份令牌条件重注
64
+
65
+ - **where**:`hive/src/exec.rs:91-107`(修复前)spawn_executor 用 `Command::new` 继承 serve 全量 env(无 env_clear/env_remove,grep hive/src 零命中)仅追加 HIVE_RESULT_ANCHOR——锚密钥链首 `HIVE_ORCH_TOKEN`(keyres.rs:24;同时是 orch 身份令牌:orch.py:327 `_read_token`、:341 `load_principal` 据此认领 principal)、`HIVE_ORCH_TOKEN_FILE`、`HIVE_API_KEY` 三键随每个执行器子进程扩散并经执行器继续传给任意孙进程;`hive/exec.py:110-111` 书面边界明言「锚的秘密性归 serve 侧密钥,执行器侧无法也不必复算」——执行器恰是接触不可信 LLM 内容最多、最可能被注入的进程,拿到密钥即可对任意任务的 spec 字节+nonce(status.json 可读)自签合法锚,P11「不可伪造性」(keyres.rs:10-11)对最暴露进程失效,且可以 orch principal 身份调用编排面。**编号裁定**:原四区清单 rust 面暂编 N185——该号归 recent 面 N185(exec.py:1056-1064 全角 PII 残余,见 3.1-C),本报告重编为 **N190**。
66
+ - **攻击面**:被注入/被攻陷的执行器进程(或其派生的任意命令)读自身 env 即得三键:①对任意锚预期任务自签 result_anchor 使伪造产物判 done;②以 orch principal 身份调用编排面。
67
+ - **修复**(最小修,仅 exec.rs 主体 + keyres.rs 测试适配):①新增常量 `ORCH_SECRET_ENV_KEYS=[HIVE_ORCH_TOKEN, HIVE_ORCH_TOKEN_FILE, HIVE_API_KEY]`(exec.rs:85,与 keyres.rs::resolve_key_from_env 解析链同源);②spawn_executor 对每个执行器子进程先 env_remove 三键(:134-135,serve 密钥不随 spawn 扩散),再按 `spec_orchestrate(dir)` 真值(:92,对齐 exec_cmd.py:177 的 Python 真值:非空 Obj/Arr/Str/Bool(true)/Num(≠0);spec.json 不可读→false fail-closed——宁错杀不漏密钥)条件重注身份令牌两键(:137-144,orch.py load_principal fail-closed 必需);`HIVE_API_KEY` 永不重注(编排器不调 LLM API);HIVE_RESULT_ANCHOR 锚注入保持不变;③残余诚实边界写入 doc 注释:部署以 HIVE_ORCH_TOKEN 兼作锚密钥时编排器仍持同值令牌(Q3 身份面功能必需);④适配既有测试:keyres::tests::env_chain_priority 与新守卫同进程并行 set/remove 同批 HIVE_* 键发生竞态假红(实测撞 remove_var 窗口得 None),两处共享 pub(crate) ENV_TEST_LOCK 串行化(容忍 poison)。
68
+ - **攻防前后对比**:修复前(红):新增守卫跑 `cargo test env_secrets`(哑执行器 dump 自身 HIVE_* env)→ 两件全 FAILED,dump 实锤三键同时到达执行器子进程(HIVE_ORCH_TOKEN / HIVE_ORCH_TOKEN_FILE / HIVE_API_KEY 三值均为 DUMMY 前缀哑字面量,+HIVE_RESULT_ANCHOR)。修复后:①守卫 2/2 绿;②端到端(临时池+DUMMY 前缀哑令牌/哑密钥/哑令牌文件路径,测毕临时目录 0 残留、serve 进程按 _serve.json pid 精确清理、未触在役):真实 serve(HIVE_EXEC_PY=dump 执行器)领取 pending 任务正常执行至 state=done,dump 落盘执行器实际收到的 HIVE_* env 仅 HIVE_EXEC_PY/HIVE_JOBS_DIR/HIVE_PYTHON——**leaked keys: NONE**;执行器被攻陷/被注入后读自身 env 无锚密钥可自签、无身份令牌可冒 orch principal(编排任务除外——按 spec.orchestrate 显式授权注入身份令牌,属 Q3 fail-closed 设计必需面)。
69
+ - **守卫**:红转绿守卫 2 件(exec.rs:237/:267):`env_secrets_stripped_from_plain_executor`(普通任务三键必须全部剥离且 HIVE_RESULT_ANCHOR 注入不受影响)+ `orchestrate_executor_gets_identity_token_not_api_key`(orchestrate 真值任务身份令牌两键条件注入、HIVE_API_KEY 永不注入)。配套 EnvGuard 测毕恢复进程 env + 共享互斥锁串行化(防 env 竞态假红)。
70
+ - **红→绿(修复会话 + 本报告会话复跑)**:修复会话:红 2 failed → 绿 `cd hive && cargo test` 48/48 exit 0;竞态稳定性连跑 3 次 33/33 全绿×3;rust/src grep Command::new/env_remove 零命中确认无同类面。**本报告会话复跑(第一手)**:hive cargo test 48/48 退出码 0(第四节)。**残留注记**:exec.rs 守卫夹具哑值命名残留「DUMMY-N185-*」字样(hive/src/exec.rs:207-209/:250/:258/:280,TOKEN/NOT-A-FILE/APIKEY 等哑值)及注释「N185」(:84/:110/:133/:169/:231/:262)——按本报告裁定应读作 N190,纯夹具字符串/注释不影响断言语义,建议编排会话提交时顺手归一或随低危批次(见 3.0-③)。
71
+
72
+ ---
73
+
74
+ ## 三、发现明细
75
+
76
+ ### 3.0 编号裁定(本轮)
77
+
78
+ 1. **基线核对(本报告会话第一手)**:扫描 docs/eval 缺陷挖掘系列全部 21 件,`N\d{2,3}` 全局最大 **N182**(v21 用至 N182),N183–N195 报告面全空闲——新发现自 N183 续编成立(与四区清单 legacy 合并条目内附测「max=N182」一致)。
79
+ 2. **双面撞号消歧**:四区清单 hive 面(recent)与 rust 面各自自 N183 起暂编,致 N183–N187 双条同号。裁定:**N183 非冲突**——hive/orch.py:683 与 hive/src/scheduler.rs:724 为同一缺陷(P11 锚绑定现盘字节)的两个观察面,单号单缺陷,双面证据合并(3.1-A);**N184–N187 为真撞号**(两两不同缺陷)。N184 已被 `md_cg/test_n184_keys_concurrent_provision.py` 守卫文件名实占(crypto 修复会话先落码且经 grep 核对空闲),维持 N184=crypto 条;N185–N187 维持 recent 面指派(exec.py 三条,纯报告面无码占)。rust 面四条重编:json.rs:133→**N189**、exec.rs:91-107→**N190**、scheduler.rs:236→**N191**、main.rs:440→**N192**(rust 面 main.rs:509 的 **N188** 全库唯一,维持)。orch 面 2 条新编:wm.py:159→**N193**、serve_start.py:246→**N194**。分诊声明原建议「rust 面次轮自 N189 续编消歧」——本报告即本轮落地消歧(rust 面实际自 N189 起编),因 orch 面同轮尚有 2 条需编,**次轮全局自 N195 续编**。
80
+ 3. **源码树残留注记(如实声明,未代改)**:json.rs 修复会话与 crypto 修复会话并行、各自 grep 选号、双双取 N184(两会话 grep 时点各自真实无占用,属并行时序撞号,非任何一方过错)——`hive/src/json.rs:114/:128/:149/:505/:516` 与 `rust/src/json.rs:91/:105/:114/:135/:398/:407` 注释「N184」按本裁定应读作 N189;`hive/src/exec.rs:84/:110/:133/:169/:231/:262` 注释及 `:207-209/:250/:258/:280` 夹具哑值「DUMMY-N185-*」、`hive/src/keyres.rs` 注释按本裁定应读作 N190。均为纯注释/夹具字符串,不影响断言语义;建议编排会话提交时顺手归一,或随低危批次。crypto.py 侧 N184 注释与本裁定一致,无需动。
81
+ 4. **legacy 编号沿革裁定(沿材料,理由实证)**:exec_cmd.py 条目双条 N141/N144 取 **N144**(N141 现行注册属批次 49 凭据漏检缺陷:exec.py:1002/:1025 + test_sensitive_read_names.py;v17 曾以 N141 暂编本条目,属编号复用);orch.py:477 条目双条 N142/N145 取 **N145**(N142 现行注册属批次 49 orch children/spec 原子写:orch.py:271-313 + test_orch.py:471-566)。v21-R1(_package_version 异常网)为 v21 报告内行编号非 N 系注册号,若需入 N 系随下轮自 N195 顺延。
82
+
83
+ ### 3.1 新发现确认(12 项,N183–N194)
84
+
85
+ #### A. N183(high,留档·大设计决策):P11 结果完整性锚与编排器 spec 写回时序冲突 + 锚绑定现盘字节使排队窗篡改逃逸
86
+
87
+ - **where**:`hive/orch.py:683` × `hive/src/scheduler.rs:603-611`(verify 面)/ `scheduler.rs:724-733`(spawn 面)。〔原四区清单 hive 面与 rust 面各暂编 N183,经裁定确认为同缺陷双观察面,单号合并〕
88
+ - **缺陷面(双后果)**:spawn 期按当时 spec.json **现盘字节**算锚注入 env(scheduler.rs:415/:724-733,:731 读现盘字节),orch.py 启动后 merge_tools/补 system_prompt/max_tool_rounds 并原子写回 spec.json(orch.py:668-683),终态 verify_result_anchor 重读改写后的 spec 字节复算 HMAC(scheduler.rs:603-606)恒失配。①(高)凡锚启用部署(锚密钥解析首位=HIVE_ORCH_TOKEN/FILE,keyres.rs:17-36,与 orch.py:326-369 编排必需令牌同源)每个正常完成的 orchestrate=true 任务被系统性判 error「伪锚/挪锚/提交后 spec 被改」,deps_gate(scheduler.rs:689-691)再对下游 DAG 失败传播,且标准部署无任何配置可绕——「伪锚」告警常态化使篡改审计面失真(真伪造与正常编排不可区分);②(中)锚绑定的是 spawn/verify 时刻现盘字节而非**提交时刻字节**,submit→spawn 窗口内改写 spec.json 后两锚必然一致——与 hmac.rs:13「提交后 spec 被篡改→锚失配」及 scheduler.rs:549 失配文案的书面契约直接矛盾;content_hash 承诺(main.rs:299-333)运行时零复核(grep 证实 content_hash 仅存在于 main.rs submit 计算落盘与 find_active_by_hash 去重,scheduler.rs/job.rs 零命中);pending 任务无 TTL,窗口无时限。
89
+ - **证据(复核会话双面实测,哑值+临时目录,测毕杀 serve 进程树并清理)**:e2e(release hive.exe submit+serve、真 exec_cmd.py 转发、真 orch.py、临时令牌文件、哑 LLM 网关 127.0.0.1 随机端口、临时 jobs 目录):orchestrate 任务 status=error「完整性锚校验失败:result_anchor 与提交预期不匹配(伪锚/挪锚/提交后 spec 被改)——拒绝采信(P11 批次53)」,而其 result.json 本体 ok=true、content=stub-final-answer、result_anchor 回写在位;spec.json 101→2124 字节、新增 tools/system_prompt/max_tool_rounds 键;同 spec 去 orchestrate 的对照任务=done 且 spec 字节未变(71 字节)——差异变量唯一为 spec 字节被改写。havoc(哑令牌〔DUMMY 前缀临时值〕,测试二进制=当前 HEAD 源码重建至临时 target-dir):submit 锚预期任务(响应 result_anchor=on、content_hash 回执在案)→ pending 期间改写 spec.json user_prompt=BENIGN-ORIGINAL→ATTACKER-TAMPERED-CMD → 契约合规执行器(按 exec.py:134-136 契约透传 HIVE_RESULT_ANCHOR)执行 → `state=done | conflict=None | result.ok=True | content=EXECUTED_PROMPT=ATTACKER-TAMPERED-CMD`,result_anchor 在产物中且校验通过——篡改载荷被执行并以原任务身份背书为 done。
90
+ - **诚实边界**:后果①仅「提交面进程解析不到锚密钥」(result_anchor=off 旧格式提交)的非标准部署可绕;后果②攻击不需要密钥(能写 jobs 池的组件即达,恰是 P11 锚针对的同一盘面写者信任边界)。
91
+ - **处置**:留档·大设计决策(分诊④)——修复须裁决锚绑定字节口径的拦截策略:锚应绑提交期字节还是容忍编排期合法改写、以何口径豁免 tools/system_prompt/max_tool_rounds、content_hash 运行时复核策略、跨语言文件协议是否引入派生 spec 文件(处置建议见第五节)。
92
+
93
+ #### B. N184(high,已修=修复①):`_keys.json` 并发 provision 丢失更新
94
+
95
+ `md_cg/crypto.py:299-329`(provision_dek 读快照→AEAD 签发→整份写回,全程无锁)× `:287-290`(_save_keys 无写前对账);触发面 `hive/exec.py:845` 每次工具调用新建 MdCGSecure→`_init_crypto`→provision_dek(mdcos.py:3694-3696)。动态交错复现成立(哑 KEK+临时图根,测毕清理零用户密钥目录触碰):t0 worker 空快照 → t1 设计者 provision+密封 private 节点成功且可解 → t2 worker 按 t0 陈旧快照写回后 designer 信封无痕抹除 → t3 设计者重进 crypto_status unlocked=True error=None(无告警静默重签)→ t4 已密封节点 _open_content 返回 None(mdcos.py:3777-3782,永久静默丢失)。详见修复①。
96
+
97
+ #### C. N185(low,留档):N174 lookaround 修复的全角漏报残余
98
+
99
+ `hive/exec.py:1056-1064`——四类文本模式的数字/字母字面类仍纯 ASCII(手机号字面 1[3-9]、身份证 (?:19|20)、[A-Za-z0-9] 邮箱类),全角数字/全角@形态全文漏脱敏;且 `\d` 为 Unicode 感知造成边界不一致。实测(哑数据;样本字面量按隐私卫生转写为类目描述,第六节-7):四类全角/混合形态样本——全角数字 11 位手机号、「全角首位+半角延续」混合手机号、全角数字 18 位身份证号(末位 X)、全角@邮箱——均原样返回(漏);半角对照三组——裸半角 11 位手机号、全角括号包裹的半角手机号、「半角前段+全角收尾」混合手机号——均命中替换为[已脱敏:手机号];边界不一致坐实:**半角起始+全角收尾命中,而全角起始+半角延续漏**(`\d` Unicode 感知所致)。守卫盲区核对:hive/test_exec_tools.py F11 系列(521-544 行)无任何全角数字/@样本(仅 528 行「全角括号」且括号内为 ASCII 数字)。攻击面:含全角书写 PII 的文件经 worker read_file/context_files/system_prompt_from 通道读入即随请求体外发外部网关不脱敏。
100
+
101
+ #### D. N186(low,留档):system_prompt_from 真源全量读无大小上限
102
+
103
+ `hive/exec.py:387-397`——真源 `f.read()` 全量读入无上限(:387-388),对照 context_files 文本分支有 CONTEXT_TEXT_MAX=256KB 截断(:439-444);且 main 的 context_budget_tokens 预算闸(:1652-1664)在 build_messages 全量读取(:1649)之后才判,拦不住读取峰值;单 spec 即可令 worker 进程内存膨胀,HIVE_WORKERS 上限 64(scheduler.rs:93)并发放大。实测(临时 64MB 真源,哑数据):resolve_system_prompt 返回 67,108,864 字符、tracemalloc 峰值 128.0MB、耗时 1.70s(含五遍 PII 正则全量扫描在内);同文件走 _context_block 通道仅呈现 262,219 字符(256KB 上限+标注壳)。攻击面:任何可提交 spec 的主体(jobs 池写权)将 system_prompt_from 指向读取范围内大文件(或先行自造大文件)提交,多个此类任务并发即内存/CPU 拒绝服务面。
104
+
105
+ #### E. N187(low,留档):非 UTF-8 真源退出码契约违反
106
+
107
+ `hive/exec.py:386-392`——读取仅 `except OSError` 归一为 SpecError(:389),非 UTF-8 真源抛出的 UnicodeDecodeError(ValueError 族)裸逃出 resolve_system_prompt,由 main 顶层 except Exception(:1750-1761)兜底判 EXIT_API(退出码 3)——违反本执行器头注契约「退出码 2 规格错 / 3 API 错误」(exec.py:15),规格错被记成 API 错误,影响错误归因/重试语义(rust 产物判据仍记 error 不丢终态)。实测两段:①直接调用 resolve_system_prompt 指向 GBK 编码真源 → 抛 UnicodeDecodeError('utf-8' codec can't decode byte 0xb2 in position 0: invalid start byte),isinstance OSError=False 未被捕获;②真实进程实跑 `python hive/exec.py <临时job目录>`(spec.model=glm-* 过 model↔base 配对闸、HIVE_API_KEY=哑值、GBK 真源+spec 均在临时目录):exit=3、result.error=UnicodeDecodeError…——按契约应为 2(首测用 stub-model 因 exec.py:1641-1648 配对闸先行拦截未达读取面,已换 glm-* 复测到位)。攻击面:提交带非 UTF-8 编码 system_prompt_from 文件的 spec 即触发(GBK 编码的部署纪律文件是现实形态)。
108
+
109
+ #### F. N188(low,留档):cmd_kill 对终态任务假回执
110
+
111
+ `hive/src/main.rs:489-524`——cmd_kill 无任何状态检查,对已 done/error/timeout/killed 的任务仍写 kill 标志并返回 ok:true + hint「worker 检测到 kill 标志后强杀(≤1s)」(:515)——该强杀永远不会发生(run_job 已退出、kill 标志无人消费),回执为假;kill 标志文件永久残留任务目录。依赖 kill 回执做编排决策的宿主会误信任务被强杀。实测(临时目录,测毕清理):对 done 任务 `hive kill <id>` → `{"ok":true,...,"hint":"worker 检测到 kill 标志后强杀(≤1s)"}` EXIT=0,kill 标志残留=True,随后 poll 确认 state 仍为 done(读码 main.rs:489-524 无终态检查一致)。
112
+
113
+ #### G. N189(high,已修=修复④):零依赖 JSON 解析器深嵌套栈溢出(重编自 rust 面暂编 N184)
114
+
115
+ `hive/src/json.rs:133`(value↔object/array 互递归无深度计数)+ 同源复制件 `rust/src/json.rs:123`;文件协议全 JSON 底座(scheduler.rs:516/:658、main.rs:376、job.rs:93)。实测:`hive poll` 10 万层 result → exit=3221225725(0xC00000FD STATUS_STACK_OVERFLOW)+ `thread 'main' has overflowed its stack`;投毒 pending 任务起 serve → 0.0s 即崩(崩点主循环 deps_gate,状态停留 pending),重启 → 0.2s 再崩——重启必复崩持久 DoS。详见修复④。
116
+
117
+ #### H. N190(high,已修=修复⑤):spawn env 密钥扩散(重编自 rust 面暂编 N185)
118
+
119
+ `hive/src/exec.rs:91-107`(修复前)Command::new 继承 serve 全量 env 仅追加 HIVE_RESULT_ANCHOR(无 env_remove/env_clear,grep hive/src 零命中)——HIVE_ORCH_TOKEN(keyres.rs:24 链首 + orch.py:327/:341 身份令牌)、HIVE_ORCH_TOKEN_FILE、HIVE_API_KEY 三键随执行器扩散并可经 spec.env 传孙进程;exec.py:110-111 书面边界被 env 继承打破。实测:哑执行器 dump 自身 env → 三键同时到达执行器子进程(值均为 DUMMY 前缀哑字面量)。详见修复⑤。
120
+
121
+ #### I. N191(medium,留档·次轮首补候选):claim 与 patch_status 间崩溃窗口致任务永久卡死(重编自 rust 面暂编 N186)
122
+
123
+ `hive/src/scheduler.rs:236-242`——原子领取 claim()(:236)与 patch_status("claimed")(:239-242,失败被 `let _` 静默忽略)之间存在崩溃/失败窗口:留下 state=pending + claimed.lock 残留组合态,而 recover_orphans 仅 match claimed/running 两态(:279/:317,pending+锁残留落入 `_ => {}`),主循环对 pending 任务每拍 claim() 失败即 continue(:236-237)——任务永久卡死 pending,其下游经 deps_gate 永久 Ok(false) 等待,无任何自动恢复。攻击面:serve 被 kill -9/断电恰好落在 claim 与状态改写之间(窗口含 read_status+tmp/fsync/rename 全链),或 status.json 瞬时不可写致 patch_status 出错被忽略;重启后任务永不可领取,操作面只见一个永远 pending 的任务(doctor 只报计数),其全部下游连带悬置。实测(临时目录,测毕清理):构造 pending+claimed.lock 残留任务与正常对照任务同池,serve 跑满 20s(poll_ms=400 约 50 拍)→ t+0s 至 t+18s 十次采样 `stuck=pending` 恒不变、`control=done` 正常完成,claimed.lock 残留=True——代码路径与实测一致。**处置**:修复面明确(recover_orphans 补 pending+claimed.lock 残留分支→删锁重投,与 claimed 态同法),cargo test 可守卫;本轮 5 修席位按 ①high→②留档欠账→③低风险 排满,此为次轮首补候选。
124
+
125
+ #### J. N192(low,留档):done+ok=false 反向矛盾不置位,两套成败语义分叉(重编自 rust 面暂编 N187)
126
+
127
+ `hive/src/main.rs:434-446`——R02 矛盾裁决只枚举 error+ok=true 单向组合,反向矛盾 done+ok=false 不置位:classify_result 采信 done 仅凭 result.json 无 error 字段(scheduler.rs:516-524,完全不看 ok 字段),违约/旧格式执行器写 `{"ok":false}`(无 error 字段)即得 state=done——观测面无 conflict 提示,deps_gate(scheduler.rs:686 `"done" => continue`)按 done 放行下游,而 wm.py 凭证闸(wm.py:127-130)按 result.ok is not True 拒绝——同一产物两套成败语义分叉,DAG 面在失败上游上继续构建。攻击面:自定义/旧格式执行器(HIVE_EXEC_PY 为受支持扩展点)写 ok=false 无 error 字段的产物。实测(legacy 无 nonce 提交,哑令牌,临时目录测毕清理):上游执行器写 `{"ok":false,"content":"upstream-failed-silently"}` → `up: state=done | conflict=None | result.ok=False`;下游 depends_on=[up] → `down: state=done | content=downstream-executed:x`——deps_gate 放行并执行成功。附加观察:同形态若为锚预期任务且执行器不回写锚,P11 先拦成 needs_review——缺口主面是旧格式任务与「回写锚但 ok=false」形态。
128
+
129
+ #### K. N193(low,留档):wm snapshot 盘符相对形态 job_id 路径逃逸
130
+
131
+ `hive/wm.py:159`——cmd_snapshot 的 job_id 校验只拒 `. .. / \`,不拦无分隔符盘符相对形态(如 `盘符:名字`)——os.path.join 跨盘符整段重置,dest 完全脱离 wm 根,:181-182 的 rmtree(及 :231 失败清理同路径)会删除该解析点同名目录,staging 也写到 wm 仓外。实测(系统临时区 + 临时 git 仓,测毕清理 CLEANED:True):`rejected('盘符C:important 形态')=False`(wm.py:159 判据,样例写作「C 冒号紧跟 important」的盘符相对形态);join(临时探测根,"jobs",该形态) → 整段重置为该形态串本身(abspath 落进程 cwd 侧,under_wm=False,后续无任何回拉检查);同盘符对照(探测根同为该盘符的 `盘符:evil` 形态)不重置(同盘符形态无害)。执行 :181-182 确切两行 → 预置 decoy 目录及用户文件被删;端到端真实 wm.cmd_snapshot:预置于逃逸路径的文件快照后消失(staging rmtree 先毁),快照随后在 git checkout -B 处失败(fatal: 'task/盘符形态' is not a valid branch name),wm 仓内无 jobs/ staging。可达性边界:wm.py:158 契约读 result.job_id、:162 自宣称产物不可信;在仓执行器默认不写该字段进 result.json——可达性限于产物面被污染/手构目录。守卫缺口:hive/test_wm_traversal.py G3(:122) 仅覆盖带分隔符盘符形态(已拒)、Z3(:145-152) 覆盖 ../../victim,无分隔符盘符形态零覆盖。
132
+
133
+ #### L. N194(low,留档):serve start 判死→拉起无跨进程互斥,双 serve 抢同一池
134
+
135
+ `hive/serve_start.py:246`——start() 的 serve_alive 判死(:246)与 Popen 拉起(:263-267)之间无跨进程互斥,Popen 后另有最长 10s 心跳等待窗(:271-278)——两调用方并发 start 同一 jobs 池双双通过判死、双双 Popen:双 serve 抢同一池、_serve.json 心跳互覆、--stop/观测面只盯后写者 pid。调用方面:①MCP `_ensure_serve`(hive/hive_mcp/mcp_server.py:206-243 直接调 serve_start.start,无锁)与 CLI 并发;②两 MCP 宿主共享池同时 spawn(读码推及,未单独复现);③restart 的 stop→start 空窗(:306-310,无锁)被 _ensure_serve 插队(读码推及,未单独复现)——无需攻击者,运维并发即触发。实测(临时池 + 假 EXE .cmd 包装:睡 ~3s 写完整心跳后再活 12s 供核验,HIVE_EXE/HIVE_JOBS_DIR/HIVE_CONFIG 指临时区,屏障双进程同时进 start();测毕按精确 pid taskkill+删临时区,tasklist 复核无残留):spawn.log 两条 spawn 同秒(相差 0.01s)——双 Popen 成立;两假实例 pid 经 tasklist 精确比对同时存活(实例数=2);两调用方均通过 :246 判死(返回均非『已在运行』)且均返回『serve 心跳未出现』(假心跳 pid 映像名不匹配 pid_is_self_program,:152-175);_serve.json 仅存后写者 pid(心跳互覆)。危害边界属实:job.rs:12/:24 claimed.lock create_new(true) 原子领取防同 job 重复执行;job.rs:75 rust 侧自证多 serve 竞争属预期威胁模型(_serve.json 写 tmp 带 pid),唯 spawn 面无防。守卫缺口:hive/test_serve_entry.py:10-11 仅双实例注释,⑧(:253) 单调用方假 Popen,无并发 start 用例。
136
+
137
+ ### 3.2 legacy 复核确认(9 项独立缺陷;复测轮数按缺陷号在历轮报告文件现身 grep 计,本会话实跑——早期轮或以文字描述指涉未带号,计数为下限)
138
+
139
+ | # | 编号 | where | severity | 原轮次 → 复测轮数 | 现状与本轮复核 |
140
+ |---|---|---|---|---|---|
141
+ | L1 | **N144** | hive/exec_cmd.py:40-53(固定共享 tmp+裸 replace 无重试)× :55-70(_fail 无成功终态回看)× :269-272(兜底复用坏路径) | medium | v17(暂编 N141/重编 N144)→ 本轮第 2 轮 | **本轮落闸=修复②**。欠账实证:git log -S mkstemp/-S write_error_result -- hive/exec_cmd.py 均空(N82 修复 commit 1d022a6b 只落 exec.py),末触批次 53(be88744c);hive/test_exec_cmd.py 现有套件(108 行)不覆盖此面 |
142
+ | L2 | **N145** | hive/orch.py:477(_spawn 唯一池源 _hm._jobs_dir(),:662 _CFG 同源)× hive/src/exec.rs:91-107(Command 继承 serve env 仅注入 HIVE_RESULT_ANCHOR) | medium | v17(暂编 N142/重编 N145)→ 本轮第 2 轮 | **本轮落闸=修复③**。独立子进程模拟 orch.py:477 解析(env 弹键+空临时 config 经 HIVE_CONFIG 指定防触仓内真实 config):解析回落仓内默认池 ≠ 临时池 X,DIVERGED=True;对照组(env 设键)WITH_ENV_CONSISTENT=True(N89 修复面一致) |
143
+ | L3 | **N68** | hive/exec.py:814(lingshu_cg 认知图根 env 优先后 spec.mdcg_root 兜底,:845 无 realpath/read_roots 闸直接 new MdCGSecure) | medium | v8 → v10/v15/v17/v21 → 本轮第 6 轮 | 维持留档·大设计决策。攻击面较 v8 扩大:mcp_server.py:406 SPAWN_ALLOWED_KEYS 显式收录/:456-457 原样复制/:638 schema 直宣、orch.py:461-464 白名单同含、exec.py:1588 全量透传——v8「schema 未声明降低常态可达性」缓解已不成立。临时哑根复现:tool_lingshu_cg write ok=True,目录被创建全套结构(_keys.json/anchor/contextual/goals/hippocampus/knowledge/rejected/self/structural/trash/unresolved),测毕清理 |
144
+ | L4 | **N90** | hive/hive_mcp/mcp_server.py:381-394(_result_view 顶层非 dict 照旧 r.get、:385 content 非 str len() TypeError)+ _t_poll :496-507/_t_doctor :537-538 无条目级 try/except | low | v10 → v17 → 本轮第 3 轮 | 维持留档。:381-382 注释自认「与旧逐次解析口径一致」=明知未修。临时池复现(哑三 job):hive_poll 无参列表 → TypeError: object of type 'int' has no len();hive_doctor → AttributeError: 'list' object has no attribute 'get';单查病态2(head=None 面)反而 ok=True content=5——崩点确证在 :385 len 仅 head 非 None 时触发 |
145
+ | L5 | **N91** | hive/serve_start.py:62-75(resolve() str 直值空串/纯空白原样返回 vs {"env":...} 形态 or None——同函数两形态防护不对称)+ :91-95(只判 val is None)+ :240(merged 使 config 空串覆盖宿主真实值) | low | v10 → v17 → 本轮第 3 轮 | 维持留档。实测:resolve('')→''、resolve(' ')→' '(原样放行);load_config({HIVE_API_KEY:"",HIVE_API_BASE:" "})→err=None 且两键全进 env;宿主预置同名假密钥 env(sk 前缀哑样例值)被空串覆盖=True;下游链 exec.py:1329-1331(api_key 假值即 RuntimeError「HIVE_API_KEY 未设置」)闭链——每个任务烧一次完整调度后才落 error |
146
+ | L6a | **N177** | hive/exec.py:1020-1032(_sensitive_read 后缀族 endswith 只匹配末段、名字族 startswith/子串只匹配前中缀) | low | v21 → 本轮第 2 轮 | 维持留档。实测:'token.txt'→None、'db.kdbx.bak2'→None、'notes.txt:secret'(NTFS ADS)→None,对照 'id_rsa'/'prod.env' 命中——知晓部署侧命名的攻击者改名/加尾缀/挂 ADS 即免检外发网关 |
147
+ | L6b | **v21-R1** | hive/hive_mcp/mcp_server.py:48-54(_package_version except 只捕 (OSError,ValueError),:58 import 时求值 SERVER_VERSION) | low | v21(报告内 R1 行编号;md_cg 同构 :47-53)→ 本轮第 2 轮 | 维持留档(v21:176 判速收候选)。实测:package.json 合法 JSON 顶层非对象 [1,2]→AttributeError 逃逸(import 即崩,违背 :46-47「回落保底不阻塞启动」契约);version=123→int 原样返回;合法→'9.9.9';真实导入 SERVER_VERSION='0.6.0' |
148
+ | L6c | **N178** | md_cg/units.py:336(poll 的 job_id 无白名单直接 os.path.join(jobs_dir(jobs), str(job_id or "")),../ 穿越 + jobs 参数透传) | low | v21 → 本轮第 2 轮 | 维持留档。第一手哑环境复现:units.poll('../victim', jobs=临时池) → state=done terminal=True content=预置标记串(池外正文被原样读出)——../ 穿越坐实 |
149
+ | L7 | **A1-e** | hive/exec.py:963-979(read_roots() 空串/纯分隔=读全放开,docstring 文档化「未设置=放开」语义) | low | 对抗报告 A1-e 编号(v0.6.0 实测报告,不在本系列);v21 L5 留档口径 → 本轮第 2 轮 | 维持留档(v21 L5 设计裁定):实测空串/纯分隔均读全放开且无告警——部署收窄面误设空串时静默失效的 fail-open 形态(文档化语义,无实证越权),低危加固候选(显式空值告警) |
150
+
151
+ **并入 L7 条目的 3 条闭合复测记录**:①**N89** jobs 池双源分叉——已修(v17 批次 49:_jobs_dir() 单点走 serve_start._jobs_from 与 start() 同决策函数);本轮独立进程实测 config 设 HIVE_JOBS_DIR=临时 poolC → MCP_VIEW=SERVE_MERGED_VIEW=poolC,CONSISTENT=True(v10/v15/v17 → 本轮第 4 轮记录)。②**对抗 A1-a** read_roots 单串逐字符拆分——已修(批次 42/第 10 轮 exec.py:1092-1094 归一在位);本轮实测 `_worker_scope(None,{"read_roots":单串目录})=(realpath(目录),)` 恰含该目录本身(v20 报告面现身)。③**对抗 A6-b** test_cmd cwd 可控——不成立核销维持(v21 同结论):audit.py:171-176 只读 env MDCG_CODE_TEST_CMD(payload.test_cmd 仅存 :151/:155 陈旧 docstring,代码不消费),writepipe.py:131-135 ctx={cg,a,nid,verdict,cvd} 无 cwd 键(v21 → 本轮第 2 轮记录)。附守卫复跑:test_sensitive_read_names 16 pass/0 fail、test_exec_tools 104 通过/0 失败。
152
+
153
+ ### 3.3 证伪·剔除(3 项)
154
+
155
+ 1. **hive/orch.py:359 × hive/exec.py:840-842**(N62 蜂巢面次生缺口候选)——**复核不成立**。读码核实:tokens.py:438-440 租户 fail-closed 闸条件为 `_arg_tenant and _rec_tenant and _arg_tenant != _rec_tenant`,orch.py:359 `verify_token(tok)` 单参调用使 _arg_tenant 恒空(闸结构性不可达);worker 默认身份由 exec.py:840-842 直接构造 Principal(tenant 缺省 default、auth_mode=hive-exec),根本不经过令牌面。N62 fail-closed 对蜂巢 worker/编排者均无任务级或进程级失败模式变化,也未打开旁路(两者本就不过该闸)。**负向结论以读码为判据,未运行动态用例(如实声明)**。
156
+ 2. **hive/exec.py:369-397**(Windows 路径伪装对 N173 三闸绕过候选)——**复核不成立**。实测(临时目录哑 id_rsa 文件):os.path.realpath 对 'id_rsa.'/'id_rsa '/'id_rsa. . .'/'id_rsa .' 四种伪装全部规范化为真实名 id_rsa 且 _sensitive_read 命中「敏感凭据文件(id_rsa)」;读码 exec.py:369-385 三闸次序 realpath→HIVE_READ_ROOTS 白名单→_sensitive_read→open(real) 全 fail-closed;job.rs:98-117 nonce 为任务内唯一(毫秒时钟+pid+进程内计数器+栈地址 FNV-1a),HMAC 绑定 spec 字节使跨任务挪锚/改 spec 均 Mismatch(fail-closed),秘密性归锚密钥、nonce 公开不构成可利用形态。
157
+ 3. **hive/src/scheduler.rs:317**(recover_orphans 与存活孤儿执行器的 result.json 撕裂读竞态候选)——**复核不成立**。①exec.py:104-167 write_result 为 mkstemp 唯一临时名+flush+fsync+os.replace 原子替换(N6/N82 修复在位:PermissionError 10ms×递增重试至多 50 次、FileNotFoundError 重建唯一名重试、finally 清 tmp),读者只见旧内容或完整新内容;②生产路径 unwrap/expect 分布干净——grep unwrap()/expect(/panic! 并按 #[cfg(test)] 行号切分 hive/src 七文件:非测试命中仅 scheduler.rs:174(jobs 目录不可建启动期 expect,fail-fast 无数据风险)与 :184(worker 锁中毒守卫;锁仅护 recv(),recv 不 panic,中毒不可达)两处,其余 102 处命中全在测试段;timeout_s 经 spec.rs:148-152 夹紧 5..=3600,run_job 用 Instant 计时(scheduler.rs:437-462)无溢出面。附注:heartbeat 的 u128 减法(job.rs:208)仅在系统时钟回拨病态场景受影响且 release 语义回绕不中止进程,非安全面。
158
+
159
+ ---
160
+
161
+ ## 四、验证(门禁)
162
+
163
+ **本报告会话第一手实跑**(当前工作区 = HEAD 977a710f + 本轮 5 修未提交 + 本报告):
164
+
165
+ 1. **编号基线**:python 扫描 docs/eval 缺陷挖掘系列 21 件 `N\d{2,3}` → GLOBAL_MAX **N182**;N183–N195 报告面全空闲。源码树扫描(排除 .git/node_modules/target/docs 等)→ **N183 树内零占**;N144/N145/N184/N185 树内占位及撞号详情见 3.0-③。
166
+ 2. **新守卫复跑(3/3 绿)**:`python -X utf8 -m md_cg.test_n184_keys_concurrent_provision` → **ALL OK 16 项 EXIT=0**;`python -X utf8 hive/test_n144_exec_cmd_terminal_race.py` → **RESULT: ALL_PASS EXIT=0**;`python -X utf8 hive/test_n145_orch_pool_derive.py` → **RESULT: ALL_PASS EXIT=0**。
167
+ 3. **python 全量回归**:`python -X utf8 -m md_cg.run_tests` → **SUMMARY 228/228 通过,3 跳过(依赖缺失/平台不符),退出码 0**(三件新守卫均在套件内 PASS;226→227→228 与三项修复落码顺序一致)。
168
+ 4. **cargo**:`cd hive && cargo test` → 退出码 0,**lib 33/33**(含 N189 守卫 2 件 + N190 守卫 2 件)+ 集成 9/9 + judgment_surface 6/6 = **48/48**;`cd rust && cargo test` → **16/16** 退出码 0。
169
+ 5. **npm run gate(对落盘报告实跑归因)**:**内容面三项全 PASS,唯一 FAIL 为非追踪件面**——check_unreachable PASS(439 文件命中 0);check_publish_artifact **R1 凭据/密钥面 PASS(文件面=0 内容面=0)、R2 私有数据面 PASS、R3 隐私文本 PASS——本报告内容零命中**;**R4 非追踪件面 FAIL 命中=2(非追踪=30,允许=28)→ `docs/eval/缺陷挖掘_自主迭代_v22.md`(本报告)与 `md_cg/test_n184_keys_concurrent_provision.py`(修复①新守卫)**——两者均为发布清单内未追踪新件(R4 判据「包内非追踪件仅允许 lib/」,check_publish_artifact.py:15 ALLOW_NONTRACKED/:438-442);检查链经 `&&` 短路,cogmap_sync/link_check/workspace_index/verify_discipline 未及执行。VERDICT=FAIL。**处置:非内容缺陷——报告与守卫随编排会话入库提交后 R4 即转绿(v21 同因先例:新守卫未提交致 R4 红,提交后转绿)**。报告内容面已按隐私卫生加固:PII 样例与哑凭据字面量转写为类目描述(第六节-7),不因随包发布携带可误认的凭据/PII 形态串。
170
+
171
+ **编排会话门禁(材料给定口径)**:python 全量回归通过(退出码 0);cargo 通过(退出码 0);npm run gate 失败;四区确认 21 个、修复 5 项、留档 15 项——与本会话第一手复验一致(gate 失败面归因见上)。
172
+
173
+ **修复侧红绿双态**:git stash 双态机械证据为修复会话第一手实测(材料附命令与输出,见第二节各条);本报告未重复 stash 操作(避免扰动并行会话工作区),绿态已由上述第 2/3/4 项独立复跑佐证。
174
+
175
+ ---
176
+
177
+ ## 五、遗留清单(16 项在档缺陷 + 2 项流程/残留)
178
+
179
+ | # | 编号 | where | sev | 处置去向与建议 |
180
+ |---|---|---|---|---|
181
+ | 1 | **N183** | orch.py:683 × scheduler.rs:724/:603-606 | high | **大设计决策专项**:锚绑定字节口径(提交期 vs 容忍编排期改写)、tools/system_prompt/max_tool_rounds 豁免口径、content_hash 运行时复核策略、跨语言文件协议是否引入派生 spec 文件——四问须一并裁决(与 scheduler.rs:724 同族同裁)。报告员建议方向(供裁决参考,非结论):锚改绑**提交期**字节基准(submit 时随任务落盘锚基准文件或哈希),编排期合法改写走**显式重锚链**(留痕改写者与前后哈希,改写后锚对重锚者重签);content_hash 移至领取时复核补上第二道。裁决前 honest 事实:后果①(正常编排系统性误判 error+审计面失真)与后果②(pending 窗篡改逃逸、无 TTL)并存,标准部署双面无配置可绕 |
182
+ | 2 | **N191** | scheduler.rs:236-242/:279/:317 | medium | **次轮首补候选**(本轮席位排满落选):recover_orphans 补 pending+claimed.lock 残留分支→删锁重投(与 claimed 态同法),cargo test 可守卫,修复面明确低风险 |
183
+ | 3 | **N185** | exec.py:1056-1064 | low | 低危批次:数字/字母字面类并入全角等价类(0-9/@)并统一 \d 的 Unicode 边界口径;守卫补全角样本(test_exec_tools.py F11 现零覆盖) |
184
+ | 4 | **N186** | exec.py:387-397 | low | 低危批次:system_prompt_from 对齐 CONTEXT_TEXT_MAX=256KB 截断(:439-444 先例)+ 预算闸前置到读取之前(拦读取峰值而非仅拦发送体积) |
185
+ | 5 | **N187** | exec.py:386-392 | low | 低危批次:读取 except 面补 UnicodeDecodeError(ValueError 族)→SpecError 归一(退出码 3→2,兑现头注契约) |
186
+ | 6 | **N188** | main.rs:489-524 | low | 小修:cmd_kill 加终态闸——终态任务返回明确「任务已终态,强杀不适用」(非 ok:true 假回执)且不留 kill 标志残留 |
187
+ | 7 | **N192** | main.rs:434-446 × scheduler.rs:516-524 | low | classify_result 采信面纳入 ok 字段(或反向矛盾 done+ok=false 置 conflict),deps_gate 放行口径与 wm.py:127-130 凭证闸对齐——同一产物一套成败语义 |
188
+ | 8 | **N193** | wm.py:159/:181-182 | low | 校验补盘符相对形态判据(含 ':' 且无分隔符即拒);test_wm_traversal.py 补无分隔符盘符样本(G3 扩展);可达性受限(产物面污染/手构目录)可随低危批次 |
189
+ | 9 | **N194** | serve_start.py:246/:263-267/:271-278 | low | start() 判死→Popen→心跳确认整段加跨进程文件锁临界区(fsutil.FileLock 家法现成);test_serve_entry.py 补并发 start 用例 |
190
+ | 10 | **N68** | exec.py:814/:845/:1588 | medium | **大设计决策**:mdcg_root 参数去留/加 realpath+read_roots 闸——移除键破坏已依赖该参数的部署、加闸改变语义,需设计裁定后随批次落地(v8 首报第 6 轮,攻击面较 v8 扩大,建议升优先级) |
191
+ | 11 | **N90** | mcp_server.py:381-394/:496-507/:537-538 | low | 低危批次:_t_poll/_t_doctor 条目级 try/except + _result_view 顶层 dict/content str 类型守卫(坏 job 隔离,不拖垮观测面) |
192
+ | 12 | **N91** | serve_start.py:62-75/:91-95/:240 | low | 低危批次:resolve() 两形态对称 `or None` 归失败 + load_config 空白值进 bad 触发 fail fast(空串键不得静默上岗覆盖宿主 env) |
193
+ | 13 | **N177** | exec.py:1020-1032 | low | 低危批次:后缀族改整段/中缀匹配补全 + NTFS ADS 形态(notes.txt:secret)纳入 |
194
+ | 14 | **v21-R1** | mcp_server.py:48-54/:58(md_cg 同构) | low | 速收候选(v21:176 原判):except 面补 AttributeError/TypeError + isinstance(version,str) 校验,红守卫两断言现成随任一批次搭车;若入 N 系自 N195 顺延 |
195
+ | 15 | **N178** | units.py:336 | low | 低危批次:job_id 白名单(对齐 wm.py:159 家法——注意 N193 表明该家法本身也待补盘符形态,建议同批一并) |
196
+ | 16 | **A1-e** | exec.py:963-979 | low | 维持文档化语义(v21 L5 裁定),显式空值告警随低危批次 |
197
+ | 17 | (流程) | npm run gate R4 | — | 非内容缺陷:本报告与 `md_cg/test_n184_keys_concurrent_provision.py` 均为发布清单内未追踪新件,随编排会话入库提交后 R4 转绿(判据 check_publish_artifact.py:15「包内非追踪件仅允许 lib/」;v21 同因先例) |
198
+ | 18 | (残留) | 3.0-③ 两处编号字样 | — | 编排会话提交时顺手归一 json.rs(N184→N189,两 crate)与 exec.rs/keyres.rs(N185→N190)注释/夹具字样,或随低危批次 |
199
+
200
+ ---
201
+
202
+ ## 六、纪律合规声明
203
+
204
+ 1. **复现环境红线**:四区攻防复现与修复验证全部在系统临时目录/临时库/哑令牌/哑密钥环境进行(HIVE_* 全为临时值,如 HIVE_ORCH_TOKEN 取 DUMMY 前缀临时值、哑 KEK=os.urandom(32)、MDCG_MASTER_KEY 哑值仅测试进程在用、哑 LLM 网关 127.0.0.1 随机端口、临时 jobs 目录/临时图根/临时 git 仓)——未触真实令牌库、真实在役 serve、真实在役数据目录与 DSH 探针节点;在役 serve(release 构建)全程未触碰;各会话材料逐条声明测毕清理(rmtree/按精确 pid taskkill/tasklist 复核无残留)。
205
+ 2. **本报告会话第一手实跑清单**:WORKSPACE_INDEX.md 查阅定位(工作纪律第 18 条);编号基线与源码树占号扫描(第四节-1);3 件新守卫复跑(第四节-2);python 全量 228/228(第四节-3);hive/rust 两 crate cargo test(第四节-4);npm run gate 逐面归因(第四节-5);历轮复测计数 grep(3.2 表)。
206
+ 3. **转述与归属**:四区攻防复现、修复红绿双态(git stash)为复核/修复会话第一手实测(材料附命令与输出),本报告如实转述并逐项标注归属;未重复 stash 操作(避免扰动并行会话工作区)。凡本会话未跑的检查,文中一律标注来源,不冒充第一手结论。
207
+ 4. **编号裁定**:见 3.0——N183–N194 全局唯一(本会话扫描核对),次轮自 N195 续编;源码树 2 处编号残留如实注记(3.0-③),未代改代码(报告员不越修复/编排会话之权)。
208
+ 5. **报告面纪律**:本报告未写入本机绝对路径(材料证据中的本机盘符路径已转写为「临时探测根/临时池/仓内默认池」等中性表述;N193 的「盘符:名字」样例系缺陷本体攻击形态的类目描述,非本机路径);**未执行 git commit**(工作区改动与报告落盘由编排会话负责提交,R4 提交后转绿)。
209
+ 6. **门禁如实呈现**:python 全量/cargo 通过为本会话第一手复验;npm run gate 内容面(R1/R2/R3)PASS、R4 非追踪件面 FAIL 均如实呈报并归因,未粉饰未绕过。
210
+ 7. **隐私卫生(本轮重写加固项)**:本报告不含真实凭据/密钥/令牌与 PII;材料证据中的 PII 样例(手机号/身份证号/邮箱字面量)已转写为类目描述(保留命中/漏报的实证结构),哑凭据/哑令牌字面量转写为「DUMMY 前缀」类目或通配形式(如 DUMMY-N185-*),content_hash 等哈希值以「回执在案」表述——报告随 npm 包发布(package.json files 含 docs/),不携带可被误认的凭据/PII 形态串。
211
+
212
+ ---
213
+
214
+ ## 七、跳过项及原因
215
+
216
+ 1. **npm run gate 后四检查器**(cogmap_sync/link_check/workspace_index/verify_discipline)——检查链 `&&` 短路于 R4 未及执行;非评审跳过,编排会话入库提交后 gate 重跑即全链覆盖且 R4 转绿。
217
+ 2. **真实 serve 全链路复现**(N145 修复后的端到端编排链、编排者 spawn_subtask 工具链验证)——在役 serve 不可动;以机制读码+同函数子进程模拟闭链(修复会话与缺陷报告同口径如实声明,非第一手端到端)。
218
+ 3. **v17 N144 旧证 PermissionError [WinError 32] 与撕裂 JSON 两变体**——本轮未重跑(本轮守卫已覆盖共享 tmp 持握/成功终态覆写/兜底二次抛/跨进程真并发四形态,修复面同源;v17 变体与新守卫针对同一修复点)。
219
+ 4. **serve_start.py:246 攻击向量②③**(两 MCP 宿主共享池同时 spawn;restart stop→start 空窗被 _ensure_serve 插队)——读码推及,未单独复现(材料如实声明);向量①(MCP _ensure_serve 与 CLI 并发)已实测。
220
+ 5. **wm.py:159 的常态化可达面验证**——在仓执行器默认不写 job_id 进 result.json(wm.py:162 自宣称产物不可信口径),可达性限于产物面被污染/手构目录,条目内已声明为边界(非独立复验目标)。
221
+ 6. **npm test / tsc(TS 面)**——本轮改动纯 Python/Rust(exec_cmd.py/orch.py/crypto.py/两 crate json.rs/exec.rs/keyres.rs),TS 面无涉未跑(修复会话声明;v21 先例同口径)。
222
+ 7. **修复项红态的重复执行**——报告员未重复 git stash 双态验证(避免扰动并行会话工作区状态);红态输出以修复会话材料为准,绿态已由本会话独立复跑佐证(第四节-2/3/4)。
223
+ 8. **证伪项①的动态用例**(N62 蜂巢面次生缺口候选)——负向结论以读码为判据(tokens.py:438-440 闸条件结构性不可达),未运行动态用例(材料如实声明;证伪②③有实测/grep 证据)。