Skip to content

v19.4.2

Choose a tag to compare

@monkey2jack monkey2jack released this 19 Aug 16:38
· 57 commits to main since this release

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_factsmcp_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 改 copytruncateStandardOutput=append: 下改名切割会让日志凭空消失)、补齐同步守护的依赖声明。
  • 🔵 审计整改轮frontend/dev_server.py 的双重逃逸(按目录 + 按信号)、README 数字守卫按 12 处逐一校验。最严重的一条:上面那两个 StartLimit* 键被写进了 [Service] 段,而 systemd 只在 [Unit] 段解析它们 —— 文件里白纸黑字、grep 查得到、review 看得过,行为却与完全没修一模一样。配置写了不等于配置生效,唯一的验收方式是问 systemd 自己算出来的值。两个单元的失败策略现在刻意不同:API 3600/30、sync 300/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