@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.
- package/README.md +572 -465
- package/docs/README.md +1 -0
- 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
- 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
- package/docs/eval/DSH/347/253/257/347/274/272/351/231/267/344/270/223/351/241/271_v1.0.md +254 -0
- 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
- package/docs/eval/bench_lingshu_self/bench_self.py +140 -0
- package/docs/eval/bench_lingshu_self/self_bench_result.json +404 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/docs/images/lingshu-moonlight-covenant-poster-preview.jpg +0 -0
- package/docs/images/lingshu-moonlight-covenant-poster.png +0 -0
- 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
- 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
- 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
- package/dsh/cordis-patch-profile-web.example.yml +35 -0
- package/lib/bridge.d.ts +9 -0
- package/lib/bridge.js +35 -0
- package/lib/cli.d.ts +3 -0
- package/lib/cli.js +66 -0
- package/lib/index.js +7 -1
- package/lib/init.d.ts +88 -0
- package/lib/init.js +287 -0
- package/lib/lib/roleplay_web.js +530 -443
- package/lib/lib/token_store.d.ts +7 -1
- package/lib/lib/token_store.js +12 -3
- package/md_cg/audit.py +12 -1
- package/md_cg/backfill.py +16 -15
- package/md_cg/backfill_bucket_zh.py +35 -0
- package/md_cg/bench_e2e_judge.py +532 -0
- package/md_cg/bench_e2e_locomo_qa.py +368 -0
- package/md_cg/bench_e2e_qa.py +256 -0
- package/md_cg/branches.py +18 -2
- package/md_cg/ccgc.py +3 -2
- package/md_cg/chain.py +19 -4
- package/md_cg/consolidate.py +7 -6
- package/md_cg/crosscheck.py +4 -3
- package/md_cg/crypto.py +439 -437
- package/md_cg/datapath.py +395 -335
- package/md_cg/evidence.py +8 -3
- package/md_cg/export.py +3 -1
- package/md_cg/forgetting.py +2 -2
- package/md_cg/fsutil.py +48 -0
- package/md_cg/hotcache.py +255 -238
- package/md_cg/interop.py +161 -22
- package/md_cg/judgment_manifest.py +177 -0
- package/md_cg/links.py +655 -622
- package/md_cg/mcp_server.py +282 -31
- package/md_cg/mdcg.py +702 -126
- package/md_cg/mdcos.py +454 -68
- package/md_cg/mreview/govern.py +5 -4
- package/md_cg/postings.py +4 -2
- package/md_cg/readcache.py +76 -18
- package/md_cg/reconcile.py +228 -0
- package/md_cg/review_cli.py +215 -0
- package/md_cg/routing.py +28 -0
- package/md_cg/run_tests.py +211 -0
- package/md_cg/scrub.py +862 -852
- package/md_cg/security.py +385 -275
- package/md_cg/selfreport.py +3 -2
- package/md_cg/signer.py +565 -562
- package/md_cg/sources.py +3 -2
- package/md_cg/stg.py +6 -0
- package/md_cg/sustain.py +1168 -1138
- package/md_cg/test_access_hints.py +147 -0
- package/md_cg/test_branch_discard_tombstone.py +136 -0
- package/md_cg/test_branches.py +259 -249
- package/md_cg/test_chain_read_isolate.py +168 -0
- package/md_cg/test_datapath_device_name.py +203 -0
- package/md_cg/test_emit_negtail_cache.py +156 -0
- package/md_cg/test_en_pipeline.py +186 -166
- package/md_cg/test_govern_directread.py +421 -0
- package/md_cg/test_i32_hotcache_env_key.py +218 -0
- package/md_cg/test_identity_attribution.py +228 -147
- package/md_cg/test_index_crossprocess_reload.py +301 -0
- package/md_cg/test_index_durability.py +238 -224
- package/md_cg/test_interop.py +4 -2
- package/md_cg/test_interop_judgment.py +228 -0
- package/md_cg/test_issue39_utf8_stdio.py +273 -0
- package/md_cg/test_links_concurrent_write.py +188 -0
- package/md_cg/test_merge_upsert.py +168 -0
- package/md_cg/test_n123_derive_expiry_chain.py +205 -0
- package/md_cg/test_n130_verify_falsified_protect.py +185 -0
- package/md_cg/test_n131_merge_gate.py +205 -0
- package/md_cg/test_none_id_write_guard.py +165 -0
- package/md_cg/test_p1x_ref_root.py +160 -0
- package/md_cg/test_p27_docindex.py +774 -765
- package/md_cg/test_p2_mcp.py +3 -0
- package/md_cg/test_p32_backfill.py +304 -298
- package/md_cg/test_p39_verify_flow.py +90 -50
- package/md_cg/test_p47_session_view.py +60 -25
- package/md_cg/test_propose_tail_index.py +157 -0
- package/md_cg/test_read_scope_b27.py +277 -0
- package/md_cg/test_readcache_default_on.py +168 -0
- package/md_cg/test_readcache_precise_inval.py +270 -0
- package/md_cg/test_readcache_prodpath.py +55 -7
- package/md_cg/test_reconcile_v0.py +294 -0
- package/md_cg/test_retr_s1.py +6 -2
- package/md_cg/test_retr_s1b.py +67 -0
- package/md_cg/test_retr_s7.py +8 -0
- package/md_cg/test_retr_s9_entity_ctx.py +181 -175
- package/md_cg/test_retr_score_once.py +208 -0
- package/md_cg/test_review_cli_attribution.py +177 -0
- package/md_cg/test_review_cli_visibility.py +235 -0
- package/md_cg/test_review_onepass.py +170 -0
- package/md_cg/test_rrf_graph_seed_cache.py +154 -0
- package/md_cg/test_security_audit.py +155 -0
- package/md_cg/test_security_audit_b26.py +161 -0
- package/md_cg/test_security_audit_v21.py +250 -0
- package/md_cg/test_semantic_canonical.py +255 -241
- package/md_cg/test_session_isolation.py +168 -0
- package/md_cg/test_snapshot_autoclose.py +187 -0
- package/md_cg/test_tail_watermark_race.py +208 -0
- package/md_cg/test_tenant_env_override_warn.py +139 -0
- package/md_cg/test_tenant_registry_corrupt_warn.py +151 -0
- package/md_cg/test_v14_fixes.py +415 -397
- package/md_cg/test_verify_dirty_reconcile.py +157 -0
- package/md_cg/theory.py +276 -273
- package/md_cg/tokens.py +734 -677
- package/md_cg/units.py +3 -2
- package/md_cg/vision_evidence.py +4 -3
- package/md_cg/whitebox_kb/wisdom/code_solidified.json +6195 -6195
- package/md_cg/whitebox_kb/wisdom/multilang_ir.py +128 -124
- package/md_cg/writepipe.py +554 -550
- package/package.json +11 -2
- package/src/bridge.ts +434 -401
- package/src/cli.ts +65 -0
- package/src/index.ts +526 -518
- package/src/init.ts +347 -0
- package/src/lib/roleplay_web.ts +1019 -932
- package/src/lib/token_store.ts +202 -192
package/docs/README.md
CHANGED
|
@@ -99,6 +99,7 @@ docs/
|
|
|
99
99
|
| [概念分层对齐表 v0.1](theory/概念分层对齐表_v0.1.md) | 概念层级对齐 |
|
|
100
100
|
| [认知代理与收敛结构·条件论重构 v0.1](theory/认知代理与收敛结构_条件论重构_v0.1.md) | 条件论 |
|
|
101
101
|
| [理论·机制·代码·实验·缺口矩阵 v0.1](theory/理论_机制_代码_实验_缺口矩阵_v0.1.md) | 全景矩阵 |
|
|
102
|
+
| [不可靠定理与失效优先框架 v0.3](theory/不可靠定理与失效优先框架_v0.3.md) | Fail-First Theorems:T0 失效定理推导链(T0–T14/A1–A4)· 14 行理论×机制×代码矩阵(2026-09-26 工程核验)· 落地清单含 v0.1 承接节 |
|
|
102
103
|
| [理论仓拆分与白箱知识库内迁 v0.1](theory/理论仓拆分与白箱知识库内迁_v0.1.md) | 拆分方案 |
|
|
103
104
|
|
|
104
105
|
## eval/ · 评测与第三方验证
|
|
@@ -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 节点)。
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
# DSH 日志索引效果验证报告 v1.0
|
|
2
|
+
|
|
3
|
+
- **日期**:2026-09-27
|
|
4
|
+
- **修订记录**:v1.0(隐私门禁整改重写:期望事实改为 ≤50 字「事实点」并重新措辞、全文去本机盘符路径与编码路径的目录名、不留日志原话式长句)
|
|
5
|
+
- **对象**:`scripts/dsh_log_index.py`(新增,**未 commit**——git status 仅此一个 untracked 文件,编排会话负责提交)及其产出的 `dsh-log-` 检索面
|
|
6
|
+
- **数据来源**:摄取统计、幂等复跑、五案检索、dry-run 快照对照的实测记录由摄取/验证会话提供(本文标注「实测记录」);报告撰写会话独立复核了全部代码引证(逐条读码比对)、git 状态与 CLI 参数面,并实跑两件回归套件(见 §2.4、§七)。凡撰写会话未实跑的检查,均如实标注,不冒充为本会话实跑。
|
|
7
|
+
- **隐私**:本报告不含 DSH 会话日志正文原文;查询词为验证用查询词(纪律允许),日志派生内容一律以 ≤50 字、重新措辞的「事实点」呈现;只含统计与计数;全文不含盘符绝对路径,日志目录一律写「DSH 会话根」,命令中敏感路径用 `<DSH会话根>`、`<活库root>` 占位。
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 一、背景
|
|
12
|
+
|
|
13
|
+
DSH 端曾执行「停自动写入」决策:不再把会话过程自动写进记忆库。该决策成立的前置件是——**会话日志作为冷真源必须可被事后检索**:日志若既不自动入库、又检索不到,历史会话的结论就彻底丢失,停自动写入等于信息黑洞。本次工作即偿还这笔 DSH 端欠账:
|
|
14
|
+
|
|
15
|
+
1. 新增离线摄取工具 `scripts/dsh_log_index.py`:DSH 会话日志(zstd jsonl)→ 转写 md(系统临时目录、路径确定)→ 直调生产同款索引入口,摄取进**私有活库**的灵枢检索面;
|
|
16
|
+
2. 对目标会话完成摄取并实测幂等;
|
|
17
|
+
3. 以五个真实信息需求做检索效果验证,逐层实证闭合未命中根因,给出三个 gap、对照发现与使用边界。
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 二、工具与摄取统计
|
|
22
|
+
|
|
23
|
+
### 2.1 工具形态
|
|
24
|
+
|
|
25
|
+
**新增 1 个独立摄取脚本** `scripts/dsh_log_index.py`,仓库无其他改动(git status 仅此一个 untracked 文件,撰写会话已复查确认)。CLI 参数面(撰写会话经 `grep add_argument` 逐项核实):
|
|
26
|
+
|
|
27
|
+
| 参数 | 语义 |
|
|
28
|
+
|---|---|
|
|
29
|
+
| `--sessions-root` | **必选**,DSH 会话根 |
|
|
30
|
+
| `--root` | 灵枢库 root,缺省取 `MDCG_ROOT` 环境变量 |
|
|
31
|
+
| `--session` / `--workspace` | 过滤:只处理指定会话 id / 工作区目录名 |
|
|
32
|
+
| `--dry-run` | 只转写、只统计,不写库 |
|
|
33
|
+
| `--allow-init` | 允许初始化空库 |
|
|
34
|
+
| `--actor` / `--tenant` | 写入身份,缺省 `dsh-memory` / `default` |
|
|
35
|
+
| `--cleanup-transcripts` | 摄取后清理转写暂存(缺省保留在系统临时目录确定路径) |
|
|
36
|
+
|
|
37
|
+
管线:DSH 会话日志(zstd jsonl)→ 转写 md → 直调**生产同款索引入口**摄取灵枢检索面。
|
|
38
|
+
|
|
39
|
+
### 2.2 摄取统计(实测记录)
|
|
40
|
+
|
|
41
|
+
- **活库节点数 14140 → 14159(+19)**,全部为 `dsh-log-` 前缀新节点;既有节点零修改零删除(活库只增不删)。
|
|
42
|
+
- 目标会话 `session-927e3b6a-cae2-45b7-b1dc-c650b5fa927e`(位于 DSH 会话根下特定工作区目录;该目录名含本机盘符形态编码,本报告不录,复现时经 `--workspace` 传实际目录名):
|
|
43
|
+
- 1387 行日志 → 转写 **18 条用户轮 + 14 条助手轮(43077 字符)**;
|
|
44
|
+
- 跳过 1162 行其他类型 + 145 行无正文助手消息 + 15 条重复事件 + 0 行 JSON 错误;
|
|
45
|
+
- 章节切分产出 **19 章全部落库**,密级全部 `private`;
|
|
46
|
+
- 归因:session=该会话 / writer=dsh-memory / harness=dsh。
|
|
47
|
+
|
|
48
|
+
### 2.3 语义裁定(六条,读码定案)
|
|
49
|
+
|
|
50
|
+
① **摄取路由选定「经 MdCGSecure 直调同款索引入口」而非 `cg index_doc` op**:读码发现 `index_doc` 的节点 id 由 `docindex.node_id` 硬编码为 `doc_` 前缀(`md_cg/docindex.py:284`),无法满足 `dsh-log-` 前缀要求;故章节切分直调与 `index_doc` op **完全同一实现**的 `refindex.index_dir(kind="doc_ref")`(内含 `docindex.extract` 的 level≤3 切分 / 小节合并 / 围栏感知),写入侧逐条对照 `refindex.add_items` 的 doc_ref 分支(`md_cg/refindex.py:378-392`),仅节点 id 改为 `dsh-log-<会话id>-<章节序号>` 且不写 doc_ref 列。*(撰写会话已读码复核上述三处引证。)*
|
|
51
|
+
|
|
52
|
+
② **不写 doc_ref / 不登记 Ledger 的原因**:转写文件是临时目录暂存物,绑定列会系统性 dangling,且 `op=ref` 回读会开第二个日志原文暴露面;溯源改记 `frontmatter.dsh_log`(session/workspace/source/transcript/heading_path/lineno/end,已实测落盘)。
|
|
53
|
+
|
|
54
|
+
③ **检索覆盖遵循生产章节切分语义**:直接正文 <200 字的小节并入父节摘要(`docindex` 的 `MIN_BODY=200`,`md_cg/docindex.py:41`),故 33 个转写节中 19 个形成独立节点,其余在父节摘要(生产 `MAX_SUMMARY=200`,`md_cg/docindex.py:42`)与父节区间内。docindex 的设计即「**不存全文,节点正文=CCG 模板+摘要**,正文一律回读」(`md_cg/docindex.py:13-14`;模块头注 `md_cg/docindex.py:2`)。
|
|
55
|
+
|
|
56
|
+
④ **幂等语义**:节点 id 确定性 + 写入前查索引,已存在即计 `nodes_skipped_existing` 跳过(不覆写既有节点,符合活库只增不删)。
|
|
57
|
+
|
|
58
|
+
⑤ **private 档按 `_readable` 会话绑定**:仅归属会话的 MCP 面 + 设计者可读;写入身份与在役插件一致(tenant=default / actor=dsh-memory,复用既有 DEK 信封);转写体内的 markdown 标题样行首加反斜杠转义防切分误认(68 处,不改动正文一字)。
|
|
59
|
+
|
|
60
|
+
⑥ **输出仅统计/计数/node id**,全程未打印日志正文(仅摘录 ≤50 字用于选查询词);转写暂存按确定路径保留在系统临时目录(`--cleanup-transcripts` 可选清理),实验快照临时文件已清理。
|
|
61
|
+
|
|
62
|
+
### 2.4 检查清单(实测记录;标注撰写会话复跑项)
|
|
63
|
+
|
|
64
|
+
| # | 检查 | 命令 / 方法 | 结果 | 本会话复跑? |
|
|
65
|
+
|---|---|---|---|---|
|
|
66
|
+
| ① | 摄取 | `python scripts/dsh_log_index.py --sessions-root <DSH会话根> --session session-927e3b6a-cae2-45b7-b1dc-c650b5fa927e --root <活库root>` | 输出 `nodes_indexed=19` / sensitivity `{private:19}`;库索引复查 `dsh-log-`=19、总节点 14159 | 否(触活库,实测记录) |
|
|
67
|
+
| ② | 幂等 | 同命令重跑 | `nodes_indexed=0` / `nodes_skipped_existing=19`,库内 `dsh-log-` 仍 19 个(无重复) | 否(触活库,实测记录) |
|
|
68
|
+
| ③ | 检索 | 以会话属主 Principal 开 MdCGSecure 调 `cg.search` | 「现在有你么」→ 命中 `dsh-log-…-0000` score 1.0;「执行通道」→ 命中 `dsh-log-…-0002` score 1.0;附加「zcode汇报」→ 命中 `-0007`/`-0010` 均 1.0(注:泛词「记忆」被 14k 节点全库挤出 top10,非未索引) | 否(触活库,实测记录) |
|
|
69
|
+
| ④ | dry-run | 先拍活库快照(节点 14140 / `_index.json` mtime_ns 与 size / md 文件 14232)→ 跑 `--dry-run` | 四项指标逐项相等,且摄取前库内 `dsh-log-` 节点为 0,断言 PASS | 否(触活库,实测记录) |
|
|
70
|
+
| ⑤ | 回归 | `python -m md_cg.test_p27_docindex`;`python -m md_cg.test_p1x_ref_root`(index_doc 面既有测试 grep 所得两件均跑) | **98 通过 / 0 失败**;**10/10 通过** | **是**——撰写会话实跑复现同结果 |
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## 三、检索效果验证(逐查询)
|
|
75
|
+
|
|
76
|
+
五案均为真实信息需求,按三层读者形态实测:①活库副本直调(无 DEK,词法面);②管线重放临时库(自带 KEK 重放摄取,33 节点与在役库逐条同 id)+ **归属会话读者**(唯一合法可读面);③后续新会话读者与 can_admin 设计者读者。实测记录(验证会话),撰写会话未重跑。各案「期望事实」以**事实点**呈现(≤50 字、重新措辞,非日志原文摘录)。
|
|
77
|
+
|
|
78
|
+
### C1 沙箱启动错误
|
|
79
|
+
|
|
80
|
+
- **查询词**:DSH 里 run_code 一执行就报 worker-exit 退出,沙箱给工作区挂写权限失败,是什么错误?
|
|
81
|
+
- **期望事实**(事实点):
|
|
82
|
+
- 阶段:worker 沙箱启动期失败,run_code 零执行(turn1)
|
|
83
|
+
- 报错 API:SetNamedSecurityInfoW
|
|
84
|
+
- 错误码:Win32 5(ACCESS_DENIED)
|
|
85
|
+
- 对象:给工作区目录挂 grantWrite 授权失败
|
|
86
|
+
- **实测**:
|
|
87
|
+
1. 在役库临时副本直调(MdCGOS 无 DEK,k=30):top5 全为 `mem_*` 手工归档节点,`dsh-log-` 节点 0 进榜——`dsh-log` 正文是 `mdcg-enc:v1` 密文(sensitivity=private 落盘即加密),明文词法零重叠,以『SetNamedSecurityInfoW grantWrite 沙箱』三个专名组成逐字诊断查询也不现身;`search` 与 `search_rrf` 同。
|
|
88
|
+
2. 管线重放临时库 + 归属会话读者:含该事实的块 `dsh-log-…-0004` 存在(token 幸存),但全排序仅 **13/19**,top-5 未进。
|
|
89
|
+
3. 后续新会话读者与 can_admin 设计者读者:scanned=0,全不可见。
|
|
90
|
+
- **命中**:**否**。
|
|
91
|
+
|
|
92
|
+
### C2 工作区目录与真实仓库位置
|
|
93
|
+
|
|
94
|
+
- **查询词**:当前 DSH 的工作区目录怎么是空的?真正的 dsh-memory 仓库到底在哪里?
|
|
95
|
+
- **期望事实**(事实点):
|
|
96
|
+
- DSH 工作区目录:会话初始化按需创建的空容器(turn2)
|
|
97
|
+
- 实测 entryCount=0(空目录)
|
|
98
|
+
- 真实仓库另有其处:即本报告所在仓库的检出目录
|
|
99
|
+
- **实测**:
|
|
100
|
+
1. 活库副本直调:top5 无 `dsh-log-`;该事实在活库由 `mem_1790416361175`(交接单,第 5 名)等手工归档节点覆盖。
|
|
101
|
+
2. 重放库 + 归属会话读者:含该事实的块**不存在**——检索词『dsh-memory-main』在全部 19 块解密内容中零命中——该结论位于 turn2 助手消息深处,被 docindex 摘要截断(每章渲染仅 759–1034 字),根本未入库,检索无从命中。
|
|
102
|
+
3. 其他读者形态不可见。
|
|
103
|
+
- **命中**:**否**。
|
|
104
|
+
|
|
105
|
+
### C3 会话日志体积与用户输入占比
|
|
106
|
+
|
|
107
|
+
- **查询词**:那份 DSH 会话日志解压之后有多大?用户真实输入在里面能占多大比例?
|
|
108
|
+
- **期望事实**(事实点):
|
|
109
|
+
- 日志 691 个 zstd 帧;解压约 4.04 MB;1323 个事件(turn14)
|
|
110
|
+
- user/message 仅 17 条,占比约 0.08%
|
|
111
|
+
- assistant/message 占比约 55.4%
|
|
112
|
+
- **实测**:
|
|
113
|
+
1. 活库副本直调:无 `dsh-log-` 进榜。
|
|
114
|
+
2. 重放库 + 归属会话读者:**命中排名 1/19**★——`dsh-log-…-0017` 含『4.04』『691』(该节开头部分幸存截断);但 0.08%/1323/55.4% 等表格数据在 turn 深处被截掉,节点只含部分事实。
|
|
115
|
+
3. 后续会话/设计者读者:不可见。
|
|
116
|
+
- **命中**:**是(部分事实)**。
|
|
117
|
+
|
|
118
|
+
### C4 dsh web 重启不生效与后台编排
|
|
119
|
+
|
|
120
|
+
- **查询词**:为什么在会话里直接发起 dsh web 重启总是不生效?后台编排进程为什么没跑起来?
|
|
121
|
+
- **期望事实**(事实点):
|
|
122
|
+
- 会话内 pwsh 解释器不存在,仅有 Windows PowerShell(turn9-10)
|
|
123
|
+
- DETACHED_PROCESS 编排器随 run_code worker 退出被宿主连带回收
|
|
124
|
+
- 该编排器未活过 15 秒延迟启动窗
|
|
125
|
+
- 结论:dsh web 重启必须走宿主侧
|
|
126
|
+
- **实测**:
|
|
127
|
+
1. 活库副本直调:无 `dsh-log-` 进榜。
|
|
128
|
+
2. 重放库 + 归属会话读者:完整事实块不存在——检索词『detached_process』在 19 块中零命中(turn10 深处被截断);仅含『pwsh』的 `dsh-log-…-0013` 排第 4/19,top-5 有部分证据但不含宿主回收因果链,按全事实判据不命中。
|
|
129
|
+
3. 其他读者形态不可见。
|
|
130
|
+
- **命中**:**否**。
|
|
131
|
+
|
|
132
|
+
### C5 落盘成功但在役 MCP read 返回 null
|
|
133
|
+
|
|
134
|
+
- **查询词**:review_cli 落盘成功、磁盘索引里也能看到新节点,为什么在役 MCP 服务 read 还是返回 null?
|
|
135
|
+
- **期望事实**(事实点):
|
|
136
|
+
- 在役进程仅在启动时装载索引快照(turn12)
|
|
137
|
+
- 快照时点 22:13:16,约 14135 节点
|
|
138
|
+
- 其后不复查磁盘索引变化 → 跨进程写入不可见
|
|
139
|
+
- 对应缺陷线:P1b-2 读面缓存代际
|
|
140
|
+
- 探针节点 dsh_restart_recheck_20260926 为留存活体用例
|
|
141
|
+
- **实测**:
|
|
142
|
+
1. 活库副本直调:top5 无 `dsh-log-`;该结论由手工归档面覆盖(`mem_1790416403598` 交接增补第 1 名、探针节点 `dsh_restart_recheck_20260926` 第 5 名)。
|
|
143
|
+
2. 重放库 + 归属会话读者:检索词『dsh_restart_recheck_20260926』『14135』在 19 块解密内容中零命中——turn12 的时间戳证据链全部落在截断线之后,事实块未入库;返回的 4 条相关块均不含该事实。
|
|
144
|
+
3. 其他读者形态不可见。
|
|
145
|
+
- **命中**:**否**。
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## 四、效果总评
|
|
150
|
+
|
|
151
|
+
**总评**:`dsh-log-` 检索面在『唯一合法可读面』(重放库+归属会话读者)上 top-5 全事实命中率 **1/5**(且为部分事实),在现实使用面(后续新会话『后来想知道』)**0/5**——后者不可见是**设计行为**(private 会话绑定,`md_cg/mdcos.py:3948-3956`,issue #35 使用者拍板)。未命中根因链已逐层实证闭合,三个 gap:
|
|
152
|
+
|
|
153
|
+
**① 摄取覆盖率 gap(最重)**:docindex 设计为『不存全文,节点正文=CCG 模板+摘要』(`md_cg/docindex.py:13-14`、`md_cg/docindex.py:42` 行 `MAX_SUMMARY=200`),全文依赖 ref 回读,而 `scripts/dsh_log_index.py:50-54` **有意不写 doc_ref 绑定**(转写是临时暂存物)——实测转写 md 43,878 字符仅 14,805 字符入库(**覆盖率 33.7%**),66.3% 正文永久缺席,turn 深处的结论(C2/C4/C5 三案)物理不存在,任何检索器都无法命中。
|
|
154
|
+
|
|
155
|
+
**② 可见性 gap**:节点 frontmatter.session 绑死摄取时的会话 id,会话一换(重启/新会话即换 id)即永久不可见;设计者 can_admin 能过会话闸但过不了密钥闸——DEK 按 (tenant, actor) 签发(`md_cg/crypto.py:290-314`),封/开 AAD 均绑写入者 actor(`md_cg/mdcos.py:3764`/`md_cg/mdcos.py:3784`),跨 actor 永远解不开密——模块自述目标『使历史会话正文可被 cg search 检索面召回』(`scripts/dsh_log_index.py:7` 头注)在除『复用原会话 id』外的任何读者形态下均不成立。
|
|
156
|
+
|
|
157
|
+
**③ 排名 gap**:幸存块中数字/专名类事实(4.04MB)排第 1,共享词表高的叙事类事实(沙箱错误)仅排 13/19——19 块共享纪律尾注词表,判别弱。
|
|
158
|
+
|
|
159
|
+
**已验证的机制面**:同身份往返实验(自带 KEK、全新临时库)命中排名 1、异身份不可见;三会话重放 2+19+12=33 节点与在役库逐条同 id,分块确定性无漂移——**管线机制本身无缺陷,问题在截断与可见性策略**。
|
|
160
|
+
|
|
161
|
+
**对照发现**:在活库中 C2/C5 的信息需求实际由 internal 密级手工归档节点(`mem_*`)满足并进 top-5,『手动写记忆』面当前是可检索主力,`dsh-log` 面贡献 ≈0。
|
|
162
|
+
|
|
163
|
+
**边界与未测项**:按隐私纪律未触真实令牌库(~/.mdcg)与在役 serve 进程,持真实 DEK 的在役服务实测表现未测,此为本验证的残余盲区;在役库全程只读(实验全在临时副本/重放库),验证期间在役库簿记文件有一次 00:09:48 的写入系在役 serve 自身 sustain 周期心跳(已排除本验证责任:`refindex.index_dir` 仅在显式传 ledger 时才写,`md_cg/refindex.py:302`/`md_cg/refindex.py:323`,本验证未传);全部临时实验产物已清理,实现员的转写暂存目录非本验证创建,保留未动。
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## 五、使用指引(命令 / 参数 / 幂等)
|
|
168
|
+
|
|
169
|
+
环境:`set PYTHONUTF8=1`(第 15 条:argv 列表 + 显式 UTF-8,不经 Windows shell)。依赖:`zstandard`(pip);`md_cg` 包(脚本自注仓库根进 sys.path)。
|
|
170
|
+
|
|
171
|
+
```text
|
|
172
|
+
# ① 先看会碰到什么:不写库,只转写 + 统计
|
|
173
|
+
python scripts/dsh_log_index.py --sessions-root <DSH会话根> --dry-run
|
|
174
|
+
|
|
175
|
+
# ② 按会话摄取进活库(--root 缺省取 MDCG_ROOT)
|
|
176
|
+
python scripts/dsh_log_index.py --sessions-root <DSH会话根> --root <灵枢库root> --session <session-id>
|
|
177
|
+
|
|
178
|
+
# ③ 按工作区过滤 / 指定写入身份
|
|
179
|
+
python scripts/dsh_log_index.py --sessions-root <DSH会话根> --workspace <工作区目录名> --actor dsh-memory --tenant default
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
- **空库首摄**须显式 `--allow-init`;对已有库不加该参数即拒绝初始化(防误指 root)。
|
|
183
|
+
- **幂等**:节点 id 由 (session-id, 章节序号) 决定 → 确定性;转写路径确定(临时根 + 工作区 + 会话 id),重跑生成逐字节相同的转写;写入前查活库索引,已存在即计 `nodes_skipped_existing` 跳过,**不覆写**(活库只增不删)。已实测:重跑 `nodes_indexed=0` / `nodes_skipped_existing=19`,库内无重复。
|
|
184
|
+
- **回收钩子**:节点 id 前缀 `dsh-log-` 专用于识别与将来回收;当前无删除路径,回收须待活库 deletion 策略裁决。
|
|
185
|
+
- **转写暂存**:默认保留在系统临时目录的确定路径(溯源见节点 frontmatter.dsh_log 的 transcript 字段);要即清即加 `--cleanup-transcripts`。
|
|
186
|
+
- **读取边界(重要)**:摄取出的 private 节点仅**归属会话**(principal.session 绑定)与设计者可读;换会话后即不可见(见 §四 gap ②)——不要预期新会话能检索到旧会话的 `dsh-log-` 节点。
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## 六、遗留与建议
|
|
191
|
+
|
|
192
|
+
按影响排序(均为建议,未实施;在役库只增不删,任何方案须带 `dsh-log-` 前缀回收钩子):
|
|
193
|
+
|
|
194
|
+
1. **覆盖率(最重)**:66.3% 正文缺席使该面在『turn 深处结论』类问题上结构性失明。可选方向:(a) 把转写从「临时暂存」升级为「库侧受控持久化」,恢复 doc_ref 绑定与 `op=ref` 回读面——需先裁决日志原文第二暴露面的隐私代价;(b) 保持不存全文,但对该面提高摘要密度(多级切分 / 放宽 `MAX_SUMMARY`)——治标,深处结论仍会漏。
|
|
195
|
+
2. **可见性**:会话绑定 + DEK 按 (tenant, actor) 的双重闸,使该面只服务『复用原会话 id』单一读者形态。若目标是跨会话召回,须走策略裁决(如读面代理身份 / 密钥迁移),**不要**试图绕过密钥闸;短期现实做法是:重要结论仍走『手动写记忆』面落 internal 节点(现状已证明其是可检索主力)。
|
|
196
|
+
3. **排名**:19 块共享纪律尾注词表压低判别力;若保留该面,可在转写时剥离/压缩共享尾注,让块间词表拉开区分度。
|
|
197
|
+
4. **定位声明**:三 gap 修复前,`dsh-log-` 摄取面**不宜**当作常规检索依赖;其当前价值在机制验证(分块确定性、幂等、加密落盘)与审计溯源(frontmatter.dsh_log)。
|
|
198
|
+
5. **残余盲区**:持真实 DEK 的在役 serve 表现未测(隐私纪律禁触);若需要在役面验证,须由在役侧授权的专用探针会话执行。
|
|
199
|
+
6. **工程收尾**:`scripts/dsh_log_index.py` 为 untracked,待编排会话评审后 commit。
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## 七、纪律合规声明
|
|
204
|
+
|
|
205
|
+
- **隐私(工程纪律第 9 条)**:DSH 会话日志为私有侧数据,摄取目标仅为私有活库 root,未触公开库;本报告与工具输出均不打印日志正文原文——查询词为纪律允许的验证用查询词,日志派生内容一律以 ≤50 字、重新措辞的事实点呈现(v1.0 整改项:期望事实事实点化、去本机盘符路径与编码路径目录名、去日志原话式长句);命令与说明中日志目录一律写「DSH 会话根」占位。
|
|
206
|
+
- **活库保护**:在役库只增不删——+19 全为 `dsh-log-` 前缀新节点,既有节点零修改零删除(摄取 ①/幂等 ② 双实测佐证);实验全在临时副本/重放库进行,在役库全程只读(验证期间唯一一次簿记写入系在役 serve 自身 sustain 心跳,已排除本验证责任,证据见 §四边界项)。
|
|
207
|
+
- **临时产物**:验证会话全部临时实验产物已清理;实现员的转写暂存目录非本验证创建,保留未动。
|
|
208
|
+
- **撰写会话自查范围(诚实边界)**:撰写会话实跑项 = ①`git status --porcelain`(确认仅 `?? scripts/dsh_log_index.py`);②全部代码引证逐条读码比对(`scripts/dsh_log_index.py:2-67` 头注/用法、`md_cg/docindex.py:2/13-14/41/42/284`、`md_cg/refindex.py:302/323/378-392`、`md_cg/mdcos.py:3948-3956/3764/3784`、`md_cg/crypto.py:290-314`);③CLI 参数面 `grep add_argument` 核对(九个参数与 §2.1 表逐项一致);④`python -m md_cg.test_p27_docindex` → 通过 98 / 失败 0;⑤`python -m md_cg.test_p1x_ref_root` → 10/10 通过;⑥隐私预扫描(见下)。摄取统计、幂等复跑、五案检索、dry-run 快照对照为验证会话实测记录,撰写会话未重跑(触活库/私有会话根,按隐私纪律不重复触达)——文中已逐处标注,未将记录冒充为本会话实跑。
|
|
209
|
+
- **隐私预扫描(撰写会话实跑,成稿后对文件全文执行)**:①盘符路径扫描(逐字符查「字母+冒号+斜杠」形态)→ 0 条;②门禁提示中的命中形态字面串(「命中」+全角冒号)→ 0 条;③已删的两处日志原话短语复查(不在此复述其字面)→ 0 条;④「期望事实」事实点逐条长度实测 → 19 条全部 ≤50 字(实测最长 47 字)。扫描以单条 `python -c` 串实现(unicode 转义定位模式,避开 shell 转义链路),计数输出:`drive_paths: 0 / hit_colon_lit: 0 / removed_phrases: 0 / fact_bullets: 19 max_len: 47 over50: []`。
|