@furongjun1999/dsh-memory 0.6.0 → 0.7.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 +618 -572
- package/codebuddy/CODEBUDDY.md +10 -10
- package/data/policy.json +27 -0
- package/docs/README.md +1 -0
- package/docs/discipline/harnesses.yaml +31 -0
- package/docs/discipline/templates/full.md.tmpl +1 -1
- package/docs/discipline/templates/rules.mdc.tmpl +1 -1
- package/docs/eval/N225_/347/264/242/345/274/225/346/227/245/345/277/227/351/235/236/345/257/271/350/261/241/350/243/205/350/275/275/351/235/242/347/261/273/345/236/213/351/227/270_v1.0.md +418 -0
- package/docs/eval/issue43_/351/273/230/350/256/244/347/255/226/347/225/245/344/270/216/351/224/256/347/261/273/345/236/213/351/227/270_v1.1.md +441 -0
- package/docs/eval/issue43_/351/273/230/350/256/244/347/255/226/347/225/245/345/212/240/350/275/275/344/270/216/345/207/255/346/215/256/346/230/216/346/226/207/351/230/237/345/210/227_v1.0.md +398 -0
- package/docs/eval//344/274/230/345/214/226/347/254/254/344/270/200/346/211/271_/346/216/245/347/272/277/344/270/216/347/255/211/344/273/267/345/217/230/346/215/242_v1.0.md +498 -0
- package/docs/eval//344/274/230/345/214/226/347/254/254/344/270/211/346/211/271_/351/227/250/347/246/201/350/275/254/346/255/243/344/270/216/350/260/203/345/272/246/346/255/242/350/241/200/344/270/216/351/227/250/346/216/247/346/224/266/345/217/243_v1.0.md +669 -0
- package/docs/eval//344/274/230/345/214/226/347/254/254/344/272/214/346/211/271_/344/276/235/350/265/226/351/200/217/344/274/240/344/270/216/345/257/271/346/213/215/345/217/243/345/276/204/344/270/216/350/264/237/347/274/223/345/255/230_v1.0.md +683 -0
- package/docs/eval//345/207/272/350/264/247/351/235/242/345/206/222/347/203/237_/350/277/233/350/264/247/351/227/250/347/246/201_v1.0.md +460 -0
- package/docs/eval//345/217/221/345/270/20307_/345/244/226/351/203/250/346/212/245/345/221/212/345/233/233/346/211/271/344/277/256/345/244/215/344/270/216/346/217/222/344/273/266/351/235/242/345/212/240/345/233/272_v1.0.md +205 -0
- package/docs/eval//345/217/221/345/270/20308_/350/207/252/350/277/255/344/273/243/344/270/216/347/235/241/347/234/240_/345/233/276/346/243/200/347/264/242/350/267/257/344/270/216/346/235/203/351/207/215_v1.0.md +97 -0
- package/docs/eval//345/275/222/344/270/200/345/261/202/347/274/272/347/234/201/347/277/273/345/205/263_/344/277/256/345/244/215/350/256/260/345/275/225_v1.0.md +458 -0
- package/docs/eval//346/200/247/350/203/275/344/270/223/351/241/271_/345/206/267/346/237/245/350/257/242/344/270/216/345/206/205/345/255/230_v1.0.md +218 -0
- package/docs/eval//346/225/205/351/232/234/346/263/250/345/205/245/345/256/236/346/265/213_v1.0.md +10 -0
- package/docs/eval//347/274/226/347/240/201/351/235/242/345/211/215/347/275/256_/345/205/245/345/217/243/350/207/252/344/277/235/350/257/201UTF8/344/270/216/346/226/207/346/234/254open/345/256/210/345/215/253_v1.0.md +646 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v20.md +283 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v21.md +224 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v22.md +223 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v23.md +293 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v24.md +303 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v25.md +230 -0
- package/docs/hive//346/243/200/347/264/242/347/256/227/346/263/225/345/217/243/345/276/204/345/257/271/347/205/247_v0.1.md +136 -11
- package/docs/hive//346/243/200/347/264/242/350/267/257/345/276/204/344/270/216/350/256/244/347/237/245/347/273/223/346/236/204/345/245/221/347/272/246_v0.1.md +52 -2
- package/docs/hive//350/234/202/345/267/242M6_ingest/345/256/236/346/226/275/350/256/241/345/210/222_v0.1.md +1 -1
- package/docs/mdcg/README/350/257/246/347/273/206/347/211/210_v0.4.10.md +100 -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/mdcg//345/217/221/345/270/203/351/227/250/347/246/201/351/223/276_v0.1.md +57 -9
- package/docs/mdcg//347/201/265/346/236/242/350/256/260/345/277/206/345/212/250/350/257/215/345/215/217/350/256/256_v1.0-draft.md +7 -2
- package/docs/mdcg//347/235/241/347/234/240/345/221/250/346/234/237_/350/277/220/347/273/264/345/211/215/346/217/220/344/270/216/347/273/264/346/212/244/346/214/207/345/215/227_v1.0.md +183 -0
- package/docs/mdcg//350/256/244/347/237/245/345/233/276_/347/264/242/345/274/225/344/270/216/345/267/245/347/250/213/350/247/204/350/214/203/345/214/226_/350/256/241/345/210/222_v0.1.md +39 -3
- package/docs/plans//345/205/250/344/270/255/346/226/207/347/274/226/347/240/201/344/270/216/350/234/202/345/267/242/344/273/273/345/212/241/346/240/207/350/257/206/345/245/221/347/272/246_v2.0.md +220 -0
- package/docs/plans//347/234/237/346/272/220/347/264/242/345/274/225_/351/200/232/347/224/250/346/234/272/345/210/266_v0.3.md +227 -0
- package/docs/plans//347/235/241/347/234/240/344/270/216/350/207/252/350/277/255/344/273/243_/345/212/237/350/203/275/344/274/230/345/214/226/350/256/276/350/256/241_v0.4.md +547 -0
- package/docs/plans//350/234/202/345/267/242/346/250/241/345/236/213/345/257/206/351/222/245/351/205/215/347/275/256/351/235/242_v1.0.md +385 -0
- package/docs//345/267/245/344/275/234/347/272/252/345/276/213_/350/256/244/347/237/245/345/233/276/346/235/241/347/233/256_v1.1.json +460 -460
- package/lib/bridge.js +24 -2
- package/lib/hooks.d.ts +31 -2
- package/lib/hooks.js +219 -16
- package/lib/init.js +16 -1
- package/lib/lib/prompt_safety.d.ts +52 -1
- package/lib/lib/prompt_safety.js +76 -1
- package/md_cg/audit.py +652 -379
- package/md_cg/bench6_arms.py +1 -1
- package/md_cg/bench_e2e_locomo_qa.py +11 -4
- package/md_cg/bench_p0.py +1 -1
- package/md_cg/branches.py +2 -2
- package/md_cg/ccgc.py +1071 -1006
- package/md_cg/chain.py +48 -1
- package/md_cg/consistency.py +97 -9
- package/md_cg/consolidate.py +34 -9
- package/md_cg/crypto.py +59 -26
- package/md_cg/docindex.py +16 -1
- package/md_cg/evolution.py +17 -1
- package/md_cg/export.py +1 -1
- package/md_cg/forgetting.py +309 -13
- package/md_cg/freshness.py +511 -0
- package/md_cg/fsutil.py +454 -8
- package/md_cg/generation.py +409 -0
- package/md_cg/hotcache.py +4 -1
- package/md_cg/identity.py +3 -3
- package/md_cg/insight.py +24 -3
- package/md_cg/linkref.py +1 -1
- package/md_cg/logref.py +327 -0
- package/md_cg/mcp_server.py +4261 -3818
- package/md_cg/mdcg.py +4695 -3547
- package/md_cg/mdcos.py +4672 -4159
- package/md_cg/mreview/pipeline.py +15 -1
- package/md_cg/nodefile.py +713 -576
- package/md_cg/protect.py +158 -11
- package/md_cg/protocol.py +41 -2
- package/md_cg/provenance.py +22 -4
- package/md_cg/reach.py +4 -4
- package/md_cg/readcache.py +76 -15
- package/md_cg/reconcile.py +1 -1
- package/md_cg/refindex.py +246 -37
- package/md_cg/refine.py +1 -1
- package/md_cg/routing.py +32 -5
- package/md_cg/run_tests.py +17 -0
- package/md_cg/scrub.py +30 -3
- package/md_cg/security.py +47 -1
- package/md_cg/self_state.py +5 -5
- package/md_cg/semantic/canonical.py +22 -0
- package/md_cg/semantic/unify.py +73 -22
- package/md_cg/semantic/unify_fixture.json +25 -0
- package/md_cg/sleep.py +1297 -0
- package/md_cg/sources.py +23 -6
- package/md_cg/srcindex.py +352 -0
- package/md_cg/stg.py +47 -3
- package/md_cg/subgraph.py +2 -2
- package/md_cg/sustain.py +1436 -1168
- package/md_cg/tasks.py +469 -470
- package/md_cg/test_auto_defaults.py +424 -0
- package/md_cg/test_b1_auto_id_multiproc.py +277 -0
- package/md_cg/test_b1b2_write_face.py +417 -0
- package/md_cg/test_b2_sensitivity_landing.py +223 -0
- package/md_cg/test_b3_merge_keeps_content.py +576 -0
- package/md_cg/test_b4_shard_dir_selfheal.py +843 -0
- package/md_cg/test_b4_shard_dir_selfheal_guard.py +238 -0
- package/md_cg/test_boundary_hit.py +410 -0
- package/md_cg/test_c3_transient_read_negative.py +793 -0
- package/md_cg/test_c8_search_rrf_gates.py +502 -0
- package/md_cg/test_ccg_form_parity.py +188 -0
- package/md_cg/test_ccgc.py +28 -3
- package/md_cg/test_en_pipeline.py +22 -13
- package/md_cg/test_generation_guard.py +352 -0
- package/md_cg/test_govern_directread.py +17 -4
- package/md_cg/test_h2_session_view_norm.py +233 -0
- package/md_cg/test_h4_sustain_snapshot.py +1387 -0
- package/md_cg/test_hive_ingest.py +285 -285
- package/md_cg/test_issue39_utf8_stdio.py +307 -16
- package/md_cg/test_issue43_default_policy.py +865 -0
- package/md_cg/test_legacy_p3_node_id_type.py +375 -0
- package/md_cg/test_linkref.py +10 -3
- package/md_cg/test_lock.py +2 -2
- package/md_cg/test_logref.py +1109 -0
- package/md_cg/test_m3_h9_bucket_health_protect_mark.py +301 -0
- package/md_cg/test_m3_h9_semantic_guard.py +525 -0
- package/md_cg/test_mr_m2.py +15 -3
- package/md_cg/test_n130_verify_falsified_protect.py +1 -1
- package/md_cg/test_n139_dek_provision_failclosed.py +185 -0
- package/md_cg/test_n176_link_trust.py +221 -0
- package/md_cg/test_n178_units_jobid_gate.py +212 -0
- package/md_cg/test_n184_keys_concurrent_provision.py +307 -0
- package/md_cg/test_n195_writepath_reload.py +283 -0
- package/md_cg/test_n196_stale_gate_skip.py +169 -0
- package/md_cg/test_n197_n208_write_face_gates.py +471 -0
- package/md_cg/test_n198_tokens_corrupt_failclosed.py +225 -0
- package/md_cg/test_n199_tokens_concurrent_write.py +378 -0
- package/md_cg/test_n201_proposal_visibility.py +382 -0
- package/md_cg/test_n202_session_notes_visibility.py +461 -0
- package/md_cg/test_n204_n205_n226_n227_n228_n229_exit_gates.py +542 -0
- package/md_cg/test_n206_stdio_jsonrpc_type.py +403 -0
- package/md_cg/test_n209_verify_write_face_gates.py +461 -0
- package/md_cg/test_n212_n213_n224_generation_gates.py +519 -0
- package/md_cg/test_n214_n215_n221_n222_write_face_gates.py +563 -0
- package/md_cg/test_n225_nonobject_load.py +1110 -0
- package/md_cg/test_n230_dirty_replay.py +375 -0
- package/md_cg/test_n62_tenant_bind_failclosed.py +200 -0
- package/md_cg/test_neg_condition_hits.py +333 -0
- package/md_cg/test_neg_tail_honesty.py +663 -0
- package/md_cg/test_none_id_write_guard.py +4 -3
- package/md_cg/test_opt_batch1_md_cg.py +451 -0
- package/md_cg/test_p1.py +5 -5
- package/md_cg/test_p11_consistency.py +161 -12
- package/md_cg/test_p26_refindex.py +2 -2
- package/md_cg/test_p27_docindex.py +777 -774
- package/md_cg/test_p28_refcheck.py +740 -13
- package/md_cg/test_p29_session_ingest_export.py +2 -2
- package/md_cg/test_p2_mcp.py +12 -1
- package/md_cg/test_p2_six_elements.py +463 -0
- package/md_cg/test_p30_maintain.py +33 -2
- package/md_cg/test_p31_insight.py +1 -0
- package/md_cg/test_p3_legacy_closure.py +433 -0
- package/md_cg/test_p4_freshness.py +680 -0
- package/md_cg/test_p8_subgraph_chain.py +14 -1
- package/md_cg/test_p9c_dedup_hints.py +276 -0
- package/md_cg/test_policy_required_ccg.py +426 -0
- package/md_cg/test_protocol.py +22 -0
- package/md_cg/test_rank_parity_score_mode.py +522 -0
- package/md_cg/test_read_face_input_gates.py +363 -0
- package/md_cg/test_read_face_semantics.py +489 -0
- package/md_cg/test_recall_face_guards.py +812 -0
- package/md_cg/test_rejected_credential_forms.py +188 -0
- package/md_cg/test_rejected_redact.py +146 -0
- package/md_cg/test_retr_s1b.py +2 -2
- package/md_cg/test_retr_s5.py +20 -7
- package/md_cg/test_review_conformance.py +21 -3
- package/md_cg/test_security_audit_v21.py +2 -2
- package/md_cg/test_semantic_canonical.py +5 -3
- package/md_cg/test_server_version.py +67 -0
- package/md_cg/test_sleep.py +611 -0
- package/md_cg/test_sleep_p1.py +784 -0
- package/md_cg/test_srcindex.py +171 -0
- package/md_cg/test_tenant_env_override_warn.py +63 -50
- package/md_cg/test_time_core_lint.py +968 -0
- package/md_cg/test_token_lowercase_form.py +315 -0
- package/md_cg/test_unify_default_off.py +701 -0
- package/md_cg/test_unify_scope.py +182 -0
- package/md_cg/test_v21r1_package_version.py +310 -0
- package/md_cg/test_writepipe.py +10 -4
- package/md_cg/tokens.py +225 -95
- package/md_cg/tool_face.py +4 -4
- package/md_cg/trust.py +49 -5
- package/md_cg/units.py +204 -6
- package/md_cg/weights.py +4 -4
- package/md_cg/whitebox_kb/aeis_core/time_core.py +8 -0
- package/md_cg/whitebox_kb/wisdom/knowledge_points.py +1 -1
- package/md_cg/writelimit.py +42 -8
- package/md_cg/writepipe.py +651 -554
- package/package.json +4 -2
- package/skills/plugin.json +1 -1
- package/src/bridge.ts +25 -2
- package/src/hooks.ts +229 -16
- package/src/init.ts +15 -1
- package/src/lib/prompt_safety.ts +88 -1
- package/utf8_boot.py +237 -0
- package/zcode/AGENTS.md +10 -10
|
@@ -0,0 +1,669 @@
|
|
|
1
|
+
# 优化第三批(R-7 门禁转正 · H-3/H-7 调度止血 · H-4 止血 · C-8 门控收口)—— 工程报告 v1.0
|
|
2
|
+
|
|
3
|
+
- 日期:2026-09-29
|
|
4
|
+
- 仓库:`D:/program/dsh-memory-main`(下称 `<repo>`);`HEAD = f8c93e6e`(`git log --oneline -1` 实跑所见)
|
|
5
|
+
- 批次标识:**opt-batch3**(四项:R-7 / H-3·H-7 / H-4 / C-8)
|
|
6
|
+
- 本报告只落盘本文件一行;**未改任何源码**;未 `git add` / `commit` / `push`
|
|
7
|
+
- **本版相对同路径前一稿(v1.0-r1)的实质订正**(前一稿写在最后一轮实施与复核之前,以下四处已陈化,本版按当前工作区与当前复核结论重写):
|
|
8
|
+
1. R-7 守卫:**47 断言 / 11 处变异 / 674 行** → **49 断言 / 12 处变异 / 712 行**。变异表的两处具体变化(避免「3→4」被读成整表增量):**(i)** 原有第 9 条「`main.rs` 注释改回失实原文」的**预期红项数由 3 升为 4**——因为新增的 `G5f`(失实片段全文件清零)也会被它打红,故该条现在命中 `G5d/G5e/G5c2/G5f` 四条;**(ii)** **新增**第 11 条变异「`main.rs` 头注释改回失实原文(`:13-14` 那处)」,预期 **2** 条(`G5f/G5g`)。全表合计 11 → 12 处,逐条红项数见 §4.2;
|
|
9
|
+
2. `rust/src/main.rs:13-14` 的失实注释:前一稿列为「残留」,**现已订正**(见 §1.1 站点表、§3.1、§6.1.5);
|
|
10
|
+
3. H-4 判定:前一稿的 **BLINDSPOT**(止血面只切在 `sustain.py`)→ 现为 **ACCEPT**(止血面已扩到**全 md_cg 域**,含 `weights.py` / `refindex.py` / `provenance.py` 的跨模块站点);
|
|
11
|
+
4. C-8 守卫:前一稿「无 `--mutate` 旗标、变异无法复跑」→ **本轮已落地 8 处定点变异**(本报告实跑,见 §4.2)。
|
|
12
|
+
- **修订 r2**(按编排方转来的读者反馈逐条处置,明细见 **§7**):新增 **§0 术语/标识符/编号约定**(拆开「腿」的四义、给全部标识首现出处、分立三套编号体系)、**§2.3「A-scan 口径更正」块**(41/80/112 三数字用同一扫描器对两棵树实测对账)、**§4.4 栈一 38 的行级组成表**、**§7 逐条处置**;并改正四处**文本自身不成立的断言**(`MdCGSecure.search_rrf` 行号位移、R4「与本批无关」、「3→4」歧义、`kill` 时限承诺的起点与两态判断)与两处**行号引用错**(回执 `hint` 实为 `main.rs` HEAD `:517`/工作区 `:539`,非 `:511-520`;`doctor` 隔离清单实为 `:770-772`)。
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 证据分级声明(全文适用)
|
|
17
|
+
|
|
18
|
+
| 标记 | 含义 |
|
|
19
|
+
|---|---|
|
|
20
|
+
| **【本报告实跑】** | 本报告撰写期间在 `<repo>` 上亲自执行的命令与其真实输出(含退出码)。 |
|
|
21
|
+
| **【本报告实跑·复核 HEAD】** | 本报告亲自执行 `git show HEAD:<path>` 逐行读到的**修前**文本。 |
|
|
22
|
+
| **【工作流采集】** | 由本次优化工作流的复现员/实施员/独立复核员采集,经编排方以任务上下文交给本报告**直接引用**;本报告**未**重新执行。 |
|
|
23
|
+
|
|
24
|
+
**未重跑的两项及原因(不代填)**:**交付要求 ④**(六项交付要求里的第 4 项,清单见 §0.3)所指的「容器两栈退出码」本机虽已确认 Docker 在位(`Docker version 28.4.0`;镜像 `rust:bookworm` / `python:3.12` / `node:22-bookworm` 均已在本地,本报告实跑 `docker images` 所见),但本报告**未重跑**——理由:(a) 该两栈与四项判据无关(它们验的是 hive crate 与 TS 侧的整体回归);(b) `linux_verify.sh full` 会向工作区 `hive/target/release/` 拷入容器编译产物,与本报告「只写这一个文件」的硬边界相抵。故两栈数字**全部为【工作流采集】**,本报告只补上「两栈分别是什么、跑什么命令、数字怎么读」。
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## 0. 术语、标识符与编号约定(读前必读)
|
|
29
|
+
|
|
30
|
+
### 0.1 「腿」在同一份文件里有四种所指——本报告就此固定
|
|
31
|
+
|
|
32
|
+
| 写法 | 指什么 | 本报告的位置 |
|
|
33
|
+
|---|---|---|
|
|
34
|
+
| **门禁腿 / 六条腿 → 八条腿** | `npm run gate` 命令链里的**一个命令项**:「六条腿」=修前的 6 个命令项,「八条腿」=修后追加两条 | §1.1、§3.1、§4.5 |
|
|
35
|
+
| **复现腿 A–F**(含 A2/D2/E2) | **R-7** 的修前复现记录编号(复现员在隔离环境里逐条跑出的现场) | §2.1 |
|
|
36
|
+
| **复现腿 1 / 2 / 3** | **H-3·H-7** 的修前复现记录编号(另一份契约下的现场,与上一条无任何编号关系) | §2.2 |
|
|
37
|
+
| **容器栈一 / 栈二** | 两个 `docker run` 执行环境(`rust:bookworm` 跑 `linux_verify.sh full` / `node:22-bookworm` 跑 TS 套件) | §4.4 |
|
|
38
|
+
|
|
39
|
+
⇒ 三套「腿」**互不相干**:门禁腿是**命令链里的项**,复现腿 A–F 与复现腿 1/2/3 是**两条独立缺陷的现场记录**,容器栈是**两个执行环境**。本报告此后一律写「门禁腿①/②」「复现腿 B」「复现腿 H-3 腿1」「栈一」这类**带限定词**的形式。
|
|
40
|
+
|
|
41
|
+
### 0.2 标识符图例(每个标识首现即在此登记;出处在仓外的如实注明)
|
|
42
|
+
|
|
43
|
+
| 标识 | 是什么 | 出处(本报告实读/实跑) |
|
|
44
|
+
|---|---|---|
|
|
45
|
+
| **R-1 / R-3 / R-4 / R-7** | 「优化改进**清单**」的条目号(R 序列);本批只处理 R-7,R-1/R-3/R-4 是更早批次已修的邻居项,本报告只在「R-7 要防的回归」语境下提及 | 清单原件**不在本仓**(由工作流管线以运行期入参转述);代码侧可核对:R-1=`rust/src/main.rs:59-63`、R-3=`:108-109` |
|
|
46
|
+
| **CH-1** | 「对拍两侧词法打分口径显式钉住」这一项的编号——**该编号是上一批内部新起的,不在上述清单里** | `docs/eval/优化第二批_依赖透传与对拍口径与负缓存_v1.0.md:6`(批次标识含 CH-1)与 `:74`(明写「CH-1 这一编号本身是本批新起的,不在清单里」);硬证据=其守卫 `md_cg/test_rank_parity_score_mode.py:113-114` 的两个锚点常量(`_PY_DEFAULT_ANCHOR` / `_RUST_CFG_DEFAULT_ANCHOR`) |
|
|
47
|
+
| **H-3 / H-4 / H-7 / C-8**(及上一批的 H-6 / C-3) | 同一份「优化改进清单」的 H/C 序列条目号 | 同清单:原件不在本仓 |
|
|
48
|
+
| **N138** | 缺陷挖掘·自主迭代系列的**缺陷号**:默认部署下 sustain 后台线程与请求线程共享同一 `MdCG` 实例且全引擎无线程锁 ⇒ 裸迭代 `RuntimeError` 崩溃面 + tidy 丢更新 | `docs/eval/缺陷挖掘_自主迭代_v16.md:90`(本报告实读该行;`:165` 是留档汇总行) |
|
|
49
|
+
| **issue #25** | 本仓**前代同病灶**:`MdCGOS.search` 覆写悬空、门控在生产路径从未生效(C-8 是它的第二次复发) | `md_cg/mdcg.py:746-749`、`md_cg/mdcos.py:818-820`、既有守卫 `md_cg/test_retr_gates_prodpath.py` |
|
|
50
|
+
| **FI-M04** | 故障注入用例登记号(`test/chaos_injection/` 的 `FI-Mxx` 体系) | `test/chaos_injection/registry.py:87`、用例体 `test/chaos_injection/test_fi_m04_sustain_concurrent_collision.py` |
|
|
51
|
+
| **S1 / S1b / S2 / S3 / S4 / S5** | 检索门控的**阶段号**:S1 域收敛、S1b 桶收敛、S2 条件硬槽、S3 图扩散激活、S4 层级加成、S5 负记忆抑制 | 契约 `docs/hive/检索路径与认知结构契约_v0.1.md` §3 开关表 `:66-77`(S3 行=`MDCG_GATE_S3_SPREAD`,另见 `:25`、`:49`「S3 图扩散激活」) |
|
|
52
|
+
| **S7** | 门控阶段号里**没有独立开关行**的一项:契约只在两处提到「S7 postings」(倒排),实现侧开关名为 `MDCG_S7_POSTINGS` / `MDCG_S7_FRESHNESS` | 契约 `:91`(本批新增的 §4.1)与 `:113`;`md_cg/hotcache.py:63-65` 的 `_ENV_SWITCHES` 里含 `MDCG_S7_FRESHNESS` |
|
|
53
|
+
| **k50(本报告措辞)** | 指检索的 **`k`(返回条数上界)取满 50**,用于观察**完整候选集**(候选总数 < 50 时 k=50 等价于「不截断」) | 本报告自定的实验写法;站点见 §2.4 S2 行 |
|
|
54
|
+
| **opt-batch2 / opt-batch3** | 本报告给第二批/本批起的**内部批次标识**,非仓库既有术语 | 第二批=`docs/eval/优化第二批_…_v1.0.md`;本批=本文件 |
|
|
55
|
+
| **G1–G6 / A–E / G0–G5 / P1–P6**、**C8-M1–M8**、**H-4a-1–12** | 四份守卫内部的**断言组号**与**变异编号**(各守卫自定义,跨守卫不可对照) | 四份守卫源码:`scripts/test_gate_rust_legs.py`、`hive/test_h3_h7_scheduler.py`、`md_cg/test_h4_sustain_snapshot.py`、`md_cg/test_c8_search_rrf_gates.py` |
|
|
56
|
+
|
|
57
|
+
### 0.3 三套编号体系分立(同一符号在不同体系里指不同事)
|
|
58
|
+
|
|
59
|
+
| 体系 | 符号形态 | 指什么 | 本报告怎么引用 |
|
|
60
|
+
|---|---|---|---|
|
|
61
|
+
| **交付要求** | ①–⑥ | 本报告必须覆盖的六项内容(① 四项定义与真实站点 ② 修前现场 ③ 修法契约与落点 ④ 验证数字 ⑤ 独立复核判定与 uncovered ⑥ 边界与未覆盖) | 一律写「**交付要求 ④**」,带「要求」二字 |
|
|
62
|
+
| **契约条款** | R-7 契约 ①②③;H-4 契约 (a)/(c)/(d)/(e)/(f)/(g) | 各缺陷**修复契约内部**的条款编号。其中 H-4 契约 (c) =「全域裸迭代扫描」、(f) = spawn 退避、(g) = `_post_chat` 重试 | 一律带契约名与括号字母(如「H-4 契约 (f)」);**不写裸字母** |
|
|
63
|
+
| **本报告自编工作项标签** | H-4①(迭代点取快照)/H-4②(`spawn_executor` 有界退避)/H-4③(`_post_chat` 有界重试) | 本报告对**同批三项修法**的称呼(与实施轮自述的 (a)(b)(c) 亦不同源) | 文中一律用 H-4①/②/③ |
|
|
64
|
+
|
|
65
|
+
**为什么要开列这三套**:本报告初版把同批附带两项写成「契约 (c)/(f)」,而 H-4 契约的 (c) 指的是**全域扫描**、附带两项的契约字母其实是 **(f) 与 (g)**;实施轮自述又用 (a)(b)(c) 指「迭代点清单 / 守卫重写 / 退避参数」。**三套编号共用字母与圈号**,故本版正文**一律去掉裸字母引用**:H-4 的三项只写 H-4①/②/③,契约条款一律带「契约」二字。
|
|
66
|
+
|
|
67
|
+
### 0.4 计数与来源口径
|
|
68
|
+
|
|
69
|
+
- **守卫断言数**=该守卫自己打出的「通过」计数(如 `49 通过,0 失败,0 跳过`)。
|
|
70
|
+
- **变异红项数**=该变异下守卫 `FAIL` 断言的**条数**,不是组数(多组命中时给出逐组分解)。
|
|
71
|
+
- **「共享迭代点 / 裸迭代点」**(H-4)=守卫 AST 扫描器的两个计数:前者=「迭代源是 `cg.index['nodes']`(含别名与跨函数参数透传)的迭代点」总数;后者=其中**未先取快照**的条数。**不同扫描器口径不同、数字不可直接相减**——本版在 §2.3 增设「A-scan 口径更正」块,给三组数字(41/84/112)的对账。
|
|
72
|
+
- **本报告实跑的退出码**一律 `$?` 直读(不经管道尾命令)。
|
|
73
|
+
- 来源标记见上「证据分级声明」;凡【工作流采集】的数字本报告**不代填、不换算**。
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## 1. 四项各自的定义与真实站点
|
|
78
|
+
|
|
79
|
+
**行号两套口径**:**修前**=`git show HEAD:<path>` 的文本(本报告逐条复核);**修后**=当前工作区磁盘文本(本报告读码所见)。凡正文未标注来源的代码行号,一律是**本报告亲自读到**的。
|
|
80
|
+
|
|
81
|
+
### 1.1 R-7 · rust 内核的 crate 测试与逐位对拍 harness 全在门禁之外
|
|
82
|
+
|
|
83
|
+
> 本节及 §3.1、§4.5 出现的「腿」**一律指门禁命令链里的命令项**(「六条腿」=修前 6 个命令项、「两条腿」=本批追加的 `gate_rust_crate_test.py` 与 `gate_rust_parity.py`);与 §2.1 的「复现腿 A–F」**不是一回事**(术语表见 §0.1)。
|
|
84
|
+
|
|
85
|
+
**定义**:`rust/` 这个 crate 的测试(`cargo test`)与「Python `search_rrf` ↔ Rust `mdcg-eval --serve` 的逐位对拍」(`scripts/rank_parity.py`)**都不在 `npm run gate` 的命令链里**。后果:R-1(query 统一归一层)/ R-3(graph 种子取法)/ R-4 那类「Rust 侧口径漂移」修好之后**没有回归保障**——改回缺省、改坏排序,门禁照样绿。
|
|
86
|
+
|
|
87
|
+
| 站点 | 修前(HEAD,【本报告实跑·复核 HEAD】) | 修后(工作区,【本报告实跑】) |
|
|
88
|
+
|---|---|---|
|
|
89
|
+
| `package.json` `scripts.gate` | `:88`,链尾为 `… verify_discipline.py --allow-missing`(**6 条腿,无 cargo / 无 rank_parity**) | `:88`,链尾追加 `&& python scripts/gate_rust_crate_test.py && python scripts/gate_rust_parity.py`(**8 条腿,纯 `&&` 短路**) |
|
|
90
|
+
| `rust/src/main.rs` 失实断言(**两处**) | `:99` = `jaccard: true, // 缺省 jaccard(长度自惩罚),与 Python SCORE_MODE 缺省一致`;`:13-14` = 头 doc 同句(`缺省 jaccard,与 Python` / `mdcg.SCORE_MODE 缺省一致`) | 取值行在 `:106`(仍 `jaccard: true`,**注释被改写**,上方 `:100-105` 新增说明块);头 doc 在 `:13-15`(改写为「**Rust 侧**缺省 `jaccard`;注意它与 Python 侧产品缺省 `legacy`**不一致**」) |
|
|
91
|
+
| 新增:腿①执行体 | **n/a** | `scripts/gate_rust_crate_test.py`(112 行) |
|
|
92
|
+
| 新增:腿②执行体 | **n/a** | `scripts/gate_rust_parity.py`(182 行) |
|
|
93
|
+
| 新增:守卫 | **n/a** | `scripts/test_gate_rust_legs.py`(712 行) |
|
|
94
|
+
|
|
95
|
+
**事实面(本报告实跑)**:`git show HEAD:package.json` 的 `scripts.gate` = `python scripts/check_unreachable.py && python scripts/check_publish_artifact.py && python scripts/cogmap_sync.py check && python scripts/link_check.py && python scripts/workspace_index.py --check && python scripts/verify_discipline.py --allow-missing`——**仅 6 条腿**,`grep cargo|rank_parity|rust` 零命中。
|
|
96
|
+
|
|
97
|
+
### 1.2 H-3 · 坏 `status.json` 让任务永久静默卡 pending / H-7 · worker 池无界预领取 + claimed 态无 pid/心跳
|
|
98
|
+
|
|
99
|
+
**H-3 定义**:`status.json` 不可解析时,serve 主循环与 `recover_orphans` **都只 `continue`**——既不领取也不终态化,无告警、无标记、无处置路径;`hive poll` 只回一个没有 `state` 的裸 `error`;`hive doctor` 把「解析失败」与「文件缺失」一并压进 `unknown`。任务因此**永久静默卡 pending**。
|
|
100
|
+
|
|
101
|
+
**H-7 定义**:主循环**一拍**把池内全部 pending 任务 claim 进**无界 mpsc 队列**;被点名的上界「同时至多 workers 个在领(`ceil(N/workers)×timeout_s`)」**不成立**;且 `claimed`(已领取未开跑)态**无 pid、无心跳**,`hive kill` 对它不生效(而 CLI 回执承诺「≤1s 强杀」)。
|
|
102
|
+
|
|
103
|
+
| 站点 | 修前(HEAD,【本报告实跑·复核 HEAD】) | 修后(工作区,【本报告实跑】) |
|
|
104
|
+
|---|---|---|
|
|
105
|
+
| 无界通道 | `hive/src/scheduler.rs:185` `let (tx, rx) = mpsc::channel::<String>();` | `:280` 同行;领取点前加**有界在飞名额** |
|
|
106
|
+
| 主循环坏 status 处理 | `:213-218`,`let st = match job::read_status(&dir) { Ok(s)=>s, Err(_)=>continue, // 正在写入的半成品 → 下拍再看 };`(**`:217` 即静默点**) | `:328-381` 三态 `match`:`Ok` 清零撤标记 / `Absent` continue / `Corrupt` 跨拍计数 + 首拍 stderr 点名告警 + 达阈值落标记 + `continue` |
|
|
107
|
+
| `recover_orphans` 坏 status | `:299` 定义,`:302` `let Ok(st) = job::read_status(&dir) else { continue };`(**第二个静默点**) | `:504` 定义,`:506` `scan_corrupt` 启动即全体点名告警;`:520` 阈值/告警文案 |
|
|
108
|
+
| 三态判据 | **n/a**(只有 `read_status` 二值) | `hive/src/job.rs:209-213` `enum StatusRead { Ok/Absent/Corrupt(String) }`;`:217-226` `read_status_classified` |
|
|
109
|
+
| 标记文件 | **n/a** | `hive/src/job.rs:233` `CORRUPT_MARK = "status.corrupt.json"`;`:262-289` `write_corrupt_mark`(只写旁证文件);`:253` `clear_corrupt_mark` |
|
|
110
|
+
| 隔离 | **n/a** | `hive/src/job.rs:238` `QUARANTINE_DIR = "_quarantine"`;`:294` `quarantined_jobs`;`hive/src/main.rs:878` `cmd_quarantine`、`:955` `cmd_unquarantine` |
|
|
111
|
+
| doctor 归类 | `hive/src/main.rs:697-701` `st.ok().and_then(…).unwrap_or_else(|| "unknown".into())`(解析失败折进 unknown) | `:658` `cmd_doctor` 三态分类:`corrupt` 独立类别 + `corrupt_jobs` 明细 + `quarantine_dir/quarantined` |
|
|
112
|
+
| poll 单查 | `hive/src/main.rs:427-435` 读失败 → 只回 `{job_id, error}`(**无 state**) | `:432-456` `one_job_view`:`Corrupt → state="corrupt"`(带 `marker` 在场位)、`Absent → state="no_status"` |
|
|
113
|
+
| **三态命名(doctor / poll / MCP 是否统一)** | 旧版只有两个名字:能解析 → `st["state"]`,其余一律折成 `"unknown"`(`hive/src/main.rs:697-701`) | **修后三个名字全仓统一**(本报告实读三处源码):① `corrupt` = 文件在但不可解析(doctor:`hive/src/main.rs:753` 计数、并入 `corrupt_jobs`(`:729` 定义);poll:`:439`;MCP:`hive/hive_mcp/mcp_server.py:468`)② `no_status` = 文件尚未出现(提交竞态窗口;doctor:`main.rs:742`;poll:`:450`;MCP:`mcp_server.py:658` docstring)③ `unknown` **保留但含义收窄**——只剩「JSON 合法却无 `state` 键」一种(`main.rs:736-741`、`mcp_server.py:674` 的 `(st or {}).get("state") or "unknown"`)。MCP 侧**内部函数名**是 `ok/corrupt/absent`(`mcp_server.py:465/468`),但**对外计数同样打 `no_status`/`corrupt`**,与 rust 侧逐字一致 |
|
|
114
|
+
| H-7 名额闸 | **n/a** | `hive/src/scheduler.rs:211-253` `struct InFlight`(`try_acquire`/`release` 原子 CAS);`:413-418` 主循环**先占名额再 claim**,满员本拍不再领取但扫描继续 |
|
|
115
|
+
| 常量 | **n/a** | `:197` `CORRUPT_MARK_TICKS = 10`(poll_ms=400 ⇒ ≈4s) |
|
|
116
|
+
|
|
117
|
+
**`kill` 语义(H-7 缺陷的另一半,本报告实读两处文案)**:
|
|
118
|
+
|
|
119
|
+
- **CLI 回执** `hint`=`"worker 检测到 kill 标志后强杀(≤1s)"`:修前 `hive/src/main.rs:517` → 修后 `:539`(【本报告实跑·复核 HEAD】+ 工作区读码;复现清单引的 `:511-520` 是同一块的近似区间)。
|
|
120
|
+
- **MCP 文档面**(更强的一句、**没有起点限定**):`hive/README.md:159`「`hive_kill` | 写 kill 标志,worker ≤1s 内强杀」。
|
|
121
|
+
- **时钟起点因此有两套读法**:按 CLI 回执的字面,起点=**worker 检测到标志**(故含 ≤1s 的轮询粒度);按 README 的字面,起点=**写标志**(端到端)。**本报告的判断**:① 对 `running` 态,实测 **1.41s**(§2.2 复现腿3)是**从 kill 回执起算**的端到端值,其中含一次 ≤1s 的检测轮询 ⇒ 与 CLI 文案**不矛盾**,但与 README 那句无起点的「≤1s 内」**字面相抵**;② 对 `claimed` 未开跑态,**不受起点口径影响**——该任务没有任何 worker 持有它、也就没有任何 worker 会去调用 `job::kill_requested`(`hive/src/scheduler.rs` HEAD `:494` → 工作区 `:818`,位于 `run_job` 的轮询循环内),故「≤1s」在**结构上不可达**(不是超时,而是永不开始计时)。⇒ 失实面是 ②,以及 ① 里 README 的措辞;`pid` 写入点在 HEAD `:475` → 工作区 `:799`(仅在 `retry_spawn` 成功之后)。
|
|
122
|
+
|
|
123
|
+
### 1.3 H-4 · N138:共享 `index['nodes']` 字典上的**裸迭代** × 并发写
|
|
124
|
+
|
|
125
|
+
> **N138 是什么**:缺陷挖掘·自主迭代系列的缺陷号,本条即它的条目(出处 `docs/eval/缺陷挖掘_自主迭代_v16.md:90`,本报告实读)——「默认部署下 sustain 后台线程与请求线程共享同一 `MdCG` 实例且全引擎无线程锁」;症状两面:裸迭代 `RuntimeError` 崩溃面 + tidy「get 快照→写回」丢更新。本批修的是**前者**(第二面见 §6.4 第 1/2 条)。
|
|
126
|
+
|
|
127
|
+
**定义**:默认部署下(`MDCG_SUSTAIN` 未设 = 开)后台巡检线程与请求线程**共享同一个 `MdCG` 实例与同一个 `index["nodes"]` 字典**,而引擎全域无线程锁。前台 `add`/`flush` 在后台迭代进行中改该字典 ⇒ `RuntimeError: dictionary changed size during iteration`,异常被 `SustainLoop._run` 的 `except Exception: pass` 吞掉 ⇒ **巡检静默丢一轮**(不是进程崩溃)。同批还附带两项(本报告称 **H-4② / H-4③**;它们在 H-4 契约里的条款字母分别是 **(f) / (g)**——**不是 (c)**,(c) 指「全域裸迭代扫描」,编号体系见 §0.3):`hive/exec.py::_post_chat` **单发不重试**(429/5xx 一次即抛)=H-4③、`spawn_executor` **失败一次即 error、无退避、次数与解释器不可观测**=H-4②。
|
|
128
|
+
|
|
129
|
+
| 站点(迭代点) | 修前(HEAD,【本报告实跑·复核 HEAD】) | 修后(工作区,【本报告实跑】) |
|
|
130
|
+
|---|---|---|
|
|
131
|
+
| `md_cg/sustain.py::_locked_nodes` | `:397` `return sum(1 for e in nodes.values()` | **`:401`** `… in list(nodes.values())` |
|
|
132
|
+
| `md_cg/sustain.py::_ccg_backlog` | `:422` `for nid, e in nodes.items():` | **`:427`** `for nid, e in list(nodes.items()):` |
|
|
133
|
+
| `md_cg/sustain.py::evolution_candidates` | `:449` `nodes = {k: v for k, v in nodes.items() if …}` | **`:456`** `… for k, v in list(nodes.items()) if …` |
|
|
134
|
+
| `md_cg/sustain.py::diagnose` | `:485` `orphans = [nid for nid, e in nodes.items()` | **`:498`** `[nid for nid, e in list(nodes.items())` |
|
|
135
|
+
| `md_cg/weights.py::coverage_index` | `:408` `indeg = {nid: 0 for nid in nodes}`、`:409` `for nid, e in nodes.items():` | `:408` / `:409` 均加 `list(...)` |
|
|
136
|
+
| `md_cg/weights.py::redundancy_map` | `:425` `for nid, e in nodes.items():` | `:425` 加 `list(...)` |
|
|
137
|
+
| `md_cg/weights.py::recalc` | `:483` `ids = [nid for nid, e in nodes.items()` | `:483` 加 `list(...)` |
|
|
138
|
+
| `md_cg/refindex.py::check_refs` | `:672` `todo = [nid for nid in nodes if …]` | `:672` 加 `list(...)` |
|
|
139
|
+
| `md_cg/refindex.py::prune_orphans` / `prune_dangling` / `rebuild` | `:815` / `:878` / `:966`(另 `:867` 修前**已是** `list(...)`) | 同号加 `list(...)` |
|
|
140
|
+
| `md_cg/provenance.py::index_edges`(**契约未列、但在默认 `diagnose` 路径上**) | `:246` `for nid, e in nodes.items():` | `:246` 加 `list(...)` |
|
|
141
|
+
| `hive/exec.py::_post_chat` | `:1405-1424`,**单发** `urlopen`(无重试循环) | `:1553` 起,有界重试循环(`RETRY_MAX_ATTEMPTS=3` 等常量在 `:1436-1447`) |
|
|
142
|
+
| `hive/src/scheduler.rs` spawn 失败 | `:456-472` 单次 `spawn`,失败即 `error`(无退避、无 `spawn_attempts`、无被试解释器) | `:654-658` 常量、`:662` `spawn_backoff`、`:675` `retry_spawn`、`:707-728` `mark_spawn_failed`(error 文案含解释器 + `spawn_attempts` / `spawn_interpreter` 字段) |
|
|
143
|
+
|
|
144
|
+
**规模(本报告本轮用守卫同一扫描器在两棵树上各跑一次;逐条对账见 §2.3 的「A-scan 口径更正」块)**:手段一律是 `list(X)` 包住迭代源(只换取用方式、不重绑定、不写回)。**HEAD(修前):400 文件 / 112 处共享迭代点 / 84 处未取快照(生产 59 + 测试 25);工作区(修后):402 文件 / 112 处 / 0 处未取快照**(【本报告实跑】)。实施轮自述的「80 处(55+25)」与守卫扫描器的 84 在**测试面完全一致**、**生产面差 4 处**(口径差,未逐点点名,如实记为未闭合)。
|
|
145
|
+
|
|
146
|
+
### 1.4 C-8 · `search_rrf` 整段不带 S1/S1b/S2 门控(候选面分裂)
|
|
147
|
+
|
|
148
|
+
> **本节出现、且此前未在正文定义过的阶段号**:**S3** = 图扩散激活(契约 §3 开关表 `MDCG_GATE_S3_SPREAD`,`docs/hive/检索路径与认知结构契约_v0.1.md:73`,另见 `:25`/`:49`);**S7** = postings(倒排),契约§3 开关表里**没有它的独立行**,只在 `:91`/`:113` 被提及,实现侧开关名为 `MDCG_S7_POSTINGS` / `MDCG_S7_FRESHNESS`(`md_cg/hotcache.py:63-65`)。二者在本批的定位=「**有意保留的差异**」(它们是 `search` 的**候选生成段**,非收敛)——见 §3.4。完整图例见 §0.2。
|
|
149
|
+
|
|
150
|
+
**定义**:检索门控(S1 域收敛 / S1b 桶收敛 / S2 条件硬槽 / S4 层级审计)由 `md_cg/mdcg.py::apply_retrieval_gates` **唯一实现**。生产读路径有两条,由 `md_cg/mcp_server.py` 的同一个 `cg(op=read)` 按参数**静默切换**:`:2202` 无 `budget_tokens` → `MdCGOS.search`(**吃过门控**);`:2194` 有 `budget_tokens` → `recall` → `MdCGOS.search_rrf`(→ `MdCGSecure.search_rrf`,**修前整段不含门控**)。于是同一开关、同一库、同一 query,两条读路径的**候选面分裂**——一条收敛、一条全表,而 `meta` 里连 `gates` 键都不出现。
|
|
151
|
+
|
|
152
|
+
| 站点 | 修前(HEAD,【本报告实跑·复核 HEAD】) | 修后(工作区,【本报告实跑】) |
|
|
153
|
+
|---|---|---|
|
|
154
|
+
| 共享单点 | `md_cg/mdcg.py:743` `def apply_retrieval_gates(entries, terms, big_domain, context, min_results)` | 同号(实现未动;`:744` docstring 由「两份 search 的唯一实现」订正为「全部读路径的唯一实现」并记录 C-8) |
|
|
155
|
+
| `MdCGOS.search`(已接) | `md_cg/mdcos.py:823` 调用 | 同处 |
|
|
156
|
+
| `MdCGOS.search_rrf`(**病灶**) | `HEAD` 全文 `apply_retrieval_gates` 只有 **`:33`(import)与 `:823`(search 调用)两处**——`:1267` 的 `search_rrf` **零调用** | `:1392-1395`:`terms = expand_query_terms(q)` / `big_domain = routing.big_domain_classify(terms)` / `entries, gates = apply_retrieval_gates(entries, terms, big_domain, context, 1)`;`:1401` `_gates_meta = {"gates": gates} if gates else {}`;`:1528/:1539` 两处 meta 落键 |
|
|
157
|
+
| `MdCGSecure.search_rrf` | `md_cg/mdcos.py:4164`(纯可见性/时效/视图二次过滤) | `:4191` 定义(**行号 +27,确实位移了**:其上方 `MdCGOS.search_rrf` 体新增接线行与 docstring 使后续整体下移),`:4201-4207` docstring 声明门控不属本层、`gates` 原样透传;`:4209` `super().search_rrf(*a, **kw)` |
|
|
158
|
+
| 契约文档 | `docs/hive/检索路径与认知结构契约_v0.1.md` **无** §4.1 | `:79-97` 新增 §4.1「读入口 × 门控状态」表(本报告实跑 `git diff --stat`:该文件 **+20 行**,全是这一节) |
|
|
159
|
+
| 新增守卫 | **n/a** | `md_cg/test_c8_search_rrf_gates.py`(502 行,含 `--mutate`) |
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## 2. 修前现场(逐条:payload / 观察 / 站点)
|
|
164
|
+
|
|
165
|
+
> 下表的 payload/观察栏为【工作流采集】(复现员在**隔离临时目录**内的实测),站点栏凡标 **✓本报告复核** 者,本报告亲自用 `git show HEAD:` 读过原文。`reproduced=true` 是采集侧标注。
|
|
166
|
+
|
|
167
|
+
### 2.1 R-7 的修前复现(复现腿 A–F,9 条)
|
|
168
|
+
|
|
169
|
+
> 「复现腿 X」=**R-7 的修前复现记录**,与门禁命令链的「腿①②」(§1.1/§3.1)无编号关系(§0.1)。
|
|
170
|
+
|
|
171
|
+
| # | payload | 观察(摘要) | 站点 |
|
|
172
|
+
|---|---|---|---|
|
|
173
|
+
| 腿A | 读 `package.json:88` 并实跑 `npm run gate` | `npm pkg get scripts.gate` 回 6 条腿,`npm run gate` rc=0,输出全文不含 `cargo`、不含 `rank_parity`;补充 grep 零命中 | `package.json:88` ✓本报告复核 |
|
|
174
|
+
| 腿A2 | `cargo test`(真仓库 `rust/`,CARGO_TARGET_DIR 指向系统临时目录) | rc=0;`27 passed / 0 failed`(23 lib + 2 bin + 1 + 1);`rust/target/release/mdcg-eval.exe` mtime 未变 | `rust/Cargo.toml:22-28`、`rust/tests/i29_probe.rs:37` |
|
|
175
|
+
| 腿B | `python scripts/rank_parity.py`(缺省态) | rc=0;`逐位一致 10/10 · 集合一致 10/10 · top-1 一致 10/10`;`score=jaccard=rust jaccard(两侧显式钉住)` | `scripts/rank_parity.py:358-384`、`:64-73` |
|
|
176
|
+
| 腿C | 读 `rust/src/main.rs:99` 与 CH-1 守卫锚点,对四种源码形态直接调守卫 `g3()` | 注释与事实相反(Python 侧缺省 `legacy`,见 `md_cg/mdcg.py:500` ✓本报告复核);V0/V1 PASS、V2(改 `false`)FAIL、V3(改前缀)FAIL ⇒ 订正句尾不削弱判别力 | `rust/src/main.rs:99` ✓本报告复核、`md_cg/test_rank_parity_score_mode.py:114/:346`、`md_cg/mdcg.py:499-500` |
|
|
177
|
+
| 腿C2 | 全仓 grep 该断言文本 | 同一句假话在 `rust/src/main.rs:13-14` **还有一份**,契约只点名 `:99` ⇒ 只改 `:99` 会留下 `:13-14` 继续失实 | `rust/src/main.rs:13-14` ✓本报告复核 |
|
|
178
|
+
| 腿D | `git archive HEAD rust md_cg/semantic` → 临时副本内注入 `assert!(false)` | 副本基线 rc=0(27 项);注入后 `cargo test` **rc=101**;**红俱在时 `npm run gate` rc=0**、链仍为原 6 条、含 cargo=False / 含 rank_parity=False | `package.json:88`、`.github/workflows/hive-check.yml:31`、`scripts/linux_verify.sh:20-22` ✓本报告复核 |
|
|
179
|
+
| 腿D2 | ①`MDCG_SCORE_MODE=legacy python scripts/rank_parity.py` ②`--exe <临时目录>/no_such_exe.exe` | ①rc=3「词法打分口径不一致…拒绝静默对拍」②rc=2「rust 二进制不存在…」;**两种红俱在时 `npm run gate` rc=0**;⇒ 门禁对这两类红全盲,且 harness 对缺产物是**非零退出**(不存在「缺失即静默绿」) | `scripts/rank_parity.py:277-279`(rc=2)、`:340-356`(rc=3) |
|
|
180
|
+
| 腿E | 读 `scripts/linux_verify.sh` 与 `.github/workflows/*.yml`,全仓扫 `cargo test` 调用点 | `linux_verify.sh:20-22` 是 `( cd hive && cargo test --quiet )`、`:25-27` 同目录 `cargo build --release`;`hive-check.yml:31` 是 `cargo test --manifest-path hive/Cargo.toml` —— **`rust/` 目录零覆盖**;契约「容器腿已覆盖 rust 全量」**不成立** | `scripts/linux_verify.sh:20-27`、`.github/workflows/hive-check.yml:31` ✓本报告复核 |
|
|
181
|
+
| 腿E2 | 成本实测 + SKIP 语义溯源 | 冷 `cargo test` 2.3s / 热 0.2s;冷 `cargo build --release` 7.9s / 热 0.0s(零第三方依赖)。SKIP 语义真先例=`scripts/run_tests.py:216`「{n} 跳过」不计失败;而 `md_cg/test_rank_parity_score_mode.py:494-500` 对「缺产物」选的是 **fail-closed rc=1**,且该守卫**已在** `run_tests.py` 全量套件内、CI 无 rust 构建步 ⇒ 新腿的 SKIP 语义必须与它对齐,否则「门禁 SKIP / CI 红」 | `rust/Cargo.toml:30-34`、`scripts/run_tests.py:216` |
|
|
182
|
+
| 腿F | 边界自证 | 全部实验根在系统临时目录(`r7repro\` 约 392 MB);`git status -uall` 任务前后逐字一致;`rust/target` 零写入;**在役认知图根未打开**(`MdCGSecure.__init__ → crypto.provision_dek(self.root, …)` 会向根写入 ⇒ 越界) | `md_cg/mdcos.py:3730-3741` |
|
|
183
|
+
|
|
184
|
+
### 2.2 H-3 · H-7 的修前复现(复现腿 1/2/3,8 条)
|
|
185
|
+
|
|
186
|
+
> 「复现腿 1/2/3」=**H-3·H-7 的修前复现记录**,与 §2.1 的复现腿 A–F、与门禁腿①②均无编号关系(§0.1)。
|
|
187
|
+
|
|
188
|
+
| # | payload | 观察(摘要) | 站点 |
|
|
189
|
+
|---|---|---|---|
|
|
190
|
+
| H-3 腿1 | 临时池:A=截断到 45% 的 `status.json`、B=合法 pending 且 `depends_on=[A]`;真 `hive.exe serve --jobs <temp> --workers 1` | t=4s / t=12s 两次采样:A 的 state 恒为 `<unreadable:JSONDecodeError>`,`status.json` 的 sha256/size/mtime_ns **与注入前逐字节同一**;目录恒 `['spec.json','status.json']`(无 `claimed.lock`);桩执行器 trace **0 行**;依赖它的 B 恒 pending | 主循环 `:215-217`(`Err(_) => continue`)✓本报告复核;`recover_orphans` `:302` ✓本报告复核、`:183`(启动调用) |
|
|
191
|
+
| H-3 腿2 | 真 CLI:`hive.exe doctor --jobs <temp>` / `hive.exe poll <id> --jobs <temp>` / `git grep -i -E 'quarantine\|corrupt' -- hive` | doctor `task_states=[{"state":"unknown","count":2},{"state":"done","count":1}]`——**畸形 JSON 与文件缺失被合并进同一个 unknown**;poll 的 job 键集合实测 `['error','job_id']`——**无 state**;`quarantine` / `corrupt` 两模式 grep **rc=1(零命中)** | `hive/src/main.rs:697-701` ✓本报告复核、`:427-435` ✓本报告复核 |
|
|
192
|
+
| H-3 腿3 | 连续观察 ~15 拍(6s)/~30 拍(12s),读 serve 的 stdout+stderr 全文与坏任务目录 | serve 输出全文 125 字节,**不含该 job_id 任何字样**(全程静默);目录前后逐项相同、未落任何标记文件;`status.json` 三次读取同一 | `hive/src/scheduler.rs:213-265`(整拍扫描无「坏 status」分支)、`hive/src/main.rs:695-706` |
|
|
193
|
+
| H-7 腿1 | N=8 合法 pending(`timeout_s=60`、桩执行器每任务 sleep 20s)+ `serve --workers 1`,每 100ms 采样 6s;补验 N=16 | N=8:t=0.1s **首采即** `{running:1, claimed:7}`、`pending=0`、`claimed.lock` 文件数=8,此后恒同;N=16(workers 仍 1):`{running:1, claimed:15}`、locks=16。⇒ **领取并发数 = N − workers ∝ N**,队列深度随 N 线性增长、无界;上界 `ceil(N/workers)×timeout_s` 不成立 | `hive/src/scheduler.rs:185`(`mpsc::channel` 无界)✓本报告复核、`:213-265`(单拍全量 claim + 非阻塞 send) |
|
|
194
|
+
| H-7 腿2 | 对队列尾的已领取未开跑任务执行真 `hive kill`,其后 7.5s 每 0.5s 采样 | 7 个 claimed 任务 `pid` **全 null**、`heartbeat_ts` **全 null**;kill 回执 rc=0 且 `hint` 承诺「≤1s」、`kill_flag=true` 贯穿全部 16 次采样,但 7.5s 内该任务 state 恒 `claimed`、桩执行器从未被拉起 ⇒ **承诺不成立** | pid 写入点:HEAD `:475` / 工作区 `:799`(仅在 spawn 成功后);kill 检测点:HEAD `:494` / 工作区 `:818`(在 `run_job` 的 1s 轮询内);回执 hint:HEAD `:517` / 工作区 `:539`(复现清单引的 `:473-476`/`:484-507`/`:511-520` 是同几处的近似区间) |
|
|
195
|
+
| H-7 腿3(对照) | 1 个 pending + 1 worker,等 `state=running` 后真 `hive kill`,每 0.2s 采样 | t=**1.41s** 命中 `killed`,桩进程随后已不在 ⇒ **kill 通道本身可用**,缺口精确定位为「claimed 未开跑」这一态 | `hive/src/scheduler.rs:494-499` |
|
|
196
|
+
| 守卫腿 | `git ls-files -- hive/test_h3_h7_scheduler.py` | **空**(改动前该守卫不存在)⇒ 契约点名的 6 项要求**当时一律未跑**,复现侧如实记为「未跑、不计通过」 | `hive/test_h3_h7_scheduler.py`(当时不存在) |
|
|
197
|
+
| 边界 | 实验根全在 `%TEMP%\h3h7_repro_*`;每次 CLI 显式 `--jobs <临时池>` | `git status -uall` 仅 `?? .zcode/workflows/…`(会话起始既有);在役 `hive/jobs` 只变 `_serve.json` 一个文件且可归因于在役 serve 自身心跳(pid 命中 `hive.exe`);无残留桩进程 | `hive/jobs/_serve.json`(只读对照) |
|
|
198
|
+
|
|
199
|
+
### 2.3 H-4(8 条)
|
|
200
|
+
|
|
201
|
+
| # | payload | 观察(摘要) | 站点 |
|
|
202
|
+
|---|---|---|---|
|
|
203
|
+
| 基线判定 | 因不得编辑工作区,基线用 `git archive HEAD` 导出到系统临时目录 | 契约引用的行号逐一对上 HEAD 内容 | `md_cg/sustain.py:397/422/449/485` ✓本报告复核、`hive/exec.py:1405-1424` ✓本报告复核、`hive/src/scheduler.rs:456-472` |
|
|
204
|
+
| A-shape | 默认部署形态下启动 `_start_sustain(cg)` | 新增线程**恰 1 条**(`mdcg-sustain`);`auto_heal/auto_tidy` 开,`auto_scrub/evolve` 关;`lp.cg.index['nodes'] is cg.index['nodes']` **同一对象** ⇒ 单后台线程串行驱动全部 tick,与前台**共享同一 cg 与同一 nodes 字典** | `md_cg/mcp_server.py:3424-3453`、`md_cg/sustain.py:1008`、`:943-953` |
|
|
205
|
+
| A-scan | 自写 AST 扫描器扫全 md_cg 域 | HEAD 命中 **41** 处裸迭代、工作区(当时只改了 sustain 四处)命中 **38** 处;契约 8 站点全部在位;**契约未列的第 9 处** `md_cg/provenance.py:246` 在默认 `diagnose` 路径上(由 `sustain.py:591` `provenance.check` 调到) | `md_cg/provenance.py:246` ✓本报告复核、`weights.py:408/409/425/483`、`refindex.py:672`、`sustain.py:397/422/449/485` |
|
|
206
|
+
| A-d1 | 确定性并发注入(`dict` 子类,首次读 `edges` 时补影子键;触发点只被 `weights._targets` 读)+ 零 kwargs 的 `sus.diagnose(cg)` | HEAD:`RuntimeError`,栈顶 `weights.py:409`;**工作区(第一轮只快照 sustain 四处):同样 RAISED@weights.py:409** ⇒ 止血目标未达成;绿场对照(全域包裹副本)→ 不抛且注入确已触发 ⇒ 判据一红一绿、有判别力 | `md_cg/weights.py:409`(崩点)+ `:379`(触发点) |
|
|
207
|
+
| A-threads | 真线程 `add/flush` vs 全默认 `diagnose`,`switchinterval` 默认 | HEAD:0.39s 内 200 次 `RuntimeError`;工作区第一轮:3 轮 × 8s **0 次**(单独不具判别力,会被误判为已修) | `md_cg/sustain.py:485`(HEAD 号) |
|
|
208
|
+
| A-threads-fast | 同上但 `sys.setswitchinterval(1e-6)` | HEAD:200 次,站点 `{sustain.py:485:199, provenance.py:246:1}`;工作区第一轮:134 次,站点迁到 `refindex.py:672`(75) / `weights.py:409`(27) / `:425`(14) / `:408`(9) / `provenance.py:246`(8) / `:483`(1) ⇒ **两个形态合起来才能判红** | 同上 |
|
|
209
|
+
| A-loop | 真实常驻 `SustainLoop`(间隔调小)+ 前台并发写,spy 包装 `diagnose` 记录后原样抛出 | HEAD:26 次 tick 中 **23 次抛 `RuntimeError`,无一外泄**(被 `sustain.py:1037-1042` 的 `except Exception: pass` 吞掉)⇒ 可观测后果=**巡检静默丢轮** | `md_cg/sustain.py:1037-1042`、`:1146-1150` |
|
|
210
|
+
| B/C/D | `_post_chat` 单发不重试 / `spawn_executor` 失败一次即 error / FI-M04 在改动前树的判定 | ①假端点(前 2 次 429+`Retry-After: 1`、第 3 次 200):HEAD **端点只收到 1 条请求**、抛 429、整执行器 `exit=3`、`result.json` 无 `llm_retries`;恒 400 也是 1 条 + exit=3(⇒ 修前「一律不重试」顺带满足「不可重试不重试」,不构成既有防线)②`HIVE_PYTHON=<不存在的解释器>`:HEAD **50ms** 到终态 `error`,无 `spawn_attempts`、无「试了哪个解释器」(工作区反向对照 **658ms**、3 次尝试 + 200/400ms 退避、`spawn_attempts=3`)③FI-M04 在 HEAD 上 `verdict="gap"`(当场捕获 `RuntimeError`,栈指 `sustain.py:484`)⇒ 改动前**不是 pass** | `hive/exec.py:1405-1424` ✓本报告复核、`hive/src/scheduler.rs:456-472`、`test/chaos_injection/test_fi_m04_sustain_concurrent_collision.py:44-75,163-210`、`registry.py:87` |
|
|
211
|
+
|
|
212
|
+
**A-scan 口径更正(本报告本轮新增实测,用于回答「41/80/112 对不上」)** —— 这三组数字来自**三把不同的尺**,且其中「80」是实施轮自述,本报告现在给出可对照的两个数:
|
|
213
|
+
|
|
214
|
+
| 尺 | 度量对象 | HEAD(修前) | 工作区(修后) | 来源 |
|
|
215
|
+
|---|---|---|---|---|
|
|
216
|
+
| 复现员的 `scan.py` | 仅「**同作用域内**把名字绑定到 `index['nodes']` 后直接迭代」的站点(不追踪跨函数**参数**透传) | **41 处裸迭代** | **38 处**(当时只包了 sustain.py 四处;41→38 的 −3 与「包了 4 处」不对账,**属该扫描器口径内的计数噪声,本报告不为其担保**) | 【工作流采集】 |
|
|
217
|
+
| 守卫内 AST 扫描器(`scan_domain()`,含别名与跨函数参数透传) | 全部共享迭代点 / 其中未取快照者 | **400 文件 · 112 处共享迭代点 · 84 处未取快照(生产 59 + 测试 25)** | **402 文件 · 112 处 · 0 处未取快照** | **【本报告实跑】** |
|
|
218
|
+
| 实施轮自述 | 它自己改动的站点数 | — | 「**80 处**(生产 55 + 测试 25)」 | 【工作流采集】 |
|
|
219
|
+
|
|
220
|
+
**对账结论(本报告实跑 `git archive HEAD md_cg` → 用守卫同一扫描器扫两棵树所得)**:
|
|
221
|
+
|
|
222
|
+
1. **「112」不是本批新增的量**:两棵树的共享迭代点总数**都是 112**——本批只把 `list(...)` 套在既有迭代点上,**没有新增也没有删除迭代点**;故「112 减 84 = 28」是 HEAD 时**本就安全**的站点数(例如早已写成 `list(...)` 的 `md_cg/refindex.py:867`),不是「本批留下的残余」。
|
|
223
|
+
2. **「84」才是本批取快照的站点数**(HEAD 的 84 处未取快照 → 工作区 0 处)。测试面 **25** 与实施轮自述**完全一致**;生产面守卫扫出 **59**、实施轮自述 **55**,**差 4 处**——差异只能定位到「按改动行计数」与「按 AST 站点计数」的口径差,**本报告未能把差 4 处逐点点名**(守卫的扫描器不输出「HEAD 有、工作区无」的差集明细),如实标注为**未闭合**。
|
|
224
|
+
3. **「41」是窄口径的读数**(不追踪参数透传)——契约点名的 `md_cg/sustain.py:422` 正是被参数传入的 `nodes`,在那一口径下**扫不到**(本报告 §2.3 A-scan 行已记),故 41 < 84 属预期,不是矛盾。
|
|
225
|
+
4. **旁证(本报告实跑)**:`git diff -U0 -- md_cg/ | grep -c "^+.*list("` = **85**(其中 1 行是 `sustain.py` 注释里提到的 `list()`,故 84 个真实包裹点与之吻合)。
|
|
226
|
+
|
|
227
|
+
### 2.4 C-8(6 条)
|
|
228
|
+
|
|
229
|
+
| # | payload | 观察(摘要) | 站点 |
|
|
230
|
+
|---|---|---|---|
|
|
231
|
+
| S1/S1b | 31 节点临时库(15 同域同桶 + 15 异域异桶 + 植入 `mem_900` 异域异桶但正文含 query 词);`MDCG_RETRIEVAL_PIPELINE=1` 等开关;每配置新建实例规避 hotcache 串味 | 三路实测:`MdCGOS.search` 关态 `scanned=31`/无 gates/top5 含 `mem_900@1` → 开态 `scanned=15`/`gates=['s1','s1b','s4']`/`mem_900` 排名 None;**两条 RRF 路开关前后逐位一致、`has_gates=False`、`gates=[]`** ⇒ 开关在 RRF 路**不生效** | `md_cg/mdcos.py:1267`(不接线)· `:4164`(生产覆写)· 对照 `:823` 与 `md_cg/mdcg.py:2943` |
|
|
232
|
+
| S2 | 12 节点、`observation_position` 分 sandbox/prod;`context={'observation_position':'sandbox'}` | `search`:关 k50=12 条 → 开 k50=6 条、`gates` 含 `s2`;**RRF 两路两态候选集完全相同(12 条)** | `md_cg/mdcg.py:869-877`(S2 段) |
|
|
233
|
+
| S4 | ①直探共享打分面 ②反序 id 排序探针 | ①`_score` raw:`a_know` 0.6→0.7(+0.1)、`z_anchor` 0.6→0.8(+0.2)⇒ **S4 加成本体在共享打分面生效**;②三路关态 `[a_know…, z_anchor…]` → 开态 `[z_anchor…, a_know…]`,三路「排序被 S4 改变?」均 True ⇒ **两路 RRF 的 S4 加成同样生效**;但 `gates['s4']` 审计键**只在 `search` 出现**。⇒ RRF 侧缺的是 **S1/S1b/S2 三条过滤型门控 + S4 审计块** | `md_cg/mdcg.py:3323-3346`(`_score`)· `:763-772`(审计块) |
|
|
234
|
+
| 守卫缺口 | `python md_cg/test_retr_gates_prodpath.py`(未改动树) | **RC=0,`ALL OK: 9 项`**——假绿;其 P4(`:123-129`)只 `inspect.getsource(MdCGOS.search)` 与 `MdCG.search` 判 `"apply_retrieval_gates" in src`,**对 `search_rrf` 零断言** ⇒ 病症存在而守卫绿灯 | `md_cg/test_retr_gates_prodpath.py:123-129` |
|
|
235
|
+
| 默认态零变更 | 三路默认态(不设任何门控 env) | 三路均 `has_gates=False`、`scanned=31`、top5 逐位一致 ⇒ **分裂只在总开关显式开启时显现** | `md_cg/mdcg.py:761-762`、`README.md:341` |
|
|
236
|
+
| 定性 | 全仓 grep + 契约/守卫自述 + 生产调用链 | 见 §6.3(结论:**缺陷**,非有意设计) | `docs/hive/检索路径与认知结构契约_v0.1.md:77,100`、`md_cg/mdcg.py:744`、`md_cg/test_retr_gates_prodpath.py:13-14`、`md_cg/mcp_server.py:2194,2202` |
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## 3. 修法契约与落点
|
|
241
|
+
|
|
242
|
+
> 契约本体不在仓内(由工作流管线以 `args.contract` 传入),本报告给的是**转述 + 落点**;转述与实测冲突处,正文以实测为准并显式写出。
|
|
243
|
+
|
|
244
|
+
### 3.1 R-7(契约 ① ② ③)
|
|
245
|
+
|
|
246
|
+
- **① 接线**:`package.json:88` 的 gate 链尾追加两条腿(纯 `&&` 短路,**既有六条腿原样在位**,各**恰好一次**):
|
|
247
|
+
- `scripts/gate_rust_crate_test.py`(腿①):`cargo test --manifest-path rust/Cargo.toml`,**不新增任何检查逻辑**;`cargo` 不在位 / crate 清单缺失 ⇒ 显式 `[SKIP]` + `计入通过数 0` + 补救命令,**不出 `[PASS]`**。
|
|
248
|
+
- `scripts/gate_rust_parity.py`(腿②):`python scripts/rank_parity.py --exe <release 二进制>`,按 harness 的 rc 分派(1 逐位劈叉 / 3 口径不一致 / 4 口径不可读)并打印**可执行**补救命令。
|
|
249
|
+
- **② 缺产物处置:选「自动构建」(`--build auto`,缺省)**。论证三支(`scripts/gate_rust_parity.py:19-35`):(a) **另一侧根本没有兜底**——容器腿与 CI 只跑 `hive/` 那个 crate(`linux_verify.sh:21`、`hive-check.yml:31`),`rust/` 全无覆盖,若缺产物即 SKIP,干净 clone 上 `npm run gate` 会**全绿而对拍零覆盖**,正是 R-7 要修的洞;(b) 代价可控(零第三方依赖,冷 release 构建实测 7.9s,且**只在产物缺失时**构建);(c) **陈旧 ≠ 静默**——产物在位但过期时不重建,交给 harness 按 `serve info.score` 回读面判 `rc=4`。`--build never` 时退回**显式 SKIP 不计通过**。
|
|
250
|
+
- **③ 注释订正**:`rust/src/main.rs` **两处**同一失实断言(`:99` 与头 doc `:13-14`)一并订正为事实(Rust 缺省 `jaccard` vs Python 产品缺省 `legacy`,两侧本就不同);CH-1 的锚点 `jaccard: true, // 缺省 jaccard` **逐字保留**(否则 CH-1 守卫 G3k 成孤儿)。
|
|
251
|
+
- **契约偏离 1(已授权二选一)**:契约 ②/③ 的字面动作「缺产物 ⇒ 显式 SKIP 且不计通过」在**缺省 `auto` 下不成立**(缺产物走 `[BUILD]`→PASS 或 `[FAIL]`);SKIP 仅出现在 `--build never` / 缺 cargo / harness 缺失 / harness rc=2。这是契约明文授权的择一,按授权口径接受,但**按字面动作去「制造缺产物看 SKIP」会与实现不符**。
|
|
252
|
+
- **契约偏离 2(前提失实,已订正)**:契约称「容器腿 `linux_verify.sh full` 已覆盖 rust 全量」**不成立**(见 §2.1 腿E,本报告独立复核一致)。该前提失实**直接改变 ② 的选型**——「自动构建」因此比「缺产物即 SKIP」更站得住。
|
|
253
|
+
|
|
254
|
+
### 3.2 H-3 · H-7
|
|
255
|
+
|
|
256
|
+
- **H-3 判据单点**:`job.rs:209-226` 三态 `StatusRead`(`Ok`/`Absent`/`Corrupt(String)`),`serve` 主循环 / `recover_orphans` / `doctor` **三处共用**,不再各自 `try/catch` 出第二套口径。
|
|
257
|
+
- **H-3 处置链**:坏 status ⇒ 不领取、不改写;首拍 stderr 点名告警;连续 `CORRUPT_MARK_TICKS=10` 拍(≈4s)仍不可解析 ⇒ 落**独立旁证** `status.corrupt.json`(`job.rs:262-289`,tmp+rename 原子);status 恢复可解析 ⇒ **撤销标记**(`clear_corrupt_mark`,信号跟随现实、不留陈化标记);`doctor` 归独立类别 `corrupt` + `corrupt_jobs` 明细;`doctor --quarantine` 把任务**整体同卷 rename** 进 `jobs/_quarantine/`,`--unquarantine` 原路退回,**不删任何文件**、fail-closed 不覆盖同名件。
|
|
258
|
+
- **「非 `h` 前缀 ⇒ 天然退出领取面与统计面」这条推理的依据(本报告实读)**:`hive/src/job.rs:362-374` 的 `pub fn list_jobs` 遍历池目录时只收 `name.starts_with("h") && is_dir()` 的项(任务目录名=job_id,形如 `h<ts>_<seq>`);而**领取面(serve 主循环、`recover_orphans`)与统计面(`doctor` 的 `task_states`、`poll` 列表)都只遍历 `list_jobs` 的输出**。隔离区目录名是 `_quarantine`(下划线开头)⇒ 它本身及其子目录都不会进入 `list_jobs`——`doctor` 因此**另列** `quarantined` 清单(`hive/src/main.rs:770-772`,源码注释原话「它们不在 task_states 里…不列出来就成了另一种静默」),否则被隔离的任务会从观测面彻底消失。
|
|
259
|
+
- **H-3 不做**:**不做自动终态化**——那等于把坏文件静默吞掉,正是本缺陷的反面;终局处置权留给显式隔离与人工。
|
|
260
|
+
- **H-7 选型 (a)**:`InFlight` 有界在飞名额(`scheduler.rs:211-253`,容量 = workers,纯 std 原子 CAS),主循环**先占名额再 claim**(`:413-418`),claim 失败 / 状态改写失败 / `tx.send` 失败三条路径都 `release()`,worker 终结即归还。不变量:**任一时刻 `claimed`+`running` ≤ workers**;超额任务老实留在 `pending`(可 kill / 可隔离 / 可改判据,仍是一等公民)。
|
|
261
|
+
- **为什么不是 (b)「给 claimed 补 pid/心跳」**:mpsc 无队列内移除语义,要让 kill 够得着「已领取未开跑」还得再加一套取消集合与心跳面,而 (b) **不消除被点名的缺陷本体**(无界预领取照旧);(a) 一处改动同时给出上界与结构含义「名额在手才 claim」。⇒ 契约允许二选一,本批择 (a)。
|
|
262
|
+
- **`kill` 承诺文案**:CLI 回执 `hint`(`main.rs` HEAD `:517` / 工作区 `:539`,文案含起点「检测到 kill 标志后」)与 `hive/README.md:159`(`hive_kill`「worker ≤1s 内强杀」,**无起点限定**)在 **claimed 未开跑态结构上不可达**(无 worker 持有该任务 ⇒ 永不开始计时,§1.2 的判断段);`running` 态实测 1.41s 与 CLI 文案相容、与 README 的无起点措辞字面相抵。**属可机械判定的文案问题,本报告不改码,留池(§6.4 第 3 条)。**
|
|
263
|
+
- **用户面同步**:`hive/README.md:79`(主循环加「占在飞名额(≤ workers,H-7)」)、`:143-147`(`doctor --quarantine/--unquarantine` 用法)、`:158`(`hive_doctor` 三态说明)、`:300-330`(领取上界与坏 status 处置段)。
|
|
264
|
+
- **MCP 镜像**:`hive/hive_mcp/mcp_server.py:421-432/458-478/660-700` 做同口径三态 + `corrupt_jobs/quarantine_dir/quarantined/corrupt_note`,常量与 rust 侧逐字一致。
|
|
265
|
+
|
|
266
|
+
### 3.3 H-4(止血三项 + 可观测面)
|
|
267
|
+
|
|
268
|
+
- **H-4① 迭代点取快照**:凡从 `cg.index` 取回 `nodes` 后在**取用前**先 `list(...)`(`list(nodes.items())` / `list(nodes.values())` / `list(nodes)`),使并发写不再触发 `RuntimeError`,且**既有判据与结果逐位不变**(只换取用方式、不重绑定、不写回)。覆盖=契约点名的 8 站点 + 契约未列但在默认 `diagnose` 路径上的 `provenance.py:246` + 其余同形站点;**站点数按 §2.3 的口径块读:HEAD 84 处未取快照(生产 59 + 测试 25)→ 工作区 0 处**(实施轮自述的「80 处」与之差 4 处,同块已注)。
|
|
269
|
+
- **H-4② `spawn_executor` 有界退避**:`SPAWN_MAX_ATTEMPTS=3` / `SPAWN_BACKOFF_BASE_MS=200` / `SPAWN_BACKOFF_MAX_MS=2000`,第 n 次失败后等 `200ms×2ⁿ⁻¹` 封顶 2s;失败终态文案含**最后试的解释器**并新增 `spawn_attempts` / `spawn_interpreter` 字段(`scheduler.rs:707-728`)。**不做**:拉起失败的分类治理、worker 池自愈、把 spawn 失败降级为「任务重投 pending」(属设计级)。
|
|
270
|
+
- **H-4③ `_post_chat` 有界退避重试**:`RETRY_MAX_ATTEMPTS=3`、`RETRY_BACKOFF_BASE/MAX`、`RETRY_AFTER_MAX=30`、可重试判据 = `{408,425,429} ∪ 500–599` ∪ 网络瞬时异常(`_retryable_http`/`_retryable_exc`),等待 = `[delay/2, delay)` 抖动与 `Retry-After` 取大后整体封顶;**零重试路径不写 `llm_retries`**(无故障产物逐位不变)。
|
|
271
|
+
- **不做(本批边界)**:实例级读写锁 / 写路径消息化 / 线程模型重构——**只做止血,根治不在本批**(见 §6.2)。
|
|
272
|
+
- **守卫扩面**:`md_cg/test_h4_sustain_snapshot.py`(1377 行,全 md_cg 域 AST 扫描 + 回缺陷副本构造 + 目标级判据 + 逐位不变 oracle + 12 处定点变异);`test/chaos_injection/test_fi_m04_sustain_concurrent_collision.py:67,73,80` 新增两条**跨模块读码断言**,`registry.py:87` 登记文案改为「全 md_cg 域 · v2 扩面」。
|
|
273
|
+
|
|
274
|
+
### 3.4 C-8
|
|
275
|
+
|
|
276
|
+
- **择支:接线(让 `search_rrf` 复用共享单点),而不是「显式记录差异」**。论证:总开关默认关 ⇒ 接线在默认态是**恒等变换**(默认零变更成立,守卫 P2 逐位验证);显式开启时两路门控状态**同源同态**,正面消除分叉——这是「不允许看起来接上了但行为分叉仍在」的唯一解。反支(显式声明「RRF = 无门控原始融合面」)**无任何现行文档支撑**(§6.3 的三面证据),且需先写进契约。
|
|
277
|
+
- **落点**:`md_cg/mdcos.py:1392-1395`(插入点与 `MdCGOS.search` 同构:`_candidates` 之后、四路候选生成之前)、`:1401`(`gates` 非空才落键)、`:1528/:1539`(缓存写入与返回体两侧同落);`:1315-1322`(`search_rrf` docstring)、`:4201-4207`(`MdCGSecure.search_rrf` docstring);`md_cg/mdcg.py:744-757`(「唯一实现」范围声明订正);`docs/hive/检索路径与认知结构契约_v0.1.md:79-97`(新增 §4.1 读入口 × 门控状态表,含**有意保留的差异** S3/S7)。
|
|
278
|
+
- **未改动**:`apply_retrieval_gates` 内部语义与开关缺省未变;RRF 权重与排序判据未动;`RRF_K` / `DEFAULT_PATH_WEIGHTS` 逐行相同(【工作流采集】AST 级等价核验)。
|
|
279
|
+
- **残留裁决点(定性,已明示)**:门控**并非召回无损**——腿1 中 gated `search` 丢掉了 ungated 下排第 1 的 `mem_900`(域/桶标签与正文矛盾,属契约 S1「域分类错误」失败模式,兜底仅在域内不足 `min_results` 时触发);「RRF 是否接受该召回损失」属**定性裁决**,本报告不代裁(归 run owner,§6.4 第 7 条)。
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
283
|
+
## 4. 验证数字
|
|
284
|
+
|
|
285
|
+
### 4.1 四份守卫:断言数 / 通过数 / 退出码 / 断言构成(**全部【本报告实跑】**)
|
|
286
|
+
|
|
287
|
+
| 守卫 | 对应工作项 | 断言数 | 通过 / 失败 / 跳过 | 退出码 | 命令 |
|
|
288
|
+
|---|---|---|---|---|---|
|
|
289
|
+
| `scripts/test_gate_rust_legs.py`(712 行) | R-7 | **49** | 49 / 0 / 0 | **0** | `python -X utf8 scripts/test_gate_rust_legs.py` |
|
|
290
|
+
| `hive/test_h3_h7_scheduler.py`(949 行) | H-3 · H-7 | **27** | 27 passed / 0 failed | **0** | `python -X utf8 hive/test_h3_h7_scheduler.py` |
|
|
291
|
+
| `md_cg/test_h4_sustain_snapshot.py`(1377 行) | H-4① | **38** | 38 / 0 / 0 | **0** | `python -X utf8 -m md_cg.test_h4_sustain_snapshot` |
|
|
292
|
+
| `md_cg/test_c8_search_rrf_gates.py`(502 行) | C-8 | **59** | `ALL OK: 59 项` | **0** | `python -X utf8 -m md_cg.test_c8_search_rrf_gates` |
|
|
293
|
+
|
|
294
|
+
**断言构成(分组计数,本报告按实跑输出逐组统计)**:
|
|
295
|
+
|
|
296
|
+
- **R-7:G1 5 / G2 12 / G3 8 / G4 10 / G5 8 / G6 6 = 49。** 其中 G5 的 8 条=`G5a` 锚点抽取、`G5b` CH-1 锚点在 `main.rs` 仍命中、`G5c` Python 侧负向锚点仍命中、`G5c2` 订正结论明确、`G5d` 失实原话整句已不在、`G5e` 订正事实跨行锚点在位、**`G5f` 失实片段「SCORE_MODE 缺省一致」全文件清零(`:99` 与头注释 `:13-14` 两处)**、**`G5g` 头注释已订正为事实**——后两条是对前一稿「`:13-14` 残留」的补齐(前一稿记 47 断言=G5 6 条)。
|
|
297
|
+
- **H-3·H-7:A 7 / B 4 / C 6 / D 4 / E 6 = 27。** A=坏 status 不再静默(标记落场 + 启动/周期双告警 + doctor 归类 + poll 面 state);B=`status.json` 本体逐字节未改写(含「健康任务仍被正常改写」的零闸变对照);C=隔离可用可回退且字节一致;D=上界实测(峰值 `claimed+running ≤ workers`、期间确有 pending 残留、drain 全部终态);E=真 serve + 桩执行器端到端两态(干净池全 done/同池坏 status 时好任务照跑)。
|
|
298
|
+
- **H-4:G0 1 / G1 13 / G2 11 / G3 8 / G4 4 / G5 1 = 38。** G0=`with self._lock:` 仍恰 4 处(**记账面未扩**);G1 含 `G1a` 扫描器覆盖面(共享迭代点总数 **≥ 80**)+ 全域零裸迭代点、`G1b` **判据自证**(反包裹后扫描器须原样报出全部站点)、`G1c` 站点在位(13 处逐条点名);G2=11 处行为级「并发写索引下不崩溃」;G3=逐位不变 oracle(38 条只读路径字节相同)+ 覆盖面下限(≥70 处反包裹);G3b=手算 oracle 6 条;G4a=**目标级确定性判据 + 其判别力对照**(回缺陷副本必须抛),G4b/G4c=真线程(默认与 `1e-6` switchinterval);G5=真实并发对撞零异常。
|
|
299
|
+
- **C-8:P1 5 / P2 7 / P3 15 / P4 4 / P5 18 / P5-2 5 / P6 5 = 59。** P2=默认态零变更(含「子门控全关 ≡ 未设」);P3=三路逐路断言;P4=三路 `gates` 逐位相同;P5/P5-2=开门/关门候选面与 id 序列对照;P6=结构唯一性(`MdCG.search`/`MdCGOS.search`/`MdCGOS.search_rrf` 均引用共享单点、`MdCGSecure.search_rrf` 走 `super()` 委托、`gates["s1b"]` 只出现在 `mdcg.py`)。
|
|
300
|
+
|
|
301
|
+
**附:`hive/test_h4_llm_retry.py`(H-4③ 的专属守卫,506 行)**——本报告实跑其**经全量套件**被自动发现并 `PASS`(§4.3);其单独正向 `32/32` 与 `--mutate` 读数见 §5.3 复核记录(【工作流采集】)。
|
|
302
|
+
|
|
303
|
+
### 4.2 每处定点变异红项数(**全部【本报告实跑】**,红项数=`FAIL` 断言条数)
|
|
304
|
+
|
|
305
|
+
**R-7 `--mutate`:12 处,全部「恰好命中预期」,未变异基线失败=0,退出码 0**
|
|
306
|
+
|
|
307
|
+
| # | 变异 | 红项=预期 |
|
|
308
|
+
|---|---|---|
|
|
309
|
+
| 1 | gate 链去掉腿① | 2 = 2 |
|
|
310
|
+
| 2 | gate 链去掉腿② | 2 = 2 |
|
|
311
|
+
| 3 | gate 链挂 `\|\| true` 吞掉腿②的失败 | 2 = 2 |
|
|
312
|
+
| 4 | 腿①把 SKIP 当 PASS(静默绿) | 2 = 2 |
|
|
313
|
+
| 5 | 腿①失败不传非 0(`return 1`→`return 0`) | 1 = 1 |
|
|
314
|
+
| 6 | 腿②失败不传非 0 | 2 = 2 |
|
|
315
|
+
| 7 | 腿②缺产物静默跳过(撤掉自动构建补救) | 5 = 5 |
|
|
316
|
+
| 8 | 腿②自动构建失败不判红 | 1 = 1 |
|
|
317
|
+
| 9 | `main.rs` 注释改回失实原文 | **4 = 4**(对应 G5d/G5e/G5c2/**G5f**) |
|
|
318
|
+
| 10 | `main.rs` 删掉「Python 缺省是 legacy」事实行 | 1 = 1 |
|
|
319
|
+
| 11 | `main.rs` **头注释**改回失实原文(`:13-14` 那处) | 2 = 2(G5f/G5g) |
|
|
320
|
+
| 12 | `main.rs` 锚点漂移(CH-1 的 G3k 锚点成孤儿) | 1 = 1 |
|
|
321
|
+
|
|
322
|
+
**H-3·H-7 `--branch-baseline`:6 处,全部「恰好命中预期组/项数」,未变异基线失败=0,退出码 0**
|
|
323
|
+
|
|
324
|
+
| # | 变异 | 红项 | 命中组 |
|
|
325
|
+
|---|---|---|---|
|
|
326
|
+
| 1 | 标记落盘阈值 | 3 | `{'A':2,'B':1}` |
|
|
327
|
+
| 2 | 标记写的目标路径 | 7 | `{'A':4,'B':2,'E':1}` |
|
|
328
|
+
| 3 | 三态分类(`Corrupt` 与 `Absent` 不分) | 12 | `{'A':6,'B':1,'C':5}` |
|
|
329
|
+
| 4 | `scan_corrupt` 单点实现 | 6 | `{'A':1,'C':5}` |
|
|
330
|
+
| 5 | 隔离保留区命名 | 2 | `{'C':2}` |
|
|
331
|
+
| 6 | **H-7 在飞名额闸** | 2 | `{'D':2}` |
|
|
332
|
+
|
|
333
|
+
末行 `还原后重编译:ok` ⇒ `定点变异自证:PASS`。另【工作流采集】:锚点漂移探针(把 `if ticks >= CORRUPT_MARK_TICKS {` 改成行为等价的 `if ticks >= 10 {`)⇒ 守卫打 `ANCHOR-MISS` 且**实测退出码 = 2**(fail-closed,不静默失效);删断言探针(临时副本删掉 D1)⇒ 退出码 1 并报「红基线失效(判别力面不符)」,证明自证确有判别力、不是恒真。
|
|
334
|
+
|
|
335
|
+
**H-4 `--mutate`:12 处,全部「恰好命中预期」,未变异基线失败=0,退出码 0**
|
|
336
|
+
|
|
337
|
+
| # | 变异(站点) | 红项=预期 |
|
|
338
|
+
|---|---|---|
|
|
339
|
+
| 1–4 | `sustain.py` 四处(`:422/:449/:485/:397`,**HEAD 号**)各回裸迭代 | 3 / 3 / 3 / 3 |
|
|
340
|
+
| 5 | `weights.py:408` 键迭代 | 2 |
|
|
341
|
+
| 6 | `weights.py:409` 裸 `items()` | 3 |
|
|
342
|
+
| 7 | `weights.py:425` 裸 `items()` | 2 |
|
|
343
|
+
| 8 | `weights.py:483` 裸推导 | 2 |
|
|
344
|
+
| 9 | `refindex.py:672` 裸键迭代 | 3 |
|
|
345
|
+
| 10 | `refindex.py:966` 裸键迭代 | 3 |
|
|
346
|
+
| 11 | `refindex.py:815` 裸 `items()` | 2 |
|
|
347
|
+
| 12 | `refindex.py:878` 裸 `items()` | 2 |
|
|
348
|
+
|
|
349
|
+
**C-8 `--mutate`:8 处,全部「恰好命中预期」,未变异基线红项=0,退出码 0**
|
|
350
|
+
|
|
351
|
+
| # | 变异 | 红项=预期 |
|
|
352
|
+
|---|---|---|
|
|
353
|
+
| M1 | `search_rrf` 断线(退回无 gates 键、恒全表) | **26** = 26 |
|
|
354
|
+
| M2 | 域信号断供(`big_domain=None`) | **11** = 11 |
|
|
355
|
+
| M3 | ctx 断供(`context=None`) | **6** = 6 |
|
|
356
|
+
| M4 | 第三份实现(RRF 入口自建 `gates["s1b"]`) | **11** = 11 |
|
|
357
|
+
| M5 | 委托断裂(`MdCGSecure.search_rrf` 不走 `super()`) | **21** = 21 |
|
|
358
|
+
| M6 | 门控错位(`min_results=10**9`,S1 恒回退) | **16** = 16 |
|
|
359
|
+
| M7 | 零变更破坏(RRF 入口 `meta` 恒落 `gates` 键) | **4** = 4 |
|
|
360
|
+
| M8 | 结构(`MdCG.search` 不再引用共享单点) | **1** = 1 |
|
|
361
|
+
|
|
362
|
+
> **本报告的读法与前一稿的差异**:M1–M8 的期望值直接取自守卫 `_MUTATIONS` 表(`md_cg/test_c8_search_rrf_gates.py:225-261`)并**由本报告实跑逐条命中**。前一稿引过一组「M1=26/M2=12/M3=16/M4=6」的数字,与本表不符——那是**另一轮、另一组变异标签**的读数,**不可跨轮对照**;以本表(代码表 + 本报告实测)为准。
|
|
363
|
+
|
|
364
|
+
### 4.3 Python 全量套件
|
|
365
|
+
|
|
366
|
+
| 项 | 数字 | 来源 |
|
|
367
|
+
|---|---|---|
|
|
368
|
+
| `PYTHONUTF8=1 python -X utf8 scripts/run_tests.py`(全仓 267 目标) | `===== SUMMARY 267/267 通过,5 跳过(依赖缺失/平台不符) =====`,退出码 **0** | **【本报告实跑】**(与【工作流采集】数字逐字相同) |
|
|
369
|
+
|
|
370
|
+
本报告实跑末行照录:`===== SUMMARY 267/267 通过,5 跳过(依赖缺失/平台不符) =====`,`$?` 直读 **0**;日志中含 `PASS md_cg.test_h4_sustain_snapshot`、`PASS md_cg.test_c8_search_rrf_gates`、`PASS scripts.test_gate_rust_legs`、`PASS hive.test_h4_llm_retry`、`PASS hive.test_h3_h7_scheduler`——即本批**五个新守卫全部被 `run_tests.py` 的通配自动发现并跑通**(`scripts/test_*.py` / `md_cg/test_*.py` / `hive/test_*.py`,见 `scripts/run_tests.py:48-52`)。
|
|
371
|
+
|
|
372
|
+
5 个跳过的口径:依赖缺失 / 平台不符(白箱库本地语料缺失、win32 平台面等),**与本批四项改动无关**。
|
|
373
|
+
|
|
374
|
+
### 4.4 容器两栈退出码(**全部【工作流采集】,本报告未重跑**)
|
|
375
|
+
|
|
376
|
+
**两栈身份**(【工作流采集】;命令取自运行本批的管线脚本,本报告未独立复核该脚本):
|
|
377
|
+
|
|
378
|
+
| 栈 | 命令 | 跑的是哪套件 | 退出码 |
|
|
379
|
+
|---|---|---|---|
|
|
380
|
+
| 栈一(`rust:bookworm`) | `docker run --rm -v <REPO>:/work -w /work -e CARGO_TARGET_DIR=/tmp/target rust:bookworm bash scripts/linux_verify.sh full` | `hive/` crate 的 `cargo test` → 各 python 套件 → `cargo build --release` → `hive/hive_mcp/smoke_test.py` | **0** |
|
|
381
|
+
| 栈二(`node:22-bookworm`) | `docker run --rm … node:22-bookworm bash -c "npm install --include=dev && npm run build && node --import tsx --test test/*.test.ts"` | Node 内置 test runner 跑 `test/*.test.ts`(TS 侧) | **0** |
|
|
382
|
+
|
|
383
|
+
**采到的尾行**(【工作流采集】原样):栈一 `结果: 21 pass / 0 fail` | `[PASS] smoke_test (linux)` | `=== 汇总: 38 pass / 0 fail ===`;栈二 `# cancelled 0` | `# skipped 3` | `# todo 0` | `# duration_ms 5237.544055`。
|
|
384
|
+
|
|
385
|
+
**这两组数怎么读(本报告实读脚本确认)**:`结果: 21 pass / 0 fail` 是 `hive/hive_mcp/smoke_test.py` **自身**的输出行(子项:MCP 提交面端到端 smoke);`=== 汇总: 38 pass / 0 fail ===` 是 `scripts/linux_verify.sh` 的 `record()` 总汇(`:115`),**21 ⊆ 38**——两个数是「子项」与「总汇」的关系,不是两套结果。
|
|
386
|
+
|
|
387
|
+
**栈一「38」的行级组成(本报告逐个数 `linux_verify.sh` 的 `record` 调用点得出,`full` 模式)**:
|
|
388
|
+
|
|
389
|
+
| 组成项 | 条数 | 来源行 |
|
|
390
|
+
|---|---|---|
|
|
391
|
+
| `( cd hive && cargo test --quiet )` | 1 | `:20-22` |
|
|
392
|
+
| `( cd hive && cargo build --release --quiet )`(仅 `full`) | 1 | `:25-27` |
|
|
393
|
+
| `python3 -m md_cg.<t>` 循环(`test_hive_ingest`…`test_n225_nonobject_load`) | **23** | `:41-53` |
|
|
394
|
+
| `python3 hive/test_*.py`(orch / exec_tools / serve_entry / result_anchor_chain) | **4** | `:54-58` |
|
|
395
|
+
| 断言判别力自证(`--head-baseline` / `--branch-baseline` 7 条) | **7** | `:88-100` |
|
|
396
|
+
| hive 面自证(`hive.test_result_anchor_chain --head-baseline`) | **1** | `:102-104` |
|
|
397
|
+
| `HIVE_EXE=… python3 -m hive.hive_mcp.smoke_test`(仅 `full`) | **1** | `:111-112` |
|
|
398
|
+
| **合计(full)** | **38** | 与采到的 `=== 汇总: 38 pass / 0 fail ===`(总汇行 `:115`)吻合 |
|
|
399
|
+
|
|
400
|
+
(`core` 模式去掉两个 `full` 项 ⇒ 36。此表是**本报告读脚本所得的组成**,不替代未重跑的容器实跑;具体哪一项在某次运行里 pass/fail,**采集材料里没有逐项记录**,本报告不代填。)
|
|
401
|
+
|
|
402
|
+
**栈二那 4 行怎么读**:它是采集面 **`slice(-4)` 的截断尾部**——node 汇总块的行序是 `tests / suites / pass / fail / cancelled / skipped / todo / duration_ms`,故 `# pass` / `# fail` **被设计性地切掉了**;可确证的只有「runner 枚举并跑完了用例、退出码 0」。**本报告不代填** `# pass` / `# fail`(采集材料里没有)。
|
|
403
|
+
|
|
404
|
+
**本报告未重跑的原因**:本机**确有** Docker(`Docker version 28.4.0`;本地已有 `rust:bookworm` / `python:3.12` / `node:22-bookworm` 镜像——本报告实跑 `docker images` 所见),技术上可跑;但不跑的理由见文首「证据分级声明」(a)(b) 两条——**(a) 与四项判据无关;(b) `full` 模式会向工作区 `hive/target/release/` 拷入容器编译产物**。⇒ 若编排要求补跑,需接受 (b) 的写面或改用仓库副本挂载。
|
|
405
|
+
|
|
406
|
+
### 4.5 门禁整体(`npm run gate`)的**交付态**:**红**,但红因是「本批新增文件未被 git 追踪」这一登记状态(不是本批源码/测试的行为)
|
|
407
|
+
|
|
408
|
+
**本报告实跑**(只读):工作区真 `npm run gate` **rc=1**,链在**更早的腿**即中断——`scripts/check_publish_artifact.py` 的 **R4 非追踪件面**:
|
|
409
|
+
|
|
410
|
+
```
|
|
411
|
+
[FAIL] R4 非追踪件面 命中=3;非追踪=31,允许=28
|
|
412
|
+
- docs/eval/优化第三批_门禁转正与调度止血与门控收口_v1.0.md
|
|
413
|
+
- md_cg/test_c8_search_rrf_gates.py
|
|
414
|
+
- md_cg/test_h4_sustain_snapshot.py
|
|
415
|
+
FAIL 规则数=1
|
|
416
|
+
VERDICT=FAIL
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
(同一输出亦被 R-7 守卫的 `--probe` 在 P4b 处以「非本探针红项」如实披露,见 §6.1.1。)
|
|
420
|
+
|
|
421
|
+
**根因**:`package.json` 的发布白名单 `files` 含 `md_cg` 与 `docs`、**不含** `hive/` 与 `scripts/`。⇒ 本批新增的 `md_cg/test_c8_search_rrf_gates.py`、`md_cg/test_h4_sustain_snapshot.py` 与**本报告文件自身**进入 npm 发布集却未被 git 追踪,被 R4 点名;`hive/test_*.py`、`scripts/test_*.py` 与 `scripts/gate_rust_*.py` **不在发布集内**,从不进入 R4 判据面。
|
|
422
|
+
|
|
423
|
+
**⇒ 结论层必须并列的两件事**:本批**四项缺陷的验收面**(§4.1–§4.3)**全绿**;**工作区 `npm run gate` 当前为红**,唯一红项是 R4 非追踪件面。
|
|
424
|
+
|
|
425
|
+
**这句话该怎么说才准确(本版更正措辞)**:R4 的 3 个命中里,`md_cg/test_c8_search_rrf_gates.py` 与 `md_cg/test_h4_sustain_snapshot.py` **正是本批新增的守卫文件**、本报告文件也是本批产物,因此**不能说「与本批无关」**。准确的说法是:**红是「本批新增文件的 git 追踪状态(未 `git add`)」触发的,而不是这些文件的内容/断言失败、也不是本批源码或既有测试出问题**——本批的四份守卫与全量套件在同一棵树上都是绿的(§4.1–§4.3)。即:**红因是登记状态,不是行为**。只报其一(只报验收面全绿/只报门禁红)都失真。
|
|
426
|
+
|
|
427
|
+
---
|
|
428
|
+
|
|
429
|
+
## 5. 四项独立复核判定与它们列出的 uncovered
|
|
430
|
+
|
|
431
|
+
> 判定与 uncovered 为【工作流采集】(复核员自建证据、不采信执行者自述)。**本批四项 = ACCEPT ×4**。档位含义:**ACCEPT**=缺陷本体与修法双双成立(复核员独立复现缺陷、独立验证修复、逐条核对契约),其 uncovered 列出的面**另计、不阻塞本次**。
|
|
432
|
+
|
|
433
|
+
### 5.1 R-7 —— **ACCEPT**
|
|
434
|
+
|
|
435
|
+
**复核基础(摘要)**:`git show HEAD:package.json` 确认缺陷面成立;工作树 `package.json:88` 按 `&&` 切分为纯短路链、两腿各恰一次且为末两条。**真门禁端到端红→还原→绿**:因工作树在更早的腿判红,复核员把工作树整体复制到系统临时目录(剔除 3 个无关未追踪件)后跑真 `npm run gate`:①基线 **RC=0**(腿① `27 passed/0 failed`、腿② `逐位一致 10/10`)②打红 A(`MDCG_SCORE_MODE=legacy`)⇒ **RC=1**、腿②[FAIL] rc=3、打印两侧实际口径③打红 B(`rust/src/lib.rs` 追加必失败用例)⇒ **RC=1**、腿①[FAIL] rc=101 且 `grep -c 'R-7 腿②'` = 0(真短路)④完全还原(`diff` IDENTICAL)⇒ **RC=0**。缺工具/缺产物逐条实测(腿① `PATH=""` → `[SKIP]`+`计入通过数 0`;腿② `--build never` → 同;副本里 rename release 二进制 ⇒ `[BUILD]` 可见自动构建;broken crate ⇒ 腿②`[FAIL]`「自动构建失败」;桩 serve 无 `score` ⇒ rc=4)。守卫本体 `49 通过/0 失败/0 跳过`、`--mutate` 12 处精确命中、`--probe` PASS。注释订正与锚点判别力:失实原话已不在 `main.rs`;CH-1 锚点仍命中;把 `jaccard: true, // 缺省 jaccard` 改成 `false` ⇒ CH-1 守卫 rc=1 且唯一红项 G3k,还原后 40/0;前缀盲区由新守卫 G5f 判红。
|
|
436
|
+
|
|
437
|
+
**它列出的 uncovered(逐条照录)**:
|
|
438
|
+
|
|
439
|
+
1. **契约前提有误**:『容器腿 `linux_verify.sh full` 已覆盖 rust 全量』**不成立**——`scripts/linux_verify.sh:20-22` 是 `( cd hive && cargo test --quiet )`、`:25-27` 同目录 `cargo build --release`;`hive-check.yml:31` 是 `cargo test --manifest-path hive/Cargo.toml`;全仓 grep `cargo` 无一处指向 `rust/`。交付方已在 `gate_rust_parity.py:19-27` 把该前提订正;据此判定「自动构建」的选择成立(若「缺产物即 SKIP」,干净 clone 上会门禁全绿而对拍零覆盖)。
|
|
440
|
+
2. **契约 ②/③ 的字面形态在缺省态不成立**:缺省 `--build auto` 下缺产物走 `[BUILD]`→PASS 或 `[FAIL]`,SKIP 只在 cargo 缺位 / `--build never` / harness 缺位 / harness rc=2 出现。这是契约明文授权的二选一,按授权口径接受;但按字面动作去「制造缺产物态看 SKIP」会与实现不符。
|
|
441
|
+
3. **陈旧盲区(残余,非本交付新引入)**:腿② 跑的是盘上二进制,源码改了但二进制仍能报 `info.score` 时对拍照样绿,只有缺该回读面才 `rc=4` ⇒ rust 侧**打分口径**漂移要等一次重编才被拦;腿①的 27 个 `cargo test` **不是** Python↔Rust 对拍(无 R-1/R-3/R-4 型口径对拍用例)。该性质对「在位才跑」方案同样成立。
|
|
442
|
+
4. **端到端「真门禁」在当前工作区不可达**:`npm run gate` 在 live 树于 `check_publish_artifact` 的 R4 面判红(命中=3,**均非 R-7 自己的交付件**——R-7 的 `scripts/gate_rust_*.py` 与 `scripts/test_gate_rust_legs.py` 不在 npm 发布白名单内,故从不进入 R4 判据面;命中的是另外两批守卫与本报告文件),链到不了两条腿;故真门禁红→绿证据取自**隔离副本**。⇒ 这三个未追踪件被入库/放行之前,本工作区无法复现「门禁绿」。
|
|
443
|
+
5. **CI / 无工具链边界**:两条腿都会 SKIP(实测无 cargo 时真门禁 RC=0、腿①计入通过数 0);新守卫虽被 `run_tests.py:51` 的通配自动收进 CI(`python-tests.yml` 调 `run_tests.py`),但 **CI 无 rust 工具链** ⇒ R-7 的回归保障实际是**开发机本地**兜底而非 CI 兜底。相邻观察(非 R-7、未跑 CI):`md_cg/test_rank_parity_score_mode.py` 缺 release 二进制时 fail-closed rc=1,而 `run_tests` 的 `_SKIPS` 无该目标 ⇒ CI 侧疑似红基线,未在 CI 上验证。
|
|
444
|
+
6. **文档陈化**:前一稿记 R-7 守卫为「47 断言 / 674 行 / 11 处变异 / 锚点 `:638-641`」,实测交付件为 712 行 / 49 断言(G5 实为 8 条非 6 条)/ 12 处变异 ⇒ 报告数字与产物不一致。**本版已按实测改正(§4.1/§4.2)。**
|
|
445
|
+
7. **未跑/未验证**:CI 与容器腿(按指示不重复跑全量/容器)、POSIX 下守卫行为(本机 win32 未跑)、NFC 只核了 3 个新文件路径(ASCII ⇒ NFC),未逐字扫新代码全部标识与路径字面量。
|
|
446
|
+
|
|
447
|
+
### 5.2 H-3 · H-7 —— **ACCEPT**
|
|
448
|
+
|
|
449
|
+
**复核基础(摘要)**:对着 HEAD 源码核对缺陷真实性(`:215-217` 与 `:302` 两处 `continue`、`main.rs:697-701` 折 `unknown`)逐条属实。修复面:判据集中(`job.rs:209-226/233/241-255/262-289/294-306`)、serve 三态分道 + 跨拍计数 + 双告警 + 落标记(`scheduler.rs:197/327-381/464-473/504-523`)、doctor 独立 `corrupt` 类别与 quarantine 两动作。复核员**自建夹具**(临时池 + 桩执行器 + 真 serve)**24/24 项通过**:标记按阈值落场、serve stderr 双告警、doctor `corrupt` 明细、poll `state=corrupt`;`status.json` sha256 改前/改后同为 `ac4c34e1d48221b6`、长度同为 43B——「不覆盖任务本体」成立;`--quarantine` 移入 `_quarantine/` 字节一致、`--unquarantine` 原路退回、二次执行幂等。H-7:独立实测 workers=2 / 6 条 pending 峰值 `claimed+running=2`、期间确有 pending 残留、6 条全部 `done`;把 `if !at_capacity && !inflight.try_acquire()` 定点改成 `if false && …` 的副本峰值一口气到 6 ⇒ **新闸是承重的**。另测容量=workers 后超额任务老实留 pending,对它 `kill` 后 **1.17s** 落 `killed` ⇒ kill 未因 (a) 失效。
|
|
450
|
+
|
|
451
|
+
**它列出的 uncovered(逐条照录)**:
|
|
452
|
+
|
|
453
|
+
1. **未跑全量套件**(按指示不重复跑);新守卫已被 `scripts/run_tests.py:52` 的 `hive/test_*.py` glob 自动纳入,故未额外接线。
|
|
454
|
+
2. `hive/hive_mcp/mcp_server.py` 的 H-3 镜像(`_status_class`/`corrupt_jobs`/`quarantined`)**只做了读码核对、未执行**;该面**没有 quarantine/unquarantine 动作**,note 指向 CLI——若要求 MCP 面也能隔离,属**未交付项**。
|
|
455
|
+
3. 「`claimed+running ≤ workers`」是**结构论证**(名额先于 claim、各失败路径均 release)+ 20Hz 采样实测,**不是穷尽形式证明**。
|
|
456
|
+
4. **H-3 相邻的既有写路径隐患**(非本批引入、本批交付边界外):任务运行中 `status.json` 变坏时 `run_job` 末尾 `let _ = job::patch_status(…)` 会静默失败、**终态不落盘**——该任务仍被 doctor 归 `corrupt`,不算完全静默,但「终态丢失」本身无人告警。
|
|
457
|
+
5. **工作区一致性瑕疵**(无功能影响):`hive/src/scheduler.rs` 工作树为 CRLF(1546 处)而同批改动的 `job.rs`/`main.rs` 为 LF;`scheduler.rs:45` 多插入一个空行(diff 产物)。
|
|
458
|
+
6. 同一工作区里其他未提交批次(H-4 拉起退避、H-6 依赖透传、`hive/exec.py` 与 `rust/` 改动)**不在本次复核范围**,未评估。
|
|
459
|
+
|
|
460
|
+
### 5.3 H-4 —— **ACCEPT**
|
|
461
|
+
|
|
462
|
+
**复核基础(摘要)**:全部判据由复核员自跑。①FI-M04:`run_all.py -k m04` → `[一致] FI-M04 观测=pass 登记=pass`、ALL CONSISTENT、EXIT 0。②**目标级判据(自建 `MutOnRead` 注入 + 真·改动前对照 `git show HEAD:`)**:确定性注入下**现实现 green、改动前 RED**,崩点 `md_cg/weights.py:409 coverage_index`;真线程两种形态(默认 switchinterval、`1e-6`)写 1455–2702 条:**现实现 0 异常**,改动前各 1 次 `RuntimeError`。③逐位不变(独立 oracle):38 条只读路径、现实现两次不同夹具噪声底 0、与 HEAD 模块差异 0。④(复核自述写作「(c) E2E」=**本报告的 H-4③**,见 §0.3 编号对照)自建假端点 + 真子进程——429×2(`Retry-After: 1`)→200:rc=0、端点实收 **3** 条、`llm_retries={attempts:3,retries:2,last_outcome:recovered}`、两次 wait=1.0;首次 400 ⇒ rc=3、**1** 条、无 `llm_retries`;连续 503 ⇒ rc=3、3 条(有界)、`last_outcome=failed`。⑤(复核自述写作「(f)」=**本报告的 H-4②**):`cargo test -- spawn` 6 passed/0 failed。⑥Rust 反向对照(把 `SPAWN_MAX_ATTEMPTS` 由 3 改回 1)⇒ 6 项中 3 项转红,证明判据有判别力。⑦未越界:`md_cg` 与 `hive/exec.py` 零新增锁 / 消息化;`md_cg` 全部改动经 AST-unparse 核验就是 `list()` 包裹。⑧扫描器覆盖:`_domain_files()` = 402 文件、`scan_domain()` = 共享迭代点 112、**裸迭代 0**。⑨行为级交叉验证:38 条只读路径逐条注入并发写 → 38/38 clean。⑩守卫实跑 `38 通过 0 失败`、`--mutate` 12 处全按预期转红;`hive/test_h4_llm_retry.py` 正向 `32/32`、`--mutate` PASS。⑪收尾 `git status` 与开工同(59 条),未 `git add`/`commit`/`push`。
|
|
463
|
+
|
|
464
|
+
> **与前一稿的差别(本报告按当前结论改写)**:前一稿记 H-4 为 **BLINDSPOT**(止血面只切在 `sustain.py`,`diagnose()` 默认路径仍可复现)。那是**第一轮**(v1 只快照 sustain 四处)的判定;**v2 已把快照面扩到全 md_cg 域**(含 `weights.py` 四处、`refindex.py` 四处、`provenance.py:246` 等),故本节按当前复核结论记为 **ACCEPT**。
|
|
465
|
+
|
|
466
|
+
**它列出的 uncovered(逐条照录)**:
|
|
467
|
+
|
|
468
|
+
1. 快照**只消除 `RuntimeError`**,不消除并发下的**逻辑撕裂 / 丢更新**(实例级读写锁、写路径消息化属契约明确不做的设计级);复核员**未测**并发读的逻辑一致性。
|
|
469
|
+
2. 未找到第一轮『改动前的落盘基线件』(仓内搜索无命中),故用 `git show HEAD` 作 oracle(强于基线件:即真·改动前代码);LLM 侧无故障路径比对报告行内记录而非独立文件。
|
|
470
|
+
3. **未跑全量 python 套件与容器两栈**(按指示不重复全量/容器),仅跑本项相关守卫与 Rust 子集。
|
|
471
|
+
4. FI-M04 的动态『零 `RuntimeError`』判据本身**时序敏感**,其判别力由守卫 G4a 与确定性注入承担;FI-M04 读码断言为确定性基线。
|
|
472
|
+
5. **扫描器盲区探针**:变异 H-4a-8(`weights.py:483`)**未打红 G2g**(一次性注入被候选更早的路径消耗)、Rust e2e 用例在 `SPAWN_MAX_ATTEMPTS=1` 变异下**仍绿**(断言与常量取等而非 `>1`)——两处承重红项由其它断言给出,不影响本轮判定,**属可加固点**。
|
|
473
|
+
6. 工作区内另有 H-3/H-7/C-8 批次改动——非 H-4 面、默认配置下不生效(`MDCG_RETRIEVAL_PIPELINE` 未设时恒等变换),只对 H-4 相关改动做了越界核查。
|
|
474
|
+
|
|
475
|
+
### 5.4 C-8 —— **ACCEPT**
|
|
476
|
+
|
|
477
|
+
**复核基础(摘要)**:复核员自写探针(27 节点夹具)在**修前镜像树**上独立复现分裂(`search` `scanned=21` + `gates={s1:…}` vs 两条 RRF 路 `scanned=27`、`has_gates_key=False`);修后 8 个开关态下三路 `scanned` 与结果 id 序列**逐位相同**(27/27/27、21/21/21、18/18/18、24/24/24、4/4/4、24/24/24、21/21/21、27/27/27),默认态与修前逐位一致(零变更成立)。**「看起来接上了但行为分叉仍在」的反证**:把异桶节点用 causal 边二跳连到保留节点,S1b 开门时在 RRF 路**零泄漏**(`leak=[]`),S1b 关门时两节点三路均回归(夹具是活的)。守卫:修前镜像树 **FAILED 27 项 rc=1**(真能红);工作区 `ALL OK: 59 项 rc=0`;`--mutate` 未变异基线 0 红、M1..M8 实测 **26/11/6/11/21/16/4/1** 与表内 expect 逐条相等。既有守卫缺口独立复现:`test_retr_gates_prodpath` 在修前树上 `ALL OK: 9 项 rc=0`(假绿)。AST 级等价核验:`apply_retrieval_gates` 剥 docstring 后逐字相同;`search_rrf` 47 条语句中 45 条逐字未变,差异恰为 4 条新增 + 2 处 `**_gates_meta`;RRF 融合段逐字未动。既有测试未因本项转红(13 关键字 × `run_tests.py -k` 共 36 次模块执行全 rc=0;另直跑 28 个相关模块:27 PASS + 1 SKIP + 0 FAIL)。
|
|
478
|
+
|
|
479
|
+
**它列出的 uncovered(逐条照录)**:
|
|
480
|
+
|
|
481
|
+
1. **未跑全量套件与容器腿**(按 ask「不要重复跑全量」)。
|
|
482
|
+
2. **未在在役认知图库上做候选集对照**(全部为 `%TEMP%` 实验库),故分裂在在役库上的具体幅度**未测**。
|
|
483
|
+
3. **未执行 `cg(op=route)`**(该端工具面无 mdcg 工具,也未走进程内直调兜底)——如实声明。
|
|
484
|
+
4. **残余 A:`MDCG_HOTCACHE=1` + 运行期翻子开关 ⇒ 候选面会再度分叉。** 实测:同进程同 query,rrf 首次 `scanned=21`,随后置 `MDCG_GATE_S1B_BUCKET=1` ⇒ rrf 第二次 `scanned=21、cached=True`,而同一时刻 `search` `scanned=4`。机制:query 热缓存只在 `search_rrf` 读(`mdcos.py:1340-1367`),`search` 全程不读该缓存;`hotcache._ENV_SWITCHES`(`hotcache.py:63-65`)只登记总开关、不含 S1/S1b/S2/S4 子开关。新守卫在 `_Env` 里强制 `MDCG_HOTCACHE=0` ⇒ **该态不被任何测试覆盖**;影响被 `QUERY_TTL=300s` 限界,且该配置为**显式 opt-in**(`mdcos.py:363-366` 默认关)。相对修前基线(分裂 100% 发生)本项仍是净改善,故不判 DEFER/REJECT,**建议后续把子开关登记进 `_ENV_SWITCHES` 或写入契约**。
|
|
485
|
+
5. **变异表 8 条只对 3 个函数**(`MdCGOS.search_rrf` / `MdCGSecure.search_rrf` / `MdCG.search` 的接线点)做定点替换,**未覆盖「未来新增第四读入口」这一复发形态**(契约 §4.1 只给了人工登记纪律 + P6 文本匹配)。
|
|
486
|
+
|
|
487
|
+
---
|
|
488
|
+
|
|
489
|
+
## 6. 边界与未覆盖
|
|
490
|
+
|
|
491
|
+
### 6.1 R-7 专节:**打红探针**(它的唯一真判据)+ 缺产物时显式 SKIP 的实测
|
|
492
|
+
|
|
493
|
+
> R-7 修的是「门禁覆盖缺口」,所以它**没有可被静态核对的目标产物**——「两条腿被接进门禁并**真会红**」只能由**打红探针**证明。以下是本报告亲自跑出的证据(命令:`python -X utf8 scripts/test_gate_rust_legs.py --probe` ⇒ 末行 `打红探针:PASS`,`$?`=0)。
|
|
494
|
+
|
|
495
|
+
**6.1.1(本报告实跑)打红探针逐条输出**
|
|
496
|
+
|
|
497
|
+
```
|
|
498
|
+
OK P1 腿①真红(真 cargo,临时 crate 内必失败用例):rc=1
|
|
499
|
+
OK P1b 腿①经门禁链(桩 cargo 进 GATE_RUST_CARGO,链尾复跑):rc=1;腿①[FAIL]=True;腿②未被跑到=True
|
|
500
|
+
OK P2 腿②真红(真二进制 + env MDCG_SCORE_MODE=legacy):rc=1
|
|
501
|
+
!! 真门禁未到达腿②(更早的腿已判红,9.2s)—— 退到**链尾**复跑同一注入
|
|
502
|
+
门禁旁的既有红项(非本探针):[FAIL] R4 非追踪件面 命中=3;非追踪=31,允许=28
|
|
503
|
+
OK P3 端到端(链尾):口径冲突 ⇒ rc=1(0.4s);腿②[FAIL]标记=True
|
|
504
|
+
OK P4 还原后复跑(链尾,无口径 env)⇒ rc=0(0.5s);腿①[PASS]=True 腿②[PASS]=True
|
|
505
|
+
NOTE P4b 真门禁整体:rc=1 —— 红项**不属于本探针**(本批并发改动面)
|
|
506
|
+
打红探针:PASS(红确实由接进来的腿造成,还原后门禁回绿)
|
|
507
|
+
```
|
|
508
|
+
|
|
509
|
+
读法:**红是真红**(P1 真 cargo 必失败用例 rc=1;P1b 经门禁链尾 rc=1 且腿②**未被跑到** ⇒ 真 `&&` 短路;P2 真二进制 + 口径冲突 rc=1),**还原是真绿**(P4 链尾 rc=0、两腿 `[PASS]`)。**唯一缺口**:在本工作区跑不到「真 `npm run gate` 整体 rc=0」——真门禁在**更早的腿**(R4 非追踪件面)就中断(§4.5),故 P3/P4 退到**链尾**(链尾命令文本不是另抄一份,而是从 `package.json` 的 gate 串里取腿①起的尾部原样执行)。P4b 如实打印「整体 rc=1 且红项非本探针」。
|
|
510
|
+
|
|
511
|
+
**6.1.2(【工作流采集】)同一探针在隔离副本上的完整红→绿**:把工作树整体复制到系统临时目录(剔除 3 个无关未追踪件)后跑真 `npm run gate`:基线 **RC=0** → 口径漂移 **RC=1**(腿②[FAIL] rc=3)→ `rust/src/lib.rs` 追加必失败用例 **RC=1**(腿①[FAIL] rc=101,腿②未被跑到)→ 完全还原(`diff` IDENTICAL)**RC=0**。⇒ §6.1.1 的缺口在隔离副本上被补齐;**本报告未重跑该副本实验**,如实标来源。
|
|
512
|
+
|
|
513
|
+
**6.1.3(本报告实跑)两条腿单独正向读数**(`python -X utf8 scripts/gate_rust_crate_test.py` / `…/gate_rust_parity.py`)
|
|
514
|
+
|
|
515
|
+
```
|
|
516
|
+
[PASS] cargo test rc=0:27 passed / 0 failed(用时 0.2s) → 本腿汇总:计入通过数 1 / 跳过 0 / 退出码 0
|
|
517
|
+
[PASS] rank_parity rc=0(用时 0.2s)—— 两侧同口径逐位一致
|
|
518
|
+
| 语料节点 ~30 · queries=10 · exe=…\rust\target\release\mdcg-eval.exe · unify=1(默认开) · score=jaccard=rust jaccard(两侧显式钉住)
|
|
519
|
+
| 逐位一致 10/10 · 集合一致 10/10 · top-1 一致 10/10 → 本腿汇总:计入通过数 1 / 跳过 0 / 退出码 0
|
|
520
|
+
```
|
|
521
|
+
|
|
522
|
+
**6.1.4(本报告实跑)「缺产物 / 缺工具时是显式 SKIP、且不计通过」的实测**
|
|
523
|
+
|
|
524
|
+
| 场景 | 命令 | 实测输出要点 | rc |
|
|
525
|
+
|---|---|---|---|
|
|
526
|
+
| 腿①:cargo 不在位(`PATH=""`,真实现场形态) | `PATH= <python> -X utf8 scripts/gate_rust_crate_test.py` | `[SKIP] cargo 不在位(PATH 未命中 / --cargo=None) —— 本腿不计入通过数` + 补救 `cd rust && cargo test` + `本腿汇总:计入通过数 0 / 跳过 1 / 退出码 0(SKIP ≠ 通过)`,**不出现 `[PASS]`** | **0** |
|
|
527
|
+
| 腿②:缺产物 + `--build never` | `python -X utf8 scripts/gate_rust_parity.py --exe <不存在> --build never` | `[SKIP] rust release 二进制不存在:… —— --build never:产物缺失即 SKIP(外部产物模式);本腿不计入通过数` + 补救 `cd rust && cargo build --release` + `计入通过数 0 / 跳过 1 / 退出码 0`,**不出现 `[PASS]`** | **0** |
|
|
528
|
+
| 腿②:缺 cargo(`--build auto`,既无产物也不能构建) | 守卫 G2k(本报告实跑) | 显式 `[SKIP]`、理由 `cargo 不在位:既无产物也不能构建`、`计入通过数 0`、`[PASS]` 缺席 | 0 |
|
|
529
|
+
|
|
530
|
+
⇒ **「跑不起来 = 绿」被机械排除**:SKIP 一律配 `计入通过数 0` 且**永不出 `[PASS]`**。**语义边界(契约偏离 1)**:缺省 `--build auto` 下**缺产物**走 `[BUILD]`(构建成功即继续对拍、失败即 `[FAIL]`),SKIP 只属于「缺工具 / `--build never` / harness 缺失 / harness rc=2」这四类。
|
|
531
|
+
|
|
532
|
+
**6.1.5(本报告实跑)注释订正与锚点判别力**:失实原话(`缺省 jaccard(长度自惩罚),与 Python SCORE_MODE 缺省一致` 与头 doc 的 `mdcg.SCORE_MODE 缺省一致`)**已不在** `rust/src/main.rs`(G5d/G5f 的判红条件即此);CH-1 的锚点 `jaccard: true, // 缺省 jaccard`(`md_cg/test_rank_parity_score_mode.py:114`)在订正后仍逐字命中 `rust/src/main.rs:106`(G5a/G5b 实跑通过);判别力实证(把该字面量改成 `false` ⇒ CH-1 守卫唯一红项 G3k,还原后 40/0)为【工作流采集】。
|
|
533
|
+
|
|
534
|
+
**6.1.6 R-7 未覆盖/未验证(合并 §5.1 的 uncovered)**:CI 与容器腿未重跑、POSIX 行为未测(本机 win32)、NFC 只核了 3 个新文件路径;腿②的**陈旧盲区**(源码改了但盘上二进制仍能报 `info.score` 时对拍照样绿)**未消除**;腿①的 27 个 crate 测试**不是** Python↔Rust 口径对拍;CI 无 rust 工具链 ⇒ 现行保障实为**开发机本地**兜底。
|
|
535
|
+
|
|
536
|
+
### 6.2 H-4 专节:**只做止血,根治(线程模型)不在本批**
|
|
537
|
+
|
|
538
|
+
**边界原文级依据(本报告实读)**:守卫文件头 `md_cg/test_h4_sustain_snapshot.py:5-10`:
|
|
539
|
+
|
|
540
|
+
> 「来源:设计者裁定的 H-4(a) 契约——**只做止血**:凡从 `cg.index` 取回 `nodes` 后在**取用前先取快照**……使并发写不再触发 `RuntimeError`,且**既有判据与结果逐位不变**(只换取用方式,不改语义)。**实例级读写锁 / 写路径消息化 / 线程模型重构属设计级,本批刻意不做;`SustainLoop._lock` 覆盖范围未扩。**」
|
|
541
|
+
|
|
542
|
+
**本批怎么把这句话变成机械判据**:守卫 **G0** 断言 `sustain.py` 里 `with self._lock:` **仍恰 4 处**(本报告实跑:PASS)——即「不改并发契约」这一条不是口头承诺,而是被一条断言钉住;同时 **G3** 用 38 条只读路径的**逐字节相同**证明「只换取用方式、语义未变」。
|
|
543
|
+
|
|
544
|
+
**边界的确切含义(不夸大、不缩小)**:本批消除的是 **`RuntimeError: dictionary changed size during iteration` 这一类崩溃**(目标级判据 G4a/G4b/G4c 实跑:确定性注入下不抛、真线程两形态零异常;对照组在 `weights.py:409` 必抛 ⇒ 判据有判别力)。**本批不消除**:并发下的**逻辑撕裂 / 丢更新 / 读到的不是一致快照**(§5.3 uncovered ①)——那属「实例级读写锁 / 写路径消息化 / 线程模型重构」,**须单独立项**。同理,`hive/src/scheduler.rs:649-651` 明确列出 spawn 侧**不做**的三项:拉起失败的分类治理、worker 池自愈、把 spawn 失败降级为「任务重投 pending」。
|
|
545
|
+
|
|
546
|
+
**留给后续的可加固点(§5.3 uncovered ⑤)**:扫描器盲区(一次性注入被更早路径消耗,致 H-4a-8 未打红 G2g)与 Rust e2e 用例在 `SPAWN_MAX_ATTEMPTS=1` 下仍绿(断言与常量取等而非 `>1`)——两处承重红项由其它断言给出,不影响本轮判定。
|
|
547
|
+
|
|
548
|
+
### 6.3 C-8 专节:**不过门控是缺陷,还是有意设计?** —— 定性结论:**缺陷(未声明的行为分叉)**
|
|
549
|
+
|
|
550
|
+
四面证据(本报告实跑/复核):
|
|
551
|
+
|
|
552
|
+
1. **没有任何现行文档声明过「RRF 不带门控」**:本报告实跑 `git grep -n "search_rrf" -- "*.md"` ⇒ 共 **44 处**命中;再筛「与门控 / gates / 收敛同现」⇒ 只剩 **3 处**——`docs/hive/检索路径与认知结构契约_v0.1.md:83/:89`(**本批新增的 §4.1 表**,见 §1.4 的 `git diff --stat`:该文件本次改动 +20 行全是这一节)与 `docs/theory/概念分层对应表_v0.1.md:59`(讲 `judge_ranking`,与门控无关);再筛「有意 / 刻意 / 设计为 / 不接门控 / 无门控」⇒ **零命中**。⇒ 「RRF 是无门控融合面」这一说法**在本批之前从未被写下来过**——它既不是契约,也不是设计文档的记录。
|
|
553
|
+
2. **契约的目标形态说的是另一种事**:`docs/hive/检索路径与认知结构契约_v0.1.md` 的规则是「检索 = 六阶段逐级收敛」「总开关关时 `search()` 走原路径」——按收敛语义,**所有读入口**都在门控适用面内;修前只有 `search` 一侧被覆盖,属**未声明的行为分叉**。
|
|
554
|
+
3. **同工具内由参数静默切换候选面**:`md_cg/mcp_server.py:2194`(有 `budget_tokens` → `recall` → `search_rrf`,**修前不吃门控**)与 `:2202`(无 `budget_tokens` → `search`,**吃门控**)是**同一个 `cg(op=read)`**,两路共用同一份 `_candidates` 资格面;调用方无法从返回值分辨自己走的是哪条面(修前 RRF 路 `meta` 连 `gates` 键都没有)。
|
|
555
|
+
4. **既有守卫的自述**:`md_cg/test_retr_gates_prodpath.py:13-14` 明写其目的是「防止未来再写出**第三个**不含门控的覆写(本病灶的复发形态)」——而 `search_rrf` **正是第三路**(该守卫 P4 只断言 `MdCGOS.search` 与 `MdCG.search`,见 §2.4「守卫缺口」条:修前树上它 `ALL OK: 9 项`)。
|
|
556
|
+
|
|
557
|
+
**⇒ 结论**:RRF 路不过门控是**未声明的行为分叉**,**不是有意设计**;这正是本批择「接线(复用共享单点)」而非「显式记录差异」的理由——反支无任何现行文档支撑,且需先写进契约。
|
|
558
|
+
|
|
559
|
+
**同时必须记住的两条边界**:(a) 分裂**只在 `MDCG_RETRIEVAL_PIPELINE=1` 显式开启时**显现,默认态逐位不变(§2.4「默认态零变更」条);(b) 门控**不是召回无损**(`mem_900` 被收敛剔除),「RRF 是否接受该召回损失」属**定性裁决**,本报告不代裁(§6.4 第 7 条)。**另有一条文档不准**:契约 §4.1 与 `mdcos.py:1321-1322` 说「RRF 入口的对应物是 `reach`」,本报告实跑 `inspect.getsource(MdCGOS.search_rrf)` ⇒ 274 行里 `reach` **只出现 1 次(就是那句 docstring 本身)**,而 `MdCGOS.search` 里出现 **23 次**并含真实调用——该句在码面无对应路径,读者会误以为 `search_rrf` 走 `reach`。**属文档问题,留池(§6.4 第 5 条)。**
|
|
560
|
+
|
|
561
|
+
### 6.4 本轮明确不修而留池的面
|
|
562
|
+
|
|
563
|
+
| # | 项 | 现状 / 证据 | 归属 |
|
|
564
|
+
|---|---|---|---|
|
|
565
|
+
| 1 | **H-4 的线程模型根治** | 本批刻意不做(实例级读写锁 / 写路径消息化 / 线程模型重构);`_lock` 覆盖范围未扩,由守卫 G0 钉住(§6.2) | run owner(单独立项) |
|
|
566
|
+
| 2 | **并发下的逻辑撕裂 / 丢更新** | 快照只消除一类崩溃,不消除不一致读(§5.3 uncovered ①) | run owner |
|
|
567
|
+
| 3 | **`hive kill` 的时限承诺文案** | 两处文案并存:CLI 回执 `hint`(`main.rs` HEAD `:517` / 工作区 `:539`,起点=「检测到标志后」)与 `hive/README.md:159`(`hive_kill`「≤1s 内强杀」,**无起点**)。**对 claimed 未开跑态两处都结构不可达**(无 worker 持有 ⇒ 永不开始计时,§1.2);对 running 态端到端实测 1.41s(§2.2 复现腿3)与 CLI 相容、与 README 字面相抵 | run owner(下一批改文案:补起点限定,或给 claimed 态补一句「未开跑任务的 kill 由下一次领取时生效」) |
|
|
568
|
+
| 4 | **H-7 方案 (a) 下 claimed 仍无 pid/心跳** | 结构上如此(pid 仅在 spawn 成功后写:HEAD `:475` / 工作区 `:799`);**修后 claimed 态仍不可被外部区分「在跑/在队里等」**,但方案 (a) 把该态压到亚拍级交接窗;「kill 对已领取未开跑者生效」**既未被承诺、也未被实测**(注意:这里说的是「生效」,与第 3 条的「回执时限文案」是两件事) | 记账(若要 claimed 态也可被 kill,属方案 (b),见 §3.2 的择支论证) |
|
|
569
|
+
| 5 | **C-8 契约/文档措辞与码面不符** | 「RRF 入口的对应物是 reach」在 `search_rrf` 码面无对应路径(§6.3 末段) | 文档订正(下一批或就地) |
|
|
570
|
+
| 6 | **C-8 残余 A:`MDCG_HOTCACHE=1` 下运行期翻子开关 ⇒ 分叉再现** | 单点实测 rrf `scanned=21、cached=True` vs 同时刻 search `scanned=4`;新守卫强制 `MDCG_HOTCACHE=0` ⇒ 该态**无任何测试覆盖**(§5.4 uncovered 4);受 `QUERY_TTL=300s` 限界、显式 opt-in | run owner(建议把子开关登记进 `_ENV_SWITCHES` 或写入契约) |
|
|
571
|
+
| 7 | **C-8 门控的召回损失属定性裁决** | gated `search` 丢掉 ungated 下排第 1 的 `mem_900`(域/桶标签与正文矛盾) | run owner |
|
|
572
|
+
| 8 | **「未来新增第四读入口」这一复发形态** | 变异表只覆盖现有 3 个函数的接线点;契约 §4.1 只给人工登记纪律 + P6 文本匹配(§5.4 uncovered 5) | 机制性留池 |
|
|
573
|
+
| 9 | **R-7 两条腿在 CI 上会 SKIP** | CI 无 rust 工具链 ⇒ 回归保障实为**开发机本地**兜底(§5.1 uncovered 5);另 `md_cg/test_rank_parity_score_mode.py` 缺 release 二进制时 fail-closed,而 `run_tests` 的 `_SKIPS` 无该目标 ⇒ **CI 侧疑似红基线**(未在 CI 验证) | 编排 / CI 侧 |
|
|
574
|
+
| 10 | **门禁整体当前为红(R4 非追踪件面)** | 三个未追踪件(两个本批守卫 + 本报告文件)被放行/入库之前,本工作区无法复现「门禁绿」(§4.5、§5.1 uncovered 4) | 编排(`git add` 或调整发布面) |
|
|
575
|
+
| 11 | **H-3 相邻的既有写路径隐患** | 任务运行中 `status.json` 变坏时 `run_job` 末尾 `patch_status` 静默失败 ⇒ **终态丢失无人告警**(§5.2 uncovered 4) | 非本批引入,记账 |
|
|
576
|
+
| 12 | **MCP 面无隔离动作** | `hive/hive_mcp/mcp_server.py` 的 H-3 镜像只读码核对、未执行;无 `quarantine`/`unquarantine` 动作,note 指向 CLI(§5.2 uncovered 2) | 若要求 MCP 面亦可隔离,属**未交付项** |
|
|
577
|
+
| 13 | **工作区编码/换行一致性瑕疵** | `hive/src/scheduler.rs` 为 CRLF(1546 处)而同批 `job.rs`/`main.rs` 为 LF;`scheduler.rs:45` 多一个空行(§5.2 uncovered 5) | 无功能影响,记账 |
|
|
578
|
+
| 14 | **越界披露(实施轮自陈,须转交 owner)** | R-7 实施轮为满足「会话起始先查记忆」的一次直调,向**在役根**下的 `_keys.json` 写入了新增 DEK 信封(`envelopes/default|r7-impl`;内容面零写入、既有 `system` 信封未损、未做修复写)。**正确做法**:路由前把 `MDCG_ROOT` 指向临时根,或声明降级不触碰在役根。**本报告撰写期间未做任何 `cg(op=route)` 调用、未打开在役认知图根**(§6.5) | **run owner** |
|
|
579
|
+
|
|
580
|
+
### 6.5 本报告自身的边界
|
|
581
|
+
|
|
582
|
+
- **未重跑**:容器两栈(§4.4 已说明 Docker 在位但未跑的理由,以及 `full` 模式会向工作区 `hive/target/release/` 拷入容器产物这一硬边界冲突);CI;POSIX 下守卫行为。§4.4 的数字**全部为【工作流采集】**,栈二的 `# pass` / `# fail` 本报告**无权代填**(采集面被 `slice(-4)` 切掉)。
|
|
583
|
+
- **本报告实跑的全部命令**(cwd=`<repo>`,`PYTHONUTF8=1`):四份守卫正向 / 四份守卫的变异自证 / R-7 `--probe` / 两条腿单独正向 / 两条腿的 SKIP 形态 / `scripts/run_tests.py` 全量 / `git show HEAD:` 逐条复核 / grep 类读码。逐条读数见各章,命令清单见附录。
|
|
584
|
+
- **未在役认知图根上做任何查询**:本报告未调用 `cg(op=route)`(本会话工具面无该工具),也**未打开在役根**(理由同 §2.1 腿F:构造即 `provision_dek` 写根)。⇒ **本次未读到在役记忆**。
|
|
585
|
+
- **未改**:未 `git add` / `commit` / `push`;未改任何源码;只落盘本文件一行。全部实验的编译产物与夹具落在系统临时目录(`rust/target` 零写入;`hive/target` 未触)。
|
|
586
|
+
- **无明文凭据**:全文不含任何密钥/令牌值;涉及密钥面处一律只描述「哑主密钥」「哑 API key」等形态,**不录值**。
|
|
587
|
+
|
|
588
|
+
---
|
|
589
|
+
|
|
590
|
+
## 7. 读者反馈逐条处置(修订 r2)
|
|
591
|
+
|
|
592
|
+
> 编排方转来三组反馈:`unclear` 8 条、`unsupported` 3 条、`nextQuestions` 9 条。逐条给出**处置**(补证据 / 改措辞 / 说明不改)与**落点**;凡本报告无权决断的(范围、立项、对外口径、补跑、仓库状态变更),一律写明归属,不代裁。
|
|
593
|
+
|
|
594
|
+
### 7.1 `unclear`(8 条)
|
|
595
|
+
|
|
596
|
+
| # | 读者要点 | 处置 | 落点 |
|
|
597
|
+
|---|---|---|---|
|
|
598
|
+
| 1 | 「腿」至少指三种东西(门禁链/R-7 复现/H-3·H-7 复现),另有「栈」 | **补定义 + 改措辞**:新增 §0.1 固定四种所指;§1.1/§2.1/§2.2 各加限定词说明 | §0.1、§1.1、§2.1、§2.2 |
|
|
599
|
+
| 2 | `N138`/`CH-1`/`S3`/`S7`/`k50` 首现即当已知量;契约本体不在仓内 | **补出处**:新增 §0.2 标识符图例(逐个给「是什么+出处」,仓外的如实注明:清单原件不在本仓;CH-1 是上一批新起的编号);`S3`/`S7` 在 §1.4 首现处加定义块;`k50` 在 §0.2 定义并在 §2.4 使用 | §0.2、§1.4、§2.4 |
|
|
600
|
+
| 3 | 契约条款字母与正文标签撞号:H-4 的 (c) 在两处指不同事;「④ 要求」全文只出现一次且无清单 | **补清单 + 改措辞**:新增 §0.3 开列三套编号体系(交付要求 ①–⑥/契约条款字母/本报告自编 H-4①–③),并声明本版**正文不再出现裸字母引用**;「④」改为「交付要求 ④」并在 §0.3 给出六项清单;§1.3、§3.3 的 H-4 条目改称 H-4①/②/③;§5.3 照录复核自述的 (c)/(f) 时加对照标注 | §0.3、§1.3、§3.3、§5.3 |
|
|
601
|
+
| 4 | 「非 `h` 前缀即天然退出领取面」的约定全文未交代 | **补证据**:给出约定依据——`hive/src/job.rs:362-374` `list_jobs` 只收 `h` 前缀目录,领取面与统计面都只遍历它的输出;并补 `doctor` 另列 `quarantined` 的原因(`main.rs:770-772` 源码注释) | §3.2 |
|
|
602
|
+
| 5 | 「变异表同步 3→4 红项」指哪一处不明,全表增量也不是 +1 | **改措辞**:文首该条改为逐点说明——(i) 原有第 9 条变异预期 3→4(新增 `G5f` 也被它命中);(ii) 新增第 11 条变异(2 项) | 文首订正条、§4.2 |
|
|
603
|
+
| 6 | 「≤1s」计时起点不明,实测 1.41s/1.17s 算不算违约无判断 | **补判断**:给出两处文案与各自起点(CLI 回执=「检测到标志后」;`hive/README.md:159` =无起点的「≤1s 内」),并分 running/claimed 两态给结论(§1.2);同步改正全篇对 hint 行号的引用(HEAD `:517`/工作区 `:539`) | §1.2、§2.2、§3.2、§6.4 第 3/4 条 |
|
|
604
|
+
| 7 | `doctor` 修后「文件缺失」那类叫什么、与 poll/MCP 是否同名,未交代 | **补证据**:新增一行三态命名对照(`corrupt`/`no_status`/`unknown` 含义收窄),逐个给行号(doctor `main.rs:742`/`:753`、poll `:439`/`:450`、MCP `mcp_server.py:465`/`:468`/`:658`/`:674`) | §2.2 |
|
|
605
|
+
| 8 | 「与本批的代码与测试无关」与同节命中原样输出相抵(3 个命中里两个就是本批守卫) | 见 §7.2 第 2 条(同一条,重复计) | §4.5 |
|
|
606
|
+
|
|
607
|
+
### 7.2 `unsupported`(3 条)
|
|
608
|
+
|
|
609
|
+
| # | 读者要点 | 处置 | 落点 |
|
|
610
|
+
|---|---|---|---|
|
|
611
|
+
| 1 | §1.4 表格 `MdCGSecure.search_rrf` 一格「先 4164 又 4191,再断言行号未移」自相矛盾 | **确认为真错,已改**:该行改为「修前 `:4164` → 修后 `:4191`,**行号 +27,确实位移**(上方 `MdCGOS.search_rrf` 体新增接线行与 docstring 使后续下移)」 | §1.4 |
|
|
612
|
+
| 2 | 「与本批的代码与测试无关」文本不支持(3 个命中里两个是本批新增守卫) | **确认为真错,已改**:§4.5 现写「**红是「本批新增文件的 git 追踪状态(未 `git add`)」触发的,而不是这些文件的内容/断言失败、也不是本批源码或既有测试出问题**——本批的四份守卫与全量套件在同一棵树上都是绿的。即:**红因是登记状态,不是行为**」;标题也一并改为「红因是未追踪登记状态(非本批判据)」 | §4.5(标题+正文) |
|
|
613
|
+
| 3 | H-4 的 41/80/112 三个扫描数字无法互印,报告未给口径 | **补证据(本轮新测)**:新增「A-scan 口径更正」块——用守卫同一 AST 扫描器分别在 HEAD 与工作区各扫一次:**HEAD 400 文件/112 处共享迭代点/84 处未取快照(生产 59 + 测试 25);工作区 402/112/0**;说明「112 两棵树相同 ⇒ 本批没新增迭代点」「41 是窄口径(不追踪参数透传)的读数」「80 与 84 的差 4 处在生产面、**未逐点点名,记为未闭合**」;旁证 `git diff -U0 -- md_cg/ \| grep -c "^+.*list("` = 85(含 1 行注释)。§1.3、§3.3 的「80 处」同步改为双数并列 | §2.3、§1.3、§3.3 |
|
|
614
|
+
|
|
615
|
+
### 7.3 `nextQuestions`(9 条——能给的部分给出,其余写明归属)
|
|
616
|
+
|
|
617
|
+
| # | 读者问 | 本报告能给什么(含证据) | 归属 |
|
|
618
|
+
|---|---|---|---|
|
|
619
|
+
| 1 | 四项里哪几项在**默认部署**下真的改行为?谁会开 `MDCG_RETRIEVAL_PIPELINE=1`?C-8 的用户可见收益是什么 | **逐项**:R-7 = **不改运行时行为**(只改门禁判定面,提交前置检查多两条腿);H-3/H-7 = **默认即生效**(serve 主循环语义变:领取上界 ≤ workers、坏 status 告警/标记/隔离、doctor/poll 三态);H-4 = **默认即生效**(`MDCG_SUSTAIN` 缺省开)但**判定结果逐位不变**(守卫 G3);C-8 = **默认恒等变换**(守卫 P2 逐位验证)。**谁开总开关:本报告查不到**——在役部署清单不在本仓(契约 §3 只写「默认关;每阶段可单独开,便于逐项验证与归因」)。C-8 的收益(在显式开启的前提下):两条读路径候选面**不再按参数静默切换**、`meta.gates` 可审计 | 部署侧 / run owner |
|
|
620
|
+
| 2 | R-1/R-3/R-4 那类漂移现在拦得住没有?是不是还得人肉重编 | **部分拦住、但不是全拦**:腿②在**产物与源码一致**时能拦(本报告实跑:缺省 10/10;注入 `MDCG_SCORE_MODE=legacy` ⇒ 腿② rc=3 红);CH-1 守卫(在全量套件内)也能拦,但**需要 release 二进制在位**(缺则 fail-closed)。**拦不住**「改了源码没重编」这一形态(腿②跑盘上二进制)——需一次重编,或由 harness 按 `serve info.score` 回读面判 `rc=4`;腿①的 27 个 `cargo test` **不是**两侧口径对拍。⇒ 不是「只有人肉重编」,但**依赖产物刷新**,且 CI 目前无 rust 工具链 | 编排(CI 装工具链)/run owner |
|
|
621
|
+
| 3 | `git add` 之后 R4 是否立刻变绿?谁做、按什么口径放行 | **推演(本报告禁 `git add`,未实测)**:`scripts/check_publish_artifact.py:596-602` 的判据是 `untracked = pkg_set - tracked`、`bad = [p for p in untracked if not allowed_nontracked(p)]`,白名单 `ALLOW_NONTRACKED = ("lib/",)`(`:46`)。3 件被追踪后不再出现在 `pkg_set - tracked` ⇒ `bad` 变空 ⇒ R4 PASS,链会继续走到腿①②。**放行的口径与操作人=编排**(本报告不能改仓库状态) | 编排 |
|
|
622
|
+
| 4 | 本地 267/267 与「CI 疑似红基线」如何并存?该守卫那次是 PASS 还是 SKIP?要不要进 `_SKIPS` 或给 CI 装 rust | **并存的原因是环境不同**:本报告实跑全量日志第 148 行=`PASS md_cg.test_rank_parity_score_mode`(本机 release 二进制在位 ⇒ 真跑并 PASS,**不是 SKIP**);而 `scripts/run_tests.py:139-146` 的 `_SKIPS` **不含**该目标,CI(`python-tests.yml` 无 rust 构建步)下它会 fail-closed。⇒ 二选一:给该目标加 skip 条件,或给 CI 装 rust 工具链——**两案都不是本报告能做的改动** | 编排 |
|
|
623
|
+
| 5 | 容器栈二补跑?栈一「21/38」的包含关系能否给行级证据 | **栈一给了行级组成**(本报告读脚本所得):38 = 1 `cargo test` + 1 `cargo build --release`(full)+ 23 个 `md_cg.*` + 4 个 `hive/test_*.py` + 7 个 `--head-baseline/--branch-baseline` 自证 + 1 个 hive 自证 + 1 个 smoke;21 是 smoke 子项自报(详见 §4.4 的表)。**栈二补跑(取 `# tests/# pass/# fail`)=编排** | 编排 |
|
|
624
|
+
| 6 | C-8 的召回损失谁裁、按什么标准、裁决前是否维持默认关 | **事实**:门控默认关(`README.md:341`),本批未改缺省;标准属契约 §5 的「既有召回用例不劣化」是否覆盖「域/桶标签与正文矛盾」这类样本——**属定性裁决**。本报告不代裁,也不改默认值 | run owner |
|
|
625
|
+
| 7 | `hive kill` 回执要不要只改文案、还是同时补 claimed 态语义 | **本轮已把两处文案、起点、两态判断写清**(§1.2 判断段、§6.4 第 3 条):claimed 态是**结构不可达**(无 worker 持有 ⇒ 永不开始计时),不是超时。建议下一批:文案补起点限定,或明确「未开跑任务的 kill 在下次领取时生效」;是否同时给 claimed 补心跳/状态,属方案 (b) 的范围决策 | run owner |
|
|
626
|
+
| 8 | 两笔池里的账谁收口:① 运行中 `status.json` 变坏致终态静默丢失;② 在役根 `_keys.json` 新增 DEK 信封 | **事实**:① 属既有写路径(非本批引入),本批只把该任务归到 `corrupt` 观测面,**没有**把「终态丢失」变响;② 该写入发生在 **R-7 实施轮**(向在役根增加 `envelopes/default\|r7-impl`),**本报告撰写期间未调用 `cg(op=route)`、未打开在役根**,故**未复现、未触碰**。是否清理/校验(可机械核对的面:`envelopes` 键集合是否只多了这一项、既有密文是否仍可用原 DEK 解开)**属 owner 的操作决定**,本报告不代做 | run owner |
|
|
627
|
+
| 9 | 报告多处与「前一稿」对比,但该稿已被本文件覆盖、读者手上没有 | **如实说明**:前一稿是**同路径的未追踪文件**(`git status` 显示 `?? docs/eval/优化第三批_…_v1.0.md`),本版落盘即覆盖,且它**从未被 git 追踪** ⇒ **无副本、无 diff 可提供**(本报告无法凭空重放它)。**可替代的对照**:本版在**文首订正条、§4.2 末段、§5.1 uncovered 6、§5.3 注**四处给的是**前后成对的数值**(47→49 断言、11→12 变异、674→712 行、BLINDSPOT→ACCEPT、80→84=59+25),每条都附本版实测读数与站点,读者可就地核对;头注释订正可直接看 `git diff -- rust/src/main.rs`(本报告实跑:13 行改动**全在注释内**) | 已说明(无可重放物) |
|
|
628
|
+
|
|
629
|
+
---
|
|
630
|
+
|
|
631
|
+
## 附 · 本报告实跑命令与关键读数
|
|
632
|
+
|
|
633
|
+
| 命令 | 退出码 | 关键读数 |
|
|
634
|
+
|---|---|---|
|
|
635
|
+
| `python -X utf8 scripts/test_gate_rust_legs.py` | 0 | `49 通过,0 失败,0 跳过` |
|
|
636
|
+
| `python -X utf8 scripts/test_gate_rust_legs.py --mutate` | 0 | 12 处 `红项=预期`(2/2/2/2/1/2/5/1/**4**/1/2/1);基线 0;`PASS` |
|
|
637
|
+
| `python -X utf8 scripts/test_gate_rust_legs.py --probe` | 0 | `打红探针:PASS`(P1/P1b/P2 OK;P3/P4 走**链尾**;P4b NOTE 红项非本探针) |
|
|
638
|
+
| `python -X utf8 scripts/gate_rust_crate_test.py` | 0 | `[PASS] cargo test rc=0:27 passed / 0 failed`;`计入通过数 1` |
|
|
639
|
+
| `python -X utf8 scripts/gate_rust_parity.py` | 0 | `[PASS] rank_parity rc=0`;`逐位一致 10/10 · 集合一致 10/10 · top-1 一致 10/10` |
|
|
640
|
+
| `PATH= <py> -X utf8 scripts/gate_rust_crate_test.py` | 0 | `[SKIP] cargo 不在位…` + `计入通过数 0 / 跳过 1 / 退出码 0`,无 `[PASS]` |
|
|
641
|
+
| `python -X utf8 scripts/gate_rust_parity.py --exe <缺失> --build never` | 0 | `[SKIP] rust release 二进制不存在…` + `计入通过数 0 / 跳过 1 / 退出码 0`,无 `[PASS]` |
|
|
642
|
+
| `python -X utf8 hive/test_h3_h7_scheduler.py` | 0 | `27 passed, 0 failed`(A7/B4/C6/D4/E6) |
|
|
643
|
+
| `python -X utf8 hive/test_h3_h7_scheduler.py --branch-baseline` | 0 | 6 处 `红项=3/7/12/6/2/2`(组命中全对);`还原后重编译:ok`;`PASS` |
|
|
644
|
+
| `python -X utf8 -m md_cg.test_h4_sustain_snapshot` | 0 | `38 通过,0 失败,0 跳过`(G0 1/G1 13/G2 11/G3 8/G4 4/G5 1) |
|
|
645
|
+
| `python -X utf8 -m md_cg.test_h4_sustain_snapshot --mutate` | 0 | 12 处 `红项=预期`(3×4、2/3/2/2、3/3/2/2);基线 0;`PASS` |
|
|
646
|
+
| `python -X utf8 -m md_cg.test_c8_search_rrf_gates` | 0 | `ALL OK: 59 项`(P1 5/P2 7/P3 15/P4 4/P5 18/P5-2 5/P6 5) |
|
|
647
|
+
| `python -X utf8 -m md_cg.test_c8_search_rrf_gates --mutate` | 0 | 8 处 `红项=预期`(26/11/6/11/21/16/4/1);基线 0;`PASS` |
|
|
648
|
+
| `PYTHONUTF8=1 python -X utf8 scripts/run_tests.py` | 0 | `SUMMARY 267/267 通过,5 跳过`;五个新守卫全被自动发现并 `PASS` |
|
|
649
|
+
| `git show HEAD:package.json` | 0 | 修前 gate 仅 **6 条腿**(无 cargo / 无 rank_parity) |
|
|
650
|
+
| `git show HEAD:hive/src/scheduler.rs` | 0 | `:185` 无界 `mpsc::channel`;`:217` / `:302` 两处静默 `continue` |
|
|
651
|
+
| `git show HEAD:md_cg/mdcos.py` | 0 | `apply_retrieval_gates` 仅 `:33`(import)与 `:823`(search),`search_rrf` 零调用 |
|
|
652
|
+
| `git show HEAD:md_cg/sustain.py` / `weights.py` / `refindex.py` | 0 | 修前站点逐条复核(§1.3 表左列) |
|
|
653
|
+
| `git show HEAD:rust/src/main.rs` | 0 | `:99` 失实注释原文;取值仍 `true` |
|
|
654
|
+
| `git grep -n "search_rrf" -- "*.md"` + 门控同现筛 | 0 | 44 处命中中与门控同现者仅 3 处,其中两处是**本批新增**的 §4.1 表(§6.3) |
|
|
655
|
+
| `git diff --stat -- docs/hive/检索路径与认知结构契约_v0.1.md` | 0 | `+20` 行(全是新增 §4.1) |
|
|
656
|
+
| `docker images` | 0 | 本机 Docker 在位(`28.4.0`),`rust:bookworm` / `python:3.12` / `node:22-bookworm` 镜像已在本地 |
|
|
657
|
+
|
|
658
|
+
| **(修订 r2 新增)** `git archive HEAD md_cg` → 解包到临时目录,再 `import md_cg.test_h4_sustain_snapshot` 对两棵树各跑一次 `scan_domain()` | 0 | **HEAD**:400 文件/112 处共享迭代点/**84 处未取快照**(生产 59 + 测试 25);**工作区**:402/112/**0**(§2.3、§1.3) |
|
|
659
|
+
| **(r2)** `git diff -U0 -- md_cg/ \| grep -c "^+.*list("` | 0 | **85**(含 `sustain.py` 注释里 1 行,真实包裹点 84)(§2.3) |
|
|
660
|
+
| **(r2)** 读 `hive/src/job.rs:362-374`(`list_jobs`) | 0 | 只收 `name.starts_with("h") && is_dir()` ⇒ 「非 `h` 前缀即退出领取面」有行级依据(§3.2) |
|
|
661
|
+
| **(r2)** 读三态命名:`hive/src/main.rs:742/753/735-741`、`:439/:450`;`hive/hive_mcp/mcp_server.py:465/468/658/674` | 0 | doctor/poll/MCP 命名一致:`corrupt` / `no_status` / `unknown`(含义收窄)(§2.2) |
|
|
662
|
+
| **(r2)** `grep -n "worker 检测到 kill 标志后强杀" hive/src/main.rs` + `git show HEAD:hive/src/main.rs` | 0 | 回执 `hint`:**工作区 `:539` / HEAD `:517`**;配套:pid 写入 HEAD `:475`→工作区 `:799`、kill 检测 HEAD `:494`→工作区 `:818`(§1.2、§2.2、§3.2) |
|
|
663
|
+
| **(r2)** `grep -n rank_parity_score_mode`(全量套件日志) | 0 | `PASS md_cg.test_rank_parity_score_mode`(第 148 行)⇒ 本机真跑并 PASS,非 SKIP(§7.3 第 4 条) |
|
|
664
|
+
| **(r2)** 读 `scripts/run_tests.py:139-146`(`_SKIPS`) | 0 | 该目标**不在** skip 名单(CI 无 rust 工具链 ⇒ fail-closed 疑红) |
|
|
665
|
+
| **(r2)** 读 `scripts/linux_verify.sh` 的 `record` 组成 | 0 | `full` = 1+1+23+4+7+1+1 = **38**(§4.4 组成表) |
|
|
666
|
+
| **(r2)** 读 `scripts/check_publish_artifact.py:596-602` 与 `:46` | 0 | R4 判据 `pkg_set - tracked`、白名单 `ALLOW_NONTRACKED = ("lib/",)`(§4.5、§7.3 第 3 条) |
|
|
667
|
+
| **(r2)** 读 `docs/eval/缺陷挖掘_自主迭代_v16.md:90`、`docs/eval/优化第二批_…_v1.0.md:6/:74` | 0 | N138 条目原文;CH-1 编号来源(含「不在清单里」的原话)(§0.2、§1.3) |
|
|
668
|
+
|
|
669
|
+
**L1 直跑留痕**(工作纪律第 17 条):本报告全部命令均为**只读判定**(跑门禁/守卫/读码看结论,产物落点=不改仓库、不改外部状态)——风险=无(编译产物落系统临时目录;`rust/target` 零写入、`hive/target` 未触)、频次=高、可逆=完全可逆,合并为一条留痕。撰写期内的后台长跑(四份守卫的变异自证、python 全量)同样只读。
|