@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,205 @@
1
+ # -*- coding: utf-8 -*-
2
+ """N123 攻击复现守卫:derive 子令牌 TTL 无上限夹紧 + 过期不沿派生链传播。
3
+
4
+ 缺陷(v15 留档 + 引擎域/检索域复测三度成立):
5
+ ① derive() 子令牌 expires_at=(now+ttl) 不与父 expires_at 取 min——
6
+ 父 ttl=0.5s、子 ttl=999999 时子比父多活 11.5 天;
7
+ ② verify_token 只查自身记录 expires_at——父令牌过期后子令牌仍以原密级通过。
8
+ 攻击面:持 delegable designer 令牌面(宿主进程/提示注入驱动 derive)先派生
9
+ 长 TTL 子令牌再令父令牌自然到期——授权回收被时间维度旁路(revoke 有级联
10
+ tokens.py:523-526,唯过期没有,「派生只能收窄」缺时间维度)。
11
+
12
+ 修复方向:子 expires_at=min(请求值, 父 expires_at)(父无界取请求值)
13
+ + verify_token 沿 parent 链传播过期校验(防环;父记录缺失告警不阻断)。
14
+
15
+ 运行:python -m md_cg.test_n123_derive_expiry_chain
16
+ 纪律:全程 MDCG_TOKEN_FILE / path= 指向系统临时目录哑令牌文件,不触真实令牌库。
17
+ """
18
+ from __future__ import annotations
19
+
20
+ import json
21
+ import os
22
+ import shutil
23
+ import sys
24
+ import tempfile
25
+ import time
26
+
27
+ from . import tokens
28
+ from .tokens import TOKEN_FILE_ENV, TokenError
29
+
30
+ PASS = FAIL = 0
31
+ FAILS = []
32
+
33
+
34
+ def check(name, cond, detail=""):
35
+ global PASS, FAIL
36
+ if cond:
37
+ PASS += 1
38
+ print(f" [PASS] {name}" + (f" · {detail}" if detail else ""))
39
+ else:
40
+ FAIL += 1
41
+ FAILS.append(name)
42
+ print(f" [FAIL] {name} · {detail}")
43
+
44
+
45
+ def denied(fn, *a, **kw):
46
+ """执行 fn,返回 (是否被拒, 错误文本)。"""
47
+ try:
48
+ fn(*a, **kw)
49
+ return False, ""
50
+ except TokenError as e:
51
+ return True, str(e)
52
+
53
+
54
+ def main():
55
+ sys.stdout.reconfigure(encoding="utf-8", errors="replace")
56
+ root = tempfile.mkdtemp(prefix="mdcg_n123_")
57
+ tf = os.path.join(root, "_tokens.json")
58
+ # 哑环境兜底:即使代码内部遗漏 path= 也绝不回落到真实 ~/.mdcg 令牌库
59
+ old_env = os.environ.get(TOKEN_FILE_ENV)
60
+ os.environ[TOKEN_FILE_ENV] = tf
61
+ try:
62
+ # ========== 攻击复现 ①:derive 长 TTL 子令牌不被父界夹紧 ==========
63
+ print("\n[1] derive 夹紧:子 expires_at = min(请求值, 父 expires_at)")
64
+ d = tokens.issue("designer", actor="n123-designer", ttl=3600.0, path=tf)
65
+ child = tokens.derive(d["token"], "record", actor="n123-child",
66
+ ttl=999999.0, path=tf)
67
+ dexp = d["expires_at"]
68
+ cexp = child["expires_at"]
69
+ check("子令牌过期时间不超过父令牌", cexp is not None and dexp is not None
70
+ and float(cexp) <= float(dexp) + 1e-6,
71
+ f"child-parent={float(cexp) - float(dexp):.1f}s(旧代码 +999639s)")
72
+ check("夹紧开口 clamped 标注 expires_at",
73
+ "expires_at" in (child.get("clamped") or []),
74
+ f"clamped={child.get('clamped')}")
75
+
76
+ # ========== 攻击复现 ②:父过期后子令牌沿链拒验(免 sleep:手工置父已过期) ==========
77
+ print("\n[2] verify 沿链传播:父记录过期 → 子令牌拒绝")
78
+ data = json.load(open(tf, encoding="utf-8"))
79
+ data["tokens"][d["token_id"]]["expires_at"] = time.time() - 1.0
80
+ with open(tf, "w", encoding="utf-8") as f:
81
+ json.dump(data, f, ensure_ascii=False)
82
+ ok_p, why_p = denied(tokens.verify_token, d["token"], path=tf)
83
+ ok_c, why_c = denied(tokens.verify_token, child["token"], path=tf)
84
+ check("父令牌过期被拒(基线,旧代码即拦)", ok_p, why_p[:60])
85
+ check("父过期后子令牌沿链拒验(N123 核心断言)", ok_c, why_c[:60])
86
+
87
+ # ========== 攻击复现 ③:真实自然到期端到端 ==========
88
+ print("\n[3] 端到端:父 ttl=0.4 自然到期 → 长 TTL 子令牌(ttl=999999)失效")
89
+ d3 = tokens.issue("designer", actor="n123-e2e", ttl=0.4, path=tf)
90
+ c3 = tokens.derive(d3["token"], "record", actor="n123-e2e-child",
91
+ ttl=999999.0, path=tf)
92
+ check("派生时子界已被父夹紧",
93
+ float(c3["expires_at"]) <= float(d3["expires_at"]) + 1e-6,
94
+ f"child={c3['expires_at']:.1f} parent={d3['expires_at']:.1f}")
95
+ time.sleep(0.7)
96
+ ok_p3, why_p3 = denied(tokens.verify_token, d3["token"], path=tf)
97
+ ok_c3, why_c3 = denied(tokens.verify_token, c3["token"], path=tf)
98
+ check("父自然到期被拒", ok_p3, why_p3[:60])
99
+ check("子令牌随父到期失效(修复前:verify OK 继续用)", ok_c3, why_c3[:60])
100
+
101
+ # ========== 正向 ④:父无界时取请求值(不误夹成无界/不过度收窄) ==========
102
+ print("\n[4] 父无界:子 TTL 取请求值")
103
+ d4 = tokens.issue("designer", actor="n123-bounded", path=tf) # 无 ttl
104
+ check("父无界 expires_at=None", d4["expires_at"] is None)
105
+ c4 = tokens.derive(d4["token"], "record", actor="n123-bounded-child",
106
+ ttl=60.0, path=tf)
107
+ now = time.time()
108
+ check("父无界时子 expires_at=now+60(取请求值)",
109
+ c4["expires_at"] is not None
110
+ and 58.0 <= float(c4["expires_at"]) - now <= 62.0,
111
+ f"delta={float(c4['expires_at']) - now:.1f}s")
112
+ check("父无界夹紧不开口",
113
+ "expires_at" not in (c4.get("clamped") or []),
114
+ f"clamped={c4.get('clamped')}")
115
+ # 子短于父:取请求值不延长
116
+ c4b = tokens.derive(d4["token"], "record", actor="n123-short", ttl=1.0,
117
+ path=tf)
118
+ check("子短于父取请求值", c4b["expires_at"] is not None
119
+ and float(c4b["expires_at"]) - now <= 2.0)
120
+ # 子无 ttl:沿用父(旧行为保持——父无界即无界)
121
+ c4c = tokens.derive(d4["token"], "record", actor="n123-inherit", path=tf)
122
+ check("子未指定 ttl 沿用父界(无界父→无界子)",
123
+ c4c["expires_at"] is None, f"expires_at={c4c['expires_at']}")
124
+
125
+ # ========== 正向 ⑤:子自身先到期仍按自身拒(不因沿链放宽) ==========
126
+ print("\n[5] 子自身过期仍拦截")
127
+ d5 = tokens.issue("designer", actor="n123-self", ttl=3600.0, path=tf)
128
+ c5 = tokens.derive(d5["token"], "record", actor="n123-self-child",
129
+ ttl=0.05, path=tf)
130
+ time.sleep(0.15)
131
+ ok_c5, why_c5 = denied(tokens.verify_token, c5["token"], path=tf)
132
+ ok_d5, _ = denied(tokens.verify_token, d5["token"], path=tf)
133
+ check("子自身先到期被拒", ok_c5 and not ok_d5, why_c5[:60])
134
+
135
+ # ========== 加固 ⑥:存量库三层链 + 防环 ==========
136
+ print("\n[6] 存量库三层链传播 + parent 环防护")
137
+ # 三层链:gp(无界)→ p(已过期)→ gc;修复前 verify(gc) 只看自身 → OK
138
+ d6 = tokens.issue("designer", actor="n123-gp", path=tf)
139
+ p6 = tokens.derive(d6["token"], "orchestr", actor="n123-p", path=tf)
140
+ # 手工构造第三层(正常 derive 封口 delegable=False,模拟存量库/手工库)
141
+ data6 = json.load(open(tf, encoding="utf-8"))
142
+ prec = data6["tokens"][p6["token_id"]]
143
+ gc_id = "tk_n123gc01"
144
+ data6["tokens"][gc_id] = dict(prec, role="record", actor="n123-gc",
145
+ delegable=False, parent=p6["token_id"],
146
+ expires_at=time.time() + 999999.0)
147
+ data6["tokens"][p6["token_id"]]["expires_at"] = time.time() - 1.0
148
+ with open(tf, "w", encoding="utf-8") as f:
149
+ json.dump(data6, f, ensure_ascii=False)
150
+ gc_token = tokens.make_token("record", gc_id, "x" * 43)
151
+ # 摘要需匹配:直接改库中 hash
152
+ data6 = json.load(open(tf, encoding="utf-8"))
153
+ data6["tokens"][gc_id]["hash"] = tokens._hash("x" * 43)
154
+ with open(tf, "w", encoding="utf-8") as f:
155
+ json.dump(data6, f, ensure_ascii=False)
156
+ t0 = time.monotonic()
157
+ ok_gc, why_gc = denied(tokens.verify_token, gc_token, path=tf)
158
+ cost = time.monotonic() - t0
159
+ check("中间层过期 → 孙令牌沿链拒验", ok_gc, why_gc[:60])
160
+ check("沿链校验无死循环(<2s)", cost < 2.0, f"{cost:.3f}s")
161
+ # 防环:A.parent=B 且 B.parent=A,均未过期 → 应通过且不挂
162
+ data6 = json.load(open(tf, encoding="utf-8"))
163
+ a_id, b_id = "tk_n123loopA", "tk_n123loopB"
164
+ data6["tokens"][a_id] = {"role": "designer", "actor": "loop-a",
165
+ "tenant": "default", "clearance": "secret",
166
+ "can_write": True, "can_admin": True,
167
+ "layers_allow": ["*"], "ops_allow": ["*"],
168
+ "delegable": False, "parent": b_id,
169
+ "issued_by": "loop", "issued_at": now,
170
+ "expires_at": None, "revoked_at": None,
171
+ "label": "", "hash": tokens._hash("la" * 16)}
172
+ data6["tokens"][b_id] = {"role": "record", "actor": "loop-b",
173
+ "tenant": "default", "clearance": "internal",
174
+ "can_write": True, "can_admin": False,
175
+ "layers_allow": None, "ops_allow": None,
176
+ "delegable": False, "parent": a_id,
177
+ "issued_by": "loop", "issued_at": now,
178
+ "expires_at": None, "revoked_at": None,
179
+ "label": "", "hash": tokens._hash("lb" * 16)}
180
+ with open(tf, "w", encoding="utf-8") as f:
181
+ json.dump(data6, f, ensure_ascii=False)
182
+ t0 = time.monotonic()
183
+ try:
184
+ tokens.verify_token(tokens.make_token("designer", a_id, "la" * 16),
185
+ path=tf)
186
+ loop_ok = True
187
+ except TokenError:
188
+ loop_ok = True # 拒绝也可(fail-closed),关键是不挂
189
+ cost = time.monotonic() - t0
190
+ check("parent 环不挂死(防环)", loop_ok and cost < 2.0, f"{cost:.3f}s")
191
+ finally:
192
+ if old_env is None:
193
+ os.environ.pop(TOKEN_FILE_ENV, None)
194
+ else:
195
+ os.environ[TOKEN_FILE_ENV] = old_env
196
+ shutil.rmtree(root, ignore_errors=True)
197
+
198
+ print(f"\n通过 {PASS} / 失败 {FAIL}")
199
+ if FAILS:
200
+ print("失败项:" + ",".join(FAILS))
201
+ return 0 if FAIL == 0 else 1
202
+
203
+
204
+ if __name__ == "__main__":
205
+ sys.exit(main())
@@ -0,0 +1,185 @@
1
+ # -*- coding: utf-8 -*-
2
+ """N130 守卫:verify(verdict="falsified") 的删除必须过「不可遗忘」保护。
3
+
4
+ 缺陷形态(2026-09-25 引擎域新发现,编号 N130,high):verify() 的 falsified
5
+ 分支(mdcg.py:3188-3195)对原节点 os.remove **永久硬删**,全程不经
6
+ protect.guard_forget / require_layer_write / override——self/anchor 层、
7
+ protected 标记、importance≥0.7 的受保护节点可被一次 verify 调用一键删除,
8
+ 无快照、无留痕、不进 trash;对照 forget 路径(mdcos.py:2294)同一个删除
9
+ 动作需 require_admin + guard_forget 双闸(旧版本先快照、动作全程留痕)。
10
+
11
+ 攻击面:任何持 verify op 的主体(verify 角色 ops_allow 即含 verify,
12
+ designer ops=["*"] 天然含)对任意 node_id 调 cg(op=verify,
13
+ verdict=falsified) 一次调用永久删除;无需 override 无需 admin。
14
+
15
+ 修复:①falsified 分支在任何副作用(add_rejected / os.remove)之前接
16
+ protect.guard_forget(受保护节点需显式 override=True——旧版本自动快照 +
17
+ _protected_audit 留痕,与 forget 路径同一语义;拒绝抛 ProtectionError,
18
+ 原节点原样保留);②MdCGSecure.verify 对 falsified 按原节点层做
19
+ require_layer_write(与 add/add_rejected 同一闸口——verify 角色
20
+ layers_allow=["rejected","contextual"],本就「不得改被验证内容」,
21
+ tokens.py:171 显式 forbidden)。
22
+
23
+ 红项 = R1-R7(四类受保护节点一键硬删复现 + secure 面层写缺口);
24
+ G 项锁语义不变(普通节点 falsified 负记忆化、override 显式放行 + 快照留痕)。
25
+ 运行:python -m md_cg.test_n130_verify_falsified_protect
26
+ """
27
+ from __future__ import annotations
28
+
29
+ import os
30
+ import shutil
31
+ import sys
32
+ import tempfile
33
+
34
+ try:
35
+ from . import protect
36
+ from .mdcos import MdCGOS, MdCGSecure
37
+ from .security import AccessDenied, Principal
38
+ except ImportError: # 直接脚本运行
39
+ sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
40
+ from md_cg import protect
41
+ from md_cg.mdcos import MdCGOS, MdCGSecure
42
+ from md_cg.security import AccessDenied, Principal
43
+
44
+ PASS = FAIL = 0
45
+ FAILS = []
46
+
47
+
48
+ def ok(cond, label):
49
+ global PASS, FAIL
50
+ if cond:
51
+ PASS += 1
52
+ print(f" OK {label}")
53
+ else:
54
+ FAIL += 1
55
+ FAILS.append(label)
56
+ print(f" FAIL {label}")
57
+
58
+
59
+ _BODY = "# 功能名:N130 守卫\n\n# 生效条件:无条件\n\n正文。\n"
60
+
61
+
62
+ def _exists(cg, nid):
63
+ """索引条目在且盘面文件在(硬删后两者都会消失)。"""
64
+ e = (cg.index.get("nodes") or {}).get(nid)
65
+ return (e is not None
66
+ and os.path.exists(os.path.join(cg.root, e["path"])))
67
+
68
+
69
+ def _falsified_must_reject(cg, nid, label):
70
+ """对 nid 做 falsified:期望 ProtectionError 且节点原样保留。"""
71
+ raised = None
72
+ try:
73
+ cg.verify(nid, "N130 守卫的反例证据", "falsified")
74
+ except protect.ProtectionError as exc:
75
+ raised = exc
76
+ ok(raised is not None, f"{label}1 falsified 受保护节点被拒(ProtectionError)")
77
+ ok(_exists(cg, nid), f"{label}2 拒绝后索引与盘面文件原样保留")
78
+
79
+
80
+ def _seed(cg):
81
+ """四类受保护节点 + 一类普通节点(对照)。"""
82
+ cg.add("n_self", _BODY, layer="self")
83
+ cg.add("n_anchor", _BODY, layer="anchor")
84
+ cg.add("n_prot", _BODY, layer="knowledge")
85
+ protect.mark(cg, "n_prot", "N130 守卫:显式保护标记")
86
+ cg.add("n_imp", _BODY, layer="knowledge", importance=0.9)
87
+ cg.add("n_plain", _BODY, layer="knowledge")
88
+
89
+
90
+ def _base_shape(tmp):
91
+ """A:基类引擎面(无令牌)——四类受保护节点不得被 falsified 一键硬删。"""
92
+ print("--- A 基类引擎面:guard_forget 前置")
93
+ root = os.path.join(tmp, "base")
94
+ cg = MdCGOS(root)
95
+ _seed(cg)
96
+
97
+ _falsified_must_reject(cg, "n_self", "R1_self")
98
+ _falsified_must_reject(cg, "n_anchor", "R2_anchor")
99
+ _falsified_must_reject(cg, "n_prot", "R3_protected")
100
+ _falsified_must_reject(cg, "n_imp", "R4_importance0.9")
101
+
102
+ ok(all(_exists(cg, n) for n in
103
+ ("n_self", "n_anchor", "n_prot", "n_imp")),
104
+ "R5 四次拒绝后四个受保护节点全部健在")
105
+ ok(not os.path.isdir(os.path.join(cg.root, protect.HISTORY_DIR)),
106
+ "R6 拒绝路径零副作用(未创建 _protected_history)")
107
+
108
+ # G1:普通节点 falsified 语义不变(负记忆化 + 原节点移除)
109
+ r = cg.verify("n_plain", "普通节点反例", "falsified")
110
+ ok(r.get("action") == "falsified", "G1a 普通 knowledge 节点 falsified 照常放行")
111
+ ok(not _exists(cg, "n_plain"), "G1b 原 knowledge 节点按负记忆化移除(语义不变)")
112
+ neg = [e for e in (cg.index.get("nodes") or {}).values()
113
+ if e.get("layer") == "rejected"]
114
+ ok(len(neg) == 1, "G1c rejected 层出现负记忆条目(语义不变)")
115
+
116
+ # G2:override=True 显式放行 + 快照留痕(与 forget 路径同一能力面)
117
+ r2 = cg.verify("n_prot", "显式 override 的反例", "falsified", override=True)
118
+ ok(r2.get("action") == "falsified", "G2a override=True 显式放行 falsified")
119
+ ok(not _exists(cg, "n_prot"), "G2b override 放行后原节点移除")
120
+ hist = protect.history(cg, "n_prot")
121
+ ok(len(hist) == 1, "G2c override 放行前旧版本已快照进 _protected_history")
122
+ audit = os.path.join(cg.root, protect.AUDIT_FILE)
123
+ ok(os.path.exists(audit) and "override_forget" in open(
124
+ audit, encoding="utf-8").read(),
125
+ "G2d override_forget 动作已留痕 _protected_audit.jsonl")
126
+ cg.close()
127
+
128
+
129
+ def _secure_shape(tmp):
130
+ """B:MdCGSecure 面——falsified 删除按原节点层做 require_layer_write。"""
131
+ print("--- B 安全面:层写权限校验")
132
+ root = os.path.join(tmp, "secure")
133
+ verify_p = Principal(actor="verifier-1", role="verify", can_write=True,
134
+ can_admin=False, clearance="internal",
135
+ layers_allow=["rejected", "contextual"],
136
+ ops_allow=["info", "read", "verify"])
137
+ designer_p = Principal(actor="designer-1", role="designer", can_write=True,
138
+ can_admin=True, clearance="secret")
139
+ # 预置用 designer(knowledge 层只有可写该层的身份能建),攻击用 verify 角色
140
+ cg = MdCGSecure(root, principal=designer_p, master_key=bytes(range(32)))
141
+ cg.add("s_kn", _BODY, layer="knowledge") # verify 角色无权写 knowledge
142
+ cg.add("s_ctx", _BODY, layer="contextual") # verify 角色本职可写
143
+ cg.close()
144
+
145
+ # R7:verify 角色 falsified knowledge 节点 → 层写拒绝,节点原样保留
146
+ cg = MdCGSecure(root, principal=verify_p, master_key=bytes(range(32)))
147
+ raised = None
148
+ try:
149
+ cg.verify("s_kn", "verify 角色反例", "falsified")
150
+ except AccessDenied as exc:
151
+ raised = exc
152
+ ok(raised is not None, "R7a verify 角色 falsified knowledge 层被拒(AccessDenied)")
153
+ ok(_exists(cg, "s_kn"), "R7b 拒绝后 knowledge 节点索引与盘面原样保留")
154
+
155
+ # G3:verify 角色 falsified contextual 节点 → 本职可写,照常负记忆化
156
+ r = cg.verify("s_ctx", "verify 角色反例(contextual)", "falsified")
157
+ ok(r.get("action") == "falsified", "G3a verify 角色 falsified contextual 层放行")
158
+ ok(not _exists(cg, "s_ctx"), "G3b contextual 节点按负记忆化移除(语义不变)")
159
+ cg.close()
160
+
161
+ # R8:designer(层写不限)falsified self 层节点仍被 guard_forget 拦截
162
+ cg = MdCGSecure(root, principal=designer_p, master_key=bytes(range(32)))
163
+ cg.add("s_self", _BODY, layer="self")
164
+ _falsified_must_reject(cg, "s_self", "R8_designer_self")
165
+ cg.close()
166
+
167
+
168
+ def main():
169
+ tmp = tempfile.mkdtemp(prefix="mdcg_n130_guard_")
170
+ try:
171
+ _base_shape(tmp)
172
+ _secure_shape(tmp)
173
+ finally:
174
+ shutil.rmtree(tmp, ignore_errors=True)
175
+
176
+ print("\n" + "=" * 60)
177
+ print(f"结果:PASS {PASS} / FAIL {FAIL}")
178
+ if FAILS:
179
+ for f in FAILS:
180
+ print(f" - {f}")
181
+ return 0 if FAIL == 0 else 1
182
+
183
+
184
+ if __name__ == "__main__":
185
+ sys.exit(main())
@@ -0,0 +1,205 @@
1
+ # -*- coding: utf-8 -*-
2
+ """N131 守卫:review_decide(merge) 的目标写入必须过 add 同款双闸。
3
+
4
+ 缺陷形态(2026-09-25 引擎域新发现,编号 N131,high):review_decide 的
5
+ merge 分支(mdcos.py:2221-2255)把提案内容直接 _write_node 追加进任意
6
+ merge_into 目标节点,绕过 guard_write 与 require_layer_write——accept/edit
7
+ 走 self.add()(:2211)有 MdCGSecure.add :3769 require_layer_write 与基类
8
+ add mdcg.py:1311 guard_write 双闸,merge 直写零闸;mcp_server review_decide
9
+ 注释「accept/edit 落节点时的层写仍由下游 require_layer_write 拦截」对 merge
10
+ 不成立,orchestr 角色 forbidden「anchor/self/goals/knowledge 层」
11
+ (tokens.py:123)被打穿。
12
+
13
+ 攻击面:持 review+write op 的令牌(orchestr 的 ops_allow 两者皆含,
14
+ tokens.py:120;designer 全权)——propose 任意内容 → review_decide(pid,
15
+ decision="merge", merge_into=<self/anchor/immutable/knowledge 任意节点 id>)
16
+ 注入任意文本。
17
+
18
+ 修复:merge 分支在 _write_node 之前接与 add 同款双闸——principal 在位先
19
+ require_layer_write(目标层, 目标敏感度)(与 MdCGSecure.add 同序同错型),
20
+ 再 guard_write(self/anchor 层、immutable 标记,对照 add :1311;override
21
+ 显式传参时快照+留痕放行,与 add 能力面对齐);闸在 _record_decision 之前
22
+ 抛出——裁决不落库、提案留 pending(审计节点写入本就在 try/except 内,
23
+ 闸放那里会被吞成 record_error,形同虚设)。
24
+
25
+ 红项 = R1-R4(self/immutable 目标引擎面 + knowledge/self 目标 orchestr 面
26
+ 注入复现);G 项锁语义不变(普通目标 merge 追加、orchestr 本职 contextual
27
+ 目标放行、designer override 放行)+ 两对照(orchestr add self 被拒 /
28
+ designer add 覆 immutable 被拒——闸原本就在,只是 merge 绕过)。
29
+ 运行:python -m md_cg.test_n131_merge_gate
30
+ """
31
+ from __future__ import annotations
32
+
33
+ import os
34
+ import shutil
35
+ import sys
36
+ import tempfile
37
+
38
+ try:
39
+ from . import protect
40
+ from .mdcos import MdCGOS, MdCGSecure
41
+ from .security import AccessDenied, Principal
42
+ except ImportError: # 直接脚本运行
43
+ sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
44
+ from md_cg import protect
45
+ from md_cg.mdcos import MdCGOS, MdCGSecure
46
+ from md_cg.security import AccessDenied, Principal
47
+
48
+ PASS = FAIL = 0
49
+ FAILS = []
50
+
51
+
52
+ def ok(cond, label):
53
+ global PASS, FAIL
54
+ if cond:
55
+ PASS += 1
56
+ print(f" OK {label}")
57
+ else:
58
+ FAIL += 1
59
+ FAILS.append(label)
60
+ print(f" FAIL {label}")
61
+
62
+
63
+ _MARK = "攻击者注入段落"
64
+
65
+
66
+ def _body(name):
67
+ return (f"# 功能名:{name}\n# 生效条件:无条件\n# 子功能:无\n"
68
+ f"# 执行:无\n# 验证方式:test\n# 不适用条件:无\n\n原始正文。")
69
+
70
+
71
+ def _content_of(cg, nid):
72
+ n = cg.get(nid)
73
+ return (n or {}).get("content") or ""
74
+
75
+
76
+ def _merge_must_reject(cg, pid, target, exc_type, label):
77
+ """merge 进 target:期望 exc_type 且目标内容原样。"""
78
+ raised = None
79
+ try:
80
+ cg.review_decide(pid, "merge", merge_into=target)
81
+ except exc_type as exc:
82
+ raised = exc
83
+ ok(raised is not None, f"{label}1 merge 进 {target} 被拒({exc_type.__name__})")
84
+ ok(_MARK not in _content_of(cg, target),
85
+ f"{label}2 拒绝后 {target} 正文无注入内容")
86
+
87
+
88
+ def _base_shape(tmp):
89
+ """A:基类引擎面(无令牌)——self/immutable 目标不得被 merge 直写。"""
90
+ print("--- A 基类引擎面:guard_write 闸")
91
+ root = os.path.join(tmp, "base")
92
+ cg = MdCGOS(root)
93
+ cg.add("tgt_self", _body("自我目标"), layer="self")
94
+ cg.add("tgt_imm", _body("不可覆盖目标"), layer="knowledge", immutable=True)
95
+ cg.add("tgt_plain", _body("普通目标"), layer="knowledge")
96
+ ok(protect.is_immutable(cg, "tgt_imm")[0],
97
+ "A0 预置生效:tgt_imm 判定为不可覆盖")
98
+ for nid in ("p_self", "p_imm", "p_plain"):
99
+ cg.propose(nid, _body(nid) + "\n" + _MARK + "\n", layer="knowledge")
100
+
101
+ _merge_must_reject(cg, next(r["pid"] for r in cg.review_list()
102
+ if r["id"] == "p_self"),
103
+ "tgt_self", protect.ProtectionError, "R1_self")
104
+ _merge_must_reject(cg, next(r["pid"] for r in cg.review_list()
105
+ if r["id"] == "p_imm"),
106
+ "tgt_imm", protect.ProtectionError, "R2_immutable")
107
+
108
+ # G1:普通目标 merge 照常放行(test_merge_upsert / test_p2 语义不变)
109
+ pid_plain = next(r["pid"] for r in cg.review_list() if r["id"] == "p_plain")
110
+ r = cg.review_decide(pid_plain, "merge", merge_into="tgt_plain")
111
+ ok(r.get("ok") and r.get("node_id") == "tgt_plain",
112
+ "G1a 普通 knowledge 目标 merge 照常放行")
113
+ ok(_MARK in _content_of(cg, "tgt_plain"),
114
+ "G1b 追加内容进入目标正文(merge 本职不变)")
115
+ cg.close()
116
+
117
+
118
+ def _secure_shape(tmp):
119
+ """B:MdCGSecure 面——merge 按目标层做 require_layer_write(orchestr 面)。"""
120
+ print("--- B 安全面:orchestr 层写校验")
121
+ root = os.path.join(tmp, "secure")
122
+ designer_p = Principal(actor="designer-1", role="designer", can_write=True,
123
+ can_admin=True, clearance="secret")
124
+ orch_p = Principal(actor="orch-1", role="orchestr", can_write=True,
125
+ can_admin=False, clearance="internal",
126
+ layers_allow=["contextual", "unresolved", "rejected"],
127
+ ops_allow=["info", "route", "read", "write", "review"])
128
+ cg = MdCGSecure(root, principal=designer_p, master_key=bytes(range(32)))
129
+ cg.add("t_kn", _body("知识目标"), layer="knowledge")
130
+ cg.add("t_ctx", _body("情境目标"), layer="contextual")
131
+ cg.add("t_self", _body("自我目标"), layer="self")
132
+ cg.close()
133
+
134
+ # 对照 R3:orchestr 直接 add 写 self 层被拒(身份确实受限,闸原本就在)
135
+ cg = MdCGSecure(root, principal=orch_p, master_key=bytes(range(32)))
136
+ denied = None
137
+ try:
138
+ cg.add("x_self", _body("越权"), layer="self")
139
+ except AccessDenied as exc:
140
+ denied = exc
141
+ ok(denied is not None, "R3 对照:orchestr add 写 self 层被拒(AccessDenied)")
142
+
143
+ # R4/R5:orchestr merge 注入 knowledge / self 层目标——旧码双写路径全绕
144
+ #(提案内容须互异:propose 按 payload_hash 幂等去重,同内容返回既有 pid)
145
+ pid_kn = cg.propose("a_kn", _body("提案注入知识") + "\n" + _MARK + "知识\n",
146
+ layer="contextual")
147
+ _merge_must_reject(cg, pid_kn, "t_kn", AccessDenied, "R4_orch_knowledge")
148
+ pid_self = cg.propose("a_self", _body("提案注入自我") + "\n" + _MARK + "自我\n",
149
+ layer="contextual")
150
+ _merge_must_reject(cg, pid_self, "t_self", AccessDenied, "R5_orch_self")
151
+
152
+ # G2:orchestr 本职可写层(contextual)目标 merge 照常放行
153
+ pid_ctx = cg.propose("a_ctx", _body("提案注入情境") + "\n" + _MARK + "情境\n",
154
+ layer="contextual")
155
+ r = cg.review_decide(pid_ctx, "merge", merge_into="t_ctx")
156
+ ok(r.get("ok") and _MARK in _content_of(cg, "t_ctx"),
157
+ "G2 orchestr merge 进本职 contextual 目标放行且内容追加(本职不变)")
158
+ cg.close()
159
+
160
+ # 对照 R6:designer add 覆写 immutable 既有节点被拒(guard_write 对照)+
161
+ # G3:designer merge 带 override 进 immutable 目标显式放行(快照+留痕)
162
+ cg = MdCGSecure(root, principal=designer_p, master_key=bytes(range(32)))
163
+ cg.add("t_imm2", _body("不可覆盖"), layer="knowledge", immutable=True)
164
+ prot = None
165
+ try:
166
+ cg.add("t_imm2", _body("覆写"), layer="knowledge")
167
+ except protect.ProtectionError as exc:
168
+ prot = exc
169
+ ok(prot is not None, "R6 对照:designer add 覆写 immutable 节点被拒"
170
+ "(ProtectionError)")
171
+ cg.close()
172
+
173
+ cg = MdCGSecure(root, principal=designer_p, master_key=bytes(range(32)))
174
+ pid_ov = cg.propose("a_ov", _body("提案") + "\n" + _MARK + "\n",
175
+ layer="knowledge")
176
+ r = cg.review_decide(pid_ov, "merge", merge_into="t_imm2", override=True)
177
+ ok(r.get("ok") and _MARK in _content_of(cg, "t_imm2"),
178
+ "G3a designer override=True merge 进 immutable 目标显式放行")
179
+ hist = protect.history(cg, "t_imm2")
180
+ ok(len(hist) >= 1, "G3b override 放行前旧版本已快照 _protected_history")
181
+ audit = os.path.join(cg.root, protect.AUDIT_FILE)
182
+ ok(os.path.exists(audit) and "override_write" in open(
183
+ audit, encoding="utf-8").read(),
184
+ "G3c override_write 动作已留痕 _protected_audit.jsonl")
185
+ cg.close()
186
+
187
+
188
+ def main():
189
+ tmp = tempfile.mkdtemp(prefix="mdcg_n131_guard_")
190
+ try:
191
+ _base_shape(tmp)
192
+ _secure_shape(tmp)
193
+ finally:
194
+ shutil.rmtree(tmp, ignore_errors=True)
195
+
196
+ print("\n" + "=" * 60)
197
+ print(f"结果:PASS {PASS} / FAIL {FAIL}")
198
+ if FAILS:
199
+ for f in FAILS:
200
+ print(f" - {f}")
201
+ return 0 if FAIL == 0 else 1
202
+
203
+
204
+ if __name__ == "__main__":
205
+ sys.exit(main())