Skip to content

feat(spec): retire the element:filter element at element grain (#9220, ADR-0049) - #9250

Merged
os-steve merged 4 commits into
mainfrom
claude/issue-9220-element-filter-adr0049
Aug 17, 2026
Merged

feat(spec): retire the element:filter element at element grain (#9220, ADR-0049)#9250
os-steve merged 4 commits into
mainfrom
claude/issue-9220-element-filter-adr0049

Conversation

@os-steve

Copy link
Copy Markdown
Collaborator

Fixes #9220

Verdict first (measurement-first card — recorded on the issue before any removal work)

DEAD at element grain. Full table in the measurement comment. Summary: at objectstack 2f65b1b42 and objectui 5ffcc14 (read-only sweep), no renderer or behavior reader of element:filter exists anywhere — objectui's only hits are a stale comment (renderers/basic/elements.tsx:18) and a PALETTE_EXCLUSIONS entry, i.e. Studio deliberately does NOT offer the element and records "no renderer" as the reason, answering the dispatch's palette question in the inverse direction. The 2026-06 page-liveness audit (docs/audits/2026-06-pageschema-property-liveness.md) had already recorded it rendering "Unknown component type". Cloud was not reachable from this session: the cloud half of the verdict relies on the card's recorded sweep (taken at objectui 372d9f9b4) and the triage 04:44Z re-verification, not on a fresh reading.

What this PR does (the #9198 / PR #9221 precedent, one grain wider)

Verification (all at final head bd4495c0d unless noted)

  • pnpm --filter @objectstack/spec test: 407 files / 10848 tests passed at a75d602d6; git diff a75d602d6..bd4495c0d -- packages/spec is empty, so the result stands for this head byte-identically.
  • pnpm --filter @objectstack/lint test: 2065 passed (was 2064 passed / 1 failed before the residue drop — that red run is the gate demanding the lint edit).
  • Reverse verification (from the committed state): restoring the OLD element:filter negative control turned conversions.test.ts red exactly as predicted — the new conversion strips the control to properties: {}, failing the fixture-equality assertion — proving the flip was load-bearing; restored and green (164/164).
  • turbo run build full workspace closure: 70/70. turbo run typecheck --filter='...@objectstack/spec' (spec + downstream consumers, prefix filter): 125/125 — the tombstones' never typing swept every authoring site clean.
  • check:generated: all 13 artifacts up to date. Light union all PASS: merge-driver, spec-parsed-alias, type-source-resolution, objectui-changeset, quick-reference-counts, role-word, adr-0087-registration, changeset-no-major, cross-package-test-inputs, empty-changeset, dev-prereqs, docs-audit affected-docs, nul-bytes, query-options-erasure, engine-double-contract, where-matcher, type-check-coverage, variant-docs, empty-state, skill-examples. check:type-check-debt --re-measure: 33 entries, no surplus.

Cross-repo follow-ups (for the PM to file; objectui deliberately not edited)

Out-of-scope finding filed unassigned: #9249 (element:form declares a full form contract; same no-renderer shape measured during this card's sweep — needs its own verdict measurement). #6590's element:filter half is mooted by this retirement; its element:form half stands.


Generated by Claude Code

claude added 2 commits August 17, 2026 05:53
… ADR-0049)

No renderer or reader for element:filter exists in any repo (objectui registers
none; Studio's palette lists it as a no-renderer exclusion; the 2026-06 audit
recorded it rendering 'Unknown component type'). All six authorable keys are
retiredKey() tombstones; the ComponentPropsMap row stays so the #5068 props
gate keeps refusing loudly; the PageComponentType enum entry is removed
(de-advertisement — the open string arm makes it parse-neutral). D2 conversion
element-filter-removed (protocol 18) strips the keys from old sources; the
#9198 conversion's negative-control fixture moves to an open-union custom type
(pre-registered flip). Pin tests, regenerated baselines/docs, minor changeset
per the post-17.0.0 launch-window convention.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Fs18A2DdXLVN2h8PaaFBcP
#9220)

The package's own component-field-specs-liveness gate (#6629) refuses entries
naming retired keys; the element-grain tombstones turned it red with the exact
prescription to drop the entry. Patch changeset for @objectstack/lint.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Fs18A2DdXLVN2h8PaaFBcP
claude added 2 commits August 17, 2026 06:40
…al clear)

Merge of origin/main (2abb66b) into the #9220 branch; regenerated
gen:schema + gen:docs + gen:openapi from the merged tree per
scripts/pm/os-regen-merge.sh step 4. Survival asserted: step-18 block,
six ElementFilterProps retired-keys entries, element-filter-removed
conversion, fixture control, and the reference pages under the merged
(#9239) generator.

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

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

1 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:

  • content/docs/ui/pages.mdx (via PageComponentType (symbol))

1 release-owned page(s) also name something this change touched. These are read-only:

  • content/docs/releases/v17.mdx (via ComponentPropsMap (symbol))

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.

What this run could not see
  • 8 changed file(s) yielded no anchor (packages/spec/authorable-defaults/ui.json, packages/spec/authorable-surface/ui.json, packages/spec/src/migrations/entries/retired-keys/18.ui__ElementFilterProps__aria.ts, …) — pages documenting those are invisible to this run
  • 5 name(s) were too generic to anchor anything (single lowercase words)

Coarse fallback — 113 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json origin/mainpackageMentionDocs.

Advisory only, and a precision-first one (#9192): a page is listed because it names a
symbol, wire route or SDK method this diff touched — not because it mentions a changed
package. Each row says which anchor put it there, so a wrong row is reportable rather than
merely annoying. 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 free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/l tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ADR-0049 candidate: element:filter declares targetVariable (and possibly the whole element) with no renderer or reader in any repo

2 participants