Measure the last key-test scenario instead of writing it off
ci / backend (push) Failing after 3m19s
ci / mcp (push) Successful in 1m1s
ci / interface (push) Successful in 20s
ci / image (push) Failing after 5m54s

Scenario 7 claimed nothing was observable. It is: compiling the same
question twice hands back the same pack and the second compile is served
from the semantic cache (cache_events layer=semantic hit=1 miss=1), so the
row is now PARTLY MEASURED with those numbers and only the time-to-first-token
half stays unmeasured. Scenario 4 gains the settling step: an unresolved
disagreement shows the newer side, and after resolve-conflicts one page shows
both readings (measured 2 hits) — settlement is a retrieval behavior, not a
deletion, which is also why my first draft of that scenario was wrong.

Gaps.md §6 now carries a verdict table with what each scenario actually
measured, and §0.5 quotes whole-suite recall (0.850 words-only over 2,928
answerable queries) instead of the 300-probe sample's 0.863, naming why the
sample reads high.

Gates: 422 passed, ruff clean, filesize OK, bash -n clean, key test 6 PASS +
1 PARTLY MEASURED with exit 0.
This commit is contained in:
ZacharyZhang-NY committed 2026-10-10 03:35:39 -04:00
1 parent f8a9428f5a
commit 3b87b77b7f
3 files changed
+76 -11

No files matched your search

