Skip to content

fix(objectql): surface human validation messages in ValidationError.message#2577

Merged
os-zhuang merged 1 commit into
mainfrom
claude/clever-feynman-1f9edc
Jul 4, 2026
Merged

fix(objectql): surface human validation messages in ValidationError.message#2577
os-zhuang merged 1 commit into
mainfrom
claude/clever-feynman-1f9edc

Conversation

@baozhoutao

Copy link
Copy Markdown
Contributor

问题

项目反馈:对象级校验规则(ADR-0020 validations[])拦截保存时,console 右下角报错 toast 只显示通用英文文案:

Validation failed for 1 field(s): _record (rule_violation)

而规则作者写的本地化 message(如 最小水深不能大于最大水深。)完全没有露出,用户不知道哪里填错了。

根因

作者的 message 全链路都在 ValidationError.fields[].message 里(rule-validator → REST 400 信封 fields[] → client SDK error.details),但所有通用 UI(console toast、CLI、SDK 调用方)显示的是顶层 Error.message,而它此前只包含 field (code) 摘要。

修复

在唯一的咽喉点 —— ValidationError 构造函数 —— 把顶层 message 改为由各 field error 的人类可读 message 拼接(; 分隔),message 为空时才回退到 field (code)

  • code(VALIDATION_FAILED)和 fields[] 机读契约不变,REST 信封形状不变
  • 仅有的 2 个 throw 点(record-validator、rule-validator)都走此构造函数,所有客户端零改动受益
  • 全仓无生产代码解析旧 message 格式,仅测试正则依赖(已同步更新为断言人类文案,断言反而更强)

测试

  • 新增回归块 ValidationError — top-level message is human-readable(4 例:单条 verbatim/多条拼接/空 message 回退/机读契约不变)
  • packages/objectql:60 文件 749 用例全绿
  • packages/rest:8 文件 198 用例全绿(信封断言 code,不受影响)

@vercel

vercel Bot commented Jul 4, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
spec Ready Ready Preview, Comment Jul 4, 2026 1:21pm

Request Review

@github-actions github-actions Bot added size/m documentation Improvements or additions to documentation tests tooling and removed size/m labels Jul 4, 2026
@github-actions

github-actions Bot commented Jul 4, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/objectql.

14 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/concepts/core/services.mdx (via @objectstack/objectql)
  • content/docs/concepts/implementation-status.mdx (via @objectstack/objectql)
  • content/docs/concepts/metadata-lifecycle.mdx (via @objectstack/objectql)
  • content/docs/concepts/packages.mdx (via @objectstack/objectql)
  • content/docs/guides/authentication.mdx (via @objectstack/objectql)
  • content/docs/guides/deployment-vercel.mdx (via @objectstack/objectql)
  • content/docs/guides/formula.mdx (via packages/objectql)
  • content/docs/guides/kernel-services.mdx (via @objectstack/objectql)
  • content/docs/guides/objectql-migration.mdx (via @objectstack/objectql)
  • content/docs/guides/packages.mdx (via @objectstack/objectql)
  • content/docs/guides/plugins.mdx (via @objectstack/objectql)
  • content/docs/protocol/objectos/index.mdx (via @objectstack/objectql)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/objectql)
  • content/docs/releases/v9.mdx (via @objectstack/objectql)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

@os-zhuang
os-zhuang merged commit c2fdbf9 into main Jul 4, 2026
16 checks passed
@os-zhuang
os-zhuang deleted the claude/clever-feynman-1f9edc branch July 4, 2026 13:33
…essage

An object-level validation rule's author-written message (often localized,
e.g. 最小水深不能大于最大水深。) was buried in fields[] while the top-level
Error.message — what the console toast, CLI, and SDK callers display —
only said "Validation failed for 1 field(s): _record (rule_violation)".

Build the top-level message from the per-field human messages (joined
with '; '), falling back to "field (code)" when a message is blank.
code/fields[] stay unchanged for programmatic consumers.
os-zhuang added a commit that referenced this pull request Jul 16, 2026
…ntract in detail-shapes e2e (#3047)

Last mile of the #2548 follow-up series: the vendored console pin moves past objectui#2577 so `objectstack dev --ui` gets the detail-page UX fixes, and detail-shapes e2e now pins that contract (strip title dedupe, group icon svg + description, currencyConfig symbols, no dangling footer). Local run against the rebuilt vendored console: 3/3 green (check:console-sha ✓).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants