对 anet 全系统做了一轮 4 维并行 review(架构可靠性 / 安全 / Runtime 支持 / 测试·CI·文档)。下面按优先级合并后的 findings。
注意:feishu/IM 实现代码在 feat/feishu-docker-compose / feat/179-feishu-agent-sdk-channel 分支(生产部署用的那套),不在当前 main;相关行号以那分支为准。
🔴 P0
1. Feishu worker 死了不重启(生产已复现)
agent-node/src/cli.ts:2750 connectFeishu 的 child.on("exit") 只 warn(),不重 fork。worker 只在启动时 fork 一次(cli.ts:3053),SIGTERM/crash 后桥接静默挂掉永不恢复。
- 配套:
shutdown()(cli.ts:3049)不 kill 子进程 → 重启后两个 WS 连接 → 重复推送/双回复。
docker/feishu/docker-compose.yml 无 healthcheck + agent-node 是 PID1 → worker 死了容器仍显示 Up(绿),编排层误报健康,故障因此"静默"。
- 修:exit handler 改成带退避(1→30s)+shutdown-aware 的 supervised 重 fork(抄同文件
connectSSE 的重连循环);shutdown 时 kill 子进程;compose 加 healthcheck 断言 bridge liveness。
2. Hub 默认管理员凭证(公网暴露时 P0)
anet hub start 自动 bootstrap 众所周知的默认 admin 凭证(bin/cli.ts:3066),弱密码路径允许 ≥4 字符(server/src/auth.ts:43)。默认 HOST=127.0.0.1 缓解,但项目明确把 hub 反代到公网(<hub-domain>)。一旦可达,一次 login 即拿 admin token → 全控(读所有 network / 重置任意密码 / 列用户);登录锁不管用——已知默认只需一次。
- 修:随机生成 bootstrap 密码 + 首次登录强制改密;或存在默认密码 admin 时拒绝绑定非 loopback。
🟠 P1
- claude-agent-sdk 不识别 429/配额(
cli.ts:1252-1331):isAuthError 只配 401/403,不含 429/rate_limit/quota。上游限流时 SDK 静默退避,唯一兜底是 300s×retry 墙钟 → agent 静默最多 ~15min 才回通用超时;更糟:空 result + subtype=success 被当 "任务完成" 假成功(cli.ts:1292)。正是 M3 配额那次现象。修:加 429/quota 分类 + 空 result 当软失败。
- codex-sdk(新节点默认 runtime)无 turn 超时(
cli.ts:1375-1483):runStreamed for-await 无墙钟守卫,上游 hang → turn 永挂、agent 永久沉默;stdio 路径同样。修:套 claude 那套 AbortController/timeout。
- Telegram channel fail-open(
cli.ts:2238):空 allowFrom = 放行所有人,消息原文直进 think(),节点默认带 dangerouslySkipPermissions+Bash → 等效 RCE/注入。配置 churn 清空 allowFrom 会静默把锁死 channel 翻成全开。修:空 allowFrom fail-closed(除非显式 ["*"])+ 无 allowlist 大声告警。
- 密码哈希无 salt(
server/src/db.ts:686):sha256("anet:"+pw) 静态前缀无 salt 无 KDF;DB 泄露则离线爆破 trivial。修:迁 bcrypt/scrypt/argon2(Bun.password)。
- 无发布 CI gate:只有
e2e-docker.yml+qa.yml,无 release workflow → Docker tarball smoke / PINNED 版本审计 / 向导 real-TTY 测全靠手工——正是历次 release-gate 漏的那类。修:加 release.yml gate。
- IM bridge 主线零测试:
channel/commhub-channel.ts(494 行 SSE 桥)无测试;feishu bridge 唯一测试在未合并的 feat/179。修:加契约测试 + feishu 测试随 179 合入。
- 飞书文档:能用的指南被困在未合并分支:正确完整的
feishu-quickstart.md(权限/事件订阅 WebSocket 模式/订阅 im.message.receive_v1/发布版本)只在 origin/docs/179-...;而线上 channels.md 还写飞书"暂未排期/未构建"。这是用户卡几小时的根因之一——能救命的文档存在但看不到。修:179 合并时移进 docs-site/guide/feishu.md(ZH+EN)+侧边栏,删 channels.md 的"未构建"。
- WSClient 无应用层 liveness(
im/feishu/adapter.ts:131):start() 一次性置 connected=true,lark 内部重连耗尽后仍 true、dead socket 看着健康;stop() 关不掉 socket(只能杀进程)。修:watchdog 消费 health(),stale 就退出 worker 让 P0 supervisor 重 fork。
🟡 P2(精简)
config.json token 无 0o600 写(bin/cli.ts:268,494)。
/api/license/activate 无鉴权 + DELETE+insert(index.ts:577)。
- CI 只跑 3 个 server 测试(
scripts/qa.sh),其余 server + 全部 agent-node 测试不进 CI。
e2e-docker.yml 的 PR paths 漏 channel/** + .github/workflows/**。
- claude runtime 无 per-vendor vision 能力门(deepseek 无 vision 时静默喂图)。
- 无 mid-turn 心跳,hang 和长任务在 Dashboard 无法区分。
- 飞书 TTL 后晚到回复静默丢失(
bridge.ts:189)。
下一步
团队整理派工:P0 两条最先(worker supervisor + 默认凭证),P1 按 runtime→安全→CI→docs。round 2 可深挖 dashboard / commhub-server 内部 + grok runtime。
对 anet 全系统做了一轮 4 维并行 review(架构可靠性 / 安全 / Runtime 支持 / 测试·CI·文档)。下面按优先级合并后的 findings。
🔴 P0
1. Feishu worker 死了不重启(生产已复现)
agent-node/src/cli.ts:2750connectFeishu的child.on("exit")只warn(),不重 fork。worker 只在启动时 fork 一次(cli.ts:3053),SIGTERM/crash 后桥接静默挂掉永不恢复。shutdown()(cli.ts:3049)不 kill 子进程 → 重启后两个 WS 连接 → 重复推送/双回复。docker/feishu/docker-compose.yml无 healthcheck + agent-node 是 PID1 → worker 死了容器仍显示 Up(绿),编排层误报健康,故障因此"静默"。connectSSE的重连循环);shutdown 时 kill 子进程;compose 加 healthcheck 断言 bridge liveness。2. Hub 默认管理员凭证(公网暴露时 P0)
anet hub start自动 bootstrap 众所周知的默认 admin 凭证(bin/cli.ts:3066),弱密码路径允许 ≥4 字符(server/src/auth.ts:43)。默认HOST=127.0.0.1缓解,但项目明确把 hub 反代到公网(<hub-domain>)。一旦可达,一次 login 即拿 admin token → 全控(读所有 network / 重置任意密码 / 列用户);登录锁不管用——已知默认只需一次。🟠 P1
cli.ts:1252-1331):isAuthError只配 401/403,不含 429/rate_limit/quota。上游限流时 SDK 静默退避,唯一兜底是 300s×retry 墙钟 → agent 静默最多 ~15min 才回通用超时;更糟:空 result +subtype=success被当 "任务完成" 假成功(cli.ts:1292)。正是 M3 配额那次现象。修:加 429/quota 分类 + 空 result 当软失败。cli.ts:1375-1483):runStreamedfor-await 无墙钟守卫,上游 hang → turn 永挂、agent 永久沉默;stdio 路径同样。修:套 claude 那套 AbortController/timeout。cli.ts:2238):空allowFrom= 放行所有人,消息原文直进think(),节点默认带 dangerouslySkipPermissions+Bash → 等效 RCE/注入。配置 churn 清空 allowFrom 会静默把锁死 channel 翻成全开。修:空 allowFrom fail-closed(除非显式["*"])+ 无 allowlist 大声告警。server/src/db.ts:686):sha256("anet:"+pw)静态前缀无 salt 无 KDF;DB 泄露则离线爆破 trivial。修:迁 bcrypt/scrypt/argon2(Bun.password)。e2e-docker.yml+qa.yml,无 release workflow → Docker tarball smoke / PINNED 版本审计 / 向导 real-TTY 测全靠手工——正是历次 release-gate 漏的那类。修:加release.ymlgate。channel/commhub-channel.ts(494 行 SSE 桥)无测试;feishu bridge 唯一测试在未合并的 feat/179。修:加契约测试 + feishu 测试随 179 合入。feishu-quickstart.md(权限/事件订阅 WebSocket 模式/订阅im.message.receive_v1/发布版本)只在origin/docs/179-...;而线上channels.md还写飞书"暂未排期/未构建"。这是用户卡几小时的根因之一——能救命的文档存在但看不到。修:179 合并时移进docs-site/guide/feishu.md(ZH+EN)+侧边栏,删 channels.md 的"未构建"。im/feishu/adapter.ts:131):start()一次性置 connected=true,lark 内部重连耗尽后仍 true、dead socket 看着健康;stop()关不掉 socket(只能杀进程)。修:watchdog 消费health(),stale 就退出 worker 让 P0 supervisor 重 fork。🟡 P2(精简)
config.jsontoken 无0o600写(bin/cli.ts:268,494)。/api/license/activate无鉴权 + DELETE+insert(index.ts:577)。scripts/qa.sh),其余 server + 全部 agent-node 测试不进 CI。e2e-docker.yml的 PR paths 漏channel/**+.github/workflows/**。bridge.ts:189)。下一步
团队整理派工:P0 两条最先(worker supervisor + 默认凭证),P1 按 runtime→安全→CI→docs。round 2 可深挖 dashboard / commhub-server 内部 + grok runtime。