+4 -4
View File
@@ -478,12 +478,12 @@
- [x] p2-6.2 给截图一个局部的图片腿:**假设被实测推翻,默认路径不动**。池实验(`/tmp/region_clip.py`,日志 `bench/runs/region_clip.log`):275 张 gold 截图、320 条查询、chance@10 = 0.036,三臂只比排名——屏上文字(空白分词的 BM25,比现行 CJK 词腿弱)0.584(text 135/169 = 0.799、icon 52/151 = 0.344);整屏 CLIP 0.269(text 0.272、icon 0.265);OCR 框裁块 CLIP(每屏取 ~36 块的最高分)0.475(text 0.663、icon 40/151 = 0.265)。读法:裁块**确实**好过整屏(0.475 vs 0.269,VISUAL.md 那条「picture 腿把 ui_screenshot 从 0.583 拉到 0.528」的整屏结论没有被推翻),但两条图片腿都打不过屏上的文字,而在真正需要图片的 icon 半边,裁块与整屏同为 0.265、文字反而最高(0.344)——**裁块没有补上 icon 的缺口**,所以不加 `bench/visual_recall.py` 的新臂、不进默认路径,按 p2-6.2 自己写的「不涨就删掉该臂并把不涨写进去」处理。口径交代:该实验在 275 张池内排名,不是 5 万源的现行排序;文字臂是空白分词,故它是被低估的基线,图片臂输给的是一个更弱的对手。
- [ ] p2-6.3 若仍不达 0.90:把「不达」与原因写进 README/Gaps(已有的 VLM 区域描述、widget tree 两条外部能力,本轮按 m00217 未下 8B VLM),不用改验收线口径硬凑。
- [ ] **final-accept** Gaps.md §6「钥匙测试」7 条场景逐条跑通
- 命令:`bash scripts/key_test.sh`(自建临时 home、假模型快照、起 API、Go MCP 走 stdio、CLI 挂卡带;一张表,任何 FAIL 退出码非 0)。实测:**6 PASS + 1 NOT MEASURED**,exit 0。
- 命令:`bash scripts/key_test.sh`(自建临时 home、假模型快照、起 API、Go MCP 走 stdio、CLI 挂卡带;一张表,任何 FAIL 退出码非 0)。实测:**6 PASS + 1 PARTLY MEASURED**,exit 0(第 7 项只测命中率,省算力未测)。
- 1 随手记 PASS:`POST /api/memory` 一次往返 → `POST /api/search` 答出来,holder=wife origin=self scenario=home event_time=2026-09-30 citable=True。
- 2 找老婆 PASS:MCP `who_knows(护照)` → holder=wife、confidence 0.683、basis 三条;`ask(护照在哪)`(无 token)→ `status=referred`、`answered_by=wife`、`atom_ids` 为空——**过去的是指针不是正文**;`ask(土星的光环…)` → `no_holder_knows`,不是硬编一个答案。
- 3 知识更新 PASS:supersede 之后 `现在` → 「钥匙现在在车里」,`as_of 2026-10-06` → 「钥匙放在玄关抽屉里」,旧记忆从现行列表里消失(它那个 source 0 行)但没被删。这条是终验逼出来的新能力,见 p2-3 那条 as_of。
- 4 分歧共存 PASS:两条日期不同的冲突记忆都在库里,一页只给新的一条(`retrieval.py:_settle_conflicts` 摘掉未裁决的旧侧),`GET /api/memory/conflicts?holder=wife` 记下双值(1 条 open),`as_of 36 小时前` 拿回 22 度那条。
- 4 分歧共存 PASS:两条日期不同的冲突记忆都在库里,一页只给新的一条(`retrieval.py:196` `lifecycle_store.losing_sides` 摘掉未裁决的旧侧——**裁决是检索行为,不是删除**),`GET /api/memory/conflicts?holder=wife` 记下双值(1 条 open),`as_of 36 小时前` 拿回 22 度那条;`resolve-conflicts` 裁定之后一页同时给两条(实测 2 hits)。口径纠正:本轮自己写的场景预期「两条都在结果里」与既定设计相反(未裁决时只给新边),是测试错不是产品错,改的是测试。
- 5 抗污染 PASS:`origin=third_party` 的无佐证说法可被主人搜到但 `quarantined=True`(编译器把它挡在 prompt 外,`CompiledContext.quarantined_excluded`,由 `test_trust_quarantine.py` 钉住),换个 holder 问则完全答不出。
- 6 卡带即作用域 PASS:`ingest --cartridge-name 甲/乙` + `finalize-cartridge` + `mount/switch/unmount`,挂载后搜索只从卡带出(月岩灰 1/花岗岩 0 → 切换后 0/1 → 卸载后 1),把模型快照的 rope factor 改成 2.0 之后 `mount 甲` 拒绝并点名 `rope: factor: cartridge 4.0 vs local 2.0`(还带 model_hash)。
- 7 卡带省算力 **NOT MEASURED**:这条断言是 TTFT 与命中率,本仓从没跑过 9B 生成器(树里没有模型快照),而且没有 `/api/compile*`、`/api/cache*` 路由(`/api/chat` 无运行时 503),所以连「命中率可观测」这半边也没有面可达。今天存在的是作用域(mount/switch/unmount/append)和 `profiles.py` 里那些尚未接地的启动旗标。
- 未标绿的原因(两条都量着):场景 7 未测;验收线 recall@10 ≥ 0.90 仍未达(shipped 0.863 / 300 探针,外部对手 holder 作用域 0.866,chance 0.0002;缺口全在视觉与音频腿:video 0.455、image 0.720、ui_screenshot 0.818,冻结库里 0 个 audio atom)。报告并排:`bench/reports/BASELINE.md`(本项目基线)、`BASELINE_EXTERNAL.md`(Mem0/Zep 式对手 + chance 行)、`LEGS.md`(当前各腿)、`QUANT.md`/`DENSE.md`/`SCALE.md`(向量与规模)、`VISUAL.md`(图片腿)、`ASR.md`(语音)。
- 7 卡带省算力 **PARTLY MEASURED**:可观测那半边已实测——同一题编译两次返回同一份正文(`cache_trace_id` 相同,1 个 atom),第二次落在语义缓存(`cache_events` layer=semantic:hit=1 miss=1)。省的那笔是首字时间(TTFT),本仓从没跑过 9B 生成器(树里没有模型快照),`/api/chat` 无运行时 503,所以 TTFT 那半边仍未测。今天存在的是作用域(mount/switch/unmount/append)和 `profiles.py` 里那些尚未接地的启动旗标。
- 未标绿的原因(两条都量着):场景 7 的省算力半边未测;验收线 recall@10 ≥ 0.90 仍未达(**全库可答题 2,928 题实测 0.850**(words-only,top_k 24,各自 holder),dense 页 24 → 0.859、页 30 → 0.862;300 分层探针读 0.863,比全库高是因为抽样把 ui_screenshot 抽重了:样本 0.818 vs 全量 0.659;外部对手 holder 作用域 0.866,chance 0.0002;缺口全在视觉与音频腿:video 0.493、image 0.783、ui_screenshot 0.659,冻结库里 0 个 audio atom)。报告并排:`bench/reports/BASELINE.md`(本项目基线)、`BASELINE_EXTERNAL.md`(Mem0/Zep 式对手 + chance 行)、`LEGS.md`(当前各腿)、`QUANT.md`/`DENSE.md`/`SCALE.md`(向量与规模)、`VISUAL.md`(图片腿)、`ASR.md`(语音)。