Skip to content

feat(spec): the object-* block family enters ComponentPropsMap — typo'd props warn with did-you-mean (#7751) - #8524

Merged
qq9340100 merged 7 commits into
mainfrom
claude/issue-7751-object-block-props-map
Aug 13, 2026
Merged

feat(spec): the object-* block family enters ComponentPropsMap — typo'd props warn with did-you-mean (#7751)#8524
qq9340100 merged 7 commits into
mainfrom
claude/issue-7751-object-block-props-map

Conversation

@qq9340100

Copy link
Copy Markdown
Collaborator

Fixes#7751

What

Per the maintainer ruling (2026-08-12, direction A), the object-* block family's props schemas enter ComponentPropsMap (packages/spec/src/ui/component.zod.ts), so the existing validate-component-props lint has schemas to dispatch for the platform's data-bound authoring surface — and did-you-mean (filtersfilter) comes free. Six blocks are registered: object-grid, object-metric, object-kanban, object-calendar, object-form, object-master-detail-form.

The #7750 specimen shape (an object-grid authored with plural filters) now warns:

`filters` is not a prop `object-grid` declares … Did you mean `filters` → `filter`?

How the key sets were derived

Measured from the objectui renderers' own read points (checkout at eb7f586b; per-key line citations in the section header), never from the designer palette or registry inputs alone — both publish keys with zero read points (object-gridstriped/bordered, object-kanbangroupField), and re-declaring one would recreate the declared-but-inert trap this card closes. Consequences:

Scope judgment

  • Included (ruled minimum + same-confidence derivables): object-grid, object-metric, object-kanban, object-calendar, plus object-form / object-master-detail-form — their renderers read a destructured/enumerable set (ObjectForm.tsx + the five sub-forms it forwards into; MasterDetailForm.tsx).
  • Excluded: object-chart. Its authored vocabulary is two-layered (chartType on the SDUI node vs ChartConfigSchema.type; corpus authors dataset/dimensions/values while the rest of the bag spreads into the generic chart component), so its key set is not derivable with the same confidence — a partial entry would warn on working keys, worse than the status-quo skip. It stays a silently-skipped unregistered type, pinned in tests.
  • Values are deliberately conservative in this first, warning-tier step (scalars/enums only where renderer + registry + designer agree; z.unknown() where the value contract still lives in objectui). The card's class is a KEY typo; value tightening is a later ratchet.

What did NOT change

Parity (the ruling's third point)

check:react-declaration-parity now also iterates the object-*ComponentPropsMap entries against objectui's sdui.manifest.json — same comparison, same baseline ratchet, no new gate. Blocks not yet in the committed baseline are additive (pinned in the script's fixture tests), so the first pin-bump run stays green and --update records them. The registry-declared inputs of each block are a strict subset of its spec set, so registry-only is empty by construction today; the spec surplus is the soft spec-only signal ADR-0082 §2 expects. This gate remains on-demand (pin-bump-triggered, EXTERNAL_INPUT_REQUIRED for check:generated) — it could not be run here (no browser manifest); its new iteration is proven with the existing fixture harness instead.

Tests

Verified on the merged base (origin/main at 1e70d249f): @objectstack/spec 394 files / 10469 tests pass, @objectstack/lint 72 files / 2012 tests pass, both typechecks pass, check:generated reports all 13 artifacts up to date. The six new type aliases are default-free and pinned isomorphic per ADR-0122 (Iso838-Iso843).

Generated by Claude Code


Generated by Claude Code

Direction A per the maintainer ruling (2026-08-12): six object-* blocks get
props schemas derived from objectui's renderer read points, so
validate-component-props has schemas to dispatch and 'filters' -> 'filter'
did-you-mean comes free. object-chart deliberately excluded (two-vocabulary
problem). Parity rides check:react-declaration-parity, which now iterates the
object-* map entries under the same baseline ratchet.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012MNV7ZSCjNfA38eDCjsXQL
… props schemas (#7751)
- api-surface/export-origins/docs-references/strictness-ledger counts regenerated
(the four check:generated proved stale)
- each new schema gets its author-state type alias (ObjectGridProps ...) per
ADR-0122; all six are default-free so they pin isomorphic (Iso838-Iso843)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012MNV7ZSCjNfA38eDCjsXQL
@vercel

vercelBot commented Aug 13, 2026

Copy link
Copy Markdown

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

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

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

106 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/permissions/system-context.mdx(via packages/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/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)

7 release-owned page(s) also reference the affected code. These are read-only:

  • 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/releases/ is RELEASE-OWNED (AGENTS.md "Documentation Guardrails"): release
notes are written centrally at release time, and a code PR that edits them is the exact PR
that guardrail exists to stop. They are still audited — read-only. If one of them is actually
wrong, file an issue or open a dedicated docs-only PR; do not edit it here.

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.

…ins to Iso839-Iso844 (#7751)
Main's #8211 (PR #8450) took Iso838; the six object-* pins renumber to the
next free ids on the merged tree (ids are claims about pins, not positions —
renumbering unmerged pins is legal). Pin count 825 + 6 = 831, asserted by the
count case, not arithmetic.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012MNV7ZSCjNfA38eDCjsXQL
@qq9340100
qq9340100 marked this pull request as ready for review August 13, 2026 19:23
@qq9340100
qq9340100 added this pull request to the merge queueAug 13, 2026
Merged via the queue into main with commit 8f20201Aug 13, 2026
28 checks passed
@qq9340100
qq9340100 deleted the claude/issue-7751-object-block-props-map branch August 13, 2026 19:42
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationprotocol:uisize/xlteststooling

Projects

None yet

2 participants

@qq9340100@claude