@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
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
# 缺陷挖掘报告 · 自主迭代 v16(md_cg 三轮深挖·三圈首站)
|
|
2
|
+
|
|
3
|
+
- **日期**:2026-09-25
|
|
4
|
+
- **范围**(生效条件):第 16 轮 = md_cg 域三轮深挖首站,四区复核(legacy / recent / engine / retrieval)共 **39 条目**(confirmed 39 / rejected 0)→ 跨区重复冗余 **22 条**(N123/N124/N125/N126/N129/N62 六项各四区重复 ×3、N77/N121 两项各三区重复 ×2)→ 独立缺陷 **20 项**(本轮新发现 11 项 **N130-N140**:high 3 / medium 7 / low 1;legacy 复测 9 项:v15 五项留档 N123/N124/N125/N126/N129、v8 N62〔第四轮〕、v9 N77〔多轮〕、v14 N121〔第三轮〕、历轮 low 合并族)→ 本轮修复 **5 个补丁**(新 high 3 项全闭 + 历轮欠账速收 2 笔 N123/N124,全 Python 面、全 md_cg 域、零 Rust/TS 改动)→ 遗留 **15 个开口**(medium 7 / low 8)+复测通过结案 1(v14 N120)+已修剔除 5+rejected 0
|
|
5
|
+
- **编号口径**:v15 用至 N129(v15.md:4 编号口径行核实),本轮新发现自 **N130 续编**。**材料三域临时编号冲突及本报告会话统一裁决**(如实记录):材料中 recent 区新发现暂编 N130-N133、engine 区建议编 N130-N133、retrieval 区暂编 N130-N132,同一编号被多域用于不同缺陷;裁决规则=①守卫文件名已锚定的 engine 区两项保留原名——**N130**(verify falsified 硬删,守卫 test_n130_verify_falsified_protect.py)与 **N131**(merge 绕闸,守卫 test_n131_merge_gate.py);②retrieval 区链读隔离顺延为 **N132**(其暂编 N130 与①冲突);③recent 区暂编 N130/N131/N132/N133 顺延为 **N133/N134/N135/N136**;④engine 区建议 N132/N133 顺延为 **N137/N138**;⑤retrieval 区暂编 N131/N132 顺延为 **N139/N140**。全部重编在第三节逐项标注原暂编号。
|
|
6
|
+
- **回归**:`python -X utf8 scripts/run_tests.py --jobs 4` 全量——**本会话实跑,`===== SUMMARY 200/200 通过,5 跳过(依赖缺失/平台不符) =====`,真实退出码 0**(200 = v15 的 195 + 本轮 5 个新守卫;与材料门禁口径逐字一致);**五个新守卫本会话逐一实跑全绿**(16/0、23/0、17/0、12/0、12/0,第四节);**swarm cargo test 未运行**(Rust 面零改动——本会话 git status 证实 swarm/ 与 rust/ 无改动);**npm test 未运行**(TS 面零改动——git status 证实 src/ 与 TS 测试未动);**npm run gate 失败——本会话第一手复现**:真实退出码 1,`[FAIL] R4 非追踪件面 命中=5;非追踪=29,允许=24`,命中清单 = 本轮全部 5 个新守卫(均未 git add;R1/R2/R3 均 PASS)——untracked 时序性,编排会话提交前裁决(材料口径与本会话一致,材料残片可见 3 个文件名 + 截断尾片,本会话实跑确认为 5 个全列)。
|
|
7
|
+
- **行号口径**:材料缺陷/修复行号为上游复核/修复会话时点快照;本轮并行修复使行号漂移处双标读核——N125 材料口径 mcp_server.py:3624-3626 → **读核现行 :3650-3652**(N130/N131 入口/schema 增行后移);MdCGSecure.verify 层写闸材料口径 mdcos.py:3815-3822 → **读核现行 :3831-3839**(merge 双闸增行后移);N126 材料口径 crypto.py:399-402 → **读核现行 :401-402**;N130 MCP 透传材料口径 :2213-2216/:2236-2241 → **读核现行 :2219/:2240**;其余修复落点读核与材料口径吻合(第二节逐项双标,以读核为准)。
|
|
8
|
+
- **结构口径**(CCG 六要素):功能名(标题)/ 生效条件(范围与口径行)/ 子功能(第二~五节)/ 执行与验证方式(第四节:实跑命令与结果)/ 不适用条件(第七节:跳过与未运行项)
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 一、执行摘要
|
|
13
|
+
|
|
14
|
+
本轮为 md_cg 域三轮深挖首站:四区复核 39 条目(rejected 0),跨区去重后 20 独立缺陷(新 11 + legacy 9),5 补丁闭合 5 项(high 3 + medium 2),遗留 15 开口。四个主题:
|
|
15
|
+
|
|
16
|
+
1. **三个 high 新发现当场全闭(本轮修复主体,均为「受保护面被打穿」级)**:N130——`verify(verdict="falsified")` 对原节点 `os.remove` 永久硬删,全程不经 guard_forget/require_layer_write/override,self/anchor 层、protected、importance≥0.7 四类受保护节点可被任意持 verify op 主体(verify 角色即含、designer 天然含)一次调用无痕删除——修复以 forget 路径同一 guard_forget 闸(基类)+ require_layer_write 层写闸(Secure 面)+ MCP 双入口 override 透传三层闭合,拒绝发生在一切副作用之前;N131——review_decide 的 merge 分支直写 `_write_node` 绕过 guard_write 与 require_layer_write(accept/edit 走 add() 有闸、唯 merge 无闸),orchestr 的 forbidden「anchor/self/goals/knowledge 层」被打穿,任意内容注入 self 层与 immutable 节点——修复以与 add 同款双闸(require_layer_write + guard_write,override 快照留痕)接在 merge_target_not_found 检查之后闭合,闸置于 _record_decision 之前(审计写自身会 AccessDenied 被吞,置后形同虚设——修复员读码如实记录);N132——关系链面(causal_chain/explain_chain/causal_path 及检索 chain 路 provenance)无读隔离,低权令牌经 chain.adjacency 直读 cg.index 全部节点 frontmatter,不可见节点 id、边条件文本与下游拓扑全量泄漏——修复以 MdCGSecure._chain_visible 谓词注入 chain.adjacency 单漏斗口闭合(walk/explain/causal_path/expand_from_seeds 及预测器全部消费者同闸),多堵住检索 provenance 面与预测器链消费面。
|
|
17
|
+
2. **历轮欠账速收 2 笔(任务留档复测重点①②兑现)**:N123(v15 速收候选)——derive 子令牌 TTL 无上限夹紧且过期不沿派生链传播(父令牌过期后子令牌仍以原密级可用,授权回收被时间维度旁路)——修复=子 expires_at=min(请求值, 父 expires_at)+clamped 开口 + verify_token 沿 parent 链上溯校验(存量库未夹紧子令牌由此兜底,与 revoke 级联语义对齐,seen 防环不挂死);N124(v15 留档)——租户登记表损坏时 _resolve_root 静默 fail-open 零告警——修复=TenantRegistry.load_error 损坏留痕 + except 分支 stderr 告警(零闸变,只开口,对照 MDCG_CLEARANCE 覆盖告警先例),覆盖「合法 JSON 但顶层非对象」不进 except 的路径。
|
|
18
|
+
3. **一致性/可用性面新发现 8 项留档(N133-N140,medium 7 / low 1)**:读缓存「写面零挂载点」自书承诺的破口(N133 forgetting.reinforce/insight.verify 漏标脏——同进程写后读永久陈旧)、负结果固化(N134 一次瞬态读失败→节点从检索面消失直至重启,「get 能读、search 搜不到」撕裂)、热缓存 env 登记不全(N135 _ENV_SWITCHES 仅 6 项违反同文件自书纪律,运行期翻转被缓存吞掉)、告警裸写 stderr 打穿 fail-closed 认证契约(N136——本报告会话读核补充:F1 新增的沿链环/祖先缺失告警 tokens.py:417-425 为同款裸写,顺收时应一并包裹)、降级搬迁索引条目缺字段致证伪传播断链(N137)、默认全开的 sustain 后台线程无锁并发(N138——丢更新实测 + RuntimeError 崩溃面实测)、密钥库损坏静默重签 DEK 覆盖写回(N139——旧密文永久不可解不可逆)、importance NaN/inf 直通排序键(N140——写一次长期污染全库排序)。
|
|
19
|
+
4. **遗留 15 开口的分诊**:8 项修复方向明确可速收(N133/N134/N135/N136/N140 + low 加固 N125/N126/族),7 项涉大设计决策(N62 授权链/租户语义、N77 失效粒度、N121 检索候选语义、N129 部署开关缺省语义、N137 索引真源回归面、N138 线程模型、N139 密钥生命周期),处置建议见第五节。任务留档复测重点①-⑦全部复测并有结论:①N123 已修、②N124 已修、③N125 维持 deferred(新增 '*' 通配姊妹面证据)、④N126 维持 deferred、⑤N129 维持 P1-4 裁定面 deferred、⑥N62 维持 deferred(两域对「角色 cap 最小夹紧低风险」评估一致、「租户 cap naive 接线破坏缺省部署」风险一致——角色面可顺收、租户面必须专项)、⑦热缓存失效缺口(N77)与 O(全池)(N121)复测现状未变。
|
|
20
|
+
|
|
21
|
+
**对输入口径的核验**:输入称「四区复核 confirmed 若干 + 5 修复 + 留档未修 15 条」。本会话以 `git status --porcelain` / `git diff --numstat` + 五处落点读核核对:改动面 = **六个修复源文件**(md_cg/tokens.py +41/-6〔F1〕、md_cg/mdcg.py +15/-3〔F2 基类闸〕、md_cg/mdcos.py +35/-2〔F2 Secure 闸 + F3 merge 双闸 + F4 _chain_visible〕、md_cg/mcp_server.py +36/-10〔F2/F3 入口与 schema + F5 告警〕、md_cg/chain.py +19/-4〔F4〕、md_cg/security.py +12/-5〔F5〕)+ **五份常驻守卫**(test_n123_derive_expiry_chain.py / test_n130_verify_falsified_protect.py / test_n131_merge_gate.py / test_chain_read_isolate.py / test_tenant_registry_corrupt_warn.py,均未跟踪新文件)——与五项修复一一对应;另有 `md_cg/whitebox_kb/wisdom/code_solidified.json`(+1/-2)为 v10-v14 报告已注明的先前会话遗留工作区变更,非本轮触点。五项修复由并行修复员会话完成(材料各自声明未触碰他方文件;F4 修复员并发现并恢复一处并发改动造成的 _readable nsess 缩进意外回归——HEAD 为 12 空格在 private+ 块内、工作区 8 空格在块外,恢复后其守卫 G1 转绿,本会话读核 chain.py 修可佐证),本报告会话未修改任何源文件。条目账目:39 confirmed(legacy 7 / recent 11 / engine 11 / retrieval 10)− 冗余 22 = 17 独立条目,其中 4 条为双缺陷合并条目(legacy#2〔N62+N124〕、recent#11〔N77+N121〕、engine#11〔N120+N121〕、retrieval#10〔N77+N121〕)→ 20 独立缺陷 + N120 复测通过结案;20 − 5 修 = 15 开口,与材料留档 15 条逐条对应、无多无少;rejected 三区数组均为空(0 条证伪——与 v15 的 2 条证伪不同,本轮四区复核无证伪项,已修剔除 5 项见第三节小节)。
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 二、修复清单(5 项,逐项 where / 缺陷面 / 修复 / 攻击前后对比 / 守卫)
|
|
26
|
+
|
|
27
|
+
### F1(N123,medium,v15 留档速收候选兑现)derive 子令牌 TTL 夹紧 + 过期沿派生链传播
|
|
28
|
+
|
|
29
|
+
- **where**:材料口径 `md_cg/tokens.py` derive() 原 :465(现 :493 附近 final_exp)与 verify_token 原 :406-408(现 :428-453 沿链校验)+ 新增守卫 `md_cg/test_n123_derive_expiry_chain.py`(仿 test_p21_tokens.py 风格)。**本会话读核**:derive 生效条件注释 :458(含「候选与父记录 expires_at 均非空时取 min(N123:派生在时间维度同样只能收窄,父无界时取候选),被父夹紧时向 clamped 追加 "expires_at"」)、夹紧实现 :483-492(pexp 取父界、min 夹紧、clamped.append("expires_at"))、记录写入 :500 `"expires_at": final_exp`;verify_token 生效条件注释 :393(含沿链上溯语义)、自身过期校验 :408、沿链循环 :411-431(seen 防环 :415-421、祖先缺失 stderr 告警 :423-425、祖先过期抛 TokenError :428-431「令牌已失效:派生链祖先 … 已过期(过期沿派生链传播)」)——全部在位。
|
|
30
|
+
- **缺陷面**:derive() 子令牌 `expires_at=(now+ttl)` 无与父 expires_at 的 min 夹紧且过期不沿派生链传播——持 delegable designer 令牌面(设计者自身或其宿主进程/提示注入驱动 derive)先派生长 TTL 子令牌再令父令牌自然到期,子令牌在自身过期前继续可用;verify_token 仅比对记录自身 expires_at(revoke 有级联 :558 唯过期没有)——「派生只能收窄」的时间维度缺失,授权回收被时间维度旁路。
|
|
31
|
+
- **修复**(两处最小修,函数头「生效条件」注释同步更新):①derive()——过期候选 want_exp=(now+ttl) if ttl else 父 expires_at,与父记录 expires_at 均非 None 时取 min 夹紧,被夹时向返回值 clamped 追加 "expires_at"(与既有 clearance 夹紧开口同款式);父无界取请求值、子未指定 ttl 沿用父界(旧行为保持)。②verify_token()——自身 expires_at 校验后沿 parent 链上溯,任一祖先已过期即抛 TokenError(存量库修复前派生的未夹紧子令牌由此兜底,与 revoke 级联语义对齐);seen 集合防环(环/祖先记录缺失均 stderr 告警后截断,不挂死不阻断——吊销已由 revoke 级联物化,此处只补过期维度,文件写权不在令牌威胁模型内);链深因 delegable=False 封口常态为 2,开销可忽略。未触 mcp_server/mdcg/mdcos 等并行修复员改动面;未 git commit。
|
|
32
|
+
- **攻击前后对比**:修复前(守卫实测,临时哑令牌库)——issue(designer,ttl=3600)→derive(record,ttl=999999) 得子-父=+996399s、clamped=[];父记录 expires_at 置为已过期后 verify_token(child) 仍成功返回 Principal(攻击成立);端到端 issue(ttl=0.4)→derive(ttl=999999),sleep 0.7s 父抛「令牌已过期」同一子令牌 verify OK;三层链中间层过期孙令牌仍通过。修复后——同攻击形态 derive 返回 expires_at=父界(child-parent=0.0s)、clamped=['expires_at'];父过期后子令牌抛 TokenError「派生链祖先…已过期」;孙令牌沿链拒验;父无界时子 ttl=60 正常取请求值(delta=60.0s 无误夹)、子未指定 ttl 沿用父界、子自身先到期仍按自身拦截——收窄语义无放大。
|
|
33
|
+
- **守卫**:`md_cg/test_n123_derive_expiry_chain.py`:6 组 16 断言——①derive 夹紧+clamped 开口 ②父记录置过期→子沿链拒验(免 sleep 核心断言)③真实自然到期端到端(ttl=0.4/sleep 0.7,仿 p21 先例)④父无界取请求值/子短于父/子无 ttl 沿用父界三正向 ⑤子自身先到期仍拦 ⑥存量库三层链传播+沿链耗时<2s+parent 环防挂死。纪律:全程 tempfile.mkdtemp 哑令牌文件+MDCG_TOKEN_FILE 兜底防回落真实 ~/.mdcg,finally shutil.rmtree 清理。**本会话实跑:`python -X utf8 -m md_cg.test_n123_derive_expiry_chain` → 「通过 16 / 失败 0」EXIT=0**。
|
|
34
|
+
- **verified_by**(材料口径,本会话未重跑的细项如实标注):①守卫旧代码红:通过10/失败6(子-父+999639s、父过期子仍过、三层链穿透、clamped=[]);②修后 16/16 绿(本会话复跑一致);③既有回归:test_p21_tokens 38/0、test_tenant_env_override_warn 11/0(15 轮租户告警面无回归——本会话复跑一致)、test_action_derive 46/0、hive.test_orch 85/0、test_ccgc 84/0(ccgc.py:627 verify_token 消费面);④全量:首轮 `python scripts/run_tests.py --jobs 4` 197/197(随并行修复推进至本会话终态 200/200,第四节);材料注:首轮唯一失败 test_n130_verify_falsified_protect 经单跑 PASS 23/0+全量复跑消失判定为并行 flaky,与本修无因果。git diff 核对 tokens.py 仅含本修两处+注释。
|
|
35
|
+
|
|
36
|
+
### F2(N130,high,本轮新发现)verify falsified 永久硬删无保护闸:四类受保护节点可被一键无痕删除
|
|
37
|
+
|
|
38
|
+
- **where**:材料口径 `md_cg/mdcg.py:3171-3206`(verify falsified 分支,原 :3188-3195,os.remove 现 :3206;guard_forget 调用 :3199-3200)+ `md_cg/mdcos.py:3815-3822`(MdCGSecure.verify 层写闸;**本会话读核现行 :3831-3839**,生效条件注释 :3831、require_layer_write :3837,行移因 F3 merge 双闸增行)+ MCP 入口 `md_cg/mcp_server.py`(cg op=verify 与 mdcg_verify 透传,材料 :2213-2216/:3179-3182,**读核现行 :2219**;schema 补 override 材料 :198-207,**读核现行 :202-206**「一键证伪删除,需显式 override=true,旧版本自动快照+留痕」)。守卫 `md_cg/test_n130_verify_falsified_protect.py`(新文件)。**本会话读核**:mdcg.py:3170 生效条件注释(「verdict=="falsified" 时先经 protect.guard_forget(受保护节点需显式 override=True……拒绝抛 ProtectionError 且无任何副作用)」)、:3199 `protect.guard_forget(self, node_id, override=override,` 在位。
|
|
39
|
+
- **缺陷面**:verify(verdict="falsified") 对原节点 os.remove 永久硬删,全程不经 protect.guard_forget/require_layer_write/override——self/anchor 层、protected=True、immutable、importance≥0.7 四类受保护节点可被一键删除且无快照无留痕不进 trash。任何持 verify op 的主体(tokens.py verify 角色 ops_allow 即含 verify,designer ops=["*"] 天然含)一次调用永久删除,无需 override 无需 admin。对照同函数 _move_layer :3139 调 protect.guard_move、mdcos forget :2311 调 guard_forget、protect.py guard_forget 对受保护节点抛 ProtectionError——闸原本就在,唯 verify falsified 分支漏接。
|
|
40
|
+
- **修复**:①基类 MdCG.verify 增 override=False 形参,falsified 分支在一切副作用(add_rejected/os.remove)之前调 protect.guard_forget(self, node_id, override=override, actor=getattr(self,"actor",None))——拒绝发生在 add_rejected 之前,拒绝路径零副作用;override=True 则先快照进 _protected_history 并留痕 _protected_audit.jsonl(protect.py:209-217/:151-169/:186-189)后才走原负记忆化+删除流程。②MdCGSecure.verify 新增覆写:verdict=falsified 且索引有条目时先 principal.require_layer_write(条目 layer, sensitivity or DEFAULT_SENSITIVITY)——falsified 删除=对原节点层的删除写,与 add/add_rejected 同一闸口(verify 角色 layers_allow 本就只含 rejected/contextual,tokens.py:167/:171 forbidden 显式列「不得改被验证内容」),再透传 override 给 super()。③MCP 两入口透传 a["override"],mdcg_verify schema 补 override 参数与保护语义描述。边界如实说明:immutable-only 节点(层∉{self,anchor}、无 protected 标记、importance<0.7)按 guard_forget/forget 路径同一「不可遗忘≠不可覆盖」教义(protect.py:22-29)不拦,在 secure 面仍受层写校验约束;基类无 principal 故层写闸只在 MdCGSecure 生效。未 git commit。
|
|
41
|
+
- **攻击前后对比**:修复前(红,实测)——持 verify op 主体对 n_self(self 层)/n_anchor(anchor 层)/n_prot(protected=True)/n_imp(importance=0.9)任一节点 verify(verdict="falsified"),一次调用 action=falsified 且原节点 os.remove 永久硬删——索引条目与盘面文件双消失、无快照、不进 trash、_protected_history 从未创建、零 ProtectionError/AccessDenied(守卫 R1-R5 全 FAIL)。修复后(绿)——同身份同调用两层闸拒绝:基类引擎面四处全部抛 ProtectionError(索引与盘面原样保留,R1-R6 过);secure 面 verify 角色对 knowledge 层普通节点 falsified 抛 AccessDenied(R7 过)、对 contextual 本职节点照常放行(G3 过)、designer 对 self 层节点无 override 仍 ProtectionError(R8 过);普通未保护节点 falsified 负记忆化语义不变(G1/G3 过);受保护节点需显式 override=True 才放行,且放行前自动快照+留痕 override_forget(G2a-d 过)。
|
|
42
|
+
- **守卫**:`md_cg/test_n130_verify_falsified_protect.py`(既有风格:ok() 计数+非零退出+tempfile.mkdtemp 临时库+finally rmtree;MdCGSecure 用显式哑主密钥 bytes(range(32)),不触环境变量/真实令牌库/真实数据目录)。红项 R1-R8 四类受保护节点硬删复现+secure 层写缺口,绿项 G1-G3 语义不变锁(普通节点负记忆化、override 放行+快照+审计留痕)。**本会话实跑:`python -X utf8 -m md_cg.test_n130_verify_falsified_protect` → 「结果:PASS 23 / FAIL 0」EXIT=0**。
|
|
43
|
+
- **verified_by**(材料口径,本会话未重跑的细项如实标注):①红:修复前 R1-R5 全 FAIL、G2 TypeError(override);②绿:23/0 EXIT=0(本会话复跑一致);③回归:test_p1 38/38、test_verify_dirty_reconcile 18/18、test_hot_cold 33/33;④全量 md_cg 域套件 199/199(终态 202/202,含本守卫注册入套件)。
|
|
44
|
+
|
|
45
|
+
### F3(N131,high,本轮新发现)review_decide merge 分支绕层写/保护双闸:orchestr forbidden 层被注入打穿
|
|
46
|
+
|
|
47
|
+
- **where**:材料口径 `md_cg/mdcos.py:2221-2242`(merge 分支,_write_node 直写原 :2235 现后移;双闸新落 :2233-2242)+ 签名加 override `md_cos.py:2118-2122` + MCP 入口 `md_cg/mcp_server.py:2236-2241`(cg op=review,**读核现行 :2240** `override=bool(a.get("override"))`)与 :3218-3224(mdcg_review_decide)+ schema 补 override(材料 :244-257,**读核现行 :247-258**「merge 进受保护目标需显式 true」)。守卫 `md_cg/test_n131_merge_gate.py`(新文件)。**本会话读核**:mdcos.py:2117 生效条件注释(「merge 须 merge_into……且写入前经与 add 同款双闸(N131,2026-09-25:principal 在位先 require_layer_write(目标层, 目标敏感度)——与 MdCGSecure.add 同序同错型;再 protect.guard_write(override=override)……拒绝抛 ProtectionError/AccessDenied 且提案留 pending 不落库)」)、:2235-2237 `if _p is not None and hasattr(_p, "require_layer_write"): _p.require_layer_write(` 在位;对照 add 闸 :3781-3786(MdCGSecure.add require_layer_write)在位。
|
|
48
|
+
- **缺陷面**:review_decide 的 merge 分支把提案内容直接 _write_node 追加进任意 merge_into 目标节点,绕过 guard_write 与 require_layer_write——:4046 注释「accept/edit 落节点时的层写仍由下游 require_layer_write 拦截」对 merge 不成立(accept/edit 走 add() 有闸,merge 直写无闸),orchestr 的 forbidden「anchor/self/goals/knowledge 层」被打穿。攻击面:持 review+write op 的令牌(orchestr 的 ops_allow 两者皆含;designer 全权)propose 任意内容 → review_decide(pid, decision="merge", merge_into=<self/anchor/immutable/knowledge 任意节点 id>) 注入任意文本。
|
|
49
|
+
- **修复**:①merge 分支在 merge_target_not_found 检查之后、组装 merged_content/_write_node 之前接入与 add 同款双闸:principal 在位(getattr + hasattr 探测,同 mcp_server 既有形态)先 require_layer_write(目标层, 目标敏感度 or DEFAULT_SENSITIVITY)(层取索引条目/tgt frontmatter/路径首段回落,与 MdCGSecure.add 同序同错型 AccessDenied);再 protect.guard_write(self, target, override=override, actor=...)——self/anchor 层、immutable 标记,无 override 抛 ProtectionError,override=True 快照+_protected_audit 留痕后放行(与 add 能力面对齐)。②review_decide 签名末尾加 override=False 形参(既有调用全部向后兼容),生效条件注释同步更新。③闸放在 _record_decision 之前——审计节点写入本在其 try/except 内(写 self 层会 AccessDenied 被吞成 record_error,材料读证 mdcos.py:1985-1996),闸放那里形同虚设;现拒绝异常直接向上传播、提案留 pending 不落库。边界如实说明:protected=True/importance≥0.7 的 knowledge 目标 merge 仍放行——与 add 覆写同语义(不可遗忘≠不可覆盖,protect.py:22-29),本缺陷攻击面(self/anchor/immutable 目标 + orchestr 越层写 knowledge)全部封堵。未 git commit。
|
|
50
|
+
- **攻击前后对比**:修复前(红,实测)——orchestr 型 principal(layers_allow=[contextual,unresolved,rejected],ops 含 review+write,can_admin=False)propose 后 merge 进 knowledge 层节点 ok=True 且注入文本进正文(R4 红);基类面 merge 进 self 层/tgt_imm(immutable=True)同样 ok=True 注入成功零异常(R1/R2 红,orchestr 面 R5 同);对照 orchestr add 写 self 层正确 AccessDenied、designer add 覆 immutable 正确 ProtectionError——闸原本就在,唯 merge 直写绕过;debug 旁证:merge 进 t_self 返回 ok=True 且 record_error="AccessDenied: 角色 orchestr 无权写入 self 层"(审计写被吞,注入成立)。修复后(绿)——同身份 merge 进 knowledge/self 目标抛 AccessDenied(提案留 pending)、基类面 merge 进 self/immutable 抛 ProtectionError,目标正文零注入(R1/R2/R4/R5 全过);普通 knowledge 目标 merge 照常追加(G1 过)、orchestr 本职 contextual 目标照常放行(G2 过)、designer override=True merge 进 immutable 显式放行且旧版本快照+override_write 留痕(G3 过)。
|
|
51
|
+
- **守卫**:`md_cg/test_n131_merge_gate.py`(既有风格+哑主密钥 bytes(range(32)),tempfile 临时库+finally rmtree)。红项 R1-R5(基类 self/immutable 目标 + orchestr 面 knowledge/self 目标注入复现),绿项 G1-G3 + 对照 R3/R6(闸原本就在)。调试备注(材料如实留痕):首轮置景三提案内容相同被 propose payload_hash 幂等去重(同 pid→already_decided)掩盖两断言,改为内容互异后红项干净成立。**本会话实跑:`python -X utf8 -m md_cg.test_n131_merge_gate` → 「结果:PASS 17 / FAIL 0」EXIT=0**。
|
|
52
|
+
- **verified_by**(材料口径,本会话未重跑的细项如实标注):①红:修复前 R1_self1/2、R2_immutable1/2、R4_orch_knowledge1/2、R5_orch_self1/2 全 FAIL;②绿:17/0 EXIT=0(本会话复跑一致);③回归:test_merge_upsert 11/11、test_p2 37/37、test_review_conformance 38/38、test_mr_m2 64/64、test_govern_directread 40/40、test_index_durability 16/16、test_review_onepass 10/10;④全量 md_cg 域套件 200/200(终态 202/202,含本守卫)。
|
|
53
|
+
|
|
54
|
+
### F4(N132,high,本轮新发现——retrieval 区暂编 N130,因守卫锚定的 engine 区 N130 冲突顺延,见编号口径)关系链面读隔离:低权令牌经链 API 读尽不可见节点与边条件
|
|
55
|
+
|
|
56
|
+
- **where**:材料口径 `md_cg/chain.py:125-170`(adjacency 可见性闸,唯一漏斗口——walk/explain/causal_path/expand_from_seeds 全部经它建表)+ `md_cg/mdcos.py:3910-3913`(MdCGSecure._chain_visible 谓词注入,紧随 _readable :3863-3908)。守卫 `md_cg/test_chain_read_isolate.py`(新文件)。**本会话读核**:chain.py:126 生效条件注释(「cg 提供 _chain_visible(nid) 谓词(读隔离,MdCGSecure 注入)时不可见 nid 的出边整体不入表、指向不可见目标的边(含层级合成边)截断——不可见节点 id、其边条件与下游拓扑对调用方不存在(walk/explain/causal_path/expand_from_seeds 全部消费者同闸)」)、:135 读隔离注释、:142 `vis = getattr(cg, "_chain_visible", None)`;mdcos.py:3909 生效条件注释(关系链面单点隔离+实例身份稳定+fail-closed 纪律带入)、:3910 `def _chain_visible(self, nid) -> bool:` 在位。
|
|
57
|
+
- **缺陷面**:causal_chain/explain_chain/causal_path 无读隔离——MdCGSecure 方法清单无这三者的覆盖,基类实现原样转调 chain.walk/chain.explain/predict.causal_path;chain.adjacency(chain.py:139-146 缺陷时点)直接读 cg.index 全部节点 frontmatter 出边,全程不经 cg.get/_readable,输出含不可见节点 id、边条件文本与下游拓扑。MCP 面两入口均无可见性闸:mdcg_causal→_causal_call(mcp_server.py:1363-1393)且 _MDCG_OP_REQUIRE["mdcg_causal"]="read"——全部角色 ops_allow 均含 read(材料 ROLE_SPECS 全表实测),record/internal 等任意低权令牌可传任意 node_id/a/b 直达;cg op=causal 路径需 ops 含 'causal'(仅 designer 可达)。Secure.search_rrf 只过滤结果不过滤 meta——chain 路 provenance 同源泄漏。
|
|
58
|
+
- **修复**:①chain.adjacency 增可选可见性谓词闸:cg 提供 _chain_visible(nid) 时(getattr 探测,基类无此属性行为零变化)——不可见 nid 整体不入邻接表(不解析其 fm,出边与条件不可见)、可见节点指向不可见目标的边截断(层级合成 part_of 边同闸),缓存键由 (include_hierarchy, adj) 扩为 (include_hierarchy, 闸存在位, adj);_chain_adj 缓存结构仅 chain.py 内部消费(全仓 grep 实证),扩展安全。②MdCGSecure._chain_visible(nid) = 索引有条目 ∧ _readable(e)——_readable 绑定档判定恒用 principal.session,实例身份稳定,与 adjacency 缓存无跨身份串台;_readable 的 fail-closed 纪律(密级未知按 secret)随之带入链面。③采纳修复方向「或链构建走 _readable 面」的单点形态:基类三方法无需逐个覆盖,与其余 adjacency 消费者(predict.py:143/:150/:514/:694/:1006/:1035)同经单闸隔离,多堵住检索 chain 路 provenance(_path_chain mdcos.py:1042-1093→expand_from_seeds)与预测器其余链消费面。④附带发现并修复:工作区 _readable 的 nsess 两行被并发改动意外 dedent 出 private+ 块(HEAD 12 空格在块内、工作区 8 空格在块外——使 public/internal 也变会话绑定档,跨会话共享档语义被打穿);已恢复 HEAD 原样缩进,其守卫 G1 在恢复前 FAIL、恢复后 OK(守卫顺带锁定该回归)。边界如实说明:可读节点自身 frontmatter 的 edges 元数据随节点视图返回仍对可读者可见——那是节点自身 md 原文的一部分,不属本缺陷链展开面(守卫注释已注明)。未 git commit。
|
|
59
|
+
- **攻击前后对比**:修复前(红,实测)——reader(record 角色,clearance=internal,异会话)对 designer 写的 X苹果(internal)→Y秘密(private,边条件'Y侧秘密条件文本YY')→Z结论(internal) 链:①causal_chain('X苹果') 返回含 Y秘密 id 与秘密条件文本的链(R1a/R1b 红)②causal_chain('Y秘密') 对不可见节点起链成功(R2 红)③explain_chain 渲染输出带秘密(R3 红)④causal_path('X苹果','Z结论') 可达且逐跳条件含秘密文本(R4 红)⑤search_rrf('苹果',paths=('lexical','chain')) 的 provenance chain/conditions 携带不可见全链与秘密文本(R5 红;收窄断言经实例属性遮蔽仿真旧码二次证红)。修复后(绿)——同 reader 四面全部封死:链输出零 Y秘密零秘密文本、对不可见节点起链返回空链(与节点不存在同形)、explain_chain 零泄漏、causal_path 不可达零泄漏、provenance 零泄漏(R1-R5 全过);可见-可见链 A内→B内 照常展开含显性条件(G1 过)、designer(can_admin)对 private 节点的链可见性不变(G2 过)、get 隔离基线不变(R0 过)。
|
|
60
|
+
- **守卫**:`md_cg/test_chain_read_isolate.py`(既有风格+哑主密钥 bytes(range(32)),tempfile 临时库+finally rmtree)。红项 R1-R5 四面泄漏复现(R5 收窄到 provenance/chain 字段并补仿真旧码红验),绿项 G1-G2 + R0 基线;G1 顺带暴露并锁定并发 dedent 回归。**本会话实跑:`python -X utf8 -m md_cg.test_chain_read_isolate` → 「结果:PASS 12 / FAIL 0」EXIT=0**。
|
|
61
|
+
- **verified_by**(材料口径,本会话未重跑的细项如实标注):①红:修复前 R1a/R1b/R2/R3/R4/R5a/R5b 七断言 FAIL;②绿:12/0 EXIT=0(本会话复跑一致);③回归:test_p17_predict 58/58、test_p8_subgraph_chain 34/34、test_hot_cold 33/33、test_session_isolation 19/19、test_verify_answer 31/31、test_p12_metacognition 32/32;④全量 md_cg 域套件 201/201(终态 202/202,含本守卫)。
|
|
62
|
+
|
|
63
|
+
### F5(N124,medium,v15 留档——legacy/recent/retrieval 三域本轮评 medium、engine 域评 low、v15 档 low,域间评级分歧如实记录)租户登记表损坏静默 fail-open:零告警止血为必现告警
|
|
64
|
+
|
|
65
|
+
- **where**:材料口径 `md_cg/mcp_server.py:3560-3576`(_resolve_root 租户分支,原裸 except 即 :3551-3552 `except Exception: t_root=None`,因会话前几轮编辑行号后移)+ `md_cg/security.py:258-291`(TenantRegistry.__init__/_load 增 load_error 损坏留痕)。守卫 `md_cg/test_tenant_registry_corrupt_warn.py`(新文件,仿 test_tenant_env_override_warn.py 形态)。**本会话读核**:security.py:258 生效条件(「以 self.load_error 留存加载期损坏留痕(N124,2026-09-25:登记表损坏/不可读必须可被调用方感知,缺文件不算损坏)」)、:265/:270-289 load_error 三态实现(解析失败/OSError 置 f"{类型名}: {e}" :289、顶层非对象置「登记表 JSON 顶层不是对象」:287、缺文件不留痕);mcp_server.py:3547 生效条件(「登记表损坏/不可读(TenantRegistry.load_error 留痕或读取抛异常,N124 2026-09-25)时向 stderr 写『登记根绑定失效回落 MDCG_ROOT』告警后按未登记同形回落(零闸变,只开口)」)、:3567 reg_err 取 load_error、:3575 告警「[mdcg-mcp] ⚠ 租户登记表损坏/不可读(…)」在位。
|
|
66
|
+
- **缺陷面**:_resolve_root 在 TenantRegistry 构造/root_of 抛任何异常时静默置 t_root=None 回落 MDCG_ROOT,零 stderr 告警——登记表损坏(security.py _load 吞 ValueError/OSError 返回空表,甚至合法 JSON 顶层非对象时不进 except 分支)时租户根映射整个失效且无痕迹,连带「登记根与显式 MDCG_ROOT 冲突 fail-closed」检测一并失效:本应隔离到登记根的写入落到 MDCG_ROOT,跨租户可见,全程零告警。
|
|
67
|
+
- **修复**:①security.TenantRegistry 新增 self.load_error 损坏留痕(__init__ 置 None → _load 开头重置)——文件在但 JSON 解析失败/OSError 时留原因串、合法 JSON 但顶层非对象时留「登记表 JSON 顶层不是对象」(点名覆盖「不进 except 分支」路径),缺文件不留痕(正常首启不算损坏);返回值零变化(仍回落空表)。②mcp_server._resolve_root:except 分支捕获异常写 reg_err(原样保留 t_root=None 语义),成功路径读 reg.load_error;reg_err 非空时向 stderr 写告警——锚点「租户登记表损坏/不可读(原因)」+ 含租户名、回退根与修复指引(MDCG_TENANT_REGISTRY,缺省 ~/.mdcg/_tenants.json),对照 MDCG_CLEARANCE 覆盖告警先例同款口径。零闸变:损坏时 _resolve_root 返回值与修复前完全一致(回落 MDCG_ROOT、err=None),只开口不拦;完好表三路径(已登记→登记根、未登记→文档化回落、冲突→fail-closed)零误伤。边界如实说明:租户未登记(完好表)仍是无告警的文档化零变更路径,不在本缺陷范围。未 git commit。
|
|
68
|
+
- **攻击前后对比**:修复前(红,实测)——坏 MDCG_TENANT_REGISTRY(坏 JSON '{corrupted!!!'/登记表替换为目录/合法 JSON 顶层为数组)+ MDCG_TENANT=acme + MDCG_ROOT 已设 → _resolve_root 返回 (MDCG_ROOT, None) 且 stderr 零输出——租户根隔离绑定无声消失(R1a/R1c/R2/R3 四断言 FAIL;v15/引擎域/检索域三域复测同源)。修复后(绿)——同三形态各写一行 stderr(含损坏原因、租户名、回退根与修复指引)且返回值零闸变仍 (MDCG_ROOT, None)(R1-R3 过);完好表已登记→登记根零告警(G1)、未登记→回落零告警(G2)、冲突→fail-closed err 文案原样(G4)、load_error 单元面坏 JSON 非空/完好 None/缺文件 None(G5-G7)。
|
|
69
|
+
- **守卫**:`md_cg/test_tenant_registry_corrupt_warn.py`(仿同面先例:check() 计数+非零退出+redirect_stderr 捕获+tempfile.mkdtemp+finally rmtree;_resolve_root 经 env dict 直调不触真实 os.environ,登记表全在临时目录)。红项 R1a/R1c/R2/R3,零闸变锁 R1b,零误伤锁 G1-G4,单元面 G5-G7。**本会话实跑:`python -X utf8 -m md_cg.test_tenant_registry_corrupt_warn` → 「通过 12 / 失败 0」EXIT=0**。
|
|
70
|
+
- **verified_by**(材料口径,本会话未重跑的细项如实标注):①红:修复前 R1a/R1c/R2/R3 FAIL + G5 因旧码无 load_error 属性中断;②绿:12/0 EXIT=0(本会话复跑一致);③回归:test_tenant_env_override_warn 11/11(本会话复跑一致)、test_datapath_root OK、test_p3 34/34、test_session_isolation 19/19;④全量 md_cg 域套件 202/202 通过、3 跳过(终态,含全部 5 个新守卫)。
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## 三、发现明细(四区 confirmed 39 / rejected 0;去重后 20 独立缺陷 + 1 复测通过结案 + 已修剔除 5)
|
|
75
|
+
|
|
76
|
+
以下每项「证据要点」为上游复核/修复会话的读码+实跑(材料原文;攻击复现均在系统临时目录/临时库/哑令牌/哑密钥/哑主密钥 bytes(range(32)) 环境,测毕清理);标注★者本报告会话另做了现行代码读核(修复项落点/留档项在位性)或门禁实跑。legacy 项标注原轮次与复测轮数;本轮新发现 N130-N140 为本报告会话对材料三域冲突暂编号的统一裁决(编号口径行,逐项标注原暂编号)。
|
|
77
|
+
|
|
78
|
+
### 新发现 11 项(N130-N140;★=本轮已修并经本会话守卫实跑)
|
|
79
|
+
|
|
80
|
+
| #(原暂编号) | where(缺陷时点) | 严重度 | 问题摘要 | 证据要点 | 状态 |
|
|
81
|
+
|---|------|--------|----------|----------|------|
|
|
82
|
+
| N130(engine 区建议 N130,守卫文件名锚定保留)★ | md_cg/mdcg.py:3188-3195(os.remove 在 :3194;入口 mcp_server.py op=verify 与 mdcg_verify) | **high** | verify(verdict="falsified") 对原节点 os.remove 永久硬删,全程不经 protect.guard_forget/require_layer_write/override——self/anchor 层、protected=True、immutable、importance≥0.7 四类受保护节点可被任意持 verify op 主体一键删除且无快照无留痕不进 trash | 读码:falsified 分支仅 add_rejected+os.remove+_unstage 零守卫调用;对照 _move_layer 调 guard_move、forget 调 guard_forget、protect.guard_forget 对受保护节点抛 ProtectionError。动态复现(临时库+哑主密钥,测毕清理):verify 角色(ops 含 verify,can_admin=False)下对照1 guard_forget 正确抛 ProtectionError、对照2 add 写 self 层被拒 AccessDenied;随后 cg.verify 三次全部 falsified:n_self/n_prot/n_imp 索引消失+盘面文件消失,_protected_history 从未创建零 ProtectionError | **已修**(F2) |
|
|
83
|
+
| N131(engine 区建议 N131,守卫文件名锚定保留)★ | md_cg/mdcos.py:2221-2255(merge 分支 _write_node 直写原 :2235;MdCGSecure 闸门仅 require_op("review") 于 :4014-4017) | **high** | review_decide 的 merge 分支直写 _write_node 绕过 guard_write 与 require_layer_write——「accept/edit 落节点时的层写仍由下游 require_layer_write 拦截」注释对 merge 不成立,orchestr 的 forbidden「anchor/self/goals/knowledge 层」被打穿,任意文本注入 | 读码:merge 分支自 get(target) 起全程直写,对照 add 路径 require_layer_write/guard_write。动态复现(临时库,测毕清理):orchestr 受限 principal——对照 orchestr add 写 self 层被拒、designer add 覽 immutable 抛 ProtectionError(is_immutable 确认 (True,'显式不可覆盖标记'));propose→review_decide(pid,"merge",merge_into=tgt_self/tgt_imm) 均 ok=True,回读确认「攻击者注入段落」「注入immutable」已进 self 层与 immutable 正文。注:propose 返回自生成 prop_* pid 而非传入 node_id,首次复现因 pid 误用未中,修正后命中(材料如实留痕) | **已修**(F3) |
|
|
84
|
+
| N132(retrieval 区暂编 N130,与守卫锚定的 N130 冲突顺延)★ | md_cg/mdcos.py:3474-3489(基类三方法)+ md_cg/chain.py:139-146(adjacency 直读全 index)+ predict.py:1020-1053 | **high** | causal_chain/explain_chain/causal_path 无读隔离——chain.adjacency 直读 cg.index 全部节点 frontmatter 出边,全程不经 cg.get/_readable,不可见节点 id、边条件文本与下游拓扑泄漏;MCP 两入口均无可见性闸(mdcg_causal 仅 require "read",全角色 ops_allow 均含 read) | 临时目录哑环境实测(临时库+哑 MDCG_MASTER_KEY,测后清理):writer 写 X(internal)→Y(private)→Z(internal) 链(边带条件'Y侧秘密条件文本YY')后 reader(clearance=internal):reader.get('Y秘密')=None(get 隔离生效);reader.causal_chain('X苹果') 链含 Y秘密且 hops 条件含秘密文本;对不可见节点起链成功;causal_path 全链可达含秘密文本;search_rrf 的 meta.provenance 在可见节点条目下携带不可见全链与秘密条件 | **已修**(F4) |
|
|
85
|
+
| N133(recent 区暂编 N130) | md_cg/forgetting.py:274-283 + md_cg/insight.py:297-303(写盘后仅改内存 index entry,无 _dirty/flush,path_gen/broad_gen 均不推进) | medium | forgetting.reinforce 与 insight.verify 走 _write_node 写盘后既不标 _dirty 也不 flush/rebuild——默认开启的读缓存把写盘前旧 (fm,content) 在进程存活期内永久判新鲜,同进程写后读不一致,构成 readcache.py:19-22 自书「写面零挂载点……不会有漏挂失效型陈旧读」承诺的破口;_emit 排序键含陈旧 fm 的 importance(mdcg.py:2931-2933)检索排序失真 | 读码:两处写盘后仅改 ent;mdcos 三处调用点(:2670/:3260/:2944-2949)后无任何失效动作;对照 mdcg.py:3236-3242 verify 路径已自证漏标脏危害并显式补 _dirty[node_id]=e。复现(临时目录 MdCGOS+默认 MDCG_READ_CACHE=1):add n1 importance=0.5 → search 装缓存 → reinforce(delta=0.3) 返回 0.8 → 再 search 仍 0.5/protected=None,cg.get 直读=0.8;insight verify 后同型陈旧(缺 insight_verified 标签、importance 0.5 vs 直读 0.9)。材料注:候选引「mdcg.py:99-100 _fresh」行号有误(实在 readcache.py:80-100),缺陷不受影响 | 留档(修复明确:对照 mdcg.py:3242 先例补 _dirty;与 legacy 合并族 scrub.py:737-738/mdcg.py:3345 同根同款宜一并修) |
|
|
86
|
+
| N134(recent 区暂编 N131) | md_cg/mdcg.py:2199-2208(_read 捕获 OSError 返回 (None,None))+ md_cg/readcache.py:102-110(负结果无豁免入缓存) | medium | _read 的 OSError 负结果被 readcache 当正常值写入缓存且该 path 无写事件时 _fresh 判定恒真——一次瞬态读失败固化为「节点从检索面永久消失」直到进程重启或该 path 再写盘;cg.get(:2183-2196 直读 open)不走该缓存,形成「get 能读、search 永远搜不到」撕裂 | 读码:mdcg.py:2204-2208 except OSError: return None, None;readcache.py:108-109 无负结果豁免。复现(临时目录):add m1 → kernel32.CreateFileW(dwShareMode=0) 独占句柄(句柄=580 成功)→ search 未命中 → CloseHandle 后连续两次 search 仍不命中 → cg._read_cache[path] 条目字面 (3, (None, None)),cg.get 直读 importance=0.5 正常(fsutil.py:47-51 自证 Defender/索引器持锁是本平台常态,无需任何权限) | 留档(修复方向明确:负结果不入缓存或短 TTL/失败即逐出) |
|
|
87
|
+
| N135(recent 区暂编 N132)★ | md_cg/hotcache.py:63-65(_ENV_SWITCHES 仅 6 项,违反同文件 :60 自书「新增一个就登记一个」纪律) | medium | 检索面逐调用读 env 且改变候选/排序的开关中 MDCG_LAYER_BOOST(mdcg.py:56,消费 2842-2844)、GATE_S4_LAYER/GATE_S5_NEG/GATE_S1_DOMAIN/S1B_BUCKET/BUCKET_TOPK/BUCKET_MIN_SIM/GATE_S2_COND/GATE_S3_SPREAD/S7_POSTINGS/SPREAD_HOPS/DECAY/GAIN 均未进 env_switch 键——MDCG_HOTCACHE=1 下运行期翻转后同 query 命中翻转前口径缓存,静默错答 | **本会话读核**:hotcache.py:63-65 _ENV_SWITCHES 现为 6 项(MDCG_SEMANTIC/EN_ATOMS/UNIFY_QUERY/RETRIEVAL_PIPELINE/S7_FRESHNESS/CN_GRAMS),缺登清单属实。复现(临时目录,v4 修正版:PIPELINE=1+GATE_S4_LAYER=1,同文 k1/a1,query 取文档超集使 sim<1.0 避开 _score min(1.0,·) 夹顶并列):首查(默认 boost a1+0.20>k1+0.10)=[a1,k1];运行期设 MDCG_LAYER_BOOST="anchor=0.0,knowledge=0.9" 再查 cached=True 仍=[a1,k1];同 root 新实例对照=[k1,a1]——翻转被缓存吞掉。复现走单词法路(默认四路 RRF 抹平单路差异)属实验可观测性限制不影响缺口 | 留档(修复机械:补登记清单,确定性守卫可写) |
|
|
88
|
+
| N136(recent 区暂编 N133) | md_cg/tokens.py:417-422(租户覆盖告警裸写 sys.stderr)+ md_cg/mcp_server.py:3475-3481(MDCG_CLEARANCE 覆盖告警同款裸写) | low | verify_token 契约是「任何异常都抛 TokenError(fail-closed)」(tokens.py:395),但 sys.stderr 为 None/closed/断管时裸 write 抛 AttributeError/ValueError/OSError 伪装成非 TokenError 逃出;调用方 _build_principal(mcp_server.py:3468-3470)只捕 TokenError、main 无兜底——认证路径由 fail-closed 变启动即崩 | 复现(哑令牌文件,脚本自清理):①对照 stderr 正常时 verify_token(令牌A(tenantA), tenant="tenantB") 正常返回且告警非空;②sys.stderr=None 后同调用抛 AttributeError("'NoneType' object has no attribute 'write'") 非 TokenError;③MDCG_TOKEN+MDCG_TENANT=tenantB+stderr=None 下 _build_principal() 抛 AttributeError 直穿。**本报告会话读核补充**:F1 新增的沿链环/祖先缺失告警(tokens.py:417-425,本会话读核在位)为同款裸写,顺收时应一并包裹 | 留档(修复明确:stderr 写包 try/except 或判 None 守卫;与 F1 同文件同 owner,可随轮顺收) |
|
|
89
|
+
| N137(engine 区建议 N132) | md_cg/mdcg.py:3152-3165(_move_layer 的 _stage 条目缺 depends_on/edges/subgraph/session/role/branch_id/双时间轴;对照 _node_entry 唯一真源 mdcg.py:1119-1192)+ 消费面 trust.py:627-647/:660-674、mdcos.py:648、lifecycle.py:182-200 | medium | 降级搬迁(verify weakened 触发与 scrub demote 共用 _move_layer)后索引条目被整条替换为缺字段形态且后续同步只回填状态键——反查索引丢节点致「上游证伪→下游标存疑」传播静默断链、session 过滤检索丢节点,直到 rebuild_index 才自愈 | 读码:_node_entry 真源含 DEPS_FIELD :1166/edges :1183/session :1143/role :1135/subgraph :1182/branch_id :1174,_move_layer 条目构造无这些键;trust.dependents_index :636-640 仅遍历 index 条目;两处 _sync_index 只写 STATE_FIELD。复现(临时库,测毕清理):nd_A(depends_on=[nd_B], edges, session=sess_x, role=user, subgraph) 三次 verify weakened(0.6→0.45→0.30→0.15<DEMOTE_CONFIDENCE=0.2)触发 demoted=True 后——索引条目全字段 None 而盘面 frontmatter 完好(nodefile.loads 实读);dependents_index[nd_B] ['nd_A']→None;verify(nd_B,falsified) propagation={'changed':0,'reason':'no_dependents'};search(…,session="sess_x") 降级后空、去 session 过滤仍命中 | 留档(修复方向较明确:条目构造改走 _node_entry 真源;涉 trust/lifecycle/session 多消费面回归,非攻击者面正确性破坏) |
|
|
90
|
+
| N138(engine 区建议 N133) | md_cg/mcp_server.py:3325-3354(_start_sustain:auto_heal/auto_tidy 缺省全开)+ md_cg/sustain.py:869-871(daemon Thread)/:925-941(_tick_tidy 以 apply=self.auto_tidy 写库)+ md_cg/writelimit.py:251-263(cg.get 快照)/:298(_demote 用旧快照)/:317-346(_write_node 旧正文写回)+ 裸迭代面 mdcos.py:648-655、mdcg.py:2401/:1082(FileLock 仅跨进程) | medium | 默认部署下 sustain 后台线程与请求线程共享同一 MdCG 实例且全引擎无线程锁:①tidy「get 快照→写回」窗口与前台写交错即丢更新且索引 content_hash 与盘面背离;②后台变更与请求线程对 index/_dirty 的裸迭代构成 RuntimeError 崩溃面(mcp_server.py:3006「单线程 stdin 循环:无并发竞争」注释未覆盖 sustain 线程) | 默认配置即暴露(MDCG_SUSTAIN/MDCG_SUSTAIN_AUTOHEAL/MDCG_AUTO_TIDY 缺省=开,读码 :3327/:3337/:3351 实证)。复现①丢更新(临时库,测毕清理):4 同模板节点按 writelimit.py:257 同款取快照后前台 add 新正文+flush,再按 :298 调 _demote(旧快照)——正文回滚为模板旧文(前台更新丢失=True);索引 content_hash 与盘面背离=True。复现②崩溃面:400 节点、2 线程×add300+2 线程×search12+flush×200 有界并发实跑捕获 1 条 RuntimeError('dictionary changed size during iteration')——崩溃面从读码推定升级为本场实测触发 | 留档(线程模型/加锁边界属大设计决策宜专项;缺省三 env 全开扩大暴露面,修复时应一并评估缺省语义) |
|
|
91
|
+
| N139(retrieval 区暂编 N131) | md_cg/crypto.py:262-274(_load_keys 损坏/版本/schema 不符静默回落空 envelopes,两分支零告警)+ :282-300(provision_dek 据此重签新 DEK 并覆盖写回;触发链 mdcos.py:3690-3700 _init_crypto) | medium | _keys.json 损坏或 ENVELOPE_VERSION 漂移后任一身份的下一次解锁/写 private 操作即重签新 DEK 并把整份读出结构覆盖写回——旧密文永久不可解、其他身份信封一并抹除,无备份无审计无 stderr | 复现(临时库,kek 固定):provision_dek 两身份(envelopes 键 ['t1\|a1','t1\|a2'])后 seal_node('秘密正文');改写 _keys.json 为 '{"v": 99, "alg": "x"}' 再次 provision_dek 换发新 DEK(dek2!=dek1)且 stderr 空;旧密文用新 DEK 打开抛 CryptoError「认证标签校验失败(密钥/身份/节点不匹配或密文被篡改)」;写回后 envelopes 键仅剩 ['t1\|a1'](a2 信封被抹除=True);改写为损坏 JSON 同样换发成功 stderr 空。需本地文件系统访问或部署侧事故,非远程可利用,但后果不可逆 | 留档(修复涉密钥生命周期语义决策:损坏时 fail-closed 拒启 vs 告警+备份后重签;ENVELOPE_VERSION 漂移属合法升级场景须一并设计,不宜本轮顺手改) |
|
|
92
|
+
| N140(retrieval 区暂编 N132) | md_cg/writepipe.py:474-478(MCP 写管道入库点 float(_imp) 无守卫)+ md_cg/mdcg.py:1249-1251(库层 add 无运行时校验)/:1375(fm 落盘)+ 排序键 -float(frontmatter.importance)(mdcg.py:148、mdcos.py:949/:958/:1365) | medium | importance 'nan'/'inf' 原样落 frontmatter 直通排序键——NaN 比较恒 False 破坏全序确定性(排序退化为输入序)、inf 劫持恒首位,写一次即长期污染全库相关查询排序,合法高分无法与之区分 | 复现(临时库,测毕清理):add 三节点 importance=0.9/'nan'/0.1 后 search('苹果') order=['n1','n2','n3']——'nan' 节点排在 0.1 之前(越位)且 'nan' 字符串原样出现在结果 frontmatter(可见值=[0.9,'nan',0.1]);独立库 inf 形态 order=['m2','m1']——inf 节点劫持首位。MCP schema 声明 number(mcp_server.py:123/:305/:505/:704)实现层 float() 不拒——float('nan')/float('inf') 为 Python 合法输入不抛,writepipe.py:478 直通 | 留档(修复明确:写边界校验 math.isfinite 拒绝/夹紧,确定性守卫可写) |
|
|
93
|
+
|
|
94
|
+
### legacy 复测 9 项(confirmed;多区独立复核互为佐证——N123/N124/N125/N126/N129/N62 各四区、N77/N121 各三区、族一区)
|
|
95
|
+
|
|
96
|
+
| # | where(缺陷时点) | 严重度 | 问题摘要(原轮次→复测轮数) | 证据要点 | 状态 |
|
|
97
|
+
|---|------|--------|----------|----------|------|
|
|
98
|
+
| v15 N123★ | md_cg/tokens.py:465(缺陷时点)+ :394-431 | medium | 【v15 首报→本轮第 2 次记录→已修】derive 子令牌 TTL 无上限夹紧且过期不沿派生链传播——四区独立复测全部证实(legacy/recent/engine/retrieval),其中 retrieval 区臂测父 ttl=60s 子 ttl=10 年、engine 区 999999s、legacy 区子-父=27.78h 均成立 | 四区复测形态汇总:父过期后子 verify 仍通过(四区一致);对照组 revoke 级联正常(v15 已证);本轮 F1 修复(第二节) | **已修**(F1) |
|
|
99
|
+
| v15 N124★ | md_cg/mcp_server.py:3546-3557 + md_cg/security.py:274-283 | medium(engine 域评 low、v15 档 low——分歧如实记录) | 【v15 首报→本轮第 2 次记录→已修】_resolve_root 租户登记表损坏/不可读时静默 fail-open 零告警,显式 MDCG_ROOT 被直接采用,租户根物理隔离绑定无声消失,冲突 fail-closed 检测连带失效——四区独立复测全部证实 | 四区复测形态汇总:坏 JSON/目录/顶层非数组形态均 (MDCG_ROOT, None)+stderr 空串;对照组完好表冲突时 fail-closed 文案正常(mcp_server.py:3554-3556 设计行为在位);security.py _load 吞 ValueError/OSError 返回空表(甚至不进 except 分支)本轮 F5 一并覆盖 | **已修**(F5) |
|
|
100
|
+
| v15 N125 | md_cg/mcp_server.py:3624-3626(**读核现行 :3650-3652**)对照 :3437-3440/:3370-3394 | low | 【v15 首报→本轮第 2 次记录】main() 把 MDCG_SESSION 原样 strip 重设 principal.session,打穿 _normalize_session 的 DSH 防编造校验(DSH 形态须真实存在会话目录否则降级 anonymous)——同 env 同一启动流程先被校验降级、再被裸赋值翻回 | 四区复测:legacy/recent/engine 均实测编造 DSH 形态 id 经 _normalize_session='anonymous'、_apply_attribution 后 'anonymous'、经 main() 裸赋值后=编造原值(engine 区注明 main() 真实 serve stdin 回路未重跑,以 v15 实测为准——engine 区如实标注);**retrieval 区补两口新证**:①条件性——DSH 根不存在时 normalize fail-soft 原样返回与 main() 等价(打穿不成立,本机即此形态);②'*' 通配姊妹面——_declared_session 明拒 '*'(:3419-3425「非会话名」)而 _normalize_session/main() 原样放行,且同 actor 两个 '*' 连接可互读对方 private/secret 绑定档节点(mdcos.py:3878-3879 全等比较被通配值合并;跨 actor 测 False 属按 actor 隔离的 DEK 解不开正文非可见性闸)——修复时应按 _declared_session 同款口径一并拒 '*' | 留档(修复明确:该两行改走 _normalize_session 或直接删除+拒 '*',low 加固可随轮顺收,本轮额度让位) |
|
|
101
|
+
| v15 N126★ | md_cg/mdcos.py:378-382(读核现行 :381-382)+ md_cg/crypto.py:399-402(**读核现行 :401-402**) | low | 【v15 首报→本轮第 2 次记录】审计写入 best-effort 双处 except OSError: pass 静默吞错——审计通道坏死时敏感操作无痕继续且零告警,事后取证面归零 | **本会话读核**:mdcos.py:381-382(try _rotate_audit_if_needed+append_jsonl except OSError: pass)与 crypto.py:401-402(append_jsonl except OSError: pass)均逐字在位无回归无修复。检索域本轮实测补证(v15 后首度动态补证):两路径替换为目录后 cg._audit('越权操作测试','n1') 与 crypto.audit 均无异常返回、redirect_stderr 零输出、记录零落盘。legacy/engine 区读核同结论未重跑(如实标注) | 留档(维持「有意取舍、低危」;最小修=stderr 一行+进程内计数进 health_os,可随轮顺收) |
|
|
102
|
+
| v15 N129★ | md_cg/security.py:344-347(读核现行 :343-348 P1-4 注释在位)+ md_cg/mcp_server.py:2665-2676 + md_cg/export.py:100-106/:122 | low | 【v15 首报→本轮第 2 次记录】MDCG_EXPORT_ROOT 未设(缺省部署形态)时 designer 可经 export out 参数全库明文(include_content 缺省 True)写任意路径并 os.replace 覆盖既有文件——「env 未设=放开」为 P1-4 明文裁定(security.py 注释「**env 未设置 = 放开**」读核在位),闸与 require_admin 都在,属纵深缺口而非越权 | 四区复测双臂实跑(哑 admin principal+哑主密钥临时库,测毕清理):未设 env 时 check_path_root 库外路径直通、_export_call({action:nodes,out:<库外/deep/dump.jsonl>}) ok=True written=1 且行内含 secret 级正文;设 env 后同路径抛 PermissionError「路径超出 MDCG_EXPORT_ROOT 白名单」fail-closed 生效、根内路径正常放行(四区一致) | 留档(维持 P1-4 裁定面 deferred;止血候选=env 未设时回退以 cg.root 为白名单(_default_out 已在 root 内)) |
|
|
103
|
+
| v8 N62 | md_cg/tokens.py:394-431(verify_token 无 cap 消费点,:409-414 注释自证 deferred)+ md_cg/security.py:316-334(cap_of :316-318 未登记回落 DEFAULT_SENSITIVITY;:325-334 principal_for 为全域唯一消费点) | low(legacy/recent 区合并条目评 medium、engine/retrieval 区评 low) | 【v8 首报→v9/v15 复测→本轮第 4 轮成立】租户 clearance_cap 夹紧从未接线权威令牌路径——verify_token 按 rec['clearance'] 原样构造 Principal 不查 TenantRegistry.cap_of;签发侧已夹紧(issue/derive);跨租户 env 覆盖面已有 v15 stderr 告警止血(仅告警零闸变)。**任务问项⑥「最小接线是否低风险」的两域评估如实记录**:retrieval 域评估——verify 侧按 role cap 最小夹紧(_clamp_level(clearance, role_spec(rec['role'])['clearance_cap']))对存量已夹紧令牌零行为变化、低风险,可作顺收项;engine 域评估——无条件接租户 cap 会破坏未登记部署语义(cap_of 未登记回落 DEFAULT_SENSITIVITY='internal'<'secret',缺省部署 designer(secret) 被误夹成 internal),「夹紧 vs 拒绝」「仅显式登记租户参与」两决策未拍板 | 复测实跑(临时登记表+哑令牌文件):issue(record,cap=internal) 签发侧夹紧生效返回 internal,手工改文件记录 clearance='secret' 后 verify_token 返回 'secret' 未夹紧,对照 reg.principal_for('acme2','secret') 返回 'internal'(retrieval 区);tenantA secret/designer 令牌 verify_token(tenant='tenantB') → tenantB+secret+can_admin(stderr 告警在位但放行,legacy 区);grep 全 md_cg 域 cap_of 仅 security.py:329 一处消费(多区一致);mdcos.py:40 TenantRegistry 死导入(legacy 区 grep count=1 仅导入行)。**本会话读核**:deferred 注释 tokens.py:414 在位 | 留档(角色 cap 最小夹紧可随轮顺收;租户 cap 接线必须专项,与已修 N123 同属授权链——TTL 维度本轮已闭,剩 cap 维度) |
|
|
104
|
+
| v9 N77 | md_cg/writepipe.py:436-442(全库唯一 hotcache.invalidate 调用点,且 except 吞异常)+ md_cg/mdcos.py:1308-1315 + md_cg/hotcache.py:45(QUERY_TTL=300s) | low | 【v9 首报→v14/v15 复测→本轮再证】query 热缓存失效只挂 writepipe._after_trust 一处,cg.add 直写、review_decide、forget、reinforce、insight.verify、set_state 等不经 writepipe 的写全部不清 query 缓存,MDCG_HOTCACHE=1(opt-in 默认关)下 300s TTL 内命中写前陈旧结果——漏新节点、结果仍含已删节点,仅 cached=True 无陈旧告警 | 三区复测实跑(MDCG_HOTCACHE=1 临时库,测毕清理):add 新节点后同查询 cached=True 新节点缺席(recent 区 r1=['n_alpha']→r2 仍 ['n_alpha'] 且 cached=True);forget(a1,override=True) ok=True 后同 query cached=True 仍含已删 a1、invalidations=0(retrieval 区);grep 全库 hotcache 调用仅 mdcos.py:356/1288、writepipe.py:436 三处(多区一致) | 留档(失效粒度全清/键级/惰性 TTL 的设计决策 v13 起未拍板,属专项设计;与 N133/N134 修复涉及的写路径有交叠,宜随其修复后统一拍板) |
|
|
105
|
+
| v14 N121 | md_cg/mdcos.py:756(search 调 _candidates 全池)+ md_cg/mdcg.py:2401(全池裸迭代)+ :2465-2469(S3/S7 需 PIPELINE=1 且各自 GATE env=1 双开关默认关)+ mdcos.py grep postings 零命中(S7 仅接基类 mdcg.py:2626 未接生产 override) | low | 【v14 首报→v15 复测→本轮第 3 次记录】生产 MdCGOS.search 稳态每查询全池遍历打分排序截断,S1 门控/S7 倒排候选层需显式开且 S7 仅接基类——稳态耗时随库规模线性放大;同族 N120(读缓存精确失效)修复在位 | **本会话实跑**:`python -X utf8 -m md_cg.test_readcache_precise_inval` → 「结果:PASS 23 / FAIL 0」EXIT=0(N120 修复在位,与材料口径一致);读码 mdcos.py:756、mdcg.py:2401/:2465-2469、mdcos.py grep postings 零命中、reach 默认关(reach.py:110-111 需 MDCG_REACH 恰为 '1',retrieval 区实测 enabled()=False)与 v14 留档一致;10k/30k 计时基准本轮未重跑(如实标注,以 v14 实测为准) | N121 留档(非安全缺陷性能语义面,候选集来源语义改动留档待专项设计);N120 复测通过结案(见下小节) |
|
|
106
|
+
| 历轮 low 合并族 | 族① md_cg/scrub.py:737-738 + md_cg/forgetting.py:274-275 + md_cg/mdcg.py:3345(直调 _write_node 不标脏)|族② md_cg/mdcos.py:2223-2236(merge 读-改-写无锁)/:2303-2307(deletions 裸 append)+ md_cg/mdcg.py:2187(get 裸调 _node_disk_path)/:2709+:2995-2996(S3 双记)|族③ md_cg/mdcg.py:2894-2899(S5 裸 open 无 P2-20 闸,PIPELINE 门控默认关)+ md_cg/mdcos.py:892(O 全池)/:718-730(neg 不计 scanned)+ md_cg/postings.py:122-159(stat 税)|姊妹面 md_cg/interop.py:316+:318('..' iter_id 放行) | low | 【历轮留档 low 项合并,多轮读核在位】三处维护写不标脏致默认开读缓存陈旧、merge 读-改-写无锁可丢一方内容、get 与 _read 污染索引契约不一致(get 抛 ValueError 直穿)、S3 record_access 双记、S5 裸读无 P2-20 闸、O(全池)/neg scanned 盲区/postings stat 税、'..' iter_id 姊妹面放行 | 逐项读核在位+三项动态复现(测毕清理):FAM1 readcache 默认开下 search1 confidence=0.6 → 直写盘上 0.99 → search2 同查询仍 0.6(陈旧);GET_VP 污染索引 path='../../outside_escape.md' get 抛 ValueError「节点路径越界(P2-20)」直穿而 _read 返回 (None,None);INTEROP iter_id='..' 过 sanity+shape 双门禁落 hive/../verdict.json(landed=True)。neg 盲区比候选「需显式 env」表述更宽(search 默认 True)如实记录 | 留档(低危加固/性能/审计面;族① 与 N133 同根,宜随其一并修) |
|
|
107
|
+
|
|
108
|
+
### 复测通过结案小节(confirmed 内非缺陷 1 条)
|
|
109
|
+
|
|
110
|
+
| # | where | 结论 |
|
|
111
|
+
|---|------|------|
|
|
112
|
+
| v14 N120 读缓存精确失效 | md_cg/readcache.py(守卫 md_cg/test_readcache_precise_inval.py) | **复测通过,结案**(第 14 轮修复在位)——本会话实跑守卫 23/0 EXIT=0(legacy 区同命令同结果),无需立项,仅留档(v14 N121 行内已注) |
|
|
113
|
+
|
|
114
|
+
### 已修剔除小节(候选经实读核验「已修复在位」维持不立项,5 项,如实记录)
|
|
115
|
+
|
|
116
|
+
| # | where | 剔除理由(本轮实读证据) |
|
|
117
|
+
|---|------|------|
|
|
118
|
+
| v7 N51 T2/T3 重打分 | md_cg/mdcos.py:903-905/:916-918 | 第 14 轮已修(P2-4 透传注释在位)——legacy 族条目证据内实读核验 |
|
|
119
|
+
| v7 N50 种子 5 次裸读 | md_cg/mdcos.py:1010-1022 | 第 14 轮已修(改走 self._read 注释在位)——同上 |
|
|
120
|
+
| v9 N78 hotcache 键漏 CN_GRAMS | md_cg/hotcache.py:63-65 | 第 13 轮已修(_ENV_SWITCHES 含 MDCG_CN_GRAMS,本会话读核 :63-65 在位)——注意与 N135 同一清单:CN_GRAMS 已登、其余 12 项缺登 |
|
|
121
|
+
| v2 N12 make_verdict | md_cg/interop.py:220-246 | 批次 23 已修(suite_ok 参数+四象限 failure_reason 阶梯注释在位) |
|
|
122
|
+
| v6 N38/N39 | src/ 域 | 属 src/ 域不属 md_cg 域,本轮未复测 src 域,维持剔除口径(如实标注) |
|
|
123
|
+
|
|
124
|
+
### 证伪/剔除(rejected)
|
|
125
|
+
|
|
126
|
+
四区复核 rejected 数组均为空——**本轮 0 条证伪**(与 v15 的 2 条证伪不同,如实记录)。
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## 四、验证(门禁结果)
|
|
131
|
+
|
|
132
|
+
以下「本会话实跑」均为本报告写作会话在仓库根目录实际运行(第一手);「材料口径」为上游复核/修复/门禁会话已跑、本会话未重跑(如实区分):
|
|
133
|
+
|
|
134
|
+
| 命令 | 结果 | 来源 |
|
|
135
|
+
|------|------|------|
|
|
136
|
+
| `python -X utf8 scripts/run_tests.py --jobs 4`(全量) | `===== SUMMARY 200/200 通过,5 跳过(依赖缺失/平台不符) =====`——本会话实跑,**真实退出码 0**;200 = v15 的 195 + 本轮 5 个新守卫,与材料门禁口径逐字一致 | **本会话实跑** |
|
|
137
|
+
| `python -X utf8 -m md_cg.test_n123_derive_expiry_chain` | 「通过 16 / 失败 0」EXIT=0——与材料修后 16/16 一致(材料红证修前通过10/失败6,本会话未重跑红证,守卫未回退) | **本会话实跑** |
|
|
138
|
+
| `python -X utf8 -m md_cg.test_n130_verify_falsified_protect` | 「结果:PASS 23 / FAIL 0」EXIT=0——与材料修后 23/0 一致 | **本会话实跑** |
|
|
139
|
+
| `python -X utf8 -m md_cg.test_n131_merge_gate` | 「结果:PASS 17 / FAIL 0」EXIT=0——与材料修后 17/0 一致 | **本会话实跑** |
|
|
140
|
+
| `python -X utf8 -m md_cg.test_chain_read_isolate` | 「结果:PASS 12 / FAIL 0」EXIT=0——与材料修后 12/0 一致 | **本会话实跑** |
|
|
141
|
+
| `python -X utf8 -m md_cg.test_tenant_registry_corrupt_warn` | 「通过 12 / 失败 0」EXIT=0——与材料修后 12/0 一致 | **本会话实跑** |
|
|
142
|
+
| `python -X utf8 -m md_cg.test_readcache_precise_inval` | 「结果:PASS 23 / FAIL 0」EXIT=0——N120 复测通过结案项的本会话独立复核(legacy 区同命令同结果) | **本会话实跑** |
|
|
143
|
+
| `python -X utf8 -m md_cg.test_tenant_env_override_warn` | 「通过 11 / 失败 0」EXIT=0——v15 守卫面无回归(F1 触碰 tokens.py 后的回归佐证) | **本会话实跑** |
|
|
144
|
+
| `npm run gate` | **失败(第一手复现)**:真实退出码 1,R1 凭据/密钥面 PASS(文件面=0 内容面=0,5 条 NOTE 为仓库内既有哑凭据文件名的守卫备注,非本轮产物非真实凭据)、R2 私有数据面 PASS、R3 隐私文本 PASS、`[FAIL] R4 非追踪件面 命中=5;非追踪=29,允许=24`,命中 = 本轮全部 5 个新守卫(md_cg/test_chain_read_isolate.py、test_n123_derive_expiry_chain.py、test_n130_verify_falsified_protect.py、test_n131_merge_gate.py、test_tenant_registry_corrupt_warn.py,均未 git add),VERDICT=FAIL——材料残片可见 3 个文件名+截断尾片("in.py",推断为 test_n123_derive_expiry_chain.py 的尾部),本会话实跑确认为 **5 个全列**。**性质判定**:untracked 时序性(守卫文件提交后即入追踪面,R4 应转绿),裁决归编排会话提交前;本会话不 commit 故未验证提交后形态,如实标注 | **本会话实跑** |
|
|
145
|
+
| swarm cargo test | **未运行**——Rust 面零改动(本会话 git status 证实 swarm/ 与 rust/ 无改动,改动面仅 md_cg/ 的 python 件),与材料口径一致 | 双方一致 |
|
|
146
|
+
| npm test | **未运行**——TS 面零改动(git status 证实 src/ 与 TS 测试未动),与材料口径一致 | 双方一致 |
|
|
147
|
+
|
|
148
|
+
**上游会话已运行、本会话未重跑的验证**(材料原文,如实区分):五项修复的守卫红证(修前各一跑,红绿数字见第二节各守卫行——红证需旧码,守卫未回退不可重跑);F1 的既有回归五件套(test_p21_tokens 38/0、test_action_derive 46/0、hive.test_orch 85/0、test_ccgc 84/0 及其中间态全量 197/197);F2 的回归三件套(test_p1 38/38、test_verify_dirty_reconcile 18/18、test_hot_cold 33/33)与 md_cg 域套件 199/199;F3 的回归七件套(test_merge_upsert 11/11、test_p2 37/37、test_review_conformance 38/38、test_mr_m2 64/64、test_govern_directread 40/40、test_index_durability 16/16、test_review_onepass 10/10)与 md_cg 域套件 200/200;F4 的回归六件套(test_p17_predict 58/58、test_p8_subgraph_chain 34/34、test_hot_cold 33/33、test_session_isolation 19/19、test_verify_answer 31/19→31/31、test_p12_metacognition 32/32)与 md_cg 域套件 201/201;F5 的回归四件套(test_tenant_env_override_warn 11/11、test_datapath_root、test_p3 34/34、test_session_isolation 19/19)与 md_cg 域套件 202/202;四区复核全部攻击复现(第三节证据要点——临时区/临时库/哑令牌/哑主密钥/mock 形态,测毕清理)。**注**:md_cg 域套件(md_cg.run_tests,202/202)与仓库级套件(scripts/run_tests.py,200/200)为两套口径——后者不含 hive/swarm 之外的部分 md_cg 单列件计数差异,本会话以仓库级 200/200 为门禁结论,两口径均已如实标注。
|
|
149
|
+
|
|
150
|
+
**git 工作树核对**(本会话 `git status --porcelain` / `git diff --numstat` + 六处落点读核):改动面 = **六个修复源文件**(tokens.py +41/-6、mdcg.py +15/-3、mdcos.py +35/-2、mcp_server.py +36/-10、chain.py +19/-4、security.py +12/-5)+ **五份常驻守卫**(untracked 新文件)——与五项修复一一对应(mcp_server.py 与 mdcos.py 各含两项修复的合并改动)。另有 `md_cg/whitebox_kb/wisdom/code_solidified.json`(+1/-2)为 v10-v14 报告已注明的先前会话遗留工作区变更,非本轮触点。未做任何 commit。
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
## 五、遗留清单(15 个开口:medium 7 / low 8;+ 复测结案 1 + 已修剔除 5 + rejected 0)
|
|
155
|
+
|
|
156
|
+
### 留档项(15 项,材料「留档未修」清单;★=本会话抽查读核在位性)
|
|
157
|
+
|
|
158
|
+
| # | where(缺陷时点) | 严重度 | 问题 | 留档理由 / 处置建议(材料口径) |
|
|
159
|
+
|---|------|------|------|------------------------------|
|
|
160
|
+
| N133 | md_cg/forgetting.py:274-283 + md_cg/insight.py:297-303 | medium | reinforce/insight.verify 漏标脏——默认开读缓存下同进程写后读永久陈旧(readcache「写面零挂载点」承诺破口) | 修复明确:对照 mdcg.py:3242 verify 路径先例补 _dirty[node_id]=e;与合并族 scrub.py:737-738/mdcg.py:3345 同根宜一并修。**速收候选** |
|
|
161
|
+
| N134 | md_cg/mdcg.py:2199-2208 + md_cg/readcache.py:102-110 | medium | _read OSError 负结果固化进读缓存——节点从检索面消失直至重启,「get 能读、search 搜不到」撕裂(可用性/一致性 DoS 面) | 修复方向明确:负结果不入缓存或短 TTL/失败即逐出。**速收候选** |
|
|
162
|
+
| N135★ | md_cg/hotcache.py:63-65 | medium | _ENV_SWITCHES 仅 6 项违反同文件自书纪律,12+ 项检索开关缺登——运行期翻转被缓存吞掉静默错答(本会话读核 6 项清单属实) | 修复机械:补登记清单,确定性守卫可写。**速收候选** |
|
|
163
|
+
| N136 | md_cg/tokens.py:417-422 + md_cg/mcp_server.py:3475-3481 | low | 告警裸写 sys.stderr——stderr 不可用部署(Windows 服务/pythonw)认证路径 fail-closed 变启动即崩;F1 新增沿链告警同款裸写(本报告会话读核补充)应一并包裹 | 修复明确:stderr 写包 try/except 或判 None 守卫;与 F1 同文件同 owner。**速收候选** |
|
|
164
|
+
| N137 | md_cg/mdcg.py:3152-3165 + 消费面 trust.py/lifecycle.py/mdcos.py | medium | 降级搬迁索引条目缺字段——证伪传播静默断链、session 检索丢节点,rebuild_index 才自愈 | 修复方向较明确(条目构造改走 _node_entry 真源)但涉多消费面回归——**留档,宜专项回归后收** |
|
|
165
|
+
| N138 | md_cg/mcp_server.py:3325-3354 + sustain.py + writelimit.py + 裸迭代面 | medium | sustain 后台线程与请求线程无锁并发——丢更新实测 + RuntimeError 崩溃面实测;缺省三 env 全开扩大暴露面 | 线程模型/加锁边界属**大设计决策专项**;修复时应一并评估缺省语义(是否默认开) |
|
|
166
|
+
| N139 | md_cg/crypto.py:262-274 + :282-300 | medium | _keys.json 损坏/版本漂移静默重签 DEK 覆盖写回——旧密文永久不可解不可逆 | 密钥生命周期语义决策(fail-closed 拒启 vs 告警+备份后重签;ENVELOPE_VERSION 漂移合法升级场景一并设计)——**大设计决策专项** |
|
|
167
|
+
| N140 | md_cg/writepipe.py:474-478 + mdcg.py add/排序键 | medium | importance NaN/inf 直通排序键——写一次长期污染全库排序 | 修复明确:写边界 math.isfinite 拒绝/夹紧,确定性守卫可写。**速收候选** |
|
|
168
|
+
| v8 N62★ | md_cg/tokens.py:394-431 + md_cg/security.py:316-334 | low | 租户 clearance_cap 夹紧从未接线(第 4 轮成立);角色 cap 最小夹紧两域评估为低风险零行为回归可顺收,租户 cap 接线必须专项 | 角色 cap 夹紧(_clamp_level(clearance, role_spec cap))可随轮顺收;租户 cap 接线属**授权链/租户语义专项**(「夹紧 vs 拒绝」「仅显式登记租户参与」两决策未拍板,v8.md:175 先例口径先设计后代码) |
|
|
169
|
+
| v9 N77 | md_cg/writepipe.py:436-442 + mdcos.py:1308-1315 + hotcache.py:45 | low | query 热缓存失效只挂 writepipe 一处——不经 writepipe 的写后 300s 内命中陈旧缓存 | 失效粒度(全清/键级/惰性 TTL)**设计决策 v13 起未拍板**;与 N133/N134 修复交叠,宜随其修复后统一拍板 |
|
|
170
|
+
| v14 N121 | mdcos.py:756 + mdcg.py:2401/:2465-2469 | low | 生产检索稳态 O(全池),S1/S7 门控默认关且 S7 仅接基类 | 非安全缺陷性能语义面——候选集来源语义改动**留档待专项设计** |
|
|
171
|
+
| v15 N125 | md_cg/mcp_server.py:3624-3626(现行 :3650-3652) | low | main() 把 MDCG_SESSION 原样重设打穿防编造校验;'*' 通配姊妹面(同 actor 多会话绑定档互读) | 修复明确:改走 _normalize_session 或直接删除 + 按 _declared_session 同款拒 '*'。**速收候选**(low 让位本轮额度) |
|
|
172
|
+
| v15 N126★ | mdcos.py:378-382(现行 :381-382)+ crypto.py:399-402(现行 :401-402) | low | 审计写入 best-effort 吞 OSError 零告警(本会话读核在位;检索域实测补证零痕迹) | 最小修=stderr 一行+进程内计数进 health_os(对照「增益失败不阻塞但不静默」先例)。**速收候选**(low 让位本轮额度) |
|
|
173
|
+
| v15 N129★ | security.py:344-347 + mcp_server.py:2665-2676 + export.py:100-106/:122 | low | MDCG_EXPORT_ROOT 未设时全库明文写任意路径+覆盖(P1-4「未配置=放开」裁定面,闸与 require_admin 都在) | **部署开关缺省语义决策**;止血候选=env 未设时回退以 cg.root 为白名单(_default_out 已在 root 内) |
|
|
174
|
+
| 历轮 low 合并族 | 族① scrub/forgetting/mdcg 直写不标脏|族② merge 无锁/get 契约不一致/S3 双记|族③ S5 裸读/O(全池)/neg 盲区/postings stat 税|姊妹面 interop '..' | low | 历轮留档 low 加固/性能/审计面合并族(本轮读核+三项动态复现在位) | 族① 与 N133 同根随其一并修;其余低危让位;'..' iter_id 姊妹面随 interop 门槛面顺收 |
|
|
175
|
+
|
|
176
|
+
### 大设计决策项处置建议(分诊汇总)
|
|
177
|
+
|
|
178
|
+
**优先级建议**(据材料处置线索汇总):
|
|
179
|
+
1. **下轮速收批次(修复方向明确、低风险、有先例可对照)**:N135(补登记清单,机械)→ N136(stderr 包裹,含 F1 新增沿链告警)→ N140(isfinite 校验)→ N133+N134+族①(读缓存写面破口三笔同根,对照 mdcg.py:3242 先例)→ N125(main() 单一口径+拒 '*')→ N126(stderr 一行+health 计数)→ N62 角色面(verify 侧 role cap 最小夹紧)。七项可单轮清空,建议按「读缓存一致性族(N133/N134/族①)→ 检索正确性族(N135/N140)→ 认证/审计加固族(N136/N125/N126/N62 角色面)」分批。
|
|
180
|
+
2. **需先设计决策后代码(v8.md:175 先例口径)**:N62 租户 cap 接线(授权链/租户语义专项——夹紧 vs 拒绝、仅显式登记租户参与);N77 失效粒度(全清/键级/惰性 TTL);N129 部署开关缺省语义(缺省强制 out 落 cg.root 内 vs 维持放开);N138 线程模型/加锁边界(并评估缺省三 env 是否改默认关);N139 密钥生命周期(fail-closed vs 告警+备份重签,ENVELOPE_VERSION 升级场景一并设计);N121 检索候选集语义(性能专项);N137 索引真源改造(需 trust/lifecycle/session 多消费面回归预案)。
|
|
181
|
+
3. **交叠提示**:N133/N134 与 N77 同涉读缓存/热缓存写面,建议一并拍板失效策略;N138 修复涉 _write_node/_dirty 全局锁边界,与 N137 的索引写路径有交叠,宜同一专项内设计。
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## 六、纪律合规声明
|
|
186
|
+
|
|
187
|
+
1. **定位先读索引**:本报告写作前已读 WORKSPACE_INDEX.md(按职责定位 md_cg/ 为「灵枢大脑——记忆系统本体」、docs/eval 为历轮报告所在),未做全盘浏览。
|
|
188
|
+
2. **结论引证**:所有修复与缺陷均引 path:line(材料口径为上游会话时点快照行号;并行修复致行号漂移处双标读核——N125 材料 :3624-3626 读核现行 :3650-3652、MdCGSecure.verify 材料 :3815-3822 读核现行 :3831-3839、N126 crypto 材料 :399-402 读核现行 :401-402、N130 MCP 透传材料 :2213-2216/:2236-2241 读核现行 :2219/:2240,以读核值为准);第三节证据要点摘自任务输入的四区复核材料(上游会话读码+实跑);第四节八项守卫/门禁 + git 核对为本会话第一手命令与输出;六处修复落点读核(tokens.py derive/verify_token、mdcg.py:3170/:3199、mdcos.py:2117/:2235-2237/:3831-3837/:3909-3910、chain.py:126/:135/:142、security.py:258-289、mcp_server.py:3547/:3567/:3575)与材料「在位」结论一致;留档缺陷抽查读核(N125 :3650-3652、N126 mdcos :381-382 + crypto :401-402、N129 security.py P1-4 注释、N135 hotcache.py:63-65 六项清单、N62 deferred 注释 tokens.py:414)与材料「在位/未修」结论一致。
|
|
189
|
+
3. **编号续编与冲突裁决声明**:v15 用至 N129(v15.md:4 核实),本轮自 N130 续编。材料三域临时编号冲突(recent N130-N133 / engine 建议 N130-N133 / retrieval N130-N132)由本报告会话统一裁决:守卫文件名锚定的 engine 区 N130/N131 保留、retrieval 区链读隔离顺延 N132、recent 区顺延 N133-N136、engine 区建议 N132/N133 顺延 N137/N138、retrieval 区顺延 N139/N140——全部重编在第三节逐项标注原暂编号,非暗改。
|
|
190
|
+
4. **安全测试纪律合规**:材料全部攻击复现均在系统临时目录/临时库/哑令牌/哑密钥/哑主密钥 bytes(range(32)) 形态(MDCG_TOKEN_FILE/MDCG_MASTER_KEY/MDCG_ROOT/MDCG_TENANT_REGISTRY/MDCG_DSH_SESSIONS_ROOT 全指向临时或哑值)进行且测毕清理,未触真实令牌库/真实 serve/真实数据目录(材料逐项声明,本报告照录);五个常驻守卫自带 tempfile 临时库+finally rmtree 清理;本报告会话仅运行守卫与门禁(自含临时环境)与读码,未触任何真实凭据/数据根、未修改任何源文件。
|
|
191
|
+
5. **已修项勿重复报**:第 9/10/13/14/15 轮已修清单(token 越界读、MCP 入口三层守卫、hotcache CN_GRAMS、verify fail-open、readcache 精确失效、_poll 解析缓存、租户覆盖告警、context_files 拒读等)未再报——本轮 v9 N78(CN_GRAMS 已登)经实读维持不立项并入已修剔除小节,与 N135(同清单其余 12 项缺登)明确分界不混淆;v14 N120 修复在位复测通过结案不立项;本轮 5 修中 N123/N124 为 v15 留档首修、N130/N131/N132 为本轮新发现首修,均非重复修复。
|
|
192
|
+
6. **如实记录**:四区 rejected 数组均为空(0 条证伪,与 v15 的 2 条不同)如实声明;已修剔除 5 项单列(v7 N51/v7 N50/v9 N78/v2 N12/v6 N38+N39);engine 区 N125 复测注明「main() 真实 serve stdin 回路未重跑,动态形态以 v15 实测为准」、N126「未实测(无可复现的行为变化)」、N62「未做动态复现(读码即可判定)」、N121「未重跑 10k/30k 计时基准」均照录不升格;N132 复现走单词法路属实验可观测性限制、N138 崩溃面为本场实测、N139 触发前提为本地文件系统访问非远程可利用——均按材料原样记录。
|
|
193
|
+
7. **隐私脱敏**:全文只写仓库相对路径;材料与本会话输出的本机绝对路径(gate 输出的仓库根本盘符路径、系统临时区路径、用户目录)一律转录为「仓库根/系统临时目录/临时区/哑值」等占位描述;哑令牌/哑密钥字面量以形态描述或材料自带的 dummy 形态(tk_xxx、sk-dummy 等)替代,不录任何真实凭据。
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## 七、跳过项及原因
|
|
198
|
+
|
|
199
|
+
- **swarm cargo test 未运行**:Rust 面零改动(本会话 git status 证实 swarm/ 与 rust/ 无改动,改动面仅 md_cg/ 的 python 件)——材料与本会话口径一致;后续 N139(python 侧)虽涉 crypto,本轮修复未动其代码,cargo 不适用。
|
|
200
|
+
- **npm test 未运行**:TS 面零改动(git status 证实 src/ 与 TS 测试未动)——材料与本会话口径一致。
|
|
201
|
+
- **npm run gate 的 R4 失败未在本会话消除**:根因是 5 个新守卫文件未 git add(untracked 时序性);消除需 commit/add——裁决归编排会话(材料口径「编排会话提交前裁决」),本会话不 commit,故未验证提交后 gate 转绿形态,如实标注。gate 链在 R4 后停止(cogmap_sync/link_check/workspace_index/verify_discipline 未到达——与 v15 同形态)。
|
|
202
|
+
- **五项修复的守卫红证未重跑**:红证需旧码回退,多轮未提交改动的工作树上不可行(守卫未回退)——以红绿数字材料口径(第二节逐项)+ 本会话五守卫绿态实跑 + 六处落点读核 + 全量 200/200 替代佐证,如实标注。
|
|
203
|
+
- **四区复核的攻击复现未在本会话重跑**:全部动态复现(临时区/临时库/哑令牌/哑主密钥/CreateFileW 独占句柄/有界并发线程)为上游会话执行且逐项声明清理(第三节证据要点来源均标注为材料原文);本会话以六处修复落点读核 + 留档项在位性抽查读核(N125/N126/N129/N135/N62)+ 八项守卫/门禁实跑替代,未重跑任何攻击场景。
|
|
204
|
+
- **N121 的 10k/30k 计时基准未重跑**:材料口径以 v14 实测为准,本轮仅读码复核+守卫实跑,如实标注。
|
|
205
|
+
- **N125 的 main() 真实 serve stdin 回路未重跑**:engine 区复测材料自身如实声明(动态形态以 v15 实测为准;本轮 _normalize_session 组件级实证 + 本会话读核 :3650-3652 在位),照录不升格。
|
|
206
|
+
- **N126 的动态复现部分区未重跑**:legacy/engine 区读核即现状(无可复现的行为变化,材料如实声明);检索域已实测补证(审计文件替换为目录零痕迹),本报告照录两口径。
|
|
207
|
+
- **15 项留档未修**:分诊与处置建议见第五节;本报告会话为报告撰写会话,不做修复。
|
|
208
|
+
- **git 未提交**:commit 需任务方指令;工作树保持六源文件补丁 + 五常驻守卫新增原状(及一件 v10-v14 已注明归属的先前会话 wisdom json 变更)。
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
*报告依据:任务输入的第 16 轮材料(四区复核 39 confirmed / 0 rejected 明细及证据〔legacy 7 / recent 11 / engine 11 / retrieval 10,三域临时编号冲突原文〕、五项修复的 where/缺陷面/修复/攻击前后对比/守卫/verified_by、留档未修 15 条、门禁结果);本报告会话的第一手核验:WORKSPACE_INDEX.md 读核、六处修复落盘读核(现行行号锚点:tokens.py :393/:408-431/:458/:483-500、mdcg.py :3170/:3199、mdcos.py :2117/:2235-2237/:3831-3837/:3909-3910、chain.py :126/:135/:142、security.py :258-289、mcp_server.py :202-206/:247-258/:3547/:3567/:3575/:2219/:2240,均带 N123/N124/N130/N131 病灶注释)、五新守卫实跑全绿(16/0、23/0、17/0、12/0、12/0)、N120 守卫实跑(23/0)、v15 守卫复跑(11/0)、全量回归实跑(200/200 通过、5 跳过,真实退出码 0)、npm run gate 失败第一手复现(真实退出码 1,R4 命中=5 全列)、git 工作树核对(numstat 与六文件五修复对应 + 一件先前遗留 json)、留档缺陷在位性抽查读核(N125/N126/N129/N135/N62 五处)、报告脱敏机械复查。*
|
|
213
|
+
|
|
214
|
+
*自查双清单:①材料覆盖——四区 39 条目全部入文(legacy 7 / recent 11 / engine 11 / retrieval 10;rejected 0 如实声明),跨区冗余 22 条合并说明(六项四区重复、两项三区重复、4 条双缺陷合并条目),去重后 20 独立缺陷 = 新 N130-N140 共 11(high 3/medium 7/low 1,三域冲突编号统一裁决并逐项标注原暂编号)+ legacy 复测 9 项(v15 五项 + v8 N62 第 4 轮 + v9 N77 + v14 N121 + 合并族,均标注原轮次与复测轮数),数目吻合;5 补丁逐项六要素齐全(where 双标/缺陷面/修复/攻击前后对比/守卫/verified_by)且 N123/N124 修复与第三/五节状态联动;20 − 5 = 15 开口与材料留档 15 条逐条对应无多无少;复测通过结案 1(N120)与已修剔除 5 项如实单列;任务留档复测重点①-⑦全部有结论(执行摘要主题 4);门禁四项(python 200/200 通过/cargo 未运行/npm test 未运行/gate R4 失败 5 命中)与跳过原因一一对应;材料与本会话不一致处仅 gate 残片截断(本会话实跑确认为 5 个全列,如实标注)。②纪律——全部结论引 path:line 或注明材料来源,本会话第一手实跑命令与输出在第四节(全量 200/200 真实退出码 0、五守卫+两往轮守卫七组绿态数字、gate 真实退出码 1 与 R4 五命中清单、git numstat、六落点+五留档抽查读核),未跑项(cargo/npm test/守卫红证/攻击复现/N121 基准/N125 serve 回路/提交后 gate)无一冒充为已跑;新发现续编 N130-N140 与三域冲突裁决显式声明而非暗改;行号漂移四处双标以读核为准;v9 N78(已登)与 N135(缺登)同清单分界明确不混淆;全文无本机绝对路径、无真实 key/token/密钥字面量(gate NOTE 为仓库既有哑凭据守卫备注,已注明非本轮产物),本会话未 commit、未触碰真实令牌库/serve/数据根、未修改任何源文件。*
|