Skip to content

feat(spec): field-level relatedListFilter — declarative default filter for auto-derived related lists - #8955

Merged
os-project-manager merged 3 commits into
mainfrom
claude/issue-8704-related-list-filter
Aug 16, 2026
Merged

feat(spec): field-level relatedListFilter — declarative default filter for auto-derived related lists#8955
os-project-manager merged 3 commits into
mainfrom
claude/issue-8704-related-list-filter

Conversation

@os-project-manager

@os-project-manageros-project-manager commented Aug 16, 2026

Copy link
Copy Markdown
Collaborator

Fixes#8704

Spec half only, implementing the maintainer ruling (2026-08-15, comment 5299772379, 「接受全部建议。」 item 3) under its four binding conditions. The objectui consumption half (RecordDetailView auto-derivation + tab badge) is objectstack-ai/objectui#4664, Blocked-by: this card — untouched here by design.

What changed

Ruling conditions — how each is discharged (measured, not assumed)

① Reuse the existing declarative filter schema — no new dialect. Two existing dialects were candidates; measured both:

② Semantics in the contract. Measured where the auto-derivation contract lives: wholly objectui-side (packages/app-shell/src/utils/deriveRelatedLists.ts + RecordDetailView.tsx, per the liveness ledger's own evidence for the existing three keys). Spec carries no related-list descriptor schema (component.zod.ts's RecordRelatedListProps is the hand-authored component; view.zod.ts's subforms is the write-side form). So the spec-enforceable artifacts are: the normative describe()/JSDoc (both clauses stated as contract, binding on every consumer of the derived descriptor) plus a contract-text pin keeping them there. The behavioural badge-parity enforcement lands with objectui#4664's acceptance criteria — stated explicitly here per the dispatch's contingency.

③ objectui half not this card — confirmed filed as objectui#4664; nothing in ../objectui touched.

④ 17.x minor — pure accept-set widening, Feature class, ordinary minor changeset, no BREAKING annotation, no ADR-0087 registry entry (widening has no conversion/retirement obligation — checked against the registry precedents: entries exist for removals/renames/behavioural refusals, none for additive optional keys).

Additional measurements

  • Field-type gating: the existing three keys are NOT schema-gated to lookup/master_detail (optional keys on the flat FieldSchema, scope stated in JSDoc only — no superRefine). The fourth is gated identically (i.e. not), keeping the family symmetric.
  • Lint surface list: the shared walk recognises filter positions by KEY (filter/filters/runtimeFilter); relatedListFilter is the first member not spelled filter (family naming wins on the field surface), so the walk misses it without the FILTER_KEYS addition — measured, then closed class-wide via the shared set rather than per-rule.
  • Fixture radius: no fixture anywhere spells relatedListFilter yet (new key); example apps and platform-objects author only the existing three keys — no re-spelling needed.

Verification — union run at head 3bc19f0 (git rev-parse --short HEAD from the run itself)

  • packages/spec: 406 test files / 10725 tests passed; typecheck green (incl. check:test-typecheck self-test).
  • packages/lint: 73 files / 2047 tests passed (incl. the 2 new position pins); typecheck green.
  • pnpm --filter @objectstack/spec check:generated: all 13 artifact gates green at head (authorable-surface, api-surface, export-origins, docs, liveness, migration-registry, spec-changes, upgrade-guide, skill-docs/refs, react-blocks, strictness-ledger, test-typecheck).
  • Consumer suites: @objectstack/metadata 603, metadata-protocol 1512, metadata-core 162, metadata-fs 51 — all passed. Example apps validate ×3 (app-crm, app-showcase, app-todo): exit 0 (pre-existing warnings only).
  • Gate set re-derived from actual changed paths (node scripts/pm/dispatch-gates.mjs …): all 15 derived path gates PASS (check:changeset-gate-self-tests, check:cross-package-test-inputs ×2 spellings, check:doc-formula-expressions, check:docs-audit-scope, check:merge-driver, check:objectui-changeset, check:quick-reference-counts, check:role-word, check:spec-parsed-alias, check:type-source-resolution, check-adr-0087-registration, check-changeset-no-major, check-dev-prereqs after full workspace build, check-empty-changeset) plus convention gates for new test files (check:query-options-erasure, check:type-check-coverage, check:type-check-debt --re-measure on the built closure) and check:nul-bytes. The derivation added nothing beyond the dispatch prompt's named families except the docs/changeset path gates listed above, all green.

Generated by Claude Code

…r for auto-derived related lists (#8704)
Adds the fourth member of the field-level related-list family, reusing the
canonical Query-DSL FilterConditionSchema (no new dialect) so the FILTER-axis
doors apply automatically: the #8793 bare-preset schema door is pinned at the
new position, and the engine doors judge the composed query at run time.
Contract (maintainer ruling 2026-08-15, item 3): AND-composed with
{ [referenceField]: parentId }, never user-editable; tab badge count honors
the same composed filter (parity pinned as normative contract text).
Lint: FILTER_KEYS gains relatedListFilter so the token / empty-combinator /
preset-comparand rules reach the new position.
Ledger: planned + authorWarn until objectui#4664 (consumption half) lands.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Fgvh1iEJfxetei7aNVdtJt
@vercel

vercelBot commented Aug 16, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectstackIgnoredIgnoredAug 16, 2026 2:47am

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

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

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

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

  • content/docs/releases/implementation-status.mdx(via @objectstack/spec)
  • content/docs/releases/index.mdx(via @objectstack/spec)
  • content/docs/releases/v12.mdx(via @objectstack/spec)
  • content/docs/releases/v13.mdx(via @objectstack/spec)
  • content/docs/releases/v16.mdx(via @objectstack/spec)
  • content/docs/releases/v17.mdx(via @objectstack/lint, @objectstack/spec)
  • content/docs/releases/v9.mdx(via @objectstack/spec)

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

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationprotocol:datasize/mteststooling

Projects

None yet

2 participants

@os-project-manager@claude