@furongjun1999/dsh-memory 0.4.7 → 0.4.8
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 +92 -37
- package/codebuddy/CODEBUDDY.md +195 -185
- package/docs/Pi/345/217/257/345/255/246/344/271/240/344/274/230/347/202/271_/347/201/265/346/236/242/345/244/247/350/204/221/346/224/271/350/277/233/344/272/244/346/216/245_20260915.md +144 -0
- package/docs/README.md +111 -0
- package/docs/discipline/harnesses.yaml +215 -152
- package/docs/discipline/templates/full.md.tmpl +60 -58
- package/docs/eval//347/254/254/344/270/211/346/226/271/351/252/214/350/257/201/346/212/245/345/221/212_LoCoMo_/347/201/265/346/236/242_.md +127 -0
- package/docs/eval//347/254/254/344/270/211/346/226/271/351/252/214/350/257/201/346/212/245/345/221/212_LoCoMo_/347/201/265/346/236/242_.png +0 -0
- package/docs/eval//347/254/254/344/270/211/346/226/271/351/252/214/350/257/201/346/212/245/345/221/212_/347/201/265/346/236/242_vs_dejavu_/347/273/237/344/270/200/350/257/204/345/210/206_v7.md +202 -0
- package/docs/experiments/m4-role-probe/census.py +86 -0
- package/docs/experiments/m4-role-probe/probe.py +89 -0
- package/docs/experiments/mapped_confidence/bench_mapped_conf.py +216 -0
- package/docs/experiments/mapped_confidence/post_check.py +75 -0
- package/docs/experiments/mapped_confidence/repro_thirdparty_tol.py +83 -0
- package/docs/experiments/mapped_confidence/result_mapped_conf.json +215 -0
- package/docs/{ → hive/}/350/234/202/345/267/242/345/267/245/344/275/234/350/256/260/345/277/206_/351/241/271/347/233/256/350/256/241/345/210/222.md +14 -2
- package/docs/{README → mdcg/README}/350/257/246/347/273/206/347/211/210_v0.4.5.md +9 -9
- package/docs/{ → mdcg/}/344/270/273/344/273/243/347/220/206/345/255/220/344/273/243/347/220/206/350/256/260/345/277/206/346/236/266/346/236/204/350/256/276/350/256/241.md +1 -1
- 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 +261 -0
- package/docs/{ → mdcg/}/345/215/225/345/205/203/350/207/252/346/210/221/351/224/232/347/202/271_/347/263/273/347/273/237/346/217/220/347/244/272/350/257/215/346/240/207/345/207/206_v0.3.md +1 -1
- package/docs/mdcg//345/255/220/344/273/243/347/220/206/351/205/215/347/275/256/346/240/207/345/207/206_v0.4.md +148 -0
- package/docs/{ → mdcg/}/346/272/220/347/240/201/347/272/247/346/236/266/346/236/204/345/256/241/350/256/241_GPT/346/211/271/350/257/204/345/257/271/347/205/247_v1.0.md +2 -2
- package/docs/{ → mdcg/}/347/201/265/346/236/242/344/270/211/345/261/202/346/213/206/345/210/206/350/247/204/345/210/222_v0.1.md +181 -181
- package/docs/{ → mdcg/}/347/274/272/345/217/243/345/215/225_P0/346/224/266/345/217/243_v0.1.md +2 -2
- package/docs/{ → mdcg/}/350/256/244/347/237/245/345/233/276_G4-G8/347/274/272/345/217/243/350/243/201/345/256/232/345/215/225_v0.1.md +1 -1
- 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 +4 -4
- package/docs/{ → mdcg/}/350/256/260/345/277/206/346/223/215/344/275/234/347/263/273/347/273/237_MdCGOS/344/270/216MCP/346/216/245/345/205/245_v0.1.md +2 -2
- package/docs/plans/GridWorld/346/234/200/345/260/217/351/227/255/347/216/257/350/247/204/346/240/274_v0.1.md +176 -0
- package/docs/{ → swarm/}/350/234/202/347/276/244/344/272/222/350/201/224_v0.1.md +3 -3
- package/docs/swarm//350/234/202/347/276/244/345/220/214/351/224/231/346/243/200/346/265/213/345/256/236/351/252/214/345/215/217/350/256/256_v0.1.md +242 -0
- package/docs/theory//345/215/225/347/272/277/347/250/213/344/270/216/346/263/250/346/204/217/345/212/233/351/233/206/344/270/255_/346/227/240/344/272/211/350/256/256/347/220/206/350/256/272/346/226/207/346/241/243_v1.0.md +129 -0
- package/docs/theory//345/271/266/345/217/221/345/277/205/347/204/266/346/200/247/347/220/206/350/256/272_v0.2.md +134 -0
- package/docs/theory//346/246/202/345/277/265/345/210/206/345/261/202/345/257/271/351/275/220/350/241/250_v0.1.md +145 -0
- package/docs/{ → theory/}/347/220/206/350/256/272_/346/234/272/345/210/266_/344/273/243/347/240/201_/345/256/236/351/252/214_/347/274/272/345/217/243/347/237/251/351/230/265_v0.1.md +3 -3
- package/docs/{ → theory/}/347/220/206/350/256/272/344/273/223/346/213/206/345/210/206/344/270/216/347/231/275/347/256/261/347/237/245/350/257/206/345/272/223/345/206/205/350/277/201_v0.1.md +1 -1
- package/docs/theory//350/256/244/347/237/245/344/273/243/347/220/206/344/270/216/346/224/266/346/225/233/347/273/223/346/236/204_/346/235/241/344/273/266/350/256/272/351/207/215/346/236/204_v0.1.md +221 -0
- package/docs/world_model//344/270/226/347/225/214/346/250/241/345/236/213_/347/245/236/347/273/217/347/275/221/347/273/234/345/272/225/345/261/202/346/236/266/346/236/204_v1.0.md +237 -0
- package/docs//345/255/230/347/256/227/344/270/200/344/275/223/346/236/266/346/236/204/345/255/246/344/271/240_/345/244/226/351/203/250/347/220/206/350/256/272/345/257/271/347/205/247/344/270/216/350/267/257/347/272/277/344/272/244/346/216/245_20260916.md +98 -0
- package/docs//345/255/230/347/256/227/344/270/200/344/275/223/347/245/236/347/273/217/347/275/221/347/273/234/346/236/266/346/236/204_/346/200/273/347/272/262/344/270/216/344/272/244/346/216/245_20260916.md +109 -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 +34 -6
- package/docs//347/231/275/347/256/261/345/214/226/347/272/262/351/242/206_/344/270/211/351/241/271/347/233/256/345/255/246/344/271/240/346/200/273/346/236/266/346/236/204/344/270/216Ghidra/344/272/244/346/216/245_20260916.md +104 -0
- package/docs//350/256/260/345/277/206/350/257/204/345/256/241/347/263/273/347/273/237_/347/253/213/351/241/271/350/256/276/350/256/241/344/270/216/346/226/275/345/267/245/344/272/244/346/216/245_20260915.md +183 -0
- package/dsh/README.md +1 -1
- package/lib/hooks.d.ts +5 -0
- package/lib/hooks.js +10 -1
- package/lib/lib/prompt_safety.d.ts +48 -0
- package/lib/lib/prompt_safety.js +62 -0
- package/md_cg/audit.py +76 -2
- package/md_cg/bench_membench.py +10 -5
- package/md_cg/bench_progressive.py +48 -9
- package/md_cg/branches.py +275 -0
- package/md_cg/ccgc.py +884 -0
- package/md_cg/conformance.py +662 -0
- package/md_cg/consistency.py +1 -1
- package/md_cg/corpus.py +1 -1
- package/md_cg/eval_common.py +6 -5
- package/md_cg/forgetting.py +11 -3
- package/md_cg/fsutil.py +63 -1
- package/md_cg/identity.py +2 -2
- package/md_cg/insight.py +2 -2
- package/md_cg/lifecycle.py +262 -0
- package/md_cg/mcp_server.py +547 -140
- package/md_cg/mdcg.py +206 -18
- package/md_cg/mdcos.py +512 -50
- package/md_cg/metacognition.py +2 -2
- package/md_cg/mreview/__init__.py +25 -0
- package/md_cg/mreview/__main__.py +107 -0
- package/md_cg/mreview/bundle.py +170 -0
- package/md_cg/mreview/candidates.py +253 -0
- package/md_cg/mreview/govern.py +674 -0
- package/md_cg/mreview/locate.py +905 -0
- package/md_cg/mreview/pipeline.py +701 -0
- package/md_cg/mreview/rules/duplication.json +21 -0
- package/md_cg/mreview/rules/field_coverage.json +54 -0
- package/md_cg/mreview/rules/source_license.json +21 -0
- package/md_cg/mreview/rules/template_flow.json +21 -0
- package/md_cg/mreview/ruleset.py +238 -0
- package/md_cg/nodefile.py +38 -0
- package/md_cg/predict.py +24 -6
- package/md_cg/protect.py +4 -4
- package/md_cg/refindex.py +41 -2
- package/md_cg/scrub.py +5 -1
- package/md_cg/self_state.py +1 -1
- package/md_cg/semantic/en_normalizer.py +85 -25
- package/md_cg/sustain.py +18 -0
- package/md_cg/tasks.py +447 -0
- package/md_cg/test_action_derive.py +203 -0
- package/md_cg/test_audit_rotate.py +270 -0
- package/md_cg/test_branches.py +249 -0
- package/md_cg/test_ccg_perturb.py +1 -1
- package/md_cg/test_ccgc.py +423 -0
- package/md_cg/test_conformance.py +343 -0
- package/md_cg/test_en_pipeline.py +24 -0
- package/md_cg/test_health_scale.py +173 -0
- package/md_cg/test_identity_attribution.py +6 -0
- package/md_cg/test_index_durability.py +224 -0
- package/md_cg/test_lifecycle.py +309 -0
- package/md_cg/test_mr_m1.py +679 -0
- package/md_cg/test_mr_m2.py +587 -0
- package/md_cg/test_mr_m3.py +703 -0
- package/md_cg/test_mr_m4.py +485 -0
- package/md_cg/test_p1.py +1 -1
- package/md_cg/test_p11_consistency.py +1 -1
- package/md_cg/test_p12_metacognition.py +2 -2
- package/md_cg/test_p16_self_state.py +1 -1
- package/md_cg/test_p26_refindex.py +1 -1
- package/md_cg/test_p27_docindex.py +22 -2
- package/md_cg/test_p28_refcheck.py +1 -1
- package/md_cg/test_p29_session_ingest_export.py +1 -1
- package/md_cg/test_p2_mcp.py +7 -1
- package/md_cg/test_p38_contextualize.py +1 -1
- package/md_cg/test_p39_vision_evidence.py +1 -1
- package/md_cg/test_p40_refine_worklist.py +1 -1
- package/md_cg/test_p41_evolve_patrol.py +1 -1
- package/md_cg/test_p42_provenance.py +1 -1
- package/md_cg/test_p43_pooling.py +41 -13
- package/md_cg/test_read_clip.py +137 -0
- package/md_cg/test_review_conformance.py +310 -0
- package/md_cg/test_tasks.py +409 -0
- package/md_cg/test_tool_face.py +189 -0
- package/md_cg/test_twophase.py +286 -0
- package/md_cg/test_writepipe.py +210 -0
- package/md_cg/theory.py +1 -1
- package/md_cg/tokens.py +95 -5
- package/md_cg/tool_face.py +250 -0
- package/md_cg/twophase.py +221 -0
- package/md_cg/units.py +546 -0
- package/md_cg/vision_evidence.py +1 -1
- package/md_cg/weights.py +1 -1
- package/md_cg/whitebox.py +1 -1
- package/md_cg/whitebox_kb/data/verify_cache.json +28 -0
- package/md_cg/whitebox_kb/data/verify_savings.jsonl +46 -0
- package/md_cg/whitebox_kb/wisdom/audit_log/chain_heat.json +10 -10
- package/md_cg/whitebox_kb/wisdom/wisdom-book-cloud.db-shm +0 -0
- package/md_cg/whitebox_kb/wisdom/wisdom-book-cloud.db-wal +0 -0
- package/md_cg/writelimit.py +19 -3
- package/md_cg/writepipe.py +372 -0
- package/package.json +1 -1
- package/src/hooks.ts +10 -1
- package/src/lib/prompt_safety.ts +62 -0
- package/zcode/AGENTS.md +195 -185
- package/docs//345/212/237/350/203/275/350/260/203/347/224/250/346/230/240/345/260/204/350/241/250_v0.1.md +0 -221
- /package/docs/{AGI → eval/AGI}/344/270/203/347/273/264/350/257/204/345/210/206/346/212/245/345/221/212_md_cg_v1.0.md" +0 -0
- /package/docs/{AGI → eval/AGI}/344/270/203/347/273/264/350/257/204/345/210/206/346/212/245/345/221/212_md_cg_v2.0.md" +0 -0
- /package/docs/{ → eval/}/345/256/236/351/252/214/346/226/271/346/241/210_/345/255/246/344/271/240/351/227/255/347/216/257AB/344/270/216/346/250/252/350/257/204_v1.0.md" +0 -0
- /package/docs/{ → eval/}/346/250/252/350/257/204_/345/205/255/345/256/266100/351/242/230/344/270/255/350/213/261/345/217/214/346/237/245_v1.0.md" +0 -0
- /package/docs/{guardrail-charter.md → mdcg/guardrail-charter.md} +0 -0
- /package/docs/{lingshu_tutorial.html → mdcg/lingshu_tutorial.html} +0 -0
- /package/docs/{memory-assessment.html → mdcg/memory-assessment.html} +0 -0
- /package/docs/{memory_score.html → mdcg/memory_score.html} +0 -0
- /package/docs/{memory_score.png → mdcg/memory_score.png} +0 -0
- /package/docs/{release_v0.3.0.md → mdcg/release_v0.3.0.md} +0 -0
- /package/docs/{release_v0.4.5.md → mdcg/release_v0.4.5.md} +0 -0
- /package/docs/{tool_table_v0.3.0.md → mdcg/tool_table_v0.3.0.md} +0 -0
- /package/docs/{ → mdcg/}/344/273/244/347/211/214/344/270/216/350/247/222/350/211/262/346/235/203/350/201/214/345/210/206/347/246/273_v0.1.md" +0 -0
- /package/docs/{ → mdcg/}/347/201/265/346/236/24282/345/267/245/345/205/267_/345/212/237/350/203/275/346/225/264/347/220/206/344/270/216/350/277/201/347/247/273/346/230/240/345/260/204_v0.1.md" +0 -0
- /package/docs/{ → mdcg/}/347/201/265/346/236/242MCP/345/267/245/345/205/267/346/200/273/350/241/250_v3.4.md" +0 -0
- /package/docs/{ → mdcg/}/347/201/265/346/236/242_/350/207/252/346/210/221/345/261/202/345/256/232/344/271/211.md" +0 -0
- /package/docs/{ → mdcg/}/350/256/244/347/237/245/345/233/276_MD/347/233/256/345/275/225/346/226/271/346/241/210_v0.1.md" +0 -0
- /package/docs/{ → mdcg/}/350/256/244/347/237/245/345/233/276_/346/235/241/344/273/266/347/251/272/351/227/264/345/220/210/346/210/220/344/270/216/347/224/237/346/225/210/346/235/241/344/273/266/345/217/243/345/276/204_v0.1.md" +0 -0
- /package/docs/{ → mdcg/}/350/256/244/347/237/245/345/233/276/344/275/234/344/270/272/350/256/260/345/277/206/346/223/215/344/275/234/347/263/273/347/273/237_/350/257/204/344/274/260/344/270/216/350/267/257/347/272/277_v0.1.md" +0 -0
- /package/docs/{ → plans/}/345/221/275/345/220/215/346/262/273/347/220/206_/351/241/271/347/233/256/350/256/241/345/210/222.md" +0 -0
- /package/docs/{ → plans/}/347/237/245/350/257/206/345/233/276/350/260/261/351/241/271/347/233/256_/344/272/244/346/216/245/346/226/207/346/241/243_20260914.md" +0 -0
- /package/docs/{ → swarm/}/350/234/202/347/276/244/345/244/232/346/231/272/350/203/275/344/275/223_/344/275/277/347/224/250/346/212/245/345/221/212_20260913.md" +0 -0
- /package/docs/{ → swarm/}/350/234/202/347/276/244/345/244/232/346/231/272/350/203/275/344/275/223_/345/212/237/350/203/275/350/257/264/346/230/216_v0.6.md" +0 -0
- /package/docs/{ → swarm/}/350/234/202/347/276/244/347/233/262/345/214/272/346/240/207/350/256/260_v1.0.md" +0 -0
- /package/docs/{ → theory/}/344/277/241/346/201/257/345/267/256/344/270/272/344/273/200/344/271/210/345/277/205/347/204/266/345/255/230/345/234/250/344/270/224/350/207/252/347/204/266/346/211/251/345/244/247.md" +0 -0
- /package/docs/{ → theory/}/346/231/272/350/203/275/347/232/204/345/205/254/347/220/206/345/214/226/345/237/272/347/237/263.md" +0 -0
- /package/docs/{ → theory/}/346/231/272/350/203/275/347/232/204/350/256/244/347/237/245/350/277/207/347/250/213.md" +0 -0
- /package/docs/{ → theory/}/346/231/272/350/203/275/350/256/2723.4.md" +0 -0
- /package/docs/{ → theory/}/347/231/275/347/256/261/346/231/272/350/203/275/346/230/257/344/273/200/344/271/210/357/274/237.md" +0 -0
- /package/docs/{ → theory/}/347/231/275/347/256/261/346/231/272/350/203/275/347/263/273/345/210/227/302/267/347/254/254/344/272/224/347/257/207/357/274/232/350/256/251AI/347/234/237/346/255/243/350/243/205/344/270/212/350/256/260/345/277/206.md" +0 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# 白箱化纲领 · 三项目学习总架构(兼 Ghidra 交接文档)
|
|
2
|
+
|
|
3
|
+
> 立纲裁定:**荣 2026-09-16「将我们的白箱化,作为纲领,进行今晚这 3 个外部大型项目学习的总架构」**
|
|
4
|
+
> 三项目:**pi**(Pi Agent Harness,105k★,MIT)· **OpenCodeReview**(阿里,27.5k★,Apache-2.0)· **Ghidra**(NSA,76.4k★,Apache-2.0/GPL 分区)
|
|
5
|
+
> 交接方:ZCode 端 · 接收方:**CodeBuddy 端** · 关联文档:`Pi可学习优点_灵枢大脑改进交接_20260915.md`、`记忆评审系统_立项设计与施工交接_20260915.md`
|
|
6
|
+
> 理论真源:白箱智能系列(CommonTrustProtocol 理论仓)+ 智能论 3.4(`docs/theory/`)+ 荣纲领「唯一协议=智能论」(灵枢 node_c0116768)
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 0. 一句话纲领
|
|
11
|
+
|
|
12
|
+
**不可理解的执行体不可信;可信 = 可理解 + 可复算 + 可溯源。** 白箱化就是把一切执行体(程序、记忆、智能体行为)转换为**统一中间表示**,使其可分析、可验证、可治理。今晚三个项目分别在**程序域**(Ghidra)、**协作域**(pi)、**质量域**(OCR)独立验证了这套方法——它们不知道彼此,却实现了与我们相同的方法论。这不是巧合,是收敛。
|
|
13
|
+
|
|
14
|
+
## 1. 纲领本体:白箱化四原理
|
|
15
|
+
|
|
16
|
+
| # | 原理 | 陈述 | 违反后果 |
|
|
17
|
+
|---|---|---|---|
|
|
18
|
+
| W1 | **统一表示** | 一切被分析/被执行的对象,先归一为小而正交的中间表示 | 异构对象各说各话,分析无法跨域复用 |
|
|
19
|
+
| W2 | **确定性内核** | 「不能错的」由确定性机制保证,概率性组件(LLM)只产候选 | 质量随 prompt 漂移,结果不可复算 |
|
|
20
|
+
| W3 | **显式化** | 隐式状态、隐式前提、隐式盲区必须显式展开;未知的显式占位,不静默丢弃 | 隐蔽腐化:错在心里看不出在哪 |
|
|
21
|
+
| W4 | **知识数据化** | 平台知识/规则/策略外置为可审查的数据(spec),引擎对知识零改动 | 加一条规则改一次代码,演进被代码锁死 |
|
|
22
|
+
|
|
23
|
+
**验证记录**(各原理的异域实现):
|
|
24
|
+
- W1:Ghidra P-Code(74 正交操作码+Varnode 全状态编址,`PcodeOp.java:46`);pi 事件溯源日志(13 叶子状态机+全局 seq,`session/types.ts:315`);灵枢认知图(md 节点+frontmatter——**且多两维:条件化+信任化**,荣 2026-09-16「我们做统一中间表示,工具是智能论条件论」,灵枢 node_1a5d8a68)。
|
|
25
|
+
- W2:OCR 确定性五模块×Agent(同模型 Precision/F1 更高、token 仅 1/9);灵枢蜂群 verifier 逐位复算、四闸门。
|
|
26
|
+
- W3:Ghidra UNIMPLEMENTED 显式占位(未建模指令不静默丢弃)+标志位展开为显式数据流;pi 错误消息显式标记不入上下文;灵枢盲区 BS 制度、条件空间卡。
|
|
27
|
+
- W4:Ghidra SLEIGH(新平台=新 spec,引擎零改动);pi 扩展系统(工具/compaction 可替换);灵枢 writelimit 规则、Pi 交接 D3 规则引擎(待建)。
|
|
28
|
+
|
|
29
|
+
> **MiroFish 关联**(世界模型方向,已完成分析归档):作为反面样本佐证纲领——有智能(万人 LLM agent)无白箱(无验证闸/无 checkpoint/预测不可复算),恰是四原理缺失的完整标本。详见灵枢 node_36ec9560。
|
|
30
|
+
>
|
|
31
|
+
> **第五收敛点(2026-09-16 补)**:TRAE 社区独立开发者的「灵枢 LingShu」(forum.trae.cn/t/topic/151749,2026-07-15,EdgeCrab/Rust 本地助理)——与我们互不相识却收敛出同一组件清单(持久记忆/语义召回/感官接口/心跳唤醒/本地优先),**连命名都收敛**("灵枢"=《内经》神智之枢机,需求→概念→词汇的必然映射)。荣论断:「同名不是巧合,是架构收敛的必然。」——问题空间决定解空间的最强公开可查证据(灵枢 node_81f594e6)。另:Hindsight(node_f6cbd333)为记忆域第四收敛点(四路检索/巩固/实体归一同构)。
|
|
32
|
+
|
|
33
|
+
## 2. 三项目在纲领中的位置
|
|
34
|
+
|
|
35
|
+
| 项目 | 域 | 白箱化角色 | 它教我们的一句话 |
|
|
36
|
+
|---|---|---|---|
|
|
37
|
+
| **Ghidra** | 程序域(二进制) | **黑箱→白箱转换器**:把不可理解执行体还原为可分析表示 | 完备性=小而正交算子+全状态统一编址;新域=新数据不改引擎 |
|
|
38
|
+
| **pi** | 协作域(agent 运行时) | **白箱运行时**:一切行为落事件日志,状态可重放、可分支、可对账 | 核心最小化+显式状态机;工具面渐进披露;压缩可逆 |
|
|
39
|
+
| **OCR** | 质量域(代码评审) | **白箱质检线**:确定性硬约束筛选与定位,LLM 只裁语义 | 确定性工程让 LLM 提质 9 倍省 token;反思/定位模块分离 |
|
|
40
|
+
|
|
41
|
+
**三域合围即灵枢的完整图景**:灵枢大脑在认知域做同样的事(信息流→认知图 IR),且是三者中唯一把**观测条件(条件空间)与信任凭证(四态/evidence)编码进 IR** 的实现。三个项目是我们路线的异域印证;灵枢的增量维度是它们没走的下一步。
|
|
42
|
+
|
|
43
|
+
## 3. 统一方法论六条(交叉验证结论,方法论级可引用)
|
|
44
|
+
|
|
45
|
+
1. **小而正交的封闭算子集**优先于大而全的开放枚举(Ghidra 74 操作码六年稳定 ↔ 术数编译器封闭指令集);
|
|
46
|
+
2. **隐式状态显式化是分析的前提**(Ghidra 标志位→显式数据流 ↔ 灵枢条件显式化/反思两问句)——不显式化,就只能猜;
|
|
47
|
+
3. **未知的显式占位**(Ghidra UNIMPLEMENTED ↔ 灵枢盲区 BS 制度)——「没分析过」与「分析过没问题」必须可区分;
|
|
48
|
+
4. **知识外置为数据,引擎对知识零改动**(SLEIGH/pi 扩展/评审规则库)——演进速度由数据决定,不由发版决定;
|
|
49
|
+
5. **确定性管线+可枚举变换序列**(Ghidra 反编译 Action 链/分析器确定性排序 ↔ 蜂群 BSP 确定性提交/评审 M1 机械层)——自由发挥只属于候选生成,不属于裁决与结算;
|
|
50
|
+
6. **一份核心多前端**(headless/GUI 共用管线 ↔ 一份大脑多 harness),前端是方言,核心是协议本体。
|
|
51
|
+
|
|
52
|
+
## 4. 灵枢映射总表(纲领落进施工线)
|
|
53
|
+
|
|
54
|
+
| 纲领原理 | 灵枢已有 | 缺口 | 施工线(CodeBuddy) |
|
|
55
|
+
|---|---|---|---|
|
|
56
|
+
| W1 统一表示 | md 认知图+frontmatter+语义原子 | 节点 kind/tag 正交性审计(Ghidra 74 码六年的稳定信号) | 新增审计任务(见 §6-G) |
|
|
57
|
+
| W2 确定性内核 | 蜂群四闸门/verifier 复算/BSP | 记忆评审五级流水线 | 记忆评审 M1-M4(已有立项文档) |
|
|
58
|
+
| W3 显式化 | 盲区 BS/条件空间卡/审计日志 | 节点生命周期状态机(pi 13 叶子同构物);unanalyzed 显式占位标记 | Pi 交接② + §6-G |
|
|
59
|
+
| W4 知识数据化 | writelimit 参数/SOURCE_POLICY 雏形 | 规则库 spec 化(加规则不改代码) | Pi 交接⑥ + 记忆评审 D3 |
|
|
60
|
+
|
|
61
|
+
## 5. Ghidra 交接正文(防御面专项)
|
|
62
|
+
|
|
63
|
+
### 5.1 定位与许可
|
|
64
|
+
- 入区 `agi-architectures/ghidra/`(浅克隆 442MB,20,546 文件);荣裁定:「矛盾是一体两面的,破解和防御都是对同一种机制的认知。**我们取防御面**。」
|
|
65
|
+
- 许可红线:核心 Apache-2.0;**根目录 `GPL/` 下模块另带 GPL/LGPL,代码严禁复制进本仓**;Ghidra 自身有已知安全公告(README Security Warning)——运行样本分析必须在隔离环境(容器/VM)。
|
|
66
|
+
|
|
67
|
+
### 5.2 防御面四对接点(能力储备,按需启用)
|
|
68
|
+
1. **供应链安全审计(二进制级)**:灵枢以 npm 包发布(@furongjun1999/dsh-memory),scanner CI 管 manifest 级,Ghidra 管原生模块/native prebuilds/可疑 so-dll——纵深补位;
|
|
69
|
+
2. **外部程序准入评审**:蜂群盲区 **BS-4 异构程序实例**——世界模型测试场接收外部术数程序/字节码时,headless 模式可脚本化批量审计「外来程序实际做什么」;
|
|
70
|
+
3. **保护线对抗纵深**:vision-protection 的攻击样本分析能力储备;
|
|
71
|
+
4. **工具链自防**:分析工具本身是攻击面(Ghidra 自己的安全公告为证)——自用工具同样过 scanner。
|
|
72
|
+
|
|
73
|
+
### 5.3 浅层调研结论(已完成,灵枢 node_1a77ad69)
|
|
74
|
+
- **P-Code**:74 正交操作码+Varnode 三元组(全状态地址空间化);SLEIGH spec 数据化;lossless(UNIMPLEMENTED 显式占位);反编译=固定 Action 序列;
|
|
75
|
+
- **插件管线**:Plugin/PluginTool+服务与事件两路解耦;Analyzer=可选步骤;6 队列 priority 确定性排序;扩展 zip 自动进管线;
|
|
76
|
+
- **Headless**:与 GUI 共用分析管线;可复现(确定性排序+无随机源)。
|
|
77
|
+
- **方法分析六条对照**全部与灵枢已有件同构(§1 验证记录+§3),Ghidra 无一件与我们路线冲突——收敛而非修正。
|
|
78
|
+
|
|
79
|
+
### 5.4 可吸收三件(Ghidra → 灵枢施工件)
|
|
80
|
+
| # | 吸收件 | 落点 | 验收 |
|
|
81
|
+
|---|---|---|---|
|
|
82
|
+
| G1 | **节点正交性审计**:kind/tag/edge 类型空间封闭性检查(可枚举/正交/新增是否需改引擎) | `md_cg/nodefile.py`+`census.py` | 审计报告产出类型空间全景表;非正交项清单 |
|
|
83
|
+
| G2 | **规则库 spec 数据化**:评审规则全落数据文件(.slaspec 式可审查/可版本化) | 记忆评审 D3(`md_cg/mreview/rules/`) | 新增规则零代码改动 |
|
|
84
|
+
| G3 | **unanalyzed 显式占位**:未被任何分析覆盖的节点显式标记(类比 UNIMPLEMENTED) | `md_cg` 节点 frontmatter state 字段(与 Pi② 状态机合并施工) | census 断言:unanalyzed 比例可量化可追踪 |
|
|
85
|
+
|
|
86
|
+
## 6. 施工总览(CodeBuddy 任务图)
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
白箱化纲领(本文档)
|
|
90
|
+
├── Pi 线(已有交接文档,七项):⑥钩子化 → ④fork → ①瘦身 → ②状态机 → ③两段式 → ⑤census → ⑦细节
|
|
91
|
+
├── 记忆评审线(已有立项文档,四里程碑):M1 机械层 → M2 蜂巢并发 → M3 定位 → M4 治理闭环
|
|
92
|
+
└── Ghidra 线(本文件 §5.4,轻量):G1 正交性审计(可并入 census⑤)· G2 并入 D3 · G3 并入 Pi②
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
- 三线共用基建(census/钩子/规则引擎),**按依赖合并施工**,勿重复建设;
|
|
96
|
+
- 每步:实现 → 全量 `test_pXX` 回归 → 灵枢归档(16 条四要素)→ 对应文档进度表更新;
|
|
97
|
+
- 落点纪律不变:唯一主线 `dsh-memory/md_cg`+`hive/`;AEIS 真源只读;protocol-compiler 冻结。
|
|
98
|
+
|
|
99
|
+
## 7. 边界与纪律
|
|
100
|
+
|
|
101
|
+
1. **底座不换**:三项目只是方法印证与零件来源,无一带代码入库(MIT/Apache 宽松仓也只吸收思想,保持实现血统纯正可溯);
|
|
102
|
+
2. **Ghidra GPL 分区**:`GPL/` 目录代码零复制;样本分析隔离环境;
|
|
103
|
+
3. **纲领的开放性**:白箱化四原理是当前最优陈述,非终稿——未来异域印证或反例出现时,按第 4 条根因纪律修订本文档并同步灵枢;
|
|
104
|
+
4. **归档闭环**:本文档对应灵枢节点(提交后回填):纲领 node 待定 / Pi node_3ca6cde8 / 记忆评审 node_997fc563 / Ghidra node_e42f19d4+node_1a77ad69 / 统一IR node_1a5d8a68 / 协议哲学 node_c0116768。
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
# 记忆评审系统 · 立项设计与施工交接文档
|
|
2
|
+
|
|
3
|
+
> 立项裁定:**荣 2026-09-15「立项吧。验证单元对记忆的复核校验,是我们蜂巢并发和记忆可信度的关键。必须重视。」**
|
|
4
|
+
> 交接方:ZCode 端 · 接收方:**CodeBuddy 端**
|
|
5
|
+
> 架构蓝本:OpenCodeReview(`agi-architectures/open-code-review/`,Apache-2.0,确定性工程×Agent 混合)→ 荣洞察「**代码评审就不是记忆评审了么**」
|
|
6
|
+
> 上游依赖:验证单元现状盘点(灵枢 node_160ca242)、写入效果审计(node_26b0973a)、蜂巢工作记忆(`docs/hive/蜂巢工作记忆_项目计划.md`)、Pi 交接文档(`docs/Pi可学习优点_灵枢大脑改进交接_20260915.md`)
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 0. 一句话立项
|
|
11
|
+
|
|
12
|
+
给灵枢大脑建一条**记忆评审流水线**:确定性模块选条目、捆条目、配规则 → **蜂巢并发**跑 LLM 复核包 → verify 角色字段级落库 → 治理工单回流。它同时是三件事的答案:验证单元对记忆的**复核校验**、蜂巢并发的**第一个大规模用例**、9-15 审计遗留问题(role 空/evidence 缺/重复/宽进)的**治理产能**。
|
|
13
|
+
|
|
14
|
+
## 1. 落点纪律(防版本不一致,先读)
|
|
15
|
+
|
|
16
|
+
| 仓 | 本次角色 |
|
|
17
|
+
|---|---|
|
|
18
|
+
| `dsh-memory/` | ✅ 全部落点:流水线编排在 `md_cg/`,并发执行面用 `hive/`,测试在 `md_cg/test_mr*.py` |
|
|
19
|
+
| `AEIS/` | ❌ 不改代码;真源 `data/mdcg/` 对评审管线**只读**(评审意见由灵枢自身的写入通路落库) |
|
|
20
|
+
| `protocol-compiler/` | ❌ 冻结 |
|
|
21
|
+
|
|
22
|
+
- 与 Pi 交接文档(⑥钩子化/⑤census 等)**共用基建不重复建设**:census 断言集是本系统 M1 的候选生成器,写路径钩子是评审意见落库的通道——建议施工顺序 Pi⑥ → 本项目 M1 起步(或合并施工)。
|
|
23
|
+
- 硬约束:**永不删除**真源节点(评审只产意见与工单);**verify 角色权限边界不动**(`tokens.py` layers_allow=rejected/contextual);**precision over noise**(宁可 DEFER 不可误杀);评审全过程留痕可回滚。
|
|
24
|
+
|
|
25
|
+
## 2. 立项依据(为什么是现在)
|
|
26
|
+
|
|
27
|
+
1. **审计实证的治理欠账**(2026-09-15 审计,node_26b0973a):knowledge 层索引混层 57.9%、role 存量 99.99% 空、evidence_count 仅 6 条、精确重复 90 条、同模板冗余 233 条、闸门 DROP/DEFER=0(宽进)、召回率 7%。
|
|
28
|
+
2. **OCR 规模验证**:阿里两年/数万开发者验证「确定性硬约束×LLM」在评审域有效——同模型 Precision/F1 更高、token 仅 1/9。三痛点(覆盖不全/位置漂移/质量不稳)与记忆写入质量问题一一对应。
|
|
29
|
+
3. **蜂巢产能待用**:hive 引擎(worker 池/心跳/强杀/恢复)+wm 三级闸已交付,缺大规模真实用例;记忆评审的「捆绑并发评审」正是其设计目标场景(rust 管并发与生命周期,python 管协议与 LLM)。
|
|
30
|
+
4. **验证单元已有地基**:11 模块盘点(灵枢 node_160ca242)——crosscheck 双单元裁决、verify 角色写权限互斥、mdcos 审核队列、forgetting 三问四态。缺的只是三个模块(§4)。
|
|
31
|
+
|
|
32
|
+
## 3. 架构总设计:五级流水线
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
[1 候选生成] → [2 捆绑] → [3 规则装配] → [4 蜂巢并发评审] → [5 落库与治理]
|
|
36
|
+
确定性 确定性 确定性 LLM(蜂巢 job) 确定性收口
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
| 级 | 职责 | 确定性/LLM | 既有地基 |
|
|
40
|
+
|---|---|---|---|
|
|
41
|
+
| 1 候选生成 | 产出待评条目清单:census 断言超限项 + 闸门 DEFER 队列 + 冷节点抽样 + 轮巡 | 确定性 | census.py(Pi ⑤ 产品化)、`_forgetting.jsonl` DEFER 记录 |
|
|
42
|
+
| 2 捆绑 | 按模板签名组/同源(migrated_from)/同主题聚类成包;**同模板组一包一评,一次裁决全组** | 确定性 | writelimit 的模板签名函数(`tmpl_sig`)可直接复用 |
|
|
43
|
+
| 3 规则装配 | 按包特征(层/tags/来源执照/字段覆盖率)从规则库装配检查集 | 确定性 | `crosscheck.SOURCE_POLICY`(雏形泛化,见 D3) |
|
|
44
|
+
| 4 并发评审 | 每包一个 hive job:spec=条目包+规则集+定位上下文,worker LLM 产字段级意见 | **LLM(蜂巢)** | hive scheduler+wm;spec/result 契约见 §5 |
|
|
45
|
+
| 5 落库治理 | verify 角色校验意见格式 → 意见落 rejected/contextual → 治理工单(回填/合并/降权建议)→ designer 终裁执行 | 确定性收口 | verify 令牌 layers_allow **正好允许**;mcdcos 审核队列复用为工单终裁 |
|
|
46
|
+
|
|
47
|
+
**分工原则(对齐 OCR)**:机械可算的(重复率/字段完整性/同 hash 组)在蜂巢 job **之前**跑,LLM 只看机械检查无法裁决的语义问题——确定性优先,省 token(OCR 实证 1/9)。
|
|
48
|
+
|
|
49
|
+
## 4. 三个缺口模块设计(本项目新建件)
|
|
50
|
+
|
|
51
|
+
### D1 字段级定位模块(对齐 OCR 独立定位)
|
|
52
|
+
|
|
53
|
+
- **输出契约**:`locate(node_id, issue_hint) -> [{field, span, issue_kind, evidence}]`——field ∈ frontmatter 字段名或 `content`;span = 字符区间或句索引;issue_kind ∈ {dup, missing_field, stale, contradiction, weak_source, template_flow}。
|
|
54
|
+
- **实现要点**:①frontmatter 字段级检查直接逐字段扫描(role 空/evidence=0 这类机械定位零成本),**层门限派生自 M1 规则库的 `matcher.layer`**(M1 不报的层 M3 不越层报,见 §6.3);②content 内定位:同 hash 组内 diff 定位差异句(模板流水的"每次只换数字"正是 diff 可见);③与 `provenance.py` 关系:provenance 管节点间血缘(不动),本模块管**条目内部**定位(新建 `md_cg/mreview/locate.py`)。
|
|
55
|
+
- **验收**:对审计已知问题抽样 20 条,字段级定位人工核对准确率 ≥90%。
|
|
56
|
+
|
|
57
|
+
### D2 反思模块扩展(对齐 OCR 独立反思)
|
|
58
|
+
|
|
59
|
+
- **现状**:crosscheck 的 verify_prompt 只复核「验证方式」单字段。
|
|
60
|
+
- **扩展**:新增**内容复核 prompt 模板**(`md_cg/mreview/prompts.py`):输入=条目全文+装配规则集+D1 定位候选,输出=结构化意见 JSON:`{verdicts:[{node_id, field, span, issue_kind, verdict(ACCEPT/MERGE/DROP/DEFER), evidence}], summary}`。
|
|
61
|
+
- **独立性约束(不可妥协)**:复核执行者持 verify 令牌(只能落 rejected/contextual,禁改 knowledge——`tokens.py:127` 结构保证);复用 `crosscheck.detect_self_verify` 检出「写入者=复核者」即违例;意见落库后走 mdcos 审核队列终裁(红队门控/判据指纹既有机制全复用)。
|
|
62
|
+
- **验收**:意见 100% 过格式校验;自验违例检出测试通过。
|
|
63
|
+
|
|
64
|
+
### D3 规则装配模板引擎(对齐 OCR 规则匹配)
|
|
65
|
+
|
|
66
|
+
- **现状**:检查规则以枚举+阈值散落(forgetting 的 DUP_MERGE 阈值、census 的断言、SOURCE_POLICY)。
|
|
67
|
+
- **设计**:规则库统一格式 `rule = {id, matcher: {layer?, tags?, source_license?, field_cov?}, checks: [机械检查|llm检查], severity}`;装配器 `assemble(bundle) -> ruleset` 按包特征选规则。**机械检查在 job 前本地跑完**(结果作为 llm 检查的上下文输入),llm 检查才进蜂巢。
|
|
68
|
+
- **验收**:新增一条规则不改引擎代码;装配结果可 dump 审查(白箱)。
|
|
69
|
+
|
|
70
|
+
## 5. 蜂巢对接契约(评审 job 的 spec/result)
|
|
71
|
+
|
|
72
|
+
```jsonc
|
|
73
|
+
// hive jobs/<id>/spec.json
|
|
74
|
+
{
|
|
75
|
+
"model": "<评审模型>",
|
|
76
|
+
"system_prompt": "记忆评审员:只依据规则集与定位证据裁决,不臆测;输出严格 JSON。",
|
|
77
|
+
"context_files": ["bundle.json", "rules.json"], // 包内条目(裁剪后)+装配规则集
|
|
78
|
+
"user_prompt": "对 bundle.json 中每条目按 rules.json 逐检查项裁决…输出 {verdicts:[…], summary}",
|
|
79
|
+
"timeout_s": 600
|
|
80
|
+
}
|
|
81
|
+
// result.json(执行器写回,ok:true 才过 wm 凭证闸)
|
|
82
|
+
{ "ok": true,
|
|
83
|
+
"verdicts": [{"node_id":"…","field":"role","span":null,
|
|
84
|
+
"issue_kind":"missing_field","verdict":"DEFER",
|
|
85
|
+
"evidence":"frontmatter 无 role,来源=agent 令牌即可回填"}],
|
|
86
|
+
"summary": "…" }
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
- 评审 job 由**主代理侧**批量提交(hive_spawn),poll 收卷后走第 5 级落库——**蜂巢 worker 不直写认知图**(wm 三级闸语义:worker 产物只是意见,落库归灵枢写入通路+verify 令牌)。
|
|
90
|
+
- 吞吐预估:审计欠账约 1.1 万条目,捆绑后(同模板组并包)预计 300-800 包;HIVE_WORKERS=8 时一至两轮跑完。
|
|
91
|
+
|
|
92
|
+
## 6. 施工阶段与验收(四里程碑)
|
|
93
|
+
|
|
94
|
+
| 阶段 | 内容 | 验收口径 |
|
|
95
|
+
|---|---|---|
|
|
96
|
+
| **M1 机械层** | census 断言集 + 捆绑器(tmpl_sig 复用)+ D3 规则引擎骨架 | 对 9-15 审计基线数字**复现**(11195/57.9%/90 条/233 条);捆绑结果 dump 可审查 |
|
|
97
|
+
| **M2 蜂巢并发** | spec/result 契约 + verify 落库通道(过 Pi⑥ 钩子)+ 自验违例测试 | 10 包×50 条试跑全绿;意见格式校验 100%;worker 零直写认知图 |
|
|
98
|
+
| **M3 定位模块** | D1 字段级定位 | 抽样 20 条人工核对 ≥90% |
|
|
99
|
+
| **M4 治理闭环** | 工单回流(role 回填/合并建议/降权)+ designer 终裁 + 复跑 census 量化改善 | 首轮治理后:精确重复 90→≤10、role 覆盖 ≥90%(存量可回填范围)、闸门 DEFER>0 |
|
|
100
|
+
|
|
101
|
+
每阶段:实现 → 全量 `test_pXX` 回归 + 新增 `test_mr*.py` → 灵枢归档(16 条四要素)→ 本文件进度表更新。
|
|
102
|
+
|
|
103
|
+
### 6.1 施工进度
|
|
104
|
+
|
|
105
|
+
| 阶段 | 状态 | 落点 | 验证 |
|
|
106
|
+
|---|---|---|---|
|
|
107
|
+
| **M1 机械层** | ✅ 完成(2026-09-16) | `md_cg/mreview/`(`candidates.py` / `bundle.py` / `ruleset.py` / `rules/*.json` / `__main__.py`)+ `md_cg/test_mr_m1.py` | 107 断言全绿;回归 12 套件 exitCode 0;lint 0 |
|
|
108
|
+
| **M2 蜂巢并发** | ✅ 完成(2026-09-16) | `md_cg/mreview/pipeline.py` + `md_cg/test_mr_m2.py` | 64 断言全绿(含真蜂巢端到端 D 组);回归 12 套件 exitCode 0;lint 0 |
|
|
109
|
+
| **M3 定位模块** | ✅ 实现完成(2026-09-16),验收待做 | `md_cg/mreview/locate.py` + `md_cg/test_mr_m3.py` | 100 断言全绿;M1/M2 回归 107/64 全绿;lint 0;§6 表「抽样 20 条人工核对」**待使用者参与** |
|
|
110
|
+
| M4 治理闭环 | ⬜ 未开工 | — | — |
|
|
111
|
+
|
|
112
|
+
**M1 基线复现实测**(真源 `AEIS/data/mdcg`,2026-09-16,冻结 `--root` 显式传入)
|
|
113
|
+
|
|
114
|
+
| 基线项 | 9-15 基线 | 本次实测 | 判定 |
|
|
115
|
+
|---|---|---|---|
|
|
116
|
+
| 混层率 | 57.9% | 58.57% | ✅ 同量级(库在增长) |
|
|
117
|
+
| role 空 | 99.99% | 99.991%(`role_ratio_kn`=8.98e-05) | ✅ 吻合 |
|
|
118
|
+
| evidence_count | 仅 6 条 | 6 条 | ✅ 精确吻合 |
|
|
119
|
+
| 精确重复 | 90 条 | 93 组 | ✅ 同量级 |
|
|
120
|
+
| knowledge 存量 | 11195 | 11138 | ✅ 吻合 |
|
|
121
|
+
| 召回率 | 7% | 8.76% | ✅ 同量级 |
|
|
122
|
+
| 同模板冗余 | 233 条 | 口径未固化 | ⚠️ 不硬凑(见下) |
|
|
123
|
+
|
|
124
|
+
**M1 产出规模**:候选 11493 条(原始 34673;按源 assertion=33971 / cold=500 / patrol=200 / defer=2)→ 1276 包(template 1058 / topic 91 / batch 127)→ 机械 issue 33683 条(missing_field 26889 / weak_source 6079 / package_ratio 614 / dup_content 88 / template_flow 13)+ 待 LLM 检查 6332 项。包数超出 §5 预估区间(300-800),因预估按「同模板组并包」理想化、实际 topic/batch 组更碎——**M2 排期请按 1276 包估算**。
|
|
125
|
+
|
|
126
|
+
**「同模板冗余 233 条」口径待固化(不猜测)**:实测两个候选口径均不等——`writelimit.template_signature` 全量分组冗余 **1949**(把 `main(def)` / `Added` / `Fixed` 等结构性同形一并归入)、本引擎 `template_flow` 严格「只换数字」口径 **13**。故 M1 不纳入机械断言,留待 M3 定位模块抽样核对后固化判据。
|
|
127
|
+
|
|
128
|
+
**零写入取证(第 4 条)**:`test_mr_m1.py` E10 曾报真源指纹变化,取证结论=M1 无写入。证据三条:①`conformance.load_index` 纯读(open+json.load);②跑 M1 前后 `_index_log/` 无新文件、逐字节不变;③目录内日志文件名带写入者 pid(14916/16072/20184/6708),非本进程 pid,且静置 6s 无变化。故断言口径改为「记忆数据面指纹不变(排除运行态 `_index_log`)」+ 追加「未留下本进程增量日志」。
|
|
129
|
+
|
|
130
|
+
### 6.2 M2 落地说明(2026-09-16)
|
|
131
|
+
|
|
132
|
+
**落点**:`md_cg/mreview/pipeline.py`(级 4 投递收卷 + 级 5 意见落库 + 批编排 + CLI),`md_cg/test_mr_m2.py`(A spec 构造 / B 解析校验 / C 落库通道 / D 真蜂巢 e2e / E 边界负例)。
|
|
133
|
+
|
|
134
|
+
**级 4 契约**:`dump_context` 把 (pkg, asm) 写成**绝对路径** context_files(bundle/groups/ruleset)→ `build_spec` 生成 spec(`meta` 只带归因字段,hive 忽略)→ `submit_many` → `wait_jobs`(轮询至终态,done/failed/pending 三分类)→ `collect`+`read_result`。10 包并行提交即为一轮,墙钟≈最慢一包。
|
|
135
|
+
|
|
136
|
+
**级 5 顺序**(任一环不过即不落库):①自验违例检测(评审者 ≠ 落库裁决者,判据复用 `crosscheck.detect_self_verify`)→ ②意见非空(全 DEFER 且空 → 不写,零噪声)→ ③verify 令牌(`tokens.role_spec("verify")`,`layers_allow=["rejected","contextual"]`)+ writepipe 六道闸 + 库层 `require_layer_write`。
|
|
137
|
+
|
|
138
|
+
**两条结构性纪律的实测**:
|
|
139
|
+
- **评审不改知识层**:落库固定 `layer="contextual"`;显式传 `layer="knowledge"` → 库层抛 `AccessDenied`,函数捕获后返回 `refused/reason="layer_denied"`(不吞不炸)——越层是**结构性拒绝**而非约定。
|
|
140
|
+
- **自验禁止**:`reviewer` 与 `applier` 落在同一单元(reflect↔verify)→ 拦截,cognitive 图零写入(快照逐字节不变)。
|
|
141
|
+
- **worker 零直写**:假执行器只写 `result.json`;认知图写入只发生在收卷后的 `apply_opinions`(dry_run 批实测记忆数据面指纹不变)。
|
|
142
|
+
|
|
143
|
+
**根因记录(第 4 条)**:C4 首跑 `committed=False / moved_to=review_queue`。取证 → `audit._rule_check` 在**无规则库**时返回 DEFER(「无规则不能假装合规」),故**每一条** text 意见都会转审核队列而落不了盘。结论:M2 落库**依赖部署侧合规规则库**(`MDCG_POLICY_FILE`,与生产同源,测试自备同形态 policy)。据此做两处防静默降级修改:`apply_opinions` 透出 `moved_to` / `deferred`(`deferred = 改了去向且未落盘`),`run_batch` 报 `committed` 与 `deferred` **双计数**——**「入队」不报成「落库」**;并补 C4b 断言固化该降级行为。
|
|
144
|
+
|
|
145
|
+
**验收口径对照**:10 包×50 条 = 500 条意见一次批量收卷;意见格式校验率 100%(`pass_rate == 1.0`);越界 verdict 全数拦截(反例 serve,`pass_rate=0.0 / committed=0`);dry_run 批 `committed=0` 且真源零改动;实跑 3 包 `committed==3`,contextual 增量恰为 3、knowledge 存量不变。
|
|
146
|
+
|
|
147
|
+
**吞吐口径澄清**:§6 表内「10 包×50 条」是**机制验收样本**;M1 实测包数为 1276,M2 真跑按 1276 包提交(`HIVE_WORKERS=8` 时按最慢一包墙钟推进)。
|
|
148
|
+
|
|
149
|
+
### 6.3 M3 落地说明(2026-09-16)
|
|
150
|
+
|
|
151
|
+
**落点**:`md_cg/mreview/locate.py`(六定位器 + 契约 + 批量/包 + CLI),`md_cg/test_mr_m3.py`(A 基础工具 / B 六定位器 / C 提示过滤 / D 契约确定性 / E 批量与包 / F 零写入,100 断言)。
|
|
152
|
+
|
|
153
|
+
**验收口径对照**:六类定位器逐类正例+负例;提示过滤(`issue_hint` 取子集,未命中类返回空且不借机报别的类);契约四键(`field/span/issue_kind/evidence`,M1 用词经 `KIND_ALIASES` 归并到 D1 规范名);确定性(同输入两次逐字节一致,`now` 显式传入不靠墙钟);零写入(实锤:全相位跑完记忆数据面指纹逐字节不变)。§6 表内「抽样 20 条人工核对 ≥90%」需使用者参与判定,**待做**。
|
|
154
|
+
|
|
155
|
+
**判据同源 · 字段层门限(修正 1)**:字段级检查的层门限**派生**自 M1 规则库(`rules/*.json` 的 `matcher.layer`,见 `field_layer_scope`),M3 不另立一份——`role`/`evidence_count` 限 `knowledge` 层(与 M1 `R-ROLE-MISSING`/`R-EVIDENCE-ZERO` 同源),未限层字段(`verification_basis` 等)全层适用;缺层节点不检查,与 M1 `_scope`(`str(e.get("layer")) in want`)逐字同口径——**M1 不报的问题,M3 不越层报**。派生而非双写法:M1 改规则 M3 自动跟随(无守卫的手写副本必漂移);规则库损坏时 `load_rules` 抛错(fail-closed,不静默降级成全层)。
|
|
156
|
+
|
|
157
|
+
真库对照(`AEIS/data/mdcg`,11756 节点,只读取证):`role` 门限前 11506 → 门限后 11199(越层不再报 307);`evidence_count` 11744 → 11194(越层 550,被挡层 contextual 368 / self 152)。**knowledge 层 11200 节点中 11199 空 `role`、11194 `evidence_count=0`**——这不是定位器误报(M1 同量级报出),而是存量字段缺失的真实规模,直接决定 M4 回填工作量。
|
|
158
|
+
|
|
159
|
+
**指纹不一致的成因区分(修正 2)**:`contradiction/hash_declared_vs_actual` 必带 `cause` 增强键——`index_lag`(节点文件比索引快照新:写走 `_stage()` 分片日志、`rebuild_index()` 才写 `_index.json`,**快照滞后属正常写路径现象**,实测滞后 14s 量级,复核者无需修数据)+ `true_mismatch`(索引快照不旧于文件 → 索引声明与文件真源相抵触,需查)+ `unknown`(取不到盘上 mtime → 不假装知道)。两种成因处置完全不同,合并成一句「索引与文件不一致」会把正常写时序误报成数据损坏。
|
|
160
|
+
|
|
161
|
+
**环境注记(第 4 条)**:真库遍历相位偶发 `PermissionError`(首跑 M1 `phase_e` 命中真库某节点文件)——取证该文件 `mode 0o666`、`open(rb)` 成功、真库全量抽样 11201 文件 0 不可读 → 判定为**文件被其它进程瞬时持有**(非零写入缺陷、非代码面),复跑 M1 107 断言全绿。
|
|
162
|
+
|
|
163
|
+
**归档落地纪律(第 16 条补正,两条同源:形态不是文风,是检索资格的门禁)**:
|
|
164
|
+
1. **写入时声明派生来源**——`derived_from` + `relation`(枚举见 `provenance.RELATIONS`,如 `refined_from`)。理由:`provenance` 纪律含 `no_backfill=True`,边只在**写入时**声明、事后不回填(巡检/rebuild 不补账);写入漏传即关联永久缺失。本轮 M3 修正节点首写漏传,以「覆写 = 重新写入时声明」(而非直改台账)补救,边落 `_link.jsonl`。
|
|
165
|
+
2. **CCG 六要素须为行首 `# 要素名:` 形态**——M2 归档节点首行误写成 `# 记忆评审系统 M2 蜂巢并发…`(缺「功能名」要素),致该节点检索判定 BLINDSPOT;补前缀后恢复。写节点正文时六行齐备且行首,否则能力再强也召不回来。
|
|
166
|
+
|
|
167
|
+
## 7. 反面清单(勿违反)
|
|
168
|
+
|
|
169
|
+
1. **评审不直接改知识层**——意见与工单是产物,执行归 designer 终裁(位置效应:评审者≠执行者);
|
|
170
|
+
2. **永不删除**——治理动作只有合并/降权/回填/移层,删除走既有 rejected 层语义;
|
|
171
|
+
3. **LLM 评审不得跳过机械检查**——确定性优先是 token 经济与可复算性的双重要求;
|
|
172
|
+
4. **不学 OCR 的全权信任**——评审 worker 经蜂巢执行器跑,无宿主 shell 权限;意见落库必过 verify 令牌校验;
|
|
173
|
+
5. **Precision over noise**——裁决不确定一律 DEFER,DEFER 是正常产物不是失败。
|
|
174
|
+
|
|
175
|
+
## 8. 快速上手(CodeBuddy)
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
# 1. 读 §3 流水线图 + §7 反面清单
|
|
179
|
+
# 2. 查证地基:md_cg/crosscheck.py(SOURCE_POLICY:66, detect_self_verify:565)、
|
|
180
|
+
# md_cg/tokens.py:127(verify 角色)、hive/wm.py(三级闸)、hive/src/scheduler.rs
|
|
181
|
+
# 3. 对照蓝本:agi-architectures/open-code-review(定位/反思/规则匹配三模块实现)
|
|
182
|
+
# 4. 从 M1 开工(census+捆绑+规则骨架),验收=审计基线复现
|
|
183
|
+
```
|
package/dsh/README.md
CHANGED
|
@@ -41,7 +41,7 @@ python scripts/verify_discipline.py --target dsh
|
|
|
41
41
|
## 与「三层拆分规划」的关系
|
|
42
42
|
|
|
43
43
|
本目录是**按 harness 维度**(DSH / CodeBuddy / ZCode)归置配置;
|
|
44
|
-
[`../docs/灵枢三层拆分规划_v0.1.md`](../docs/灵枢三层拆分规划_v0.1.md) 讨论的是**另一种正交维度**
|
|
44
|
+
[`../docs/mdcg/灵枢三层拆分规划_v0.1.md`](../docs/mdcg/灵枢三层拆分规划_v0.1.md) 讨论的是**另一种正交维度**
|
|
45
45
|
(灵 / 脑 / 身 三仓职责分离,目标是主仓瘦身)。
|
|
46
46
|
|
|
47
47
|
二者在 `dsh-web-start.bat` 上存在**归属分歧**:三层规划拟将其移出主仓至「身体仓(宿主启动)」,
|
package/lib/hooks.d.ts
CHANGED
|
@@ -21,6 +21,11 @@
|
|
|
21
21
|
* 模型请求组装 system prompt 时自动注入灵枢最近记忆
|
|
22
22
|
* (`stg(op=timeline)`,最近记忆节点时间线),让记忆"自动可用"而不只依赖
|
|
23
23
|
* Agent 主动调用 recall/think 工具。失败静默(不影响请求)。
|
|
24
|
+
*
|
|
25
|
+
* ⚠️ 注入文本**必经** escapePromptBraces(src/lib/prompt_safety.ts,issue #16):
|
|
26
|
+
* 宿主对 context 文本做严格 `{{variable}}` 插值,裸 `{{` 会让每轮 assemble 抛错
|
|
27
|
+
* → 会话永久不可用(记忆永久在库,非偶发)。记忆真源不动,只在**注入副本**上
|
|
28
|
+
* 打断 `{{`——新增任何 push context/section 的代码,同样必须过这道转义。
|
|
24
29
|
*/
|
|
25
30
|
import '@deepseek-ai/dsh-session';
|
|
26
31
|
import '@deepseek-ai/dsh-system-prompt';
|
package/lib/hooks.js
CHANGED
|
@@ -21,9 +21,15 @@
|
|
|
21
21
|
* 模型请求组装 system prompt 时自动注入灵枢最近记忆
|
|
22
22
|
* (`stg(op=timeline)`,最近记忆节点时间线),让记忆"自动可用"而不只依赖
|
|
23
23
|
* Agent 主动调用 recall/think 工具。失败静默(不影响请求)。
|
|
24
|
+
*
|
|
25
|
+
* ⚠️ 注入文本**必经** escapePromptBraces(src/lib/prompt_safety.ts,issue #16):
|
|
26
|
+
* 宿主对 context 文本做严格 `{{variable}}` 插值,裸 `{{` 会让每轮 assemble 抛错
|
|
27
|
+
* → 会话永久不可用(记忆永久在库,非偶发)。记忆真源不动,只在**注入副本**上
|
|
28
|
+
* 打断 `{{`——新增任何 push context/section 的代码,同样必须过这道转义。
|
|
24
29
|
*/
|
|
25
30
|
import '@deepseek-ai/dsh-session';
|
|
26
31
|
import '@deepseek-ai/dsh-system-prompt';
|
|
32
|
+
import { escapePromptBraces } from './lib/prompt_safety.js';
|
|
27
33
|
/** 从 ContentBlock[] 提取纯文本。 */
|
|
28
34
|
function extractText(blocks) {
|
|
29
35
|
const parts = [];
|
|
@@ -177,9 +183,12 @@ export function installMemoryHooks(ctx, mdcg, opts) {
|
|
|
177
183
|
if (shouldPushRecall(text, lastRecallText, skippedSincePush)) {
|
|
178
184
|
lastRecallText = text;
|
|
179
185
|
skippedSincePush = 0;
|
|
186
|
+
// 注入边界转义(issue #16):宿主 system-prompt 对 context 文本做严格
|
|
187
|
+
// `{{variable}}` 插值,裸 `{{` 会 throw → 该轮请求整体失败。记忆原文
|
|
188
|
+
// (含用户命令里的 `{{.X}}`)必须保真落库,故只在注入副本上打断 `{{`。
|
|
180
189
|
assembly.contexts.push({
|
|
181
190
|
name: 'lingshu:auto-recall',
|
|
182
|
-
text: `【灵枢最近记忆】\n${text.slice(0, RECALL_MAX_CHARS)}
|
|
191
|
+
text: escapePromptBraces(`【灵枢最近记忆】\n${text.slice(0, RECALL_MAX_CHARS)}`),
|
|
183
192
|
});
|
|
184
193
|
}
|
|
185
194
|
else {
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* prompt_safety.ts · 注入边界文本安全(宿主严格模板的转义)
|
|
3
|
+
*
|
|
4
|
+
* ── 根因(issue #16,2026-09-16)────────────────────────────────────────
|
|
5
|
+
* dsh 宿主 `@deepseek-ai/dsh-system-prompt` 的 `interpolate()` 会对**每个
|
|
6
|
+
* section / context** 文本做严格 `{{variable}}` 插值,且**四类一律 throw**:
|
|
7
|
+
* ① `{{` 之后能找到 `}}` 但不成简单组(GROUP_AT = /^\{\{([^{}]*)\}\}/ 不匹配)
|
|
8
|
+
* ② 组成立但名不匹配 /^[a-z][a-z0-9_]*$/(如 `{{.Architecture}}`)
|
|
9
|
+
* ③ 名合法但未注册(如 `{{name}}`)
|
|
10
|
+
* ④ 已注册但值为 undefined
|
|
11
|
+
* `renderContextSections()` 逐 context 调用它,throw 直接冒泡到
|
|
12
|
+
* `system-prompt/assemble` → **该轮请求整体失败**。
|
|
13
|
+
*
|
|
14
|
+
* ── 伤害路径 ───────────────────────────────────────────────────────────
|
|
15
|
+
* 自动记忆把用户命令原样沉淀(如 `docker inspect --format '{{.Architecture}}'`)
|
|
16
|
+
* → auto-recall 把含裸 `{{` 的预览推入 `assembly.contexts`
|
|
17
|
+
* → 宿主每轮 assemble 必抛 → **会话永久不可用**(记忆永久在库,非偶发故障)。
|
|
18
|
+
*
|
|
19
|
+
* ── 处置:为何只在注入边界转义,不在写入侧 ────────────────────────────
|
|
20
|
+
* ① 记忆真源必须保真:`{{.Architecture}}` 是用户命令原文,写入侧转义会
|
|
21
|
+
* 不可逆失真,且 cg(op=read) / 工具面 / 检索都依赖原文(= 污染真源);
|
|
22
|
+
* ② 伤害面就是「注入到 prompt 的文本」,在注入边界处理即**最小充分**;
|
|
23
|
+
* ③ 与写入侧 desensitize 不冲突:脱敏是**隐私**要求(不许落盘),
|
|
24
|
+
* 转义是**渲染安全**要求(落盘保真、渲染时规避)——层次不同。
|
|
25
|
+
*
|
|
26
|
+
* ── 转义策略:确保文本中不出现连续两个 `{` ────────────────────────────
|
|
27
|
+
* 依据(宿主源码 `lib/index.js:109-116`):`interpolate` 以
|
|
28
|
+
* `text.indexOf("{{")` 为**唯一扫描锚点**;破坏 `{{` 序列后循环不进入,
|
|
29
|
+
* 文本走 `text.slice(last)` 原样返回。
|
|
30
|
+
* · `}}` 无需处理——它只在 `{{` 成组时参与解析,锚点已破即无意义;
|
|
31
|
+
* · 逐对打断(而非 `split('{{').join(...)`):后者对 `{{{a}}}` 会产出
|
|
32
|
+
* `{ {{a}}}`——新锚点仍在(相邻 `{` 重新合成),不幂等也不安全;
|
|
33
|
+
* · 跨 context 拼接安全:`joinContextSections` 以 `"\n\n"` 分隔并带固定
|
|
34
|
+
* 前缀(`lib/index.js:85-87`,前缀以 `.` 结尾),边界不会合成新 `{{`;
|
|
35
|
+
* · 为何不用零宽字符:显示上「看起来一样」但复制会带入不可见字符
|
|
36
|
+
* (终端粘贴即出错)——诚实性优先,宁可让改写可见。
|
|
37
|
+
*
|
|
38
|
+
* 幂等:结果中不存在 `{{`,重复调用结果不变。
|
|
39
|
+
* 边界:本函数只服务**注入到宿主 prompt 的文本**;记忆真源与工具返回原文
|
|
40
|
+
* 一律不动(工具结果不进 assembly 插值面)。
|
|
41
|
+
*/
|
|
42
|
+
/**
|
|
43
|
+
* 把文本中每一对相邻的 `{` 打断(插入半角空格),使其不再包含 `{{`。
|
|
44
|
+
*
|
|
45
|
+
* 不含 `{{` 的文本**原样返回**(零改写,保真)。
|
|
46
|
+
* 例:`{{.Architecture}}` → `{ {.Architecture}}`;`{{{a}}}` → `{ { {a}}}`。
|
|
47
|
+
*/
|
|
48
|
+
export declare function escapePromptBraces(text: string): string;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* prompt_safety.ts · 注入边界文本安全(宿主严格模板的转义)
|
|
3
|
+
*
|
|
4
|
+
* ── 根因(issue #16,2026-09-16)────────────────────────────────────────
|
|
5
|
+
* dsh 宿主 `@deepseek-ai/dsh-system-prompt` 的 `interpolate()` 会对**每个
|
|
6
|
+
* section / context** 文本做严格 `{{variable}}` 插值,且**四类一律 throw**:
|
|
7
|
+
* ① `{{` 之后能找到 `}}` 但不成简单组(GROUP_AT = /^\{\{([^{}]*)\}\}/ 不匹配)
|
|
8
|
+
* ② 组成立但名不匹配 /^[a-z][a-z0-9_]*$/(如 `{{.Architecture}}`)
|
|
9
|
+
* ③ 名合法但未注册(如 `{{name}}`)
|
|
10
|
+
* ④ 已注册但值为 undefined
|
|
11
|
+
* `renderContextSections()` 逐 context 调用它,throw 直接冒泡到
|
|
12
|
+
* `system-prompt/assemble` → **该轮请求整体失败**。
|
|
13
|
+
*
|
|
14
|
+
* ── 伤害路径 ───────────────────────────────────────────────────────────
|
|
15
|
+
* 自动记忆把用户命令原样沉淀(如 `docker inspect --format '{{.Architecture}}'`)
|
|
16
|
+
* → auto-recall 把含裸 `{{` 的预览推入 `assembly.contexts`
|
|
17
|
+
* → 宿主每轮 assemble 必抛 → **会话永久不可用**(记忆永久在库,非偶发故障)。
|
|
18
|
+
*
|
|
19
|
+
* ── 处置:为何只在注入边界转义,不在写入侧 ────────────────────────────
|
|
20
|
+
* ① 记忆真源必须保真:`{{.Architecture}}` 是用户命令原文,写入侧转义会
|
|
21
|
+
* 不可逆失真,且 cg(op=read) / 工具面 / 检索都依赖原文(= 污染真源);
|
|
22
|
+
* ② 伤害面就是「注入到 prompt 的文本」,在注入边界处理即**最小充分**;
|
|
23
|
+
* ③ 与写入侧 desensitize 不冲突:脱敏是**隐私**要求(不许落盘),
|
|
24
|
+
* 转义是**渲染安全**要求(落盘保真、渲染时规避)——层次不同。
|
|
25
|
+
*
|
|
26
|
+
* ── 转义策略:确保文本中不出现连续两个 `{` ────────────────────────────
|
|
27
|
+
* 依据(宿主源码 `lib/index.js:109-116`):`interpolate` 以
|
|
28
|
+
* `text.indexOf("{{")` 为**唯一扫描锚点**;破坏 `{{` 序列后循环不进入,
|
|
29
|
+
* 文本走 `text.slice(last)` 原样返回。
|
|
30
|
+
* · `}}` 无需处理——它只在 `{{` 成组时参与解析,锚点已破即无意义;
|
|
31
|
+
* · 逐对打断(而非 `split('{{').join(...)`):后者对 `{{{a}}}` 会产出
|
|
32
|
+
* `{ {{a}}}`——新锚点仍在(相邻 `{` 重新合成),不幂等也不安全;
|
|
33
|
+
* · 跨 context 拼接安全:`joinContextSections` 以 `"\n\n"` 分隔并带固定
|
|
34
|
+
* 前缀(`lib/index.js:85-87`,前缀以 `.` 结尾),边界不会合成新 `{{`;
|
|
35
|
+
* · 为何不用零宽字符:显示上「看起来一样」但复制会带入不可见字符
|
|
36
|
+
* (终端粘贴即出错)——诚实性优先,宁可让改写可见。
|
|
37
|
+
*
|
|
38
|
+
* 幂等:结果中不存在 `{{`,重复调用结果不变。
|
|
39
|
+
* 边界:本函数只服务**注入到宿主 prompt 的文本**;记忆真源与工具返回原文
|
|
40
|
+
* 一律不动(工具结果不进 assembly 插值面)。
|
|
41
|
+
*/
|
|
42
|
+
/** 宿主严格模板的扫描锚点。 */
|
|
43
|
+
const TEMPLATE_OPEN = '{{';
|
|
44
|
+
/**
|
|
45
|
+
* 把文本中每一对相邻的 `{` 打断(插入半角空格),使其不再包含 `{{`。
|
|
46
|
+
*
|
|
47
|
+
* 不含 `{{` 的文本**原样返回**(零改写,保真)。
|
|
48
|
+
* 例:`{{.Architecture}}` → `{ {.Architecture}}`;`{{{a}}}` → `{ { {a}}}`。
|
|
49
|
+
*/
|
|
50
|
+
export function escapePromptBraces(text) {
|
|
51
|
+
if (!text.includes(TEMPLATE_OPEN))
|
|
52
|
+
return text;
|
|
53
|
+
let out = '';
|
|
54
|
+
for (let i = 0; i < text.length; i++) {
|
|
55
|
+
const ch = text.charAt(i);
|
|
56
|
+
out += ch;
|
|
57
|
+
// 该 `{` 与下一个字符构成锚点 → 立即插入空格打断
|
|
58
|
+
if (ch === '{' && text.charAt(i + 1) === '{')
|
|
59
|
+
out += ' ';
|
|
60
|
+
}
|
|
61
|
+
return out;
|
|
62
|
+
}
|
package/md_cg/audit.py
CHANGED
|
@@ -4,10 +4,11 @@
|
|
|
4
4
|
架构约束:验证能力不在认知图内(跑测试/识图/验收都不是记忆基底的职责)。
|
|
5
5
|
认知图只做三件事:按内容类型选验证器 → 调用 → 记账。缺能力返回 DEFER,绝不假装通过。
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
内容类型 → 验证动作:
|
|
8
8
|
code 代码内容 → 实测 image_desc 图像描述 → 识图确认
|
|
9
9
|
text 文字内容 → 合规 + 纪律 permission 权限操作 → 是否具有权限
|
|
10
10
|
work_done 工作完成 → 验收 work_wip 工作进行 → 完整成果 + 纪律
|
|
11
|
+
ccg_marks CCG 六要素 → 编外验证方实测(生成方不得自证)
|
|
11
12
|
|
|
12
13
|
裁决四态复用 judge_qualification:ACCEPT / REJECT / DEFER / BLINDSPOT
|
|
13
14
|
验证器签名:fn(payload: dict, ctx: dict) -> {"state":..., "evidence":..., "detail":...}
|
|
@@ -28,12 +29,14 @@ CONTENT_KINDS = {
|
|
|
28
29
|
"permission": "权限操作 → 是否具有权限",
|
|
29
30
|
"work_done": "工作完成 → 工作项是否通过验收",
|
|
30
31
|
"work_wip": "工作进行 → 是否已有完整成果 + 是否符合纪律",
|
|
32
|
+
"ccg_marks": "CCG 六要素候选 → 编外验证方实测确认(生成方不得自证)",
|
|
31
33
|
}
|
|
32
34
|
|
|
33
35
|
# content_kind → 建议的 verification_basis
|
|
34
36
|
# (见 nodefile.VERIFICATION_BASIS:compiler|test|measurement|formal_proof|data|textbook|public_kb|other)
|
|
35
37
|
KIND_BASIS = {"code": "test", "image_desc": "measurement", "text": "other",
|
|
36
|
-
"permission": "data", "work_done": "test", "work_wip": "other"
|
|
38
|
+
"permission": "data", "work_done": "test", "work_wip": "other",
|
|
39
|
+
"ccg_marks": "test"}
|
|
37
40
|
|
|
38
41
|
VERIFIERS = {}
|
|
39
42
|
|
|
@@ -187,6 +190,73 @@ def _pending(kind, why):
|
|
|
187
190
|
return _fn
|
|
188
191
|
|
|
189
192
|
|
|
193
|
+
def _verify_ccg_marks(payload, ctx):
|
|
194
|
+
"""CCG 六要素候选的验证闸门:**只认认知图外的复核裁决**(裁定 A)。
|
|
195
|
+
|
|
196
|
+
本闸门**不在写入路径里阻塞跑 LLM**——写入是同步闸门,等待外部单元会卡住写路径。
|
|
197
|
+
正确的异步三段式:compile(ccgc)→ 外部单元复核(蜂巢 reflect/verify,或
|
|
198
|
+
harness 端子代理)→ 带 `unit_verdict` 回到本闸门 → ACCEPT 才谈得上写入
|
|
199
|
+
(`ccgc.link` 仍**独立**校验签章,本闸门不是唯一防线)。
|
|
200
|
+
|
|
201
|
+
payload 键:
|
|
202
|
+
node_id 目标节点(必填)
|
|
203
|
+
unit_verdict 外部单元裁决 ACCEPT/REJECT/DEFER/BLINDSPOT
|
|
204
|
+
(缺 → DEFER + 给出「下一步怎么拿到裁决」的通道提示)
|
|
205
|
+
verifier 验证方标识(须 != compiled_by,E041)
|
|
206
|
+
evidence 裁决依据(ACCEPT 而无依据 → DEFER:无依据不通过)
|
|
207
|
+
model/allow_degrade/channel 可选,仅用于探测降级通道
|
|
208
|
+
ctx 键:
|
|
209
|
+
compiled_by 编译执行者(E041 比对)
|
|
210
|
+
"""
|
|
211
|
+
node_id = str(payload.get("node_id") or "").strip()
|
|
212
|
+
if not node_id:
|
|
213
|
+
return _verdict(DEFER, "ccg_marks", "缺少 node_id:六要素候选须指明目标节点")
|
|
214
|
+
verdict = str(payload.get("unit_verdict") or payload.get("verdict") or "").strip().upper()
|
|
215
|
+
verifier = str(payload.get("verifier") or "").strip()
|
|
216
|
+
evidence = str(payload.get("evidence") or "").strip()
|
|
217
|
+
compiled_by = str(ctx.get("compiled_by") or payload.get("compiled_by") or "").strip()
|
|
218
|
+
|
|
219
|
+
if verdict in STATES:
|
|
220
|
+
if not verifier:
|
|
221
|
+
return _verdict(DEFER, "ccg_marks",
|
|
222
|
+
"有裁决但缺验证方标识(verifier)——无法证明是编外复核")
|
|
223
|
+
if compiled_by and verifier == compiled_by:
|
|
224
|
+
return _verdict(REJECT, "ccg_marks",
|
|
225
|
+
"E041 自证拒绝:验证方标识 == 编译执行者(LLM 不得自己验证自己)")
|
|
226
|
+
if verdict == ACCEPT and not evidence:
|
|
227
|
+
return _verdict(DEFER, "ccg_marks",
|
|
228
|
+
"ACCEPT 但未给出裁决依据(evidence 为空)——无依据不通过")
|
|
229
|
+
return _verdict(verdict, "ccg_marks", evidence or "(未给依据)",
|
|
230
|
+
detail={"node_id": node_id, "verifier": verifier,
|
|
231
|
+
"job_id": payload.get("job_id") or ""})
|
|
232
|
+
|
|
233
|
+
# 无裁决 → 探测复核通道,按三态给出「下一步怎么拿到裁决」(不阻塞、不假装通过)
|
|
234
|
+
try:
|
|
235
|
+
from . import units
|
|
236
|
+
p = units.probe(model=payload.get("model") or "",
|
|
237
|
+
allow_degrade=bool(payload.get("allow_degrade")),
|
|
238
|
+
channel=payload.get("channel") or "")
|
|
239
|
+
except Exception as exc: # noqa: BLE001 —— 探测失败亦不假装
|
|
240
|
+
return _verdict(DEFER, "ccg_marks",
|
|
241
|
+
"未获复核裁决,且复核通道探测失败:%s: %s"
|
|
242
|
+
% (type(exc).__name__, exc))
|
|
243
|
+
if p["state"] == units.HIVE:
|
|
244
|
+
nxt = ("复核通道=蜂巢(model=%s):cg(op=ccg, action=review, node_id=%s, "
|
|
245
|
+
"blocking=true) 取得裁决后带 unit_verdict/verifier 重入本闸门"
|
|
246
|
+
% (p["model"], node_id))
|
|
247
|
+
elif p["state"] == units.SUBAGENT:
|
|
248
|
+
nxt = ("已降级 harness 端子代理(channel=%s):把 units.review 返回的 prompt 交给"
|
|
249
|
+
"子代理执行,取回 JSON 裁决后带 unit_verdict/verifier 重入本闸门"
|
|
250
|
+
% p["channel"])
|
|
251
|
+
else:
|
|
252
|
+
nxt = p["hint"]
|
|
253
|
+
return _verdict(DEFER, "ccg_marks",
|
|
254
|
+
"六要素候选尚未经编外复核(未获 unit_verdict)——缺复核恒不通过",
|
|
255
|
+
detail={"channel_state": p["state"], "next": nxt,
|
|
256
|
+
"jobs_dir": p["jobs_dir"], "model": p["model"],
|
|
257
|
+
"node_id": node_id})
|
|
258
|
+
|
|
259
|
+
|
|
190
260
|
# ---------- 分派入口 ----------
|
|
191
261
|
|
|
192
262
|
def audit(content_kind, payload=None, ctx=None):
|
|
@@ -278,3 +348,7 @@ register_verifier("code", _verify_code)
|
|
|
278
348
|
# 诚实说明缺什么,绝不假装通过。
|
|
279
349
|
register_verifier("image_desc", _pending("image_desc", "未注入识图验证器(需视觉能力)"))
|
|
280
350
|
register_verifier("work_done", _pending("work_done", "未注入验收器(需验收标准)"))
|
|
351
|
+
# ccg_marks:闸门本身不是「能力」而是**准入判据**——只认编外单元的裁决
|
|
352
|
+
# (unit_verdict + verifier);无裁决时探测复核通道(蜂巢→配置→子代理)并给出
|
|
353
|
+
# 下一步,恒不假装通过。真实复核由外部单元完成,认知图只负责记账。
|
|
354
|
+
register_verifier("ccg_marks", _verify_ccg_marks)
|
package/md_cg/bench_membench.py
CHANGED
|
@@ -297,10 +297,14 @@ def patch_random_path(cg, seed=0):
|
|
|
297
297
|
|
|
298
298
|
|
|
299
299
|
def patch_symmetric_pool(cg):
|
|
300
|
-
"""
|
|
300
|
+
"""【2026-09-16 起已冗余】抬高 GLOBAL_CAP,让 lexical 与 fuzzy 候选池对称。
|
|
301
301
|
|
|
302
|
-
lexical
|
|
303
|
-
|
|
302
|
+
背景:lexical 命中数超 GLOBAL_CAP 时按**插入序**截断,fuzzy 则全库打分后取
|
|
303
|
+
Top-50;两条路候选池不对称,会系统性偏袒 fuzzy。当时以「抬高 cap」对冲。
|
|
304
|
+
|
|
305
|
+
现状:截断依据已改为**相关度**(`mdcg.cut_by_relevance` 与 `mdcos._lexical`
|
|
306
|
+
均先全量打分再排序截断,cap 值仍为 500)——插入序偏置的根因已消除,本 patch
|
|
307
|
+
不再必要。保留仅为兼容既有对照命令(`--symmetric-pool`)与历史口径复现。
|
|
304
308
|
"""
|
|
305
309
|
from md_cg import mdcos as _m
|
|
306
310
|
_m.GLOBAL_CAP = 10 ** 9
|
|
@@ -310,8 +314,9 @@ def patch_symmetric_pool(cg):
|
|
|
310
314
|
def patch_lexical_full(cg):
|
|
311
315
|
"""让 lexical 也对**全量候选池**打分(消除「扫描范围」差异,只留排序算法差异)。
|
|
312
316
|
|
|
313
|
-
默认 _lexical 只在 LIKE 命中集上打分(中位约 20 条),而 _path_fuzzy 扫全库 1000
|
|
314
|
-
|
|
317
|
+
默认 _lexical 只在 LIKE 命中集上打分(中位约 20 条),而 _path_fuzzy 扫全库 1000 条。
|
|
318
|
+
注:截断依据改为相关度后(2026-09-16),「排序依据不对等」已消除,此处差异
|
|
319
|
+
仅剩**扫描范围**一项;本 patch 仍用于隔离排序算法差异的对照实验。
|
|
315
320
|
"""
|
|
316
321
|
from md_cg.mdcg import bigrams
|
|
317
322
|
|