Say what the store actually does, and put a receipt under each claim
The README described a project that no longer exists: a Windows-only Qwen runtime with nine read-only tools, a console as the only way to operate the store, and a 100M-token capsule as if it were measured. It is now a description of what is here, with the report and the command that re-measures each number, and a section that names what has not been run instead of leaving the reader to discover it. TRAINING_ARTIFACTS.md keeps its artifact tables and loses the scores that were never run: MMMU-Pro and OCRBench each read one sample, and the HashHop gate collected proofs until it hit its target. What stays is annotated with what it actually measures — citation accuracy there means the cited id existed in the context that was handed over, not that the passage supports the answer. Gaps.md gains a re-audit section: ten of the twelve gaps closed, two partial, each row naming the command or report behind it, and the remaining work stated plainly — the 0.90 recall bar is unmet and the deficit is entirely in the visual and audio legs. AGENTS.md stops being ignored. It records the constraints this repository paid for: the measurement rules, the environment traps, and the review protocol, so the next agent does not pay them again. The CLI could filter by holder but could not look through a holder's eyes, so search gains --as-holder: three states of eyes on every face, not two.
This commit is contained in:
8 files changed
+349
-125
No files matched your search
+17
-6
@@ -437,12 +437,23 @@
|
||||
- 验收:`pytest backend/tests/test_holder_acl.py backend/tests/test_visibility_rule.py backend/tests/test_transactive.py` → **13 + 2 + 19** 全绿(两 holder 互不可见、无 token 读不到私钥、`everyone` 无 token 可搜、`visible_to` 只放行被指名的人、声称别人 403 且点名两人、token 只出现一次且库里只有 sha256、吊销后旧 token 401、卡无 token 可读且不含正文、陌生人的图片 404 而无主的 200、`compile(as_holder="")` 返回 0 hits 且 `cache_trace_id` 与 `as_holder="wife"` / `None` 都不同)。跨进程:`bash scripts/mcp_write_smoke.sh` → 两行 PASS,第二行是「a caller with no token sees only public memory, a holder's token sees her own, naming somebody else is refused, and the capability card answers without a token」——它先证明无 token 搜不到私钥,再用 operator token 铸出妻子的 token、证明她能搜到自己的、搜不到 `local` 写的 `the oven needs descaling`,最后**把 MCP 进程不带 `ELY_EYE_AUTH_TOKEN` 重启一遍**,证明 Go 那条路守同一条规则(不是假设)。
|
||||
- 顺手修的两条自己写的断言缺陷(都是跑出来的):smoke 里 `if secret in found(None, token=token)` 是同义反复(搜的还是那句话,当然命中),改成拿**别人写的**记忆当探针;指纹探测 `GET /api/memory/working?holder=fingerprint` 现在返回 **403**(路由在、但匿名不能声称 holder),所以探测必须带 operator token——旧树上没有这条路由仍是 404,判别力保住。
|
||||
- 门禁:`pytest -q` **401 passed**;`ruff check` 对 22 个改动文件干净;`bench/filesize_check` 干净;`bench.audit --product` → `audited 32 harness files, 2 reports, 6 set files` / `clean`;mypy 冷缓存 **24 errors in 9 files (checked 112 source files)**,与 `9cb46c1` 基线(24/9)**净新增 0**;`./node_modules/.bin/pyright` 对 17 个后端源文件 + 5 个测试文件 → **0 errors**;`go build` / `go vet` / `go test`(apiclient ok、mcpserver ok)+ `gofmt -l` 空;`npm run build` → `dist/assets/index-CSDHCFNo.js 221.48 kB`(bundle 哈希与 `246dae9` 相同,与「本轮没动前端」一致)+ eslint exit 0;`bash scripts/mcp_write_smoke.sh` 3.3s 两行 PASS。
|
||||
- [ ] **p2-5** 文档单一真相
|
||||
- [ ] p2-5.1 `AGENTS.md` 重写并停止 gitignore
|
||||
- [ ] p2-5.2 `README.md` 每条宣称指向可重跑命令
|
||||
- [ ] p2-5.3 `TRAINING_ARTIFACTS.md` 未跑分数删除
|
||||
- [ ] p2-5.4 `Gaps.md` 更新为已闭合状态
|
||||
- 验收:`grep` 无未跑模型分数残留;每条数字可重跑
|
||||
- [x] **p2-5** 文档单一真相
|
||||
- [x] p2-5.1 `AGENTS.md` 重写并停止 gitignore
|
||||
- `.gitignore` 删了 `AGENTS.md` 那一行(`CLAUDE.md` 仍忽略,它不是本仓库的真相源),`git check-ignore AGENTS.md` 现在 exit 1。新文件 5.5KB,写的不是风格偏好而是**这个仓库付过学费的约束**:门禁命令清单(含 mypy 基线是 24 errors in 9 files、必须在分支点的 worktree 里量而不是猜);一个 writer 一条规则(Go 不写 SQLite);fail fast 必须点名(引真实报错 `nothing to forget: no atom or source was given`);≤500 行、无死代码、注释单行、docstring 是契约;「缺席是一种状态」——`v_atoms_current` 隐藏而不删除。
|
||||
- 测量规则单独一节,都是本轮踩过的坑:**跟机器负载走的数字只能写区间或指向报告**;报告的 commit 戳必须指向含该 harness 的那个 commit(所以 harness 改动与报告是两个 commit);每个 recall 必须与 chance 行和外部对手段并排;**n=1 不是基准**(旧套件就是靠 `next(iter(stream))` 「跑」了 MMMU-Pro 与 OCRBench);按文件序抽样会静默丢掉整个模态(`bench/query_set.py:scale_probes` 已按模态分层并有测试钉住);harness 只动副本(`bench/scratch.py:copy_store`),绝不原地迁移冻结库;两个正确引擎不一致时先怀疑度量(字节相同的 atom 造成并列,id 级 recall 会读出 0.83 的假差距)。
|
||||
- 环境陷阱一节:pi-lens 跑 pyright 时是 **0 config files**,所以它对 `pydantic/fastapi/torch/sqlite_vec` 的 `Import could not be resolved` 是环境伪影,算数的是读 `pyrightconfig.json` 的 `./node_modules/.bin/pyright`;pi-lens 会在你改过的文件上自动跑 `ruff format` 风格格式化,而本仓库不是 ruff-format clean、门禁是 `ruff check`,所以提交前要 `git checkout --` 回退;`ruff check --fix` 只跑显式路径;`import fitz` 把警告打到 **stdout** 会弄坏每一条 CLI JSON,必须 `import pymupdf as fitz`;semgrep 拒绝 `connection.execute(变量)`,所以规则副本必须存在、并由测试比对(`test_visibility_rule.py`)。
|
||||
- [x] p2-5.2 `README.md` 每条宣称指向可重跑命令
|
||||
- 十类旧宣称全部替换(不是加脚注):(1)「built on Qwen3.5-9B … fifteen-check proof suite exercises the whole thing against the live model」→ 生成侧列入「**没在本仓库跑过**」清单,每项一条可重跑命令;(2)「retrieves with sparse and Qwen embedding search」→ dense 默认**关**,并给出 LEGS 实测:24 页上 0.863→0.860 而 p50 122→713ms,宽页两边都 0.873 而 p50 84→579ms,它买的是记忆类问题(multi-session 0.857→0.920、preference 0.800→0.960)、赔的是图像类(0.720→0.680);(3)「checks every answer with a verifier」→ 引用准确性是 id 存在不是蕴含(写在 `TRAINING_ARTIFACTS.md` 那条证据旁边);(4)「100M-token memory capsule」→ 实测 165,973 atoms / 153,857 vectors,1M 是外推不是测量;(5) HashHop / Contradiction Lens / 标准基准 → 全部进「未测」清单;(6)「nine read-only tools … never writes」→ 23 个工具,写走 API;(7)「the console … is the only place」→ CLI 做得到同样的事;(8)「Requirements: Windows」→ Linux/macOS `.sh` 双胞胎 + Docker + Linux CI;(9) `.ely_eye/` 布局与卡带内容 → 今天的真实形状(vec0 在库内、卡带是可挂载作用域);(10) 记忆模型 / bench / ACL / 能力卡 / 验收线状态在旧 README **完全没提**,现在都在。
|
||||
- 验收线写成明字的**未达**:0.863 对 0.90,并列出缺口在哪(video 0.455 / image 0.720 / ui_screenshot 0.818,而 code 0.945 / pdf 0.885 / conversation 1.000)以及为什么(冻结库一个 audio atom 都没有;CLIP 不能在整屏里定位图标)。
|
||||
- [x] p2-5.3 `TRAINING_ARTIFACTS.md` 未跑分数删除
|
||||
- 删了:`MMMU-Pro=1.00` 与 `OCRBench=1.00`(每个基准只读了 **一个** 样本,`next(iter(stream))`)和「Visual HashHop gate passed 7/7 … 1-hop=1.00 2-hop=1.00」的 gate 口径(那个检查是**重试到达标为止**,现在重试已删)。改而写明:文件是 2026-05-28 在 Windows+4090 上从已不存在的 `PRD.md` 生成的,adapter 与所有 `.ely_eye/` 路径**不被 git 跟踪**,所以 clone 不能重现。
|
||||
- 保留但说清它到底测了什么:`citation accuracy 1.00` = 引用的 id 在送进去的上下文里存在,不是蕴含(且那道题把答案写在题面里);100M capsule = 检查自己生成的 capsule 自哈希自洽,不是 100M 真实内容;repository input proof 是当天快照(仓库现在更大,且任何 git 仓库都能满足它);runtime profile「verified」限定在那台机器的固定 WSL 发行版(现在读 `ELY_EYE_WSL_DISTRO`,且有 `.sh` 双胞胎与 Linux CI);15 行 `Checks:` 块标成「当天写下的行,不是今天的结论」并指向 Gaps.md 附录 A 的逐条判定;卡带资产清单换成 `cartridge.py` 今天真正写的五个文件,并点名 `kv_snapshots.kivi` / `ttt_vl_adapter.safetensors` 是从未接上 loader 的占位。
|
||||
- [x] p2-5.4 `Gaps.md` 更新为已闭合状态
|
||||
- 新增 §0.5(不改写 §0–§4 的历史判断,只加今天复核):12 项差距逐项一行——**10 项闭合、2 项部分闭合**,每行带跑过的命令或报告;四个根因逐一说现在为什么不成立;末尾「还剩什么」只列三件事:验收线 0.90 未达(缺口全在视觉/音频腿)、卡带的算力节省(前缀/KV 复用)没做、生成侧在本仓库一次没跑过。
|
||||
- 诚实处理两处派生数字:`+0.454` 不在 `BASELINE_EXTERNAL.md` 里,是它两行(0.866 / 0.412)相减得来,Gaps 里写明「该报告只给两行与‘这段差值是 holder 边界的价值’这句话,差值是这里减出来的」;ASR 速度改成当前报告的数(258.18s 音频 / 3.12s,每视频 68.4–111.2×),不再引旧报告的 63.9–112.2。
|
||||
- 偏差(顺手补的真缺口):CLI `search` 只有 `--holder`(过滤器),**没有**办法用某个 holder 的眼睛看库——即无法回答「我的 agent 会看到什么」。加了 `--as-holder`(`SearchFilters.as_holder`)与两条断言(`--as-holder stranger` → `no_match`,`--as-holder wife` → 命中),否则三态眼睛只在 HTTP/MCP 两面成立而 CLI 面缺一个口。
|
||||
- 验收:`grep -rn "MMMU-Pro=\|OCRBench=\|1-hop=\|2-hop=" *.md */README.md` → **0 命中**;README 里每个数字都能在报告里找到(0.863→LEGS、0.866/0.412→BASELINE_EXTERNAL、0.0717/0.2177→SCALE、165973/153857/106 per second→DENSE、0.242/533/68.4–111.2→ASR、模态行→LEGS、148.9GB→Gaps 附录 B)。唯一留下的模型分数是 `TRAINING_ARTIFACTS.md:84` 的 `citation accuracy 1.00`:它在证据块里(那是当天产出的工件原文),且紧跟的段落写明了它测的是什么、不测什么。
|
||||
- 门禁:`pytest -q` **401 passed**;`ruff check backend/src/ely_eye backend/tests bench` 干净;`bench.filesize_check` 干净;`bench.audit --product` → `audited 32 harness files, 2 reports, 6 set files` / `clean`;mypy 冷缓存 **24 errors in 9 files (checked 112 source files)** = `9cb46c1` 基线,净新增 0;`./node_modules/.bin/pyright backend/src/ely_eye/cli.py backend/tests/test_search_api.py` → **0 errors**;本轮未动 Go/前端/报告,所以 go/npm 套件沿用 `83dfc14` 的绿。
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in new issue
Block a user