#!/usr/bin/env python3 """VERIFY: 上下文交接可见性(CLM / ContextBench, learn_queue #1323, 2026-10-11) 病理(HGB WHERE×WHY):WHERE=吸收链路每个把文本塞进 prompt / 落 learning_results 的交接点; WHY=裸切片 `[:N]` 做固定压缩——截断无标记,下游(重试的模型 / 事后审计的人)把残缺片段当完整读。 对应 ContextBench 证伪点①「总结压缩丢信息 → 幻觉」:固定策略原理上覆盖不了所有局面, 能给的最低限度是让「压缩」这件事自身可见 + 可回源。 TDD: TC1 `_clip` 行为(短文本不动 / 长文本带「截掉多少字」标记 / 空输入) TC2 `_clip` 可回源(src 指针出现在标记里) TC3 源码守卫:吸收链路交接点不得残留裸切片(防回退) TC4 检测与存储解耦:关键词 Gate 用全文,存储才截断(对齐 _on_apply_done 先例) TC5 controller 雏形接线:Step 0 算力分配 prompt + effort_file 观测量 + cleanup """ import pathlib import sys APP = pathlib.Path("/data/data/com.termux/files/home/wechat-viewer/app.py") FAIL = 0 SRC = APP.read_text(encoding="utf-8") def load_clip(): """从 app.py 源码抽出 _clip 单独 exec(避免 import app 的重量级依赖)。""" start = SRC.find("def _clip(") end = SRC.find("def _run_absorb(", start) ns = {} exec(SRC[start:end], ns) # noqa: S102 return ns["_clip"] def check(label, ok): global FAIL print(f" {'✅' if ok else '❌'} {label}") if not ok: FAIL += 1 _clip = load_clip() print("=== TC1 _clip 行为 ===") check("短文本原样返回", _clip("abc", 10) == "abc") check("等长原样返回", _clip("a" * 10, 10) == "a" * 10) check("空输入 → 空串", _clip("", 5) == "" and _clip(None, 5) == "") c = _clip("x" * 100, 20) check(f"长文本标记截掉字数 → {c!r}", c.startswith("x" * 20) and "CLIPPED 80 chars" in c) print("\n=== TC2 可回源(src 指针)===") c2 = _clip("y" * 60, 10, "learn_queue.error_msg") check("src 进入标记", "; full: learn_queue.error_msg" in c2) check("无 src 时不伪造回源", "full:" not in _clip("z" * 60, 10)) print("\n=== TC3 源码守卫:交接点不得残留裸切片 ===") for label, bad in [ ("吸收重试 prompt 不再裸切 prev_err", "prev_err[:600]" in SRC), ("Step5 指纹失败分支不再裸切 prev_msgs", "prev_msgs[:200]" in SRC), ("result_summary/reflection 不再裸切", "result_text[:300]" in SRC or "result_text[:500]" in SRC), ("outline 不再裸切 read_text()[:500]", "read_text()[:500]" in SRC), ]: check(f"{label}(禁止出现裸切片)", not bad) check("_clip 在吸收链路被调用 ≥8 处", SRC.count("_clip(") >= 8) check("_clip 定义了「禁止裸切片」的边界纪律注释", "压缩这件事自身必须可见" in SRC) print("\n=== TC4 检测与存储解耦(对齐 _on_apply_done 先例)===") check("读取全文 result_text_full", "result_text_full = Path(result_file).read_text()" in SRC) check("关键词 Gate 用全文(行为变化)", '"## 行为变化" not in result_text_full' in SRC) check("关键词 Gate 用全文(吸收产出)", '"## 吸收产出" in result_text_full' in SRC) check("长度 Gate 用全文", "len(result_text_full.strip()) < 50" in SRC) check("入库仍走 _clip(存储侧截断但可见)", "result_summary=_clip(result_text_full, 500)" in SRC) print("\n=== TC5 controller 雏形接线(Thinking Before Thinking)===") check("prompt 含 Step 0 算力分配四阶段", all(k in SRC for k in ( "## Step 0: 算力分配", "Assess:", "Propose:", "Evaluate:", "Dispatch:"))) check("判据句进 prompt", "问题不是「花不花算力」而是会不会花" in SRC or "判据不是「花不花算力」而是「会不会花」" in SRC) check("effort_file 观测量进 trace", "effort_alloc=" in SRC) check("effort_file 有 cleanup(防脏文件堆积)", "Path(effort_file).unlink()" in SRC) print(f"\n{'✅ ALL PASS' if FAIL == 0 else f'❌ {FAIL} FAILED'}") sys.exit(0 if FAIL == 0 else 1)