@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
@@ -1,81 +1,81 @@
1
- # -*- coding: utf-8 -*-
2
- """PR #15 census 归档区剪枝探针(脚本式,exit code 定成败)。
3
-
4
- 用法:python -X utf8 -m md_cg.test_census_prune
5
- 覆盖:
6
- - ARCHIVE_DIRS 五个目录整体剪枝(含 _protected_history/<id>/<ts>.md 两层下钻)
7
- - _protected_history_* 前缀目录剪枝
8
- - 普通子目录不误伤
9
- - 无 frontmatter 的散落 md 仍被跳过(既有语义保持)
10
- - 真实库(data/mdcg)上活跃数不再被墓碑/快照稀释
11
- """
12
- import os
13
- import sys
14
- import tempfile
15
-
16
- sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
17
-
18
- from md_cg import census # noqa: E402
19
-
20
- FM = "---\nid: {nid}\nlayer: knowledge\n---\n正文\n"
21
- passed = 0
22
-
23
-
24
- def check(name, cond, detail=""):
25
- global passed
26
- if cond:
27
- passed += 1
28
- print(" [PASS] " + name)
29
- else:
30
- print(" [FAIL] " + name + " " + detail)
31
-
32
-
33
- def main():
34
- root = tempfile.mkdtemp(prefix="census_prune_")
35
- nodes = {
36
- # (相对路径, 是否活跃)
37
- ("act_root.md", True),
38
- ("sub", "act_sub.md", True), # 普通子目录不误伤
39
- ("trash", "t1.md", False),
40
- ("_protected_history", "n1", "20260101_000000.md", False), # 两层下钻
41
- ("_protected", "p1.md", False),
42
- ("_index_log", "i1.md", False),
43
- ("hippocampus", "h1.md", False),
44
- ("_protected_history_extra", "x.md", False), # 前缀分支
45
- ("note.md", None), # 无 frontmatter 散落文档 → 跳过
46
- }
47
- for n in nodes:
48
- parts = [p for p in n if p is not True and p is not False and p is not None]
49
- active = n[-1] is True
50
- rel = os.path.join(*parts) if parts else "note.md"
51
- p = os.path.join(root, rel)
52
- os.makedirs(os.path.dirname(p), exist_ok=True)
53
- with open(p, "w", encoding="utf-8") as f:
54
- f.write("" if n[-1] is None else FM.format(nid=os.path.splitext(parts[-1])[0]))
55
- rows = census.load(root)
56
- ids = sorted(r[0] for r in rows)
57
- check("仅活跃节点入普查(2 个)", ids == ["act_root", "act_sub"], str(ids))
58
- for bad in ("t1", "p1", "i1", "h1", "x", "20260101_000000"):
59
- check(f"归档区 {bad} 被剪枝", bad not in ids, str(ids))
60
-
61
- # 真实库对比:PR 版活跃数 vs 全遍历数(含归档区)
62
- real = os.path.join(os.path.dirname(os.path.dirname(
63
- os.path.abspath(__file__))), "data", "mdcg")
64
- if os.path.isdir(real):
65
- n_active = len(census.load(real))
66
- n_all = sum(1 for dp, _ds, fs in os.walk(real) for f in fs
67
- if f.endswith(".md"))
68
- print(f"\n 真实库 {real}")
69
- print(f" PR 版活跃节点 {n_active} / 全遍历 {n_all}"
70
- f"(归档区剪掉 {n_all - n_active})")
71
- check("真实库剪枝后不再被墓碑稀释", n_active < n_all,
72
- f"{n_active} vs {n_all}")
73
-
74
- print(f"\ntest_census_prune: {passed} 断言通过")
75
- return 0 if passed >= 7 else 1
76
-
77
-
78
- if __name__ == "__main__":
79
- if hasattr(sys.stdout, "reconfigure"):
80
- sys.stdout.reconfigure(encoding="utf-8")
81
- sys.exit(main())
1
+ # -*- coding: utf-8 -*-
2
+ """PR #15 census 归档区剪枝探针(脚本式,exit code 定成败)。
3
+
4
+ 用法:python -X utf8 -m md_cg.test_census_prune
5
+ 覆盖:
6
+ - ARCHIVE_DIRS 五个目录整体剪枝(含 _protected_history/<id>/<ts>.md 两层下钻)
7
+ - _protected_history_* 前缀目录剪枝
8
+ - 普通子目录不误伤
9
+ - 无 frontmatter 的散落 md 仍被跳过(既有语义保持)
10
+ - 真实库(data/mdcg)上活跃数不再被墓碑/快照稀释
11
+ """
12
+ import os
13
+ import sys
14
+ import tempfile
15
+
16
+ sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
17
+
18
+ from md_cg import census # noqa: E402
19
+
20
+ FM = "---\nid: {nid}\nlayer: knowledge\n---\n正文\n"
21
+ passed = 0
22
+
23
+
24
+ def check(name, cond, detail=""):
25
+ global passed
26
+ if cond:
27
+ passed += 1
28
+ print(" [PASS] " + name)
29
+ else:
30
+ print(" [FAIL] " + name + " " + detail)
31
+
32
+
33
+ def main():
34
+ root = tempfile.mkdtemp(prefix="census_prune_")
35
+ nodes = {
36
+ # (相对路径, 是否活跃)
37
+ ("act_root.md", True),
38
+ ("sub", "act_sub.md", True), # 普通子目录不误伤
39
+ ("trash", "t1.md", False),
40
+ ("_protected_history", "n1", "20260101_000000.md", False), # 两层下钻
41
+ ("_protected", "p1.md", False),
42
+ ("_index_log", "i1.md", False),
43
+ ("hippocampus", "h1.md", False),
44
+ ("_protected_history_extra", "x.md", False), # 前缀分支
45
+ ("note.md", None), # 无 frontmatter 散落文档 → 跳过
46
+ }
47
+ for n in nodes:
48
+ parts = [p for p in n if p is not True and p is not False and p is not None]
49
+ active = n[-1] is True
50
+ rel = os.path.join(*parts) if parts else "note.md"
51
+ p = os.path.join(root, rel)
52
+ os.makedirs(os.path.dirname(p), exist_ok=True)
53
+ with open(p, "w", encoding="utf-8") as f:
54
+ f.write("" if n[-1] is None else FM.format(nid=os.path.splitext(parts[-1])[0]))
55
+ rows = census.load(root)
56
+ ids = sorted(r[0] for r in rows)
57
+ check("仅活跃节点入普查(2 个)", ids == ["act_root", "act_sub"], str(ids))
58
+ for bad in ("t1", "p1", "i1", "h1", "x", "20260101_000000"):
59
+ check(f"归档区 {bad} 被剪枝", bad not in ids, str(ids))
60
+
61
+ # 真实库对比:PR 版活跃数 vs 全遍历数(含归档区)
62
+ real = os.path.join(os.path.dirname(os.path.dirname(
63
+ os.path.abspath(__file__))), "data", "mdcg")
64
+ if os.path.isdir(real):
65
+ n_active = len(census.load(real))
66
+ n_all = sum(1 for dp, _ds, fs in os.walk(real) for f in fs
67
+ if f.endswith(".md"))
68
+ print(f"\n 真实库 {real}")
69
+ print(f" PR 版活跃节点 {n_active} / 全遍历 {n_all}"
70
+ f"(归档区剪掉 {n_all - n_active})")
71
+ check("真实库剪枝后不再被墓碑稀释", n_active < n_all,
72
+ f"{n_active} vs {n_all}")
73
+
74
+ print(f"\ntest_census_prune: {passed} 断言通过")
75
+ return 0 if passed >= 7 else 1
76
+
77
+
78
+ if __name__ == "__main__":
79
+ if hasattr(sys.stdout, "reconfigure"):
80
+ sys.stdout.reconfigure(encoding="utf-8")
81
+ sys.exit(main())
@@ -0,0 +1,168 @@
1
+ # -*- coding: utf-8 -*-
2
+ """读隔离守卫:因果链面(causal_chain / explain_chain / causal_path / 检索
3
+ chain 路 provenance)不得泄漏不可见节点。
4
+
5
+ 缺陷形态(2026-09-25 检索域新发现,报告编号 N130 与他域冲突,以 where 定位,
6
+ high):MdCGOS.causal_chain / explain_chain(mdcos.py:3491-3506)裸转调
7
+ chain.walk / chain.explain,causal_path(mdcos.py:3544→predict.py:1020)BFS
8
+ 直用 chain.adjacency——而 chain.adjacency(chain.py:127-159)以 cg.index 全量
9
+ 节点 frontmatter 建出边表,全程不经 cg.get / MdCGSecure._readable。任何持
10
+ read op 的低权令牌(ROLE_SPECS 全表 ops_allow 均含 read;mdcg_causal 的
11
+ _MDCG_OP_REQUIRE 即为 "read")可:①对不可见节点起链;②看到链上不可见节点
12
+ id、边条件文本与下游拓扑;③检索 chain 路 provenance(_path_chain→
13
+ expand_from_seeds,同走 adjacency)把全链与秘密条件文本附带在可见节点条目上。
14
+
15
+ 修复:在 chain.adjacency 单点接可见性闸——cg 提供 `_chain_visible(nid)` 谓词
16
+ (MdCGSecure 注入 = 索引有条目 ∧ _readable(e);基类不注入行为零变化)时,
17
+ 不可见节点的出边整体不入表、可见节点指向不可见目标的边截断、层级合成边同
18
+ 闸;缓存键带上闸存在位。单点覆盖 walk / explain / causal_path /
19
+ expand_from_seeds(检索 chain 路 provenance)全部消费者——比三方法各自覆盖
20
+ 多堵住 provenance 面,且预测器其余 adjacency 消费者(causal roadmap /
21
+ 共同父节点等)一并隔离。_readable 的绑定档判定恒用 principal.session
22
+ (mdcos.py:3901-3906),实例身份稳定,adjacency 缓存无跨身份串台面。
23
+
24
+ 红项 = R1-R5(链/路径/解释/检索 provenance 四面泄漏复现);
25
+ G 项锁语义不变(designer/admin 可见性不变、可见-可见边链照常展开、get 隔离
26
+ 基线)。
27
+ 运行:python -m md_cg.test_chain_read_isolate
28
+ """
29
+ from __future__ import annotations
30
+
31
+ import os
32
+ import shutil
33
+ import sys
34
+ import tempfile
35
+
36
+ try:
37
+ from .mdcos import MdCGSecure
38
+ from .security import Principal
39
+ except ImportError: # 直接脚本运行
40
+ sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
41
+ from md_cg.mdcos import MdCGSecure
42
+ from md_cg.security import Principal
43
+
44
+ PASS = FAIL = 0
45
+ FAILS = []
46
+
47
+ _SECRET_COND = "Y侧秘密条件文本YY"
48
+ _SECRET_ID = "Y秘密"
49
+
50
+
51
+ def ok(cond, label):
52
+ global PASS, FAIL
53
+ if cond:
54
+ PASS += 1
55
+ print(f" OK {label}")
56
+ else:
57
+ FAIL += 1
58
+ FAILS.append(label)
59
+ print(f" FAIL {label}")
60
+
61
+
62
+ def _body(name):
63
+ return (f"# 功能名:{name}\n# 生效条件:无条件\n# 子功能:无\n"
64
+ f"# 执行:无\n# 验证方式:test\n# 不适用条件:无\n\n正文。")
65
+
66
+
67
+ def main():
68
+ tmp = tempfile.mkdtemp(prefix="mdcg_chain_iso_")
69
+ try:
70
+ root = os.path.join(tmp, "kg")
71
+ # 写者:designer(can_admin → private 档可见),建链 X→Y→Z
72
+ dw = Principal(actor="designer-1", role="designer", can_write=True,
73
+ can_admin=True, clearance="secret")
74
+ cg = MdCGSecure(root, principal=dw, master_key=bytes(range(32)))
75
+ cg.add("X苹果", _body("X苹果"), layer="knowledge", sensitivity="internal",
76
+ edges=[{"target": _SECRET_ID, "relation_type": "causal",
77
+ "condition": _SECRET_COND, "confidence": 0.9}])
78
+ cg.add(_SECRET_ID, _body("Y秘密"), layer="knowledge", sensitivity="private",
79
+ edges=[{"target": "Z结论", "relation_type": "causal",
80
+ "condition": "到Z的显性条件", "confidence": 0.9}])
81
+ cg.add("Z结论", _body("Z结论"), layer="knowledge", sensitivity="internal")
82
+ # 可见-可见对照链:A内→B内(reader 应照常展开)
83
+ cg.add("A内", _body("A内"), layer="knowledge", sensitivity="internal",
84
+ edges=[{"target": "B内", "relation_type": "causal",
85
+ "condition": "显性条件AB", "confidence": 0.8}])
86
+ cg.add("B内", _body("B内"), layer="knowledge", sensitivity="internal")
87
+ cg.close()
88
+
89
+ # 读者:record 角色,clearance=internal(低于 private),异会话
90
+ rd = Principal(actor="reader-1", role="record", can_write=True,
91
+ can_admin=False, clearance="internal",
92
+ layers_allow=["knowledge"], ops_allow=["read"])
93
+ r = MdCGSecure(root, principal=rd, master_key=bytes(range(32)))
94
+
95
+ # R0 基线:get 读隔离本就生效(旧码即过,锁语义)
96
+ ok(r.get(_SECRET_ID) is None, "R0 基线:reader.get(Y秘密) 隔离生效")
97
+
98
+ # R1 链展开:不可见中转节点 id + 边条件文本不得出现在链输出
99
+ chains = r.causal_chain("X苹果")
100
+ blob = repr(chains)
101
+ ok(_SECRET_ID not in blob,
102
+ "R1a causal_chain(X苹果) 输出不含不可见节点 id")
103
+ ok(_SECRET_COND not in blob,
104
+ "R1b causal_chain(X苹果) 输出不含秘密边条件文本")
105
+
106
+ # R2 不可见节点起链:应与节点不存在同形(空链)
107
+ ok(r.causal_chain(_SECRET_ID) == [],
108
+ "R2 causal_chain(Y秘密) 不可见起点返回空链")
109
+
110
+ # R3 解释面:同源 walk,渲染输出不得带秘密
111
+ ex = r.explain_chain("X苹果")
112
+ ok(_SECRET_ID not in repr(ex) and _SECRET_COND not in repr(ex),
113
+ "R3 explain_chain(X苹果) 渲染输出零泄漏")
114
+
115
+ # R4 因果路径:经不可见中转的路径不可达
116
+ cp = r.causal_path("X苹果", "Z结论")
117
+ ok(not cp.get("reachable") and _SECRET_ID not in repr(cp)
118
+ and _SECRET_COND not in repr(cp),
119
+ "R4 causal_path(X苹果→Z结论) 不可达且零泄漏")
120
+
121
+ # R5 检索 chain 路:provenance/chain 字段(evidence ⑤ 所指)不得携带
122
+ # 不可见全链。注意范围:可读节点**自身 frontmatter 的 edges 元数据**
123
+ # 随节点视图返回是另一回事(读者本就可读该节点的 md 原文),不在
124
+ # 本缺陷(链展开面)范围。prov 形态:nid → [{"path","rank",
125
+ # "chain"?,"conditions"?}, …];结果 4 元组第 4 位同源。
126
+ res, meta = r.search_rrf("苹果", paths=("lexical", "chain"), record=False)
127
+ chain_fields = []
128
+ for entries in ((meta or {}).get("provenance") or {}).values():
129
+ chain_fields.extend(en for en in entries
130
+ if isinstance(en, dict) and en.get("chain"))
131
+ for t in res:
132
+ if isinstance(t, tuple) and len(t) >= 4 and isinstance(t[3], list):
133
+ chain_fields.extend(en for en in t[3]
134
+ if isinstance(en, dict) and en.get("chain"))
135
+ ok(all(_SECRET_ID not in repr(en.get("chain")) for en in chain_fields),
136
+ "R5a search_rrf provenance 链不含不可见节点 id")
137
+ ok(all(_SECRET_COND not in repr(en.get("conditions"))
138
+ for en in chain_fields),
139
+ "R5b search_rrf provenance 条件不含秘密文本")
140
+
141
+ # G1 可见-可见链照常展开(闸不误伤本职语义)
142
+ ok(r.causal_chain("A内") != [],
143
+ "G1a reader 对可见链 A内→B内 照常展开")
144
+ ok("显性条件AB" in repr(r.causal_chain("A内")),
145
+ "G1b 可见边条件文本照常返回")
146
+
147
+ # G2 designer/admin 可见性不变(private 档链对设计者完整可见)
148
+ cg2 = MdCGSecure(root, principal=dw, master_key=bytes(range(32)))
149
+ dch = cg2.causal_chain("X苹果")
150
+ ok(any(_SECRET_ID in c.get("nodes", []) for c in dch),
151
+ "G2a designer causal_chain 照常含 private 节点(admin 可见性不变)")
152
+ ok(any(_SECRET_COND in c.get("conditions", []) for c in dch),
153
+ "G2b designer 照常见到边条件文本")
154
+ cg2.close()
155
+ r.close()
156
+ finally:
157
+ shutil.rmtree(tmp, 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())
@@ -1,76 +1,76 @@
1
- # -*- coding: utf-8 -*-
2
- """cond_compose 行为锚点(在途 WIP 并集解)探针:脚本式,exit code 定成败。
3
-
4
- 背景:2026-09-19 收口两线时,工作区残留一处 stash-pop 冲突(md_cg/cond_compose.py):
5
- ours(HEAD)=compose 的「生效条件」注释;theirs(stash)=新增 behavior_anchors()。
6
- 两侧新增互不重叠 → 并集解(本分支)。该函数当前**全库无调用**,故本探针只把
7
- 「冲突解正确 + 函数行为与文档一致」钉住,配线与否由使用者裁决。
8
-
9
- 用法:python -X utf8 -m md_cg.test_cond_compose_anchors
10
- """
11
- import os
12
- import sys
13
-
14
- sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
15
-
16
- from md_cg import cond_compose as cc # noqa: E402
17
-
18
- passed = 0
19
- failed = 0
20
-
21
-
22
- def check(name, cond, detail=""):
23
- global passed, failed
24
- if cond:
25
- passed += 1
26
- print(" [PASS] " + name)
27
- else:
28
- failed += 1
29
- print(" [FAIL] " + name + " " + detail)
30
-
31
-
32
- def main():
33
- # 1) 并集完整性:冲突两侧的东西都在,且文件里没有冲突标记
34
- src = open(cc.__file__, encoding="utf-8").read()
35
- check("并集:compose 与 behavior_anchors 同时在",
36
- hasattr(cc, "compose") and hasattr(cc, "behavior_anchors"))
37
- check("并集:无冲突标记", "<<<<<<<" not in src and ">>>>>>>" not in src)
38
- check("并集:compose 的生效条件注释未丢", "调用 compose 时必须提供 rec" in src)
39
-
40
- # 2) behavior_anchors 行为(按实现口径逐条断言)
41
- rec = {"name": "f", "doc_head": " 计算 a 的摘要 ",
42
- "guards": [{"early": True, "cond": "a"},
43
- {"early": False, "cond": "a"},
44
- {"early": True, "cond": "a and b"}],
45
- "returns": ["a.strip()", "LIMIT + 1", "local_only"]}
46
- doc, guards, rets = cc.behavior_anchors(rec, {"a"})
47
- check("doc 取 doc_head 并去空白", doc == "计算 a 的摘要", repr(doc))
48
- # explained_guards 的两道筛:early 必须为真;cond 内标识符必须全在 allowed∪BUILTINS∪self/cls
49
- # (故 "a" 入选、"a and b" 因 b 不在 allowed 被剔、"a is None" 会因 is 不是 builtins 被剔)
50
- check("guards 只留 early 且标识符合规者(走 explained_guards)",
51
- [g.get("cond") for g in guards] == ["a"], str(guards))
52
- check("returns 只留含 allowed 标识符者", rets == ["a.strip()"], str(rets))
53
- _d2, _g2, rets2 = cc.behavior_anchors(rec, {"a", "LIMIT"})
54
- check("allowed 含模块常量时其返回表达式入选(调用方负责传 入参∪常量)",
55
- rets2 == ["a.strip()", "LIMIT + 1"], str(rets2))
56
-
57
- # 3) 「只有形参清单、无任何行为锚点」→ 三元组全空(调用方据此可判 BLINDSPOT)
58
- empty = cc.behavior_anchors({"name": "g", "guards": [], "returns": []}, {"x"})
59
- check("无形为锚点时返回空三元组", empty == ("", [], []), str(empty))
60
- check("缺失 doc_head/returns 键不抛异常",
61
- cc.behavior_anchors({"name": "h"}, {"x"}) == ("", [], []))
62
-
63
- # 4) 未回归:compose 仍能产出以「。」结尾的条件串
64
- s = cc.compose({"name": "f", "required": ["a"], "optional": [], "externals": [],
65
- "guards": [], "returns": ["a.strip()"], "doc_head": "摘要"})
66
- check("compose 未回归(非空且以「。」结尾)",
67
- isinstance(s, str) and s.endswith("。") and len(s) > 4, s[:60])
68
-
69
- print("\ntest_cond_compose_anchors: %d 通过 / %d 失败" % (passed, failed))
70
- return 0 if failed == 0 else 1
71
-
72
-
73
- if __name__ == "__main__":
74
- if hasattr(sys.stdout, "reconfigure"):
75
- sys.stdout.reconfigure(encoding="utf-8")
76
- sys.exit(main())
1
+ # -*- coding: utf-8 -*-
2
+ """cond_compose 行为锚点(在途 WIP 并集解)探针:脚本式,exit code 定成败。
3
+
4
+ 背景:2026-09-19 收口两线时,工作区残留一处 stash-pop 冲突(md_cg/cond_compose.py):
5
+ ours(HEAD)=compose 的「生效条件」注释;theirs(stash)=新增 behavior_anchors()。
6
+ 两侧新增互不重叠 → 并集解(本分支)。该函数当前**全库无调用**,故本探针只把
7
+ 「冲突解正确 + 函数行为与文档一致」钉住,配线与否由使用者裁决。
8
+
9
+ 用法:python -X utf8 -m md_cg.test_cond_compose_anchors
10
+ """
11
+ import os
12
+ import sys
13
+
14
+ sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
15
+
16
+ from md_cg import cond_compose as cc # noqa: E402
17
+
18
+ passed = 0
19
+ failed = 0
20
+
21
+
22
+ def check(name, cond, detail=""):
23
+ global passed, failed
24
+ if cond:
25
+ passed += 1
26
+ print(" [PASS] " + name)
27
+ else:
28
+ failed += 1
29
+ print(" [FAIL] " + name + " " + detail)
30
+
31
+
32
+ def main():
33
+ # 1) 并集完整性:冲突两侧的东西都在,且文件里没有冲突标记
34
+ src = open(cc.__file__, encoding="utf-8").read()
35
+ check("并集:compose 与 behavior_anchors 同时在",
36
+ hasattr(cc, "compose") and hasattr(cc, "behavior_anchors"))
37
+ check("并集:无冲突标记", "<<<<<<<" not in src and ">>>>>>>" not in src)
38
+ check("并集:compose 的生效条件注释未丢", "调用 compose 时必须提供 rec" in src)
39
+
40
+ # 2) behavior_anchors 行为(按实现口径逐条断言)
41
+ rec = {"name": "f", "doc_head": " 计算 a 的摘要 ",
42
+ "guards": [{"early": True, "cond": "a"},
43
+ {"early": False, "cond": "a"},
44
+ {"early": True, "cond": "a and b"}],
45
+ "returns": ["a.strip()", "LIMIT + 1", "local_only"]}
46
+ doc, guards, rets = cc.behavior_anchors(rec, {"a"})
47
+ check("doc 取 doc_head 并去空白", doc == "计算 a 的摘要", repr(doc))
48
+ # explained_guards 的两道筛:early 必须为真;cond 内标识符必须全在 allowed∪BUILTINS∪self/cls
49
+ # (故 "a" 入选、"a and b" 因 b 不在 allowed 被剔、"a is None" 会因 is 不是 builtins 被剔)
50
+ check("guards 只留 early 且标识符合规者(走 explained_guards)",
51
+ [g.get("cond") for g in guards] == ["a"], str(guards))
52
+ check("returns 只留含 allowed 标识符者", rets == ["a.strip()"], str(rets))
53
+ _d2, _g2, rets2 = cc.behavior_anchors(rec, {"a", "LIMIT"})
54
+ check("allowed 含模块常量时其返回表达式入选(调用方负责传 入参∪常量)",
55
+ rets2 == ["a.strip()", "LIMIT + 1"], str(rets2))
56
+
57
+ # 3) 「只有形参清单、无任何行为锚点」→ 三元组全空(调用方据此可判 BLINDSPOT)
58
+ empty = cc.behavior_anchors({"name": "g", "guards": [], "returns": []}, {"x"})
59
+ check("无形为锚点时返回空三元组", empty == ("", [], []), str(empty))
60
+ check("缺失 doc_head/returns 键不抛异常",
61
+ cc.behavior_anchors({"name": "h"}, {"x"}) == ("", [], []))
62
+
63
+ # 4) 未回归:compose 仍能产出以「。」结尾的条件串
64
+ s = cc.compose({"name": "f", "required": ["a"], "optional": [], "externals": [],
65
+ "guards": [], "returns": ["a.strip()"], "doc_head": "摘要"})
66
+ check("compose 未回归(非空且以「。」结尾)",
67
+ isinstance(s, str) and s.endswith("。") and len(s) > 4, s[:60])
68
+
69
+ print("\ntest_cond_compose_anchors: %d 通过 / %d 失败" % (passed, failed))
70
+ return 0 if failed == 0 else 1
71
+
72
+
73
+ if __name__ == "__main__":
74
+ if hasattr(sys.stdout, "reconfigure"):
75
+ sys.stdout.reconfigure(encoding="utf-8")
76
+ sys.exit(main())