@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
package/md_cg/freshness.py
CHANGED
|
@@ -179,22 +179,31 @@ def resolve_gamma(gamma=None) -> float:
|
|
|
179
179
|
# 核(一律经 time_core;本模块不写指数核)
|
|
180
180
|
# --------------------------------------------------------------------------
|
|
181
181
|
|
|
182
|
-
# 生效条件:gamma 与 dt_days(单位=天)任意可转 float 时,返回 time_core.cred_factor(gamma, dt_days, floor, ceil);dt 非有限值(inf/nan)时同样交给 cred_factor(inf → 取 floor);
|
|
182
|
+
# 生效条件:gamma 与 dt_days(单位=天)任意可转 float 时,返回 time_core.cred_factor(gamma, dt_days, floor, ceil);dt 非有限值(inf/nan)时同样交给 cred_factor(inf → 取 floor);enabled 为 None(缺省)时自算(模块级 enabled()),显式传 bool 时按传入值——两者皆假值即恒返回 1.0;
|
|
183
183
|
def decay_factor(gamma: float, dt_days: float, floor: float = SCORE_FLOOR,
|
|
184
|
-
ceil: float = SCORE_CEIL) -> float:
|
|
184
|
+
ceil: float = SCORE_CEIL, enabled=None) -> float:
|
|
185
185
|
"""时间衰减乘子 `e^(-γ·Δt)`(**核来自唯一权威** `time_core.cred_factor`)。
|
|
186
186
|
|
|
187
187
|
⚠ `dt_days` 的单位**必须**是「天」(`DT_UNIT`);调用方负责换算,
|
|
188
188
|
换算单点是 `entry_weight`(`(now - created_at) / SECONDS_PER_DAY`)。
|
|
189
|
+
|
|
190
|
+
`enabled`(N274):None=自算(默认,行为与改动前逐位一致);显式传
|
|
191
|
+
bool 时不再自算——供 `entry_weight`/`_score` 把开关**循环外解析一次**
|
|
192
|
+
后透传,消掉逐节点 env 读取。自算分支写 `globals()["enabled"]()` 而非
|
|
193
|
+
直接 `enabled()`:形参同名会遮蔽模块函数,而 `globals()` 的解析语义与
|
|
194
|
+
改前那句 `enabled()` 逐位一致(含测试对模块函数的打桩/替换面)。
|
|
189
195
|
"""
|
|
190
|
-
if
|
|
196
|
+
if enabled is None:
|
|
197
|
+
enabled = globals()["enabled"]()
|
|
198
|
+
if not enabled:
|
|
191
199
|
return 1.0
|
|
192
200
|
return _tc.cred_factor(float(gamma), float(dt_days), float(floor),
|
|
193
201
|
float(ceil))
|
|
194
202
|
|
|
195
203
|
|
|
196
|
-
# 生效条件:access_count 与 last_access 任意(不可转数值按 0 处理)、importance 任意可转 float
|
|
197
|
-
def refresh_factor(access_count=0, last_access=0, importance=0.0
|
|
204
|
+
# 生效条件:access_count 与 last_access 任意(不可转数值按 0 处理)、importance 任意可转 float;enabled 为 None(缺省)时自算(模块级 enabled()),显式传 bool 时按传入值——两者皆假值即恒返回 1.0;否则按 REFRESH_PARAMS 的三档判定返回 1.0+gain / 1.0−gain / 1.0;
|
|
205
|
+
def refresh_factor(access_count=0, last_access=0, importance=0.0,
|
|
206
|
+
enabled=None) -> float:
|
|
198
207
|
"""访问刷新/降权乘子(**门槛与步长照抄 AEIS** `consolidate_cycle`)。
|
|
199
208
|
|
|
200
209
|
判定序(与 AEIS 同序同门):
|
|
@@ -209,8 +218,13 @@ def refresh_factor(access_count=0, last_access=0, importance=0.0) -> float:
|
|
|
209
218
|
在**从未被访问**(`access_count == 0`)时也为真——照抄原样会让「刚写、
|
|
210
219
|
从未调用的高重要度节点」白拿一次刷新。加此闸后「未被调用」只能不刷新,
|
|
211
220
|
不会反被奖励(语义仍与 §7.1「被经常调用的记忆其权重被刷新」一致)。
|
|
221
|
+
|
|
222
|
+
`enabled`(N274):None=自算(默认,行为与改动前逐位一致);显式传
|
|
223
|
+
bool 时不再自算——与 `decay_factor` 同一透传口径(见其 docstring)。
|
|
212
224
|
"""
|
|
213
|
-
if
|
|
225
|
+
if enabled is None:
|
|
226
|
+
enabled = globals()["enabled"]()
|
|
227
|
+
if not enabled:
|
|
214
228
|
return 1.0
|
|
215
229
|
p = REFRESH_PARAMS
|
|
216
230
|
try:
|
|
@@ -251,8 +265,8 @@ def protected_floor(entry) -> float:
|
|
|
251
265
|
return max(SCORE_FLOOR, min(1.0, IMPORTANCE_PROTECT / imp))
|
|
252
266
|
|
|
253
267
|
|
|
254
|
-
# 生效条件:entry 为可取 created_at / access_count / last_access / importance / protected 的映射;fm 为真值时上述五个键优先取自 fm(缺键回落 entry);now 为假值(None)时取 freshness_now()
|
|
255
|
-
def entry_weight(entry, now=None, gamma=None, fm=None) -> tuple:
|
|
268
|
+
# 生效条件:entry 为可取 created_at / access_count / last_access / importance / protected 的映射;fm 为真值时上述五个键优先取自 fm(缺键回落 entry);now 为假值(None)时取 freshness_now();enabled 为 None(缺省)时自算(模块级 enabled()),显式传 bool 时按传入值——两者皆假值即早退返回 (1.0, {"disabled": True})(早退先于 now/γ 解析,与改前同序);否则无条件返回 (乘子, 依据 dict)——乘子 = decay_factor(gamma, |now-created_at|/86400, protected_floor(取数后的映射), SCORE_CEIL, enabled=…) × refresh_factor(..., enabled=…);created_at 缺失/不可转数值/≤0 时 dt_days 取 inf(判「距参照无穷远」,由 floor 兜住);
|
|
269
|
+
def entry_weight(entry, now=None, gamma=None, fm=None, enabled=None) -> tuple:
|
|
256
270
|
"""索引条目 → 分数乘子 `(乘子, 依据)`(**检索期唯一取数点**,免读文件)。
|
|
257
271
|
|
|
258
272
|
`entry` 直接来自索引快照(`_node_entry` 已落 `created_at` /
|
|
@@ -260,6 +274,11 @@ def entry_weight(entry, now=None, gamma=None, fm=None) -> tuple:
|
|
|
260
274
|
|
|
261
275
|
`fm` 为可选覆盖源(写面刚落的 frontmatter 可能比索引条目新):只为
|
|
262
276
|
避免在热路径上拷贝 dict 而设,取数优先级 `fm > entry > 缺省`。
|
|
277
|
+
|
|
278
|
+
`enabled`(N274):None=自算(默认,行为与改动前逐位一致);显式传
|
|
279
|
+
bool 时不再自算,且向下透传给 `decay_factor`/`refresh_factor`——它们
|
|
280
|
+
同样不再各自读 env。自算分支经 `globals()["enabled"]()`(形参遮蔽,
|
|
281
|
+
解析语义同改前的 `enabled()`,见 `decay_factor` 同注)。
|
|
263
282
|
"""
|
|
264
283
|
e = entry or {}
|
|
265
284
|
keys = ("created_at", "access_count", "last_access", "importance",
|
|
@@ -269,7 +288,9 @@ def entry_weight(entry, now=None, gamma=None, fm=None) -> tuple:
|
|
|
269
288
|
for k in keys}
|
|
270
289
|
else:
|
|
271
290
|
src = {k: e.get(k) for k in keys}
|
|
272
|
-
if
|
|
291
|
+
if enabled is None:
|
|
292
|
+
enabled = globals()["enabled"]()
|
|
293
|
+
if not enabled:
|
|
273
294
|
return 1.0, {"disabled": True}
|
|
274
295
|
g = resolve_gamma(gamma)
|
|
275
296
|
ref = freshness_now() if now is None else float(now)
|
|
@@ -286,9 +307,9 @@ def entry_weight(entry, now=None, gamma=None, fm=None) -> tuple:
|
|
|
286
307
|
# 微变)且两侧跨语言同值。详见 DT_QUANTUM_DAYS 的说明。
|
|
287
308
|
dt_days = float(int(dt_days / DT_QUANTUM_DAYS)) * DT_QUANTUM_DAYS
|
|
288
309
|
floor = protected_floor(src)
|
|
289
|
-
d = decay_factor(g, dt_days, floor, SCORE_CEIL)
|
|
310
|
+
d = decay_factor(g, dt_days, floor, SCORE_CEIL, enabled=enabled)
|
|
290
311
|
r = refresh_factor(src.get("access_count"), src.get("last_access"),
|
|
291
|
-
src.get("importance"))
|
|
312
|
+
src.get("importance"), enabled=enabled)
|
|
292
313
|
return d * r, {"gamma": g, "dt_days": dt_days, "unit": DT_UNIT,
|
|
293
314
|
"decay": d, "refresh": r, "floor": floor,
|
|
294
315
|
"protected": bool(src.get("protected"))}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""幽灵引用检查器(A2 落地):短语层标记 + id 层降级告警——**只标记、不拒收**。
|
|
3
|
+
|
|
4
|
+
背景(多主体世界模型对齐 v0.1 §2 L1「转引不得升级」):CD-WHALE-01(鲸娘语料
|
|
5
|
+
731 轮)发现 C 的现实形态是**自然语言回指**(「上次的香薰蜡烛」「明明讲过的那
|
|
6
|
+
件事」)——被引对象在库里没有任何记录,引用悬空且无任何防线(探针读数:
|
|
7
|
+
短语层零痕迹、id 层「目标晚于自身」零告警)。本模块补两条**标记级**防线:
|
|
8
|
+
|
|
9
|
+
① 短语层:正文以回指短语(「上次的」「之前说的」「明明讲过」)指代一个
|
|
10
|
+
在句内**无可解析出处**(句内无库内 id)的对象时,产出幽灵引用短语清单
|
|
11
|
+
——写入链把它落 `fm.uncertain_refs` 并在出口告警;**不拒收**(回指是
|
|
12
|
+
现实写作的常态,拒收会把正常记忆挡在门外;标记让「不确定」可被后续
|
|
13
|
+
裁决与检索看见)。
|
|
14
|
+
② id 层:正文引用了一个库内目标,但本文档声明的生效起点(valid_from /
|
|
15
|
+
effective_from)**早于**目标创建时刻——「引用了当时尚不存在的目标」。
|
|
16
|
+
产出 late_refs 告警清单;同样**不改建边判定、不拒收**。
|
|
17
|
+
|
|
18
|
+
判据边界(如实):
|
|
19
|
+
· 句级判定:短语所在**句子**([。!?;\n] 为界)内无库内 id ⇒ 幽灵;
|
|
20
|
+
跨句引用(一句短语、邻句 id)不消解标记——保守方向是「宁标勿漏」。
|
|
21
|
+
· 仅写链(MCP op=write)路径生效(与 linkref 同界);库层直调 cg.add
|
|
22
|
+
不经检测。
|
|
23
|
+
· 短语表保守(明确的时间/人称回指词),**不含**「那条/那根」这类泛指示词
|
|
24
|
+
(误报率高,标记面宁可窄);误报后果 = fm 多一个标记。
|
|
25
|
+
· 检测面**不查源节点 id 形态**(不同于 linkref 的 is_linkable_source
|
|
26
|
+
门槛):标记是**内容属性**——无论节点 id 是否合规,正文里的无出处回指
|
|
27
|
+
都值得标记;建边是**图属性**,才需要形态门槛(防图污染)。两者有意
|
|
28
|
+
不同界。**late 面例外**:它消费 linkref 解析出的 targets,源 id 不合
|
|
29
|
+
形态 ⇒ 无 targets ⇒ late 静默不查(与 linkref 同界,2026-10-05 复核
|
|
30
|
+
info-④ 登记)。
|
|
31
|
+
"""
|
|
32
|
+
from __future__ import annotations
|
|
33
|
+
|
|
34
|
+
import re
|
|
35
|
+
|
|
36
|
+
__all__ = ["PHRASES", "SENTENCE_SPLIT_RE", "find_ghost_phrases", "late_targets",
|
|
37
|
+
"check"]
|
|
38
|
+
|
|
39
|
+
#: 回指短语表(时间回指 + 人称回指;CD-WHALE-01 发现 C 的词形采样,
|
|
40
|
+
#: 对齐评估 v0.1 §2 L1 的「上次的/之前的/明明讲过」三例)。
|
|
41
|
+
PHRASES = (
|
|
42
|
+
"上次的", "上次说", "上次买", "上次那", "上次提",
|
|
43
|
+
"之前的", "之前说", "之前买", "之前那", "之前提",
|
|
44
|
+
"明明讲过", "明明说过", "明明说", "明明提",
|
|
45
|
+
"刚才说", "刚才的", "前述的", "先前说", "早先的",
|
|
46
|
+
"你说的", "我说过的", "你提过的",
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
#: 句界(句级判定的切分面)。保留句子文本、丢弃界符。
|
|
50
|
+
SENTENCE_SPLIT_RE = re.compile(r"[。!?;\n]+")
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def find_ghost_phrases(text, known=None) -> list:
|
|
54
|
+
"""短语层检测:返回**无可解析出处**的回指短语列表(去重保序)。
|
|
55
|
+
|
|
56
|
+
known —— 库内节点 id 集合(白名单)。句内含形态合法**且在册**的 id 即
|
|
57
|
+
视为「有出处」(该句非幽灵);传 None 时降级为只判形态(保守少报)。
|
|
58
|
+
"""
|
|
59
|
+
if not text:
|
|
60
|
+
return []
|
|
61
|
+
from . import linkref
|
|
62
|
+
out = []
|
|
63
|
+
seen = set()
|
|
64
|
+
for sent in SENTENCE_SPLIT_RE.split(str(text)):
|
|
65
|
+
hits = [p for p in PHRASES if p in sent]
|
|
66
|
+
if not hits:
|
|
67
|
+
continue
|
|
68
|
+
# 句内子串去重(最长优先):「明明说过」同时命中「明明说过」与
|
|
69
|
+
# 「明明说」——同一现象的一个更长粒度标记即可(复核 info-2:
|
|
70
|
+
# 冗余双标记挤占 cap 16)。跨句不去重(不同句各自独立)。
|
|
71
|
+
hits = [p for p in hits
|
|
72
|
+
if not any(p != q and p in q for q in hits)]
|
|
73
|
+
# 句内是否有可解析出处:id 形态命中 + (调用方给了 known 时)在册。
|
|
74
|
+
refs = linkref.extract_refs(sent, known=known)
|
|
75
|
+
if refs:
|
|
76
|
+
continue
|
|
77
|
+
for p in hits:
|
|
78
|
+
if p not in seen:
|
|
79
|
+
seen.add(p)
|
|
80
|
+
out.append(p)
|
|
81
|
+
return out
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def late_targets(cg, targets, own_from) -> list:
|
|
85
|
+
"""id 层检测:目标创建时刻晚于本文档声明的生效起点 ⇒「目标晚于自身」。
|
|
86
|
+
|
|
87
|
+
targets —— linkref 解析出的引用目标 id 列表(ctx["linkref_targets"])。
|
|
88
|
+
own_from —— 本文档声明的生效起点(valid_from / effective_from);缺省
|
|
89
|
+
None 表示未声明时间轴,此时不做检查(写入 created_at=now,
|
|
90
|
+
「目标晚于自身」结构上不可能)。
|
|
91
|
+
|
|
92
|
+
返回 [{target, target_created, own_from}](cap 10,保序)。
|
|
93
|
+
"""
|
|
94
|
+
if own_from is None or not targets:
|
|
95
|
+
return []
|
|
96
|
+
try:
|
|
97
|
+
own = float(own_from)
|
|
98
|
+
except (TypeError, ValueError):
|
|
99
|
+
return []
|
|
100
|
+
nodes = (getattr(cg, "index", None) or {}).get("nodes") or {}
|
|
101
|
+
out = []
|
|
102
|
+
for tid in targets:
|
|
103
|
+
tid = str(tid)
|
|
104
|
+
e = nodes.get(tid) or {}
|
|
105
|
+
tc = e.get("created_at")
|
|
106
|
+
if tc is None:
|
|
107
|
+
rec = cg.get(tid) or {}
|
|
108
|
+
tc = ((rec.get("frontmatter")) or {}).get("created_at")
|
|
109
|
+
try:
|
|
110
|
+
tc = float(tc)
|
|
111
|
+
except (TypeError, ValueError):
|
|
112
|
+
continue
|
|
113
|
+
if tc > own:
|
|
114
|
+
out.append({"target": tid, "target_created": tc, "own_from": own})
|
|
115
|
+
if len(out) >= 10:
|
|
116
|
+
break
|
|
117
|
+
return out
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
# 生效条件:总是返回 {"ghost_phrases": [...], "late_refs": [...]} 两键 dict(各可为空列表);
|
|
121
|
+
# 内部对 text 做短语层检测(known 取 cg 索引键集合),对 ctx 已解析的 linkref 目标做 id 层检测;
|
|
122
|
+
# 不做任何落盘/短路(纯读)。
|
|
123
|
+
def check(cg, text, linkref_targets=None, own_from=None) -> dict:
|
|
124
|
+
"""组合检测(纯读,无副作用):供写入链闸调用。"""
|
|
125
|
+
nodes = (getattr(cg, "index", None) or {}).get("nodes") or {}
|
|
126
|
+
known = set(nodes.keys())
|
|
127
|
+
return {
|
|
128
|
+
"ghost_phrases": find_ghost_phrases(text, known=known),
|
|
129
|
+
"late_refs": late_targets(cg, linkref_targets or [], own_from),
|
|
130
|
+
}
|
|
@@ -33,6 +33,7 @@ hive serve 心跳)用的是 `scripts/judgment_manifest.py`,两侧 PATTERNS
|
|
|
33
33
|
md_cg/test_*.py Python 侧测试套件
|
|
34
34
|
compiler/tests/*.py compiler 测试
|
|
35
35
|
swarm/tests/*.py swarm 测试
|
|
36
|
+
test/{hive_exec,hive_wm}_test.py test/ 侧逐文件裁决可收件(A6;精确名冻结)
|
|
36
37
|
|
|
37
38
|
安装态(出货包)只有 `md_cg/test_*.py` 一组可得——其余组命中数为 0,
|
|
38
39
|
`missing_patterns` 显式随清单与冻结凭证落盘(不静默少算);A3 两侧必须在
|
|
@@ -55,6 +56,12 @@ PATTERNS = [
|
|
|
55
56
|
("md_cg", "test_*.py"),
|
|
56
57
|
("compiler/tests", "*.py"),
|
|
57
58
|
("swarm/tests", "*.py"),
|
|
59
|
+
# test/(A6,2026-10-05):与 scripts/ 版逐字同步——test/ 侧逐文件裁决可收件的
|
|
60
|
+
# 精确名冻结(未过裁决的件不进判据面)。批次99 补收:chaos 套件的陈旧登记已
|
|
61
|
+
# 同步(FI-M04 读码代理断言改 AST 语义判据 + 去锁定点变异自证)。
|
|
62
|
+
("test", "hive_exec_test.py"),
|
|
63
|
+
("test", "hive_wm_test.py"),
|
|
64
|
+
("test/chaos_injection", "run_all.py"),
|
|
58
65
|
]
|
|
59
66
|
|
|
60
67
|
|
package/md_cg/mcp_server.py
CHANGED
|
@@ -59,6 +59,26 @@ from utf8_boot import ensure_utf8 # noqa: E402
|
|
|
59
59
|
ensure_utf8(__file__)
|
|
60
60
|
|
|
61
61
|
|
|
62
|
+
# ------------------------------------------- 入口自保证 OpenBLAS 线程数(2026-10-05)
|
|
63
|
+
# 根因(返修取证):numpy(md_cg 可选依赖,经 whitebox_kb 系列模块加载)在**导入期**
|
|
64
|
+
# 由 OpenBLAS 按线程数(默认 = 核数)申请每线程缓冲——本机 32 核实测单进程
|
|
65
|
+
# `import numpy` 的**全机提交内存**增量 0.73 GiB。启动链上的代校验
|
|
66
|
+
# (verify_delegations → 导入含 numpy 的目标模块,见 main)把这笔分配带到
|
|
67
|
+
# **服务应答之前**:机器提交内存吃紧、或**多进程同启**(并行测试套件 / 多会话
|
|
68
|
+
# 并存 / 常驻扫描)时,OpenBLAS 重试 10 次后放弃并 exit(1)——进程在 initialize
|
|
69
|
+
# 应答前死亡,桥侧只见「握手失败 / 插件激活失败」,子进程 stderr 里的
|
|
70
|
+
# `OpenBLAS error: Memory allocation still failed after 10 retries` 是唯一线索。
|
|
71
|
+
# 实测(本机,2026-10-05;随提交内存压力波动):12 个并发 `import numpy` 默认
|
|
72
|
+
# 4~9/12 失败(两轮独立读数,stderr 同上),置本值后 0/12(两轮);单进程提交
|
|
73
|
+
# 增量 0.73 → 0.013 GiB(4 线程 0.100 GiB)。md_cg 现有数值面是向量点积/范数/
|
|
74
|
+
# 小矩阵,单线程对其**无已观测的性能意义**(⚠ 未做基准实测,出现 BLAS 密集路径
|
|
75
|
+
# 须在性能轮复测)。显式设值优先,只填空缺/空白(仓库口径:空白视为未设置)。
|
|
76
|
+
# 位置钉死:必须在 numpy 可被导入之前——模块级,早于 main() 的代校验;
|
|
77
|
+
# 且晚于 ensure_utf8(其重启形态经 env 继承本值,两条保证互不干扰)。
|
|
78
|
+
if not (os.environ.get("OPENBLAS_NUM_THREADS") or "").strip():
|
|
79
|
+
os.environ["OPENBLAS_NUM_THREADS"] = "1"
|
|
80
|
+
|
|
81
|
+
|
|
62
82
|
# SERVER_VERSION 从包根 package.json 动态读取(issue #42:硬编码 0.1.0 与发布
|
|
63
83
|
# 版本脱节,握手自报假版本);读不到(文件缺失/损坏/裁剪)回落保底值不阻塞启动。
|
|
64
84
|
# v21-R1(2026-09-28):**回落必须覆盖全形态**——修前只捉 (OSError, ValueError)
|
|
@@ -593,6 +613,8 @@ KERNEL_TOOLS = [
|
|
|
593
613
|
"建议能力名(不执行,由调用方决定);op=read:召回/检索/按 id 取"
|
|
594
614
|
"(长内容自动截断 2000 行 / 50KB,返回 truncated+next_offset,"
|
|
595
615
|
"续读传 offset=next_offset,不静默丢内容);"
|
|
616
|
+
"op=audit:证据审计视图(只读组装,需 node_id;返回"
|
|
617
|
+
"现值/出处链/两存备择/盲区/退役史五面;路线 C);"
|
|
596
618
|
"op=write:写入前按 content_kind 审核(ACCEPT 落盘 / REJECT 进负记忆 / "
|
|
597
619
|
"DEFER 进审核队列)+ 节点间冲突检测(三级决策:情绪→反思→递归反思;"
|
|
598
620
|
"consistency=false 可关,on_conflict=reject|defer|record);"
|
|
@@ -712,7 +734,7 @@ KERNEL_TOOLS = [
|
|
|
712
734
|
"scrub|predict|causal|"
|
|
713
735
|
"forget|goal|task|recent|info|index_code|index_doc|ref|whitebox|"
|
|
714
736
|
"theory|link|session|ingest|export|maintain|consolidate|"
|
|
715
|
-
"insight|ccg|status|edges|help", True),
|
|
737
|
+
"insight|ccg|status|edges|audit|help", True),
|
|
716
738
|
ccg=_p("object", "CCG 六要素编译器入参:{action, node_id, dialog, marks, "
|
|
717
739
|
"slots, strict_spans, role, verdict, verifier, compiled_by, "
|
|
718
740
|
"evidence, slot_corrections, model, jobs, blocking, wait_s, "
|
|
@@ -782,6 +804,13 @@ KERNEL_TOOLS = [
|
|
|
782
804
|
depth=_p("integer", "consistency:递归反思深度上限"),
|
|
783
805
|
condition_space=_p("object", "条件空间"),
|
|
784
806
|
verification_basis=_p("string", "验证基底"),
|
|
807
|
+
# A1 补接(2026-10-05,路线 C 动工时经 audit 现值面发现写链漏传后
|
|
808
|
+
# 一并补齐的三处接线之一):检验强度(与验证基底正交的裁决力分级)。
|
|
809
|
+
check_strength=_p("string", "检验强度:hoop|smoking_gun|doubly_decisive"
|
|
810
|
+
"(与 verification_basis 正交的裁决力分级;"
|
|
811
|
+
"覆写既有节点时默认继承)"),
|
|
812
|
+
# 路线 C(2026-10-05):audit 的截断上限。
|
|
813
|
+
cap=_p("integer", "audit:各面截断上限(1–64,缺省 8)"),
|
|
785
814
|
non_applicable_conditions=_p("array", "不适用条件"),
|
|
786
815
|
context=_p("object", "当前情境"),
|
|
787
816
|
k=_p("integer", "返回条数(sustain pool_bench 亦用)"),
|
|
@@ -2337,6 +2366,26 @@ def _cg_dispatch(cg, a):
|
|
|
2337
2366
|
"reason": q2.get("reason"), **refindex.ref_fields(n)}
|
|
2338
2367
|
for n, s, q2 in res]}
|
|
2339
2368
|
|
|
2369
|
+
if op == "audit":
|
|
2370
|
+
# 路线 C(2026-10-05,多主体世界模型对齐 v0.1 §4):证据审计面——
|
|
2371
|
+
# 只读组装器(md_cg/auditview.py),零写路径改动。node_id 类型闸与
|
|
2372
|
+
# read 面同口径(类型错 ⇒ 结构化 error,不静默降级);截断参数用
|
|
2373
|
+
# `cap`(**故意不用 view/limit 等既有名**——view 已被 roleviews 占用,
|
|
2374
|
+
# 设计稿复核修订的命名约束)。
|
|
2375
|
+
_nid = a.get("node_id")
|
|
2376
|
+
if not isinstance(_nid, str) or not _nid.strip():
|
|
2377
|
+
return {"ok": False, "error": "node_id_not_str",
|
|
2378
|
+
"node_id": _nid, "got_type": type(_nid).__name__,
|
|
2379
|
+
"hint": "audit 需字符串 node_id(证据审计视图按节点组装);"
|
|
2380
|
+
"要按关键词检索请改用 query(read)"}
|
|
2381
|
+
from . import auditview
|
|
2382
|
+
_cap = a.get("cap")
|
|
2383
|
+
try:
|
|
2384
|
+
_cap = int(_cap) if _cap is not None else auditview.DEFAULT_CAP
|
|
2385
|
+
except (TypeError, ValueError):
|
|
2386
|
+
_cap = auditview.DEFAULT_CAP
|
|
2387
|
+
return auditview.build(cg, _nid, cap=max(1, min(64, _cap)))
|
|
2388
|
+
|
|
2340
2389
|
if op == "write":
|
|
2341
2390
|
# 写入路径拦截器链(Pi 钩子化移植,writepipe.py):六道闸以扩展
|
|
2342
2391
|
# 形态注册于 writepipe.default_pipeline(),次序/启停不再硬编码于
|
|
@@ -3341,6 +3390,9 @@ def _dispatch(cg, name, args):
|
|
|
3341
3390
|
role=a.get("role"), tags=a.get("tags"),
|
|
3342
3391
|
condition_space=a.get("condition_space"),
|
|
3343
3392
|
verification_basis=a.get("verification_basis"),
|
|
3393
|
+
# A1 补接(2026-10-05):检验强度同族透传(remember_gated 内部
|
|
3394
|
+
# add(**kw) 直达;此前声明在 gated 分支静默丢弃)。
|
|
3395
|
+
check_strength=a.get("check_strength"),
|
|
3344
3396
|
non_applicable_conditions=a.get("non_applicable_conditions"),
|
|
3345
3397
|
importance_hint=hint, override=bool(a.get("override")),
|
|
3346
3398
|
consistency=bool(a.get("consistency", True)),
|
|
@@ -3390,6 +3442,9 @@ def _dispatch(cg, name, args):
|
|
|
3390
3442
|
_meta = {k: a[k] for k in
|
|
3391
3443
|
("tags", "condition_space", "verification_basis",
|
|
3392
3444
|
"non_applicable_conditions", "derived_from", "relation",
|
|
3445
|
+
# A1 补接(2026-10-05):检验强度入复现 meta——与
|
|
3446
|
+
# writepipe._AUTONOMY_META_KEYS 同款(两条路径元数据等价)。
|
|
3447
|
+
"check_strength",
|
|
3393
3448
|
"role", "importance") if a.get(k) is not None}
|
|
3394
3449
|
# 直写面的裁决参数(本分支的 add 会自己跑冲突闸):随单落进复现 meta,
|
|
3395
3450
|
# 否则「确认后落盘」与「直接落盘」两条路径的判据不等价。
|
|
@@ -3416,6 +3471,8 @@ def _dispatch(cg, name, args):
|
|
|
3416
3471
|
condition_space=a.get("condition_space"),
|
|
3417
3472
|
importance=float(a.get("importance", 0.5)),
|
|
3418
3473
|
verification_basis=a.get("verification_basis"),
|
|
3474
|
+
# A1 补接(2026-10-05):检验强度透传(同 B2)。
|
|
3475
|
+
check_strength=a.get("check_strength"),
|
|
3419
3476
|
non_applicable_conditions=a.get("non_applicable_conditions"),
|
|
3420
3477
|
override=bool(a.get("override")),
|
|
3421
3478
|
consistency=bool(a.get("consistency", True)),
|