@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,283 @@
1
+ # 缺陷挖掘报告 · 自主迭代 v20(scripts+TS 三轮深挖·三圈第五站)
2
+
3
+ > **轮次**:第 20 轮——scripts+TS 三轮深挖,三圈第五站(前三站:v17 swarm 专项 / v19 swarm 三轮深挖·三圈第四站)。
4
+ > **材料来源**:编排会话传入四区复核结果(legacy / recent / scripts / ts)、修复结果(5 项)、留档未修清单(36 条目)、门禁结果——全部为各任务会话实测,本报告如实汇编;本报告会话自身另实跑编号基线核对与索引定位(见「四、验证」明细分账)。
5
+ > **编号基线**:`docs/eval/缺陷挖掘_自主迭代_v19.md` 与 `_v18.md` 最大 N 编号 = **N166**(本报告会话 `grep -oE "N[0-9]+"` 两文档 sort -u 实测,尾部 N162-N166),本轮新编号自 **N167** 续编。
6
+ >
7
+ > **⚠️ 编号冲突声明(归编排会话裁定)**:本轮修复/发现由多个并行任务会话完成,各自独立自 N167 续编,产生三股并行编号流——①recent/legacy 流(dsh_log_index 派生标识碰撞=N167、skip-existing=N168、init.ts:291 波浪线=N167 同族标记);②scripts 流(check_publish_artifact=N167、verify_discipline=N168、bootstrap_loop 状态写=N169、watchdog no_log=N170、cogmap_sync=N171、dsh_log_index:447=N172);③ts 流(bridge 秒崩重启=N167、init EOF exit0=N168、shell 引号=N169、roleplay 虚假成功=N170、tools 取消=N171)。同号不同缺陷(如三个 N167 各指三个不同缺陷面)。F4 正确沿用旧号 v13 N119 未占新号。**最终编号裁定权归编排会话**;本报告按各股流原号如实登记、以 where 定位不依赖编号唯一性。
8
+ >
9
+ > **隐私脱敏口径声明**:上一稿未过隐私门禁(命中详情未随重写指令传入),本稿按保守口径全面脱敏——哑数据派生的十六进制标识/指纹串一律截断为「头4…尾4」形态(可核对性:与材料台账比对头尾即可逐位确认,报告内不呈现全串);占位符令牌样串不呈现全串(以形态描述代之);本机钟点时间戳、系统临时区随机目录名、宿主安装路径示例泛化描述。全部实验数据(计数、场景、退出码、判定)原样保留,脱敏仅及字符串呈现形态。
10
+
11
+ ---
12
+
13
+ ## 一、执行摘要
14
+
15
+ 本轮对 scripts/ 与 src/(TS)两域做第三轮深挖,四区并行复核 + 5 项修复落地 + 全量门禁回绿:
16
+
17
+ - **四区复核**:confirmed **42 条目** / rejected **7 条**。confirmed 去除跨区同面复测记录后 **39 个独立缺陷面 = 新发现 18(high 2 / medium 9 / low 7)+ legacy 复测 21 面**(v6 复测 14、v13 复测 5、v8 复测 1、v18 复测 1——跨区重复条目:init.ts:291 两区各一条、v8 N66 两区各一条、S7 合并条与 N35/N116 单列条并存;逐条原轮次标注见第三节)。
18
+ - **修复 5 项**(全量门禁回绿):
19
+ - **F1(high,N167·recent 流)** `scripts/dsh_log_index.py` 派生标识跨会话碰撞——`sha256(created_at|首条user)[:16]` 不含日志文件身份,同毫秒+同首条 prompt 的批量会话互相吞正文(静默数据丢失+归因串台)→ 主 token 公式不动、追加 `|workspace|session_id` 兜底空间 + 既有节点归属 fail-closed 核验,守卫 11 FAIL→23/23 PASS + 反证实验闭环。
20
+ - **F2(high,N167·scripts 流)** `scripts/check_publish_artifact.py` scan_text_hits 每规则只取首配、占位符令牌降级即 continue——「占位符在前、真凭据在后」整条逃逸 R1,发版门禁系统性静默漏报 → 改 `finditer` 全命中遍历,守卫 2 FAIL→9/9 PASS + selftest 30 条全绿。
21
+ - **F3(medium,N169·scripts 流)** `scripts/bootstrap_loop.py` 通道 B 三份状态 JSON 非原子写 + 四处裸 json.load 无自愈——taskkill /F 时序即永久死亡且判活假绿 → `_atomic_write_json`(P2-14 同款)+ `_load_json_state`(损坏留痕自愈)+ watchdog DEGRADED 清单注册,守卫 14 FAIL→21/21 PASS。
22
+ - **F4(medium,v13 N119 留档落地,不占新号)** `src/bridge.ts` stdin 写无 error 监听——大消息背压+子进程死亡竞态下 EPIPE 逃逸为宿主 uncaughtException → spawn 后挂一次性常驻 error 监听(+14 行纯增量),红证探针实测 uncaughtException 逃逸 → 修后由监听吞错留痕。
23
+ - **F5(medium,N167·legacy/recent 流)** `src/init.ts` `--root`/交互手输不做波浪线展开——自带示例 `--root ~/.lingshu/memory` 落进 cwd 下字面 `~` 目录且随 cwd 漂移分裂 → 新增 `expandHomeTilde` 两条入口汇合点一次展开(与 `md_cg/datapath.py` expanduser+abspath 同口径),守卫红→绿 + init.test.ts 全文件 7/7。
24
+ - **留档 36 条目**(跨区同面复测记录去重后 **34 独立缺陷面:medium 11 / low 23**),其中本轮新发现未修 14(medium 7 / low 7)、legacy 复测维持 20 面。锚点口径族(N38/N43/N117 与已修 N167 同族)、v8 N66 CSRF 拦截策略、v13 N115 超时选型等 deferred 理由逐条维持。
25
+ - **剔除 7 条**:已修复测通过剔除 4(外部对抗 A1-a 白名单切分 / A5-a V21-1 终止文案 / v6 N27 judgment_manifest fail-closed / v6 N28 SUMMARY 正则);非缺陷维持登记 3(D-f 无文件锁取舍、dsh_log_index:222-224 三点留档复核全不成立、P2-11 读改写竞态不成立)。
26
+ - **门禁**:python 全量回归通过(第 2 轮);`npm test` 通过(exit 0);`npm run gate` 通过。四区确认 42 / 修复 5 / 留档 36。
27
+
28
+ ---
29
+
30
+ ## 二、修复清单(5 项,逐项 where / 缺陷面 / 修复 / 攻防前后对比 / 守卫)
31
+
32
+ ### F1(high,N167·recent 流)dsh_log_index 派生标识跨会话碰撞——同毫秒+同首条 prompt 的会话互相静默吞正文
33
+
34
+ - **where**:`scripts/dsh_log_index.py` —— `derive_session_token`(修前 :472-481,basis=`sha256("{createdAt毫秒}|{首条user消息全文}")[:16]` 不含日志文件身份)与 `ingest_transcript` 的 skip-existing(修前 :504-507 不核验既有节点归属)。缺陷编号 N167(编号基线已核:v19 最大 N166,本轮自 N167 续编)。未触 `md_cg/` 与任何在役数据面。
35
+ - **缺陷面**:无需攻击者的数据面缺陷——DSH agent/harness 常态的脚本化批量会话(同毫秒发同一首条 prompt)即触发;碰撞后后到会话经 skip-existing 全部章节静默跳过,独有正文零节点入库且 rc=0 无告警(静默数据丢失+归因混淆面:不同会话共享同一派生身份 `dsh-log-<token>-*`)。唯一 fail-closed 告警(unknown 事件 :756-768)不覆盖此路径。
36
+ - **修复**:最小修复,主 token 公式保持不动(既有节点幂等零迁移):①新增 `derive_session_token_ext`——basis 追加 `|{workspace}|{session_id}`((workspace,session_id) 目录对唯一标识一个日志文件且跨重启稳定:同文件重跑同值=兜底空间内幂等,不同文件恒不同);②新增 `_dsh_log_owner`——经公开读面 `cg.get` 读既有节点 frontmatter.dsh_log 归属(读不出=非本会话,fail-closed:宁可兜底空间多入一份,不静默吞正文);③`ingest_transcript` 增 ext_token 参——摄取前核验主 token 下任一既有节点归属,非本会话即整体切兜底空间重编号摄取(不再无条件 skip-existing),返回 dict 增 collision;存在性判定保持走 `cg.index`(与可见性/密钥无关,避免把不可见节点当不存在而覆写);④main 计算并传入 ext_token,碰撞时 stderr WARNING + row 增 token_collision/session_token_main(生效标识=兜底 token)+ TOTAL 增 token_collisions 计数;⑤模块与函数 docstring 同步碰撞防线说明。**行为变化如实声明**:修前 private 旧版节点重跑被静默 skip(v4 内容永不入库的隐性面),修后读不出归属按 fail-closed 判碰撞切兜底空间摄取并告警——方向为数据不再静默丢,代价仅兜底空间可能多一份节点且告警可见。
37
+ - **攻防前后对比**:修前(临时哑库端到端实测):ws-gt-a/sess-AAAA、sess-BBBB、ws-gt-b/sess-CCCC 同 createdAt 同首条 user → 三者派生 token 全同(同一 16 位十六进制值,记作 `T-coll-α`,全串见材料台账);退化组(缺 type=session 首行+无 user)sess-DDDD/sess-EEEE 全同(记作 `T-coll-β`);后到会话经 skip-existing 全部章节静默跳过——库中归属仅 ['sess-AAAA','sess-DDDD','sess-FFFF'],BBBB/CCCC/EEEE 独有正文零节点入库,rc=0、stderr 空、无任何告警。修后:同批次实测 6 会话 token 互不相同,BBBB/CCCC/DDDD/EEEE 各自入库且正文含独有标记、frontmatter.dsh_log.session/workspace 归属正确,stderr 显式告警「派生标识碰撞(主标识 xxx 已被会话 xxx 占用)——切兜底标识 xxx 重编号摄取,正文不丢弃(N167 防线)」,TOTAL.token_collisions 计数;重跑幂等不破坏(库中节点总数不变、先占者节点 id 前缀不迁移)、检索面每会话均有可召回索引条目。
38
+ - **守卫**:新增 `scripts/test_dsh_log_index_token.py`(CI run_tests.py 的 scripts/test_*.py 发现面自动纳入;哑环境:系统临时目录+哑 zstd 日志+MDCG_MASTER_KEY 哑密钥+MDCG_READ_CACHE=0,测毕自清理)。红面 R1-R5:6 会话(同毫秒同首条×3/缺 session 首行+无 user 退化×2/对照组×1)token 互不相同、碰撞会话(BBBB/CCCC/DDDD/EEEE)独有正文入库且归属/workspace 锚正确、stderr 有碰撞 WARNING、跨批碰撞(AAAA 先落库 BBBB 后到)不丢;绿面护栏 G1-G3:重跑幂等、对照组主公式不破坏、先占者 AAAA 保持主 token 空间不迁移。实测:修前红 **11 FAIL/EXIT=1**(红面 token 值 `T-coll-α`×3 + `T-coll-β`×2——与缺陷复核证据的哑哈希头尾截断逐位一致:`ede6…c271`/`18ba…85d9`,全串不入报告;BBBB/CCCC 零节点、stderr 全静默),修后 **23/23 PASS/EXIT=0**;反证实验(monkeypatch `derive_session_token_ext` 退化为主标识=模拟防线被删)守卫回到同一 11 FAIL 失败面——守卫非恒绿、红绿闭环成立。
39
+
40
+ ### F2(high,N167·scripts 流,撞号归编排裁定)check_publish_artifact scan_text_hits 首配逃逸——占位符在前掩盖真凭据,发版门禁系统性静默漏报
41
+
42
+ - **where**:`scripts/check_publish_artifact.py:205-221`(修前 :209-211 每规则仅 `rx.search` 首配、:217-219 TOKEN_* 首配占位符即 notes.append+continue 跳过该规则余下文本);两模式同源调用点 local_mode :408 / registry_mode :541。缺陷编号沿用报告给定 N167(**注**:与 F1 分属并行任务流,编号撞号,分配归编排会话裁定,本结果照实沿用不改号)。
43
+ - **缺陷面**:任何进入 npm 包的文本件先出现占位符形态令牌,其后同文件真实凭据即可通过 R1 直达公开 registry(local/registry 两模式同源同漏)。前提已坐实:package.json files 含 'docs';`docs/hive/令牌与角色权职分离_v0.1.md` 为 git 追踪件且 TOKEN_MDCG 首配为「mdcg1 前缀+tk_ 段全 x 占位」的占位符形态样串、`_looks_placeholder=True`(全串不入报告)——该文件内占位符之后再现真凭据即静默过门(现状门禁不红是正确态,漏报面在未来)。
44
+ - **修复**:最小修复(+25/-12):①`scan_text_hits` 改为每规则 `rx.finditer` 遍历全部命中——TOKEN_* 规则任一命中为真形态(非占位符)即 hits.append+break(该规则坐实 FAIL,不再扫描);全部命中均为占位符才降级 NOTE(逐条显式列出,不静默丢弃);非 TOKEN_* 规则(PRIVATE_KEY/APIKEY_LITERAL/R3)无降级语义,任一命中即 FAIL,与修前 search 行为等价;docstring 写明 N167 病灶与 break 语义。②`selftest()` 增补 2 条 N167 断言(占位符在前+真凭据在后→FAIL=1;占位符命中仍显式 NOTE=1)——CI publish-artifact-check.yml 第一步 `--selftest` 即守卫。③新增守卫 `scripts/test_check_publish_artifact_scan.py`(run_tests.py 发现面自动纳入,CI python-tests 同跑)。
45
+ - **攻防前后对比**:修前实测四场景:占位符在前+真在后→**FAIL命中=0 NOTE=1**(真令牌整条逃逸,exit 0 无告警);真在前→FAIL=1;仅真→FAIL=1;仅占位符→NOTE。修后同场景:占位符在前+真在后→**FAIL命中=1**(真凭据拦下)+占位符仍显式 NOTE=1(不静默丢弃),其余三场景行为不变;规则间不串扰、非 TOKEN_* 规则不受降级影响。
46
+ - **守卫**:新增 `scripts/test_check_publish_artifact_scan.py`:核心断言全哑数据(真形态样串取自脚本 selftest :611 哑串,与仓库状态解耦)。N1 红点(占位符在前+真在后→FAIL=1,修前实测 (0,1) 恰是首配 continue 语义);N2 真在前→FAIL=1 护栏;N3 仅占位符→(0,1) 降级语义保持;N4 仅真→(1,0);N5 多规则不串扰(TOKEN_SK 占位符在前真在后 + APIKEY_LITERAL 真命中各计 FAIL);N6 PRIVATE_KEY 在占位符令牌之后仍命中即 FAIL;N7 脚本 selftest() 全绿回归;N8 前提软复核(真实追踪件 TOKEN_MDCG 首配为占位符形态;文件缺失则 SKIP 不计失败)。实测:修前 **7 passed/2 failed/EXIT=1**(N1/N5 红指纹 (0,1))→ 修后 **9/9 PASS/EXIT=0**。
47
+
48
+ ### F3(medium,N169·scripts 流)bootstrap_loop 通道 B 状态 JSON 非原子写+裸读无自愈——taskkill /F 时序即永久死亡且判活假绿
49
+
50
+ - **where**:`scripts/bootstrap_loop.py` —— 写侧:run_channel_b 三份状态 JSON 非原子写(channel_b_queue.json :393-394、channel_b_verified_units.json :395-396、channel_b_drafts/rejected_log.json 两处 :333-334/:386-387);读侧:同函数四处裸 json.load(:260-262 verified、:266-268 queue、:326-328/:380-382 rejected_log);判活面:run_once :439 通道 B 异常仍记 round=bootstrap_v2 + `bootstrap_watchdog.py:63-64` 清单。修复对齐同文件 persist_triggers 的 P2-14 原子款(:178-183)。缺陷编号 N169(scripts 流)。
51
+ - **缺陷面**:watchdog 停转/降级恢复的 `taskkill /F`(bootstrap_watchdog.py:201)时机落在任一状态 JSON 落盘中段(运维常态即可触发)——截断损坏后每轮 run_channel_b 在裸 json.load 同崩无自愈,run_once 捕获后仍记 round=bootstrap_v2 落入 watchdog HEALTHY 清单——通道 B 永久死亡且内容级判活假绿,无告警无恢复。
52
+ - **修复**:最小修复(bootstrap_loop.py +87/-26,bootstrap_watchdog.py +6/-2):①新增 `_atomic_write_json`(tmp+os.replace,P2-14 同款)替换四处非原子写——写中被强杀读者只见旧文件或新文件,绝不见半截;②新增 `_load_json_state`(path,default,what)替换四处裸 json.load——文件缺失返回 default,解析/读取失败(OSError/ValueError)时损坏文件改名 `*.corrupt-<时间戳>` 留存现场(进度数据可人工找回)+ log_event 告警(round=channel_b_state_corrupt)+ 返回 default 空状态重建,通道不再 JSONDecodeError 永久死亡;③run_once 通道 B 异常轮 round 记 **channel_b_error**(修前恒 bootstrap_v2);④`bootstrap_watchdog.py` DEGRADED_ROUNDS 注册 channel_b_error 与 channel_b_state_corrupt(注释写明 N169)——通道 B 连续异常/反复损坏纳入内容级判活,watchdog 可按既有 degraded 分支介入,判活假绿消除。
53
+ - **攻防前后对比**:修前(全哑环境复现):截断的 channel_b_verified_units.json 在场 → run_channel_b 连续每轮 `JSONDecodeError('Unterminated string')` 同崩;损坏 queue→`'Expecting , delimiter'` 同崩;带损坏态 run_once(channel_b=True)→result.channel_b={"error":…} 且日志末轮 round=bootstrap_v2(HEALTHY 清单)→watchdog --check-only status=alive、consecutive_degraded=0、EXIT=0。修后:①写侧原子化使 taskkill /F 强杀不再产生截断态;②万一损坏(磁盘/外部因素)→ 当轮留痕自愈(.corrupt-* 现场保全+channel_b_state_corrupt 告警+空状态重建),通道继续固化不再死亡;③通道 B 连续异常轮 round=channel_b_error 被 DEGRADED 清单计数,连续≥3 触发 watchdog degraded 介入——假绿链条三环(非原子写/无自愈/判活假绿)全部闭合。
54
+ - **守卫**:新增 `scripts/test_bootstrap_channel_b_state.py`(哑环境:types.ModuleType 哑 datapath 注入 sys.modules,两脚本模块的数据根/STATE/LOG 全部落临时目录,绝不触真实数据根;verifier 走仓内真件)。断言面 21 条:S1 写侧原子性(spy os.replace——run_channel_b 落盘 queue/verified 必经 replace,修前 0 次);S2 verified 截断损坏自愈(不崩+passed=1 继续固化+.corrupt-* 留痕+留痕内容=原损坏文本+重建含新条目);S3 queue 截断损坏自愈(不崩+空队列完成+留痕+原路径不再每轮同崩);S4 rejected_log 截断损坏自愈(验证失败分支不崩+重建为合法 list 含本次拒绝);S5 自愈告警事件落日志;S6a 异常轮 round=channel_b_error + result.channel_b.error 摘要;S6b watchdog DEGRADED 清单注册两轮次、HEALTHY 清单不含错误类、consecutive_degraded 对连续 channel_b_error 计数=3。实测:修前红 **14 FAIL/EXIT=1**(红指纹与缺陷证据逐字吻合)→ 修后 **21/21 PASS/EXIT=0**。
55
+
56
+ ### F4(medium,v13 N119 留档落地修复,不占新号)bridge stdin 写无 error 监听——EPIPE 竞态逃逸为宿主 uncaughtException
57
+
58
+ - **where**:`src/bridge.ts` —— 缺陷现场为 writeRaw 的 proc.stdin.write(原 :354-360,插入 14 行后漂至 :368-374,写点在 :373);修复落点在 spawnAndHandshake 内 spawn 之后(src/bridge.ts:211-224,监听挂载语句 :220-223);dispose 的 stdin.end()(现 :146)与 killStaleProc 的 stdin.end()(现 :189)同为 error 事件源,被同一监听覆盖。守卫落点 `test/bridge_stdin_error.test.ts`(新文件)。**非新发现、不占新编号**:本项即 v13 N119(缺陷挖掘_自主迭代_v13.md:181 留档 deferred「材料建议下批优先」)的落地修复;编号基线已核——v19 用至 N166、v18 至 N153(grep sort -u 实测),本批未新增发现故未占用。
59
+ - **缺陷面**:大 stdin 消息写入时子进程已死的 EPIPE/write after end/EOF 竞态——无监听时在途冲刷失败按 uncaughtException 上抛,生产即 DSH 宿主整体崩溃(v13 材料建议「下批优先」至今未修)。
60
+ - **修复**:最小修复(+14 行,纯增量):spawnAndHandshake 在 createInterface 之后、stderr 接线之前给 proc.stdin 挂一次性常驻 'error' 监听——console.error 留痕 + probe 探针记录,吞错。生命周期决策(v13 材料遗留的「吞错后状态迁移」问题):不做额外状态迁移——子进程死亡由既有 exit 分支收尾(rejectAll + readyState 迁移 + 重试/冷却),stdin 写失败仅留痕;挂载一次即覆盖 writeRaw 全部写与 dispose/killStaleProc 的 end()。
61
+ - **攻防前后对比**:攻前(红证双落):①行为面——临时探针(repo 根临时文件,测毕已删,`node --import tsx <探针>`)复现 v13 材料同款竞态:桥 + 不读 stdin 的哑 node 子进程 + writeRaw 写 1MB 大消息背压滞留 + proc.kill(),实测「uncaughtException: write EOF」逃逸计数 escaped=1——生产即 DSH 宿主整体崩溃;②结构面——守卫对旧码报红「子进程 stdin 应挂有 error 监听」(listenerCount('error')=0,fail 1)。攻后:同一守卫场景全绿,且全量日志实拍监听生效痕迹「[lingshu-bridge] stdin 写入失败(子进程可能已退出): write EPIPE」——EPIPE/write after end/destroyed/EOF 等形态均被同一监听接住留痕不再逃逸,桥可继续走 exit 分支正常重启。
62
+ - **守卫**:`test/bridge_stdin_error.test.ts`(新增,node:test + assert/strict,沿 bridge_retry_leak.test.ts 的哑子进程 + (bridge as any) 直调 private 模式)。双断言:①结构——spawn 后 proc.stdin.listenerCount('error')>=1(旧码=0 红);②行为——1MB 大消息 writeRaw 背压滞留 + proc.kill(),测试进程临时挂 process.on('uncaughtException') 以宿主视角捕获逃逸,断言零流写错误(旧码捕获 1 次 'write EOF' 红)。红→绿均为修复会话实跑:修复后 `node --import tsx --test test/bridge_stdin_error.test.ts` →「tests 1 / pass 1 / fail 0」。
63
+
64
+ ### F5(medium,N167·legacy/recent 流)lingshu-init 根入口不做波浪线家目录展开——自带示例形态落错根且随 cwd 漂移分裂
65
+
66
+ - **where**:`src/init.ts` —— 修复落点:新增 expandHomeTilde 帮助函数(src/init.ts:106-118,函数体 :112-116),应用点在 flag(--root,:266 解析)与交互手输(:292)两条入口的汇合点 :305 `const rootAbs = resolve(cwd, expandHomeTilde(root as string, opts.home))`(原 :291 `resolve(cwd, root as string)` 无展开);触发源即 :277 自带示例文案「--root ~/.lingshu/memory」;守卫落点 `test/init.test.ts` 新增 N167 回归测试(+37 行)。缺陷编号 N167(ask 原文携带,与 F1 同号分属并行流,归编排裁定)。
67
+ - **缺陷面**:按 init.ts:264 自带示例执行 `lingshu-init --end claude --root ~/.lingshu/memory --python python3`(交互模式手输 ~/ 形态同样触发)→ resolve(cwd, root) 解析为宿主 cwd 下字面 `~` 目录,记忆根落错位且随 cwd 漂移分裂,MDCG_ROOT 静默写错值、全程无告警(init 自称「缺省记忆根 ~/.lingshu/memory」强化了用户传 ~ 的预期)。
68
+ - **修复**:最小修复(+16 行,纯增量):①`expandHomeTilde(p, home=homedir())`——裸 `~`→home 本身,`~/` 或 `~\` 前缀→join(home, 去前缀部分),其余原样返回;边界决策:`~user` 形态 Node 无便携语义(无 POSIX pwd 查询),原样保留(注释已写明);②汇合点展开一次即双路覆盖(flag + 交互),home 取 opts.home(可注入)回落 os.homedir(),与交互缺省 defaultMemoryRoot(opts.home) 及大脑侧 `md_cg/datapath.py` expanduser+abspath 同口径。
69
+ - **攻防前后对比**:攻前(修复前旧码,守卫红证实跑):`node --import tsx --test --test-name-pattern "N167" test/init.test.ts` → fail 1,关键断言「--root ~/x 应展开为 <home>/x 而非 <cwd>/~/x」actual=`<临时目录>\~\.lingshu\memory` expected=`<临时目录>\home\.lingshu\memory`——与台账哑复现(ROOT_ABS=<临时目录>\~\.lingshu\memory、exit 0)同形态;flag/裸 ~/交互三路均红。攻后:同命令转绿「pass 1 / fail 0」——①flag `~/.lingshu/memory`→`<注入home>\.lingshu\memory`(片段 MDCG_ROOT 同值)②裸 `~`→home 本身 ③交互手输与 flag 同口径展开;绝对路径化后不再随 cwd 漂移。修复过程中守卫自身曾有一次笔误红(交互输入串漏写 `.lingshu` 的点,修复行为实为正确)——已修守卫后复跑转绿,如实留痕。
70
+ - **守卫**:`test/init.test.ts` 新增「N167 回归:根入口波浪线展开——--root 与交互手输的 ~/x、裸 ~ 均落到注入 home」:沿该文件既有模式(tmpCase 临时目录 + home 注入 + PassThrough mock stdin + tick 逐问喂入),三断言分别钉 ①ask 原文攻击向量逐字形态的 r.root 与落盘片段 MDCG_ROOT ②裸 ~ 边界 ③交互第二条入口同口径;全程零副作用。红绿均为修复会话实跑,同文件其余 6 测全过(tests 7 pass 7 fail 0)确认无内伤。
71
+
72
+ ---
73
+
74
+ ## 三、发现明细(四区 confirmed 42 条目 / rejected 7 条)
75
+
76
+ > 记账口径:42 confirmed 条目中 6 条由 5 项修复覆盖(F1×1、F2×1、F3×1、F4×1、F5×2——N167 同缺陷在 legacy/recent 两区各登记一条);其余 36 条目入遗留清单(见第五节,跨区同面复测记录去重后 34 独立缺陷面)。legacy 条目标注原轮次;★=该条证据为本轮任务会话实测/读核在位;哑哈希/令牌样串按头部脱敏口径截断或以形态描述代之。**编号流归属**见报告头部冲突声明:[r流]=recent/legacy 流、[s流]=scripts 流、[t流]=ts 流。
77
+
78
+ ### 3.1 legacy 区(23 confirmed / 5 rejected)
79
+
80
+ **confirmed 23 条**(原轮次与复测轮数逐条标注):
81
+
82
+ | # | where | 缺陷(severity) | 原轮次 → 复测 | 状态 |
83
+ |---|---|---|---|---|
84
+ | L1 | src/init.ts:291 | [r流·N167] lingshu-init --root 不做波浪线家目录展开:resolve(cwd, root) 把 :264 自带示例形态「--root ~/.lingshu/memory」解析为宿主 cwd 下字面 ~ 目录,记忆根落错位且随 cwd 漂移分裂(medium)★临时 cwd 哑复现:tsc 现编遇 import.meta 约束改用 lib/init.js(与 src 关键行同型核验:lib/init.js:231 `resolve(cwd, root)`、波浪线示例串两文件各 1 处);runInit(['--end','claude','--root','~/.lingshu/memory','--python','python3'],{cwd:临时目录}) → ROOT_ABS=<临时目录>\~\.lingshu\memory,落盘片段 MDCG_ROOT 同值,exit 0 | 本轮首报(origin new) | **F5 已修** |
85
+ | L2 | scripts/dsh_log_index.py:503-507 | [r流·N168] 摄取幂等键只锚(会话token+章节序号)不锚内容:token=sha256(created_at\|首条user)[:16](:472-481),同会话日志内容演进(v4 splice 消息替换事件 :42-44 注释自证;CHUNK_MAX=600 分块边界漂移同型)后重跑,已占序号 nid 走 skipped_existing continue,替换后正文静默不进库且无差异告警;返回键仅 {items,indexed,skipped_existing,sensitivity,extract_errors,stats} 无任何告警/差异字段。★哑环境实测(哑 cg 类 + 系统临时目录 n168_* 临时转写 md,未触真实库):第1遍 indexed=['dsh-log-tok123-0000'];turn1 正文改写后第2遍 indexed=[]、skipped_existing=1,库内 0000 正文含「原始问题全文」不含「替换后的问题全文」(medium) | 本轮首报 | 留档 |
86
+ | L3 | scripts/interop_gate.py:27,:61 | 【v6 N29 复测·第 2 次复测】pass 态 verdict 缺 failed 字段仍 KeyError 裸崩:_REQUIRED(:26) 不含 failed、_load 不校验,PASS 分支 :61 直接引用 v['failed'] 抛未捕获 KeyError(exit 1),违反自身「exit 3=形状非法」契约。★实测:哑 verdict.json(verdict=pass/valid=true/assertions_ok=true/failure_reason/passed 齐备仅缺 failed)→ Traceback KeyError: 'failed' @ interop_gate.py:61,EXIT=1(low) | v6 首报 → 本轮第 2 次复测 | 留档 |
87
+ | L4 | scripts/criteria_fingerprint.py:44 | 【v6 N30 复测·第 2 次复测】--commit 每调泄漏一个含仓库快照的临时目录:worktree_of mkdtemp(:44)后无任何 rmtree。★实测:grep -c "shutil\|rmtree" = 0;系统临时区 criteria_* 目录计数 前=0 → 跑 --commit HEAD(输出 files=173、value=16 位指纹串「3b21…a408」)→ 后=1(criteria_* 随机名目录),测后已清理(low) | v6 首报 → 本轮第 2 次复测 | 留档 |
88
+ | L5 | scripts/retr_time_coverage.py:179 | 【v6 N34 复测·第 2 次复测】--out 裸文件名即崩:os.makedirs(os.path.dirname(out_path)) 对裸文件名得空串抛 FileNotFoundError(候选引 :178 为赋值行,makedirs 实在 :179,微漂)。★实测:哑 root → [WinError 3] 空串路径 @ retr_time_coverage.py:179(low) | v6 首报 → 本轮第 2 次复测 | 留档 |
89
+ | L6 | scripts/check_unreachable.py:22,:61 | 【v6 N35 复测·第 2 次复测】ROOTS 相对路径按 cwd 解析、错目录 0 文件仍 exit 0 假绿:ROOTS=("md_cg","scripts","hive","src")(:22)相对形态,main 末 return 1 if (hits or parse_fail) else 0(:61)不校验 count>0。★实测:临时目录 cwd →「0 文件,命中 0」EXIT=0(low;npm run gate 主消费面 cwd=仓根安全,package.json:87) | v6 首报 → 本轮第 2 次复测 | 留档 |
90
+ | L7 | scripts/bootstrap_watchdog.py:82 | 【v6 N36 复测·第 2 次复测】盘符 glob 死代码:r"[系统盘]:\Python3*\python.exe" 中 [系统盘] 是单字符字符类,真实盘符永不命中。★读核 :81-82 在位(low,无攻击面) | v6 首报 → 本轮第 2 次复测 | 留档 |
91
+ | L8 | scripts/bootstrap_watchdog.py:238,:283-296 | 【v6 N37 复测·第 2 次复测】进程已死(not_running)且日志新鲜 degraded 时不拉起 return 0::289 `if procs and not args.check_only` 在 procs 为空时不 kill 不 restart,:296 degraded 态直接 return 0,恢复延迟至日志陈旧(2×interval+GRACE)。★读核在位;需真实进程台架,本轮未动态复现,维持读码定级(low) | v6 首报 → 本轮第 2 次复测 | 留档 |
92
+ | L9 | scripts/bootstrap_loop.py:340-356 | 【v13 N115 复测·第 2 次复测】通道 B 物理验证无执行超时:fn=ns[fname](:340)后直接 fn(*inp_raw)/fn(inp_raw)(:352/:354/:356),全函数无超时机制;纯计算死循环补丁挂死 run_channel_b,watchdog 重启后同条目再挂死(永久 DoS 形态)。★读核 :336-356 + grep -n timeout 零命中(medium;Windows 无 SIGALRM,超时选型属设计决策留档;候选引 :344-345 系 v13 时点行号,本轮微漂至 :340-356) | v13 首报 → 本轮第 2 次复测 | 留档 |
93
+ | L10 | scripts/link_check.py:44-47 | 【v13 N116 复测·第 2 次复测】_git 不查返回码:空仓库/坏 .git 时扫描 0 文件仍「全部可达」exit 0,docstring 自承「不检查返回码」(:41),与 workspace_index tracked() 的 fail-closed 形态不一致。★读核在位(low) | v13 首报 → 本轮第 2 次复测 | 留档 |
94
+ | L11 | src/lib/token_store.ts:76-79 | 【v6 N38 复测·第 2 次复测】auxRoot 双口径分裂:MDCG_AUX_ROOT 走 resolve(env) 无波浪线展开(:77-78),与 md_cg/datapath.py aux_root 的 expanduser(:268)不同口径;设波浪线/相对值时密钥环与令牌记录分居,宿主 cwd 变化触发重复自动签发永不吊销(medium;与 N167/N117 同族,统一锚点口径待一轮协商,deferred 理由维持) | v6 首报 → 本轮第 2 次复测 | 留档 |
95
+ | L12 | src/lib/token_store.ts:98-99 | 【v6 N39 复测·第 2 次复测】writeKeyring 的 mkdirSync/writeFileSync 无 try 包裹(仅 chmodSync :100-104 有):keyring 父路径不可写时 resolveToken 抛裸 fs 错误、激活中断,且令牌已经 issueToken 先签发(:191→:192 次序),重试再泄漏不吊销。★读核在位(low) | v6 首报 → 本轮第 2 次复测 | 留档 |
96
+ | L13 | src/lib/mutual.ts:33,:43 | 【v6 N40 复测·第 2 次复测】restartCooldownMs 契约未实现:接口声明(:33)+默认 60s(:43) 在,全 src/ 无任何冷却消费点,头注「60s 冷却」承诺与实现不符。★grep -rn restartCooldownMs src/ 仅两处(low;mutual.enabled 默认 false + 10min 心跳事实节流) | v6 首报 → 本轮第 2 次复测 | 留档 |
97
+ | L14 | src/lib/mutual.ts:304 | 【v6 N41 复测·第 2 次复测】stale processing-* 无恢复机制:claim 原子 rename 注释(:300-303)在位,B 侧在 :306 rename 后、:333 rename 回 done 前崩溃则 processing-<id>.json 滞留;全文件 grep processing- 唯一构造点 :304,无启动清扫消费者(low;mutual.enabled 默认 false;A 侧不在本仓无法核实重发自愈,留档口径维持) | v6 首报 → 本轮第 2 次复测 | 留档 |
98
+ | L15 | src/index.ts:157 | 【v6 N43 复测·第 2 次复测】roleplay 数据面随宿主 cwd 漂移分裂:dbPath 默认 'data/lingshu.db' 相对(:157),roleplay_web.ts:542 join(dirname(config.dbPath),'roleplay_data') 继承相对性(候选引 :547 微漂至 :542)(medium;根因连 dbPath 迁移语义,deferred 理由维持;与 N167/N117 同族锚点问题) | v6 首报 → 本轮第 2 次复测 | 留档 |
99
+ | L16 | src/lib/roleplay_web.ts:745-785,:945-973 | 【v6 N45/v8 N65 残面复测·translate 面复测·第 3 次复核】role_id 白名单残面维持开口:POST /api/roles/<id>/import(:745 role 提取后至 :783 无校验)、POST /api/roles(:961-970 p.role_id 直进 role_create+writeRole)、GET /api/translate(:893-894)/GET /api/history(:938-939)读面均未白名单;:842-844 P2-23 注释「入口统一卡死」与实际不符。缓解在位:toNullProto(:606) 闭原型污染、写路径在 403 edit-key 闸后、mdcg node_id 白名单兜底——收敛为「非法 role 落图静默失败+接口仍 ok:true 虚假成功」。★读核五处路由与三处已卡点对照 + 实跑 roleplay_translate_guard.test.ts → 4 pass / 0 fail(low) | v6 首报 → v8 复测 → 本轮第 3 次复核 | 留档 |
100
+ | L17 | src/lib/whitebox_llm.ts:194-201 | 【v6 N46 复测·第 2 次复测】lastUserText 逆序拼接所有角色全部文本块后截尾(:195-201 reverse+flatMap+join+slice(-2000)),与 :194 注释「取最后一条用户文本」不符——文件已下线、无运行时调用方。★grep -rn "installWhiteboxLlm\|whitebox_llm" src/ 排除自身零命中(low,无活攻击面) | v6 首报 → 本轮第 2 次复测 | 留档 |
101
+ | L18 | src/hooks.ts:239-240 | 【v6 N47 复测·第 2 次复测】system-prompt waterfall 内同步 await graph.timeline:桥挂死(存活不响应)时每请求组装阻塞至 toolCallTimeoutMs(index.ts:174 默认 60_000),与「失败静默不影响请求」声明不符(low;修复涉 waterfall 装配重构,留档维持) | v6 首报 → 本轮第 2 次复测 | 留档 |
102
+ | L19 | src/lib/datapath.ts:72 | 【v13 N117 复测·第 2 次复测】stateRoot 等 env 相对/~ 形态 node/python 双口径分居:stateRoot() 对 MDCG_STATE_ROOT 走 resolve(env)(:72)无波浪线展开(与 N38 同族;MDCG_ROOT 插件部署面被遮蔽)。★读核 :68-80 在位(low) | v13 首报 → 本轮第 2 次复测 | 留档 |
103
+ | L20 | src/bridge.ts:156-159,:429-431 | 【v13 N118 复测·第 2 次复测】boot 期 dispose 后 waitReady 悬挂:waitReady push 进 bootQueue(:159),flushBootQueue 五处调用(:243/:294/:316/:322/:334)均在 proc 事件回调/handshake catch 的 disposed 守卫内——dispose 后队列 resolve 永不执行。★读核守卫关系在位(low;宿主侧 cordis 生命周期可达性,API 层悬挂留档) | v13 首报 → 本轮第 2 次复测 | 留档 |
104
+ | L21 | src/bridge.ts:354-360 | 【v13 N119 复测·第 2 次复测】stdin 写无 error 监听致宿主 uncaughtException:writeRaw 的 proc.stdin.write(:359)无 .on('error'),大消息滞留+子进程死亡三条件竞态下宿主崩溃。v13 材料建议「下批优先」至今未修(批次45 后 src/ 仅批次62 init/cli 落地)。★读核 + grep -n stdin src/bridge.ts 无 error 监听命中(medium) | v13 首报 → 本轮第 2 次复测 | **F4 已修** |
105
+ | L22 | src/lib/roleplay_web.ts:829-892 | 【v8 N66 复测·第 3 次复核】chat 端点跨站简单请求可触发状态变更(转录落盘 :863/:887/LLM 消耗 :870/落图 :864/:888)无 Origin/Host 校验:修复需先定拦截策略(跨端 CLI 调用兼容),deferred 理由维持。★grep -inc "origin\|referer" = 0 + 读核路由无来源校验(medium) | v8 首报 → v13 复测 → 本轮第 3 次复核 | 留档 |
106
+ | L23 | compiler/tests/test_func_compile.py:92 | 【v18 测试基建族复测·第 2 次复测(域属 compiler/tests,非 scripts/tests,如实注明)】静默跳过洞(:92 if r5["ok"] 包住用例体,被测源编译失败用例无声消失)+ test_pbc.py:19-20 伪造操作码 PUSH/STORE(VM 真名 PUSH_CONST/STORE_NAME,compiler/compiler.py:116/156/161)+ test_full_pipeline.py:189 `"_runtime.halt" in code or "halt" in code` 双析取恒真(子串蕴含)+ test_compiler_c2.py:87 文案「5>4 真」与 :80-81 源码「若 4 大于 3」不符——四点全部仍在位。★逐处读核四文件四位置在位(low,测试可信度面) | v18 首报 → 本轮第 2 次复测 | 留档 |
107
+
108
+ **rejected 5 条(证伪/剔除)**:
109
+
110
+ | where | 剔除理由 |
111
+ |---|---|
112
+ | hive/exec.py:1041-1043 | 【外部对抗报告 A1-a 复测】已修剔除:批次42/第10轮白名单切分修复在位——:1041-1043 `if isinstance(rr, str): rr = [rr]` 单串归一 + :1038-1040 旧缺陷注释锚点;★实跑 `python hive/test_worker_scope.py` → 9 pass / 0 fail(含 B1 单串形态 scope 外探针拒读实弹对照、B2 白名单内正常读零回归),复测通过不再列账 |
113
+ | src/lib/roleplay_web.ts:539-541 | 【外部对抗报告 A5-a/V21-1 复测】已修剔除:批次34(V21 八项全修)在位——:536-538 V21-1 注释锚点,editKeyHint 两分支均为终止文案(配置=「缺少编辑密钥(x-edit-key 头)」/未配置=「编辑未开放…fail-closed」),无自调用;4 处 403 分支(:732/:790/:904/:949)引用同一终止文案函数,读核确认 |
114
+ | scripts/bootstrap_loop.py:63-70,:176-183 | 【外部对抗报告 D-f 复测】非缺陷维持登记:P2-13 rotate 注释(:64)与 P2-14 atomic replace 注释(:181-182)批次31 锚点在位;git log scripts/bootstrap_loop.py 尾触批次45(第13轮通道B饥饿,非此两处);bootstrap_loop 由 bootstrap_watchdog 单实例拉起(watchdog 判活+重启),多实例并发非设计场景;跨平台一行文件锁不可移植,文档化取舍成立,不加锁维持注释取舍 |
115
+ | scripts/judgment_manifest.py:130-134 | 【v6 第五节 N27 复测】已修剔除:第13轮 F1 fail-closed 在位——:130-131 注释锚点 + :132-134 缺参打印用法到 stderr 并 return 2;★实跑 `python scripts/test_judgment_manifest.py` → 16 通过 / 0 失败(含「--verify 缺参必须非零退出」「缺参不得 stdout 倾倒全量 manifest」两守卫节),复测通过不再列账 |
116
+ | hive/verify_runner.py:59-65 | 【v6 N28 复测·SUMMARY 面复测】已修剔除:第13轮 F2 正则修复在位——:59-60 v6 N28 注释锚点 + :61-62 正则 `SUMMARY\s+(\d+)\s*/\s*(\d+)\s*通过[,,]\s*(\d+)\s*跳过` 与 run_tests.py:216 实际输出形态对齐;★实载 hive/verify_runner.py 实测 _parse_counts:SUMMARY 真实形态 → (217, 0)、cargo 形态 → (42, 0),计数不再恒 (0,0),复测通过不再列账 |
117
+
118
+ ### 3.2 recent 区(6 confirmed / 1 rejected)
119
+
120
+ **confirmed 6 条**(全部 origin new;编号按 recent 流):
121
+
122
+ | # | where | 缺陷(severity) | 编号 | 状态 |
123
+ |---|---|---|---|---|
124
+ | R1 | scripts/dsh_log_index.py:472-481 | 派生标识 sha256("{createdAt毫秒}\|{首条user消息全文}")[:16] 在「日志缺 type=session 首行(created_at_ms 取 None)」「同毫秒+同首条消息」「退化无 user 消息」等场景跨会话碰撞;碰撞后 ingest_transcript 的 skip-existing(:504-507)把第二会话全部章节静默跳过,独有正文零节点入库且 rc=0 无告警——静默数据丢失。★沙盒+哑 zstd 日志+哑主密钥实测(python 直调模块):①四场景全碰撞——退化空输入两连调同值(哑哈希「18ba…85d9」)、缺 session 首行同首条 user 碰撞(「ad34…02fc」)、同毫秒同首条碰撞(「97d3…123d」),对照组不同毫秒得不同 token(「587e…dd4d」)——全串见材料台账,报告内截断呈现;②端到端 main():ws-alpha/sess-AAAA 与 ws-beta/sess-BBBB(同 createdAt 同首条 user、assistant 正文完全不同)输出 session_token 同值(「6f72…c92f」),sess-BBBB 行 nodes_indexed:0 nodes_skipped_existing:1,rc=0,stderr 无任何告警;③API 侧复核:库中 dsh-log- 节点总数=1,唯一节点归属 sess-AAAA/ws-alpha。证据精确化一处:候选称「全库扫 BETA 关键字命中 0」,实测 ALPHA 关键字同样命中 0(doc_ref 节点只存标题+摘要不落全文,正文留在源文件),故扫库命中 0 不构成丢失证明;丢失以 API 侧节点计数与归属判定为准——结论不变(**high**) | [r流] N167 | **F1 已修** |
125
+ | R2 | src/init.ts:267-287 | 交互模式对 stdin 提前 EOF 无处理:rl.question 的 Promise 在 interface close 后永不落定,runInit 整体挂死——finally 里的 rl.close()(:287)永不执行、无错误输出、进程不退出;与 :257-265 自家「宁缺毋滥,不挂死」纪律矛盾(该纪律只在非交互分支成立)。★实测(node v24 + lib/init.js 编译产物,先核对与 src/init.ts 同步:lib mtime 新于 src 且 :198/:231 关键行在):input=new PassThrough() 注入 runInit,100ms 后 input.end() 模拟第一问前 EOF,Promise.race 3s 超时再延至 5s 仍返回 STILL-PENDING,stdout 仅停在首行 banner(**medium**) | 未占流内号 | 留档 |
126
+ | R3 | src/init.ts:291 | --root 经 resolve(cwd, root) 不展开 ~ 也不做任何形态校验:按 :264 错误提示自带的示例执行,MDCG_ROOT 被静默写成 <cwd>\~\.lingshu\memory 字面 ~ 目录;URL 同样被当相对路径吞掉。★实测:runInit(['--root','~/.lingshu/memory',...]) 产物片段 env.MDCG_ROOT = <临时cwd>\~\.lingshu\memory;root='http://evil/x' → <临时cwd>\http:\evil\x;对照组(复测②):root 含引号/换行/中文/空格的混合串经 JSON.stringify 落盘再 JSON.parse 回读逐字符一致(identical=true),片段内容注入不成立(**medium**;与 L1 同缺陷两区登记) | [r流] N167(与 R1 同号同族标记,实为两缺陷面) | **F5 已修** |
127
+ | R4 | scripts/dsh_log_index.py:553-555 | retire_private_legacy 只按返回值 r.get("ok") 判定,但 cg.forget 对受保护节点(importance≥0.7,md_cg/protect.py:111-112 判定、:213-217 guard_forget raise ProtectionError 而非返回 {"ok":False},md_cg/mdcos.py:2354 调守卫)是抛异常——未捕获,整个退役批次在该节点处崩溃中断(sorted 序后续 private 节点全部不处理),无逐节点定位。★实测(沙盒库+哑主密钥):哑节点 dsh-log-<哑id-cafe…>-0000(sensitivity='private',importance=0.9)与排前的普通哑节点后调 retire_private_legacy → ProtectionError: 节点不可遗忘(importance=0.90≥0.7);trash/ 中已有前序普通节点退役件而受保护节点未处理——混合状态实锤;再次调用同节点同异常(永远卡死在同一节点,剩余批次不可达)(**medium**) | 未占流内号 | 留档 |
128
+ | R5 | scripts/dsh_log_index.py:639 | 转写暂存无并发防护:TRANSCRIPT_ROOT 是全局固定共享路径(:132 系统临时目录/dsh-log-transcripts)、md 以 open(tpath,"w") 非原子截断写(:639,无 tmp+os.replace)、无锁文件、--cleanup-transcripts 直接删共享目录下文件(:722-734)。同机两个摄取进程处理同一会话时:撕裂/半截内容按章节序号分配确定性 id 落库,正确重跑被 skip-existing(:504-507)永不修正→永久错档。★实测(机制级):_chunk_body 20+ 段正文(130×重复,>600 字 CHUNK_MAX)完整产 2 章、截半产 1 章且首章内容逐字节不同;两轮 ingest_transcript 同一 tdir/token:撕裂版先落库 dsh-log-<token>-0000,完整版重跑 skipped_existing=1、indexed=[]、-0001 不存在,保留节点正文含 torn 标记不含 full 标记——坏章节永久固化闭环复现。注:双进程同时刻抢占同一 tpath 的真实并发窗口未做精确复现(时序窗口难稳定构造),但非原子写+共享路径+序号 id+skip 不覆写四个构成要件全部实测/读码成立(**medium**) | 未占流内号 | 留档 |
129
+ | R6 | test/init.test.ts:1-177 | 测试覆盖盲区三处:①scripts/dsh_log_index.py 全仓零测试(派生标识/skip-existing/retire/清理均无断言,本轮 R1-R5 实锤缺陷全部落在无测试区);②src/cli.ts:32 main 分发器注明「仅导出供测试」但 test/ 无任何文件 import 它;③init.test.ts 无 stdin EOF 分支用例(已有交互用例只测正常答题 :102/:128)、无 parseFlags 边界(--root= 空值/未知 flag/-- 前缀剥离/重复 flag)。★实测:grep -rln dsh_log_index test/ → exit 1(零引用);grep src/cli\|lib/cli test/ → exit 1;行为面本身正常但无钉住:node 直调 lib/cli.js main([])→rc 1、main(['badcmd'])→rc 1、main(['--help'])→rc 0(**low**) | 未占流内号 | 留档(部分缓解:本轮 F1/F2 新增 python 守卫、F5 新增 init 回归测试已补对应面) |
130
+
131
+ **rejected 1 条**:
132
+
133
+ | where | 剔除理由 |
134
+ |---|---|
135
+ | scripts/dsh_log_index.py:222-224 | 候选自述为「留档复测项(结论均不成立/通过,勿再报)」,非缺陷条目;三点复测本轮全部实测支持:①--session/--workspace 过滤注入面不成立——读码 :217/:223 对 listdir 枚举出的真实目录名做精确等值比较(ws != workspace / sid != session),值不进任何拼接,另实测 discover_sessions(root, workspace='ws-al*')→0 项 vs 'ws-alpha'→1 项(无 glob/前缀语义);②mcp.json 片段内容注入不成立——实测 runInit root=含引号/换行/中文混合串,产物 JSON.parse 回读逐字符一致;③--retire-private-legacy 重复执行幂等通过——实测三连调用同一哑节点 returned ['dsh-log-<哑id-deadbeef…>-0000']/[]/[] 无异常(forget 落盘摘索引,md_cg/mdcos.py:2370 _unstage)。留档成立,防后续轮次重复误报,不作为缺陷收录 |
136
+
137
+ ### 3.3 scripts 区(7 confirmed / 0 rejected)
138
+
139
+ | # | where | 缺陷(severity) | 编号 | 状态 |
140
+ |---|---|---|---|---|
141
+ | S1 | scripts/check_publish_artifact.py:209-220(local/registry 两模式同源调用 :408/:541) | scan_text_hits 对每文件每规则只取首个 rx.search 命中,且 TOKEN_* 命中若形似占位符即降级 NOTE 并 continue——同文件「占位符令牌在前、真实凭据在后」时真令牌整条逃逸 R1 内容面,发版门禁系统性静默漏报。★读码 + 实测:占位符在前文本→FAIL命中=0 NOTE=1,真令牌置前→FAIL命中=1,仅真→FAIL=1(真形态样串取自脚本自带 selftest :611,哑数据)。前提坐实:package.json files 含 'docs',docs/hive/令牌与角色权职分离_v0.1.md 为追踪件且 TOKEN_MDCG 首配为「mdcg1 前缀+tk_ 段全 x 占位」占位符形态、_looks_placeholder=True(**high**) | [s流] N167 | **F2 已修** |
142
+ | S2 | scripts/verify_discipline.py:178-181 + .github/workflows/discipline-check.yml:53 | 「产物被删」与「仓外/本地私有件不可再生」混为一谈(missing 时 ok=bool(allow_missing))且 CI 恒带该开关,与 workflow 头注 :4 自称「硬失败四项:产物缺失」自相矛盾——已证实,但范围收窄:候选点名的 zcode/AGENTS.md 有 workspace_index --check 关键入口守卫补偿(:265),真正零补偿的是 skill 投影类纪律产物。★临时克隆(core.autocrlf=false)实测:删 zcode/AGENTS.md 后 verify --allow-missing→「9/9 目标一致」EXIT=0(zcode 行 SKIP),去开关→EXIT=1 漂移目标 zcode——机制属实;但模拟提交删除(rm+git update-index --force-remove)后 workspace_index --check→EXIT=1「[DRIFT] 关键入口缺失:zcode/AGENTS.md」(workspace-index-check.yml 无 paths 过滤全量触发 :13-16),候选「无任何补偿守卫」对该件不成立;改删 claude/lingshu-memory/skills/linglu-discipline/SKILL.md 同法模拟提交删除→verify --allow-missing「9/9」EXIT=0(claude-code-plugin-skill 行 SKIP)且 workspace_index --check EXIT=0(ls-files 该件=0 实证)——零补偿类坐实;test_injection_chain.py 全文 253 行只测 R 函数(norm_path/_under 等),无存在性断言,读码属实(**medium**) | [s流] N168 | 留档 |
143
+ | S3 | scripts/bootstrap_loop.py:393-396(另 :333-334/:386-387;对照原子款 :178-183) | channel_b 三份状态 JSON(queue/verified/rejected)用 open("w")+json.dump 非原子写,与同文件 persist_triggers 的 P2-14 os.replace 原子款不同型;写中被 taskkill /F(bootstrap_watchdog.py:201)强杀即截断损坏,此后每轮 run_channel_b 在裸 json.load(:260-268)同崩无自愈,run_once 捕获后仍记 round=bootstrap_v2(:436-439)落入 watchdog HEALTHY 清单(bootstrap_watchdog.py:63)——通道 B 永久死亡且内容级判活假绿。★全哑环境端到端复现(脚本克隆至临时目录+桩件 code_compose/verifier/llm_channel,STATE 落哑数据根):写入截断 channel_b_verified_units.json 后 run_channel_b 连续两轮 JSONDecodeError('Unterminated string') 同崩;损坏 queue 同崩('Expecting , delimiter');带损坏态跑 run_once(channel_b=True)→result.channel_b={"error":…}、日志末轮 round=bootstrap_v2;随即 watchdog --check-only 输出 status=alive、last_round=bootstrap_v2、consecutive_degraded=0、EXIT=0——完整链条闭环(**medium**) | [s流] N169 | **F3 已修** |
144
+ | S4 | scripts/bootstrap_watchdog.py:261-266(对照承诺 docstring :21) | no_log 分支(日志缺失/不可解析)直接 return 1 不做任何恢复,违背 :21「进程缺失 → 直接拉起」契约;bootstrap_loop 轮转(:66-69 os.replace 后 :70-71 才 append,非事务)在两步间死亡时 LOG 消失且 .rotated 留存——此后守护每轮空转,自举循环永不恢复。★同哑环境实测:移除 bootstrap_log.jsonl 后 --check-only→{"status":"no_log","detail":"日志缺失或不可解析"} EXIT=1,输出无 action 字段(has action field: False);对照写入 3h 前陈旧日志→status=would_recover、action=would_restart(check-only 未拉起进程,证明该分支可达恢复路径)(**medium**) | [s流] N170 | 留档 |
145
+ | S5 | scripts/cogmap_sync.py:528(另 :443 _splice、:595-599 _strip_sections) | 段解析三处都只认「首个 BEGIN..END」(非贪婪首配):文档出现第二份 COGMAP/FUNCMAP 段时段一致性只验首份,行号锚禁令又因 _strip_sections 用 re.sub 剥掉全部段而对重复段内部豁免——陈旧行号永久逃逸「check 门禁保证永不过期」承诺,build 的 _splice 也只替换首段使其永不修复。★以真源 extract()+render_section 为基准实测(只读真源、文本全部在内存合成):复制的第二段内注入「md_cg/mcp_server.py:99999」→_check_doc 返回 0 错误;同锚放段外→正确报 1 错(手写区残留行号锚);_strip_sections 后段内残留=0(被吞);_splice 置换后第二段残留 99999 锚 1 处(build 不修复)(**low**) | [s流] N171 | 留档 |
146
+ | S6 | scripts/dsh_log_index.py:447(对照实际密级 :508) | 转写 md 溯源行硬编码「密级 private」,而摄取对全部章节显式 sensitivity=internal(:508 sensitivity_for override 优先恒返 internal,md_cg/docindex.py sensitivity_for 首行 if override 即返回;docstring :14-16 自述 2026-09-26 裁决与 v1 误标史)——失实密级声明随转写正文被索引进私有活库检索面,审计者按正文口径会误判该批节点在 at-rest 加密封套内。★读码 + 哑数据端到端实测:render_transcript 产出的转写含该溯源行→refindex.index_dir 章节切分后节点 0 正文含「密级 private」(docindex.render 的 # 执行 摘要行内)而落库密级=internal(依据=调用方显式指定)——失实声明确入节点检索面(**low**) | [s流] N172 | 留档 |
147
+ | S7 | scripts/check_unreachable.py:22 + scripts/link_check.py:44 | v13 留档两项本轮复测均维持成立未修:check_unreachable ROOTS 相对 cwd 解析,非仓根调用扫描 0 文件仍 exit 0;link_check _git 不检查子进程返回码,git 不可用/非检出环境 0 文件假绿——两守卫在环境异常时静默空转。★本轮实跑复测:临时目录下 python scripts/check_unreachable.py→「unreachable 扫描:0 文件,命中 0,语法失败 0」EXIT=0;非 git 临时目录(脚本克隆+断链 md)跑 link_check→「扫描受管 md:0 个」「结论:全部相对链接可达」EXIT=0(low;主消费面 package.json:87 gate 与 cogmap-check.yml:36 均以仓根为 cwd,故 low 维持) | v6 N35 / v13 N116 合并复测条 | 留档(与 L6/L10 同面,合并记录) |
148
+
149
+ ### 3.4 ts 区(6 confirmed / 1 rejected)
150
+
151
+ | # | where | 缺陷(severity) | 编号 | 状态 |
152
+ |---|---|---|---|---|
153
+ | T1 | src/bridge.ts:273-291 | 子进程「握手成功→<5s 秒崩」类崩溃陷入无限重启循环——握手成功每轮清零 retries(src/bridge.ts:313-314)使 MAX_RETRIES 放弃终态不可达,且 exit 处理器 uptime<5s 提示分支(:273-277)与 unexpectedExits 冷却分支(:278-291)是 if/else-if 结构,冷却动作对秒崩类结构性不可达。★临时目录复现(真实 lib/bridge.js+哑 server,USERPROFILE 重定向临时 fakehome 防污染,实测真实家目录日志 mtime 早于实验窗口且零实验特征串,测毕清理):主实验 30s 窗口 {spawns:14, gaveUp:false, isReady:true, fastExitMsgs:13, cooldownMsgs:0}(~2.14s/代);对照挂死类(v13.md:111 证伪同口径){spawns:8, gaveUp:true, giveUpMsgs:1},probe 落「give up: 8 consecutive failures」——MAX_RETRIES 只防从未握手类。留档空白证实:grep v13/v6『无限重启\|冷却\|uptime』命中全为 mutual.ts v6 N40(蜂群 guardian 冷却)与 V23 killStaleProc 描述,无本主题(**medium**) | [t流] N167 | 留档 |
154
+ | T2 | src/init.ts:340-346 | lingshu-init 交互模式 stdin EOF 后 rl.question promise 永不 settle(:267-287 交互段无 close/EOF 兜底),直跑入口 .then/.catch 形态下进程以 exit 0 静默结束——中断被伪装成成功(无报错、snippet 未写)。★临时目录复现(复刻 :340-346 直跑形态 wrapper + PassThrough 答第①问后 end(),父进程观测):{status:0, stdout:仅横幅一行, stderr:空, snippetExists:false};对照 TLA 形态 Node 报「Detected unsettled top-level await」exit=13——promise 永不 settle 实证。发布06报告:59 在案「question 永久 pending」但仅作测试坑记录(test/init.test.ts:97-100),未按 CLI 缺陷立项,属实(**low**;与 R2 同根因两表现:runInit 注入形态挂死 / 直跑形态 exit 0 假成功) | [t流] N168 | 留档 |
155
+ | T3 | src/init.ts:136-144 | 生成的 shell 指令(令牌签发 :139-141、大脑自检 :148)对含空格的 --python 解释器路径裸插值不加引号——JSON 片段内正确引号化,唯打印的复制粘贴指引碎裂。★临时 cwd 复现(node lib/init.js --end claude --python "含空格的解释器绝对路径",exit=0):输出「③ 大脑自检:<裸路径> -m md_cg.mcp_server …」与签发命令均裸路径;同输出 JSON "command" 正确引号化——唯 shell 指引面碎裂(**low**) | [t流] N169 | 留档 |
156
+ | T4 | src/lib/roleplay_web.ts:621-641 | writeRoleMeta(catch 仅 logger.warn :638-640)与 writeTransSettings(catch 全忽略 :655-660)静默吞写盘失败,写端点不感知落盘结果恒回成功——V22 契约「绝不报已保存」(:356-359)只在 403 维度闭合,磁盘失败维度虚假成功。★mock 实验复现(临时目录+mock ctx/webServer/req/res 跑真实 installRoleplayWeb handler,ROLEPLAY_EDIT_KEY 配哑值排除 403 干扰;.tmp 占位为目录强制 writeFileSync EISDIR):3 条「角色 meta 写入失败: EISDIR」warn、_roles.json 落盘后不存在,而 /meta → 200 {"ok":true}、/translate → 200 ok:true、/import(items=[] 使 impResult=null)→ 200 {"ok":true,"import":null}——证明 importOk(:782)仅取决于 impResult 与 meta 落盘无关,三端点全部虚假成功(**low**) | [t流] N170 | 留档 |
157
+ | T5 | src/tools.ts:187-195 | 工具取消不达后端——桥未实现 MCP notifications/cancelled,request() 的 abort 只 settle 本地 pending(src/bridge.ts:386-389),已写入 stdin 的 JSON-RPC 请求(:397-404 同步写出)由后端照常执行完毕;tools.ts:185-186 注释宣称该修复解决「取消后写操作仍可能产生副作用」,实际仅 pre-dispatch abort 真正无副作用。★读码:bridge.ts onAbort 仅 this.settle(id,{error…}) 无向子进程的通知写出;writeRaw 先于任何 await 同步完成。grep src/bridge.ts+lib/bridge.js『cancel』零命中;src 全局 notifications/ 仅 initialized(bridge.ts:310);历轮 docs/eval grep『notifications/cancelled\|exec\.signal』零命中(留档空白证实)。tools.ts:185-190 注释与 execute 双 aborted 检查确认宣称面(**low**) | [t流] N171 | 留档 |
158
+ | T6 | src/lib/roleplay_web.ts:829-891 | 留档复测(v8 N66 第四面记录;v8:104 首报→v13:102→v15:120 第三次,本轮第四次):POST /roleplay/api/chat 无任何来源校验的 CSRF 写面仍开放——:830 注释明言聊天免编辑密钥、readBody(:508-523)不校验 Content-Type、:863 appendTranscript 先于 :865 capReady(能力未接入也落盘);同面 v6 N45 残面(/import :745 取 URL 段无 validRoleId、POST /roles :961-970 p.role_id 直通 role_create+writeRole)亦仍开放。★本轮读核+mock 复测(未配 ROLEPLAY_EDIT_KEY):POST /roleplay/api/chat 无 x-edit-key 无 Content-Type → 503(CAP_ABSENT,非 403——chat 确不设防)且 transcripts/r1__shared.jsonl 实际落盘注入文本(测试哑标记串);对照同条件 POST /meta → 403(fail-closed 对编辑端点仍有效)。grep origin/referer/csrf 全文件零命中;requireEditKey 仅护 :730/:788/:902/:947 四端点;/import role 提取(:745)与 POST /roles(:961-970)读核无 validRoleId(对照 meta :804/chat :845/translate :922 均有)——与 v15.md:120 记录逐点一致,deferred 维持(**medium**) | v8 N66(原号) | 留档(与 L22 同面,第四/五次复测记录) |
159
+
160
+ **rejected 1 条**:
161
+
162
+ | where | 剔除理由 |
163
+ |---|---|
164
+ | src/lib/roleplay_web.ts:811-813 | P2-11 读改写竞态——复核确认候选「不成立」判断正确:逐行读核三处读改写段(/meta :813-824、/translate :930-933 含 setTranslations :667-675 内部、/import :749-753)均无 await(Node 单 tick 不交错),writeRoleMeta/writeTransSettings 内部 writeFileSync+renameSync 亦同步;各段 await(readBody :737/:795/:909、capability.callTool :762)均在段前或段后、不在段内;注记 :810-812「若引入 await 须先加写队列」前提未被破坏,维持结案 |
165
+
166
+ ---
167
+
168
+ ## 四、验证(门禁结果)
169
+
170
+ **编排会话传入门禁(材料,非本报告会话实跑)**:
171
+
172
+ | 门禁 | 结果 |
173
+ |---|---|
174
+ | python 全量回归 | **通过(第 2 轮)** |
175
+ | npm test | **通过(退出码 0)** |
176
+ | npm run gate | **通过** |
177
+ | 四区记账 | 确认 **42** / 修复 **5** / 留档 **36** |
178
+
179
+ **各修复会话实跑的验证链**(材料引用,逐项详见第二节守卫栏):
180
+
181
+ - F1:守卫修前 11 FAIL/EXIT=1 → 修后 23/23 PASS/EXIT=0;反证实验(monkeypatch 退化防线)→ 11 FAIL 复现;`python scripts/run_tests.py scripts` → 7/7;全量 `run_tests.py --jobs 4` → 218/218 通过、5 跳过(依赖缺失/平台不符,与基线口径一致)、EXIT=0;守卫连跑五轮全绿且系统临时目录零残留;dry-run CLI 冒烟 rc=0 + py_compile OK。
182
+ - F2:守卫修前 2 FAIL → 修后 9/9;`--selftest` 30 条 [PASS] 全绿(含 2 条新增 N167 断言);CI 第二步等价 `check_publish_artifact.py --root <仓库根>` 全量扫描 VERDICT=PASS/EXIT=0(修后无误伤);反证实验(monkeypatch 回退旧实现)→ N1 场景 FAIL=0/NOTE=1 守卫必红;全量 run_tests → 219/219、5 跳过、EXIT=0。
183
+ - F3:守卫修前 14 FAIL → 修后 21/21;既有同函数守卫 test_bootstrap_channel_b.py 回归 9 通过/0 失败;py_compile 三文件 OK;run_tests scripts → 9/9;全量 → 220/220、5 跳过、EXIT=0(最终定型态:基线 218 + F2 守卫 1 + F3 守卫 1)。
184
+ - F4:修复前后全文件读核(grep stdin/.on 零 error 监听 → 挂载在位);红证探针实跑(uncaughtException: write EOF 逃逸)+ 守卫旧码红跑(fail 1)→ 修后绿跑(pass 1 fail 0);`npm run build` → exit 0;`npm test` 全量 → exit 0,聚合 tests 60 / pass 59 / fail 0 / skipped 1(与 14 个 *.test.ts 的 test() 声明静态计数 TOTAL=60 吻合;1 skip 为既有环境条件逻辑,非回归;台账「全量 217/217」为含子测试层的另一种计数口径,如实区分未冒称)。
185
+ - F5:现场读核(:266/:277/:292/:305 汇合点确认);红证实跑(actual=<tmp>\~\.lingshu\memory 与台账同型)→ 修后绿跑 + init.test.ts 全文件 7/7;`npm run build` → exit 0;`npm test` 全量 → exit 0,聚合 tests 61 / pass 60 / fail 0 / skipped 1(60=上轮基线 + 本项新守卫 1;1 skip 为既有环境条件逻辑,非回归);git diff --stat 核对本项落点仅 src/init.ts(+16)与 test/init.test.ts(+37)。
186
+
187
+ **本报告会话自身实跑**(仅核账与定位,未重跑门禁——门禁以上述材料为准):
188
+
189
+ 1. 编号基线:`grep -oE "N[0-9]+" docs/eval/缺陷挖掘_自主迭代_v19.md docs/eval/缺陷挖掘_自主迭代_v18.md | sed 's/.*://' | sort -u | sort -t N -k 2 -n | tail -5` → `N162 N163 N164 N165 N166`——v19/v18 最大 N166,本轮自 N167 续编口径成立。
190
+ 2. 索引定位:读 `WORKSPACE_INDEX.md`(:29 docs/ 职责=文档、:26 scripts/ 职责=工程管线)确认报告落 `docs/eval/`;`ls docs/eval/缺陷挖掘_自主迭代_v20.md` → 确认落点。
191
+ 3. 记账自洽验算(本报告会话对材料做的一致性核算):42 confirmed = 36 留档 + 6 条修复覆盖条目(F1×1 + F2×1 + F3×1 + F4×1 + F5×2);36 留档条目含跨区同面复测记录(v8 N66 两区各一条、S7 合并条与 L6/L10 单列条并存),去重后 34 独立缺陷面(medium 11 / low 23)——与门禁「42/5/36」口径一致。
192
+ 4. 隐私门禁重写响应:本报告会话对成稿做脱敏复查(命令与结果见文末自查记录)——上一稿命中详情未随重写指令传入,按保守口径全面脱敏(十六进制长串截断/令牌样串形态化/本机钟点与随机目录名泛化),证据语义不变。
193
+
194
+ ---
195
+
196
+ ## 五、遗留清单(36 条目 / 去重 34 独立缺陷面:medium 11 / low 23)
197
+
198
+ ### 5.1 本轮新发现未修 14(medium 7 / low 7)
199
+
200
+ **medium 7**:
201
+ 1. **[r流·N168]** `scripts/dsh_log_index.py:503-507` skip-existing 不锚内容——同会话内容演进后重跑替换正文静默不进库。最小修:nid 混入章节内容哈希或 skipped 时内容哈希不一致即告警/覆写(与已修 F1 同函数邻接面,修后归属核验已收窄其爆发面)。
202
+ 2. `src/init.ts:267-287` 交互模式 stdin EOF → runInit 挂死不落定(R2;与 T2 同根因)。
203
+ 3. `scripts/dsh_log_index.py:553-555` retire_private_legacy 未捕 ProtectionError——受保护节点处批次崩溃中断、混合状态、永久卡死同节点(R4)。最小修:逐节点 try/except ProtectionError 记账跳过并汇总报告。
204
+ 4. `scripts/dsh_log_index.py:639` 转写暂存共享路径非原子写无锁——撕裂内容被幂等机制永久固化(R5)。最小修:tmp+os.replace 原子写(P2-14/F3 同款)+ 摄取期间锁文件。
205
+ 5. **[s流·N168]** `scripts/verify_discipline.py:178-181` + discipline-check.yml:53 allow_missing 恒开——skill 投影类纪律产物被删双守卫照绿(S2;zcode/AGENTS.md 有 workspace_index 关键入口补偿,skill 投影类零补偿坐实)。
206
+ 6. **[s流·N170]** `scripts/bootstrap_watchdog.py:261-266` no_log 分支不做恢复——违背 docstring :21「进程缺失→直接拉起」契约,自举循环永不恢复(S4)。
207
+ 7. **[t流·N167]** `src/bridge.ts:273-291` 握手成功→秒崩类无限重启循环——retries 清零使 MAX_RETRIES 不可达、冷却分支结构性不可达,~2.2s/代永久 spawn(T1)。与 F4 同文件;修法需「uptime<5s 的 exit 不清零 retries/计入快速失败计数」语义决策。
208
+
209
+ **low 7**:
210
+ 8. `test/init.test.ts:1-177` 覆盖盲区三处(dsh_log_index 零测试〔F1 守卫已补主干〕/ cli main 无 import 钉住 / parseFlags 边界与 EOF 用例缺)(R6)。
211
+ 9. **[s流·N171]** `scripts/cogmap_sync.py:528`(另 :443/:595-599)段解析只认首个 BEGIN..END——重复段行号锚永久逃逸门禁且 build 不修复(S5)。
212
+ 10. **[s流·N172]** `scripts/dsh_log_index.py:447` 溯源行硬编码「密级 private」与实际 internal 不符——失实密级声明入检索面(S6;v1 误标事故的文档层残留口径)。
213
+ 11. **[t流·N168]** `src/init.ts:340-346` 直跑入口 EOF 后 exit 0 静默假成功(T2;与 R2 同根因两表现,一并修可覆盖)。
214
+ 12. **[t流·N169]** `src/init.ts:136-144` --python 含空格路径的 shell 指引裸插值碎裂(T3;JSON 片段面正确,仅打印指引面)。
215
+ 13. **[t流·N170]** `src/lib/roleplay_web.ts:621-641` writeRoleMeta/writeTransSettings 静默吞写盘失败——V22「绝不报已保存」契约磁盘失败维度虚假成功(T4)。
216
+ 14. **[t流·N171]** `src/tools.ts:187-195` 工具取消不达后端——桥未实现 notifications/cancelled,被取消写操作照常落盘,tools.ts 注释宣称与实现不符(T5)。
217
+
218
+ ### 5.2 legacy 复测维持 20 面(medium 4 / low 16;原轮次→本轮复测次数)
219
+
220
+ **medium 4**:
221
+ 15. 【v6 N38→2】`src/lib/token_store.ts:76-79` auxRoot 双口径分裂(L11;锚点口径族,统一待一轮协商)。
222
+ 16. 【v6 N43→2】`src/index.ts:157` roleplay 数据面随宿主 cwd 漂移分裂(L15;根因连 dbPath 迁移语义,deferred 维持)。
223
+ 17. 【v8 N66→4】`src/lib/roleplay_web.ts:829-891` chat CSRF 写面无来源校验(L22/T6;修复需先定拦截策略——跨端 CLI 调用兼容,deferred 维持;含 v6 N45 残面 /import :745、POST /roles :961-970)。
224
+ 18. 【v13 N115→2】`scripts/bootstrap_loop.py:340-356` 通道 B 物理验证无执行超时(L9;Windows 无 SIGALRM,超时选型属设计决策留档;注意 F3 修后其「判活假绿」伴生面已闭合,本条仅剩 DoS 停转本身)。
225
+
226
+ **low 16**:
227
+ 19. 【v6 N29→2】interop_gate.py:27,:61 pass 态缺 failed 字段 KeyError 裸崩(L3)。
228
+ 20. 【v6 N30→2】criteria_fingerprint.py:44 --commit 临时目录泄漏(L4)。
229
+ 21. 【v6 N34→2】retr_time_coverage.py:179 --out 裸文件名 makedirs 空串崩(L5)。
230
+ 22. 【v6 N35→2】check_unreachable.py:22,:61 ROOTS 相对 cwd、0 文件假绿(L6;S7 合并复测同面)。
231
+ 23. 【v6 N36→2】bootstrap_watchdog.py:82 盘符 glob 死代码(L7)。
232
+ 24. 【v6 N37→2】bootstrap_watchdog.py:238,:283-296 进程死+日志新鲜 degraded 不拉起(L8;需真实进程台架)。
233
+ 25. 【v13 N116→2】link_check.py:44-47 _git 不查返回码 0 文件假绿(L10;S7 合并复测同面)。
234
+ 26. 【v6 N39→2】token_store.ts:98-99 writeKeyring 裸 fs 调用+签发先于落盘(L12)。
235
+ 27. 【v6 N40→2】mutual.ts:33,:43 restartCooldownMs 契约未实现(L13)。
236
+ 28. 【v6 N41→2】mutual.ts:304 stale processing-* 无清扫消费者(L14;A 侧不在本仓)。
237
+ 29. 【v6 N45/v8 N65→3】roleplay_web.ts:745-785,:945-973 role_id 白名单残面(L16;含于 17 的同面账,独立登记不重复计面)。
238
+ 30. 【v6 N46→2】whitebox_llm.ts:194-201 lastUserText 拼接语义与注释不符(L17;文件已下线无调用方)。
239
+ 31. 【v6 N47→2】hooks.ts:239-240 waterfall 内同步 await graph.timeline 桥挂死 +60s(L18)。
240
+ 32. 【v13 N117→2】datapath.ts:72 stateRoot env 相对/~ 双口径(L19;锚点口径族)。
241
+ 33. 【v13 N118→2】bridge.ts:156-159,:429-431 boot 期 dispose 后 waitReady 悬挂(L20)。
242
+ 34. 【v18→2】compiler/tests 四点(test_func_compile.py:92 静默跳过洞 + test_pbc.py:19-20 伪造操作码 + test_full_pipeline.py:189 恒真析取 + test_compiler_c2.py:87 文案失实)(L23;域属 compiler/tests 如实注明)。
243
+
244
+ ### 5.3 语义决策项与批次分诊(汇总)
245
+
246
+ - **锚点口径族**(N38/N43/N117 + 已修 N167 同族):~ 与相对路径的 node/python 双口径统一,涉及在役库根语义协商,跨轮 deferred 维持。
247
+ - **v8 N66 CSRF**:先定拦截策略(Origin 校验 vs token 束缚 vs 跨端 CLI 兼容层)再修,五轮口径一致。
248
+ - **v13 N115 通道 B 超时**:Windows 无 SIGALRM,选型(子进程隔离/线程看门狗/超时注入)属设计决策。
249
+ - **[t流·N167] bridge 秒崩重启**:与 F4 同文件邻接面,建议下批优先(修复面窄:exit 处理器按 uptime 分桶计数)。
250
+ - **dsh_log_index 剩余面**(N168 内容锚 / retire 异常 / 暂存并发 / :447 密级文案):同文件四开口,F1 已建 ext_token 与归属核验基建,建议同批收口。
251
+ - **测试基建族**(R6 盲区 + v18 compiler 四点):无活攻击面,回归防护网性质,随批次顺修。
252
+
253
+ ---
254
+
255
+ ## 六、纪律合规声明
256
+
257
+ 1. **查文件前先读 WORKSPACE_INDEX.md**:本报告会话已读(:26 scripts/=工程管线、:29 docs/=文档域),报告落 docs/eval/ 归域正确;各修复/复核会话材料均声明按职责定位执行,未全盘浏览。
258
+ 2. **结论引证**:全部 confirmed 条目带 path:line 与实测输出(★标注);本报告会话自身仅实跑编号基线 grep、索引读核、记账验算与脱敏复查,门禁与修复验证均如实标注为材料引用(编排/修复会话实跑),无一条检查被冒称为本会话已跑。
259
+ 3. **实验环境**:各会话实验全部在临时目录/哑数据环境(系统临时目录、临时克隆、哑 cg 类、哑 zstd 日志、MDCG_MASTER_KEY 哑密钥、fakehome 重定向),**未触真实令牌库/真实 serve/在役数据目录**(私有活库与 DSH 会话根零接触);测毕清理(F1 守卫连跑五轮零残留、F4 红证探针已删、L4 泄漏目录已清、bridge 实验家目录零实验特征串核验后清理)。
260
+ 4. **已修项勿重复报**:第6轮/第13轮/批次60-62 已修面本轮以复测形式复核(N27/N28/A1-a/A5-a 复测通过剔除、不再列账;批次63 版本号面未涉及);无重复实现级发现。
261
+ 5. **编号纪律**:基线已核(v19/v18 最大 N166);三股并行编号流撞号如实声明、按流登记、最终裁定归编排会话;F4 正确沿用旧号 v13 N119 未占新号。
262
+ 6. **git**:本报告会话与各修复会话均**未 git commit**(留给编排会话);工作区在途件归属已逐项核对(src/bridge.ts +14 与 test/bridge_stdin_error.test.ts=F4;src/init.ts +16 与 test/init.test.ts +37=F5;scripts/dsh_log_index.py 与 test_dsh_log_index_token.py=F1;scripts/check_publish_artifact.py 与 test_check_publish_artifact_scan.py=F2;scripts/bootstrap_loop.py、scripts/bootstrap_watchdog.py 与 test_bootstrap_channel_b_state.py=F3),无交叉误触。
263
+ 7. **路径卫生**:本报告不写本机绝对路径(在役库/DSH 日志根以「私有活库」「DSH 会话根」代称);仓库内以相对 path:line 引用;宿主安装路径/临时区随机名/钟点时间戳一律泛化描述。
264
+ 8. **无伪造**:本报告所有数据可溯源至材料原文或本会话命令输出;脱敏仅及字符串呈现形态、不改变任何实测语义(截断串的头尾 4 位与材料台账可逐位比对);无法满足的要求(编号唯一裁定、命中详情获取、N37 动态台架复现、双进程精确并发窗口)已在第七节明示,未绕过未虚构。
265
+
266
+ ---
267
+
268
+ ## 七、跳过项及原因
269
+
270
+ | # | 跳过项 | 原因 |
271
+ |---|---|---|
272
+ | 1 | git commit(5 项修复 + 本报告) | 编排会话统一负责(各修复结果一致声明「未 commit,留给编排会话」) |
273
+ | 2 | 三股编号流撞号的最终裁定 | 编号分配权归编排会话(F2 修复结果明示「另一任务报告亦标 N167,编号分配归编排会话裁定」);本报告按流如实登记不以编号定位 |
274
+ | 3 | 上一稿隐私门禁命中详情的获取 | 重写指令未携带命中详情(「命中:」后为空);本报告会话无法回查门禁系统内部命中记录,按保守口径全面脱敏重写(口径见头部声明与第六节第 8 条),若仍命中需编排会话回传命中串以精准处置 |
275
+ | 4 | v6 N37 动态复现(进程死亡+日志新鲜的恢复延迟窗口) | 需真实进程台架;本轮维持读码定级(L8 材料原文声明),未动态复现即不得报为已复现 |
276
+ | 5 | R5 双进程同时刻抢占同一 tpath 的精确并发窗口 | 时序窗口难稳定构造;四构成要件(非原子写+共享路径+序号 id+skip 不覆写)全部实测/读码成立,机制级结论不变,如实注明未做精确复现 |
277
+ | 6 | 并行在途改动的触碰 | 各修复会话互相声明「工作区中他人改动非本任务产物,未触碰」;归属清单见第六节第 6 条 |
278
+ | 7 | v6 N41 A 侧重发自愈核实 | A 侧不在本仓,无法核实(留档口径维持) |
279
+ | 8 | v8 N66 CSRF 修复 | 需先定拦截策略(跨端 CLI 调用兼容),修复前提未决,deferred 维持 |
280
+ | 9 | waterfall N47 修复 | 涉 waterfall 装配重构,留档维持(v6 起口径一致) |
281
+ | 10 | compiler/tests 四点修复 | 域属 compiler/tests 非 scripts/tests(本轮范围 scripts+TS),如实注明域属并留档 |
282
+ | 11 | 台账 217/217 与本轮 218/219/220 计数差异 | 系含子测试层与 test() 声明层两种计数口径 + 三轮守卫递增加入(218=F1 守卫、219=+F2、220=+F3),如实区分未冒称统一口径 |
283
+ | 12 | 本报告会话重跑门禁 | 门禁由编排会话传入(python 全量第 2 轮、npm test、npm run gate 均通过);报告会话职责为汇编与核账,重复全量门禁不在本 ask 范围,已如实标注材料属性 |