@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,128 @@
1
+ # -*- coding: utf-8 -*-
2
+ """issue #27 守卫:E041 身份识别(归一化 + 令牌凭据),非裸字符串相等。
3
+
4
+ 病灶(2026-09-23 外部报告,两方独立复现):E041「LLM 不得自己验证自己」
5
+ 的三处判据是裸 `==`(attest / link 准入门 / recalibrate)——`agent-A` 编译、
6
+ `agent-a` 验证即可绕过并落盘(报告实测 WRITTEN=6)。而代码声明宣称
7
+ 「结构级阻断,不依赖 prompt 自觉」。
8
+
9
+ 修复(分层,处置强度如实声明):
10
+ ①身份归一比较(_same_subject:casefold + 去空白 + 去尾部括号注记)
11
+ ——拦截报告表格全部同源变体(对旧实现能红);
12
+ ②verifier_token 凭据通路(mdcg 令牌 HMAC 验签,与 narrowed_principal
13
+ 同一信任源)——根本保障;令牌身份自证同样 E041;伪造令牌 fail-closed;
14
+ ③诚实降级标注——无令牌时 AttestResult.verifier_identity =
15
+ "self-reported",下游策略/审计可识别。
16
+ """
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 import ccgc, tokens
25
+
26
+ PASS = 0
27
+ FAIL = 0
28
+ FAILS = []
29
+
30
+
31
+ def check(name, cond, detail=""):
32
+ global PASS, FAIL
33
+ if cond:
34
+ PASS += 1
35
+ print(f" OK {name}")
36
+ else:
37
+ FAIL += 1
38
+ FAILS.append(name)
39
+ print(f" FAIL {name} {detail}")
40
+
41
+
42
+ def main():
43
+ # 令牌文件隔离(issue/verify 经 TOKEN_FILE_ENV 同源)
44
+ tf = tempfile.mkdtemp(prefix="mdcg_i27_tok_")
45
+ tokens.TOKEN_FILE_ENV and os.environ.setdefault(tokens.TOKEN_FILE_ENV
46
+ if isinstance(tokens.TOKEN_FILE_ENV, str)
47
+ else "MDCG_TOKEN_FILE",
48
+ os.path.join(tf, "tokens.json"))
49
+ tok_env = tokens.token_file()
50
+ os.environ[tokens.TOKEN_FILE_ENV] = tok_env
51
+
52
+ print("== X1 归一化:报告表格全形态拦截(attest 面,能红旧实现)==")
53
+ compiled = "agent-A"
54
+ variants = {
55
+ "完全相同(旧实现也拦)": "agent-A",
56
+ "小写(报告 BYPASS 形态)": "agent-a",
57
+ "全大写": "AGENT-A",
58
+ "括号注记后缀": "agent-A(复核)",
59
+ "夹空白": " agent - a ",
60
+ }
61
+ for label, ver in variants.items():
62
+ r = ccgc.attest("node_x", ccgc.ACCEPT, ver, compiled, ledger=False)
63
+ want = label != "完全相同(旧实现也拦)"
64
+ check(f"X1 {label} → E041{'(旧实现也拦,回归对照)' if not want else '(能红旧实现)'}",
65
+ (not r.ok) and r.error.startswith("E041"),
66
+ f"error={r.error[:80]}")
67
+ check("X1z 自报身份诚实标注(verifier_identity=self-reported)",
68
+ r.verifier_identity == "self-reported")
69
+
70
+ print("== X2 verifier_token 凭据通路(根本保障)==")
71
+ tk = tokens.issue("verifier", actor="external-reviewer",
72
+ path=tok_env)["token"]
73
+ r2 = ccgc.attest("node_x", ccgc.ACCEPT, "随便自报的字符串",
74
+ "agent-A", ledger=False, verifier_token=tk)
75
+ check("X2a 令牌身份覆盖自报(verifier=令牌 actor)",
76
+ r2.ok and r2.verifier == "external-reviewer"
77
+ and r2.verifier_identity == "token",
78
+ f"ok={r2.ok} verifier={r2.verifier} id={r2.verifier_identity}")
79
+ check("X2b 不同主体凭据放行(非自证)",
80
+ r2.ok is True)
81
+
82
+ print("== X3 令牌身份自证仍 E041(归一化形态)==")
83
+ tk_self = tokens.issue("verifier", actor="Agent-a",
84
+ path=tok_env)["token"]
85
+ r3 = ccgc.attest("node_x", ccgc.ACCEPT, "whoever",
86
+ "agent-A", ledger=False, verifier_token=tk_self)
87
+ check("X3 令牌 actor 与编译方归一同源 → E041",
88
+ (not r3.ok) and r3.error.startswith("E041"),
89
+ f"error={r3.error[:80]}")
90
+
91
+ print("== X4 伪造令牌 fail-closed ==")
92
+ r4 = ccgc.attest("node_x", ccgc.ACCEPT, "whoever",
93
+ "agent-A", ledger=False,
94
+ verifier_token="mdcg1.verifier.tk_fake.badsecretvalue")
95
+ check("X4 令牌验签失败 → 拒绝(不回落自报)",
96
+ (not r4.ok) and "E041" in r4.error and "令牌" in r4.error,
97
+ f"error={r4.error[:90]}")
98
+
99
+ print("== X5 link 准入门归一化(能红旧实现)==")
100
+ compiled_obj = ccgc.CompileResult(node_id="node_x", actor="agent-A")
101
+ compiled_obj.success = True
102
+ att_ok = ccgc.attest("node_x", ccgc.ACCEPT, "agent-a",
103
+ "agent-A", ledger=False)
104
+ # attest 已拦(attest.ok=False),模拟旧数据面:手构 ok 签章验证 link 门自身
105
+ att = ccgc.AttestResult(node_id="node_x", state=ccgc.ACCEPT,
106
+ verifier="agent-a", compiled_by="agent-A",
107
+ ok=True, token="t")
108
+ lr = ccgc.link(compiled_obj, att, apply=False, actor="agent-A")
109
+ check("X5 link 门大小写变体 → E041",
110
+ any(e.startswith("E041") for e in lr.errors),
111
+ f"errors={lr.errors[:2]}")
112
+
113
+ print("== X6 不同主体正常放行(不误杀)==")
114
+ att_ok2 = ccgc.attest("node_x", ccgc.ACCEPT, "external-reviewer",
115
+ "agent-A", ledger=False)
116
+ check("X6 真不同主体签章 ok(召回面不回归)",
117
+ att_ok2.ok and att_ok2.verifier_identity == "self-reported")
118
+
119
+ print()
120
+ if FAILS:
121
+ print(f"FAILED: {len(FAILS)} 项 → {', '.join(FAILS)}")
122
+ return 1
123
+ print(f"ALL OK: {PASS} 项(issue #27 E041 身份识别守卫全绿)")
124
+ return 0
125
+
126
+
127
+ if __name__ == "__main__":
128
+ sys.exit(main())
@@ -0,0 +1,122 @@
1
+ # -*- coding: utf-8 -*-
2
+ """issue #28 守卫:hotcache 生产路径挂载(读侧写侧已接、中间从未装上)。
3
+
4
+ 病灶(2026-09-23 外部报告):search_rrf 读 hotcache(mdcos:1195)、writepipe
5
+ 写后失效(writepipe:436),但全仓无任何 attach() 调用——生产 get(cg) 恒
6
+ None,重复 query 永远全量重扫。与 #25 同模式:读写两侧在、挂载点悬空。
7
+
8
+ 修复:MdCGOS.__init__ 按 MDCG_HOTCACHE=1 显式挂载(默认关零变更);
9
+ 容量 env 可配(MDCG_HOTCACHE_MAX_NODES/MAX_QUERIES)。
10
+
11
+ 断言:
12
+ H1 默认零变更(无 env → get 为 None,能红「无条件挂载」的过度修复);
13
+ H2 开关开启 → 生产类(MdCGSecure)get 非 None(能红旧实现);
14
+ H3 query 缓存命中(重复 query meta.cached=True + stats);
15
+ H4 写后失效联动(写入 → query 缓存全清,不返回陈旧结果);
16
+ H5 容量 env 生效(max_nodes 缩容 → LRU 淘汰按新上限)。
17
+ """
18
+ import json
19
+ import os
20
+ import sys
21
+ import tempfile
22
+
23
+ sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
24
+
25
+ from md_cg import hotcache
26
+ from md_cg.mdcos import MdCGSecure
27
+
28
+ PASS = 0
29
+ FAIL = 0
30
+ FAILS = []
31
+
32
+
33
+ def check(name, cond, detail=""):
34
+ global PASS, FAIL
35
+ if cond:
36
+ PASS += 1
37
+ print(f" OK {name}")
38
+ else:
39
+ FAIL += 1
40
+ FAILS.append(name)
41
+ print(f" FAIL {name} {detail}")
42
+
43
+
44
+ def _mk(root):
45
+ from md_cg.security import Principal
46
+ return MdCGSecure(root, principal=Principal(
47
+ actor="t_i28", clearance="secret", can_write=True,
48
+ role="designer", auth_mode="test"))
49
+
50
+
51
+ def main():
52
+ print("== H1 默认零变更 ==")
53
+ os.environ.pop("MDCG_HOTCACHE", None)
54
+ cg1 = _mk(tempfile.mkdtemp(prefix="mdcg_i28a_"))
55
+ check("H1 无 env → 不挂载(get=None;能红『无条件挂载』误修)",
56
+ hotcache.get(cg1) is None)
57
+
58
+ print("== H2 开关挂载(能红旧实现)==")
59
+ os.environ["MDCG_HOTCACHE"] = "1"
60
+ try:
61
+ cg2 = _mk(tempfile.mkdtemp(prefix="mdcg_i28b_"))
62
+ check("H2 生产类构造后 hotcache 已挂(旧实现恒 None)",
63
+ hotcache.get(cg2) is not None)
64
+ cg2.add("mem_h1", "# 功能名:热缓存探针\n# 正文:hotcache probe 内容",
65
+ layer="knowledge")
66
+
67
+ print("== H3 query 缓存命中 ==")
68
+ _r1, m1 = cg2.search_rrf("hotcache probe") if hasattr(
69
+ cg2, "search_rrf") else (None, {})
70
+ _r2, m2 = cg2.search_rrf("hotcache probe")
71
+ check("H3a 重复 query 命中缓存(meta.cached=True)",
72
+ m2.get("cached") is True,
73
+ json.dumps(m2, ensure_ascii=False, default=str)[:160])
74
+ st = hotcache.get(cg2).stats()
75
+ check("H3b 统计计数可见(query_hits>=1)",
76
+ st.get("query_hits", 0) >= 1, json.dumps(st))
77
+
78
+ print("== H4 写后失效联动(生产写入路径)==")
79
+ # 失效挂在 writepipe 的 after_trust(MCP op=write 路径)——库层直调
80
+ # cg.add 不经过该链(内部/测试场景),其失效缺口如实登记不在本断言。
81
+ from md_cg.mcp_server import _cg_dispatch
82
+ _w = _cg_dispatch(cg2, {"op": "write", "content_kind": "code",
83
+ "layer": "knowledge", "node_id": "mem_h2",
84
+ "content": "def h2():\n return 'hotcache new'\n"})
85
+ check("H4a 生产写入成功(失效触发前提)",
86
+ _w.get("committed") is True,
87
+ json.dumps(_w, ensure_ascii=False, default=str)[:160])
88
+ _r3, m3 = cg2.search_rrf("hotcache probe")
89
+ check("H4b 写入后 query 缓存全清(不返回陈旧结果)",
90
+ m3.get("cached") is not True,
91
+ json.dumps({k: m3.get(k) for k in ("cached", "tier")},
92
+ ensure_ascii=False))
93
+
94
+ print("== H5 容量 env 生效 ==")
95
+ os.environ["MDCG_HOTCACHE_MAX_NODES"] = "3"
96
+ cg3 = _mk(tempfile.mkdtemp(prefix="mdcg_i28c_"))
97
+ hc3 = hotcache.get(cg3)
98
+ check("H5a 容量 env 进入实例(max_nodes=3)",
99
+ hc3 is not None and hc3._max_nodes == 3,
100
+ f"max_nodes={getattr(hc3, '_max_nodes', None)}")
101
+ for i in range(6):
102
+ hc3.put_node(f"n{i}", {"layer": "knowledge"}, "")
103
+ _ = hc3.get_node(f"n{i}") # 反复摸 n0..n5 → n0/n1 应被挤出
104
+ check("H5b LRU 按新上限淘汰(size==3,最旧两节点不在)",
105
+ len(hc3._nodes) == 3
106
+ and hotcache.get(cg3).get_node("n0") is None
107
+ and hotcache.get(cg3).get_node("n5") is not None,
108
+ f"size={len(hc3._nodes)}")
109
+ finally:
110
+ os.environ.pop("MDCG_HOTCACHE", None)
111
+ os.environ.pop("MDCG_HOTCACHE_MAX_NODES", None)
112
+
113
+ print()
114
+ if FAILS:
115
+ print(f"FAILED: {len(FAILS)} 项 → {', '.join(FAILS)}")
116
+ return 1
117
+ print(f"ALL OK: {PASS} 项(issue #28 热缓存生产路径守卫全绿)")
118
+ return 0
119
+
120
+
121
+ if __name__ == "__main__":
122
+ sys.exit(main())
@@ -0,0 +1,218 @@
1
+ # -*- coding: utf-8 -*-
2
+ """issue #32 守卫:query 缓存的**口径键**必须覆盖进程级开关(env)。
3
+
4
+ 病灶(2026-09-24 审查复现):v14 缺陷 C 修的是**参数面**(include_work /
5
+ roles / paths / fusion / judge_ranking / …),但还有一类口径来自**环境变量**
6
+ ——MDCG_SEMANTIC / MDCG_EN_ATOMS / MDCG_UNIFY_QUERY。它们不入键时,同一 query
7
+ 在切换开关后会命中**另一口径**的缓存(cached=True + 陈旧结果),表现为静默
8
+ 错答:先按 MDCG_SEMANTIC=1 查一次写缓存,再关掉语义路重查,拿到的仍是
9
+ 「语义路开启时」的排序。
10
+
11
+ 修法(本件守门):`hotcache._KEYED_EXTRA` 增列 `env_switch`,
12
+ 调用方 `mdcos.search_rrf` 以 `hotcache.env_switch_key()` 填该键——开关一变
13
+ 键就变,缓存自然不命中;同一口径内缓存收益不变。
14
+
15
+ 断言(含能红旧实现的两条):
16
+ K1 _KEYED_EXTRA 登记 env_switch(清单真源,防漏登)
17
+ K2 env_switch_key() 随开关取值变化(未设 = None 也进键)
18
+ K3 semantic=1 首查:gold 经语义资格路命中(非缓存)
19
+ K4 切到 semantic=0 后同 query **不命中**旧口径缓存(旧实现这里 cached=True)
20
+ K5 切开关后的结果 == 关缓存重算的结果(无跨口径串味)
21
+ K6 同口径重复查仍命中缓存(修完不许把缓存打废)
22
+
23
+ 运行:python -m md_cg.test_i32_hotcache_env_key
24
+ """
25
+ import json
26
+ import os
27
+ import shutil
28
+ import sys
29
+ import tempfile
30
+
31
+ sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
32
+
33
+ from md_cg import eval_common as ec # noqa: E402
34
+ from md_cg import hotcache, mdcos # noqa: E402
35
+
36
+ PASS = FAIL = 0
37
+ FAILS = []
38
+
39
+
40
+ def check(name, cond, detail=""):
41
+ global PASS, FAIL
42
+ if cond:
43
+ PASS += 1
44
+ print(f" OK {name}")
45
+ else:
46
+ FAIL += 1
47
+ FAILS.append(name)
48
+ print(f" FAIL {name} {detail}")
49
+
50
+
51
+ def _mk(root):
52
+ from md_cg.mdcos import MdCGOS
53
+ return MdCGOS(root, autoflush=500)
54
+
55
+
56
+ def _query(cg, q="horse meat"):
57
+ res, meta = cg.search_rrf(q, k=5, paths=("lexical",), judge=False,
58
+ record=False)
59
+ return [r[0]["id"] for r in res], res, meta
60
+
61
+
62
+ def main():
63
+ ec.unlock_global_cap()
64
+ ec.use_jaccard()
65
+
66
+ print("== K1/K2 清单真源与键值 ==")
67
+ check("K1 _KEYED_EXTRA 登记 env_switch",
68
+ "env_switch" in hotcache._KEYED_EXTRA, str(hotcache._KEYED_EXTRA))
69
+ os.environ.pop("MDCG_SEMANTIC", None)
70
+ before = hotcache.env_switch_key()
71
+ os.environ["MDCG_SEMANTIC"] = "1"
72
+ after = hotcache.env_switch_key()
73
+ os.environ.pop("MDCG_SEMANTIC", None)
74
+ check("K2 env_switch_key() 随开关变化(未设=None 也进键)",
75
+ before != after and any(v is None for _k, v in before),
76
+ f"{before} vs {after}")
77
+
78
+ tmp = tempfile.mkdtemp(prefix="mdcg_i32_")
79
+ try:
80
+ rooth = os.path.join(tmp, "hot")
81
+ rootn = os.path.join(tmp, "nocache")
82
+ for root in (rooth, rootn):
83
+ cg = _mk(root)
84
+ # gold 只有 fm.semantic(「马 肉」)能对上英文 query;正文是中文,
85
+ # 归一路关闭时词法零交集 → 语义路开关是唯二变量(另一个是归一层)。
86
+ cg.add("gold", "今天午饭吃了马肉,味道不错,下次还做。",
87
+ layer="knowledge", semantic="马 肉", verification_basis="data")
88
+ cg.add("d1", "下午去市场买了马,价格比昨天便宜一些。",
89
+ layer="knowledge", verification_basis="data")
90
+ cg.flush()
91
+ cg.close()
92
+
93
+ print("== K3~K6 跨口径缓存(MDCG_HOTCACHE=1,归一层关闭以隔离变量)==")
94
+ os.environ["MDCG_HOTCACHE"] = "1"
95
+ os.environ["MDCG_UNIFY_QUERY"] = "0"
96
+ cg = _mk(rooth)
97
+ try:
98
+ os.environ["MDCG_SEMANTIC"] = "1"
99
+ ids_sem, _r, m_sem = _query(cg)
100
+ check("K3 semantic=1 首查:gold 命中且非缓存",
101
+ bool(ids_sem) and ids_sem[0] == "gold"
102
+ and m_sem.get("cached") is not True,
103
+ f"{ids_sem} cached={m_sem.get('cached')}")
104
+
105
+ os.environ.pop("MDCG_SEMANTIC", None)
106
+ ids_off, _r2, m_off = _query(cg)
107
+ check("K4 切开关后不命中旧口径缓存(旧实现 cached=True)",
108
+ m_off.get("cached") is not True,
109
+ f"cached={m_off.get('cached')} ids={ids_off}")
110
+ check("K5 切开关后结果与 semantic=1 不同(无跨口径串味)",
111
+ ids_off != ids_sem,
112
+ f"sem={ids_sem} / off={ids_off}")
113
+
114
+ _ids3, _r3, m3 = _query(cg)
115
+ check("K6 同口径重复查仍命中缓存(缓存未被打废)",
116
+ m3.get("cached") is True, json.dumps(m3, default=str)[:160])
117
+ finally:
118
+ cg.close()
119
+ os.environ.pop("MDCG_SEMANTIC", None)
120
+
121
+ # 旁路对照:不挂热缓存重算 semantic=0 的结果必须与 K5 一致
122
+ os.environ.pop("MDCG_HOTCACHE", None)
123
+ cg2 = _mk(rootn)
124
+ try:
125
+ ids_plain, _r4, _m4 = _query(cg2)
126
+ finally:
127
+ cg2.close()
128
+ os.environ.pop("MDCG_UNIFY_QUERY", None)
129
+ check("K5b 与旁路(无缓存)重算结果一致",
130
+ ids_plain == ids_off, f"cached={ids_off} plain={ids_plain}")
131
+
132
+ # ---- v9 N78:MDCG_CN_GRAMS 漏登(中文 2-gram 召回开关)----
133
+ # 病灶同构:mdcg.py cn_recall_grams 每调用读 env(="0" 即回退旧行为),
134
+ # 改变 expand_query_terms 召回词集,但 _ENV_SWITCHES 没登记它 →
135
+ # 翻转后同 query 命中另一口径缓存(cached=True + 旧口径召回结果)。
136
+ print("== K7~K10 MDCG_CN_GRAMS 入键(v9 N78)==")
137
+ check("K7 MDCG_CN_GRAMS 登记在 _ENV_SWITCHES(清单真源,新增一个登记一个)",
138
+ "MDCG_CN_GRAMS" in hotcache._ENV_SWITCHES,
139
+ str(hotcache._ENV_SWITCHES))
140
+ os.environ.pop("MDCG_CN_GRAMS", None)
141
+ bg = hotcache.env_switch_key()
142
+ os.environ["MDCG_CN_GRAMS"] = "0"
143
+ ag = hotcache.env_switch_key()
144
+ os.environ.pop("MDCG_CN_GRAMS", None)
145
+ check("K8 env_switch_key() 随 MDCG_CN_GRAMS 变化(未设=None 也进键)",
146
+ bg != ag, f"{bg} vs {ag}")
147
+
148
+ rootg = os.path.join(tmp, "cgrams")
149
+ rootg2 = os.path.join(tmp, "cgrams_plain")
150
+ for root in (rootg, rootg2):
151
+ cgx = _mk(root)
152
+ # gold 正文含「抑制/制剂」2-gram 但不含整句——grams 开=经 bigram
153
+ # 召回命中;grams 关=只剩整句召回词 → 词法零命中(口径差可观测)。
154
+ cgx.add("gold", "酪氨酸激酶抑制剂用于白血病靶向治疗,需遵医嘱。",
155
+ layer="knowledge", verification_basis="data")
156
+ cgx.add("d1", "下午去市场买了马,价格比昨天便宜一些。",
157
+ layer="knowledge", verification_basis="data")
158
+ cgx.flush()
159
+ cgx.close()
160
+
161
+ def _q_cn(cg):
162
+ res, meta = cg.search_rrf("抑制剂怎么选", k=5, paths=("lexical",),
163
+ judge=False, record=False)
164
+ return [r[0]["id"] for r in res], meta
165
+
166
+ os.environ["MDCG_HOTCACHE"] = "1"
167
+ os.environ["MDCG_UNIFY_QUERY"] = "0"
168
+ os.environ.pop("MDCG_CN_GRAMS", None) # 缺省=grams 开
169
+ cg3 = _mk(rootg)
170
+ try:
171
+ ids_on, m_on = _q_cn(cg3)
172
+ check("K9a grams 开首查:gold 经 2-gram 召回命中且非缓存",
173
+ "gold" in ids_on and m_on.get("cached") is not True,
174
+ f"{ids_on} cached={m_on.get('cached')}")
175
+ os.environ["MDCG_CN_GRAMS"] = "0" # 运行期翻转(关 grams)
176
+ ids_offg, m_offg = _q_cn(cg3)
177
+ check("K9b 翻转后不命中旧口径缓存(旧实现 cached=True 静默错答)",
178
+ m_offg.get("cached") is not True,
179
+ f"cached={m_offg.get('cached')} ids={ids_offg}")
180
+ check("K9c 翻转后结果与 grams 开不同(无跨口径串味)",
181
+ ids_offg != ids_on, f"on={ids_on} / off={ids_offg}")
182
+ _ids3g, m3g = _q_cn(cg3)
183
+ check("K10 同口径重复查仍命中缓存(缓存未被打废)",
184
+ m3g.get("cached") is True
185
+ and _ids3g == ids_offg, json.dumps(m3g, default=str)[:160])
186
+ finally:
187
+ cg3.close()
188
+ os.environ.pop("MDCG_CN_GRAMS", None)
189
+
190
+ # 旁路对照:无缓存重算 grams=0 的结果必须与 K9c 一致
191
+ os.environ.pop("MDCG_HOTCACHE", None)
192
+ os.environ["MDCG_CN_GRAMS"] = "0"
193
+ cg4 = _mk(rootg2)
194
+ try:
195
+ ids_plain_g, _mg = _q_cn(cg4)
196
+ finally:
197
+ cg4.close()
198
+ os.environ.pop("MDCG_CN_GRAMS", None)
199
+ os.environ.pop("MDCG_UNIFY_QUERY", None)
200
+ check("K10b 与旁路(无缓存)重算结果一致",
201
+ ids_plain_g == ids_offg, f"cached={ids_offg} plain={ids_plain_g}")
202
+ finally:
203
+ for k in ("MDCG_HOTCACHE", "MDCG_SEMANTIC", "MDCG_UNIFY_QUERY",
204
+ "MDCG_CN_GRAMS"):
205
+ os.environ.pop(k, None)
206
+ shutil.rmtree(tmp, ignore_errors=True)
207
+
208
+ print("\n" + "=" * 64)
209
+ print(f"PASS={PASS} FAIL={FAIL}")
210
+ if FAILS:
211
+ print("失败项:" + ";".join(FAILS))
212
+ return 0 if FAIL == 0 else 1
213
+
214
+
215
+ if __name__ == "__main__":
216
+ if hasattr(sys.stdout, "reconfigure"):
217
+ sys.stdout.reconfigure(encoding="utf-8")
218
+ sys.exit(main())
@@ -1,10 +1,11 @@
1
1
  # -*- coding: utf-8 -*-
