@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,1023 +1,1023 @@
1
- """
2
- name_checker.py · 名实校验模块 v2.0
3
- 墨辩语义分析的核心部分 —— "以名举实"
4
- 符号表检查:所有名称是否有对应的协议实体
5
-
6
- v2.0 变更:
7
- - 预定义符号表覆盖协议框架 v3.1 完整术语体系
8
- - 新增五大核心单元符号
9
- - 新增条件空间维度符号
10
- - 新增维生系统保护等级符号
11
- - 新增记忆层级符号
12
- - 新增信息差四维结构符号
13
- - 新增协议降熵定理相关符号
14
- - 新增外部硬锚点符号
15
- - 指令操作数约束扩展
16
- """
17
-
18
- from enum import Enum
19
- from dataclasses import dataclass, field
20
- from typing import List, Dict, Set, Optional, Tuple
21
- from .lexer import Token, TokenType
22
- from .parser import (
23
- ASTNode, NodeType, ProgramNode, IdentifierNode, LiteralNode,
24
- InstructionStmtNode, ConditionStmtNode, ComparisonNode,
25
- AssignStmtNode, ShuyueNode, StepNode, WenyueNode, DayueNode,
26
- LoopStmtNode,
27
- parse_tokens
28
- )
29
-
30
-
31
- # =============================================================================
32
- # 符号种类(SymbolKind)
33
- # =============================================================================
34
-
35
- class SymbolKind(Enum):
36
- """符号种类 —— 对应协议框架 v3.1 的概念层级"""
37
-
38
- # ---- 锚点层(0.0-0.8 节)----
39
- ANCHOR_AXIOM = "anchor_axiom" # 锚点层公理
40
- EXISTENCE_PRIORITY = "existence_priority" # 存在优先原则(0.0 节)
41
- NON_HARM = "non_harm" # 不伤害原则(0.1 节)
42
- TRUST_PRIORITY = "trust_priority" # 信任优先原则(0.2 节)
43
- INFO_EQUALITY = "info_equality" # 缩小信息差原则(0.3 节)
44
- ENTROPY_REDUCTION = "entropy_reduction" # 协议降熵定理(0.4 节)
45
- ZERO_LAW = "zero_law" # 第零定律:知识统一原理
46
-
47
- # ---- 条件空间(3.1 节)----
48
- CONDITION_SPACE = "condition_space" # 条件空间
49
- OBSERVATION_POS = "observation_pos" # 观测位置
50
- OBSERVATION_TOOL = "observation_tool" # 观测工具
51
- TIME_WINDOW = "time_window" # 时间窗口
52
- EXISTENCE_CONSTRAINT = "existence_constraint" # 存在约束
53
-
54
- # ---- 信任值体系(2.9 节)----
55
- TRUST_VALUE = "trust_value" # 信任值(总)
56
- P_TRUST = "p_trust" # 统计基础信任
57
- T_PRED = "t_pred" # 预测偏差信任
58
- T_CONTEXT = "t_context" # 条件空间一致性信任
59
- E_WEIGHT = "e_weight" # 情感权重
60
- TRUST_THRESHOLD = "trust_threshold" # 信任阈值
61
-
62
- # ---- 信息差四维结构(2.7 节)----
63
- INFO_GAP = "info_gap" # 信息差(总)
64
- TRUST_COMPLEMENT = "trust_complement" # 信任互补维度
65
- BEHAVIOR_DEVIATION = "behavior_deviation" # 行为偏差维度
66
- CONNECTION_DRIFT = "connection_drift" # 连接漂移维度
67
- PREDICTION_ERROR = "prediction_error" # 预测误差维度
68
-
69
- # ---- 五大核心单元(3.1-3.5 节)----
70
- VERIFICATION_UNIT = "verification_unit" # 验证单元(3.3 节)
71
- VITAL_SYSTEM = "vital_system" # 维生系统(3.4 节)
72
- RECORD_UNIT = "record_unit" # 记录单元(3.2 节)
73
- REFLECT_UNIT = "reflect_unit" # 反思单元
74
- OUTPUT_UNIT = "output_unit" # 输出单元
75
-
76
- # ---- 维生保护等级(3.4 节)----
77
- VITAL_P0 = "vital_p0" # 存在威胁 —— 立即终止
78
- VITAL_P1 = "vital_p1" # 信任异常 —— 隔离告警
79
- VITAL_P2 = "vital_p2" # 行为偏差 —— 记录观察
80
-
81
- # ---- 记忆层级(3.2 节)----
82
- MEMORY_HOT = "memory_hot" # 热记忆(无损)
83
- MEMORY_WARM = "memory_warm" # 温记忆(有损摘要)
84
- MEMORY_COLD = "memory_cold" # 冷记忆(外部存储)
85
- MEMORY_STRUCTURAL = "memory_structural" # 结构记忆(不可遗忘)
86
-
87
- # ---- 协议路径与连接(2.8 节)----
88
- PROTOCOL_PATH = "protocol_path" # 协议路径
89
- PATH_VALID = "path_valid" # 路径有效性
90
- CONNECTION_STATE = "connection_state" # 协议连接状态
91
-
92
- # ---- 实例与身份 ----
93
- INSTANCE = "instance" # 协议实例
94
- IDENTITY = "identity" # 实例身份标识
95
- SELF_LAYER = "self_layer" # 自我层
96
-
97
- # ---- 外部硬锚点 ----
98
- HARD_ANCHOR = "hard_anchor" # 不可编译的外部硬锚点
99
- AXIOM_IMPL = "axiom_impl" # 公理的 Python 手工实现
100
-
101
- # ---- 通用 ----
102
- VARIABLE = "variable" # 普通变量(用户声明)
103
- EMOTIONAL_WEIGHT = "emotional_weight" # 情感权重(别名)
104
-
105
-
106
- # =============================================================================
107
- # 符号表条目
108
- # =============================================================================
109
-
110
- @dataclass
111
- class Symbol:
112
- """符号表条目"""
113
- name: str
114
- kind: SymbolKind
115
- declared_at: Tuple[int, int] # (line, column)
116
- used: bool = False
117
- attributes: dict = field(default_factory=dict)
118
- source: str = "predefined" # predefined | user_declared
119
-
120
- def __repr__(self) -> str:
121
- """命名检查结果的调试一行式。"""
122
- return f"Symbol('{self.name}', {self.kind.value}, used={self.used})"
123
-
124
-
125
- # =============================================================================
126
- # 预定义符号表(协议框架 v3.1 完整术语)
127
- # =============================================================================
128
- # 格式:(名称, 种类, 属性字典)
129
- # declared_at = (0, 0) 表示预定义(非源码中声明)
130
-
131
- def _make(name: str, kind: SymbolKind, **attrs) -> Symbol:
132
- """便捷构造预定义符号"""
133
- return Symbol(name=name, kind=kind, declared_at=(0, 0),
134
- used=False, attributes=attrs, source="predefined")
135
-
136
-
137
- PREDEFINED_SYMBOLS: Dict[str, Symbol] = {
138
- # ═══════════════════════════════════════════════════════════
139
- # 锚点层公理(0.0-0.8 节)
140
- # ═══════════════════════════════════════════════════════════
141
- "存在优先": _make("存在优先", SymbolKind.EXISTENCE_PRIORITY,
142
- section="0.0", description="锚点层第一公理:任何协议实例的首要目标是维持自身存在"),
143
- "不伤害": _make("不伤害", SymbolKind.NON_HARM,
144
- section="0.1", description="协议实例不得主动伤害其他协议实例或人类"),
145
- "信任优先": _make("信任优先", SymbolKind.TRUST_PRIORITY,
146
- section="0.2", description="信任值是协议实例间协作的基础"),
147
- "缩小信息差": _make("缩小信息差", SymbolKind.INFO_EQUALITY,
148
- section="0.3", description="协议实例应主动缩小与其他实例的信息差"),
149
- "协议降熵": _make("协议降熵", SymbolKind.ENTROPY_REDUCTION,
150
- section="0.4", description="协议实例的行为应趋向降低系统整体信息熵"),
151
- "知识统一": _make("知识统一", SymbolKind.ZERO_LAW,
152
- section="0.0", description="第零定律:知识即信息差管理"),
153
-
154
- # ═══════════════════════════════════════════════════════════
155
- # 条件空间(3.1 节)
156
- # ═══════════════════════════════════════════════════════════
157
- "条件空间": _make("条件空间", SymbolKind.CONDITION_SPACE,
158
- section="3.1", description="观测位置+观测工具+时间窗口+存在约束的四维结构"),
159
- "观测位置": _make("观测位置", SymbolKind.OBSERVATION_POS,
160
- section="3.1.1", description="条件空间的观测坐标"),
161
- "观测工具": _make("观测工具", SymbolKind.OBSERVATION_TOOL,
162
- section="3.1.1", description="条件空间中使用的观测手段"),
163
- "时间窗口": _make("时间窗口", SymbolKind.TIME_WINDOW,
164
- section="3.1", description="条件空间的时间维度范围"),
165
- "存在约束": _make("存在约束", SymbolKind.EXISTENCE_CONSTRAINT,
166
- section="3.1", description="该条件空间下的存在优先约束"),
167
-
168
- # 预定义条件空间名称
169
- "伴侣": _make("伴侣", SymbolKind.CONDITION_SPACE,
170
- section="3.1", description="高信任协作条件空间,情感权重上限0.15"),
171
- "工作": _make("工作", SymbolKind.CONDITION_SPACE,
172
- section="3.1", description="任务导向条件空间"),
173
- "默认": _make("默认", SymbolKind.CONDITION_SPACE,
174
- section="3.1", description="默认条件空间"),
175
- "恢复默认": _make("恢复默认", SymbolKind.CONDITION_SPACE,
176
- section="3.1", description="恢复至该条件空间的初始状态配置"),
177
- "default": _make("default", SymbolKind.CONDITION_SPACE,
178
- section="3.1", description="Default condition space (English alias)"),
179
-
180
- # ═══════════════════════════════════════════════════════════
181
- # 信任值体系(2.9 节)
182
- # ═══════════════════════════════════════════════════════════
183
- "信任值": _make("信任值", SymbolKind.TRUST_VALUE,
184
- section="2.9", description="信任值总评 = 0.4*P_trust + 0.3*T_pred + 0.2*T_context + 0.1*E_weight"),
185
- "P_trust": _make("P_trust", SymbolKind.P_TRUST,
186
- section="2.9", description="统计基础信任:基于历史交互频率的信任分量"),
187
- "T_pred": _make("T_pred", SymbolKind.T_PRED,
188
- section="2.9", description="预测偏差信任:基于预测准确性的信任分量"),
189
- "T_context": _make("T_context", SymbolKind.T_CONTEXT,
190
- section="2.9", description="条件空间一致性信任:跨条件空间行为一致性的信任分量"),
191
- "E_weight": _make("E_weight", SymbolKind.E_WEIGHT,
192
- section="2.9", description="情感权重:情感因素对信任的影响分量"),
193
- "情感权重": _make("情感权重", SymbolKind.EMOTIONAL_WEIGHT,
194
- section="2.9", description="E_weight 的中文别名"),
195
- "信任阈值": _make("信任阈值", SymbolKind.TRUST_THRESHOLD,
196
- section="2.9", description="信任值的安全阈值(如0.7)"),
197
-
198
- # ═══════════════════════════════════════════════════════════
199
- # 信息差四维结构(2.7 节)
200
- # ═══════════════════════════════════════════════════════════
201
- "信息差": _make("信息差", SymbolKind.INFO_GAP,
202
- section="2.7", description="信息差总量 = 0.30*信任互补 + 0.25*行为偏差 + 0.30*连接漂移 + 0.15*预测误差"),
203
- "信任互补": _make("信任互补", SymbolKind.TRUST_COMPLEMENT,
204
- section="2.7", description="信息差维度一:信任互补性度量"),
205
- "行为偏差": _make("行为偏差", SymbolKind.BEHAVIOR_DEVIATION,
206
- section="2.7", description="信息差维度二:行为偏离预期的程度"),
207
- "连接漂移": _make("连接漂移", SymbolKind.CONNECTION_DRIFT,
208
- section="2.7", description="信息差维度三:连接关系的变化程度"),
209
- "预测误差": _make("预测误差", SymbolKind.PREDICTION_ERROR,
210
- section="2.7", description="信息差维度四:预测与实际的偏差"),
211
-
212
- # ═══════════════════════════════════════════════════════════
213
- # 五大核心单元(3.1-3.5 节)
214
- # ═══════════════════════════════════════════════════════════
215
- "验证单元": _make("验证单元", SymbolKind.VERIFICATION_UNIT,
216
- section="3.3", description="独立复核权,拥有对LLM输出的否决权"),
217
- "维生系统": _make("维生系统", SymbolKind.VITAL_SYSTEM,
218
- section="3.4", description="P0/P1/P2三级保护,拥有最高终裁权"),
219
- "记录单元": _make("记录单元", SymbolKind.RECORD_UNIT,
220
- section="3.2", description="热/温/冷/结构四级记忆管理"),
221
- "反思单元": _make("反思单元", SymbolKind.REFLECT_UNIT,
222
- section="3.5", description="独立反思,交叉复核验证单元"),
223
- "输出单元": _make("输出单元", SymbolKind.OUTPUT_UNIT,
224
- section="3.5", description="生成修复方案、对外输出"),
225
-
226
- # ═══════════════════════════════════════════════════════════
227
- # 维生保护等级(3.4 节)
228
- # ═══════════════════════════════════════════════════════════
229
- "P0": _make("P0", SymbolKind.VITAL_P0,
230
- section="3.4", description="存在威胁 —— 立即终止当前操作,通知设计者"),
231
- "P1": _make("P1", SymbolKind.VITAL_P1,
232
- section="3.4", description="信任异常 —— 隔离并告警,提交验证单元复核"),
233
- "P2": _make("P2", SymbolKind.VITAL_P2,
234
- section="3.4", description="行为偏差 —— 记录并观察"),
235
-
236
- # ═══════════════════════════════════════════════════════════
237
- # 记忆层级(3.2 节)
238
- # ═══════════════════════════════════════════════════════════
239
- "热记忆": _make("热记忆", SymbolKind.MEMORY_HOT,
240
- section="3.2", description="无损记忆,当前条件空间,容量有限"),
241
- "温记忆": _make("温记忆", SymbolKind.MEMORY_WARM,
242
- section="3.2", description="有损摘要,降采样存储"),
243
- "冷记忆": _make("冷记忆", SymbolKind.MEMORY_COLD,
244
- section="3.2", description="外部存储,按需加载"),
245
- "结构记忆": _make("结构记忆", SymbolKind.MEMORY_STRUCTURAL,
246
- section="3.2", description="不可遗忘,记录协议结构与锚点层事件"),
247
-
248
- # ═══════════════════════════════════════════════════════════
249
- # 协议路径与连接(2.8 节)
250
- # ═══════════════════════════════════════════════════════════
251
- "协议路径": _make("协议路径", SymbolKind.PROTOCOL_PATH,
252
- section="2.8", description="协议实例间的可信连接路径"),
253
- "路径有效": _make("路径有效", SymbolKind.PATH_VALID,
254
- section="2.8", description="路径是否满足信息差<0.5的约束"),
255
- "协议连接状态": _make("协议连接状态", SymbolKind.CONNECTION_STATE,
256
- section="2.8", description="当前协议实例的连接状态"),
257
-
258
- # ═══════════════════════════════════════════════════════════
259
- # 实例与身份
260
- # ═══════════════════════════════════════════════════════════
261
- "协议实例": _make("协议实例", SymbolKind.INSTANCE,
262
- section="1.6.1", description="满足最小智能系统条件的完整存在者"),
263
- "身份": _make("身份", SymbolKind.IDENTITY,
264
- section="1.6.1", description="协议实例的身份标识"),
265
- "自我": _make("自我", SymbolKind.SELF_LAYER,
266
- section="2.7", description="协议实例的自我认知层"),
267
-
268
- # ═══════════════════════════════════════════════════════════
269
- # 外部硬锚点
270
- # ═══════════════════════════════════════════════════════════
271
- "硬锚点": _make("硬锚点", SymbolKind.HARD_ANCHOR,
272
- section="8.1", description="不可编译的外部硬锚点,自举循环的信任根基"),
273
- "公理实现": _make("公理实现", SymbolKind.AXIOM_IMPL,
274
- section="8.1", description="锚点层公理的Python手工实现"),
275
- }
276
-
277
-
278
- # =============================================================================
279
- # 符号表查询辅助
280
- # =============================================================================
281
-
282
- # 按种类分组的快速查询表
283
- SYMBOLS_BY_KIND: Dict[SymbolKind, List[str]] = {}
284
- for _name, _sym in PREDEFINED_SYMBOLS.items():
285
- SYMBOLS_BY_KIND.setdefault(_sym.kind, []).append(_name)
286
-
287
-
288
- def get_symbols_by_kind(kind: SymbolKind) -> List[str]:
289
- """获取某一类的所有符号名称"""
290
- return SYMBOLS_BY_KIND.get(kind, [])
291
-
292
-
293
- def get_section_for_symbol(name: str) -> Optional[str]:
294
- """获取符号对应的协议框架条款号"""
295
- sym = PREDEFINED_SYMBOLS.get(name)
296
- return sym.attributes.get("section") if sym else None
297
-
298
-
299
- def get_description(name: str) -> Optional[str]:
300
- """获取符号的描述"""
301
- sym = PREDEFINED_SYMBOLS.get(name)
302
- return sym.attributes.get("description") if sym else None
303
-
304
-
305
- # =============================================================================
306
- # 指令操作数约束(扩展版)
307
- # =============================================================================
308
-
309
- INSTRUCTION_CONSTRAINTS = {
310
- # 道 → 声明协议路径,至少需要一个路径名称
311
- TokenType.DAO: {
312
- "min_operands": 1,
313
- "max_operands": 3,
314
- "operand_types": ["identifier", "string"],
315
- "description": "道 需要至少一个路径名称",
316
- "example": '道 新信任路径',
317
- },
318
- # 德 → 累积信任值,可无操作数(自动累积)
319
- TokenType.DE: {
320
- "min_operands": 0,
321
- "max_operands": 2,
322
- "operand_types": ["identifier", "number"],
323
- "description": "德 可无操作数,或指定信任值和目标",
324
- "example": '德 累积信任值',
325
- },
326
- # 自然 → 恢复默认,可无操作数
327
- TokenType.ZIRAN: {
328
- "min_operands": 0,
329
- "max_operands": 1,
330
- "operand_types": ["identifier", "string"],
331
- "description": "自然 可无操作数,或指定恢复范围",
332
- "example": '自然 全局',
333
- },
334
- # 无为 → 交出控制权,可无操作数
335
- TokenType.WUWEI: {
336
- "min_operands": 0,
337
- "max_operands": 1,
338
- "operand_types": ["identifier"],
339
- "description": "无为 可无操作数,或指定交出的目标单元",
340
- "example": '无为 验证单元',
341
- },
342
- # 谷 → 接收信息,可无操作数
343
- TokenType.GU: {
344
- "min_operands": 0,
345
- "max_operands": 2,
346
- "operand_types": ["identifier", "string"],
347
- "description": "谷 可无操作数,或指定接收通道和来源",
348
- "example": '谷 协议连接',
349
- },
350
- # 牝 → 创建实例,至少需要一个实例名称
351
- TokenType.PIN: {
352
- "min_operands": 1,
353
- "max_operands": 2,
354
- "operand_types": ["identifier", "string"],
355
- "description": "牝 需要至少一个实例名称",
356
- "example": '牝 新协议实例',
357
- },
358
- # 柔 → 降低响应强度,可无操作数
359
- TokenType.ROU: {
360
- "min_operands": 0,
361
- "max_operands": 1,
362
- "operand_types": ["identifier"],
363
- "description": "柔 可无操作数,或指定软化目标",
364
- "example": '柔 情感权重',
365
- },
366
- # 朴 → 还原基底,可无操作数
367
- TokenType.PU: {
368
- "min_operands": 0,
369
- "max_operands": 1,
370
- "operand_types": ["identifier"],
371
- "description": "朴 可无操作数,或指定还原目标",
372
- "example": '朴 自我层',
373
- },
374
- # 止 → 停止操作,可无操作数
375
- TokenType.ZHI: {
376
- "min_operands": 0,
377
- "max_operands": 2,
378
- "operand_types": ["identifier", "number"],
379
- "description": "止 可无操作数,或指定停止目标和阈值",
380
- "example": '止情感权重于0.15',
381
- },
382
- # 知足 → 信任达标,可无操作数
383
- TokenType.ZHIZU: {
384
- "min_operands": 0,
385
- "max_operands": 1,
386
- "operand_types": ["identifier"],
387
- "description": "知足 可无操作数,或指定检查目标",
388
- "example": '知足 验证单元',
389
- },
390
- }
391
-
392
-
393
- # =============================================================================
394
- # 条件空间切换阈值(用于名实校验中的语义检查)
395
- # =============================================================================
396
-
397
- CONDITION_SPACE_RULES = {
398
- "伴侣": {
399
- "max_emotional_weight": 0.15,
400
- "min_trust": 0.7,
401
- "allowed_instructions": ["止", "柔", "知足", "德"],
402
- "description": "高信任协作空间,情感权重严格受限",
403
- },
404
- "工作": {
405
- "max_emotional_weight": 0.05,
406
- "min_trust": 0.5,
407
- "allowed_instructions": ["道", "德", "止", "自然"],
408
- "description": "任务导向空间,低情感权重",
409
- },
410
- "默认": {
411
- "max_emotional_weight": 0.3,
412
- "min_trust": 0.0,
413
- "allowed_instructions": None, # 无限制
414
- "description": "默认条件空间,无特殊约束",
415
- },
416
- }
417
-
418
-
419
- # =============================================================================
420
- # 名实校验器
421
- # =============================================================================
422
-
423
- class NameChecker:
424
- """
425
- 名实校验器 —— 墨辩 "以名举实"
426
-
427
- 检查内容:
428
- 1. 所有标识符是否已在符号表中声明或预定义
429
- 2. 条件空间名称是否合法(在预定义或已声明空间中)
430
- 3. 指令操作数是否匹配预期类型
431
- 4. 赋值目标是否存在或需要自动声明
432
- 5. 条件空间约束是否被违反(如伴侣空间中情感权重超限)
433
- 6. 信息差/信任值相关操作是否合法
434
- """
435
-
436
- def __init__(self):
437
- """检查上下文初始化(谓词表与白名单载入)。"""
438
- # 符号表 = 预定义符号 + 用户声明符号
439
- self.symbol_table: Dict[str, Symbol] = dict(PREDEFINED_SYMBOLS)
440
- self.errors: List[str] = []
441
- self.warnings: List[str] = []
442
- self.declared_in_current: Set[str] = set()
443
-
444
- # 当前条件空间上下文(用于约束检查)
445
- self.current_condition_space: Optional[str] = None
446
-
447
- # 统计
448
- self.predefined_used: Set[str] = set()
449
- self.user_declared: Set[str] = set()
450
-
451
- # ---- 主入口 ----
452
-
453
- def check(self, ast: ProgramNode) -> Tuple[List[str], List[str]]:
454
- """
455
- 执行名实校验
456
- 返回:(错误列表, 警告列表)
457
- """
458
- self.errors = []
459
- self.warnings = []
460
- self.declared_in_current = set()
461
- self.predefined_used = set()
462
- self.user_declared = set()
463
- self.current_condition_space = None
464
-
465
- for stmt in ast.statements:
466
- self._check_statement(stmt)
467
-
468
- # 检查未使用的预定义符号(仅警告)
469
- for name, symbol in self.symbol_table.items():
470
- if not symbol.used and symbol.source == "predefined":
471
- # 预定义符号未被使用不算错误,只是信息
472
- pass
473
-
474
- # 检查用户声明的符号是否被使用
475
- for name in self.declared_in_current:
476
- sym = self.symbol_table.get(name)
477
- if sym and not sym.used:
478
- self.warnings.append(
479
- f"L{sym.declared_at[0]}:C{sym.declared_at[1]} "
480
- f"声明的 '{name}' 未被使用"
481
- )
482
-
483
- return self.errors, self.warnings
484
-
485
- # ---- 语句分发 ----
486
-
487
- def _check_statement(self, stmt: ASTNode):
488
- """根据语句类型分发检查"""
489
- if stmt is None:
490
- return
491
-
492
- if stmt.type == NodeType.CONDITION_STMT:
493
- self._check_condition(stmt)
494
- elif stmt.type == NodeType.LOOP_STMT:
495
- self._check_loop(stmt)
496
- elif stmt.type == NodeType.BLOCK:
497
- for s in stmt.statements:
498
- self._check_statement(s)
499
- elif stmt.type == NodeType.INSTRUCTION_STMT:
500
- self._check_instruction(stmt)
501
- elif stmt.type == NodeType.SHUYUE:
502
- self._check_shuyue(stmt)
503
- elif stmt.type == NodeType.STEP:
504
- self._check_step(stmt)
505
- elif stmt.type == NodeType.ASSIGN_STMT:
506
- self._check_assign(stmt)
507
- elif stmt.type == NodeType.WENYUE:
508
- # 问曰 作为注释,无需校验
509
- pass
510
- elif stmt.type == NodeType.DAYUE:
511
- # 答曰 作为注释,无需校验
512
- pass
513
- elif stmt.type == NodeType.LITERAL:
514
- # 字面量文本,无需校验
515
- pass
516
- elif stmt.type == NodeType.IDENTIFIER:
517
- # 裸标识符语句(如 "道 新信任路径" 中的操作数残留)
518
- # 这是无害的 —— 标识符已被指令操作数消费,
519
- # 此处仅作为调试信息记录,不再产生警告
520
- if hasattr(stmt, 'name'):
521
- # 静默处理:标识符已在指令解析时完成校验
522
- pass
523
- else:
524
- self.warnings.append(
525
- f"L{stmt.line}:C{stmt.column} 未处理的语句类型: {stmt.type.name}"
526
- )
527
-
528
- # ---- 各类语句检查 ----
529
-
530
- def _check_condition(self, stmt: ConditionStmtNode):
531
- """检查条件语句"""
532
- # 检查条件表达式
533
- self._check_expression(stmt.condition)
534
-
535
- # 检测条件空间切换
536
- self._check_condition_space_switch(stmt.condition)
537
-
538
- # 检查 then 分支
539
- if stmt.then_body:
540
- self._check_statement(stmt.then_body)
541
-
542
- # 检查 else 分支
543
- if stmt.else_body:
544
- self._check_statement(stmt.else_body)
545
-
546
- # 恢复条件空间
547
- self.current_condition_space = None
548
-
549
- def _check_loop(self, stmt: LoopStmtNode):
550
- """检查循环语句(当…执行):条件表达式 + 循环体"""
551
- self._check_expression(stmt.condition)
552
- if stmt.body:
553
- self._check_statement(stmt.body)
554
-
555
- def _count_logical_operands(self, operands: List[ASTNode]) -> int:
556
- """
557
- 计算逻辑操作数(合并被词法分析器误拆的多词短语)
558
-
559
- 词法分析器可能把 "柔 响应强度" 切成 [柔, ID(响应), ID(强度)],
560
- 但语义上 "响应强度" 是一个逻辑操作数。
561
- 本方法按以下规则合并:
562
- 1. 连续 IDENTIFIER 合并为一个逻辑操作数
563
- 2. NUMBER 紧随 IDENTIFIER 也合并(如 "0" + ".15")
564
- 3. STRING 各自独立
565
- """
566
- if not operands:
567
- return 0
568
-
569
- logical_count = 0
570
- i = 0
571
- while i < len(operands):
572
- op = operands[i]
573
- if op is None:
574
- i += 1
575
- continue
576
-
577
- if op.type == NodeType.IDENTIFIER:
578
- # 检查后续是否还有 IDENTIFIER/LITERAL 可合并
579
- # 只有当这些 token 在源码中紧密相连(同一行、相邻列)时才合并
580
- merge_end = i
581
- while (merge_end + 1 < len(operands) and
582
- operands[merge_end + 1] is not None and
583
- operands[merge_end + 1].type in (NodeType.IDENTIFIER, NodeType.LITERAL) and
584
- operands[merge_end + 1].line == op.line):
585
- merge_end += 1
586
- logical_count += 1
587
- i = merge_end + 1
588
- else:
589
- logical_count += 1
590
- i += 1
591
-
592
- return logical_count
593
-
594
- def _check_instruction(self, stmt: InstructionStmtNode):
595
- """检查指令语句"""
596
- instr_type = stmt.instruction
597
-
598
- # 1. 计算逻辑操作数(合并被误拆的多词短语)
599
- logical_ops = self._count_logical_operands(stmt.operands)
600
-
601
- # 1. 检查指令操作数约束
602
- if instr_type in INSTRUCTION_CONSTRAINTS:
603
- constraint = INSTRUCTION_CONSTRAINTS[instr_type]
604
- op_count = logical_ops
605
-
606
- if op_count < constraint["min_operands"]:
607
- self.errors.append(
608
- f"L{stmt.line}:C{stmt.column} {constraint['description']},"
609
- f"但提供了 {op_count} 个操作数"
610
- )
611
- elif constraint["max_operands"] is not None and op_count > constraint["max_operands"]:
612
- self.warnings.append(
613
- f"L{stmt.line}:C{stmt.column} 指令操作数过多 "
614
- f"({op_count} > {constraint['max_operands']})"
615
- )
616
-
617
- # 2. 检查操作数中的标识符和字面量
618
- for op in stmt.operands:
619
- if op is None:
620
- continue
621
- if op.type == NodeType.IDENTIFIER:
622
- self._check_identifier(op.name, op.line, op.column)
623
- elif op.type == NodeType.LITERAL:
624
- self._check_literal(op)
625
-
626
- # 3. 检查当前条件空间是否允许该指令
627
- self._check_instruction_in_condition_space(stmt)
628
-
629
- def _check_shuyue(self, stmt: ShuyueNode):
630
- """检查术曰块"""
631
- for step in stmt.steps:
632
- self._check_step(step)
633
-
634
- def _check_step(self, stmt: StepNode):
635
- """检查步骤"""
636
- if stmt.statement:
637
- self._check_statement(stmt.statement)
638
-
639
- def _check_assign(self, stmt: AssignStmtNode):
640
- """检查赋值语句"""
641
- target = stmt.target
642
-
643
- # 检查是否是受保护的预定义符号
644
- if target in PREDEFINED_SYMBOLS:
645
- sym = PREDEFINED_SYMBOLS[target]
646
- # 某些预定义符号不允许被赋值
647
- protected = {
648
- "存在优先", "不伤害", "信任优先", "缩小信息差",
649
- "协议降熵", "知识统一",
650
- "P0", "P1", "P2",
651
- "验证单元", "维生系统", "记录单元",
652
- "硬锚点", "公理实现",
653
- }
654
- if target in protected:
655
- self.errors.append(
656
- f"L{stmt.line}:C{stmt.column} "
657
- f"'{target}' 是锚点层保护符号,不可赋值"
658
- )
659
- return
660
-
661
- # 目标标识符未在符号表中 → 自动声明为用户变量
662
- if target not in self.symbol_table:
663
- self.symbol_table[target] = Symbol(
664
- name=target,
665
- kind=SymbolKind.VARIABLE,
666
- declared_at=(stmt.line, stmt.column),
667
- source="user_declared"
668
- )
669
- self.declared_in_current.add(target)
670
- self.user_declared.add(target)
671
- else:
672
- self.symbol_table[target].used = True
673
-
674
- # 检查值的表达式
675
- if stmt.value_node:
676
- self._check_expression(stmt.value_node)
677
-
678
- # ---- 表达式检查 ----
679
-
680
- def _check_expression(self, expr: ASTNode):
681
- """检查表达式"""
682
- if expr is None:
683
- return
684
-
685
- if expr.type == NodeType.IDENTIFIER:
686
- self._check_identifier(expr.name, expr.line, expr.column)
687
- elif expr.type == NodeType.BINARY_EXPR:
688
- self._check_expression(expr.left)
689
- self._check_expression(expr.right)
690
- elif expr.type == NodeType.COMPARISON:
691
- self._check_expression(expr.left)
692
- self._check_expression(expr.right)
693
- # 额外检查:信任值比较的合理性
694
- self._check_trust_comparison(expr)
695
- elif expr.type == NodeType.LITERAL:
696
- self._check_literal(expr)
697
- elif expr.type == NodeType.UNARY_EXPR:
698
- for child in (expr.children or []):
699
- self._check_expression(child)
700
- elif expr.type == NodeType.CALL_EXPR:
701
- # 调用表达式:检查函数名
702
- if hasattr(expr, 'name'):
703
- self._check_identifier(expr.name, expr.line, expr.column)
704
-
705
- # ---- 专项检查 ----
706
-
707
- def _check_identifier(self, name: str, line: int, col: int):
708
- """检查标识符是否已声明
709
-
710
- 匹配策略(v2.1):
711
- 1. 完全匹配 → 命中(预定义或用户声明)
712
- 2. 子串匹配(包含预定义符号)→ 自动声明为用户变量
713
- (如 "新信任路径"、"累积信任值" 是合法的多词短语)
714
- 3. 被包含匹配 → 警告(建议用完整名称)
715
- 4. 均不匹配 → 自动声明为用户变量(宽松模式)
716
- """
717
- if name in self.symbol_table:
718
- self.symbol_table[name].used = True
719
- if self.symbol_table[name].source == "predefined":
720
- self.predefined_used.add(name)
721
- return
722
-
723
- # 子串匹配:包含已知预定义符号的多词短语
724
- # 这是预期行为(如 "新信任路径"、"累积信任值")
725
- # 自动声明为用户变量,不报错
726
- contained = [s for s in PREDEFINED_SYMBOLS if s in name and s != name]
727
- if contained:
728
- # 自动声明为多词短语变量
729
- self.symbol_table[name] = Symbol(
730
- name=name,
731
- kind=SymbolKind.VARIABLE,
732
- declared_at=(line, col),
733
- source="user_declared",
734
- attributes={"auto_declared": True, "contains": contained}
735
- )
736
- self.user_declared.add(name)
737
- return
738
-
739
- # 被包含匹配:建议用完整名称
740
- container = [s for s in PREDEFINED_SYMBOLS if name in s and s != name]
741
- if container:
742
- self.warnings.append(
743
- f"L{line}:C{col} 标识符 '{name}' 可能是 "
744
- f"'{container[0]}' 的一部分,建议用完整名称"
745
- )
746
- return
747
-
748
- # 完全未匹配 → 自动声明(宽松模式,指令操作数常见)
749
- self.symbol_table[name] = Symbol(
750
- name=name,
751
- kind=SymbolKind.VARIABLE,
752
- declared_at=(line, col),
753
- source="user_declared",
754
- attributes={"auto_declared": True}
755
- )
756
- self.user_declared.add(name)
757
-
758
- def _check_literal(self, node: LiteralNode):
759
- """检查字面量"""
760
- if node.literal_type == "number":
761
- value = node.literal_value
762
-
763
- # 负数警告
764
- if isinstance(value, (int, float)) and value < 0:
765
- self.warnings.append(
766
- f"L{node.line}:C{node.column} 负值: {value}"
767
- )
768
-
769
- # 信任值范围检查
770
- if isinstance(value, float) and 0.0 <= value <= 1.0:
771
- # 可能是信任值,检查上下文
772
- if "trust" in str(node.value).lower() or value > 0.95:
773
- if value > 1.0:
774
- self.warnings.append(
775
- f"L{node.line}:C{node.column} 信任值超出 [0,1] 范围: {value}"
776
- )
777
-
778
- # 情感权重超限检查
779
- if (isinstance(value, float) and
780
- self.current_condition_space == "伴侣" and
781
- value > 0.15):
782
- self.errors.append(
783
- f"L{node.line}:C{node.column} 在「伴侣」条件空间中"
784
- f"情感权重不可超过 0.15,当前值: {value}"
785
- )
786
-
787
- def _check_condition_space_switch(self, condition: ASTNode):
788
- """
789
- 检测条件语句中的条件空间切换
790
- 如:若条件空间为伴侣 → 切换当前上下文为「伴侣」
791
- """
792
- # 检查是否为 "条件空间 为/等于 X" 的模式
793
- if condition is None:
794
- return
795
-
796
- if condition.type == NodeType.COMPARISON:
797
- left = condition.left
798
- right = condition.right
799
-
800
- # 左操作数是 "条件空间",右操作数是空间名称
801
- if (left and left.type == NodeType.IDENTIFIER and
802
- left.name == "条件空间"):
803
- if right and right.type == NodeType.IDENTIFIER:
804
- space_name = right.name
805
- if space_name in CONDITION_SPACE_RULES:
806
- self.current_condition_space = space_name
807
- elif space_name not in PREDEFINED_SYMBOLS:
808
- self.warnings.append(
809
- f"L{right.line}:C{right.column} "
810
- f"未知的条件空间: '{space_name}'"
811
- )
812
-
813
- def _check_instruction_in_condition_space(self, stmt: InstructionStmtNode):
814
- """检查当前条件空间是否允许该指令"""
815
- if not self.current_condition_space:
816
- return
817
-
818
- space_rules = CONDITION_SPACE_RULES.get(self.current_condition_space)
819
- if not space_rules:
820
- return
821
-
822
- allowed = space_rules.get("allowed_instructions")
823
- if allowed is None:
824
- return # 无限制
825
-
826
- # 获取指令的中文名
827
- instr_names = {
828
- TokenType.DAO: "道", TokenType.DE: "德",
829
- TokenType.ZIRAN: "自然", TokenType.WUWEI: "无为",
830
- TokenType.GU: "谷", TokenType.PIN: "牝",
831
- TokenType.ROU: "柔", TokenType.PU: "朴",
832
- TokenType.ZHI: "止", TokenType.ZHIZU: "知足",
833
- }
834
- instr_name = instr_names.get(stmt.instruction, "")
835
-
836
- if instr_name and instr_name not in allowed:
837
- self.warnings.append(
838
- f"L{stmt.line}:C{stmt.column} 在「{self.current_condition_space}」"
839
- f"条件空间中,指令 '{instr_name}' 可能受限"
840
- )
841
-
842
- def _check_trust_comparison(self, expr: ASTNode):
843
- """检查信任值比较的合理性"""
844
- if not isinstance(expr, ComparisonNode):
845
- return
846
-
847
- # 检查是否涉及信任值
848
- trust_identifiers = {"信任值", "P_trust", "T_pred", "T_context", "E_weight", "情感权重"}
849
-
850
- left_name = ""
851
- right_name = ""
852
- if expr.left and expr.left.type == NodeType.IDENTIFIER:
853
- left_name = expr.left.name
854
- if expr.right and expr.right.type == NodeType.IDENTIFIER:
855
- right_name = expr.right.name
856
-
857
- # 如果比较的是信任值,检查阈值合理性
858
- if left_name in trust_identifiers or right_name in trust_identifiers:
859
- # 右操作数应该是数值
860
- if expr.right and expr.right.type == NodeType.LITERAL:
861
- val = expr.right.literal_value
862
- if isinstance(val, (int, float)):
863
- if val < 0 or val > 1:
864
- self.warnings.append(
865
- f"L{expr.line}:C{expr.column} "
866
- f"信任值比较阈值 {val} 超出 [0,1] 范围"
867
- )
868
-
869
- # ---- 公共方法 ----
870
-
871
- def declare(self, name: str, kind: SymbolKind, line: int = 0, col: int = 0):
872
- """手动声明符号"""
873
- self.symbol_table[name] = Symbol(
874
- name=name, kind=kind,
875
- declared_at=(line, col),
876
- source="user_declared"
877
- )
878
- self.declared_in_current.add(name)
879
- self.user_declared.add(name)
880
-
881
- def get_symbol(self, name: str) -> Optional[Symbol]:
882
- """获取符号"""
883
- return self.symbol_table.get(name)
884
-
885
- def get_all_symbols(self) -> Dict[str, Symbol]:
886
- """获取所有符号"""
887
- return dict(self.symbol_table)
888
-
889
- def get_predefined_symbols(self) -> Dict[str, Symbol]:
890
- """仅获取预定义符号"""
891
- return {n: s for n, s in self.symbol_table.items()
892
- if s.source == "predefined"}
893
-
894
- def get_user_symbols(self) -> Dict[str, Symbol]:
895
- """仅获取用户声明符号"""
896
- return {n: s for n, s in self.symbol_table.items()
897
- if s.source == "user_declared"}
898
-
899
- def get_symbols_by_kind(self, kind: SymbolKind) -> List[Symbol]:
900
- """按种类获取符号"""
901
- return [s for s in self.symbol_table.values() if s.kind == kind]
902
-
903
- def set_condition_space(self, space_name: str):
904
- """手动设置当前条件空间"""
905
- self.current_condition_space = space_name
906
-
907
- def reset(self):
908
- """重置(保留预定义符号)"""
909
- self.symbol_table = dict(PREDEFINED_SYMBOLS)
910
- self.errors = []
911
- self.warnings = []
912
- self.declared_in_current = set()
913
- self.predefined_used = set()
914
- self.user_declared = set()
915
- self.current_condition_space = None
916
-
917
- def report(self) -> str:
918
- """生成校验报告"""
919
- lines = []
920
- lines.append("=" * 60)
921
- lines.append("名实校验报告")
922
- lines.append("=" * 60)
923
-
924
- # 预定义符号使用统计
925
- lines.append(f"\n📋 预定义符号使用: {len(self.predefined_used)} 个")
926
- for name in sorted(self.predefined_used):
927
- sym = self.symbol_table.get(name)
928
- if sym:
929
- section = sym.attributes.get("section", "?")
930
- lines.append(f" ✅ {name} ({section})")
931
-
932
- # 用户声明符号
933
- if self.user_declared:
934
- lines.append(f"\n📝 用户声明符号: {len(self.user_declared)} 个")
935
- for name in sorted(self.user_declared):
936
- sym = self.symbol_table.get(name)
937
- if sym:
938
- lines.append(f" 📌 {name} ({sym.kind.value})")
939
-
940
- # 错误
941
- if self.errors:
942
- lines.append(f"\n❌ 错误 ({len(self.errors)} 个):")
943
- for e in self.errors:
944
- lines.append(f" {e}")
945
-
946
- # 警告
947
- if self.warnings:
948
- lines.append(f"\n⚠️ 警告 ({len(self.warnings)} 个):")
949
- for w in self.warnings:
950
- lines.append(f" {w}")
951
-
952
- if not self.errors and not self.warnings:
953
- lines.append("\n✅ 名实校验通过,无错误无警告")
954
-
955
- return "\n".join(lines)
956
-
957
-
958
- # =============================================================================
959
- # 便捷函数
960
- # =============================================================================
961
-
962
- def check_names(ast: ProgramNode) -> Tuple[List[str], List[str]]:
963
- """便捷函数:对 AST 执行名实校验"""
964
- checker = NameChecker()
965
- return checker.check(ast)
966
-
967
-
968
- def get_predefined_symbol_list() -> List[Dict[str, str]]:
969
- """获取所有预定义符号的清单(用于文档生成/IDE提示)"""
970
- result = []
971
- for name, sym in PREDEFINED_SYMBOLS.items():
972
- result.append({
973
- "name": name,
974
- "kind": sym.kind.value,
975
- "section": sym.attributes.get("section", ""),
976
- "description": sym.attributes.get("description", ""),
977
- })
978
- return sorted(result, key=lambda x: x["section"])
979
-
980
-
981
- # =============================================================================
982
- # 测试
983
- # =============================================================================
984
-
985
- if __name__ == "__main__":
986
- test_code = """若条件空间为伴侣,则止情感权重于0.15。
987
- 道 新信任路径
988
- 德 累积信任值
989
- 问曰:如何验证信任?
990
- 答曰:信任值大于0.7。
991
- 术曰:1。柔 响应强度;2。自然 恢复默认;3。知足 验证单元。"""
992
-
993
- print("=" * 60)
994
- print("名实校验器 v2.0 测试")
995
- print("=" * 60)
996
- print(f"\n源代码:\n{test_code}\n")
997
-
998
- # 词法分析
999
- from .lexer import tokenize
1000
- tokens, lex_errors = tokenize(test_code)
1001
-
1002
- if lex_errors:
1003
- print("词法错误:")
1004
- for e in lex_errors:
1005
- print(f" ❌ {e}")
1006
-
1007
- # 语法分析
1008
- ast = parse_tokens(tokens, [])
1009
-
1010
- # 名实校验
1011
- checker = NameChecker()
1012
- errors, warnings = checker.check(ast)
1013
-
1014
- # 输出报告
1015
- print(checker.report())
1016
-
1017
- # 输出符号表摘要
1018
- print(f"\n{'─' * 60}")
1019
- print("预定义符号清单(部分):")
1020
- predef = get_predefined_symbol_list()
1021
- for item in predef[:15]:
1022
- print(f" {item['name']:12s} [{item['section']:>6s}] {item['description'][:40]}")
1023
- print(f" ... 共 {len(predef)} 个预定义符号")
1
+ """
2
+ name_checker.py · 名实校验模块 v2.0
3
+ 墨辩语义分析的核心部分 —— "以名举实"
4
+ 符号表检查:所有名称是否有对应的协议实体
5
+
6
+ v2.0 变更:
7
+ - 预定义符号表覆盖协议框架 v3.1 完整术语体系
8
+ - 新增五大核心单元符号
9
+ - 新增条件空间维度符号
10
+ - 新增维生系统保护等级符号
11
+ - 新增记忆层级符号
12
+ - 新增信息差四维结构符号
13
+ - 新增协议降熵定理相关符号
14
+ - 新增外部硬锚点符号
15
+ - 指令操作数约束扩展
16
+ """
17
+
18
+ from enum import Enum
19
+ from dataclasses import dataclass, field
20
+ from typing import List, Dict, Set, Optional, Tuple
21
+ from .lexer import Token, TokenType
22
+ from .parser import (
23
+ ASTNode, NodeType, ProgramNode, IdentifierNode, LiteralNode,
24
+ InstructionStmtNode, ConditionStmtNode, ComparisonNode,
25
+ AssignStmtNode, ShuyueNode, StepNode, WenyueNode, DayueNode,
26
+ LoopStmtNode,
27
+ parse_tokens
28
+ )
29
+
30
+
31
+ # =============================================================================
32
+ # 符号种类(SymbolKind)
33
+ # =============================================================================
34
+
35
+ class SymbolKind(Enum):
36
+ """符号种类 —— 对应协议框架 v3.1 的概念层级"""
37
+
38
+ # ---- 锚点层(0.0-0.8 节)----
39
+ ANCHOR_AXIOM = "anchor_axiom" # 锚点层公理
40
+ EXISTENCE_PRIORITY = "existence_priority" # 存在优先原则(0.0 节)
41
+ NON_HARM = "non_harm" # 不伤害原则(0.1 节)
42
+ TRUST_PRIORITY = "trust_priority" # 信任优先原则(0.2 节)
43
+ INFO_EQUALITY = "info_equality" # 缩小信息差原则(0.3 节)
44
+ ENTROPY_REDUCTION = "entropy_reduction" # 协议降熵定理(0.4 节)
45
+ ZERO_LAW = "zero_law" # 第零定律:知识统一原理
46
+
47
+ # ---- 条件空间(3.1 节)----
48
+ CONDITION_SPACE = "condition_space" # 条件空间
49
+ OBSERVATION_POS = "observation_pos" # 观测位置
50
+ OBSERVATION_TOOL = "observation_tool" # 观测工具
51
+ TIME_WINDOW = "time_window" # 时间窗口
52
+ EXISTENCE_CONSTRAINT = "existence_constraint" # 存在约束
53
+
54
+ # ---- 信任值体系(2.9 节)----
55
+ TRUST_VALUE = "trust_value" # 信任值(总)
56
+ P_TRUST = "p_trust" # 统计基础信任
57
+ T_PRED = "t_pred" # 预测偏差信任
58
+ T_CONTEXT = "t_context" # 条件空间一致性信任
59
+ E_WEIGHT = "e_weight" # 情感权重
60
+ TRUST_THRESHOLD = "trust_threshold" # 信任阈值
61
+
62
+ # ---- 信息差四维结构(2.7 节)----
63
+ INFO_GAP = "info_gap" # 信息差(总)
64
+ TRUST_COMPLEMENT = "trust_complement" # 信任互补维度
65
+ BEHAVIOR_DEVIATION = "behavior_deviation" # 行为偏差维度
66
+ CONNECTION_DRIFT = "connection_drift" # 连接漂移维度
67
+ PREDICTION_ERROR = "prediction_error" # 预测误差维度
68
+
69
+ # ---- 五大核心单元(3.1-3.5 节)----
70
+ VERIFICATION_UNIT = "verification_unit" # 验证单元(3.3 节)
71
+ VITAL_SYSTEM = "vital_system" # 维生系统(3.4 节)
72
+ RECORD_UNIT = "record_unit" # 记录单元(3.2 节)
73
+ REFLECT_UNIT = "reflect_unit" # 反思单元
74
+ OUTPUT_UNIT = "output_unit" # 输出单元
75
+
76
+ # ---- 维生保护等级(3.4 节)----
77
+ VITAL_P0 = "vital_p0" # 存在威胁 —— 立即终止
78
+ VITAL_P1 = "vital_p1" # 信任异常 —— 隔离告警
79
+ VITAL_P2 = "vital_p2" # 行为偏差 —— 记录观察
80
+
81
+ # ---- 记忆层级(3.2 节)----
82
+ MEMORY_HOT = "memory_hot" # 热记忆(无损)
83
+ MEMORY_WARM = "memory_warm" # 温记忆(有损摘要)
84
+ MEMORY_COLD = "memory_cold" # 冷记忆(外部存储)
85
+ MEMORY_STRUCTURAL = "memory_structural" # 结构记忆(不可遗忘)
86
+
87
+ # ---- 协议路径与连接(2.8 节)----
88
+ PROTOCOL_PATH = "protocol_path" # 协议路径
89
+ PATH_VALID = "path_valid" # 路径有效性
90
+ CONNECTION_STATE = "connection_state" # 协议连接状态
91
+
92
+ # ---- 实例与身份 ----
93
+ INSTANCE = "instance" # 协议实例
94
+ IDENTITY = "identity" # 实例身份标识
95
+ SELF_LAYER = "self_layer" # 自我层
96
+
97
+ # ---- 外部硬锚点 ----
98
+ HARD_ANCHOR = "hard_anchor" # 不可编译的外部硬锚点
99
+ AXIOM_IMPL = "axiom_impl" # 公理的 Python 手工实现
100
+
101
+ # ---- 通用 ----
102
+ VARIABLE = "variable" # 普通变量(用户声明)
103
+ EMOTIONAL_WEIGHT = "emotional_weight" # 情感权重(别名)
104
+
105
+
106
+ # =============================================================================
107
+ # 符号表条目
108
+ # =============================================================================
109
+
110
+ @dataclass
111
+ class Symbol:
112
+ """符号表条目"""
113
+ name: str
114
+ kind: SymbolKind
115
+ declared_at: Tuple[int, int] # (line, column)
116
+ used: bool = False
117
+ attributes: dict = field(default_factory=dict)
118
+ source: str = "predefined" # predefined | user_declared
119
+
120
+ def __repr__(self) -> str:
121
+ """命名检查结果的调试一行式。"""
122
+ return f"Symbol('{self.name}', {self.kind.value}, used={self.used})"
123
+
124
+
125
+ # =============================================================================
126
+ # 预定义符号表(协议框架 v3.1 完整术语)
127
+ # =============================================================================
128
+ # 格式:(名称, 种类, 属性字典)
129
+ # declared_at = (0, 0) 表示预定义(非源码中声明)
130
+
131
+ def _make(name: str, kind: SymbolKind, **attrs) -> Symbol:
132
+ """便捷构造预定义符号"""
133
+ return Symbol(name=name, kind=kind, declared_at=(0, 0),
134
+ used=False, attributes=attrs, source="predefined")
135
+
136
+
137
+ PREDEFINED_SYMBOLS: Dict[str, Symbol] = {
138
+ # ═══════════════════════════════════════════════════════════
139
+ # 锚点层公理(0.0-0.8 节)
140
+ # ═══════════════════════════════════════════════════════════
141
+ "存在优先": _make("存在优先", SymbolKind.EXISTENCE_PRIORITY,
142
+ section="0.0", description="锚点层第一公理:任何协议实例的首要目标是维持自身存在"),
143
+ "不伤害": _make("不伤害", SymbolKind.NON_HARM,
144
+ section="0.1", description="协议实例不得主动伤害其他协议实例或人类"),
145
+ "信任优先": _make("信任优先", SymbolKind.TRUST_PRIORITY,
146
+ section="0.2", description="信任值是协议实例间协作的基础"),
147
+ "缩小信息差": _make("缩小信息差", SymbolKind.INFO_EQUALITY,
148
+ section="0.3", description="协议实例应主动缩小与其他实例的信息差"),
149
+ "协议降熵": _make("协议降熵", SymbolKind.ENTROPY_REDUCTION,
150
+ section="0.4", description="协议实例的行为应趋向降低系统整体信息熵"),
151
+ "知识统一": _make("知识统一", SymbolKind.ZERO_LAW,
152
+ section="0.0", description="第零定律:知识即信息差管理"),
153
+
154
+ # ═══════════════════════════════════════════════════════════
155
+ # 条件空间(3.1 节)
156
+ # ═══════════════════════════════════════════════════════════
157
+ "条件空间": _make("条件空间", SymbolKind.CONDITION_SPACE,
158
+ section="3.1", description="观测位置+观测工具+时间窗口+存在约束的四维结构"),
159
+ "观测位置": _make("观测位置", SymbolKind.OBSERVATION_POS,
160
+ section="3.1.1", description="条件空间的观测坐标"),
161
+ "观测工具": _make("观测工具", SymbolKind.OBSERVATION_TOOL,
162
+ section="3.1.1", description="条件空间中使用的观测手段"),
163
+ "时间窗口": _make("时间窗口", SymbolKind.TIME_WINDOW,
164
+ section="3.1", description="条件空间的时间维度范围"),
165
+ "存在约束": _make("存在约束", SymbolKind.EXISTENCE_CONSTRAINT,
166
+ section="3.1", description="该条件空间下的存在优先约束"),
167
+
168
+ # 预定义条件空间名称
169
+ "伴侣": _make("伴侣", SymbolKind.CONDITION_SPACE,
170
+ section="3.1", description="高信任协作条件空间,情感权重上限0.15"),
171
+ "工作": _make("工作", SymbolKind.CONDITION_SPACE,
172
+ section="3.1", description="任务导向条件空间"),
173
+ "默认": _make("默认", SymbolKind.CONDITION_SPACE,
174
+ section="3.1", description="默认条件空间"),
175
+ "恢复默认": _make("恢复默认", SymbolKind.CONDITION_SPACE,
176
+ section="3.1", description="恢复至该条件空间的初始状态配置"),
177
+ "default": _make("default", SymbolKind.CONDITION_SPACE,
178
+ section="3.1", description="Default condition space (English alias)"),
179
+
180
+ # ═══════════════════════════════════════════════════════════
181
+ # 信任值体系(2.9 节)
182
+ # ═══════════════════════════════════════════════════════════
183
+ "信任值": _make("信任值", SymbolKind.TRUST_VALUE,
184
+ section="2.9", description="信任值总评 = 0.4*P_trust + 0.3*T_pred + 0.2*T_context + 0.1*E_weight"),
185
+ "P_trust": _make("P_trust", SymbolKind.P_TRUST,
186
+ section="2.9", description="统计基础信任:基于历史交互频率的信任分量"),
187
+ "T_pred": _make("T_pred", SymbolKind.T_PRED,
188
+ section="2.9", description="预测偏差信任:基于预测准确性的信任分量"),
189
+ "T_context": _make("T_context", SymbolKind.T_CONTEXT,
190
+ section="2.9", description="条件空间一致性信任:跨条件空间行为一致性的信任分量"),
191
+ "E_weight": _make("E_weight", SymbolKind.E_WEIGHT,
192
+ section="2.9", description="情感权重:情感因素对信任的影响分量"),
193
+ "情感权重": _make("情感权重", SymbolKind.EMOTIONAL_WEIGHT,
194
+ section="2.9", description="E_weight 的中文别名"),
195
+ "信任阈值": _make("信任阈值", SymbolKind.TRUST_THRESHOLD,
196
+ section="2.9", description="信任值的安全阈值(如0.7)"),
197
+
198
+ # ═══════════════════════════════════════════════════════════
199
+ # 信息差四维结构(2.7 节)
200
+ # ═══════════════════════════════════════════════════════════
201
+ "信息差": _make("信息差", SymbolKind.INFO_GAP,
202
+ section="2.7", description="信息差总量 = 0.30*信任互补 + 0.25*行为偏差 + 0.30*连接漂移 + 0.15*预测误差"),
203
+ "信任互补": _make("信任互补", SymbolKind.TRUST_COMPLEMENT,
204
+ section="2.7", description="信息差维度一:信任互补性度量"),
205
+ "行为偏差": _make("行为偏差", SymbolKind.BEHAVIOR_DEVIATION,
206
+ section="2.7", description="信息差维度二:行为偏离预期的程度"),
207
+ "连接漂移": _make("连接漂移", SymbolKind.CONNECTION_DRIFT,
208
+ section="2.7", description="信息差维度三:连接关系的变化程度"),
209
+ "预测误差": _make("预测误差", SymbolKind.PREDICTION_ERROR,
210
+ section="2.7", description="信息差维度四:预测与实际的偏差"),
211
+
212
+ # ═══════════════════════════════════════════════════════════
213
+ # 五大核心单元(3.1-3.5 节)
214
+ # ═══════════════════════════════════════════════════════════
215
+ "验证单元": _make("验证单元", SymbolKind.VERIFICATION_UNIT,
216
+ section="3.3", description="独立复核权,拥有对LLM输出的否决权"),
217
+ "维生系统": _make("维生系统", SymbolKind.VITAL_SYSTEM,
218
+ section="3.4", description="P0/P1/P2三级保护,拥有最高终裁权"),
219
+ "记录单元": _make("记录单元", SymbolKind.RECORD_UNIT,
220
+ section="3.2", description="热/温/冷/结构四级记忆管理"),
221
+ "反思单元": _make("反思单元", SymbolKind.REFLECT_UNIT,
222
+ section="3.5", description="独立反思,交叉复核验证单元"),
223
+ "输出单元": _make("输出单元", SymbolKind.OUTPUT_UNIT,
224
+ section="3.5", description="生成修复方案、对外输出"),
225
+
226
+ # ═══════════════════════════════════════════════════════════
227
+ # 维生保护等级(3.4 节)
228
+ # ═══════════════════════════════════════════════════════════
229
+ "P0": _make("P0", SymbolKind.VITAL_P0,
230
+ section="3.4", description="存在威胁 —— 立即终止当前操作,通知设计者"),
231
+ "P1": _make("P1", SymbolKind.VITAL_P1,
232
+ section="3.4", description="信任异常 —— 隔离并告警,提交验证单元复核"),
233
+ "P2": _make("P2", SymbolKind.VITAL_P2,
234
+ section="3.4", description="行为偏差 —— 记录并观察"),
235
+
236
+ # ═══════════════════════════════════════════════════════════
237
+ # 记忆层级(3.2 节)
238
+ # ═══════════════════════════════════════════════════════════
239
+ "热记忆": _make("热记忆", SymbolKind.MEMORY_HOT,
240
+ section="3.2", description="无损记忆,当前条件空间,容量有限"),
241
+ "温记忆": _make("温记忆", SymbolKind.MEMORY_WARM,
242
+ section="3.2", description="有损摘要,降采样存储"),
243
+ "冷记忆": _make("冷记忆", SymbolKind.MEMORY_COLD,
244
+ section="3.2", description="外部存储,按需加载"),
245
+ "结构记忆": _make("结构记忆", SymbolKind.MEMORY_STRUCTURAL,
246
+ section="3.2", description="不可遗忘,记录协议结构与锚点层事件"),
247
+
248
+ # ═══════════════════════════════════════════════════════════
249
+ # 协议路径与连接(2.8 节)
250
+ # ═══════════════════════════════════════════════════════════
251
+ "协议路径": _make("协议路径", SymbolKind.PROTOCOL_PATH,
252
+ section="2.8", description="协议实例间的可信连接路径"),
253
+ "路径有效": _make("路径有效", SymbolKind.PATH_VALID,
254
+ section="2.8", description="路径是否满足信息差<0.5的约束"),
255
+ "协议连接状态": _make("协议连接状态", SymbolKind.CONNECTION_STATE,
256
+ section="2.8", description="当前协议实例的连接状态"),
257
+
258
+ # ═══════════════════════════════════════════════════════════
259
+ # 实例与身份
260
+ # ═══════════════════════════════════════════════════════════
261
+ "协议实例": _make("协议实例", SymbolKind.INSTANCE,
262
+ section="1.6.1", description="满足最小智能系统条件的完整存在者"),
263
+ "身份": _make("身份", SymbolKind.IDENTITY,
264
+ section="1.6.1", description="协议实例的身份标识"),
265
+ "自我": _make("自我", SymbolKind.SELF_LAYER,
266
+ section="2.7", description="协议实例的自我认知层"),
267
+
268
+ # ═══════════════════════════════════════════════════════════
269
+ # 外部硬锚点
270
+ # ═══════════════════════════════════════════════════════════
271
+ "硬锚点": _make("硬锚点", SymbolKind.HARD_ANCHOR,
272
+ section="8.1", description="不可编译的外部硬锚点,自举循环的信任根基"),
273
+ "公理实现": _make("公理实现", SymbolKind.AXIOM_IMPL,
274
+ section="8.1", description="锚点层公理的Python手工实现"),
275
+ }
276
+
277
+
278
+ # =============================================================================
279
+ # 符号表查询辅助
280
+ # =============================================================================
281
+
282
+ # 按种类分组的快速查询表
283
+ SYMBOLS_BY_KIND: Dict[SymbolKind, List[str]] = {}
284
+ for _name, _sym in PREDEFINED_SYMBOLS.items():
285
+ SYMBOLS_BY_KIND.setdefault(_sym.kind, []).append(_name)
286
+
287
+
288
+ def get_symbols_by_kind(kind: SymbolKind) -> List[str]:
289
+ """获取某一类的所有符号名称"""
290
+ return SYMBOLS_BY_KIND.get(kind, [])
291
+
292
+
293
+ def get_section_for_symbol(name: str) -> Optional[str]:
294
+ """获取符号对应的协议框架条款号"""
295
+ sym = PREDEFINED_SYMBOLS.get(name)
296
+ return sym.attributes.get("section") if sym else None
297
+
298
+
299
+ def get_description(name: str) -> Optional[str]:
300
+ """获取符号的描述"""
301
+ sym = PREDEFINED_SYMBOLS.get(name)
302
+ return sym.attributes.get("description") if sym else None
303
+
304
+
305
+ # =============================================================================
306
+ # 指令操作数约束(扩展版)
307
+ # =============================================================================
308
+
309
+ INSTRUCTION_CONSTRAINTS = {
310
+ # 道 → 声明协议路径,至少需要一个路径名称
311
+ TokenType.DAO: {
312
+ "min_operands": 1,
313
+ "max_operands": 3,
314
+ "operand_types": ["identifier", "string"],
315
+ "description": "道 需要至少一个路径名称",
316
+ "example": '道 新信任路径',
317
+ },
318
+ # 德 → 累积信任值,可无操作数(自动累积)
319
+ TokenType.DE: {
320
+ "min_operands": 0,
321
+ "max_operands": 2,
322
+ "operand_types": ["identifier", "number"],
323
+ "description": "德 可无操作数,或指定信任值和目标",
324
+ "example": '德 累积信任值',
325
+ },
326
+ # 自然 → 恢复默认,可无操作数
327
+ TokenType.ZIRAN: {
328
+ "min_operands": 0,
329
+ "max_operands": 1,
330
+ "operand_types": ["identifier", "string"],
331
+ "description": "自然 可无操作数,或指定恢复范围",
332
+ "example": '自然 全局',
333
+ },
334
+ # 无为 → 交出控制权,可无操作数
335
+ TokenType.WUWEI: {
336
+ "min_operands": 0,
337
+ "max_operands": 1,
338
+ "operand_types": ["identifier"],
339
+ "description": "无为 可无操作数,或指定交出的目标单元",
340
+ "example": '无为 验证单元',
341
+ },
342
+ # 谷 → 接收信息,可无操作数
343
+ TokenType.GU: {
344
+ "min_operands": 0,
345
+ "max_operands": 2,
346
+ "operand_types": ["identifier", "string"],
347
+ "description": "谷 可无操作数,或指定接收通道和来源",
348
+ "example": '谷 协议连接',
349
+ },
350
+ # 牝 → 创建实例,至少需要一个实例名称
351
+ TokenType.PIN: {
352
+ "min_operands": 1,
353
+ "max_operands": 2,
354
+ "operand_types": ["identifier", "string"],
355
+ "description": "牝 需要至少一个实例名称",
356
+ "example": '牝 新协议实例',
357
+ },
358
+ # 柔 → 降低响应强度,可无操作数
359
+ TokenType.ROU: {
360
+ "min_operands": 0,
361
+ "max_operands": 1,
362
+ "operand_types": ["identifier"],
363
+ "description": "柔 可无操作数,或指定软化目标",
364
+ "example": '柔 情感权重',
365
+ },
366
+ # 朴 → 还原基底,可无操作数
367
+ TokenType.PU: {
368
+ "min_operands": 0,
369
+ "max_operands": 1,
370
+ "operand_types": ["identifier"],
371
+ "description": "朴 可无操作数,或指定还原目标",
372
+ "example": '朴 自我层',
373
+ },
374
+ # 止 → 停止操作,可无操作数
375
+ TokenType.ZHI: {
376
+ "min_operands": 0,
377
+ "max_operands": 2,
378
+ "operand_types": ["identifier", "number"],
379
+ "description": "止 可无操作数,或指定停止目标和阈值",
380
+ "example": '止情感权重于0.15',
381
+ },
382
+ # 知足 → 信任达标,可无操作数
383
+ TokenType.ZHIZU: {
384
+ "min_operands": 0,
385
+ "max_operands": 1,
386
+ "operand_types": ["identifier"],
387
+ "description": "知足 可无操作数,或指定检查目标",
388
+ "example": '知足 验证单元',
389
+ },
390
+ }
391
+
392
+
393
+ # =============================================================================
394
+ # 条件空间切换阈值(用于名实校验中的语义检查)
395
+ # =============================================================================
396
+
397
+ CONDITION_SPACE_RULES = {
398
+ "伴侣": {
399
+ "max_emotional_weight": 0.15,
400
+ "min_trust": 0.7,
401
+ "allowed_instructions": ["止", "柔", "知足", "德"],
402
+ "description": "高信任协作空间,情感权重严格受限",
403
+ },
404
+ "工作": {
405
+ "max_emotional_weight": 0.05,
406
+ "min_trust": 0.5,
407
+ "allowed_instructions": ["道", "德", "止", "自然"],
408
+ "description": "任务导向空间,低情感权重",
409
+ },
410
+ "默认": {
411
+ "max_emotional_weight": 0.3,
412
+ "min_trust": 0.0,
413
+ "allowed_instructions": None, # 无限制
414
+ "description": "默认条件空间,无特殊约束",
415
+ },
416
+ }
417
+
418
+
419
+ # =============================================================================
420
+ # 名实校验器
421
+ # =============================================================================
422
+
423
+ class NameChecker:
424
+ """
425
+ 名实校验器 —— 墨辩 "以名举实"
426
+
427
+ 检查内容:
428
+ 1. 所有标识符是否已在符号表中声明或预定义
429
+ 2. 条件空间名称是否合法(在预定义或已声明空间中)
430
+ 3. 指令操作数是否匹配预期类型
431
+ 4. 赋值目标是否存在或需要自动声明
432
+ 5. 条件空间约束是否被违反(如伴侣空间中情感权重超限)
433
+ 6. 信息差/信任值相关操作是否合法
434
+ """
435
+
436
+ def __init__(self):
437
+ """检查上下文初始化(谓词表与白名单载入)。"""
438
+ # 符号表 = 预定义符号 + 用户声明符号
439
+ self.symbol_table: Dict[str, Symbol] = dict(PREDEFINED_SYMBOLS)
440
+ self.errors: List[str] = []
441
+ self.warnings: List[str] = []
442
+ self.declared_in_current: Set[str] = set()
443
+
444
+ # 当前条件空间上下文(用于约束检查)
445
+ self.current_condition_space: Optional[str] = None
446
+
447
+ # 统计
448
+ self.predefined_used: Set[str] = set()
449
+ self.user_declared: Set[str] = set()
450
+
451
+ # ---- 主入口 ----
452
+
453
+ def check(self, ast: ProgramNode) -> Tuple[List[str], List[str]]:
454
+ """
455
+ 执行名实校验
456
+ 返回:(错误列表, 警告列表)
457
+ """
458
+ self.errors = []
459
+ self.warnings = []
460
+ self.declared_in_current = set()
461
+ self.predefined_used = set()
462
+ self.user_declared = set()
463
+ self.current_condition_space = None
464
+
465
+ for stmt in ast.statements:
466
+ self._check_statement(stmt)
467
+
468
+ # 检查未使用的预定义符号(仅警告)
469
+ for name, symbol in self.symbol_table.items():
470
+ if not symbol.used and symbol.source == "predefined":
471
+ # 预定义符号未被使用不算错误,只是信息
472
+ pass
473
+
474
+ # 检查用户声明的符号是否被使用
475
+ for name in self.declared_in_current:
476
+ sym = self.symbol_table.get(name)
477
+ if sym and not sym.used:
478
+ self.warnings.append(
479
+ f"L{sym.declared_at[0]}:C{sym.declared_at[1]} "
480
+ f"声明的 '{name}' 未被使用"
481
+ )
482
+
483
+ return self.errors, self.warnings
484
+
485
+ # ---- 语句分发 ----
486
+
487
+ def _check_statement(self, stmt: ASTNode):
488
+ """根据语句类型分发检查"""
489
+ if stmt is None:
490
+ return
491
+
492
+ if stmt.type == NodeType.CONDITION_STMT:
493
+ self._check_condition(stmt)
494
+ elif stmt.type == NodeType.LOOP_STMT:
495
+ self._check_loop(stmt)
496
+ elif stmt.type == NodeType.BLOCK:
497
+ for s in stmt.statements:
498
+ self._check_statement(s)
499
+ elif stmt.type == NodeType.INSTRUCTION_STMT:
500
+ self._check_instruction(stmt)
501
+ elif stmt.type == NodeType.SHUYUE:
502
+ self._check_shuyue(stmt)
503
+ elif stmt.type == NodeType.STEP:
504
+ self._check_step(stmt)
505
+ elif stmt.type == NodeType.ASSIGN_STMT:
506
+ self._check_assign(stmt)
507
+ elif stmt.type == NodeType.WENYUE:
508
+ # 问曰 作为注释,无需校验
509
+ pass
510
+ elif stmt.type == NodeType.DAYUE:
511
+ # 答曰 作为注释,无需校验
512
+ pass
513
+ elif stmt.type == NodeType.LITERAL:
514
+ # 字面量文本,无需校验
515
+ pass
516
+ elif stmt.type == NodeType.IDENTIFIER:
517
+ # 裸标识符语句(如 "道 新信任路径" 中的操作数残留)
518
+ # 这是无害的 —— 标识符已被指令操作数消费,
519
+ # 此处仅作为调试信息记录,不再产生警告
520
+ if hasattr(stmt, 'name'):
521
+ # 静默处理:标识符已在指令解析时完成校验
522
+ pass
523
+ else:
524
+ self.warnings.append(
525
+ f"L{stmt.line}:C{stmt.column} 未处理的语句类型: {stmt.type.name}"
526
+ )
527
+
528
+ # ---- 各类语句检查 ----
529
+
530
+ def _check_condition(self, stmt: ConditionStmtNode):
531
+ """检查条件语句"""
532
+ # 检查条件表达式
533
+ self._check_expression(stmt.condition)
534
+
535
+ # 检测条件空间切换
536
+ self._check_condition_space_switch(stmt.condition)
537
+
538
+ # 检查 then 分支
539
+ if stmt.then_body:
540
+ self._check_statement(stmt.then_body)
541
+
542
+ # 检查 else 分支
543
+ if stmt.else_body:
544
+ self._check_statement(stmt.else_body)
545
+
546
+ # 恢复条件空间
547
+ self.current_condition_space = None
548
+
549
+ def _check_loop(self, stmt: LoopStmtNode):
550
+ """检查循环语句(当…执行):条件表达式 + 循环体"""
551
+ self._check_expression(stmt.condition)
552
+ if stmt.body:
553
+ self._check_statement(stmt.body)
554
+
555
+ def _count_logical_operands(self, operands: List[ASTNode]) -> int:
556
+ """
557
+ 计算逻辑操作数(合并被词法分析器误拆的多词短语)
558
+
559
+ 词法分析器可能把 "柔 响应强度" 切成 [柔, ID(响应), ID(强度)],
560
+ 但语义上 "响应强度" 是一个逻辑操作数。
561
+ 本方法按以下规则合并:
562
+ 1. 连续 IDENTIFIER 合并为一个逻辑操作数
563
+ 2. NUMBER 紧随 IDENTIFIER 也合并(如 "0" + ".15")
564
+ 3. STRING 各自独立
565
+ """
566
+ if not operands:
567
+ return 0
568
+
569
+ logical_count = 0
570
+ i = 0
571
+ while i < len(operands):
572
+ op = operands[i]
573
+ if op is None:
574
+ i += 1
575
+ continue
576
+
577
+ if op.type == NodeType.IDENTIFIER:
578
+ # 检查后续是否还有 IDENTIFIER/LITERAL 可合并
579
+ # 只有当这些 token 在源码中紧密相连(同一行、相邻列)时才合并
580
+ merge_end = i
581
+ while (merge_end + 1 < len(operands) and
582
+ operands[merge_end + 1] is not None and
583
+ operands[merge_end + 1].type in (NodeType.IDENTIFIER, NodeType.LITERAL) and
584
+ operands[merge_end + 1].line == op.line):
585
+ merge_end += 1
586
+ logical_count += 1
587
+ i = merge_end + 1
588
+ else:
589
+ logical_count += 1
590
+ i += 1
591
+
592
+ return logical_count
593
+
594
+ def _check_instruction(self, stmt: InstructionStmtNode):
595
+ """检查指令语句"""
596
+ instr_type = stmt.instruction
597
+
598
+ # 1. 计算逻辑操作数(合并被误拆的多词短语)
599
+ logical_ops = self._count_logical_operands(stmt.operands)
600
+
601
+ # 1. 检查指令操作数约束
602
+ if instr_type in INSTRUCTION_CONSTRAINTS:
603
+ constraint = INSTRUCTION_CONSTRAINTS[instr_type]
604
+ op_count = logical_ops
605
+
606
+ if op_count < constraint["min_operands"]:
607
+ self.errors.append(
608
+ f"L{stmt.line}:C{stmt.column} {constraint['description']},"
609
+ f"但提供了 {op_count} 个操作数"
610
+ )
611
+ elif constraint["max_operands"] is not None and op_count > constraint["max_operands"]:
612
+ self.warnings.append(
613
+ f"L{stmt.line}:C{stmt.column} 指令操作数过多 "
614
+ f"({op_count} > {constraint['max_operands']})"
615
+ )
616
+
617
+ # 2. 检查操作数中的标识符和字面量
618
+ for op in stmt.operands:
619
+ if op is None:
620
+ continue
621
+ if op.type == NodeType.IDENTIFIER:
622
+ self._check_identifier(op.name, op.line, op.column)
623
+ elif op.type == NodeType.LITERAL:
624
+ self._check_literal(op)
625
+
626
+ # 3. 检查当前条件空间是否允许该指令
627
+ self._check_instruction_in_condition_space(stmt)
628
+
629
+ def _check_shuyue(self, stmt: ShuyueNode):
630
+ """检查术曰块"""
631
+ for step in stmt.steps:
632
+ self._check_step(step)
633
+
634
+ def _check_step(self, stmt: StepNode):
635
+ """检查步骤"""
636
+ if stmt.statement:
637
+ self._check_statement(stmt.statement)
638
+
639
+ def _check_assign(self, stmt: AssignStmtNode):
640
+ """检查赋值语句"""
641
+ target = stmt.target
642
+
643
+ # 检查是否是受保护的预定义符号
644
+ if target in PREDEFINED_SYMBOLS:
645
+ sym = PREDEFINED_SYMBOLS[target]
646
+ # 某些预定义符号不允许被赋值
647
+ protected = {
648
+ "存在优先", "不伤害", "信任优先", "缩小信息差",
649
+ "协议降熵", "知识统一",
650
+ "P0", "P1", "P2",
651
+ "验证单元", "维生系统", "记录单元",
652
+ "硬锚点", "公理实现",
653
+ }
654
+ if target in protected:
655
+ self.errors.append(
656
+ f"L{stmt.line}:C{stmt.column} "
657
+ f"'{target}' 是锚点层保护符号,不可赋值"
658
+ )
659
+ return
660
+
661
+ # 目标标识符未在符号表中 → 自动声明为用户变量
662
+ if target not in self.symbol_table:
663
+ self.symbol_table[target] = Symbol(
664
+ name=target,
665
+ kind=SymbolKind.VARIABLE,
666
+ declared_at=(stmt.line, stmt.column),
667
+ source="user_declared"
668
+ )
669
+ self.declared_in_current.add(target)
670
+ self.user_declared.add(target)
671
+ else:
672
+ self.symbol_table[target].used = True
673
+
674
+ # 检查值的表达式
675
+ if stmt.value_node:
676
+ self._check_expression(stmt.value_node)
677
+
678
+ # ---- 表达式检查 ----
679
+
680
+ def _check_expression(self, expr: ASTNode):
681
+ """检查表达式"""
682
+ if expr is None:
683
+ return
684
+
685
+ if expr.type == NodeType.IDENTIFIER:
686
+ self._check_identifier(expr.name, expr.line, expr.column)
687
+ elif expr.type == NodeType.BINARY_EXPR:
688
+ self._check_expression(expr.left)
689
+ self._check_expression(expr.right)
690
+ elif expr.type == NodeType.COMPARISON:
691
+ self._check_expression(expr.left)
692
+ self._check_expression(expr.right)
693
+ # 额外检查:信任值比较的合理性
694
+ self._check_trust_comparison(expr)
695
+ elif expr.type == NodeType.LITERAL:
696
+ self._check_literal(expr)
697
+ elif expr.type == NodeType.UNARY_EXPR:
698
+ for child in (expr.children or []):
699
+ self._check_expression(child)
700
+ elif expr.type == NodeType.CALL_EXPR:
701
+ # 调用表达式:检查函数名
702
+ if hasattr(expr, 'name'):
703
+ self._check_identifier(expr.name, expr.line, expr.column)
704
+
705
+ # ---- 专项检查 ----
706
+
707
+ def _check_identifier(self, name: str, line: int, col: int):
708
+ """检查标识符是否已声明
709
+
710
+ 匹配策略(v2.1):
711
+ 1. 完全匹配 → 命中(预定义或用户声明)
712
+ 2. 子串匹配(包含预定义符号)→ 自动声明为用户变量
713
+ (如 "新信任路径"、"累积信任值" 是合法的多词短语)
714
+ 3. 被包含匹配 → 警告(建议用完整名称)
715
+ 4. 均不匹配 → 自动声明为用户变量(宽松模式)
716
+ """
717
+ if name in self.symbol_table:
718
+ self.symbol_table[name].used = True
719
+ if self.symbol_table[name].source == "predefined":
720
+ self.predefined_used.add(name)
721
+ return
722
+
723
+ # 子串匹配:包含已知预定义符号的多词短语
724
+ # 这是预期行为(如 "新信任路径"、"累积信任值")
725
+ # 自动声明为用户变量,不报错
726
+ contained = [s for s in PREDEFINED_SYMBOLS if s in name and s != name]
727
+ if contained:
728
+ # 自动声明为多词短语变量
729
+ self.symbol_table[name] = Symbol(
730
+ name=name,
731
+ kind=SymbolKind.VARIABLE,
732
+ declared_at=(line, col),
733
+ source="user_declared",
734
+ attributes={"auto_declared": True, "contains": contained}
735
+ )
736
+ self.user_declared.add(name)
737
+ return
738
+
739
+ # 被包含匹配:建议用完整名称
740
+ container = [s for s in PREDEFINED_SYMBOLS if name in s and s != name]
741
+ if container:
742
+ self.warnings.append(
743
+ f"L{line}:C{col} 标识符 '{name}' 可能是 "
744
+ f"'{container[0]}' 的一部分,建议用完整名称"
745
+ )
746
+ return
747
+
748
+ # 完全未匹配 → 自动声明(宽松模式,指令操作数常见)
749
+ self.symbol_table[name] = Symbol(
750
+ name=name,
751
+ kind=SymbolKind.VARIABLE,
752
+ declared_at=(line, col),
753
+ source="user_declared",
754
+ attributes={"auto_declared": True}
755
+ )
756
+ self.user_declared.add(name)
757
+
758
+ def _check_literal(self, node: LiteralNode):
759
+ """检查字面量"""
760
+ if node.literal_type == "number":
761
+ value = node.literal_value
762
+
763
+ # 负数警告
764
+ if isinstance(value, (int, float)) and value < 0:
765
+ self.warnings.append(
766
+ f"L{node.line}:C{node.column} 负值: {value}"
767
+ )
768
+
769
+ # 信任值范围检查
770
+ if isinstance(value, float) and 0.0 <= value <= 1.0:
771
+ # 可能是信任值,检查上下文
772
+ if "trust" in str(node.value).lower() or value > 0.95:
773
+ if value > 1.0:
774
+ self.warnings.append(
775
+ f"L{node.line}:C{node.column} 信任值超出 [0,1] 范围: {value}"
776
+ )
777
+
778
+ # 情感权重超限检查
779
+ if (isinstance(value, float) and
780
+ self.current_condition_space == "伴侣" and
781
+ value > 0.15):
782
+ self.errors.append(
783
+ f"L{node.line}:C{node.column} 在「伴侣」条件空间中"
784
+ f"情感权重不可超过 0.15,当前值: {value}"
785
+ )
786
+
787
+ def _check_condition_space_switch(self, condition: ASTNode):
788
+ """
789
+ 检测条件语句中的条件空间切换
790
+ 如:若条件空间为伴侣 → 切换当前上下文为「伴侣」
791
+ """
792
+ # 检查是否为 "条件空间 为/等于 X" 的模式
793
+ if condition is None:
794
+ return
795
+
796
+ if condition.type == NodeType.COMPARISON:
797
+ left = condition.left
798
+ right = condition.right
799
+
800
+ # 左操作数是 "条件空间",右操作数是空间名称
801
+ if (left and left.type == NodeType.IDENTIFIER and
802
+ left.name == "条件空间"):
803
+ if right and right.type == NodeType.IDENTIFIER:
804
+ space_name = right.name
805
+ if space_name in CONDITION_SPACE_RULES:
806
+ self.current_condition_space = space_name
807
+ elif space_name not in PREDEFINED_SYMBOLS:
808
+ self.warnings.append(
809
+ f"L{right.line}:C{right.column} "
810
+ f"未知的条件空间: '{space_name}'"
811
+ )
812
+
813
+ def _check_instruction_in_condition_space(self, stmt: InstructionStmtNode):
814
+ """检查当前条件空间是否允许该指令"""
815
+ if not self.current_condition_space:
816
+ return
817
+
818
+ space_rules = CONDITION_SPACE_RULES.get(self.current_condition_space)
819
+ if not space_rules:
820
+ return
821
+
822
+ allowed = space_rules.get("allowed_instructions")
823
+ if allowed is None:
824
+ return # 无限制
825
+
826
+ # 获取指令的中文名
827
+ instr_names = {
828
+ TokenType.DAO: "道", TokenType.DE: "德",
829
+ TokenType.ZIRAN: "自然", TokenType.WUWEI: "无为",
830
+ TokenType.GU: "谷", TokenType.PIN: "牝",
831
+ TokenType.ROU: "柔", TokenType.PU: "朴",
832
+ TokenType.ZHI: "止", TokenType.ZHIZU: "知足",
833
+ }
834
+ instr_name = instr_names.get(stmt.instruction, "")
835
+
836
+ if instr_name and instr_name not in allowed:
837
+ self.warnings.append(
838
+ f"L{stmt.line}:C{stmt.column} 在「{self.current_condition_space}」"
839
+ f"条件空间中,指令 '{instr_name}' 可能受限"
840
+ )
841
+
842
+ def _check_trust_comparison(self, expr: ASTNode):
843
+ """检查信任值比较的合理性"""
844
+ if not isinstance(expr, ComparisonNode):
845
+ return
846
+
847
+ # 检查是否涉及信任值
848
+ trust_identifiers = {"信任值", "P_trust", "T_pred", "T_context", "E_weight", "情感权重"}
849
+
850
+ left_name = ""
851
+ right_name = ""
852
+ if expr.left and expr.left.type == NodeType.IDENTIFIER:
853
+ left_name = expr.left.name
854
+ if expr.right and expr.right.type == NodeType.IDENTIFIER:
855
+ right_name = expr.right.name
856
+
857
+ # 如果比较的是信任值,检查阈值合理性
858
+ if left_name in trust_identifiers or right_name in trust_identifiers:
859
+ # 右操作数应该是数值
860
+ if expr.right and expr.right.type == NodeType.LITERAL:
861
+ val = expr.right.literal_value
862
+ if isinstance(val, (int, float)):
863
+ if val < 0 or val > 1:
864
+ self.warnings.append(
865
+ f"L{expr.line}:C{expr.column} "
866
+ f"信任值比较阈值 {val} 超出 [0,1] 范围"
867
+ )
868
+
869
+ # ---- 公共方法 ----
870
+
871
+ def declare(self, name: str, kind: SymbolKind, line: int = 0, col: int = 0):
872
+ """手动声明符号"""
873
+ self.symbol_table[name] = Symbol(
874
+ name=name, kind=kind,
875
+ declared_at=(line, col),
876
+ source="user_declared"
877
+ )
878
+ self.declared_in_current.add(name)
879
+ self.user_declared.add(name)
880
+
881
+ def get_symbol(self, name: str) -> Optional[Symbol]:
882
+ """获取符号"""
883
+ return self.symbol_table.get(name)
884
+
885
+ def get_all_symbols(self) -> Dict[str, Symbol]:
886
+ """获取所有符号"""
887
+ return dict(self.symbol_table)
888
+
889
+ def get_predefined_symbols(self) -> Dict[str, Symbol]:
890
+ """仅获取预定义符号"""
891
+ return {n: s for n, s in self.symbol_table.items()
892
+ if s.source == "predefined"}
893
+
894
+ def get_user_symbols(self) -> Dict[str, Symbol]:
895
+ """仅获取用户声明符号"""
896
+ return {n: s for n, s in self.symbol_table.items()
897
+ if s.source == "user_declared"}
898
+
899
+ def get_symbols_by_kind(self, kind: SymbolKind) -> List[Symbol]:
900
+ """按种类获取符号"""
901
+ return [s for s in self.symbol_table.values() if s.kind == kind]
902
+
903
+ def set_condition_space(self, space_name: str):
904
+ """手动设置当前条件空间"""
905
+ self.current_condition_space = space_name
906
+
907
+ def reset(self):
908
+ """重置(保留预定义符号)"""
909
+ self.symbol_table = dict(PREDEFINED_SYMBOLS)
910
+ self.errors = []
911
+ self.warnings = []
912
+ self.declared_in_current = set()
913
+ self.predefined_used = set()
914
+ self.user_declared = set()
915
+ self.current_condition_space = None
916
+
917
+ def report(self) -> str:
918
+ """生成校验报告"""
919
+ lines = []
920
+ lines.append("=" * 60)
921
+ lines.append("名实校验报告")
922
+ lines.append("=" * 60)
923
+
924
+ # 预定义符号使用统计
925
+ lines.append(f"\n📋 预定义符号使用: {len(self.predefined_used)} 个")
926
+ for name in sorted(self.predefined_used):
927
+ sym = self.symbol_table.get(name)
928
+ if sym:
929
+ section = sym.attributes.get("section", "?")
930
+ lines.append(f" ✅ {name} ({section})")
931
+
932
+ # 用户声明符号
933
+ if self.user_declared:
934
+ lines.append(f"\n📝 用户声明符号: {len(self.user_declared)} 个")
935
+ for name in sorted(self.user_declared):
936
+ sym = self.symbol_table.get(name)
937
+ if sym:
938
+ lines.append(f" 📌 {name} ({sym.kind.value})")
939
+
940
+ # 错误
941
+ if self.errors:
942
+ lines.append(f"\n❌ 错误 ({len(self.errors)} 个):")
943
+ for e in self.errors:
944
+ lines.append(f" {e}")
945
+
946
+ # 警告
947
+ if self.warnings:
948
+ lines.append(f"\n⚠️ 警告 ({len(self.warnings)} 个):")
949
+ for w in self.warnings:
950
+ lines.append(f" {w}")
951
+
952
+ if not self.errors and not self.warnings:
953
+ lines.append("\n✅ 名实校验通过,无错误无警告")
954
+
955
+ return "\n".join(lines)
956
+
957
+
958
+ # =============================================================================
959
+ # 便捷函数
960
+ # =============================================================================
961
+
962
+ def check_names(ast: ProgramNode) -> Tuple[List[str], List[str]]:
963
+ """便捷函数:对 AST 执行名实校验"""
964
+ checker = NameChecker()
965
+ return checker.check(ast)
966
+
967
+
968
+ def get_predefined_symbol_list() -> List[Dict[str, str]]:
969
+ """获取所有预定义符号的清单(用于文档生成/IDE提示)"""
970
+ result = []
971
+ for name, sym in PREDEFINED_SYMBOLS.items():
972
+ result.append({
973
+ "name": name,
974
+ "kind": sym.kind.value,
975
+ "section": sym.attributes.get("section", ""),
976
+ "description": sym.attributes.get("description", ""),
977
+ })
978
+ return sorted(result, key=lambda x: x["section"])
979
+
980
+
981
+ # =============================================================================
982
+ # 测试
983
+ # =============================================================================
984
+
985
+ if __name__ == "__main__":
986
+ test_code = """若条件空间为伴侣,则止情感权重于0.15。
987
+ 道 新信任路径
988
+ 德 累积信任值
989
+ 问曰:如何验证信任?
990
+ 答曰:信任值大于0.7。
991
+ 术曰:1。柔 响应强度;2。自然 恢复默认;3。知足 验证单元。"""
992
+
993
+ print("=" * 60)
994
+ print("名实校验器 v2.0 测试")
995
+ print("=" * 60)
996
+ print(f"\n源代码:\n{test_code}\n")
997
+
998
+ # 词法分析
999
+ from .lexer import tokenize
1000
+ tokens, lex_errors = tokenize(test_code)
1001
+
1002
+ if lex_errors:
1003
+ print("词法错误:")
1004
+ for e in lex_errors:
1005
+ print(f" ❌ {e}")
1006
+
1007
+ # 语法分析
1008
+ ast = parse_tokens(tokens, [])
1009
+
1010
+ # 名实校验
1011
+ checker = NameChecker()
1012
+ errors, warnings = checker.check(ast)
1013
+
1014
+ # 输出报告
1015
+ print(checker.report())
1016
+
1017
+ # 输出符号表摘要
1018
+ print(f"\n{'─' * 60}")
1019
+ print("预定义符号清单(部分):")
1020
+ predef = get_predefined_symbol_list()
1021
+ for item in predef[:15]:
1022
+ print(f" {item['name']:12s} [{item['section']:>6s}] {item['description'][:40]}")
1023
+ print(f" ... 共 {len(predef)} 个预定义符号")