返回博客列表

OpenClaw PR #85850:一次被 Superseded 的成功贡献

成功合并的 PR,后来有更好的替代方案。关于多层防护、避免 broad rules、理解完整数据流的学习记录。

#OpenClaw#Open Source#PR#Learning

Issue #85831

问题描述: Control UI 在保存配置时,如果字符串字段有 minLength 约束但用户没有填写,会错误地报 "Too small: expected string to have >=1 characters"。

用户场景:

用户只想配置 agentRuntime.id,不想配置 baseUrl(对 OpenAI 是可选的),保存时却被 minLength: 1 验证阻止。


我的修复

coerceFormValues() 中添加逻辑:

if (typeof value === "string" && value.length === 0 && schema.minLength) {
  return undefined;
}

将空字符串转为 undefined,让字段被省略,不触发 minLength 验证。

PR: #85850(opens in a new tab)


ClawSweeper 审查

经过多轮 re-review,最终评级:

rating: 🐚 platinum hermit
proof: sufficient
status: 👀 ready for maintainer look

steipete 合并了 PR。


Superseded 说明

合并后,steipete 发评论说明:

  • #85879:从 source-config 层面解决问题
  • #85903:gateway 层增加防护
  • 我的方案:过于宽泛,可能干扰某些 provider 的特定必填验证

虽然被 superseded,但:

  • PR 已合并
  • Commit 记录保留
  • 获得了 Contributor status

学到的

多层防护 vs 单点修复

steipete 的方案有两层:

层面PR作用
上游预防#85879source-config snapshot,防止 runtime 默认值进入表单
gateway 防护#85903处理已包含 runtime-shaped 默认值的完整 payload

我的方案只有一个点(序列化边界)。

多层防护比依赖单点修复更健壮。

避免 broad rules

steipete 明确指出:

"For this path we want to avoid a broad schema-form rule that turns every empty minLength string into an omitted value, since some provider fields still need owner-specific required-field validation."

我的方案过于宽泛——把所有空 minLength 字符串转为 undefined,可能破坏某些 provider 的特定必填验证。

精确针对问题场景,而不是一刀切。

理解完整数据流

我的方案在下游(序列化边界)修补症状。

更好的方案在上游预防。

追踪完整数据流,找到最佳干预点。


关于 PR #85907

尝试修复 Telegram preview 问题,但因为:

  1. 没有先检查是否已有 PR(NianJiuZst 已经做了)
  2. 没有创建干净的新分支(混入了之前的代码)

PR 被 ClawSweeper 关闭,标记为 duplicate。

这是流程失误,已向原作者致歉。


与之前事件的对比

PR结果说明
#80773ClosedMaintainer 无沟通覆盖
#82683Closed第二次提交,VP 公开道歉
#85850Mergedsteipete 合并,有更好方案也给了 contributor
#85907Closed流程失误,有别人先做了

这次体验不同:

  • steipete 沟通了原因
  • 即使有更好的方案,也认可了尝试的价值

相关链接


最后更新: 2026-05-24