@furongjun1999/dsh-memory 0.5.0 → 0.6.0

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 (156) hide show
  1. package/README.md +572 -465
  2. package/docs/README.md +1 -0
  3. package/docs/eval/DSH/346/227/245/345/277/227/347/264/242/345/274/225v2_/345/217/202/350/200/203dsh-TUI_v1.0.md +248 -0
  4. package/docs/eval/DSH/346/227/245/345/277/227/347/264/242/345/274/225/346/225/210/346/236/234/351/252/214/350/257/201_v1.0.md +209 -0
  5. package/docs/eval/DSH/347/253/257/347/274/272/351/231/267/344/270/223/351/241/271_v1.0.md +254 -0
  6. package/docs/eval/P1b2_/350/257/273/351/235/242/344/273/243/351/231/205/344/277/256/345/244/215_v1.0.md +124 -0
  7. package/docs/eval/bench_lingshu_self/bench_self.py +140 -0
  8. package/docs/eval/bench_lingshu_self/self_bench_result.json +404 -0
  9. 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
  10. 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
  11. package/docs/eval//345/217/221/345/270/20306_/344/270/200/351/224/256/351/205/215/347/275/256/344/270/216DSH0172_v1.0.md +171 -0
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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
  17. 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
  18. 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
  19. 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
  20. 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
  21. 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
  22. 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
  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_v17.md +199 -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_v18.md +183 -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_v19.md +207 -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_v2.md +156 -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_v3.md +152 -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_v4.md +128 -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_v5.md +114 -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_v6.md +192 -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_v7.md +187 -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_v8.md +207 -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_v9.md +203 -0
  34. 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
  35. 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 +19 -3
  36. package/docs/images/lingshu-moonlight-covenant-poster-preview.jpg +0 -0
  37. package/docs/images/lingshu-moonlight-covenant-poster.png +0 -0
  38. 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
  39. 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
  40. 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
  41. package/dsh/cordis-patch-profile-web.example.yml +35 -0
  42. package/lib/bridge.d.ts +9 -0
  43. package/lib/bridge.js +35 -0
  44. package/lib/cli.d.ts +3 -0
  45. package/lib/cli.js +66 -0
  46. package/lib/index.js +7 -1
  47. package/lib/init.d.ts +88 -0
  48. package/lib/init.js +287 -0
  49. package/lib/lib/roleplay_web.js +530 -443
  50. package/lib/lib/token_store.d.ts +7 -1
  51. package/lib/lib/token_store.js +12 -3
  52. package/md_cg/audit.py +12 -1
  53. package/md_cg/backfill.py +16 -15
  54. package/md_cg/backfill_bucket_zh.py +35 -0
  55. package/md_cg/bench_e2e_judge.py +532 -0
  56. package/md_cg/bench_e2e_locomo_qa.py +368 -0
  57. package/md_cg/bench_e2e_qa.py +256 -0
  58. package/md_cg/branches.py +18 -2
  59. package/md_cg/ccgc.py +3 -2
  60. package/md_cg/chain.py +19 -4
  61. package/md_cg/consolidate.py +7 -6
  62. package/md_cg/crosscheck.py +4 -3
  63. package/md_cg/crypto.py +439 -437
  64. package/md_cg/datapath.py +395 -335
  65. package/md_cg/evidence.py +8 -3
  66. package/md_cg/export.py +3 -1
  67. package/md_cg/forgetting.py +2 -2
  68. package/md_cg/fsutil.py +48 -0
  69. package/md_cg/hotcache.py +255 -238
  70. package/md_cg/interop.py +161 -22
  71. package/md_cg/judgment_manifest.py +177 -0
  72. package/md_cg/links.py +655 -622
  73. package/md_cg/mcp_server.py +282 -31
  74. package/md_cg/mdcg.py +702 -126
  75. package/md_cg/mdcos.py +454 -68
  76. package/md_cg/mreview/govern.py +5 -4
  77. package/md_cg/postings.py +4 -2
  78. package/md_cg/readcache.py +76 -18
  79. package/md_cg/reconcile.py +228 -0
  80. package/md_cg/review_cli.py +215 -0
  81. package/md_cg/routing.py +28 -0
  82. package/md_cg/run_tests.py +211 -0
  83. package/md_cg/scrub.py +862 -852
  84. package/md_cg/security.py +385 -275
  85. package/md_cg/selfreport.py +3 -2
  86. package/md_cg/signer.py +565 -562
  87. package/md_cg/sources.py +3 -2
  88. package/md_cg/stg.py +6 -0
  89. package/md_cg/sustain.py +1168 -1138
  90. package/md_cg/test_access_hints.py +147 -0
  91. package/md_cg/test_branch_discard_tombstone.py +136 -0
  92. package/md_cg/test_branches.py +259 -249
  93. package/md_cg/test_chain_read_isolate.py +168 -0
  94. package/md_cg/test_datapath_device_name.py +203 -0
  95. package/md_cg/test_emit_negtail_cache.py +156 -0
  96. package/md_cg/test_en_pipeline.py +186 -166
  97. package/md_cg/test_govern_directread.py +421 -0
  98. package/md_cg/test_i32_hotcache_env_key.py +218 -0
  99. package/md_cg/test_identity_attribution.py +228 -147
  100. package/md_cg/test_index_crossprocess_reload.py +301 -0
  101. package/md_cg/test_index_durability.py +238 -224
  102. package/md_cg/test_interop.py +4 -2
  103. package/md_cg/test_interop_judgment.py +228 -0
  104. package/md_cg/test_issue39_utf8_stdio.py +273 -0
  105. package/md_cg/test_links_concurrent_write.py +188 -0
  106. package/md_cg/test_merge_upsert.py +168 -0
  107. package/md_cg/test_n123_derive_expiry_chain.py +205 -0
  108. package/md_cg/test_n130_verify_falsified_protect.py +185 -0
  109. package/md_cg/test_n131_merge_gate.py +205 -0
  110. package/md_cg/test_none_id_write_guard.py +165 -0
  111. package/md_cg/test_p1x_ref_root.py +160 -0
  112. package/md_cg/test_p27_docindex.py +774 -765
  113. package/md_cg/test_p2_mcp.py +3 -0
  114. package/md_cg/test_p32_backfill.py +304 -298
  115. package/md_cg/test_p39_verify_flow.py +90 -50
  116. package/md_cg/test_p47_session_view.py +60 -25
  117. package/md_cg/test_propose_tail_index.py +157 -0
  118. package/md_cg/test_read_scope_b27.py +277 -0
  119. package/md_cg/test_readcache_default_on.py +168 -0
  120. package/md_cg/test_readcache_precise_inval.py +270 -0
  121. package/md_cg/test_readcache_prodpath.py +55 -7
  122. package/md_cg/test_reconcile_v0.py +294 -0
  123. package/md_cg/test_retr_s1.py +6 -2
  124. package/md_cg/test_retr_s1b.py +67 -0
  125. package/md_cg/test_retr_s7.py +8 -0
  126. package/md_cg/test_retr_s9_entity_ctx.py +181 -175
  127. package/md_cg/test_retr_score_once.py +208 -0
  128. package/md_cg/test_review_cli_attribution.py +177 -0
  129. package/md_cg/test_review_cli_visibility.py +235 -0
  130. package/md_cg/test_review_onepass.py +170 -0
  131. package/md_cg/test_rrf_graph_seed_cache.py +154 -0
  132. package/md_cg/test_security_audit.py +155 -0
  133. package/md_cg/test_security_audit_b26.py +161 -0
  134. package/md_cg/test_security_audit_v21.py +250 -0
  135. package/md_cg/test_semantic_canonical.py +255 -241
  136. package/md_cg/test_session_isolation.py +168 -0
  137. package/md_cg/test_snapshot_autoclose.py +187 -0
  138. package/md_cg/test_tail_watermark_race.py +208 -0
  139. package/md_cg/test_tenant_env_override_warn.py +139 -0
  140. package/md_cg/test_tenant_registry_corrupt_warn.py +151 -0
  141. package/md_cg/test_v14_fixes.py +415 -397
  142. package/md_cg/test_verify_dirty_reconcile.py +157 -0
  143. package/md_cg/theory.py +276 -273
  144. package/md_cg/tokens.py +734 -677
  145. package/md_cg/units.py +3 -2
  146. package/md_cg/vision_evidence.py +4 -3
  147. package/md_cg/whitebox_kb/wisdom/code_solidified.json +6195 -6195
  148. package/md_cg/whitebox_kb/wisdom/multilang_ir.py +128 -124
  149. package/md_cg/writepipe.py +554 -550
  150. package/package.json +11 -2
  151. package/src/bridge.ts +434 -401
  152. package/src/cli.ts +65 -0
  153. package/src/index.ts +526 -518
  154. package/src/init.ts +347 -0
  155. package/src/lib/roleplay_web.ts +1019 -932
  156. package/src/lib/token_store.ts +202 -192
