@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,294 @@
1
+ # -*- coding: utf-8 -*-
2
+ """test_reconcile_v0.py · 启动对账 reconcile v0 守卫(v0.3 T9 落地,落地清单 P0-3)
3
+
4
+ 现场:两段式写对账(`twophase.reconcile`)只清「有 intent 无 outcome」的写入账;
5
+ 索引(派生态)vs 盘面真源(节点 .md)之间没有全量 diff——非合作写者直写文件
6
+ (缺索引条目)、外部删文件(多索引条目/幽灵)、直改正文(哈希漂移)三类背离
7
+ 零告警零修复,派生态与真源静默撕裂(T9 自稳定缺口)。
8
+
9
+ 修复(本守卫的红绿锚点):`md_cg/reconcile.py` 新增 `reconcile_state(cg)`——
10
+ · 三类 diff:多索引条目(摘除,`_unstage` 同口径)/ 缺索引条目(`_node_entry`
11
+ 重建补入)/ 哈希·路径漂移(以盘面为真源重建,增量 upsert 不触发全量
12
+ rebuild);
13
+ · T9 边界:真源自身损坏(读失败 / 非 UTF-8 字节 / frontmatter 无闭合)只
14
+ stderr 告警 + `_reconcile.jsonl` 留痕,**不自动改写**——不据损坏文件建
15
+ 条目,也不因读不出摘除既有条目(瞬态读失败被当「文件没了」= N134 同型
16
+ 放大损伤);
17
+ · 开关 `MDCG_RECONCILE=0` 关闭(缺省开);干净库零输出零写盘、二次扫描
18
+ 幂等全零;
19
+ · 承接面:`mcp_server.main()` 两段式对账之后新增 `cg.reconcile_state()`
20
+ (失败不阻塞启动)。
21
+ 先例修复(本守卫顺带锚定):`mdcg._scan_nodes` 原只捕 OSError——一个非 UTF-8
22
+ 坏文件会炸穿整库装载/重建(init 先于对账,守卫若不补,损坏库永远跑不到对账);
23
+ 补 `(OSError, UnicodeDecodeError)` 跳过,与 T9 边界同口径。
24
+
25
+ **指纹双形态**(历史事实,非本守卫发明):add 写路径入索引的 content_hash 按
26
+ 封存原文(无尾换行正文 ≠ rebuild 路径 loads 读回的带尾换行形态,实测两形态
27
+ 并存)——diff 两侧双形态都认,否则无尾换行节点每次启动都误报漂移(假阳性
28
+ 洪水)。[1b] 断言双形态下零误报,防未来有人「统一」掉一半。
29
+
30
+ 隔离纪律:临时 tempfile.mkdtemp 库 + 哑 Principal(designer),不触真实
31
+ root/令牌库/数据目录;MDCG_RECONCILE 进出还原;测毕 rmtree。
32
+ 自检 floor:断言总数低于 FLOOR 视为失败——防「探针面失效 → 假绿」。
33
+ """
34
+ from __future__ import annotations
35
+
36
+ import contextlib
37
+ import io
38
+ import os
39
+ import shutil
40
+ import sys
41
+ import tempfile
42
+
43
+ try:
44
+ sys.stdout.reconfigure(encoding="utf-8", errors="replace")
45
+ except AttributeError:
46
+ pass
47
+
48
+ from . import nodefile, reconcile
49
+ from .mdcg import MdCG
50
+ from .security import Principal
51
+
52
+ FLOOR = 26 # 断言总数下限(防假绿)
53
+ PASS, FAIL = 0, 0
54
+
55
+
56
+ def check(name, cond, detail=""):
57
+ global PASS, FAIL
58
+ if cond:
59
+ PASS += 1
60
+ print(f" [ok] {name}")
61
+ else:
62
+ FAIL += 1
63
+ print(f" [FAIL] {name} {detail}")
64
+
65
+
66
+ def _run(cg, apply=True):
67
+ """跑一次对账并抓 stderr → (report, stderr 文本)。"""
68
+ err = io.StringIO()
69
+ with contextlib.redirect_stderr(err):
70
+ rep = reconcile.reconcile_state(cg, apply=apply)
71
+ return rep, err.getvalue()
72
+
73
+
74
+ def _disk_hash_of(cg, nid):
75
+ e = cg.index["nodes"][nid]
76
+ with open(os.path.join(cg.root, e["path"]), encoding="utf-8") as f:
77
+ return nodefile.content_hash(nodefile.loads(f.read())[1])
78
+
79
+
80
+ def main():
81
+ saved_sw = os.environ.get(reconcile.ENV_SWITCH)
82
+ tmp = tempfile.mkdtemp(prefix="mdcg_recon_v0_")
83
+ try:
84
+ pr = Principal(actor="recon_guard", clearance="secret",
85
+ can_write=True, can_admin=True, role="designer")
86
+ cg = MdCG(os.path.join(tmp, "cg"))
87
+ # a1 刻意**无尾换行**(add 指纹形态);a2 带尾换行(rebuild 指纹形态)
88
+ cg.add("a1", "hello recon body", layer="knowledge")
89
+ cg.add("a2", "world recon body\n", layer="knowledge")
90
+ cg.flush()
91
+
92
+ # ---- [1] 干净库:三类全零 + 双形态零误报 + 零输出零写盘 ----
93
+ print("[1] 干净库零误报(含指纹双形态)")
94
+ rep, err = _run(cg)
95
+ check("1a 三类 diff 全零(多/缺/漂移)",
96
+ not rep["ghost_entries"] and not rep["missing_entries"]
97
+ and not rep["hash_drift"], f"rep={rep}")
98
+ check("1b 无尾换行节点零误报(add 形态指纹被双形态接受集收容)",
99
+ "a1" in cg.index["nodes"] and not rep["hash_drift"],
100
+ f"drift={rep['hash_drift']}")
101
+ check("1c rebuild 后(rebuild 形态指纹)再次对账仍零漂移",
102
+ (cg.rebuild_index() or {}).get("nodes", {}).get("a1") is not None
103
+ and _run(cg)[0]["hash_drift"] == [],
104
+ f"drift={_run(cg)[0]['hash_drift']}")
105
+ check("1d 干净库零 stderr 输出(diff 非空才发声)",
106
+ err == "", f"stderr={err[:120]!r}")
107
+ check("1e 干净库零写盘(无留痕文件)",
108
+ not os.path.isfile(reconcile.trace_path(cg)),
109
+ f"trace={reconcile.trace_path(cg)}")
110
+
111
+ # ---- [2] 多索引条目(幽灵):外部直删 a2 文件 ----
112
+ print("[2] 多索引条目:外部删文件 → 检出+摘除收敛+告警留痕")
113
+ os.remove(os.path.join(cg.root, cg.index["nodes"]["a2"]["path"]))
114
+ rep, err = _run(cg)
115
+ check("2a diff 检出 ghost=[a2]", rep["ghost_entries"] == ["a2"],
116
+ f"ghost={rep['ghost_entries']}")
117
+ check("2b 自动修复:条目摘除且 tombstone 落账(unstaged=1)",
118
+ "a2" not in cg.index["nodes"]
119
+ and rep["repaired"]["unstaged"] == 1, f"rep={rep}")
120
+ check("2c stderr 告警点名", "幽灵条目" in err, f"stderr={err[:160]!r}")
121
+ check("2d 留痕落盘(_reconcile.jsonl)",
122
+ os.path.isfile(reconcile.trace_path(cg)),
123
+ f"trace={reconcile.trace_path(cg)}")
124
+ rep2, err2 = _run(cg)
125
+ check("2e 幂等:二次扫描三类全零且零输出",
126
+ not (rep2["ghost_entries"] or rep2["missing_entries"]
127
+ or rep2["hash_drift"]) and err2 == "",
128
+ f"rep={rep2} stderr={err2[:80]!r}")
129
+
130
+ # ---- [3] 缺索引条目:非合作写者直写文件 ----
131
+ print("[3] 缺索引条目:直写 .md 不经索引 → 检出+补入收敛")
132
+ fm = {"id": "x1", "layer": "knowledge", "importance": 0.4,
133
+ "created_at": 123.0}
134
+ with open(os.path.join(cg.root, "knowledge", "x1.md"), "w",
135
+ encoding="utf-8") as f:
136
+ f.write(nodefile.dumps(fm, "ghost writer body"))
137
+ rep, err = _run(cg)
138
+ g = cg.get("x1")
139
+ check("3a diff 检出 missing=[x1]", rep["missing_entries"] == ["x1"],
140
+ f"missing={rep['missing_entries']}")
141
+ check("3b 自动修复:条目以 _node_entry 补入(staged=1)且 get 可读",
142
+ rep["repaired"]["staged"] == 1 and g is not None
143
+ and "ghost writer body" in (g or {}).get("content", ""),
144
+ f"rep={rep} get={(g or {}).get('content', '')[:40]!r}")
145
+ check("3c 补入条目 content_hash 与盘面重算一致",
146
+ cg.index["nodes"]["x1"]["content_hash"] == _disk_hash_of(cg, "x1"),
147
+ f"idx={cg.index['nodes']['x1']['content_hash']} "
148
+ f"disk={_disk_hash_of(cg, 'x1')}")
149
+
150
+ # ---- [4] 内容漂移:外部直改 a1 正文 ----
151
+ print("[4] 哈希漂移:直改正文 → 检出+以盘面重建收敛")
152
+ p1 = os.path.join(cg.root, cg.index["nodes"]["a1"]["path"])
153
+ with open(p1, encoding="utf-8") as f:
154
+ txt = f.read()
155
+ with open(p1, "w", encoding="utf-8") as f:
156
+ f.write(txt.replace("hello recon body", "DRIFTED recon body"))
157
+ rep, err = _run(cg)
158
+ g1 = cg.get("a1")
159
+ check("4a diff 检出 drift=[a1]", rep["hash_drift"] == ["a1"],
160
+ f"drift={rep['hash_drift']}")
161
+ check("4b 自动修复:检索面读到盘面新正文(盘面为真源)",
162
+ g1 is not None and "DRIFTED recon body" in (g1 or {}).get(
163
+ "content", ""),
164
+ f"get={(g1 or {}).get('content', '')[:40]!r}")
165
+ check("4c 修复后索引指纹 == 盘面重算指纹",
166
+ cg.index["nodes"]["a1"]["content_hash"]
167
+ == _disk_hash_of(cg, "a1"),
168
+ f"idx={cg.index['nodes']['a1']['content_hash']}")
169
+
170
+ # ---- [5] 真源损坏:只告警不改写(T9 边界)----
171
+ print("[5] 真源损坏两面:无闭合 frontmatter + 非 UTF-8 字节")
172
+ cg.add("a3", "body three", layer="knowledge")
173
+ cg.add("a4", "body four\n", layer="knowledge")
174
+ cg.flush()
175
+ with open(os.path.join(cg.root, "knowledge", "bad1.md"), "w",
176
+ encoding="utf-8") as f:
177
+ f.write("---\n" + 'id: bad1\n') # 无闭合 → 结构非法
178
+ p4 = os.path.join(cg.root, cg.index["nodes"]["a4"]["path"])
179
+ with open(p4, "wb") as f:
180
+ f.write(b"---\xff\xfe\x00binary garbage") # 非 UTF-8 字节
181
+ rep, err = _run(cg)
182
+ kinds = sorted(p["kind"] for p in rep["unwritable_source"])
183
+ check("5a 损坏检出两面(decode_error + frontmatter_unterminated)",
184
+ kinds == ["decode_error", "frontmatter_unterminated"],
185
+ f"kinds={kinds}")
186
+ check("5b 损坏文件不建条目(bad1 不入索引——不据损坏真源写派生态)",
187
+ "bad1" not in cg.index["nodes"]
188
+ and "bad1" not in rep["missing_entries"],
189
+ f"missing={rep['missing_entries']}")
190
+ check("5c 读不出的既有条目不摘除(a4 保留——瞬态/损坏 ≠ 文件没了)",
191
+ "a4" in cg.index["nodes"]
192
+ and "a4" not in rep["ghost_entries"]
193
+ and "a4" in rep.get("kept_unreadable", []),
194
+ f"ghost={rep['ghost_entries']} kept={rep.get('kept_unreadable')}")
195
+ check("5d stderr 告警含 T9 边界口径(只告警不改写)",
196
+ "真源损坏" in err and "不改写" in err.replace("(", "("),
197
+ f"stderr={err[:200]!r}")
198
+ with open(reconcile.trace_path(cg), encoding="utf-8") as f:
199
+ trace_txt = f.read()
200
+ check("5e 留痕记录损坏清单(trace 含 problems)",
201
+ "decode_error" in trace_txt
202
+ and "frontmatter_unterminated" in trace_txt,
203
+ f"trace={trace_txt[:200]!r}")
204
+
205
+ # ---- [6] 开关:MDCG_RECONCILE=0 关闭 ----
206
+ print("[6] 关闭开关 MDCG_RECONCILE=0(缺省开)")
207
+ open(os.path.join(cg.root, "knowledge", "x9.md"), "w",
208
+ encoding="utf-8").write(
209
+ nodefile.dumps({"id": "x9", "layer": "knowledge"}, "off switch body"))
210
+ os.environ[reconcile.ENV_SWITCH] = "0"
211
+ rep_off, _e = _run(cg)
212
+ check("6a 开关关:skipped=True 不触盘", rep_off.get("skipped") is True,
213
+ f"rep={rep_off}")
214
+ check("6b 开关关:diff 在场也不修(x9 不入索引)",
215
+ "x9" not in cg.index["nodes"], f"nodes={list(cg.index['nodes'])}")
216
+ os.environ.pop(reconcile.ENV_SWITCH, None)
217
+ rep_on, _e = _run(cg)
218
+ check("6c 缺省开:开关还原后 x9 补入收敛",
219
+ rep_on["missing_entries"] == ["x9"]
220
+ and cg.get("x9") is not None,
221
+ f"missing={rep_on['missing_entries']}")
222
+
223
+ # ---- [7] dry-run:只 diff 不修 ----
224
+ print("[7] dry-run(apply=False)只报告不改写")
225
+ p1 = os.path.join(cg.root, cg.index["nodes"]["a1"]["path"])
226
+ with open(p1, encoding="utf-8") as f:
227
+ _txt = f.read() # 先读后写("w" 打开即截断)
228
+ with open(p1, "w", encoding="utf-8") as f:
229
+ f.write(_txt.replace("DRIFTED recon body", "DRIFT2 recon body"))
230
+ rep_dry, _e = _run(cg, apply=False)
231
+ check("7a dry-run 检出漂移但不修(applied=False,索引条目仍旧指纹——"
232
+ "get 直读盘面本就见新正文,dry-run 不修的是索引面)",
233
+ rep_dry["hash_drift"] == ["a1"] and rep_dry["applied"] is False
234
+ and cg.index["nodes"]["a1"]["content_hash"]
235
+ != _disk_hash_of(cg, "a1"),
236
+ f"rep={rep_dry}")
237
+ rep_fix, _e = _run(cg)
238
+ check("7b 正式对账收敛漂移(检索面见 DRIFT2)",
239
+ "DRIFT2 recon body" in (cg.get("a1") or {}).get("content", ""),
240
+ f"get={(cg.get('a1') or {}).get('content', '')[:40]!r}")
241
+
242
+ # ---- [8] 损坏在场重开:装载不炸(_scan_nodes 守卫)+ 收敛保持 ----
243
+ print("[8] 损坏真源在场重开库(装载路径守卫)")
244
+ root = cg.root
245
+ cg.close()
246
+ cg2 = MdCG(root)
247
+ check("8a 非 UTF-8 坏文件在场,重开装载不炸(_scan_nodes 跳过)",
248
+ isinstance(cg2.index.get("nodes"), dict),
249
+ "重开抛 UnicodeDecodeError 即假绿")
250
+ check("8b 重开后补入条目可见(x1)、摘除不复活(a2)",
251
+ cg2.get("x1") is not None and "a2" not in cg2.index["nodes"],
252
+ f"x1={cg2.get('x1') is not None} a2={'a2' in cg2.index['nodes']}")
253
+ cg2.close()
254
+
255
+ # ---- [9] 承接面源断言:mcp_server main 启动序列接线 ----
256
+ print("[9] 承接面源断言")
257
+ here = os.path.dirname(os.path.abspath(__file__))
258
+ with open(os.path.join(here, "mcp_server.py"), encoding="utf-8") as fh:
259
+ msrc = fh.read()
260
+ _anchor = msrc.find("cg.reconcile_writes()")
261
+ win = msrc[_anchor:msrc.find("_start_sustain", _anchor)]
262
+ check("9a mcp_server.main() 两段式对账之后新增 reconcile_state 接线",
263
+ "cg.reconcile_state()" in win, "main() 缺启动对账 v0 承接")
264
+ check("9b 接线以 try/except 包裹(对账失败不阻塞启动)",
265
+ "except Exception" in win and "不阻塞启动" in win,
266
+ "缺容错承接")
267
+ with open(os.path.join(here, "mdcg.py"), encoding="utf-8") as fh:
268
+ dsrc = fh.read()
269
+ check("9c MdCG.reconcile_state 委托在位(延迟导入 reconcile)",
270
+ "def reconcile_state" in dsrc
271
+ and "reconcile.reconcile_state" in dsrc, "缺委托方法")
272
+ with open(os.path.join(here, "mdcg.py"), encoding="utf-8") as fh:
273
+ check("9d _scan_nodes 捕 (OSError, UnicodeDecodeError)(装载路径 "
274
+ "T9 守卫)",
275
+ "except (OSError, UnicodeDecodeError):" in dsrc,
276
+ "装载路径缺解码守卫")
277
+
278
+ # ---- [10] 守卫自检 ----
279
+ print("[10] 守卫自检")
280
+ check(f"10a 断言总数 ≥ {FLOOR}(防探针面失效假绿)",
281
+ PASS + FAIL >= FLOOR, f"total={PASS + FAIL}")
282
+ finally:
283
+ if saved_sw is None:
284
+ os.environ.pop(reconcile.ENV_SWITCH, None)
285
+ else:
286
+ os.environ[reconcile.ENV_SWITCH] = saved_sw
287
+ shutil.rmtree(tmp, ignore_errors=True)
288
+
289
+ print(f"\n=== reconcile v0 tests: {PASS} passed, {FAIL} failed ===")
290
+ sys.exit(1 if FAIL else 0)
291
+
292
+
293
+ if __name__ == "__main__":
294
+ sys.exit(main())
@@ -0,0 +1,140 @@
1
+ # -*- coding: utf-8 -*-
2
+ """issue #25 生产路径门控守卫:MdCGSecure.search(生产类)必须真实吃到门控。
3
+
4
+ 病灶(2026-09-23 外部报告):检索门控 S1/S1b/S2/S4 只存在于 MdCG.search,
5
+ 而生产调用链 mcp_server → MdCGSecure → MdCGOS 走的是 MdCGOS.search 覆写——
6
+ 门控在生产路径从未生效,专项测试(test_retr_s*.py)全测非生产路径,
7
+ 绿灯是假信号(gates=None、scanned=全表)。
8
+
9
+ 本文件是「门控确实接进生产路径」的守卫:
10
+ P1 生产类开关生效:gates 出现且 scanned 真实收敛(旧代码必红);
11
+ P2 默认路径零变更:总开关未设 → meta 无 gates 键(契约纪律);
12
+ P3 两路共享同一实现:MdCG.search 与 MdCGOS.search 的 gates 结构一致;
13
+ P4 覆写防悬空:两份 search 源码都必须引用 apply_retrieval_gates——
14
+ 防止未来再写出第三个不含门控的覆写(本病灶的复发形态)。
15
+ """
16
+ import inspect
17
+ import json
18
+ import os
19
+ import sys
20
+ import tempfile
21
+
22
+ sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
23
+
24
+ from md_cg.mdcos import MdCGSecure, MdCGOS
25
+ from md_cg.mdcg import MdCG, apply_retrieval_gates
26
+
27
+ PASS = 0
28
+ FAIL = 0
29
+ FAILS = []
30
+
31
+
32
+ def check(name, cond, detail=""):
33
+ global PASS, FAIL
34
+ if cond:
35
+ PASS += 1
36
+ print(f" OK {name}")
37
+ else:
38
+ FAIL += 1
39
+ FAILS.append(name)
40
+ print(f" FAIL {name} {detail}")
41
+
42
+
43
+ def build_lib(root, n=30):
44
+ """小库:一半节点挂在中文桶键(含查询词面),一半无关桶。
45
+
46
+ 桶键用中文(批次 15):S1b 桶推理经 bucket_key_readable+domain_similarity,
47
+ 英文桶键对中文 query 恒 no_key_match(跨语失效——真实缺陷已登记),
48
+ 守卫锚定收敛机制本身,桶键与 query 同语言才可断言。
49
+ """
50
+ cg = MdCGSecure(root)
51
+ for i in range(n):
52
+ bucket = "蜂群调度" if i < n // 2 else "无关奶牛"
53
+ text = ("# 功能名:蜂群调度样本 %d\n# 正文:dispatch 调度内容样本 %d"
54
+ % (i, i)) if i < n // 2 else \
55
+ ("# 功能名:无关样本 %d\n# 正文:cow 内容样本 %d" % (i, i))
56
+ cg.add("mem_%03d" % i, text, layer="knowledge")
57
+ # S1b 依赖 entry.bucket(平铺字段);big_domain 同理(S1 面)
58
+ e = cg.index["nodes"]["mem_%03d" % i]
59
+ e["bucket"] = bucket
60
+ e["big_domain"] = "swarm" if i < n // 2 else "farm"
61
+ cg.flush()
62
+ return cg
63
+
64
+
65
+ def main():
66
+ print("== P1 生产类(MdCGSecure)开关生效(能红旧实现)==")
67
+ root = tempfile.mkdtemp(prefix="mdcg_gate_prod_")
68
+ cg = build_lib(root)
69
+ os.environ["MDCG_RETRIEVAL_PIPELINE"] = "1"
70
+ os.environ["MDCG_GATE_S1B_BUCKET"] = "1"
71
+ try:
72
+ # query 用中文核心词(批次 15 起 query 经统一归一层——英文词面会随
73
+ # 词表演进而变,守卫锚定检索行为本身不该锚定词表内容)
74
+ r, meta = cg.search("调度")
75
+ gates = meta.get("gates") or {}
76
+ check("P1a 生产类 gates 审计出现(旧代码 gates=None)",
77
+ isinstance(gates, dict) and "s1b" in gates,
78
+ json.dumps(meta, ensure_ascii=False, default=str)[:200])
79
+ check("P1b scanned 真实收敛(< 全库节点数)",
80
+ meta.get("scanned", 10**9) < 30,
81
+ f"scanned={meta.get('scanned')}")
82
+ check("P1c 召回不丢(收敛后仍有结果)",
83
+ len(r) >= 1, f"results={len(r)}")
84
+ finally:
85
+ os.environ.pop("MDCG_RETRIEVAL_PIPELINE", None)
86
+ os.environ.pop("MDCG_GATE_S1B_BUCKET", None)
87
+
88
+ print("== P2 默认路径零变更 ==")
89
+ os.environ.pop("MDCG_RETRIEVAL_PIPELINE", None)
90
+ r, meta = cg.search("调度")
91
+ check("P2 默认(总开关未设)meta 无 gates 键",
92
+ "gates" not in meta, json.dumps(meta, ensure_ascii=False, default=str)[:160])
93
+
94
+ print("== P3 两路共享同一实现(同库同查询 gates 结构一致)==")
95
+ base = MdCG(tempfile.mkdtemp(prefix="mdcg_gate_base_"))
96
+ # 把同形状节点直接写进基类实例(经 add 共享落盘口径)
97
+ for i in range(30):
98
+ bucket = "蜂群调度" if i < 15 else "无关奶牛"
99
+ text = ("# 功能名:蜂群调度样本 %d\n# 正文:dispatch 调度内容样本 %d"
100
+ % (i, i)) if i < 15 else \
101
+ ("# 功能名:无关样本 %d\n# 正文:cow 内容样本 %d" % (i, i))
102
+ base.add("mem_%03d" % i, text, layer="knowledge")
103
+ e = base.index["nodes"]["mem_%03d" % i]
104
+ e["bucket"] = bucket
105
+ e["big_domain"] = "swarm" if i < 15 else "farm"
106
+ base.flush()
107
+ os.environ["MDCG_RETRIEVAL_PIPELINE"] = "1"
108
+ os.environ["MDCG_GATE_S1B_BUCKET"] = "1"
109
+ try:
110
+ _, meta_os = cg.search("调度")
111
+ _, meta_cg = base.search("调度")
112
+ g_os, g_cg = meta_os.get("gates") or {}, meta_cg.get("gates") or {}
113
+ check("P3a MdCGOS 与 MdCG 的 s1b 审计键集合一致",
114
+ bool(g_os) and set(g_os) == set(g_cg),
115
+ f"os={sorted(g_os)} cg={sorted(g_cg)}")
116
+ check("P3b MdCG.search 自身收敛不回归(搬移未改行为)",
117
+ meta_cg.get("scanned", 10**9) < 30,
118
+ f"scanned={meta_cg.get('scanned')}")
119
+ finally:
120
+ os.environ.pop("MDCG_RETRIEVAL_PIPELINE", None)
121
+ os.environ.pop("MDCG_GATE_S1B_BUCKET", None)
122
+
123
+ print("== P4 覆写防悬空(病灶复发形态的结构守卫)==")
124
+ src_os = inspect.getsource(MdCGOS.search)
125
+ src_cg = inspect.getsource(MdCG.search)
126
+ check("P4a MdCGOS.search 引用共享门控", "apply_retrieval_gates" in src_os)
127
+ check("P4b MdCG.search 引用共享门控", "apply_retrieval_gates" in src_cg)
128
+ check("P4c 共享函数存在且可调(两路 MRO 都能到达)",
129
+ callable(apply_retrieval_gates))
130
+
131
+ print()
132
+ if FAILS:
133
+ print(f"FAILED: {len(FAILS)} 项 → {', '.join(FAILS)}")
134
+ return 1
135
+ print(f"ALL OK: {PASS} 项(生产路径门控守卫全绿)")
136
+ return 0
137
+
138
+
139
+ if __name__ == "__main__":
140
+ sys.exit(main())