@furongjun1999/dsh-memory 0.7.1 → 0.7.3
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 +58 -48
- package/codebuddy/CODEBUDDY.md +9 -9
- package/docs/README.md +148 -144
- package/docs/discipline/harnesses.yaml +16 -8
- package/docs/discipline/templates/zcode-user.md.tmpl +49 -0
- package/docs/eval/AGI/344/270/203/347/273/264/350/257/204/345/210/206/346/212/245/345/221/212_/345/205/255/345/256/266/350/256/260/345/277/206/347/263/273/347/273/237/345/220/214/345/260/272/345/256/236/346/265/213_v3.1.md +340 -0
- 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 +2 -2
- package/docs/eval/cons200_/345/206/262/347/252/201/346/243/200/346/265/213/351/200/211/351/235/242_/345/256/236/346/226/275/350/256/260/345/275/225_v1.0.md +1 -1
- package/docs/eval/cons200_/345/206/262/347/252/201/346/243/200/346/265/213/351/200/211/351/235/242_/345/256/236/346/226/275/350/256/260/345/275/225_v1.1.md +1 -1
- 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 +1 -1
- 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 +2 -2
- package/docs/eval/issue50_/345/205/203/346/225/260/346/215/256/351/200/217/344/274/240/344/270/216/345/205/234/345/272/225_/344/277/256/345/244/215/350/256/260/345/275/225_v1.0.md +5 -5
- package/docs/eval/issue50_/345/215/212/351/207/215/345/244/215/345/276/205/345/256/232/345/244/215/346/240/270_/344/277/256/345/244/215/350/256/260/345/275/225_v1.0.md +9 -9
- package/docs/eval/issue50_/345/276/205/345/256/232/345/244/215/346/240/270/345/205/245/351/230/237_/344/277/256/345/244/215/350/256/260/345/275/225_v1.0.md +4 -4
- package/docs/eval/issue50_/351/207/215/350/246/201/345/272/246/345/220/214/346/272/220/344/270/216/344/277/235/346/212/244/350/257/255/344/271/211_/344/277/256/345/244/215/350/256/260/345/275/225_v1.0.md +1 -1
- package/docs/eval/issue51_/344/270/200/351/224/256/345/256/211/350/243/205/345/244/261/350/264/245_/345/275/222/345/261/236/345/210/244/345/256/232_v1.0.md +1 -1
- package/docs/eval/issue52_/346/235/241/344/273/266/345/205/210/350/241/214/344/270/216/346/210/252/346/226/255/345/217/257/350/247/202/346/265/213_/344/277/256/345/244/215/350/256/260/345/275/225_v1.0.md +3 -3
- package/docs/eval//344/270/211/346/241/243/350/207/252/346/262/273_/346/255/245/351/252/244/342/221/242/345/217/230/346/233/264/345/215/225/344/270/216/345/233/236/346/273/232/345/216/237/350/257/255_/350/220/275/347/240/201/350/256/260/345/275/225_v1.0.md +3 -3
- package/docs/eval//344/270/211/346/241/243/350/207/252/346/262/273_/346/255/245/351/252/244/342/221/243/345/207/206/345/205/245/350/257/273/346/225/260_/350/220/275/347/240/201/350/256/260/345/275/225_v1.0.md +7 -7
- 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 +2 -2
- 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 +1 -1
- 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 +7 -7
- 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 +10 -10
- 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 +4 -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 +1 -1
- package/docs/eval//345/217/221/345/270/20309_/346/243/200/347/264/242/351/235/242/344/270/211/346/211/271/346/224/266/345/217/243_v1.0.md +1 -1
- package/docs/eval//345/217/221/345/270/20310_/350/257/273/351/235/242/346/215/237/345/235/217UTF8/345/256/266/346/227/217/346/224/266/345/217/243_v1.0.md +71 -0
- package/docs/eval//345/217/221/345/270/20311_/345/244/226/346/212/245/345/205/255/350/277/236/344/277/256/344/270/216/344/270/226/347/225/214/346/250/241/345/236/213/345/272/225/345/272/247_v1.0.md +91 -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 +2 -2
- package/docs/eval//347/224/250/346/210/267/350/243/201/345/206/263/345/244/204/347/275/256_/347/254/254/344/270/200/346/211/271_v1.0.md +195 -0
- package/docs/eval//347/224/250/346/210/267/350/243/201/345/206/263/345/244/204/347/275/256_/347/254/254/344/272/214/346/211/271B6_/346/234/254/346/234/272/350/267/257/345/276/204/347/233/270/345/257/271/345/214/226_v1.0.md +78 -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 +1 -1
- 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 +3 -3
- package/docs/eval//347/254/2543/345/261/202stg/347/273/223/346/236/204/347/264/242/345/274/225_/345/256/236/346/226/275/350/256/260/345/275/225_v1.0.md +1 -1
- 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 +1 -1
- 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_v26.md +196 -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_v27.md +259 -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_v28.md +217 -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_v29.md +270 -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_v30.md +231 -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_v31.md +281 -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 +1 -1
- 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/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 +1 -1
- package/docs/hive//350/234/202/345/267/242/350/256/276/350/256/241_/347/220/206/350/256/272/345/257/271/351/275/220_v0.1.md +17 -17
- package/docs/hive//350/234/202/345/267/242/350/277/255/344/273/243_/345/256/217/350/247/202/344/270/216/347/276/244/344/275/223/350/260/203/345/272/246_v0.1.md +1 -1
- package/docs/mdcg/README/350/257/246/347/273/206/347/211/210_v0.4.10.md +2 -2
- 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 +42 -41
- package/docs/mdcg//345/217/221/345/270/203/351/227/250/347/246/201/351/223/276_v0.1.md +29 -8
- 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 +71 -1
- 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 +1 -1
- package/docs/plans//345/244/232/344/270/273/344/275/223/344/270/226/347/225/214/346/250/241/345/236/213_/345/257/271/351/275/220/350/257/204/344/274/260/344/270/216/350/220/275/345/234/260/350/256/276/350/256/241_v0.1.md +141 -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 +2 -2
- package/docs/plans//350/257/255/344/271/211/346/227/266/347/251/272/345/233/276/350/241/245/345/205/250_/344/270/226/347/225/214/346/250/241/345/236/213/345/212/237/350/203/275/347/253/257_/350/256/276/350/256/241_v0.1.md +107 -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 +9 -8
- package/docs//347/247/244_/350/256/260/345/277/206/347/263/273/347/273/237/350/257/204/346/265/213/350/247/204/350/214/203_v2.1.md +225 -0
- package/dsh/cordis-patch-profile-web.example.yml +2 -2
- package/lib/bridge.js +9 -0
- package/lib/hooks.d.ts +8 -1
- package/lib/hooks.js +94 -32
- package/lib/lib/hook_audit.d.ts +55 -0
- package/lib/lib/hook_audit.js +208 -0
- package/lib/lib/mutual.js +5 -1
- package/lib/lib/roleplay_web.js +17 -2
- package/md_cg/auditview.py +248 -0
- package/md_cg/bench6_arms.py +10 -6
- package/md_cg/bench_e2e_judge.py +4 -2
- package/md_cg/branches.py +29 -3
- package/md_cg/census.py +2 -1
- package/md_cg/consistency.py +38 -13
- package/md_cg/datapath.py +38 -11
- package/md_cg/forgetting.py +15 -2
- package/md_cg/freshness.py +32 -11
- package/md_cg/ghostref.py +130 -0
- package/md_cg/judgment_manifest.py +7 -0
- package/md_cg/mcp_server.py +58 -1
- package/md_cg/mdcg.py +4923 -4764
- package/md_cg/mdcos.py +40 -15
- package/md_cg/mreview/locate.py +1 -1
- package/md_cg/nodefile.py +77 -13
- package/md_cg/readcache.py +29 -4
- package/md_cg/rollback.py +12 -3
- package/md_cg/routing.py +10 -1
- package/md_cg/selfreport.py +12 -3
- package/md_cg/sleep.py +129 -13
- package/md_cg/sources.py +1 -1
- package/md_cg/state_events.py +131 -0
- package/md_cg/sustain.py +1436 -1436
- package/md_cg/test_auditview.py +277 -0
- package/md_cg/test_autonomy_modes.py +2 -1
- package/md_cg/test_boot_openblas_guard.py +197 -0
- package/md_cg/test_ccg_form_parity.py +95 -4
- package/md_cg/test_cons200_scan_selection.py +4 -2
- package/md_cg/test_corrupt_utf8_read_surfaces.py +451 -0
- package/md_cg/test_datapath_device_name.py +62 -3
- package/md_cg/test_generation_guard.py +20 -11
- package/md_cg/test_ghostref.py +182 -0
- package/md_cg/test_health_corrupt_utf8.py +37 -0
- package/md_cg/test_index_crossprocess_reload.py +39 -24
- package/md_cg/test_interop.py +1 -1
- package/md_cg/test_issue52_scan_condition_first.py +1 -1
- package/md_cg/test_issue53_cipher_health_hash.py +385 -0
- package/md_cg/test_lock.py +16 -7
- package/md_cg/test_m3_h9_semantic_guard.py +1 -1
- package/md_cg/test_n230_dirty_replay.py +375 -375
- package/md_cg/test_n238_body_text_parity.py +156 -0
- package/md_cg/test_n276_probe_hoist.py +199 -0
- package/md_cg/test_p4_freshness.py +95 -1
- package/md_cg/test_policy_required_ccg.py +3 -1
- package/md_cg/test_readcache_prodpath.py +66 -0
- package/md_cg/test_sleep.py +58 -1
- package/md_cg/test_sleep_p1.py +218 -2
- package/md_cg/test_state_events.py +178 -0
- package/md_cg/test_time_core_lint.py +8 -1
- package/md_cg/test_writepipe.py +8 -5
- package/md_cg/tokens.py +11 -2
- package/md_cg/writepipe.py +76 -0
- package/package.json +2 -2
- package/skills/plugin.json +1 -1
- package/src/bridge.ts +9 -0
- package/src/hooks.ts +576 -517
- package/src/lib/hook_audit.ts +243 -0
- package/src/lib/mutual.ts +5 -1
- package/src/lib/roleplay_web.ts +17 -2
- package/zcode/AGENTS.md +9 -9
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
# 缺陷挖掘·自主迭代 第 27 轮报告(hive 面深挖)
|
|
2
|
+
|
|
3
|
+
**材料与口径声明**:本报告由本轮 ask 给定的六份材料(四区扫描 / 独立复核 / 分诊 / 修复批次 / 全量回归 / 合规自检)编译而成。凡属材料所给的第一手探针输出(含各席复现读数、红基线数字),条目内一律标注「材料所给」并注明来源区/席;凡属**本报告会话实跑**的结果,集中在第四节并标注确切命令与输出。材料中的行号为扫描期行号,本报告改用**现工作区行号**(本会话逐处读取核实),与材料行号不一致处以现码为准并在条目内注明。修复区(`hive/src/*.rs`、`hive/*.py`)已在修复批次中落盘,故「缺陷面」行号与「修复后」行号同指现工作区。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 一、执行摘要
|
|
8
|
+
|
|
9
|
+
- **轮次定位**:第 27 轮·**hive 面深挖**,接第 26 轮「md_cg 核心面收尾·第四圈第二站」(`docs/eval/缺陷挖掘_自主迭代_v25.md`)。前序各轮已把 md_cg 写面/读出口/scripts+TS 门禁面收敛;本轮转向 hive 并发引擎(调度与任务生命周期 / 执行器与结果面 / MCP 入口与密钥解析 / 接缝·工具面与配置)。
|
|
10
|
+
- **四区扫描(工作流实跑,材料所给)**:四区候选合计 **22 条**——调度与任务生命周期 4 条(`hive/src/scheduler.rs`·`hive/orch.py`)、执行器与结果面 4 条(`hive/exec.py`·`exec_cmd.py`·`src/spec.rs`)、MCP 入口与密钥解析 6 条(`hive/hive_mcp/mcp_server.py`·`src/keyres.rs`·`serve_start.py`)、接缝·工具面与配置 8 条(`hive/interop/`·`hive/config.local.example.json`·`md_cg/units.py`·`scripts/interop_gate.py`)。
|
|
11
|
+
- **独立复核(工作流实跑,材料所给)**:四区 22 条候选逐条复核(confirmations 22 条=21 条 `real` + 1 条 `already_covered`);另有证伪 1 条(`seams`·`hive/id_charset_blocks.txt:13` 的「无自动调用点」陈述被证伪)。
|
|
12
|
+
- **编号**:自 N231 续编、全局唯一。**树内实占扫描**(本会话 `git -C <repo> grep -ohE 'N[0-9]{3,4}'`)实占最大值为 **N235**(`N802` 为 `hive/test_exec_empty_response.py` 与 `md_cg/generation.py` 的 flake8 `# noqa: N802` 码,非缺陷号),故本轮新号 N231–N235 落地给 5 条已修缺陷;分诊 `numberingEvidence` 亦据此裁定(§3.0)。
|
|
13
|
+
- **修复**:**5 个修复批次**、覆盖 5 个缺陷号(N231/N232/N233/N234/N235),落工作区**未 commit**(§2)。
|
|
14
|
+
- **留档未修(defer)11 项**、**剔除(rejected)2 项**(§3.2、§5)。
|
|
15
|
+
- **本报告会话实跑(第一手,详见 §4)**:全量回归 `PYTHONUTF8=1 python -X utf8 scripts/run_tests.py --jobs 4` → `SUMMARY 320/320 通过,5 跳过(依赖缺失/平台不符)`、**rc=0**;五条守卫直跑——`hive.test_mcp_entry_guard` `结果: 0 fail`、`hive.test_orch` `99 passed, 0 failed`、`hive.test_exec_cmd` `RESULT: ALL_PASS`、`hive.test_n233_status_write_fail` `结果: 0 fail`(13 条断言全绿,守卫内含临时目录独立 cargo 构建);`hive.test_n232_anchor_expectation` `结果: 0 fail`(10 条断言,守卫内含临时目录独立 crate 构建 + 真 serve)。**本席未修改任何产品文件**(开工 `git status --porcelain`=12 项,收尾=13 项=原 12 项逐条一致 + 本报告自身)。
|
|
16
|
+
- **未运行**:真实 CI(ubuntu runner)、`npm test` 全量 TS 套件(本轮定位为 hive 面,TS 面无改动);cargo 全套未单跑(仅由 `test_n233`/`test_n232` 守卫在系统临时目录内触发独立构建,见 §4)。
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 二、修复清单(5 个修复批次;落工作区未 commit)
|
|
21
|
+
|
|
22
|
+
### 修复① 入口深嵌套 JSON 崩溃(N231;high)
|
|
23
|
+
|
|
24
|
+
- **where(现码行号,本会话核实)**:`hive/hive_mcp/mcp_server.py:1308-1311`——`try: req = json.loads(line) except (ValueError, RecursionError): continue`(本会话实读,修复已落盘);缺陷面原为 `except ValueError`。
|
|
25
|
+
- **缺陷面(材料所给·mcp-key 区)**:`json.loads` 对**深嵌套单行 JSON**(如 3000 层数组)抛 `RecursionError`,它是 `RuntimeError` 族、**不是** `ValueError` 子类,因而逃出 `main()` 只捕 `ValueError` 的 try ⇒ 常驻 MCP server 进程被**一行**杀掉(单行 DoS),与同文件 `:1314` 自陈「入口兜底不崩 server」矛盾;入口守卫 `hive/test_mcp_entry_guard.py` 与 `hive/src/json.rs:123` `MAX_DEPTH=256`(Rust 文件协议侧同类防线)均未覆盖此传输面。
|
|
26
|
+
- **修复(材料所给)**:捕获面由 `ValueError` 扩为 `(ValueError, RecursionError)`,深嵌套行按既有「坏行跳过」口径跳过并继续服务(口径同 Rust 侧 `json.rs` MAX_DEPTH:超深输入不进入解析面)。
|
|
27
|
+
- **守卫读数(材料所给)**:红基线 `PYTHONUTF8=1 python -X utf8 -m hive.test_mcp_entry_guard` → **2 fail**(新增段两条:`deep_array_3000` / `deep_object_3000` 均 `probed=False rc=1`,stderr 尾 `RecursionError ... while decoding a JSON array from a unicode string`);绿态同命令 → **0 fail**(全 26 条断言 OK)。**本会话实跑**该守卫 → `结果: 0 fail`(§4-2)。
|
|
28
|
+
|
|
29
|
+
### 修复② 锚预期可判定性(N232;high)
|
|
30
|
+
|
|
31
|
+
- **where(现码行号,本会话核实)**:`hive/src/scheduler.rs:1032-1043`(`enum AnchorVerdict` 新增 `ExpectationUnknown`)、`:1096/:1106/:1109`(不可判定即 `Err(AnchorVerdict::ExpectationUnknown)`)、`:1119`(`fn verify_result_anchor`)、`:963`(`classify_result`,`:980-989` 按裁决落 done/needs_review/error)、`:944-958`(P11 锚门文档,含 N232 加固注释);守卫 `hive/test_n232_anchor_expectation.py`。
|
|
32
|
+
- **缺陷面(材料所给·mcp-key 区)**:`verify_result_anchor` 在 `status.json` 不可读或 `result_nonce` 缺失时**一律** `return AnchorVerdict::Pass` = 旧判据 done。而写 `result.json` 的执行器与 `status.json` 同处一个 job 目录、无写保护 ⇒ **无钥抹掉 `result_nonce`** 即可把伪造产物从 needs_review 降级为 done;复核席实测 A 带 nonce→needs_review、B/C 抹 nonce→**done**。同函数对「serve 无密钥」却要求 fail-closed needs_review——两种「锚不可用」取向相反。
|
|
33
|
+
- **修复(材料所给)**:把锚预期来源拆成两处(新增 `AnchorExpect`)——① live 面用 spawn 期**内存事实**(`plan_anchor` 的 AnchorPlan,注入过锚就必须回写一致锚,盘面抹 nonce 无效);② 恢复面(`recover_orphans` 无内存事实)在**持密钥**时对「无 nonce 记录 / status 不可读」fail-closed 判 `needs_review`(新增 `ExpectationUnknown`,原四态不动),无密钥 serve 仍是旧格式基线边界——无钥抹 nonce 降级 done 的路径被堵死。
|
|
34
|
+
- **守卫读数(材料所给)**:红基线 `PYTHONUTF8=1 python -X utf8 -m hive.test_n232_anchor_expectation` → **5 fail**(A 恢复面 claimed+抹 nonce→done;B running→done;E live 面运行期抹 nonce→done;另两条文案断言 error=None);绿态同命令 → **0 fail**(10 条断言全 OK);`cargo test --manifest-path hive/Cargo.toml` → rc=0(lib 68 / main 9 / judgment_surface 8 passed,含按新契约改写的 4-e 与新增 4-f);`test/chaos_injection/test_fi_r03_fake_result_ok.py` 的 harness 重定向到修后临时构建 → `verdict=pass consistent=true`(含 E「旧格式任务在锚判据 serve 上维持旧判据 done」兼容格)。**本会话实跑**见 §4-3。
|
|
35
|
+
- **连带声明(材料如实申报)**:判据面承重断言 `result_anchor_gate` 的 e 分支改为「持密钥+盘面无 nonce → needs_review」并新增 f 分支钉住无密钥兼容边界——**兼容口径在恢复面收窄,属本条修复的一部分**;`docs/eval/不可靠性落地_P0_v1.0.md` §2.2-3 的旧兼容表述**未同步**(文档不在本条指派面,如实声明)。
|
|
36
|
+
|
|
37
|
+
### 修复③ worker 终态/心跳状态改写不得静默失败(N233;medium)
|
|
38
|
+
|
|
39
|
+
- **where(现码行号,本会话核实)**:`hive/src/scheduler.rs:894-915`(新增 `fn land_final_status`,:`912` `job::patch_status` 走 `retry_spawn` 有界退避)、`:678`(`pub const STATUS_WRITE_MAX_ATTEMPTS: u32 = 8`)、`:856-866`(心跳失败首次 stderr 告警,`job::heartbeat` 于 `:858`)、`:877`(`run_job` 末尾改调 `land_final_status`);`hive/src/job.rs:551`(`pub const WRITEFAIL_MARK: &str = "status.writefail.json"`)、`:558`(落标记、**绝不碰 `status.json` 本体**);守卫 `hive/test_n233_status_write_fail.py`。
|
|
40
|
+
- **缺陷面(材料所给·调度区)**:worker 终态 `patch_status` 与心跳写入用 `let _` 吞错(无重试/告警/标记),`job.rs` 的 `write_json` 是 tmp+fsync+rename 且 **rename 失败即整次写丢失、tmp 不清、无重试** ⇒ 只读/瞬态写失败即令任务**永久停在 state=running**(进程已退出、result.json 在位),poll/doctor 恒报 running、下游经 `deps_gate`(`scheduler.rs:1027-1063`)对非终态上游**永久悬置**,仅 serve 重启由 `recover_orphans` 收敛;与同文件 N191 已确立的「状态改写不得吞错」(主循环领取面)自相矛盾。
|
|
41
|
+
- **修复(材料所给)**:终态落盘改走 H-4 既有**有界退避重试单点** `retry_spawn`(`STATUS_WRITE_MAX_ATTEMPTS=8`、退避封顶 2s、全窗约 9s)——瞬态失败自愈、无需重启;重试 >1 次成功 stderr 留痕;耗尽则 stderr 告警(点名 job_id/state/原因)+ 落独立标记 `status.writefail.json` + 清理重试残留同名 tmp;心跳失败首次告警一行。
|
|
42
|
+
- **守卫读数(材料所给)**:红基线 `PYTHONUTF8=1 python -X utf8 -m hive.test_n233_status_write_fail` → **5 fail**,其中**有效红基线 4 条**(A 标记未落场 / A' 标记字段空 / A serve stderr 无告警 / B 瞬态失败后 state=running 永不自愈);第 5 条「status.json 本体逐字节未被改写」基准取错(取 serve 启动前字节,会被领取态正常改写命中),**不构成判别力,不计入红基线**(材料自陈)。绿态同命令 → **0 fail**(13 条断言全 OK)。**本会话实跑**该守卫 → `结果: 0 fail`、13 条 `[ok]` 全绿(§4-2)。
|
|
43
|
+
- **诚实边界(材料所给)**:`status.json` **永久只读**时终态在物理上写不进去,本修复只做到「失败可发现 + 瞬态自愈」;`doctor` 未接线读取该标记(未越出本条指派面)。
|
|
44
|
+
|
|
45
|
+
### 修复④ 执行器规格错/静默转发(N234;medium)
|
|
46
|
+
|
|
47
|
+
- **where(现码行号,本会话核实)**:`hive/exec_cmd.py:125`(新增 `def _spec_gate(spec)`)、`:288-290`(`run_cmd` 内 `gate_err = _spec_gate(spec)` → `_fail(..., EXIT_SPEC)`)、`:40`(`EXIT_OK, EXIT_SPEC, EXIT_EXEC = 0, 2, 3`);同族两腿:`commands` 非 list 真值形态原落到 `:124-125 return None, None` 的 LLM 委托分支(对照 `command` 字符串在 `:128-131` 有明确规格错),`env`/`timeout_step_s` 脏类型原以内部异常逃出(`env` 于 `:256`、`timeout` 于 `:158-169`/`:169 float(timeout)`);守卫 `hive/test_exec_cmd.py`。
|
|
48
|
+
- **缺陷面(材料所给·执行器区)**:①`spec.commands` 为非 list 真值(字符串/对象)时不按规格错拒绝,被静默解释成「无命令」→ 转发 LLM 执行器:确定性命令从未执行,`result.json` 却以 `ok=true` + LLM 文本落盘,提交方拿到**语义错误的成功产物且无任何信号**;同字段 `command` 字符串却有规格错(执法强度不一致)。②`env`/`timeout_step_s` 脏类型零类型闸,以「执行器内部异常」+ `EXIT_EXEC(3)` 收场,把**规格错记成执行错**(与 `:24` 文档口径「2=规格错 / 3=执行错」相悖);`hive/src/spec.rs:32-60` 结构体与 `:110-232` `validate_lenient` 均不解析这两键,无提交侧闸。
|
|
49
|
+
- **修复(材料所给)**:新增 `_spec_gate`(`commands` 键存在且非 None 时必须为数组、`env` 非 None 时必须为对象、`timeout_step_s` 非 None 时必须为数字)并在 `_norm_steps` 步内加 `cwd`/`step.timeout_step_s` 类型闸,命中一律 `_fail(..., EXIT_SPEC)`(口径对齐 `:24`)。
|
|
50
|
+
- **守卫读数(材料所给)**:红基线 `PYTHONUTF8=1 python -X utf8 -m hive.test_exec_cmd` → `RESULT: FAILED=[…6 条…]`(commands 脏类型 rc=0 ok=True / 静默转发 `delegated=True` / env 脏类型 rc=3 `AttributeError: 'list' object has no attribute 'items'` / timeout_step_s 脏类型 rc=3 `ValueError: could not convert string to float: 'abc'` / step 级 timeout_step_s rc=3 / step 级 cwd 脏类型 rc=3 `TypeError`);绿态同命令 → `RESULT: ALL_PASS`(17 例:原 9 + 6 规格闸 + 2 反向对照),另 `hive.test_n144_exec_cmd_terminal_race` `ALL_PASS` 零回归。**本会话实跑** `hive.test_exec_cmd` → `RESULT: ALL_PASS`(§4-2)。
|
|
51
|
+
|
|
52
|
+
### 修复⑤ 编排观测面终态集缺 needs_review(N235;medium)
|
|
53
|
+
|
|
54
|
+
- **where(现码行号,本会话核实)**:`hive/orch.py:87-91`(`TERMINAL_STATES = ("done", "error", "timeout", "killed", "needs_review")`);消费点 `:459`(卡片 hint 分支)、`:655`(`poll_subtasks` 的 done/active 计数);对照面 `:162`(`depends_on` 文案把 needs_review 当失败传播)、`hive/src/scheduler.rs:1059`(`deps_gate` 同列失败);守卫 `hive/test_orch.py`。
|
|
55
|
+
- **缺陷面(材料所给·调度区)**:`TERMINAL_STATES` 缺 `needs_review` ⇒ `poll_subtasks` 恒把 `needs_review` 子任务计为 active(done 不计),而同一状态在调度侧(`scheduler.rs:1059` 失败传播、`:843` 落终态)早已是终态 ⇒ 编排器**永远收不了口**、两侧语义相反。(复核席更正:候选所述 hint=「执行中(继续轮询)」仅在 `result.json` 缺失的夹具下成立;真实成因「锚缺失」下 `result.json` 必在、hint 为 None——核心 done/active 误计已亲手复现,hint 症状面比所述略窄。)
|
|
56
|
+
- **修复(材料所给)**:`TERMINAL_STATES` 补 `needs_review`,新终态集与 `scheduler.rs::deps_gate` 失败传播集、`orch.py:162` 文案**同一口径**。
|
|
57
|
+
- **守卫读数(材料所给)**:红基线 `PYTHONUTF8=1 python -X utf8 -m hive.test_orch` → `96 passed, 3 failed`(红项 N235-1/2/3);绿态同命令 → `99 passed, 0 failed`。**本会话实跑**该守卫 → `99 passed, 0 failed`(§4-2)。
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## 三、发现明细
|
|
62
|
+
|
|
63
|
+
### 3.0 编号裁定与四区计数
|
|
64
|
+
|
|
65
|
+
**裁定规则**:① **树内实占·守卫文件名优先**(v22 §3.0-② 先例);② 无树内实占时保留扫描/复核席已声明编号;③ 新号自**实际最大值 +1** 续编且全局唯一。
|
|
66
|
+
|
|
67
|
+
**树内实占扫描(本会话实跑)**:`git -C <repo> grep -ohE 'N[0-9]{3,4}' | tr -d 'N' | sort -n -u | tail` ⇒ 实占最大值 **N235**(`N802` 为 `# noqa` 码);`git -C <repo> ls-files | grep -iE 'N2[0-9][0-9]'` 得守卫文件名实占 `test_n197_n208`/`n201`/`n202`/`n204_n205_n226_n227_n228_n229`/`n206`/`n209`/`n212_n213_n224`/`n214_n215_n221_n222`/`n225`/`n230`(另有 `docs/eval/N225_…v1.0.md`)。本轮新号 N231–N235 全局唯一,与分诊 `numberingEvidence` 一致。
|
|
68
|
+
|
|
69
|
+
**四区计数(工作流实跑,材料所给)**:候选 **22**=调度区 4 + 执行器区 4 + MCP 入口区 6 + 接缝区 8;分诊结果 **fix 5 / defer 11 / rejected 2**(18 条独立缺陷项)。**计数口径**:22 候选 − 18 项 = **4 处合并**——执行器区 `exec_cmd.py` 的「commands 非 list」与「env/timeout_step_s 脏类型」两候选**并入 N234 同号**;接缝区 `serve_start.py` 的 `UnicodeDecodeError`(`:296`)、BOM 未剥(`:297`)、`{"file":…}` 形态对 `HIVE_ORCH_TOKEN_FILE` 结构性不可用(`:287-300`)三候选**合并为留档一组**(同函数 `:286-300`)。18 = 5(fix)+ 11(defer)+ 2(rejected)。
|
|
70
|
+
|
|
71
|
+
### 3.1 confirmed 明细(22 条;已修 5 / 留档 11 / 剔除 2 / 已覆盖 1 / 证伪 1)
|
|
72
|
+
|
|
73
|
+
| # | 号/状态 | 区 | where(现码) | sev | 备注 |
|
|
74
|
+
|---|---|---|---|---|---|
|
|
75
|
+
| 1 | **N231** 已修 | mcp-key | `hive/hive_mcp/mcp_server.py:1308-1311` | high | RecursionError 逃出入口杀 server |
|
|
76
|
+
| 2 | **N232** 已修 | mcp-key | `hive/src/scheduler.rs:1032-1043/:1096-1109/:1119` | high | 无钥抹 nonce 降级 done |
|
|
77
|
+
| 3 | **N233** 已修 | scheduler | `hive/src/scheduler.rs:894-915/:678`、`hive/src/job.rs:551` | medium | worker 终态/心跳静默吞错 |
|
|
78
|
+
| 4 | **N234** 已修 | exec | `hive/exec_cmd.py:125/:288-290`(含 `:114-125`、`:158-169`、`:256`) | medium | commands 静默转发 + env/timeout 类型闸(两候选并号) |
|
|
79
|
+
| 5 | **N235** 已修 | scheduler | `hive/orch.py:87-91`(消费 `:459/:655`) | medium | 终态集缺 needs_review |
|
|
80
|
+
| 6 | 留档 | exec | `hive/exec.py:979-982`(另 `:894`) | medium | 内置三工具脏参在 try 外强转(N13 漏网面) |
|
|
81
|
+
| 7 | 留档 | exec | `hive/exec.py:288-299`(同形 `hive/exec_cmd.py:95-106`) | medium | N82 守卫为无锁读后写 |
|
|
82
|
+
| 8 | 留档 | scheduler | `hive/src/scheduler.rs:415-444`/`:820-825`(契约面 `hive/README.md:366`) | medium | pending+kill 不构成「不执行」保证 |
|
|
83
|
+
| 9 | 留档 | mcp-key | `hive/serve_start.py:287-300`/`:296`/`:297`(消费面 `src/keyres.rs:55-62`·`orch.py:391-395`) | medium | config 解析面三腿合并(崩栈/BOM/`{"file"}` 形态) |
|
|
84
|
+
| 10 | 留档 | mcp-key | `hive/src/keyres.rs:46-61`+`hive/hive_mcp/mcp_server.py:578-580,591` | medium | 锚面把路径串折 ASCII 小写 |
|
|
85
|
+
| 11 | 留档 | mcp-key | `hive/src/exec.rs:190-200`(注入点,复核席实读为 `:211-213`)+`hive/exec.py:235-237` | medium | 锚值经 env 交给被判者、回显即过闸(威胁模型残余) |
|
|
86
|
+
| 12 | 留档 | mcp-key | `hive/hive_mcp/mcp_server.py:1261-1266` | low | `params.name` 非字符串抛 TypeError,否成 `id=null` -32603 |
|
|
87
|
+
| 13 | 留档 | seams | `md_cg/units.py:331` | medium | 出货包缺 hive/ ⇒ 表缺失 ⇒ `_valid_job_id` 全 False、文案误归因 |
|
|
88
|
+
| 14 | 留档 | seams | `hive/config.local.example.json:12` | medium | README 良性缺省 vs 模板 fail-fast 相反承诺 |
|
|
89
|
+
| 15 | 留档 | seams | `hive/interop/note-ledger-write-fix.md:31` 等 5 处 + `hive/README.md:26` | low | 公开仓追踪面含本机路径/用户名,发布门禁盲区 |
|
|
90
|
+
| 16 | 留档 | seams | `scripts/interop_gate.py:73` | low | 门禁只兑现 docstring 三判据之一 |
|
|
91
|
+
| 17 | **剔除·已覆盖** | scheduler | `hive/src/scheduler.rs:1094`(spawn 算锚)+`hive/orch.py:831`(编排器写回 spec) | high | 即仓内台账 **N183**(`docs/eval/缺陷挖掘_自主迭代_v22.md:85-91`,留档未修·大设计决策) |
|
|
92
|
+
| 18 | **剔除·证伪** | seams | `hive/id_charset_blocks.txt:13` | medium | 「陈化守卫追踪面无自动调用点」被证伪(守卫在 `hive/test_mdcg_units_charset_parity.py`) |
|
|
93
|
+
|
|
94
|
+
**要点补记**:
|
|
95
|
+
- **N183 归属声明(材料所给)**:第 17 条「编排器改写 spec.json ⇒ 锚恒失配判 error」**不是本轮新发现**——复核席判定 `already_covered`(真 orch.py 路径亦亲手复现:spec 68B→2088B,终态 error 同文案),但其为 v22 台账已登记的 N183(`docs/eval/缺陷挖掘_自主迭代_v22.md:85-91`),git 自 P11 落地起锚面零改动、v23–v25 未复提、无守卫覆盖;**修复应走 N183 的锚绑定口径裁决,不按新发现再占号**。
|
|
96
|
+
- **N232 与 N183 的边界**:N183 是「编排器**改写** spec.json 致锚失配」,N232 是「无钥**抹除** result_nonce 致判据降级」——两者同处 `scheduler.rs` 锚面但成因与修法不同;本轮 N232 已修,N183 仍留档。
|
|
97
|
+
- **留档项的严重度**:材料分诊对 11 条 defer 逐条给出去向与理由(§5),其中 `hive/src/exec.rs` 锚注入一条材料明确判为「**未登记的威胁模型残余 + 关格声明过度外推**」——机制本身是被固化契约(`hive/tests/judgment_surface.rs` 承重断言 `anchor_e2e_done_with_echo_executor`),**去向=威胁模型文档补一条 + 订正关格声明范围,不动码**。
|
|
98
|
+
|
|
99
|
+
### 3.2 剔除与证伪(2 条)
|
|
100
|
+
|
|
101
|
+
| # | 出处 | 原陈述 | 裁定 | 依据 |
|
|
102
|
+
|---|---|---|---|---|
|
|
103
|
+
| 1 | seams 区 · `hive/id_charset_blocks.txt:13` | 「表头承诺『手改必被 --check 判陈化』,但陈化守卫在追踪面内没有任何自动调用点(CI/npm gate/run_tests 全无)」 | **证伪** | 复核席实跑:`hive/test_mdcg_units_charset_parity.py:79` `_GEN_REL="scripts/gen_id_charset_blocks.py"`,`:446-453` `group_table_hygiene()` 以 subprocess 跑 `--check` 并断言 rc==0,`:550` 调用;该文件被 `scripts/run_tests.py:68` 的 `hive/test_*.py` glob 收录(本会话实跑 `run_tests.py` 输出含 `PASS hive.test_mdcg_units_charset_parity`,见 §4-1),CI `python-tests.yml:43` 于 push/PR 执行 `run_tests.py`。候选证据①的 grep 结论亦不成立(追踪非 docs 面命中该测试文件本身)。 |
|
|
104
|
+
| 2 | scheduler 区 · `hive/src/scheduler.rs:1094` + `hive/orch.py:831` | 编排器改写 spec.json ⇒ 锚判据启用部署里凡 `spec.orchestrate` 为真的任务终态恒判 error | **剔除·已覆盖(N183)** | 复核席判 `already_covered`:即 v22 台账 N183(`docs/eval/缺陷挖掘_自主迭代_v22.md:85-91`),留档未修·大设计决策;独立复现成立(真 orch.py 路径亦命中),但归属既存号、修复走 N183 锚绑定口径裁定,不按新发现再占号。 |
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## 四、实跑读数(本报告会话第一手)
|
|
109
|
+
|
|
110
|
+
除注明外,命令均在仓库根运行,临时物落**系统临时目录**、测毕删除;本席**未修改任何产品文件**。
|
|
111
|
+
|
|
112
|
+
**L1 直跑留痕**:`PYTHONUTF8=1 python -X utf8 scripts/run_tests.py --jobs 4`(全量回归)与 `PYTHONUTF8=1 python -X utf8 -m hive.test_{mcp_entry_guard,orch,exec_cmd,n233_status_write_fail,n232_anchor_expectation}`(五条守卫)——**只读判定(跑门禁/测试看结论)**,风险低(不触在役面/网络/真实令牌库,守卫自建系统临时池与独立 `CARGO_TARGET_DIR`)、频次一次性(各 1 次)、可逆(临时物测毕删除,仓库零产品文件改动)。
|
|
113
|
+
|
|
114
|
+
1. **全量回归(本会话实跑)**:`PYTHONUTF8=1 python -X utf8 scripts/run_tests.py --jobs 4` → 末行 `===== SUMMARY 320/320 通过,5 跳过(依赖缺失/平台不符) =====`、**退出码 0**(后台任务 `exec_262a2091…` 完成时 exit code 0);`grep -c '^PASS'` 计 **320** 条 PASS。日志逐行核实:本轮两条新守卫与三条改动守卫**均在收集面内**——`PASS hive.test_n232_anchor_expectation`、`PASS hive.test_n233_status_write_fail`、`PASS hive.test_mcp_entry_guard`、`PASS hive.test_orch`、`PASS hive.test_exec_cmd`。
|
|
115
|
+
2. **守卫直跑(本会话实跑,命令 `PYTHONUTF8=1 python -X utf8 -m <module>`)**:
|
|
116
|
+
- `hive.test_mcp_entry_guard` → `结果: 0 fail`(含「攻击行夹击下两条合法行均应答且 rc=0」等);
|
|
117
|
+
- `hive.test_orch` → `=== orchestration tests: 99 passed, 0 failed ===`;
|
|
118
|
+
- `hive.test_exec_cmd` → `RESULT: ALL_PASS`(含 `PASS 真无命令仍转发 LLM(delegated=True)`、`PASS 合法commands照常执行(零回归)`);
|
|
119
|
+
- `hive.test_n233_status_write_fail` → `结果: 0 fail`,13 条 `[ok]` 全绿(A 重试耗尽落标记 + A' 字段齐备 + status.json 本体逐字节未改 + tmp 已清 + stderr 点名告警 + state 如实非终态;B 无重启自愈到 done;C 干净池零回归、不落标记)。该守卫内含**系统临时目录内独立 cargo 构建**(`CARGO_TARGET_DIR` 独立,不写 `hive/target/`、不碰在役二进制)。
|
|
120
|
+
3. **`hive.test_n232_anchor_expectation`(本会话实跑)**:命令 `PYTHONUTF8=1 python -X utf8 -m hive.test_n232_anchor_expectation` → `结果: 0 fail`,10 条 `[ok]` 全绿(A 恢复面 claimed+无 nonce 不采信 done、A 的 error 点明不可判定;B running+无 nonce 同;C 带 nonce 伪造产物仍拦 needs_review;**E live 面运行期抹 nonce 也救不了伪造产物(运行态预期在内存)**;D 无密钥 serve+旧格式任务→done(行为零变更);F 诚实链路零回归)。该守卫含**系统临时目录内独立 crate 构建 + 真 serve + 假执行器**(`CARGO_TARGET_DIR` 独立)。与材料所给绿态读数一致;材料所给红基线 5 fail。
|
|
121
|
+
4. **四区扫描与复核条数(工作流实跑,材料所给)**:四区候选 22 条(4/4/6/8)、复核 confirmations 22 条(21 `real` + 1 `already_covered`)、证伪 1 条。**本席未复跑四区扫描**(其探针脚本在各扫描/复核席,产出以材料为准)。
|
|
122
|
+
5. **编号核对(本会话实跑)**:`git -C <repo> grep -ohE 'N[0-9]{3,4}' | tr -d 'N' | sort -n -u | tail` → `232 233 234 235 802`(最大实占 N235;`N802`=`# noqa: N802`);`git -C <repo> ls-files | grep -iE 'N2[0-9][0-9]'` → 守卫文件名实占表与 §3.0 一致。
|
|
123
|
+
6. **工作区状态(本会话实跑)**:`git -C <repo> status --porcelain` → 开工 **12 项**(9 项 `M`:`hive/exec_cmd.py`·`hive/hive_mcp/mcp_server.py`·`hive/orch.py`·`hive/src/job.rs`·`hive/src/scheduler.rs`·`hive/test_exec_cmd.py`·`hive/test_mcp_entry_guard.py`·`hive/test_orch.py`·`hive/tests/judgment_surface.rs`;3 项 `??`:2 项新守卫 `hive/test_n232_anchor_expectation.py`·`hive/test_n233_status_write_fail.py` + `?? .zcode/`);`git diff --stat` 合计 **599 insertions(+), 68 deletions(-)** 跨 9 文件。收尾=13 项=原 12 项逐条一致 + 本报告自身。
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## 五、遗留清单(defer 11 项,含建议去向)
|
|
128
|
+
|
|
129
|
+
| # | where(现码) | sev | 状态与建议去向(材料所给) |
|
|
130
|
+
|---|---|---|---|
|
|
131
|
+
| 1 | `hive/exec.py:979-982`(另 `:894`) | medium | **留档**:内置三工具脏参(非字符串 query/op、非数字 count)在各自 try 前强转、异常穿透 `execute_tool`/`run_with_tools` 直达 `main` 兜底把整个 job 判死;同族 N13 已为 orch 面与 `_EXTRA_TOOLS` 分派修过(`:1398-1401`),内置工具是漏网面(影响可见:result.json ok=false+error 落盘,非静默)。**修法小、复用既有单点 `_int_arg`(`:1215`)**,建议下一轮并入「执行面类型闸」与 N234 一并收紧 |
|
|
132
|
+
| 2 | `hive/exec.py:288-299`(同形 `hive/exec_cmd.py:95-106`) | medium | **留档**:「成功终态不得被 error 覆写」的 N82 守卫是无锁读后写,真并发窗口已复现(exec.py 2869/3000、exec_cmd.py 1460/1500),属数据丢失面;修法需跨进程互斥(两文件现无任何锁单点)。**建议单列一批**:先补真并发对撞红守卫,再引入互斥 |
|
|
133
|
+
| 3 | `hive/src/scheduler.rs:415-444`/`:820-825`(契约 `hive/README.md:366`) | medium | **留档**:pending+kill 不构成「不执行」保证(实测副作用文件早于 killed 约 1.2s 落盘);属 kill 语义缺口。**建议与 `exec.rs` `kill_tree` 语义一并裁决**(README 承诺 vs 实际保证) |
|
|
134
|
+
| 4 | `hive/serve_start.py:296`(崩栈)/`:297`(BOM)/`:287-300`(`{"file":…}` 对 `HIVE_ORCH_TOKEN_FILE` 结构性不可用) | medium | **留档(三腿合并)**:全部集中单函数 `:286-300`,修法小(扩 `except`、改 `utf-8-sig`、对文件型键排除 `{"file"}` 或改消费侧)。**建议合并为一轮「config 解析面」批次**并补守卫(现 `hive/test_serve_show_config.py:229` 反把 `{"file":…}` 当合法配 `HIVE_ORCH_TOKEN_FILE`) |
|
|
135
|
+
| 5 | `hive/src/keyres.rs:46-61`+`hive/hive_mcp/mcp_server.py:578-580,591` | medium | **留档**:锚面把 `HIVE_ORCH_TOKEN_FILE` 的**路径串**也折 ASCII 小写,区分大小写 fs(Linux/macOS)上锚整条静默不启用,而 `orch.py:387-397` 身份面不折。**建议随锚域批次(与 N232 同域)**,rust/py 两侧归一语义一并改 |
|
|
136
|
+
| 6 | `hive/src/exec.rs:190-200`(注入点)+`hive/exec.py:235-237`(回写点) | medium | **留档(威胁模型残余,不动码)**:锚值经 env 交给被判者、回显即过闸,锚对 content/ok 零判别力;机制是被固化契约(`hive/tests/judgment_surface.rs` `anchor_e2e_done_with_echo_executor`),改码会破承重对照。**去向=威胁模型文档补一条 + 订正 `test/chaos_injection/registry.py` 与 `docs/eval/不可靠性落地_P0_v1.0.md` 的关格声明范围** |
|
|
137
|
+
| 7 | `md_cg/units.py:331` | medium | **留档**:出货包不含 hive/ ⇒ 区块表缺失 ⇒ `_valid_job_id` 全 False,`CHARSET_BLOCKS_ERROR` 生产无读取点、拒绝文案误归因 job_id(诊断面缺陷)。**建议与同族 `md_cg/interop.py:295` 既有告警单点合并,走 md_cg 面批次** |
|
|
138
|
+
| 8 | `hive/config.local.example.json:12` | medium | **留档**:README 承诺 `HIVE_EXEC_PY`/`HIVE_WEB_SEARCH_KEY` 未设有良性缺省、模板却写成 fail-fast,照模板在只配模型密钥的机器上被拦死(模板亦内部自相矛盾)。**建议与 serve_start 配置面同批修** |
|
|
139
|
+
| 9 | `hive/hive_mcp/mcp_server.py:1261-1266` | low | **留档**:`params.name` 为非字符串 dict/list 时 `_DISPATCH.get` 抛 TypeError 逃成 `id=null` 的 -32603(id 契约破损,不崩 server)。**建议随 N231 同文件一并补 name 类型闸** |
|
|
140
|
+
| 10 | `hive/interop/note-ledger-write-fix.md:31` 等 5 处 + `hive/README.md:26` | low | **留档**:公开仓追踪面含本机用户目录绝对路径/私有目录/用户名,实测不在 npm 发布清单(1554 件、hive 命中 0)内、R3 只扫清单 ⇒ 发布门禁盲区。**建议单列「发布/泄漏面」小批**并顺带扩 `scripts/check_publish_artifact.py` R3 正则盲区 |
|
|
141
|
+
| 11 | `scripts/interop_gate.py:73` | low | **留档**:门禁只兑现 docstring 三判据之一(`failure_reason` 非空→exit 1、`verdict` 类型非法→exit 3 均未实现),自相矛盾 verdict 被放行。**建议与 gate 实现面一并修** |
|
|
142
|
+
|
|
143
|
+
**既存·非本轮引入·需源码改动处置(材料「合规自检」fixedViolations 申报,本报告如实转述且不写其字面路径)**:`hive/src/scheduler.rs:494` 的注释含**本机盘符绝对路径**(`git blame` 确认属提交 `fbe96a1d2`,非本轮 diff 新增行),违反「内容政策·清单 2」。处置=把该注释的盘符段改为中性表述;因属**源码编辑**,超出报告撰写员「只写报告文件、不得改源码」的边界,**须路由到源码编辑步骤或主会话收口,不在本轮报告落盘内**。
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## 六、纪律合规声明
|
|
148
|
+
|
|
149
|
+
1. **未 commit**:本轮全部修复**仅落工作区**(9 项 `M` + 2 项新守卫 `??`),**无任何 commit**;提交由编排会话执行。本席**未改任何产品文件**(开工 `git status --porcelain`=12 项,收尾=13 项=原 12 项逐条一致 + 本报告自身 `docs/eval/缺陷挖掘_自主迭代_v26.md`)。
|
|
150
|
+
2. **攻击复现环境**:所有攻击/红基线复现均在**系统临时目录 + 哑主密钥 + 临时令牌库**内进行(材料各席声明,含隔离 serve + `taskkill /T /F`/`proc.kill` 收尾),未触**真实令牌库、在役数据目录、在役 serve**;本报告会话实跑的两条守卫(`test_n233`/`test_n232`)亦用系统临时目录内独立 `CARGO_TARGET_DIR` 与临时池,**未写 `hive/target/`、未碰在役二进制**。
|
|
151
|
+
3. **结论引证**:本报告每条结论均引 `path:line`(现工作区行号,关键处经本会话读取核实)或本会话实跑输出;凡「材料所给」的探针输出(含各席复现读数、红基线数字、攻防前后对比、他席守卫断言数)**均已标注来源**,**未冒充为本席实跑**。四区扫描与复核的探针输出来自工作流各扫描/复核席(材料所给),本席未复跑其脚本。
|
|
152
|
+
4. **编号纪律**:新号自 N231 续编、全局唯一(N231–N235 五条已修);`already_covered`(N183)与 `证伪`(`id_charset_blocks.txt:13`)两条均剔除、不占新号(§3.0);**报告员未代改任何源码注释或守卫文件名**。
|
|
153
|
+
5. **本报告自身过双清单**:全文不含真实凭据/令牌字面量、不含真实个人隐私、不含本机绝对路径(工作区路径以仓库相对路径书写;系统临时目录一律写「系统临时目录」);`hive/src/scheduler.rs:494` 的本机盘符路径**仅作「存在违规需处置」的事实转述,其字面量不落入本报告**。材料「合规自检」结论为 `pass=true`(清单 1/清单 2 对改动面与新增守卫均 0 真实命中)。
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## 七、跳过项及原因
|
|
158
|
+
|
|
159
|
+
| # | 跳过项 | 原因 |
|
|
160
|
+
|---|---|---|
|
|
161
|
+
| 1 | **真实 CI(ubuntu runner)** | 不接触在役面/网络面;本轮以本机 `run_tests.py`(320/320)与守卫直跑替代 |
|
|
162
|
+
| 2 | **`npm test` 全量 TS 套件** | 本轮定位 hive 面、TS 面无改动(`git diff --stat` 无 `src/*.ts`),未跑 TS 全量 |
|
|
163
|
+
| 3 | **cargo 全套单跑** | 未单跑 `cargo test` 全量;其读数(lib 68 / main 9 / judgment_surface 8 passed,rc=0)属材料所给。本会话由 `test_n233`/`test_n232` 守卫在系统临时目录触发**独立 crate 构建**(两守卫 firsthand 均 `结果: 0 fail`) |
|
|
164
|
+
| 4 | **四区扫描/复核探针复跑** | 探针脚本在各扫描/复核席,本席为报告撰写;其条数为材料所给(22 候选 / 22 复核 / 1 证伪),未复跑 |
|
|
165
|
+
| 5 | **各修复批红基线独立复现** | 本轮**未**由本席独立复现各批红基线(材料给出逐批红基线数字,均标注来源);本席 firsthand 只跑了修后绿态(§4-2)与全量回归(§4-1) |
|
|
166
|
+
| 6 | **N183 修复** | 属 `already_covered`(v22 台账留档·大设计决策),修复走 N183 锚绑定口径裁定,本轮不做 |
|
|
167
|
+
| 7 | **defer 11 项修复** | 材料分诊判为「排后/需单列一批/威胁模型面」,本轮 5 席已满,均留档(§5) |
|
|
168
|
+
| 8 | **其它区(md_cg / rust / swarm / compiler)深挖** | 本轮定位 hive 面深挖,其余区未列入本轮范围 |
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## 附录:双清单自查
|
|
173
|
+
|
|
174
|
+
**清单 A(材料条目逐条落表核对)**
|
|
175
|
+
- 四区扫描候选 22 条(4/4/6/8)→ §3.0 计数声明 + §3.1 表(已修 5 / 留档 11 / 剔除 2 / 覆盖 1 / 证伪 1;18 独立项 + 4 合并)。
|
|
176
|
+
- 独立复核 confirmations 22 条(21 `real` + 1 `already_covered`)→ 复核结论已逐条并入 §3.1 状态与备注;N183 的 `already_covered` 见 §3.1-17、§3.2-2。
|
|
177
|
+
- 分诊 fix 5(N231–N235)→ §2 修复①–⑤逐批落位(每批含 where / 缺陷面 / 修复 / 守卫读数(红基线→绿))。
|
|
178
|
+
- 分诊 defer 11 → §5 表 1–11 行逐条落位(含建议去向)。
|
|
179
|
+
- 分诊 rejected 2 → §3.2 表 1–2 行(证伪 1 + 已覆盖 1)。
|
|
180
|
+
- 全量回归 `320/320 通过 5 跳过 rc=0` → §4-1(本会话实跑复核一致)。
|
|
181
|
+
- 合规自检 `pass=true` + `fixedViolations`(`scheduler.rs:494` 本机盘符路径)→ §5 末段 + §6-5(仅事实转述、不落字面量)。
|
|
182
|
+
|
|
183
|
+
**清单 B(本席实跑命令与结果,逐条可复现)**
|
|
184
|
+
1. `PYTHONUTF8=1 python -X utf8 scripts/run_tests.py --jobs 4` → `SUMMARY 320/320 通过,5 跳过`、rc=0(`grep -c '^PASS'`=320)。
|
|
185
|
+
2. `PYTHONUTF8=1 python -X utf8 -m hive.test_mcp_entry_guard` → `结果: 0 fail`。
|
|
186
|
+
3. `PYTHONUTF8=1 python -X utf8 -m hive.test_orch` → `99 passed, 0 failed`。
|
|
187
|
+
4. `PYTHONUTF8=1 python -X utf8 -m hive.test_exec_cmd` → `RESULT: ALL_PASS`。
|
|
188
|
+
5. `PYTHONUTF8=1 python -X utf8 -m hive.test_n233_status_write_fail` → `结果: 0 fail`(13 条 `[ok]`)。
|
|
189
|
+
6. `PYTHONUTF8=1 python -X utf8 -m hive.test_n232_anchor_expectation` → `结果: 0 fail`(10 条 `[ok]`,含 E「live 面执行器运行期抹 nonce 也救不了伪造产物」)。
|
|
190
|
+
7. `git -C <repo> grep -ohE 'N[0-9]{3,4}' | tr -d 'N' | sort -n -u | tail` → `232 233 234 235 802`(最大实占 N235)。
|
|
191
|
+
8. `git -C <repo> ls-files | grep -iE 'N2[0-9][0-9]'` → 守卫文件名实占表(§3.0)。
|
|
192
|
+
9. `git -C <repo> status --porcelain` / `git diff --stat` → 12 项(9 `M` + 2 `??` 新守卫 + `?? .zcode/`);`599 insertions(+), 68 deletions(-)`。
|
|
193
|
+
10. 读码核实(现码行号):`hive/hive_mcp/mcp_server.py:1308-1311`;`hive/orch.py:87-91/:459/:655`;`hive/src/scheduler.rs:678/:894-915/:856-866/:877/:944-958/:963/:1032-1043/:1096-1109/:1119`;`hive/src/job.rs:551/:558`;`hive/exec_cmd.py:40/:125/:288-290`;`hive/exec.py:979-982`;`md_cg/units.py:331-347`;`scripts/interop_gate.py:73`;`hive/src/scheduler.rs:494`(本机盘符路径,仅定位不落字面量)。
|
|
194
|
+
|
|
195
|
+
**本会话读数补录**
|
|
196
|
+
- 本轮共 **6 处 firsthand 读数**(全量回归 320/320 + 五条守卫)均已在上文落定;`hive.test_n232_anchor_expectation` 的 `结果: 0 fail` 为**后台任务完成后回填**(清单 B-6),与 §4-3 一致。
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
# 缺陷挖掘 · 自主迭代 第 28 轮报告(compiler 面深挖)
|
|
2
|
+
|
|
3
|
+
- **报告文件**:`docs/eval/缺陷挖掘_自主迭代_v27.md`(文件序号 v27;**轮次号为第 28 轮**——文件序号与轮次号不一一对应,v26 = 第 27 轮 hive 面深挖)。
|
|
4
|
+
- **扫描域**:`compiler/` 域(中文术数编译器),四区 = lex-parse / vm-pbc / semantics / tools-speedup(末区含一条已定位速收项 `md_cg/consistency.py`+`md_cg/nodefile.py`)。
|
|
5
|
+
- **材料与口径声明**:本报告由本轮 ask 给定的六份材料(①四区候选与独立复核 / ②分诊结论 / ③各条修复守卫读数 / ④全量回归 / ⑤双清单自检 / 分诊 `numberingEvidence`)编译而成。凡属材料所给的第一手探针输出(各席复现读数、红基线数字),条目内一律标注「**材料所给**」并注明来源(区/席);凡属**本报告会话实跑**的结果集中在 §四,标注确切命令与输出。材料中的行号为扫描期行号,本报告对已核对处改用**现工作区行号**(本会话逐处读取核实),与材料不一致处已在条目内注明。
|
|
6
|
+
- **本轮修复上限**:workflow 脚本常量 `MAX_FIX = 5`(`.zcode/workflow-drafts/缺陷迭代第28轮compiler面深挖.dwf.ts:124`),故分诊 `fix` 列 7 条中只落地前 5 条(N236–N240)。
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 一、执行摘要
|
|
11
|
+
|
|
12
|
+
1. **四区扫描与独立复核**(材料所给,四区扫描席+复核席):候选 **19** 条 → 复核结论 **属实 12 / `already_covered` 7 / `false_positive` 0**。7 条 `already_covered` 分别挂既有号 N104 / N102 / N150(×2)/ N153 / N99 / N7(本会话实跑 `git grep -l <号> -- docs/eval` 确认这些号在既有报告内确有登记,见 §四-②)。
|
|
13
|
+
2. **分诊**(材料所给,分诊席):`fix 7`(N236–N242)/ `defer 4` / `rejected 0`;编号自树内实占最大值 N235 续编(§四-①)。
|
|
14
|
+
3. **实际修复**(材料所给 ③,脚本上限截断):**本轮实修 5 条 = N236 / N237 / N238(均 high)/ N239 / N240**,各配 1 件新守卫,全部 `status=verified`。**分诊列出的 N241 / N242 超出 `MAX_FIX`,未进入修复批次**——本会话复核确认:`git grep -E 'N241|N242'` 全树 **0 命中**,`md_cg/nodefile.py` **未在工作区改动面内**(`git status --porcelain` 仅 5 项 `M`,不含 nodefile.py),其 `has_non_applicable`(:461-467)与 `positive_body`(:474-492)**仍是旧口径**(详见 §二-附 与 §五)。
|
|
15
|
+
4. **全量回归**(材料所给 ④ + **本会话实跑**):`python -X utf8 scripts/run_tests.py --jobs 4` → **325/325 通过、5 跳过、退出码 0**(§四-③)。
|
|
16
|
+
5. **遗留**:N241 / N242(超限未落地)+ 4 条 `defer`(`name_checker.py:572` 条件空间清零 / `_check_identifier` 宽松自声明读取面 / `analyzer.py` 两处工具面计数 / `SEMANTICS.md` 内建名可写)——去向见 §五。
|
|
17
|
+
6. **修复性质**:本轮 5 条修复均属「**静默给出错误结果 / 崩溃 / 数据丢失**」面(3 条 high):未定义函数调用致 VM 空栈裸穿+残缺字节码(N236)、调用实参条数不校验致少参 IndexError/多参残值(N237)、写入期自否定闸把合法无冒号 CCG 节点恒判 REJECT 并入队建单(N238)、VM 跳转目标越界负索引回绕/静默结束(N239)、表达式操作数缺失静默编译为空串常量(N240)。
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 二、修复清单(N236–N240)
|
|
22
|
+
|
|
23
|
+
> 每条给出:**where**(现工作区行号,本会话核读处)· **缺陷面** · **修复** · **守卫红基线→绿态读数**。
|
|
24
|
+
> 红基线读数一律为**材料所给(③ 修复席)**;绿态读数为**本会话实跑**(§四-④),两处数字均如实标注来源。
|
|
25
|
+
|
|
26
|
+
### 修复① N236 —— 未定义函数调用静默编译出残缺字节码(`high`)
|
|
27
|
+
|
|
28
|
+
- **where(现工作区)**:`compiler/compiler.py:241-267`(`_call_expr`;未定义名判定与抛错 `:245-253`,实参条数判定 `:255-264`)· `compiler/name_checker.py:455-458`(新增登记面 `function_params`)· `:475-484`(`check()` 预扫描顶层 `FUNC_DEF`)· `:764-790`(`_check_expression` 的 `CALL_EXPR` 分支)。消费端 `compiler/condition_vm.py:291`(`STORE_NAME` 空栈 `pop`)为**材料所给**行号(本会话未读该行)。
|
|
29
|
+
- **缺陷面**(材料所给,① 复核席 亲自复现):`_call_expr` 对未定义函数名只 `warnings.append(...)` 后 `return`——**不发 `CALL`、也不补占位值**;已求值的实参留在栈上而赋值语句仍发 `STORE_NAME`,零实参调用时栈空 → VM `STORE_NAME` `pop` 空栈裸穿 `IndexError`(`run` 只捕 `VMHalt`/`MemoryError`)。端到端:`compile-pbc` 退出码 0(1 条指令),`run` 整段 traceback 退出码 1。违反 `compiler/api.py:192-194` 自述契约「不支持的操作必须编译 fail,而非 success+非法/残缺产物」。裸语句形态 `未知函数()。` → `code=[]`(整句静默丢弃)。
|
|
30
|
+
- **修复**(材料所给 ③):双点同修——① `name_checker` 是两入口(`compiler.compile_source` 与 `api.compile_source`)唯一共享前端,`check()` 预扫描顶层 `FUNC_DEF` 填 `function_params`,`CALL_EXPR` 分支对「不在表内」记 `self.errors`(弃 `_check_identifier` 自动声明);② `compiler._call_expr` 内**既有**的 `e.name not in self.funcs` 判定由 `warning+return` 改为 `raise SyntaxError`,由 `compile_source` 已有的窄捕获接住——单靠①在 `strict=False`(`pbc.compile_to_pbc` 默认径)仍会产出残缺字节码,故②不可省。
|
|
31
|
+
- **守卫**:`compiler/tests/test_undefined_call_n236.py`。
|
|
32
|
+
- **红基线**(材料所给,修复席):回退两文件至 `git show HEAD` 版后 `PYTHONUTF8=1 python compiler/tests/test_undefined_call_n236.py` → **3/9 通过,EXIT=1**(`甲 = 未知函数()。` → `ok=True/errors=[]/code=[(STORE_NAME,'甲')]`;裸语句 → `ok=True/code=[]`;`strict=False` 仍 `ok=True`;api 两形态 `success=True` 且 code 非空;VM 裸穿 `IndexError: pop from empty list`)。
|
|
33
|
+
- **绿态**(**本会话实跑**):`python -X utf8 -m compiler.tests.test_undefined_call_n236` → **9/9 通过**。既有正向对照(递归阶乘 24 / 前向引用互调 11 / API 合法定义 success)在红基线中即已绿。
|
|
34
|
+
- **改动面**(本会话 `git diff --numstat` 实测,N236+N237 累计):`compiler/compiler.py +19/-3`、`compiler/name_checker.py +44/-5`。
|
|
35
|
+
|
|
36
|
+
### 修复② N237 —— 调用实参条数与形参表不校验(`high`)
|
|
37
|
+
|
|
38
|
+
- **where(现工作区)**:`compiler/name_checker.py:776-790`(`CALL_EXPR` 分支按 `function_params` 比对条数)· `compiler/compiler.py:255-264`(`_call_expr` 在同一既有判据处追加条数比对并抛 `SyntaxError`)· 消费端 `compiler/condition_vm.py:361-366`(`CALL` 按 `len(param_names)` 连续 `pop`,**材料所给**行号)。
|
|
39
|
+
- **缺陷面**(材料所给,① 复核席 端到端实跑):实参**少于**形参 → 运行时栈空 `pop` 抛 `IndexError` 裸穿 CLI `run` 入口(编译期零错误零警告);实参**多于**形参 → 多出的实参残值永久留在值栈上(静默语义错)。全仓 `grep arity/参数个数` 零命中。
|
|
40
|
+
- **修复**(材料所给 ③):登记面由「函数名集合」升为 `Dict 名→形参表`;`CALL_EXPR` 分支按表比对,已定义但 `len(args) != len(params)` → 记 `errors`「实参个数不符」;`_call_expr` 在同一既有判据处追加同一比对并抛 `SyntaxError`(同样为 `strict=False` 兜底)。参数形态经 `parser.py:644-654` 核实仅收 `LPAREN` 内 `IDENTIFIER`、无默认值/可变参,故「条数相等」即正确判据。
|
|
41
|
+
- **守卫**:`compiler/tests/test_call_arity_n237.py`。
|
|
42
|
+
- **红基线**(材料所给,修复席):回退后 `PYTHONUTF8=1 python compiler/tests/test_call_arity_n237.py` → **4/13 通过,EXIT=1**(少参 `ok=True/code 含 CALL(23,(1,['甲','乙']))` 仅 1 个 `PUSH_CONST`;多参 `ok=True`;`strict=False` 同样 `ok=True`;api 两形态 `success=True`;VM 少参裸穿 `IndexError`、多参竟执行错配字节码)。
|
|
43
|
+
- **绿态**(**本会话实跑**):`python -X utf8 -m compiler.tests.test_call_arity_n237` → **13/13 通过**(少参/多参两形态 VM 入口含 `strict=False` 与 API 入口均 `ok=False/success=False`、`code` 为 `None/''`)。
|
|
44
|
+
|
|
45
|
+
### 修复③ N238 —— 写入期自否定闸把合法无冒号 CCG 节点恒判 REJECT(`high`)
|
|
46
|
+
|
|
47
|
+
- **where(现工作区)**:`md_cg/consistency.py:54`(新增模块级 `from . import nodefile`)· `:254-299`(`_body_text`:原本地判据「`s.startswith("#")` 且含冒号」→ 复用单点 `nodefile._ccg_heading_rest`+整段字段剥除)· 命中点 `:607`(`body = _body_text(content)`)与 `:702`(`e_body = _body_text(body)`)· 飞轮侧 `md_cg/writepipe.py:296-302`(`check_consistency(..., auto_flywheel=True)`)与 `:312`(`blocked = (v == "REJECT" and oc in ("reject","defer"))`,**只读核实、未改**)。
|
|
48
|
+
- **缺陷面**(材料所给,① 复核席 实跑):`_body_text` 只剥「以 `#` 开头**且含冒号**」的行,而 CCG 标题形态已由 `md_cg/nodefile.py:218-248` 与 `md_cg/mdcos.py:231-237` 单点定案为「**冒号可有可无**」(`md_cg/test_ccg_form_parity.py` 验收 PASS)。用「标题行 + 换行 + 值行」书写的六要素节点,其「不适用条件」值行既不以 `#` 开头也无冒号 → 残留进 `_body_text` 正文 → L1-a 的 `_ban_hit(body, neg)` 自命中(`neg` 去掉「不得」前缀后仍是 `body` 子串)→ 恒判 `self_negation / strength=1.0` → `REJECT` → 写链按 `on_conflict` 拦入 `review_queue` 并自动建飞轮工单。同一内容写成带冒号形态则 `_body_text == ''`、`verdict=BLINDSPOT`、正常落盘。合法节点被反着拦。
|
|
49
|
+
- **修复**(材料所给 ③):`_body_text` 剥除判据改为复用**单点** `nodefile._ccg_heading_rest`(`^#\s*<要素>`,与写入闸门 `data/policy.json` 同一行语义、与 `ccg_mark_present`/`ccg_field_value`/`mdcos._ccg_field` 同源),并剥「标题行在即已声明」的**整段字段**:行内带值只剥该行;裸标题连同其后首个非空、非标题行(值行)一并剥除。要素名取真源 `nodefile.CCG_MARKS`(不另抄词表)。判别力未削弱(正文真含禁令短语仍命中)。**如实披露两处有意行为变化**(按 ask 以单点取代本地规则的直接后果,全量 325/325 无回归):①非 CCG 的注释行(如 `# 备注:x`)不再被剥;②缩进标题不再被剥——与单点文档化边界及写入闸门同。
|
|
50
|
+
- **守卫**:`md_cg/test_n238_body_text_parity.py`。
|
|
51
|
+
- **红基线**(材料所给,修复席):回退 `md_cg/consistency.py` 至 `git show HEAD:` 版后 `PYTHONUTF8=1 python -m md_cg.test_n238_body_text_parity` → **10/37 PASS、27 FAIL、EXIT=1**(带冒号 `_body_text` 剥净 → `('BLINDSPOT',0.0,())`;无冒号/混合形态残留值行 → `('REJECT',1.0,(('self_negation',1.0),))`;合法无冒号节点 `flywheel_step` 调用 1 次)。
|
|
52
|
+
- **绿态**(**本会话实跑**):`python -X utf8 -m md_cg.test_n238_body_text_parity` → **`ccg_body_text_n238: PASS=37 FAIL=0`**。回归对照(**本会话实跑**):`python -X utf8 -m md_cg.test_ccg_form_parity` → **`ccg_form_parity: PASS=96 FAIL=0`**。
|
|
53
|
+
- **改动面**(本会话 `git diff --numstat` 实测):`md_cg/consistency.py +38/-6`(含 docstring),新增守卫 1 件。
|
|
54
|
+
|
|
55
|
+
### 修复④ N239 —— VM 跳转目标越界:负索引回绕 / 超界静默结束(`high`)
|
|
56
|
+
|
|
57
|
+
- **where(现工作区)**:`compiler/condition_vm.py:85-87`(`VMResourceError` 文档串增 `kind="jump"`)· `:175-177`(`reset` 置 `_code_len=None`)· `:193`(`run` 置 `self._code_len = len(code)`)· `:238-265`(新增 `_jump` 单点)· 接线点 `:335`(`JUMP`)· `:338`(`JUMP_IF_FALSE`)· `:357`(`ZHIZU`)· `:409`(`CALL entry_ip`)· `:417`(`RETURN ret_ip`)。
|
|
58
|
+
- **缺陷面**(材料所给,① 复核席 实跑):跳转目标直接写 `self.ip`,全流程无 `[0, len(code))` 范围校验——负目标被 Python 负索引**静默回绕**(执行到 `code` 末位、跳过本应执行的指令),`>= len(code)` 的目标令 `while self.ip < len(code)` 直接为假而**静默结束**(`halt=None`)。两条路径都不报错、无诊断。经 `.pbc` 可达(`pbc.py` `deserialize` tag2 以 `struct.unpack_from("q")` 承载任意 int64)。
|
|
59
|
+
- **修复**(材料所给 ③):写入 `self.ip` 的跳转目标统一走新增单点 `_jump(target)`,越界抛结构化 `VMResourceError("jump")`(复用既有 N149 结构化错误通道),负值不回绕、超界不静默结束;非 int(或 `bool`)地址归入同一错误。**关键裁定:上界取 `<= len(code)` 而非 `<`**——`== len(code)` 是「跳到程序末尾」的既有语义,编译器自身就产出该目标(`test_defect_regression` ④a 钉死「知足达标 → 其后 止 被跳过」);临时收紧为 `<` 会使 `compiler.tests.test_defect_regression` 变红(合法产物被自己的防护打红)。地址在**写入处**校验,未发生的跳转不改变既有程序行为。
|
|
60
|
+
- **守卫**:`compiler/tests/test_jump_target_guard_n239.py`。
|
|
61
|
+
- **红基线**(材料所给,修复席):回退 `condition_vm.py` 至 `git show HEAD:` 版后 `PYTHONUTF8=1 python compiler/tests/test_jump_target_guard_n239.py` → **6/17 通过、11 FAIL、EXIT=1**(`[(JUMP,-1),…]` → `halt='halt'/symbols={}`;`JUMP 999 > len` → `halt=None`;经 `.pbc` 载入 `JUMP -1` 同样静默执行;`JUMP 2.0` → 裸穿 `TypeError: list indices must be integers or slices, not float`)。
|
|
62
|
+
- **绿态**(**本会话实跑**):`python -X utf8 -m compiler.tests.test_jump_target_guard_n239` → **17/17 通过**(五类写入 `self.ip` 的跳转在负目标/超界/float 目标下均得 `VMResourceError('jump')`;目标 `== len(code)` 合法、`== len+1` 拒;`JUMP 0` 自环仍 `RecursionError`(步数上限契约)、旗舰样例仍 `trust=0.9/halt=None`、递归阶乘(4)=24)。
|
|
63
|
+
- **改动面**(本会话 `git diff --numstat` 实测):`compiler/condition_vm.py +41/-7`。
|
|
64
|
+
|
|
65
|
+
### 修复⑤ N240 —— 表达式操作数缺失静默编译为空串常量(`high`)
|
|
66
|
+
|
|
67
|
+
- **where(现工作区)**:`compiler/parser.py:1102-1136`(`_parse_expression` 的 `else` 兜底分支)· `:1110-1119`(`_EXPR_STOP`,`:1113` 新增 `TokenType.RPAREN`)· `:1126-1135`(空文本记 `self.errors` 后仍返回占位 `LiteralNode`)· token 来源 `compiler/lexer.py:190`(`)`/`)` → `RPAREN`,**材料所给**行号)。
|
|
68
|
+
- **缺陷面**(材料所给,① 复核席 实跑):`_parse_expression` 在表达式位置取不到操作数 token 时走 `else` 分支,返回 `LiteralNode("".join(parts).strip(), "string")`;`)`(RPAREN) 不在 `_EXPR_STOP` 内 → 被当字符串吃进操作数。实测 `甲 = 1 + 。` → 产物含 `PUSH_CONST ''`;`甲 = (1 + )。` → 产物含 `PUSH_CONST ')'`;`若 则 德 0.1。` → 产物含 `if "":`。三例双入口均 `success/ok=True、errors=[]`——**条件缺失/操作数缺失被静默编译为空串常量**(VM 会把 `''` 当算术操作数)。
|
|
69
|
+
- **修复**(材料所给 ③):① `_EXPR_STOP` 补入 `TokenType.RPAREN`;② 兜底收集文本 strip 后为空时记 `self.errors`(`L{line}:C{col} 表达式缺少操作数,实际得到: '<当前token值|EOF>'`),仍返回占位 `LiteralNode` 以保持 AST 完整(与本文件既有「以 0.0 占位保持 AST 完整」同一约定),由既有 `errors` 通道终止编译。**如实披露两处未改的面**(不在本 ask 范围、经测试未被本改动影响):(a) `德 。`(指令缺操作数)仍产出 `DE 0.0` 不报错——那是 `compiler._instr` 的既有回落,不经本分支;(b) `parser.py:1023-1024` 的 `current_token is None` 早返回仍返回静默默认空串——实测六类边界输入全部落入本次修好的 `parts` 分支,为保持最小面未动。
|
|
70
|
+
- **守卫**:`compiler/tests/test_expr_operand_missing_n240.py`。
|
|
71
|
+
- **红基线**(材料所给,修复席):回退 `parser.py` 至 `git show HEAD:` 版后 `PYTHONUTF8=1 python compiler/tests/test_expr_operand_missing_n240.py` → **5/17 通过、12 FAIL、EXIT=1**(`甲 = 1 + 。` → `code` 含 `(PUSH_CONST,'')`;`甲 = (1 + )。` → 含 `(PUSH_CONST,')')`;条件右缺 → `(PUSH_CONST,'')` 当比较操作数;api 四形态 `success=True/errors=[]`)。
|
|
72
|
+
- **绿态**(**本会话实跑**):`python -X utf8 -m compiler.tests.test_expr_operand_missing_n240` → **17/17 通过**(四形态两入口均 `ok=False/success=False`、`code` 为 `None/''`,`errors` 点名「表达式缺少操作数」;合法算式/比较回归对照全绿)。
|
|
73
|
+
- **改动面**(本会话 `git diff --numstat` 实测):`compiler/parser.py +18/-1`。
|
|
74
|
+
|
|
75
|
+
### 附:分诊已编号但**未落地**的两条(N241 / N242)
|
|
76
|
+
|
|
77
|
+
- **N241**(`md_cg/nodefile.py:461-467` `has_non_applicable` 只认带冒号形态;唯一写入点 `md_cg/mdcg.py:1910/2561/4585`):分诊列为 `fix`,修法为改调同文件 `:386-402` 的 `ccg_mark_present(content,'不适用条件')`。
|
|
78
|
+
- **N242**(`md_cg/nodefile.py:475-492` `positive_body` 只剥「`#` 且字段名匹配」那一行):分诊列为 `fix`,修法为对无冒号两行形态同样剥离其值行。
|
|
79
|
+
- **状态(本会话实跑确认)**:`git grep -E 'N241|N242'` 全树 **0 命中**;`md_cg/nodefile.py` **不在工作区改动面**(`git status --porcelain` 仅 `MD_cg/consistency.py` 等 5 项 `M`);本会话读 `nodefile.py:460-467` 与 `:474-492`,**仍是只认冒号的旧口径**。⇒ 两条**超本轮 `MAX_FIX=5` 上限、未进入修复批次**(非 blocked、非未做),应直接顺延下一轮(见 §五-⑤⑥)。
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## 三、发现明细(全部复核表 · 19 条)
|
|
84
|
+
|
|
85
|
+
> 复核结论与证据均**材料所给**(① 四区候选+独立复核席,各复核席亲手读码/实跑);「本会话复核」列为本报告会话对 where 行号与既占号的核对结果(§四)。
|
|
86
|
+
|
|
87
|
+
| # | where(材料所给行号) | 复核结论 | 严重度 | 既占号 | 一句话(要点) | 本会话复核 |
|
|
88
|
+
|---|---|---|---|---|---|---|
|
|
89
|
+
| 1 | `compiler/parser.py:1102-1119` | real | medium | — | 表达式兜底返回空串字面量、`)` 不在停止集 → 缺失操作数静默编译为空串常量 | 已修(N240);现码 `:1102-1136`、`RPAREN` 在 `:1113` |
|
|
90
|
+
| 2 | `compiler/lexer.py:482/:489-491` | already_covered | medium | **N104** | 未闭合字符串把换行当结束引号消费 → 其后 token 行号偏低,parser `;` 判界失效 | `git grep -l N104 -- docs/eval` 命中 v11/v18 ✔ |
|
|
91
|
+
| 3 | `compiler/parser.py:1209-1217`、`compiler/cli/__init__.py:305-318` | already_covered | medium | **N102** | 超长算术链 `RecursionError` 在 `parse_source`/`pc ast` 两处裸抛(N102 已修主入口) | `git grep -l N102` 命中 v11/v18 ✔ |
|
|
92
|
+
| 4 | `compiler/condition_vm.py:301/:304/:323`(另 `:375/:383`) | real | medium | — | 跳转目标无范围校验:负目标负索引回绕、超界静默结束 | 已修(N239);现码 `:335/:338/:357/:409/:417` |
|
|
93
|
+
| 5 | `compiler/pbc.py:84-88`、`:100-104` | already_covered | medium | **N150** | `deserialize` 长度前缀不做「m ≤ 剩余字节」校验,静默吞并后续指令 | `git grep -l N150` 命中 v18 ✔ |
|
|
94
|
+
| 6 | `compiler/pbc.py:67-71/:89-93/:94-104`+`condition_vm.py:291/:303/:321/:324-341` | already_covered | medium | **N150** | 畸形 `.pbc` 与 VM 空栈 `pop` 一律裸异常穿透(N149 只覆盖单步代价/分配/墙钟) | 同上 ✔ |
|
|
95
|
+
| 7 | `compiler/compiler.py:241-250`+`condition_vm.py:291/:361-366` | **real** | **high** | — | 未定义被调函数名不致命:`_call_expr` 只 warning 后返回、不发 `CALL` 也不补占位值 → VM 空栈 `pop` 裸穿 | 已修(N236);现码 `:241-267`、抛错 `:245-253` |
|
|
96
|
+
| 8 | `compiler/name_checker.py:526`+`compiler.py:249`+`condition_vm.py:361-366` | **real** | **high** | — | 调用实参条数与形参表完全不校验:少参 IndexError、多参残值静默语义错 | 已修(N237);现码 `name_checker.py:764-790`、`compiler.py:255-264` |
|
|
97
|
+
| 9 | `compiler/name_checker.py:572` | real | medium | — | `_check_condition` 末尾**无条件** `current_condition_space = None`(非恢复进入前值)→ 顶层赋值建立的「伴侣」空间被其后任意条件语句抹掉,0.15 上限被旁路 | **defer**(§五-①);本会话未读该行,判据为材料所给 |
|
|
98
|
+
| 10 | `compiler/name_checker.py:653-661`、`:808-831`、`:834-854` | already_covered | medium | **N153** | 0.15 情感权重上限只认数值字面量,引号数值串/函数返回值/变量间接静默放行 | `git grep -l N153` 命中 v18/v19/v20 ✔ |
|
|
99
|
+
| 11 | `compiler/name_checker.py:322-328` vs `compiler.py:179-185`/`api.py:100-207` | already_covered | medium | **N99** | 同一句 `德 累积信任值。` 两入口结论相反(api `success=True`、VM `ok=False`) | `git grep -l N99` 命中 v11/v18 ✔(材料称 `__init__.py:34` 有微漂,`__init__.py:20` 才是示例正文) |
|
|
100
|
+
| 12 | `compiler/name_checker.py:766-805`(第 4 步自声明 `:797-805`) | real | medium | — | 宽松自动声明对**读取**同样生效:未赋值标识符读取 `ok/success=True` 零诊断,VM 运行期才 `NameError` | **defer**(§五-②) |
|
|
101
|
+
| 13 | `compiler/analyzer.py:171-179` | real | low | — | `def_use_chains` 双键遍历(`children` 与具名子字段同指)→ use 计数放大(实为 1 报 2/4) | **defer**(§五-③) |
|
|
102
|
+
| 14 | `compiler/analyzer.py:133-136` | real | low | — | 主程序段调用边被整体丢弃(顶层 `current` 恒 None),与 `:122` docstring「含主程序段调用」相反 | **defer**(§五-③) |
|
|
103
|
+
| 15 | `compiler/SEMANTICS.md:19-20` vs `condition_vm.py:281-299` | real | low | — | 文档标「写=—」的内建名(信任阈值/伴侣/…)实际可被赋值遮蔽,读语义被破坏 | **defer**(§五-④) |
|
|
104
|
+
| 16 | `compiler/api.py:27`+`api.py:100-207`+`cli/__init__.py:37-38,47,128,169` | already_covered | medium | **N7** | `CompileOptions.strict` 在统一入口从未被读取(warnings 永不升级),CLI `--strict/--no-strict` 是空操作 | `git grep -l N7` 命中 v3/v4/v11/v18 等 ✔ |
|
|
105
|
+
| 17 | `md_cg/consistency.py:254`、`:576`、`:774`、`:105`、`md_cg/writepipe.py:296-302` | **real** | **high** | — | 写入期自否定闸只剥含冒号的 `#` 行 → 无冒号合法节点恒判 `self_negation/strength=1.0` → REJECT 入队+建单 | 已修(N238);现码 `:254-299`、`from . import nodefile` 在 `:54` |
|
|
106
|
+
| 18 | `md_cg/nodefile.py:461`+`mdcg.py:1910/2561/4585` | real | medium | — | `has_non_applicable` 只认带冒号形态 → 无冒号节点的 `has_neg_conditions` 在健康/巡检/预测/洞察/导出面整片漏计 | **未落地**(N241,§二-附) |
|
|
107
|
+
| 19 | `md_cg/nodefile.py:475-492` | real | low | — | `positive_body` 只剥标题行,无冒号形态的值行残留为**召回键** | **未落地**(N242,§二-附) |
|
|
108
|
+
|
|
109
|
+
**计数核对**:19 条 = 属实 **12**(#1、4、7、8、9、12、13、14、15、17、18、19)+ `already_covered` **7**(#2、3、5、6、10、11、16)+ `false_positive` **0**。分诊对 12 条属实的处置:`fix 7`(#1→N240、#4→N239、#7→N236、#8→N237、#17→N238、#18→N241、#19→N242)+ `defer 5 条候选`(#9、#12、#13+#14 合并一条、#15)= 12 ✔(材料所给)。
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## 四、实跑读数(本会话第一手)
|
|
114
|
+
|
|
115
|
+
> 以下均为**本报告会话实际执行**的命令与输出(未标注「材料所给」的即为本席亲自读数)。测试类命令属 L1 只读判定(不改仓库/外部状态)。
|
|
116
|
+
> L1 直跑:`python -X utf8 scripts/run_tests.py --jobs 4` 等只读门禁/守卫 —— 风险=无写入、频次=低频、可逆=不可逆性为零(纯读)。
|
|
117
|
+
|
|
118
|
+
**① 编号实占扫描(本会话实跑,与分诊 `numberingEvidence` 对齐)**
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
$ git grep -ohE 'N[0-9]{3,4}' HEAD -- . | tr -d 'N' | sort -n -u | tail -6
|
|
122
|
+
231
|
|
123
|
+
232
|
|
124
|
+
233
|
|
125
|
+
234
|
|
126
|
+
235
|
|
127
|
+
802
|
|
128
|
+
```
|
|
129
|
+
⇒ 提交面 **HEAD 实占最大 = N235**;`N802` 为 `hive/test_exec_empty_response.py` 与 `md_cg/generation.py` 的 flake8 `# noqa: N802` 码(**非缺陷号**,本会话 `git grep -nE 'N802' HEAD` 命中即 `# noqa` 注释行)。故本轮新号自 **N236** 续编。工作区(含本轮改动)扫描为 `230 … 240 + 802`——即 N236–N240 已随修复落进源码注释;`git grep -nE 'N241|N242'` → **0 命中**。
|
|
130
|
+
|
|
131
|
+
**② 既占号在既有报告内确有登记(本会话实跑)**
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
$ for n in N7 N99 N102 N104 N150 N153; do git grep -l "$n" -- docs/eval; done
|
|
135
|
+
```
|
|
136
|
+
⇒ N7→v3/v4/v11/v18…、N99→v11/v18、N102→v11/v18、N104→v11/v18、N150→v18、N153→v18/v19/v20(文件名略)。材料 ①② 的 7 条 `already_covered` 挂号**全部落到既有报告**,非新编。
|
|
137
|
+
|
|
138
|
+
**③ 全量回归(本会话实跑,对齐材料 ④ 与脚本 `SUITE`)**
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
$ PYTHONUTF8=1 python -X utf8 scripts/run_tests.py --jobs 4
|
|
142
|
+
...
|
|
143
|
+
===== SUMMARY 325/325 通过,5 跳过(依赖缺失/平台不符) =====
|
|
144
|
+
rc=0
|
|
145
|
+
```
|
|
146
|
+
⇒ **退出码 0**,与材料 ④「退出码 0(通过)」一致。(另一次不带 `--jobs` 的同命令亦为 325/325。)注:本机无 `pytest`(`python -m pytest` → `No module named pytest`),守卫一律按仓内方式 `python -X utf8 -m <module>` 运行。
|
|
147
|
+
|
|
148
|
+
**④ 五件新守卫(本会话实跑,对齐材料 ③ 绿态)**
|
|
149
|
+
|
|
150
|
+
```
|
|
151
|
+
$ python -X utf8 -m compiler.tests.test_undefined_call_n236 → 9/9 通过
|
|
152
|
+
$ python -X utf8 -m compiler.tests.test_call_arity_n237 → 13/13 通过
|
|
153
|
+
$ python -X utf8 -m compiler.tests.test_jump_target_guard_n239 → 17/17 通过
|
|
154
|
+
$ python -X utf8 -m compiler.tests.test_expr_operand_missing_n240→ 17/17 通过
|
|
155
|
+
$ python -X utf8 -m md_cg.test_n238_body_text_parity → ccg_body_text_n238: PASS=37 FAIL=0
|
|
156
|
+
$ python -X utf8 -m md_cg.test_ccg_form_parity → ccg_form_parity: PASS=96 FAIL=0
|
|
157
|
+
```
|
|
158
|
+
⇒ 与材料 ③ 各条 `greenResult` 逐一吻合(N236 9/9、N237 13/13、N239 17/17、N240 17/17、N238 37/37、parity 96/96)。
|
|
159
|
+
|
|
160
|
+
**⑤ 改动面(本会话实跑)**
|
|
161
|
+
|
|
162
|
+
```
|
|
163
|
+
$ git diff --numstat
|
|
164
|
+
19 3 compiler/compiler.py
|
|
165
|
+
41 7 compiler/condition_vm.py
|
|
166
|
+
44 5 compiler/name_checker.py
|
|
167
|
+
18 1 compiler/parser.py
|
|
168
|
+
38 6 md_cg/consistency.py
|
|
169
|
+
$ git status --porcelain
|
|
170
|
+
M compiler/compiler.py / compiler/condition_vm.py / compiler/name_checker.py / compiler/parser.py / md_cg/consistency.py
|
|
171
|
+
?? .zcode/ + 5 件新守卫(N236/N237/N239/N240 的 compiler/tests/* + md_cg/test_n238_body_text_parity.py)
|
|
172
|
+
```
|
|
173
|
+
⇒ 与材料 ③ 各条「改动面」逐项一致(N236+N237 合并计 `compiler.py +19/-3`、`name_checker.py +44/-5`)。**未改任何其它产品文件**;`md_cg/nodefile.py` 不在改动面(N241/N242 未落地之实据)。
|
|
174
|
+
|
|
175
|
+
**⑥ 现工作区行号核读(本会话 Read 实读,供 §二/§三 采信)**
|
|
176
|
+
|
|
177
|
+
- `compiler/compiler.py:240-267`:`_call_expr`,未定义名 `raise SyntaxError` 在 `:251-253`、条数比对 `raise` 在 `:261-264`;`compile_source` 的 `RecursionError` 窄捕在 `:275-283`(N102 在位)。
|
|
178
|
+
- `compiler/name_checker.py:455-458`(`function_params` 字段)、`:475-484`(`check()` 预扫描)、`:764-790`(`CALL_EXPR` 分支:`未定义函数` `:777-780`、`实参个数不符` `:785-790`)。
|
|
179
|
+
- `compiler/parser.py:1102-1136`:`else` 兜底分支,`_EXPR_STOP` 在 `:1110-1119`(`TokenType.RPAREN` 落在 `:1113`),空文本记错 `:1126-1135`。
|
|
180
|
+
- `compiler/condition_vm.py:238-265`:`_jump` 单点(上界 `<= len(code)`,docstring `:240-256`);`run` 置 `_code_len` 在 `:193`。
|
|
181
|
+
- `md_cg/consistency.py:254-299`:`_body_text` 单点剥除(`nodefile.CCG_MARKS` + `_ccg_heading_rest`);调用点 `:607`、`:702`。
|
|
182
|
+
- `md_cg/nodefile.py:460-467`(`has_non_applicable` 仍只认冒号)与 `:474-492`(`positive_body` 仍未剥无冒号值行)——**N241/N242 未改之实据**。
|
|
183
|
+
|
|
184
|
+
**⑦ `.zcode/` 忽略状态核读(本会话实跑,服务 §附 双清单)**
|
|
185
|
+
|
|
186
|
+
```
|
|
187
|
+
$ git status --porcelain → ?? .zcode/
|
|
188
|
+
$ git status --porcelain --untracked-files=all | grep -c zcode → 10
|
|
189
|
+
$ git check-ignore -v .zcode/commit-msg-v3.txt → 无输出,rc=1(未忽略)
|
|
190
|
+
$ find . -maxdepth 3 -name .gitignore → ./.gitignore ./.zcode/workflow-drafts/.gitignore ./.zcode/workflow-runs/.gitignore
|
|
191
|
+
$ cat .zcode/workflow-drafts/.gitignore → *
|
|
192
|
+
```
|
|
193
|
+
⇒ **结论:`.zcode/` 顶层内容未被忽略**(10 项未跟踪文件,含 `review/*.md`、`workflows/*.ts`、`plans/`、`probes/`、`commit-msg-v3.txt`),仅 `.zcode/workflow-drafts/` 与 `.zcode/workflow-runs/` 因各自内嵌 `.gitignore`(内容 `*`)被忽略(`git status --ignored` 显示 `!!`)。**与材料 ⑤ 的风险结论一致**;唯材料所述「`git check-ignore` rc=1」在**带尾斜杠的目录实参**上会返回 0(实测 `git check-ignore -v .zcode/` → `.gitignore:113:`+空模式字段,系 `./.gitignore:113` 为空行的边角行为;对 `.zcode/` 内**文件**实参一律 rc=1)——如实记录该出入,不影响「该目录不会被整目录忽略、`git add -A` 会带进 10 项未跟踪文件」这一结论。
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## 五、遗留清单(`defer` 逐条 + 建议去向)
|
|
198
|
+
|
|
199
|
+
> 4 条 `defer` 为分诊裁定(材料所给),去向为本报告建议;另附 N241/N242(超限未落地)。
|
|
200
|
+
|
|
201
|
+
| 序 | where | 为何不本轮修 | 建议去向 |
|
|
202
|
+
|---|---|---|---|
|
|
203
|
+
| ① | `compiler/name_checker.py:572`(`_check_condition` 末尾无条件清零 `current_condition_space`) | 与既存号 **N153**(0.15 静态上限旁路族)**同威胁模型族**;N153 明示「须先统一静态切换检测 vs VM 运行时切换模型——整族大设计决策专项」,单修 `:572` 属半修、会进一步分裂静态/运行期口径。本会话核对材料:`:572` 确不在 N153 列出的 `where` 内,故**不判 `already_covered`、不新占号**(材料所给) | **N153 专项同批裁决**(与 N151/N153 同一 0.15 语义表专项,`v18` 已列同批拍板);须使用者裁决 |
|
|
204
|
+
| ② | `compiler/name_checker.py:766-805`(`_check_identifier` 第 4 步「完全未匹配→自动声明」对**读取**同样生效) | 读取面与「指令操作数」共用同一 `_check_identifier` 单点,收紧读取需先裁决「读取 vs 指令操作数」的区分口径(与 N95/N97 断开集合设计张力同域),否则误伤合法多词短语 | **须使用者裁决**(口径决策)后随「名实校验收紧」专项批 |
|
|
205
|
+
| ③ | `compiler/analyzer.py:171-179`(`def_use_chains` 双访计数放大)+ `:133-136`(`call_graph` 顶帧 `current` 恒 None 丢主程序段调用边) | severity=low;`analyzer.full_analysis` 全仓除自身无调用方(不在在役主链、无守卫),影响面为零 | **待 C4/analyzer 工具面启用或专项清理时同批修**(两条同文件同批) |
|
|
206
|
+
| ④ | `compiler/SEMANTICS.md:19-20` vs `compiler/condition_vm.py:281-299`(内建名标「写=—」却可写可遮蔽) | 须先裁决「内建名是否可写/遮蔽」,并统一文档表与两台 VM 实现(`swarm/rust_runtime/src/vm.rs` 同构) | **须使用者裁决**(文档/实现语义口径),随「内建名语义」专项批 |
|
|
207
|
+
| ⑤ | `md_cg/nodefile.py:461-467`(N241) | **分诊已列 `fix`,但超本轮 `MAX_FIX=5` 上限**,未进入修复批次(非 blocked) | **顺延下一轮**(单点修、复用 `ccg_mark_present` 既有单点;消费点 `mdcg.py:4866` / `export.py:185` / `insight.py:455` / `sustain.py:487` / `predict.py:319` 整片漏计) |
|
|
208
|
+
| ⑥ | `md_cg/nodefile.py:475-492`(N242) | 同上(超限未落地) | **顺延下一轮**,与 N241 同文件同「冒号口径分叉」族一批 |
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## 六、纪律合规声明
|
|
213
|
+
|
|
214
|
+
1. **未 commit**:本轮全部修复**仅落工作区**(5 项 `M` + 5 件新守卫 `??` + `.zcode/`),**无任何 commit**;提交由编排会话执行。本报告席**未改任何产品源码文件**——开工 `git status --porcelain` 与收尾逐项一致(收尾多出本报告自身 `docs/eval/缺陷挖掘_自主迭代_v27.md`)。
|
|
215
|
+
2. **攻击复现环境**(材料所给,各复核/修复席自述):临时脚本一律落系统临时目录、测毕删除,未写入仓库工作区、未触碰在役记忆库/在役 serve。本报告席**未跑任何缺陷复现脚本**,只跑只读门禁/守卫(§四)。
|
|
216
|
+
3. **行号纪律**:§二/§三/§四所用行号以**本会话现工作区实读**为准;材料中与现码不一致者(如 `name_checker.py:526` 现为 `:764-790`、`parser.py:1102-1119` 现为 `:1102-1136`)已在条目内注明。
|
|
217
|
+
4. **编号纪律**:新号自树内实占最大值 **N235** 之后连续编、全局唯一;`N802` 为 `# noqa` 码非缺陷号已剔除(§四-①)。`already_covered` 的 7 条**不占新号**并挂既有号。
|
|
218
|
+
5. **诚实标注**:凡非本席实跑的数字(红基线读数、各席探针输出、候选/复核结论)一律标注「材料所给」及来源;本席实跑集中在 §四。
|
|
219
|
+
6. **推断边界**:N241/N242 未落地一事,本报告基于「`git grep` 0 命中 + `nodefile.py` 不在改动面 + 现码仍为旧口径」判定,属**确定性检查背书**(非猜测)。
|
|
220
|
+
7. **降级声明**:本机 mdcg MCP 工具面可用,`cg(op=route)` 已按纪律 0.1 调用(返回前序轮次记忆),**无兜底降级**。
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## 七、跳过项及原因
|
|
225
|
+
|
|
226
|
+
| 项 | 原因 |
|
|
227
|
+
|---|---|
|
|
228
|
+
| **未复跑各条「红基线」** | 红基线须先把产品源码回退到 `HEAD` 版再跑守卫;ask 明令「不得改动任何产品源码文件,只写这一份报告」。故红基线一律标注**材料所给(③ 修复席)**,本席未复跑、不冒充。 |
|
|
229
|
+
| **未跑 `python -m pytest`** | 本机未装 pytest(`No module named pytest`);守卫按仓内既有方式 `python -X utf8 -m <module>` 运行(§四-④)。 |
|
|
230
|
+
| **未在役记忆库 / 在役 serve 取样** | 纪律明令不得触碰在役记忆库与 serve;材料 ①(nodefile 条)自述亦「未对在役索引做取样验证,只做纯函数读数 + 源码核对」。 |
|
|
231
|
+
| **未复核 7 条 `already_covered` 的**「既有号是否应重开」 | 属分诊/复核席裁定范围(本席只核对号是否确有既有登记,§四-②);是否重开属既有台账裁决,非本报告职责。 |
|
|
232
|
+
| **未逐条重跑 19 条候选的复现探针** | 候选复现由四区复核席各自亲手完成(材料所给,含临时脚本命令与输出);本席只做行号与既占号的现码核对(§四-⑥)。 |
|
|
233
|
+
| **`compiler/lexer.py:190`、`condition_vm.py:291/:361-366` 等行号** | 未在本会话读取,已在条目内标注「**材料所给**」,不冒充本席实读。 |
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
## 附:双清单自查
|
|
238
|
+
|
|
239
|
+
**材料 ⑤ 的双清单自检读数(材料所给,合规自检席)**:`policyClean=true`、`privacyClean=false`,命中 **6 处**,**全部位于 `.zcode/` 下、均为既有非本轮引入**(2026-10-04 早前会话产物,未跟踪、未入库;第 28 轮 compiler 改动面未含 `.zcode/`):
|
|
240
|
+
|
|
241
|
+
| where(材料所给) | 命中内容 | 处置(材料所给) |
|
|
242
|
+
|---|---|---|
|
|
243
|
+
| `.zcode/review/CTP-P5接入说明_v0.1.md:3` | 一段指向**个人数据目录**的本机盘符绝对路径字面量(同行另含真实姓名与日期) | 既存·非本轮引入;提交前从暂存面排除该目录,或对路径做占位替换 |
|
|
244
|
+
| `.zcode/review/CTP-P5接入说明_v0.1.md:107` | 一段指向本机 `_refs` 目录的盘符绝对路径字面量 | 同上 |
|
|
245
|
+
| `.zcode/review/CD-WHALE-01_矛盾发现报告_v1.0.md:3` | 一段指向用户主目录下**个人语料**的盘符绝对路径字面量 | 同上 |
|
|
246
|
+
| `.zcode/review/角色扮演一致性锚调研_v0.1.md:145` | 一行内三处本机盘符绝对路径字面量 | 同上 |
|
|
247
|
+
| `.zcode/workflows/lingshu-defect-fix.dwf.ts:10 与 :40` | 指向**本仓自身位置**的仓根硬编码盘符路径(敏感度较低) | 既存·非本轮引入;建议改相对路径或按脚本目录推导 |
|
|
248
|
+
| `.zcode/workflow-drafts/0.7.0-收口守卫盲区修复与发版编辑.dwf.ts:11` | 一段指向本机实验目录的盘符路径(双反斜杠转义形态) | 既存·非本轮引入;该路径位于被忽略的 `.zcode/workflow-drafts/`,`git status --ignored` 显示 `!!`,不入库——低风险,仅备案 |
|
|
249
|
+
|
|
250
|
+
**本报告自身自查(本会话实跑)**:
|
|
251
|
+
|
|
252
|
+
本会话对**本轮改动面 10 件文件**(`compiler/compiler.py`、`compiler/condition_vm.py`、`compiler/name_checker.py`、`compiler/parser.py`、`md_cg/consistency.py`、`compiler/tests/test_undefined_call_n236.py`、`compiler/tests/test_call_arity_n237.py`、`compiler/tests/test_jump_target_guard_n239.py`、`compiler/tests/test_expr_operand_missing_n240.py`、`md_cg/test_n238_body_text_parity.py`)执行两类正则扫描——①「盘符绝对路径形态」(单字母+冒号+目录分隔符)②「常见凭据前缀形态」(`sk-` / `ghp_` / `mdcg1.` / `tk`):
|
|
253
|
+
|
|
254
|
+
**→ 零命中(rc=1)。**
|
|
255
|
+
- 本轮**改动面 10 件文件**(5 改动 + 5 守卫):盘符绝对路径 / 凭据字面量 **零命中**。
|
|
256
|
+
- **本报告文本**:未写入任何本机盘符绝对路径,未写入任何 API key/令牌字面量;材料 ⑤ 命中项一律以「相对路径 + 中性描述」转述(个人数据目录/个人语料内容不落本报告)。
|
|
257
|
+
- **`policyClean`: true**(无政策违规内容)· **`privacyClean`(本轮改动面 + 本报告): true**。
|
|
258
|
+
- **`privacyClean`(全工作区): false**——6 处既存命中全在 `.zcode/`,**非本轮引入**;如实登记,由来单列一批处置(不属本轮源码改动面)。
|
|
259
|
+
- **`.zcode/` 未被忽略之风险(本会话实跑确证,§四-⑦)**:该目录顶层 10 项未跟踪文件不在任何忽略规则内,`git add -A` 会一并暂存;提交前须从暂存面排除 `.zcode/`,或对其中路径做占位替换。
|