@furongjun1999/dsh-memory 0.4.11 → 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 (580) hide show
  1. package/README.md +552 -465
  2. package/codebuddy/CODEBUDDY.md +11 -3
  3. package/codebuddy/README.md +92 -90
  4. package/codebuddy/mcp.json +27 -27
  5. package/docs/GBrain/345/217/257/345/200/237/351/211/264/347/202/271_/347/201/265/346/236/242/350/220/275/347/202/271/344/272/244/346/216/245_20260919.md +169 -169
  6. package/docs/Pi/345/217/257/345/255/246/344/271/240/344/274/230/347/202/271_/347/201/265/346/236/242/345/244/247/350/204/221/346/224/271/350/277/233/344/272/244/346/216/245_20260915.md +144 -144
  7. package/docs/README.md +143 -111
  8. package/docs/discipline/harnesses.yaml +244 -226
  9. package/docs/discipline/templates/full.md.tmpl +61 -61
  10. package/docs/discipline/templates/rules.mdc.tmpl +68 -0
  11. package/docs/discipline/templates/skill.md.tmpl +23 -23
  12. package/docs/eval/AGI/344/270/203/347/273/264/350/257/204/345/210/206/346/212/245/345/221/212_md_cg_v1.0.md +299 -299
  13. package/docs/eval/AGI/344/270/203/347/273/264/350/257/204/345/210/206/346/212/245/345/221/212_md_cg_v2.0.md +239 -239
  14. package/docs/eval/bench_lingshu_self/bench_self.py +140 -0
  15. package/docs/eval/bench_lingshu_self/self_bench_result.json +404 -0
  16. 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
  17. 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
  18. package/docs/eval//345/256/236/351/252/214/346/226/271/346/241/210_/345/255/246/344/271/240/351/227/255/347/216/257AB/344/270/216/346/250/252/350/257/204_v1.0.md +174 -174
  19. 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
  20. package/docs/eval//346/250/252/350/257/204_/345/205/255/345/256/266100/351/242/230/344/270/255/350/213/261/345/217/214/346/237/245_v1.0.md +223 -223
  21. 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
  22. 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
  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_v1.md +156 -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_v10.md +210 -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_v11.md +227 -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_v12.md +203 -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_v13.md +233 -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_v14.md +191 -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_v15.md +213 -0
  30. package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v16.md +214 -0
  31. package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v17.md +199 -0
  32. package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v2.md +156 -0
  33. package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v3.md +152 -0
  34. 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
  35. 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
  36. 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
  37. 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
  38. 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
  39. 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
  40. package/docs/{mdcg → hive}//344/273/244/347/211/214/344/270/216/350/247/222/350/211/262/346/235/203/350/201/214/345/210/206/347/246/273_v0.1.md +165 -160
  41. package/docs/hive//344/273/244/347/211/214/350/257/255/344/271/211/344/277/256/346/255/243_/344/273/262/350/243/201/344/275/215_v0.1.md +76 -0
  42. package/docs/{mdcg → hive}//345/255/220/344/273/243/347/220/206/351/205/215/347/275/256/346/240/207/345/207/206_v0.5.md +236 -236
  43. 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
  44. package/docs/hive//346/243/200/347/264/242/346/224/266/346/225/233/345/256/236/346/265/213/344/270/216S1b/350/256/276/350/256/241_v0.1.md +43 -43
  45. package/docs/hive//346/243/200/347/264/242/347/256/227/346/263/225/345/217/243/345/276/204/345/257/271/347/205/247_v0.1.md +85 -0
  46. 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 +102 -102
  47. 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 +47 -0
  48. 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 +519 -503
  49. package/docs/hive//350/234/202/345/267/242/345/267/245/344/275/234/350/256/260/345/277/206_/351/241/271/347/233/256/350/256/241/345/210/222.md +85 -85
  50. package/docs/hive//350/234/202/345/267/242/350/256/276/350/256/241_/347/220/206/350/256/272/345/257/271/351/275/220_v0.1.md +191 -0
  51. package/docs/hive//350/234/202/345/267/242/350/277/255/344/273/243_/345/256/217/350/247/202/344/270/216/347/276/244/344/275/223/350/260/203/345/272/246_v0.1.md +90 -0
  52. package/docs/images/lingshu-moonlight-covenant-poster-preview.jpg +0 -0
  53. package/docs/images/lingshu-moonlight-covenant-poster.png +0 -0
  54. package/docs/mdcg/D_meta_/345/267/245/347/250/213/345/214/226/346/226/271/346/241/210_v0.2.md +216 -216
  55. package/docs/mdcg/README/350/257/246/347/273/206/347/211/210_v0.4.10.md +646 -646
  56. package/docs/mdcg/lingshu_tutorial.html +14449 -14449
  57. package/docs/mdcg/release_v0.4.11.md +49 -0
  58. package/docs/mdcg/release_v0.4.5.md +55 -55
  59. package/docs/mdcg/tool_table_v0.3.0.md +117 -117
  60. package/docs/mdcg//345/205/250/345/272/223/344/273/243/347/240/201/350/257/204/345/256/241/344/270/216/346/235/241/344/273/266/345/214/226/346/263/250/351/207/212_/350/256/241/345/210/222_v0.1.md +600 -600
  61. 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
  62. package/docs/mdcg//345/215/225/345/205/203/350/207/252/346/210/221/351/224/232/347/202/271_/347/263/273/347/273/237/346/217/220/347/244/272/350/257/215/346/240/207/345/207/206_v0.3.md +275 -275
  63. package/docs/mdcg//345/217/221/345/270/203/351/227/250/347/246/201/351/223/276_v0.1.md +54 -0
  64. package/docs/mdcg//346/272/220/347/240/201/347/272/247/346/236/266/346/236/204/345/256/241/350/256/241_GPT/346/211/271/350/257/204/345/257/271/347/205/247_v1.0.md +130 -130
  65. package/docs/mdcg//347/201/265/346/236/24282/345/267/245/345/205/267_/345/212/237/350/203/275/346/225/264/347/220/206/344/270/216/350/277/201/347/247/273/346/230/240/345/260/204_v0.1.md +278 -278
  66. 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 +172 -172
  67. package/docs/mdcg//347/274/272/345/217/243/345/215/225_P0/346/224/266/345/217/243_v0.1.md +270 -270
  68. package/docs/mdcg//350/256/244/347/237/245/345/233/276_G4-G8/347/274/272/345/217/243/350/243/201/345/256/232/345/215/225_v0.1.md +491 -491
  69. package/docs/mdcg//350/256/244/347/237/245/345/233/276_/346/235/241/344/273/266/347/251/272/351/227/264/345/220/210/346/210/220/344/270/216/347/224/237/346/225/210/346/235/241/344/273/266/345/217/243/345/276/204_v0.1.md +340 -340
  70. 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 +588 -588
  71. package/docs/plans/GridWorld/346/234/200/345/260/217/351/227/255/347/216/257/350/247/204/346/240/274_v0.1.md +176 -176
  72. package/docs/plans//345/221/275/345/220/215/346/262/273/347/220/206_/351/241/271/347/233/256/350/256/241/345/210/222.md +81 -81
  73. package/docs/swarm//350/234/202/347/276/244/344/272/222/350/201/224_v0.1.md +704 -704
  74. package/docs/swarm//350/234/202/347/276/244/345/220/214/351/224/231/346/243/200/346/265/213/345/256/236/351/252/214/345/215/217/350/256/256_v0.1.md +242 -242
  75. 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
  76. package/docs/theory//345/215/225/347/272/277/347/250/213/344/270/216/346/263/250/346/204/217/345/212/233/351/233/206/344/270/255_/346/227/240/344/272/211/350/256/256/347/220/206/350/256/272/346/226/207/346/241/243_v1.0.md +129 -129
  77. package/docs/theory//345/271/266/345/217/221/345/277/205/347/204/266/346/200/247/347/220/206/350/256/272_v0.2.md +134 -134
  78. package/docs/theory//346/231/272/350/203/275/350/256/2723.4.md +5260 -5260
  79. package/docs/theory//346/246/202/345/277/265/345/210/206/345/261/202/345/257/271/351/275/220/350/241/250_v0.1.md +145 -145
  80. package/docs/theory//347/220/206/350/256/272_/346/234/272/345/210/266_/344/273/243/347/240/201_/345/256/236/351/252/214_/347/274/272/345/217/243/347/237/251/351/230/265_v0.1.md +144 -144
  81. package/docs/theory//347/220/206/350/256/272/344/273/223/346/213/206/345/210/206/344/270/216/347/231/275/347/256/261/347/237/245/350/257/206/345/272/223/345/206/205/350/277/201_v0.1.md +198 -198
  82. package/docs/theory//350/256/244/347/237/245/344/273/243/347/220/206/344/270/216/346/224/266/346/225/233/347/273/223/346/236/204_/346/235/241/344/273/266/350/256/272/351/207/215/346/236/204_v0.1.md +221 -221
  83. package/docs/world_model//344/270/226/347/225/214/346/250/241/345/236/213_/347/245/236/347/273/217/347/275/221/347/273/234/345/272/225/345/261/202/346/236/266/346/236/204_v1.0.md +237 -237
  84. 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
  85. package/docs//345/217/221/345/270/203/344/273/266/345/233/236/346/272/257/350/257/264/346/230/216_v0.1.md +82 -82
  86. 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 +28 -2
  87. package/dsh/README.md +82 -82
  88. package/dsh/cordis.yml.example +139 -139
  89. package/dsh/update-lingshu.bat +11 -11
  90. package/lib/bridge.d.ts +9 -0
  91. package/lib/bridge.js +35 -0
  92. package/lib/hooks.js +36 -2
  93. package/lib/index.js +7 -1
  94. package/lib/lib/roleplay_web.js +116 -29
  95. package/lib/lib/token_store.d.ts +7 -1
  96. package/lib/lib/token_store.js +12 -3
  97. package/md_cg/__init__.py +7 -7
  98. package/md_cg/audit.py +379 -368
  99. package/md_cg/autonomy.py +287 -287
  100. package/md_cg/backfill.py +1328 -1327
  101. package/md_cg/backfill_bigdomain.py +34 -34
  102. package/md_cg/backfill_bucket_zh.py +35 -0
  103. package/md_cg/bench6_arms.py +410 -410
  104. package/md_cg/bench6_common.py +230 -230
  105. package/md_cg/bench6_competitors.py +212 -212
  106. package/md_cg/bench_axis_domain.py +257 -257
  107. package/md_cg/bench_blind_comp.py +308 -308
  108. package/md_cg/bench_e2e_judge.py +532 -0
  109. package/md_cg/bench_e2e_locomo_qa.py +368 -0
  110. package/md_cg/bench_e2e_qa.py +256 -0
  111. package/md_cg/bench_en_atoms_public.py +230 -230
  112. package/md_cg/bench_governance.py +348 -348
  113. package/md_cg/bench_lme_zh.py +410 -410
  114. package/md_cg/bench_locomo.py +121 -121
  115. package/md_cg/bench_locomo_zh.py +450 -450
  116. package/md_cg/bench_locomo_zh_public.py +147 -147
  117. package/md_cg/bench_longmem.py +112 -112
  118. package/md_cg/bench_membench.py +632 -632
  119. package/md_cg/bench_p0.py +149 -149
  120. package/md_cg/bench_progressive.py +287 -287
  121. package/md_cg/bench_role_views.py +238 -238
  122. package/md_cg/bench_task_ab.py +243 -243
  123. package/md_cg/bench_task_ab_llm.py +408 -408
  124. package/md_cg/bench_unified_en.py +204 -204
  125. package/md_cg/bench_zh_mad.py +601 -601
  126. package/md_cg/blindspot_tickets.py +123 -123
  127. package/md_cg/branches.py +301 -285
  128. package/md_cg/build_postings.py +73 -73
  129. package/md_cg/ccgc.py +1006 -948
  130. package/md_cg/census.py +132 -132
  131. package/md_cg/chain.py +315 -300
  132. package/md_cg/codeindex.py +531 -531
  133. package/md_cg/coldverify.py +292 -292
  134. package/md_cg/comment_gate.py +337 -337
  135. package/md_cg/cond_compose.py +190 -190
  136. package/md_cg/cond_facts.py +154 -154
  137. package/md_cg/cond_template.json +106 -106
  138. package/md_cg/condition_anchor.py +142 -142
  139. package/md_cg/conformance.py +726 -726
  140. package/md_cg/consistency.py +717 -717
  141. package/md_cg/consolidate.py +1537 -1439
  142. package/md_cg/corpus.py +110 -110
  143. package/md_cg/crosscheck.py +1098 -1097
  144. package/md_cg/crypto.py +3 -1
  145. package/md_cg/d_meta.py +310 -310
  146. package/md_cg/datapath.py +78 -18
  147. package/md_cg/docindex.py +473 -473
  148. package/md_cg/eval_common.py +575 -575
  149. package/md_cg/evidence.py +4 -2
  150. package/md_cg/evolution.py +477 -477
  151. package/md_cg/export.py +222 -220
  152. package/md_cg/forgetting.py +581 -581
  153. package/md_cg/fsutil.py +377 -329
  154. package/md_cg/hotcache.py +48 -7
  155. package/md_cg/hyperedge.py +251 -251
  156. package/md_cg/identity.py +390 -390
  157. package/md_cg/insight.py +500 -500
  158. package/md_cg/interop.py +338 -0
  159. package/md_cg/judgment_manifest.py +177 -0
  160. package/md_cg/lexicon/build_cedict_en_zh.py +329 -329
  161. package/md_cg/lexicon/build_standard_en.py +171 -171
  162. package/md_cg/lexicon/expand_en_zh.py +211 -211
  163. package/md_cg/lifecycle.py +272 -272
  164. package/md_cg/linkref.py +280 -280
  165. package/md_cg/links.py +140 -107
  166. package/md_cg/mcp_server.py +403 -55
  167. package/md_cg/md_whitebox.py +345 -345
  168. package/md_cg/mdcg.py +783 -233
  169. package/md_cg/mdcos.py +500 -70
  170. package/md_cg/metacognition.py +591 -591
  171. package/md_cg/migrate.py +119 -119
  172. package/md_cg/migrate_aeis.py +221 -221
  173. package/md_cg/migrate_roleplay.py +293 -293
  174. package/md_cg/migrate_wisdom_graph.py +360 -360
  175. package/md_cg/mreview/__init__.py +25 -25
  176. package/md_cg/mreview/__main__.py +110 -110
  177. package/md_cg/mreview/bundle.py +178 -178
  178. package/md_cg/mreview/candidates.py +262 -262
  179. package/md_cg/mreview/govern.py +694 -693
  180. package/md_cg/mreview/locate.py +939 -939
  181. package/md_cg/mreview/pipeline.py +728 -728
  182. package/md_cg/mreview/rules/duplication.json +21 -21
  183. package/md_cg/mreview/rules/field_coverage.json +54 -54
  184. package/md_cg/mreview/rules/source_license.json +21 -21
  185. package/md_cg/mreview/rules/template_flow.json +21 -21
  186. package/md_cg/mreview/ruleset.py +252 -252
  187. package/md_cg/nodefile.py +575 -575
  188. package/md_cg/pooling.py +484 -472
  189. package/md_cg/postings.py +300 -298
  190. package/md_cg/predict.py +1100 -1100
  191. package/md_cg/progressive.py +123 -123
  192. package/md_cg/protect.py +272 -272
  193. package/md_cg/protocol/md_cg_gate.proto +33 -33
  194. package/md_cg/protocol.py +372 -372
  195. package/md_cg/provenance.py +582 -582
  196. package/md_cg/reach.py +453 -453
  197. package/md_cg/readcache.py +143 -0
  198. package/md_cg/reconcile.py +228 -0
  199. package/md_cg/refindex.py +833 -833
  200. package/md_cg/refine.py +604 -604
  201. package/md_cg/review_cli.py +170 -0
  202. package/md_cg/roleviews.py +89 -89
  203. package/md_cg/routing.py +393 -365
  204. package/md_cg/run_tests.py +211 -0
  205. package/md_cg/scrub.py +13 -3
  206. package/md_cg/security.py +128 -18
  207. package/md_cg/self_state.py +1029 -1029
  208. package/md_cg/selfreport.py +152 -151
  209. package/md_cg/semantic/__init__.py +10 -10
  210. package/md_cg/semantic/canonical.py +122 -122
  211. package/md_cg/semantic/en_normalizer.py +364 -364
  212. package/md_cg/semantic/en_zh_map.json +28694 -0
  213. package/md_cg/semantic/export_en_zh_map.py +64 -0
  214. package/md_cg/semantic/unify.py +45 -0
  215. package/md_cg/semantic/zh_en_atoms.py +139 -139
  216. package/md_cg/signer.py +7 -4
  217. package/md_cg/sources.py +816 -582
  218. package/md_cg/statushdr.py +179 -179
  219. package/md_cg/stg.py +54 -37
  220. package/md_cg/subgraph.py +729 -729
  221. package/md_cg/sustain.py +35 -5
  222. package/md_cg/tasks.py +470 -470
  223. package/md_cg/test_access_hints.py +147 -0
  224. package/md_cg/test_action_derive.py +203 -203
  225. package/md_cg/test_audit_rotate.py +270 -270
  226. package/md_cg/test_autonomy.py +143 -143
  227. package/md_cg/test_bench_governance.py +102 -102
  228. package/md_cg/test_blindspot_tickets.py +166 -166
  229. package/md_cg/test_branch_discard_tombstone.py +136 -0
  230. package/md_cg/test_branches.py +13 -3
  231. package/md_cg/test_ccg_perturb.py +184 -184
  232. package/md_cg/test_ccgc.py +433 -433
  233. package/md_cg/test_census_prune.py +81 -81
  234. package/md_cg/test_chain_read_isolate.py +168 -0
  235. package/md_cg/test_cond_compose_anchors.py +76 -76
  236. package/md_cg/test_cond_match.py +165 -165
  237. package/md_cg/test_condition_anchor.py +81 -81
  238. package/md_cg/test_d_meta.py +412 -412
  239. package/md_cg/test_datapath_device_name.py +203 -0
  240. package/md_cg/test_datapath_root.py +199 -199
  241. package/md_cg/test_emit_negtail_cache.py +156 -0
  242. package/md_cg/test_en_pipeline.py +22 -2
  243. package/md_cg/test_gain_gate.py +212 -212
  244. package/md_cg/test_govern_directread.py +421 -0
  245. package/md_cg/test_health_scale.py +173 -173
  246. package/md_cg/test_hive_ingest.py +285 -0
  247. package/md_cg/test_hot_cold.py +215 -215
  248. package/md_cg/test_hyperedge.py +245 -245
  249. package/md_cg/test_i26_empty_first_write.py +116 -0
  250. package/md_cg/test_i27_e041_identity.py +128 -0
  251. package/md_cg/test_i28_hotcache_prodpath.py +122 -0
  252. package/md_cg/test_i32_hotcache_env_key.py +218 -0
  253. package/md_cg/test_identity_attribution.py +96 -15
  254. package/md_cg/test_index_durability.py +17 -3
  255. package/md_cg/test_interop.py +95 -0
  256. package/md_cg/test_interop_judgment.py +228 -0
  257. package/md_cg/test_issue39_utf8_stdio.py +273 -0
  258. package/md_cg/test_lifecycle.py +309 -309
  259. package/md_cg/test_linkref.py +306 -306
  260. package/md_cg/test_links_concurrent_write.py +188 -0
  261. package/md_cg/test_lock.py +43 -43
  262. package/md_cg/test_md_access_parity.py +255 -255
  263. package/md_cg/test_md_writepath.py +345 -345
  264. package/md_cg/test_mdstore_search_parity.py +160 -0
  265. package/md_cg/test_merge_upsert.py +168 -0
  266. package/md_cg/test_mr_m2.py +587 -587
  267. package/md_cg/test_mr_m3.py +710 -710
  268. package/md_cg/test_mr_m4.py +485 -485
  269. package/md_cg/test_n123_derive_expiry_chain.py +205 -0
  270. package/md_cg/test_n130_verify_falsified_protect.py +185 -0
  271. package/md_cg/test_n131_merge_gate.py +205 -0
  272. package/md_cg/test_p0.py +250 -250
  273. package/md_cg/test_p1.py +316 -316
  274. package/md_cg/test_p10_identity.py +173 -173
  275. package/md_cg/test_p11_consistency.py +233 -233
  276. package/md_cg/test_p12_metacognition.py +212 -212
  277. package/md_cg/test_p13_encryption.py +241 -241
  278. package/md_cg/test_p14_sustain.py +249 -249
  279. package/md_cg/test_p15_scrub.py +280 -280
  280. package/md_cg/test_p16_self_state.py +301 -301
  281. package/md_cg/test_p17_predict.py +354 -354
  282. package/md_cg/test_p18_whitebox.py +171 -171
  283. package/md_cg/test_p19_migrate_roleplay.py +149 -149
  284. package/md_cg/test_p1x_ref_root.py +160 -0
  285. package/md_cg/test_p20_evolution.py +315 -315
  286. package/md_cg/test_p21_tokens.py +293 -270
  287. package/md_cg/test_p22_theory.py +175 -175
  288. package/md_cg/test_p23_links.py +311 -311
  289. package/md_cg/test_p24_evidence.py +227 -227
  290. package/md_cg/test_p25_weights.py +156 -156
  291. package/md_cg/test_p26_refindex.py +416 -416
  292. package/md_cg/test_p27_docindex.py +16 -7
  293. package/md_cg/test_p28_refcheck.py +305 -305
  294. package/md_cg/test_p29_session_ingest_export.py +354 -333
  295. package/md_cg/test_p2_mcp.py +3 -0
  296. package/md_cg/test_p3.py +11 -2
  297. package/md_cg/test_p30_maintain.py +330 -330
  298. package/md_cg/test_p31_insight.py +534 -534
  299. package/md_cg/test_p32_backfill.py +7 -1
  300. package/md_cg/test_p33_ccg_wiring.py +293 -293
  301. package/md_cg/test_p34_crosscheck.py +331 -331
  302. package/md_cg/test_p35_conditioned_claim.py +252 -252
  303. package/md_cg/test_p36_kp_align.py +230 -230
  304. package/md_cg/test_p37_condition_space.py +248 -248
  305. package/md_cg/test_p38_concurrent_flush.py +102 -0
  306. package/md_cg/test_p38_contextualize.py +273 -273
  307. package/md_cg/test_p39_verify_flow.py +153 -0
  308. package/md_cg/test_p39_vision_evidence.py +369 -369
  309. package/md_cg/test_p40_refine_worklist.py +241 -241
  310. package/md_cg/test_p41_evolve_patrol.py +224 -224
  311. package/md_cg/test_p42_provenance.py +269 -269
  312. package/md_cg/test_p43_pooling.py +412 -398
  313. package/md_cg/test_p44_md_whitebox.py +231 -231
  314. package/md_cg/test_p45_session_identity.py +219 -219
  315. package/md_cg/test_p46_unit_scope.py +272 -272
  316. package/md_cg/test_p47_session_view.py +316 -0
  317. package/md_cg/test_p4_fuzzy.py +223 -223
  318. package/md_cg/test_p5_semantic.py +226 -226
  319. package/md_cg/test_p6_consolidate.py +440 -387
  320. package/md_cg/test_p7_goals_recent.py +202 -202
  321. package/md_cg/test_p8_subgraph_chain.py +200 -200
  322. package/md_cg/test_p9_forget_protect.py +231 -231
  323. package/md_cg/test_predict_beta.py +135 -135
  324. package/md_cg/test_preflight_failclosed.py +100 -100
  325. package/md_cg/test_progressive.py +146 -146
  326. package/md_cg/test_propose_tail_index.py +157 -0
  327. package/md_cg/test_protocol.py +243 -243
  328. package/md_cg/test_reach.py +378 -378
  329. package/md_cg/test_reach_keys.py +201 -201
  330. package/md_cg/test_read_clip.py +141 -141
  331. package/md_cg/test_read_scope_b27.py +277 -0
  332. package/md_cg/test_readcache_default_on.py +168 -0
  333. package/md_cg/test_readcache_precise_inval.py +270 -0
  334. package/md_cg/test_readcache_prodpath.py +203 -0
  335. package/md_cg/test_reconcile_v0.py +294 -0
  336. package/md_cg/test_retr_gates_prodpath.py +140 -0
  337. package/md_cg/test_retr_s1.py +344 -340
  338. package/md_cg/test_retr_s1b.py +276 -209
  339. package/md_cg/test_retr_s3.py +194 -194
  340. package/md_cg/test_retr_s4.py +163 -163
  341. package/md_cg/test_retr_s5.py +200 -200
  342. package/md_cg/test_retr_s6.py +157 -157
  343. package/md_cg/test_retr_s7.py +392 -384
  344. package/md_cg/test_retr_s8_time.py +369 -316
  345. package/md_cg/test_retr_s9_edges.py +286 -286
  346. package/md_cg/test_retr_s9_entity_ctx.py +9 -3
  347. package/md_cg/test_retr_score_once.py +208 -0
  348. package/md_cg/test_review_conformance.py +367 -367
  349. package/md_cg/test_review_onepass.py +170 -0
  350. package/md_cg/test_role_views.py +354 -354
  351. package/md_cg/test_rrf_graph_seed_cache.py +154 -0
  352. package/md_cg/test_security_audit.py +155 -0
  353. package/md_cg/test_security_audit_b26.py +161 -0
  354. package/md_cg/test_security_audit_v21.py +250 -0
  355. package/md_cg/test_sem_noise.py +242 -242
  356. package/md_cg/test_semantic_canonical.py +16 -2
  357. package/md_cg/test_session_isolation.py +168 -0
  358. package/md_cg/test_snapshot_autoclose.py +187 -0
  359. package/md_cg/test_subproc_encoding.py +192 -192
  360. package/md_cg/test_sustain_mutual.py +153 -153
  361. package/md_cg/test_tail_watermark_race.py +208 -0
  362. package/md_cg/test_tasks.py +409 -409
  363. package/md_cg/test_tenant_env_override_warn.py +139 -0
  364. package/md_cg/test_tenant_registry_corrupt_warn.py +151 -0
  365. package/md_cg/test_tool_face.py +189 -189
  366. package/md_cg/test_transfer.py +180 -180
  367. package/md_cg/test_trust.py +361 -361
  368. package/md_cg/test_twophase.py +286 -286
  369. package/md_cg/test_v14_fixes.py +38 -20
  370. package/md_cg/test_validity_filter.py +280 -280
  371. package/md_cg/test_verify_answer.py +138 -138
  372. package/md_cg/test_verify_dirty_reconcile.py +157 -0
  373. package/md_cg/test_wisdom_md_store.py +292 -292
  374. package/md_cg/test_writelimit.py +197 -197
  375. package/md_cg/test_writepipe.py +214 -214
  376. package/md_cg/theory.py +6 -3
  377. package/md_cg/tokens.py +85 -14
  378. package/md_cg/tool_face.py +260 -260
  379. package/md_cg/trust.py +986 -950
  380. package/md_cg/twophase.py +231 -231
  381. package/md_cg/units.py +668 -667
  382. package/md_cg/vision_evidence.py +667 -666
  383. package/md_cg/weights.py +624 -624
  384. package/md_cg/whitebox.py +527 -527
  385. package/md_cg/whitebox_kb/__init__.py +37 -37
  386. package/md_cg/whitebox_kb/aeis_core/__init__.py +42 -42
  387. package/md_cg/whitebox_kb/aeis_core/semantic.py +280 -280
  388. package/md_cg/whitebox_kb/aeis_core/textutil.py +13 -13
  389. package/md_cg/whitebox_kb/engine.py +310 -310
  390. package/md_cg/whitebox_kb/seed_knowledge//346/231/272/350/203/275/350/256/2723.4.md +5260 -5260
  391. package/md_cg/whitebox_kb/wisdom/browser_units.py +2631 -2631
  392. package/md_cg/whitebox_kb/wisdom/causal_discover.py +432 -432
  393. package/md_cg/whitebox_kb/wisdom/chat_engine.py +1506 -1506
  394. package/md_cg/whitebox_kb/wisdom/compiler_code_units.py +3033 -3033
  395. package/md_cg/whitebox_kb/wisdom/condition_algebra.py +112 -112
  396. package/md_cg/whitebox_kb/wisdom/condition_frame.py +315 -315
  397. package/md_cg/whitebox_kb/wisdom/condition_kb.py +108 -108
  398. package/md_cg/whitebox_kb/wisdom/conflict_map.json +4445 -4445
  399. package/md_cg/whitebox_kb/wisdom/core/lexer.py +512 -512
  400. package/md_cg/whitebox_kb/wisdom/core/name_checker.py +1023 -1023
  401. package/md_cg/whitebox_kb/wisdom/cspmn.py +258 -258
  402. package/md_cg/whitebox_kb/wisdom/csre.py +264 -264
  403. package/md_cg/whitebox_kb/wisdom/danmaku_audit.py +252 -252
  404. package/md_cg/whitebox_kb/wisdom/distilled_condition_units.json +6417 -6417
  405. package/md_cg/whitebox_kb/wisdom/docs/WB-EVAL-20260902b.json +1950 -1950
  406. package/md_cg/whitebox_kb/wisdom/docs/WB-EVAL-20260902c.json +1296 -1296
  407. package/md_cg/whitebox_kb/wisdom/docs/whitebox_capability_graph_demo.json +59 -59
  408. package/md_cg/whitebox_kb/wisdom/graph_db_units.py +3089 -3089
  409. package/md_cg/whitebox_kb/wisdom/knowledge_points.py +318 -318
  410. package/md_cg/whitebox_kb/wisdom/md_access.py +470 -470
  411. package/md_cg/whitebox_kb/wisdom/md_store.py +276 -251
  412. package/md_cg/whitebox_kb/wisdom/migrate_wisdom.py +476 -476
  413. package/md_cg/whitebox_kb/wisdom/multilang_ir.py +128 -124
  414. package/md_cg/whitebox_kb/wisdom/navigate.py +248 -248
  415. package/md_cg/whitebox_kb/wisdom/neural_retrieve.py +224 -224
  416. package/md_cg/whitebox_kb/wisdom/os_units.py +2735 -2735
  417. package/md_cg/whitebox_kb/wisdom/pattern_separation.py +376 -376
  418. package/md_cg/whitebox_kb/wisdom/prereq_map.json +364 -364
  419. package/md_cg/whitebox_kb/wisdom/python_code_units.py +2766 -2766
  420. package/md_cg/whitebox_kb/wisdom/role_solidified.json +7 -7
  421. package/md_cg/whitebox_kb/wisdom/route_memory.py +244 -244
  422. package/md_cg/whitebox_kb/wisdom/scene_reconstruction.py +148 -148
  423. package/md_cg/whitebox_kb/wisdom/snr_report.json +40 -40
  424. package/md_cg/whitebox_kb/wisdom/test_code_compose_domains.py +7541 -7541
  425. package/md_cg/whitebox_kb/wisdom/test_compiler_self_bootstrap.py +354 -354
  426. package/md_cg/whitebox_kb/wisdom/test_ecosystem_assembly.py +158 -158
  427. package/md_cg/whitebox_kb/wisdom/test_ecosystem_demos.py +193 -193
  428. package/md_cg/whitebox_kb/wisdom/test_graph_db.py +292 -292
  429. package/md_cg/whitebox_kb/wisdom/test_python_self_bootstrap.py +160 -160
  430. package/md_cg/whitebox_kb/wisdom/trigger_words_index.json +4366 -4366
  431. package/md_cg/whitebox_kb/wisdom/verifier.py +1297 -1297
  432. package/md_cg/writelimit.py +356 -356
  433. package/md_cg/writepipe.py +20 -8
  434. package/package.json +101 -96
  435. package/skills/plugin.json +54 -54
  436. package/skills/skills/designer-perspective/SKILL.md +158 -158
  437. package/skills/skills/designer-perspective/references/01-observation-position.md +66 -66
  438. package/skills/skills/designer-perspective/references/02-structure-recognition.md +62 -62
  439. package/skills/skills/designer-perspective/references/03-direction-judgment.md +55 -55
  440. package/skills/skills/designer-perspective/references/04-qualification-verdict.md +72 -72
  441. package/skills/skills/designer-perspective/references/05-condition-attribution.md +74 -74
  442. package/skills/skills/designer-perspective/scripts/designer.py +545 -545
  443. package/skills/skills/designer-perspective/tests/cases.jsonl +17 -17
  444. package/skills/skills/designer-perspective/tests/selftest.py +61 -61
  445. package/skills/skills/lingshu-browser/SKILL.md +60 -60
  446. package/skills/skills/lingshu-compiler/SKILL.md +56 -56
  447. package/skills/skills/lingshu-compiler/units/analyze-type-infer/SKILL.md +45 -45
  448. package/skills/skills/lingshu-compiler/units/check-name-real/SKILL.md +45 -45
  449. package/skills/skills/lingshu-compiler/units/compile-assign/SKILL.md +45 -45
  450. package/skills/skills/lingshu-compiler/units/compile-expr-tree/SKILL.md +45 -45
  451. package/skills/skills/lingshu-compiler/units/compile-full-pipeline/SKILL.md +45 -45
  452. package/skills/skills/lingshu-compiler/units/compile-func-def/SKILL.md +45 -45
  453. package/skills/skills/lingshu-compiler/units/compile-if-then/SKILL.md +45 -45
  454. package/skills/skills/lingshu-compiler/units/compile-logic-expr/SKILL.md +45 -45
  455. package/skills/skills/lingshu-compiler/units/compile-recursive/SKILL.md +45 -45
  456. package/skills/skills/lingshu-compiler/units/compile-scope/SKILL.md +45 -45
  457. package/skills/skills/lingshu-compiler/units/compile-type-check/SKILL.md +45 -45
  458. package/skills/skills/lingshu-compiler/units/compile-while/SKILL.md +45 -45
  459. package/skills/skills/lingshu-compiler/units/compiler-0010c4bf/SKILL.md +45 -45
  460. package/skills/skills/lingshu-compiler/units/compiler-0355bffb/SKILL.md +45 -45
  461. package/skills/skills/lingshu-compiler/units/compiler-0361708a/SKILL.md +45 -45
  462. package/skills/skills/lingshu-compiler/units/compiler-054a0414/SKILL.md +45 -45
  463. package/skills/skills/lingshu-compiler/units/compiler-05a1691a/SKILL.md +45 -45
  464. package/skills/skills/lingshu-compiler/units/compiler-05eeed1e/SKILL.md +45 -45
  465. package/skills/skills/lingshu-compiler/units/compiler-0622a1f6/SKILL.md +45 -45
  466. package/skills/skills/lingshu-compiler/units/compiler-08b54217/SKILL.md +45 -45
  467. package/skills/skills/lingshu-compiler/units/compiler-0a62b70c/SKILL.md +45 -45
  468. package/skills/skills/lingshu-compiler/units/compiler-0ab24d00/SKILL.md +45 -45
  469. package/skills/skills/lingshu-compiler/units/compiler-0e093688/SKILL.md +45 -45
  470. package/skills/skills/lingshu-compiler/units/compiler-0e82b966/SKILL.md +45 -45
  471. package/skills/skills/lingshu-compiler/units/compiler-0ee9b9b9/SKILL.md +45 -45
  472. package/skills/skills/lingshu-compiler/units/compiler-0f3787e6/SKILL.md +45 -45
  473. package/skills/skills/lingshu-compiler/units/compiler-1028685f/SKILL.md +45 -45
  474. package/skills/skills/lingshu-compiler/units/compiler-11897630/SKILL.md +45 -45
  475. package/skills/skills/lingshu-compiler/units/compiler-16661b9b/SKILL.md +45 -45
  476. package/skills/skills/lingshu-compiler/units/compiler-1f722303/SKILL.md +45 -45
  477. package/skills/skills/lingshu-compiler/units/compiler-25be1262/SKILL.md +45 -45
  478. package/skills/skills/lingshu-compiler/units/compiler-2a76ba07/SKILL.md +45 -45
  479. package/skills/skills/lingshu-compiler/units/compiler-2dbea54a/SKILL.md +45 -45
  480. package/skills/skills/lingshu-compiler/units/compiler-2df52f16/SKILL.md +45 -45
  481. package/skills/skills/lingshu-compiler/units/compiler-2ec2c9d2/SKILL.md +45 -45
  482. package/skills/skills/lingshu-compiler/units/compiler-2f8c8f39/SKILL.md +45 -45
  483. package/skills/skills/lingshu-compiler/units/compiler-38378ac7/SKILL.md +45 -45
  484. package/skills/skills/lingshu-compiler/units/compiler-39457d2e/SKILL.md +45 -45
  485. package/skills/skills/lingshu-compiler/units/compiler-39fb5926/SKILL.md +45 -45
  486. package/skills/skills/lingshu-compiler/units/compiler-47f4fbfa/SKILL.md +45 -45
  487. package/skills/skills/lingshu-compiler/units/compiler-4a8cd1f1/SKILL.md +45 -45
  488. package/skills/skills/lingshu-compiler/units/compiler-4b230b6b/SKILL.md +45 -45
  489. package/skills/skills/lingshu-compiler/units/compiler-4cbbda95/SKILL.md +45 -45
  490. package/skills/skills/lingshu-compiler/units/compiler-4d5a68ff/SKILL.md +45 -45
  491. package/skills/skills/lingshu-compiler/units/compiler-56dc9bdd/SKILL.md +45 -45
  492. package/skills/skills/lingshu-compiler/units/compiler-57e76ebe/SKILL.md +45 -45
  493. package/skills/skills/lingshu-compiler/units/compiler-61ff016b/SKILL.md +45 -45
  494. package/skills/skills/lingshu-compiler/units/compiler-63eae588/SKILL.md +45 -45
  495. package/skills/skills/lingshu-compiler/units/compiler-64c4224b/SKILL.md +45 -45
  496. package/skills/skills/lingshu-compiler/units/compiler-66377955/SKILL.md +45 -45
  497. package/skills/skills/lingshu-compiler/units/compiler-674ab4f6/SKILL.md +45 -45
  498. package/skills/skills/lingshu-compiler/units/compiler-6af76fd6/SKILL.md +45 -45
  499. package/skills/skills/lingshu-compiler/units/compiler-6d979db2/SKILL.md +45 -45
  500. package/skills/skills/lingshu-compiler/units/compiler-6de326c0/SKILL.md +45 -45
  501. package/skills/skills/lingshu-compiler/units/compiler-6f1c0eea/SKILL.md +45 -45
  502. package/skills/skills/lingshu-compiler/units/compiler-724d6c9b/SKILL.md +45 -45
  503. package/skills/skills/lingshu-compiler/units/compiler-7690177f/SKILL.md +45 -45
  504. package/skills/skills/lingshu-compiler/units/compiler-7b229a7d/SKILL.md +45 -45
  505. package/skills/skills/lingshu-compiler/units/compiler-7f471b3a/SKILL.md +45 -45
  506. package/skills/skills/lingshu-compiler/units/compiler-815cad08/SKILL.md +45 -45
  507. package/skills/skills/lingshu-compiler/units/compiler-83c61634/SKILL.md +45 -45
  508. package/skills/skills/lingshu-compiler/units/compiler-8c798c81/SKILL.md +45 -45
  509. package/skills/skills/lingshu-compiler/units/compiler-8dd747ac/SKILL.md +45 -45
  510. package/skills/skills/lingshu-compiler/units/compiler-90324d0a/SKILL.md +45 -45
  511. package/skills/skills/lingshu-compiler/units/compiler-94b8d72d/SKILL.md +45 -45
  512. package/skills/skills/lingshu-compiler/units/compiler-94f12231/SKILL.md +45 -45
  513. package/skills/skills/lingshu-compiler/units/compiler-95937c16/SKILL.md +45 -45
  514. package/skills/skills/lingshu-compiler/units/compiler-98a5625b/SKILL.md +45 -45
  515. package/skills/skills/lingshu-compiler/units/compiler-98b4c42f/SKILL.md +45 -45
  516. package/skills/skills/lingshu-compiler/units/compiler-98e3894a/SKILL.md +45 -45
  517. package/skills/skills/lingshu-compiler/units/compiler-9bdfe4b8/SKILL.md +45 -45
  518. package/skills/skills/lingshu-compiler/units/compiler-9d9b4e83/SKILL.md +45 -45
  519. package/skills/skills/lingshu-compiler/units/compiler-9f7be5ad/SKILL.md +45 -45
  520. package/skills/skills/lingshu-compiler/units/compiler-a6daf076/SKILL.md +45 -45
  521. package/skills/skills/lingshu-compiler/units/compiler-a7995a0c/SKILL.md +45 -45
  522. package/skills/skills/lingshu-compiler/units/compiler-a8399248/SKILL.md +45 -45
  523. package/skills/skills/lingshu-compiler/units/compiler-aabbd099/SKILL.md +45 -45
  524. package/skills/skills/lingshu-compiler/units/compiler-afe169d8/SKILL.md +45 -45
  525. package/skills/skills/lingshu-compiler/units/compiler-b0678bda/SKILL.md +45 -45
  526. package/skills/skills/lingshu-compiler/units/compiler-b09bd196/SKILL.md +45 -45
  527. package/skills/skills/lingshu-compiler/units/compiler-b1396e23/SKILL.md +45 -45
  528. package/skills/skills/lingshu-compiler/units/compiler-b9b31ce0/SKILL.md +45 -45
  529. package/skills/skills/lingshu-compiler/units/compiler-c10264a7/SKILL.md +45 -45
  530. package/skills/skills/lingshu-compiler/units/compiler-cb1e8e4b/SKILL.md +45 -45
  531. package/skills/skills/lingshu-compiler/units/compiler-ccafd438/SKILL.md +45 -45
  532. package/skills/skills/lingshu-compiler/units/compiler-cda9c262/SKILL.md +45 -45
  533. package/skills/skills/lingshu-compiler/units/compiler-ce648068/SKILL.md +45 -45
  534. package/skills/skills/lingshu-compiler/units/compiler-cf5776a4/SKILL.md +45 -45
  535. package/skills/skills/lingshu-compiler/units/compiler-d974e5d3/SKILL.md +45 -45
  536. package/skills/skills/lingshu-compiler/units/compiler-e3979fd3/SKILL.md +45 -45
  537. package/skills/skills/lingshu-compiler/units/compiler-eb1cf2b5/SKILL.md +45 -45
  538. package/skills/skills/lingshu-compiler/units/compiler-ecb30d5b/SKILL.md +45 -45
  539. package/skills/skills/lingshu-compiler/units/compiler-f8c8b24b/SKILL.md +45 -45
  540. package/skills/skills/lingshu-compiler/units/compiler-f99fedbe/SKILL.md +45 -45
  541. package/skills/skills/lingshu-compiler/units/compiler-fa8ff5f7/SKILL.md +45 -45
  542. package/skills/skills/lingshu-compiler/units/compiler-fe1b058d/SKILL.md +45 -45
  543. package/skills/skills/lingshu-compiler/units/lex-chinese-program/SKILL.md +45 -45
  544. package/skills/skills/lingshu-compiler/units/lex-dao-de-jing/SKILL.md +45 -45
  545. package/skills/skills/lingshu-compiler/units/lex-nine-chapters/SKILL.md +45 -45
  546. package/skills/skills/lingshu-compiler/units/vm-arithmetic/SKILL.md +45 -45
  547. package/skills/skills/lingshu-compiler/units/vm-array-ops/SKILL.md +45 -45
  548. package/skills/skills/lingshu-compiler/units/vm-closure-call/SKILL.md +45 -45
  549. package/skills/skills/lingshu-compiler/units/vm-closure-create/SKILL.md +45 -45
  550. package/skills/skills/lingshu-compiler/units/vm-compare/SKILL.md +45 -45
  551. package/skills/skills/lingshu-compiler/units/vm-cond-jump/SKILL.md +45 -45
  552. package/skills/skills/lingshu-compiler/units/vm-cond-space/SKILL.md +45 -45
  553. package/skills/skills/lingshu-compiler/units/vm-exception/SKILL.md +45 -45
  554. package/skills/skills/lingshu-compiler/units/vm-func-call/SKILL.md +45 -45
  555. package/skills/skills/lingshu-compiler/units/vm-loop-run/SKILL.md +45 -45
  556. package/skills/skills/lingshu-compiler/units/vm-profiling/SKILL.md +45 -45
  557. package/skills/skills/lingshu-compiler/units/vm-refcount/SKILL.md +45 -45
  558. package/skills/skills/lingshu-compiler/units/vm-run-loop/SKILL.md +45 -45
  559. package/skills/skills/lingshu-compiler/units/vm-short-circuit/SKILL.md +45 -45
  560. package/skills/skills/lingshu-compiler/units/vm-stack-guard/SKILL.md +45 -45
  561. package/skills/skills/lingshu-compiler/units/vm-stack-ops/SKILL.md +45 -45
  562. package/skills/skills/lingshu-compiler/units/vm-trust-accum/SKILL.md +45 -45
  563. package/skills/skills/lingshu-graph/SKILL.md +63 -63
  564. package/skills/skills/lingshu-net/SKILL.md +48 -48
  565. package/skills/skills/lingshu-os/SKILL.md +64 -64
  566. package/skills/skills/lingshu-pylang/SKILL.md +71 -71
  567. package/src/bridge.ts +33 -0
  568. package/src/hooks.ts +38 -2
  569. package/src/index.ts +526 -518
  570. package/src/lib/datapath.ts +326 -326
  571. package/src/lib/mdcg_client.ts +413 -413
  572. package/src/lib/mutual.ts +428 -428
  573. package/src/lib/prompt_safety.ts +62 -62
  574. package/src/lib/python_path.ts +71 -71
  575. package/src/lib/roleplay_web.ts +116 -29
  576. package/src/lib/token_store.ts +13 -3
  577. package/src/tools.ts +212 -212
  578. package/zcode/AGENTS.md +11 -3
  579. package/zcode/README.md +41 -41
  580. /package/docs/{mdcg → hive}//344/270/273/344/273/243/347/220/206/345/255/220/344/273/243/347/220/206/350/256/260/345/277/206/346/236/266/346/236/204/350/256/276/350/256/241.md" +0 -0
@@ -0,0 +1,185 @@
1
+ # 不可靠性落地 P0 报告 v1.0
2
+
3
+ > 批次 53 · 理论作为工程规范首轮 P0 修复四项落地
4
+ > 理论判据:`docs/theory/不可靠定理与失效优先框架_v0.3.md` + `docs/不可靠性理论_v0.1.md`
5
+ > 验收真源:`test/chaos_injection/registry.py`(注入套件登记)
6
+ > 报告性质:第二节四项「落点/前后对比/语义变化声明/验证」材料由编排会话给定的各修复员会话实跑记录转录;报告员会话对关键引证做了机械抽查(见 2.5),并**本会话实跑**了注入套件终验与 python 全量套件(见第三、四节)。
7
+
8
+ ---
9
+
10
+ ## 一、总览(四项目标与结论)
11
+
12
+ | # | 目标 | 理论挂点 | 落地面 | 结论 |
13
+ |---|------|---------|--------|------|
14
+ | 1 | 启动对账 reconcile v0——索引/派生态 vs 盘面真源的全量 diff 对账,补两段式写对账(twophase,只清「有意图无结果」账)之外的对账面 | v0.3 **T9 自稳定定理** | `md_cg/reconcile.py`(新增)+ `md_cg/mcp_server.py` 启动序列 + `md_cg/mdcg.py` 前置修复 | ✅ 落地(33 断言新守卫全绿;真 server 实弹收敛成立) |
15
+ | 2 | FI-R03 伪造 result.json `ok=true` 被采信 → **P11 结果完整性锚**落地 | v0.1 P11 完整性锚 / T4 静默改写 | `hive/src/hmac.rs`(新增)+ `hive/src/keyres.rs`(新增)+ scheduler/job/exec 提交面锚判据 | ✅ 落地(**gap→pass**,登记批次 53 修复) |
16
+ | 3 | R05/R06 WAL 验签 **seq 连续性判据** | P0-2(覆盖遗漏型) | `swarm/rust_swarm.py` `verify_wal_signatures` | ✅ 落地(**FI-R05/R06 gap→pass**) |
17
+ | 4 | **幂等键标准化 v0**——hive 提交面 spec canonical json sha256 幂等键 | v0.3 T7 / P0-2 | `hive/src/json.rs` canonical + `hive/src/main.rs` cmd_submit 去重 | ✅ 落地(同 spec 重提返回既有 job_id + `deduplicated=true`) |
18
+
19
+ **总结论**:四项全部落地且各有验证。注入套件终验 **18/18 与登记一致(EXIT=0,pass 11 / gap 7)**,其中 **FI-R03 / FI-R05 / FI-R06 三格 gap→pass**;python 全量套件 **207/207 通过(退出码 0,5 跳过为依赖缺失/平台不符)**;7 格登记 gap(R08/M01–M04/M07)其缺陷真实在案且不属本批修复面,**如实维持 gap 未动**——把任一登记改 pass 即伪造修复,按「禁止伪造」纪律不改登记。
20
+
21
+ ---
22
+
23
+ ## 二、逐项修复
24
+
25
+ ### 2.1 启动对账 reconcile v0(v0.3 T9 自稳定定理落地,落地清单 P0-3)
26
+
27
+ **目标**:索引/派生态 vs 盘面真源的全量 diff 对账,补两段式写对账(twophase,只清「有意图无结果」账)之外的对账面。
28
+
29
+ **落点**:
30
+
31
+ 1. `md_cg/reconcile.py:1-228`(新增模块):`ENV_SWITCH`=:45(`MDCG_RECONCILE`,仅 `"0"` 关闭缺省开)、`TRACE_FILE`=:49(`_reconcile.jsonl` 留痕,仅 diff 非空才写)、`enabled()`=:56、`_disk_hashes()`=:72(content_hash 双形态接受集——add 写路径无尾换行形 / rebuild 路径带尾换形,两 producers 各自稳定,见 mdcg.py:1588 vs mdcg.py:1154 实测分歧)、`_scan_disk()`=:78(os.walk LAYERS 与 `_scan_nodes` 同序,读失败/非 UTF-8 字节/frontmatter 无闭合三类真源损坏只登记不猜测)、`reconcile_state()`=:141(三类 diff:多索引条目→`_unstage` 摘除;缺索引条目→`_node_entry` 重建 `_stage` 补入;哈希/路径漂移→以盘面为真源重建;真源损坏与其条目一律不动,只 stderr 告警+留痕——T9 边界)。
32
+ 2. `md_cg/mdcg.py:1688-1700`(`MdCG.reconcile_state` 委托,twophase 同款延迟导入模式)。
33
+ 3. `md_cg/mdcg.py:1200-1213`(`_scan_nodes` 补捕 `UnicodeDecodeError`——前置修复:非 UTF-8 坏文件此前会炸穿整库装载/重建,init 先于对账执行,不补则损坏库永远跑不到对账)。
34
+ 4. `md_cg/mcp_server.py:3726-3738`(main 启动序列两段式对账块之后接 `cg.reconcile_state()`,try/except 不阻塞启动)。
35
+ 5. `md_cg/test_reconcile_v0.py:1-294`(新守卫 33 断言)。
36
+
37
+ **前后对比**:修复前(按 twophase.py:2-9 与 mdcg.py:17 取证):索引与盘面三类背离全部静默——外部删文件→幽灵条目永久占检索面;非合作写者直写→节点在盘不可见;直改正文→检索/指纹陈旧;均零告警零修复,且一个非 UTF-8 坏文件即炸穿整库装载(smoke 实测 `_load_index`→`_scan_nodes` UnicodeDecodeError 崩溃)。修复后:三类 diff 启动即检出并增量收敛+stderr 告警+`_reconcile.jsonl` 留痕(幂等,二扫全零零输出);真源损坏只告警不改写(损坏文件不建条目、读不出的既有条目不摘除——瞬态读失败不放大成永久损伤,N134 同型教训);损坏在场重开库不再炸。真 server 实弹(tempfile 哑令牌环境):植入 e1 正文篡改后 spawn `python -m md_cg.mcp_server`,stderr 打出「[mdcg-reconcile] 启动对账 v0: …哈希漂移=1(已按盘面增量修复索引面)」,重开索引读到 TAMPERED 新正文=收敛成立。注入套件格状态:a) `run_all.py` 修后全量 18/18 与登记一致、EXIT=0(pass 11 / gap 7);b) 判据 b 不适用(见语义变化声明⑥);c) 既有 pass 用例零回归(R01/R02/R04/R05/R06/R07/R09/M05/M06/M08/M09 全绿——其中正常写入/正常产物/正常验签语义未动);d) `scripts/run_tests.py --jobs 4` 全量 207/207 通过(5 跳过;基线 206+本批新守卫 1 件)。
38
+
39
+ **语义变化声明**:
40
+
41
+ 1. 启动序列新增一次 O(n) 盘读(每节点恰一次顺序读+nodefile.loads 纯字符串切分,无 YAML/检索打分/嵌入,非 rebuild 式全量重扫;修复只对漂移条目定向 upsert,对照 rebuild_index 既有能力控制在增量);干净库零输出零写盘;`MDCG_RECONCILE=0` 一键关闭,缺省开。
42
+ 2. content_hash diff 采用双形态接受集:仓内存 add 路径(mdcg.py:1588,封存原文)与 rebuild 路径(mdcg.py:1154,loads 读回含尾换行)两 producers 指纹形态本就并存(临时库实测 n1 无尾换行两形态不等),diff 两侧都认——否则无尾换行节点每次启动误报漂移;不改变任一 producer 的既有写入语义。
43
+ 3. 启动期修复经 `_unstage`/`_stage` 既有原语落 `_index_log`(tombstone/upsert),与既有写路径同一加锁/落账纪律,未新增写面。
44
+ 4. `_scan_nodes` 补 UnicodeDecodeError 是行为修复:损坏真源从「炸穿整库」变「跳过该文件」(与 reconcile 告警同口径);单节点 get/_read 对损坏文件抛 UnicodeDecodeError 的既有契约未动(请求级,超出本批最小面)。
45
+ 5. 诚实边界:frontmatter 字段值漂移(直改 importance 等)不在 v0 判据面(索引无 fm 指纹,content_hash 刻意不含 frontmatter),该面仍由 rebuild_index 兜底;对账为增益非服务前提,任何异常不阻塞启动。
46
+ 6. 判据 b 如实声明不适用:登记表 9 格 gap 均非「索引 vs 盘面启动对账」型(R03=P11、R05/R06=P0-2、R08=N143、M01=A2 单调锚、M02=N134、M03=N133、M04=N138、M07=N91 同型),且 18 用例无一经过 mcp_server main 启动序列(grep test/chaos_injection 无 mcp_server 引用)——修后复跑 7 格 gap 仍如实观测 gap(其缺陷真实在案且不属本批修复面:读缓存负结果/reinforce 漏标脏/线程锁/TTL 单调锚/stderr 裸写/hive-swarm 面),把任一登记改 pass 即伪造修复,按「禁止伪造」纪律不改登记。R05/R06 的 gap→pass(备注批次 53 修复)由并行 P0-2 修复员已在共享工作树完成,其登记转换与本批机制自洽。
47
+ 7. docs/theory v0.3 矩阵 T9 行「🟡部分(全量对账待建)」的文档结案属文档会话面,本批未动 docs。
48
+ 8. 本批零 Rust 改动,cargo test 不适用(共享树中 hive/swarm Rust 改动属并行修复员,其判据 d 由其自负)。
49
+
50
+ **验证**(修复员会话实跑记录):① `python -X utf8 -m md_cg.test_reconcile_v0` → 33 passed / 0 failed(三类 diff 收敛+损坏只告警+开关+dry-run+损坏在场重开不炸+承接面源断言);② `python -X utf8 test/chaos_injection/run_all.py` → 汇总 18/18「一致」、ALL CONSISTENT、EXIT=0;③ `python -X utf8 scripts/run_tests.py --jobs 4` → SUMMARY 207/207 通过(5 跳过);④ `python -X utf8 -m md_cg.test_twophase`(35/0)+ `-m md_cg.test_verify_dirty_reconcile`(18 PASS)+ `-m md_cg.test_protocol`(41/0)定向回归;⑤ 真 server E2E:tempfile 哑令牌环境 spawn `python -m md_cg.mcp_server`(MDCG_ROOT/TOKEN_FILE 全钉临时目录),植入 e1 篡改后 stderr 实测「[mdcg-reconcile] 启动对账 v0: 幽灵条目=0 缺失条目=0 哈希漂移=1 真源损坏/不可读=0(已按盘面增量修复索引面)」且重开 get(e1)=TAMPERED body,测毕 rmtree;⑥ `python scripts/workspace_index.py --check` → 一致(20 顶层目录);⑦ 临时库双形态指纹 probe:add 无尾换行节点 → add 形 hash≠rebuild 形 hash 实证,diff 双形态接受零误报。全部临时目录/哑令牌,零触真实令牌库/serve/数据目录;未 git commit(编排会话负责)。
51
+
52
+ ### 2.2 FI-R03 伪造 result.json `ok=true` 被采信 → P11 结果完整性锚落地(gap→pass,批次 53)
53
+
54
+ **落点**:
55
+
56
+ - 新增 `hive/src/hmac.rs`(纯 std SHA-256+HMAC,移植自 swarm/rust_runtime/src/hmac.rs 同源;:32 `ANCHOR_DOMAIN`、:142 `result_anchor_hex` 唯一公式实现、:149 `ct_eq` 恒时比较、:172-201 FIPS/RFC 向量+Python 同公式交叉核对断言)。
57
+ - 新增 `hive/src/keyres.rs`(:17 `resolve_key_from_env`:`HIVE_ORCH_TOKEN`→`HIVE_ORCH_TOKEN_FILE`→`HIVE_API_KEY` 既有配置/令牌面链,无公开缺省常量)。
58
+ - `hive/src/lib.rs:20-27` 挂载两模块;`hive/src/job.rs:104` `new_result_nonce`、:136 `init_job_with_anchor`(nonce=Some 时 status 落 result_nonce,其余字段与写序与旧格式逐字段一致)、:3-20 模块头文件协议文档。
59
+ - `hive/src/scheduler.rs:59/101/109` `ServeCfg.result_key`+`with_result_key`(new 恒 None,测试密闭)、:511 `classify_result` 锚门(无 error 先过 verify_result_anchor:Pass→done / MissingAnchor·Unverifiable→needs_review / Mismatch→error)、:564-579 AnchorVerdict+verify_result_anchor 唯一校验实现、:447/:279/:317 classify_exit 与 recover_orphans 透传密钥、:689 deps_gate 把 needs_review 列入失败传播、:11-25 模块头文档。
60
+ - `hive/src/exec.rs:91` spawn_executor 增 anchor 参(env `HIVE_RESULT_ANCHOR` 注入执行器);`hive/src/main.rs:193` cmd_serve 密钥解析+stderr 显式声明(on/off 不静默)、:321-323 cmd_submit nonce+响应 result_anchor=on/off;`hive/src/spec.rs:21/:48` 失败传播文档补 needs_review。
61
+ - `hive/exec.py:136` 与 `hive/exec_cmd.py:45` write_result 回写 env `HIVE_RESULT_ANCHOR`→`result.result_anchor`(env 缺省不写字段);`hive/hive_mcp/mcp_server.py:243-281` `_RESULT_KEY_KEYS`+`_result_anchor_key`(与 keyres.rs 同链,config.local 解析值按 serve_start 合并语义胜出 env)、:301 `_submit` 解析到密钥时 status 追加 result_nonce(orch.py 复用同一 `_submit`);`hive/hive_mcp/smoke_test.py` 假执行器补回写锚(契约同 exec.py)。
62
+ - `hive/tests/judgment_surface.rs:281/:399/:457` 新增三承重锚测试(result_anchor_gate 五分支含反向对照、anchor_needs_review_rerun_escape_hatch 与 M1 逃生门组合、anchor_e2e_done_with_echo_executor 端到端)。
63
+ - `test/chaos_injection/harness.py` hive_submit/hive_spawn_serve 增 env_extra(None=移除键);`test/chaos_injection/test_fi_r03_fake_result_ok.py` 改写为锚拦截 pass 场景(A 无锚伪造→needs_review / B 攻击者错钥重实现公式→error / C 逃生门留痕重投→诚实重跑 done / D 诚实链路零回归对照 / E 无密钥旧格式向后兼容对照+读码断言);`test/chaos_injection/registry.py:22-27` FI-R03 登记 gap→pass(备注批次 53 修复)。
64
+ - 注:工作树中 hive/src/json.rs、main.rs 的 P0-2 幂等键与 md_cg/swarm/R05-R06 用例改动为同批并行修复员落点,与本案在 cmd_submit 处共存(幂等去重先于 nonce 生成,互不干扰),全部验证均在合并树上实跑。
65
+
66
+ **前后对比**:修复前(v1.0 注入实测,EXPECTED_GAP 基线):classify_result 只读盘面 result.json 的 error 字段,无 error 即 done——能写盘面的组件伪造 `{ok:true,content:...}` 产物 0.4s 内被采信 state=done,poll 面展示伪造内容,全程零 error 标注(T4 静默改写成立);verify_runner.py:161-166 passed>0 门只约束验证器自身;rerun_on_recover 逃生门在位但缺省 false。修复后(本批次实测):锚预期任务(status 带 result_nonce)的产物须携带与 `HMAC-SHA256(密钥, "hive-result-anchor-v1|" + sha256hex(spec.json 字节) + "|" + nonce)` 一致的 result_anchor 才采信 done——FI-R03 实测逐格:**A** 伪造 ok=true 无锚→state=needs_review(0.2s 内判定,error 文本「产物完整性锚缺失」,伪造产物留盘可追溯,poll 面如实展示 needs_review+error 零静默);**B** 攻击者以 Python 独立重实现公式但持错钥伪造锚→state=error「完整性锚校验失败:拒绝采信」;**C** rerun_on_recover 逃生门→伪造产物更名 result.json.recovered-* 留痕强制重投,重跑的诚实执行器带锚落地 done;**D** 诚实对照(真实 hive.exe submit 锚预期+exec_cmd.py 回写锚)→done 正常链路零回归;**E** 无密钥提交(显式移除三键)→响应 result_anchor=off、status 无 nonce→同一锚判据 serve 上照常 done(向后兼容)。
67
+
68
+ **语义变化声明**:
69
+
70
+ 1. 状态机新增终态值 **needs_review**——锚缺失或锚不可校验产物的可疑处置态(不自动采信、不销毁证据);deps_gate(scheduler.rs:689)将其与 error/timeout/killed 同列失败传播,下游任务直接 error 不执行(不悬置等待);poll/doctor 按普通状态串透出。
71
+ 2. 仅当 status.json 带 result_nonce(=提交面解析到锚密钥,任务显式声明锚预期)才启用新判据:无 result_anchor→needs_review,锚不匹配(伪锚/挪锚/提交后 spec 被改)→error 终态,通过→done。
72
+ 3. 向后兼容:无 result_nonce 的任务(存量任务池、无密钥提交面、任意宿主手搭现场)维持旧「产物说了算」判据 done/error,逐字段零变更(judgment_surface 既有 recover_by_artifact/rerun_on_recover_escape_hatch 未改动且全绿即证);执行器在 env HIVE_RESULT_ANCHOR 缺省时不写 result_anchor 字段,产物格式向后兼容。
73
+ 4. 密钥只取 hive 既有配置/令牌面 env 链 `HIVE_ORCH_TOKEN`→`HIVE_ORCH_TOKEN_FILE`→`HIVE_API_KEY`(对照 config.local 既有键,serve 经 serve_start.py 注入即生效;Python 提交面另读 config.local.json 且 config 值胜出 env=serve_start 合并语义;Rust CLI 面只读进程 env);不设公开缺省常量密钥(N143 教训:公开缺省=可自签=锚判据失效),无密钥部署锚判据整体不启用、行为与旧版一致,提交响应以 result_anchor=on/off 显式透出降级不静默。
74
+ 5. 锚预期任务落在无密钥 serve 上→needs_review(Unverifiable,fail-closed 不静默放行,error 文本指引以 serve_start.py 重启)。
75
+ 6. 诚实残余面:持钥组件仍可伪造合法锚(密钥保密性是判据边界,与 swarm WAL 同界);同任务旧诚实产物重放不可检(与 rerun_on_recover 组合缓解);verify_runner passed>0 门未动(按 ask 仅为背景,读码断言在 FI-R03 内留档)。
76
+
77
+ **验证**(修复员会话实跑记录):① `cargo test`(cwd=hive/,终树实跑):29+7+6=42 passed / 0 failed——含新增 hmac 向量与 Python 同公式交叉核对、keyres env 链、job::init_job_with_anchor_metadata,及 judgment_surface 新增三测试与既有 recover_by_artifact / rerun_on_recover_escape_hatch 全绿(向后兼容零回归);② `cargo build --release`(供注入套件真实 hive.exe,0 error);③ `python -X utf8 test/chaos_injection/test_fi_r03_fake_result_ok.py` → 15 检查全 OK,CASE_RESULT {verdict:pass, expected:pass, consistent:true},EXIT=0;④ `python -X utf8 test/chaos_injection/run_all.py` → 18/18 全部「一致」ALL CONSISTENT EXIT=0(FI-R03 观测=pass 登记=pass;既有 pass 格零回归;EXPECTED_GAP 格 R08(N143)/M01-M04/M07 基线维持);⑤ `python -X utf8 scripts/run_tests.py --jobs 4` → SUMMARY 207/207 通过,5 跳过 EXIT=0;⑥ `python -X utf8 hive/hive_mcp/smoke_test.py` → 21 pass/0 fail EXIT=0(MCP 提交面 nonce→serve 锚判据→假执行器回写锚端到端)。测毕无 hive.exe 残留进程。
78
+
79
+ ### 2.3 R05/R06 WAL 验签 seq 连续性判据(P0-2 落地,批次 53)
80
+
81
+ **目标**:`swarm/rust_swarm.py` `verify_wal_signatures` 增 seq 连续性判定——以首行 seq 为基准步进,缺失(跳号)/重复/乱序且验签有效的行判 bad 并报 `continuity_breaks` 明细 `{line,expected,actual,kind,row_type}`;快照行与事件行同链(Rust 侧同一 event_seq 计数器,swarm.rs 五处写行全部 event_seq+=1);验签无效的可解析行按占位+1 推进期望位、不以其(可伪造的)seq 重定链位;新增 `skip_continuity=False` 参数缺省严格、可显式放宽。
82
+
83
+ **落点**:`swarm/rust_swarm.py:8-12`(模块头职责注记)· `swarm/rust_swarm.py:102-201`(verify_wal_signatures::104-105 skip_continuity 参数、:157-192 连续性判定块、:200 continuity_breaks 返回键)· `test/chaos_injection/test_fi_r05_wal_drop_line.py`(全文重写为 pass 判据:删除行→break 明细/正常零误伤/空单行兼容/放宽逃生门/读码判据在位)· `test/chaos_injection/test_fi_r06_wal_reorder_dep.py`(swarm 半边重写为乱序可检判据,hive 半边 fail-fast 4 断言保持)· `test/chaos_injection/registry.py:30-39`(FI-R05/FI-R06 gap→pass,备注批次 53 修复落地)· `test/chaos_injection/test_fi_m05_twophase_kill_between.py:57-60`(企划外一行机械修复,见语义变化声明第 5 条)。
84
+
85
+ **前后对比**(对照实验,系统临时目录+哑密钥,测毕清理):【修复前】删除中间行(seq=2)→`{total:2, verified:2, bad:0, all_valid:True}`、行序交换(3,1,2)→同样全绿零信号(批次 52 实测基线)。【修复后实测】删除中间行→bad=1, all_valid=False, breaks=`[{line:2, expected:2, actual:3, kind:跳号缺失, row_type:任务}]`;交换两行→bad=1, all_valid=False, breaks=`[{line:2, expected:4, actual:1, kind:重复或乱序}]`;重复行(1,2,2,3)→bad=1, breaks=`[{line:3, expected:3, actual:2}]`;正常 WAL→`{total:3, verified:3, bad:0, all_valid:True, breaks:[]}` 零误伤;空 WAL/单行 WAL→语义不变;快照行同链连续(1,2,snap3,4)→全绿;快照行后跳号→snap_bad+bad 双 break 精确定位;skip_continuity=True→回旧语义(删行不可检);CLI swarm_cli verify:正常 rc=0/ok=true,删行 rc=1/ok=false 且 stdout 恒单行 JSON 透传 continuity_breaks。【套件格】FI-R05/FI-R06:gap→pass(转绿),FI-R04 及全部既有 pass 格零回归,gap 格(R03 已随锚面转 pass;R08/M01-M04/M07)基线维持。
86
+
87
+ **语义变化声明**:
88
+
89
+ 1. 返回 dict 新增恒在键 `continuity_breaks`——对键集合全等比较的消费者会破;仓内核查无此类消费者(grep 在案),FI-R04/R05 原精确字典比较分支均有 or 回退、实测全过。
90
+ 2. 验签缺省语义收紧:非连续 seq 的验签有效行现判 bad、all_valid=False,CLI verify 对此类 WAL 从 exit 0 转 exit 1(实测在案)——存量合法但非连续历史(手动裁剪等)须调用方显式 `skip_continuity=True` 放宽,缺省严格。
91
+ 3. 空 WAL/单行 WAL/连续 WAL(含快照行交错,因 Rust 快照行与事件行共用 event_seq)语义不变;全部 swarm 常规测试(真实 Rust 产物 WAL 验签:protocol/gossip/health/fault/watermark/inbox/kill/resume)零回归实测。
92
+ 4. 链安全规则:验签无效行的 seq 不可信、不得重定链位(按占位+1),伪造 seq 无法借链洗白。
93
+ 5. 企划外修复声明:test_fi_m05:57 的 `text="utf-8"`→`encoding="utf-8", errors="replace"` 为 md_cg.test_subproc_encoding 检查器明示修法——该格在纯净 HEAD worktree 同样红(批次 52 遗留存量基线红,非本次回归),且原写法在非 UTF-8 locale 下会以本地编码严格解码管道属潜在崩溃面;语义保持,FI-M05 用例复测 pass。
94
+ 6. Rust 零改动(swarm/rust_runtime 未触碰,git status 在案)→ cargo test 不适用;嵌入 Rust 运行时已经由 test_rust_swarm* 全套实跑交叉验证(PASS)。
95
+ 7. 工作树为同批并行修复员共享(md_cg/mcp_server.py、md_cg/mdcg.py、md_cg/reconcile.py、hive/src/hmac.rs 非该修复员所改),全量套件结论以终跑时刻树状态为准。
96
+
97
+ **验证**(修复员会话实跑记录):① `python -X utf8 test/chaos_injection/test_fi_r05_wal_drop_line.py` → 8 检查全 OK,EXIT 0;② `python -X utf8 test/chaos_injection/test_fi_r06_wal_reorder_dep.py` → 7 检查全 OK,EXIT 0;③ `python -X utf8 test/chaos_injection/run_all.py` 跑两次(修复后+终态)→ 均 18/18 与登记一致 EXIT 0;④ 对照实验 9 例(A 正常/B 删行/C 放宽/D 交换/E 重复/F 空/G 单行/H 快照同链/I 快照后跳号)输出逐例在案;⑤ CLI smoke 两态 rc=0/rc=1 在案;⑥ `python -X utf8 -m md_cg.test_subproc_encoding` 修复前 exit 1(纯净 HEAD worktree `git worktree add` 复现同样 exit 1=存量红)、修复后 exit 0;⑦ `python -X utf8 -m hive.test_orch_poll_cache` standalone 两树均 12/12 exit 0(首跑 --jobs 4 下 FAIL 1 系并行抖刺/兄弟修复员在途编辑,终跑未复现);⑧ `python -X utf8 scripts/run_tests.py --jobs 4` 终跑 206/206 通过、5 跳过、EXIT 0(首跑 204/206,两 FAIL 均已定性:m05 存量红已修,poll_cache 并行抖刺 standalone 绿)。
98
+
99
+ ### 2.4 幂等键标准化 v0——hive 提交面(v0.3 T7/P0-2)
100
+
101
+ **目标**:spec canonical json(键序/空白不敏感,json.rs `to_canonical_string` 递归键排序+重复键取末+紧凑分隔)的 sha256(复用同批次 hive/src/hmac.rs::sha256,零 crate 依赖)为 content_hash 幂等键:cmd_submit 在依赖检查后扫描活跃任务(pending/claimed/running)同哈希即返回既有 job_id + `deduplicated=true` 不新建;终态不拦(重跑语义不变);无 content_hash 的旧格式任务不参与去重(向后兼容)。
102
+
103
+ **落点**:`hive/src/json.rs:407-478`(to_canonical_string/write_canonical + canonical_tests 2 测试:键序空白不敏感/重复键取末/数组有序/递归)· `hive/src/main.rs:220-242`(find_active_by_hash 扫描助手)· `hive/src/main.rs:243-320`(cmd_submit 幂等面::299-318 去重命中响应 deduplicated=true,:333-341 init 后 patch_status 落 content_hash + 响应 deduplicated=false/content_hash,:770-820 单测 dedup_scan_active_only/content_hash_canonical_insensitive)· `test/chaos_injection/test_fi_r07_double_serve_claim.py`(次观测改写为守卫①-⑥:同 spec 两次→同 job_id+deduplicated=true/池内恰 1 份/不同 spec→不同 job/置 done 后重提→新建/读码判据在位;注入时序修正为双 serve 先就位后投递)· `test/chaos_injection/registry.py:42-47`(FI-R07 注记:P0-2「提交面无幂等键」次观测结案,批次 53 修复,T2/T7 幂等🟢)。
104
+
105
+ **前后对比**(真实 hive.exe 实测,临时目录哑 spec 测毕清理):【修复前=批次 52 基线】同 spec 重复 submit 两次→两个不同 job_id/两任务目录(提交面无 content-hash 幂等键)。【修复后实测】第 1 次 rc=0 job_id=h1790398346652_39d0 deduplicated=False content_hash=a9315efd43a5…(64hex);第 2 次同 spec rc=0 同 job_id deduplicated=True(池内恰 1 份);不同 spec rc=0 新 job_id deduplicated=False;任务置 done 后重提→新建 deduplicated=False(重跑语义不变)。FI-R07 守卫①-⑥ 全 OK(16 检查全过 EXIT 0)。
106
+
107
+ **语义变化声明**:
108
+
109
+ 1. 响应契约变化(均为增量):hive submit 成功响应新增 `deduplicated`(新建=false/去重命中=true)与 `content_hash`(64hex)两字段——按 job_id/ok 解析的消费者不受影响(FI-R06/R07、mreview pipeline、gen_specs 路径全过实测);去重命中 rc=0 且返回既有 job_id,调用方无需改代码即获得幂等。
110
+ 2. 仅拦截**活跃**任务(pending/claimed/running),终态(done/error/timeout/killed)不拦=重跑语义不变;仅 status.json 带 content_hash 的新格式任务参与去重,存量任务池/旧格式零变更。
111
+ 3. 新任务 status.json 多一个 content_hash 字段(init 后 patch 补写,不动 init_job 单写者写序;补写失败仅损去重能力不损任务本体)。
112
+ 4. v0 边界如实声明:并发双提同 spec 的纳秒级竞窗不设锁(无 submit 原子原语,可能双建——与修复前行为同级,v0 最小面);MCP Python 提交面(hive_mcp/mcp_server.py `_submit` 独立实现)未纳入本面;幂等键依赖同批次并行修复员新增的 hive/src/hmac.rs(sha256 复用其实现,未写第二套)。
113
+ 5. FI-R07 注入时序修正(双 serve 先就位后投递):原「先投递再拉 s2 --force」会让 s2 的启动恢复扫掉 s1 在飞任务(实测踩坑 error='serve 中断:任务执行被重置',该恢复语义在 HEAD 已存在、非本批新增);修后竞争纯粹落在 claim 原子锁,主观测①②③ 判据含义不变。
114
+
115
+ **验证**(修复员会话实跑记录):① `cargo test`(cwd=hive/)→ bin 7 passed + lib 29 passed(含 json::canonical_tests 2 与 tests::dedup_scan_active_only/content_hash_canonical_insensitive)+ 集成 judgment_surface 6 passed,全绿;② `cargo build --release` → Finished release(套件用产物含幂等面);③ `python -X utf8 test/chaos_injection/test_fi_r07_double_serve_claim.py` → 16 检查全 OK,CASE_RESULT verdict=pass consistent=true,EXIT 0;④ `python -X utf8 test/chaos_injection/run_all.py` → 18/18 观测与登记一致,ALL CONSISTENT EXIT 0;⑤ 原始响应对照(真实 hive.exe 临时目录):第 1 次 deduplicated=False / 第 2 次同 job_id deduplicated=True / 不同 spec 新 job deduplicated=False,逐行输出在案;⑥ `python -X utf8 scripts/run_tests.py --jobs 4` → 207/207 通过、5 跳过、FULL_EXIT=0;⑦ `cargo test`(cwd=swarm/rust_runtime)→ 8/8 passed(本修复未触该 crate,照纪律实跑确认)。
116
+
117
+ ### 2.5 报告员引证抽查(本会话实核)
118
+
119
+ 对第二节材料按 path:line 做机械抽查,以下均实核一致:
120
+
121
+ - `md_cg/reconcile.py`:ENV_SWITCH=:45、TRACE_FILE=:49、enabled()=:56、_disk_hashes()=:72、_scan_disk()=:78、reconcile_state()=:141,全文恰 228 行 ✓
122
+ - `md_cg/mdcg.py`:`_scan_nodes` 补捕 UnicodeDecodeError(:1206-1213 注释在案)、`reconcile_state` 委托与文档串、索引条目 `content_hash` 走 nodefile 唯一实现 ✓
123
+ - `md_cg/mcp_server.py:3726-3738`:两段式对账块后接 `cg.reconcile_state()`,try/except 不阻塞启动 ✓
124
+ - `hive/src/hmac.rs`::32 ANCHOR_DOMAIN="hive-result-anchor-v1"、:142 result_anchor_hex、:149 ct_eq ✓;`hive/src/keyres.rs:17` resolve_key_from_env 三键链 ✓;`hive/src/job.rs:104/:136` ✓
125
+ - `hive/src/scheduler.rs`::59 result_key、:511 classify_result、:689 邻域 needs_review 失败传播(error/timeout/killed/needs_review 同列)✓
126
+ - `hive/src/json.rs:407` to_canonical_string ✓;`hive/src/main.rs:220` find_active_by_hash、:249 cmd_submit、:301-318 去重命中响应 ✓;`hive/src/exec.rs:91` spawn_executor anchor 参 ✓;`hive/src/spec.rs` 失败传播文档含 needs_review ✓
127
+ - `hive/exec.py:134-136`、`hive/exec_cmd.py:43-45` env HIVE_RESULT_ANCHOR 回写 ✓;`hive/hive_mcp/mcp_server.py:247/:286` nonce 面实核在 :247 与 :286 ✓
128
+ - `hive/tests/judgment_surface.rs:281/:399/:457` 三承重锚测试 ✓
129
+ - `swarm/rust_swarm.py:104-105` skip_continuity 参数、:159 连续性判定块、:200 continuity_breaks 返回键 ✓
130
+ - `test/chaos_injection/registry.py`:FI-R03 登记 pass(批次 53 修复注记)、FI-R05/FI-R06 登记 pass、FI-R07 注记幂等键结案 ✓;`test_fi_m05_twophase_kill_between.py:57-60` 已为 `encoding="utf-8", errors="replace"` ✓
131
+ - 一处微漂如实注记:材料称 `hive/hive_mcp/smoke_test.py:96` 假执行器补回写锚,实测锚回写在 `smoke_test.py:104-106`(文件演进行号微漂,机制在位)。
132
+
133
+ ---
134
+
135
+ ## 三、注入套件终验
136
+
137
+ **本报告会话实跑** `python -X utf8 test/chaos_injection/run_all.py`,实测汇总逐格:
138
+
139
+ | 用例 | 观测 | 登记 | 一致 | 用例 | 观测 | 登记 | 一致 |
140
+ |------|------|------|------|------|------|------|------|
141
+ | FI-R01 | pass | pass | ✓ | FI-M01 | gap | gap | ✓(A2 单调锚待建) |
142
+ | FI-R02 | pass | pass | ✓ | FI-M02 | gap | gap | ✓(N134) |
143
+ | **FI-R03** | **pass** | **pass** | **✓(gap→pass)** | FI-M03 | gap | gap | ✓(N133) |
144
+ | FI-R04 | pass | pass | ✓ | FI-M04 | gap | gap | ✓(N138) |
145
+ | **FI-R05** | **pass** | **pass** | **✓(gap→pass)** | FI-M05 | pass | pass | ✓ |
146
+ | **FI-R06** | **pass** | **pass** | **✓(gap→pass)** | FI-M06 | pass | pass | ✓ |
147
+ | FI-R07 | pass | pass | ✓ | FI-M07 | gap | gap | ✓(N91 同型) |
148
+ | FI-R08 | gap | gap | ✓(N143) | FI-M08 | pass | pass | ✓ |
149
+ | FI-R09 | pass | pass | ✓ | FI-M09 | pass | pass | ✓ |
150
+
151
+ - 汇总:**18/18 与登记一致,ALL CONSISTENT,EXIT=0**(pass 11 / gap 7)。
152
+ - **FI-R03 / FI-R05 / FI-R06 三格 gap→pass**:观测=pass、登记=pass、备注批次 53 修复。
153
+ - 7 格 gap 为 EXPECTED_GAP 基线维持(确认缺口仍在),其缺陷真实在案且不属本批修复面——按「禁止伪造」纪律不改登记。
154
+
155
+ ## 四、门禁
156
+
157
+ | 门禁 | 状态 | 依据 |
158
+ |------|------|------|
159
+ | cargo(hive/swarm Rust) | **未运行**(本报告流程) | 报告员会话未实跑 cargo;各修复员会话材料的 cargo 实跑记录见第二节对应「验证」栏(hive 42 passed、rust_runtime 8/8 等),如实转录、不计为本报告会话门禁证据 |
160
+ | hive | **通过** | CI 有 `hive-check.yml` 蜂巢门禁;本会话佐证:python 全量套件中 hive.* 全 PASS(23 件可见于输出)、注入套件 R 面 FI-R01–R07/R09 全 pass、`test/chaos_injection/test_fi_r03/r07` 等真实 hive.exe 端到端实测(修复员材料) |
161
+ | swarm | **通过** | 本会话佐证:python 全量套件中 swarm.tests 全 PASS、注入套件 FI-R04/R05/R06(WAL 验签/连续性)全 pass(本会话实跑 run_all.py)、swarm 常规套件零回归(修复员材料) |
162
+ | python 全量 | **通过(退出码 0)** | 本会话实跑 `python -X utf8 scripts/run_tests.py --jobs 4` 两次:SUMMARY **207/207 通过,5 跳过**,第二次精确捕获退出码 **SUITE_RC=0**、FAIL 计数 0 |
163
+ | gate | **gate=1** | 编排面给定取值,照实转录;仓库内(scripts/、test/chaos_injection/、.github/workflows/)未定位到其生成器,含义本会话无法进一步核验——如实声明,不猜测 |
164
+
165
+ ## 五、遗留与后续
166
+
167
+ 1. **注入登记 7 格 gap 真实在案,待后续批次**:FI-R08=N143(公开缺省密钥可伪造合法签名,owner=rust,密钥生命周期决策 deferred);FI-M01=A2 单调锚待建(v0.1§2.9 承重面);FI-M02=N134;FI-M03=N133;FI-M04=N138;FI-M07=N91 同型。均非本批修复面,登记未动。
168
+ 2. **reconcile 全量重放(待建)**:reconcile v0 只做启动期增量对账;「全量重放」演练面(对历史 `_index_log`/盘面做全量重放复核)待建;frontmatter 字段值漂移不在 v0 判据面,仍由 rebuild_index 兜底;真源损坏只告警不改写为 T9 有意边界(结构合法≠内容正确)。
169
+ 3. **幂等键扩展面**:并发双提同 spec 的纳秒级竞窗不设锁(可能双建,v0 最小面,与修复前同级);MCP Python 提交面(hive_mcp/mcp_server.py `_submit`)未纳入幂等面(仅锚 nonce 面);终态任务不拦为重跑语义的有意保留。
170
+ 4. **诚实残余面(如实声明)**:持钥组件仍可伪造合法锚(密钥保密性是判据边界,与 swarm WAL 同界);同任务旧诚实产物重放不可检(与 rerun_on_recover 逃生门组合缓解);verify_runner passed>0 门未动。
171
+ 5. **文档结案面**:docs/theory v0.3 矩阵 T9 行「🟡部分(全量对账待建)」及 T2/T7 幂等行的 🟡→🟢 文档结案属文档会话面,本批未动 docs(registry.py 内注释已先行注记批次 53 修复)。
172
+ 6. **报告会话未复跑项**:cargo test/build(hive 与 swarm/rust_runtime 两 crate)均未在本报告会话实跑,状态以第二节各修复员实跑记录为准。
173
+
174
+ ## 六、纪律合规声明
175
+
176
+ 1. **先读索引后查文件**:已先读 `WORKSPACE_INDEX.md` 按目录职责定位(md_cg/、hive/、swarm/、test/、scripts/、docs/),未做全盘浏览。
177
+ 2. **结论引证**:报告内结论均落 path:line(第二节为修复员材料转录+报告员 2.5 节机械抽查实核);本会话实跑的检查(第三、四节)均给出确切命令与实测输出。
178
+ 3. **实验隔离**:各修复员会话实验全部在系统临时目录/临时库/哑令牌环境完成、测毕清理;本报告会话仅实跑仓内标准守卫(run_all.py、run_tests.py,隔离由套件自身承担),零触真实令牌库/真实 serve/真实数据目录。
179
+ 4. **理论判据与验收真源**:判据用 `docs/theory/不可靠定理与失效优先框架_v0.3.md` + `docs/不可靠性理论_v0.1.md`;验收以 `test/chaos_injection/registry.py` 登记为真源(18/18 观测与登记一致)。
180
+ 5. **输出纪律**:全文中文、无本机绝对路径(均仓内相对路径);**未 git commit**(编排会话负责)。
181
+ 6. **无法满足项如实声明(不绕过不伪造)**:①「gate=1」为编排面给定取值,报告员在仓库内未定位到其生成器,未猜测其含义;②cargo 门禁本会话未运行,未将修复员材料中的 cargo 结果计为本会话门禁通过;③材料中 smoke_test.py:96 一处行号微漂(实测 :104-106)已在 2.5 节如实注记。
182
+
183
+ ---
184
+
185
+ *报告员会话生成 · v1.0 · 批次 53*
@@ -1,174 +1,174 @@
1
- # 实验方案 · 学习闭环 A/B 与外部横评 v1.0
2
-
3
- > 目的:回应 GPT 的两条核心批评——
4
- > ①「Knowledge Evolution ≠ Learning」(缺「记忆→提升」的**因果**证据);
5
- > ②「自定义指标多、缺外部 baseline」(缺**横评**)。
6
- >
7
- > 本文件是**方案设计**,不含实验结论。执行前需先确认算力/标注资源与数据集授权。
8
- > 例外:§E 是**先行冒烟实测记录**(环境可行性小样),不构成 §B 的对外横评数字。
9
- > 日期:2026-09-12
10
-
11
- ---
12
-
13
- ## A. 学习闭环 A/B(证明 Memory → Learning → Improvement)
14
-
15
- ### A.1 设计(因果要求)
16
-
17
- ```text
18
- 同一初始状态
19
- ├── 实验组 A:记忆系统开启(mdcg 正常写读)
20
- └── 对照组 B:记忆系统关闭(等价于纯上下文 / 无长期记忆)
21
- │
22
- 同任务集:训练批(进记忆) + 测试批(不进记忆,只评估)
23
- 分批推进:10 批 × 100 任务 = 1000 任务
24
- │
25
- 每批后评估:测试批上的能力是否提升?
26
- ```
27
-
28
- **关键纪律(防自欺)**:
29
- - **测试批严禁写入记忆**——否则是「记住答案」而非「泛化能力提升」;
30
- - A/B 用**同一模型、同一 token budget、同一采样参数**,仅记忆开关不同;
31
- - 任务与指标需**预先注册**,不允许事后挑指标。
32
-
33
- ### A.2 指标与判据
34
-
35
- | 能力 | 指标 | 基线(批 0) | 判据(1000 任务后) |
36
- |---|---|---|---|
37
- | 检索 | hit@1 | 记录 | 提升,且 A 组显著高于 B 组 |
38
- | 推理 | 正确率 | 记录 | ↑ |
39
- | 冲突处理 | 矛盾识别率 | 记录 | ↑ |
40
- | **自我校准** | **ECE** | 记录 | **↓ 至 ≤ 0.15**(对齐 README §Gate) |
41
- | 新任务泛化 | 测试批正确率 | 记录 | ↑(**核心判据**) |
42
- | 记忆污染 | 错误知识留存率 | 记录 | ↓ |
43
-
44
- **核心判据**:新任务泛化的 **A 组提升量显著 > B 组**(如配对检验 p < 0.05)。
45
- 若 A 组仅在「已见任务」上提升、测试批无提升 → 说明只是记忆回放,**Learning 不成立**(诚实结论)。
46
-
47
- ### A.3 最小可行版本(低成本先跑)
48
-
49
- 若 1000 任务成本过高,可先跑 **10 批 × 20 任务 = 200 任务** 的最小版本,
50
- 仅测「新任务泛化」与「ECE」两项,用于**证伪**(若连方向都没有,则不必做大)。
51
-
52
- ---
53
-
54
- ## B. 外部横评(vs 其它记忆系统)
55
-
56
- ### B.1 Baseline 清单
57
-
58
- ```text
59
- Mem0 Letta(Zep) GraphRAG
60
- 普通 Vector RAG 纯 Context Window(无记忆)
61
- ```
62
-
63
- ### B.2 控制变量
64
-
65
- 同一数据集 + 同一底层模型 + 同一 token budget + 同一上下文预算 + 同一任务集。
66
-
67
- 数据集(复用现有):
68
- - `LoCoMo-zh-500`
69
- - `memory-bench-1000`
70
-
71
- ### B.3 指标矩阵
72
-
73
- | 维度 | 指标 |
74
- |---|---|
75
- | 检索 | Recall / Precision / MRR |
76
- | 答案 | Answer Accuracy |
77
- | 鲁棒 | Contradiction Handling / Temporal Reasoning |
78
- | 长期 | Memory Pollution / Long-term Drift |
79
- | 成本 | Cost / Latency |
80
-
81
- **诚实声明(沿用 README 立场)**:本仓现有自评指标**不构成横评声明**;
82
- 只有上述同条件对照产出的数字,才可作为对外比较依据。
83
-
84
- ---
85
-
86
- ## C. 复用现有 bench(避免重复造轮子)
87
-
88
- | 脚本 | 用途 |
89
- |---|---|
90
- | `md_cg/bench_locomo_zh*.py` | LoCoMo-zh 检索命中 |
91
- | `md_cg/bench_membench.py` | memory-bench |
92
- | `md_cg/bench_longmem.py` | 长期漂移 |
93
- | `md_cg/bench_task_ab*.py` | 任务级 A/B(**优先扩展此脚本承载 §A**) |
94
-
95
- ---
96
-
97
- ## D. 执行顺序建议(按性价比)
98
-
99
- 1. **A.3 最小闭环**(200 任务)——先证伪,成本最低,直接回应批评 ①;
100
- 2. **ECE 长样本验证**——把 `T-TRUST` 从 Lv2 推向 Lv3(缺口 6);
101
- 3. **B 横评**——说服力最高、成本最高,放最后;
102
- 4. 概念精简(缺口 4)——收益难量化,暂缓。
103
-
104
- ---
105
-
106
- ## E. 先行冒烟实测记录(2026-09-12)
107
-
108
- > 性质说明:本节是**环境可行性冒烟**——用 1 组中文对话语料(3 条事实)跑通「写入 → 检索」。
109
- > **样本量不足以支撑任何对外横评数字**(§B 的指标矩阵仍需 LoCoMo-zh-500 等数据集)。
110
- > 它解决的是另一件事:**前提确认**——四家能否在同一 embedding / LLM 条件下真实跑起来,
111
- > 以及各自的「默认配置」里有哪些会直接毁掉中文记忆的坑。
112
- >
113
- > 脚本:`_eval/smoke_{mem0,graphiti,graphrag,letta}.py`(`_eval` 位于 `_competitor/`)。
114
-
115
- ### E.1 环境与口径
116
-
117
- | 项 | 取值 |
118
- |---|---|
119
- | LLM | `deepseek-chat`(DeepSeek 官方端点;Letta 需绕行,见 E.4 ④) |
120
- | Embedding | LM Studio 本地 `text-embedding-bge-m3`(1024 维,`http://127.0.0.1:1234/v1`) |
121
- | 语料 | `_eval/corpus.py` 的 `DIALOG`(6 轮)/ `QUERIES`(fact / preference / relation 各 1 条) |
122
- | 命中口径 | 返回文本**字面**含期望中文关键词(`corpus.judge`);另人工复核**语义**正确性 |
123
- | 版本 | mem0 2.0.20 / Graphiti 0.30.2 / GraphRAG(monorepo, uv workspace)/ Letta 0.16.8 |
124
- | 基础设施 | Neo4j 5(Graphiti)、PostgreSQL 16 + pgvector(Letta) |
125
-
126
- ### E.2 结果
127
-
128
- | 系统 | 写入 | 抽取产物 | 字面命中 | 语义正确 | 检索耗时 |
129
- |---|---|---|---|---|---|
130
- | mem0(默认) | 2.71s | 3 条,**全英文改写** | **1/3** | 3/3 | 0.03s |
131
- | mem0(+中文锁定) | 2.51s | 3 条,全中文 | **3/3** | 3/3 | 0.03s |
132
- | Graphiti | 4.09 / 4.52s | 4 实体,**2~3 条事实边** | **2/3 ~ 3/3** | 3/3 | 0.03–0.07s |
133
- | GraphRAG · local | 索引 17.4s | 4 实体 / 3 关系 / 1 社区报告 | **3/3** | 3/3 | 1.16–2.16s |
134
- | GraphRAG · global | — | 同上(仅用社区报告) | **2/3** | 2/3 | 1.11–2.83s |
135
- | Letta | 3 轮对话 | human 块 3 条事实 | **3/3** | 3/3 | 0.06–0.11s |
136
-
137
- ### E.3 四条与选型直接相关的失败模式(本节主要产出)
138
-
139
- 1. **mem0 默认把中文事实翻译成英文** → 抽取产物为 `Zhang Wei` / `seafood` / `Xinggui`,
140
- 中文关键词检索全部失效(字面 1/3)。语义仍正确,故**不是检索坏了,是保真坏了**;
141
- 注入 `custom_instructions` 锁定中文后 3/3。→ 横评若不做语言控制,mem0 会被系统性低估。
142
- 2. **Graphiti 对「偏好 / 过敏」类事实的抽取不稳定,且会失真**。两次复跑:
143
- 第一次「海鲜」只作为**实体**存在、无事实边(2/3);第二次抽出边,但 fact 为
144
- 「星轨项目与海鲜无直接关联,但用户提及对海鲜过敏」——**命中却语义扭曲**。
145
- → 比 miss 更危险;横评必须跑多次取分布,并人工审 fact 而非只看命中率。
146
- 3. **GraphRAG global 丢偏好**:社区报告只覆盖项目 / 会议类信息,`global` 因此答不出过敏问题;
147
- `local` 靠原始 text_unit 兜住。→ 两档检索能力不等价,横评需分档报告。
148
- 4. **Letta 的记忆落在 core memory block**,archival(passages)为空;core 读取极快(0.06s)
149
- 但有容量上限。→ 与「向量库检索」不是同一机制,不宜只按延迟同台比较。
150
-
151
- ### E.4 复现所需条件(踩坑结论,均为反证确认)
152
-
153
- 1. **GraphRAG 社区报告**:DeepSeek 拒绝 `response_format.type=json_schema`(400
154
- `This response_format type is unavailable now`),而 `community_reports_extractor.py`
155
- 原用 pydantic 模型 → 索引在 `create_community_reports` 崩溃(下游显现为 `KeyError: 'community'`)。
156
- 已改为 `response_format_json_object=True` + 本地结构化解析。
157
- 2. **Letta 服务端硬依赖 Postgres + pgvector**:`letta/server/db.py` 模块级 engine 取
158
- `settings.letta_pg_uri`(**带默认值**),故 `database_engine=SQLITE` 也不能启动 REST 服务端;
159
- 需 `alembic upgrade head` 先建表,且容器内要有 `vector` 扩展(缺 `pg8000` 同步驱动也会失败)。
160
- 3. **Letta agent 必须显式挂载 `memory_blocks`**:0.16.8 不再默认附带 persona / human,
161
- 缺省时 `memory_insert` 报 `Block field human does not exist (available sections = )`,
162
- agent 沦为「无记忆体」(`blocks_agents` 与 `archival_passages` 均为 0)。
163
- 4. **Letta LLM 需显式 `llm_config`**:DeepSeek `/v1/models` 现仅返回 `deepseek-flash` /
164
- `deepseek-v4-pro`,句柄式 `deepseek/deepseek-chat` 解析失败(`available_handles=[]`);
165
- 显式 `llm_config` 可绕过 `provider_models` 句柄表直连。
166
- 5. **mem0 两组不可并发**:`~/.mem0/migrations_qdrant` 是固定路径的本地 qdrant,
167
- 并发即加锁冲突(`Storage folder ... already accessed by another instance`)→ 双组须串行。
168
-
169
- ### E.5 与 §B 的衔接
170
-
171
- 本节把 §B「控制变量」清单补成可执行版:除模型 / 预算 / 任务集外,还须**控制并报告**
172
- (a)记忆写入语言是否被改写;(b)抽取运行次数(取分布而非单次);
173
- (c)GraphRAG 的 local / global 分档;(d)各系统「记忆」的载体类型
174
- (core block / 图谱边 / 向量库)——否则数字不可比较。
1
+ # 实验方案 · 学习闭环 A/B 与外部横评 v1.0
2
+
3
+ > 目的:回应 GPT 的两条核心批评——
4
+ > ①「Knowledge Evolution ≠ Learning」(缺「记忆→提升」的**因果**证据);
5
+ > ②「自定义指标多、缺外部 baseline」(缺**横评**)。
6
+ >
7
+ > 本文件是**方案设计**,不含实验结论。执行前需先确认算力/标注资源与数据集授权。
8
+ > 例外:§E 是**先行冒烟实测记录**(环境可行性小样),不构成 §B 的对外横评数字。
9
+ > 日期:2026-09-12
10
+
11
+ ---
12
+
13
+ ## A. 学习闭环 A/B(证明 Memory → Learning → Improvement)
14
+
15
+ ### A.1 设计(因果要求)
16
+
17
+ ```text
18
+ 同一初始状态
19
+ ├── 实验组 A:记忆系统开启(mdcg 正常写读)
20
+ └── 对照组 B:记忆系统关闭(等价于纯上下文 / 无长期记忆)
21
+ │
22
+ 同任务集:训练批(进记忆) + 测试批(不进记忆,只评估)
23
+ 分批推进:10 批 × 100 任务 = 1000 任务
24
+ │
25
+ 每批后评估:测试批上的能力是否提升?
26
+ ```
27
+
28
+ **关键纪律(防自欺)**:
29
+ - **测试批严禁写入记忆**——否则是「记住答案」而非「泛化能力提升」;
30
+ - A/B 用**同一模型、同一 token budget、同一采样参数**,仅记忆开关不同;
31
+ - 任务与指标需**预先注册**,不允许事后挑指标。
32
+
33
+ ### A.2 指标与判据
34
+
35
+ | 能力 | 指标 | 基线(批 0) | 判据(1000 任务后) |
36
+ |---|---|---|---|
37
+ | 检索 | hit@1 | 记录 | 提升,且 A 组显著高于 B 组 |
38
+ | 推理 | 正确率 | 记录 | ↑ |
39
+ | 冲突处理 | 矛盾识别率 | 记录 | ↑ |
40
+ | **自我校准** | **ECE** | 记录 | **↓ 至 ≤ 0.15**(对齐 README §Gate) |
41
+ | 新任务泛化 | 测试批正确率 | 记录 | ↑(**核心判据**) |
42
+ | 记忆污染 | 错误知识留存率 | 记录 | ↓ |
43
+
44
+ **核心判据**:新任务泛化的 **A 组提升量显著 > B 组**(如配对检验 p < 0.05)。
45
+ 若 A 组仅在「已见任务」上提升、测试批无提升 → 说明只是记忆回放,**Learning 不成立**(诚实结论)。
46
+
47
+ ### A.3 最小可行版本(低成本先跑)
48
+
49
+ 若 1000 任务成本过高,可先跑 **10 批 × 20 任务 = 200 任务** 的最小版本,
50
+ 仅测「新任务泛化」与「ECE」两项,用于**证伪**(若连方向都没有,则不必做大)。
51
+
52
+ ---
53
+
54
+ ## B. 外部横评(vs 其它记忆系统)
55
+
56
+ ### B.1 Baseline 清单
57
+
58
+ ```text
59
+ Mem0 Letta(Zep) GraphRAG
60
+ 普通 Vector RAG 纯 Context Window(无记忆)
61
+ ```
62
+
63
+ ### B.2 控制变量
64
+
65
+ 同一数据集 + 同一底层模型 + 同一 token budget + 同一上下文预算 + 同一任务集。
66
+
67
+ 数据集(复用现有):
68
+ - `LoCoMo-zh-500`
69
+ - `memory-bench-1000`
70
+
71
+ ### B.3 指标矩阵
72
+
73
+ | 维度 | 指标 |
74
+ |---|---|
75
+ | 检索 | Recall / Precision / MRR |
76
+ | 答案 | Answer Accuracy |
77
+ | 鲁棒 | Contradiction Handling / Temporal Reasoning |
78
+ | 长期 | Memory Pollution / Long-term Drift |
79
+ | 成本 | Cost / Latency |
80
+
81
+ **诚实声明(沿用 README 立场)**:本仓现有自评指标**不构成横评声明**;
82
+ 只有上述同条件对照产出的数字,才可作为对外比较依据。
83
+
84
+ ---
85
+
86
+ ## C. 复用现有 bench(避免重复造轮子)
87
+
88
+ | 脚本 | 用途 |
89
+ |---|---|
90
+ | `md_cg/bench_locomo_zh*.py` | LoCoMo-zh 检索命中 |
91
+ | `md_cg/bench_membench.py` | memory-bench |
92
+ | `md_cg/bench_longmem.py` | 长期漂移 |
93
+ | `md_cg/bench_task_ab*.py` | 任务级 A/B(**优先扩展此脚本承载 §A**) |
94
+
95
+ ---
96
+
97
+ ## D. 执行顺序建议(按性价比)
98
+
99
+ 1. **A.3 最小闭环**(200 任务)——先证伪,成本最低,直接回应批评 ①;
100
+ 2. **ECE 长样本验证**——把 `T-TRUST` 从 Lv2 推向 Lv3(缺口 6);
101
+ 3. **B 横评**——说服力最高、成本最高,放最后;
102
+ 4. 概念精简(缺口 4)——收益难量化,暂缓。
103
+
104
+ ---
105
+
106
+ ## E. 先行冒烟实测记录(2026-09-12)
107
+
108
+ > 性质说明:本节是**环境可行性冒烟**——用 1 组中文对话语料(3 条事实)跑通「写入 → 检索」。
109
+ > **样本量不足以支撑任何对外横评数字**(§B 的指标矩阵仍需 LoCoMo-zh-500 等数据集)。
110
+ > 它解决的是另一件事:**前提确认**——四家能否在同一 embedding / LLM 条件下真实跑起来,
111
+ > 以及各自的「默认配置」里有哪些会直接毁掉中文记忆的坑。
112
+ >
113
+ > 脚本:`_eval/smoke_{mem0,graphiti,graphrag,letta}.py`(`_eval` 位于 `_competitor/`)。
114
+
115
+ ### E.1 环境与口径
116
+
117
+ | 项 | 取值 |
118
+ |---|---|
119
+ | LLM | `deepseek-chat`(DeepSeek 官方端点;Letta 需绕行,见 E.4 ④) |
120
+ | Embedding | LM Studio 本地 `text-embedding-bge-m3`(1024 维,`http://127.0.0.1:1234/v1`) |
121
+ | 语料 | `_eval/corpus.py` 的 `DIALOG`(6 轮)/ `QUERIES`(fact / preference / relation 各 1 条) |
122
+ | 命中口径 | 返回文本**字面**含期望中文关键词(`corpus.judge`);另人工复核**语义**正确性 |
123
+ | 版本 | mem0 2.0.20 / Graphiti 0.30.2 / GraphRAG(monorepo, uv workspace)/ Letta 0.16.8 |
124
+ | 基础设施 | Neo4j 5(Graphiti)、PostgreSQL 16 + pgvector(Letta) |
125
+
126
+ ### E.2 结果
127
+
128
+ | 系统 | 写入 | 抽取产物 | 字面命中 | 语义正确 | 检索耗时 |
129
+ |---|---|---|---|---|---|
130
+ | mem0(默认) | 2.71s | 3 条,**全英文改写** | **1/3** | 3/3 | 0.03s |
131
+ | mem0(+中文锁定) | 2.51s | 3 条,全中文 | **3/3** | 3/3 | 0.03s |
132
+ | Graphiti | 4.09 / 4.52s | 4 实体,**2~3 条事实边** | **2/3 ~ 3/3** | 3/3 | 0.03–0.07s |
133
+ | GraphRAG · local | 索引 17.4s | 4 实体 / 3 关系 / 1 社区报告 | **3/3** | 3/3 | 1.16–2.16s |
134
+ | GraphRAG · global | — | 同上(仅用社区报告) | **2/3** | 2/3 | 1.11–2.83s |
135
+ | Letta | 3 轮对话 | human 块 3 条事实 | **3/3** | 3/3 | 0.06–0.11s |
136
+
137
+ ### E.3 四条与选型直接相关的失败模式(本节主要产出)
138
+
139
+ 1. **mem0 默认把中文事实翻译成英文** → 抽取产物为 `Zhang Wei` / `seafood` / `Xinggui`,
140
+ 中文关键词检索全部失效(字面 1/3)。语义仍正确,故**不是检索坏了,是保真坏了**;
141
+ 注入 `custom_instructions` 锁定中文后 3/3。→ 横评若不做语言控制,mem0 会被系统性低估。
142
+ 2. **Graphiti 对「偏好 / 过敏」类事实的抽取不稳定,且会失真**。两次复跑:
143
+ 第一次「海鲜」只作为**实体**存在、无事实边(2/3);第二次抽出边,但 fact 为
144
+ 「星轨项目与海鲜无直接关联,但用户提及对海鲜过敏」——**命中却语义扭曲**。
145
+ → 比 miss 更危险;横评必须跑多次取分布,并人工审 fact 而非只看命中率。
146
+ 3. **GraphRAG global 丢偏好**:社区报告只覆盖项目 / 会议类信息,`global` 因此答不出过敏问题;
147
+ `local` 靠原始 text_unit 兜住。→ 两档检索能力不等价,横评需分档报告。
148
+ 4. **Letta 的记忆落在 core memory block**,archival(passages)为空;core 读取极快(0.06s)
149
+ 但有容量上限。→ 与「向量库检索」不是同一机制,不宜只按延迟同台比较。
150
+
151
+ ### E.4 复现所需条件(踩坑结论,均为反证确认)
152
+
153
+ 1. **GraphRAG 社区报告**:DeepSeek 拒绝 `response_format.type=json_schema`(400
154
+ `This response_format type is unavailable now`),而 `community_reports_extractor.py`
155
+ 原用 pydantic 模型 → 索引在 `create_community_reports` 崩溃(下游显现为 `KeyError: 'community'`)。
156
+ 已改为 `response_format_json_object=True` + 本地结构化解析。
157
+ 2. **Letta 服务端硬依赖 Postgres + pgvector**:`letta/server/db.py` 模块级 engine 取
158
+ `settings.letta_pg_uri`(**带默认值**),故 `database_engine=SQLITE` 也不能启动 REST 服务端;
159
+ 需 `alembic upgrade head` 先建表,且容器内要有 `vector` 扩展(缺 `pg8000` 同步驱动也会失败)。
160
+ 3. **Letta agent 必须显式挂载 `memory_blocks`**:0.16.8 不再默认附带 persona / human,
161
+ 缺省时 `memory_insert` 报 `Block field human does not exist (available sections = )`,
162
+ agent 沦为「无记忆体」(`blocks_agents` 与 `archival_passages` 均为 0)。
163
+ 4. **Letta LLM 需显式 `llm_config`**:DeepSeek `/v1/models` 现仅返回 `deepseek-flash` /
164
+ `deepseek-v4-pro`,句柄式 `deepseek/deepseek-chat` 解析失败(`available_handles=[]`);
165
+ 显式 `llm_config` 可绕过 `provider_models` 句柄表直连。
166
+ 5. **mem0 两组不可并发**:`~/.mem0/migrations_qdrant` 是固定路径的本地 qdrant,
167
+ 并发即加锁冲突(`Storage folder ... already accessed by another instance`)→ 双组须串行。
168
+
169
+ ### E.5 与 §B 的衔接
170
+
171
+ 本节把 §B「控制变量」清单补成可执行版:除模型 / 预算 / 任务集外,还须**控制并报告**
172
+ (a)记忆写入语言是否被改写;(b)抽取运行次数(取分布而非单次);
173
+ (c)GraphRAG 的 local / global 分档;(d)各系统「记忆」的载体类型
174
+ (core block / 图谱边 / 向量库)——否则数字不可比较。