@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,168 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """检索读缓存默认开启守卫(issue #31 P2 后续:生产入口 O(n) 全池扫描修复)。
4
+
5
+ 背景(缺陷报告实测):生产检索入口(mcp_server mdcg_search → MdCGSecure.
6
+ (MdCGOS).search → _read_many,mdcos.py:841)默认态每查询把全池节点文件
7
+ 逐个 open+2×realpath+frontmatter 解析——3300 节点池实测中位 ~602ms/查询、
8
+ 万级外推 ~2s+,线性 O(n)。读缓存(readcache.install)早已存在但默认关
9
+ (零变更纪律),生产恒不装配——「开关已存在,只差默认值」。
10
+
11
+ 本守卫断言(调用计数/复杂度形态,非时间阈值):
12
+ D1 默认装配:env 未设 MDCG_READ_CACHE → 构造即装(hasattr _read_cache);
13
+ D2 二次检索零重解析:默认态下第二次 search 期间 nodefile.loads 调用数为 0
14
+ (旧默认:=候选池节点数,每查询全量重读 → 本断言红);
15
+ D3 装载恰一次:同实例 3 次检索累计 loads ≤ 池节点数(复杂度 O(装载1次),
16
+ 不是 O(查询数×池));
17
+ D4 opt-out 退出阀:MDCG_READ_CACHE=0 → 无 _read_cache 属性、检索照常;
18
+ D5 默认态写后不陈旧(哨兵失效仍生效):写新节点 → 检索命中新内容;
19
+ D6 结果一致:默认开与显式关(=0)同库同 query 结果 id 序一致(缓存只改
20
+ 速度不改结果)。
21
+ """
22
+ import os
23
+ import shutil
24
+ import sys
25
+ import tempfile
26
+
27
+ sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
28
+
29
+ from md_cg import nodefile # noqa: E402
30
+ from md_cg.mdcos import MdCGSecure # noqa: E402
31
+ from md_cg.security import Principal # noqa: E402
32
+
33
+ PASS = 0
34
+ FAIL = 0
35
+ FAILS = []
36
+
37
+
38
+ def check(name, cond, detail=""):
39
+ global PASS, FAIL
40
+ if cond:
41
+ PASS += 1
42
+ print(f" OK {name}")
43
+ else:
44
+ FAIL += 1
45
+ FAILS.append(name)
46
+ print(f" FAIL {name} {detail}")
47
+
48
+
49
+ def build_lib(root, n=12):
50
+ cg = MdCGSecure(root, principal=Principal(
51
+ actor="rd", clearance="secret", can_write=True,
52
+ role="designer", auth_mode="test"))
53
+ for i in range(n):
54
+ cg.add("mem_%03d" % i,
55
+ "# 功能名:默认缓存样本 %d\n# 正文:蜂群调度 节点 %d" % (i, i),
56
+ layer="knowledge")
57
+ cg.flush()
58
+ return cg
59
+
60
+
61
+ def count_loads(fn):
62
+ """打桩 nodefile.loads 计数(节点文件解析的唯一入口,_read 内调用)。"""
63
+ n = 0
64
+ real = nodefile.loads
65
+
66
+ def _spy(*a, **kw):
67
+ nonlocal n
68
+ n += 1
69
+ return real(*a, **kw)
70
+
71
+ nodefile.loads = _spy
72
+ try:
73
+ return fn(), n
74
+ finally:
75
+ nodefile.loads = real
76
+
77
+
78
+ def main():
79
+ root = tempfile.mkdtemp(prefix="mdcg_readcache_def_")
80
+ try:
81
+ # D1 默认装配(env 未设 → 默认开)
82
+ print("== D1 默认装配 ==")
83
+ os.environ.pop("MDCG_READ_CACHE", None)
84
+ cg = build_lib(root)
85
+ check("D1a env 未设时构造即装读缓存(hasattr _read_cache)",
86
+ hasattr(cg, "_read_cache"))
87
+ pool_n = len(cg.index["nodes"])
88
+ check("D1b 库就绪(12 节点)", pool_n == 12, f"nodes={pool_n}")
89
+
90
+ # D2/D3 装载复杂度(计数断言,能红 O(查询×池) 的旧默认态)
91
+ print("== D2/D3 装载恰一次 / 二次检索零重解析 ==")
92
+ total = 0
93
+ _, n1 = count_loads(lambda: cg.search("蜂群调度"))
94
+ total += n1
95
+ check("D3a 首次检索装载 ≤ 池节点数", n1 <= pool_n,
96
+ f"first={n1} pool={pool_n}")
97
+ _, n2 = count_loads(lambda: cg.search("蜂群调度"))
98
+ total += n2
99
+ check("D2a 二次检索零重解析(loads==0)", n2 == 0, f"second={n2}")
100
+ _, n3 = count_loads(lambda: cg.search("样本 节点"))
101
+ total += n3
102
+ check("D3b 3 次检索累计装载 ≤ 池节点数(O(装载1次),旧默认为 3×池)",
103
+ total <= pool_n, f"total={total} pool={pool_n}")
104
+
105
+ # D5 默认态写后不陈旧(哨兵失效在默认开下仍生效)
106
+ print("== D5 写后失效 ==")
107
+ cg.add("mem_new", "# 功能名:写入后的新内容BBB\n# 正文:更新后内容BBB 独有标记",
108
+ layer="knowledge")
109
+ cg.flush()
110
+ r5, _ = cg.search("更新后内容BBB")
111
+ check("D5a 写入后新内容立即可检索(不陈旧)",
112
+ any(x[0].get("id") == "mem_new" for x in r5),
113
+ f"ids={[x[0].get('id') for x in r5][:5]}")
114
+
115
+ # D6 结果一致(默认开 vs 显式关):同库同 query 的 id 序一致
116
+ print("== D6 开/关结果一致 ==")
117
+ r_on, _ = cg.search("蜂群调度")
118
+
119
+ os.environ["MDCG_READ_CACHE"] = "0"
120
+ try:
121
+ # 关态独立实例(同库——节点已在盘上,构造扫描即装载索引)
122
+ cg0 = MdCGSecure(root, principal=Principal(
123
+ actor="rd", clearance="secret", can_write=True,
124
+ role="designer", auth_mode="test"))
125
+ r_off, _ = cg0.search("蜂群调度")
126
+ ids_on = [x[0].get("id") for x in r_on]
127
+ ids_off = [x[0].get("id") for x in r_off]
128
+ check("D6a 开/关同库同 query 结果 id 序一致",
129
+ ids_on == ids_off,
130
+ f"on={ids_on[:5]} off={ids_off[:5]}")
131
+ check("D6b 关态退出阀生效(无 _read_cache 属性)",
132
+ not hasattr(cg0, "_read_cache"))
133
+ finally:
134
+ os.environ.pop("MDCG_READ_CACHE", None)
135
+
136
+ # D4 opt-out 退出阀(独立段,防顺序依赖)
137
+ print("== D4 opt-out 退出阀 ==")
138
+ os.environ["MDCG_READ_CACHE"] = "0"
139
+ try:
140
+ root4 = os.path.join(root, "optout")
141
+ os.makedirs(root4, exist_ok=True)
142
+ cg4 = MdCGSecure(root4, principal=Principal(
143
+ actor="rd", clearance="secret", can_write=True,
144
+ role="designer", auth_mode="test"))
145
+ cg4.add("m1", "# 功能名:a\n# 正文:蜂群调度 内容", layer="knowledge")
146
+ cg4.flush()
147
+ check("D4a MDCG_READ_CACHE=0 → 未装缓存(零变更退出阀)",
148
+ not hasattr(cg4, "_read_cache"))
149
+ cg4.search("蜂群调度") # 预热(无缓存,恒读盘)
150
+ _, n4 = count_loads(lambda: cg4.search("蜂群调度"))
151
+ check("D4b 关态二次检索仍逐节点重解析(loads>0,证明退出阀真关)",
152
+ n4 > 0, f"loads={n4}")
153
+ finally:
154
+ os.environ.pop("MDCG_READ_CACHE", None)
155
+ finally:
156
+ os.environ.pop("MDCG_READ_CACHE", None)
157
+ shutil.rmtree(root, ignore_errors=True)
158
+
159
+ print("\n" + "=" * 60)
160
+ print(f"结果:PASS {PASS} / FAIL {FAIL}")
161
+ if FAILS:
162
+ for f in FAILS:
163
+ print(f" - {f}")
164
+ return 0 if FAIL == 0 else 1
165
+
166
+
167
+ if __name__ == "__main__":
168
+ sys.exit(main())
@@ -0,0 +1,270 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """读缓存脏集精确失效守卫(缺陷迭代第 14 轮,high:写读交替整池重装)。
4
+
5
+ 缺陷形态(缺陷报告实测,10k 临时库串行 3rep 中位):
6
+ readcache._cached 的代际哨兵取**全局单调** write_gen(整池共用一个值),
7
+ _DirtyDict 每次变更 +1——任意一次单节点写使**全部**缓存条目同时 miss,
8
+ 下一条查询全池重装(open+parse 全部 N 个节点):稳态 41.3ms/loads=0 →
9
+ 每 rep add 1 节点后同查询 1732.4ms/loads=10001(41.9× 退化),10k/20k/30k
10
+ 写后首查 1732/3515/5230ms 线性于 N。生产暴露面:mcp_server 读路径
11
+ (op=read→search/recall)与写路径(op=write→writepipe._executor→cg.add,
12
+ 链尾 _commit_visibility→flush)同一常驻实例——写读交替负载 O(每写×全池)。
13
+
14
+ 修复口径:_DirtyDict 簿记**脏 path 代际**(path_gen[path]=标脏时 write_gen),
15
+ 读缓存按「该 path 最近标脏代际 ≤ 缓存代际」判新鲜——单节点写只失效该节点;
16
+ tombstone(_dirty[nid]=None,无 path 可辨)/其余变更形态走 broad_gen 保守
17
+ 整池失效(与旧整代际口径等价的安全兜底);clear()(flush/rebuild)只推进
18
+ write_gen 不再整池失效——flush 只落索引派生物(分片日志),节点文件的内容
19
+ 变更在各写路径 `_dirty[nid]=entry`(带 path)时已精确失效;且生产写路径
20
+ 每次写后 flush(writepipe._commit_visibility),clear 若整池失效会让精确
21
+ 失效在生产写读交替负载下恒不生效。
22
+
23
+ 本守卫九项(调用计数/复杂度断言形态,非时间阈值):
24
+ G1 写读交替不整池重装:热缓存后 add 1 节点 → 同查询 loads ≤ 2
25
+ (旧整代际实现 ≈ 池+1 全量 → 红);
26
+ G2 生产写提交边界(add+flush)后同查询 loads ≤ 2(旧实现 flush 的
27
+ clear() 再叠一次整池 miss → 红);
28
+ G3 写后不陈旧(正确性保持,P3/V5 同口径):覆写既有节点 → 检索命中
29
+ 新内容、_read 缓存视图见新值;
30
+ G4 写别的节点不误伤:add B 后 A 的缓存条目 identity 不变(不重读);
31
+ G5 删除保守整池失效:_unstage(tombstone)后同查询 loads ≥ 剩余池规模
32
+ (无 path 可辨 → broad 兜底,与旧整代词语义等价,不陈旧);
33
+ G6 _DirtyDict 簿记直断:带 path 标脏 → path_gen 推进且 broad_gen 不动;
34
+ tombstone → broad_gen 推进;flush 形态 clear() 不动 path_gen/broad_gen、
35
+ clear(broad=True)(rebuild 收尾)推进 broad_gen;write_gen 单调不回退
36
+ (P7b 口径保留);
37
+ G7 派生物缓存(_doc_norm_bigrams)同口径精确失效:add 1 节点后旧条目
38
+ identity 不变(不重算);
39
+ G8 「直写文件 + rebuild_index 收尾」写方(ccgc/crosscheck/backfill 族)
40
+ 的缓存可见性:rebuild 的 clear(broad=True) 整池兜底——缓存视图见
41
+ 新内容且整池重装(回归面:全量套件 test_ccgc V4c/V5d 曾因 rebuild
42
+ 不失效而陈旧红)。
43
+
44
+ 运行:python -m md_cg.test_readcache_precise_inval
45
+ """
46
+ import os
47
+ import shutil
48
+ import sys
49
+ import tempfile
50
+
51
+ sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
52
+
53
+ from md_cg import nodefile # noqa: E402
54
+ from md_cg.mdcos import MdCGOS # noqa: E402
55
+
56
+ PASS = 0
57
+ FAIL = 0
58
+ FAILS = []
59
+
60
+ N = 40
61
+ QUERY = "蜂群调度"
62
+
63
+
64
+ def check(name, cond, detail=""):
65
+ global PASS, FAIL
66
+ if cond:
67
+ PASS += 1
68
+ print(f" OK {name}")
69
+ else:
70
+ FAIL += 1
71
+ FAILS.append(name)
72
+ print(f" FAIL {name} {detail}")
73
+
74
+
75
+ def build_lib(root):
76
+ cg = MdCGOS(root)
77
+ for i in range(N):
78
+ cg.add("mem_%03d" % i,
79
+ "# 功能名:精确失效样本 %d\n# 正文:%s 节点 %d" % (i, QUERY, i),
80
+ layer="knowledge")
81
+ cg.flush()
82
+ return cg
83
+
84
+
85
+ def count_loads(fn):
86
+ """打桩 nodefile.loads 计数(节点文件解析唯一入口,_read 内调用)。"""
87
+ n = 0
88
+ real = nodefile.loads
89
+
90
+ def _spy(*a, **kw):
91
+ nonlocal n
92
+ n += 1
93
+ return real(*a, **kw)
94
+
95
+ nodefile.loads = _spy
96
+ try:
97
+ return fn(), n
98
+ finally:
99
+ nodefile.loads = real
100
+
101
+
102
+ def main():
103
+ root = tempfile.mkdtemp(prefix="mdcg_rc_precise_")
104
+ try:
105
+ os.environ.pop("MDCG_READ_CACHE", None) # 默认开(生产默认态)
106
+ cg = build_lib(root)
107
+ check("G0a 库就绪且读缓存默认装配",
108
+ len(cg.index["nodes"]) == N and hasattr(cg, "_read_cache"),
109
+ f"nodes={len(cg.index['nodes'])}")
110
+
111
+ # 预热:首查装缓存,二次查询零重解析(稳态前提)
112
+ cg.search(QUERY)
113
+ _, n_warm2 = count_loads(lambda: cg.search(QUERY))
114
+ check("G0b 稳态二次查询零重解析(loads==0)", n_warm2 == 0,
115
+ f"loads={n_warm2}")
116
+
117
+ # G1 写读交替不整池重装:add 1 节点 → 同查询只解析新节点
118
+ print("== G1 写读交替精确失效 ==")
119
+ cg.add("g1_new", "# 功能名:新增节点\n# 正文:%s 新增内容G1" % QUERY,
120
+ layer="knowledge")
121
+ r1, n1 = count_loads(lambda: cg.search(QUERY)[0])
122
+ check("G1a add 1 节点后同查询 loads ≤ 2(旧整代际 ≈ 池+1 全量)",
123
+ n1 <= 2, f"loads={n1} pool={N + 1}")
124
+ check("G1b 新节点可检索(不陈旧)",
125
+ any(x[0].get("id") == "g1_new" for x in r1),
126
+ f"ids={[x[0].get('id') for x in r1][:5]}")
127
+
128
+ # G4 写别的节点不误伤:A 的缓存条目 identity 不变
129
+ print("== G4 邻居条目不误伤 ==")
130
+ pa = cg.index["nodes"]["mem_000"]["path"]
131
+ snap = cg._read_cache.get(pa)
132
+ check("G4pre A 条目已在缓存", snap is not None)
133
+ cg.add("g4_other", "# 功能名:邻居写入\n# 正文:%s 邻居G4" % QUERY,
134
+ layer="knowledge")
135
+ count_loads(lambda: cg.search(QUERY))
136
+ cur = cg._read_cache.get(pa)
137
+ check("G4a 写其它节点后 A 缓存条目 identity 不变(不重读)",
138
+ cur is not None and cur is snap,
139
+ f"same={cur is snap}")
140
+
141
+ # G2 生产写提交边界:add + flush(writepipe._commit_visibility 等价形态)
142
+ print("== G2 写提交边界(add+flush)不整池重装 ==")
143
+ cg.add("g2_flush", "# 功能名:管线节点\n# 正文:%s 管线G2" % QUERY,
144
+ layer="knowledge")
145
+ cg.flush()
146
+ r2, n2 = count_loads(lambda: cg.search(QUERY)[0])
147
+ check("G2a add+flush 后同查询 loads ≤ 2(clear 不整池失效)",
148
+ n2 <= 2, f"loads={n2} pool={N + 3}")
149
+ check("G2b flush 后新节点可检索(不陈旧)",
150
+ any(x[0].get("id") == "g2_flush" for x in r2),
151
+ f"ids={[x[0].get('id') for x in r2][:5]}")
152
+
153
+ # G3 写后不陈旧(正确性保持):覆写既有节点
154
+ print("== G3 覆写后不陈旧 ==")
155
+ cg.add("mem_000", "# 功能名:覆写样本\n# 正文:%s 更新后内容BBB 独有标记G3" % QUERY,
156
+ layer="knowledge")
157
+ entry = cg.index["nodes"]["mem_000"]
158
+ fm_v, c_v = cg._read(entry) # 缓存视图(生产读形态)
159
+ check("G3a 覆写后 _read 缓存视图见新内容(不陈旧)",
160
+ c_v is not None and "BBB" in c_v, f"content={str(c_v)[:40]}")
161
+ r3, _ = count_loads(lambda: cg.search("更新后内容BBB 独有标记G3")[0])
162
+ got = next((x[0].get("content") for x in r3
163
+ if x[0].get("id") == "mem_000"), None)
164
+ check("G3b 覆写后检索命中新内容",
165
+ got is not None and "BBB" in got, f"content={str(got)[:40]}")
166
+
167
+ # G7 派生物缓存同口径:add 1 节点后旧条目 identity 不变(不重算)
168
+ print("== G7 派生物缓存(_doc_norm_bigrams)不误伤 ==")
169
+ cg.search(QUERY) # 装齐派生物缓存
170
+ nbc = getattr(cg, "_norm_bigrams_cache", {})
171
+ snap_nb = {k: v[1] for k, v in nbc.items()}
172
+ check("G7pre 派生物缓存已装载", len(snap_nb) > 0,
173
+ f"entries={len(snap_nb)}")
174
+ cg.add("g7_new", "# 功能名:派生物样本\n# 正文:%s 派生物G7" % QUERY,
175
+ layer="knowledge")
176
+ cg.search(QUERY)
177
+ nbc2 = getattr(cg, "_norm_bigrams_cache", {})
178
+ same = all(nbc2[k][1] is snap_nb[k] for k in snap_nb if k in nbc2)
179
+ check("G7a 写 1 节点后旧派生物条目零重算(identity 不变)",
180
+ same and len(snap_nb) > 0, f"snap={len(snap_nb)}")
181
+
182
+ # G5 删除保守整池失效(tombstone 无 path 可辨 → broad 兜底)
183
+ print("== G5 删除保守整池失效 ==")
184
+ cg._unstage("mem_001")
185
+ left = len(cg.index["nodes"])
186
+ _, n5 = count_loads(lambda: cg.search(QUERY)[0])
187
+ check("G5a _unstage 后同查询整池重装(loads ≥ 剩余池规模)",
188
+ n5 >= left, f"loads={n5} left={left}")
189
+
190
+ # G6 _DirtyDict 簿记直断
191
+ print("== G6 _DirtyDict 脏集簿记 ==")
192
+ from md_cg.mdcg import _DirtyDict
193
+ d = _DirtyDict()
194
+ pg = getattr(d, "path_gen", None)
195
+ bg = getattr(d, "broad_gen", None)
196
+ check("G6a path_gen/broad_gen 簿记就位", pg is not None and bg is not None)
197
+ if pg is not None:
198
+ g0 = d.write_gen
199
+ d["n1"] = {"path": "knowledge/n1.md", "layer": "knowledge"}
200
+ g1 = d.write_gen
201
+ check("G6b 带 path 标脏 → path_gen 记录、broad_gen 不动",
202
+ d.path_gen.get("knowledge/n1.md") == g1 > g0
203
+ and d.broad_gen == 0)
204
+ d["n2"] = {"path": "knowledge/n2.md", "layer": "knowledge"}
205
+ check("G6c 写另一 path 不推进前一 path 的脏代际",
206
+ d.path_gen.get("knowledge/n1.md") == g1
207
+ and d.path_gen.get("knowledge/n2.md") == d.write_gen)
208
+ d["n3"] = None # tombstone:无 path 可辨
209
+ check("G6d tombstone → broad_gen 保守推进",
210
+ d.broad_gen == d.write_gen > g1)
211
+ d.clear() # flush 收尾形态
212
+ check("G6e flush 形态 clear() 推进 write_gen 但不动 broad/path_gen",
213
+ d.write_gen > d.broad_gen
214
+ and d.path_gen.get("knowledge/n1.md") == g1)
215
+ d["n4"] = 1 # 非 entry 形态值
216
+ check("G6f 无 path 可辨的值 → broad_gen 保守推进",
217
+ d.broad_gen == d.write_gen)
218
+ d.clear(broad=True) # rebuild_index 收尾形态
219
+ check("G6h clear(broad=True) → broad_gen 推进(rebuild 兜底)",
220
+ d.broad_gen == d.write_gen)
221
+ gens = []
222
+ d2 = _DirtyDict()
223
+ d2["a"] = {"path": "x"}
224
+ gens.append(d2.write_gen)
225
+ d2["b"] = None
226
+ gens.append(d2.write_gen)
227
+ d2.clear()
228
+ gens.append(d2.write_gen)
229
+ d2["c"] = {"path": "y"}
230
+ gens.append(d2.write_gen)
231
+ check("G6g write_gen 单调不回退(P7b 口径保留)",
232
+ gens == sorted(gens) and len(set(gens)) == 4, f"gens={gens}")
233
+
234
+ # G8 「直写文件 + rebuild_index 收尾」写方(ccgc/crosscheck/backfill
235
+ # 族)的缓存可见性:直写不经 _dirty 标脏,靠 rebuild 的
236
+ # clear(broad=True) 整池兜底——回归面:全量套件 test_ccgc V4c/V5d
237
+ # 曾因 rebuild 不失效而陈旧红。
238
+ print("== G8 直写+rebuild 收尾写方缓存可见性 ==")
239
+ cg.search(QUERY) # 热缓存
240
+ e8 = cg.index["nodes"]["mem_002"]
241
+ fm8, c8 = cg._read(e8)
242
+ cg._write_node("mem_002", cg._node_disk_path(e8), fm8,
243
+ "# 功能名:直写样本\n# 正文:%s 直写后内容G8 独有标记" % QUERY)
244
+ cg.rebuild_index()
245
+ _, n8 = count_loads(lambda: cg.search(QUERY)[0])
246
+ check("G8b rebuild 后整池重装(broad 兜底,loads ≥ 池规模)",
247
+ n8 >= len(cg.index["nodes"]),
248
+ f"loads={n8} pool={len(cg.index['nodes'])}")
249
+ e8b = cg.index["nodes"]["mem_002"]
250
+ fm8b, c8b = cg._read(e8b) # 缓存视图
251
+ check("G8a 直写+rebuild 后缓存视图见新内容(不陈旧)",
252
+ c8b is not None and "直写后内容G8" in c8b,
253
+ f"content={str(c8b)[:40]}")
254
+
255
+ # 收尾清理
256
+ cg.close()
257
+ finally:
258
+ os.environ.pop("MDCG_READ_CACHE", None)
259
+ shutil.rmtree(root, ignore_errors=True)
260
+
261
+ print("\n" + "=" * 60)
262
+ print(f"结果:PASS {PASS} / FAIL {FAIL}")
263
+ if FAILS:
264
+ for f in FAILS:
265
+ print(f" - {f}")
266
+ return 0 if FAIL == 0 else 1
267
+
268
+
269
+ if __name__ == "__main__":
270
+ sys.exit(main())
@@ -0,0 +1,203 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """检索读缓存生产路径守卫(批次 21,issue #31 P2)。
4
+
5
+ 外部报告实测(诚实边界照录):
6
+ - 567 池单次检索 572 次 builtins.open(~70-86% 耗时);
7
+ - install_read_cache 6.53x(126→19.3 ms)但只用于 benchmark;
8
+ - path-only 无失效的朴素实现在「写入后检索」场景**陈旧读**(旧内容命中)。
9
+
10
+ 本守卫七项:
11
+ P1 默认开(env 未设 → 构造即装)+ MDCG_READ_CACHE=0 opt-out 零变更退出阀
12
+ (issue #31 后续:默认关曾让生产入口每查询全池 open+parse);
13
+ P2 开启后检索结果与关闭态一致(缓存不改变结果,只改变速度);
14
+ P3 写后失效(能红 path-only 无失效实现):写入新内容 → 检索必须命中
15
+ 新内容、不得命中旧内容——哨兵(_dirty 代际)失效的核心断言;
16
+ P4 open 计数:开启后二次检索零磁盘 open(打桩 builtins.open);
17
+ P5 clear() 强制兜底可用。
18
+ """
19
+ import builtins
20
+ import os
21
+ import sys
22
+ import tempfile
23
+
24
+ sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
25
+
26
+ from md_cg.mdcos import MdCGSecure
27
+ from md_cg.security import Principal
28
+
29
+ PASS = 0
30
+ FAIL = 0
31
+ FAILS = []
32
+
33
+
34
+ def check(name, cond, detail=""):
35
+ global PASS, FAIL
36
+ if cond:
37
+ PASS += 1
38
+ print(f" OK {name}")
39
+ else:
40
+ FAIL += 1
41
+ FAILS.append(name)
42
+ print(f" FAIL {name} {detail}")
43
+
44
+
45
+ def build_lib(root, n=12):
46
+ cg = MdCGSecure(root, principal=Principal(
47
+ actor="rc", clearance="secret", can_write=True,
48
+ role="designer", auth_mode="test"))
49
+ for i in range(n):
50
+ cg.add("mem_%03d" % i, "# 功能名:读缓存样本 %d\n# 正文:蜂群调度 节点 %d"
51
+ % (i, i), layer="knowledge")
52
+ cg.flush()
53
+ return cg
54
+
55
+
56
+ def count_opens(fn):
57
+ """打桩 builtins.open 计数(只统计读模式,排除访问日志)。
58
+
59
+ 访问日志(record_access)的「读后写」是 #31 P5 登记项(环境相关、
60
+ 另案缓解),不属本守卫的「节点正文读」度量面——P4 只断言正文零盘。
61
+ """
62
+ n = 0
63
+ real = builtins.open
64
+
65
+ def _spy(file, mode="r", *a, **kw):
66
+ nonlocal n
67
+ is_access = "access" in str(file)
68
+ if ("r" in mode and not ("w" in mode or "a" in mode or "+" in mode)
69
+ and not is_access):
70
+ n += 1
71
+ return real(file, mode, *a, **kw)
72
+
73
+ builtins.open = _spy
74
+ try:
75
+ return fn(), n
76
+ finally:
77
+ builtins.open = real
78
+
79
+
80
+ def main():
81
+ root = tempfile.mkdtemp(prefix="mdcg_readcache_")
82
+ os.environ.pop("MDCG_READ_CACHE", None)
83
+ cg = build_lib(root)
84
+ try:
85
+ # P1 默认开 + opt-out 退出阀(issue #31 后续:默认关曾让生产检索入口
86
+ # 每查询全池 open+parse,3300 池实测 ~602ms/查询——默认翻转为本形态)
87
+ print("== P1 默认开(env 未设)+ MDCG_READ_CACHE=0 退出阀 ==")
88
+ check("P1a 默认(env 未设)构造即装读缓存", hasattr(cg, "_read_cache"))
89
+ r0, _ = cg.search("蜂群调度")
90
+ check("P1b 检索正常(基线)", len(r0) >= 1, f"results={len(r0)}")
91
+ os.environ["MDCG_READ_CACHE"] = "0"
92
+ try:
93
+ root_o = os.path.join(root, "optout")
94
+ os.makedirs(root_o, exist_ok=True)
95
+ cg_o = MdCGSecure(root_o, principal=Principal(
96
+ actor="rc", clearance="secret", can_write=True,
97
+ role="designer", auth_mode="test"))
98
+ check("P1c MDCG_READ_CACHE=0 → 未装缓存(opt-out 零变更退出阀)",
99
+ not hasattr(cg_o, "_read_cache"))
100
+ r_o, _ = cg_o.search("占位") # 关态检索照常(空结果非崩溃即证)
101
+ del cg_o
102
+ finally:
103
+ os.environ.pop("MDCG_READ_CACHE", None)
104
+
105
+ # P2/P3/P4 开启态(默认已装配;显式 =1 与默认等价,install 再包一层
106
+ # 同语义缓存——历史形态保留,断言面不变)
107
+ print("== P2/P3/P4 MDCG_READ_CACHE=1 ==")
108
+ os.environ["MDCG_READ_CACHE"] = "1"
109
+ import importlib
110
+ import md_cg.readcache as rc
111
+ importlib.reload(rc)
112
+ rc.install(cg)
113
+
114
+ r1, m1 = cg.search("蜂群调度")
115
+ check("P2a 开启后结果一致(同库同 query)",
116
+ [x[0].get("id") for x in r1] == [x[0].get("id") for x in r0],
117
+ f"on={[x[0].get('id') for x in r1][:3]} off={[x[0].get('id') for x in r0][:3]}")
118
+
119
+ # P3 写后失效(能红 path-only 无失效实现)
120
+ print("== P3 写后失效(能红朴素实现)==")
121
+ cg.add("mem_new", "# 功能名:写入后的新内容BBB\n# 正文:更新后内容BBB 独有标记",
122
+ layer="knowledge")
123
+ cg.flush()
124
+ r3, _ = cg.search("更新后内容BBB")
125
+ ids3 = [x[0].get("id") for x in r3]
126
+ check("P3a 写入后新内容可检索(不陈旧)", "mem_new" in ids3,
127
+ f"ids={ids3[:5]}")
128
+ r3b, _ = cg.search("独有标记")
129
+ check("P3b 独有标记命中新节点", any(
130
+ x[0].get("id") == "mem_new" for x in r3b), f"ids={[x[0].get('id') for x in r3b]}")
131
+
132
+ # P4 open 计数:热缓存后二次检索零读盘
133
+ print("== P4 二次检索零磁盘 open ==")
134
+ cg.search("蜂群调度") # 预热(首检索装缓存)
135
+ (_res, n_open), = (count_opens(lambda: cg.search("蜂群调度")),)
136
+ check("P4a 热缓存后二次检索 open=0(报告基线:572/查询)",
137
+ n_open == 0, f"opens={n_open}")
138
+
139
+ # P6 派生物缓存(_doc_norm_bigrams 钩子):identity 快照断言——
140
+ # 二检后缓存条目的值对象不变(重算必然生成新对象)
141
+ print("== P6 文档侧派生物缓存(_score 88% 热点面)==")
142
+ nbc = getattr(cg, "_norm_bigrams_cache", {})
143
+ snap = {k: v[1] for k, v in nbc.items()}
144
+ check("P6pre 缓存已装载", len(snap) > 0, f"entries={len(snap)}")
145
+ cg.search("蜂群调度") # 二检
146
+ nbc2 = getattr(cg, "_norm_bigrams_cache", {})
147
+ same = all(nbc2[k][1] is snap[k] for k in snap if k in nbc2)
148
+ check("P6a 热缓存后二次检索派生物零重算(identity 不变)",
149
+ same and len(snap) > 0, f"snap={len(snap)}")
150
+
151
+ # P5 clear 兜底(破坏性,放最后)
152
+ n = rc.clear(cg)
153
+ check("P5 clear 返回清空条目数", n > 0, f"cleared={n}")
154
+
155
+ # P7 写代际单调(批次 23,issue #31 D-4 / v20 复现场景,能红 len 代际)
156
+ print("== P7 flush 后同量写入不回退(D-4 陈旧读)==")
157
+ cg.add("x_d4", "# 功能名:占位\n# 正文:原始内容AAA 星云", layer="knowledge")
158
+ cg.add("a_d4", "# 功能名:a\n# 正文:填充甲", layer="knowledge")
159
+ cg.add("b_d4", "# 功能名:b\n# 正文:填充乙", layer="knowledge")
160
+ cg.flush()
161
+ cg.add("c_d4", "# 功能名:c\n# 正文:填充丙", layer="knowledge")
162
+ cg.add("d_d4", "# 功能名:d\n# 正文:填充丁", layer="knowledge")
163
+ cg.search("原始内容AAA") # 装 x=OLD(此时 dirty len=2)
164
+ cg.add("x_d4", "# 功能名:占位\n# 正文:更新后内容BBB 星云",
165
+ layer="knowledge") # 覆写 x=NEW
166
+ cg.flush() # dirty 清零(len 代际在此回退)
167
+ cg.add("e_d4", "# 功能名:e\n# 正文:填充戊", layer="knowledge")
168
+ cg.add("f_d4", "# 功能名:f\n# 正文:填充己", layer="knowledge") # len 巧合回到 2
169
+ r_new, _ = cg.search("更新后内容BBB 星云") # 写 NEW 后检索必须见 NEW
170
+ got = next((it[0].get("content") for it in r_new
171
+ if it[0].get("id") == "x_d4"), None)
172
+ check("P7a flush 回退场景:检索新内容返回 NEW(len 代际实现必返 OLD)",
173
+ got is not None and "BBB" in got,
174
+ f"content={str(got)[:40]}")
175
+
176
+ # P7b 哨兵单调性直断:_DirtyDict 变更序列 write_gen 永不回退
177
+ d = __import__("md_cg.mdcg", fromlist=["_DirtyDict"])._DirtyDict()
178
+ gens = []
179
+ d["a"] = 1; gens.append(d.write_gen)
180
+ d["b"] = 2; gens.append(d.write_gen)
181
+ d.clear(); gens.append(d.write_gen)
182
+ d["c"] = 3; gens.append(d.write_gen)
183
+ check("P7b write_gen 单调不回退(clear 后再写仍前进)",
184
+ gens == sorted(gens) and len(set(gens)) == 4,
185
+ f"gens={gens}")
186
+
187
+ # 还原
188
+ os.environ.pop("MDCG_READ_CACHE", None)
189
+ finally:
190
+ os.environ.pop("MDCG_READ_CACHE", None)
191
+ import shutil
192
+ shutil.rmtree(root, ignore_errors=True)
193
+
194
+ print("\n" + "=" * 60)
195
+ print(f"结果:PASS {PASS} / FAIL {FAIL}")
196
+ if FAILS:
197
+ for f in FAILS:
198
+ print(f" - {f}")
199
+ return 0 if FAIL == 0 else 1
200
+
201
+
202
+ if __name__ == "__main__":
203
+ sys.exit(main())