v19.4.2
aiduMEI v19.4.2 · Athena 雅典娜 —— 守卫扩面 · 集成件凭据贯通
v19.4.1 的收口版,不引入新功能。
本版主题:把守卫自己的射程焊死
v19.4.1 上线后的生产复审发现,门禁本身修对了,但**「谁需要带钥匙」这份名单列漏了**。v19.4.1 写过一条守卫测试来防调用方漏带凭据,可那条守卫只扫 scripts/ 一个目录,而缺陷分布在仓库根、integrations/、mcp_server.py 上,一个都没扫到。
守卫的射程小于缺陷的分布,比没有守卫更危险 —— 它提供了「已经防住了」的错觉。
所以本版的核心动作不是「再修几个文件」,而是用一条元测试断言:守卫的覆盖集合 ⊇ 全仓实际发起 HTTP 请求的文件集合,改窄射程立刻红灯。这条元测试第一次跑就当场揪出两个漏数的入口点,扩面后又揪出一个 —— 计划里点名 5 个,实际 9 个。
主要变更
- 🔴 凭据贯通:8 个入口(Hermes 注入 hook、
mem0_sync/seed_demo/seed_facts、mcp_server、Cursor 保存钩子、Claude Code 钩子、Hermes 插件)统一收敛到唯一真相源ducky.utils.api_auth_headers()与同一条.env兜底链。其中 Hermes 插件是典型的**「看着修了」**:代码里明明带着Authorization头,但 token 只从环境变量读,而 gateway 拉起插件时环境近乎为空 —— 每次请求实际都是空 token。 - 🛡️ 守卫扩面:扫描范围扩到
scripts/+ 仓库根*.py+integrations/**;新增元测试tests/test_v19_4_2_auth_coverage.py。 - 🟠 静默失败可观测:sync 单元补
StartLimit*(崩溃循环不再永远卡在activating)、logrotate 改copytruncate(StandardOutput=append:下改名切割会让日志凭空消失)、补齐同步守护的依赖声明。 - 🔵 审计整改轮:
frontend/dev_server.py的双重逃逸(按目录 + 按信号)、README 数字守卫按 12 处逐一校验。最严重的一条:上面那两个StartLimit*键被写进了[Service]段,而 systemd 只在[Unit]段解析它们 —— 文件里白纸黑字、grep查得到、review 看得过,行为却与完全没修一模一样。配置写了不等于配置生效,唯一的验收方式是问 systemd 自己算出来的值。两个单元的失败策略现在刻意不同:API3600/30、sync300/5。 - 🔵 收尾轮:
HERMES_SRC改三态解析(未设 → 自动发现;none/no/off/0/false/空→ 强制无宿主;显式路径无效 → 直接报错并点名坏路径)。此前环境变量与硬编码路径挤在同一个候选列表顺序匹配,HERMES_SRC=/typo会静默落到自动发现的路径上 —— 用户指了 A、实际测的是 B,还是绿的。隐式回退会悄悄推翻显式意图;而 README 宣称的「12 跳过」在装着宿主的机器上(生产机就是)根本复现不出来 —— 双向可复现才叫可证伪。
测试
| 环境 | 结果 |
|---|---|
| 本机(无宿主) | 391 passed, 12 skipped |
生产(有宿主,未设 HERMES_SRC) |
403 passed |
生产 HERMES_SRC=none |
391 passed, 12 skipped |
生产 HERMES_SRC=/不存在的路径 |
RuntimeError,点名那条坏路径 |
pytest tests/ -q -rs | tail -1 # 无宿主:391 passed, 12 skipped
HERMES_SRC=/path/to/hermes-agent pytest tests/ -q | tail -1 # 有宿主:403 passed
HERMES_SRC=none pytest tests/ -q -rs | tail -1 # 装了宿主也强制关掉,照旧 391 passed, 12 skipped安装
pip install aidumei==19.4.2完整变更见 CHANGELOG.md。