@furongjun1999/dsh-memory 0.5.0 → 0.5.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 (138) hide show
  1. package/README.md +552 -465
  2. package/docs/README.md +1 -0
  3. package/docs/eval/bench_lingshu_self/bench_self.py +140 -0
  4. package/docs/eval/bench_lingshu_self/self_bench_result.json +404 -0
  5. 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
  6. 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
  7. 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
  8. 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
  9. 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
  10. 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
  11. 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
  12. 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
  13. 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
  14. 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
  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_v14.md +191 -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_v15.md +213 -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_v16.md +214 -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_v17.md +199 -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_v2.md +156 -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_v3.md +152 -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_v4.md +128 -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_v5.md +114 -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_v6.md +192 -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_v7.md +187 -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_v8.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_v9.md +203 -0
  27. 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
  28. 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
  29. package/docs/images/lingshu-moonlight-covenant-poster-preview.jpg +0 -0
  30. package/docs/images/lingshu-moonlight-covenant-poster.png +0 -0
  31. 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
  32. 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
  33. 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
  34. package/lib/bridge.d.ts +9 -0
  35. package/lib/bridge.js +35 -0
  36. package/lib/index.js +7 -1
  37. package/lib/lib/roleplay_web.js +530 -443
  38. package/lib/lib/token_store.d.ts +7 -1
  39. package/lib/lib/token_store.js +12 -3
  40. package/md_cg/audit.py +12 -1
  41. package/md_cg/backfill.py +16 -15
  42. package/md_cg/backfill_bucket_zh.py +35 -0
  43. package/md_cg/bench_e2e_judge.py +532 -0
  44. package/md_cg/bench_e2e_locomo_qa.py +368 -0
  45. package/md_cg/bench_e2e_qa.py +256 -0
  46. package/md_cg/branches.py +18 -2
  47. package/md_cg/ccgc.py +3 -2
  48. package/md_cg/chain.py +19 -4
  49. package/md_cg/consolidate.py +7 -6
  50. package/md_cg/crosscheck.py +4 -3
  51. package/md_cg/crypto.py +439 -437
  52. package/md_cg/datapath.py +395 -335
  53. package/md_cg/evidence.py +582 -580
  54. package/md_cg/export.py +3 -1
  55. package/md_cg/forgetting.py +2 -2
  56. package/md_cg/fsutil.py +48 -0
  57. package/md_cg/hotcache.py +255 -238
  58. package/md_cg/interop.py +161 -22
  59. package/md_cg/judgment_manifest.py +177 -0
  60. package/md_cg/links.py +655 -622
  61. package/md_cg/mcp_server.py +280 -29
  62. package/md_cg/mdcg.py +616 -125
  63. package/md_cg/mdcos.py +430 -66
  64. package/md_cg/mreview/govern.py +5 -4
  65. package/md_cg/postings.py +4 -2
  66. package/md_cg/readcache.py +76 -18
  67. package/md_cg/reconcile.py +228 -0
  68. package/md_cg/review_cli.py +170 -0
  69. package/md_cg/routing.py +28 -0
  70. package/md_cg/run_tests.py +211 -0
  71. package/md_cg/scrub.py +862 -852
  72. package/md_cg/security.py +385 -275
  73. package/md_cg/selfreport.py +3 -2
  74. package/md_cg/signer.py +565 -562
  75. package/md_cg/sources.py +3 -2
  76. package/md_cg/stg.py +6 -0
  77. package/md_cg/sustain.py +1168 -1138
  78. package/md_cg/test_access_hints.py +147 -0
  79. package/md_cg/test_branch_discard_tombstone.py +136 -0
  80. package/md_cg/test_branches.py +259 -249
  81. package/md_cg/test_chain_read_isolate.py +168 -0
  82. package/md_cg/test_datapath_device_name.py +203 -0
  83. package/md_cg/test_emit_negtail_cache.py +156 -0
  84. package/md_cg/test_en_pipeline.py +186 -166
  85. package/md_cg/test_govern_directread.py +421 -0
  86. package/md_cg/test_i32_hotcache_env_key.py +218 -0
  87. package/md_cg/test_identity_attribution.py +228 -147
  88. package/md_cg/test_index_durability.py +238 -224
  89. package/md_cg/test_interop.py +4 -2
  90. package/md_cg/test_interop_judgment.py +228 -0
  91. package/md_cg/test_issue39_utf8_stdio.py +273 -0
  92. package/md_cg/test_links_concurrent_write.py +188 -0
  93. package/md_cg/test_merge_upsert.py +168 -0
  94. package/md_cg/test_n123_derive_expiry_chain.py +205 -0
  95. package/md_cg/test_n130_verify_falsified_protect.py +185 -0
  96. package/md_cg/test_n131_merge_gate.py +205 -0
  97. package/md_cg/test_p1x_ref_root.py +160 -0
  98. package/md_cg/test_p27_docindex.py +774 -765
  99. package/md_cg/test_p2_mcp.py +3 -0
  100. package/md_cg/test_p32_backfill.py +304 -298
  101. package/md_cg/test_p39_verify_flow.py +90 -50
  102. package/md_cg/test_p47_session_view.py +60 -25
  103. package/md_cg/test_propose_tail_index.py +157 -0
  104. package/md_cg/test_read_scope_b27.py +277 -0
  105. package/md_cg/test_readcache_default_on.py +168 -0
  106. package/md_cg/test_readcache_precise_inval.py +270 -0
  107. package/md_cg/test_readcache_prodpath.py +55 -7
  108. package/md_cg/test_reconcile_v0.py +294 -0
  109. package/md_cg/test_retr_s1.py +6 -2
  110. package/md_cg/test_retr_s1b.py +67 -0
  111. package/md_cg/test_retr_s7.py +8 -0
  112. package/md_cg/test_retr_s9_entity_ctx.py +181 -175
  113. package/md_cg/test_retr_score_once.py +208 -0
  114. package/md_cg/test_review_onepass.py +170 -0
  115. package/md_cg/test_rrf_graph_seed_cache.py +154 -0
  116. package/md_cg/test_security_audit.py +155 -0
  117. package/md_cg/test_security_audit_b26.py +161 -0
  118. package/md_cg/test_security_audit_v21.py +250 -0
  119. package/md_cg/test_semantic_canonical.py +255 -241
  120. package/md_cg/test_session_isolation.py +168 -0
  121. package/md_cg/test_snapshot_autoclose.py +187 -0
  122. package/md_cg/test_tail_watermark_race.py +208 -0
  123. package/md_cg/test_tenant_env_override_warn.py +139 -0
  124. package/md_cg/test_tenant_registry_corrupt_warn.py +151 -0
  125. package/md_cg/test_v14_fixes.py +415 -397
  126. package/md_cg/test_verify_dirty_reconcile.py +157 -0
  127. package/md_cg/theory.py +276 -273
  128. package/md_cg/tokens.py +734 -677
  129. package/md_cg/units.py +3 -2
  130. package/md_cg/vision_evidence.py +4 -3
  131. package/md_cg/whitebox_kb/wisdom/code_solidified.json +6195 -6195
  132. package/md_cg/whitebox_kb/wisdom/multilang_ir.py +128 -124
  133. package/md_cg/writepipe.py +554 -550
  134. package/package.json +6 -2
  135. package/src/bridge.ts +434 -401
  136. package/src/index.ts +526 -518
  137. package/src/lib/roleplay_web.ts +1019 -932
  138. package/src/lib/token_store.ts +202 -192
@@ -0,0 +1,233 @@
1
+ # 缺陷挖掘报告 · 自主迭代 v13(scripts 与 TS 二轮深挖)
2
+
3
+ - **日期**:2026-09-25
4
+ - **范围**(生效条件):第 13 轮 = scripts 与 TS 二轮深挖,四区复核(scripts / ts-store / ts-web / tests)共 **41 条目**(confirmed 37 / rejected 4)→ 跨区重复 10 组 + role_id 族三报合一(冗余 11 条)去重后独立缺陷 **26 组**(本轮新发现 6 项 **N114-N119**:medium 3 / low 3;legacy 复测 20 组:v6 计 16 组〔N27 / N28 / N29 / N30 / N34 / N35 / N36 / N37 / N38 / N39 / N40 / N41 / N43 / N45 族〔与 v8 N65 同族双列〕/ N46 / N47〕、v8 N66、v9 N77 / N78、v12 N113)→ 本轮修复 **5 个补丁**,全闭 4 组(v6 N27 / v6 N28 / v9 N78 / N114)、**role_id 族部分收窄**(POST /api/translate 假成功面已修,残面 = import 与 POST /api/roles 入口未白名单 + GET /api/translate / history 直通)→ 遗留 **22 个开口**(deferred 设计决策类 8:medium 7 / low 1;历轮留档维持类 14 全 low)
5
+ - **编号口径**:本轮新发现沿历轮 N 口径续编 **N114-N119**(v12 用至 N113;材料 confirmed 的 origin=new 条目未携带编号,由本报告会话统一续编并在第三节逐项标注)。legacy 项沿用原轮次号——本报告会话经 grep 核实:v6.md:78-81(N27-N30)、:90-93(N34-N37)、:99-102(N38-N41)、:109-113(N43/N45/N46/N47)、v8.md:103(N65)/ :104(N66)、v9.md:87-88(N77/N78)、v12.md:116(N113)。role_id 族为 v6 N45 与 v8 N65 同族双编号(v8.md:103 自述「/meta 与 /chat 均已挂白名单」即 v6 N45 的 P2-23 部分修复后残面),本报告按根因合并单列。
6
+ - **回归**:`python -X utf8 scripts/run_tests.py --jobs 4` 全量——**本会话两次实跑**:第一次 `188/189 通过、5 跳过`(失败:md_cg.test_p41_evolve_patrol),单跑复测该套件 `PASS 36 / FAIL 0` 通过;第二次 `189/189 通过、5 跳过`、**真实退出码 0**(与材料门禁口径一致;一次并行波动如实记录,见第四节);`npm test` 通过(**本会话实跑**:tests 53 / pass 52 / fail 0 / skipped 1,退出码 0);`npm run gate` 通过(**本会话实跑**:「结论:9/9 目标一致」,退出码 0);`cargo test` **未运行**(Rust 面零改动——git status 无 rust/ 与 swarm/ 源码改动佐证,与材料口径一致)。
7
+ - **行号口径**:材料修复行号为修复后快照;本报告会话对五处修复落点逐处读核(judgment_manifest.py:129 / verify_runner.py:48-67 / hotcache.py:60-65 / bootstrap_loop.py:289-296 / roleplay_web.ts:918-926),与材料口径吻合、无漂移(本轮五补丁均为小净增改动,+6/-1 ~ +73/-1,git numstat 核实见第四节)。
8
+ - **结构口径**(CCG 六要素):功能名(标题)/ 生效条件(范围与口径行)/ 子功能(第二~五节)/ 执行与验证方式(第四节:实跑命令与结果)/ 不适用条件(第七节:跳过与未运行项)
9
+
10
+ ---
11
+
12
+ ## 一、执行摘要
13
+
14
+ 本轮为 scripts 与 TS 二轮深挖:四区复核 41 条目(confirmed 37 / rejected 4——rejected 非空,含 2 条证伪成立与 1 条「原证伪被推翻」的复核反转,如实记录),去重后 26 独立缺陷组,5 补丁全闭 4 组、部分收窄 1 组,留档 22 开口。四个主题:
15
+
16
+ 1. **守卫诚实性三项闭账(1 new + 2 legacy,同主题)**:v6 留档 N27(`--verify` 缺参 fail-open:比对从未发生却打印 799 行全量清单 + exit 0,三轮未修)与 N28(run_tests SUMMARY 实际形态与 verify_runner 两正则契约断裂:python 侧 passed/failed 恒 (0,0),verdict.json 留痕系统性失真)同为「失败被伪装成成功」的守卫面缺陷,本轮 F1/F2 闭账;同主题新发现 N114——run_channel_b 首条 `continue` 不给坏条目标 status(兄弟失败路径 :301/:314/:332/:367 均标 failed 唯此漏),模型可控队列里 max_tasks 个坏条目即令合法条目永不被处理(stats 恒 0、无报错留痕的静默饥饿),F4 闭账。
17
+ 2. **缓存键口径与 roleplay 假成功(2 修)**:v9 留档 N78(query 缓存键进程级开关快照漏 MDCG_CN_GRAMS——运行期翻转后同 query 命中另一口径缓存静默错答,守卫可量化:旧口径缓存 cached=True ids=['gold'] vs 无缓存旁路真值 ['gold','d1'])F3 补登一行入键闭账;role_id 族 translate 面(中文 role_id '纳西妲' POST → 200 {ok:true} 但词对静默丢失、'__proto__' 连 mode 都丢回 input_only 的虚假成功)F5 与 /meta、/chat 同款白名单补卡闭账,族内 import / POST /api/roles 残面继续留档。
18
+ 3. **TS 面新发现与证伪复核(3 new 留档 + 2 证伪成立 + 1 证伪被推翻)**:新发现 N117(datapath 三根 env 入口相对/~ 形态 node/python 双口径分叉——MDCG_STATE_ROOT=相对值时两侧 paths.json 落不同目录)、N118(boot 期 dispose 后 waitReady 悬挂——bootQueue 三处 flush 均在 `if(!this.disposed)` 内)、N119(stdin 写/端零 error 监听——大消息滞留+子进程死亡时 uncaughtException('write EPIPE'/'write EOF') 打崩整宿主;**该项前审曾证伪,本轮以 3/3 轮大消息异步冲刷竞态实验推翻证伪确认为缺陷**,复核过程如实单列);证伪成立 2 条(bridge 重启风暴/僵尸累积、mdcg_client per-call 超时缺失——对抗复测均为无缺陷)。
19
+ 4. **legacy 大盘复测与 deferred 决策(20 组复测 + 8 项设计决策留档)**:v6 十六组(N27/N28 闭账、N45 族部分收窄、其余维持)、v8 N66(chat 免鉴权 CSRF 面)、v9 N77(query 热缓存失效缺口)、v12 N113(swarm topology 静默跳过洞)全部复测在位;8 项按标准④降级 deferred(修复涉拦截策略/迁移语义/口径协商/失效粒度/桥生命周期/Windows 超时机制等设计决策,非纯缺陷修补),处置线索留第五节。
20
+
21
+ **对输入口径的核验**:输入称「四区 confirmed 37(scripts 7 + ts-store 4 + ts-web 7 + tests 19)、rejected 4 → 5 修复 → 留档未修 8 条」。本会话以 `git status --porcelain` / `git diff --numstat` + 五处落点读核核对:改动面 = 五个修复源文件(scripts/judgment_manifest.py +6/-1、hive/verify_runner.py +10/-1、md_cg/hotcache.py +4/-1、scripts/bootstrap_loop.py +6/-0、src/lib/roleplay_web.ts +9/-0)+ 五份守卫(scripts/test_judgment_manifest.py +14、md_cg/test_interop_judgment.py +33、md_cg/test_i32_hotcache_env_key.py +73/-1、scripts/test_bootstrap_channel_b.py +55、test/roleplay_translate_guard.test.ts 新增未跟踪)——与五项修复一一对应;另 `md_cg/whitebox_kb/wisdom/code_solidified.json`(+1/-2)为 v10-v12 报告已注明的先前会话遗留工作区变更,非本轮触点。跨区冗余 11 条(N27×1 / N28×1 / N29×1 / N35×1 / N38×1 / N39×1 / N43×1 / N40×1 / N47×1 / role_id 族×2),37 − 11 = 26 独立缺陷组;5 补丁全闭 4 + 部分闭 1,26 − 4 = 22 开口,与材料留档 8 条(deferred 子集)逐条对应、其余 14 条为历轮留档维持(材料 confirmed 未入选修复者),无多无少。
22
+
23
+ ---
24
+
25
+ ## 二、修复清单(5 项,逐项 where / 问题 / 修复 / 前后对比 / 守卫)
26
+
27
+ ### F1(v6 N27,medium)judgment_manifest --verify 缺参 fail-closed:验证守卫不再假成功
28
+
29
+ - **where**:`scripts/judgment_manifest.py:129`(`--verify` 参数分发;本会话读核现行 :129-135 在位,修复注释标 v6 N27);守卫落 `scripts/test_judgment_manifest.py:96`(节 [4])。
30
+ - **问题**:v6 留档 N27(v6.md:78)三轮未修——`--verify` 缺冻结文件参数时 `len(sys.argv) >= 3` 条件不满足,静默落入兜底分支打印 799 行全量 manifest 并 return 0:比对从未发生、grep '"verdict"' 计数 0,CI/钩子参数拼空时验证守卫假成功(fail-open)。对照组 `--check-coverage` → verdict PASS、`--digest` 正常出指纹,唯缺参面假通过。
31
+ - **修复**:条件收紧为 `len(sys.argv) >= 2 and sys.argv[1] == "--verify"`,内加缺参分支(stderr 用法提示「用法:--verify <冻结的manifest.json>」+ return 2),写法与包内已正确的 md_cg/judgment_manifest.py 同形;collect/digest/coverage_gap 及无参形态未动。
32
+ - **前后对比**:前——缺参 → exit 0 + stdout 799 行全量清单(假成功);后——缺参 → exit 2 + stderr 用法 + stdout 不倾倒清单(诚实失败,fail-closed)。
33
+ - **守卫**:test_judgment_manifest.py:96 节 [4] 两断言(子进程实跑缺参形态:非零退出 + stdout 无 "files" 键)。材料红证:修前 14 通过 / 2 失败(EXIT=0、stdout 以全量清单开头);修后 16 通过 / 0 失败。**本会话实跑:`python -X utf8 scripts/test_judgment_manifest.py` → 「judgment_manifest 守卫: 16 通过 / 0 失败」EXIT=0**(尾行 [PASS]「--verify 缺参不得在 stdout 倾倒全量 manifest」)。
34
+
35
+ ### F2(v6 N28,medium)verify_runner._parse_counts 补 SUMMARY 实际形态:verdict.json 计数不再系统性假零
36
+
37
+ - **where**:修复落点 `hive/verify_runner.py:48-67`(_parse_counts,本会话读核:函数头注释同步改写 + 第四条正则 `SUMMARY\s+(\d+)\s*/\s*(\d+)\s*通过[,,]\s*(\d+)\s*跳过` 在位);契约对端 `scripts/run_tests.py:216`(生产端格式未动——它是唯一一签 a800f84〔2026-09-14〕后的稳定现实,改的是读错图纸的消费端);守卫落 `md_cg/test_interop_judgment.py:190`(节 [8])。
38
+ - **问题**:v6 留档 N28(v6.md:79)三轮未修——SUMMARY 实际形态 `===== SUMMARY 188/189 通过,1 跳过(依赖缺失/平台不符) =====` 对旧两条正则(`(\d+) passed` 与从未存在的 `通过 X / 失败 Y`)均零命中:verdict.json 的 python 侧 passed/failed 恒 (0,0),fail 态靠 rc 硬补 1;verdict 判决本身因 rc 条件仍正确,受损的是留痕计数。
39
+ - **修复**:新增第四条正则解析 SUMMARY 形态——failed 不在行内由 runnable−passed 推出(max(0,…) 防负),跳过单列不计失败;既有三条正则(cargo 两条 + `通过 X / 失败 Y`)原样保留。
40
+ - **前后对比**:前——真实 SUMMARY 行喂入 → (0,0)(本会话守卫节的材料红证:生产端实跑行解析得 (0,0));后——188/189 → (188,1)、187/187+2 跳过 → (187,0)、cargo 形态与旧形态照旧可解析。
41
+ - **守卫**:test_interop_judgment.py:190 节 [8] 六断言(合成行 + **生产端现场取证**:真跑 `run_tests.py scripts -k judgment` 捕获真实 SUMMARY 行喂回 _parse_counts,双面钉死契约、任一侧漂移必红 + cargo 回归 + 跳过不计失败)。材料红证:修前 33 通过 / 4 失败;修后 37 通过 / 0 失败。**本会话实跑:`python -X utf8 -m md_cg.test_interop_judgment` → 「interop_judgment: 37 通过 / 0 失败」EXIT=0**(尾行 [PASS]「跳过不计入 failed(187/187+2 跳过 → (187,0))」)。本会话全量回归尾行 `===== SUMMARY 189/189 通过,5 跳过…` 即该新正则的目标形态(第二次实跑,第四节)。
42
+
43
+ ### F3(v9 N78,medium)hotcache _ENV_SWITCHES 补登 MDCG_CN_GRAMS:开关翻转不再命中旧口径缓存
44
+
45
+ - **where**:`md_cg/hotcache.py:60-65`(_ENV_SWITCHES 六项含 MDCG_CN_GRAMS,本会话读核在位:登记行 + v9 N78 成因注释);契约对端 `md_cg/mdcg.py:364`(cn_recall_grams 每调用读 env,未动);守卫落 `md_cg/test_i32_hotcache_env_key.py:136`(K7-K10 节)。
46
+ - **问题**:v9 留档 N78(v9.md:88)两轮未修——MDCG_CN_GRAMS 开关在 mdcg.py:364 每调用读 env(实测改变 expand_query_terms 召回词集:开 6 terms / 关 1 term),但 _ENV_SWITCHES 五项不含它:运行期翻转后同 query 命中另一口径缓存(静默错答)。对照实验实锤:已登记开关(MDCG_SEMANTIC/MDCG_UNIFY_QUERY)翻转 → cached False(miss),唯 CN_GRAMS 翻转 → cached True(仍命中旧口径)。
47
+ - **修复**:_ENV_SWITCHES 增登 "MDCG_CN_GRAMS" 一行(env_switch_key() 自动携带;mdcos.py:1258 已把该键接进 query 缓存 extra,无需动调用方);守卫 K7(清单登记)/ K8(键值随开关变化)/ K9a-K10b(中文端到端:fixture 正文含「抑制/制剂」2-gram 但不含整句「抑制剂怎么选」——grams 开经 bigram 召回命中、关只剩整句召回词,口径差可观测)+ 外层 finally 的 env 清理列表同步补登。
48
+ - **前后对比**:前——翻转后 cached=True ids=['gold'](旧口径缓存命中),无缓存旁路重算真值 ['gold','d1'](静默错答可量化);后——翻转即换键 miss 重算,与旁路结果一致;同口径内重复查照旧命中缓存(缓存未被打废)。
49
+ - **守卫**:材料红证:修前 PASS=9 FAIL=5(K7/K8/K9b/K9c/K10b);修后 PASS=14 FAIL=0。**本会话实跑:`python -X utf8 -m md_cg.test_i32_hotcache_env_key` → PASS=14 FAIL=0 EXIT=0**。**留档观察(材料 verified_by 尾注,未修非本轮范围)**:同类开关漏登仍在——MDCG_LAYER_BOOST 与 MDCG_GATE_S4_LAYER/S3_SPREAD/S7_POSTINGS/BUCKET_*(仅 MDCG_RETRIEVAL_PIPELINE=1 时生效,总闸已入键但开启态下翻子开关/权重仍会命中旧口径缓存),建议后续统一盘点。
50
+
51
+ ### F4(N114,medium)run_channel_b 首条 continue 补标 status=failed:坏条目不再静默饥饿队列
52
+
53
+ - **where**:`scripts/bootstrap_loop.py:289-296`(本会话读核在位:`stats["failed"] += 1` + `item["status"] = "failed"` + 批次 35 同型注释);守卫落 `scripts/test_bootstrap_channel_b.py:100`(节 [3])。
54
+ - **问题**:本轮新发现 N114——缺 cases/code 的坏条目走 `if not code or not cases: continue` 不标 status 也不计 stats:兄弟失败路径(fname 缺失 :301 / 沙箱拒绝 :314 / fn 不可调 :332 / cases 未过 :367)都标了 status=failed,唯此漏。队列文件为模型可控输入(:305-309 注释明示),坏条目永久 pending 且每轮占据 queue[:max_tasks] 处理窗口——max_tasks 个坏条目即令其后合法条目永不被处理(隔离台架实跑:3 坏 + 1 好、max_tasks=3 连跑两轮,两轮 stats 均 {generated:0, passed:0, failed:0},好条目两轮后仍 'new'——静默饥饿无报错留痕)。
55
+ - **修复**:continue 分支补 `stats["failed"] += 1` + `item["status"] = "failed"`(对齐批次 35 fname 缺失分支先例),队列过滤(:269-270 排除 failed)自动让出窗口;未动其他分支。
56
+ - **前后对比**:前——坏条目无 status 键、好条目永 'new'、stats 恒 0(守卫红证);后——坏条目轮 1 即标 failed 且 stats failed=3;轮 2 队列过滤让出窗口,好条目 generated=1 / passed=1、status=verified 并固化入 verified_units。
57
+ - **守卫**:test_bootstrap_channel_b.py:100 节 [3] 四断言(复刻缺陷场景:3 坏 + 1 好、max_tasks=3、两轮;轮 1 stats/队列回写 + 轮 2 饥饿消除 + verified_units 固化校验;importlib 隔离 STATE=tempfile.mkdtemp 不碰真实数据根、测后 rmtree)。材料红证:修前 5 通过 / 4 失败;修后 9 通过 / 0 失败。**本会话实跑:`python -X utf8 scripts/test_bootstrap_channel_b.py` → 「bootstrap 通道 B 守卫: 9 通过 / 0 失败」EXIT=0**(尾行 [PASS]「轮2 好条目 status=verified 且固化入 verified_units」)。
58
+
59
+ ### F5(v6 N45 / v8 N65 族 · POST /api/translate 面,medium)translate 入口补 validRoleId 白名单:非法 role_id 不再假成功
60
+
61
+ - **where**:`src/lib/roleplay_web.ts:918-926`(本会话读核在位:role 提取后 validRoleId 校验 + 400 分支,修复注释标「P1-3 补卡(translate POST)」;修复前缺陷位于原 :916-926);守卫落新增 `test/roleplay_translate_guard.test.ts`(git 未跟踪新文件)。
62
+ - **问题**:role_id 族 legacy 面——POST /roleplay/api/translate 对未过白名单的 id 静默通过:setTranslations 内部白名单不匹配时静默 return(:667-669)而 handler 仍返回 ok:true 并回显 pairs;中文 role_id(可经 POST /api/roles 创建——:952-959 同样无校验)下词对永不落盘(动态复现:role_id='纳西妲' POST → 200 ok:true,GET 回读 pairs=[] 词对静默丢失;ASCII 对照 'naxiaoda' 回读 pairs=1 完整);role_id='__proto__' 时 settings[role] 走原型 setter 不产生 own 属性,translate_settings.json 落盘不含该键(JSON.stringify 丢弃)——GET 连 mode 都丢回 input_only。同文件 /meta(:804-809 显式 400)已修,处理不一致。
63
+ - **修复**:POST 分支 role 提取后补 validRoleId 白名单校验,非法 id 直接回 400 {ok:false, error:'非法角色 id(白名单 ^[A-Za-z0-9_.-]{1,64}$)'} 并 return——不再走到 setTranslations 静默 return 与 settings[role] 原型键赋值;与 /meta、/chat 既有先例完全同款;净增 9 行。
64
+ - **前后对比**:前——中文 id / '__proto__' / 'constructor' 均 200 {ok:true} 假成功(词对丢失或 mode 丢失);后——三类非法 id 均 400 {ok:false} 且写盘调用不再执行;合法 id 200 ok:true、词对/mode 落盘、GET 回读一致(回归保护)。
65
+ - **守卫**:test/roleplay_translate_guard.test.ts(node --test,mock 形制照 test/roleplay_edit_guard.test.ts)四用例:①中文 id → 400 + GET 回读 pairs=[];②'__proto__' → 400 + settings 无 __proto__ own 键;③合法 id → 200 + 落盘 + 回读一致;④'constructor' 被拒不破坏已落盘合法配置。材料红证:修前 ①②④ fail(got 200 ≠ expected 400);修后 4/4 绿。**本会话实跑:`node --import tsx --test test/roleplay_translate_guard.test.ts` → tests 4 / pass 4 / fail 0,EXIT=0**。**族内残面继续留档**(v6 N45/v8 N65 的 import 与 POST /api/roles 入口、GET /api/translate 与 GET /api/history 直通面,第五节)。
66
+
67
+ ---
68
+
69
+ ## 三、发现明细(四区 confirmed 37 / rejected 4)
70
+
71
+ 以下每项「证据要点」为上游复核/修复会话的读码+实跑(材料原文;复现均在系统临时目录/隔离 STATE 台架/哑数据,测毕清理);标注★者本报告会话另做了现行代码读核(修复项)或历轮报告 grep 核实(编号归属)。legacy 项沿用原轮次号;origin=new 者的 N114-N119 为本报告会话续编。**rejected 4 条如实单列(scripts 2 + ts-web 2),其中含一条「原证伪被推翻」的反转记录。**
72
+
73
+ ### scripts 区(7 confirmed:4 legacy + 3 new;2 rejected)
74
+
75
+ | # | where(缺陷时点) | 严重度 | 问题摘要 | 证据要点 | 状态 |
76
+ |---|------|--------|----------|----------|------|
77
+ | v6 N27★ | scripts/judgment_manifest.py:129 | medium | 【复测成立·三轮未修→本轮修复】--verify 缺冻结文件参数 fail-open:落入兜底打印全量 manifest + exit 0,比对从未发生(详 F1) | 实跑缺参 → EXIT=0、stdout 799 行(grep '"sha256"' = 197)、grep '"verdict"' 计数 0;对照组 --check-coverage → verdict PASS、--digest → 指纹正常,唯缺参假通过 | **已修**(F1) |
78
+ | v6 N28★ | scripts/run_tests.py:216 + hive/verify_runner.py:50-60 | medium | 【复测成立·三轮未修→本轮修复】SUMMARY 实际形态与 _parse_counts 两正则契约断裂,python 侧计数恒 (0,0)、verdict.json 留痕失真(判决本身靠 rc 条件仍正确)(详 F2) | exec 提取 _parse_counts 实测:真实行 `===== SUMMARY 188/189 通过,1 跳过…` → (0,0);假设形态 `通过 188 / 失败 1` → (188,1)(证明旧正则只认从未存在的形态);git log -S '===== SUMMARY' 仅 a800f84 一签——v6 留档后格式未改 | **已修**(F2) |
79
+ | N114★ | scripts/bootstrap_loop.py:289 | medium | 【新发现→本轮修复】run_channel_b 首条 continue 不给坏条目标 status:模型可控队列 max_tasks 个坏条目即令合法条目永不处理(静默饥饿)(详 F4) | 隔离 STATE 台架实跑:3 坏 + 1 好、max_tasks=3 连跑两轮 → 两轮 stats 均 {0,0,0}、坏条目无 status 键、好条目仍 'new';读码对照 :301/:314/:332/:367 各失败路径均标 failed 唯 :289 漏 | **已修**(F4) |
80
+ | N115 | scripts/bootstrap_loop.py:336 | medium | 【新发现·留档】通道 B 物理验证执行 LLM 产出函数无超时:AST 沙箱只拦 import/危险名/dunder 属性,纯计算 `while True: pass` 合法通过;case 循环直接调 fn(...) 无时限——模型可控队列条目一句死循环即挂死 run_channel_b 连同 run_once(try/except 拦不住挂死),条目 status 永不落盘 → watchdog 重启后同条目再次挂死(永久 DoS 形态);巨分配同族资源耗尽同理 | 子进程实测:队列写入 while True 死循环 fn + cases,打印开始标记后 timeout 8 强杀 → EXIT=124、「run_channel_b 返回」从未输出(挂死本身证明纯计算过了 AST 沙箱);读码确认 :240 exec 与 :346/:350 fn 调用均无 timeout,对照 run_tests._run_one(timeout=900)与 verify_runner._run 都有超时,此执行面独缺 | 留档(medium,deferred——Windows 无 SIGALRM,超时机制选型属设计决策) |
81
+ | N116 | scripts/link_check.py:44 | low | 【新发现·留档】_git 不检查子进程返回码:git 失败(空仓库/损坏 .git)时 stdout 为空 → scan() 得 0 文件 → main() 打印「结论:全部相对链接可达」exit 0——断链守卫扫描完全失败时假绿(fail-open);对照 workspace_index.py:117-122 tracked() 对 returncode!=0 抛 RuntimeError(fail-closed 正确形态) | importlib 载入并置 REPO=临时空目录(无 .git)实跑 → scan() 全零、main() 仍「全部相对链接可达」返回 0;仓内基线实跑 OK=227 BROKEN=0;CI 工作流 cogmap-check.yml:36 `run: python scripts/link_check.py` 消费此码 | 留档(low) |
82
+ | v6 N29★ | scripts/interop_gate.py:61 | low | 【复测成立·未修留档】PASS 分支取 v['failed'] 但该字段不在 _REQUIRED(:26) 也不在 _load(:38-39) 校验——缺 failed 的 pass 态 verdict 触发未捕获 KeyError(traceback + exit 1),违反自身「exit 3 = 形状非法」契约;触发面限旧版/手工产物(生产方 verify_runner.py:165 总写该字段) | 实跑:构造 {verdict:pass, valid:true, assertions_ok:true, failure_reason:null, passed:5}(缺 failed)→ KeyError: 'failed' traceback、EXIT=1;对照组同构造 + "failed":0 → PASS EXIT=0;fail 态缺 failed 正常 FAIL(不取该键) | 留档(low) |
83
+ | v6 N35★ | scripts/check_unreachable.py:22 | low | 【复测成立·未修留档】ROOTS 相对路径按 cwd 解析:非仓库根调用时 rglob 全空 → 扫描 0 文件仍「命中 0」exit 0(死代码守卫空转假绿);另 docstring 标题「全仓」与实际 4 根覆盖不符——compiler/swarm/test 等 59 个 .py 不在扫描面 | 实跑:仓根与临时目录双形态对照(0 文件 0 命中 exit 0);os.walk 全仓统计 ROOTS 内 404 / ROOTS 外 59;grep package.json 确认 :82 gate 链首环即本脚本(npm run gate 以仓根为 cwd,主消费面安全,手动直跑 fail-open) | 留档(low) |
84
+
85
+ **rejected(2,复核维持非缺陷)**:
86
+ - `scripts/bootstrap_loop.py:373`——批次 34/35 修复面复核无残留:读码 :319(沙箱拒绝)与 :373(cases 未过,带 V22 修复注释)两处拒绝留痕完整,:418-422 只固化 verify_patch 通过者;实跑 test_bootstrap_channel_b → 5 通过 / 0 失败(批次 35 时点)、test_bootstrap_persist_gate → 4 通过 / 0 失败且固化入参只含合法条目(旧代码会收到全量)。
87
+ - `scripts/cogmap_sync.py:483`——gate 链基线复核无新缺陷:cogmap_sync check(36 op 全一致)/ check_unreachable 仓根(404 文件 0 命中)/ link_check(OK=227)/ workspace_index --check(追踪 1925 件)/ judgment_manifest --check-coverage PASS / --digest 正常——除已单列的 N27/N116/N35 三条外,六件 gate 工具边界未发现新缺陷。
88
+
89
+ ### ts-store 区(4 confirmed:3 legacy + 1 new;0 rejected)
90
+
91
+ | # | where(缺陷时点) | 严重度 | 问题摘要 | 证据要点 | 状态 |
92
+ |---|------|--------|----------|----------|------|
93
+ | v6 N38★ | src/lib/token_store.ts:76-79 + md_cg/datapath.py:244 | medium | 【复测成立·未修→deferred】auxRoot() 用 resolve(env) 不做 ~ 展开且锚宿主 cwd,与自称「同口径」(token_store.ts:71 注释、index.ts:293)的 python aux_root()(expanduser+abspath 锚 python 子进程 cwd)在 ~ 与相对两种形态下均分居两处:node 密钥环与 python 令牌注册表 _tokens.json 落不同树;宿主 cwd 变化即触发重复自动签发永不吊销的 designer 令牌 | 双侧 import 真源码实测:MDCG_AUX_ROOT=~ 形态 → node 得字面 ~ 目录(锚宿主 cwd)vs python 得真家目录展开;相对形态 → node 锚宿主 cwd vs python 锚子进程 cwd;**重复签发闭环实测**(隔离 env,真实 resolveToken 两侧 cwd 各跑一次):hostB 读不到 hostA 的 keyring → 再签发,注册表累积 2 枚 designer 记录且 revoked_at 均 null,两把 keyring 令牌不同——整链实锤;git status src/ 当时干净 = 未修 | 留档(medium,deferred——需 node/python 双进程路径锚点口径协商) |
94
+ | v6 N43★ | src/index.ts:157 + src/lib/roleplay_web.ts:542 | medium | 【复测成立·未修→deferred】dbPath 默认相对 'data/lingshu.db',roleplay 数据面 roleDataDir=join(dirname(dbPath),'roleplay_data') 随 DSH 宿主启动 cwd 漂移分裂成互不可见的多处(转录/_roles.json/翻译配置全落此树);本仓 datapath.ts:22-25 已把同类问题定性为「数据丢失级历史事故」,此处未走同一锚定口径;存量部署数据在无记录的历史宿主 cwd 下不可复原、无确定性迁移源(先例 migrateLegacyData 只迁 repoRoot/data) | 真实代码执行(node --import tsx 直调真实 installRoleplayWeb,config={dbPath:'data/lingshu.db'} 即默认值,哑编辑密钥):临时双 cwd 各跑一次 → 两侧均 200 {ok:true},各落一棵完整 roleplay_data 树(_roles.json + transcripts/translate_settings.json);GET /roleplay/api/roles 交叉验证互不可见(A 树含 role-hostA 不含 role-hostB,B 树反之);AEIS_DB 相对值传 capability 桥且构造无 cwd → spawn 继承宿主 cwd 同漂移 | 留档(medium,deferred——涉存量数据迁移语义单独评估) |
95
+ | v6 N39★ | src/lib/token_store.ts:97-105 | low | 【复测成立·未修留档】writeKeyring 双缺陷面:①裸 writeFileSync 无 tmp+rename 原子写(对照同插件 roleplay_web.ts:634-636 tmp+rename 且注明直接写会写坏;python 侧 tokens.py:302-313 _save 用 tmp+publish)——崩溃/并发中断留截断密钥环 → readKeyring 只查非空把残 token 当有效凭据注入 MDCG_TOKEN → mcp_server.py:3454 校验失败即拒绝启动(大脑永不上线);②mkdirSync/writeFileSync 无 try(对比 :100-104 chmodSync 有 try):keyring 父路径不可写时 resolveToken 抛裸 fs 错且令牌已先签进 _tokens.json,每次重试再泄漏一枚不吊销令牌 | 运行复现(隔离 env):keyringPath 父路径以文件占位,两次独立调 resolveToken 均裸抛 EEXIST(异常穿透未被吞),注册表累积 2 枚 designer 记录 revoked_at 均 null——签发先于写 keyring、每次重试泄漏一枚实锤;截断面(崩溃留残 token→大脑拒启)未做崩溃注入(需真实写坏 keyring 才能复现,违反不碰真实令牌纪律),维持读码定级 | 留档(low,与 N38 同文件同域) |
96
+ | N117 | src/lib/datapath.ts:70-79 | low | 【新发现·留档】stateRoot()/dataRoot()/mdcgRoot() 的 env 入口对相对与 ~ 形态 node/python 双口径分叉:node stateRoot 锚宿主 cwd、dataRoot/mdcgRoot 锚 repoRoot,python 一律 abspath 锚 python 子进程 cwd(runRoot)且不做 expanduser——MDCG_STATE_ROOT=相对值时两侧 paths.json 落不同目录(「谁说了算」的配置文件两说:node 写读的 python 永远看不见);MDCG_DATA_ROOT/MDCG_ROOT 相对或 ~ 形态两侧数据根/认知图根各奔一处。缓解:MDCG_ROOT 在插件部署面被 mdcg_client.ts:119 以 node 绝对值重注入遮蔽(STATE/DATA 经 bridge.ts:192 透传不遮蔽);随包脚本无相对/~ 形态 → 触发需用户自设非常规 env | 双口径实测(两侧 import 真源码,node cwd=临时宿主 cwd、python cwd=临时运行 cwd 模拟 runRoot,锚点语义同为 os.getcwd):MDCG_STATE_ROOT=rel_state → node=<hostcwd> 与 python=<pyrun> 两件不同 paths.json;MDCG_DATA_ROOT=~/data_probe → 两端均留字面 ~ 但分居 <repoRoot>~ 与 <pyrun>~;MDCG_ROOT=rel_root 同理分居(插件部署面被遮蔽不触发);测试不设防(test/datapath-migration.test.ts 用绝对值);探针产物已清理 | 留档(low,触发需非常规 env) |
97
+
98
+ ### ts-web 区(7 confirmed:4 legacy + 3 new;2 rejected)
99
+
100
+ | # | where(缺陷时点) | 严重度 | 问题摘要 | 证据要点 | 状态 |
101
+ |---|------|--------|----------|----------|------|
102
+ | v8 N66★ | src/lib/roleplay_web.ts:829-892 | medium | 【留档复测·仍开放→deferred】POST /roleplay/api/chat 无 CSRF/Origin 防护:跨站简单请求(text/plain、无自定义头、无预检)即可触发状态变更——转录落盘、LLM 生成消耗、mdcg 在位时认知图被写入攻击者文本 | 动态复现(真实 handler,临时目录+mock):仅 content-type:text/plain 头(无 Origin/Referer/自定义头)POST /roleplay/api/chat → 200,转录落盘 2 条含探针消息、mdcg.writeTranscript 被调(user+assistant)、capability.roleplay_chat 被调;读码 grep origin/referer/csrf 零命中、requireEditKey 只护写端点、注释 :830 明言 chat 免鉴权;写端点凭 x-edit-key 自定义头(简单跨站请求带不了、预检必败),唯 chat 零凭据 | 留档(medium,deferred——需先定 Origin/Host 校验策略与跨端兼容) |
103
+ | v6 N45 / v8 N65 族·translate 面★ | src/lib/roleplay_web.ts:916-926 | medium | 【留档复测→本轮修复】/api/translate 非法 role_id 假成功:setTranslations 静默 return + ok:true 回显;中文 role_id 词对永不落盘;'__proto__' 走原型 setter 连 mode 也随 JSON.stringify 丢弃(详 F5) | 动态复现(真实 handler,编辑密钥正确):'纳西妲' POST → ok:true 但 GET 回读 pairs=[](词对静默丢失),ASCII 对照 'naxiaoda' 回读 pairs=1 完整;'__proto__' POST → ok:true 但 GET 回读 mode=input_only(连 mode 也丢),settings 落盘不含 __proto__ 键;中文 id 确可经 POST /api/roles 创建(role_create 实收该 id) | **已修**(F5) |
104
+ | v6 N45 / v8 N65 族·残面★ | src/lib/roleplay_web.ts:745 + :894-930/:952-961 | low | 【留档复测·部分残留】v6 N45「role_id 三入口未白名单」:meta(:804)/chat(:845)/POST translate(:918,本轮 F5) 已修,/api/roles/<id>/import(:745 取 URL 段无 validRoleId)与 POST /api/roles(:952-959)、GET /api/translate(:894)/GET /api/history(:929)仍无白名单——未消毒 role_id 直达引擎 role_import 与落图 node_id 模板 roleplay_${role}_${kind}_${i};P2-23 注释 :842-844「入口统一卡死」与实际不符 | 动态复现(真实 handler,编辑密钥正确):POST /roleplay/api/roles/..%2F..%2Fx/import → 200 ok:true,引擎 role_import 实收穿越形态 id、_roles.json 落字面穿越键;POST /api/roles 中文 id → 200 ok、role_create 实收;对照同穿越 id 打 /meta → 400。缓解:meta 字典 null-proto、transcriptFile 字符替换、写路径在 403 edit-key 闸后(需持密钥构造请求)、mdcg 侧 node_id 白名单拦截模板注入 | 留档(low,残面随 F5 部分收窄) |
105
+ | v6 N47★ | src/hooks.ts:239-240 | low | 【留档复测·仍开放→deferred】system-prompt waterfall 内 await graph.timeline()(在 next() 之前)同步阻塞:大脑挂死期间每次模型请求组装都付全额 toolCallTimeoutMs(默认 60s,index.ts:174)延迟,且桥连续超时后不自愈(保持 ok/alive 态无重启) | 动态复现(真实 MdcgClient + installMemoryHooks + 应答 initialize 但挂死 tools/call 的假 MCP server,timeoutMs=600):注册的 system-prompt/assemble 处理器第 1/2 次调用 next() 分别延迟 608ms/607ms(预算全额支付,contexts=0),随后 isReady=true、alive=true——桥无超时降级/重启路径 | 留档(low,deferred——修法属 waterfall 结构重构) |
106
+ | v6 N40★ | src/lib/mutual.ts:129-195(声明 :33/:43) | low | 【留档复测·未修留档】冷却契约未实现:restartCooldownMs 声明于接口与 DEFAULTS(60s)、文件头宣称「拉起前确认不存在 + 60s 冷却」,但 ensureHarness 全程未引用该字段;实际影响被唯一调用方 10min 心跳间隔天然覆盖 | grep 全 src/ 仅接口声明与默认值两处命中、无消费点;ensureHarness 函数体 grep cooldown/Date.now/throttle 计 0;mutual.enabled 默认 false 限暴露面 | 留档(low) |
107
+ | N118 | src/bridge.ts:243 | low | 【新发现·留档】boot 期调用 dispose() 时 waitReady() 悬挂:flushBootQueue 三处(:243 error/:294 exit/:322 握手失败)都在 if(!this.disposed) 内,dispose 后 bootQueue 等待者永不 settle——index.ts:310 await mdcg.waitReady() 在宿主于启动窗口拆插件时 apply 永挂;宿主侧能否在 apply 未完成时触发拆解取决于 cordis 生命周期(本轮未验证,按桥 API 层悬挂报告) | 动态复现(真实 LingshuBridge + 5s 才应答 initialize 的假 server,timeoutMs=8000):start 后 400ms 调 dispose(),4.1s 后 waitReady() 仍未 settle(私有 readyState='pending');对照不 dispose → ~5s settle true;dispose 后子进程确被清理(pid 探针死亡、exit 日志 SIGTERM);旁证观察:alive getter 对 signal 死亡误报 true(exitCode===null 语义) | 留档(low) |
108
+ | N119 | src/bridge.ts:354-360 | medium | 【新发现·原证伪被推翻→留档 deferred】writeRaw 及 dispose/killStaleProc 的 stdin 写/端无任何 error 监听:子进程死亡时仍在冲刷的滞留写(超管道缓冲的大消息)以无监听 'error' 事件发射 → uncaughtException('write EPIPE'/'write EOF') → DSH 宿主进程整体崩溃;writable 守卫只挡调用时检查、挡不住在途冲刷失败。触发需三条件竞态(大消息滞留+子进程恰好死亡),后果为整宿主崩溃类,故评 medium | 动态实测(真实 src/bridge.ts,tsx 直调):①writeRaw 同款裸守卫形态(64KB 背压写 + 子进程死亡,无 error 监听)3/3 轮 uncaughtException 'write EPIPE';②真实桥 + 卡死大脑(握手后停读)+ 1MB tools/call → dispose() 3/3 轮 uncaughtException 'write EOF',外部 kill 2/2 轮同样——进程仅因测试挂了 uncaughtException 监听才存活,生产无监听即宿主崩溃;读码 grep stdin 全文仅两处 end 与一处 write、零 error 监听。**前审证伪(21 次小写+挂监听观察 0 事件)未覆盖异步冲刷竞态,本轮首轮挂监听探测即捕获 1 次 async error 事件——证伪被推翻,复核反转如实记录** | 留档(medium,deferred——挂监听本身一行,但吞错后桥状态迁移需与生命周期设计一并定;材料建议下批优先) |
109
+
110
+ **rejected(2,证伪成立/对抗复测无缺陷)**:
111
+ - `src/bridge.ts:170-184`(重启风暴/僵尸累积疑点)——对抗复测(真实 LingshuBridge + 永不握手挂死假子进程,150ms 采样):跑到放弃终态共 8 代、40 次采样,最大同时存活 = 1(无僵尸累积);dispose 后 3s 经引用与 pid 双探针 0/8 存活(全灭);stale-exit 早退分支与 nextId 跨代单调读码确认无串扰。
112
+ - `src/lib/mdcg_client.ts:190`(per-call 超时缺失疑点)——实测 605ms reject、消息含方法名(「灵枢调用超时(600ms):tools/call」);index.ts:266 透传 toolCallTimeoutMs(默认 60_000)→ mdcg_client.ts:190 生效;落盘原子性无缺口(roleplay 写 tmp+rename 读码确认);桥级重试有界(MAX_RETRIES=8,测试 7 次实测进入放弃终态并停止调度)。
113
+
114
+ ### tests 区(19 confirmed:全 legacy 复测;0 rejected)
115
+
116
+ 本区为历轮留档项的独立复测面(每条标「本会话独立复现」者为上游复核会话实跑,非本报告会话)。与 scripts/ts-store/ts-web 区跨区重复 10 条(N27/N28/N29/N35/N38/N39/N40/N43/N47/role_id 族)已并入上三节对应条目,不重复占坑;独立条目如下:
117
+
118
+ | # | where(缺陷时点) | 严重度 | 问题摘要 | 证据要点 | 状态 |
119
+ |---|------|--------|----------|----------|------|
120
+ | v12 N113★ | swarm/tests/test_swarm_topology.py:74-81 | medium | 【留档复测·维持留档→deferred】测试静默跳过洞:② centralized/mesh 段全部断言包在 `if rr["ok"]:` 内且段内无任何无条件 check——拓扑运行失败时断言无声消失、套件仍全绿 exit 0,回归被掩盖(:63/:85/:92/:100 各有无条件 check 唯 :74/:79 缺) | monkeypatch 复现:替换 run_swarm 使 centralized/mesh 返回 {ok:False} → ②段零断言行、①③④段全 ✓、结尾「9 passed, 0 failed」exit 0;当前全量 189/189 全绿非活缺陷(守卫洞潜伏),修复名额让给正在影响自举行为的 N114,材料建议下批必收 | 留档(medium,deferred) |
121
+ | v9 N77★ | md_cg/writepipe.py:437 + md_cg/mdcos.py:603 | medium | 【留档复测·维持留档→deferred】query 热缓存失效缺口:_hc.invalidate 全仓唯一点在 writepipe after_trust(仅 MCP op=write 路径触发),cg.add 直写与 review_decide 不失效——MDCG_HOTCACHE=1 下写后 ≤300s 内 search_rrf 返回写前陈旧结果且仅 cached=True 无陈旧告警 | 隔离临时库活证:add(node_a) → search_rrf 同 query 第二次 cached=True 填缓存;直写 add(node_probe_b) 后再查同 query → cached=True、ids=['node_a'](新节点缺失)、hotcache stats {invalidations:0, query_hits:2};test_hot_cold.py:112 注释自认「直接 cg.add 不经过 writepipe,手动调 invalidate 模拟」;review_decide 读核亦无 invalidate | 留档(medium,deferred——失效粒度属缓存一致性设计决策) |
122
+ | v9 N78★ | md_cg/hotcache.py:60-62 + md_cg/mdcg.py:364 | medium | 【留档复测→本轮修复】query 缓存键进程级开关快照漏 MDCG_CN_GRAMS:该开关每调用读 env(实测改变召回词集:开 6 terms / 关 1 term),运行期翻转后同 query 命中另一口径缓存(静默错答)(详 F3) | 对照实验:已登记开关翻转 → cached False(miss),唯 CN_GRAMS 翻转 → cached True;守卫端到端可量化(旧口径 cached=['gold'] vs 旁路真值 ['gold','d1']) | **已修**(F3) |
123
+ | v6 N30 | scripts/criteria_fingerprint.py:44 | low | 【留档复测·维持留档】--commit 每调泄漏一个含仓库快照的临时目录(worktree_of mkdtemp 无清理) | 实测:TEMP 下 criteria_ 目录计数 1 → 跑 --commit HEAD --json(输出 files=155 正常)→ 2,新增目录含 24 个文件;grep 通读 worktree_of 无 rmtree/finally/TemporaryDirectory;复现产物已清理 | 留档(low) |
124
+ | v6 N34 | scripts/retr_time_coverage.py:179 | low | 【留档复测·维持留档】--out 裸文件名即崩:os.path.dirname 返空串 → makedirs('') FileNotFoundError;retr_baseline_diff.py:443-444 同型未一并修 | 实跑:--root 空临时目录 --out bare_result.json → FileNotFoundError 指向 :179,rc=1;同型读核在位 | 留档(low) |
125
+ | v6 N36 | scripts/bootstrap_watchdog.py:81-82 | low | 【留档复测·维持留档】盘符 glob 死代码:`[系统盘]:\Python3*\python.exe` 被 glob 当单字符字符类(匹配 系/统/盘 单字符盘符),永不命中真实盘符;仅 LINGSHU_PYTHON 未设且 sys.executable 空且 basename 无 'python' 的罕见组合可达 | glob 语义实验:'[abc]bc' 命中 abc/bbc(字符类单字符)、'[系统盘]bc' 与盘符形态均空;无错误行为输出 | 留档(low) |
126
+ | v6 N37 | scripts/bootstrap_watchdog.py:289-296 | low | 【留档复测·维持留档】degraded 分支仅 `if procs and not check_only` 才重启——进程已死 + 日志新鲜 + 连续错误轮时不拉起,恢复延迟至日志陈旧(>2×interval+120s,interval 默认 600s) | 读码证据(复现需真实拉起/杀死常驻进程,维持 v6 验证手段不足口径)::289 procs 空时只 log+print return 0;:308-329 stale 分支才无条件 restart | 留档(low) |
127
+ | v6 N41 | src/lib/mutual.ts:304-310 | low | 【留档复测·维持留档】stale processing-* 无恢复机制:claim 用 rename task→processing,处理进程硬崩溃(kill/断电,不走 catch)后 processing-*.json 永久滞留,scanTasks 只认 task- 前缀——任务永不重试也无人清理 | 读码+grep:`processing-` 全 src/ 仅 claimPath 构造一处;:328-340 result/done/rename-back 均为进程内 try/catch 路径;触发前提 mutual.enabled=true(默认 false) | 留档(low) |
128
+ | v6 N46 | src/lib/whitebox_llm.ts:194-210 | low | 【留档复测·维持留档】白箱输入混拼 assistant 文本:serializeMessages 全角色文本序列化作 fallback 输入(reverse+filter 无 role 过滤,lastUserText 实为最后一条任意角色消息);文件已下线(provider 不注册、无运行时调用方),仅存 LIB 本地库 | 读码+grep:whitebox_llm 全 src//test/ 仅 index.ts 注释与自身文件头两处、无 import 无运行时调用方——维持 v6 无运行时暴露结论 | 留档(low) |
129
+
130
+ ### 跨区重复条目合并说明(冗余 11 条,37 条目 → 26 独立缺陷组)
131
+
132
+ - **v6 N27**(judgment_manifest --verify 缺参):scripts / tests 两区各一条(2 条)——随 F1 修复;
133
+ - **v6 N28**(SUMMARY 契约断裂):scripts / tests 两区各一条(2 条)——随 F2 修复;
134
+ - **v6 N29**(interop_gate KeyError):scripts / tests 两区各一条(2 条)——留档;
135
+ - **v6 N35**(check_unreachable cwd 假绿):scripts(:22)/ tests(:46)两区各一条(2 条)——留档;
136
+ - **v6 N38**(auxRoot 双口径):ts-store / tests 两区各一条(2 条)——留档 deferred;
137
+ - **v6 N39**(writeKeyring):ts-store / tests 两区各一条(2 条)——留档;
138
+ - **v6 N43**(roleplay cwd 漂移):ts-store / tests 两区各一条(2 条)——留档 deferred;
139
+ - **v6 N40**(mutual 冷却):ts-web / tests 两区各一条(2 条)——留档;
140
+ - **v6 N47**(hooks 阻塞):ts-web / tests 两区各一条(2 条)——留档 deferred;
141
+ - **role_id 未白名单族(v6 N45 + v8 N65)**:ts-web translate 面(:916-926)/ ts-web import·roles 面(:745)/ tests N45 口径(:894-930/:952-961)三区三条——同根因(入口缺 validRoleId)合并一组,translate 面随 F5 修复、残面留档。
142
+
143
+ 冗余 11 条(前九组各 1 + role_id 族 2),37 − 11 = 26 独立缺陷组 = 新 6(N114-N119)+ legacy 20 组(v6 16 组含 role_id 族、v8 N66、v9 N77/N78、v12 N113)。
144
+
145
+ ---
146
+
147
+ ## 四、验证(门禁结果)
148
+
149
+ 以下「本报告会话实跑」均为本报告写作会话在仓库根目录实际运行(第一手);「材料口径」为复核/修复/门禁会话已跑、本会话未重跑(如实区分):
150
+
151
+ | 命令 | 结果 | 来源 |
152
+ |------|------|------|
153
+ | `python -X utf8 scripts/run_tests.py --jobs 4`(全量,第二次) | `===== SUMMARY 189/189 通过,5 跳过(依赖缺失/平台不符) =====`,**真实退出码 0**(输出重定向文件后取 `$?`,非管道尾码)——与材料门禁口径一致 | **本会话实跑** |
154
+ | 同上(第一次) | `===== SUMMARY 188/189 通过,5 跳过 =====`,失败:md_cg.test_p41_evolve_patrol;**单跑复测** `python -X utf8 -m md_cg.test_p41_evolve_patrol` → `P41 结果:PASS 36 / FAIL 0` 通过——判定为 --jobs 4 并行下的偶发(flaky)波动,非本轮五修复回归(修复面 judgment_manifest/verify_runner/hotcache 键/bootstrap_loop status/roleplay translate 与该套件无交集;第一次跑失败后未改任何代码即重跑转绿)。**如实记录:该波动不在本轮材料缺陷范围内,单列观察,不立缺陷项** | **本会话实跑** |
155
+ | `python -X utf8 scripts/test_judgment_manifest.py` | 「judgment_manifest 守卫: 16 通过 / 0 失败」EXIT=0(含节 [4] 缺参守卫 [PASS])——与材料修后 16/0 一致;材料红证修前 14/2(本会话未重跑红证) | **本会话实跑** |
156
+ | `python -X utf8 -m md_cg.test_interop_judgment` | 「interop_judgment: 37 通过 / 0 失败」EXIT=0(含节 [8] 契约守卫)——与材料修后 37/0 一致;材料红证修前 33/4 | **本会话实跑** |
157
+ | `python -X utf8 -m md_cg.test_i32_hotcache_env_key` | `PASS=14 FAIL=0` EXIT=0(含 K7-K10)——与材料修后 14/0 一致;材料红证修前 9/5 | **本会话实跑** |
158
+ | `python -X utf8 scripts/test_bootstrap_channel_b.py` | 「bootstrap 通道 B 守卫: 9 通过 / 0 失败」EXIT=0(含节 [3] 饥饿守卫)——与材料修后 9/0 一致;材料红证修前 5/4 | **本会话实跑** |
159
+ | `node --import tsx --test test/roleplay_translate_guard.test.ts` | tests 4 / pass 4 / fail 0,EXIT=0——与材料修后 4/4 一致;材料红证修前 ①②④ fail(got 200 ≠ expected 400) | **本会话实跑** |
160
+ | `npm test` | tests 53 / pass 52 / fail 0 / **skipped 1**(既有跳过项),退出码 0——与材料「全套 node --test 12 文件 53/52/0/1」一致 | **本会话实跑** |
161
+ | `npm run gate` | 「结论:9/9 目标一致」退出码 0(check_unreachable / cogmap_sync / link_check「全部相对链接可达」/ workspace_index --check / verify_discipline 注入面 8 链全 OK)——与材料口径一致 | **本会话实跑** |
162
+ | `cargo test` | **未运行**——Rust 面零改动(git status 无 rust/ 与 swarm/ 源码改动,改动面仅 scripts/md_cg/hive/src/test 十件+新增一测试),与材料口径一致 | 双方一致 |
163
+
164
+ **上游会话已运行、本会话未重跑的验证**(材料原文,如实区分):五项修复的守卫红证(修前各一跑,红绿数字见第二节各守卫行);F1 的 CLI 回归全套(--digest / --check-coverage / --verify 冻结文件 PASS / 篡改首 hash 后 FAIL 且 changed[0] 精确 / --verify 不存在文件 exit 1 / 缺参 exit 2);F1 的调用面回归(md_cg/interop.py 进程内 import 同源不变式:collect() 196 files 与 CLI digest 相等);F2 的回归(test_p39_verify_flow 11 passed);F3 的回归(run_tests.py md_cg -k hotcache 2/2、-k hot_cold 1/1、-k v14_fixes 1/1、-k readcache 2/2);F5 的回归(npm run build 无错、test/roleplay_edit_guard.test.ts 6/6、test/verify_web.ts 与 git stash 基线逐项一致——②④⑤ 为该脚本 mock 契约漂移的既有失败非本次回归);四区复核全部复现实跑(隔离 STATE/tempfile 台架、哑数据、测毕清理);N119 的大消息竞态 3/3 轮实验与前审证伪实验。
165
+
166
+ **git 工作树核对**(本会话 `git status --porcelain` / `git diff --numstat` + 五处落点读核):改动面 = **五个修复源文件**(scripts/judgment_manifest.py +6/-1〔F1〕、hive/verify_runner.py +10/-1〔F2〕、md_cg/hotcache.py +4/-1〔F3〕、scripts/bootstrap_loop.py +6/-0〔F4〕、src/lib/roleplay_web.ts +9/-0〔F5〕)+ **五份守卫**(scripts/test_judgment_manifest.py +14、md_cg/test_interop_judgment.py +33、md_cg/test_i32_hotcache_env_key.py +73/-1、scripts/test_bootstrap_channel_b.py +55、test/roleplay_translate_guard.test.ts 新增未跟踪)——与五项修复一一对应。另有 `md_cg/whitebox_kb/wisdom/code_solidified.json`(+1/-2)为 v10-v12 报告已注明的先前会话遗留工作区变更,非本轮触点。未做任何 commit。
167
+
168
+ ---
169
+
170
+ ## 五、遗留清单(22 个开口:deferred 设计决策类 8〔medium 7 / low 1〕+ 历轮留档维持类 14〔全 low〕)
171
+
172
+ ### deferred 设计决策类(8 项,材料「留档未修」清单——修复涉设计决策非纯缺陷修补,按标准④降级)
173
+
174
+ | # | where(缺陷时点) | 严重度 | 问题 | 留档理由 / 处置线索(材料口径) |
175
+ |---|------|------|------|------------------------------|
176
+ | v8 N66 | src/lib/roleplay_web.ts:829-892 | medium | chat 端点跨站简单请求可触发状态变更(转录落盘/LLM 消耗/认知图写入) | 修复需先定拦截策略(Origin/Host 校验范围、跨端 CLI 调用兼容),属设计决策非纯缺陷修补 |
177
+ | v6 N43 | src/index.ts:157 + src/lib/roleplay_web.ts:542 | medium | roleplay 数据面随宿主 cwd 漂移分裂 | 涉存量部署数据迁移语义(无确定性迁移源,先例 migrateLegacyData 只迁 repoRoot/data),待迁移方案单独评估 |
178
+ | v6 N38 | src/lib/token_store.ts:76-79 + md_cg/datapath.py:244 | medium | auxRoot 双口径分裂(重复自动签发永不吊销) | 需 node/python 双进程路径锚点口径协商(统一锚到哪侧、MDCG_CHILD_CWD 与宿主 cwd 关系如何入 token_store),风险中涉口径设计 |
179
+ | v9 N77 | md_cg/writepipe.py:437 + md_cg/mdcos.py:603 | medium | query 热缓存失效缺口(cg.add 直写与 review_decide 不失效) | 失效点铺设位置与失效粒度(全清/键级/惰性 TTL 收口)属缓存一致性设计决策,风险中 |
180
+ | N115 | scripts/bootstrap_loop.py:336 | medium | 通道 B 物理验证无执行超时(纯计算死循环挂死 run_channel_b,watchdog 重启后同条目再挂死) | Windows 无 SIGALRM,超时机制选型(线程/子进程隔离)与超时后条目处置(标 failed?拉黑重试?)属设计决策;对照 run_tests._run_one 与 verify_runner._run 均有超时,此面独缺 |
181
+ | N119 | src/bridge.ts:354-360 | medium | stdin 写无 error 监听致宿主 uncaughtException(大消息滞留+子进程死亡三条件竞态) | 修复挂监听本身一行,但吞错后桥状态迁移(是否标记断连触发重启路径)需与桥生命周期设计一并定;**材料建议下批优先** |
182
+ | v12 N113 | swarm/tests/test_swarm_topology.py:74-81 | medium | 拓扑测试静默跳过洞(守卫洞潜伏,当前 189/189 全绿非活缺陷) | 修复本身一行低风险(段内加无条件断言);名额按标准①让给正在影响自举行为的 N114;**材料建议下批必收** |
183
+ | v6 N47 | src/hooks.ts:239-240 | low | system-prompt waterfall 内 await graph.timeline 阻塞至 toolCallTimeoutMs | 修复需重构 waterfall 装配结构(并行化或降级路径),涉 hooks 结构重构 |
184
+
185
+ ### 历轮留档维持类(14 项,全 low——历轮已留档、本轮复测确认在位、未入选本轮修复名额)
186
+
187
+ | # | where(缺陷时点) | 问题 | 备注 |
188
+ |---|------|------|------|
189
+ | v6 N29 | scripts/interop_gate.py:61 | pass 态缺 failed 字段 KeyError 裸崩(应 exit 3) | 触发面限旧版/手工产物(生产方总写该字段) |
190
+ | v6 N30 | scripts/criteria_fingerprint.py:44 | --commit 每调泄漏一个仓库快照临时目录 | 资源泄漏、无正确性影响 |
191
+ | v6 N34 | scripts/retr_time_coverage.py:179(同型 retr_baseline_diff.py:443-444) | --out 裸文件名即崩 | 用法边缘;同型两文件宜一并修 |
192
+ | v6 N35 | scripts/check_unreachable.py:22/:46 | 错目录运行 0 文件仍 PASS(ROOTS 相对路径假绿);「全仓」标题与 4 根覆盖不符 | npm run gate 主消费面安全(cwd=仓根),暴露面限手动直跑 |
193
+ | v6 N36 | scripts/bootstrap_watchdog.py:81-82 | 盘符 glob 死代码 | 永不生效分支,无错误行为 |
194
+ | v6 N37 | scripts/bootstrap_watchdog.py:289-296 | 进程已死且日志新鲜时不拉起,恢复延迟至日志陈旧 | 验证手段不足(需真实拉起/杀死常驻进程),维持读码口径 |
195
+ | v6 N39 | src/lib/token_store.ts:97-105 | writeKeyring 无 try + 无原子写(激活中断 + 重试泄漏不吊销令牌 + 截断密钥环致大脑拒启) | 与 N38 同文件同域,宜一轮配齐验证 |
196
+ | v6 N40 | src/lib/mutual.ts:129-195 | restartCooldownMs 契约未实现 | mutual.enabled 默认 false + 10min 心跳事实节流 |
197
+ | v6 N41 | src/lib/mutual.ts:304-310 | stale processing-* 无恢复机制 | mutual.enabled 默认 false;A 侧 guardian 不在本仓无法核实重发自愈 |
198
+ | v6 N45 / v8 N65 残面 | src/lib/roleplay_web.ts:745 + :894-930/:952-961 | role_id 未白名单入口残面:/api/roles/<id>/import 与 POST /api/roles、GET /api/translate、GET /api/history(POST translate 已随 F5 修);P2-23 注释「入口统一卡死」与实际不符 | 写路径在 403 edit-key 闸后(需持密钥构造请求);mdcg 侧 node_id 白名单两层缓解在位 |
199
+ | v6 N46 | src/lib/whitebox_llm.ts:194-210 | 白箱输入混拼 assistant 文本 | 文件已下线无运行时调用方,仅存 LIB 本地库 |
200
+ | N116 | scripts/link_check.py:44 | _git 不查返回码:空仓库/坏 .git 时扫描 0 文件仍「全部可达」exit 0 | 修法清晰(对齐 workspace_index tracked() 的 fail-closed 形态);CI 消费面在 cogmap-check.yml:36 |
201
+ | N117 | src/lib/datapath.ts:70-79 | stateRoot/dataRoot/mdcgRoot 三根 env 相对/~ 形态 node/python 双口径分居 | 触发需用户自设非常规 env;MDCG_ROOT 插件部署面被遮蔽 |
202
+ | N118 | src/bridge.ts:243 | boot 期 dispose 后 waitReady 悬挂(bootQueue flush 三处均守 disposed) | 宿主侧可达性取决于 cordis 生命周期,按桥 API 层悬挂留档 |
203
+
204
+ **优先级建议**(据材料处置线索汇总):N119 与 N115 为后果最重的两条新发现(宿主崩溃类 / 永久 DoS 形态),材料建议下批优先;v12 N113 修复极简且材料点名「下批必收」;v8 N66 需先做 Origin 校验策略决策;v6 N38/N39 与 N117 同为双进程路径口径族(auxRoot/三根 env),宜一轮协商统一锚点后配齐验证(含已泄漏令牌清理语义);v9 N77 失效粒度与 F3 同域可顺势盘点(连同 F3 留档观察的 MDCG_LAYER_BOOST / GATE_S4_LAYER 等子开关漏登族);v6 N43 待迁移方案;其余 low 项按批次缓收。
205
+
206
+ ---
207
+
208
+ ## 六、纪律合规声明
209
+
210
+ 1. **定位先读索引**:本报告写作前已读 WORKSPACE_INDEX.md(按职责定位 scripts/ 为「工程管线——纪律渲染/守卫、认知图同步、发布件与常驻进程体检」、src/ 为「DSH 插件 TypeScript 源码」、docs/eval 为历轮报告所在),未做全盘浏览。
211
+ 2. **结论引证**:所有修复与缺陷均引 path:line(材料口径为缺陷/修复时点快照行号;本报告会话对五处修复落点逐处读核——judgment_manifest.py:129-135 缺参分支与 v6 N27 注释、verify_runner.py:48-67 SUMMARY 正则与 v6 N28 注释、hotcache.py:60-65 六项开关清单与 v9 N78 注释、bootstrap_loop.py:289-296 status=failed 与批次 35 同型注释、roleplay_web.ts:918-926 P1-3 补卡白名单——材料行号与现行读核全部吻合无漂移,如实声明);第三节证据要点摘自任务输入的四区复核材料(上游会话读码+实跑);第四节「本报告会话实跑」十一项为第一手命令与输出(两次全量回归含一次 flaky 波动的如实记录、五守卫绿态、npm test、gate、git 核对),材料口径与未跑项均如实标注来源,无一冒充。
212
+ 3. **编号续编声明**:材料 confirmed 的 origin=new 条目未携带编号,本报告会话按历轮 N 口径续编 N114-N119(v12 用至 N113,v12.md:4 编号口径行核实);legacy 项编号经 v6.md:78-81/:90-93/:99-102/:109-113、v8.md:103-104、v9.md:87-88、v12.md:116 grep 核实。role_id 族 v6 N45 与 v8 N65 双编号按根因合并单列(v8.md:103 自述与 v6 N45 同族),历轮无独立的「translate 假成功」编号——该面为本轮材料在族下的具体缺陷形态,F5 修复后族部分收窄。
213
+ 4. **安全测试纪律**:材料中全部复现均为系统临时目录/隔离 STATE 台架(tempfile.mkdtemp + importlib 载入,不碰真实数据根)+ 哑数据(探针消息/哑编辑密钥占位值),测毕清理(材料逐项自述「探针产物已清理」「未触碰真实 ~/.mdcg」「临时目录 0 残留」);token_store 面复现均以 MDCG_AUX_ROOT/MDCG_CHILD_CWD 隔离到临时目录,崩溃注入面(需真实写坏 keyring)明确声明未做、维持读码定级;本报告会话只运行测试套件、回归、npm test/gate 与 git 只读命令,未做任何攻击/越权复现。
214
+ 5. **已修项不重复报**:v6.md 第二节历轮已修面(migrate_restricted 透传/bootstrap_loop 两修/roleplay 编辑密钥/bridge 进程泄漏、批次 34/35 exec 脱敏与 channel_b 冒烟、批次 36 verify_linux 清单)未再报;材料 rejected 中 scripts/bootstrap_loop.py:373 条目正是批次 34/35 修复面的复核维持(实跑双守卫 5/0、4/0 且固化入参只含合法条目);v8 P2-23 已修面(meta/chat 白名单)未再报,本轮只报其注释宣称与残面实际不符及未覆盖入口;N119 的前审证伪被推翻过程如实单列(前审实验设计未覆盖异步冲刷竞态,本轮 3/3 轮捕获——复核反转依据材料自证)。
215
+ 6. **隐私脱敏**:全文只写仓库相对路径;材料与本会话输出的本机绝对路径(用户家目录、系统临时区路径、盘符根)一律转录为「家目录/系统临时目录/盘符根/临时双 cwd」等占位描述;无任何 key/token/密钥字面量(哑编辑密钥写为占位描述);守卫中出现的 EPIPE/EOF 为错误码证据非凭据;SUMMARY 摘录中的 digest 指纹为哈希输出非机密。定稿前经机械扫描复查(盘符/用户目录/凭据字面量形态零命中,见下方自查)。
216
+
217
+ ---
218
+
219
+ ## 七、跳过项及原因
220
+
221
+ - **cargo test 未运行**:Rust 面零改动(git status 无 rust/ 与 swarm/ 源码改动,改动面仅 scripts/md_cg/hive/src/test 十件+新增一测试文件)——材料与本会话口径一致。
222
+ - **守卫红证未在本会话重跑**:上游修复会话已跑且逐项留痕(修前红/修后绿数字见第二节各守卫行);本会话重跑需回退工作树(多轮改动未提交、无法整体回退),风险大于收益——以修复落盘读核 + 修后绿态实跑 + 全量回归替代佐证,如实标注。
223
+ - **四区复核的复现场景未在本会话重复**:上游复核会话已在隔离环境执行并逐项声明清理(第三节证据来源均标注为材料原文);本会话未重跑 N115 死循环挂死、N117/N38 双口径探针、N119 大消息竞态、v8 N66 CSRF 形态等复现。
224
+ - **F1-F5 的专项回归细项未逐条重跑**:材料 verified_by 所列 CLI 回归全套、调用面同源不变式、-k hotcache 等专项(第四节上游会话已运行段)本会话未重跑;以全量回归 + 五守卫绿态覆盖。
225
+ - **全量回归第一次跑的 flaky 波动未深挖根因**:md_cg.test_p41_evolve_patrol 在 --jobs 4 并行下一次失败(单跑 36/0、重跑 189/189 通过),不在本轮材料缺陷范围内——单列为观察记录,不立缺陷项也不擅自改动;是否立案归运行主裁量。
226
+ - **role_id 族 GET /api/translate 与 GET /api/history 面、F3 留档观察的子开关漏登族未修**:前者在 edit-key 闸后暴露面窄且族修复策略(统一在入口层还是 setTranslations 层收口)宜与残面一并定;后者(MDCG_LAYER_BOOST 等)是否扩键由运行主决定——均如实留第五节,未擅自扩scope。
227
+ - **git 未提交**:commit 需任务方指令;工作树保持五源文件补丁 + 五守卫增补原状(及一件 v10-v12 已注明归属的先前会话 wisdom json 变更)。
228
+
229
+ ---
230
+
231
+ *报告依据:任务输入的第 13 轮材料(四区复核 37 confirmed / 4 rejected 明细及证据〔scripts 7+2 / ts-store 4+0 / ts-web 7+2 / tests 19+0〕、五项修复的 where/问题/修复/前后对比/守卫/verified_by、留档未修 8 条、门禁结果);本报告会话的修复落盘读核(五补丁现行行号锚点与材料吻合)、五守卫绿态实跑(16/37/14/9/4 全绿)、全量回归两次实跑(188→单跑 36/0→189/189、真实退出码 0)、npm test 实跑(53/52/0/1 skipped)、npm run gate 实跑(9/9 目标一致)、legacy 编号历轮报告 grep 核实(v6.md/v8.md/v9.md/v12.md)、git 工作树核对(numstat 与五修复一一对应 + 一件先前遗留 json)、报告脱敏机械扫描。*
232
+
233
+ *自查双清单:①材料覆盖——四区 41 条目全部入文(confirmed 37:scripts 7 / ts-store 4 / ts-web 7 / tests 19;rejected 4:scripts 2 + ts-web 2 如实单列,含 N119「原证伪被推翻」的反转记录),跨区冗余 11 条合并说明单列,去重后 26 独立缺陷组(新 N114-N119 共 6:medium 3/low 3 + legacy 20 组:v6 16 组含 role_id 族、v8 N66、v9 N77/N78、v12 N113)数目吻合,5 补丁逐项五要素齐全(where/问题/修复/前后对比/守卫),全闭 4 组 + role_id 族部分收窄、26 − 4 = 22 开口(deferred 8 + 历轮维持 14)与材料留档 8 条逐条对应无多无少,legacy 项全部标注原轮次(编号经 v6/v8/v9/v12 报告 grep 核实),门禁四项(python 通过/npm test 通过/gate 通过/cargo 未运行)与跳过原因一一对应,材料与实跑不一致处(第一次全量 188/189 flaky vs 门禁材料 189/189——以单跑复测+重跑转绿+修复面无交集三重证据如实记录为波动)如实记录;②纪律——全部结论引 path:line 或注明材料来源,十一项第一手实跑命令与输出在第四节(两次全量回归含真实退出码取证、五守卫、npm test、gate、git numstat 与五落点读核),未跑项(cargo/守卫红证/复现场景/专项回归细项)无一冒充为已跑,新发现续编编号(N114-N119)与 role_id 族合并口径显式声明而非暗改,N119 证伪被推翻的过程双向留痕,全文无本机绝对路径、无 key/凭据字面量(机械扫描盘符/用户目录/凭据字面量形态零命中;哑数据均以占位描述),本会话未 commit、未触碰真实令牌与真实数据根。*