@@ -0,0 +1,343 @@
1
+ # 不可靠性理论 v0.1
2
+
3
+ > **合流指针(2026-09-26)**:本理论的系统层推导已由《不可靠定理与失效优先框架(Fail-First Theorems)》v0.3 接续合流(`docs/theory/不可靠定理与失效优先框架_v0.3.md`)——「不可靠为常态」立场在该稿升格为由智能论推导的定理体系(T0–T14),其矩阵经工程核验并设「自 v0.1 承接的待建设面」回指本稿第五章。两稿分工并行有效:**系统层推导与矩阵看 v0.3;九源分类学、防线原语 P1–P12、91 修理论化表与第五章设计约束仍以本稿为唯一真源。**
4
+
5
+ > **定位**:以「任何组件都不可靠」为第一性假设,统一灵枢已有的工程实践,并约束一切后续建设。
6
+ > 使用者原话(本稿立项依据):"理论先行,必须从根源上解决不可靠带来的错误。无论是从硬件还是软件,是线程还是并发,是自己还是用户,是 llm 还是人类。"
7
+ > **性质**:理论构建定稿(吸收评审修订后的版本,修订摘要见附:本稿自检清单)——本稿不修改任何产品代码,只做公理化、分类学、原语化与映射。
8
+ > **落位说明**:本稿落在 `docs/` 根——编排侧核验指定此路径;按 docs/README.md 归域规则第 3 条「横切全局件 → 留顶层」,本稿横切五工程域(md_cg/swarm/hive/compiler/rust),留根合规。此前同内容两份草稿(本路径 `不可靠性理论_v0.1_草稿.md` 修订版与 `docs/theory/` 同名初稿)已随本定稿处置删除,本份为唯一真源。
9
+
10
+ ## 材料与证据口径(先声明,再立论)
11
+
12
+ - **失效案例材料**:仓内一手缺陷调研台账《缺陷挖掘 · 自主迭代》v1–v17(`docs/eval/缺陷挖掘_自主迭代_v1.md` 至 `_v17.md`;v17 报告编号口径 N141–N147,v16 口径 N130–N140)。本文所有 N 编号均出自该系列,引证格式为「报告:行」。
13
+ - **"91 修 + 留档池"**:此数字为本次四路调研提问给出的口径。仓内可核的相邻口径:v8–v17 每轮 5 补丁(v17.md:4、v16.md:4),缺陷编号累计用至 N147(v17.md:5),v17 遗留开口 13(v17.md:4)、v16 遗留开口 15(v16.md:4)。**本稿未逐条重数 91**,按源抽样引证(第四章)。
14
+ - **诚实声明**:四路调研报告本体未随本任务传入、仓内亦无独立报告文件,且本会话工作流运行史不可读(工具返回 `workflow_introspection_unavailable`)。本稿全部论断改以仓内一手材料(缺陷台账、源码、理论文档)为据并逐条引证;凡仅出自提问口径的数字(如 91、0.5.1 承诺)均如实标注「提问口径」。
15
+ - **行号口径**:引用行号为起草会话读核时点快照(读核方式:grep/Read 直查现行文件);缺陷台账中的行号为上游会话时点快照,以台账自身双标规则为准(v17.md:7)。
16
+
17
+ ---
18
+
19
+ ## 零、定位与适用范围
20
+
21
+ ### 0.1 定位
22
+
23
+ 本理论回答一个问题:**当一个系统由不可靠的组件构成时,如何让整体仍然可托付?** 它不是可靠性工程(那假设组件大体可靠、失效是例外);它把次序反过来——**不可靠是常态而非例外**,可靠性是系统施加于不可靠组件之上的协议性质,不是组件的固有属性。
24
+
25
+ 这一立场在仓内已有理论前驱:《智能论3.4》元公理2(熵变公理,`docs/theory/智能论3.4.md:637`)断言系统天然趋向信息差扩大,协议降熵定理(同文件 :751)断言维持存在必须靠结构缩小信息差;蜂巢理论对齐稿据此裁定「fail-closed 是理论立场不是工程偏好」(`docs/hive/蜂巢设计_理论对齐_v0.1.md:60`,锚点 A20)。本稿把同一立场从「协作协议」推广到「一切组件假设」。
26
+
27
+ ### 0.2 九类不可靠源(适用范围)
28
+
29
+ | # | 源 | 一句话定义 | 仓内实证锚点(详见第二章) |
30
+ |---|---|---|---|
31
+ | S1 | 硬件 / OS | 磁盘、句柄、路径、编码等底座行为不合预期 | 写对撞 PermissionError(`hive/exec.py:103`);保留设备名(`md_cg/mcp_server.py:3616`) |
32
+ | S2 | 软件(含自身代码) | 任何代码——包括灵枢自己的——默认带缺陷 | 验证器空跑全绿 N9(`hive/verify_runner.py:161-166`) |
33
+ | S3 | 线程 / 并发 | 多执行流对共享面的交错不可假设 | sustain 线程丢更新 N138(v16.md:90);双写者撕裂 N142(v17.md:84) |
34
+ | S4 | 自身 | 自我改进系统改自身时不得自证(自指风险) | verify falsified 硬删保护闸 N130(v16.md:5);双实例互验(`docs/hive/蜂巢双实例互验_设计定稿.md`) |
35
+ | S5 | 用户(调用方) | 客户端与子代理的指令可携带攻击或误用 | worker 一句话外发凭据 N141(v17.md:83) |
36
+ | S6 | LLM | 模型输出不可作为事实依据,只能作为候选 | done≠verified(蜂巢对齐 D-1,`docs/hive/蜂巢设计_理论对齐_v0.1.md:73`) |
37
+ | S7 | 人类(操作者/维护者) | 人的配置、观察、裁决都会错 | 空串误配静默上岗 N91(v17.md:102);聚合观测靠人肉(蜂巢对齐 A16,:56) |
38
+ | S8 | 平台默认值 | 框架/语言/OS 的缺省行为与文档承诺不可直接信任 | WAL 缺省密钥 N143(`swarm/rust_swarm.py:24`);GBK 代码页(批次50 提交 bb9238d) |
39
+ | S9 | 时间 / 时钟 | 读出时间的那个钟本身不可靠——壁钟可跳变、倒流、停滞 | 承重面锚点(无失效台账,预防性建模,详见 2.9):TTL 壁钟判定(`md_cg/tokens.py:371`、派生 min 夹紧 `:458`);心跳新鲜窗壁钟差值(`hive/serve_start.py:51/:189`) |
40
+
41
+ ### 0.3 适用与不适用
42
+
43
+ - **适用**:灵枢全仓五件套(md_cg / swarm / hive / compiler / rust,见 WORKSPACE_INDEX.md:14-18)及一切后续新建面(第五章约束即据此生效)。
44
+ - **不适用边界**:本理论不承诺消除不可靠(那是非法目标),只承诺**失效可检、可查、可裁、可恢复**;对「跨机部署」保持盲区声明(蜂巢对齐 A17,`docs/hive/蜂巢设计_理论对齐_v0.1.md:57`——跨机通信延迟使信息差在间隙扩大,未列路线即不得默默扩张)。
45
+
46
+ ### 0.4 与工作纪律的关系
47
+
48
+ 工作纪律本体(`docs/工作纪律_认知图条目_v1.1.json`,唯一手写真源,WORKSPACE_INDEX.md:51)在本理论中的位置是:**对 S5/S6/S7(用户/LLM/人类)三源施加的原语组合**。纪律条目以渲染管线分发到各端注入件、由 `scripts/verify_discipline.py` 守漂移(WORKSPACE_INDEX.md:26)——这正是 P4(判据冻结:渲染产物与真源逐字校验,漂移即亮红)与 P9(可观测性:守卫漂移可见)作用于「操作者行为面」的实例。换言之,纪律是协议,本理论解释协议为何必须存在:因为操作者同样是不可靠组件。
49
+
50
+ ---
51
+
52
+ ## 一、公理(不可靠假设集)
53
+
54
+ 以下七条公理构成假设集。**凡不含「系统可能不正常」假设的设计约束皆非法**——即:任何只陈述「正常路径如何走」而不回答「此处说谎/半途死/误配/被注入/变慢时怎么办」的规格,一律退回。
55
+
56
+ - **公理 1(常态公理)**:任何组件在任何时刻都可能不正常。不存在「已验证所以此后可靠」的组件;验证结论本身带时效(理论对应:stable 租约带 TTL,`docs/theory/智能论3.4.md` 3.2.2,蜂巢对齐 A4 :44;工程对应:令牌 TTL 夹紧 N123,`md_cg/tokens.py:458`)。
57
+ - **公理 2(说谎公理)**:任何组件可能返回与事实不符的成功陈述。实证:验证器在套件 rc=0 且零计数时判全绿、以 pass 写 verdict——「未验证不写入」被空跑绕过(N9,v17.md:58;修复门 `hive/verify_runner.py:165-166` 补 `passed > 0`);LLM 执行器自报成功 ≠ 验证通过(蜂巢对齐 D-1「done ≠ verified」:73)。**本公理同样适用于持久化面的写入者**:能写 result.json 的组件就能直写一份满足判据的假产物——`passed > 0` 门约束的是验证器的执行(套件真跑过),不约束盘面上已有产物的真伪;恢复判据 classify_result 读的也只是盘面字段(`hive/src/scheduler.rs:235-240`),直写盘面即可满足。故**盘面产物与审计留痕本身是说谎者候选**:审计面现仅防静默丢失(N126 吞错),对毒化/伪造零防线;对应该防线的完整性锚见 P11。
58
+ - **公理 3(半程死亡公理)**:任何组件可能在任意两步之间死掉,且死前可能留下半成品。实证:serve stop 只杀单进程致执行器树成孤儿、持凭据继续外呼(N92,v17.md:95);半截 spec 覆写致任务契约永久毁(N88,v17.md:67)。
59
+ - **公理 4(误配公理)**:任何配置——环境变量、config 文件、env 键——可能缺失、为空、双源分叉或被静默覆盖。实证:jobs 池双源分叉致任务永久 pending 且观测面全绿(N89,v17.md:49);空串键静默覆盖宿主 env(N91,v17.md:102)。
60
+ - **公理 5(注入公理)**:任何输入通道可能携带越权指令或敏感数据外发路径。实证:编排子任务可读取并外发部署凭据(N141,v17.md:83);context_files 通道无 scope/PII 防线,全文进 prompt 发往外部网关(v8 N69,v17.md:100)。
61
+ - **公理 6(缓慢公理)**:任何组件可能在任意长的时间窗内无响应,且「无响应」与「已死」不可区分。实证:超时强杀分支不看产物、落 status=timeout + result.ok=true 矛盾终态(N146,v17.md:88);心跳判活与 1s 检测粒度是工程妥协(蜂巢对齐 :165「诚实边界」)。
62
+ - **公理 7(时钟公理)**:读出时间的那个钟本身不可靠——系统判租约、判新鲜、排次序所依赖的「时间」是某个组件读出来的数,该数可能跳变(NTP 校正、虚拟机挂起恢复)、倒流或停滞,且「钟错了」与「时间真的到了」在判据面上不可区分。诚实声明:本公理无台账失效案例,属预防性建模(公理 1 对「读时间的组件」的直推,承重面引证如下;失效形态展开见 2.9)。承重面实证:令牌过期判定以壁钟 time.time() 落 expires_at(`md_cg/tokens.py:371`,派生 TTL min 夹紧 `:458`);心跳新鲜窗按壁钟差值判死(`hive/serve_start.py:189`,窗宽与刷新粒度 `:51`);stable 结论租约(`docs/theory/智能论3.4.md` 3.2.2)。失效方向:壁钟前跳→租约提前失效/活者被判死;壁钟后跳→失效永不到来/死者被判活。
63
+
64
+ **由公理组直接推出的三条推论**(在仓内均有裁决先例):
65
+
66
+ 1. **完成 ≠ 被验证**;不可验证的共识等同于无共识(《智能论3.4》元公理3 共识不变公理 :648;蜂巢对齐 A2 :42、D-1 :73)。
67
+ 2. **恢复与终态判据必须锚在盘面产物上,不锚在状态字段或进程存活上**(蜂巢对齐 D-2「产物说了算」:76-80;`hive/src/scheduler.rs:11-12`「崩溃恢复:产物说了算——单一实现 classify_result」)。锚盘面有一个完整性前提:**产物必须过完整性锚(P11)**——伪造的产物比丢失的产物更危险,丢失使判据自然不满足,伪造则以完整一致态的形貌主动通过判据(公理 2 扩展句)。
68
+ 3. **验证者必须与被验证者结构隔离**——自我改进系统若不能同时保住验证资格,其自我改进在结构上不成立(`docs/hive/蜂巢双实例互验_设计定稿.md` §1.1;《智能论3.4》3.3 验证单元权力制衡 :176)。
69
+
70
+ ### 1.1 公理的使用规则(设计评审清单)
71
+
72
+ 对任何新设计/新写面,依次过七问,任一问无答案即退回:
73
+
74
+ 1. 此处组件**说谎**(返回假成功)时,谁先发现?(无发现者 = 违反公理 2,须补 P1/P4)
75
+ 2. 此处组件**半程死亡**时,盘面留下什么?恢复者按什么判据接手?(无产物判据 = 违反公理 3,须补 P2/P10)
76
+ 3. 此处的**配置**有几个来源?谁是唯一胜出者?(多源无裁决 = 违反公理 4,须补 P3)
77
+ 4. 此处的**输入**若为恶意指令/敏感数据,外发路径有几条?各过几道闸?(单道闸 = 违反公理 5,须补 P8/P5)
78
+ 5. 此处的**等待**有无上界?超时后终态由谁定?(无界等待或按进程存活定态 = 违反公理 6,须补 P6/P3)
79
+ 6. 以上五问的答案**是否可被测试证伪**?(不可证伪 = 设计未完成,对齐蜂巢对齐 C26「能红+反向对照+明确执行者」写作纪律,:136)
80
+ 7. 此处的**时间判据**(TTL、新鲜窗、排序键)读的是哪个钟?壁钟跳变/倒流时判据向哪个方向失真、失真可检吗?据此判据落盘的产物与留痕有没有完整性机制?(未问 = 违反公理 7 或公理 2 扩展句,须补 P6 时钟边界 / P11 完整性锚)
81
+
82
+ ---
83
+
84
+ ## 二、不可靠源分类学(九源 × 实证失效案例映射)
85
+
86
+ 提问口径为「六源」,本稿按 0.2 的九源展开(线程/并发单列、平台默认值单列——仓内实证二者案例量均足以独立成源;时间/时钟单列——无台账失效但承重面集中,预防性建模见 2.9;此为对提问分类的显式细化而非偏离)。每源给「典型失效机制 → 实证案例 → 对应防线原语(第三章编号)」。
87
+
88
+ ### 2.1 硬件 / OS 源(S1)
89
+
90
+ | 失效机制 | 实证案例(source) | 原语 |
91
+ |---|---|---|
92
+ | Windows replace 撞读者瞬态句柄(WinError 5/32) | write_result 以 mkstemp+fsync+os.replace 写产物,PermissionError 按 10ms×递增重试至多 50 次(`hive/exec.py:103-140`);双进程连写 30 次实测 FAILS=29/28 全为 PermissionError(N144,v17.md:86) | P2 |
93
+ | 路径语义暗改写(GetFullPathNameW 把保留设备名末段归一成 `\\.\` 设备路径) | datapath 环境根守卫 `_abs_host_path` 抛 ValueError + main() 启动探针 fail-fast(`md_cg/datapath.py:60`、`md_cg/mcp_server.py:3610-3616`;批次51 提交 3d7059a);job_id='con' 裸抛 WinError 267(N14,v17.md:111) | P7 |
94
+ | 控制台代码页(GBK)下 stdio MCP 写中文必失败 | mcp_server 进程内强制 UTF-8 stdio(`md_cg/mcp_server.py:3610` _force_utf8_stdio;issue #39,批次50 提交 bb9238d) | P7 |
95
+ | 磁盘满 / 写中途异常 | 磁盘满注入→裸 open("w") 已截断旧完整 spec(N88 红场,v17.md:69);原子写模板下旧完整态保留(同处绿场) | P2 |
96
+
97
+ ### 2.2 软件源(S2)
98
+
99
+ | 失效机制 | 实证案例(source) | 原语 |
100
+ |---|---|---|
101
+ | 验证逻辑自身有洞 | suite_ok 不要求 passed>0,空跑全绿(N9,v17.md:58) | P1 |
102
+ | 双源解析分叉 | MCP 面只读 env、serve 面让 config 键胜出→同一池两套解析(N89,v17.md:48-49) | P3 |
103
+ | 瞬态失败被固化为永久损害 | 一次瞬态读失败→节点从检索面消失直至重启(N134,v16.md:18);importance NaN 直通排序键、写一次长期污染全库(N140,v16.md:18) | P1/P9 |
104
+ | 静默吞错 | 审计写入 best-effort `except OSError: pass` 零告警(N126,`md_cg/mdcos.py:381-382`、`md_cg/crypto.py:399-402`,读核在位;v16.md:101) | P1/P9 |
105
+
106
+ ### 2.3 线程 / 并发源(S3)
107
+
108
+ | 失效机制 | 实证案例(source) | 原语 |
109
+ |---|---|---|
110
+ | 后台线程与前台请求共享实例且无锁 | sustain 后台线程「get 快照→写回」窗口丢更新实测 + RuntimeError('dictionary changed size during iteration') 崩溃面实测(N138,v16.md:90) | P10/第五章线程约束 |
111
+ | 多写者对撞同一文件 | 双编排者对撞固定共享 tmp `_children.json.tmp`:撕裂 JSON 落盘或 PermissionError 被静默吞(N142,v17.md:84) | P2 |
112
+ | 跨进程恢复与孤儿并发 | 孤儿执行器与新 serve recover_orphans 重投并发同 job,成 error+ok=true 矛盾终态(N92,v17.md:40) | P10 |
113
+ | 共享层出现未协调多写者 | 9·12 病灶:mdcg 多实例内存索引互相回写,信息差≠0(蜂巢对齐 A9 :49、D-4 :98-101) | P3/第五章软总线约束 |
114
+
115
+ ### 2.4 自身源(S4)
116
+
117
+ | 失效机制 | 实证案例(source) | 原语 |
118
+ |---|---|---|
119
+ | 自证(验证者参与被验证对象) | 自我改进必须双实例互验:判据冻结+判据面/候选面分离(`docs/hive/蜂巢双实例互验_设计定稿.md` 表0-1) | P4 |
120
+ | 负记忆被硬删、证伪结论丢失 | verify falsified 对受保护节点硬删风险→保护闸(N130,v16.md:5,守卫 test_n130_verify_falsified_protect.py) | P4/P3 |
121
+ | 白名单键透传无约束 | mdcg_root 原样透传为建图根,任意可写目录可被写原语初始化(v8 N68,v17.md:99) | P8/P1 |
122
+ | 白名单正则放行越级串 | iter_id 白名单放行 '.'/'..' 纯点串(N85,v17.md:104) | P8 |
123
+
124
+ ### 2.5 用户源(S5)
125
+
126
+ | 失效机制 | 实证案例(source) | 原语 |
127
+ |---|---|---|
128
+ | 客户端一句话即触发的数据外发 | _sensitive_read 名单缺 config.local.json 与 *.token,worker 可读部署凭据全文外发(N141,v17.md:83;修复 `hive/exec.py:941-977` 读核在位) | P8 |
129
+ | 子代理读面越权 | 编排子任务 workdir=编排者 CWD,整根进读白名单(N127 止血已修/全量 deferred,v17.md:98) | P8 |
130
+ | 观测/派发参数注入 | timeout_s=-5/-999999 直通违反 schema 承诺 5..3600(N18,v17.md:111) | P1/P6 |
131
+
132
+ ### 2.6 LLM 源(S6)
133
+
134
+ | 失效机制 | 实证案例(source) | 原语 |
135
+ |---|---|---|
136
+ | 自报成功当事实 | LLM 任务「执行器自报成功 = done」缺独立验证档(蜂巢对齐 D-1 :73、A2 :42) | P4/P1 |
137
+ | 多数票伪共识 | 冲突以证据裁决不以多数票;外部调研 ref-13(CAMA 伪多数)双侧印证(蜂巢对齐 A5 :45;编排者仲裁提示词 `hive/orch.py:84`) | P3/P4 |
138
+ | 概率候选冒充资格 | 概率产生候选 / 条件裁决资格 / 验证确认事实(理论溯源矩阵 #3 P-T-31,`docs/theory/理论_机制_代码_实验_缺口矩阵_v0.1.md:22`) | P3 |
139
+ | 内容脱敏缺失即外泄 | context_files 通道仅一道敏感名检查、无 PII 层,全文进 user 消息(v8 N69,v17.md:100) | P8 |
140
+
141
+ ### 2.7 人类源(S7)
142
+
143
+ | 失效机制 | 实证案例(source) | 原语 |
144
+ |---|---|---|
145
+ | 误配静默生效 | resolve() 对空串/纯空白不拒,残缺 env 静默上岗(N91,v17.md:102) | P1 |
146
+ | 人肉观测不可扩展且无告警 | 聚合观测面靠人肉(doctor/逐 job poll)(蜂巢对齐 A16 :56);聚合观测面缺(A8 :48) | P9 |
147
+ | 终裁依赖使用者但无强制留痕 | 维生终裁=使用者是理论位置(蜂巢对齐 A14/A19 :54/:59);验证任务造假未自动化、错后依赖维生终裁(蜂巢对齐 盲区4 :171) | P4 |
148
+ | 手写行号必腐化 | 双实例互验文档纪律明令「代码引用一律文件+符号名,不写行号(仓内已有活体教训)」(`docs/hive/蜂巢双实例互验_设计定稿.md` 文档纪律节);功能调用映射表注「管线生成,勿手写行号」(docs/README.md:29) | P9 |
149
+
150
+ ### 2.8 平台默认值源(S8)
151
+
152
+ | 失效机制 | 实证案例(source) | 原语 |
153
+ |---|---|---|
154
+ | 缺省密钥=公开常量 | rust 配置缺 shared_secret 键时 unwrap_or 回落「蜂群默认密钥」;Python API 缺省=公开常量、CLI 缺省=空串两口径分叉(N143,`swarm/swarm_cli.py:93`、`swarm/rust_swarm.py:24`/:38,v17.md:85) | P1 |
155
+ | 部署开关缺省全开 | sustain 后台线程缺省三 env 全开扩大 N138 暴露面(v16.md:90);部署开关缺省语义属大设计决策 deferred(N129,v16.md:19) | P1/第五章 |
156
+ | 语言运行时默认编码 | GBK 代码页默认(issue #39,批次50);`mcp_server.py:3610` 进程内强制 UTF-8 | P7 |
157
+ | 默认放行的读根 | HIVE_READ_ROOTS 缺省=放开,仅剩敏感名单一道闸(N141,v17.md:83) | P8 |
158
+
159
+ ### 2.9 时间 / 时钟源(S9,本稿新增)
160
+
161
+ **诚实声明(与 2.1–2.8 的差别)**:本源无台账失效案例,属**预防性建模**——列入分类学的依据有二:①公理 1 对「读时间的组件」直推成立(读出时间的那个钟同样是组件);②本仓承重面全压在时钟正确性上——TTL 判定、心跳判活、stable 租约、时间排序键,一旦壁钟跳变,P6 的全部等待界同时失真。故下表「实证案例」列给的是**承重面锚点**而非失效记录。
162
+
163
+ | 失效机制 | 承重面锚点(source) | 原语 |
164
+ |---|---|---|
165
+ | 壁钟跳变(NTP 校正、虚拟机挂起恢复)使 TTL 判定失真:前跳=租约提前失效(未到期先逐出),后跳=失效点永不到来(该逐出仍在位) | 令牌过期判定以壁钟 time.time() 落 expires_at(`md_cg/tokens.py:371`);派生 TTL 取 min(N123,`md_cg/tokens.py:458`——min 夹紧只收窄派生值,防不了钟本身失真) | P6/P3 |
166
+ | 壁钟跳变使心跳判活失真:前跳=活者被判死(触发树杀/互维误拉起,双 serve 并发同 job 即 N92/N142 同型),后跳=死者被判活(孤儿树持凭据存活) | 心跳新鲜窗按壁钟差值判死(`hive/serve_start.py:189`:time.time()*1000 − ts ≥ FRESH_S*1000;窗宽 15s、每拍 <1s 刷,`:51`) | P6/P10 |
167
+ | 壁钟被用作次序/因果判据:跨机多副本无共享时钟,「先后」不可用壁钟裁定 | 跨机盲区声明在案(蜂巢对齐 A17,`docs/hive/蜂巢设计_理论对齐_v0.1.md:57`);开放问题 2「证据出处结构在无共享时钟多副本间是否成立」的设问即此面 | P3 |
168
+
169
+ ---
170
+
171
+ ## 三、防线原语
172
+
173
+ 十一条原语。每条给:定义 / 灵枢落点 / **代价与适用边界**(无代价声明的原语视为未定义)。
174
+
175
+ ### P1 fail-closed(否决式融合)
176
+
177
+ - **定义**:校验不通过或校验器自身失灵时,一律拒绝而非放行;「检查未执行」不得冒充「检查通过」。
178
+ - **灵枢落点**:`hive/verify_runner.py:165-166`(suite_ok 补 `passed > 0` 门——rc=0 不等于「跑了」,N9);`md_cg/mcp_server.py:3630-3652`(启动探针四处 fail-fast return 2);`md_cg/datapath.py:60/:78`(设备路径守卫抛 ValueError);preflight 门面 fail-closed(未装配返回 ok:False+装配错误透传,溯源矩阵 #29,`docs/theory/理论_机制_代码_实验_缺口矩阵_v0.1.md:55`);理论立场=否决式融合任一通道可否决(蜂巢对齐 A20 :60)。
179
+ - **代价与边界**:用可用性换正确性——config 笔误会拒绝拉起而非带病上岗(对照 N91 空串静默上岗的反面教材,v17.md:102);对**观测/审计/清理面** fail-closed 反而有害,允许 fail-soft 但**必须留痕**(`hive/orch.py:313-316` 清单落盘失败 log 留痕;反例 N126 审计吞错零告警——该反例的语义归属已按本条闭合:审计/观测通道归 P9 侧 fail-soft+留痕,余下为实现跟进,见「六、开放问题与实现跟进项」第 3 条)。判据必须是「实判据」而非代理判据——`passed>0` 防的就是 rc=0 这类代理判据被空跑绕过。
180
+
181
+ ### P2 原子写 + fsync
182
+
183
+ - **定义**:多读者/多写者共享文件面上的任何状态落盘,必须经「同目录唯一临时名 + fsync + 原子替换」,禁止裸 open("w") 截断覆盖。
184
+ - **灵枢落点**:`hive/exec.py:104-156` write_result(mkstemp+flush+fsync+os.replace,PermissionError 递增重试 50 次、FileNotFoundError 重建自愈);`hive/orch.py:270-310` _atomic_write_json(同一模板,v10 N82 先例);接线面 `hive/orch.py:316`(children 清单)与 `:683`(spec 写回),一模板三收 N142/N88/v8 N70(v17.md:64-71)。
185
+ - **代价与边界**:Windows 撞读者瞬态句柄时最坏阻塞约 12.5s(10ms×递增至 50 次,`hive/exec.py:103` 注释);rename 原子性只在同目录成立(mkstemp 必须同目录);POSIX 0600 权限位仅多用户形态相关,win32 同用户部署不构成缺口(v17.md:111 台账读码口径);fsync 有真实 IO 代价,仅用于「语义终态」文件,观测流(jsonl 追加)不必逐条 fsync。
186
+
187
+ ### P3 唯一真源 + 确定性裁决
188
+
189
+ - **定义**:每个被多方消费的决策只允许一个决策函数、一份真源;资格判定必须是确定性规则(词面/结构),不得交给概率组件。
190
+ - **灵枢落点**:jobs 池解析单点化——MCP 面 _jobs_dir 改经 serve_start._jobs_from 同一决策函数同一合并语义(N89 修复,v17.md:50);恢复/终态判据单一实现 classify_result「产物说了算」(`hive/src/scheduler.rs:11-12`、`:235-240`);四态资格判定 ACCEPT/REJECT/DEFER/BLINDSPOT 为确定性判定序,BLINDSPOT=「无法建立可靠归属,停止猜测」(`md_cg/mdcg.py:211`;溯源矩阵 #2);写入闸白名单+纵深(`md_cg/mdcg.py:1248`)。
191
+ - **代价与边界**:唯一真源同时是故障焦点与攻击焦点,真源自身必须受守卫(N135 热缓存 env 登记不全违反同文件自书纪律即此面破口,v16.md:18);确定性判定覆盖不了语义理解,「四态判定不交给 LLM」的导航税尚未量化(溯源矩阵 #13,标注为理论盲区91);纯点串类白名单正则须显式排除(N85,v17.md:104)。
192
+
193
+ ### P4 判据冻结(验证者 ≠ 被验证者)
194
+
195
+ - **定义**:验证的判据与执行权必须结构隔离:验证者不参与修改,判据在被验对象变更前冻结;裁决看证据出处结构,不看多数票。
196
+ - **灵枢落点**:双实例互验设计定稿——git worktree 双副本、单次迭代内主实例+专职验证实例+仲裁实例角色固化、判据面/候选面分离(`docs/hive/蜂巢双实例互验_设计定稿.md` 表0-1 与 §7.6);理论条款=3.3 验证单元权力制衡「验证单元权力集中=单点故障」(`docs/theory/智能论3.4.md:176`;蜂巢对齐 A5 :45);verify 层 falsified 会移入 rejected 负记忆且受保护节点拒删(N130 闸,`md_cg/mcp_server.py:199-205`,v16.md:5);令牌面「验证单元不得改事实层」由角色矩阵表达(`docs/hive/令牌与角色权职分离_v0.1.md` §1,v0.2 增补裁决权/管理权分离)。
197
+ - **代价与边界**:双副本双倍编译与运行成本、角色固化牺牲灵活性;**验证任务自身的造假可能尚未自动化防住**(蜂巢对齐 盲区4 :171),错后路径依赖维生终裁(使用者);「验证者独立终审」在理论文档侧已有流程先例(《智能论3.4.md:7》GLM 终审+验证单元独立终审),工程侧仍是设计定稿待排期。
198
+
199
+ ### P5 分层防御(无单一机制)
200
+
201
+ - **定义**:任何单道闸都被假定为可穿透;关键面必须有**相互独立**的多道闸,且逐通道审计「每道闸在该通道是否真的生效」。
202
+ - **灵枢落点**:read_file 通道三层——scope 白名单 / HIVE_READ_ROOTS / _sensitive_read 敏感名单 / PII 脱敏(`hive/exec.py:363` 生效条件、`:800-802` 返回体逐层过 _redact_pii);反例教材:context_files 通道仅 _sensitive_read 一道,其余防线对该通道零生效即穿透(v8 N69,v17.md:100)。
203
+ - **代价与边界**:层间冗余有维护成本;**层数≠安全性**——若各层共享同一失效模式(如都用同一份名单),是伪分层;概率层(正则脱敏)只能降概率不能阻断(`hive/exec.py:976-979` 注释自认「正则脱敏是概率防线」;+86 前缀/分隔符/中文邻接形态全漏,N86,v17.md:105)。
204
+
205
+ ### P6 超时降级(一切等待有界,降级判据仍信产物)
206
+
207
+ - **定义**:任何等待(心跳、锁、任务、租约)必须有超时与超时后的降级动作;降级/强杀后的终态判定仍以盘面产物为准。
208
+ - **灵枢落点**:HEARTBEAT 判活与 stop 段「未转假也照常退出循环」(`hive/serve_start.py:195`);树杀/组杀 `taskkill /T /F` 与 `os.killpg(os.getpgid(pid),15)`,前提 start_new_session 单独成组(`hive/serve_start.py:215-223`、`:267`;N92 修复,v17.md:41);令牌 TTL 派生只能收窄——子令牌过期取与父记录的 min(N123,`md_cg/tokens.py:458`);stable 结论带 TTL 降级(蜂巢对齐 A4 :44)。
209
+ - **代价与边界**:超时必误杀正确但慢的任务——所以强杀后**不得无条件贴 timeout 标签**,须先查产物(反例 N146:kill 分支不看产物落 status=timeout+result.ok=true 矛盾终态,v17.md:88);unix 真实群杀行为在 win32 本机不可动态验证,只能 mock 接线+源断言+读码论证并如实标注(v17.md:42 诚实边界)——跨平台行为差异本身是 S8 源的活例;**一切等待界都以时钟读数计,时钟粒度与时钟正确性是 P6 的隐含前提(公理 7 / 2.9)**——心跳新鲜窗按壁钟差值判死(`hive/serve_start.py:189`,窗宽 15s、每拍 <1s 刷,`:51`),NTP 校正或虚拟机挂起恢复引起的壁钟跳变可让活者被判死(误触发树杀/互维拉起)或死者被判活(孤儿树存活);令牌 TTL 同为壁钟读数(`md_cg/tokens.py:371`),min 夹紧(`:458`)只收窄派生、防不了钟本身失真——故凡依赖时间判据的等待面,在跨机与虚拟化形态下须补单调钟或外部时间锚,并声明时钟粒度假设(对照 0.3 跨机盲区声明)。
210
+
211
+ ### P7 信任本地计算(平台承诺必须实测后采信)
212
+
213
+ - **定义**:平台/运行时/文档承诺的语义(编码、路径归一、信号、原子性)不得直接采信,以本机实测与进程内自证为准;探不过的语义按不可靠处理。
214
+ - **灵枢落点**:进程内强制 UTF-8 stdio 三流(issue #39,`md_cg/mcp_server.py:3610`);启动探针把「GetFullPathNameW 对保留设备名的暗改写」转化为 fail-fast(`md_cg/mcp_server.py:3610-3616`,批次51);WinError 5/32/87 等行为差异全部来自本机实弹复现而非文档(v17.md:33-44 红绿场记录);同一模板在 unix 臂的行为以「mock 接线+源断言+读码论证」三段式落地并标注不可动态验证(v17.md:42)。
215
+ - **代价与边界**:每个新平台/新 OS 须重做实弹验证,成本随平台数线性增长;「本地实测」覆盖不了未触发的时序窗口(N146 亚秒级窗口未做动态复现,读码论证并如实标注,v17.md:88)——P7 降低 S8 概率,不归零。
216
+
217
+ ### P8 净化投影(最小披露)
218
+
219
+ - **定义**:一切向低信任域(外部网关、子代理、日志)投影的内容,默认只投「必要最小集」;敏感面以名单闸+脱敏+标注块三件套处理,被拦内容以 skipped 标注替代正文。
220
+ - **灵枢落点**:_sensitive_read 名单闸(精确名/目录段/前缀族/后缀族,N141 补 config.local.json 与 .token,`hive/exec.py:941-977` 读核在位);_redact_pii 值脱敏与 _redact_deep 递归(`hive/exec.py:986-997`);context 命中敏感返回 skipped="敏感凭据拒读" 标注块、不读正文不拒整个 spawn(`hive/exec.py:363`)。
221
+ - **代价与边界**:正则是概率防线(N86 漏 +86/分隔符/CJK 邻接形态,v17.md:105);**净化必须逐通道审计**——read_file 单点的 PII 脱敏对 context_files/返回体通道不自动生效(v8 N69 + `hive/exec.py:800-802` 返回体补脱敏的先例);名单法有误伤面(绿场验证 config.json/token.txt 不误伤,v17.md:33),扩名单须带零回归用例。
222
+
223
+ ### P9 可观测性优先(观测面与决策面同源)
224
+
225
+ - **定义**:系统状态必须可被外部观测(元认知孵化的前提,蜂巢对齐 A8 :48);观测面必须与决策面走同一数据源,否则「观测全绿」本身就是新的不可靠源。
226
+ - **灵枢落点**:progress.jsonl 五类离散条目(`hive/exec.py:60`、`:507`);health_os 全域读数面(`md_cg/mdcos.py:3117-3119`);实例间只传离散事件标记不传连续权重(蜂巢对齐 A18 :58);反面教材 N89——spawn/poll/doctor 五观测面与实况全面相悖(任务永久 pending 且全绿),修复即「观测与 serve 同一决策函数」(v17.md:49-50);观测面自身须容错——单个坏 result.json 打崩 poll 整面即观测盲区(N90,v17.md:101)。
227
+ - **代价与边界**:观测面扩了攻击面与解析面(N90/N85 的注入载体都是观测/登记面);「状态暴露强制」有聚合成本(多任务全局视图缺,A8 差距栏 :48);观测留痕不等于审计——留痕被静默吞掉等于零观测(N126);**审计取证还有完整性前提:留痕可被伪造时取证同样归零**——审计 jsonl 现无任何完整性机制,任何写者可追加伪造记录且取证面读到的就是最后写者的版本(公理 2 扩展句;对应该防线=P11 完整性锚)。上报通道自身的容量与速率防线见 5.2 约束 E4。
228
+
229
+ ### P10 let-it-crash 与隔离恢复(二选一,禁悬空态)
230
+
231
+ - **定义**:组件级故障只有两种合法处置——**fail-fast 崩出去**(坏状态不扩散)或**隔离恢复**(按盘面产物恢复到一致态);禁止第三态:带病继续且不留痕。
232
+ - **灵枢落点**:fail-fast 面——启动探针 return 2(`md_cg/mcp_server.py:3630-3652`)、config 解析失败拒拉起(蜂巢对齐 A20 :60);隔离恢复面——serve 启动先 recover_orphans 清残局、产物说了算单一实现(`hive/src/scheduler.rs:11-12`、`:146-153`、`:235-240`);互维守护 mutual_watch(pid 探活→冷却防风暴→幂等拉起→验戳新鲜闭合,双亡 both_dead→外部告警不假装成功;溯源矩阵 #30,`docs/theory/理论_机制_代码_实验_缺口矩阵_v0.1.md:56`);反向教材——stop 段树杀缺失使执行器成孤儿持凭据外呼(N92,v17.md:40)。
233
+ - **代价与边界**:crash 面对长任务是可用性中断,故必须有恢复判据(产物说了算,推论 2);恢复判据不信产物则恢复本身制造矛盾终态(recover_orphans 与 classify_exit 两套判据的历史病灶,蜂巢对齐 D-2 :77;N146 是同族残面);双亡检测是诚实上限——自动拉起救不回双实例同死,须外部告警兜底;**「产物说了算」还有完整性前提:恢复判据读的是不可伪造的产物**——伪造的一致态产物会让恢复精确地恢复到攻击者选定的状态,比没有产物更糟(推论 2 完整性前提;对应该防线=P11)。
234
+
235
+ ### P11 完整性锚(判据面/证据面必须不可伪造)
236
+
237
+ - **定义**:凡被引用为判据或证据的持久化面(result/verdict/审计留痕/WAL),必须带完整性机制——HMAC、签名或外部锚(写后不可改的外部面);无完整性机制的判据面,其上的任何判定都只是「对写入者的信任」,不是验证(公理 2 扩展句:盘面产物与审计留痕本身是说谎者候选)。
238
+ - **为何单独立原语(P2 防丢失,本条防伪造)**:P2 只保证产物不是半成品,不保证产物不是伪造品。仓内先例与缺口恰好共同证明该面真实存在:蜂群 WAL 已有 HMAC-SHA256 逐条验签(WAL-HMAC)——`swarm/rust_swarm.py:100-102` verify_wal_signatures(畸形/被篡改行计 bad、验签器不因坏输入崩溃)、`:129-131` 重算 HMAC 后 compare_digest,且 Python hmac 独立交叉复核 Rust 手写 SHA256;但同一机制的密钥面存在缺省缺口(N143:API 缺省=公开常量 `swarm/rust_swarm.py:24`、CLI 缺省=空串,v17.md:85)——机制装了、密钥没管,防伪造能力即形同虚设。反观 hive 侧被引用为判据的 result.json 与 md_cg 审计 jsonl 均无完整性机制,`passed > 0` 门(`hive/verify_runner.py:165-166`)与 classify_result 判据(`hive/src/scheduler.rs:235-240`)读盘面字段即可被直写满足。
239
+ - **灵枢落点**:WAL-HMAC 先例(上述);N143 密钥生命周期缺口(v17.md:85,留档池在案);推论 2 与 P9/P10 的完整性前提声明;审计面(`md_cg/mdcos.py:381`、`md_cg/crypto.py:401`)防静默丢失(N126)之外的伪造面为本条待建设面。
240
+ - **代价与边界**:**密钥管理本身成为新的不可靠源**——密钥的生成/分发/轮换/存储每一环都回到公理 1–4(缺省、泄露、双源、半程),N143 是活的例子;验签有每条记录的真实计算开销(WAL 逐条 HMAC 重算);**无法防持有密钥者**——完整性锚证明的是「写后未被改」,不证明「写入者诚实」,故必须与 P4 组合:签发判据产物者与裁决者不得同权。
241
+
242
+ ### P12 附:原语组合规则(单用不足,成对生效)
243
+
244
+ 十一条原语单独使用都有已知穿透案例,合法使用方式是组合:
245
+
246
+ - **P1+P2**(一切语义终态写面):先 fail-closed 校验,再原子落盘——只 P1 无 P2 则校验过了写裂(N88),只 P2 无 P1 则写得很原子地落了假成功(N9)。
247
+ - **P2+P11**(一切终态判据写面):P2 保产物不是半成品(防丢失/撕裂),P11 保产物不是伪造品(防毒化)——只 P2 无 P11,N143 已示范:完整性机制在(WAL-HMAC 验签在仓)、缺省密钥使它对持有公开常量者形同虚设。
248
+ - **P3+P9**(一切决策面):决策函数单源化的同一提交里,观测面必须改到同源——N89 修复先补观测同源才算闭合(v17.md:50),只改决策不改观测 = 「修好了但看起来没修」。
249
+ - **P4+P10**(一切自我修改面):验证资格用双实例隔离(P4),改动失败用产物判据恢复(P10)——缺 P4 自证,缺 P10 改坏后回不去。
250
+ - **P6+P3**(一切超时面):超时强杀(P6)之后终态必须回到确定性裁决(P3 产物说了算)——N146 证明跳过 P3 的 timeout 标签制造矛盾终态(v17.md:88)。
251
+ - **P8+P5**(一切投影面):净化(P8)必须逐通道铺满(P5 的通道审计)——v8 N69 证明单通道净化对旁路通道不自动生效(v17.md:100)。
252
+
253
+ ---
254
+
255
+ ## 四、已有实践的理论化(91 修 + 留档池按源归位)
256
+
257
+ **口径声明**:「91 修」为提问口径;仓内可核口径为 v8–v17 每轮 5 补丁(v17.md:4)、编号至 N147(v17.md:5)。三条补充口径(起草会话第一手 `git log --oneline -5` 读核):批次48 全量 200/200(提交 98fdfbb)→ 批次49 204/204(提交 0817b2c,v17.md:6 同口径实跑)→ 批次50 205/205(提交 bb9238d)→ 批次51 206/206(提交 3d7059a)——每轮「5 修 + 新守卫红转绿」节奏与全量单调增长可复算。本节按 0.2 九源把修复与留档归位,每格给代表例(非穷举),证明理论不是事后追认——**每条原语都在修复史里有多次「先违反、后付出代价、再固化为守卫」的循环**。
258
+
259
+ | 源 | 已修代表(理论化为原语) | 留档池代表(约束与开放问题输入) |
260
+ |---|---|---|
261
+ | S1 硬件/OS | N82→write_result 三重加固=P2(v17.md:111);N92 树杀/组杀=P6(v17.md:41) | N144 exec_cmd 结果写面同仓双标,下轮速收(v17.md:86) |
262
+ | S2 软件 | N9 空跑门=P1(v17.md:58);N89 池单源=P3(v17.md:50);N88 半截 spec=P2(v17.md:68) | N133/N134 读缓存写面破口(v16.md:18);N126 审计吞错(第六章) |
263
+ | S3 并发 | N142 固定 tmp 对撞=P2(v17.md:67);N138 实测触发→线程模型约束(v16.md:90) | 9·12 病灶修复 M3/M6 依 D-4 裁决推进(蜂巢对齐 :98-101) |
264
+ | S4 自身 | N130 verify-falsified 保护闸=P4(v16.md:5);N131 merge 层写+保护双闸=P1/P4(`md_cg/mdcos.py:2117`) | N137 索引真源回归面、N139 密钥生命周期(v16.md:19) |
265
+ | S5 用户 | N141 敏感名单=P8(v17.md:33);N127 最小止血=P8(v17.md:98) | N127 全量收紧(scope 语义专项,v17.md:98);v8 N68 mdcg_root 透传(v17.md:99) |
266
+ | S6 LLM | expect_* 快速验证档=P4/P1(蜂巢对齐 D-3 表 :88);verify_answer 三层拦截=P4(溯源矩阵 #22) | D-1 验证档口径落地(蜂巢对齐 :73);C7/M5 收口裁决(蜂巢对齐 :45) |
267
+ | S7 人类 | N84 坏条目 status=failed 计数=P9(v17.md:111);N123 TTL 夹紧=P6(`md_cg/tokens.py:458`) | N91 空串 fail-fast(v17.md:102);N18 参数注入校验(v17.md:111) |
268
+ | S8 平台默认值 | issue #39 UTF-8 强制=P7(批次50);批次51 设备名探针=P7/P1(`md_cg/mcp_server.py:3610-3616`) | N143 WAL 缺省密钥语义决策(v17.md:85);N129 部署开关缺省语义(v16.md:19) |
269
+ | S9 时间/时钟 | 无已修(预防性建模源,无台账失效案例,诚实声明见 2.9) | 开放问题 2 的无共享时钟设问;P6 判活/租约的时钟粒度依赖(第三章) |
270
+
271
+ **守卫化规律**(从台账归纳):每修必配守卫且守卫须有红场记录(v17.md:35「红证」口径;蜂巢对齐 C26 把「能红+反向对照+明确执行者」升格为写作纪律,:136)——这正是 P1 的元层应用:**修复本身也是组件,同样不可靠,故修复必须自带可证伪判据**。
272
+
273
+ ---
274
+
275
+ ## 五、待建设面的设计约束(只写约束,不写实现)
276
+
277
+ 以下四个待建面,任何后续实现必须满足对应约束才算合规;实现方案本身另案裁决。
278
+
279
+ ### 5.1 记忆软总线(跨实例记忆消息传递)
280
+
281
+ - **约束 B1(消息化)**:跨实例只传离散消息,不共享内存态、不传连续内部状态(依据:A18 离散事件同步,蜂巢对齐 :58;S3 源的全部实证)。
282
+ - **约束 B2(最终一致)**:多副本收敛目标为最终一致;任何写必须可回读验证(写后回读,D-4 纪律,蜂巢对齐 :100);不承诺线性一致,冲突窗口必须可观测。
283
+ - **约束 B3(冲突解决按裁决链与信任加权)**:冲突不得以多数票或「最后写者赢」默认裁决;须走确定性裁决链(P3:资格判定→证据出处结构),信任加权只能在**候选排序**起作用、不得作用于**资格判定**(依据:R1 裁决「自适应权重作用于候选排序,不得作用于资格判定」,蜂巢对齐 :123;A5 伪多数对策 :45)。信任权重数值化前置条件=D-5:无实测数据不做数值化(蜂巢对齐 :103-108)。
284
+ - **代价声明**:最终一致牺牲读即时性;裁决链使冲突收敛延迟高于简单策略;信任数据前置使加权长期不可用(诚实接受)。
285
+
286
+ ### 5.2 错误上报通道(新写面)
287
+
288
+ - **约束 E1(双闸)**:一切新写面必须过双闸——层写权限闸(require_layer_write 语义)+ 保护闸(self/anchor 层、immutable 拒写);先例=N131 merge 路径补与 add 同序同错型双闸(`md_cg/mdcos.py:2117`)。
289
+ - **约束 E2(字段白名单脱敏)**:上报字段必须白名单化,禁通配放行(姊妹面教训:N125 '*' 通配,v16.md:19);白名单键透传不得无约束(v8 N68 教训,v17.md:99);上报内容过净化投影(P8)。
290
+ - **约束 E3(不静默)**:上报通道自身失效必须可检(反例 N126:审计吞错零告警使取证面归零);「增益失败不阻塞但不静默」为先例口径(v16.md:172)。
291
+ - **约束 E4(上报速率与容量防线)**:上报通道必须有四件套——**速率限制**(单位时间窗内单源上报条数上界)、**配额**(每源/每通道累计配额,超配额拒绝并计数可见)、**去重**(同源同型同内容的重复上报折叠为计数)、**严重度分级**(info/warn/critical 分阈值或分通道)。缺一即该通道可被灌成洪水:上报洪水不损数据但淹没真实告警——告警疲劳是观测面的软杀伤,直接违反 P9「观测必须可读」的存在理由(E3 的「不静默」若不配上限,静默的反面就是噪声,两者同属观测失效)。
292
+ - **代价声明**:双闸与白名单增加每条上报的延迟与演进成本(新字段须先登记);不静默要求 stderr/health 计数双通道,占观测面容量;E4 的限流/配额/去重计数器是共享可变面,其自身并发安全归 5.3 线程模型约束。
293
+
294
+ ### 5.3 线程模型
295
+
296
+ - **约束 T1(二选一)**:任何共享可变面,要么加锁(明确锁序),要么消息化(单写者所有权移交),禁止「注释声明单线程」式的口头豁免——实证:mcp_server「单线程 stdin 循环:无并发竞争」注释未覆盖 sustain 后台线程,丢更新与 RuntimeError 均为实测(N138,v16.md:90)。
297
+ - **约束 T2(缺省语义一并裁决)**:后台线程的部署开关缺省值必须与线程模型裁决一并评估,不得默认全开(N129/N138 缺省语义,v16.md:19/:90)。
298
+ - **代价声明**:加锁引入死锁/锁序维护成本并可能拖慢前台;消息化引入延迟与队列容量问题;两者都比「不加」贵——这正是不可靠理论的定价:并发正确性是买来的。
299
+
300
+ ### 5.4 0.5.1 发布承诺
301
+
302
+ - **约束 R1**:0.5.1 发布前,上述 5.1–5.3 约束须以「可核对判据」进入对应面的验收清单(判据形式对齐蜂巢对齐 C26:能红+反向对照+明确执行者,:136)。
303
+ - **口径声明**:仓内 package.json 版本现为 0.5.0(`package.json:3`);「0.5.1 发布承诺」出自本次四路调研提问口径,仓内文档未见 0.5.1 承诺原文——本约束以提问口径登记,待使用者确认承诺细则。
304
+ - **代价声明**:承诺将发布时点与约束验收绑定,可能推迟发布;不绑定则约束沦为建议(违反本章「只写约束」的效力前提)。
305
+
306
+ ---
307
+
308
+ ## 六、开放问题与实现跟进项
309
+
310
+ 1. **形式化验证从令牌语义小闭包起步**:令牌派生链已有可公理化的代数结构——「派生只能收窄」(clearance cap 夹紧、layers/ops 求交、TTL 取 min,`md_cg/tokens.py:322` _clamp_level、`:458` 生效条件、`:413` 链深封口注释)与「吊销级联物化」(`:393` verify 生效条件)。这是全仓语义最小、性质最纯的闭包,适合作为形式化验证的第一块试验田(不变量候选:派生闭包下权限单调不增;可证伪判据:任一派生路径权限大于父即推翻)。风险:形式化若只覆盖令牌面会给人「全系统已形式化」的错觉,对外表述必须限定范围。
311
+ 2. **跨实例冲突解决语义**:软总线 B3 只给了方向(裁决链+信任加权),但「同源多证计数口径」「纠正链侧车」尚无定稿(C7+C22/M5,蜂巢对齐 :45);9·12 病灶的最终修复路径(M3 双轨制/M6 ingest 单通道)P2 后才开工(蜂巢对齐 :133)。开放点:裁决链跨实例化后,「证据出处结构」的定义是否仍能在无共享时钟的多副本间成立。
312
+ 3. **审计吞错 N126(语义已裁定,转为实现跟进项)**:审计写入 `except OSError: pass` 双处静默(`md_cg/mdcos.py:381-382`、`md_cg/crypto.py:399-402`,读核在位;v16.md:101 动态补证零痕迹)。语义侧已裁定,按 P1 代价与边界的既有裁定执行:审计/观测通道归 P9 侧——fail-soft 不阻断敏感操作,但必须留痕,且留痕是 P9 的硬性义务而非可选项(「事后取证面归零」的张力由此闭合;留痕自身的完整性前提另见 P11)。跟进项为实现落地排期:最小修(stderr 一行+health 计数,v16.md:172 口径)进哪个补丁轮执行,判据对齐 C26 能红口径——注入一个不可写审计路径,stderr 输出与 health 计数须同时可见(反向对照:可写路径零误报)。
313
+
314
+ ---
315
+
316
+ ## 七、与智能论协议框架的映射
317
+
318
+ 本理论不是孤立发明,而是智能论协议框架在「组件假设」维度上的投影。映射表(理论条款以《智能论3.4》条款要点为准,逐字原文以该文件为唯一真源——对齐双实例互验文档纪律):
319
+
320
+ | 本理论构件 | 智能论条款(接缝) | 投影关系(source) |
321
+ |---|---|---|
322
+ | 公理 1(常态公理) | 元公理2 熵变公理(`docs/theory/智能论3.4.md:637`):系统天然趋向信息差扩大 | 不可靠=信息差扩大的组件级表现;防御=持续施加结构(蜂巢对齐 A1 :41) |
323
+ | 推论 1(完成≠验证) | 元公理3 共识不变公理(:648):不可验证的共识等同于无共识 | 直接引用为公理组推论(蜂巢对齐 A2 :42) |
324
+ | 全部原语的合法性 | 协议降熵定理(:751):维持存在必须缩小信息差,缩小信息差需要结构 | 每条原语须回答「降低了什么熵」,否则不该存在(蜂巢对齐 A1 降熵判据 :41) |
325
+ | P3 确定性裁决 | 条件论:概率产生候选/条件裁决资格/验证确认事实(CRG);四态判定(溯源矩阵 #2/#3) | 确定性裁决原语的判定序来源;R1 外部同构互证(蜂巢对齐 :123) |
326
+ | P4 判据冻结 | 3.3 验证单元的权力制衡(:176) | 验证者≠被验证者的理论条款;双实例互验=工程形态(设计定稿表0-1) |
327
+ | P6 超时降级 | 3.2.2 stable 租约带 TTL;降级作用于状态不作用于记录(蜂巢对齐 A4 :44、溯源矩阵 #21) | 超时降级的「不毁记录」约束来源(N130 闸同源) |
328
+ | P10 隔离恢复 | 3.4 保护协议 P0:系统自身受威胁=崩溃恢复(蜂巢对齐 P0 行 :131);维生三级仲裁(溯源矩阵 #28) | recover_orphans/mutual_watch 的理论位置 |
329
+ | 第五章 B1 离散消息 | 1.7 隐式学习:条件空间声明宜作蜂群通信底层语言(蜂巢对齐 A13 :53);A18 离散事件 | 软总线消息形态约束来源(D-6 张力裁决:不加字段=降熵 :110-115) |
330
+ | 第五章 B3 裁决链 | A15 共享层/本地层+合并机制 6.5:已验证才同步共享层,冲突由验证复核+维生终裁(蜂巢对齐 :55) | 冲突解决约束的理论判据;wm 三级闸已是同构先例 |
331
+ | 第四章 91 修循环 | 3.10 自迭代八步闭环+方向性自检(蜂巢对齐 A10 :50) | 「先违反→付代价→固化为守卫」循环=自迭代的缺陷面形态;方向自检节奏锚 |
332
+
333
+ **接缝处的三个诚实注记**:①映射是有损投影——「结构对应,非数学同构」(口径先例:溯源矩阵 §2B-4,`docs/theory/理论_机制_代码_实验_缺口矩阵_v0.1.md:125`);②本理论的九源分类在智能论框架里没有现成条款对应(尤其 S1 硬件/S7 人类/S9 时间时钟),公理 7(时钟公理)与 P11(完整性锚)同属**对框架的扩展候选**而非既有结论,是否回写理论真源待维生终裁;③溯源矩阵的证据等级制(A/B/C/D,:7-14)本稿沿用:本稿所有仓内引证按其口径最高为 A(起草会话读核)至 C(台账转引),凡未实跑的断言(如 91 总数、0.5.1 细则)一律标注为提问口径,不计入证据等级。
334
+
335
+ ---
336
+
337
+ ## 附:本稿自检清单
338
+
339
+ - 全文引证均为 path:line / 报告编号+行号 / 理论名+条款位置;起草会话第一手读核的锚点:`hive/exec.py:103-156/:363/:800-802/:941-977`、`hive/orch.py:270/:313-316/:683`、`hive/verify_runner.py:161-166`、`hive/serve_start.py:51/:189/:195/:215-223/:267`、`hive/src/scheduler.rs:11-12/:146-153/:235-240`、`md_cg/mcp_server.py:199-205/:3610-3652`、`md_cg/mdcos.py:381-382/:2117/:3117-3119`、`md_cg/crypto.py:399-402`、`md_cg/tokens.py:322/:371/:393/:413/:458`、`md_cg/mdcg.py:211/:1248`、`md_cg/datapath.py:60/:78`、`swarm/swarm_cli.py:93`、`swarm/rust_swarm.py:24/:38/:100-102/:129-131`(读核方式:grep/Read 直查现行文件)。
340
+ - 未实跑项如实声明:全量测试套件、守卫红绿场、`python scripts/run_tests.py` 均未在起草会话运行(本任务为纯理论构建,零代码改动);91 总数未重数;0.5.1 承诺细则仓内未见;公理 7/2.9 时间时钟源为预防性建模,无台账失效案例(承重面引证已在正文标注)。
341
+ - 四路调研报告本体未获取(工作流运行史不可读),本稿证据基座=仓内缺陷台账 v16/v17+源码读核+理论文档;如后续调研报告与本文冲突,以后到材料为准修订。
342
+ - 无本机绝对路径、无密钥/令牌字面量(「蜂群默认密钥」为源码公开常量名,N143 台账同口径注明)。
343
+ - 版本:v0.1 定稿(2026-09-26);本轮修订实质落实三条 high 评审意见(时钟源入分类学与公理集、完整性锚入原语集并给推论 2/P9/P10 补完整性前提、开放问题 3 收敛为实现跟进项)与一条 medium(错误上报通道速率/容量约束 E4);修订须走本稿材料口径节的声明规则。
@@ -44,6 +44,26 @@
44
44
  # 全部工具(含记忆/认知/白箱 wisdom_* 工具族),供 Agent 直接调用
45
45
  tools: all
46
46
  env:
47
+ # ── 会话 / 智能体 归因维度(2026-09-26 新增,可选项但推荐接线)──────────
48
+ # 三维身份:地点 = 会话所属工作区目录名(如 --D-4_ai--);
49
+ # 智能体 = harness(dsh / codebuddy / zcode);会话 = session-<uuid>。
50
+ # 为何要配:md_cg/mcp_server.py 的 _declared_session 规定「env 权威」——
51
+ # ① 设了 MDCG_SESSION(或 DSH_SESSION_ID)→ 本 MCP 连接的会话归属被钉死,
52
+ # 调用方在请求里声明的 session 一律忽略(客户端不得伪造归属);
53
+ # ② 没设 → 单进程多会话的载体(DSH web 一个 MCP 进程服务多个前端会话)
54
+ # 虽允许请求面声明,但须过 _normalize_session 的防编造校验:DSH 形态
55
+ # (session-<uuid4>)须真实存在于 MDCG_DSH_SESSIONS_ROOT/<workspace>/ 下,
56
+ # 否则降级 anonymous(记忆照样落盘,只是归属不可追溯)。
57
+ # 本机接线(2026-09-26 实测生效):由启动脚本按工作区解析当前会话目录名后注入
58
+ # DSH_HOME=D:\dsh-home
59
+ # set MDCG_DSH_SESSIONS_ROOT=D:\dsh-home\sessions
60
+ # set MDCG_HARNESS=dsh
61
+ # set MDCG_UNIT=agent
62
+ # set MDCG_SESSION=session-<当前会话 uuid>
63
+ # 参见 dsh/dsh-web-start.bat 与 <profile>/cordis.patch.yml 的 env 段。
64
+ MDCG_DSH_SESSIONS_ROOT: '<DSH_HOME>/sessions'
65
+ MDCG_HARNESS: 'dsh'
66
+ MDCG_UNIT: 'agent'
47
67
  BOCHA_API_KEY: !!js process.env.BOCHA_API_KEY
48
68
  AEIS_DESIGNER_KEY: !!js process.env.AEIS_DESIGNER_KEY
49
69
  # 角色扮演 LLM 续答密钥(插件桥 env 透传;优先从 .credentials.yaml 读取——
@@ -77,3 +97,18 @@
77
97
  mutual:
78
98
  enabled: false
79
99
  heartbeatMs: 600000
100
+
101
+ # ─── 会话归因补充说明(2026-09-26,DSH 日志索引 v2)──────────────────
102
+ # 经 dsh_log_index.py 摄取的日志节点(id 前缀 dsh-log-):
103
+ # · frontmatter.session = 派生标识 sha256(createdAt+首条用户消息)[:16]
104
+ # —— 16 位十六进制摘要而非 session-<uuid>。这是**刻意设计**(会话 uuid
105
+ # 每次重启必换,不可作身份锚;内容寻址标识跨重启稳定),勿当 bug 报。
106
+ # · frontmatter.dsh_session_uuid 保留原始 uuid 供溯源。
107
+ # · sensitivity=internal(日志不加密,使用者裁定)→ 跨会话共享档,
108
+ # 任何过密级校验的会话均可检索(跨会话回看是日志检索的用途)。
109
+ # · layer=knowledge → 不会进入 autoRecall 自动注入池(recall 默认
110
+ # contextual 层)——日志冷真源只对显式查询有效,这是预期行为。
111
+ # · MDCG_READ_CACHE:读缓存缺省已开(readcache.py "1" 缺省,=0 显式关闭)。
112
+ # DSH 端部署实测(2026-09-27):14135 节点库冷态首查全池装配 50–60s
113
+ # (每节点 ~3.3ms 读盘),装配完成后热查询 162ms。建议启动脚本在
114
+ # 起 dsh 前先跑一次预热查询,把全池装配挪到启动期(用户查询免首查卡顿)。
package/lib/bridge.d.ts CHANGED
@@ -73,6 +73,15 @@ export declare class LingshuBridge {
73
73
  get gaveUp(): boolean;
74
74
  /** 等待握手完成(用于 apply 阶段同步就绪)。 */
75
75
  waitReady(): Promise<boolean>;
76
+ /**
77
+ * V23 修复(缺陷 :284):清理上一个仍存活的子进程。
78
+ * 握手超时/启动失败重试时直接 spawn 新进程并覆盖 this.proc(:182),
79
+ * 旧进程若仍存活(卡死但不退出的服务端)既不 kill 也不关 stdin——
80
+ * 引用被覆盖后永远无人清理 = 僵尸进程泄漏(最多 MAX_RETRIES 个并存,
81
+ * dispose 也只收尾最后一个)。换代前统一回收:stdin EOF 优雅退出 + kill 兜底。
82
+ * 幂等:已退出(exitCode/signalCode 非 null)的进程跳过。
83
+ */
84
+ private killStaleProc;
76
85
  private spawnAndHandshake;
77
86
  private handshake;
78
87
  private scheduleRetry;
package/lib/bridge.js CHANGED
@@ -116,9 +116,37 @@ export class LingshuBridge {
116
116
  return Promise.resolve(false);
117
117
  return new Promise((resolve) => this.bootQueue.push(resolve));
118
118
  }
119
+ /**
120
+ * V23 修复(缺陷 :284):清理上一个仍存活的子进程。
121
+ * 握手超时/启动失败重试时直接 spawn 新进程并覆盖 this.proc(:182),
122
+ * 旧进程若仍存活(卡死但不退出的服务端)既不 kill 也不关 stdin——
123
+ * 引用被覆盖后永远无人清理 = 僵尸进程泄漏(最多 MAX_RETRIES 个并存,
124
+ * dispose 也只收尾最后一个)。换代前统一回收:stdin EOF 优雅退出 + kill 兜底。
125
+ * 幂等:已退出(exitCode/signalCode 非 null)的进程跳过。
126
+ */
127
+ killStaleProc() {
128
+ const old = this.proc;
129
+ this.proc = null; // 先摘引用:旧进程随后的 exit 事件走 stale 早退分支
130
+ if (!old || old.exitCode !== null || old.signalCode !== null)
131
+ return;
132
+ try {
133
+ old.stdin?.end();
134
+ }
135
+ catch {
136
+ /* 已关闭则忽略 */
137
+ }
138
+ try {
139
+ old.kill();
140
+ }
141
+ catch {
142
+ /* 已退出则忽略 */
143
+ }
144
+ }
119
145
  spawnAndHandshake() {
120
146
  if (this.disposed)
121
147
  return;
148
+ // V23:重试路径先回收上一个仍存活的子进程(防换代泄漏僵尸进程)
149
+ this.killStaleProc();
122
150
  this.procStartedAt = Date.now();
123
151
  const { python, args, env, cwd } = this.options;
124
152
  const childEnv = { ...process.env, ...env };
@@ -178,6 +206,13 @@ export class LingshuBridge {
178
206
  }
179
207
  });
180
208
  proc.on('exit', (code, signal) => {
209
+ // V23:被换代清理的旧进程退出(this.proc 已指向新一代或为 null)——
210
+ // 不动当前进程的 rl/pending/重试状态机,只留探针;否则旧 exit 会
211
+ // close 新进程的 readline、误拒新进程的挂起请求并多触发一轮重试。
212
+ if (proc !== this.proc) {
213
+ probe(`stale proc exit code=${code} signal=${signal}(换代已回收,不影响当前进程)`);
214
+ return;
215
+ }
181
216
  // 探针:写独立文件记录退出(绕过 DSH 日志系统,便于定位)
182
217
  const uptimeS = this.procStartedAt
183
218
  ? Math.round((Date.now() - this.procStartedAt) / 1000)
package/lib/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ /** 入口分发:argv 为去掉 node 与本脚本路径后的参数。仅导出供测试。 */
3
+ export declare function main(argv: string[]): Promise<number>;
package/lib/cli.js ADDED
@@ -0,0 +1,66 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * cli.ts —— `lingshu` 主命令入口(npx 兼容分发器)
4
+ *
5
+ * 为什么有三个 bin(package.json bin):
6
+ * · `lingshu` → 本文件:`lingshu init` 分发到 init.ts(未来其它子命令也挂这);
7
+ * · `lingshu-init` → lib/init.js:单命令直入(不想敲子命令的场景);
8
+ * · `dsh-memory` → 本文件:npx 的同名匹配规则——`npx @furongjun1999/dsh-memory init`
9
+ * 在包有多个 bin 时,只会自动运行**与包名末段同名**的 bin(npm 官方口径),
10
+ * 缺这个入口 npx 会因「多个 bin 且无同名」直接报错,一键配置命令即失效。
11
+ *
12
+ * 零运行时依赖:只用 Node 内置模块。
13
+ */
14
+ import { resolve } from 'node:path';
15
+ import { pathToFileURL } from 'node:url';
16
+ import { runInit } from './init.js';
17
+ const USAGE = [
18
+ '灵枢(Lingshu)命令行',
19
+ '',
20
+ '用法:lingshu <命令>',
21
+ '',
22
+ '命令:',
23
+ ' init [选项] 一键配置生成器(交互三问;参数齐则跳过问答)',
24
+ ' 选项:--end <dsh|claude|codex|generic> --root <dir> --python <interpreter>',
25
+ '',
26
+ '示例:',
27
+ ' npx @furongjun1999/dsh-memory init',
28
+ ' npx @furongjun1999/dsh-memory init -- --end claude --root D:/mem --python python3',
29
+ ].join('\n');
30
+ /** 入口分发:argv 为去掉 node 与本脚本路径后的参数。仅导出供测试。 */
31
+ export async function main(argv) {
32
+ const cmd = argv[0] ?? '';
33
+ if (cmd === 'init') {
34
+ await runInit(argv.slice(1));
35
+ return 0;
36
+ }
37
+ process.stdout.write(`${USAGE}\n`);
38
+ if (cmd === '--help' || cmd === '-h' || cmd === 'help')
39
+ return 0;
40
+ if (cmd !== '')
41
+ process.stderr.write(`未知命令「${cmd}」。\n`);
42
+ else
43
+ process.stderr.write('缺少命令。\n');
44
+ return 1;
45
+ }
46
+ function isMainEntry() {
47
+ const entry = process.argv[1];
48
+ if (!entry)
49
+ return false;
50
+ try {
51
+ const entryUrl = pathToFileURL(resolve(entry)).href;
52
+ return import.meta.url === entryUrl
53
+ || (process.platform === 'win32' && import.meta.url.toLowerCase() === entryUrl.toLowerCase());
54
+ }
55
+ catch {
56
+ return false;
57
+ }
58
+ }
59
+ if (isMainEntry()) {
60
+ main(process.argv.slice(2))
61
+ .then((code) => { process.exitCode = code; })
62
+ .catch((e) => {
63
+ process.stderr.write(`lingshu:${e instanceof Error ? e.message : String(e)}\n`);
64
+ process.exitCode = 1;
65
+ });
66
+ }
package/lib/index.js CHANGED
@@ -57,7 +57,7 @@ import { MdcgClient } from './lib/mdcg_client.js';
57
57
  import { defaultPython, selfCheckCommand } from './lib/python_path.js';
58
58
  import { describeDataPaths, migrateLegacyData, mdcgRoot, repoRoot } from './lib/datapath.js';
59
59
  // 写入凭据密钥环(首启引导):显式配置 → ~/.mdcg/token → 首启自动签发。
60
- import { resolveToken } from './lib/token_store.js';
60
+ import { auxRoot, defaultKeyringPath, resolveToken } from './lib/token_store.js';
61
61
  /**
62
62
  * 调试探针:记录 apply 失败到独立文件(绕过 DSH 日志系统)。
63
63
  * 路径从用户家目录动态解析(issue #5,与 bridge.ts 同因同修)。
@@ -220,6 +220,12 @@ export async function apply(ctx, config) {
220
220
  + `状态根=${dp.stateRoot},dataRoot=${dp.dataRoot},`
221
221
  + `存在=${dp.mdcgRootExists ? '是' : '否(首次写入将创建)'},`
222
222
  + `用户可改:${dp.pathsFile})`);
223
+ // 辅助根(密钥/令牌/信任/心跳)与记忆真源**有意分离**:身份不随认知图迁移。
224
+ // 但两者分居两处是历史事故的温床(「以为在同一处」),故一并留痕;
225
+ // 想合并/搬走:设 MDCG_AUX_ROOT(md_cg.datapath.aux_root() 同口径)。
226
+ ctx.logger.info(`dsh-memory: 身份/凭据根(aux)= ${auxRoot()}`
227
+ + `(密钥环 ${cred?.keyringPath ?? defaultKeyringPath()};`
228
+ + `与记忆真源分离,可用 MDCG_AUX_ROOT 覆盖)`);
223
229
  // 包管理器装的插件 + 路径配置还在旧包内位置:pnpm 下次更新会把该文件连目录一起
224
230
  // 删除,用户配置随之丢失(回落默认根 → 表现为「记忆不见了」)。只在真的会被删的
225
231
  // 布局下提醒(开发用的 git clone 不含 node_modules 段 → 不打扰)。