Skip to content

feat(spec)!: RecordDetailsProps.sections 改为真实的对象形式,并补声明 hideFields (#5611) - #5734

Merged
os-zhuang merged 3 commits into
mainfrom
claude/issue-5611-record-details-sections
Aug 6, 2026
Merged

feat(spec)!: RecordDetailsProps.sections 改为真实的对象形式,并补声明 hideFields (#5611)#5734
os-zhuang merged 3 commits into
mainfrom
claude/issue-5611-record-details-sections

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Fixes #5611

按维护者 2026-08-06 的裁定实施 A 收紧变体:sections 直改对象形式数组(不做 union、不做 ADR-0087 转换层),hideFields 补声明。

派发前置:ID-list 形式的读取点测量(结论:零)

开工第一步按要求在 objectui(只读)测量 ID-list 形式有无渲染器读取点。结论是零,四个独立证据互相印证:

证据 位置 结果
渲染器 plugin-detail/src/renderers/record-details.tsx:189-217 schema.sections.map((s) =...) 全程按对象读(s.name / s.label / s.title / s.fields),全仓无任何 typeof s === 'string' 分支。字符串条目会被 ...s 展开成字符序列,渲染出的是垃圾
类型镜像 @object-ui/types RecordDetailsComponentProps.sections 本来就声明为对象数组(name? / label? / fields / collapsible? / collapsed?)
Studio 设计器 app-shell/.../previews/block-config.ts:310-320 record:detailssectionskind: 'array',itemFields 恰为 [label, columns, fields] —— 设计器根本产不出 ID 列表
正对照 同上渲染器 对象形式路径确实命中(filteredSections 一路走到 DetailView)

所以"破坏性"只存在于照着一份从无人兑现的声明写出的假想存量数据;且 schema 校验只作用于 publish 路径,不改写已存数据。测量为零 → 按裁定继续,未触发"停手回报"条件。

先证红(改动前实测,方向事先声明)

改之前先跑探针,预先声明两个键的失败方向应当不同,三条全部命中:

断言 预测 实测
对象形式 sections 拒绝(数组元素类型不符) success: false,code: 'invalid_type',path: ['sections', 0]
hideFields 静默剥离(非 strict 的 z.object 丢未声明键) success: true'hideFields' in data === false
ID-list sections(对照) 今天能过 success: true

两个键的失败模式不同(一个响一个哑),这正是 issue 正文预判的;探针文件已删除,其断言以正式测试形式保留在 component.test.ts

分区键集:按证据测量,不按想象

{ name?, label?, columns?, fields },每个键都能指到兑现方:

  • fields(必填) —— 4 个真实页面的全部 5 个 section 都有;objectui 类型镜像与 DetailViewSection 均为必填;lint 的 nestedSections 就走 sections[].fields[]
  • label(可选) —— 5/5 都授权;渲染器对无标题分区有明确行为(无边框),故可选而非必填。类型取 I18nLabelSchema,与本文件其余每一个 label/title 键保持一致(详见下方"刻意未做")。
  • columns(可选) —— 3 个 showcase 页授权(2 / 1),平台页不授权,故可选且不给 default(给了会把渲染器的自动推导覆盖掉)。
  • name(可选) —— 这条是测量出来的关键:仓内 packages/lint/src/validate-translatable-sections.ts 明确遍历 record:details 分区并报 translation-section-name-missing,主动提示作者补 name;i18n-extract.ts 也按 name 出 key。一个规则要求作者写的键,不能是 schema 拒绝的键 —— 漏掉它就会在反方向上重演本 issue。

消费半径

刻意未做(留给对应 issue)

生成物(逐行可解释)

  • references/ui/component.mdx:3 行 —— sections 类型 + 描述改写、新增 hideFields 行。
  • authorable-surface.json:1 行 —— ui/RecordDetailsProps:hideFields
  • strictness-ledger counts:component.zod.ts 的对象站点 29 → 30(新增的内嵌 section 对象),沿各级汇总一致传播。no gate 判定本身未变,故手写的 ledger 正文未动。
  • ⚠️ authorable-surface.base.json 被 spec 构建顺带重锚(baseRev 前移 + 带进他人已合并的 api/Discovery:scoping 两键),已剔除,不随本 PR 提交。

验证

命令 结果
pnpm --filter @objectstack/spec test 317 files / 8088 passed(基线 8082,+7 新增 −1 替换)
pnpm --filter @objectstack/lint test 59 files / 1369 passed
pnpm --filter @objectstack/cli test 83 files / 825 passed
pnpm --filter @objectstack/platform-objects test 9 files / 266 passed
typecheck(spec / lint / platform-objects) 全部通过
check:generated 10 项全绿
check-nul-bytes OK(5610 文件)

component.test.ts:152 原有夹具 sections: ['sec-1','sec-2'] 钉的正是被删掉的那条形状,按夹具三分法作整体替换 —— 换成从真实页面逐字取来的对象形式夹具,并补一条"ID-list 现在被拒绝"的反向钉。


Generated by Claude Code

…orm + declare hideFields (#5611)

`record:details` declared a `sections` shape nothing produced and nothing
consumed, and omitted a key a published platform page depends on.

- `sections`: `z.array(z.string())` (section IDs) -> an object array
  `{ name?, label?, columns?, fields }`. Measured: zero ID-list producers and
  zero ID-list read paths. objectui's RecordDetailsRenderer maps every entry as
  an object with no string branch, `@object-ui/types` already mirrored the
  object form, the Studio block designer can only author it, and all four real
  pages (3 showcase + sys_user) author it. Per the maintainer ruling on #5611:
  no union with string, no ADR-0087 conversion layer.
- `hideFields`: declared `z.array(z.string()).optional()`. Authored by
  sys-user.page.ts and read by the renderer; undeclared, so a non-strict
  z.object silently stripped it.
- `name` is declared because `packages/lint`'s translation-section-name-missing
  rule tells authors to add it — a key one rule demands must not be a key the
  schema rejects.
- Section `columns` uses an int range, not a literal union: same accepted set,
  but the docs generator renders numeric literals as quoted strings (filed as
  a separate finding), which would misdocument the key.

Aligns the two now-stale `packages/lint` comments that described these keys as
undeclared. Regenerated references/ui/component.mdx, authorable-surface.json and
the strictness-ledger counts (component.zod.ts gains one nested object site).

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

vercel Bot commented Aug 6, 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 Aug 6, 2026 3:11am

Request Review

claude added 2 commits August 6, 2026 02:43
合并 origin/main 后按 os-regen 纪律整体重生成(生成物不做文本合并):

- counts.md: 456 sites = 本分支 component.zod.ts 的 30 + main 新增
  action-params.zod.ts 的 1。文本合并给不出这个联合结果,故由
  gen:strictness-ledger 重算。
- authorable-surface.json: 重出后同时含本分支的
  ui/RecordDetailsProps:hideFields 与 main 的 ui/ActionSession:* 三键。
- authorable-surface.base.json 的重锚(baseRev 前移 + api/Discovery:scoping)
  与本 PR 无关,已剔除。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018fxLGQdatPbBUvCgiVxg6D
@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

109 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 @objectstack/lint, 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 packages/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/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 packages/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via packages/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/lint, @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/lint, @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/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-actions github-actions Bot added the size/m label Aug 6, 2026

Copy link
Copy Markdown
Contributor Author

合并 main 冲突消解(os-regen 四步)

推送后 #5721(#5697)与 #5722(#5605)合入 main,mergeable_statedirty。冲突全部落在生成物面,无手写代码冲突,按 os-regen 纪律消解:

  1. 合并并先提交 —— git merge origin/main 自动完成,零 unmerged path。merge 驱动把两个生成物记入 os-regen-pending 而不做文本合并(authorable-surface.json、strictness-ledger counts.md)。

  2. 整体重生成 —— 重装依赖 + 重建 spec 后 check:generated --fixcounts.md 的文本合并给不出正确联合结果,由 gen:strictness-ledger 重算:

    来源
    component.zod.ts 30 本分支新增的内嵌 section 对象
    action-params.zod.ts 1 main 新增(feat(spec): 为 action body 的 ctx.session 立契约 schema(按现状声明,#5697) #5721)
    总计 456 二者之和,文本合并算不出

    authorable-surface.json 重出后同时含本分支的 ui/RecordDetailsProps:hideFields 与 main 的 ui/ActionSession:* 三键 —— 后者是本分支源码合并后应有的联合结果,不是无关漂移,剔除反而会让产物相对源码过期。

  3. 剔除无关重锚 —— authorable-surface.base.json 每次 spec 构建都会被重锚(baseRev 前移 + 带进他人已合并的 api/Discovery:scoping 两键)。该文件是 git 解析出的基线锚点、非本分支源码派生物,已 git checkout 剔除,不进提交。提交时 pre-commit 确认两个延迟产物均 current 并清除了 marker。

  4. 合并后复跑全绿:

    命令 结果
    check:generated All 10 generated artifacts are up to date
    pnpm --filter @objectstack/spec test 317 files / 8097 passed
    pnpm --filter @objectstack/lint test 59 files / 1383 passed
    typecheck(spec / lint) ✅ 通过

    (测试数较正文表格上升,是 main 带进的新测试:spec 8088 → 8097,lint 1369 → 1383;本 PR 自身的 7 条新增测试不变。)

正文"验证"表格记的是合并前的数字,以本条为准。


Generated by Claude Code

@github-actions github-actions Bot added documentation Improvements or additions to documentation tests protocol:ui tooling labels Aug 6, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review August 6, 2026 03:30
@os-zhuang
os-zhuang added this pull request to the merge queue Aug 6, 2026
Merged via the queue into main with commit 889ae47 Aug 6, 2026
25 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-5611-record-details-sections branch August 6, 2026 03:42
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 protocol:ui size/m tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

RecordDetailsProps 与真实页面的授权形状不符:sections 声明为 string[] 但所有页面授权对象形式,hideFields 完全未声明

2 participants