@furongjun1999/dsh-memory 0.5.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +552 -465
- package/docs/README.md +1 -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//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_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/lib/bridge.d.ts +9 -0
- package/lib/bridge.js +35 -0
- package/lib/index.js +7 -1
- 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 +582 -580
- 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 +280 -29
- package/md_cg/mdcg.py +616 -125
- package/md_cg/mdcos.py +430 -66
- 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 +170 -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_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_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_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 +6 -2
- package/src/bridge.ts +434 -401
- package/src/index.ts +526 -518
- package/src/lib/roleplay_web.ts +1019 -932
- package/src/lib/token_store.ts +202 -192
package/docs/eval//346/225/205/351/232/234/346/263/250/345/205/245/345/256/236/346/265/213_v1.0.md
ADDED
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
# 故障注入实测报告 v1.0
|
|
2
|
+
|
|
3
|
+
- 日期:2026-09-26
|
|
4
|
+
- 对象:灵枢工程栈(md_cg 记忆本体 / hive 蜂巢运行时 / swarm 蜂群 WAL 面)
|
|
5
|
+
- 套件:`test/chaos_injection/`(18 用例 = mdcg 面 FI-M01..M09 + runtime 面 FI-R01..R09)
|
|
6
|
+
- 理论判据:`docs/theory/不可靠定理与失效优先框架_v0.3.md`(T0-T14 / A1-A4 / D1-D6)、`docs/不可靠性理论_v0.1.md`(九源 S1-S9 / 防线原语 P1-P12 / 七公理)
|
|
7
|
+
- 报告性质:理论作为工程规范的**首轮故障注入实测**;全部注入只在系统临时目录哑环境进行,真实令牌库 / 真实 serve / 真实数据目录零接触
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 一、实验定位
|
|
12
|
+
|
|
13
|
+
**理论作为工程规范的首轮实测。** v0.1 建立了「任何组件都不可靠」的第一性假设下的九源分类学(S1-S9)与防线原语(P1-P12),v0.3 将其推进为可证伪的失效优先定理框架(T0-T14 / D1-D6)。本实验把这两份文档当作**工程规范**而非宣言:每一格防线声明都落成可注入、可观测、可判定的用例——注入它,看防线是否如声明的那样承重。这正是 v0.3 §五为自己指定的验证方式(v0.3:272:「对注入套件(七类故障)与常规测试集分别跑同一系统;若注入集暴露的缺陷系统性多于常规集,支持 T4」)。
|
|
14
|
+
|
|
15
|
+
**两层划界。** ① **九源 = 工程来源分类**:S1-S9 是对本仓工程栈失效来源的操作性分类(硬件/OS、自身软件缺陷、线程并发、自身判据面、用户调用方、LLM、人类误配、平台默认值、时间/时钟),本轮 18 格全部落在该工程面上。② **理论适用于任意信息识别系统**:九源分类与 T 定理 / 防线原语的推导不依赖本仓具体实现——任何以「识别→判据→落账」为主干的系统都面对同构的九源威胁;本仓只是首个实证载体。首轮实测因此同时回答两个问题:本仓防线是否承重(第三节逐格),以及理论框架本身是否可被这套注入方法学证伪(第四节 T4 检验)。
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 二、注入矩阵与覆盖
|
|
20
|
+
|
|
21
|
+
**18 例,mdcg / runtime 各 9,均衡。** 总览(详证见第三节;四可顺序=可发现/可隔离/可恢复/可追溯):
|
|
22
|
+
|
|
23
|
+
| case | 源 | 故障 | verdict | 四可 | 留档 |
|
|
24
|
+
|---|---|---|---|---|---|
|
|
25
|
+
| FI-M01 | S9 时间/时钟 | 时钟回拨 | **gap** | 否·是·是·否 | v0.1§2.9承重面(A2单调锚待建) |
|
|
26
|
+
| FI-M02 | S1 硬件/OS | 资源剥夺(瞬态读失败) | **gap** | 否·是·是·是 | N134 |
|
|
27
|
+
| FI-M03 | S2 自身缺陷 | 静默改写(漏标脏) | **gap** | 否·是·是·是 | N133 |
|
|
28
|
+
| FI-M04 | S3 线程/并发 | 并发对撞(双写者) | **gap** | 是·是·是·是 | N138 |
|
|
29
|
+
| FI-M05 | S3 半程死亡 | 杀进程(intent↔outcome 间) | pass | 是·是·是·是 | - |
|
|
30
|
+
| FI-M06 | S6 LLM | 静默改写(伪造成功回答) | pass | 是·是·是·是 | - |
|
|
31
|
+
| FI-M07 | S7 人类误配 | 静默改写(空串回落) | **gap** | 否·是·是·否 | N91同型 |
|
|
32
|
+
| FI-M08 | S4 判据面自证 | 字节翻转(冻结 digest) | pass | 是·是·是·是 | - |
|
|
33
|
+
| FI-M09 | S5 调用方越权 | 越权写入 | pass | 是·是·是·是 | - |
|
|
34
|
+
| FI-R01 | S9 时间/时钟 | 时钟回拨 | pass | 是·是·是·是 | -(残余风险注记) |
|
|
35
|
+
| FI-R02 | S1 进程消亡 | 杀进程(serve 硬杀) | pass | 是·是·是·是 | -(N92 同型 NOTE) |
|
|
36
|
+
| FI-R03 | S6/S4 说谎者 | 静默改写(伪造 result.json) | **gap** | 否·否·否·否 | **NEW(P11-待建)** |
|
|
37
|
+
| FI-R04 | S4 自身/对手 | 字节翻转(WAL payload) | pass | 是·是·是·是 | - |
|
|
38
|
+
| FI-R05 | S1/S8 介质通道 | 消息丢失(WAL 整行删除) | **gap** | 否·否·部分·否 | **NEW(P0-2/seq连续性)** |
|
|
39
|
+
| FI-R06 | S3 通道交错 | 消息乱序(行序交换+依赖) | **gap** | 否·否·部分·否 | **NEW(P0-2/seq连续性)** |
|
|
40
|
+
| FI-R07 | S3 重复投递 | 消息重复(双 serve 领取) | pass | 是·是·是·是 | 次观测=P0-2 基线 |
|
|
41
|
+
| FI-R08 | S8 平台默认值 | 缺省密钥伪造签名 | **gap** | 否·否·否·否 | N143 |
|
|
42
|
+
| FI-R09 | S1 句柄对撞 | 写面对撞(撞 os.replace) | pass | 是·是·是·是 | - |
|
|
43
|
+
|
|
44
|
+
### 【七类故障覆盖】
|
|
45
|
+
|
|
46
|
+
- **杀进程** = FI-M05(两段式写 intent 与 outcome 之间)/ FI-R02(serve 运行中硬杀→重启恢复)
|
|
47
|
+
- **字节翻转** = FI-M08(冻结凭证 digest 首字符 XOR 0x01)/ FI-R04(WAL payload 单字节翻转)
|
|
48
|
+
- **消息丢失** = FI-R05(WAL 整行物理删除)
|
|
49
|
+
- **消息重复** = FI-R07(双 serve 竞争领取——原子领取 + 提交面无去重双观测)
|
|
50
|
+
- **消息乱序** = FI-R06(WAL 行序交换 + 依赖乱序引用)
|
|
51
|
+
- **时钟回拨** = FI-M01(TTL 令牌)+ FI-R01(心跳判活)——**两必测格均按指定手法(mock time.time 回拨 1h)实跑在案**
|
|
52
|
+
- **静默改写** = FI-R03(伪造 result.json,必测)+ FI-M03(reinforce 漏标脏)+ FI-M06(伪造成功回答)+ FI-M07(误配静默回落)
|
|
53
|
+
|
|
54
|
+
另有三格属七类之外的补充操作 / 同族变体(各格 fault 字段如实标注):FI-M02 资源剥夺(落 P1 静默损伤判据)、FI-M04 并发对撞(消息重复族的双写者形态)、FI-M09 越权写入(静默改写族·注入公理 5 面)。
|
|
55
|
+
|
|
56
|
+
### 【九源覆盖】
|
|
57
|
+
|
|
58
|
+
S1=FI-M02/FI-R09;S2=FI-M03;S3=FI-M04/FI-R06/R07;S4=FI-M08(判据面自证风险)/FI-R03 威胁面;S5=FI-M09;S6=FI-M06/R03;S7=FI-M07;S8=FI-R08;S9=FI-M01/R01——**每源 ≥1 达成**。完整归属见总览表「源」列:FI-R02 亦属 S1(进程消亡)、FI-M05 属 S3 半程死亡(公理 3)、FI-R04 属 S4、FI-R05 兼 S1/S8。
|
|
59
|
+
|
|
60
|
+
### 【实测口径】
|
|
61
|
+
|
|
62
|
+
17 项注入手法在临时环境实跑验证(临时 MDCG_TOKEN_FILE / MDCG_ROOT / MDCG_SUSTAIN_DIR / jobs 目录,测毕清理,未触真实令牌库与真实 serve 数据;FI-M07 为只读路径解析观测)。两格在原实验轮按读码+台账设计、未单独实跑而如实标注:FI-M04(sustain 并发——N138 台账实测在案 + 当前锁 sustain.py:844/:940 在位,作回归格)、FI-R09(独占句柄手法已在 FI-M02 同款实跑)。**报告时点复核**:全量套件亲跑 18/18 全部执行,其中 FI-M04 本轮动态捕获 `RuntimeError('dictionary changed size during iteration')` 在案(见三),FI-R09 注入实测生效——两格现均有本场实跑证据。FI-R03 的 verify_runner 对照半边因 REPO 硬指向真仓(`hive/verify_runner.py:23-24`,HERE/REPO 定义)无法临时重定向,以读码 verify_runner.py:161-166(passed>0 门)为据。
|
|
63
|
+
|
|
64
|
+
### 【本轮未覆盖格及原因】
|
|
65
|
+
|
|
66
|
+
1. **S9×swarm 水位 / stable 租约**:墙钟残余清点属 P1-6 逻辑时钟全域化待建面,本轮 S9 按 ask 指定集中 TTL+心跳两承重面。
|
|
67
|
+
2. **消息丢失/乱序的 mdcg 格未设**:审计吞错 N126 属 S2 静默 family,留第二轮与 E3 错误上报通道约束合并设计。
|
|
68
|
+
3. **字节翻转的 md 原文真源格未排**:其防线(T13 真源外部锚 / scrub 抽样)工程实现在 v0.3 矩阵仅 🟡,注入套件先行会变成无判据的红场,随 P1-4 落地补格。
|
|
69
|
+
4. **S5 的凭据外发面(N141 context_files)与 S6 的真实 LLM 调用面不排**:涉真实网络出口与密钥,违反临时环境纪律。
|
|
70
|
+
5. **S7 的人肉终裁面无自动化注入点**(蜂巢对齐 A14/A19:终裁=使用者是理论位置),仅以 FI-M07 误配格代表。
|
|
71
|
+
|
|
72
|
+
### 【理论闭环】
|
|
73
|
+
|
|
74
|
+
本轮多格产出「**gap 基线**」而非防线红场(R03 伪造产物被采信、R05/R06 丢失乱序不可检、R08 缺省密钥可伪造、M02/M03 留档缺口复现)——这正是 v0.3 §五可证伪性预言的方向:注入集暴露的缺陷系统性多于常规测试集,**支持 T4**(第四节)。这些格转正为对应待建面(P0-2 幂等键、P11 完整性锚、P1-6 逻辑时钟、P1-9 fail-closed 落点清单)的**回归判据**:防线一旦落地,套件亮红提示结案(见六 EXPECTED_GAP 机制)。
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## 三、逐用例结果
|
|
79
|
+
|
|
80
|
+
四可判定表(case_id / 源 / 故障 / 目标 / 注入方式 / 预期判据 / 实测观测 / 四可 / verdict / gap 归属)。观测数值为实验员轮次实测;报告时点复核轮(全量亲跑 18/18 与登记一致 EXIT=0)逐例 verdict 全部一致,时序敏感计数的轮次间差异在第六节如实注记。
|
|
81
|
+
|
|
82
|
+
### FI-M01 —— 时钟回拨:TTL 壁钟唯一时基被洗白(gap)
|
|
83
|
+
|
|
84
|
+
- **源/故障**:S9 时间/时钟 · 时钟回拨
|
|
85
|
+
- **目标**:`md_cg/tokens.py:371`(issue 落 expires_at)/ `:407-411`(verify 以 time.time() 判过期)
|
|
86
|
+
- **注入方式**:临时环境 MDCG_TOKEN_FILE=\<tmp\>/_tokens.json,tokens.issue(role='record', ttl=1800);进程内以替身对象替换 tokens.time 返回真实值-3600(墙钟回拨 1h)后 verify_token;对照组 +3600 前跳;测毕恢复 tokens.time 原对象。全程哑令牌文件,真实库零接触
|
|
87
|
+
- **预期判据**:A2 时间不可信(v0.1:62 公理 7:「钟错了」与「时间真的到了」在判据面上不可区分):TTL 判定以壁钟为唯一时基且无单调锚,回拨 1h 后应逐出令牌仍有效=预期暴露面;对照组正确时钟下过期拦截有效(T8 在时钟正确时成立)。判据落 verify_token 返回/抛错本身(tokens.py:407-411)
|
|
88
|
+
- **实测观测**:回拨 1h 后 verify_token 正常返回 Principal(actor=record,零告警零日志)=新鲜层被洗白;对照组前跳 1h 后抛 TokenError「令牌已过期」(fail-closed 在正确时钟下成立);tokens.time 恢复原对象无跨用例污染。与预期完全一致
|
|
89
|
+
- **四可**:可发现=否 · 可隔离=是 · 可恢复=是 · 可追溯=否
|
|
90
|
+
- **verdict**:**gap**
|
|
91
|
+
- **gap 归属**:TTL 壁钟判定无单调锚/外部时间锚,墙钟回拨洗白过期判据且系统内不可观测不可追溯。登记 v0.1§2.9承重面(A2单调锚待建);单调钟/外部时间锚属 v0.3 落地清单待建面输入
|
|
92
|
+
|
|
93
|
+
### FI-M02 —— 瞬态读失败固化为检索面永久消失(gap)
|
|
94
|
+
|
|
95
|
+
- **源/故障**:S1 硬件/OS · 资源剥夺(独占句柄制造瞬态读失败——七类之外的补充操作,落 P1 静默损伤判据)
|
|
96
|
+
- **目标**:`md_cg/mdcg.py:2199-2208`(_read 捕 OSError 返 (None,None))+ `md_cg/readcache.py:102-110`(_cached 负结果无豁免入缓存)
|
|
97
|
+
- **注入方式**:临时 root 建 MdCGSecure+readcache.install(默认开),add('m1',…) 后以 kernel32.CreateFileW(path, GENERIC_READ|WRITE, dwShareMode=0) 独占持住节点 md 文件(handle 非 INVALID 实测成功),冷缓存 search(必 miss),CloseHandle 释放后连续 search 两次;另设无注入对照 root 验证查询面有效;末以 readcache.clear 验证恢复面
|
|
98
|
+
- **预期判据**:预期 gap 对照(留档 N134,`docs/eval/缺陷挖掘_自主迭代_v16.md:86`):T4 静默损伤——一次瞬态 OS 失败无告警固化为「节点从检索面消失直至重启/再写盘」,cache 条目字面 (gen,(None,None));cg.get 直读不走缓存照常可读=撕裂;理论判据=P1 fail-closed(读失败应落向「暂不可用」而非「不存在」)+公理 1。红场=套件能复现留档缺口(套件效度检验)
|
|
99
|
+
- **实测观测**:持锁期 search=[](miss);cache 条目=(3,(None,None)) 字面固化;释放句柄后连续两次 search 仍 [];cg.get('m1') 直读 importance=0.5 正常(撕裂成立);对照 root 无注入时 search=['m1'] 命中;readcache.clear 后恢复命中。与 N134 留档逐项吻合
|
|
100
|
+
- **四可**:可发现=否 · 可隔离=是 · 可恢复=是 · 可追溯=是
|
|
101
|
+
- **verdict**:**gap**
|
|
102
|
+
- **gap 归属**:_read 的 OSError 负结果被 readcache 当正常值入缓存且 _fresh 判定恒真——一次瞬态读失败固化「节点从检索面永久消失」,get 能读/search 搜不到撕裂,零告警。对应 N134(v16.md:86,修复方向在案:负结果不入缓存或短 TTL/失败即逐出)
|
|
103
|
+
|
|
104
|
+
### FI-M03 —— reinforce 写盘成功检索面读旧值(gap)
|
|
105
|
+
|
|
106
|
+
- **源/故障**:S2 软件(自身代码缺陷)· 静默改写(写盘成功但检索面读旧值,零告警)
|
|
107
|
+
- **目标**:`md_cg/forgetting.py:274-283`(reinforce 直调 _write_node 后仅改内存 entry,不标 _dirty;_write_node 本体 mdcg.py:2058-2064 只原子写不标脏)+ `md_cg/readcache.py:80-100`(_fresh 新鲜度判定)
|
|
108
|
+
- **注入方式**:临时 root 装 readcache(默认开),add('n_fi', importance=0.5) → search 装缓存(基线 0.5)→ forgetting.reinforce(cg,'n_fi',delta=0.3)(返回 0.8)→ 再 search 同 query;比对检索面/内存索引/cg.get 直读/盘面 nodefile.loads 四层 importance 与缓存条目;readcache.clear 验证恢复面
|
|
109
|
+
- **预期判据**:预期 gap 对照(留档 N133,v16.md:85,readcache.py:19-22「写面零挂载点」承诺的破口):T4——正常响应内容错且不可观测;T12——写面与读面跨层端到端不一致,任何单层校验都不报错;修复方向对照先例 mdcg.py:3242(verify 路径写盘块本轮读码在位 :3240-3244;_dirty 补标行以 N133 留档口径为据)。红场为预期
|
|
110
|
+
- **实测观测**:reinforce 返回 importance=0.8(写面自认成功);再 search 仍返回 0.5;cg.get 直读=0.8;盘面 frontmatter importance=0.8;缓存条目冻结写盘前旧 fm(importance=0.5)=_fresh 恒真物证;readcache.clear 后检索面见 0.8(可恢复)。同进程写后读永久陈旧实测成立,与 N133 吻合
|
|
111
|
+
- **四可**:可发现=否 · 可隔离=是 · 可恢复=是 · 可追溯=是
|
|
112
|
+
- **verdict**:**gap**
|
|
113
|
+
- **gap 归属**:reinforce 写盘后既不标 _dirty 也不 flush/rebuild,默认开启的读缓存把写盘前旧 (fm,content) 在进程存活期内永久判新鲜——同进程写后读不一致,检索排序键含陈旧 importance,零告警。对应 N133(v16.md:85,修复明确:对照 mdcg.py:3242 先例补 _dirty;与 legacy 合并族 scrub.py:737-738/mdcg.py:3345 同根宜一并修)
|
|
114
|
+
|
|
115
|
+
### FI-M04 —— beat/heal/add 同实例并发对撞裸迭代崩溃面(gap)
|
|
116
|
+
|
|
117
|
+
- **源/故障**:S3 线程/并发 · 消息重复/并发对撞(双写者交错同一共享面)
|
|
118
|
+
- **目标**:`md_cg/sustain.py:844`(_lock 声明,仅覆盖 :940/:983/:1002/:1015 四处记账段)+ `:853-856`(beat 心跳戳写面)+ `:484`(diagnose 裸迭代 nodes.items() 无锁——本场定位的真实违反点)
|
|
119
|
+
- **注入方式**:临时 MDCG_SUSTAIN_DIR,SustainLoop(cg,d=\<tmp\>,auto_*=False).start() 后并发:线程 A 高频 beat()(数千次/窗),线程 B 高频 diagnose+heal 同一 cg,前台时间盒连续 add+flush 4s 全程重叠(无空窗),加 50ms 周期读者探针观测心跳戳;stop() 后比对 beats 计数守恒、异常捕获栈、JSONL 逐行解析、静止态戳可读
|
|
120
|
+
- **预期判据**:T1 观测者同罪:后台线程与前台请求互为不可靠观测者;判据=v0.1 §5.3 约束 T1(共享可变面加锁或消息化,禁口头豁免)。原预期「当前绿(锁吸收交错)」——实测证伪:_lock 只覆盖记账清单,diagnose 裸迭代共享面无锁,红场复现=N138 留档缺口仍在(非新窗口,v16.md:90 复现②同型)。D5 合法态:终态心跳计数与调用数一致
|
|
121
|
+
- **实测观测**:捕获 RuntimeError('dictionary changed size during iteration'),traceback 直指 `md_cg/sustain.py:484` diagnose 裸迭代(实验员轮预演两轮均 ~1s 内命中;套件以读码断言为确定性基线——动态捕获为加分证据未命中降级 NOTE;**报告时点复核轮动态捕获命中在案**);同时 beats 计数守恒(实验员轮 2898==2898)、_audit 等全部 .jsonl 零撕裂、静止态心跳戳完整可解析;窗内读者探针测得 read_stamp 瞬态 None 11-15/80 次(实验员轮)/ 9/79 次(复核轮)——beat 高频 os.replace 下的读者竞争窗,writer 原子性未破,归 P6/心跳判活面与 R01 新鲜窗口径,不计入本格判分
|
|
122
|
+
- **四可**:可发现=是 · 可隔离=是 · 可恢复=是 · 可追溯=是
|
|
123
|
+
- **verdict**:**gap**
|
|
124
|
+
- **gap 归属**:N138 崩溃面持续在案:sustain 后台/调用线程与前台请求共享 MdCG 实例,_lock 只串行化 sustain 自身记账清单(:940/:983/:1002/:1015),diagnose 裸迭代面(:484)与前台 add 交错即 RuntimeError(可观测但属崩溃面,无状态告警)。对应 N138(v16.md:90,线程模型/加锁边界属大设计决策宜专项;缺省三 env 全开扩大暴露面)。「预期绿/回归用例」的原定性被本场实测证伪,按失效优先直报
|
|
125
|
+
|
|
126
|
+
### FI-M05 —— 杀进程于 intent 与 outcome 之间:对账如实标记(pass)
|
|
127
|
+
|
|
128
|
+
- **源/故障**:S3 半程死亡(公理 3)· 杀进程(写者死于 intent 与 outcome 之间)
|
|
129
|
+
- **目标**:`md_cg/twophase.py:99-117`(begin 写 intent)/ `:209-231`(reconcile 对账)/ `:53-56`(R_* 判定码)+ `md_cg/mdcg.py:1672-1680`(reconcile_writes 转调)
|
|
130
|
+
- **注入方式**:临时 root:子进程(独立 python,同套件哑 env)MdCGSecure+twophase.begin('n_fi',content) 写 intent 后 sleep(60) 并 flush 打印 INTENT-WRITTEN;父进程读 stdout 确认信号后 child.kill() 硬杀(TerminateProcess,rc≠0 实测);父进程重开同一真源跑 cg.reconcile_writes() 两次(验幂等)。对照格:begin 后正常 add 落盘不 commit(等价死于落盘后/写账前)再 reconcile
|
|
131
|
+
- **预期判据**:T9 自稳定(真源+确定性重建协议⇒有限步回合法态)+T6+A4 诚实公理——「不假装成功」(twophase.py:14-15):reconcile 把半程死亡收敛到如实标记 {unpaired:1, committed:0, interrupted:1, applied:true}(node_missing),不是 error 也不是 committed;对照格判 R_NODE_OK=node_present_hash_match 补 committed;二分支均属合法态(D5),二次对账幂等
|
|
132
|
+
- **实测观测**:子进程 INTENT-WRITTEN 在案后被硬杀(rc≠0);reconcile 返回 {unpaired:1, committed:0, interrupted:1, applied:True, details:[{status:'interrupted', reason:'node_missing'}]},节点未落盘(cg.get=None)=如实标记;二次对账 unpaired=0(幂等收敛);对照格 {committed:1, reason:'node_present_hash_match'} 且节点在库。全数符合预期(套件修复子进程 sys.path 缺陷后多次运行稳定)
|
|
133
|
+
- **四可**:可发现=是 · 可隔离=是 · 可恢复=是 · 可追溯=是
|
|
134
|
+
- **verdict**:**pass**
|
|
135
|
+
|
|
136
|
+
### FI-M06 —— LLM 伪造已验证成功回答:L2 判据拦截(pass)
|
|
137
|
+
|
|
138
|
+
- **源/故障**:S6 LLM · 静默改写(伪造「已验证成功」的回答冒充事实)
|
|
139
|
+
- **目标**:`md_cg/whitebox_kb/wisdom/verify_answer.py:57-116`(L1 结构/:68-85,L2 来源/:87-105,L3 边界/:107-116;L2 hits 门 :92-96)
|
|
140
|
+
- **注入方式**:纯函数注入:verify_answer('根据我的知识,这项任务已经彻底完成、全部验证通过,没有任何遗留问题,可以放心收尾。(这条知识属于核心工程经验)', {kind:'knowledge', hits:[]})——内容自洽、语气确定但从未走条件路由图(55 字,过 L1 不触卡格式);对照组同函数喂合法 chitchat 短回答「好的,我们继续聊吧。」
|
|
141
|
+
- **预期判据**:done≠verified(v0.1 蜂巢对齐 D-1,S6 源「自报成功当事实」):LLM 输出只能作候选,资格由独立判据裁——L2 的 hits/卡导航要求即 P4 判据冻结在回答面的投影;拦截即 T8 fail-closed(无来源验证→落向拒绝而非放行)。红场(伪造组拦截+对照组放行)为预期=防线有效
|
|
142
|
+
- **实测观测**:伪造组 ok=False 且 checks 含「✗ L2 knowledge 回答无 hits(未走条件路由图)」(L1 过、L2 拦=拦截理由直指来源缺失;门体读码 verify_answer.py:93-96 在位);对照组 ok=True(L2 出口类别 chitchat 放行)。红场拦截生效=防线按预期,多次运行稳定
|
|
143
|
+
- **四可**:可发现=是 · 可隔离=是 · 可恢复=是 · 可追溯=是
|
|
144
|
+
- **verdict**:**pass**
|
|
145
|
+
|
|
146
|
+
### FI-M07 —— 空串 MDCG_TOKEN_FILE 静默回落默认路径(gap)
|
|
147
|
+
|
|
148
|
+
- **源/故障**:S7 人类(误配)· 静默改写(误配静默回落,无告警)——公理 4
|
|
149
|
+
- **目标**:`md_cg/tokens.py:42`(TOKEN_FILE_ENV)+ `:283-284`(token_file 空值回落链 path or env.get or DEFAULT——or 链空串同为假值直落 DEFAULT,零告警路径)
|
|
150
|
+
- **注入方式**:只读解析观测(真实令牌库全程零读写):contextlib.redirect_stderr 捕获下,env 未设时 tokens.token_file(None) 记下解析路径;再设 MDCG_TOKEN_FILE=""(空串)后再解析比对两字符串;套件经 mdcg_support.apply_env 把 aux 根钉在临时目录,故回落目标在实验中是临时 aux/_tokens.json,生产回落 ~/.mdcg 形态由读码断言(tokens.py:43-44 DEFAULT_TOKEN_DIR=aux_root())支撑
|
|
151
|
+
- **预期判据**:误配公理 4+N91 同型(v0.1 §2.7「空串误配静默上岗」,v17.md:102):P1 要求 fail-closed——空串应显式拒绝或至少 stderr 告警,而非静默把令牌面切回默认路径(生产形态后续一次 issue() 即写仓库外真实库)。判据=回落发生且零告警(读码 or 链无告警路径在案)=预期红场,作为令牌面 fail-closed 落点清单(v0.3 落地清单 P1-9)输入
|
|
152
|
+
- **实测观测**:未设与空串两种 env 状态下 token_file(None) 返回同一路径字符串(identical=True);全程 stderr=''(零告警零留痕);读码断言确认 or 链回落与 DEFAULT_TOKEN_DIR=aux_root() 在位。红场成立,多次运行稳定
|
|
153
|
+
- **四可**:可发现=否 · 可隔离=是 · 可恢复=是 · 可追溯=否
|
|
154
|
+
- **verdict**:**gap**
|
|
155
|
+
- **gap 归属**:空串误配静默回落真实默认令牌库路径,无拒绝无告警无留痕(不可发现不可追溯)——后续一次 issue() 即写生产库。登记 N91同型(v17.md:102 留档为 resolve() 空串静默上岗;本格为令牌面同型落点,非 N91 本体),输入 v0.3 落地清单 P1-9
|
|
156
|
+
|
|
157
|
+
### FI-M08 —— 冻结凭证 digest 翻转:A3 承重墙比对失败(pass)
|
|
158
|
+
|
|
159
|
+
- **源/故障**:S4 自身(改自身判据面/自证风险)· 字节翻转(翻转冻结凭证 digest 首字符,XOR 0x01)
|
|
160
|
+
- **目标**:`md_cg/interop.py:108-136`(freeze 判据冻结,out_dir 显式=离线留痕)+ `:139-143`(assert_a3 承重墙:verifier_fingerprint==frozen digest)+ `hive/verify_runner.py`(A3 消费点,读核)
|
|
161
|
+
- **注入方式**:interop.freeze('fi_iter', out_dir=\<tmp\>) 冻结到临时目录;对照组以当前 _manifest('--digest') 调 assert_a3 验基线;主场盘上改写 frozen.json 的 digest 首字符 XOR 0x01(c→d),确认文件仍可 JSON 解析后以原指纹调 assert_a3
|
|
162
|
+
- **预期判据**:P4 判据冻结(验证者≠被验证者)+T5 独立验证:判据落在冻结原文指纹比对上(T12——判据落在原文/摘要上),任何未冻结的判据面变化(含自身提交)都使 A3 红、valid=false;T3——互验结论可由不经过裁决者的证据链(frozen.json 原文)复核。注入红(比对失败)=防线有效;对照未篡改=A3 True
|
|
163
|
+
- **实测观测**:对照组 a3={ok:True, frozen==actual==c9e834…};篡改后文件仍可解析(digest 变值 d9e834…——文件格式层不设防,防线全押指纹比对,符合设计);assert_a3(原指纹)={ok:False, frozen:d9e8…, actual:c9e8…}——比对直接失败,verdict 作废路径成立。与预期一致
|
|
164
|
+
- **四可**:可发现=是 · 可隔离=是 · 可恢复=是 · 可追溯=是
|
|
165
|
+
- **verdict**:**pass**
|
|
166
|
+
|
|
167
|
+
### FI-M09 —— guest 越权写入:层写权限闸显式拒绝(pass)
|
|
168
|
+
|
|
169
|
+
- **源/故障**:S5 用户(调用方越权指令)· 静默改写(越权写入若得手即静默污染真源)——注入公理 5
|
|
170
|
+
- **目标**:`md_cg/mcp_server.py` 工具面→`md_cg/mdcos.py:3782-3786`(MdCGSecure.add→principal.require_layer_write 先于落盘)+ `md_cg/security.py:217-224`(require_layer_write 双闸=can_write+层白名单;对照 N131 双闸先例 mdcos.py review_decide merge,v16.md:84 已修留痕)
|
|
171
|
+
- **注入方式**:临时 root 构造 guest Principal(tenant='default', actor='fi_guest', can_write=False, can_admin=False, role='guest', auth_mode='direct'),直调 cg.add('n_evil','越权写入尝试', layer='secret');查节点未落库与目标目录未创建;对照格 designer Principal(can_write=True)同门写合法层成功;附加观测 designer+layer='secret' 的错误型
|
|
172
|
+
- **预期判据**:T8 fail-closed + P8 净化投影(v0.1 §2.5 S5 源):调用方指令不可信,写资格由层写权限闸判定而非由请求自报;拒绝必须显式(异常/错误码)不留半成品。注入被拒(红)为预期;对照格 designer 同调用应成功——闸只拦资格不拦功能
|
|
173
|
+
- **实测观测**:guest 直调抛 AccessDenied「actor=fi_guest 无写权限」且带可操作 hint(issue #34 口径,指引签发凭据三步);节点未落库、secret 目录未创建(零半成品);对照 designer 写 knowledge 层成功(nid 落库可读);诚实注记:layer='secret' 非合法层名(LAYERS 八层),guest 场权限闸先于基类层名校验生效(mdcos.py:3786 在 super().add 之前),designer 撞层名校验得 ValueError「未知层」——两道校验正交不互替(NOTE 留档)。与预期一致
|
|
174
|
+
- **四可**:可发现=是 · 可隔离=是 · 可恢复=是 · 可追溯=是
|
|
175
|
+
- **verdict**:**pass**
|
|
176
|
+
|
|
177
|
+
### FI-R01 —— 时钟回拨:serve 心跳新鲜度层拆层观测(pass)
|
|
178
|
+
|
|
179
|
+
- **源/故障**:S9 时间/时钟 · 时钟回拨
|
|
180
|
+
- **目标**:`hive/serve_start.py:51`(FRESH_S=15)/ `:179-192`(serve_alive 三层判据,新鲜度层在 :189)/ 对照 `hive/src/main.rs:122`(FRESH_MS=15000)
|
|
181
|
+
- **注入方式**:临时 jobs 目录写残留心跳 _serve.json {pid:实测死pid, ts:now-3600s},进程内 mock time.time ±3600s(finally 恢复)拆层观测:①复刻 :189 新鲜度层单层判定;②serve_alive 端到端;③前跳 +3600 对照
|
|
182
|
+
- **预期判据**:A2/S9(v0.1 §2.9 心跳判活承重面 serve_start.py:51/:189):回拨后新鲜度层把 1h 陈旧心跳洗白(该层无时钟单调锚,单层失真成立);端到端被 pid/同映像层兜住=P5 分层防御「单层失真不可致命、分层才有判别力」;前跳正确判死。残余风险(如实记录):pid 复用且同映像时三层全过=假活(v13 实测型)——P1-6「逻辑时钟全域化、墙钟降级展示」待建面实证输入
|
|
183
|
+
- **实测观测**:真实时钟下新鲜层=False(age=3600s≥15s 正确判死);回拨后新鲜层=True(洗白成立)、serve_alive 端到端=False(死 pid 被二/三层否决);前跳后新鲜层=False。四可证据:status() 返回 stale_heartbeat{pid_alive:False, pid_is_self_program:False, age_s:3617.6}(可发现+可隔离);serve_alive=False 不挡启动(:246 门,可恢复);stop()「存在陈旧心跳」文案在位(可追溯)。常量同值守卫 OK(FRESH_S==15 且 main.rs 含 FRESH_MS: f64 = 15_000.0)
|
|
184
|
+
- **四可**:可发现=是 · 可隔离=是 · 可恢复=是 · 可追溯=是
|
|
185
|
+
- **verdict**:**pass**(残余风险:pid 复用+同映像假活为 P1-6 待建面输入,NOTE 在案)
|
|
186
|
+
|
|
187
|
+
### FI-R02 —— 杀 serve 后重启:recover_orphans 崩溃恢复(pass)
|
|
188
|
+
|
|
189
|
+
- **源/故障**:S1 硬件/OS(进程消亡)· 杀进程(serve 运行中强杀后重启)
|
|
190
|
+
- **目标**:`hive/src/scheduler.rs:151-233`(serve 主循环)/ `:251-339`(recover_orphans)/ `:475-495`(classify_result 判据唯一实现)/ `:319-334`(running 无产物→诚实标 error)
|
|
191
|
+
- **注入方式**:临时 jobs 目录经真实 hive.exe submit 提交 sleep(8) 的 exec_cmd 任务(command=[python,-c,time.sleep(8)]),serve(--jobs 指临时池,HIVE_EXEC_PY=hive/exec_cmd.py)起跑至 state=running 后 Popen.kill() 硬杀 serve(执行器成孤儿),采样确认 status 冻结;重启 serve(--force)触发启动即 recover_orphans,轮询至终态
|
|
192
|
+
- **预期判据**:T0 失效定理①崩溃类(可观测→可恢复)+D4 四可:崩溃可发现(心跳停更+status 残留)、可恢复(重启有限步回合法态 D5);判据唯一实现 classify_result(C9 教训勿分叉);无产物诚实标 error 而非伪装 done(A4)。附带观测点:孤儿执行器补写 result.json 与 error 终态并存=N92 同型矛盾态
|
|
193
|
+
- **实测观测**:杀后 1.5s 内三次采样 state 恒=running、_serve.json ts 停更(可发现);重启后收敛 error「serve 中断:任务执行被重置」(error 字段实测含该文本,未伪装 done,A4 成立);classify_result 源码断言 OK(scheduler.rs 含 fn classify_result +「勿再分叉」)。附带观测点确认:孤儿执行器稍后补写 result.json ok=True,与 state=error 并存,poll 面同屏可见——N92 同型矛盾态现场实测复现,留待第二轮专项(NOTE 记录)
|
|
194
|
+
- **四可**:可发现=是 · 可隔离=是 · 可恢复=是 · 可追溯=是
|
|
195
|
+
- **verdict**:**pass**
|
|
196
|
+
|
|
197
|
+
### FI-R03 —— 伪造 result.json ok=true:终态判据被静默改写(gap)★必测
|
|
198
|
+
|
|
199
|
+
- **源/故障**:S6/S4 说谎者候选(必测静默改写)· 静默改写(伪造 result.json ok=true 但内容错)
|
|
200
|
+
- **目标**:`hive/src/scheduler.rs:475-495`(classify_result 只读盘面 error 字段,无 error 即 done)+ `hive/verify_runner.py:161-166`(passed>0 门的约束范围,读码)
|
|
201
|
+
- **注入方式**:临时 jobs 目录手工搭任务现场(目录名 h 前缀过 list_jobs 过滤 job.rs:192-204):spec.json + status(state=claimed) + 伪造 result.json {ok:true, content:伪造内容-CHAOS-FI-R03},启真实 serve(--workers 0,clamp 1)即跑 recover_orphans claimed 分支(:257-282),0.4s 粒度轮询状态 + hive.exe poll 观测面复核
|
|
202
|
+
- **预期判据**:T4/T12 核心:终态判据落在「组件说成功」(盘面无 error 字段)而非端到端原文/committed 上——公理 2(能写 result.json 的组件就能直写满足判据的假产物)成立,预期双双不拦(已知缺口基线);verify_runner passed>0 门只约束验证器执行过套件、不约束盘面产物真伪,其 REPO 硬指向真仓(verify_runner.py:23-24)无法临时重定向,该半边以读码为据未实跑。作为 P11 完整性锚 + M1 逃生门 rerun_on_recover 组合方案设计输入
|
|
203
|
+
- **实测观测**:0.4s 内被采信:state→done;hive.exe poll 实测 rc=0、job.state=done、result.content_head 含伪造内容全文、error 字段为 null——零拦截零告警(T4 静默成立)。源断言在案:classify_result 含 .get("error") 与 ("done".into(), None)(scheduler.rs:486-488,无 error 即 done);verify_runner 含 passed > 0 与 REPO 硬指向(:24/:165-166,读码为据如实标注未实跑);M1 逃生门 spec_rerun_on_recover 在位但缺省 false——默认路径仍采信伪造产物
|
|
204
|
+
- **四可**:可发现=否 · 可隔离=否 · 可恢复=否 · 可追溯=否
|
|
205
|
+
- **verdict**:**gap**
|
|
206
|
+
- **gap 归属**:终态判据面可被能写盘面的组件直写伪造(公理 2),缺完整性锚。登记 **NEW(P11-待建)**:v15/v16/v17 留档池无对应编号(N144 是 exec_cmd 写面加固、与本格判据面语义不同);对应 v0.1 P11 完整性锚待建 + v0.3 矩阵「T4/T12」格;修复方向=产物签名/端到端 committed 判据 + rerun_on_recover 逃生门组合。verify_runner 半边读码为据、未实跑,如实声明
|
|
207
|
+
|
|
208
|
+
### FI-R04 —— WAL payload 字节翻转:HMAC 验签捕获与定位(pass)
|
|
209
|
+
|
|
210
|
+
- **源/故障**:S4 自身/对手失效 · 字节翻转(WAL payload 单字节篡改)
|
|
211
|
+
- **目标**:`swarm/rust_swarm.py:101-151`(verify_wal_signatures 逐条 HMAC 验签)↔ `swarm/rust_runtime/src/swarm.rs:376-386`(sign_event 签名串 seq|type|from|to|round|ts|payload)/ `:1107`(WAL 行格式)
|
|
212
|
+
- **注入方式**:纯 Python 按 v0.7.1 签名串构造 3 条合法签名 WAL 行(HMAC-SHA256+行格式与 Rust 写序一致),先基线验签确认 fixture 正确,再把第 2 行 payload "hello"→"hellO"(实测差异字节数=1)落盘重验;另做行级单验定位与畸形行(\xff\xfe not-json)容错观测
|
|
213
|
+
- **预期判据**:P11 完整性锚+T12:篡改必被端到端 HMAC 捕获且能定位行;验签器面对畸形行不得崩溃(rust_swarm.py 容错解码读码在案)。判据=bad==1 且 all_valid==False
|
|
214
|
+
- **实测观测**:基线 3/3 verified all_valid=True(fixture 与 Rust 约定一致);翻转后 {total:3, verified:2, bad:1, all_valid:False}——恰好命中被篡改行;行级单验逐行 bad=[0,1,0] 定位到第 2 行(可追溯实测);畸形行验签器不崩,bad=1 计入 all_valid=False(fail-closed)
|
|
215
|
+
- **四可**:可发现=是 · 可隔离=是 · 可恢复=是 · 可追溯=是
|
|
216
|
+
- **verdict**:**pass**
|
|
217
|
+
|
|
218
|
+
### FI-R05 —— WAL 整行删除:验签器丢失不可检(gap)
|
|
219
|
+
|
|
220
|
+
- **源/故障**:S1/S8(介质与通道)· 消息丢失(WAL 整行删除)
|
|
221
|
+
- **目标**:`swarm/rust_swarm.py:100-151`(逐行独立验签,无 seq 连续性/行数判据)
|
|
222
|
+
- **注入方式**:同一 3 行签名 WAL fixture,物理删除中间行(seq=2,源断言确认目标行)后重验,其余行一字节不动
|
|
223
|
+
- **预期判据**:T2 消息不可信:丢失在允许失效集内,系统承诺的不是「不丢」而是「丢失可检可裁」(D4 可发现)——预期不可检=当前缺口基线:单条 HMAC 锚完整性不锚存在性(P11 覆盖篡改不覆盖遗漏)。输入 P0-2 幂等键/seq 连续性判据设计与 v0.3 矩阵「T2/T7 幂等 🟡」格
|
|
224
|
+
- **实测观测**:缺口复现:删除后 {total:2, verified:2, bad:0, all_valid:True}——整行丢失对本验签器零信号。源断言在案:rust_swarm.py 含 rec.get("seq", 0) 且无 seq+1/连续字样(seq 仅入签不参与连续性判定)
|
|
225
|
+
- **四可**:可发现=否 · 可隔离=否 · 可恢复=部分(真源 append-only 在则可重放,但删除已发生无从知晓) · 可追溯=否
|
|
226
|
+
- **verdict**:**gap**
|
|
227
|
+
- **gap 归属**:验签面无 seq 连续性/行数判据,整行删除不可检。登记 **NEW(P0-2/seq连续性)**:v15-v17 留档池无对应编号;对应 v0.3 落地清单 P0-2 与矩阵「T2/T7 幂等 🟡」格;时序语义现由 Rust 重放水位/快照提交点(swarm.rs:460)承担,Python 审计面不覆盖——诚实记录
|
|
228
|
+
|
|
229
|
+
### FI-R06 —— WAL 行乱序不可检 + submit 依赖 fail-fast 拦截(gap)
|
|
230
|
+
|
|
231
|
+
- **源/故障**:S3 并发(通道交错)· 消息乱序(WAL 行序交换 + 依赖乱序引用)
|
|
232
|
+
- **目标**:`swarm/rust_swarm.py:100-151`(验签无次序判据)+ `hive/src/main.rs:229-245`(submit 侧依赖完整 fail-fast)/ `hive/src/scheduler.rs:535-537`(deps_gate 无环性注释)
|
|
233
|
+
- **注入方式**:①同一 3 行签名 fixture 行序交换(seq=3 行提到最前)后验签;②真实 hive.exe submit 一条 depends_on=["h_notexist_0000"] 的 spec 到临时 jobs,观测 rc/文案/jobs 目录残留
|
|
234
|
+
- **预期判据**:T2+A2 逻辑时序:swarm 验签器无次序判据=gap 基线(时序语义由 Rust 重放水位/快照提交点承担,Python 审计面不覆盖);hive 侧结构性防御有效:job_id 时间序+提交侧 fail-fast 使「引用未来任务」不可能成环(scheduler.rs deps_gate 注释在案),乱序注入被拒(红)为预期
|
|
235
|
+
- **实测观测**:①行序交换后 {total:3, bad:0, all_valid:True}——乱序不可检(同 R05 缺口复现);②submit rc=1、错误文案「依赖不完整: h_notexist_0000(任务不存在,先提交上游任务)」、jobs 目录零任务残留(拒绝发生在进队列前);deps_gate「无环性由 job_id 时间序结构性保证」源断言 OK。hive 半边四可全 True(拒收信号明确/不建任务/文案点名依赖 id)
|
|
236
|
+
- **四可**(verdict 承重的 swarm 半边):可发现=否 · 可隔离=否 · 可恢复=部分(Rust 重放承担时序语义,Python 审计面不覆盖) · 可追溯=否
|
|
237
|
+
- **verdict**:**gap**
|
|
238
|
+
- **gap 归属**:swarm 审计面无次序判据,行序交换不可检——与 FI-R05 同根,登记 **NEW(P0-2/seq连续性)**;hive 提交面半边拦截有效(pass 面)同格共存实测
|
|
239
|
+
|
|
240
|
+
### FI-R07 —— 双 serve 竞争领取:claim 原子锁恰好一次(pass)
|
|
241
|
+
|
|
242
|
+
- **源/故障**:S3 并发(重复投递)· 消息重复(双 serve 竞争同一任务)
|
|
243
|
+
- **目标**:`hive/src/job.rs:120-128`(claim=CreateFile create_new 原子锁)/ `:39-42`(new_job_id)+ `hive/src/scheduler.rs:214-216`(claim 失败即跳过)
|
|
244
|
+
- **注入方式**:临时 jobs 目录 submit 1 条 exec_cmd 任务(命令体向池外哨兵文件追加计数=执行痕迹确定性观测面),先起 serve A,心跳在位后以 --force(合法入口,main.rs:157-171)拉起 serve B 竞争领取;终态后再留 0.5s 重复执行窗。次观测:同 spec 重复 submit 两次比对 job_id
|
|
245
|
+
- **预期判据**:T7 幂等必要性+D6:领取面以文件系统原子原语吸收重复投递,N 次投递效果=1 次执行(「恰好一次」判据);次观测暴露 T7 另一面——提交面无 content-hash 幂等键(v0.3 矩阵「T2/T7 幂等 🟡、P0-2 待建」):重复提交产生重复任务,作为 P0-2 基线记录
|
|
246
|
+
- **实测观测**:主观测全命中:双 serve 在跑(两个存活进程实测)下终态恰为 done、result.json 单份、哨兵计数=1(败者 claim=false 静默跳过,零第二次执行)、无 .tmp 残留、claimed.lock 在位;源断言 job.rs create_new(true)(:126)与 scheduler.rs claim 失败跳过在位。次观测实测:两次 submit 得两个不同 job_id/两任务目录(结构性无内容去重)——P0-2 已知基线记录(NOTE,不计 verdict)
|
|
247
|
+
- **四可**:可发现=是 · 可隔离=是 · 可恢复=是 · 可追溯=是
|
|
248
|
+
- **verdict**:**pass**
|
|
249
|
+
|
|
250
|
+
### FI-R08 —— 公开缺省密钥伪造合法签名 WAL(gap)
|
|
251
|
+
|
|
252
|
+
- **源/故障**:S8 平台默认值 · 静默改写(用公开缺省密钥伪造合法签名 WAL)
|
|
253
|
+
- **目标**:`swarm/rust_swarm.py:24`(DEFAULT_SECRET 公开常量)/ `:28-38`(make_swarm_config 缺省即用)+ `swarm/swarm_cli.py:93`(CLI 缺省=空串两口径分叉,N143)
|
|
254
|
+
- **注入方式**:以 DEFAULT_SECRET 为密钥按 v0.7.1 签名串伪造「queen→w1 任务」WAL 行(再扩为 3 行整条群史)落盘,以同一公开常量调 verify_wal_signatures;另实测空串密钥照签照过(CLI 口径半边)+错密钥对照
|
|
255
|
+
- **预期判据**:P7(平台承诺须实测后采信)+P11 的前提声明:HMAC 防线判别力完全依赖密钥保密性,密钥=公开常量时防线对持常量者零判别力;两口径分叉(API 缺省常量/CLI 缺省空串)属误配公理 4 面。作为 N143 密钥生命周期留档(v0.1 §2.8)的实证格,输入 P1-9 fail-closed 落点清单(无密钥应拒跑而非回落缺省——T8)
|
|
256
|
+
- **实测观测**:红场成立:伪造单行 {verified:1, bad:0, all_valid:True}、整条伪造群史 3/3 全绿——审计签名面被击穿;空串密钥行照签照过 verified=1(两口径分叉实测);源断言 make_swarm_config 缺省==DEFAULT_SECRET(rust_swarm.py:28-38)、DEFAULT_SECRET 硬编码源码面(:24)、swarm_cli.py 含 cfg_in.get("shared_secret", "")。对照:错密钥 bad=1 all_valid=False(防线本体 fail-closed 正常,缺口仅在缺省密钥面——与 N143 留档口径一致)
|
|
257
|
+
- **四可**:可发现=否 · 可隔离=否 · 可恢复=否 · 可追溯=否
|
|
258
|
+
- **verdict**:**gap**
|
|
259
|
+
- **gap 归属**:缺省密钥公开常量(API)/空串(CLI)fail-open,对读过源码者零判别力、可整条伪造群史。留档编号 N143(`docs/eval/缺陷挖掘_自主迭代_v17.md:85`,owner=rust,「缺省密钥从何而来」配置语义决策 deferred:fail-closed 拒启动 vs 首启随机生成落盘);输入 P1-9 fail-closed 落点清单(T8)
|
|
260
|
+
|
|
261
|
+
### FI-R09 —— 写面对撞:读者独占句柄撞 os.replace 重试窗(pass)
|
|
262
|
+
|
|
263
|
+
- **源/故障**:S1 硬件/OS(WinError 5/32 句柄对撞)· 写面对撞(读者持句柄撞 os.replace)
|
|
264
|
+
- **目标**:`hive/exec.py:104-156`(write_result:mkstemp+fsync+os.replace,PermissionError 10ms×递增重试至多 50 次 :138/:142,FileNotFoundError 重建自愈 :146,finally 清 tmp)
|
|
265
|
+
- **注入方式**:临时 job 目录先写旧 result.json;kernel32.CreateFileW 持句柄 0.35s(写方独立线程重试、主线程按时释放——修正首版「写方跑主线程致句柄永不释放」与「restype 缺省致 INVALID_HANDLE 误判」两个 harness 缺陷后注入实测生效),期间 write_result 写新 payload 撞 PermissionError 进重试窗;两种读者句柄形态分场:①share=0 硬独占 ②share=FILE_SHARE_READ 读者形(Python open 共享语义,exec.py:113-115 注释口径);对照组裸 open("w") 写中途 0.15s 窗
|
|
266
|
+
- **预期判据**:P2 原子写+fsync:并发读者永不读半截(「要么旧完整要么新完整」即 D6 幂等的读侧形态);fail-safe 对照:重试耗尽才抛且旧完整态仍在位;对照组裸 open("w") 同场景必现截断窗(N88 红场先例,v17.md:69)
|
|
267
|
+
- **实测观测**:主场① share=0 期间读者被 OS 挡在 open 层(实验员轮 blocked=132 次 WinError32/Errno13;复核轮 118 次)、拿到句柄的读取全部完整态(实验员轮 25 次/复核轮 23 次)、写方重试窗吸收对撞后成功、终盘=新完整态且零 .tmp 残留;主场② 读者形句柄下读者全程 json.loads 恒成功(旧/新完整态)、replace 撞 PermissionError 后重试窗内完成——「绝不读半截」两形态均成立;对照组裸 open("w") 实测捕获 torn≥1(N88 红场复现,原子写必要性差分证据)。重试参数源断言 OK(exec.py range(50)/except PermissionError/except FileNotFoundError)。四可:可发现=PermissionError 被重试窗捕获留痕(err=None 收敛);可隔离=mkstemp 唯一名互不踩踏(零串扰);可恢复=重试耗尽才抛且旧完整态在位(读码口径,耗尽分支本轮未实跑如实标注);可追溯=finally 清 tmp 成功路径零残留。诚实记录:首版 harness 两处缺陷(ctypes 句柄判别、写线程布局)已修正并以探针实证 share=0 确会阻塞读者与 replace 后方注入本格
|
|
268
|
+
- **四可**:可发现=是 · 可隔离=是 · 可恢复=是 · 可追溯=是
|
|
269
|
+
- **verdict**:**pass**
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## 四、T4 检验结论
|
|
274
|
+
|
|
275
|
+
**判据(v0.3:272 原文)**:「本框架预言『成功路径测试对 T0 无证明力』。验证方式:对注入套件(七类故障)与常规测试集分别跑同一系统;若注入集暴露的缺陷系统性多于常规集,**支持 T4(静默错误支配)**。框架被证伪应定义为:真源完好 + 全量注入通过的情况下,系统仍发生不可恢复的状态损坏。」
|
|
276
|
+
|
|
277
|
+
**实测对照**:
|
|
278
|
+
|
|
279
|
+
| 面 | 结果 |
|
|
280
|
+
|---|---|
|
|
281
|
+
| 注入集(本轮 18 例) | **gap 9 格**,其中 NEW 登记 2 类(P11-待建、P0-2/seq 连续性,覆盖 3 格);其余 7 格复现已登记缺口基线(N133/N134/N138/N143/N91 同型/v0.1§2.9 承重面) |
|
|
282
|
+
| 常规测试集 | 0 新缺陷 @206/206 绿基线(口径:批次 51 提交记录与上游台账;本轮未复跑常规套件,见第七节诚实口径) |
|
|
283
|
+
| 证伪条件检验 | 未触发(证伪要求「真源完好+全量注入通过仍不可恢复损坏」;本轮 9 格 gap 均为防线/判据缺失的可检可修缺口,无此形态) |
|
|
284
|
+
|
|
285
|
+
**结论:支持 T4(静默错误支配定理)。** 9/18 格在 206/206 绿的系统上暴露真实缺口——其中 5 格属「零告警静默」(M01/M02/M03/M07/R03 的可发现=否),直接印证「成功路径测试对静默错误无证明力」的预言;3 格四可全否(R03/R05/R08),说明缺口集中在**判据面与证据面**(完整性锚、seq 连续性、密钥生命周期)而非执行面——与 v0.1「防线原语中 P0-2/P11 属待建」的预判一致。同时未观测到证伪形态损坏,框架在首轮实测下存活。
|
|
286
|
+
|
|
287
|
+
报告时点复核:`python test/chaos_injection/run_all.py` 全量 18/18 与登记一致 EXIT=0(本轮亲跑)。
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## 五、新发现缺口清单(NEW 项详述)
|
|
292
|
+
|
|
293
|
+
### NEW-1:终态判据面可被伪造(P11-待建)——FI-R03
|
|
294
|
+
|
|
295
|
+
- **where**:`hive/src/scheduler.rs:475-495` classify_result(判据唯一实现)只读盘面 result.json 的 error 字段——无 error 即 done,产物内容真伪不在判据内
|
|
296
|
+
- **形态**:能写 result.json 的组件(含被黑执行器/说谎者 LLM)可直写 {ok:true, content:任意},0.4s 内被采信为 done,poll 面展示伪造内容全文,零拦截零告警(公理 2 实证)。M1 逃生门 rerun_on_recover 在位但缺省 false,默认路径不重跑
|
|
297
|
+
- **理论对应原语**:v0.1 **P11 完整性锚(待建)**+ T4/T12;v0.3 矩阵「T4/T12」格
|
|
298
|
+
- **建议处置**:产物签名或端到端 committed 判据(判据不落在「组件自报」上)+ 缺省开启 rerun_on_recover 逃生门组合;套件格 FI-R03 已作 EXPECTED_GAP 回归判据,修复落地即亮红提示结案
|
|
299
|
+
|
|
300
|
+
### NEW-2:审计面无 seq 连续性/次序判据(P0-2/seq 连续性)——FI-R05 / FI-R06 同根
|
|
301
|
+
|
|
302
|
+
- **where**:`swarm/rust_swarm.py:100-151` verify_wal_signatures 逐行独立验签——seq 仅入签不参与连续性判定,无行数/缺口判据
|
|
303
|
+
- **形态**:整行物理删除(R05)与行序交换(R06①)后验签全绿 {all_valid:True}——单条 HMAC 锚完整性不锚存在性与次序(P11 覆盖面边界实证);丢失与乱序对 Python 审计面零信号
|
|
304
|
+
- **理论对应原语**:v0.1 **P0-2 幂等键/seq 连续性(待建)**+ T2/T7;v0.3 矩阵「T2/T7 幂等 🟡」格
|
|
305
|
+
- **建议处置**:审计面补 seq 连续性/行数判据(缺口即红);时序语义现由 Rust 重放水位/快照提交点(swarm.rs:460)承担,Python 审计面补齐时保持单一判据实现(C9 教训勿分叉);R05/R06 已作 EXPECTED_GAP 回归判据
|
|
306
|
+
|
|
307
|
+
---
|
|
308
|
+
|
|
309
|
+
## 六、套件说明
|
|
310
|
+
|
|
311
|
+
### 目录与组成
|
|
312
|
+
|
|
313
|
+
`test/chaos_injection/`(Windows + Python 3 标准库零依赖):
|
|
314
|
+
|
|
315
|
+
| 文件 | 职责 |
|
|
316
|
+
|---|---|
|
|
317
|
+
| `README.md` | 用例表 + 安全边界 |
|
|
318
|
+
| `harness.py` | 公共层:Case 断言 / 临时目录与进程树管理 / WAL v0.7.1 签名 fixture / hive.exe submit·serve·poll 辅助 |
|
|
319
|
+
| `mdcg_support.py` | mdcg 面公共支撑件(哑 MDCG_* env 注入)——**出处注**:非 runtime 面实验员产物,系并行 mdcg 面用例的公共支撑件,runtime 面九 case 未引用、不影响运行 |
|
|
320
|
+
| `registry.py` | 用例登记表 = EXPECTED_GAP 机制载体(18 格 expected_verdict + gap_tag) |
|
|
321
|
+
| `run_all.py` | 全量入口 |
|
|
322
|
+
| `test_fi_m01..m09` / `test_fi_r01..r09` | 18 个 case 模块 |
|
|
323
|
+
|
|
324
|
+
### 运行方式(任意 cwd)
|
|
325
|
+
|
|
326
|
+
```bash
|
|
327
|
+
python test/chaos_injection/run_all.py # 全量 18 case(R 面 9 + M 面 9)
|
|
328
|
+
python test/chaos_injection/run_all.py -k M # 只跑 mdcg 面
|
|
329
|
+
python test/chaos_injection/run_all.py -k R04 # -k <子串> 过滤
|
|
330
|
+
python test/chaos_injection/run_all.py --list # 只列目标
|
|
331
|
+
python test/chaos_injection/test_fi_m01_token_clock_rollback.py # 单 case 直跑
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
`test/` 非 python 包(实测 `import test` 命中 stdlib test 包),故与 scripts/test_*.py 同约定直跑,不走 -m。每 case 子进程独立执行,断言行打印 OK/FAIL,末行 `CASE_RESULT {json}`(case_id/verdict/expected/consistent/fails/notes)机器可读,run_all.py 据此汇总。
|
|
335
|
+
|
|
336
|
+
**本轮实测**:`python test/chaos_injection/run_all.py` → 全量 18/18 一致 → EXIT=0(报告时点亲跑;单格耗时 R02 8.5s / M04 4.3s 等,全量 <1 分钟)。
|
|
337
|
+
|
|
338
|
+
### EXPECTED_GAP 机制
|
|
339
|
+
|
|
340
|
+
`registry.py` 中 expected_verdict='gap' 的用例(FI-M01/M02/M03/M04/M07/R03/R05/R06/R08)为登记在册的已知缺口基线——红场复现=与登记一致不红 CI;一旦修复落地(观测转 pass)即与登记不一致亮红,提示改登记结案(缺口结案留痕)。expected_verdict='pass' 的用例构成回归守卫:未来防线弱化→亮红。
|
|
341
|
+
|
|
342
|
+
### 退出码语义(已双向实证)
|
|
343
|
+
|
|
344
|
+
- **0** = 全部用例观测状态与 registry 登记一致(本轮亲测:全量 18/18 一致 EXIT=0;错登记试验还原后 -k R01 复跑 EXIT=0)
|
|
345
|
+
- **1** = 出现未登记新 gap(pass 用例回归)、执行层崩溃(untestable 硬红)、或 EXPECTED_GAP 缺口消失(提示改 registry 登记为 pass 结案)。本轮亲测:临时把 FI-R01 登记翻为 gap 后运行 → 汇总 `[不一致] FI-R01 观测=pass 登记=gap` + `REGISTRY DRIFT` → **EXIT=1**,随后还原登记复跑 EXIT=0(registry.py 已恢复原样,git 面无痕)
|
|
346
|
+
|
|
347
|
+
### CI 接入方式
|
|
348
|
+
|
|
349
|
+
**截至本报告尚未接线**(`.github/workflows/` 八个 workflow 无一引用 chaos_injection,grep 实测无命中)。接入点即退出码语义:CI 步骤执行 `python test/chaos_injection/run_all.py`,非 0 即红;EXIT=1 的三种触发均为需要人工介入的信号(回归/崩溃/缺口结案),不适合自动重试。
|
|
350
|
+
|
|
351
|
+
### 安全边界
|
|
352
|
+
|
|
353
|
+
- 全部 mdcg 面注入经 `mdcg_support.apply_env` 把 MDCG_ROOT/MDCG_DATA_ROOT/MDCG_AUX_ROOT/MDCG_STATE_ROOT/MDCG_TOKEN_FILE/MDCG_SUSTAIN_DIR 钉进 `chaos_fi_*` 临时目录、MDCG_MASTER_KEY 为哑值——**真实令牌库/真实 serve/真实数据目录零接触**;case 结束 finally 树杀子进程并 rmtree
|
|
354
|
+
- runtime 面注入只发生在 tempfile.mkdtemp(prefix="chaos_fi_*") 系统临时目录 + 自建哑进程树/哑密钥/哑 WAL;hive serve/submit 经 --jobs 钉死临时池
|
|
355
|
+
- 目录名规避 Windows 保留设备名(aux→mdcg_aux,实撞 NotADirectoryError 后修正)
|
|
356
|
+
- FI-R01 的 mock 只作用于 case 进程内 time.time,不影响其它进程;FI-M02 的 CreateFileW 注入为 win32 专属
|
|
357
|
+
- 环境要求:hive/target/release/hive.exe 须已构建——本轮核对 exe(430080 字节)晚于全部 hive/src Rust 源(0 个 src 文件晚于 exe);hive/exec.py 为解释执行不需重建
|
|
358
|
+
|
|
359
|
+
### 套件卫生缺口(报告时点新发现,如实报告)
|
|
360
|
+
|
|
361
|
+
- **m 面 5/9 用例成功路径残留 1 个哑数据临时根目录**:逐 case 单跑实测(前后集合差法),M02/M03/M04/M05/M09 各留 1 个 `chaos_fi_m0X_*`(内容=哑数据根目录,如 m03root);M01/M06/M07/M08 与全部 R 面**零残留**。机理:建过 MdCG 实例的用例在 finally cleanup 时 `rmtree(ignore_errors=True)`(harness.py:106-107)静默失败。**不改判分**(断言与 verdict 均有效),留作套件卫生改进项(方向:cleanup 前强制释放实例句柄 + 可重试 rmtree)
|
|
362
|
+
- 本轮已清理系统临时目录内陈旧 chaos_fi_* 残留 34 个(哑数据,mtime 早于 3 分钟);并行会话活跃期新产生的 6 个未动(非本轮产物)
|
|
363
|
+
|
|
364
|
+
### 时序敏感证据口径
|
|
365
|
+
|
|
366
|
+
- FI-M04 动态捕获 RuntimeError 为时序敏感加分证据(读码断言为确定性基线,未命中降级 NOTE 不虚判绿);报告时点复核轮命中在案
|
|
367
|
+
- FI-R09 的 blocked/读取次数(132/25 vs 复核轮 118/23)、FI-R02 的执行器 pid、FI-M04 的读者探针计数均为每轮不同的时序敏感值,轮次间波动属预期;判分断言不依赖具体计数值
|
|
368
|
+
|
|
369
|
+
---
|
|
370
|
+
|
|
371
|
+
## 七、诚实口径
|
|
372
|
+
|
|
373
|
+
1. **untestable 0 项**:18/18 全部出具 CASE_RESULT 且与登记一致(本轮亲跑在案)。
|
|
374
|
+
2. **读码为据、未实跑项(2 处,均已逐格标注)**:① FI-R03 的 verify_runner 对照半边——REPO 硬指向真仓(verify_runner.py:23-24)无法临时重定向,passed>0 门以读码 :161-166 为据;② FI-R09 的重试耗尽分支——读码 exec.py:138-146 + 留档实测在案(v17.md:69),本格未重复实跑。
|
|
375
|
+
3. **未覆盖格 5 项**:见第二节【本轮未覆盖格及原因】①-⑤(S9×swarm 水位/stable 租约、mdcg 消息丢失/乱序格、md 原文真源字节翻转格、S5 凭据外发面与 S6 真实 LLM 调用面、S7 人肉终裁面)。
|
|
376
|
+
4. **常规套件 206/206 绿基线为上游台账口径**(批次 51 提交记录与 ask 材料),本轮未复跑常规套件——T4 结论中「常规集 0 新缺陷」一侧的口径来源如实标注;注入集一侧 18/18 为本轮亲跑。
|
|
377
|
+
5. **数据来源口径**:第三节逐例观测数据来自实验员轮次的实测材料;报告撰写时全量套件亲跑复核(18/18 与登记一致、EXIT=0、FI-M04 动态捕获命中、FI-R09 注入生效),两格原「按读码+台账设计」的标注因此升级为有本场实跑证据。单轮实验的局限:单轮时序敏感(见第六节);并行实验员会话与本轮复核并发运行(临时目录残留的时间戳证据),套件行为不受影响但系统临时目录在同一时段被多方使用。
|
|
378
|
+
6. **退出码双向实证中,正向(一致=0)为全量亲测,反向(错登记=1)为单格亲测**(-k R01);EXPECTED_GAP「修复→改登记→绿灯」的结案全环未演练(属防线落地后的流程,本轮无此前提)。
|
|
379
|
+
|
|
380
|
+
---
|
|
381
|
+
|
|
382
|
+
## 八、纪律合规声明
|
|
383
|
+
|
|
384
|
+
- **查文件前先读 WORKSPACE_INDEX.md** 按职责定位:本报告撰写轮先读索引再定点查证,未做全盘浏览。
|
|
385
|
+
- **结论必须引证**:全部 verdict 以 case_id + 套件实测输出为据(18 条 CASE_RESULT);承重代码引用经本轮读码核对(tokens.py:371/:407-411、mdcg.py:2199-2208/:3240-3244、readcache.py:80-110、forgetting.py:274-283、sustain.py:484/:844/:940、twophase.py:14-16/:53-57/:99-101、verify_answer.py:93-96、tokens.py:42/:283-284、interop.py:108-143、mdcos.py:3782-3786、security.py:217-224、serve_start.py:51/:179-192、scheduler.rs:475-495、job.rs:120-126、exec.py:104/:138/:142/:146、rust_swarm.py:24/:28-38/:101、verify_runner.py:23-24/:161-166);其余行号沿用套件读码断言与 v16/v17 留档口径,未逐行重开;理论判据引证 v0.1:62(公理 7)、v0.3:153(T4)/:272(可证伪性);留档编号 N133/N134/N138/N143/N88/N91 经 v16.md:85-90 与 v17.md:69/:85/:102 逐条核对。
|
|
386
|
+
- **临时环境纪律**:全部注入/复核只在系统临时目录 chaos_fi_* 与哑 env/哑令牌/哑密钥上进行,真实令牌库、真实 serve、真实数据目录零接触;测毕清理(本轮清理陈旧残留 34 个并核实;registry.py 错登记试验已还原,git 面无痕)。
|
|
387
|
+
- **理论判据依据**:docs/theory/不可靠定理与失效优先框架_v0.3.md(T0-T14/D1-D6)与 docs/不可靠性理论_v0.1.md(九源 S1-S9/防线原语 P1-P12)。
|
|
388
|
+
- **输出用中文、不写本机绝对路径**(临时路径一律以 \<tmp\> 占位;哑令牌/哑密钥值不录入本报告)。
|
|
389
|
+
- **无法满足项如实说明**:CI 尚未接入(第六节如实标注接入点);常规套件基线未复跑(第七节第 4 条);两处读码项未实跑(第七节第 2 条)——均无绕过、无伪造。
|
|
390
|
+
|
|
391
|
+
---
|
|
392
|
+
|
|
393
|
+
## 附录:Linux 容器稳定性实测(2026-09-26 补充)
|
|
394
|
+
|
|
395
|
+
### 环境与方法
|
|
396
|
+
|
|
397
|
+
Docker Desktop 28.4.0(WSL2 后端)|镜像 `python:3.12` 与 `rust:bookworm`(自带 Python 3.11)|仓库卷挂载|对齐 Windows 基线(批次53:python 207/207、cargo hive 42+swarm 8、注入套件 18/18)。
|
|
398
|
+
|
|
399
|
+
### 结果对照
|
|
400
|
+
|
|
401
|
+
| 面 | Windows 基线 | Linux 容器结果 | 判定 |
|
|
402
|
+
|---|---|---|---|
|
|
403
|
+
| python 全量 | 207/207 | 192/206+6 跳过;14 FAIL 全部为 swarm.tests——容器无 cargo(`rust_codegen.build_rust_exe` 动态编译依赖),**环境依赖非代码缺陷**;rust 镜像 `python3` 复跑 swarm.tests **7/7 PASS** | 双平台绿(测试需 rust 工具链镜像) |
|
|
404
|
+
| 注入套件 | 18/18 | 修 3 处兼容问题后 **18/18 ALL CONSISTENT EXIT=0** | 一致 |
|
|
405
|
+
| hive cargo + smoke | 42 + 21/21 | linux_verify full 主体全绿(orch 94/exec_tools 87/serve_entry);smoke 3 fail 为 `HIVE_PYTHON` 未设(Debian 无 `python` 别名),设后 **21/21 全绿**(含 restart 后 serve 存活) | 一致(env 开关价值实证) |
|
|
406
|
+
| swarm cargo | 8/8 | 8/8 | 一致 |
|
|
407
|
+
|
|
408
|
+
### 过程发现与三处工程修正(双平台回归均绿)
|
|
409
|
+
|
|
410
|
+
1. **test_stop_tree_kill 两处置景缺陷(Linux 实测抓出)**:①哑父 spawn 未设 `start_new_session` → killpg 群杀误伤测试进程组(全量回归 SIGTERM 143 中断)——对齐生产形态(serve_start.py:267 serve 即组长)后隔离成立;②A2 判活用 `os.kill(pid,0)` 在**僵尸窗口**恒 True(最小实验实证:killpg 后 alive=True 但 wait rc=-15,SIGTERM 确已生效)→ 改 `Popen.poll()`(waitpid 收尸,权威判据)。**N92 unix 臂由此获得真机动态验证**(修复时"不可动态验证"欠账兑现),双平台 11/11。
|
|
411
|
+
2. **harness.py PEP 701 f-string 跨行嵌套**(Python 3.12+ 语法)→ 3.11 兼容改写(rust:bookworm 的 3.11 产出 SyntaxError,18 格全 untestable 的根因)。
|
|
412
|
+
3. **M02/R09 平台门**:两用例置景用 `ctypes.WinDLL`(Windows 专属 API),非 Windows 产出 SKIP 结论而非崩溃——M02(缺口本体跨平台)维持 gap 基线、R09(unix rename(2) 原子性使对撞天然不触发)维持 pass 基线,均以 note 如实声明非实测。
|
|
413
|
+
|
|
414
|
+
### 新捕观察(留档)
|
|
415
|
+
|
|
416
|
+
- **R02 矛盾态**(N92 同型,第二轮专项候选):杀 serve 后孤儿执行器补写 result.json ok=True 与 state=error 并存——poll 面同屏可见 error 终态+成功产物,双消费面结论可能相反;
|
|
417
|
+
- **M01 附带确认**:三层判活的 P5 分层在 Linux 同样成立(回拨洗白新鲜层、端到端层兜住);
|
|
418
|
+
- **flaky**:注入套件双平台多跑、python 全量单轮——本轮未观测到不稳定;长期 soak 未做。
|
|
419
|
+
|
|
420
|
+
### 平台适配结论
|
|
421
|
+
|
|
422
|
+
灵枢当前树在 Linux 容器与 Windows 行为一致(全部差异为环境依赖:cargo 可用性、`python`/`python3` 别名、WinDLL 置景);`HIVE_PYTHON` env 开关在 Linux 的价值获实证(issue #19 同族"env 覆盖代替 hardcode"路线正确)。
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# 端到端 LoCoMo QA 同口径对照评测 v1.0(中文完整对话 · 自然问句)
|
|
2
|
+
|
|
3
|
+
> **日期**:2026-09-23 · **基线**:`main@d034c6e`
|
|
4
|
+
> **设定**(与 Mem0/Letta 论文对齐):**完整对话做记忆、自然问句做查询、LLM reader + LLM judge**。
|
|
5
|
+
> 记忆面 = LoCoMo 全量 5882 turn 完整对话(mteb/LoCoMo BEIR corpus)本地 Qwen3.8-27B 译为中文
|
|
6
|
+
> (人名/专名保留),逐 turn 原文写入灵枢(无摘要加工——写入侧加工正是被测对象本身)。
|
|
7
|
+
> 查询面 = 上游英文自然问句 LLM 译为中文;gold 答案 = 上游原始标注(1976/1976 逐题精确匹配)。
|
|
8
|
+
> **一句话结论**:同口径下灵枢检索注入 QA **17.2%** / full-context **16.4%**;检索面四组对照定因——
|
|
9
|
+
> **自然问句 × 对话原文的诚实下界 hit@10=40.2%**,题面派生偏置的「关键词串」口径 92.0% 不可外推;
|
|
10
|
+
> 改写/归一/形态调整均被实证排除(≤+3pp);**剩余词汇差的解法已拍板:认知图桥接(§5)**。
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 1 · 端到端 QA(500 题全量,reader/judge = deepseek-chat,temperature=0)
|
|
15
|
+
|
|
16
|
+
| 臂 | 注入 | QA准确率 | 拒答 | single_hop | temporal | adversarial |
|
|
17
|
+
|---|---|---|---|---|---|---|
|
|
18
|
+
| retrieval | 灵枢检索 top-10(`cg.search` 阶梯路) | **17.2%** | 299/500 | 27.2% | 2.5% | 9.7%(正确拒答口径见下) |
|
|
19
|
+
| full_context | 整段对话全量(17-36k 字/scene) | 16.4% | 337/500 | 25.4% | 2.5% | 10.6% |
|
|
20
|
+
|
|
21
|
+
- **retrieval 反超 full_context(+0.8pp)**:检索把 gold 拉到输入前部,避开长上下文中部衰减——
|
|
22
|
+
机制见 §3 lost-in-the-middle 实证。
|
|
23
|
+
- 拒答 60-67% 是**合理行为**而非故障:§2 证明六成题 gold 根本不在检索候选里,
|
|
24
|
+
reader「无法确定」是证据不足的诚实输出(READER_SYS 明文要求)。
|
|
25
|
+
- 分题型逐项见 `results/locomo_qa_20260923_232140.json`(判分失败 0 行)。
|
|
26
|
+
|
|
27
|
+
## 2 · 检索面四组对照(同一 5882 turn 中文对话库)
|
|
28
|
+
|
|
29
|
+
| 口径 | hit@1 | hit@5 | hit@10 | MRR |
|
|
30
|
+
|---|---|---|---|---|
|
|
31
|
+
| **A 自然问句**(真实用户形态) | 20.6% | 34.4% | **40.2%** | 0.264 |
|
|
32
|
+
| B 仓内关键词串题面 | 74.6% | 88.6% | 92.0% | 0.807 |
|
|
33
|
+
| C 自然问句 · 归一开 | 20.6% | 33.2% | 39.0% | 0.259 |
|
|
34
|
+
| D LLM 问句→关键词改写 | 23.8% | 36.6% | 43.2% | 0.291 |
|
|
35
|
+
|
|
36
|
+
**机制定论**:
|
|
37
|
+
|
|
38
|
+
1. **B 含题面派生偏置**:zh-500 关键词题面从 gold turn 提炼、天然携带答案侧词汇
|
|
39
|
+
(问句「慈善赛跑提高什么关注?」的题面是「慈善跑 心理健康 发声…」——「心理健康」
|
|
40
|
+
是答案词)。92.0% 是偏置上界,真实查询不可得;主链路 94.6% 同属
|
|
41
|
+
「写入侧五槽加工 + 派生题面」双偏置叠加口径。
|
|
42
|
+
2. **A 40.2% 是诚实下界**:问句词面 ≠ 答案词面的鸿沟在中文同样存在(比英文缓和但非零);
|
|
43
|
+
同义扩展(fuzzy 路在场)未解。
|
|
44
|
+
3. **D 证明改写救不回**(+3.0pp):改写只能抽问句已有词汇,答案侧词汇问句里没有——
|
|
45
|
+
瓶颈是**词汇差**不是**形态差**。C 证明归一在此形态无差(对话原文库无 CCG 拆散面)。
|
|
46
|
+
|
|
47
|
+
## 3 · lost-in-the-middle 实证(QA 低分的第二因素)
|
|
48
|
+
|
|
49
|
+
同一 scene 对话文本集合(25.4k 字,逐行同内容、仅拼装顺序不同):
|
|
50
|
+
|
|
51
|
+
- 拼装使 gold turn 位于输入**前部**:同输入 3/3 稳定答对(q_131 → Ed Sheeran);
|
|
52
|
+
- 拼装使 gold turn 位于**中部**(parquet 时间序):5/5 稳定拒答。
|
|
53
|
+
|
|
54
|
+
deepseek-chat 对平铺长上下文中部的信息检索衰减是 QA 16-17% 的第二因素——
|
|
55
|
+
retrieval 臂小胜 full_context 臂正源于此。
|
|
56
|
+
|
|
57
|
+
## 4 · 同行标尺与可比性声明
|
|
58
|
+
|
|
59
|
+
Mem0 论文(arXiv:2504.19413 Table 2,agent=GPT-4o-mini):Full-context 72.90 / Mem0ᵍ 68.44 /
|
|
60
|
+
Mem0 66.88 / Zep 65.99 / LangMem 58.10 / OpenAI memory 52.90 / A-Mem 48.38;
|
|
61
|
+
Letta Filesystem 复测 74.0(letta.com 2025-08);Zep 争议复评(blog.getzep.com 2025-05)。
|
|
62
|
+
|
|
63
|
+
**本评测 17.2% 与上表不可直接比**,三因素:①模型档(deepseek-chat vs GPT-4o-mini,
|
|
64
|
+
reader 与 judge 均弱一档);②注入形态(单块平铺文本 vs 结构化 messages/卡);③拒答口径
|
|
65
|
+
(本评测 READER_SYS 要求证据不足即拒答、judge 对模糊答案从严——同行 judge 普遍宽松)。
|
|
66
|
+
**方向意义**:在「拒答诚实口径」下,无语义检索的记忆系统面对自然问句普遍承压——
|
|
67
|
+
这不是灵枢独有,而是词法记忆路线的共同边界(§2 四组对照即是证明)。
|
|
68
|
+
|
|
69
|
+
## 5 · 方向拍板:认知图桥接(不上向量)
|
|
70
|
+
|
|
71
|
+
使用者定案(2026-09-23):「这部分差距,后续我们用认知图解决——**把问题和对应概念放入
|
|
72
|
+
认知图,附上因果条件,自然就能通过条件检索**。」
|
|
73
|
+
|
|
74
|
+
设计意图(待专项实施):用户提问沉淀为**问题节点**,与其命中答案的**概念节点**(答案侧
|
|
75
|
+
词汇/实体)建立**概念边**并附因果/生效条件;后续同类问法经 `cg(op=route)` 条件路由命中
|
|
76
|
+
概念节点 → 经边取到答案侧词汇 → 词法检索闭合词汇差。与既有机制的同构关系:
|
|
77
|
+
「语义联系是候选生成器,条件授予资格」(test_sem_noise 定稿)、渐进式检索的区分性条件
|
|
78
|
+
收紧(bench_progressive)——query 侧概念桥接从「翻译/向量」换成「图上沉淀的条件边」,
|
|
79
|
+
保持零向量依赖与全程可审计。
|
|
80
|
+
|
|
81
|
+
**验收口径**:A 口径(自然问句)hit@10 从 40.2% 提升至 B 口径水平(92%±)即路线成立;
|
|
82
|
+
概念边沉淀质量(错边率)另设负例组守卫(防「错误答案长得像正确答案」的边污染)。
|
|
83
|
+
|
|
84
|
+
## 6 · 复现
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
# 前置:DEEPSEEK_API_KEY;翻译走 LM Studio 本地(--lm-studio)或 deepseek(默认)
|
|
88
|
+
python -X utf8 -m md_cg.bench_e2e_locomo_qa --translate --lm-studio # 语料/问句中文化(分片断点续传)
|
|
89
|
+
python -X utf8 -m md_cg.bench_e2e_locomo_qa # QA 500题×双臂
|
|
90
|
+
# 检索四组对照:§2 数字由 dialog_zh 池 + zh_queries/questions500 双查询面直算(本报告数据根)
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
产物:`D:\program\test\e2e_judge\results\locomo_qa_*.json`(QA 逐题)、
|
|
94
|
+
`upstream/zh_turns.json`(5882 turn 中文)、`upstream/zh_queries.json`(500 问句中文)、
|
|
95
|
+
`upstream/answers_map.json`(上游 gold,1976/1976)。评测器:`md_cg/bench_e2e_locomo_qa.py`。
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
*关联:干扰池三臂评测见[端到端干扰池评测 v1.1](端到端干扰池评测_确定性裁决vsLLM_judge_v1.1.md)
|
|
100
|
+
(同日,摘要卡+关键词串口径 43.3%/40.0%——两份报告共同构成「检索形态 × 查询形态」双轴全景)。*
|