跳转至

myopenclaw v0.2.5

补丁版本(2026-11-12):把 kanban 的派发归属钉死(工头只放 hermes-coder), 道元接入 TDAI 共享记忆,补回两个新文档的 nav 入口,并清掉公开仓库里残留的 飞书 app_id 字面量。不改 MCP 契约、不改队列/数据库 schema;但 hermes 镜像要重建一次(entrypoint 改了)。

本版变更

kanban 派发归属钉死为 hermes-coder

根因是能力继承方向:worker 是 dispatcher 的 subprocess,只继承 dispatcher 所在容器的挂载与环境变量,不是 assignee 的。若工头跟着总管摆在 hermes, 一个 coder worker 就能读到爱玛士的邮箱凭据与 OneDrive token,破掉 docs/email.md 那套隔离 —— 所以工头放在 hermes-coder,hermes / hermes-finance / hermes-daoyuan 三个容器显式 HERMES_KANBAN_DISPATCH_IN_GATEWAY=0, hermes-coder 刻意不设(默认 true)。

  • 新增 docs/kanban.md:三个概念、三扇窗(飞书 / 网页 / CLI)、角色与机制的 分工、硬约定、排查表、"只有一个工人身份" 的三条扩法
  • 新增 docs/hermes-topology.md:5 容器 × 4 身份、容器 / profile / gateway 三层、 两组正交性、四份 .env 与 override=True 的覆盖关系、能力矩阵
  • 守卫 tests/test_hermes_kanban_wiring.py(10 项):派发宿主唯一、其余三处为 0、派发宿主跑 --profile coder、文档针脚
  • 2026-11-12 业主决定:暂时保持单工人 = coder,不扩。这是决定,不是待修缺陷; 触发条件与三条扩法见 docs/kanban.md

道元接入 TDAI 共享记忆

道元此前只留 Hermes 内置记忆做隔离,理由是它面向公共用户。飞书收紧为 allowlist(b8d0d8b)后这层理由消失,于是把它纳入共享记忆。

  • 根因:entrypoint 的 provider 注入只认 provider: ''(Hermes 默认配置形状), 而道元 profile 是 start.sh 手写的最小配置,memory: 段只有 memory_enabled: true —— 每次启动都走 else 分支静默跳过(日志: "未找到可替换的 provider 字段,跳过")
  • 现在支持「有 memory: 段但无 provider 键」→ 插到段首;操作者显式选择的 其它 provider 保留;注入脚本失败不再冒到 set -e
  • compose 给 hermes-daoyuan 注入 MEMORY_TENCENTDB_GATEWAY_HOST/PORT (缺了会退回 127.0.0.1:8420 连不上,所以是必填而不是可选)
  • start.sh 新建道元 profile 模板直接带 provider,避免重装时再踩同一个坑
  • 守卫 tests/test_hermes_memory_wiring.py(三种配置形状 + 幂等 + compose 针脚)

文档 / 守卫

  • docs/kanban.md、docs/hermes-topology.md 补进 mkdocs.yml 的 nav。此前只加了 docs/index.md 的入口,两个页面是孤儿页 —— --strict 不报错,只是静默 不可达;正是这条让 cd3d5ae 的 Release checks 变红
  • docs/hermes-topology.md 里四个容器的真实飞书 app_id 前 8 位改为 env 变量名。 app_id 单独配不出 token,但它是租户指纹,公开仓库里没有 收益 —— 写明 FEISHU_APP_ID / CODER_FEISHU_APP_ID / FINANCE_FEISHU_APP_ID / DAOYUAN_FEISHU_APP_ID 反而能直接去 .env 定位
  • 新增守卫 tests/test_member_docs.py::TestPublicDocsNoSecrets:扫 docs/**/*.md + CLAUDE.md + README.md + mkdocs.yml,钉死 sk- / ghp_ / github_pat_ / Bearer 字面量 / 真实形态 app_id;带反向自检防止守卫退化成 永远绿(占位符 cli_xxxx 不算命中)

升级注意

  1. 重建 hermes 镜像(entrypoint-wrapper.sh 是 COPY 进镜像的,不是挂载):
    ./scripts/start.sh --build
    
    ⚠️ 容器重建会丢 lark-cli 的 user OAuth token(存容器内 keychain,不在挂载卷上)。 需要保留时:重建前 docker cp <容器>:/root/.local/share/lark-cli /tmp/lark-cli-backup-<容器>, 重建后拷回并 chown root:root、chmod 700(v0.2.4 发布时即按此保住)
  2. compose env 变更需要重建容器(docker compose restart 不重新读 env): HERMES_KANBAN_DISPATCH_IN_GATEWAY 三处、MEMORY_TENCENTDB_GATEWAY_* 五处。 ./scripts/start.sh 会处理
  3. 行为变更:道元从本版起写 TDAI 共享记忆,与爱玛士 / 爱码士 / finance / CC飞总 共用同一份 SQLite
  4. 回滚:
  5. 道元记忆:删掉 compose 里的 MEMORY_TENCENTDB_GATEWAY_* 并重建容器( entrypoint 不会再注入 provider),或镜像回滚到 v0.2.4 构建产物
  6. kanban:把三个容器的 HERMES_KANBAN_DISPATCH_IN_GATEWAY 改回不设即可, worker 会重新跟随各自容器

验收

  • pytest tests/:1131 passed, 2 skipped
  • mkdocs build --strict:通过
  • docker compose config --quiet:通过
  • 真机:hermes-coder 独占 dispatcher(holding singleton dispatcher lock), 其余三个容器日志为 disabled via HERMES_KANBAN_DISPATCH_IN_GATEWAY env
  • 真机:道元群聊 allowlist 生效(名单外 @ 不回应)
  • ⚠️ 未验证:飞书 /kanban create 的完成通知链路 —— kanban_notify_subs 目前 0 行,CLI 建的卡不会自动订阅;第一次从飞书建卡时留意有没有收到通知

已知边界

  • 只有 coder 适合作 assignee:--assignee finance|daoyuan 会静默落在 coder 容器里跑,缺它们各自的 env(dispatch_profiles 在 0.21.2 不存在, dispatcher 锁是共享 flock ⇒ 物理上只有一个 dispatcher)
  • hermes-coder 停机时无自动派发,兜底 hermes kanban dispatch(注意:从哪个 容器跑,worker 就落在哪个容器);不要在 hermes 容器里拉起 gateway-coder 补位,那会与 hermes-coder 抢同一 profile 与同一条飞书连接
  • 道元的共享记忆要重建镜像后才生效;只 restart 容器仍然走旧 entrypoint