Skip to content

fix(lint,cli): os lint / os compile 不再放行一个 os validate 会拒绝的 react 页面 (#4340 后续) - #4417

Merged
os-zhuang merged 2 commits into
mainfrom
claude/react-page-blocks-props-validation-1bxgac
Jul 31, 2026
Merged

fix(lint,cli): os lint / os compile 不再放行一个 os validate 会拒绝的 react 页面 (#4340 后续)#4417
os-zhuang merged 2 commits into
mainfrom
claude/react-page-blocks-props-validation-1bxgac

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

#4340#4353)后续。

validateReactPageProps 只手工接在 os validate 上,os lintos compile 从来没跑过它:

$ grep -o "validateReferenceIntegrity\|validateReactPageProps" packages/cli/src/commands/{lint,compile,validate}.ts
lint.ts:    validateReferenceIntegrity
compile.ts: validateReferenceIntegrity
validate.ts:validateReferenceIntegrity  validateReactPageProps   ← 只有它

实测

在 showcase 的 react 页面植入一处 gating 违规——<ListView filters={['no_such_col','=',stage]}>,谓词命中不了任何行,SqlDriver 吞掉 "no such column" 后 return [],列表回空且与「本来就没数据」无法区分:

os lint os compile os validate
修复前 exit 0 放行 exit 0 放行 exit 1 拒绝
修复后 exit 1 拒绝 exit 1 拒绝 exit 1 拒绝

干净语料上三个命令仍全部 exit 0。

「修复前」是把 suite 那一行 stash 掉、只重建 @objectstack/lint 后实测的,不是推断。

为什么漏接这一条特别贵

#4340 之后,这条规则已经是整个 react 页面表面唯一的字段解析闸门:

所以漏接不是少几条警告——而是这些绑定在 build 路径上完全没人看,包括其中会 gate 的那些(缺必需绑定、filter 位置命名不存在的字段)。

改了什么

接入 REFERENCE_INTEGRITY_RULESvalidate.ts 那处手工接线(import + 约 32 行)随之删除。三个命令的答案由构造保证一致,而不是靠三个人记得——这正是 suite 设立要终结的漂移(#3583 §5 D5),也是 validateReadonlyFlowWrites#4394 里刚走过的同一条路:那次是「一张 config.fields map、两个检查、两套命令集合」,这次是「一次 JSX parse、七个 rule id、一套命令集合」。

删掉 validate.ts 的直接 import 不是顺手整理,是被 #4402 的接线守卫逼出来的——它断言三个命令都不许直接 import suite 成员,加进 suite 后不删就红。

一个 charter 上的诚实交代

按 suite 的 charter,react-prop-missing-requiredreact-prop-typoshape 而非解析问题,本不属于这里。它们随行的理由与 validateActionBodyWrites 完全相同(其注释已写明):落在同一次 parse 的同一份 source 上,拆成第二个 member 就要把每个 react 页面 parse 两遍去说同一次遍历的两件事,而改回手工接线正是 suite 要终结的漂移。

顺带更正了那条注释里 “The ONE member here that emits two rule ids” 的说法——现在不止一个了。

零行为变化

规则的 id、严重级、文案都不动。输入也不变:os validate 原本就传 result.data,suite 拿到的是同一个对象,所以 validate 侧连 finding 集合都完全一致(#4394 需要实测 pre/post-parse 等价,这次不存在这个问题)。惰性约定沿用 validateHookBodyWrites / validateActionBodyWrites——只有真的存在 kind:'react' 页面时才加载 TypeScript 编译器。

验证


Generated by Claude Code

…4340 后续)

`validateReactPageProps` 只手工接在 `os validate` 上,`os lint` 和 `os compile`
从来没跑过它。在 showcase 的 react 页面植入一处 gating 违规
(`<ListView filters={['no_such_col','=',stage]}>` —— 谓词命中不了任何行,
SqlDriver 吞掉 "no such column" 后返回 [],列表回空且与「本来就没数据」无法区分)
实测:

              os lint      os compile     os validate
  修复前      exit 0 放行   exit 0 放行    exit 1 拒绝
  修复后      exit 1 拒绝   exit 1 拒绝    exit 1 拒绝

#4340 之后这条规则已经是整个 react 页面表面唯一的字段解析闸门:<ListView> 的
columns/fields/sort/grouping/userFilters、<ObjectForm> 的
fields/initialValues/sections/subforms、record:* 一族(与元数据表面共用同一张
COMPONENT_FIELD_SPECS)、<ObjectChart> 的 aggregate/axes,以及 searchableFields。
所以漏接不是少几条警告 —— 而是这些绑定在 build 路径上完全没人看,包括其中会 gate
的那些。

现接入 REFERENCE_INTEGRITY_RULES,`os validate` 那处手工接线随之删除,三个命令的
答案由构造保证一致。这正是 suite 设立要终结的漂移(#3583 §5 D5),也是
validateReadonlyFlowWrites 在 #4394 里刚走过的同一条路:那次是「一张 map、
两个检查、两套命令集合」,这次是「一次 JSX parse、七个 rule id、一套命令集合」。

按 charter,react-prop-missing-required / react-prop-typo 是 shape 而非解析问题,
本不属于 suite。它们随行的理由与 validateActionBodyWrites 完全相同(其注释已写明):
落在同一次 parse 的同一份 source 上,拆成第二个 member 就要把每个 react 页面
parse 两遍,而改回手工接线正是 suite 要终结的那种漂移。同时更正了那条注释里
"The ONE member here that emits two rule ids" 的说法 —— 现在不止一个。

规则行为零变化:id、严重级、文案都不动;输入也不变(`os validate` 原本就传
result.data,suite 拿到的是同一个)。#4402 的接线守卫会在下次有人想再手工接一条
规则时直接报错——本次删除 validate.ts 的直接 import 也正是被它逼出来的。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012rK2McPogrTJBKdUsThrGs
@vercel

vercel Bot commented Jul 31, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Jul 31, 2026 1:12pm

Request Review

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

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 2 package(s): @objectstack/cli, @objectstack/lint.

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

  • content/docs/ai/skills-reference.mdx (via packages/cli)
  • content/docs/api/client-sdk.mdx (via @objectstack/cli)
  • content/docs/api/data-flow.mdx (via @objectstack/cli)
  • content/docs/api/environment-routing.mdx (via @objectstack/cli)
  • content/docs/api/error-catalog.mdx (via @objectstack/cli)
  • content/docs/automation/hook-bodies.mdx (via packages/cli, @objectstack/lint)
  • content/docs/deployment/backup-restore.mdx (via @objectstack/cli)
  • content/docs/deployment/cli.mdx (via @objectstack/cli)
  • content/docs/deployment/self-hosting.mdx (via @objectstack/cli)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/cli)
  • content/docs/kernel/runtime-services/data-service.mdx (via packages/cli)
  • content/docs/kernel/runtime-services/index.mdx (via packages/cli)
  • content/docs/permissions/authentication.mdx (via @objectstack/cli)
  • content/docs/permissions/authorization.mdx (via @objectstack/lint)
  • content/docs/plugins/index.mdx (via @objectstack/cli)
  • content/docs/plugins/packages.mdx (via @objectstack/cli)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/cli)
  • content/docs/protocol/kernel/realtime-protocol.mdx (via @objectstack/cli)
  • content/docs/releases/implementation-status.mdx (via @objectstack/cli)
  • content/docs/releases/v16.mdx (via @objectstack/cli)

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.

本 PR 把 react 页面的字段绑定检查从「只在 os validate」变成「suite 成员,三个命令
都跑」,这份文档有三处随之失真 —— 而 docs-drift 的包级扇出恰好没点到它(它按
@objectstack/cli / @objectstack/lint 列了 20 份,漏了语义上唯一真正耦合的这份)。

- "one gate, two entry points" 表补一行 React page block field bindings(两列都 ✓)。
- 表下那句把 "JSX/React page sources" 整体算作 os validate 独有 —— 现在只有
  「源码能否 parse」这个 SHAPE 闸门是独有的,里面的字段绑定属于 reference-integrity,
  suite 跑到哪它就跑到哪(含 os lint)。改写为分开陈述,并记下这里曾经的漂移与
  #4384 的接线守卫。
- 示例 os validate 输出里的 `→ Checking React-source page props (ADR-0081)...`
  随手工接线一并删除,已按真实 CLI 输出核对:示例里的每一行 step 现在都能在
  showcase 上逐字复现(comm 比对为空)。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012rK2McPogrTJBKdUsThrGs
@os-zhuang
os-zhuang marked this pull request as ready for review July 31, 2026 13:17
@os-zhuang
os-zhuang merged commit 8db4587 into main Jul 31, 2026
18 checks passed
@os-zhuang
os-zhuang deleted the claude/react-page-blocks-props-validation-1bxgac branch July 31, 2026 13:17
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 size/m tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants