feat(spec,showcase): lookup record-picker authoring metadata + demo - #2125

Merged
xuyushun441-sys merged 2 commits into
mainfrom
feat/lookup-picker-metadata
Jun 21, 2026
Merged

feat(spec,showcase): lookup record-picker authoring metadata + demo#2125
xuyushun441-sys merged 2 commits into
mainfrom
feat/lookup-picker-metadata

Conversation

@xuyushun441-sys

Copy link
Copy Markdown
Contributor

Why

The objectui record picker can render multi-column, scoped, and dependent lookup results, but FieldSchema exposed none of the authoring surface for it. Anything an author set (e.g. lookupColumns) was silently dropped by defineStack's Zod parse — so the picker always degraded to a single name column. This is the same class of gap the FieldSchema property-liveness audit flags (e.g. referenceFilters reaching the renderer under a different key, lookup_filters).

Companion to objectui #1860 (renderer: zero-config column derivation, i18n, accepts both key casings, applies lookupFilters in the popover).

Changes

spec — packages/spec/src/data/field.zod.ts
Add the forward record-picker props to the lookup / master_detail surface, all genuinely wired to the renderer:

  • displayField — candidate label field
  • descriptionField — secondary line in the popover
  • lookupColumns — curated picker table columns (auto-derived when omitted)
  • lookupPageSize — rows per page
  • lookupFilters — structured, picker-honoured scoping filters (the structured form of referenceFilters)
  • dependsOn — dependent / cascading lookups

They flow through Field.lookup() automatically via FieldInput. Tests assert the props survive FieldSchema.parse (the path defineStack uses) and that the builder carries them through.

showcase — examples/app-showcase

  • Account seed expanded 3 → 13 (varied industry / revenue / lifecycle incl. churned) so the picker exercises search, sort, pagination and scoping.
  • showcase_invoice.account configured with curated lookupColumns (name / industry / lifecycle / revenue), a descriptionField, and a lookupFilters rule hiding churned accounts — a rep can't invoice a churned customer.

Verification

  • packages/spec unit tests: 117 passed (incl. 2 new — props parse without being stripped; builder carries them through).
  • app-showcase typecheck: no errors in the changed files (invoice.object.ts, data/index.ts); remaining errors are pre-existing unbuilt-workspace-dep noise (connectors / objectql), unrelated to this change.
  • Renderer side proven live in feat(spec): model action-param translations (_actions.params) #1860 against this showcase.

The objectui record picker can present multi-column, scoped, dependent lookup
results, but FieldSchema exposed none of the authoring surface for it — so the
props were silently dropped by defineStack's Zod parse (cf. the FieldSchema
property-liveness audit, which flags referenceFilters reaching the renderer
under a different key). Authors had no supported way to curate or scope a picker.
spec (FieldSchema, packages/spec/src/data/field.zod.ts):
- Add forward record-picker props to the lookup/master_detail surface:
`displayField`, `descriptionField`, `lookupColumns`, `lookupPageSize`,
`lookupFilters` (structured, picker-honoured form of referenceFilters),
and `dependsOn` (dependent/cascading lookups). All are genuinely wired —
the objectui renderer reads them (camelCase + snake_case aliases). They flow
through Field.lookup() automatically via FieldInput.
- Tests: assert the props survive FieldSchema.parse (not stripped) and that
Field.lookup() carries them through.
showcase (examples/app-showcase):
- Expand the account seed from 3 → 13 (varied industry / revenue / lifecycle,
incl. churned) so the picker exercises search, sort, pagination and scoping.
- Configure showcase_invoice.account with curated `lookupColumns`
(name / industry / lifecycle / revenue), a `descriptionField`, and a
`lookupFilters` rule that hides churned accounts — a rep can't invoice a
churned customer. Demonstrates the new authoring surface end-to-end.
Pairs with objectui PR #1860 (renderer: auto-derive columns + i18n + accept
both key casings + apply lookupFilters in the popover).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercelBot commented Jun 21, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
specReadyReadyPreview, CommentJun 21, 2026 1:11pm

Request Review

@github-actions

github-actionsBot commented Jun 21, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

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

  • content/docs/concepts/architecture.mdx(via @objectstack/spec)
  • content/docs/concepts/cloud-artifact-api.mdx(via packages/spec)
  • content/docs/concepts/cluster-semantics.mdx(via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx(via packages/spec)
  • content/docs/concepts/implementation-status.mdx(via @objectstack/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 packages/spec)
  • content/docs/concepts/packages.mdx(via @objectstack/spec)
  • content/docs/concepts/setup-app.mdx(via @objectstack/spec)
  • content/docs/concepts/skills.mdx(via @objectstack/spec)
  • content/docs/concepts/webhook-delivery.mdx(via @objectstack/spec)
  • content/docs/getting-started/architecture.mdx(via @objectstack/spec)
  • content/docs/getting-started/cli.mdx(via @objectstack/spec)
  • content/docs/getting-started/core-concepts.mdx(via @objectstack/spec)
  • content/docs/getting-started/examples.mdx(via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx(via @objectstack/spec)
  • content/docs/guides/adding-a-metadata-type.mdx(via @objectstack/spec)
  • content/docs/guides/ai-capabilities.mdx(via @objectstack/spec)
  • content/docs/guides/airtable-dashboard-analysis.mdx(via @objectstack/spec)
  • content/docs/guides/analytics-datasets.mdx(via @objectstack/spec)
  • content/docs/guides/api-reference.mdx(via @objectstack/spec)
  • content/docs/guides/business-logic.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/backward-compatibility.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/error-catalog.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/field-type-gallery.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/field-validation-rules.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/permissions-matrix.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/protocol-diagram.mdx(via packages/spec)
  • content/docs/guides/cheatsheets/query-cheat-sheet.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/quick-reference.mdx(via @objectstack/spec)
  • content/docs/guides/client-sdk.mdx(via @objectstack/spec)
  • content/docs/guides/common-patterns.mdx(via @objectstack/spec)
  • content/docs/guides/contracts/auth-service.mdx(via packages/spec)
  • content/docs/guides/contracts/cache-service.mdx(via packages/spec)
  • content/docs/guides/contracts/data-engine.mdx(via @objectstack/spec)
  • content/docs/guides/contracts/index.mdx(via @objectstack/spec)
  • content/docs/guides/contracts/metadata-service.mdx(via packages/spec)
  • content/docs/guides/contracts/storage-service.mdx(via packages/spec)
  • content/docs/guides/data-modeling.mdx(via @objectstack/spec)
  • content/docs/guides/deployment-vercel.mdx(via @objectstack/spec)
  • content/docs/guides/driver-configuration.mdx(via @objectstack/spec)
  • content/docs/guides/error-handling-client.mdx(via @objectstack/spec)
  • content/docs/guides/error-handling-server.mdx(via @objectstack/spec)
  • content/docs/guides/formula.mdx(via @objectstack/spec)
  • content/docs/guides/hook-bodies.mdx(via packages/spec)
  • content/docs/guides/kernel-services.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/dashboard.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/field.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/flow.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/index.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/object.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/validation.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/workflow.mdx(via @objectstack/spec)
  • content/docs/guides/packages.mdx(via @objectstack/spec)
  • content/docs/guides/plugin-development.mdx(via @objectstack/spec)
  • content/docs/guides/plugins.mdx(via @objectstack/spec)
  • content/docs/guides/project-scoping.mdx(via @objectstack/spec)
  • content/docs/guides/public-forms.mdx(via @objectstack/spec)
  • content/docs/guides/runtime-services/email-service.mdx(via packages/spec)
  • content/docs/guides/runtime-services/index.mdx(via packages/spec)
  • content/docs/guides/runtime-services/queue-service.mdx(via packages/spec)
  • content/docs/guides/runtime-services/sharing-service.mdx(via packages/spec)
  • content/docs/guides/runtime-services/storage-service.mdx(via packages/spec)
  • content/docs/guides/security.mdx(via @objectstack/spec)
  • content/docs/guides/seed-data.mdx(via @objectstack/spec)
  • content/docs/guides/skills.mdx(via @objectstack/spec)
  • content/docs/guides/standards.mdx(via @objectstack/spec)
  • content/docs/guides/troubleshooting.mdx(via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/config-resolution.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/i18n-standard.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/lifecycle.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/plugin-spec.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/runtime-capabilities.mdx(via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx(via packages/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 packages/spec)
  • content/docs/protocol/objectui/record-alert.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx(via @objectstack/spec)
  • content/docs/releases/index.mdx(via @objectstack/spec)
  • content/docs/releases/v9.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.

The spec liveness gate requires every authorable FieldSchema property to be
classified. Mark displayField/descriptionField/lookupColumns/lookupPageSize/
lookupFilters/dependsOn as live (consumed by the objectui record picker, cited
as prose per the ledger convention) and sharpen the referenceFilters authorHint
to point at the structured lookupFilters key.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@xuyushun441-sys@os-zhuang
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat(spec,showcase): lookup record-picker authoring metadata + demo - #2125

Merged
xuyushun441-sys merged 2 commits into
mainfrom
feat/lookup-picker-metadata
Jun 21, 2026
Merged

feat(spec,showcase): lookup record-picker authoring metadata + demo#2125
xuyushun441-sys merged 2 commits into
mainfrom
feat/lookup-picker-metadata

Conversation

@xuyushun441-sys

Copy link
Copy Markdown
Contributor

Why

The objectui record picker can render multi-column, scoped, and dependent lookup results, but FieldSchema exposed none of the authoring surface for it. Anything an author set (e.g. lookupColumns) was silently dropped by defineStack's Zod parse — so the picker always degraded to a single name column. This is the same class of gap the FieldSchema property-liveness audit flags (e.g. referenceFilters reaching the renderer under a different key, lookup_filters).

Companion to objectui #1860 (renderer: zero-config column derivation, i18n, accepts both key casings, applies lookupFilters in the popover).

Changes

spec — packages/spec/src/data/field.zod.ts
Add the forward record-picker props to the lookup / master_detail surface, all genuinely wired to the renderer:

  • displayField — candidate label field
  • descriptionField — secondary line in the popover
  • lookupColumns — curated picker table columns (auto-derived when omitted)
  • lookupPageSize — rows per page
  • lookupFilters — structured, picker-honoured scoping filters (the structured form of referenceFilters)
  • dependsOn — dependent / cascading lookups

They flow through Field.lookup() automatically via FieldInput. Tests assert the props survive FieldSchema.parse (the path defineStack uses) and that the builder carries them through.

showcase — examples/app-showcase

  • Account seed expanded 3 → 13 (varied industry / revenue / lifecycle incl. churned) so the picker exercises search, sort, pagination and scoping.
  • showcase_invoice.account configured with curated lookupColumns (name / industry / lifecycle / revenue), a descriptionField, and a lookupFilters rule hiding churned accounts — a rep can't invoice a churned customer.

Verification

  • packages/spec unit tests: 117 passed (incl. 2 new — props parse without being stripped; builder carries them through).
  • app-showcase typecheck: no errors in the changed files (invoice.object.ts, data/index.ts); remaining errors are pre-existing unbuilt-workspace-dep noise (connectors / objectql), unrelated to this change.
  • Renderer side proven live in feat(spec): model action-param translations (_actions.params) #1860 against this showcase.

The objectui record picker can present multi-column, scoped, dependent lookup
results, but FieldSchema exposed none of the authoring surface for it — so the
props were silently dropped by defineStack's Zod parse (cf. the FieldSchema
property-liveness audit, which flags referenceFilters reaching the renderer
under a different key). Authors had no supported way to curate or scope a picker.
spec (FieldSchema, packages/spec/src/data/field.zod.ts):
- Add forward record-picker props to the lookup/master_detail surface:
`displayField`, `descriptionField`, `lookupColumns`, `lookupPageSize`,
`lookupFilters` (structured, picker-honoured form of referenceFilters),
and `dependsOn` (dependent/cascading lookups). All are genuinely wired —
the objectui renderer reads them (camelCase + snake_case aliases). They flow
through Field.lookup() automatically via FieldInput.
- Tests: assert the props survive FieldSchema.parse (not stripped) and that
Field.lookup() carries them through.
showcase (examples/app-showcase):
- Expand the account seed from 3 → 13 (varied industry / revenue / lifecycle,
incl. churned) so the picker exercises search, sort, pagination and scoping.
- Configure showcase_invoice.account with curated `lookupColumns`
(name / industry / lifecycle / revenue), a `descriptionField`, and a
`lookupFilters` rule that hides churned accounts — a rep can't invoice a
churned customer. Demonstrates the new authoring surface end-to-end.
Pairs with objectui PR #1860 (renderer: auto-derive columns + i18n + accept
both key casings + apply lookupFilters in the popover).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercelBot commented Jun 21, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
specReadyReadyPreview, CommentJun 21, 2026 1:11pm

Request Review

@github-actions

github-actionsBot commented Jun 21, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

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

  • content/docs/concepts/architecture.mdx(via @objectstack/spec)
  • content/docs/concepts/cloud-artifact-api.mdx(via packages/spec)
  • content/docs/concepts/cluster-semantics.mdx(via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx(via packages/spec)
  • content/docs/concepts/implementation-status.mdx(via @objectstack/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 packages/spec)
  • content/docs/concepts/packages.mdx(via @objectstack/spec)
  • content/docs/concepts/setup-app.mdx(via @objectstack/spec)
  • content/docs/concepts/skills.mdx(via @objectstack/spec)
  • content/docs/concepts/webhook-delivery.mdx(via @objectstack/spec)
  • content/docs/getting-started/architecture.mdx(via @objectstack/spec)
  • content/docs/getting-started/cli.mdx(via @objectstack/spec)
  • content/docs/getting-started/core-concepts.mdx(via @objectstack/spec)
  • content/docs/getting-started/examples.mdx(via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx(via @objectstack/spec)
  • content/docs/guides/adding-a-metadata-type.mdx(via @objectstack/spec)
  • content/docs/guides/ai-capabilities.mdx(via @objectstack/spec)
  • content/docs/guides/airtable-dashboard-analysis.mdx(via @objectstack/spec)
  • content/docs/guides/analytics-datasets.mdx(via @objectstack/spec)
  • content/docs/guides/api-reference.mdx(via @objectstack/spec)
  • content/docs/guides/business-logic.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/backward-compatibility.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/error-catalog.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/field-type-gallery.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/field-validation-rules.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/permissions-matrix.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/protocol-diagram.mdx(via packages/spec)
  • content/docs/guides/cheatsheets/query-cheat-sheet.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/quick-reference.mdx(via @objectstack/spec)
  • content/docs/guides/client-sdk.mdx(via @objectstack/spec)
  • content/docs/guides/common-patterns.mdx(via @objectstack/spec)
  • content/docs/guides/contracts/auth-service.mdx(via packages/spec)
  • content/docs/guides/contracts/cache-service.mdx(via packages/spec)
  • content/docs/guides/contracts/data-engine.mdx(via @objectstack/spec)
  • content/docs/guides/contracts/index.mdx(via @objectstack/spec)
  • content/docs/guides/contracts/metadata-service.mdx(via packages/spec)
  • content/docs/guides/contracts/storage-service.mdx(via packages/spec)
  • content/docs/guides/data-modeling.mdx(via @objectstack/spec)
  • content/docs/guides/deployment-vercel.mdx(via @objectstack/spec)
  • content/docs/guides/driver-configuration.mdx(via @objectstack/spec)
  • content/docs/guides/error-handling-client.mdx(via @objectstack/spec)
  • content/docs/guides/error-handling-server.mdx(via @objectstack/spec)
  • content/docs/guides/formula.mdx(via @objectstack/spec)
  • content/docs/guides/hook-bodies.mdx(via packages/spec)
  • content/docs/guides/kernel-services.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/dashboard.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/field.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/flow.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/index.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/object.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/validation.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/workflow.mdx(via @objectstack/spec)
  • content/docs/guides/packages.mdx(via @objectstack/spec)
  • content/docs/guides/plugin-development.mdx(via @objectstack/spec)
  • content/docs/guides/plugins.mdx(via @objectstack/spec)
  • content/docs/guides/project-scoping.mdx(via @objectstack/spec)
  • content/docs/guides/public-forms.mdx(via @objectstack/spec)
  • content/docs/guides/runtime-services/email-service.mdx(via packages/spec)
  • content/docs/guides/runtime-services/index.mdx(via packages/spec)
  • content/docs/guides/runtime-services/queue-service.mdx(via packages/spec)
  • content/docs/guides/runtime-services/sharing-service.mdx(via packages/spec)
  • content/docs/guides/runtime-services/storage-service.mdx(via packages/spec)
  • content/docs/guides/security.mdx(via @objectstack/spec)
  • content/docs/guides/seed-data.mdx(via @objectstack/spec)
  • content/docs/guides/skills.mdx(via @objectstack/spec)
  • content/docs/guides/standards.mdx(via @objectstack/spec)
  • content/docs/guides/troubleshooting.mdx(via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/config-resolution.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/i18n-standard.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/lifecycle.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/plugin-spec.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/runtime-capabilities.mdx(via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx(via packages/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 packages/spec)
  • content/docs/protocol/objectui/record-alert.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx(via @objectstack/spec)
  • content/docs/releases/index.mdx(via @objectstack/spec)
  • content/docs/releases/v9.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.

The spec liveness gate requires every authorable FieldSchema property to be
classified. Mark displayField/descriptionField/lookupColumns/lookupPageSize/
lookupFilters/dependsOn as live (consumed by the objectui record picker, cited
as prose per the ledger convention) and sharpen the referenceFilters authorHint
to point at the structured lookupFilters key.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@xuyushun441-sys@os-zhuang
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(spec,showcase): lookup record-picker authoring metadata + demo - #2125

Merged
xuyushun441-sys merged 2 commits into
mainfrom
feat/lookup-picker-metadata
Jun 21, 2026
Merged

feat(spec,showcase): lookup record-picker authoring metadata + demo#2125
xuyushun441-sys merged 2 commits into
mainfrom
feat/lookup-picker-metadata

Conversation

@xuyushun441-sys

Copy link
Copy Markdown
Contributor

Why

The objectui record picker can render multi-column, scoped, and dependent lookup results, but FieldSchema exposed none of the authoring surface for it. Anything an author set (e.g. lookupColumns) was silently dropped by defineStack's Zod parse — so the picker always degraded to a single name column. This is the same class of gap the FieldSchema property-liveness audit flags (e.g. referenceFilters reaching the renderer under a different key, lookup_filters).

Companion to objectui #1860 (renderer: zero-config column derivation, i18n, accepts both key casings, applies lookupFilters in the popover).

Changes

spec — packages/spec/src/data/field.zod.ts
Add the forward record-picker props to the lookup / master_detail surface, all genuinely wired to the renderer:

  • displayField — candidate label field
  • descriptionField — secondary line in the popover
  • lookupColumns — curated picker table columns (auto-derived when omitted)
  • lookupPageSize — rows per page
  • lookupFilters — structured, picker-honoured scoping filters (the structured form of referenceFilters)
  • dependsOn — dependent / cascading lookups

They flow through Field.lookup() automatically via FieldInput. Tests assert the props survive FieldSchema.parse (the path defineStack uses) and that the builder carries them through.

showcase — examples/app-showcase

  • Account seed expanded 3 → 13 (varied industry / revenue / lifecycle incl. churned) so the picker exercises search, sort, pagination and scoping.
  • showcase_invoice.account configured with curated lookupColumns (name / industry / lifecycle / revenue), a descriptionField, and a lookupFilters rule hiding churned accounts — a rep can't invoice a churned customer.

Verification

  • packages/spec unit tests: 117 passed (incl. 2 new — props parse without being stripped; builder carries them through).
  • app-showcase typecheck: no errors in the changed files (invoice.object.ts, data/index.ts); remaining errors are pre-existing unbuilt-workspace-dep noise (connectors / objectql), unrelated to this change.
  • Renderer side proven live in feat(spec): model action-param translations (_actions.params) #1860 against this showcase.

The objectui record picker can present multi-column, scoped, dependent lookup
results, but FieldSchema exposed none of the authoring surface for it — so the
props were silently dropped by defineStack's Zod parse (cf. the FieldSchema
property-liveness audit, which flags referenceFilters reaching the renderer
under a different key). Authors had no supported way to curate or scope a picker.
spec (FieldSchema, packages/spec/src/data/field.zod.ts):
- Add forward record-picker props to the lookup/master_detail surface:
`displayField`, `descriptionField`, `lookupColumns`, `lookupPageSize`,
`lookupFilters` (structured, picker-honoured form of referenceFilters),
and `dependsOn` (dependent/cascading lookups). All are genuinely wired —
the objectui renderer reads them (camelCase + snake_case aliases). They flow
through Field.lookup() automatically via FieldInput.
- Tests: assert the props survive FieldSchema.parse (not stripped) and that
Field.lookup() carries them through.
showcase (examples/app-showcase):
- Expand the account seed from 3 → 13 (varied industry / revenue / lifecycle,
incl. churned) so the picker exercises search, sort, pagination and scoping.
- Configure showcase_invoice.account with curated `lookupColumns`
(name / industry / lifecycle / revenue), a `descriptionField`, and a
`lookupFilters` rule that hides churned accounts — a rep can't invoice a
churned customer. Demonstrates the new authoring surface end-to-end.
Pairs with objectui PR #1860 (renderer: auto-derive columns + i18n + accept
both key casings + apply lookupFilters in the popover).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercelBot commented Jun 21, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
specReadyReadyPreview, CommentJun 21, 2026 1:11pm

Request Review

@github-actions

github-actionsBot commented Jun 21, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

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

  • content/docs/concepts/architecture.mdx(via @objectstack/spec)
  • content/docs/concepts/cloud-artifact-api.mdx(via packages/spec)
  • content/docs/concepts/cluster-semantics.mdx(via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx(via packages/spec)
  • content/docs/concepts/implementation-status.mdx(via @objectstack/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 packages/spec)
  • content/docs/concepts/packages.mdx(via @objectstack/spec)
  • content/docs/concepts/setup-app.mdx(via @objectstack/spec)
  • content/docs/concepts/skills.mdx(via @objectstack/spec)
  • content/docs/concepts/webhook-delivery.mdx(via @objectstack/spec)
  • content/docs/getting-started/architecture.mdx(via @objectstack/spec)
  • content/docs/getting-started/cli.mdx(via @objectstack/spec)
  • content/docs/getting-started/core-concepts.mdx(via @objectstack/spec)
  • content/docs/getting-started/examples.mdx(via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx(via @objectstack/spec)
  • content/docs/guides/adding-a-metadata-type.mdx(via @objectstack/spec)
  • content/docs/guides/ai-capabilities.mdx(via @objectstack/spec)
  • content/docs/guides/airtable-dashboard-analysis.mdx(via @objectstack/spec)
  • content/docs/guides/analytics-datasets.mdx(via @objectstack/spec)
  • content/docs/guides/api-reference.mdx(via @objectstack/spec)
  • content/docs/guides/business-logic.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/backward-compatibility.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/error-catalog.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/field-type-gallery.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/field-validation-rules.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/permissions-matrix.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/protocol-diagram.mdx(via packages/spec)
  • content/docs/guides/cheatsheets/query-cheat-sheet.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/quick-reference.mdx(via @objectstack/spec)
  • content/docs/guides/client-sdk.mdx(via @objectstack/spec)
  • content/docs/guides/common-patterns.mdx(via @objectstack/spec)
  • content/docs/guides/contracts/auth-service.mdx(via packages/spec)
  • content/docs/guides/contracts/cache-service.mdx(via packages/spec)
  • content/docs/guides/contracts/data-engine.mdx(via @objectstack/spec)
  • content/docs/guides/contracts/index.mdx(via @objectstack/spec)
  • content/docs/guides/contracts/metadata-service.mdx(via packages/spec)
  • content/docs/guides/contracts/storage-service.mdx(via packages/spec)
  • content/docs/guides/data-modeling.mdx(via @objectstack/spec)
  • content/docs/guides/deployment-vercel.mdx(via @objectstack/spec)
  • content/docs/guides/driver-configuration.mdx(via @objectstack/spec)
  • content/docs/guides/error-handling-client.mdx(via @objectstack/spec)
  • content/docs/guides/error-handling-server.mdx(via @objectstack/spec)
  • content/docs/guides/formula.mdx(via @objectstack/spec)
  • content/docs/guides/hook-bodies.mdx(via packages/spec)
  • content/docs/guides/kernel-services.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/dashboard.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/field.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/flow.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/index.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/object.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/validation.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/workflow.mdx(via @objectstack/spec)
  • content/docs/guides/packages.mdx(via @objectstack/spec)
  • content/docs/guides/plugin-development.mdx(via @objectstack/spec)
  • content/docs/guides/plugins.mdx(via @objectstack/spec)
  • content/docs/guides/project-scoping.mdx(via @objectstack/spec)
  • content/docs/guides/public-forms.mdx(via @objectstack/spec)
  • content/docs/guides/runtime-services/email-service.mdx(via packages/spec)
  • content/docs/guides/runtime-services/index.mdx(via packages/spec)
  • content/docs/guides/runtime-services/queue-service.mdx(via packages/spec)
  • content/docs/guides/runtime-services/sharing-service.mdx(via packages/spec)
  • content/docs/guides/runtime-services/storage-service.mdx(via packages/spec)
  • content/docs/guides/security.mdx(via @objectstack/spec)
  • content/docs/guides/seed-data.mdx(via @objectstack/spec)
  • content/docs/guides/skills.mdx(via @objectstack/spec)
  • content/docs/guides/standards.mdx(via @objectstack/spec)
  • content/docs/guides/troubleshooting.mdx(via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/config-resolution.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/i18n-standard.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/lifecycle.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/plugin-spec.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/runtime-capabilities.mdx(via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx(via packages/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 packages/spec)
  • content/docs/protocol/objectui/record-alert.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx(via @objectstack/spec)
  • content/docs/releases/index.mdx(via @objectstack/spec)
  • content/docs/releases/v9.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.

The spec liveness gate requires every authorable FieldSchema property to be
classified. Mark displayField/descriptionField/lookupColumns/lookupPageSize/
lookupFilters/dependsOn as live (consumed by the objectui record picker, cited
as prose per the ledger convention) and sharpen the referenceFilters authorHint
to point at the structured lookupFilters key.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@xuyushun441-sys@os-zhuang
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(spec,showcase): lookup record-picker authoring metadata + demo - #2125

Merged
xuyushun441-sys merged 2 commits into
mainfrom
feat/lookup-picker-metadata
Jun 21, 2026
Merged

feat(spec,showcase): lookup record-picker authoring metadata + demo#2125
xuyushun441-sys merged 2 commits into
mainfrom
feat/lookup-picker-metadata

Conversation

@xuyushun441-sys

Copy link
Copy Markdown
Contributor

Why

The objectui record picker can render multi-column, scoped, and dependent lookup results, but FieldSchema exposed none of the authoring surface for it. Anything an author set (e.g. lookupColumns) was silently dropped by defineStack's Zod parse — so the picker always degraded to a single name column. This is the same class of gap the FieldSchema property-liveness audit flags (e.g. referenceFilters reaching the renderer under a different key, lookup_filters).

Companion to objectui #1860 (renderer: zero-config column derivation, i18n, accepts both key casings, applies lookupFilters in the popover).

Changes

spec — packages/spec/src/data/field.zod.ts
Add the forward record-picker props to the lookup / master_detail surface, all genuinely wired to the renderer:

  • displayField — candidate label field
  • descriptionField — secondary line in the popover
  • lookupColumns — curated picker table columns (auto-derived when omitted)
  • lookupPageSize — rows per page
  • lookupFilters — structured, picker-honoured scoping filters (the structured form of referenceFilters)
  • dependsOn — dependent / cascading lookups

They flow through Field.lookup() automatically via FieldInput. Tests assert the props survive FieldSchema.parse (the path defineStack uses) and that the builder carries them through.

showcase — examples/app-showcase

  • Account seed expanded 3 → 13 (varied industry / revenue / lifecycle incl. churned) so the picker exercises search, sort, pagination and scoping.
  • showcase_invoice.account configured with curated lookupColumns (name / industry / lifecycle / revenue), a descriptionField, and a lookupFilters rule hiding churned accounts — a rep can't invoice a churned customer.

Verification

  • packages/spec unit tests: 117 passed (incl. 2 new — props parse without being stripped; builder carries them through).
  • app-showcase typecheck: no errors in the changed files (invoice.object.ts, data/index.ts); remaining errors are pre-existing unbuilt-workspace-dep noise (connectors / objectql), unrelated to this change.
  • Renderer side proven live in feat(spec): model action-param translations (_actions.params) #1860 against this showcase.

The objectui record picker can present multi-column, scoped, dependent lookup
results, but FieldSchema exposed none of the authoring surface for it — so the
props were silently dropped by defineStack's Zod parse (cf. the FieldSchema
property-liveness audit, which flags referenceFilters reaching the renderer
under a different key). Authors had no supported way to curate or scope a picker.
spec (FieldSchema, packages/spec/src/data/field.zod.ts):
- Add forward record-picker props to the lookup/master_detail surface:
`displayField`, `descriptionField`, `lookupColumns`, `lookupPageSize`,
`lookupFilters` (structured, picker-honoured form of referenceFilters),
and `dependsOn` (dependent/cascading lookups). All are genuinely wired —
the objectui renderer reads them (camelCase + snake_case aliases). They flow
through Field.lookup() automatically via FieldInput.
- Tests: assert the props survive FieldSchema.parse (not stripped) and that
Field.lookup() carries them through.
showcase (examples/app-showcase):
- Expand the account seed from 3 → 13 (varied industry / revenue / lifecycle,
incl. churned) so the picker exercises search, sort, pagination and scoping.
- Configure showcase_invoice.account with curated `lookupColumns`
(name / industry / lifecycle / revenue), a `descriptionField`, and a
`lookupFilters` rule that hides churned accounts — a rep can't invoice a
churned customer. Demonstrates the new authoring surface end-to-end.
Pairs with objectui PR #1860 (renderer: auto-derive columns + i18n + accept
both key casings + apply lookupFilters in the popover).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercelBot commented Jun 21, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
specReadyReadyPreview, CommentJun 21, 2026 1:11pm

Request Review

@github-actions

github-actionsBot commented Jun 21, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

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

  • content/docs/concepts/architecture.mdx(via @objectstack/spec)
  • content/docs/concepts/cloud-artifact-api.mdx(via packages/spec)
  • content/docs/concepts/cluster-semantics.mdx(via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx(via packages/spec)
  • content/docs/concepts/implementation-status.mdx(via @objectstack/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 packages/spec)
  • content/docs/concepts/packages.mdx(via @objectstack/spec)
  • content/docs/concepts/setup-app.mdx(via @objectstack/spec)
  • content/docs/concepts/skills.mdx(via @objectstack/spec)
  • content/docs/concepts/webhook-delivery.mdx(via @objectstack/spec)
  • content/docs/getting-started/architecture.mdx(via @objectstack/spec)
  • content/docs/getting-started/cli.mdx(via @objectstack/spec)
  • content/docs/getting-started/core-concepts.mdx(via @objectstack/spec)
  • content/docs/getting-started/examples.mdx(via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx(via @objectstack/spec)
  • content/docs/guides/adding-a-metadata-type.mdx(via @objectstack/spec)
  • content/docs/guides/ai-capabilities.mdx(via @objectstack/spec)
  • content/docs/guides/airtable-dashboard-analysis.mdx(via @objectstack/spec)
  • content/docs/guides/analytics-datasets.mdx(via @objectstack/spec)
  • content/docs/guides/api-reference.mdx(via @objectstack/spec)
  • content/docs/guides/business-logic.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/backward-compatibility.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/error-catalog.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/field-type-gallery.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/field-validation-rules.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/permissions-matrix.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/protocol-diagram.mdx(via packages/spec)
  • content/docs/guides/cheatsheets/query-cheat-sheet.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/quick-reference.mdx(via @objectstack/spec)
  • content/docs/guides/client-sdk.mdx(via @objectstack/spec)
  • content/docs/guides/common-patterns.mdx(via @objectstack/spec)
  • content/docs/guides/contracts/auth-service.mdx(via packages/spec)
  • content/docs/guides/contracts/cache-service.mdx(via packages/spec)
  • content/docs/guides/contracts/data-engine.mdx(via @objectstack/spec)
  • content/docs/guides/contracts/index.mdx(via @objectstack/spec)
  • content/docs/guides/contracts/metadata-service.mdx(via packages/spec)
  • content/docs/guides/contracts/storage-service.mdx(via packages/spec)
  • content/docs/guides/data-modeling.mdx(via @objectstack/spec)
  • content/docs/guides/deployment-vercel.mdx(via @objectstack/spec)
  • content/docs/guides/driver-configuration.mdx(via @objectstack/spec)
  • content/docs/guides/error-handling-client.mdx(via @objectstack/spec)
  • content/docs/guides/error-handling-server.mdx(via @objectstack/spec)
  • content/docs/guides/formula.mdx(via @objectstack/spec)
  • content/docs/guides/hook-bodies.mdx(via packages/spec)
  • content/docs/guides/kernel-services.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/dashboard.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/field.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/flow.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/index.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/object.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/validation.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/workflow.mdx(via @objectstack/spec)
  • content/docs/guides/packages.mdx(via @objectstack/spec)
  • content/docs/guides/plugin-development.mdx(via @objectstack/spec)
  • content/docs/guides/plugins.mdx(via @objectstack/spec)
  • content/docs/guides/project-scoping.mdx(via @objectstack/spec)
  • content/docs/guides/public-forms.mdx(via @objectstack/spec)
  • content/docs/guides/runtime-services/email-service.mdx(via packages/spec)
  • content/docs/guides/runtime-services/index.mdx(via packages/spec)
  • content/docs/guides/runtime-services/queue-service.mdx(via packages/spec)
  • content/docs/guides/runtime-services/sharing-service.mdx(via packages/spec)
  • content/docs/guides/runtime-services/storage-service.mdx(via packages/spec)
  • content/docs/guides/security.mdx(via @objectstack/spec)
  • content/docs/guides/seed-data.mdx(via @objectstack/spec)
  • content/docs/guides/skills.mdx(via @objectstack/spec)
  • content/docs/guides/standards.mdx(via @objectstack/spec)
  • content/docs/guides/troubleshooting.mdx(via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/config-resolution.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/i18n-standard.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/lifecycle.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/plugin-spec.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/runtime-capabilities.mdx(via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx(via packages/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 packages/spec)
  • content/docs/protocol/objectui/record-alert.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx(via @objectstack/spec)
  • content/docs/releases/index.mdx(via @objectstack/spec)
  • content/docs/releases/v9.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.

The spec liveness gate requires every authorable FieldSchema property to be
classified. Mark displayField/descriptionField/lookupColumns/lookupPageSize/
lookupFilters/dependsOn as live (consumed by the objectui record picker, cited
as prose per the ledger convention) and sharpen the referenceFilters authorHint
to point at the structured lookupFilters key.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@xuyushun441-sys@os-zhuang
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat(spec,showcase): lookup record-picker authoring metadata + demo - #2125

Merged
xuyushun441-sys merged 2 commits into
mainfrom
feat/lookup-picker-metadata
Jun 21, 2026
Merged

feat(spec,showcase): lookup record-picker authoring metadata + demo#2125
xuyushun441-sys merged 2 commits into
mainfrom
feat/lookup-picker-metadata

Conversation

@xuyushun441-sys

Copy link
Copy Markdown
Contributor

Why

The objectui record picker can render multi-column, scoped, and dependent lookup results, but FieldSchema exposed none of the authoring surface for it. Anything an author set (e.g. lookupColumns) was silently dropped by defineStack's Zod parse — so the picker always degraded to a single name column. This is the same class of gap the FieldSchema property-liveness audit flags (e.g. referenceFilters reaching the renderer under a different key, lookup_filters).

Companion to objectui #1860 (renderer: zero-config column derivation, i18n, accepts both key casings, applies lookupFilters in the popover).

Changes

spec — packages/spec/src/data/field.zod.ts
Add the forward record-picker props to the lookup / master_detail surface, all genuinely wired to the renderer:

  • displayField — candidate label field
  • descriptionField — secondary line in the popover
  • lookupColumns — curated picker table columns (auto-derived when omitted)
  • lookupPageSize — rows per page
  • lookupFilters — structured, picker-honoured scoping filters (the structured form of referenceFilters)
  • dependsOn — dependent / cascading lookups

They flow through Field.lookup() automatically via FieldInput. Tests assert the props survive FieldSchema.parse (the path defineStack uses) and that the builder carries them through.

showcase — examples/app-showcase

  • Account seed expanded 3 → 13 (varied industry / revenue / lifecycle incl. churned) so the picker exercises search, sort, pagination and scoping.
  • showcase_invoice.account configured with curated lookupColumns (name / industry / lifecycle / revenue), a descriptionField, and a lookupFilters rule hiding churned accounts — a rep can't invoice a churned customer.

Verification

  • packages/spec unit tests: 117 passed (incl. 2 new — props parse without being stripped; builder carries them through).
  • app-showcase typecheck: no errors in the changed files (invoice.object.ts, data/index.ts); remaining errors are pre-existing unbuilt-workspace-dep noise (connectors / objectql), unrelated to this change.
  • Renderer side proven live in feat(spec): model action-param translations (_actions.params) #1860 against this showcase.

The objectui record picker can present multi-column, scoped, dependent lookup
results, but FieldSchema exposed none of the authoring surface for it — so the
props were silently dropped by defineStack's Zod parse (cf. the FieldSchema
property-liveness audit, which flags referenceFilters reaching the renderer
under a different key). Authors had no supported way to curate or scope a picker.
spec (FieldSchema, packages/spec/src/data/field.zod.ts):
- Add forward record-picker props to the lookup/master_detail surface:
`displayField`, `descriptionField`, `lookupColumns`, `lookupPageSize`,
`lookupFilters` (structured, picker-honoured form of referenceFilters),
and `dependsOn` (dependent/cascading lookups). All are genuinely wired —
the objectui renderer reads them (camelCase + snake_case aliases). They flow
through Field.lookup() automatically via FieldInput.
- Tests: assert the props survive FieldSchema.parse (not stripped) and that
Field.lookup() carries them through.
showcase (examples/app-showcase):
- Expand the account seed from 3 → 13 (varied industry / revenue / lifecycle,
incl. churned) so the picker exercises search, sort, pagination and scoping.
- Configure showcase_invoice.account with curated `lookupColumns`
(name / industry / lifecycle / revenue), a `descriptionField`, and a
`lookupFilters` rule that hides churned accounts — a rep can't invoice a
churned customer. Demonstrates the new authoring surface end-to-end.
Pairs with objectui PR #1860 (renderer: auto-derive columns + i18n + accept
both key casings + apply lookupFilters in the popover).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercelBot commented Jun 21, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
specReadyReadyPreview, CommentJun 21, 2026 1:11pm

Request Review

@github-actions

github-actionsBot commented Jun 21, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

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

  • content/docs/concepts/architecture.mdx(via @objectstack/spec)
  • content/docs/concepts/cloud-artifact-api.mdx(via packages/spec)
  • content/docs/concepts/cluster-semantics.mdx(via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx(via packages/spec)
  • content/docs/concepts/implementation-status.mdx(via @objectstack/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 packages/spec)
  • content/docs/concepts/packages.mdx(via @objectstack/spec)
  • content/docs/concepts/setup-app.mdx(via @objectstack/spec)
  • content/docs/concepts/skills.mdx(via @objectstack/spec)
  • content/docs/concepts/webhook-delivery.mdx(via @objectstack/spec)
  • content/docs/getting-started/architecture.mdx(via @objectstack/spec)
  • content/docs/getting-started/cli.mdx(via @objectstack/spec)
  • content/docs/getting-started/core-concepts.mdx(via @objectstack/spec)
  • content/docs/getting-started/examples.mdx(via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx(via @objectstack/spec)
  • content/docs/guides/adding-a-metadata-type.mdx(via @objectstack/spec)
  • content/docs/guides/ai-capabilities.mdx(via @objectstack/spec)
  • content/docs/guides/airtable-dashboard-analysis.mdx(via @objectstack/spec)
  • content/docs/guides/analytics-datasets.mdx(via @objectstack/spec)
  • content/docs/guides/api-reference.mdx(via @objectstack/spec)
  • content/docs/guides/business-logic.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/backward-compatibility.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/error-catalog.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/field-type-gallery.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/field-validation-rules.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/permissions-matrix.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/protocol-diagram.mdx(via packages/spec)
  • content/docs/guides/cheatsheets/query-cheat-sheet.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/quick-reference.mdx(via @objectstack/spec)
  • content/docs/guides/client-sdk.mdx(via @objectstack/spec)
  • content/docs/guides/common-patterns.mdx(via @objectstack/spec)
  • content/docs/guides/contracts/auth-service.mdx(via packages/spec)
  • content/docs/guides/contracts/cache-service.mdx(via packages/spec)
  • content/docs/guides/contracts/data-engine.mdx(via @objectstack/spec)
  • content/docs/guides/contracts/index.mdx(via @objectstack/spec)
  • content/docs/guides/contracts/metadata-service.mdx(via packages/spec)
  • content/docs/guides/contracts/storage-service.mdx(via packages/spec)
  • content/docs/guides/data-modeling.mdx(via @objectstack/spec)
  • content/docs/guides/deployment-vercel.mdx(via @objectstack/spec)
  • content/docs/guides/driver-configuration.mdx(via @objectstack/spec)
  • content/docs/guides/error-handling-client.mdx(via @objectstack/spec)
  • content/docs/guides/error-handling-server.mdx(via @objectstack/spec)
  • content/docs/guides/formula.mdx(via @objectstack/spec)
  • content/docs/guides/hook-bodies.mdx(via packages/spec)
  • content/docs/guides/kernel-services.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/dashboard.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/field.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/flow.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/index.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/object.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/validation.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/workflow.mdx(via @objectstack/spec)
  • content/docs/guides/packages.mdx(via @objectstack/spec)
  • content/docs/guides/plugin-development.mdx(via @objectstack/spec)
  • content/docs/guides/plugins.mdx(via @objectstack/spec)
  • content/docs/guides/project-scoping.mdx(via @objectstack/spec)
  • content/docs/guides/public-forms.mdx(via @objectstack/spec)
  • content/docs/guides/runtime-services/email-service.mdx(via packages/spec)
  • content/docs/guides/runtime-services/index.mdx(via packages/spec)
  • content/docs/guides/runtime-services/queue-service.mdx(via packages/spec)
  • content/docs/guides/runtime-services/sharing-service.mdx(via packages/spec)
  • content/docs/guides/runtime-services/storage-service.mdx(via packages/spec)
  • content/docs/guides/security.mdx(via @objectstack/spec)
  • content/docs/guides/seed-data.mdx(via @objectstack/spec)
  • content/docs/guides/skills.mdx(via @objectstack/spec)
  • content/docs/guides/standards.mdx(via @objectstack/spec)
  • content/docs/guides/troubleshooting.mdx(via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/config-resolution.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/i18n-standard.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/lifecycle.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/plugin-spec.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/runtime-capabilities.mdx(via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx(via packages/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 packages/spec)
  • content/docs/protocol/objectui/record-alert.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx(via @objectstack/spec)
  • content/docs/releases/index.mdx(via @objectstack/spec)
  • content/docs/releases/v9.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.

The spec liveness gate requires every authorable FieldSchema property to be
classified. Mark displayField/descriptionField/lookupColumns/lookupPageSize/
lookupFilters/dependsOn as live (consumed by the objectui record picker, cited
as prose per the ledger convention) and sharpen the referenceFilters authorHint
to point at the structured lookupFilters key.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@xuyushun441-sys@os-zhuang
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(spec,showcase): lookup record-picker authoring metadata + demo - #2125

Merged
xuyushun441-sys merged 2 commits into
mainfrom
feat/lookup-picker-metadata
Jun 21, 2026
Merged

feat(spec,showcase): lookup record-picker authoring metadata + demo#2125
xuyushun441-sys merged 2 commits into
mainfrom
feat/lookup-picker-metadata

Conversation

@xuyushun441-sys

Copy link
Copy Markdown
Contributor

Why

The objectui record picker can render multi-column, scoped, and dependent lookup results, but FieldSchema exposed none of the authoring surface for it. Anything an author set (e.g. lookupColumns) was silently dropped by defineStack's Zod parse — so the picker always degraded to a single name column. This is the same class of gap the FieldSchema property-liveness audit flags (e.g. referenceFilters reaching the renderer under a different key, lookup_filters).

Companion to objectui #1860 (renderer: zero-config column derivation, i18n, accepts both key casings, applies lookupFilters in the popover).

Changes

spec — packages/spec/src/data/field.zod.ts
Add the forward record-picker props to the lookup / master_detail surface, all genuinely wired to the renderer:

  • displayField — candidate label field
  • descriptionField — secondary line in the popover
  • lookupColumns — curated picker table columns (auto-derived when omitted)
  • lookupPageSize — rows per page
  • lookupFilters — structured, picker-honoured scoping filters (the structured form of referenceFilters)
  • dependsOn — dependent / cascading lookups

They flow through Field.lookup() automatically via FieldInput. Tests assert the props survive FieldSchema.parse (the path defineStack uses) and that the builder carries them through.

showcase — examples/app-showcase

  • Account seed expanded 3 → 13 (varied industry / revenue / lifecycle incl. churned) so the picker exercises search, sort, pagination and scoping.
  • showcase_invoice.account configured with curated lookupColumns (name / industry / lifecycle / revenue), a descriptionField, and a lookupFilters rule hiding churned accounts — a rep can't invoice a churned customer.

Verification

  • packages/spec unit tests: 117 passed (incl. 2 new — props parse without being stripped; builder carries them through).
  • app-showcase typecheck: no errors in the changed files (invoice.object.ts, data/index.ts); remaining errors are pre-existing unbuilt-workspace-dep noise (connectors / objectql), unrelated to this change.
  • Renderer side proven live in feat(spec): model action-param translations (_actions.params) #1860 against this showcase.

The objectui record picker can present multi-column, scoped, dependent lookup
results, but FieldSchema exposed none of the authoring surface for it — so the
props were silently dropped by defineStack's Zod parse (cf. the FieldSchema
property-liveness audit, which flags referenceFilters reaching the renderer
under a different key). Authors had no supported way to curate or scope a picker.
spec (FieldSchema, packages/spec/src/data/field.zod.ts):
- Add forward record-picker props to the lookup/master_detail surface:
`displayField`, `descriptionField`, `lookupColumns`, `lookupPageSize`,
`lookupFilters` (structured, picker-honoured form of referenceFilters),
and `dependsOn` (dependent/cascading lookups). All are genuinely wired —
the objectui renderer reads them (camelCase + snake_case aliases). They flow
through Field.lookup() automatically via FieldInput.
- Tests: assert the props survive FieldSchema.parse (not stripped) and that
Field.lookup() carries them through.
showcase (examples/app-showcase):
- Expand the account seed from 3 → 13 (varied industry / revenue / lifecycle,
incl. churned) so the picker exercises search, sort, pagination and scoping.
- Configure showcase_invoice.account with curated `lookupColumns`
(name / industry / lifecycle / revenue), a `descriptionField`, and a
`lookupFilters` rule that hides churned accounts — a rep can't invoice a
churned customer. Demonstrates the new authoring surface end-to-end.
Pairs with objectui PR #1860 (renderer: auto-derive columns + i18n + accept
both key casings + apply lookupFilters in the popover).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercelBot commented Jun 21, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
specReadyReadyPreview, CommentJun 21, 2026 1:11pm

Request Review

@github-actions

github-actionsBot commented Jun 21, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

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

  • content/docs/concepts/architecture.mdx(via @objectstack/spec)
  • content/docs/concepts/cloud-artifact-api.mdx(via packages/spec)
  • content/docs/concepts/cluster-semantics.mdx(via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx(via packages/spec)
  • content/docs/concepts/implementation-status.mdx(via @objectstack/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 packages/spec)
  • content/docs/concepts/packages.mdx(via @objectstack/spec)
  • content/docs/concepts/setup-app.mdx(via @objectstack/spec)
  • content/docs/concepts/skills.mdx(via @objectstack/spec)
  • content/docs/concepts/webhook-delivery.mdx(via @objectstack/spec)
  • content/docs/getting-started/architecture.mdx(via @objectstack/spec)
  • content/docs/getting-started/cli.mdx(via @objectstack/spec)
  • content/docs/getting-started/core-concepts.mdx(via @objectstack/spec)
  • content/docs/getting-started/examples.mdx(via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx(via @objectstack/spec)
  • content/docs/guides/adding-a-metadata-type.mdx(via @objectstack/spec)
  • content/docs/guides/ai-capabilities.mdx(via @objectstack/spec)
  • content/docs/guides/airtable-dashboard-analysis.mdx(via @objectstack/spec)
  • content/docs/guides/analytics-datasets.mdx(via @objectstack/spec)
  • content/docs/guides/api-reference.mdx(via @objectstack/spec)
  • content/docs/guides/business-logic.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/backward-compatibility.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/error-catalog.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/field-type-gallery.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/field-validation-rules.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/permissions-matrix.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/protocol-diagram.mdx(via packages/spec)
  • content/docs/guides/cheatsheets/query-cheat-sheet.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/quick-reference.mdx(via @objectstack/spec)
  • content/docs/guides/client-sdk.mdx(via @objectstack/spec)
  • content/docs/guides/common-patterns.mdx(via @objectstack/spec)
  • content/docs/guides/contracts/auth-service.mdx(via packages/spec)
  • content/docs/guides/contracts/cache-service.mdx(via packages/spec)
  • content/docs/guides/contracts/data-engine.mdx(via @objectstack/spec)
  • content/docs/guides/contracts/index.mdx(via @objectstack/spec)
  • content/docs/guides/contracts/metadata-service.mdx(via packages/spec)
  • content/docs/guides/contracts/storage-service.mdx(via packages/spec)
  • content/docs/guides/data-modeling.mdx(via @objectstack/spec)
  • content/docs/guides/deployment-vercel.mdx(via @objectstack/spec)
  • content/docs/guides/driver-configuration.mdx(via @objectstack/spec)
  • content/docs/guides/error-handling-client.mdx(via @objectstack/spec)
  • content/docs/guides/error-handling-server.mdx(via @objectstack/spec)
  • content/docs/guides/formula.mdx(via @objectstack/spec)
  • content/docs/guides/hook-bodies.mdx(via packages/spec)
  • content/docs/guides/kernel-services.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/dashboard.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/field.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/flow.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/index.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/object.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/validation.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/workflow.mdx(via @objectstack/spec)
  • content/docs/guides/packages.mdx(via @objectstack/spec)
  • content/docs/guides/plugin-development.mdx(via @objectstack/spec)
  • content/docs/guides/plugins.mdx(via @objectstack/spec)
  • content/docs/guides/project-scoping.mdx(via @objectstack/spec)
  • content/docs/guides/public-forms.mdx(via @objectstack/spec)
  • content/docs/guides/runtime-services/email-service.mdx(via packages/spec)
  • content/docs/guides/runtime-services/index.mdx(via packages/spec)
  • content/docs/guides/runtime-services/queue-service.mdx(via packages/spec)
  • content/docs/guides/runtime-services/sharing-service.mdx(via packages/spec)
  • content/docs/guides/runtime-services/storage-service.mdx(via packages/spec)
  • content/docs/guides/security.mdx(via @objectstack/spec)
  • content/docs/guides/seed-data.mdx(via @objectstack/spec)
  • content/docs/guides/skills.mdx(via @objectstack/spec)
  • content/docs/guides/standards.mdx(via @objectstack/spec)
  • content/docs/guides/troubleshooting.mdx(via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/config-resolution.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/i18n-standard.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/lifecycle.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/plugin-spec.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/runtime-capabilities.mdx(via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx(via packages/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 packages/spec)
  • content/docs/protocol/objectui/record-alert.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx(via @objectstack/spec)
  • content/docs/releases/index.mdx(via @objectstack/spec)
  • content/docs/releases/v9.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.

The spec liveness gate requires every authorable FieldSchema property to be
classified. Mark displayField/descriptionField/lookupColumns/lookupPageSize/
lookupFilters/dependsOn as live (consumed by the objectui record picker, cited
as prose per the ledger convention) and sharpen the referenceFilters authorHint
to point at the structured lookupFilters key.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@xuyushun441-sys@os-zhuang
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(spec,showcase): lookup record-picker authoring metadata + demo - #2125

Merged
xuyushun441-sys merged 2 commits into
mainfrom
feat/lookup-picker-metadata
Jun 21, 2026
Merged

feat(spec,showcase): lookup record-picker authoring metadata + demo#2125
xuyushun441-sys merged 2 commits into
mainfrom
feat/lookup-picker-metadata

Conversation

@xuyushun441-sys

Copy link
Copy Markdown
Contributor

Why

The objectui record picker can render multi-column, scoped, and dependent lookup results, but FieldSchema exposed none of the authoring surface for it. Anything an author set (e.g. lookupColumns) was silently dropped by defineStack's Zod parse — so the picker always degraded to a single name column. This is the same class of gap the FieldSchema property-liveness audit flags (e.g. referenceFilters reaching the renderer under a different key, lookup_filters).

Companion to objectui #1860 (renderer: zero-config column derivation, i18n, accepts both key casings, applies lookupFilters in the popover).

Changes

spec — packages/spec/src/data/field.zod.ts
Add the forward record-picker props to the lookup / master_detail surface, all genuinely wired to the renderer:

  • displayField — candidate label field
  • descriptionField — secondary line in the popover
  • lookupColumns — curated picker table columns (auto-derived when omitted)
  • lookupPageSize — rows per page
  • lookupFilters — structured, picker-honoured scoping filters (the structured form of referenceFilters)
  • dependsOn — dependent / cascading lookups

They flow through Field.lookup() automatically via FieldInput. Tests assert the props survive FieldSchema.parse (the path defineStack uses) and that the builder carries them through.

showcase — examples/app-showcase

  • Account seed expanded 3 → 13 (varied industry / revenue / lifecycle incl. churned) so the picker exercises search, sort, pagination and scoping.
  • showcase_invoice.account configured with curated lookupColumns (name / industry / lifecycle / revenue), a descriptionField, and a lookupFilters rule hiding churned accounts — a rep can't invoice a churned customer.

Verification

  • packages/spec unit tests: 117 passed (incl. 2 new — props parse without being stripped; builder carries them through).
  • app-showcase typecheck: no errors in the changed files (invoice.object.ts, data/index.ts); remaining errors are pre-existing unbuilt-workspace-dep noise (connectors / objectql), unrelated to this change.
  • Renderer side proven live in feat(spec): model action-param translations (_actions.params) #1860 against this showcase.

The objectui record picker can present multi-column, scoped, dependent lookup
results, but FieldSchema exposed none of the authoring surface for it — so the
props were silently dropped by defineStack's Zod parse (cf. the FieldSchema
property-liveness audit, which flags referenceFilters reaching the renderer
under a different key). Authors had no supported way to curate or scope a picker.
spec (FieldSchema, packages/spec/src/data/field.zod.ts):
- Add forward record-picker props to the lookup/master_detail surface:
`displayField`, `descriptionField`, `lookupColumns`, `lookupPageSize`,
`lookupFilters` (structured, picker-honoured form of referenceFilters),
and `dependsOn` (dependent/cascading lookups). All are genuinely wired —
the objectui renderer reads them (camelCase + snake_case aliases). They flow
through Field.lookup() automatically via FieldInput.
- Tests: assert the props survive FieldSchema.parse (not stripped) and that
Field.lookup() carries them through.
showcase (examples/app-showcase):
- Expand the account seed from 3 → 13 (varied industry / revenue / lifecycle,
incl. churned) so the picker exercises search, sort, pagination and scoping.
- Configure showcase_invoice.account with curated `lookupColumns`
(name / industry / lifecycle / revenue), a `descriptionField`, and a
`lookupFilters` rule that hides churned accounts — a rep can't invoice a
churned customer. Demonstrates the new authoring surface end-to-end.
Pairs with objectui PR #1860 (renderer: auto-derive columns + i18n + accept
both key casings + apply lookupFilters in the popover).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercelBot commented Jun 21, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
specReadyReadyPreview, CommentJun 21, 2026 1:11pm

Request Review

@github-actions

github-actionsBot commented Jun 21, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

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

  • content/docs/concepts/architecture.mdx(via @objectstack/spec)
  • content/docs/concepts/cloud-artifact-api.mdx(via packages/spec)
  • content/docs/concepts/cluster-semantics.mdx(via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx(via packages/spec)
  • content/docs/concepts/implementation-status.mdx(via @objectstack/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 packages/spec)
  • content/docs/concepts/packages.mdx(via @objectstack/spec)
  • content/docs/concepts/setup-app.mdx(via @objectstack/spec)
  • content/docs/concepts/skills.mdx(via @objectstack/spec)
  • content/docs/concepts/webhook-delivery.mdx(via @objectstack/spec)
  • content/docs/getting-started/architecture.mdx(via @objectstack/spec)
  • content/docs/getting-started/cli.mdx(via @objectstack/spec)
  • content/docs/getting-started/core-concepts.mdx(via @objectstack/spec)
  • content/docs/getting-started/examples.mdx(via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx(via @objectstack/spec)
  • content/docs/guides/adding-a-metadata-type.mdx(via @objectstack/spec)
  • content/docs/guides/ai-capabilities.mdx(via @objectstack/spec)
  • content/docs/guides/airtable-dashboard-analysis.mdx(via @objectstack/spec)
  • content/docs/guides/analytics-datasets.mdx(via @objectstack/spec)
  • content/docs/guides/api-reference.mdx(via @objectstack/spec)
  • content/docs/guides/business-logic.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/backward-compatibility.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/error-catalog.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/field-type-gallery.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/field-validation-rules.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/permissions-matrix.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/protocol-diagram.mdx(via packages/spec)
  • content/docs/guides/cheatsheets/query-cheat-sheet.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/quick-reference.mdx(via @objectstack/spec)
  • content/docs/guides/client-sdk.mdx(via @objectstack/spec)
  • content/docs/guides/common-patterns.mdx(via @objectstack/spec)
  • content/docs/guides/contracts/auth-service.mdx(via packages/spec)
  • content/docs/guides/contracts/cache-service.mdx(via packages/spec)
  • content/docs/guides/contracts/data-engine.mdx(via @objectstack/spec)
  • content/docs/guides/contracts/index.mdx(via @objectstack/spec)
  • content/docs/guides/contracts/metadata-service.mdx(via packages/spec)
  • content/docs/guides/contracts/storage-service.mdx(via packages/spec)
  • content/docs/guides/data-modeling.mdx(via @objectstack/spec)
  • content/docs/guides/deployment-vercel.mdx(via @objectstack/spec)
  • content/docs/guides/driver-configuration.mdx(via @objectstack/spec)
  • content/docs/guides/error-handling-client.mdx(via @objectstack/spec)
  • content/docs/guides/error-handling-server.mdx(via @objectstack/spec)
  • content/docs/guides/formula.mdx(via @objectstack/spec)
  • content/docs/guides/hook-bodies.mdx(via packages/spec)
  • content/docs/guides/kernel-services.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/dashboard.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/field.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/flow.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/index.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/object.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/validation.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/workflow.mdx(via @objectstack/spec)
  • content/docs/guides/packages.mdx(via @objectstack/spec)
  • content/docs/guides/plugin-development.mdx(via @objectstack/spec)
  • content/docs/guides/plugins.mdx(via @objectstack/spec)
  • content/docs/guides/project-scoping.mdx(via @objectstack/spec)
  • content/docs/guides/public-forms.mdx(via @objectstack/spec)
  • content/docs/guides/runtime-services/email-service.mdx(via packages/spec)
  • content/docs/guides/runtime-services/index.mdx(via packages/spec)
  • content/docs/guides/runtime-services/queue-service.mdx(via packages/spec)
  • content/docs/guides/runtime-services/sharing-service.mdx(via packages/spec)
  • content/docs/guides/runtime-services/storage-service.mdx(via packages/spec)
  • content/docs/guides/security.mdx(via @objectstack/spec)
  • content/docs/guides/seed-data.mdx(via @objectstack/spec)
  • content/docs/guides/skills.mdx(via @objectstack/spec)
  • content/docs/guides/standards.mdx(via @objectstack/spec)
  • content/docs/guides/troubleshooting.mdx(via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/config-resolution.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/i18n-standard.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/lifecycle.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/plugin-spec.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/runtime-capabilities.mdx(via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx(via packages/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 packages/spec)
  • content/docs/protocol/objectui/record-alert.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx(via @objectstack/spec)
  • content/docs/releases/index.mdx(via @objectstack/spec)
  • content/docs/releases/v9.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.

The spec liveness gate requires every authorable FieldSchema property to be
classified. Mark displayField/descriptionField/lookupColumns/lookupPageSize/
lookupFilters/dependsOn as live (consumed by the objectui record picker, cited
as prose per the ledger convention) and sharpen the referenceFilters authorHint
to point at the structured lookupFilters key.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@xuyushun441-sys@os-zhuang
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat(spec,showcase): lookup record-picker authoring metadata + demo - #2125

Merged
xuyushun441-sys merged 2 commits into
mainfrom
feat/lookup-picker-metadata
Jun 21, 2026
Merged

feat(spec,showcase): lookup record-picker authoring metadata + demo#2125
xuyushun441-sys merged 2 commits into
mainfrom
feat/lookup-picker-metadata

Conversation

@xuyushun441-sys

Copy link
Copy Markdown
Contributor

Why

The objectui record picker can render multi-column, scoped, and dependent lookup results, but FieldSchema exposed none of the authoring surface for it. Anything an author set (e.g. lookupColumns) was silently dropped by defineStack's Zod parse — so the picker always degraded to a single name column. This is the same class of gap the FieldSchema property-liveness audit flags (e.g. referenceFilters reaching the renderer under a different key, lookup_filters).

Companion to objectui #1860 (renderer: zero-config column derivation, i18n, accepts both key casings, applies lookupFilters in the popover).

Changes

spec — packages/spec/src/data/field.zod.ts
Add the forward record-picker props to the lookup / master_detail surface, all genuinely wired to the renderer:

  • displayField — candidate label field
  • descriptionField — secondary line in the popover
  • lookupColumns — curated picker table columns (auto-derived when omitted)
  • lookupPageSize — rows per page
  • lookupFilters — structured, picker-honoured scoping filters (the structured form of referenceFilters)
  • dependsOn — dependent / cascading lookups

They flow through Field.lookup() automatically via FieldInput. Tests assert the props survive FieldSchema.parse (the path defineStack uses) and that the builder carries them through.

showcase — examples/app-showcase

  • Account seed expanded 3 → 13 (varied industry / revenue / lifecycle incl. churned) so the picker exercises search, sort, pagination and scoping.
  • showcase_invoice.account configured with curated lookupColumns (name / industry / lifecycle / revenue), a descriptionField, and a lookupFilters rule hiding churned accounts — a rep can't invoice a churned customer.

Verification

  • packages/spec unit tests: 117 passed (incl. 2 new — props parse without being stripped; builder carries them through).
  • app-showcase typecheck: no errors in the changed files (invoice.object.ts, data/index.ts); remaining errors are pre-existing unbuilt-workspace-dep noise (connectors / objectql), unrelated to this change.
  • Renderer side proven live in feat(spec): model action-param translations (_actions.params) #1860 against this showcase.

The objectui record picker can present multi-column, scoped, dependent lookup
results, but FieldSchema exposed none of the authoring surface for it — so the
props were silently dropped by defineStack's Zod parse (cf. the FieldSchema
property-liveness audit, which flags referenceFilters reaching the renderer
under a different key). Authors had no supported way to curate or scope a picker.
spec (FieldSchema, packages/spec/src/data/field.zod.ts):
- Add forward record-picker props to the lookup/master_detail surface:
`displayField`, `descriptionField`, `lookupColumns`, `lookupPageSize`,
`lookupFilters` (structured, picker-honoured form of referenceFilters),
and `dependsOn` (dependent/cascading lookups). All are genuinely wired —
the objectui renderer reads them (camelCase + snake_case aliases). They flow
through Field.lookup() automatically via FieldInput.
- Tests: assert the props survive FieldSchema.parse (not stripped) and that
Field.lookup() carries them through.
showcase (examples/app-showcase):
- Expand the account seed from 3 → 13 (varied industry / revenue / lifecycle,
incl. churned) so the picker exercises search, sort, pagination and scoping.
- Configure showcase_invoice.account with curated `lookupColumns`
(name / industry / lifecycle / revenue), a `descriptionField`, and a
`lookupFilters` rule that hides churned accounts — a rep can't invoice a
churned customer. Demonstrates the new authoring surface end-to-end.
Pairs with objectui PR #1860 (renderer: auto-derive columns + i18n + accept
both key casings + apply lookupFilters in the popover).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercelBot commented Jun 21, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
specReadyReadyPreview, CommentJun 21, 2026 1:11pm

Request Review

@github-actions

github-actionsBot commented Jun 21, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

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

  • content/docs/concepts/architecture.mdx(via @objectstack/spec)
  • content/docs/concepts/cloud-artifact-api.mdx(via packages/spec)
  • content/docs/concepts/cluster-semantics.mdx(via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx(via packages/spec)
  • content/docs/concepts/implementation-status.mdx(via @objectstack/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 packages/spec)
  • content/docs/concepts/packages.mdx(via @objectstack/spec)
  • content/docs/concepts/setup-app.mdx(via @objectstack/spec)
  • content/docs/concepts/skills.mdx(via @objectstack/spec)
  • content/docs/concepts/webhook-delivery.mdx(via @objectstack/spec)
  • content/docs/getting-started/architecture.mdx(via @objectstack/spec)
  • content/docs/getting-started/cli.mdx(via @objectstack/spec)
  • content/docs/getting-started/core-concepts.mdx(via @objectstack/spec)
  • content/docs/getting-started/examples.mdx(via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx(via @objectstack/spec)
  • content/docs/guides/adding-a-metadata-type.mdx(via @objectstack/spec)
  • content/docs/guides/ai-capabilities.mdx(via @objectstack/spec)
  • content/docs/guides/airtable-dashboard-analysis.mdx(via @objectstack/spec)
  • content/docs/guides/analytics-datasets.mdx(via @objectstack/spec)
  • content/docs/guides/api-reference.mdx(via @objectstack/spec)
  • content/docs/guides/business-logic.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/backward-compatibility.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/error-catalog.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/field-type-gallery.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/field-validation-rules.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/permissions-matrix.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/protocol-diagram.mdx(via packages/spec)
  • content/docs/guides/cheatsheets/query-cheat-sheet.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/quick-reference.mdx(via @objectstack/spec)
  • content/docs/guides/client-sdk.mdx(via @objectstack/spec)
  • content/docs/guides/common-patterns.mdx(via @objectstack/spec)
  • content/docs/guides/contracts/auth-service.mdx(via packages/spec)
  • content/docs/guides/contracts/cache-service.mdx(via packages/spec)
  • content/docs/guides/contracts/data-engine.mdx(via @objectstack/spec)
  • content/docs/guides/contracts/index.mdx(via @objectstack/spec)
  • content/docs/guides/contracts/metadata-service.mdx(via packages/spec)
  • content/docs/guides/contracts/storage-service.mdx(via packages/spec)
  • content/docs/guides/data-modeling.mdx(via @objectstack/spec)
  • content/docs/guides/deployment-vercel.mdx(via @objectstack/spec)
  • content/docs/guides/driver-configuration.mdx(via @objectstack/spec)
  • content/docs/guides/error-handling-client.mdx(via @objectstack/spec)
  • content/docs/guides/error-handling-server.mdx(via @objectstack/spec)
  • content/docs/guides/formula.mdx(via @objectstack/spec)
  • content/docs/guides/hook-bodies.mdx(via packages/spec)
  • content/docs/guides/kernel-services.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/dashboard.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/field.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/flow.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/index.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/object.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/validation.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/workflow.mdx(via @objectstack/spec)
  • content/docs/guides/packages.mdx(via @objectstack/spec)
  • content/docs/guides/plugin-development.mdx(via @objectstack/spec)
  • content/docs/guides/plugins.mdx(via @objectstack/spec)
  • content/docs/guides/project-scoping.mdx(via @objectstack/spec)
  • content/docs/guides/public-forms.mdx(via @objectstack/spec)
  • content/docs/guides/runtime-services/email-service.mdx(via packages/spec)
  • content/docs/guides/runtime-services/index.mdx(via packages/spec)
  • content/docs/guides/runtime-services/queue-service.mdx(via packages/spec)
  • content/docs/guides/runtime-services/sharing-service.mdx(via packages/spec)
  • content/docs/guides/runtime-services/storage-service.mdx(via packages/spec)
  • content/docs/guides/security.mdx(via @objectstack/spec)
  • content/docs/guides/seed-data.mdx(via @objectstack/spec)
  • content/docs/guides/skills.mdx(via @objectstack/spec)
  • content/docs/guides/standards.mdx(via @objectstack/spec)
  • content/docs/guides/troubleshooting.mdx(via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/config-resolution.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/i18n-standard.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/lifecycle.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/plugin-spec.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/runtime-capabilities.mdx(via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx(via packages/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 packages/spec)
  • content/docs/protocol/objectui/record-alert.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx(via @objectstack/spec)
  • content/docs/releases/index.mdx(via @objectstack/spec)
  • content/docs/releases/v9.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.

The spec liveness gate requires every authorable FieldSchema property to be
classified. Mark displayField/descriptionField/lookupColumns/lookupPageSize/
lookupFilters/dependsOn as live (consumed by the objectui record picker, cited
as prose per the ledger convention) and sharpen the referenceFilters authorHint
to point at the structured lookupFilters key.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@xuyushun441-sys@os-zhuang