deerflow2/.planning/codebase/CONCERNS.md

9.3 KiB
Raw Blame History

Codebase Concerns

Analysis Date: 2026-04-07

简短结论

当前代码库后端能力完整、测试数量较多但在“生产安全基线”和“运行时一致性”上存在高优先级缺口API 鉴权缺失、回滚语义未闭环、流式事件链路缺少可恢复能力。前端主要问题是关键模块体量偏大与测试覆盖不均衡,短期会拖慢迭代速度,中期会放大回归风险。

优先级建议(面向规划)

  • P0立即补齐网关鉴权与访问控制补全 rollback 真回滚语义。
  • P1近期修复消息角色归一化错误完善 SSE 可恢复性与丢事件观测。
  • P2排期拆分超大前端组件、收敛 demo 静态资源体积、减少“声明支持但未实现”的 API 选项。

Tech Debt

运行时回滚语义未实现(高优先级):

  • Issue: 取消 run 时支持 action=rollback,但实际未执行 checkpoint 回滚,仅记录日志并 pass
  • Files: backend/packages/harness/deerflow/runtime/runs/worker.py
  • Impact: 前端/调用方会认为“已回滚”,但线程状态可能仍保留部分中间写入,导致状态一致性问题。
  • Fix approach: 在 rollback 分支接入 checkpointer 的真实回退 APIpre_run_checkpoint_id 恢复),并补充回滚前后状态断言测试(成功、失败、并发取消三类)。

后端代码布局存在“空 src + 实际实现在 packages”认知负债中优先级:

  • Issue: 业务实现集中在 backend/packages/harness/deerflow/,而 backend/src/ 仅有缓存产物目录结构,容易误导新贡献者。
  • Files: backend/packages/harness/deerflow/, backend/src/
  • Impact: 新代码落点不稳定、审查成本上升、重构时容易出现重复实现。
  • Fix approach: 在贡献文档和目录说明中明确“单一真实源码根”;清理或显式标注 backend/src/ 的用途,避免“影子目录”持续存在。

前端关键组件体量过大(中优先级):

  • Issue: 交互核心组件单文件体量偏大,状态/视图/副作用耦合。
  • Files: frontend/src/components/ai-elements/prompt-input.tsx, frontend/src/components/workspace/input-box.tsx, frontend/src/components/workspace/artifacts/artifact-file-detail.tsx
  • Impact: 修改单一功能易触发连带回归,评审与测试成本高。
  • Fix approach: 以“状态管理、上传/附件、动作菜单、发送流程”拆分子模块;每次拆分同步补充组件级测试。

Known Bugs