2
- """test_identity_attribution · 写入归属(writer/session/harness)与检索会话过滤
2
+ """test_identity_attribution · 写入归属(writer/session/harness)与会话可见性
3
3
 
4
4
  背景:多会话共用一个 root 时,读取记忆无法区分「本会话写的」与「其他会话写的」。
5
- 修复:写入自动归属(MdCGSecure 写路径注入 writer/session/harness)+ 检索
6
- session= 过滤(_candidates 一处生效:search/search_rrf/recall 全链路)+
7
- 审计/提案入队补 session + MDCG_SESSION env(部署侧固定会话归属)。
5
+ 修复:写入自动归属(MdCGSecure 写路径注入 writer/session/harness)+ 会话可见性
6
+ **分档判定**(issue #35 定稿:public/internal = 跨会话共享档;private/secret =
7
+ 绑定档,仅归属会话可见,设计者豁免;查询侧 session 参数只作归因过滤、不构成
8
+ 授权豁免)+ 审计/提案入队补 session + MDCG_SESSION env(部署侧固定会话归属)。
8
9
  边界:归属是归因维度不参与授权;MCP 面不透传写入归属入参(客户端不得伪造),
9
10
  库层调用方可显式覆盖(setdefault);writer 语义=最后写入者。
10
11
  """
@@ -96,17 +97,72 @@ try:
96
97
  bool(hit) and (hit.get("frontmatter") or {}).get("session") == "sess_B",
97
98
  [_row(r).get("id") for r in res])
98
99
 
99
- # ⑥ search 会话过滤
100
+ # ⑥⑦ 会话语义(issue #35 定稿:**分档**判定,查询参数不构成豁免)
101
+ # · 共享档(public/internal)跨会话可见——n1/n2 都是 internal,故传任何
102
+ # session(他人会话 / "*" / 缺省)都应看得见;旧断言「按 session 过滤掉」
103
+ # 编码的是 #35 之前的契约(同口径见 test_p47_session_view 的 D1a/D2/D3)。
104
+ # · 绑定档(private/secret)仅归属会话——由 principal.session 判定,查询侧
105
+ # 自报的 session 不越权;can_admin(设计者)整体判断豁免。
100
106
  res_b, _ = cg2.search("知识", session="sess_B")
101
107
  ids_b = {_row(r).get("id") for r in res_b}
102
- check("⑥search 会话过滤", "n1" in ids_b and "n2" not in ids_b, ids_b)
103
-
104
- # ⑦ recall 会话过滤(RRF 主链)
105
- pack = cg2.recall("知识", session="sess_custom")
106
- hits = pack.get("pack") if isinstance(pack, dict) else None
107
- hid = {_row(h).get("id") for h in (hits or [])}
108
- check("⑦recall 会话过滤", "n2" in hid and "n1" not in hid,
109
- list(hid) or (list(pack.keys()) if isinstance(pack, dict) else type(pack)))
108
+ check("⑥a 共享档跨会话可见:显式 session 不缩小可见性",
109
+ "n1" in ids_b and "n2" in ids_b, ids_b)
110
+
111
+ # ⑥b~⑦ 绑定档对照(private 节点归 sess_B):
112
+ # · 跨身份(另一 actor/会话)不可见;
113
+ # · **同身份换会话**:非设计者不可见(绑定档生效);
114
+ # · **同身份换会话 + can_admin**:豁免可见(设计者整体判断)。
115
+ # 注:豁免的是「会话绑定判定」,不越过加密身份——private 内容按
116
+ # (tenant, actor) 派生 DEK,跨 actor 即便判定可见也解不开(get 无正文),
117
+ # 故可见性对照必须在同一 actor 内做。
118
+ w_priv = MdCGSecure(root, principal=Principal(
119
+ actor="bob", clearance="private", can_write=True, can_admin=False,
120
+ role="recorder", session="sess_B"))
121
+ try:
122
+ w_priv.add("n_priv_b", "乙会话私有知识条目", layer="knowledge",
123
+ sensitivity="private")
124
+ w_priv.flush()
125
+ finally:
126
+ w_priv.close()
127
+ carol = MdCGSecure(root, principal=Principal(
128
+ actor="carol", clearance="private", can_write=False, can_admin=False,
129
+ role="recorder", session="sess_C"))
130
+ try:
131
+ res_c, _ = carol.search("私有知识", session="sess_B") # 自报他人会话
132
+ ids_c = {_row(r).get("id") for r in res_c}
133
+ check("⑥b 绑定档按身份判定:自报他人会话不越权",
134
+ "n_priv_b" not in ids_c, ids_c)
135
+ finally:
136
+ carol.close()
137
+ bob_other = MdCGSecure(root, principal=Principal(
138
+ actor="bob", clearance="private", can_write=False, can_admin=False,
139
+ role="recorder", session="sess_OTHER"))
140
+ try:
141
+ res_o, _ = bob_other.search("私有知识")
142
+ check("⑥c 同一身份换会话:非设计者仍受绑定档约束",
143
+ "n_priv_b" not in {_row(r).get("id") for r in res_o},
144
+ [_row(r).get("id") for r in res_o])
145
+ finally:
146
+ bob_other.close()
147
+ bob_admin = MdCGSecure(root, principal=Principal(
148
+ actor="bob", clearance="private", can_write=False, can_admin=True,
149
+ role="designer", session="sess_OTHER"))
150
+ try:
151
+ res_d, _ = bob_admin.search("私有知识", session="sess_C")
152
+ check("⑥d 同一身份 + 设计者(can_admin):豁免绑定档",
153
+ "n_priv_b" in {_row(r).get("id") for r in res_d},
154
+ [_row(r).get("id") for r in res_d])
155
+
156
+ # ⑦ recall(RRF 主链)同口径:绑定档判定不因查询 session 变化
157
+ pack = bob_admin.recall("私有知识", session="sess_custom")
158
+ hits = pack.get("pack") if isinstance(pack, dict) else None
159
+ hid = {_row(h).get("id") for h in (hits or [])}
160
+ check("⑦recall 同口径:设计者可见绑定档(查询 session 不改判定)",
161
+ "n_priv_b" in hid,
162
+ list(hid) or (list(pack.keys()) if isinstance(pack, dict)
163
+ else type(pack)))
164
+ finally:
165
+ bob_admin.close()
110
166
 
111
167
  # ⑧ 审计带 session
112
168
  last_audit = _last_jsonl(os.path.join(root, "**", "*audit*.jsonl"))
@@ -120,17 +176,42 @@ try:
120
176
  bool(rec_inbox) and rec_inbox.get("session") == "sess_B", rec_inbox)
121
177
 
122
178
  # ⑩ 旧节点兼容(基类写入、无归属字段)
179
+ # · 共享档:跨会话可见(#35 定稿);
180
+ # · 绑定档但无归属:无法证明归属 → fail-closed,仅设计者(can_admin)可见。
123
181
  cg0 = MdCG(root)
124
182
  cg0.add("legacy", "旧库无归属节点的知识", layer="knowledge")
183
+ cg0.add("legacy_priv", "旧库无归属的私有知识条目", layer="knowledge",
184
+ sensitivity="private")
125
185
  cgs = MdCGSecure(root, principal=_p("carol", "sess_C"))
126
186
  res_all, _m = cgs.search("旧库无归属")
127
187
  check("⑩旧节点默认检索不受影响",
128
188
  any(_row(r).get("id") == "legacy" for r in res_all),
129
189
  [_row(r).get("id") for r in res_all])
130
190
  res_f, _ = cgs.search("旧库无归属", session="sess_C")
131
- check("⑩b 旧节点被会话过滤排除(不炸)",
132
- all(_row(r).get("id") != "legacy" for r in res_f),
191
+ check("⑩b 旧节点(无归属·共享档)跨会话可见(不炸)",
192
+ any(_row(r).get("id") == "legacy" for r in res_f),
133
193
  [_row(r).get("id") for r in res_f])
194
+ # ⑩c/⑩d 绑定档无归属的 fail-closed(同 clearance 的非设计者不可读 / 设计者豁免)
195
+ peak = MdCGSecure(root, principal=Principal(
196
+ actor="erin", clearance="private", can_write=False, can_admin=False,
197
+ role="recorder", session="sess_E"))
198
+ try:
199
+ res_p, _ = peak.search("旧库无归属")
200
+ ids_p = [_row(r).get("id") for r in res_p]
201
+ check("⑩c 绑定档无归属 fail-closed(同 clearance 非设计者不可读)",
202
+ "legacy_priv" not in ids_p and "legacy" in ids_p, ids_p)
203
+ finally:
204
+ peak.close()
205
+ lim = MdCGSecure(root, principal=Principal(
206
+ actor="dave2", clearance="private", can_write=True, can_admin=True,
207
+ role="designer", session="sess_D"))
208
+ try:
209
+ res_l, _ = lim.search("旧库无归属")
210
+ check("⑩d 设计者可见无归属绑定档(整体判断豁免)",
211
+ "legacy_priv" in [_row(r).get("id") for r in res_l],
212
+ [_row(r).get("id") for r in res_l])
213
+ finally:
214
+ lim.close()
134
215
 
135
216
  # ⑪⑫ 负记忆归属
136
217
  rn = cg2.add_rejected("假设X", "已被证伪")
@@ -138,8 +138,20 @@ def main():
138
138
  "from md_cg.mdcg import _LIVE_CGS\n"
139
139
  "_LIVE_CGS.clear()\n")
140
140
  check("反证子进程正常退出", r.returncode == 0, (r.stderr or "")[:200])
141
- check("反证:索引不可见(缺陷可复现,证明兜底是有效变量)",
142
- not _visible(root_b, "n_nohook"))
141
+ # issue #33(close 自动落快照 + 盘面指纹校验)后,「无 flush 退出 →
142
+ # 索引不可见」的原缺陷被修得更彻底:节点文件已落盘、目录 mtime 已
143
+ # 变 → 新进程 _load_index 指纹校验失败 → 回退全库扫描 → 节点**仍
144
+ # 可见**(可见性由盘面兜底接管,原「不可见」反证前提失效)。
145
+ # atexit 兜底的有效变量改为「增量日志是否落账」:摘掉 atexit →
146
+ # 子进程无 flush → 增量日志零记录(若【①】的兜底是空转,这里会
147
+ # 出现记录)——反证组据此继续防测试空转。
148
+ check("反证:可见性由盘面指纹兜底接管(原缺陷不可复现=修复增强)",
149
+ _visible(root_b, "n_nohook"))
150
+ log_dir = os.path.join(root_b, "_index_log")
151
+ n_log = (sum(1 for fn in os.listdir(log_dir) if fn.endswith(".log"))
152
+ if os.path.isdir(log_dir) else 0)
153
+ check("反证:增量日志零记录(atexit flush 是有效变量,防【①】空转)",
154
+ n_log == 0, f"log_files={n_log}")
143
155
 
144
156
  # ---------------- ③ 显式 close 对照(原有正路不回归) ----------------
145
157
  print("\n【③】显式收尾对照:close() 仍是正路")
@@ -192,8 +204,10 @@ def main():
192
204
  pid_e = ose.propose("n_cli", mk("CLI 裁决节点", "问 CLI",
193
205
  "review_cli 落盘的目标节点"))
194
206
  ose.close()
207
+ # 入口为**包内**模块(`python -m md_cg.review_cli`):出货包不含 scripts/,
208
+ # 旧写法 `scripts/review_cli.py` 在安装态必 FileNotFoundError(2026-09-24 修复)。
195
209
  r = subprocess.run(
196
- [sys.executable, os.path.join(REPO, "scripts", "review_cli.py"),
210
+ [sys.executable, "-m", "md_cg.review_cli",
197
211
  "accept", pid_e, "--root", root_e, "--reason", "端到端守卫测试"],
198
212
  capture_output=True, text=True, encoding="utf-8", errors="replace",
199
213
  env=_child_env(), cwd=REPO)