Skip to content

docs(spec): 字段级/section 级 visibleWhen 收窄 current_user 过度宣称 (#6146) - #6315

Merged
qq9340100 merged 1 commit into
mainfrom
claude/issue-6146-fieldrule-current-user-describe
Aug 7, 2026
Merged

docs(spec): 字段级/section 级 visibleWhen 收窄 current_user 过度宣称 (#6146)#6315
qq9340100 merged 1 commit into
mainfrom
claude/issue-6146-fieldrule-current-user-describe

Conversation

@qq9340100

Copy link
Copy Markdown
Collaborator

Fixes#6146

执行维护者裁定方向 1(文档收窄)。dev 在只读 objectui 克隆里亲证前提:evalFieldPredicate(fieldRules.ts:115-157)的绑定恰为 { record, previous, extra(parent) },无任何 user 绑定;objectui#1582 的 pin 逐字在案。修正面:

  • view.zod.ts FormField(:1410)与 FormSection(:1504)的 JSDoc + describe:record+current_userrecord(+previous/parent),并写明危险方向 —— 未绑定标识符 fault 后 fallback=true(:189),想隐藏字段的谓词让字段永久可见;
  • field.zod.ts(~:122-136)per-option 文档的交叉引用修正(PM 范围修正令):删除「与字段级同一绑定环境」的假等式,current_user 在 per-option 面保留(真实绑定,objectui form.tsx:769-773 佐证);
  • content/docs/ui/views.mdx:373 手写表格行同款断言,同因同修;references 两页经 gen:docs 重生成(非手改,diff 恰为 3 行)。

卡片实测更正:生产调用点是五个而非三个(form.tsx ×3、WizardForm、GridField),全部不传 user scope —— 加强而非削弱结论。页面级 visibleWhen 文档(page.<var>/current_user)是另一求值器,证据未触及,刻意未动。

⚠️落地顺序:与 #6254(工头卡 4/6)在 :1416/:1510 两条 describe 上有交集,#6254 后落地并 rebase 本单。

本 PR 由 PM 代云端工头 dev(wave-5 卡 3/6)开出,终报将转录至 #6146。spec 8492 测试绿;check:docs 重生成后绿。changeset patch。


Generated by Claude Code

`FormField.visibleWhen` 与 `FormSection.visibleWhen` 把 runtime 绑定根写作
「`record` + `current_user`」。后半截在该层从来不成立,且失败是静默的:
FROM「Root: `record`+`current_user` (runtime forms) or `data` (metadata forms)」
TO「Root: `record` (+ `previous`, `parent`) in runtime forms, or `data` in
metadata forms」,并写明 `current_user` 在此层未绑定。
字段级/section 级规则由 @object-ui/core 的 evalFieldPredicate /
resolveFieldRuleState 求值,只绑 `record`、`previous` 与 `extra` scope
(master-detail 行项的 `parent`),再无其他。全部生产调用点都不传用户 scope;
objectui#1582 对作者端自动补全钉的是同一套
(FIELD_RULE_ROOTS = ['record','previous','parent'],注释明写
「nothing else (no `current_user`)」)。
为什么这不只是措辞问题:未绑定标识符会让求值 fault,而 fault 一律落到调用方
fallback —— 可见性的 fallback 是 `true`。于是完全照文档写出的谓词
(`'admin' in current_user.positions`)不但没隐藏字段,反而让字段**恒可见**。
照文档办事的作者拿到的是自己所写的反面,且发生在最难察觉的那一面。
`current_user` 在**选项级** visibleWhen(SelectOption)仍有文档、且仍然正确:
选项走另一套求值器 resolveCascadingOptions,对宿主 predicate scope 求值,确实
绑定它(ADR-0068 / objectui#2284)。该处 JSDoc 原先声称选项环境「与字段级
visibleWhen 是 SAME binding environment」—— 恰是那条为假的等式 —— 现改为写明
两者不对称。
仅文档,无 schema / 校验 / 运行时行为变化。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011M7UwH25Unfi73UHim7ajY
@vercel

vercelBot commented Aug 7, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectstackIgnoredIgnoredAug 7, 2026 1:38pm

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

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

  • content/docs/ai/agents.mdx(via @objectstack/spec)
  • content/docs/ai/skills-reference.mdx(via @objectstack/spec)
  • content/docs/ai/skills.mdx(via @objectstack/spec)
  • content/docs/api/client-sdk.mdx(via @objectstack/spec)
  • content/docs/api/environment-routing.mdx(via @objectstack/spec)
  • content/docs/api/error-catalog.mdx(via @objectstack/spec)
  • content/docs/api/error-handling-client.mdx(via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx(via @objectstack/spec)
  • content/docs/api/index.mdx(via @objectstack/spec)
  • content/docs/automation/approvals.mdx(via @objectstack/spec)
  • content/docs/automation/connectors.mdx(via @objectstack/spec)
  • content/docs/automation/flows.mdx(via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx(via packages/spec)
  • content/docs/automation/hooks.mdx(via @objectstack/spec)
  • content/docs/automation/index.mdx(via @objectstack/spec)
  • content/docs/automation/webhooks.mdx(via @objectstack/spec)
  • content/docs/automation/workflows.mdx(via @objectstack/spec)
  • content/docs/concepts/architecture.mdx(via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx(via packages/spec)
  • content/docs/concepts/index.mdx(via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx(via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx(via packages/spec)
  • content/docs/concepts/north-star.mdx(via @objectstack/spec)
  • content/docs/data-modeling/analytics.mdx(via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx(via @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx(via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx(via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx(via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx(via @objectstack/spec)
  • content/docs/data-modeling/index.mdx(via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx(via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx(via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx(via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx(via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx(via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx(via @objectstack/spec)
  • content/docs/deployment/cli.mdx(via @objectstack/spec)
  • content/docs/deployment/tenancy-modes.mdx(via @objectstack/spec)
  • content/docs/deployment/troubleshooting.mdx(via @objectstack/spec)
  • content/docs/deployment/validating-metadata.mdx(via @objectstack/spec)
  • content/docs/getting-started/build-with-claude-code.mdx(via @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx(via @objectstack/spec)
  • content/docs/getting-started/examples.mdx(via @objectstack/spec)
  • content/docs/getting-started/quick-reference.mdx(via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx(via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx(via @objectstack/spec)
  • content/docs/kernel/cluster.mdx(via @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx(via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx(via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx(via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx(via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx(via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx(via @objectstack/spec)
  • content/docs/kernel/index.mdx(via packages/spec)
  • content/docs/kernel/runtime-services/data-service.mdx(via @objectstack/spec)
  • content/docs/kernel/runtime-services/email-service.mdx(via packages/spec)
  • content/docs/kernel/runtime-services/examples.mdx(via @objectstack/spec)
  • content/docs/kernel/runtime-services/index.mdx(via packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx(via packages/spec)
  • content/docs/kernel/runtime-services/sharing-service.mdx(via @objectstack/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx(via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx(via @objectstack/spec)
  • content/docs/kernel/services-checklist.mdx(via @objectstack/spec)
  • content/docs/kernel/services.mdx(via @objectstack/spec)
  • content/docs/permissions/authorization.mdx(via @objectstack/spec)
  • content/docs/permissions/permission-sets.mdx(via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx(via @objectstack/spec)
  • content/docs/permissions/positions.mdx(via @objectstack/spec)
  • content/docs/permissions/rls.mdx(via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx(via @objectstack/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx(via @objectstack/spec)
  • content/docs/plugins/development.mdx(via @objectstack/spec)
  • content/docs/plugins/index.mdx(via @objectstack/spec)
  • content/docs/plugins/packages.mdx(via @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx(via @objectstack/spec)
  • content/docs/protocol/diagram.mdx(via packages/spec)
  • content/docs/protocol/kernel/config-resolution.mdx(via @objectstack/spec)
  • content/docs/protocol/kernel/http-protocol.mdx(via @objectstack/spec)
  • content/docs/protocol/kernel/i18n-standard.mdx(via @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx(via @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx(via @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx(via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx(via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx(via @objectstack/spec)
  • content/docs/protocol/objectql/query-syntax.mdx(via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx(via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx(via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/record-alert.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx(via @objectstack/spec)
  • content/docs/releases/implementation-status.mdx(via @objectstack/spec)
  • content/docs/releases/index.mdx(via @objectstack/spec)
  • content/docs/releases/v12.mdx(via @objectstack/spec)
  • content/docs/releases/v13.mdx(via @objectstack/spec)
  • content/docs/releases/v16.mdx(via @objectstack/spec)
  • content/docs/releases/v17.mdx(via @objectstack/spec)
  • content/docs/releases/v9.mdx(via @objectstack/spec)
  • content/docs/ui/actions.mdx(via @objectstack/spec)
  • content/docs/ui/apps.mdx(via @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx(via @objectstack/spec)
  • content/docs/ui/dashboards.mdx(via @objectstack/spec)
  • content/docs/ui/field-grouping-and-order.mdx(via @objectstack/spec)
  • content/docs/ui/forms.mdx(via @objectstack/spec)
  • content/docs/ui/index.mdx(via @objectstack/spec)
  • content/docs/ui/public-data-collection.mdx(via @objectstack/spec)
  • content/docs/ui/setup-app.mdx(via @objectstack/spec)
  • content/docs/ui/translations.mdx(via @objectstack/spec)
  • content/docs/ui/views.mdx(via @objectstack/spec)

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.

@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation protocol:data protocol:ui tooling labels Aug 7, 2026
@qq9340100
qq9340100 marked this pull request as ready for review August 7, 2026 15:08
@qq9340100
qq9340100 added this pull request to the merge queueAug 7, 2026
Merged via the queue into main with commit 8a88885Aug 7, 2026
25 checks passed
@qq9340100
qq9340100 deleted the claude/issue-6146-fieldrule-current-user-describe branch August 7, 2026 15:32
qq9340100 pushed a commit that referenced this pull request Aug 7, 2026
解 view.zod.ts 的 FormField.visibleWhen JSDoc/describe 相撞,按 keep-both:
- 保留 #6146(PR #6315)的根表述:runtime 根为 `record`(+ `previous` /
`parent`),字段级不绑 `current_user` —— 含 fault → fallback=true 的危险
方向说明(该谓词不是隐藏字段,而是让字段恒可见),以及 current_user 只在
per-option 面解析的指路。
- 保留本分支(#6254)的 repeater 段落:repeater 子字段把 `data` 重绑为**行**,
但根在任何深度仍拼作 `data`,故裸标识符未绑定、同样 fault open。
两段语义独立、方向互补 —— 一段讲「根里没有什么」,一段讲「根在深处指向什么」,
都落在同一个 fail-open 后果上,故在 JSDoc 与 describe 中并存,措辞相互衔接。
FormSection.visibleWhen 无冲突,取 #6146 版本。
content/docs/references/ui/view.mdx 未手改:按合并驱动的提示先跑
`gen:schema` 再跑 `gen:docs`,由合并后的源重生成。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011M7UwH25Unfi73UHim7ajY
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationprotocol:dataprotocol:uisize/stooling

Projects

None yet

2 participants

@qq9340100@claude