@furongjun1999/dsh-memory 0.4.11 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (580) hide show
  1. package/README.md +552 -465
  2. package/codebuddy/CODEBUDDY.md +11 -3
  3. package/codebuddy/README.md +92 -90
  4. package/codebuddy/mcp.json +27 -27
  5. package/docs/GBrain/345/217/257/345/200/237/351/211/264/347/202/271_/347/201/265/346/236/242/350/220/275/347/202/271/344/272/244/346/216/245_20260919.md +169 -169
  6. package/docs/Pi/345/217/257/345/255/246/344/271/240/344/274/230/347/202/271_/347/201/265/346/236/242/345/244/247/350/204/221/346/224/271/350/277/233/344/272/244/346/216/245_20260915.md +144 -144
  7. package/docs/README.md +143 -111
  8. package/docs/discipline/harnesses.yaml +244 -226
  9. package/docs/discipline/templates/full.md.tmpl +61 -61
  10. package/docs/discipline/templates/rules.mdc.tmpl +68 -0
  11. package/docs/discipline/templates/skill.md.tmpl +23 -23
  12. package/docs/eval/AGI/344/270/203/347/273/264/350/257/204/345/210/206/346/212/245/345/221/212_md_cg_v1.0.md +299 -299
  13. package/docs/eval/AGI/344/270/203/347/273/264/350/257/204/345/210/206/346/212/245/345/221/212_md_cg_v2.0.md +239 -239
  14. package/docs/eval/bench_lingshu_self/bench_self.py +140 -0
  15. package/docs/eval/bench_lingshu_self/self_bench_result.json +404 -0
  16. package/docs/eval/bench_lingshu_self//347/201/265/346/236/242/350/207/252/345/272/223/347/253/257/345/210/260/347/253/257/346/243/200/347/264/242/345/256/236/346/265/213_v1.0.md +38 -0
  17. package/docs/eval//344/270/215/345/217/257/351/235/240/346/200/247/350/220/275/345/234/260_P0_v1.0.md +185 -0
  18. package/docs/eval//345/256/236/351/252/214/346/226/271/346/241/210_/345/255/246/344/271/240/351/227/255/347/216/257AB/344/270/216/346/250/252/350/257/204_v1.0.md +174 -174
  19. package/docs/eval//346/225/205/351/232/234/346/263/250/345/205/245/345/256/236/346/265/213_v1.0.md +422 -0
  20. package/docs/eval//346/250/252/350/257/204_/345/205/255/345/256/266100/351/242/230/344/270/255/350/213/261/345/217/214/346/237/245_v1.0.md +223 -223
  21. package/docs/eval//347/253/257/345/210/260/347/253/257LoCoMoQA/345/220/214/345/217/243/345/276/204/345/257/271/347/205/247_v1.0.md +100 -0
  22. package/docs/eval//347/253/257/345/210/260/347/253/257/345/271/262/346/211/260/346/261/240/350/257/204/346/265/213_/347/241/256/345/256/232/346/200/247/350/243/201/345/206/263vsLLM_judge_v1.1.md +197 -0
  23. package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v1.md +156 -0
  24. package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v10.md +210 -0
  25. package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v11.md +227 -0
  26. package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v12.md +203 -0
  27. package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v13.md +233 -0
  28. package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v14.md +191 -0
  29. package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v15.md +213 -0
  30. package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v16.md +214 -0
  31. package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v17.md +199 -0
  32. package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v2.md +156 -0
  33. package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v3.md +152 -0
  34. package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v4.md +128 -0
  35. package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v5.md +114 -0
  36. package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v6.md +192 -0
  37. package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v7.md +187 -0
  38. package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v8.md +207 -0
  39. package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v9.md +203 -0
  40. package/docs/{mdcg → hive}//344/273/244/347/211/214/344/270/216/350/247/222/350/211/262/346/235/203/350/201/214/345/210/206/347/246/273_v0.1.md +165 -160
  41. package/docs/hive//344/273/244/347/211/214/350/257/255/344/271/211/344/277/256/346/255/243_/344/273/262/350/243/201/344/275/215_v0.1.md +76 -0
  42. package/docs/{mdcg → hive}//345/255/220/344/273/243/347/220/206/351/205/215/347/275/256/346/240/207/345/207/206_v0.5.md +236 -236
  43. package/docs/hive//345/256/211/345/205/250/345/256/241/350/256/241/345/256/236/351/224/232_v0.1.md +202 -0
  44. package/docs/hive//346/243/200/347/264/242/346/224/266/346/225/233/345/256/236/346/265/213/344/270/216S1b/350/256/276/350/256/241_v0.1.md +43 -43
  45. package/docs/hive//346/243/200/347/264/242/347/256/227/346/263/225/345/217/243/345/276/204/345/257/271/347/205/247_v0.1.md +85 -0
  46. package/docs/hive//346/243/200/347/264/242/350/267/257/345/276/204/344/270/216/350/256/244/347/237/245/347/273/223/346/236/204/345/245/221/347/272/246_v0.1.md +102 -102
  47. package/docs/hive//350/234/202/345/267/242M6_ingest/345/256/236/346/226/275/350/256/241/345/210/222_v0.1.md +47 -0
  48. package/docs/hive//350/234/202/345/267/242/345/217/214/345/256/236/344/276/213/344/272/222/351/252/214_/350/256/276/350/256/241/345/256/232/347/250/277.md +519 -503
  49. package/docs/hive//350/234/202/345/267/242/345/267/245/344/275/234/350/256/260/345/277/206_/351/241/271/347/233/256/350/256/241/345/210/222.md +85 -85
  50. package/docs/hive//350/234/202/345/267/242/350/256/276/350/256/241_/347/220/206/350/256/272/345/257/271/351/275/220_v0.1.md +191 -0
  51. package/docs/hive//350/234/202/345/267/242/350/277/255/344/273/243_/345/256/217/350/247/202/344/270/216/347/276/244/344/275/223/350/260/203/345/272/246_v0.1.md +90 -0
  52. package/docs/images/lingshu-moonlight-covenant-poster-preview.jpg +0 -0
  53. package/docs/images/lingshu-moonlight-covenant-poster.png +0 -0
  54. package/docs/mdcg/D_meta_/345/267/245/347/250/213/345/214/226/346/226/271/346/241/210_v0.2.md +216 -216
  55. package/docs/mdcg/README/350/257/246/347/273/206/347/211/210_v0.4.10.md +646 -646
  56. package/docs/mdcg/lingshu_tutorial.html +14449 -14449
  57. package/docs/mdcg/release_v0.4.11.md +49 -0
  58. package/docs/mdcg/release_v0.4.5.md +55 -55
  59. package/docs/mdcg/tool_table_v0.3.0.md +117 -117
  60. package/docs/mdcg//345/205/250/345/272/223/344/273/243/347/240/201/350/257/204/345/256/241/344/270/216/346/235/241/344/273/266/345/214/226/346/263/250/351/207/212_/350/256/241/345/210/222_v0.1.md +600 -600
  61. package/docs/mdcg//345/212/237/350/203/275/350/260/203/347/224/250/346/230/240/345/260/204/350/241/250_v0.1.md +40 -40
  62. package/docs/mdcg//345/215/225/345/205/203/350/207/252/346/210/221/351/224/232/347/202/271_/347/263/273/347/273/237/346/217/220/347/244/272/350/257/215/346/240/207/345/207/206_v0.3.md +275 -275
  63. package/docs/mdcg//345/217/221/345/270/203/351/227/250/347/246/201/351/223/276_v0.1.md +54 -0
  64. package/docs/mdcg//346/272/220/347/240/201/347/272/247/346/236/266/346/236/204/345/256/241/350/256/241_GPT/346/211/271/350/257/204/345/257/271/347/205/247_v1.0.md +130 -130
  65. package/docs/mdcg//347/201/265/346/236/24282/345/267/245/345/205/267_/345/212/237/350/203/275/346/225/264/347/220/206/344/270/216/350/277/201/347/247/273/346/230/240/345/260/204_v0.1.md +278 -278
  66. package/docs/mdcg//347/201/265/346/236/242/350/256/260/345/277/206/345/212/250/350/257/215/345/215/217/350/256/256_v1.0-draft.md +172 -172
  67. package/docs/mdcg//347/274/272/345/217/243/345/215/225_P0/346/224/266/345/217/243_v0.1.md +270 -270
  68. package/docs/mdcg//350/256/244/347/237/245/345/233/276_G4-G8/347/274/272/345/217/243/350/243/201/345/256/232/345/215/225_v0.1.md +491 -491
  69. package/docs/mdcg//350/256/244/347/237/245/345/233/276_/346/235/241/344/273/266/347/251/272/351/227/264/345/220/210/346/210/220/344/270/216/347/224/237/346/225/210/346/235/241/344/273/266/345/217/243/345/276/204_v0.1.md +340 -340
  70. package/docs/mdcg//350/256/244/347/237/245/345/233/276_/347/264/242/345/274/225/344/270/216/345/267/245/347/250/213/350/247/204/350/214/203/345/214/226_/350/256/241/345/210/222_v0.1.md +588 -588
  71. package/docs/plans/GridWorld/346/234/200/345/260/217/351/227/255/347/216/257/350/247/204/346/240/274_v0.1.md +176 -176
  72. package/docs/plans//345/221/275/345/220/215/346/262/273/347/220/206_/351/241/271/347/233/256/350/256/241/345/210/222.md +81 -81
  73. package/docs/swarm//350/234/202/347/276/244/344/272/222/350/201/224_v0.1.md +704 -704
  74. package/docs/swarm//350/234/202/347/276/244/345/220/214/351/224/231/346/243/200/346/265/213/345/256/236/351/252/214/345/215/217/350/256/256_v0.1.md +242 -242
  75. package/docs/theory//344/270/215/345/217/257/351/235/240/345/256/232/347/220/206/344/270/216/345/244/261/346/225/210/344/274/230/345/205/210/346/241/206/346/236/266_v0.3.md +365 -0
  76. package/docs/theory//345/215/225/347/272/277/347/250/213/344/270/216/346/263/250/346/204/217/345/212/233/351/233/206/344/270/255_/346/227/240/344/272/211/350/256/256/347/220/206/350/256/272/346/226/207/346/241/243_v1.0.md +129 -129
  77. package/docs/theory//345/271/266/345/217/221/345/277/205/347/204/266/346/200/247/347/220/206/350/256/272_v0.2.md +134 -134
  78. package/docs/theory//346/231/272/350/203/275/350/256/2723.4.md +5260 -5260
  79. package/docs/theory//346/246/202/345/277/265/345/210/206/345/261/202/345/257/271/351/275/220/350/241/250_v0.1.md +145 -145
  80. package/docs/theory//347/220/206/350/256/272_/346/234/272/345/210/266_/344/273/243/347/240/201_/345/256/236/351/252/214_/347/274/272/345/217/243/347/237/251/351/230/265_v0.1.md +144 -144
  81. package/docs/theory//347/220/206/350/256/272/344/273/223/346/213/206/345/210/206/344/270/216/347/231/275/347/256/261/347/237/245/350/257/206/345/272/223/345/206/205/350/277/201_v0.1.md +198 -198
  82. package/docs/theory//350/256/244/347/237/245/344/273/243/347/220/206/344/270/216/346/224/266/346/225/233/347/273/223/346/236/204_/346/235/241/344/273/266/350/256/272/351/207/215/346/236/204_v0.1.md +221 -221
  83. package/docs/world_model//344/270/226/347/225/214/346/250/241/345/236/213_/347/245/236/347/273/217/347/275/221/347/273/234/345/272/225/345/261/202/346/236/266/346/236/204_v1.0.md +237 -237
  84. package/docs//344/270/215/345/217/257/351/235/240/346/200/247/347/220/206/350/256/272_v0.1.md +343 -0
  85. package/docs//345/217/221/345/270/203/344/273/266/345/233/236/346/272/257/350/257/264/346/230/216_v0.1.md +82 -82
  86. package/docs//345/267/245/344/275/234/347/272/252/345/276/213_/350/256/244/347/237/245/345/233/276/346/235/241/347/233/256_v1.1.json +28 -2
  87. package/dsh/README.md +82 -82
  88. package/dsh/cordis.yml.example +139 -139
  89. package/dsh/update-lingshu.bat +11 -11
  90. package/lib/bridge.d.ts +9 -0
  91. package/lib/bridge.js +35 -0
  92. package/lib/hooks.js +36 -2
  93. package/lib/index.js +7 -1
  94. package/lib/lib/roleplay_web.js +116 -29
  95. package/lib/lib/token_store.d.ts +7 -1
  96. package/lib/lib/token_store.js +12 -3
  97. package/md_cg/__init__.py +7 -7
  98. package/md_cg/audit.py +379 -368
  99. package/md_cg/autonomy.py +287 -287
  100. package/md_cg/backfill.py +1328 -1327
  101. package/md_cg/backfill_bigdomain.py +34 -34
  102. package/md_cg/backfill_bucket_zh.py +35 -0
  103. package/md_cg/bench6_arms.py +410 -410
  104. package/md_cg/bench6_common.py +230 -230
  105. package/md_cg/bench6_competitors.py +212 -212
  106. package/md_cg/bench_axis_domain.py +257 -257
  107. package/md_cg/bench_blind_comp.py +308 -308
  108. package/md_cg/bench_e2e_judge.py +532 -0
  109. package/md_cg/bench_e2e_locomo_qa.py +368 -0
  110. package/md_cg/bench_e2e_qa.py +256 -0
  111. package/md_cg/bench_en_atoms_public.py +230 -230
  112. package/md_cg/bench_governance.py +348 -348
  113. package/md_cg/bench_lme_zh.py +410 -410
  114. package/md_cg/bench_locomo.py +121 -121
  115. package/md_cg/bench_locomo_zh.py +450 -450
  116. package/md_cg/bench_locomo_zh_public.py +147 -147
  117. package/md_cg/bench_longmem.py +112 -112
  118. package/md_cg/bench_membench.py +632 -632
  119. package/md_cg/bench_p0.py +149 -149
  120. package/md_cg/bench_progressive.py +287 -287
  121. package/md_cg/bench_role_views.py +238 -238
  122. package/md_cg/bench_task_ab.py +243 -243
  123. package/md_cg/bench_task_ab_llm.py +408 -408
  124. package/md_cg/bench_unified_en.py +204 -204
  125. package/md_cg/bench_zh_mad.py +601 -601
  126. package/md_cg/blindspot_tickets.py +123 -123
  127. package/md_cg/branches.py +301 -285
  128. package/md_cg/build_postings.py +73 -73
  129. package/md_cg/ccgc.py +1006 -948
  130. package/md_cg/census.py +132 -132
  131. package/md_cg/chain.py +315 -300
  132. package/md_cg/codeindex.py +531 -531
  133. package/md_cg/coldverify.py +292 -292
  134. package/md_cg/comment_gate.py +337 -337
  135. package/md_cg/cond_compose.py +190 -190
  136. package/md_cg/cond_facts.py +154 -154
  137. package/md_cg/cond_template.json +106 -106
  138. package/md_cg/condition_anchor.py +142 -142
  139. package/md_cg/conformance.py +726 -726
  140. package/md_cg/consistency.py +717 -717
  141. package/md_cg/consolidate.py +1537 -1439
  142. package/md_cg/corpus.py +110 -110
  143. package/md_cg/crosscheck.py +1098 -1097
  144. package/md_cg/crypto.py +3 -1
  145. package/md_cg/d_meta.py +310 -310
  146. package/md_cg/datapath.py +78 -18
  147. package/md_cg/docindex.py +473 -473
  148. package/md_cg/eval_common.py +575 -575
  149. package/md_cg/evidence.py +4 -2
  150. package/md_cg/evolution.py +477 -477
  151. package/md_cg/export.py +222 -220
  152. package/md_cg/forgetting.py +581 -581
  153. package/md_cg/fsutil.py +377 -329
  154. package/md_cg/hotcache.py +48 -7
  155. package/md_cg/hyperedge.py +251 -251
  156. package/md_cg/identity.py +390 -390
  157. package/md_cg/insight.py +500 -500
  158. package/md_cg/interop.py +338 -0
  159. package/md_cg/judgment_manifest.py +177 -0
  160. package/md_cg/lexicon/build_cedict_en_zh.py +329 -329
  161. package/md_cg/lexicon/build_standard_en.py +171 -171
  162. package/md_cg/lexicon/expand_en_zh.py +211 -211
  163. package/md_cg/lifecycle.py +272 -272
  164. package/md_cg/linkref.py +280 -280
  165. package/md_cg/links.py +140 -107
  166. package/md_cg/mcp_server.py +403 -55
  167. package/md_cg/md_whitebox.py +345 -345
  168. package/md_cg/mdcg.py +783 -233
  169. package/md_cg/mdcos.py +500 -70
  170. package/md_cg/metacognition.py +591 -591
  171. package/md_cg/migrate.py +119 -119
  172. package/md_cg/migrate_aeis.py +221 -221
  173. package/md_cg/migrate_roleplay.py +293 -293
  174. package/md_cg/migrate_wisdom_graph.py +360 -360
  175. package/md_cg/mreview/__init__.py +25 -25
  176. package/md_cg/mreview/__main__.py +110 -110
  177. package/md_cg/mreview/bundle.py +178 -178
  178. package/md_cg/mreview/candidates.py +262 -262
  179. package/md_cg/mreview/govern.py +694 -693
  180. package/md_cg/mreview/locate.py +939 -939
  181. package/md_cg/mreview/pipeline.py +728 -728
  182. package/md_cg/mreview/rules/duplication.json +21 -21
  183. package/md_cg/mreview/rules/field_coverage.json +54 -54
  184. package/md_cg/mreview/rules/source_license.json +21 -21
  185. package/md_cg/mreview/rules/template_flow.json +21 -21
  186. package/md_cg/mreview/ruleset.py +252 -252
  187. package/md_cg/nodefile.py +575 -575
  188. package/md_cg/pooling.py +484 -472
  189. package/md_cg/postings.py +300 -298
  190. package/md_cg/predict.py +1100 -1100
  191. package/md_cg/progressive.py +123 -123
  192. package/md_cg/protect.py +272 -272
  193. package/md_cg/protocol/md_cg_gate.proto +33 -33
  194. package/md_cg/protocol.py +372 -372
  195. package/md_cg/provenance.py +582 -582
  196. package/md_cg/reach.py +453 -453
  197. package/md_cg/readcache.py +143 -0
  198. package/md_cg/reconcile.py +228 -0
  199. package/md_cg/refindex.py +833 -833
  200. package/md_cg/refine.py +604 -604
  201. package/md_cg/review_cli.py +170 -0
  202. package/md_cg/roleviews.py +89 -89
  203. package/md_cg/routing.py +393 -365
  204. package/md_cg/run_tests.py +211 -0
  205. package/md_cg/scrub.py +13 -3
  206. package/md_cg/security.py +128 -18
  207. package/md_cg/self_state.py +1029 -1029
  208. package/md_cg/selfreport.py +152 -151
  209. package/md_cg/semantic/__init__.py +10 -10
  210. package/md_cg/semantic/canonical.py +122 -122
  211. package/md_cg/semantic/en_normalizer.py +364 -364
  212. package/md_cg/semantic/en_zh_map.json +28694 -0
  213. package/md_cg/semantic/export_en_zh_map.py +64 -0
  214. package/md_cg/semantic/unify.py +45 -0
  215. package/md_cg/semantic/zh_en_atoms.py +139 -139
  216. package/md_cg/signer.py +7 -4
  217. package/md_cg/sources.py +816 -582
  218. package/md_cg/statushdr.py +179 -179
  219. package/md_cg/stg.py +54 -37
  220. package/md_cg/subgraph.py +729 -729
  221. package/md_cg/sustain.py +35 -5
  222. package/md_cg/tasks.py +470 -470
  223. package/md_cg/test_access_hints.py +147 -0
  224. package/md_cg/test_action_derive.py +203 -203
  225. package/md_cg/test_audit_rotate.py +270 -270
  226. package/md_cg/test_autonomy.py +143 -143
  227. package/md_cg/test_bench_governance.py +102 -102
  228. package/md_cg/test_blindspot_tickets.py +166 -166
  229. package/md_cg/test_branch_discard_tombstone.py +136 -0
  230. package/md_cg/test_branches.py +13 -3
  231. package/md_cg/test_ccg_perturb.py +184 -184
  232. package/md_cg/test_ccgc.py +433 -433
  233. package/md_cg/test_census_prune.py +81 -81
  234. package/md_cg/test_chain_read_isolate.py +168 -0
  235. package/md_cg/test_cond_compose_anchors.py +76 -76
  236. package/md_cg/test_cond_match.py +165 -165
  237. package/md_cg/test_condition_anchor.py +81 -81
  238. package/md_cg/test_d_meta.py +412 -412
  239. package/md_cg/test_datapath_device_name.py +203 -0
  240. package/md_cg/test_datapath_root.py +199 -199
  241. package/md_cg/test_emit_negtail_cache.py +156 -0
  242. package/md_cg/test_en_pipeline.py +22 -2
  243. package/md_cg/test_gain_gate.py +212 -212
  244. package/md_cg/test_govern_directread.py +421 -0
  245. package/md_cg/test_health_scale.py +173 -173
  246. package/md_cg/test_hive_ingest.py +285 -0
  247. package/md_cg/test_hot_cold.py +215 -215
  248. package/md_cg/test_hyperedge.py +245 -245
  249. package/md_cg/test_i26_empty_first_write.py +116 -0
  250. package/md_cg/test_i27_e041_identity.py +128 -0
  251. package/md_cg/test_i28_hotcache_prodpath.py +122 -0
  252. package/md_cg/test_i32_hotcache_env_key.py +218 -0
  253. package/md_cg/test_identity_attribution.py +96 -15
  254. package/md_cg/test_index_durability.py +17 -3
  255. package/md_cg/test_interop.py +95 -0
  256. package/md_cg/test_interop_judgment.py +228 -0
  257. package/md_cg/test_issue39_utf8_stdio.py +273 -0
  258. package/md_cg/test_lifecycle.py +309 -309
  259. package/md_cg/test_linkref.py +306 -306
  260. package/md_cg/test_links_concurrent_write.py +188 -0
  261. package/md_cg/test_lock.py +43 -43
  262. package/md_cg/test_md_access_parity.py +255 -255
  263. package/md_cg/test_md_writepath.py +345 -345
  264. package/md_cg/test_mdstore_search_parity.py +160 -0
  265. package/md_cg/test_merge_upsert.py +168 -0
  266. package/md_cg/test_mr_m2.py +587 -587
  267. package/md_cg/test_mr_m3.py +710 -710
  268. package/md_cg/test_mr_m4.py +485 -485
  269. package/md_cg/test_n123_derive_expiry_chain.py +205 -0
  270. package/md_cg/test_n130_verify_falsified_protect.py +185 -0
  271. package/md_cg/test_n131_merge_gate.py +205 -0
  272. package/md_cg/test_p0.py +250 -250
  273. package/md_cg/test_p1.py +316 -316
  274. package/md_cg/test_p10_identity.py +173 -173
  275. package/md_cg/test_p11_consistency.py +233 -233
  276. package/md_cg/test_p12_metacognition.py +212 -212
  277. package/md_cg/test_p13_encryption.py +241 -241
  278. package/md_cg/test_p14_sustain.py +249 -249
  279. package/md_cg/test_p15_scrub.py +280 -280
  280. package/md_cg/test_p16_self_state.py +301 -301
  281. package/md_cg/test_p17_predict.py +354 -354
  282. package/md_cg/test_p18_whitebox.py +171 -171
  283. package/md_cg/test_p19_migrate_roleplay.py +149 -149
  284. package/md_cg/test_p1x_ref_root.py +160 -0
  285. package/md_cg/test_p20_evolution.py +315 -315
  286. package/md_cg/test_p21_tokens.py +293 -270
  287. package/md_cg/test_p22_theory.py +175 -175
  288. package/md_cg/test_p23_links.py +311 -311
  289. package/md_cg/test_p24_evidence.py +227 -227
  290. package/md_cg/test_p25_weights.py +156 -156
  291. package/md_cg/test_p26_refindex.py +416 -416
  292. package/md_cg/test_p27_docindex.py +16 -7
  293. package/md_cg/test_p28_refcheck.py +305 -305
  294. package/md_cg/test_p29_session_ingest_export.py +354 -333
  295. package/md_cg/test_p2_mcp.py +3 -0
  296. package/md_cg/test_p3.py +11 -2
  297. package/md_cg/test_p30_maintain.py +330 -330
  298. package/md_cg/test_p31_insight.py +534 -534
  299. package/md_cg/test_p32_backfill.py +7 -1
  300. package/md_cg/test_p33_ccg_wiring.py +293 -293
  301. package/md_cg/test_p34_crosscheck.py +331 -331
  302. package/md_cg/test_p35_conditioned_claim.py +252 -252
  303. package/md_cg/test_p36_kp_align.py +230 -230
  304. package/md_cg/test_p37_condition_space.py +248 -248
  305. package/md_cg/test_p38_concurrent_flush.py +102 -0
  306. package/md_cg/test_p38_contextualize.py +273 -273
  307. package/md_cg/test_p39_verify_flow.py +153 -0
  308. package/md_cg/test_p39_vision_evidence.py +369 -369
  309. package/md_cg/test_p40_refine_worklist.py +241 -241
  310. package/md_cg/test_p41_evolve_patrol.py +224 -224
  311. package/md_cg/test_p42_provenance.py +269 -269
  312. package/md_cg/test_p43_pooling.py +412 -398
  313. package/md_cg/test_p44_md_whitebox.py +231 -231
  314. package/md_cg/test_p45_session_identity.py +219 -219
  315. package/md_cg/test_p46_unit_scope.py +272 -272
  316. package/md_cg/test_p47_session_view.py +316 -0
  317. package/md_cg/test_p4_fuzzy.py +223 -223
  318. package/md_cg/test_p5_semantic.py +226 -226
  319. package/md_cg/test_p6_consolidate.py +440 -387
  320. package/md_cg/test_p7_goals_recent.py +202 -202
  321. package/md_cg/test_p8_subgraph_chain.py +200 -200
  322. package/md_cg/test_p9_forget_protect.py +231 -231
  323. package/md_cg/test_predict_beta.py +135 -135
  324. package/md_cg/test_preflight_failclosed.py +100 -100
  325. package/md_cg/test_progressive.py +146 -146
  326. package/md_cg/test_propose_tail_index.py +157 -0
  327. package/md_cg/test_protocol.py +243 -243
  328. package/md_cg/test_reach.py +378 -378
  329. package/md_cg/test_reach_keys.py +201 -201
  330. package/md_cg/test_read_clip.py +141 -141
  331. package/md_cg/test_read_scope_b27.py +277 -0
  332. package/md_cg/test_readcache_default_on.py +168 -0
  333. package/md_cg/test_readcache_precise_inval.py +270 -0
  334. package/md_cg/test_readcache_prodpath.py +203 -0
  335. package/md_cg/test_reconcile_v0.py +294 -0
  336. package/md_cg/test_retr_gates_prodpath.py +140 -0
  337. package/md_cg/test_retr_s1.py +344 -340
  338. package/md_cg/test_retr_s1b.py +276 -209
  339. package/md_cg/test_retr_s3.py +194 -194
  340. package/md_cg/test_retr_s4.py +163 -163
  341. package/md_cg/test_retr_s5.py +200 -200
  342. package/md_cg/test_retr_s6.py +157 -157
  343. package/md_cg/test_retr_s7.py +392 -384
  344. package/md_cg/test_retr_s8_time.py +369 -316
  345. package/md_cg/test_retr_s9_edges.py +286 -286
  346. package/md_cg/test_retr_s9_entity_ctx.py +9 -3
  347. package/md_cg/test_retr_score_once.py +208 -0
  348. package/md_cg/test_review_conformance.py +367 -367
  349. package/md_cg/test_review_onepass.py +170 -0
  350. package/md_cg/test_role_views.py +354 -354
  351. package/md_cg/test_rrf_graph_seed_cache.py +154 -0
  352. package/md_cg/test_security_audit.py +155 -0
  353. package/md_cg/test_security_audit_b26.py +161 -0
  354. package/md_cg/test_security_audit_v21.py +250 -0
  355. package/md_cg/test_sem_noise.py +242 -242
  356. package/md_cg/test_semantic_canonical.py +16 -2
  357. package/md_cg/test_session_isolation.py +168 -0
  358. package/md_cg/test_snapshot_autoclose.py +187 -0
  359. package/md_cg/test_subproc_encoding.py +192 -192
  360. package/md_cg/test_sustain_mutual.py +153 -153
  361. package/md_cg/test_tail_watermark_race.py +208 -0
  362. package/md_cg/test_tasks.py +409 -409
  363. package/md_cg/test_tenant_env_override_warn.py +139 -0
  364. package/md_cg/test_tenant_registry_corrupt_warn.py +151 -0
  365. package/md_cg/test_tool_face.py +189 -189
  366. package/md_cg/test_transfer.py +180 -180
  367. package/md_cg/test_trust.py +361 -361
  368. package/md_cg/test_twophase.py +286 -286
  369. package/md_cg/test_v14_fixes.py +38 -20
  370. package/md_cg/test_validity_filter.py +280 -280
  371. package/md_cg/test_verify_answer.py +138 -138
  372. package/md_cg/test_verify_dirty_reconcile.py +157 -0
  373. package/md_cg/test_wisdom_md_store.py +292 -292
  374. package/md_cg/test_writelimit.py +197 -197
  375. package/md_cg/test_writepipe.py +214 -214
  376. package/md_cg/theory.py +6 -3
  377. package/md_cg/tokens.py +85 -14
  378. package/md_cg/tool_face.py +260 -260
  379. package/md_cg/trust.py +986 -950
  380. package/md_cg/twophase.py +231 -231
  381. package/md_cg/units.py +668 -667
  382. package/md_cg/vision_evidence.py +667 -666
  383. package/md_cg/weights.py +624 -624
  384. package/md_cg/whitebox.py +527 -527
  385. package/md_cg/whitebox_kb/__init__.py +37 -37
  386. package/md_cg/whitebox_kb/aeis_core/__init__.py +42 -42
  387. package/md_cg/whitebox_kb/aeis_core/semantic.py +280 -280
  388. package/md_cg/whitebox_kb/aeis_core/textutil.py +13 -13
  389. package/md_cg/whitebox_kb/engine.py +310 -310
  390. package/md_cg/whitebox_kb/seed_knowledge//346/231/272/350/203/275/350/256/2723.4.md +5260 -5260
  391. package/md_cg/whitebox_kb/wisdom/browser_units.py +2631 -2631
  392. package/md_cg/whitebox_kb/wisdom/causal_discover.py +432 -432
  393. package/md_cg/whitebox_kb/wisdom/chat_engine.py +1506 -1506
  394. package/md_cg/whitebox_kb/wisdom/compiler_code_units.py +3033 -3033
  395. package/md_cg/whitebox_kb/wisdom/condition_algebra.py +112 -112
  396. package/md_cg/whitebox_kb/wisdom/condition_frame.py +315 -315
  397. package/md_cg/whitebox_kb/wisdom/condition_kb.py +108 -108
  398. package/md_cg/whitebox_kb/wisdom/conflict_map.json +4445 -4445
  399. package/md_cg/whitebox_kb/wisdom/core/lexer.py +512 -512
  400. package/md_cg/whitebox_kb/wisdom/core/name_checker.py +1023 -1023
  401. package/md_cg/whitebox_kb/wisdom/cspmn.py +258 -258
  402. package/md_cg/whitebox_kb/wisdom/csre.py +264 -264
  403. package/md_cg/whitebox_kb/wisdom/danmaku_audit.py +252 -252
  404. package/md_cg/whitebox_kb/wisdom/distilled_condition_units.json +6417 -6417
  405. package/md_cg/whitebox_kb/wisdom/docs/WB-EVAL-20260902b.json +1950 -1950
  406. package/md_cg/whitebox_kb/wisdom/docs/WB-EVAL-20260902c.json +1296 -1296
  407. package/md_cg/whitebox_kb/wisdom/docs/whitebox_capability_graph_demo.json +59 -59
  408. package/md_cg/whitebox_kb/wisdom/graph_db_units.py +3089 -3089
  409. package/md_cg/whitebox_kb/wisdom/knowledge_points.py +318 -318
  410. package/md_cg/whitebox_kb/wisdom/md_access.py +470 -470
  411. package/md_cg/whitebox_kb/wisdom/md_store.py +276 -251
  412. package/md_cg/whitebox_kb/wisdom/migrate_wisdom.py +476 -476
  413. package/md_cg/whitebox_kb/wisdom/multilang_ir.py +128 -124
  414. package/md_cg/whitebox_kb/wisdom/navigate.py +248 -248
  415. package/md_cg/whitebox_kb/wisdom/neural_retrieve.py +224 -224
  416. package/md_cg/whitebox_kb/wisdom/os_units.py +2735 -2735
  417. package/md_cg/whitebox_kb/wisdom/pattern_separation.py +376 -376
  418. package/md_cg/whitebox_kb/wisdom/prereq_map.json +364 -364
  419. package/md_cg/whitebox_kb/wisdom/python_code_units.py +2766 -2766
  420. package/md_cg/whitebox_kb/wisdom/role_solidified.json +7 -7
  421. package/md_cg/whitebox_kb/wisdom/route_memory.py +244 -244
  422. package/md_cg/whitebox_kb/wisdom/scene_reconstruction.py +148 -148
  423. package/md_cg/whitebox_kb/wisdom/snr_report.json +40 -40
  424. package/md_cg/whitebox_kb/wisdom/test_code_compose_domains.py +7541 -7541
  425. package/md_cg/whitebox_kb/wisdom/test_compiler_self_bootstrap.py +354 -354
  426. package/md_cg/whitebox_kb/wisdom/test_ecosystem_assembly.py +158 -158
  427. package/md_cg/whitebox_kb/wisdom/test_ecosystem_demos.py +193 -193
  428. package/md_cg/whitebox_kb/wisdom/test_graph_db.py +292 -292
  429. package/md_cg/whitebox_kb/wisdom/test_python_self_bootstrap.py +160 -160
  430. package/md_cg/whitebox_kb/wisdom/trigger_words_index.json +4366 -4366
  431. package/md_cg/whitebox_kb/wisdom/verifier.py +1297 -1297
  432. package/md_cg/writelimit.py +356 -356
  433. package/md_cg/writepipe.py +20 -8
  434. package/package.json +101 -96
  435. package/skills/plugin.json +54 -54
  436. package/skills/skills/designer-perspective/SKILL.md +158 -158
  437. package/skills/skills/designer-perspective/references/01-observation-position.md +66 -66
  438. package/skills/skills/designer-perspective/references/02-structure-recognition.md +62 -62
  439. package/skills/skills/designer-perspective/references/03-direction-judgment.md +55 -55
  440. package/skills/skills/designer-perspective/references/04-qualification-verdict.md +72 -72
  441. package/skills/skills/designer-perspective/references/05-condition-attribution.md +74 -74
  442. package/skills/skills/designer-perspective/scripts/designer.py +545 -545
  443. package/skills/skills/designer-perspective/tests/cases.jsonl +17 -17
  444. package/skills/skills/designer-perspective/tests/selftest.py +61 -61
  445. package/skills/skills/lingshu-browser/SKILL.md +60 -60
  446. package/skills/skills/lingshu-compiler/SKILL.md +56 -56
  447. package/skills/skills/lingshu-compiler/units/analyze-type-infer/SKILL.md +45 -45
  448. package/skills/skills/lingshu-compiler/units/check-name-real/SKILL.md +45 -45
  449. package/skills/skills/lingshu-compiler/units/compile-assign/SKILL.md +45 -45
  450. package/skills/skills/lingshu-compiler/units/compile-expr-tree/SKILL.md +45 -45
  451. package/skills/skills/lingshu-compiler/units/compile-full-pipeline/SKILL.md +45 -45
  452. package/skills/skills/lingshu-compiler/units/compile-func-def/SKILL.md +45 -45
  453. package/skills/skills/lingshu-compiler/units/compile-if-then/SKILL.md +45 -45
  454. package/skills/skills/lingshu-compiler/units/compile-logic-expr/SKILL.md +45 -45
  455. package/skills/skills/lingshu-compiler/units/compile-recursive/SKILL.md +45 -45
  456. package/skills/skills/lingshu-compiler/units/compile-scope/SKILL.md +45 -45
  457. package/skills/skills/lingshu-compiler/units/compile-type-check/SKILL.md +45 -45
  458. package/skills/skills/lingshu-compiler/units/compile-while/SKILL.md +45 -45
  459. package/skills/skills/lingshu-compiler/units/compiler-0010c4bf/SKILL.md +45 -45
  460. package/skills/skills/lingshu-compiler/units/compiler-0355bffb/SKILL.md +45 -45
  461. package/skills/skills/lingshu-compiler/units/compiler-0361708a/SKILL.md +45 -45
  462. package/skills/skills/lingshu-compiler/units/compiler-054a0414/SKILL.md +45 -45
  463. package/skills/skills/lingshu-compiler/units/compiler-05a1691a/SKILL.md +45 -45
  464. package/skills/skills/lingshu-compiler/units/compiler-05eeed1e/SKILL.md +45 -45
  465. package/skills/skills/lingshu-compiler/units/compiler-0622a1f6/SKILL.md +45 -45
  466. package/skills/skills/lingshu-compiler/units/compiler-08b54217/SKILL.md +45 -45
  467. package/skills/skills/lingshu-compiler/units/compiler-0a62b70c/SKILL.md +45 -45
  468. package/skills/skills/lingshu-compiler/units/compiler-0ab24d00/SKILL.md +45 -45
  469. package/skills/skills/lingshu-compiler/units/compiler-0e093688/SKILL.md +45 -45
  470. package/skills/skills/lingshu-compiler/units/compiler-0e82b966/SKILL.md +45 -45
  471. package/skills/skills/lingshu-compiler/units/compiler-0ee9b9b9/SKILL.md +45 -45
  472. package/skills/skills/lingshu-compiler/units/compiler-0f3787e6/SKILL.md +45 -45
  473. package/skills/skills/lingshu-compiler/units/compiler-1028685f/SKILL.md +45 -45
  474. package/skills/skills/lingshu-compiler/units/compiler-11897630/SKILL.md +45 -45
  475. package/skills/skills/lingshu-compiler/units/compiler-16661b9b/SKILL.md +45 -45
  476. package/skills/skills/lingshu-compiler/units/compiler-1f722303/SKILL.md +45 -45
  477. package/skills/skills/lingshu-compiler/units/compiler-25be1262/SKILL.md +45 -45
  478. package/skills/skills/lingshu-compiler/units/compiler-2a76ba07/SKILL.md +45 -45
  479. package/skills/skills/lingshu-compiler/units/compiler-2dbea54a/SKILL.md +45 -45
  480. package/skills/skills/lingshu-compiler/units/compiler-2df52f16/SKILL.md +45 -45
  481. package/skills/skills/lingshu-compiler/units/compiler-2ec2c9d2/SKILL.md +45 -45
  482. package/skills/skills/lingshu-compiler/units/compiler-2f8c8f39/SKILL.md +45 -45
  483. package/skills/skills/lingshu-compiler/units/compiler-38378ac7/SKILL.md +45 -45
  484. package/skills/skills/lingshu-compiler/units/compiler-39457d2e/SKILL.md +45 -45
  485. package/skills/skills/lingshu-compiler/units/compiler-39fb5926/SKILL.md +45 -45
  486. package/skills/skills/lingshu-compiler/units/compiler-47f4fbfa/SKILL.md +45 -45
  487. package/skills/skills/lingshu-compiler/units/compiler-4a8cd1f1/SKILL.md +45 -45
  488. package/skills/skills/lingshu-compiler/units/compiler-4b230b6b/SKILL.md +45 -45
  489. package/skills/skills/lingshu-compiler/units/compiler-4cbbda95/SKILL.md +45 -45
  490. package/skills/skills/lingshu-compiler/units/compiler-4d5a68ff/SKILL.md +45 -45
  491. package/skills/skills/lingshu-compiler/units/compiler-56dc9bdd/SKILL.md +45 -45
  492. package/skills/skills/lingshu-compiler/units/compiler-57e76ebe/SKILL.md +45 -45
  493. package/skills/skills/lingshu-compiler/units/compiler-61ff016b/SKILL.md +45 -45
  494. package/skills/skills/lingshu-compiler/units/compiler-63eae588/SKILL.md +45 -45
  495. package/skills/skills/lingshu-compiler/units/compiler-64c4224b/SKILL.md +45 -45
  496. package/skills/skills/lingshu-compiler/units/compiler-66377955/SKILL.md +45 -45
  497. package/skills/skills/lingshu-compiler/units/compiler-674ab4f6/SKILL.md +45 -45
  498. package/skills/skills/lingshu-compiler/units/compiler-6af76fd6/SKILL.md +45 -45
  499. package/skills/skills/lingshu-compiler/units/compiler-6d979db2/SKILL.md +45 -45
  500. package/skills/skills/lingshu-compiler/units/compiler-6de326c0/SKILL.md +45 -45
  501. package/skills/skills/lingshu-compiler/units/compiler-6f1c0eea/SKILL.md +45 -45
  502. package/skills/skills/lingshu-compiler/units/compiler-724d6c9b/SKILL.md +45 -45
  503. package/skills/skills/lingshu-compiler/units/compiler-7690177f/SKILL.md +45 -45
  504. package/skills/skills/lingshu-compiler/units/compiler-7b229a7d/SKILL.md +45 -45
  505. package/skills/skills/lingshu-compiler/units/compiler-7f471b3a/SKILL.md +45 -45
  506. package/skills/skills/lingshu-compiler/units/compiler-815cad08/SKILL.md +45 -45
  507. package/skills/skills/lingshu-compiler/units/compiler-83c61634/SKILL.md +45 -45
  508. package/skills/skills/lingshu-compiler/units/compiler-8c798c81/SKILL.md +45 -45
  509. package/skills/skills/lingshu-compiler/units/compiler-8dd747ac/SKILL.md +45 -45
  510. package/skills/skills/lingshu-compiler/units/compiler-90324d0a/SKILL.md +45 -45
  511. package/skills/skills/lingshu-compiler/units/compiler-94b8d72d/SKILL.md +45 -45
  512. package/skills/skills/lingshu-compiler/units/compiler-94f12231/SKILL.md +45 -45
  513. package/skills/skills/lingshu-compiler/units/compiler-95937c16/SKILL.md +45 -45
  514. package/skills/skills/lingshu-compiler/units/compiler-98a5625b/SKILL.md +45 -45
  515. package/skills/skills/lingshu-compiler/units/compiler-98b4c42f/SKILL.md +45 -45
  516. package/skills/skills/lingshu-compiler/units/compiler-98e3894a/SKILL.md +45 -45
  517. package/skills/skills/lingshu-compiler/units/compiler-9bdfe4b8/SKILL.md +45 -45
  518. package/skills/skills/lingshu-compiler/units/compiler-9d9b4e83/SKILL.md +45 -45
  519. package/skills/skills/lingshu-compiler/units/compiler-9f7be5ad/SKILL.md +45 -45
  520. package/skills/skills/lingshu-compiler/units/compiler-a6daf076/SKILL.md +45 -45
  521. package/skills/skills/lingshu-compiler/units/compiler-a7995a0c/SKILL.md +45 -45
  522. package/skills/skills/lingshu-compiler/units/compiler-a8399248/SKILL.md +45 -45
  523. package/skills/skills/lingshu-compiler/units/compiler-aabbd099/SKILL.md +45 -45
  524. package/skills/skills/lingshu-compiler/units/compiler-afe169d8/SKILL.md +45 -45
  525. package/skills/skills/lingshu-compiler/units/compiler-b0678bda/SKILL.md +45 -45
  526. package/skills/skills/lingshu-compiler/units/compiler-b09bd196/SKILL.md +45 -45
  527. package/skills/skills/lingshu-compiler/units/compiler-b1396e23/SKILL.md +45 -45
  528. package/skills/skills/lingshu-compiler/units/compiler-b9b31ce0/SKILL.md +45 -45
  529. package/skills/skills/lingshu-compiler/units/compiler-c10264a7/SKILL.md +45 -45
  530. package/skills/skills/lingshu-compiler/units/compiler-cb1e8e4b/SKILL.md +45 -45
  531. package/skills/skills/lingshu-compiler/units/compiler-ccafd438/SKILL.md +45 -45
  532. package/skills/skills/lingshu-compiler/units/compiler-cda9c262/SKILL.md +45 -45
  533. package/skills/skills/lingshu-compiler/units/compiler-ce648068/SKILL.md +45 -45
  534. package/skills/skills/lingshu-compiler/units/compiler-cf5776a4/SKILL.md +45 -45
  535. package/skills/skills/lingshu-compiler/units/compiler-d974e5d3/SKILL.md +45 -45
  536. package/skills/skills/lingshu-compiler/units/compiler-e3979fd3/SKILL.md +45 -45
  537. package/skills/skills/lingshu-compiler/units/compiler-eb1cf2b5/SKILL.md +45 -45
  538. package/skills/skills/lingshu-compiler/units/compiler-ecb30d5b/SKILL.md +45 -45
  539. package/skills/skills/lingshu-compiler/units/compiler-f8c8b24b/SKILL.md +45 -45
  540. package/skills/skills/lingshu-compiler/units/compiler-f99fedbe/SKILL.md +45 -45
  541. package/skills/skills/lingshu-compiler/units/compiler-fa8ff5f7/SKILL.md +45 -45
  542. package/skills/skills/lingshu-compiler/units/compiler-fe1b058d/SKILL.md +45 -45
  543. package/skills/skills/lingshu-compiler/units/lex-chinese-program/SKILL.md +45 -45
  544. package/skills/skills/lingshu-compiler/units/lex-dao-de-jing/SKILL.md +45 -45
  545. package/skills/skills/lingshu-compiler/units/lex-nine-chapters/SKILL.md +45 -45
  546. package/skills/skills/lingshu-compiler/units/vm-arithmetic/SKILL.md +45 -45
  547. package/skills/skills/lingshu-compiler/units/vm-array-ops/SKILL.md +45 -45
  548. package/skills/skills/lingshu-compiler/units/vm-closure-call/SKILL.md +45 -45
  549. package/skills/skills/lingshu-compiler/units/vm-closure-create/SKILL.md +45 -45
  550. package/skills/skills/lingshu-compiler/units/vm-compare/SKILL.md +45 -45
  551. package/skills/skills/lingshu-compiler/units/vm-cond-jump/SKILL.md +45 -45
  552. package/skills/skills/lingshu-compiler/units/vm-cond-space/SKILL.md +45 -45
  553. package/skills/skills/lingshu-compiler/units/vm-exception/SKILL.md +45 -45
  554. package/skills/skills/lingshu-compiler/units/vm-func-call/SKILL.md +45 -45
  555. package/skills/skills/lingshu-compiler/units/vm-loop-run/SKILL.md +45 -45
  556. package/skills/skills/lingshu-compiler/units/vm-profiling/SKILL.md +45 -45
  557. package/skills/skills/lingshu-compiler/units/vm-refcount/SKILL.md +45 -45
  558. package/skills/skills/lingshu-compiler/units/vm-run-loop/SKILL.md +45 -45
  559. package/skills/skills/lingshu-compiler/units/vm-short-circuit/SKILL.md +45 -45
  560. package/skills/skills/lingshu-compiler/units/vm-stack-guard/SKILL.md +45 -45
  561. package/skills/skills/lingshu-compiler/units/vm-stack-ops/SKILL.md +45 -45
  562. package/skills/skills/lingshu-compiler/units/vm-trust-accum/SKILL.md +45 -45
  563. package/skills/skills/lingshu-graph/SKILL.md +63 -63
  564. package/skills/skills/lingshu-net/SKILL.md +48 -48
  565. package/skills/skills/lingshu-os/SKILL.md +64 -64
  566. package/skills/skills/lingshu-pylang/SKILL.md +71 -71
  567. package/src/bridge.ts +33 -0
  568. package/src/hooks.ts +38 -2
  569. package/src/index.ts +526 -518
  570. package/src/lib/datapath.ts +326 -326
  571. package/src/lib/mdcg_client.ts +413 -413
  572. package/src/lib/mutual.ts +428 -428
  573. package/src/lib/prompt_safety.ts +62 -62
  574. package/src/lib/python_path.ts +71 -71
  575. package/src/lib/roleplay_web.ts +116 -29
  576. package/src/lib/token_store.ts +13 -3
  577. package/src/tools.ts +212 -212
  578. package/zcode/AGENTS.md +11 -3
  579. package/zcode/README.md +41 -41
  580. /package/docs/{mdcg → hive}//344/270/273/344/273/243/347/220/206/345/255/220/344/273/243/347/220/206/350/256/260/345/277/206/346/236/266/346/236/204/350/256/276/350/256/241.md" +0 -0
