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不算命中)
升级注意¶
- 重建 hermes 镜像(
entrypoint-wrapper.sh是COPY进镜像的,不是挂载): ⚠️ 容器重建会丢 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 发布时即按此保住) - compose env 变更需要重建容器(
docker compose restart不重新读 env):HERMES_KANBAN_DISPATCH_IN_GATEWAY三处、MEMORY_TENCENTDB_GATEWAY_*五处。./scripts/start.sh会处理 - 行为变更:道元从本版起写 TDAI 共享记忆,与爱玛士 / 爱码士 / finance / CC飞总 共用同一份 SQLite
- 回滚:
- 道元记忆:删掉 compose 里的
MEMORY_TENCENTDB_GATEWAY_*并重建容器( entrypoint 不会再注入 provider),或镜像回滚到v0.2.4构建产物 - kanban:把三个容器的
HERMES_KANBAN_DISPATCH_IN_GATEWAY改回不设即可, worker 会重新跟随各自容器
验收¶
pytest tests/:1131 passed, 2 skippedmkdocs 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