@furongjun1999/dsh-memory 0.5.1 → 0.6.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 (187) hide show
  1. package/README.md +588 -552
  2. package/codebuddy/CODEBUDDY.md +10 -10
  3. package/data/policy.json +27 -0
  4. package/docs/discipline/harnesses.yaml +31 -0
  5. package/docs/discipline/templates/full.md.tmpl +1 -1
  6. package/docs/discipline/templates/rules.mdc.tmpl +1 -1
  7. 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
  8. 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
  9. package/docs/eval/DSH/347/253/257/347/274/272/351/231/267/344/270/223/351/241/271_v1.0.md +254 -0
  10. package/docs/eval/N225_/347/264/242/345/274/225/346/227/245/345/277/227/351/235/236/345/257/271/350/261/241/350/243/205/350/275/275/351/235/242/347/261/273/345/236/213/351/227/270_v1.0.md +418 -0
  11. 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
  12. package/docs/eval/issue43_/351/273/230/350/256/244/347/255/226/347/225/245/344/270/216/351/224/256/347/261/273/345/236/213/351/227/270_v1.1.md +441 -0
  13. package/docs/eval/issue43_/351/273/230/350/256/244/347/255/226/347/225/245/345/212/240/350/275/275/344/270/216/345/207/255/346/215/256/346/230/216/346/226/207/351/230/237/345/210/227_v1.0.md +398 -0
  14. package/docs/eval//344/274/230/345/214/226/347/254/254/344/270/200/346/211/271_/346/216/245/347/272/277/344/270/216/347/255/211/344/273/267/345/217/230/346/215/242_v1.0.md +498 -0
  15. package/docs/eval//344/274/230/345/214/226/347/254/254/344/270/211/346/211/271_/351/227/250/347/246/201/350/275/254/346/255/243/344/270/216/350/260/203/345/272/246/346/255/242/350/241/200/344/270/216/351/227/250/346/216/247/346/224/266/345/217/243_v1.0.md +669 -0
  16. package/docs/eval//344/274/230/345/214/226/347/254/254/344/272/214/346/211/271_/344/276/235/350/265/226/351/200/217/344/274/240/344/270/216/345/257/271/346/213/215/345/217/243/345/276/204/344/270/216/350/264/237/347/274/223/345/255/230_v1.0.md +683 -0
  17. 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
  18. package/docs/eval//345/217/221/345/270/20307_/345/244/226/351/203/250/346/212/245/345/221/212/345/233/233/346/211/271/344/277/256/345/244/215/344/270/216/346/217/222/344/273/266/351/235/242/345/212/240/345/233/272_v1.0.md +205 -0
  19. package/docs/eval//346/200/247/350/203/275/344/270/223/351/241/271_/345/206/267/346/237/245/350/257/242/344/270/216/345/206/205/345/255/230_v1.0.md +218 -0
  20. package/docs/eval//346/225/205/351/232/234/346/263/250/345/205/245/345/256/236/346/265/213_v1.0.md +10 -0
  21. package/docs/eval//347/274/226/347/240/201/351/235/242/345/211/215/347/275/256_/345/205/245/345/217/243/350/207/252/344/277/235/350/257/201UTF8/344/270/216/346/226/207/346/234/254open/345/256/210/345/215/253_v1.0.md +646 -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_v18.md +183 -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_v19.md +207 -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_v20.md +283 -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_v21.md +224 -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_v22.md +223 -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_v23.md +293 -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_v24.md +303 -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_v25.md +230 -0
  30. 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 +20 -0
  31. 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 +1 -1
  32. package/docs/mdcg/README/350/257/246/347/273/206/347/211/210_v0.4.10.md +12 -0
  33. 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
  34. package/docs/mdcg//345/217/221/345/270/203/351/227/250/347/246/201/351/223/276_v0.1.md +21 -9
  35. 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 +7 -2
  36. 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 +39 -3
  37. package/docs/plans//345/205/250/344/270/255/346/226/207/347/274/226/347/240/201/344/270/216/350/234/202/345/267/242/344/273/273/345/212/241/346/240/207/350/257/206/345/245/221/347/272/246_v2.0.md +220 -0
  38. package/docs/plans//347/234/237/346/272/220/347/264/242/345/274/225_/351/200/232/347/224/250/346/234/272/345/210/266_v0.3.md +227 -0
  39. package/docs/plans//350/234/202/345/267/242/346/250/241/345/236/213/345/257/206/351/222/245/351/205/215/347/275/256/351/235/242_v1.0.md +385 -0
  40. 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 +460 -460
  41. package/dsh/cordis-patch-profile-web.example.yml +35 -0
  42. package/lib/bridge.js +24 -2
  43. package/lib/cli.d.ts +3 -0
  44. package/lib/cli.js +66 -0
  45. package/lib/hooks.d.ts +31 -2
  46. package/lib/hooks.js +219 -16
  47. package/lib/init.d.ts +88 -0
  48. package/lib/init.js +302 -0
  49. package/lib/lib/prompt_safety.d.ts +52 -1
  50. package/lib/lib/prompt_safety.js +76 -1
  51. package/md_cg/audit.py +652 -379
  52. package/md_cg/bench6_arms.py +1 -1
  53. package/md_cg/bench_p0.py +1 -1
  54. package/md_cg/branches.py +2 -2
  55. package/md_cg/ccgc.py +1071 -1006
  56. package/md_cg/chain.py +1 -1
  57. package/md_cg/consistency.py +97 -9
  58. package/md_cg/consolidate.py +34 -9
  59. package/md_cg/crypto.py +59 -26
  60. package/md_cg/docindex.py +16 -1
  61. package/md_cg/evidence.py +585 -582
  62. package/md_cg/evolution.py +17 -1
  63. package/md_cg/export.py +1 -1
  64. package/md_cg/forgetting.py +309 -13
  65. package/md_cg/fsutil.py +454 -8
  66. package/md_cg/identity.py +3 -3
  67. package/md_cg/insight.py +24 -3
  68. package/md_cg/linkref.py +1 -1
  69. package/md_cg/logref.py +327 -0
  70. package/md_cg/mcp_server.py +4152 -3818
  71. package/md_cg/mdcg.py +4208 -3462
  72. package/md_cg/mdcos.py +4491 -4137
  73. package/md_cg/mreview/pipeline.py +15 -1
  74. package/md_cg/nodefile.py +639 -575
  75. package/md_cg/protect.py +158 -11
  76. package/md_cg/protocol.py +41 -2
  77. package/md_cg/provenance.py +22 -4
  78. package/md_cg/reach.py +4 -4
  79. package/md_cg/readcache.py +76 -15
  80. package/md_cg/reconcile.py +1 -1
  81. package/md_cg/refindex.py +246 -37
  82. package/md_cg/refine.py +1 -1
  83. package/md_cg/review_cli.py +49 -4
  84. package/md_cg/routing.py +32 -5
  85. package/md_cg/run_tests.py +17 -0
  86. package/md_cg/scrub.py +30 -3
  87. package/md_cg/security.py +47 -1
  88. package/md_cg/self_state.py +5 -5
  89. package/md_cg/sources.py +23 -6
  90. package/md_cg/srcindex.py +352 -0
  91. package/md_cg/stg.py +47 -3
  92. package/md_cg/subgraph.py +2 -2
  93. package/md_cg/sustain.py +1299 -1168
  94. package/md_cg/tasks.py +469 -470
  95. package/md_cg/test_b1_auto_id_multiproc.py +277 -0
  96. package/md_cg/test_b1b2_write_face.py +417 -0
  97. package/md_cg/test_b2_sensitivity_landing.py +223 -0
  98. package/md_cg/test_b3_merge_keeps_content.py +576 -0
  99. package/md_cg/test_b4_shard_dir_selfheal.py +843 -0
  100. package/md_cg/test_b4_shard_dir_selfheal_guard.py +238 -0
  101. package/md_cg/test_c3_transient_read_negative.py +793 -0
  102. package/md_cg/test_c8_search_rrf_gates.py +502 -0
  103. package/md_cg/test_ccg_form_parity.py +188 -0
  104. package/md_cg/test_ccgc.py +28 -3
  105. package/md_cg/test_govern_directread.py +17 -4
  106. package/md_cg/test_h2_session_view_norm.py +233 -0
  107. package/md_cg/test_h4_sustain_snapshot.py +1377 -0
  108. package/md_cg/test_hive_ingest.py +285 -285
  109. package/md_cg/test_index_crossprocess_reload.py +301 -0
  110. package/md_cg/test_issue39_utf8_stdio.py +307 -16
  111. package/md_cg/test_issue43_default_policy.py +865 -0
  112. package/md_cg/test_legacy_p3_node_id_type.py +375 -0
  113. package/md_cg/test_linkref.py +10 -3
  114. package/md_cg/test_lock.py +2 -2
  115. package/md_cg/test_logref.py +1109 -0
  116. package/md_cg/test_m3_h9_bucket_health_protect_mark.py +301 -0
  117. package/md_cg/test_m3_h9_semantic_guard.py +525 -0
  118. package/md_cg/test_mr_m2.py +15 -3
  119. package/md_cg/test_n130_verify_falsified_protect.py +1 -1
  120. package/md_cg/test_n139_dek_provision_failclosed.py +185 -0
  121. package/md_cg/test_n176_link_trust.py +221 -0
  122. package/md_cg/test_n178_units_jobid_gate.py +212 -0
  123. package/md_cg/test_n184_keys_concurrent_provision.py +307 -0
  124. package/md_cg/test_n195_writepath_reload.py +283 -0
  125. package/md_cg/test_n196_stale_gate_skip.py +169 -0
  126. package/md_cg/test_n197_n208_write_face_gates.py +471 -0
  127. package/md_cg/test_n198_tokens_corrupt_failclosed.py +225 -0
  128. package/md_cg/test_n199_tokens_concurrent_write.py +378 -0
  129. package/md_cg/test_n201_proposal_visibility.py +382 -0
  130. package/md_cg/test_n202_session_notes_visibility.py +461 -0
  131. package/md_cg/test_n204_n205_n226_n227_n228_n229_exit_gates.py +542 -0
  132. package/md_cg/test_n206_stdio_jsonrpc_type.py +403 -0
  133. package/md_cg/test_n209_verify_write_face_gates.py +461 -0
  134. package/md_cg/test_n212_n213_n224_generation_gates.py +513 -0
  135. package/md_cg/test_n214_n215_n221_n222_write_face_gates.py +563 -0
  136. package/md_cg/test_n225_nonobject_load.py +1110 -0
  137. package/md_cg/test_n62_tenant_bind_failclosed.py +200 -0
  138. package/md_cg/test_neg_condition_hits.py +333 -0
  139. package/md_cg/test_neg_tail_honesty.py +663 -0
  140. package/md_cg/test_none_id_write_guard.py +166 -0
  141. package/md_cg/test_opt_batch1_md_cg.py +451 -0
  142. package/md_cg/test_p1.py +5 -5
  143. package/md_cg/test_p11_consistency.py +161 -12
  144. package/md_cg/test_p26_refindex.py +2 -2
  145. package/md_cg/test_p27_docindex.py +777 -774
  146. package/md_cg/test_p28_refcheck.py +740 -13
  147. package/md_cg/test_p29_session_ingest_export.py +2 -2
  148. package/md_cg/test_p2_mcp.py +12 -1
  149. package/md_cg/test_p30_maintain.py +33 -2
  150. package/md_cg/test_p31_insight.py +1 -0
  151. package/md_cg/test_p9c_dedup_hints.py +276 -0
  152. package/md_cg/test_policy_required_ccg.py +426 -0
  153. package/md_cg/test_protocol.py +22 -0
  154. package/md_cg/test_rank_parity_score_mode.py +516 -0
  155. package/md_cg/test_read_face_input_gates.py +363 -0
  156. package/md_cg/test_read_face_semantics.py +489 -0
  157. package/md_cg/test_recall_face_guards.py +812 -0
  158. package/md_cg/test_rejected_credential_forms.py +188 -0
  159. package/md_cg/test_rejected_redact.py +146 -0
  160. package/md_cg/test_retr_s1b.py +2 -2
  161. package/md_cg/test_retr_s5.py +20 -7
  162. package/md_cg/test_review_cli_attribution.py +177 -0
  163. package/md_cg/test_review_cli_visibility.py +235 -0
  164. package/md_cg/test_review_conformance.py +21 -3
  165. package/md_cg/test_security_audit_v21.py +2 -2
  166. package/md_cg/test_server_version.py +67 -0
  167. package/md_cg/test_srcindex.py +171 -0
  168. package/md_cg/test_tenant_env_override_warn.py +63 -50
  169. package/md_cg/test_token_lowercase_form.py +315 -0
  170. package/md_cg/test_v21r1_package_version.py +310 -0
  171. package/md_cg/test_writepipe.py +10 -4
  172. package/md_cg/tokens.py +225 -95
  173. package/md_cg/tool_face.py +4 -4
  174. package/md_cg/trust.py +49 -5
  175. package/md_cg/units.py +204 -6
  176. package/md_cg/weights.py +4 -4
  177. package/md_cg/whitebox_kb/wisdom/knowledge_points.py +1 -1
  178. package/md_cg/writelimit.py +42 -8
  179. package/md_cg/writepipe.py +651 -554
  180. package/package.json +8 -2
  181. package/skills/plugin.json +1 -1
  182. package/src/bridge.ts +25 -2
  183. package/src/cli.ts +65 -0
  184. package/src/hooks.ts +229 -16
  185. package/src/init.ts +361 -0
  186. package/src/lib/prompt_safety.ts +88 -1
  187. package/zcode/AGENTS.md +10 -10