@@ -1,316 +1,369 @@
1
- # -*- coding: utf-8 -*-
2
- """S8 时间算子探针(阶段二 4.1,脚本式,exit code 定成败)。
3
-
4
- 用法:python -X utf8 -m md_cg.test_retr_s8_time
5
- 覆盖:
6
- - 纯函数:轴归一与封闭枚举、按轴取窗、重叠 vs 端点模式、入参 fail-closed
7
- - 候选层过滤:效力轴 fail-open(缺字段=沉默不是否认)/ 观察轴 fail-closed
8
- (缺字段=数据异常,须计数可见)
9
- - meta["time_filter"] 审计块;默认关 meta 键集合不变
10
- - 绕开热路径缓存(**读+写双侧**):缓存键不含时间参数,读侧失守会返回未过滤
11
- 结果、写侧失守会把过滤结果覆盖进缓存让后续默认查询少结果,两者都是静默错答
12
- - stg 四 op 轴感知(observed 缺省逐位兼容 / effective 生效 / 非法轴 fail-closed)
13
- - recall 透传
14
-
15
- 语料 15 节点(同一正文 token「阿尔法」,保证都被召回,差异只在时间字段):
16
- 效力组 7:eff_a[100,200] eff_b[300,400] eff_c[150,350] eff_none(无端点)
17
- eff_halffrom[500,-] eff_halfuntil[-,50] eff_d[1000,1100]
18
- 观察组 7:obs_1000/2000/3000/8000/9000(temporal) obs_win_4k_5k/6k_7k(time_window)
19
- 旧库 1:legacy_noaxis(手工抹掉 temporal 与 time_window → 观察轴不可判定)
20
- """
21
- import glob
22
- import os
23
- import sys
24
- import tempfile
25
-
26
- sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
27
-
28
- from md_cg import hotcache, nodefile, stg, trust # noqa: E402
29
- from md_cg.mdcg import MdCG # noqa: E402
30
- from md_cg.mdcos import MdCGSecure # noqa: E402
31
- from md_cg.security import Principal # noqa: E402
32
-
33
- passed = 0
34
- failed = 0
35
- TEXT = "阿尔法 时间 探针"
36
- QUERY = "阿尔法"
37
- #: 效力轴上**无字段**的节点(按效力轴 fail-open 策略保留):eff_none + 观察组 7 + 旧库 1
38
- _NO_EFF_AXIS = {"eff_none", "legacy_noaxis",
39
- "obs_1000", "obs_2000", "obs_3000", "obs_t_8000", "obs_t_9000",
40
- "obs_win_4k_5k", "obs_win_6k_7k"}
41
-
42
-
43
- def check(name, cond, detail=""):
44
- global passed, failed
45
- if cond:
46
- passed += 1
47
- print(" [PASS] " + name)
48
- else:
49
- failed += 1
50
- print(" [FAIL] " + name + " " + detail)
51
-
52
-
53
- def _ids(results):
54
- return [r[0]["id"] for r in results]
55
-
56
-
57
- def _node_file(root, nid):
58
- hits = glob.glob(os.path.join(root, "**", nid + ".md"), recursive=True)
59
- return hits[0] if hits else None
60
-
61
-
62
- def _build(root):
63
- cg = MdCG(root)
64
- for nid, kw in (
65
- ("eff_a", {"effective_from": 100, "effective_until": 200}),
66
- ("eff_b", {"effective_from": 300, "effective_until": 400}),
67
- ("eff_c", {"effective_from": 150, "effective_until": 350}),
68
- ("eff_none", {}),
69
- ("eff_halffrom", {"effective_from": 500}),
70
- ("eff_halfuntil", {"effective_until": 50}),
71
- ("eff_d", {"effective_from": 1000, "effective_until": 1100}),
72
- ("obs_1000", {"temporal": 1000.0}),
73
- ("obs_2000", {"temporal": 2000.0}),
74
- ("obs_3000", {"temporal": 3000.0}),
75
- ("obs_win_4k_5k", {"condition_space": {"time_window": [4000, 5000]}}),
76
- ("obs_win_6k_7k", {"condition_space": {"time_window": [6000, 7000]}}),
77
- ("obs_t_8000", {"temporal": 8000.0}),
78
- ("obs_t_9000", {"temporal": 9000.0}),
79
- ("legacy_noaxis", {}),
80
- ):
81
- cg.add(nid, TEXT, "knowledge", **kw)
82
- cg.flush()
83
- # 旧库形态:手工抹掉观察轴两字段(add 会强制补 time_window,只能改文件模拟)
84
- p = _node_file(root, "legacy_noaxis")
85
- fm, content = nodefile.loads(open(p, encoding="utf-8").read())
86
- fm.pop("temporal", None)
87
- cs = dict(fm.get("condition_space") or {})
88
- cs.pop("time_window", None)
89
- fm["condition_space"] = cs
90
- open(p, "w", encoding="utf-8").write(nodefile.dumps(fm, content))
91
- cg.rebuild_index()
92
- return cg
93
-
94
-
95
- def main():
96
- # ================= 1) 纯函数层 =================
97
- check("轴归一:None → effective;大小写归一;believed 抛 ValueError",
98
- trust.time_axis_of(None) == "effective"
99
- and trust.time_axis_of("OBSERVED") == "observed"
100
- and trust.time_axis_of("effective") == "effective"
101
- and _raises(ValueError, lambda: trust.time_axis_of("believed")),
102
- str(trust.TIME_AXES))
103
-
104
- check("重叠模式:有交 True / 无交 False / 候选两端不可解析 False",
105
- trust.window_match(10, 20, 15, 25) is True
106
- and trust.window_match(10, 20, 30, 40) is False
107
- and trust.window_match(None, None, 1, 2) is False)
108
-
109
- check("端点模式:B1 缺省 gte/lte;单端算子不误杀全空",
110
- trust.window_match(10, 20, 5, 25, "gte", "lte") is True
111
- and trust.window_match(10, 20, 15, 25, "gte", "lte") is False
112
- and trust.window_match(10, 20, 5, None, "gte", None) is True
113
- and trust.window_match(3, 20, 5, None, "gte", None) is False)
114
-
115
- check("入参 fail-closed 四则:未启用 / 孤算子 / 逆序 / 非法轴",
116
- trust.check_time_args()[:2] == (False, None)
117
- and trust.check_time_args(start_operator="gte")[2] != ""
118
- and trust.check_time_args(start_time=300, end_time=100)[2] != ""
119
- and trust.check_time_args(start_time=100, time_axis="believed")[2] != "")
120
-
121
- check("按轴取窗:观察轴 temporal 优先于 time_window;效力轴别名回落 valid_from",
122
- trust.time_window_of({"temporal": 7.0,
123
- "condition_space": {"time_window": [1, 2]}},
124
- "observed") == (7.0, 7.0)
125
- and trust.time_window_of({"valid_from": 3, "valid_until": 9},
126
- "effective") == (3, 9)
127
- and trust.time_window_of({}, "effective") == (None, None))
128
-
129
- _kept, _dr, _ms = trust.filter_by_time(
130
- [{"effective_from": 1, "effective_until": 2}, {}], "effective", 5, 9)
131
- _kept2, _dr2, _ms2 = trust.filter_by_time([{}], "observed", 5, 9)
132
- check("轴策略:效力轴缺字段 fail-open 保留;观察轴缺字段 fail-closed 计入 missing",
133
- _dr == 1 and _ms == 0 and _dr2 == 1 and _ms2 == 1)
134
-
135
- # ================= 2) 建库 =================
136
- root = tempfile.mkdtemp(prefix="retr_s8_")
137
- cg = _build(root)
138
-
139
- # 默认关(无时间入参)基线
140
- # 注:热路径接入点是 `MdCGSecure.search_rrf`,`MdCG.search` **无缓存**——
141
- # 故「cached 标记」不能在此处取证(否则恒真的弱断言),见第 9 节。
142
- r0, m0 = cg.search(QUERY, k=20, judge=False, record=False)
143
- base = sorted(_ids(r0))
144
- r0b, m0b = cg.search(QUERY, k=20, judge=False, record=False)
145
- check("默认关:meta 无 time_filter、候选 15 条、二次同口径可复算",
146
- "time_filter" not in m0 and len(base) == 15
147
- and sorted(_ids(r0b)) == base,
148
- "n=%d keys=%s" % (len(base), sorted(m0.keys())))
149
-
150
- # ================= 3) 效力轴(重叠模式)=================
151
- r1, m1 = cg.search(QUERY, k=20, judge=False, record=False,
152
- start_time=150, end_time=250, time_axis="effective")
153
- ids1 = set(_ids(r1))
154
- tf1 = m1.get("time_filter") or {}
155
- check("效力轴重叠:窗内相交保留、窗外剔除、无端点 fail-open 保留",
156
- {"eff_a", "eff_c", "eff_none"} <= ids1
157
- and not ({"eff_b", "eff_halffrom", "eff_halfuntil", "eff_d"} & ids1)
158
- and len(ids1) == 11,
159
- str(sorted(ids1)))
160
- check("效力轴:审计块 axis/mode/applied 正确、dropped 与存活数记账自洽",
161
- tf1.get("axis") == "effective" and tf1.get("mode") == "overlap"
162
- and tf1.get("applied") is True and tf1.get("dropped") == 4
163
- and tf1.get("dropped") + len(ids1) == 15
164
- and tf1.get("start") == 150 and tf1.get("end") == 250,
165
- str(tf1))
166
-
167
- # ================= 4) 观察轴(窗口语义 + fail-closed)=================
168
- r2, m2 = cg.search(QUERY, k=20, judge=False, record=False,
169
- start_time=2500, end_time=3500, time_axis="observed")
170
- ids2 = _ids(r2)
171
- tf2 = m2.get("time_filter") or {}
172
- check("观察轴:temporal 命中唯一、效力组按观测窗不相交剔除",
173
- ids2 == ["obs_3000"], str(ids2))
174
- check("观察轴:无字段节点 fail-closed 并计入 axis_missing",
175
- tf2.get("axis_missing") == 1 and tf2.get("dropped") == 14
176
- and tf2.get("dropped") + len(ids2) == 15, str(tf2))
177
-
178
- # ================= 5) 端点模式(单端算子)=================
179
- r3, m3 = cg.search(QUERY, k=20, judge=False, record=False,
180
- start_time=150, start_operator="gte",
181
- time_axis="effective")
182
- ids3 = set(_ids(r3))
183
- tf3 = m3.get("time_filter") or {}
184
- # 只给起点算子 → 只筛起点侧:eff_a(起点 100<150)与 eff_halfuntil(起点缺失、
185
- # 端点模式下该侧不可比较)被剔除;eff_none 与全部观察组/旧库节点在效力轴**无字段**
186
- # → fail-open 保留(沉默不是否认)。此处非空集本身即旧缺陷(单端算子恒空)的回归证据。
187
- check("端点模式:单端 gte 只筛起点侧且不返回空集、无该轴字段者 fail-open 保留",
188
- ids3 == {"eff_b", "eff_c", "eff_d", "eff_halffrom"} | _NO_EFF_AXIS
189
- and tf3.get("mode") == "endpoint"
190
- and tf3.get("start_operator") == "gte"
191
- and tf3.get("dropped") == 2, str(sorted(ids3)))
192
-
193
- # ================= 6) 误用 fail-closed =================
194
- check("误用三则经库层抛 ValueError(孤算子 / 逆序 / 非法轴)",
195
- _raises(ValueError, lambda: cg.search(
196
- QUERY, k=5, judge=False, record=False, start_operator="gte"))
197
- and _raises(ValueError, lambda: cg.search(
198
- QUERY, k=5, judge=False, record=False, start_time=300, end_time=100))
199
- and _raises(ValueError, lambda: cg.search(
200
- QUERY, k=5, judge=False, record=False, start_time=100,
201
- time_axis="believed")))
202
-
203
- # ================= 7) stg 四 op 轴感知 =================
204
- tl_obs = stg.timeline(cg, limit=100, time_axis="observed")
205
- tl_eff = stg.timeline(cg, limit=100, time_axis="effective")
206
- check("stg timeline:观察轴 14 条(旧库节点不可判定被跳过)、效力轴 4 条(两端齐备)",
207
- tl_obs["count"] == 14 and tl_eff["count"] == 4,
208
- "obs=%s eff=%s" % (tl_obs["count"], tl_eff["count"]))
209
- check("stg timeline:缺省轴与显式 observed 逐位一致(旧行为兼容)",
210
- stg.timeline(cg, limit=100)["count"] == tl_obs["count"])
211
-
212
- # 返回结构取证:relation 的时间结果在 ["time"]["relation"](非顶层 time_relation)
213
- rel_eff = stg.relation(cg, "eff_a", "eff_b", time_axis="effective")
214
- rel_obs = stg.relation(cg, "eff_a", "eff_b", time_axis="observed")
215
- check("stg relation:效力轴取 effective 区间(eff_a before eff_b);观察轴取写入观测时刻(区间不同)",
216
- rel_eff["time"]["relation"] == "before"
217
- and rel_eff["time"]["a"] == (100.0, 200.0)
218
- and rel_obs["time"]["a"] != (100.0, 200.0),
219
- "%s / %s" % (rel_eff["time"], rel_obs["time"]))
220
-
221
- an_eff = stg.anchors(cg, time_window=[150, 250], limit=50,
222
- time_axis="effective")
223
- an_obs = stg.anchors(cg, time_window=[150, 250], limit=50,
224
- time_axis="observed")
225
- check("stg anchors:效力轴命中 2(eff_a overlaps + eff_c contains)、观察轴 0",
226
- an_eff["count"] == 2 and an_obs["count"] == 0,
227
- "eff=%s obs=%s" % (an_eff["count"], an_obs["count"]))
228
-
229
- check("stg 非法轴 fail-closed(四 op 同源 trust.time_axis_of)",
230
- _raises(ValueError, lambda: stg.consistency(cg, time_axis="believed"))
231
- and _raises(ValueError, lambda: stg.relation(
232
- cg, "eff_a", "eff_b", time_axis="believed")))
233
-
234
- # ================= 8) 关→开→关 默认口径不变 =================
235
- # 置于 Secure 层操作**之前**:那些调用会记录访问(recall 无法关 record),
236
- # 可能与基线产生与时间算子无关的差异,污染「首末一致」这一断言。
237
- r5, m5 = cg.search(QUERY, k=20, judge=False, record=False)
238
- check("默认口径等价:关→开→关 首末一致且无 time_filter 键",
239
- sorted(_ids(r5)) == base and "time_filter" not in m5)
240
-
241
- # ================= 9) 热缓存:命中 + 时间算子读/写双侧绕行 =================
242
- sec = MdCGSecure(root, principal=Principal(
243
- actor="test-s8", clearance="secret", can_write=True,
244
- role="designer", auth_mode="local-cli"))
245
- hotcache.attach(sec)
246
- _sa, sma = sec.search_rrf(QUERY, k=20, judge=False, record=False)
247
- _sb, smb = sec.search_rrf(QUERY, k=20, judge=False, record=False)
248
- check("热缓存:同参二次 search_rrf 命中(cached=True)且结果一致",
249
- sma.get("cached") is not True and smb.get("cached") is True
250
- and [r[0]["id"] for r in _sa] == [r[0]["id"] for r in _sb],
251
- "a=%s b=%s" % (sma.get("cached"), smb.get("cached")))
252
-
253
- # 上一步已把 15 条全量结果写进缓存键(键不含时间参数)。带时间算子的查询
254
- # 若只绕开「读」而漏掉「写」,则返回的 11 条会把缓存覆盖成子集 —— 故下方
255
- # 「随后默认查询仍为 15 条」是**写侧绕行**的判别性证据。
256
- _t1, mt1 = sec.search_rrf(QUERY, k=20, judge=False, record=False,
257
- start_time=150, end_time=250,
258
- time_axis="effective")
259
- check("时间算子启用时绕开热缓存:缓存已有 15 条全量,仍返回过滤后 11 条、meta 无 cached",
260
- "cached" not in mt1 and len(_t1) == 11
261
- and sorted(r[0]["id"] for r in _t1) == sorted(ids1),
262
- "n=%d cached=%s" % (len(_t1), mt1.get("cached")))
263
- _d2, md2 = sec.search_rrf(QUERY, k=20, judge=False, record=False)
264
- check("时间算子查询不污染缓存(写侧同受绕行约束):其后默认查询仍为全量 15 条",
265
- len(_d2) == 15 and md2.get("cached") is True,
266
- "n=%d cached=%s" % (len(_d2), md2.get("cached")))
267
-
268
- # ================= 10) recall 透传 =================
269
- out = sec.recall(QUERY, k=20, judge=False, start_time=2500,
270
- end_time=3500, time_axis="observed")
271
- mr = out.get("meta") or {}
272
- ids_r = [e["id"] for e in (out.get("pack") or [])]
273
- check("recall 透传:meta 带 time_filter(观察轴)且过滤真实生效",
274
- (mr.get("time_filter") or {}).get("axis") == "observed"
275
- and ids_r == ["obs_3000"], str(ids_r))
276
-
277
- # ================= 11) Secure.search 常规路径审计块(MCP cg(op=read) 实走此路)=================
278
- # 判别性:本节的观测量=「过滤生效 ∧ meta 带审计块」**同时**成立,缺一即 FAIL。
279
- # 缺陷史(2026-09-20 取证):候选层过滤已在 `_candidates` 完成(结果正确),但
280
- # `MdCGSecure.search` 的**常规返回路径**未把 `_time_filter_stat` 交给 `_emit` ——
281
- # 审计块此前只在 no_candidates 分支落键 → 「过滤确实生效而审计不可见」(静默,
282
- # 调用方无法区分「未启用」与「启用但候选全 fail-open 保留」)。
283
- # 只用 `cg.search`(父类,本无此缺口)或 `search_rrf`(另行落键)**均测不到**该缺口,
284
- # 故单列一节:本节的红/绿随该唯一缺口翻转,是它的判别性守卫。
285
- _s11, m11 = sec.search(QUERY, k=20, judge=False, record=False,
286
- start_time=150, end_time=250, time_axis="effective")
287
- tf11 = m11.get("time_filter") or {}
288
- check("Secure.search 常规路径:过滤生效且 meta 带 time_filter(审计块不被吞)",
289
- sorted(r[0]["id"] for r in _s11) == sorted(ids1)
290
- and tf11.get("axis") == "effective" and tf11.get("mode") == "overlap"
291
- and tf11.get("applied") is True and tf11.get("dropped") == 4,
292
- "n=%d tf=%s" % (len(_s11), tf11))
293
-
294
- _s11b, m11b = sec.search(QUERY, k=20, judge=False, record=False)
295
- check("Secure.search 默认关:候选不变且 meta 键集合不含 time_filter(默认关零变更)",
296
- "time_filter" not in m11b and len(_s11b) == 15,
297
- "n=%d keys=%s" % (len(_s11b), sorted(m11b.keys())))
298
-
299
- print("\ntest_retr_s8: %d 通过 / %d 失败" % (passed, failed))
300
- return 0 if failed == 0 else 1
301
-
302
-
303
- def _raises(exc, fn):
304
- try:
305
- fn()
306
- except exc:
307
- return True
308
- except Exception:
309
- return False
310
- return False
311
-
312
-
313
- if __name__ == "__main__":
314
- if hasattr(sys.stdout, "reconfigure"):
315
- sys.stdout.reconfigure(encoding="utf-8")
316
- sys.exit(main())
1
+ # -*- coding: utf-8 -*-
2
+ """S8 时间算子探针(阶段二 4.1,脚本式,exit code 定成败)。
3
+
4
+ 用法:python -X utf8 -m md_cg.test_retr_s8_time
5
+ 覆盖:
6
+ - 纯函数:轴归一与封闭枚举、按轴取窗、重叠 vs 端点模式、入参 fail-closed
7
+ - 候选层过滤:效力轴 fail-open(缺字段=沉默不是否认)/ 观察轴 fail-closed
8
+ (缺字段=数据异常,须计数可见)
9
+ - meta["time_filter"] 审计块;默认关 meta 键集合不变
10
+ - 绕开热路径缓存(**读+写双侧**):缓存键不含时间参数,读侧失守会返回未过滤
11
+ 结果、写侧失守会把过滤结果覆盖进缓存让后续默认查询少结果,两者都是静默错答
12
+ - stg 四 op 轴感知(observed 缺省逐位兼容 / effective 生效 / 非法轴 fail-closed)
13
+ - 单位归一(issue #23):`trust.epoch_seconds` 唯一实现点;毫秒存量不改盘即可参与
14
+ timeline 排序与 S2 时间门控(旧行为下 1.6e12 恒排最前、秒窗被误判不相交)
15
+ - recall 透传
16
+
17
+ 语料 15 节点(同一正文 token「阿尔法」,保证都被召回,差异只在时间字段):
18
+ 效力组 7:eff_a[100,200] eff_b[300,400] eff_c[150,350] eff_none(无端点)
19
+ eff_halffrom[500,-] eff_halfuntil[-,50] eff_d[1000,1100]
20
+ 观察组 7:obs_1000/2000/3000/8000/9000(temporal) obs_win_4k_5k/6k_7k(time_window)
21
+ 旧库 1:legacy_noaxis(手工抹掉 temporal 与 time_window → 观察轴不可判定)
22
+ """
23
+ import glob
24
+ import os
25
+ import sys
26
+ import tempfile
27
+
28
+ sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
29
+
30
+ from md_cg import hotcache, nodefile, stg, trust # noqa: E402
31
+ from md_cg.mdcg import MdCG # noqa: E402
32
+ from md_cg.mdcos import MdCGSecure # noqa: E402
33
+ from md_cg.security import Principal # noqa: E402
34
+
35
+ passed = 0
36
+ failed = 0
37
+ TEXT = "阿尔法 时间 探针"
38
+ QUERY = "阿尔法"
39
+ #: 效力轴上**无字段**的节点(按效力轴 fail-open 策略保留):eff_none + 观察组 7 + 旧库 1
40
+ _NO_EFF_AXIS = {"eff_none", "legacy_noaxis",
41
+ "obs_1000", "obs_2000", "obs_3000", "obs_t_8000", "obs_t_9000",
42
+ "obs_win_4k_5k", "obs_win_6k_7k"}
43
+
44
+
45
+ def check(name, cond, detail=""):
46
+ global passed, failed
47
+ if cond:
48
+ passed += 1
49
+ print(" [PASS] " + name)
50
+ else:
51
+ failed += 1
52
+ print(" [FAIL] " + name + " " + detail)
53
+
54
+
55
+ def _ids(results):
56
+ return [r[0]["id"] for r in results]
57
+
58
+
59
+ def _node_file(root, nid):
60
+ hits = glob.glob(os.path.join(root, "**", nid + ".md"), recursive=True)
61
+ return hits[0] if hits else None
62
+
63
+
64
+ def _build(root):
65
+ cg = MdCG(root)
66
+ for nid, kw in (
67
+ ("eff_a", {"effective_from": 100, "effective_until": 200}),
68
+ ("eff_b", {"effective_from": 300, "effective_until": 400}),
69
+ ("eff_c", {"effective_from": 150, "effective_until": 350}),
70
+ ("eff_none", {}),
71
+ ("eff_halffrom", {"effective_from": 500}),
72
+ ("eff_halfuntil", {"effective_until": 50}),
73
+ ("eff_d", {"effective_from": 1000, "effective_until": 1100}),
74
+ ("obs_1000", {"temporal": 1000.0}),
75
+ ("obs_2000", {"temporal": 2000.0}),
76
+ ("obs_3000", {"temporal": 3000.0}),
77
+ ("obs_win_4k_5k", {"condition_space": {"time_window": [4000, 5000]}}),
78
+ ("obs_win_6k_7k", {"condition_space": {"time_window": [6000, 7000]}}),
79
+ ("obs_t_8000", {"temporal": 8000.0}),
80
+ ("obs_t_9000", {"temporal": 9000.0}),
81
+ ("legacy_noaxis", {}),
82
+ ):
83
+ cg.add(nid, TEXT, "knowledge", **kw)
84
+ cg.flush()
85
+ # 旧库形态:手工抹掉观察轴两字段(add 会强制补 time_window,只能改文件模拟)
86
+ p = _node_file(root, "legacy_noaxis")
87
+ fm, content = nodefile.loads(open(p, encoding="utf-8").read())
88
+ fm.pop("temporal", None)
89
+ cs = dict(fm.get("condition_space") or {})
90
+ cs.pop("time_window", None)
91
+ fm["condition_space"] = cs
92
+ open(p, "w", encoding="utf-8").write(nodefile.dumps(fm, content))
93
+ cg.rebuild_index()
94
+ return cg
95
+
96
+
97
+ def main():
98
+ # ================= 1) 纯函数层 =================
99
+ check("轴归一:None → effective;大小写归一;believed 抛 ValueError",
100
+ trust.time_axis_of(None) == "effective"
101
+ and trust.time_axis_of("OBSERVED") == "observed"
102
+ and trust.time_axis_of("effective") == "effective"
103
+ and _raises(ValueError, lambda: trust.time_axis_of("believed")),
104
+ str(trust.TIME_AXES))
105
+
106
+ check("重叠模式:有交 True / 无交 False / 候选两端不可解析 False",
107
+ trust.window_match(10, 20, 15, 25) is True
108
+ and trust.window_match(10, 20, 30, 40) is False
109
+ and trust.window_match(None, None, 1, 2) is False)
110
+
111
+ check("端点模式:B1 缺省 gte/lte;单端算子不误杀全空",
112
+ trust.window_match(10, 20, 5, 25, "gte", "lte") is True
113
+ and trust.window_match(10, 20, 15, 25, "gte", "lte") is False
114
+ and trust.window_match(10, 20, 5, None, "gte", None) is True
115
+ and trust.window_match(3, 20, 5, None, "gte", None) is False)
116
+
117
+ check("入参 fail-closed 四则:未启用 / 孤算子 / 逆序 / 非法轴",
118
+ trust.check_time_args()[:2] == (False, None)
119
+ and trust.check_time_args(start_operator="gte")[2] != ""
120
+ and trust.check_time_args(start_time=300, end_time=100)[2] != ""
121
+ and trust.check_time_args(start_time=100, time_axis="believed")[2] != "")
122
+
123
+ check("按轴取窗:观察轴 temporal 优先于 time_window;效力轴别名回落 valid_from",
124
+ trust.time_window_of({"temporal": 7.0,
125
+ "condition_space": {"time_window": [1, 2]}},
126
+ "observed") == (7.0, 7.0)
127
+ and trust.time_window_of({"valid_from": 3, "valid_until": 9},
128
+ "effective") == (3, 9)
129
+ and trust.time_window_of({}, "effective") == (None, None))
130
+
131
+ # 单位归一(issue #23):唯一实现点 trust.epoch_seconds —— 秒过秒、毫秒 /1000、
132
+ # 全时窗哨兵与非数值不误判。阈值 1e11 的判别力全靠「哨兵与秒值都在阈下」这一条。
133
+ check("epoch_seconds:秒直通 / 毫秒归一 / 哨兵与非数值不误判",
134
+ trust.epoch_seconds(1700000000.0) == 1700000000.0
135
+ and trust.epoch_seconds(1700000000000) == 1700000000.0
136
+ and trust.epoch_seconds(1600003600000.0) == 1600003600.0
137
+ and trust.epoch_seconds(nodefile.FULL_TIME_WINDOW_MAX) == \
138
+ nodefile.FULL_TIME_WINDOW_MAX
139
+ and trust.epoch_seconds(None) is None
140
+ and trust.epoch_seconds("1700000000") is None,
141
+ str(trust._MS_EPOCH_THRESHOLD))
142
+
143
+ check("parse_time:数字与数字串两条路径都归一,且秒值直通不回退",
144
+ trust.parse_time(1700000000000) == 1700000000.0
145
+ and trust.parse_time("1700000000000") == 1700000000.0
146
+ and trust.parse_time(1700000000.0) == 1700000000.0
147
+ and trust.parse_time("1700000000") == 1700000000.0
148
+ and trust.parse_time(None) is None
149
+ and trust.parse_time("2020-01-01") is not None)
150
+
151
+ _kept, _dr, _ms = trust.filter_by_time(
152
+ [{"effective_from": 1, "effective_until": 2}, {}], "effective", 5, 9)
153
+ _kept2, _dr2, _ms2 = trust.filter_by_time([{}], "observed", 5, 9)
154
+ check("轴策略:效力轴缺字段 fail-open 保留;观察轴缺字段 fail-closed 计入 missing",
155
+ _dr == 1 and _ms == 0 and _dr2 == 1 and _ms2 == 1)
156
+
157
+ # ================= 2) 建库 =================
158
+ root = tempfile.mkdtemp(prefix="retr_s8_")
159
+ cg = _build(root)
160
+
161
+ # 默认关(无时间入参)基线
162
+ # 注:热路径接入点是 `MdCGSecure.search_rrf`,`MdCG.search` **无缓存**——
163
+ # 故「cached 标记」不能在此处取证(否则恒真的弱断言),见第 9 节。
164
+ r0, m0 = cg.search(QUERY, k=20, judge=False, record=False)
165
+ base = sorted(_ids(r0))
166
+ r0b, m0b = cg.search(QUERY, k=20, judge=False, record=False)
167
+ check("默认关:meta 无 time_filter、候选 15 条、二次同口径可复算",
168
+ "time_filter" not in m0 and len(base) == 15
169
+ and sorted(_ids(r0b)) == base,
170
+ "n=%d keys=%s" % (len(base), sorted(m0.keys())))
171
+
172
+ # ================= 3) 效力轴(重叠模式)=================
173
+ r1, m1 = cg.search(QUERY, k=20, judge=False, record=False,
174
+ start_time=150, end_time=250, time_axis="effective")
175
+ ids1 = set(_ids(r1))
176
+ tf1 = m1.get("time_filter") or {}
177
+ check("效力轴重叠:窗内相交保留、窗外剔除、无端点 fail-open 保留",
178
+ {"eff_a", "eff_c", "eff_none"} <= ids1
179
+ and not ({"eff_b", "eff_halffrom", "eff_halfuntil", "eff_d"} & ids1)
180
+ and len(ids1) == 11,
181
+ str(sorted(ids1)))
182
+ check("效力轴:审计块 axis/mode/applied 正确、dropped 与存活数记账自洽",
183
+ tf1.get("axis") == "effective" and tf1.get("mode") == "overlap"
184
+ and tf1.get("applied") is True and tf1.get("dropped") == 4
185
+ and tf1.get("dropped") + len(ids1) == 15
186
+ and tf1.get("start") == 150 and tf1.get("end") == 250,
187
+ str(tf1))
188
+
189
+ # ================= 4) 观察轴(窗口语义 + fail-closed)=================
190
+ r2, m2 = cg.search(QUERY, k=20, judge=False, record=False,
191
+ start_time=2500, end_time=3500, time_axis="observed")
192
+ ids2 = _ids(r2)
193
+ tf2 = m2.get("time_filter") or {}
194
+ check("观察轴:temporal 命中唯一、效力组按观测窗不相交剔除",
195
+ ids2 == ["obs_3000"], str(ids2))
196
+ check("观察轴:无字段节点 fail-closed 并计入 axis_missing",
197
+ tf2.get("axis_missing") == 1 and tf2.get("dropped") == 14
198
+ and tf2.get("dropped") + len(ids2) == 15, str(tf2))
199
+
200
+ # ================= 5) 端点模式(单端算子)=================
201
+ r3, m3 = cg.search(QUERY, k=20, judge=False, record=False,
202
+ start_time=150, start_operator="gte",
203
+ time_axis="effective")
204
+ ids3 = set(_ids(r3))
205
+ tf3 = m3.get("time_filter") or {}
206
+ # 只给起点算子 → 只筛起点侧:eff_a(起点 100<150)与 eff_halfuntil(起点缺失、
207
+ # 端点模式下该侧不可比较)被剔除;eff_none 与全部观察组/旧库节点在效力轴**无字段**
208
+ # → fail-open 保留(沉默不是否认)。此处非空集本身即旧缺陷(单端算子恒空)的回归证据。
209
+ check("端点模式:单端 gte 只筛起点侧且不返回空集、无该轴字段者 fail-open 保留",
210
+ ids3 == {"eff_b", "eff_c", "eff_d", "eff_halffrom"} | _NO_EFF_AXIS
211
+ and tf3.get("mode") == "endpoint"
212
+ and tf3.get("start_operator") == "gte"
213
+ and tf3.get("dropped") == 2, str(sorted(ids3)))
214
+
215
+ # ================= 6) 误用 fail-closed =================
216
+ check("误用三则经库层抛 ValueError(孤算子 / 逆序 / 非法轴)",
217
+ _raises(ValueError, lambda: cg.search(
218
+ QUERY, k=5, judge=False, record=False, start_operator="gte"))
219
+ and _raises(ValueError, lambda: cg.search(
220
+ QUERY, k=5, judge=False, record=False, start_time=300, end_time=100))
221
+ and _raises(ValueError, lambda: cg.search(
222
+ QUERY, k=5, judge=False, record=False, start_time=100,
223
+ time_axis="believed")))
224
+
225
+ # ================= 7) stg 四 op 轴感知 =================
226
+ tl_obs = stg.timeline(cg, limit=100, time_axis="observed")
227
+ tl_eff = stg.timeline(cg, limit=100, time_axis="effective")
228
+ check("stg timeline:观察轴 14 条(旧库节点不可判定被跳过)、效力轴 4 条(两端齐备)",
229
+ tl_obs["count"] == 14 and tl_eff["count"] == 4,
230
+ "obs=%s eff=%s" % (tl_obs["count"], tl_eff["count"]))
231
+ check("stg timeline:缺省轴与显式 observed 逐位一致(旧行为兼容)",
232
+ stg.timeline(cg, limit=100)["count"] == tl_obs["count"])
233
+
234
+ # 返回结构取证:relation 的时间结果在 ["time"]["relation"](非顶层 time_relation)
235
+ rel_eff = stg.relation(cg, "eff_a", "eff_b", time_axis="effective")
236
+ rel_obs = stg.relation(cg, "eff_a", "eff_b", time_axis="observed")
237
+ check("stg relation:效力轴取 effective 区间(eff_a before eff_b);观察轴取写入观测时刻(区间不同)",
238
+ rel_eff["time"]["relation"] == "before"
239
+ and rel_eff["time"]["a"] == (100.0, 200.0)
240
+ and rel_obs["time"]["a"] != (100.0, 200.0),
241
+ "%s / %s" % (rel_eff["time"], rel_obs["time"]))
242
+
243
+ an_eff = stg.anchors(cg, time_window=[150, 250], limit=50,
244
+ time_axis="effective")
245
+ an_obs = stg.anchors(cg, time_window=[150, 250], limit=50,
246
+ time_axis="observed")
247
+ check("stg anchors:效力轴命中 2(eff_a overlaps + eff_c contains)、观察轴 0",
248
+ an_eff["count"] == 2 and an_obs["count"] == 0,
249
+ "eff=%s obs=%s" % (an_eff["count"], an_obs["count"]))
250
+
251
+ check("stg 非法轴 fail-closed(四 op 同源 trust.time_axis_of)",
252
+ _raises(ValueError, lambda: stg.consistency(cg, time_axis="believed"))
253
+ and _raises(ValueError, lambda: stg.relation(
254
+ cg, "eff_a", "eff_b", time_axis="believed")))
255
+
256
+ # ========== 7b) 单位归一:毫秒存量不改盘即可正确排序(issue #23)==========
257
+ # 用**独立小库**取证,不动上面 15 节点语料(其计数断言是既有契约)。
258
+ # 复现旧版 sources 摄取出的存量节点形态:time_window 落 13 位毫秒。
259
+ ms_root = tempfile.mkdtemp(prefix="retr_s8_ms_")
260
+ ms_cg = MdCG(ms_root)
261
+ ms_cg.add("ms_old", TEXT, "knowledge",
262
+ condition_space={"time_window": [1600000000000, 1600003600000]})
263
+ ms_cg.add("sec_new", TEXT, "knowledge",
264
+ condition_space={"time_window": [1700000000, 1700003600]})
265
+ ms_cg.flush()
266
+ ms_cg.rebuild_index()
267
+ check("毫秒存量先决条件:索引快照确实落 13 位毫秒窗(否则本组断言退化为空转)",
268
+ ((ms_cg.index["nodes"].get("ms_old") or {}).get("time_window")
269
+ or [None])[0] == 1600000000000,
270
+ str((ms_cg.index["nodes"].get("ms_old") or {}).get("time_window")))
271
+ _msiv = stg._interval({"condition_space":
272
+ {"time_window": [1600000000000, 1600003600000]}})
273
+ check("单位归一:_interval 与 trust.time_window_of 同口径(毫秒 /1000)",
274
+ _msiv == (1600000000.0, 1600003600.0), str(_msiv))
275
+ _mtl = stg.timeline(ms_cg, limit=10)
276
+ check("单位归一:毫秒存量不再顶到 timeline 头部(旧行为 1.6e12 恒排最前)",
277
+ [(i["id"], i["start"]) for i in _mtl["items"]] ==
278
+ [("sec_new", 1700000000.0), ("ms_old", 1600000000.0)],
279
+ str([(i["id"], i["start"]) for i in _mtl["items"]]))
280
+ from md_cg.mdcg import _cond_prefilter_pass
281
+ check("单位归一:S2 时间门控对毫秒节点不再误剔除(同根因)",
282
+ _cond_prefilter_pass({"time_window": [1600000000000, 1600003600000]},
283
+ {"time_window": [1600000010, 1600000020]}) is True
284
+ and _cond_prefilter_pass({"time_window": [1600000000000, 1600003600000]},
285
+ {"time_window": [1700000000, 1700000020]}) is False)
286
+
287
+ # ================= 8) 关→开→关 默认口径不变 =================
288
+ # 置于 Secure 层操作**之前**:那些调用会记录访问(recall 无法关 record),
289
+ # 可能与基线产生与时间算子无关的差异,污染「首末一致」这一断言。
290
+ r5, m5 = cg.search(QUERY, k=20, judge=False, record=False)
291
+ check("默认口径等价:关→开→关 首末一致且无 time_filter 键",
292
+ sorted(_ids(r5)) == base and "time_filter" not in m5)
293
+
294
+ # ================= 9) 热缓存:命中 + 时间算子读/写双侧绕行 =================
295
+ sec = MdCGSecure(root, principal=Principal(
296
+ actor="test-s8", clearance="secret", can_write=True,
297
+ role="designer", auth_mode="local-cli"))
298
+ hotcache.attach(sec)
299
+ _sa, sma = sec.search_rrf(QUERY, k=20, judge=False, record=False)
300
+ _sb, smb = sec.search_rrf(QUERY, k=20, judge=False, record=False)
301
+ check("热缓存:同参二次 search_rrf 命中(cached=True)且结果一致",
302
+ sma.get("cached") is not True and smb.get("cached") is True
303
+ and [r[0]["id"] for r in _sa] == [r[0]["id"] for r in _sb],
304
+ "a=%s b=%s" % (sma.get("cached"), smb.get("cached")))
305
+
306
+ # 上一步已把 15 条全量结果写进缓存键(键不含时间参数)。带时间算子的查询
307
+ # 若只绕开「读」而漏掉「写」,则返回的 11 条会把缓存覆盖成子集 —— 故下方
308
+ # 「随后默认查询仍为 15 条」是**写侧绕行**的判别性证据。
309
+ _t1, mt1 = sec.search_rrf(QUERY, k=20, judge=False, record=False,
310
+ start_time=150, end_time=250,
311
+ time_axis="effective")
312
+ check("时间算子启用时绕开热缓存:缓存已有 15 条全量,仍返回过滤后 11 条、meta 无 cached",
313
+ "cached" not in mt1 and len(_t1) == 11
314
+ and sorted(r[0]["id"] for r in _t1) == sorted(ids1),
315
+ "n=%d cached=%s" % (len(_t1), mt1.get("cached")))
316
+ _d2, md2 = sec.search_rrf(QUERY, k=20, judge=False, record=False)
317
+ check("时间算子查询不污染缓存(写侧同受绕行约束):其后默认查询仍为全量 15 条",
318
+ len(_d2) == 15 and md2.get("cached") is True,
319
+ "n=%d cached=%s" % (len(_d2), md2.get("cached")))
320
+
321
+ # ================= 10) recall 透传 =================
322
+ out = sec.recall(QUERY, k=20, judge=False, start_time=2500,
323
+ end_time=3500, time_axis="observed")
324
+ mr = out.get("meta") or {}
325
+ ids_r = [e["id"] for e in (out.get("pack") or [])]
326
+ check("recall 透传:meta 带 time_filter(观察轴)且过滤真实生效",
327
+ (mr.get("time_filter") or {}).get("axis") == "observed"
328
+ and ids_r == ["obs_3000"], str(ids_r))
329
+
330
+ # ================= 11) Secure.search 常规路径审计块(MCP cg(op=read) 实走此路)=================
331
+ # 判别性:本节的观测量=「过滤生效 ∧ meta 带审计块」**同时**成立,缺一即 FAIL。
332
+ # 缺陷史(2026-09-20 取证):候选层过滤已在 `_candidates` 完成(结果正确),但
333
+ # `MdCGSecure.search` 的**常规返回路径**未把 `_time_filter_stat` 交给 `_emit` ——
334
+ # 审计块此前只在 no_candidates 分支落键 → 「过滤确实生效而审计不可见」(静默,
335
+ # 调用方无法区分「未启用」与「启用但候选全 fail-open 保留」)。
336
+ # 只用 `cg.search`(父类,本无此缺口)或 `search_rrf`(另行落键)**均测不到**该缺口,
337
+ # 故单列一节:本节的红/绿随该唯一缺口翻转,是它的判别性守卫。
338
+ _s11, m11 = sec.search(QUERY, k=20, judge=False, record=False,
339
+ start_time=150, end_time=250, time_axis="effective")
340
+ tf11 = m11.get("time_filter") or {}
341
+ check("Secure.search 常规路径:过滤生效且 meta 带 time_filter(审计块不被吞)",
342
+ sorted(r[0]["id"] for r in _s11) == sorted(ids1)
343
+ and tf11.get("axis") == "effective" and tf11.get("mode") == "overlap"
344
+ and tf11.get("applied") is True and tf11.get("dropped") == 4,
345
+ "n=%d tf=%s" % (len(_s11), tf11))
346
+
347
+ _s11b, m11b = sec.search(QUERY, k=20, judge=False, record=False)
348
+ check("Secure.search 默认关:候选不变且 meta 键集合不含 time_filter(默认关零变更)",
349
+ "time_filter" not in m11b and len(_s11b) == 15,
350
+ "n=%d keys=%s" % (len(_s11b), sorted(m11b.keys())))
351
+
352
+ print("\ntest_retr_s8: %d 通过 / %d 失败" % (passed, failed))
353
+ return 0 if failed == 0 else 1
354
+
355
+
356
+ def _raises(exc, fn):
357
+ try:
358
+ fn()
359
+ except exc:
360
+ return True
361
+ except Exception:
362
+ return False
363
+ return False
364
+
365
+
366
+ if __name__ == "__main__":
367
+ if hasattr(sys.stdout, "reconfigure"):
368
+ sys.stdout.reconfigure(encoding="utf-8")
369
+ sys.exit(main())