@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,95 @@
1
+ # -*- coding: utf-8 -*-
2
+ """批次10:互验工具库单测——A1/A2/A3 双态 + verdict 脱敏硬门禁。
3
+
4
+ 能红对照:A3 断言在「验证者指纹被本轮改动」(判据面漂移)时必红;
5
+ 脱敏门禁对绝对路径/prompt 字段/API key 必拦。
6
+ 运行:python -m md_cg.test_interop (退出码 0 = 全绿)
7
+ """
8
+ import json
9
+ import os
10
+ import shutil
11
+ import sys
12
+ import tempfile
13
+
14
+ sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
15
+ from md_cg.interop import (InteropSanityError, assert_a1, assert_a2, assert_a3,
16
+ freeze, make_verdict, sanity_check_verdict)
17
+
18
+ PASS = FAIL = 0
19
+
20
+
21
+ def check(name, ok, detail=""):
22
+ global PASS, FAIL
23
+ if ok:
24
+ PASS += 1
25
+ print(f" [ok] {name}")
26
+ else:
27
+ FAIL += 1
28
+ print(f" [FAIL] {name} {detail}")
29
+
30
+
31
+ def main():
32
+ tmp = tempfile.mkdtemp(prefix="mdcg_interop_")
33
+ try:
34
+ print("[1] 冻结与 A3(承重墙)")
35
+ frozen = freeze("iter_test_001", out_dir=os.path.join(tmp, "interop"))
36
+ digest = frozen["digest"]
37
+ check("1a 冻结凭证含 digest 与文件清单",
38
+ bool(digest) and len(frozen["files"]) >= 3, str(digest)[:20])
39
+ r3 = assert_a3(frozen, digest)
40
+ check("1b A3 成立(指纹==冻结值)", r3["ok"] is True)
41
+ r3_bad = assert_a3(frozen, digest[:-1] + ("0" if digest[-1] != "0" else "1"))
42
+ check("1c A3 红(验证者指纹漂移=判据被本轮改动——必红)",
43
+ r3_bad["ok"] is False)
44
+ frozen2 = dict(frozen)
45
+ frozen2["digest"] = "different"
46
+ check("1d A3 红(冻结值与声明不符)",
47
+ assert_a3(frozen2, digest)["ok"] is False)
48
+
49
+ print("[2] A1/A2")
50
+ check("2a A1 成立(verifier≠subject)",
51
+ assert_a1("verifier", "main")["ok"] is True)
52
+ check("2b A1 红(同实例=自验无效)",
53
+ assert_a1("main", "main")["ok"] is False)
54
+ check("2c A2 成立(指纹不同)",
55
+ assert_a2("aaaa", "bbbb")["ok"] is True)
56
+ check("2d A2 红(同指纹)", assert_a2("aaaa", "aaaa")["ok"] is False)
57
+
58
+ print("[3] verdict 脱敏硬门禁(§7.3,入库即公开)")
59
+ v = make_verdict("iter_test_001", "verifier", "fp_ver", "main", "fp_sub",
60
+ "verifier-worktree", "2026-09-23T00:00:00", "pass",
61
+ 27, 0, [{"test": "recover_by_artifact", "ok": True}])
62
+ check("3a 合规 verdict 通过门禁", isinstance(v, dict) and v["passed"] == 27)
63
+ for name, bad in [
64
+ ("3b 绝对路径拦截",
65
+ {**v, "details": [{"log": r"D:\program\secret\path.txt"}]}),
66
+ ("3c prompt 字段拦截",
67
+ {**v, "prompt": "你是一个…"}),
68
+ ("3d API key 拦截",
69
+ {**v, "details": [{"env": "sk-dummy0abcdefghijklmnop"}]}),
70
+ ("3e unix 家目录拦截",
71
+ {**v, "suite_origin": "/Users/test/worktree"}),
72
+ ]:
73
+ try:
74
+ sanity_check_verdict(bad)
75
+ check(name, False, "违规内容未被拦截")
76
+ except InteropSanityError:
77
+ check(name, True)
78
+
79
+ print("[4] 冻结文件落盘形态(入库可复核)")
80
+ fp = os.path.join(tmp, "interop", "frozen.json")
81
+ data = json.load(open(fp, encoding="utf-8"))
82
+ check("4a 冻结文件只含结构化事实(iter_id/frozen_at/digest/files"
83
+ "/missing_patterns)",
84
+ set(data.keys()) == {"iter_id", "frozen_at", "digest", "files",
85
+ "missing_patterns"},
86
+ str(sorted(data.keys())))
87
+ finally:
88
+ shutil.rmtree(tmp, ignore_errors=True)
89
+
90
+ print(f"\n=== interop tests: {PASS} passed, {FAIL} failed ===")
91
+ return 1 if FAIL else 0
92
+
93
+
94
+ if __name__ == "__main__":
95
+ sys.exit(main())
@@ -0,0 +1,228 @@
1
+ # -*- coding: utf-8 -*-
2
+ """test_interop_judgment —— 互验执行链判据强度守卫(issue #37 六项)
3
+
4
+ J1 valid=单一放行位(断言 AND 套件)——套件全挂时必须 False
5
+ J2 A2 标注 self-reported;伪造 subject_fp 不影响 A3(承重墙输入不含自报值)
6
+ J3 failure_reason 枚举四象限结构化
7
+ J4 interop_gate 机械消费方三态(pass 放行 / fail 拒绝 / 缺产物 fail-closed)
8
+ J5 脱敏黑名单扩面(UNC/unix/~/$HOME/密钥形态/Bearer/文本形态)+ 形状白名单
9
+ J6 freeze 显式 out_dir 警告(不被 runner 识别)
10
+
11
+ 运行:python -X utf8 -m md_cg.test_interop_judgment
12
+ """
13
+ import importlib.util
14
+ import json
15
+ import os
16
+ import subprocess
17
+ import sys
18
+ import tempfile
19
+
20
+ HERE = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
21
+ sys.path.insert(0, HERE)
22
+
23
+ from md_cg.interop import ( # noqa: E402
24
+ InteropSanityError, assert_a2, assert_a3, freeze,
25
+ make_verdict, sanity_check_verdict, shape_check_verdict)
26
+
27
+ _spec = importlib.util.spec_from_file_location(
28
+ "verify_runner", os.path.join(HERE, "hive", "verify_runner.py"))
29
+ vr = importlib.util.module_from_spec(_spec)
30
+ _spec.loader.exec_module(vr)
31
+
32
+ passed = failed = 0
33
+
34
+
35
+ def check(name, cond, detail=""):
36
+ global passed, failed
37
+ if cond:
38
+ passed += 1
39
+ print(" [PASS] " + name)
40
+ else:
41
+ failed += 1
42
+ print(" [FAIL] " + name + " " + str(detail)[:200])
43
+
44
+
45
+ def _mk(a_ok, suite_ok):
46
+ return vr._compose_semantics(a_ok, suite_ok)
47
+
48
+
49
+ def main():
50
+ print("[1] J1/J3:verdict 语义四象限")
51
+ v, valid, a_ok, fr = _mk(True, True)
52
+ check("全过 → pass/valid=True/reason=None",
53
+ v == "pass" and valid and a_ok and fr is None)
54
+ v, valid, a_ok, fr = _mk(True, False)
55
+ check("断言过+套件挂 → fail/valid=False/assertions_ok=True/reason=suite_failed"
56
+ "(#37 实测形态:套件全挂时 valid 必须不再是 true)",
57
+ v == "fail" and valid is False and a_ok is True
58
+ and fr == "suite_failed")
59
+ v, valid, a_ok, fr = _mk(False, True)
60
+ check("断言挂+套件过 → reason=assertions_failed",
61
+ v == "fail" and valid is False and a_ok is False
62
+ and fr == "assertions_failed")
63
+ v, valid, a_ok, fr = _mk(False, False)
64
+ check("双挂 → reason=both", v == "fail" and fr == "both")
65
+
66
+ print("[2] J2:A2 self-reported 分层 + A3 不受伪造 subject_fp 影响")
67
+ a2 = assert_a2("a" * 64, "deadbeef" * 8)
68
+ check("伪造 subject_fp 可过 A2(弱断言如实)", a2["ok"] is True)
69
+ check("A2 输出标注 subject_fp_source=self-reported(#27 分层复用)",
70
+ a2.get("subject_fp_source") == "self-reported")
71
+ frozen = {"digest": "f" * 64}
72
+ a3 = assert_a3(frozen, "e" * 64)
73
+ check("A3 输入不含 subject_fp(伪造自报值过不了 A3——承重墙)",
74
+ "subject" not in json.dumps(a3) and a3["ok"] is False)
75
+
76
+ print("[3] J5:脱敏黑名单扩面(issue 列举形态全部拦截)")
77
+ leaks = [
78
+ ("UNC 路径", "\\\\server\\share\\secret.txt"),
79
+ ("macOS /Volumes", "/Volumes/disk/proj/x.md"),
80
+ ("unix /etc", "配置在 /etc/passwd 附近"),
81
+ ("家目录 ~", "见 ~/secret/keys.txt"),
82
+ ("$HOME", "文件在 $HOME/.aws 下"),
83
+ # 假 token 字面量须自带占位符标记(fake/example 等):形状正则
84
+ # (md_cg/interop.py 的 `ghp_[A-Za-z0-9]{20,}`)照旧命中 → 本用例的
85
+ # 拦截断言不变;同时 scripts/check_publish_artifact.py 的 R1 会把它
86
+ # 记为 NOTE 而非 FAIL(否则出货门禁对「测试夹具里的假值」恒红——
87
+ # 红着等于没门禁)。见 FAKE_TOKEN_MARKERS。
88
+ ("ghp_ token", "ghp_dummyABCDEFGHIJKLMNOPQRSTUVWXYZ1234"),
89
+ ("AIza key", "AIzaSyABCDEFGHIJKLMNOPQRSTUVWXYZ1234567"),
90
+ ("AKIA key", "AKIAIOSFODNN7EXAMPLE"),
91
+ ("Bearer", "Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.payload.sig"),
92
+ ("文本形态 user_prompt", "note: user_prompt: tell me a secret"),
93
+ ]
94
+ base = {"iter_id": "t", "verifier_instance": "v", "verifier_fingerprint":
95
+ "a" * 64, "subject_instance": "m", "subject_fingerprint":
96
+ "b" * 64, "suite_origin": "w", "frozen_at": "x", "verdict":
97
+ "fail", "passed": 0, "failed": 0, "details": [], "valid": False,
98
+ "assertions_ok": False, "failure_reason": "both"}
99
+ for label, payload in leaks:
100
+ try:
101
+ v2 = dict(base, iter_id=payload[:40])
102
+ v2["details"] = [{"note": payload}]
103
+ sanity_check_verdict(v2)
104
+ check(f"拦截 {label}", False, payload)
105
+ except InteropSanityError:
106
+ check(f"拦截 {label}", True)
107
+ try:
108
+ sanity_check_verdict(dict(base))
109
+ check("正常 verdict 过脱敏门禁(无误伤)", True)
110
+ except InteropSanityError as e:
111
+ check("正常 verdict 过脱敏门禁(无误伤)", False, str(e))
112
+
113
+ print("[4] J5:形状白名单(越权字段/坏形状/坏枚举)")
114
+ for label, mut in [
115
+ ("越权顶层字段", {"extra_key": "x"}),
116
+ ("指纹非十六进制", {"verifier_fingerprint": "zzz!*"}),
117
+ ("verdict 枚举外", {"verdict": "PASS"}),
118
+ ("failure_reason 枚举外", {"failure_reason": "whatever"}),
119
+ ("计数非整数", {"passed": "3"}),
120
+ ("计数负数", {"failed": -1})]:
121
+ try:
122
+ shape_check_verdict(dict(base, **mut))
123
+ check(f"形状拦截 {label}", False)
124
+ except InteropSanityError:
125
+ check(f"形状拦截 {label}", True)
126
+ try:
127
+ shape_check_verdict(dict(base, verdict="fail", failure_reason=None,
128
+ passed=1, failed=2))
129
+ check("合法形状通过白名单", True)
130
+ except InteropSanityError as e:
131
+ check("合法形状通过白名单", False, str(e))
132
+
133
+ print("[5] J6:freeze 显式 out_dir 警告")
134
+ import contextlib
135
+ with tempfile.TemporaryDirectory() as td:
136
+ buf = io_err = None
137
+ try:
138
+ import io as _io
139
+ buf = _io.StringIO()
140
+ with contextlib.redirect_stderr(buf):
141
+ freeze("zz-guard-j6", out_dir=td)
142
+ finally:
143
+ pass
144
+ check("显式 out_dir → stderr 警告(不被 runner 识别)",
145
+ buf is not None and "不被" in (buf.getvalue() or ""))
146
+ std = os.path.join(HERE, "hive", "interop", "zz-guard-j6")
147
+ import shutil
148
+ shutil.rmtree(std, ignore_errors=True)
149
+
150
+ print("[6] J4:interop_gate 机械消费方三态")
151
+ gate = os.path.join(HERE, "scripts", "interop_gate.py")
152
+ with tempfile.TemporaryDirectory() as td:
153
+ vp = os.path.join(td, "verdict.json")
154
+ ok_v = dict(base, verdict="pass", valid=True, assertions_ok=True,
155
+ failure_reason=None, passed=9, failed=0)
156
+ json.dump(ok_v, open(vp, "w", encoding="utf-8"), ensure_ascii=False)
157
+ r = subprocess.run([sys.executable, gate, "--path", vp],
158
+ capture_output=True, text=True, encoding="utf-8")
159
+ check("pass+valid → exit 0(放行)", r.returncode == 0, r.stdout)
160
+ json.dump(dict(base), open(vp, "w", encoding="utf-8"),
161
+ ensure_ascii=False)
162
+ r = subprocess.run([sys.executable, gate, "--path", vp],
163
+ capture_output=True, text=True, encoding="utf-8")
164
+ check("fail/valid=False → exit 1(拒绝合并)", r.returncode == 1)
165
+ os.remove(vp)
166
+ r = subprocess.run([sys.executable, gate, "--path", vp],
167
+ capture_output=True, text=True, encoding="utf-8")
168
+ check("无 verdict → exit 2(未互验 fail-closed)", r.returncode == 2)
169
+ json.dump({"verdict": "pass"}, open(vp, "w", encoding="utf-8"))
170
+ r = subprocess.run([sys.executable, gate, "--path", vp],
171
+ capture_output=True, text=True, encoding="utf-8")
172
+ check("旧版产物缺契约字段 → exit 3(拒绝猜测)", r.returncode == 3)
173
+
174
+ print("[7] make_verdict 全链(新字段经双门禁落盘)")
175
+ v3 = make_verdict(iter_id="t", verifier_instance="v",
176
+ verifier_fingerprint="a" * 64, subject_instance="m",
177
+ subject_fingerprint="b" * 64,
178
+ suite_origin="w", frozen_at="x", verdict="fail",
179
+ passed=0, failed=1,
180
+ details=[assert_a2("a" * 64, "b" * 64)])
181
+ v3.update({"valid": False, "assertions_ok": False,
182
+ "failure_reason": "both"})
183
+ try:
184
+ sanity_check_verdict(v3)
185
+ shape_check_verdict(v3)
186
+ check("含 self-reported 标注的完整产物过双门禁", True)
187
+ except InteropSanityError as e:
188
+ check("含 self-reported 标注的完整产物过双门禁", False, str(e))
189
+
190
+ print("[8] _parse_counts 与 run_tests SUMMARY 实际形态契约(v6 N28)")
191
+ # 契约断裂实形:run_tests.py:216 打印 `===== SUMMARY N/M 通过,Z 跳过…`,
192
+ # 而 _parse_counts 旧第三正则只认 `通过 X / 失败 Y`(run_tests 从未打印)
193
+ # → python 侧计数恒 (0,0),verdict.json passed/failed 系统性失真
194
+ # (判决靠 exit code 仍对,留痕假零)。
195
+ p188, f188 = vr._parse_counts(
196
+ "===== SUMMARY 188/189 通过,1 跳过(依赖缺失/平台不符) =====")
197
+ check("实跑 SUMMARY 形态可解析(188/189 → passed=188,非 0)",
198
+ p188 == 188, p188)
199
+ check("failed 由 runnable-passed 推出(→ 1,非 0)", f188 == 1, f188)
200
+ # 生产者现场取证:真跑 run_tests(scripts 组 -k 过滤到单测),SUMMARY
201
+ # 行必须能被消费端解析——两侧契约同一守卫钉死,任一侧漂移必红。
202
+ r = subprocess.run(
203
+ [sys.executable, "-X", "utf8",
204
+ os.path.join(HERE, "scripts", "run_tests.py"), "scripts",
205
+ "-k", "judgment"],
206
+ capture_output=True, text=True, encoding="utf-8", errors="replace",
207
+ cwd=HERE, timeout=600)
208
+ summ = [ln for ln in (r.stdout or "").splitlines() if "SUMMARY" in ln]
209
+ check("run_tests 实跑产出 SUMMARY 行(生产者在场)", bool(summ),
210
+ (r.stdout or "")[-200:])
211
+ if summ:
212
+ pp, ff = vr._parse_counts(r.stdout)
213
+ check("消费端能解析生产端实跑输出(非 (0,0) 假读)",
214
+ (pp, ff) != (0, 0), (pp, ff, summ[-1]))
215
+ # cargo 形态不回归;跳过单列不计失败(裸 clone SKIP 面不虚增 failed)
216
+ pc, fc = vr._parse_counts("test result: ok. 3 passed; 1 failed; 0 ignored")
217
+ check("cargo 形态照旧(3 passed; 1 failed → (3,1))", (pc, fc) == (3, 1),
218
+ (pc, fc))
219
+ ps, fs = vr._parse_counts("===== SUMMARY 187/187 通过,2 跳过(依赖缺失) =====")
220
+ check("跳过不计入 failed(187/187+2 跳过 → (187,0))", (ps, fs) == (187, 0),
221
+ (ps, fs))
222
+
223
+ print(f"\ninterop_judgment: {passed} 通过 / {failed} 失败")
224
+ return 0 if not failed else 1
225
+
226
+
227
+ if __name__ == "__main__":
228
+ sys.exit(main())
@@ -0,0 +1,273 @@
1
+ # -*- coding: utf-8 -*-
2
+ """test_issue39_utf8_stdio.py · Windows 控制台代码页下 stdio MCP 中文必炸的守卫(issue #39)
3
+
4
+ 现场(外部用户实测,issue #39):Windows 控制台代码页(GBK/CP936)下,md_cg 的
5
+ stdio MCP server 写中文必失败——宿主按 UTF-8 发来的中文参数被按 GBK 解码:
6
+ · ``gbk:strict`` → 读侧直接 ``UnicodeDecodeError``(本守卫实弹注入的形态,已实证
7
+ 「中文标题:编码守卫」的 UTF-8 字节序列按 GBK 严格解码必非法);
8
+ · ``surrogateescape`` → 解出代理对 ``\\udcXX``,``_j()``(ensure_ascii=False)
9
+ 按 UTF-8 编码时抛 ``UnicodeEncodeError: surrogates not allowed``。
10
+ 两种形态整条请求同亡;写英文正常,用户难自查。桥层 0.4.10 已在
11
+ ``src/lib/mdcg_client.ts`` 的 ``mdcgChildEnv()`` 注入 ``PYTHONUTF8=1``,但只覆盖
12
+ DSH 桥路径——Claude Code / code CLI 直接 mcp.json 接入不经桥,仍踩。
13
+
14
+ 修复(本守卫的红绿两态锚点):``md_cg/mcp_server.py`` 与
15
+ ``hive/hive_mcp/mcp_server.py``(同族全修)各加模块级 ``_force_utf8_stdio()``,
16
+ 并在 ``main()`` **首行**调用——进程内把 stdio 三流 reconfigure 成
17
+ ``utf-8``/``errors="replace"``,是对桥层 PYTHONUTF8=1 的纵深补位;``replace``
18
+ 保证坏字节最多丢字符、不炸整条请求。
19
+
20
+ 实弹形态:subprocess spawn ``[sys.executable, "-m", "md_cg.mcp_server"]``
21
+ (cwd=仓根,**不带** ``-X utf8``),env 显式设 ``PYTHONIOENCODING=gbk:strict``
22
+ 模拟 CP936 控制台;按行分隔 JSON-RPC(initialize → notifications/initialized →
23
+ tools/call cg {op:"write", content:中文})。断言:响应行是合法 JSON、write 响应
24
+ 不含 ``UnicodeEncodeError`` 且返回 ``ok``/``moved_to`` 字段。hive 面同款实弹
25
+ (中文 hive_spawn;HIVE_EXE 指向不存在的探针路径——``_ensure_serve`` 在 isfile
26
+ 即返回,绝不拉起真 serve)。修复前此面红(进程在读侧崩、响应行缺失),修复后绿。
27
+
28
+ 隔离纪律:MDCG_ROOT/MDCG_STATE_ROOT/MDCG_DATA_ROOT/MDCG_AUX_ROOT/
29
+ MDCG_TENANT_REGISTRY/HIVE_JOBS_DIR/HIVE_CONFIG 全部指向 tempfile.mkdtemp 临时
30
+ 目录(登记表指向不存在的临时路径=空表回落),身份走既有豁免面
31
+ ``MDCG_LEGACY_ENV_AUTH=1``(env 直连 designer,零令牌、不回落真实 ~/.mdcg),
32
+ MDCG_SUSTAIN=0 关常驻循环;finally rmtree——绝不触真实令牌库与真实数据目录。
33
+
34
+ 自检 floor:实弹断言低于 LIVE_FLOOR 视为失败——防止「spawn 面失效 → 假绿」。
35
+ """
36
+ from __future__ import annotations
37
+
38
+ import json
39
+ import os
40
+ import shutil
41
+ import subprocess
42
+ import sys
43
+ import tempfile
44
+
45
+ try:
46
+ sys.stdout.reconfigure(encoding="utf-8", errors="replace")
47
+ except AttributeError:
48
+ pass
49
+
50
+ ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
51
+ LIVE_FLOOR = 2 # 实弹断言下限(md_cg 面 ≥1 + hive 面 ≥1)
52
+ PROBE = "中文标题:编码守卫" # UTF-8 字节按 GBK strict 解码必非法(红态机制,见头注)
53
+
54
+ PASS, FAIL, LIVE = 0, 0, 0
55
+
56
+
57
+ def check(name, cond, detail="", live=False):
58
+ global PASS, FAIL, LIVE
59
+ if live:
60
+ LIVE += 1
61
+ if cond:
62
+ PASS += 1
63
+ print(f" [ok] {name}")
64
+ else:
65
+ FAIL += 1
66
+ print(f" [FAIL] {name} {detail}")
67
+
68
+
69
+ # 模拟 CP936 控制台前,先把父进程可能携带的「身份/路径/编码」注入面清干净——
70
+ # 守卫子进程只吃临时目录,绝不吃本机真实 ~/.mdcg / 真实 MDCG_ROOT。
71
+ _DIRTY_KEYS = (
72
+ "MDCG_TOKEN", "MDCG_CLEARANCE", "MDCG_TENANT", "MDCG_TENANT_REGISTRY",
73
+ "MDCG_CAN_ADMIN", "MDCG_CAN_WRITE", "MDCG_LEGACY_ENV_AUTH",
74
+ "MDCG_LEGACY_ENV_ADMIN", "MDCG_SESSION", "DSH_SESSION_ID",
75
+ "MDCG_HARNESS", "MDCG_UNIT", "MDCG_ROOT", "MDCG_STATE_ROOT",
76
+ "MDCG_DATA_ROOT", "MDCG_AUX_ROOT", "MDCG_SUSTAIN", "MDCG_SUSTAIN_NAME",
77
+ "MDCG_MCP_SURFACE", "MDCG_TOOL_FACE", "MDCG_ACTOR",
78
+ "MDCG_VERIFIER_MODULES", "MDCG_HIVE_JOBS",
79
+ "PYTHONUTF8", "PYTHONIOENCODING", "PYTHONLEGACYWINDOWSSTDIO",
80
+ "HIVE_JOBS_DIR", "HIVE_CONFIG", "HIVE_EXE", "HIVE_API_KEY",
81
+ )
82
+
83
+
84
+ def _base_env(tmp: str) -> dict:
85
+ env = {k: v for k, v in os.environ.items() if k not in _DIRTY_KEYS}
86
+ env["PYTHONIOENCODING"] = "gbk:strict" # 模拟 CP936 控制台(无 -X utf8)
87
+ env["MDCG_SUSTAIN"] = "0" # 关常驻循环(线程面归零)
88
+ env["MDCG_ACTOR"] = "issue39-guard"
89
+ # 身份走既有豁免面:env 直连 designer(二次开关齐全),零令牌、不回落真实凭据面
90
+ env["MDCG_LEGACY_ENV_AUTH"] = "1"
91
+ env["MDCG_CAN_ADMIN"] = "1"
92
+ env["MDCG_LEGACY_ENV_ADMIN"] = "1"
93
+ _ = tmp
94
+ return env
95
+
96
+
97
+ def _mdcg_env(tmp: str) -> dict:
98
+ env = _base_env(tmp)
99
+ env["MDCG_ROOT"] = os.path.join(tmp, "cgroot")
100
+ env["MDCG_TENANT_REGISTRY"] = os.path.join(tmp, "_tenants_absent.json")
101
+ env["MDCG_STATE_ROOT"] = os.path.join(tmp, "state")
102
+ env["MDCG_DATA_ROOT"] = os.path.join(tmp, "data")
103
+ # 子目录名不可取 "aux":AUX 是 Windows 保留设备名,ntpath.abspath 经
104
+ # GetFullPathNameW 会把末段 aux 解析成设备路径 \\.\aux(实测),导致
105
+ # aux_root() 覆盖键静默失联——取名 auxroot 避开。
106
+ env["MDCG_AUX_ROOT"] = os.path.join(tmp, "auxroot")
107
+ return env
108
+
109
+
110
+ def _hive_env(tmp: str) -> dict:
111
+ env = _base_env(tmp)
112
+ env["HIVE_JOBS_DIR"] = os.path.join(tmp, "hivejobs")
113
+ # 指向不存在的配置与可执行文件:_ensure_serve 在 isfile 即返回,绝不拉起真 serve
114
+ env["HIVE_CONFIG"] = os.path.join(tmp, "hive_config_absent.json")
115
+ env["HIVE_EXE"] = os.path.join(tmp, "no_such_hive.exe")
116
+ return env
117
+
118
+
119
+ def _rpc(rid, method, params=None):
120
+ msg = {"jsonrpc": "2.0", "id": rid, "method": method}
121
+ if params is not None:
122
+ msg["params"] = params
123
+ return json.dumps(msg, ensure_ascii=False)
124
+
125
+
126
+ def _talk(cmd_args, env, lines, timeout=180):
127
+ """spawn server → 写 JSON-RPC 行 → 收 (returncode, stdout_text, stderr_text)。"""
128
+ proc = subprocess.Popen(
129
+ cmd_args, cwd=ROOT, env=env,
130
+ stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
131
+ text=True, encoding="utf-8", errors="replace")
132
+ try:
133
+ out, err = proc.communicate("\n".join(lines) + "\n", timeout=timeout)
134
+ except subprocess.TimeoutExpired:
135
+ proc.kill()
136
+ out, err = proc.communicate()
137
+ return proc.returncode, out or "", err or ""
138
+
139
+
140
+ def _resp_lines(out: str):
141
+ """stdout 逐行解析成 (raw_line, obj_or_None)。"""
142
+ got = []
143
+ for ln in out.splitlines():
144
+ ln = ln.strip()
145
+ if not ln:
146
+ continue
147
+ try:
148
+ got.append((ln, json.loads(ln)))
149
+ except ValueError:
150
+ got.append((ln, None))
151
+ return got
152
+
153
+
154
+ def _find_resp(resps, rid):
155
+ for _raw, obj in resps:
156
+ if isinstance(obj, dict) and obj.get("id") == rid:
157
+ return obj
158
+ return None
159
+
160
+
161
+ def _main_body_has_call(src: str) -> bool:
162
+ """源断言:main() 函数体首段含 _force_utf8_stdio() 调用(定义与调用都在)。"""
163
+ if "def _force_utf8_stdio()" not in src:
164
+ return False
165
+ idx = src.find("def main")
166
+ if idx < 0:
167
+ return False
168
+ window = src[idx:idx + 400]
169
+ return "_force_utf8_stdio()" in window
170
+
171
+
172
+ def main():
173
+ tmp = tempfile.mkdtemp(prefix="mdcg_issue39_")
174
+ try:
175
+ # ---- 1. md_cg 面实弹:GBK 代码页下写中文 ----
176
+ print("[1] md_cg stdio 实弹(PYTHONIOENCODING=gbk:strict,无 -X utf8)")
177
+ rc, out, err = _talk(
178
+ [sys.executable, "-m", "md_cg.mcp_server"], _mdcg_env(tmp), [
179
+ _rpc(1, "initialize", {}),
180
+ _rpc(None, "notifications/initialized"),
181
+ _rpc(3, "tools/call", {"name": "cg", "arguments": {
182
+ "op": "write", "content": PROBE}}),
183
+ ])
184
+ resps = _resp_lines(out)
185
+ init = _find_resp(resps, 1)
186
+ check("1a initialize 握手在 GBK 控制台下存活(合法 JSON 响应)",
187
+ isinstance(init, dict)
188
+ and (init.get("result") or {}).get("serverInfo", {}).get(
189
+ "name") == "mdcg-mcp",
190
+ f"rc={rc} lines={len(resps)} err_tail={err[-200:]!r}", live=True)
191
+ wr = _find_resp(resps, 3)
192
+ wr_ok = False
193
+ if isinstance(wr, dict):
194
+ try:
195
+ payload = json.loads(
196
+ (wr.get("result") or {}).get("content", [{}])[0].get(
197
+ "text", "{}"))
198
+ wr_ok = ("ok" in payload) or ("moved_to" in payload)
199
+ except (ValueError, AttributeError, IndexError):
200
+ wr_ok = False
201
+ check("1b 中文 write 响应合法且返回 ok/moved_to 字段(红态:进程在读侧崩,本条缺失)",
202
+ wr_ok, f"wr={str(wr)[:200]}", live=True)
203
+ check("1c 全程无 UnicodeEncodeError(stdout/stderr 不见代理对编码炸点)",
204
+ "UnicodeEncodeError" not in out and "UnicodeEncodeError" not in err,
205
+ f"out_tail={out[-160:]!r} err_tail={err[-160:]!r}", live=True)
206
+ check("1d 进程正常下线(EOF 后 returncode=0,非中途崩死)",
207
+ rc == 0, f"rc={rc} err_tail={err[-200:]!r}", live=True)
208
+
209
+ # ---- 2. hive 面实弹:同族 server 同款代码页 ----
210
+ print("[2] hive stdio 实弹(同款 PYTHONIOENCODING=gbk:strict)")
211
+ rc2, out2, err2 = _talk(
212
+ [sys.executable, "-m", "hive.hive_mcp.mcp_server"],
213
+ _hive_env(tmp), [
214
+ _rpc(1, "initialize", {}),
215
+ _rpc(None, "notifications/initialized"),
216
+ _rpc(3, "tools/call", {"name": "hive_spawn", "arguments": {
217
+ "model": "probe-model", "user_prompt": PROBE}}),
218
+ ])
219
+ resps2 = _resp_lines(out2)
220
+ init2 = _find_resp(resps2, 1)
221
+ check("2a initialize 握手存活(合法 JSON 响应,serverInfo=hive-mcp)",
222
+ isinstance(init2, dict)
223
+ and (init2.get("result") or {}).get("serverInfo", {}).get(
224
+ "name") == "hive-mcp",
225
+ f"rc={rc2} lines={len(resps2)} err_tail={err2[-200:]!r}", live=True)
226
+ sp = _find_resp(resps2, 3)
227
+ sp_ok = False
228
+ if isinstance(sp, dict):
229
+ try:
230
+ payload = json.loads(
231
+ (sp.get("result") or {}).get("content", [{}])[0].get(
232
+ "text", "{}"))
233
+ sp_ok = payload.get("ok") is True and bool(payload.get("job_id"))
234
+ except (ValueError, AttributeError, IndexError):
235
+ sp_ok = False
236
+ check("2b 中文 hive_spawn 返回 ok=true+job_id(探针 exe 不存在,绝不拉真 serve)",
237
+ sp_ok, f"resp={str(sp)[:200]}", live=True)
238
+ check("2c hive 面无 UnicodeEncodeError",
239
+ "UnicodeEncodeError" not in out2
240
+ and "UnicodeEncodeError" not in err2,
241
+ f"err_tail={err2[-160:]!r}", live=True)
242
+ # 探针诚实边界:任务必须落在守卫自己的临时池,真实 jobs 池零触碰
243
+ jobs_dir = os.path.join(tmp, "hivejobs")
244
+ probe_jobs = [n for n in (os.listdir(jobs_dir) if os.path.isdir(jobs_dir)
245
+ else []) if n.startswith("h")]
246
+ check("2d 任务落在临时 jobs 池(隔离面自证)",
247
+ len(probe_jobs) == 1 if sp_ok else len(probe_jobs) == 0,
248
+ f"probe_jobs={probe_jobs}")
249
+
250
+ # ---- 3. 源断言:两 server 的 main() 首段强制 UTF-8 ----
251
+ print("[3] 源断言(main() 首段 _force_utf8_stdio())")
252
+ for rel in ("md_cg/mcp_server.py", "hive/hive_mcp/mcp_server.py"):
253
+ with open(os.path.join(ROOT, rel), encoding="utf-8",
254
+ errors="replace") as fh:
255
+ src = fh.read()
256
+ check(f"3·{rel}: 定义存在且 main() 首段调用 _force_utf8_stdio()",
257
+ _main_body_has_call(src),
258
+ "缺定义或 main() 首段未调用(必须早于一切 stderr 中文写与 stdin 读取)")
259
+
260
+ # ---- 4. 守卫自检 floor:实弹断言不足即假绿 ----
261
+ print("[4] 守卫自检")
262
+ check(f"4a 实弹断言数 ≥ {LIVE_FLOOR}(防 spawn/扫描面失效假绿)",
263
+ LIVE >= LIVE_FLOOR, f"LIVE={LIVE}")
264
+ finally:
265
+ shutil.rmtree(tmp, ignore_errors=True)
266
+
267
+ print(f"\n=== issue39 utf8 stdio tests: {PASS} passed, {FAIL} failed "
268
+ f"(live={LIVE}) ===")
269
+ sys.exit(1 if FAIL else 0)
270
+
271
+
272
+ if __name__ == "__main__":
273
+ sys.exit(main())