消息角色被错误归一化为 HumanMessage高优先级:

  • Symptoms: 非 user/human 的消息(如 system/ai/tool在输入归一化中被降级为 HumanMessage
  • Files: backend/app/gateway/services.py
  • Trigger: normalize_input() 处理 messages 列表时遇到非用户角色。
  • Workaround: 调用端仅传用户消息;系统消息改走其他配置通道。

artifact 文本判定后仍可能触发 UTF-8 解码异常(中优先级):

  • Symptoms: 文件被判定为“文本”后直接 read_text(encoding="utf-8"),遇到非 UTF-8 内容可能返回 500。
  • Files: backend/app/gateway/routers/artifacts.py
  • Trigger: is_text_file_by_content() 返回 true但实际编码非 UTF-8。
  • Workaround: 使用 download=true 强制下载,避免 inline 文本解码路径。

API 声明支持 enqueue 但运行时不支持(中优先级):

  • Symptoms: 请求模型允许 multitask_strategy="enqueue",但运行时抛 UnsupportedStrategyError501
  • Files: backend/app/gateway/routers/thread_runs.py, backend/packages/harness/deerflow/runtime/runs/manager.py
  • Trigger: 客户端按 schema 传入 enqueue
  • Workaround: 客户端仅使用 reject|interrupt|rollback

Security Considerations

网关缺少统一鉴权/鉴别层(高优先级):

  • Risk: 线程、上传、技能、memory、run 控制等接口可被未授权调用(取决于外围网络暴露)。
  • Files: backend/app/gateway/app.py, backend/app/gateway/routers/*.py
  • Current mitigation: 注释说明依赖外层 nginx代码内无显式 Depends 鉴权依赖。
  • Recommendations: 在网关层增加统一认证中间件JWT/API Key/Session 任一),并对高风险写操作路由做细粒度授权。

本地 host bash 仅“尽力防护”,非强隔离(中高优先级):

  • Risk: 启用 allow_host_bash 后,命令路径校验强调 best-effort且对 bash 写入限制不等同于读写工具限制。
  • Files: backend/packages/harness/deerflow/sandbox/tools.py
  • Current mitigation: 绝对路径校验、路径遍历检查、file:// 阻断、虚拟路径替换。
  • Recommendations: 将 host bash 默认硬禁用;在生产配置强制容器沙箱;增加审计日志与策略开关(按工具/命令白名单)。

Performance Bottlenecks

流式桥接队列容量有限且存在丢事件(中优先级):

  • Problem: 单 run 队列默认上限 256发布超时会丢事件且仅日志告警。
  • Files: backend/packages/harness/deerflow/runtime/stream_bridge/memory.py
  • Cause: 内存队列 + 固定容量 + 没有持久化重放。
  • Improvement path: 引入可重放后端Redis/持久队列)或增大可配置容量;将 dropped_count 暴露为指标并设置告警阈值。

前端仓库包含较大 demo 资产,影响构建/分发体积(中优先级):

  • Problem: frontend/public/demo/ 包含较多图片/视频与线程快照。
  • Files: frontend/public/demo/threads/**
  • Cause: demo 内容直接入仓并随静态资源参与交付。
  • Improvement path: 将大型 demo 资产迁移到对象存储/CDN 或按环境开关构建;保留最小样例集。

Fragile Areas

Run 生命周期与 SSE 消费链路耦合(中高优先级):

  • Files: backend/app/gateway/services.py, backend/app/gateway/routers/thread_runs.py, backend/packages/harness/deerflow/runtime/runs/manager.py, backend/packages/harness/deerflow/runtime/stream_bridge/memory.py
  • Why fragile: 断线策略、取消语义、状态迁移、队列清理分散在多处,边界行为(断线+取消+重连)容易退化。
  • Safe modification: 先补“状态机契约测试”再改逻辑;对 cancel/rollback/interrupt 统一建表驱动测试。
  • Test coverage: 后端测试较多,但“断线重连 + 事件重放 + 回滚一致性”端到端场景仍有缺口。

前端输入与工件详情模块变更风险高(中优先级):

  • Files: frontend/src/components/workspace/input-box.tsx, frontend/src/components/ai-elements/prompt-input.tsx, frontend/src/components/workspace/artifacts/artifact-file-detail.tsx
  • Why fragile: 单文件承担过多职责,状态路径复杂。
  • Safe modification: 采用“先抽 hooks/子组件,后迁移调用点”的两阶段改造;每步保留行为快照测试。
  • Test coverage: frontend/src/ 下单元测试文件较少(仅少量),复杂交互主要依赖 E2E。

Scaling Limits

Run/Stream 元数据以内存为中心,重启后状态不连续(中高优先级):

  • Current capacity: 单进程内存字典 + 队列run 记录会延迟清理stream 事件不支持回放。
  • Limit: 进程重启或横向扩容后,Last-Event-ID 无法恢复历史事件;跨实例一致性弱。
  • Files: backend/packages/harness/deerflow/runtime/runs/manager.py, backend/packages/harness/deerflow/runtime/stream_bridge/memory.py
  • Scaling path: 引入跨实例共享存储(持久 run registry + 可回放事件流),并将 last_event_id 变为可用恢复机制。

Dependencies at Risk

前端依赖面较宽,升级波动风险上升(中优先级):

  • Risk: UI/渲染/动画/编辑器与 AI SDK 依赖较多,任一主版本变化可能触发连锁适配。
  • Impact: 构建稳定性与行为一致性风险上升。
  • Files: frontend/package.json
  • Migration plan: 建立“核心依赖分层升级策略”渲染内核、AI SDK、UI 库分批升级)与最小回归清单。

Missing Critical Features

后端 API 层缺少内建访问控制能力(高优先级):

  • Problem: 关键写操作接口缺少统一认证与授权依赖。
  • Blocks: 无法安全对公网或多租户环境直接暴露网关。
  • Files: backend/app/gateway/app.py, backend/app/gateway/routers/*.py

SSE 可恢复协议未形成闭环(中高优先级):

  • Problem: 桥接层注明接受 last_event_id 但忽略重放。
  • Blocks: 客户端断线恢复体验与长任务稳定性。
  • Files: backend/packages/harness/deerflow/runtime/stream_bridge/memory.py

Test Coverage Gaps

前端复杂交互缺少充分单元/组件测试(中优先级):

  • What's not tested: 输入框状态机、附件生命周期、artifact 详情多分支渲染的细粒度行为。
  • Files: frontend/src/components/workspace/input-box.tsx, frontend/src/components/ai-elements/prompt-input.tsx, frontend/src/components/workspace/artifacts/artifact-file-detail.tsx
  • Risk: 小改动引发 UI 行为回归且难快速定位。
  • Priority: High

安全基线测试缺少“未认证访问”负向用例(高优先级):

  • What's not tested: 未携带认证凭据访问关键 API 的拒绝路径(当前实现层面未内建)。
  • Files: backend/app/gateway/routers/*.py, backend/tests/
  • Risk: 安全能力依赖部署外部组件,环境漂移即暴露风险。
  • Priority: High

Concerns audit: 2026-04-07