@@ -2,11 +2,11 @@
2
2
 
3
3
  > 本文件由 `scripts/render_discipline.py` 从真源
4
4
  > `docs/工作纪律_认知图条目_v1.1.json` 渲染生成,**请勿手改**;改真源后重跑渲染。
5
- > 真源指纹(SHA256 前16位):26bff32d73644699
5
+ > 真源指纹(SHA256 前16位):e1e9112a409894aa
6
6
 
7
7
  ## 概述
8
8
 
9
- 工作纪律集: 4条方法论(理论先行/全面处理/白箱方法/根因) + 3条执行(验证/双副本/兜底) + 1条思考(中文思考/协作模式分级) + 1条保密(敏感信息隔离) + 3条图像线(选源护栏/历史查询优先/算法权威唯一) + 1条协作(访谈澄清:先问清再动手) + 1条合规(内容政策合规:公开产物过内容政策+隐私双清单) + 2条执行调度与运行环境(命令执行统一走python/UTF-8: 显式encoding+PYTHONUTF8=1, 规避GBK; 任务派发统一走蜂巢: 任何执行性任务经蜂巢spawn/submit执行并留痕, agent本体只做编排, L1出口=产物落点为只读判定(不改仓库/外部状态)可直跑须留痕) + 1条记忆闭环(任务收尾归档:每次任务执行完只将核心修改(内容/原因/位置/验证结论)按CCG六要素(功能名/生效条件/子功能/执行/验证方式/不适用条件)成文存入灵枢记忆, 不写中间过程) + 1条信息获取(工作区索引优先: 查工作区文件先读 WORKSPACE_INDEX.md(仓根, 由 scripts/workspace_index.py 从 git 追踪面管线生成), 尚无则先跑 --write 生成再读, 不以重复全盘浏览代替; 索引是会陈化的手工件, 故须管线生成+机械守卫, 否则退化为误导源)
9
+ 工作纪律集: 4条方法论(理论先行/全面处理/白箱方法/根因) + 3条执行(验证/双副本/兜底) + 1条思考(中文思考/协作模式分级) + 1条保密(敏感信息隔离) + 3条图像线(选源护栏/历史查询优先/算法权威唯一) + 1条协作(访谈澄清:先问清再动手) + 1条合规(内容政策合规:公开产物过内容政策+隐私双清单) + 2条执行调度与运行环境(命令执行统一走python/UTF-8: 显式encoding+PYTHONUTF8=1, 规避GBK, 全仓文本与路径一律UTF-8(无BOM, 中文可进路径), 不做控制台兼容(取用走python); 任务派发统一走蜂巢: 任何执行性任务经蜂巢spawn/submit执行并留痕, agent本体只做编排, L1出口=产物落点为只读判定(不改仓库/外部状态)可直跑须留痕) + 1条记忆闭环(任务收尾归档:每次任务执行完只将核心修改(内容/原因/位置/验证结论)按CCG六要素(功能名/生效条件/子功能/执行/验证方式/不适用条件)成文存入灵枢记忆, 不写中间过程; text 类缺要素即被写入闸门拒并当场返回缺失清单) + 1条信息获取(工作区索引优先: 查工作区文件先读 WORKSPACE_INDEX.md(仓根, 由 scripts/workspace_index.py 从 git 追踪面管线生成), 尚无则先跑 --write 生成再读, 不以重复全盘浏览代替; 索引是会陈化的手工件, 故须管线生成+机械守卫, 否则退化为误导源)
10
10
 
11
11
  ## 执行公约
12
12
 
@@ -121,16 +121,16 @@
121
121
  ### 15. 命令执行统一走python
122
122
 
123
123
  - **触发**:执行命令|运行测试/脚本|跨进程读写文本
124
- - **动作**:构造 argv 列表→subprocess.run(capture_output=True, text=True, encoding='utf-8', errors='replace')→env 带 PYTHONUTF8=1→shell=False
125
- - **不适用**:IDE 内置工具直调|无跨进程的纯内存计算
126
- - **声明**:按工作纪律第15条: 命令执行统一走python——argv列表+显式UTF-8+PYTHONUTF8=1, 不经Windows shell, 规避GBK解码异常。
124
+ - **动作**:构造 argv 列表→subprocess.run(capture_output=True, text=True, encoding='utf-8', errors='replace')→env 带 PYTHONUTF8=1→shell=False;边界判据=本次调用是否产出非UTF-8字节流(纯MSYS工具与不起进程的内置工具豁免;原生Windows程序不豁免,须python包装或显式解码)
125
+ - **不适用**:IDE内置工具直调(判据=本次调用是否产出非UTF-8字节流;不起进程的内置工具(Read/Write/Edit/Grep/Glob/WebFetch)与纯MSYS工具(grep/ls/sed)归入本豁免;拉起shell且执行原生Windows程序者(taskkill/wmic/npm.cmd/cargo/where)不属本豁免,仍须python包装或对输出显式解码;2026-09-28使用者裁定)|无跨进程的纯内存计算
126
+ - **声明**:按工作纪律第15条: 命令执行统一走python——argv列表+显式UTF-8+PYTHONUTF8=1, 不经Windows shell, 规避GBK解码异常。 另: 全仓文本与路径/文件名一律UTF-8(中文可进路径), 不做控制台兼容(取用走python, 控制台乱码属显示层)。
127
127
 
128
128
  ### 16. 任务收尾归档(记忆闭环)
129
129
 
130
130
  - **触发**:任务执行完成|修改落地后|交付后
131
- - **动作**:任务收尾→提炼核心修改(内容/原因/位置/验证结论四要素, 不写中间过程/试错/调试/重复确认)→按 CCG 六要素成文(# 功能名/# 生效条件/# 子功能/# 执行/# 验证方式/# 不适用条件 六行缺一不可, 与正文四要素并置)→写入灵枢记忆(认知图/MCP memory)→读回确认(写入后发起一次读取查询确认写入成功且可检索)→标注关联条目+更新 subgraph/depends_on
131
+ - **动作**:任务收尾→提炼核心修改(内容/原因/位置/验证结论四要素, 不写中间过程/试错/调试/重复确认)→按 CCG 六要素成文(# 功能名/# 生效条件/# 子功能/# 执行/# 验证方式/# 不适用条件 六行缺一不可, 与正文四要素并置)→写入灵枢记忆(认知图/MCP memory)——text 类缺要素即被写入闸门拒(REJECT, 当场返回缺失清单, 不是重试无用), 按清单补齐后重写即可→读回确认(写入后发起一次读取查询确认写入成功且可检索)→标注关联条目+更新 subgraph/depends_on
132
132
  - **不适用**:情感交互|闲聊|纯查询无改动
133
- - **声明**:按工作纪律第16条: 任务收尾归档——每次任务执行完只提炼核心修改(内容/原因/位置/验证结论)并按 CCG 六要素(功能名/生效条件/子功能/执行/验证方式/不适用条件)成文存入灵枢记忆, 写入后发起一次读取查询确认写入成功且可检索, 禁写中间过程/试错/调试等无效信息, 与第2条形成「查记忆→执行→写记忆→读回确认」闭环。
133
+ - **声明**:按工作纪律第16条: 任务收尾归档——每次任务执行完只提炼核心修改(内容/原因/位置/验证结论)并按 CCG 六要素(功能名/生效条件/子功能/执行/验证方式/不适用条件)成文存入灵枢记忆(text 类六要素缺失会被写入闸门当场拒绝并返回缺失清单——补齐后重写即可, 不必等读回确认才发现), 写入后发起一次读取查询确认写入成功且可检索, 禁写中间过程/试错/调试等无效信息, 与第2条形成「查记忆→执行→写记忆→读回确认」闭环。
134
134
 
135
135
  ### 17. 任务派发统一走蜂巢
136
136
 
@@ -164,8 +164,8 @@
164
164
  | 12 | 按工作纪律第12条: 算法权威唯一(线稿=darkline.py/色块=contour_semantics)——选算法查文档, 勿临时切换/漂移; 换算法须记录+更新文档。 |
165
165
  | 13 | 按工作纪律第13条: 访谈澄清——先提问确认要做什么,逐轮问到完全清楚才动手;事实自查,决策归使用者,不完全清楚不固化。 |
166
166
  | 14 | 按工作纪律第14条: 内容政策合规——对外公开产物必须过「内容政策+隐私」双清单,过滤在生成阶段做;已发布发现违规要删条+重写git历史+通知平台清缓存。 |
167
- | 15 | 按工作纪律第15条: 命令执行统一走python——argv列表+显式UTF-8+PYTHONUTF8=1, 不经Windows shell, 规避GBK解码异常。 |
168
- | 16 | 按工作纪律第16条: 任务收尾归档——每次任务执行完只提炼核心修改(内容/原因/位置/验证结论)并按 CCG 六要素(功能名/生效条件/子功能/执行/验证方式/不适用条件)成文存入灵枢记忆, 写入后发起一次读取查询确认写入成功且可检索, 禁写中间过程/试错/调试等无效信息, 与第2条形成「查记忆→执行→写记忆→读回确认」闭环。 |
167
+ | 15 | 按工作纪律第15条: 命令执行统一走python——argv列表+显式UTF-8+PYTHONUTF8=1, 不经Windows shell, 规避GBK解码异常。 另: 全仓文本与路径/文件名一律UTF-8(中文可进路径), 不做控制台兼容(取用走python, 控制台乱码属显示层)。 |
168
+ | 16 | 按工作纪律第16条: 任务收尾归档——每次任务执行完只提炼核心修改(内容/原因/位置/验证结论)并按 CCG 六要素(功能名/生效条件/子功能/执行/验证方式/不适用条件)成文存入灵枢记忆(text 类六要素缺失会被写入闸门当场拒绝并返回缺失清单——补齐后重写即可, 不必等读回确认才发现), 写入后发起一次读取查询确认写入成功且可检索, 禁写中间过程/试错/调试等无效信息, 与第2条形成「查记忆→执行→写记忆→读回确认」闭环。 |
169
169
  | 17 | 按工作纪律第17条: 任务派发统一走蜂巢——任何执行性任务经蜂巢 spawn/submit 执行并留痕(spec/status/result), agent本体只做编排; 宿主自带subagent/team不是等价通道, 兜底须声明。L1只读判定(产物落点=不改仓库/外部状态)可直跑, 须输出「L1 直跑:<命令> — 风险/频次/可逆性」留痕。 |
170
170
  | 18 | 按工作纪律第18条: 工作区索引优先——查工作区文件先读 WORKSPACE_INDEX.md(仓根, 管线生成); 无则先跑 scripts/workspace_index.py --write 生成再读, 不以重复全盘浏览代替。 |
171
171
 
@@ -188,7 +188,7 @@
188
188
 
189
189
  三条调用铁律:
190
190
  1. **`op` 必填**——漏传会触发参数签名推导兜底(返回标记 `op_derived: true`),复杂任务中也必须显式传,防静默执行错误意图。
191
- 2. **返回 `moved_to: "review_queue"` / `verdict: DEFER/REJECT` 时不要重试**——这是校验闸门的正常行为(返回自带 `hint` 说明),重试同样结果;落盘须由设计者权限(can_admin)经 `op=review` 裁决(decision=accept/reject/edit/merge/noop,本机工具:`python scripts/review_cli.py list`),agent 端无裁决权是设计(写入者不得自裁自决),转告使用者即可。
191
+ 2. **返回 `moved_to: "review_queue"` / `verdict: DEFER` 时不要重试**——这是校验闸门的正常行为(返回自带 `hint` 说明下一步);落盘须经裁决(`op=review` 的 `decision=accept/reject/edit/merge/noop`,本机工具:`python scripts/review_cli.py list`)。**裁决权(2026-09-28 使用者裁定)**:写入者不得自裁——不得自己写、自己判、无复核一路到底;**经蜂群或验证端复核后,agent 可自行执行裁决**,不必每次转告使用者。**三类例外不适用该授权,必须转交使用者并止步**:①不适用于智能论这类重要协议真源的修改;②不适用于向外部发送信息和数据;③不适用于可能造成信息泄露/病毒/恶意操纵的动作。**`verdict: REJECT` 分两类,处置相反**:① 命中禁止规则(内容政策违规)→ 内容本身不该入库,重试同样结果;② 缺必需要素(`text` 类缺 CCG 六要素)→ **可修正**,按 `verdict.evidence` / `verdict.detail.missing` 给出的**完整缺失清单**补齐六要素后**重写**即落盘(本条未入库、已记入负记忆)——不要把它当「闸门故障」或「重试无用」。
192
192
  3. `stg` 同理经 `op` 分发(`timeline` / `relation` / `anchors` 等)。
193
193
 
194
194
  ## 收尾强制流程(任务完成时不可跳过)
@@ -0,0 +1,27 @@
1
+ {
2
+ "_comment": "灵枢写入审核策略(合规 + 纪律)。由 md_cg/audit.py:load_rulebook() 经 MDCG_POLICY_FILE 读取。forbidden=命中即 REJECT(禁止写入,对所有 content_kind 生效);required=缺失即 REJECT(必需要素,默认对所有 kind 生效,可由 required_kinds 收窄到指定 kind)。两者全空则 text 类写入恒判 DEFER('无规则不能假装合规')。required 缺失时返回体如实列出全部缺失项并记入负记忆(rejected),补齐后重写即可——不是重试无用。",
3
+ "_note": "本文件只放**高精度**模式——宁可漏报也不误伤正常记忆。长 hex(git SHA)等易误伤的模式刻意不收。`tk_[0-9a-f]{8,}` 是灵枢令牌 id 形态(2026-09-28 增,使用者裁定):令牌 id 本身即凭据,正文里出现即视为凭据入库——此前一批归档实测有一条明文令牌正是因缺此模式而过了闸(仓库发版门禁 check_publish_artifact 早有同类 TOKEN_MDCG 规则,写入闸门此前没有),补上后「凭据不入库」在写入当刻才真正成立;不误伤 `tk_fake`/`tk_zzzz` 一类非 hex 哑值。required 当前收窄到 text 类(required_kinds=['text']):六要素是「归档写入成文格式」的要求,work_wip 等过程性内容不受此约束,但 forbidden 仍对其生效。required_labels 与去空后的 required 一一对应,仅用于报错展示(写入返回的缺失清单),不影响判定;该键缺失或与 required 长度不一致时回落显示正则串本身。**形态口径(2026-09-28 收单点)**:必需正则 `^#\\s*<要素名>` **不要求冒号**——`# 生效条件:<值>` 与 `# 生效条件` 后换行接值两种形态都算已声明;检索面判据 `md_cg/nodefile.py::ccg_mark_present`(及其取值面 `ccg_field_value`)已与本文件**同一正则语义**。此前检索面要求冒号,致无冒号归档过闸后被判 BLINDSPOT(存量实测 88 件,收单点后复扫不一致 = 0)。另注:二级标题 `## <要素名>` 与缩进标题两侧**同判不认**——这是与正则一致的边界,非疏漏。**全形态令牌(2026-09-28 增,PR#44 复核时补)**:`mdcg1\\.[A-Za-z0-9._\\-]{20,}`—— 令牌是 `mdcg1.<role>.<id>.<secret>`(tokens.make_token);只禁 id 段会让「id 命中而 role/密钥段落进负记忆」:负记忆脱敏按命中片段替换,掩掉 id 却留着密钥段。本条与发布门禁 `check_publish_artifact` 的 TOKEN_MDCG **同一口径**(写入闸门此前没有 = 两闸分叉)。注意:写入闸门**不做**发布闸那种占位符豁免(那是「红着等于没门禁」的取舍),故正文里连示例令牌也会被拒——写格式请用泛形 `mdcg1.<role>.<id>.<secret>`(尖括号不在字符类内,不命中)。调整规则只需改本文件,无需改代码。**受理面口径(2026-09-28 同日裁定「不认大写,统一只认小写」)**:`md_cg/tokens.py::parse_token` 对 role/token_id 拒收含大写者(不再 `role.lower()` 静默归一),故本表两条令牌规则**有意**保持窄形态(`[0-9a-f]`、不带 `(?i)`)——识别面宽是为了拦得住,受理面窄是为了说得准,两面组合后不存在「检测漏 + 受理收」的缝隙。若日后要把本表改成大小写不敏感,须先确认受理面仍拒大写,否则窄形态会变成误报源,而大写 hex id 反而成了可用凭据。守卫:`md_cg/test_token_lowercase_form.py`(36 断言,`--head-baseline` 红基线 11 红)。**同日补裁(三面口径)**:使用者裁定「已有测试把大写归一当预期行为。大写也转小写识别,以后写统一小写,现有的大写内容就不动了」——故**入参面**(角色/单元名 role=、as_unit=)继续允许大写并归一小写(凭据=存量断言 `test_p46_unit_scope.py` 的 C2),**令牌字符串面**照旧拒大写(本表两条规则保持窄形态即以此成立),**写面**以后一律小写形态,**存量大写内容不迁移**;两者差异是有意的,G8 组把三面一并钉死,勿「统一」掉。",
4
+ "forbidden": [
5
+ "-----BEGIN [A-Z ]*PRIVATE KEY-----",
6
+ "\\bsk-[A-Za-z0-9_\\-]{20,}",
7
+ "\\bAKIA[0-9A-Z]{16}\\b",
8
+ "\\bgh[pousr]_[A-Za-z0-9]{20,}\\b",
9
+ "(?i)\\bapi[_-]?key\\s*[:=]\\s*[A-Za-z0-9_\\-]{16,}",
10
+ "(?i)\\b(app[_-]?secret|appsecret|client[_-]?secret|secret[_-]?key|access[_-]?key)\\s*[:=]?\\s*[A-Za-z0-9]{16,}",
11
+ "(?i)\\b(password|passwd|pwd|密码|口令)\\s*[:=:]\\s*\\S{6,}",
12
+ "(?i)\\bBearer\\s+[A-Za-z0-9._\\-]{20,}",
13
+ "[a-z][a-z0-9+.\\-]*://[^/\\s:@]+:[^/\\s@]+@",
14
+ "\\btk_[0-9a-f]{8,}\\b",
15
+ "mdcg1\\.[A-Za-z0-9._\\-]{20,}"
16
+ ],
17
+ "required": [
18
+ "(?m)^#\\s*功能名",
19
+ "(?m)^#\\s*生效条件",
20
+ "(?m)^#\\s*子功能",
21
+ "(?m)^#\\s*执行",
22
+ "(?m)^#\\s*验证方式",
23
+ "(?m)^#\\s*不适用条件"
24
+ ],
25
+ "required_kinds": ["text"],
26
+ "required_labels": ["功能名", "生效条件", "子功能", "执行", "验证方式", "不适用条件"]
27
+ }
@@ -45,6 +45,11 @@ injection:
45
45
  codebuddy-session: [CODEBUDDY.md, AGENTS.md]
46
46
  codebuddy-rules: [RULE.mdc]
47
47
  zcode-session: [AGENTS.md]
48
+ # 用户级槽位(2026-09-28 登记):ZCode 除「工作区级 <repo>/AGENTS.md」外还读**用户级**
49
+ # ~/.zcode/AGENTS.md(对所有工作目录生效)。该件落在仓外用户目录,**不参与本仓祖先链
50
+ # 发现**(链终点不在它上面,probe 命中只报告不判失败);但与 zcode-session 同槽同名,
51
+ # 故在此显式声明,供发现面报告「同一启动目录下并存的竞争件」。
52
+ zcode-user-session: [AGENTS.md]
48
53
  codex-session: [AGENTS.md]
49
54
  claude-session: [CLAUDE.md]
50
55
  plugin-skill: [SKILL.md]
@@ -137,6 +142,32 @@ targets:
137
142
  ZCode 读项目根 AGENTS.md。本仓产物落 zcode/AGENTS.md(不落根,避免与
138
143
  CodeBuddy 的 CODEBUDDY.md 及本地 AGENTS.md 冲突);复制到项目根生效。
139
144
 
145
+ # —— 用户级注入件(仓外:用户目录):**指针形态**,只校验不渲染 ——
146
+ # 为什么 render: false:本件是「指针」而非纪律本体——正文只有「当工作目录是本仓时先读
147
+ # <repo>/zcode/AGENTS.md 取纪律本体」+ 执行公约摘要,**不含任何条款正文** ⇒ 不可能与
148
+ # 真源漂移;若用 full/compact 模板渲染,会把整份纪律正文复制进**用户全局**注入面
149
+ # (对非本仓的其它项目也生效),且每次改真源都要重渲染用户目录文件——得不偿失。
150
+ # 为什么仍给判据:`pointer: true` 触发判据侧的三条指针检查(指向面 / 陈化面 / 工具名随端),
151
+ # 见 verify_discipline.check——无守卫的手工件必然漂移(20260916 codebuddy-local 实例)。
152
+ zcode-user:
153
+ enabled: true
154
+ render: false
155
+ pointer: true
156
+ # 指针须指向的纪律本体(相对仓库根)——判据侧按此值查「指向面」,故路径只有这一处声明
157
+ pointer_body: zcode/AGENTS.md
158
+ transport: file
159
+ slot: zcode-user-session
160
+ path: ~/.zcode/AGENTS.md
161
+ format: markdown
162
+ preserve: true
163
+ memory: mcp/mdcg (cg,stg) · mcp/hive (蜂巢并发:spawn/poll/kill/doctor)
164
+ note: >-
165
+ ZCode 的**用户级**指令件(对所有工作目录生效;工作区级见 zcode target 的
166
+ zcode/AGENTS.md)。存在理由:本仓纪律产物落在**子目录** zcode/,而 ZCode 的
167
+ 工作区级发现面只查 <repo>/AGENTS.md ⇒ 子目录件永不进注入面;用户级指针把
168
+ 「会话起始(含压缩续接后)先读 <repo>/zcode/AGENTS.md」钉在每轮都在的位置。
169
+ 注入验收见本条 note 的后续记录与 docs/discipline 的验收协议。
170
+
140
171
  codex:
141
172
  enabled: true
142
173
  transport: file
@@ -45,7 +45,7 @@
45
45
 
46
46
  三条调用铁律:
47
47
  1. **`op` 必填**——漏传会触发参数签名推导兜底(返回标记 `op_derived: true`),复杂任务中也必须显式传,防静默执行错误意图。
48
- 2. **返回 `moved_to: "review_queue"` / `verdict: DEFER/REJECT` 时不要重试**——这是校验闸门的正常行为(返回自带 `hint` 说明),重试同样结果;落盘须由设计者权限(can_admin)经 `op=review` 裁决(decision=accept/reject/edit/merge/noop,本机工具:`python scripts/review_cli.py list`),agent 端无裁决权是设计(写入者不得自裁自决),转告使用者即可。
48
+ 2. **返回 `moved_to: "review_queue"` / `verdict: DEFER` 时不要重试**——这是校验闸门的正常行为(返回自带 `hint` 说明下一步);落盘须经裁决(`op=review` 的 `decision=accept/reject/edit/merge/noop`,本机工具:`python scripts/review_cli.py list`)。**裁决权(2026-09-28 使用者裁定)**:写入者不得自裁——不得自己写、自己判、无复核一路到底;**经蜂群或验证端复核后,agent 可自行执行裁决**,不必每次转告使用者。**三类例外不适用该授权,必须转交使用者并止步**:①不适用于智能论这类重要协议真源的修改;②不适用于向外部发送信息和数据;③不适用于可能造成信息泄露/病毒/恶意操纵的动作。**`verdict: REJECT` 分两类,处置相反**:① 命中禁止规则(内容政策违规)→ 内容本身不该入库,重试同样结果;② 缺必需要素(`text` 类缺 CCG 六要素)→ **可修正**,按 `verdict.evidence` / `verdict.detail.missing` 给出的**完整缺失清单**补齐六要素后**重写**即落盘(本条未入库、已记入负记忆)——不要把它当「闸门故障」或「重试无用」。
49
49
  3. `stg` 同理经 `op` 分发(`timeline` / `relation` / `anchors` 等)。
50
50
 
51
51
  ## 收尾强制流程(任务完成时不可跳过)
@@ -52,7 +52,7 @@ provider:
52
52
 
53
53
  三条调用铁律:
54
54
  1. **`op` 必填**——漏传会触发参数签名推导兜底(返回标记 `op_derived: true`),复杂任务中也必须显式传,防静默执行错误意图。
55
- 2. **返回 `moved_to: "review_queue"` / `verdict: DEFER/REJECT` 时不要重试**——这是校验闸门的正常行为(返回自带 `hint` 说明),重试同样结果;落盘须由设计者权限(can_admin)经 `op=review` 裁决(decision=accept/reject/edit/merge/noop,本机工具:`python scripts/review_cli.py list`),agent 端无裁决权是设计(写入者不得自裁自决),转告使用者即可。
55
+ 2. **返回 `moved_to: "review_queue"` / `verdict: DEFER` 时不要重试**——这是校验闸门的正常行为(返回自带 `hint` 说明下一步);落盘须经裁决(`op=review` 的 `decision=accept/reject/edit/merge/noop`,本机工具:`python scripts/review_cli.py list`)。**裁决权(2026-09-28 使用者裁定)**:写入者不得自裁——不得自己写、自己判、无复核一路到底;**经蜂群或验证端复核后,agent 可自行执行裁决**,不必每次转告使用者。**三类例外不适用该授权,必须转交使用者并止步**:①不适用于智能论这类重要协议真源的修改;②不适用于向外部发送信息和数据;③不适用于可能造成信息泄露/病毒/恶意操纵的动作。**`verdict: REJECT` 分两类,处置相反**:① 命中禁止规则(内容政策违规)→ 内容本身不该入库,重试同样结果;② 缺必需要素(`text` 类缺 CCG 六要素)→ **可修正**,按 `verdict.evidence` / `verdict.detail.missing` 给出的**完整缺失清单**补齐六要素后**重写**即落盘(本条未入库、已记入负记忆)——不要把它当「闸门故障」或「重试无用」。
56
56
  3. `stg` 同理经 `op` 分发(`timeline` / `relation` / `anchors` 等)。
57
57
 
58
58
  ## 收尾强制流程(任务完成时不可跳过)
@@ -0,0 +1,248 @@
1
+ # DSH 日志索引 v2 报告(参考 dsh-TUI)v1.0
2
+
3
+ - **日期**:2026-09-27
4
+ - **对象**:`scripts/dsh_log_index.py` 工作树当前版(git status 仅此一个 M 文件,相对 HEAD `014bad50` 的改动未提交,编排会话负责 commit)及其 `dsh-log-` 检索面
5
+ - **前置版本**:`docs/eval/DSH日志索引效果验证_v1.0.md`(对应 HEAD `014bad50` 形态:private 会话绑定、turn 整体成章、「两类+静默跳过」,下称 v1.0 报告)
6
+ - **参照项目**:`ccch1mneyyy/dsh-TUI`(gh api 可读),参照面 = `src/adapter/channel/session-projection.ts` 的 `KNOWN_DSH_EVENT_TYPES`
7
+ - **材料来源标注**:本文实测记录分两类——**【实现会话实测】**指本批次改码/验证会话实跑(逐项改动的红绿腿、临时库摄取、四查询回查;本撰写会话按隐私纪律不重复触达私有会话根与私有数据,未重跑);**【撰写会话实跑】**指本报告撰写会话本轮实跑复核。凡撰写会话未重跑的检查逐处如实标注,不冒充为本会话实跑。
8
+ - **隐私**:全文不含 DSH 会话日志正文原文;只含统计/计数/节点 id/章节标题(turn·k/N 结构形态)/布尔命中;查询词为纪律允许的验证用查询词;全文不含盘符绝对路径、工作区编码目录名与任何密钥字面(命令中一律以 `<DSH会话根>`、`<活库root>`、`<临时库>` 占位;哑密钥只写形态不写字面)。
9
+
10
+ ---
11
+
12
+ ## 一、参照与改进总览
13
+
14
+ ### 1.1 参照面:dsh-TUI 的显式清单与 fail-closed 纪律
15
+
16
+ dsh-TUI 的 `session-projection.ts` 维护一份 `KNOWN_DSH_EVENT_TYPES` 显式全集(`new Set<string>([...])`,单引号字面量逐行排列、注释分组)。其投影纪律三条(撰写会话拉取原文核对):
17
+
18
+ 1. **显式全集、不用前缀匹配**——文件头注释明言 "This is NOT a prefix list":如 `user/unknown-required` 不因 `user/` 前缀而被认作已知,只有精确出现在清单里的类型才被识别;
19
+ 2. **未知事件不静默跳过(fail-closed 投影)**——未知类型必须显式标记 `ignorable: true` 才允许跳过,否则一律标记上抛,防新版事件类型无声消失;
20
+ 3. **清单修订须回对上游事件类型全集**——清单与 dsh 事件类型定义文件做 conformance 全量对照。
21
+
22
+ ### 1.2 机械 diff(【撰写会话实跑】复现【实现会话实测】同结果)
23
+
24
+ 命令:`gh api repos/ccch1mneyyy/dsh-TUI/contents/src/adapter/channel/session-projection.ts` → base64 解码 → 逐行提取声明区字面量(跳过注释行、`re.fullmatch(r"'([^']+)',?")`)→ 与 `scripts/dsh_log_index.py` 的 `KNOWN_DSH_EVENT_TYPES` frozenset(importlib 挂载模块读取)双向 diff。输出:
25
+
26
+ ```text
27
+ remote_count=81 local_count=82
28
+ missing_from_local=[]
29
+ extra_in_local=['session']
30
+ ```
31
+
32
+ 即 **dsh-TUI 线上全集 81 项本地零遗漏**;本地仅增补一项 `'session'`——本日志文件首行元数据行型(dsh-TUI 投影面输入为 events 数组不含首行,故其清单无此项;本工具按整文件消费,必须识别)。
33
+
34
+ ### 1.3 fail-closed 的本地落地
35
+
36
+ - 清单内、无处理分支的行型 → 计入 `known_other`(识别但不处理);
37
+ - 清单外行型 → **unknown 逐类型计数** + 摄取结束 stderr 单行 WARNING(不失败,退出码不变)+ `--verbose` 逐类型列出(类型×行数×会话)——「新版 DSH 事件类型可静默消失」从结构上封死;
38
+ - 修订规则写入模块 docstring:新增类型须回对 dsh-TUI `session-projection.ts`;本地增补行型只增不减。
39
+
40
+ ### 1.4 三项改进与 gap 编号对照
41
+
42
+ | 改进 | 修的 gap(本报告口径) | v1.0 报告 §四 对应编号 |
43
+ |---|---|---|
44
+ | 一:显式清单 + unknown 告警 | 新增防线(防新版事件类型静默消失) | ——(v1.0 未暴露此项) |
45
+ | 二:turn 内二次分章(≤600 字/章) | **gap②** docindex 摘要截断 | gap① 覆盖率的「截断」半边 |
46
+ | 三:internal 共享档 + 派生标识 + workspace 锚(附 retire 处置) | **gap③** 会话绑定可见性;附带修 **gap①** private 误标触发 at-rest 加密致检索零命中 | gap② 可见性;gap① 覆盖率的「加密」半边 |
47
+
48
+ > **编号注**:v1.0 报告 §四 的 gap 编号是 ①摄取覆盖率 ②可见性 ③排名;本报告沿用改进材料口径 ①加密检索语义 ②摘要截断 ③会话绑定可见性——两套编号按上表映射,后文一律用本报告口径。
49
+
50
+ **版本演进注**:脚本内部按 v1(HEAD `014bad50`,461 行)→ v2(事件清单,改进一)→ v3(turn 内分块,改进二)→ v4(internal+派生标识+retire,改进三)演进;**工作树当前 = v4 形态(773 行,撰写会话实读)**。下文「v2/v3/v4 代码」指该演进步骤。材料中的行号引证系**各步实现时的快照**,与最终 v4 文件存在位移——§二各改进的改动点均以「材料记录 → v4 复核」双行号并标,v4 行号经撰写会话对全文 773 行逐处实读核对。
51
+
52
+ ---
53
+
54
+ ## 二、逐项改进
55
+
56
+ ### 改进一:事件类型处理升级——「两类+静默跳过」→「显式清单+unknown 告警」
57
+
58
+ **目标**:`scripts/dsh_log_index.py` 的 DSH 会话日志事件类型处理升级,参照 dsh-TUI `session-projection.ts` 的 `KNOWN_DSH_EVENT_TYPES` 与 fail-closed 纪律。
59
+
60
+ **改动点**(行号:材料记录 → v4 工作树复核):
61
+
62
+ | 改动 | 材料 | v4 复核 |
63
+ |---|---|---|
64
+ | 模块 docstring:日志形态节补 system/developer/审计/unknown 语义 + 新增「事件类型显式清单」来源节 | :19-49 | 日志形态节 :34-60、清单来源节 :62-69(密级/派生标识节 :10-32 由改进三续写) |
65
+ | `KNOWN_DSH_EVENT_TYPES` 显式 frozenset 82 项 + `AUDIT_EVENT_TYPES` 六类型 + `CONTEXT_MSG_TYPES` | :115-171 | :146-186 / :188-190 / :192-194 |
66
+ | `parse_session_log` docstring | :214-221 | :243-250 |
67
+ | stats 扩展:audit / unknown_types / unknown_lines / context 各计数 | :232-241 | :261-270 |
68
+ | CONTEXT 正文提取分支 + audit 计数分支 + known_other 分支 + unknown 逐类型计数分支 | :315-344 | :344-366 / :367-368 / :369-370 / :371-373 |
69
+ | `_ROLE_LABELS` 角色标题映射 | :354-358 | :388-390 |
70
+ | `--verbose` 参数 | :459-460 | :599-600 |
71
+ | total/row 扩展:msgs_context / chars_context / audit / unknown 四组键 + per_session_unknown 收集 | :491-548 | total 初始化 :621-627、row :644-663、per_session_unknown :680-682 |
72
+ | 摄取结束 stderr 单行告警 + `--verbose` 逐类型明细 | :604-619 | :753-768 |
73
+
74
+ **修前/修后**【实现会话实测】:
75
+
76
+ - **【前(v1 = HEAD `014bad50`)】**只处理 session / turn-start / user-message / agent-inbox-spliced / assistant-message 五行型,其余全部落入单一 `lines_skipped_other`。红基线(改前对真实日志 dry-run):session-927e3b6a 1387 行中 **1162 行静默**(`skipped.other_type=1162`)、session-d71a652e **476 行静默**——其中混有清单外类型 `workspace/changes`×1;EXIT=0、stderr 全空,新版事件类型可静默消失;`system/message`(54142 字符系统提示节点)完全不进转写。
77
+ - **【后(v2)】**① 82 项显式清单(dsh-TUI 线上全集 81 项机械 diff 零遗漏,本地仅增补 `'session'`,见 §1.2);② `system/message` 与 `developer/message` 正文提取归档(结构探测实测定字段:正文在 `data.message.content[].text`、与 assistant 同形态;回退 `data.content` 对齐 dsh-TUI firstText 两级语义;目标会话转写新增「turn 1(系统)」章节,节点 19→20);③ `tool/call|result`、`command/run|done`、`hook/invoked|result` 记行为审计行数(目标会话实测 145/145/1/1/0/0,只计数不摄取正文);④ 清单外类型逐类型计数:session-d71a652e 报 `"unknown":{"lines":1,"types":{"workspace/changes":1}}`,摄取结束 stderr 单行 WARNING(不失败,EXIT=0),`--verbose` 时逐类型列出。
78
+
79
+ **语义与边界**:
80
+
81
+ 1. 输出 JSON 结构变化:`skipped.other_type` 键删除,替换为 `skipped.known_other` + `skipped.context_no_text`;row 新增 `msgs_context`/`chars_context`/`audit`/`unknown`;TOTAL 新增 `turns_context`/`audit`/`unknown_lines`/`unknown_types`。依赖 v1 输出键名的下游需同步。
82
+ 2. 转写内容变化:system/developer 正文进入转写 md(标题「(系统)/(开发者)」)——对已用 v1 摄取过的会话重跑会产生新的章节切分与新增节点(临时库实测 19→20);既有节点 id 幂等跳过不覆写(活库只增不删),在役库既有 dsh-log- 19 节点本次未触(全部验证在哑密钥临时库)。
83
+ 3. unknown 告警是新增 stderr 输出:退出码不变(0),但把 stderr 视为失败的自动化管道需知悉。
84
+ 4. 清单修订规则(写入 docstring):新增类型须回对 dsh-TUI `session-projection.ts`;本地增补行型只增不减。
85
+ 5. `developer/message` 在全部真实日志中为 0 条,其提取腿以合成日志验证(已注明)。
86
+
87
+ **验证**【实现会话实测,除注明外】:
88
+
89
+ - 清单对照:gh api 拉取解码后与脚本 frozenset 机械 diff——remote 81 / local 82 / missing_from_local=[] / extra_in_local=['session'];**【撰写会话实跑】复现同结果(§1.2)**。
90
+ - 红基线:v1 对 session-d71a652e dry-run → `skipped.other_type=476`(workspace/changes 静默混入)、EXIT=0、stderr 空。
91
+ - 绿·unknown 告警:v2 同会话 dry-run --verbose → stdout JSON `unknown={lines:1,types:{workspace/changes:1}}`,stderr 两行(WARNING 总告警 + `unknown-type: workspace/changes × 1(会话 …)`),EXIT=0。
92
+ - 绿·system 提取:v2 对 session-927e3b6a dry-run → `msgs_context={system:1,developer:0}`、`chars_context=54142`(与逐行结构探测一致);行账闭合 869+292+178+15+1+32=1387。
93
+ - 绿·临时库摄取:哑密钥下 `--root <临时库> --allow-init` 摄取:20 节点全落库全 private(v1 同会话基线 19);以归属会话 Principal+哑密钥开临时库断言:节点 `dsh-log-…-0001` heading 含「turn 1(系统)」、摘要含系统提示特征标记(布尔命中,未打印原文)、节点数 20>19 PASS。
94
+ - 绿·developer 腿:合成日志 session-devtest-0000(内容全合成非敏感、临时目录)摄取:`msgs_context.developer=1`、`dsh-log-session-devtest-0000-0000` 落库;归属读者断言正文含合成标记 DEVNOTE-2026 PASS;跨会话读隔离双向成立(另一会话节点对该读者 get 返回 None)。
95
+ - **【撰写会话实跑】HEAD 基线形态核对**:`git show HEAD:scripts/dsh_log_index.py` —— 461 行;含 `lines_skipped_other` 单一计数(:150/:229/:389)、`sensitivity_for(it.get("path"), "private")`(:292)、无 `KNOWN_DSH_EVENT_TYPES`/`derive_session_token`/`CHUNK_MAX`——「前态」叙述与提交物一致。
96
+
97
+ ### 改进二:摄取分块细化——修 gap②「docindex 摘要截断」
98
+
99
+ **目标**:turn 深处结论不再落在摘要线后被截掉;选方案 a(纯工具侧转写分章,不触产品代码)。
100
+
101
+ **改动点**(行号:材料记录 → v4 复核):
102
+
103
+ | 改动 | 材料 | v4 复核 |
104
+ |---|---|---|
105
+ | docstring 转写结构节:二次分章规格 + 截断根因引证 + gap② 判据 | :56-70 | :71-84 |
106
+ | `CHUNK_MAX = 600` 常量与取值理由 | :178-184 | :196-200 |
107
+ | `_split_long_para`:句读→空格→字符三级断点,不改动/丢弃一字,兜住无句读长段 | :377-395 | :393-410 |
108
+ | `_chunk_body`:按空行分段、贪心聚合 ≤600 字章,纯函数确定性 | :397-417 | :413-432 |
109
+ | `render_transcript`:每消息分章、章数>1 时标题带「· k/N」小节号,ATX 转义逐字保留 | :419-443 | :435-460 |
110
+
111
+ **根因读码(未改产品;【撰写会话实跑】逐处复核一致)**:`md_cg/docindex.py:42`(`MAX_SUMMARY=200`)、`:127`(`_summary` 压平后 `text[:limit]` 截 200)、`:199`(合并子节后再 `[:MAX_SUMMARY]`)、`:266`(render 执行栏 `summary[:MAX_DOC]`,`MAX_DOC=400` 在 `:43`)——产品为「不存全文,节点正文=CCG 模板+摘要,正文一律 ref 回读」设计(`md_cg/docindex.py:13-14`;`MIN_BODY=200` 在 `:41`),而本工具有意不写 doc_ref 绑定(转写是临时暂存物),故章太大时章内深处结论物理不入库。
112
+
113
+ **修前/修后**【实现会话实测】:
114
+
115
+ - **【修前(红,改码前工作树=turn 整体成章)】**v1.0 报告 C2 案:转写 43878 字符仅 14805 入库(覆盖率 33.7%),turn2 助手消息 3058 字整体成一章,章摘要只留前 200 字,深处「仓库位置」结论未入库。本次红腿(改码前 v2 代码摄取新临时库):20 节点中 turn 2 相关节点与全部 20 节点 content 检索词「dsh-memory-main」零命中;主 search 仅返回 0.33 分分词噪声,检索无从命中。
116
+ - **【修后(绿)】**turn 内按段落贪心聚合 ≤600 字章(turn2 3058 字 → 7 章),结论词 9 次出现中 7 次落在章摘要(压平前 200 字)内;摄取 114 节点全落库(哑密钥临时库),其中 `dsh-log-…-0035/0036/0037`(heading=turn 2(助手)· 3/7、4/7、5/7)content 真含结论词;词法路单测三节点 rank 1/2/3(lexical_sim=1.000 满分);主 cg.search 自然语查询「DSH 的工作区目录和真实仓库 dsh-memory-main 在哪里」第一个真命中 rank=1、「dsh-memory-main 仓库位置」rank=4,均命中 turn 2 章。转写全 211 章正文 min/median/max=2/553/599 字、零超限。
117
+
118
+ **语义与边界**:
119
+
120
+ 1. 转写结构变化:turn 级章节变为 turn·k/N 小节章(单章消息不带小节号)——同会话重跑摄取会产生与 v1/v2 不同的新节点集(`dsh-log-<标识>-NNNN` 序列内容位移),旧节点保留不覆写(活库只增不删);对已用 v1/v2 摄取过的会话跑 v3 属「新增细化节点」而非原位升级,旧 19/20 节点成为粗粒度冗余版本,回收需另行处置。
121
+ 2. 节点数增长:同会话 20 → 114(短消息压平 <200 字的章按 docindex 既有 MIN_BODY 语义合并进父节摘要,不单独成节点)。
122
+ 3. docindex 摘要仍截 200 字/章——600 字章的摘要覆盖章前 1/3;分块是「提高结论落入某章摘要线的概率与密度」,不是全文入库;全文回读仍需 doc_ref(本工具仍不写,v1.0 报告覆盖率 gap 的 doc_ref 缺席不变)。
123
+ 4. 主 cg.search 默认多路融合对 CCG 模板词共振噪声仍会压低纯词法强命中(实测单词查询真命中排 13-15、自然语查询 rank 1-4)——融合层行为属产品检索面(与 v1.0 报告排名 gap 现象同源),不在本次工具侧修复范围。
124
+ 5. 幂等与 dry-run 语义不变:分块纯函数确定性 → 同日志逐字节同转写(实测两次 sha256 一致,`093bb6a7…905313`);重跑摄取 indexed=0/skipped=114。
125
+
126
+ **验证**【实现会话实测】:根因读码逐处核对(未改产品代码);分块模拟(改码前对 turn2 真实正文跑拟议算法:7 章中 3 章摘要含判据词 PASS);红腿摄取临时库(20 节点全库零命中,主 search 仅 0.33 分噪声);绿腿摄取临时库(114 节点:内容级 3 节点真含词且 heading 均 turn 2;lexical 单路目标三节点 rank 1/2/3、sim=1.0000;主 cg.search 自然语两查询 rank=1 与 rank=4 命中 turn 2(助手)· 5/7);转写结构(211 章、正文长度 2/553/599、零超 620;判据词 9 次出现 7 次入章摘要);幂等(绿库重跑 indexed=0/skipped_existing=114;两次 dry-run 转写 sha256 逐字节一致)。门禁回归两件见 §四(【撰写会话实跑】)。
127
+
128
+ ### 改进三:会话绑定可见性修复(gap③)——归因与可见性解耦;附带修 gap①(private 加密致检索零命中)+ 既有 private 旧节点最小处置(软删除)
129
+
130
+ **目标**:internal 共享档 + 内容寻址派生标识 + 工作区锚;附带修复 private 误标触发 at-rest 加密致检索零命中(gap①),并提供既有 private 旧节点的最小处置。
131
+
132
+ **改动点**(行号:材料记录 → v4 复核):
133
+
134
+ | 改动 | 材料 | v4 复核 |
135
+ |---|---|---|
136
+ | docstring:密级裁决 internal + 归因/可见性分离 + 派生标识规格 + retire 处置 | :10-33 | :10-32 |
137
+ | `import hashlib` | :73-83 | import 块 :115-122(hashlib 在 :116) |
138
+ | `derive_session_token`:sha256("{createdAt毫秒}\|{首条 user 消息全文}")[:16] | :472-481 | :472-481(一致) |
139
+ | `ingest_transcript`:节点 id=`dsh-log-<token>-<序号>`;sensitivity override="internal";add 显式 session=token / workspace=工作区目录 / dsh_session_uuid=原 uuid;tags 增 ws: 锚项 | :483-531 | :484-531 |
140
+ | `retire_private_legacy`:设计者身份 forget 软删除,判据 fail-closed=`dsh-log-` 前缀 ∧ sensitivity=private | :534-557 | :534-559 |
141
+ | `--retire-private-legacy` 参数 | :601-604 | :601-603 |
142
+ | token 计算入 row、retire 执行段 | :633-634 / :673 / :741-754 | token 计算 :633-634(一致)、row.session_token :645、retire 执行段 :736-748 |
143
+
144
+ **关键读码(未改产品;【撰写会话实跑】逐处复核一致)**:`md_cg/mdcos.py:3913-3956`(`_readable`:public/internal=跨会话共享档,不进会话绑定判定——可见性单点在 sensitivity;绑定档判定恒用 principal.session)、`:3796-3807`(`_attribution`:库层调用方显式传 session 可覆盖 principal.session 缺省)、`:2345-2374`(forget=软删除:文件移 trash/ + 删除清单 + 可 restore)、`:3832-3839`(`add(sensitivity=...)`);`md_cg/crypto.py:62`(`ENCRYPTED_LEVELS=("private","secret")`——internal 不加密);`md_cg/mdcg.py:907`(`_NODE_ID_RE` 允许 16 hex token)。
145
+
146
+ **修前/修后**【实现会话实测】:
147
+
148
+ - **【修前(红)】**用 HEAD 的 v1 基线脚本(private 会话绑定版)摄取哑密钥临时库(19 节点全 private、fm.session=原 uuid):新会话读者(session=session-aa7b3c21-new-session、clearance=private)search「dsh-memory-main 仓库位置」→ **0 命中**,dsh-log 节点对该读者可见数 **0**——「跨会话回看日志」用途不成立(v1.0 报告可见性 gap 复现);且 private 触发 at-rest 加密致词法面零命中(gap①)。
149
+ - **【修后(绿)】**v4 摄取另一临时库:114 节点全 internal;同一新会话读者 search → **10 条命中(真含词 rank=4)**、dsh-log 可见 114/114;fm 断言全过:sensitivity=internal、session=a5354883dfb88ab2(派生标识)、dsh_session_uuid=原 uuid 留痕、workspace=<工作区目录名>(目录名本报告不录,同 v1.0 口径)、writer=dsh-memory、tags 含 `ws:` 锚项。
150
+ - **【retire】**对红库跑 `--retire-private-legacy`:一条命令完成「重摄取 114 internal 新节点 + 旧 19 private 软删除」——retire 后索引中 private dsh-log=0、trash/ 留痕 19 文件、删除清单 19 条、新会话读者检索命中。
151
+ - **【稳定性】**派生标识 3 次独立运行同值 `a5354883dfb88ab2`;绿库幂等重跑 indexed=0/skipped=114。
152
+
153
+ **语义与边界**:
154
+
155
+ 1. 可见性语义变化:dsh-log- 节点从 private 会话绑定档(仅归属会话+设计者可读)改为 internal 跨会话共享档——私有活库内任何 clearance≥internal 的本机授权身份可检索(与手工归档节点同暴露面);正文不再加密、参与全文索引(使用者裁决「日志不加密」)。
156
+ 2. 身份锚变化:节点 id 与 fm.session 从 uuid 改为派生标识 sha256(createdAt|首条 user 全文)[:16]——内容寻址,同逻辑会话重跑幂等;取舍:不同会话若 createdAt+首条 user 全文恰相同(如同问重开)会派生同 id 被幂等跳过,第二个会话内容不入库(内容寻址固有语义)。
157
+ 3. 归因与可见性分离:fm.session=派生标识、dsh_session_uuid=原 uuid、workspace=目录名、writer=actor 全量留痕,但都不参与可见性判定(`_readable` 对 internal 不看这些字段);workspace 另落 tags `ws:` 项作检索锚。
158
+ 4. 读码修正预设:原设想「读码确认 session 过滤层后让新会话读者可检索」——实测结论是 `_readable` 的可见性单点在 sensitivity,无独立 session 过滤层可改;internal 档位本身即解,workspace 锚是检索/溯源维度而非可见性闸。
159
+ 5. 既有 private 节点处置选型:覆盖不可行——v3 分块后章节边界与旧 19 节点内容错位,同 id 覆盖会张冠李戴;故选 forget 软删除(文件移 trash/ 留痕、可 restore、删除清单审计),最小且合规「只增不删」的保守解释。
160
+ 6. 输出结构:row 新增 session_token;TOTAL/输出新增 retire_private_legacy 摘要;`--retire-private-legacy` 缺省不动任何既有节点(显式开关),dry-run 下跳过。
161
+ 7. 在役活库执行说明:本轮验证全部在哑密钥临时库,未触在役库——在役库 19 个 private 节点的实际重摄取+retire 需运维编排以真实身份跑同一条命令(脚本能力已就绪并验证)。
162
+
163
+ **验证**【实现会话实测】:读码引证(上表)逐处核对;红腿(git show HEAD 建基线副本摄红库 19 节点 {'private':19} → 新会话读者 search hits=0、可见数=0、fm sensitivity=private/session=uuid);绿腿(v4 摄取 114 节点 {'internal':114}、token=a5354883dfb88ab2 → 同读者可见 114/114、search 10 命中(真含词 rank=4)、fm 七项断言 PASS);retire(--retire-private-legacy 对红库:retired=19、retire 后索引 private=0/internal=114、trash 19 文件、删除清单 19 条、新读者检索真命中 1);稳定性(token 三次独立进程派生同值);幂等(绿库重跑 indexed=0/skipped_existing=114)。
164
+
165
+ ---
166
+
167
+ ## 三、v1.0 未命中四查询回查结果
168
+
169
+ **判定口径与方法**【实现会话实测】:v4 形态脚本(工作树当前版=分块+internal+派生标识)对真实日志 session-927e3b6a…(1387 行)摄取进哑密钥临时库(114 节点全 internal);4 查询用 v1.0 报告原查询句、k=10,判 hit=期望事实专有词出现在返回节点 CCG content 中;**归属会话读者(session=原 uuid)与新会话读者(session=session-aa7b3c21-new-session)两身份结果逐位一致**——internal 共享档使可见性不再随会话漂移,双身份一致本身就是改进三(gap③ 修复)的直接验证。
170
+
171
+ **总表**:**3/4 hit**。
172
+
173
+ | # | 查询(v1.0 案) | 期望事实(专有判据) | hit | 关键命中 |
174
+ |---|---|---|---|---|
175
+ | Q1 | C1 沙箱启动错误 | SetNamedSecurityInfoW(turn 深处) | **否** | 证据已在库(-0033 真含词)但 top10 乃至 k=60 未召回 |
176
+ | Q2 | C2 工作区空目录与真实仓库位置 | 真实仓库在 dsh-memory-main(turn2) | **是** | rank=2(-0037,turn 2(助手)· 5/7);该事实 3 节点在库(-0035/0036/0037) |
177
+ | Q3 | C4 dsh web 重启不生效 | pwsh 不存在 + DETACHED_PROCESS 被宿主回收 | **是** | rank=5(-0086,turn 9(助手)· 2/3,含 DETACHED_PROCESS)+ rank=6(-0087 · 3/3,含 pwsh),因果链两块同进 top10 |
178
+ | Q4 | C5 落盘成功但在役 MCP read 返回 null | P1b-2 读面缓存代际(turn12 时间戳链) | **是** | rank=4(-0094,turn 12(助手)· 4/6,真含 14135 与 dsh_restart_recheck);P1b 主题块另占 rank=2(-0074)与 rank=10(-0059) |
179
+
180
+ **Q1(唯一未召回案)**:top10 无任何期望事实块——核心判据词 SetNamedSecurityInfoW 所在节点 `dsh-log-a5354883dfb88ab2-0033`(heading=turn 2(助手)· 1/7)在 top10 乃至 k=60 内均未被召回;辅助判据 worker-exit 块(-0028)也未进 top10。根因:-0033 的 CCG 摘要行与查询词面零交叠(实测摘要不含 沙箱/写权限/worker/run_code/退出/挂 任一词),自然语描述与专有 API 名之间无词法桥可召回。注意:**事实本身已在库**(内容级 -0033 content 真含 SetNamedSecurityInfoW)——属「已入库但检索面未召回」,与 v1.0 的「根本未入库」性质不同。
181
+
182
+ **对照结论与口径注记**:
183
+
184
+ - v1.0 报告五案在重放库+归属读者的全事实命中为 1/5(且为部分事实);本轮四案回查 **3/4**——Q2(v1.0 重点未命中案:检索词在 19 块解密内容零命中、覆盖率 33.7% 的代表性失败)**直接翻案**(rank=2),Q3、Q4 时间戳链块也已入库并进 top5,**gap②(摘要截断)修复实效成立**。
185
+ - v1.0 报告 C1 曾记「命中 -0000 score 1.0」,按本轮严格判据(期望事实专有词被召回)该命中并非证据块命中。
186
+ - Q3 的 turn 号在 v1.0 报告记为 turn10、本轮转写为 turn9,系两轮 turn 号口径差 1,不影响事实判定。
187
+ - Q1 属检索器语义桥问题(gap①「加密检索语义」邻域的检索器面,见 §五),非本轮摄取侧改动范畴,如实留档。
188
+ - 隐私纪律:全程哑密钥临时库、判据只用专有词/布尔与节点 id,未打印任何日志正文。
189
+
190
+ ---
191
+
192
+ ## 四、门禁(【撰写会话实跑】,环境 PYTHONUTF8=1、仓库根执行)
193
+
194
+ | # | 检查 | 命令 | 结果 | 退出码 |
195
+ |---|---|---|---|---|
196
+ | ① | python 回归·docindex 面 | `python -m md_cg.test_p27_docindex` | 通过 98 / 失败 0 | 0 |
197
+ | ② | python 回归·ref 根守卫面 | `python -m md_cg.test_p1x_ref_root` | 10/10 通过 | 0 |
198
+ | ③ | 脚本模块载入 | diff 挂载经 importlib 执行 `scripts/dsh_log_index.py` 顶层(§1.2 机械 diff 之一环) | 成功(82 项清单载入) | 0 |
199
+
200
+ 三项命令均为本报告撰写会话本轮实跑,退出码逐项实测为 0——门禁 **python=通过(退出码 0)**。
201
+
202
+ ---
203
+
204
+ ## 五、遗留
205
+
206
+ 按影响排序:
207
+
208
+ 1. **gap① 加密检索语义——待拍板**:Q1 案证据已入库但检索面召回不了,查询自然语描述与证据块 CCG 摘要词面零交叠;主 cg.search 默认多路融合还会压低纯词法强命中(实测单词查询真命中排 13-15、自然语 rank 1-4,与 v1.0 报告排名 gap 现象同源)。属产品检索器面,不在摄取工具范畴,需另行裁决方向(语义检索 / 摘要密度 / 融合权重)。
209
+ 2. **doc_ref 缺席不变**(v1.0 覆盖率 gap 的另一半):本工具仍不写 doc_ref 绑定(转写是临时暂存物),全文回读不可用;分块只是提高结论落入某章摘要线的概率,不是全文入库。
210
+ 3. **在役库执行欠账**:本轮全部验证在哑密钥临时库;在役库既有 19 个 private 版 dsh-log- 节点的「以 v4 重摄取 internal 新节点 + `--retire-private-legacy` 软删除旧节点」需运维编排以真实身份执行(脚本能力就绪并已验证)。
211
+ 4. **内容寻址固有语义**:不同会话若 createdAt+首条 user 全文恰相同会派生同 token 被幂等跳过(第二会话内容不入库)——如该场景真实发生需另立裁决。
212
+ 5. **stderr 新增告警输出**:unknown WARNING 使工具开始产 stderr;EXIT 不变(0),但把 stderr 视为失败的自动化管道需适配。
213
+ 6. **旧粗粒度节点冗余**:分块后同会话重跑产生新节点集,v1/v2 时代旧 19/20 节点成为粗粒度冗余版本;`--retire-private-legacy` 只面向 private 版,internal 旧版(若有)回收须另行处置。
214
+ 7. **developer/message 真实日志 0 条**:其提取腿以合成日志验证(已注明),真实命中面未测。
215
+
216
+ ---
217
+
218
+ ## 六、纪律合规声明
219
+
220
+ - **隐私(工程纪律第 9 条)**:DSH 会话日志是私有侧数据,摄取目标仅为私有活库 root(脚本 `_guard_root` 拒绝仓库检出内目标),绝不推公开库;本报告与工具输出均不打印日志正文原文——查询词为纪律允许的验证用查询词,日志派生内容一律以计数/节点 id/章节标题/布尔命中呈现;全文不含盘符绝对路径与工作区编码目录名(占位符替代),不含任何密钥字面(哑密钥只写形态)。
221
+ - **实验卫生**:实现会话的全部红绿腿实验在临时目录/哑密钥临时库进行——实验脚本/探测脚本/临时库×5/合成日志/err 残留/转写暂存已全部删除(【实现会话实测】清理记录);**【撰写会话实跑】临时产物**(参照文件 base64/解码缓存、机械 diff 脚本×3、回归输出×2)测毕即删;两次 git status 复查工作树仅剩 `M scripts/dsh_log_index.py`。
222
+ - **在役面未触**:未触真实令牌库、未触真实 serve、未触在役活库——在役库既有 dsh-log- 19 节点(private 版)本次零触碰(只增不删纪律下的保守面);其处置路径已就绪(§五第 3 条),留待运维编排。
223
+ - **只增不删**:所有临时库实验中既有节点零修改零删除;retire 为 forget 软删除(trash/ 留痕 + 删除清单 + 可 restore),非物理删除。
224
+ - **撰写会话自查范围(诚实边界)**:本会话实跑项 = ①WORKSPACE_INDEX 定位与 v1.0 报告读档;②`scripts/dsh_log_index.py` 全文 773 行实读(双行号表逐处核对);③gh api 机械 diff(remote 81 / local 82 / missing=[] / extra=['session']);④`git show HEAD:scripts/dsh_log_index.py` 基线形态核对;⑤产品码引证逐处读码(docindex :13-14/:41/:42/:43/:127/:199/:266;mdcos :3913-3956/:3796-3807/:2345-2374/:3832-3839;crypto :62;mdcg :907);⑥门禁三项(§四);⑦`git status --porcelain`(仅 M scripts/dsh_log_index.py);⑧隐私预扫描(见下)。红绿基线、临时库摄取、retire、四查询回查为【实现会话实测】记录,撰写会话未重跑(触私有会话根与私有数据,按隐私纪律不重复触达),文中逐处标注。
225
+ - **隐私预扫描(【撰写会话实跑】,成稿后对本文件全文执行)**:盘符路径形态(字母+冒号+斜杠)0 条;工作区编码目录名字面 0 条;哑密钥字面 0 条;日志正文原文 0 条(扫描脚本与结果见返回记录,扫描完即删)。
226
+
227
+ ---
228
+
229
+ ## 附录:在役活库部署与有效性验证(2026-09-26,批次61 收尾)
230
+
231
+ ### 部署
232
+
233
+ `--retire-private-legacy` 在役执行:旧 private 节点 **33 个软删除**(trash+留痕可恢复)+ internal 新节点 **169 个**重摄取(5 会话全量,含 default-workspace 空会话 0 节点);密级分布复核 `{internal: 169}`——private 清零。
234
+
235
+ ### 有效性验证(新会话读者身份,模拟"后来想知道"的跨会话回看)
236
+
237
+ | 验证项 | 结果 |
238
+ |---|---|
239
+ | 可见性闭环(gap③) | ✅ internal=跨会话共享档(`_readable` 语义:public/internal 共享、private/secret 绑定归属),新会话读者可见 169/169 |
240
+ | 探针 `dsh_restart_recheck_20260926` | ✅ 可读(P1b-2 磁盘索引在库,待 DSH 端常驻进程重启/maintain reload 后从其读面亦可见) |
241
+ | 精确词检索 | ✅ `SetNamedSecurityInfoW`(worker-exit 沙箱结论)→ **rank=1**;`DETACHED_PROCESS` → rank=42 进 top100 |
242
+ | 自然语句泛查询 | ⚠️ "工作区目录/真实仓库在哪里"类自然语句 → top100 零 dsh-log(被 14k 大库手工节点稀释——短日志块打分劣势) |
243
+
244
+ ### 使用指引与遗留
245
+
246
+ - **DSH 端使用建议**:日志回查用**精确词/独占专名查询**(错误码、路径、标识符——rank=1 级命中),自然语句查询在 14k 大库下召回被稀释;
247
+ - **遗留(gap④ 排名调优)**:短文档加权/时间衰减加权/`dsh-log-` 前缀过滤检索参数——入池专项,属检索质量调优非可见性缺陷;
248
+ - 本轮部署未触碰 DSH 探针与在役既有节点(retire 仅软删除 dsh-log- 前缀 private 节点)。