Repository navigation
docs(adr): ADR-0047 records the 18.0 retirement of filterableFields — no replacement key, no rewrite - #24756
Conversation
ADR-0047's Decision 1 (section 3.3 item 1) still said `filterableFields` "stays as the legacy shorthand; loaders auto-upgrade it to `userFilters.fields` entries". The maintainer's ruling C on #24640 retired the key in 18.0 with no replacement key, and PR #24721 (4bc3bec) executed it: a retiredKey() tombstone refuses it at parse, and the conversion `view-list-filterable-fields-removed` drops it rather than rewriting it to `userFilters.fields`. The auto-upgrade loader the sentence promised was never built. Per Prime Directive 13 the record is amended in place: a dated Amendment (2026-10-20) blockquote joins the status block's existing Revision and Amendment chain, and Decision 1's sentence is struck with an annotation pointing at it, not deleted. No other ADR text moves. Claude-Session: https://claude.ai/code/session_01HEdP5tPhqQfzwRmKDxwn85 Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewRendered 2026-10-20T04:58Z by the reviewing session, read-only, on PR #24756 for card #24727. Served-tier: Inputs: card #24727's body and its five comments (6282303965, 6283418518, 6283432637, 6283609281; 6283439212 read only to confirm the claim's branch); PR #24756's body, file list and net diff against ① Derived judgments
② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
维护者速读(终稿)· PR #24756 ·
|
Fixes #24727
Clause-②: no
ADR-0047's Decision 1 (§3.3 item 1) still said
filterableFields"stays as the legacy shorthand; loaders auto-upgrade it touserFilters.fieldsentries". The maintainer's ruling C on #24640 (record 6278975049, verbatim 「C」; pulled into 18.0 by record 6279033298, verbatim 「提前」) retired the key in 18.0, and PR #24721 (4bc3becd5) executed it with aretiredKey()tombstone and a conversion that DROPS the key. Prime Directive 13: a reversed decision is amended in its own record. Docs only, one file, no package touched.What changed —
docs/adr/0047-object-ui-run-modes.mdonly (+24 / −2)Amendment (2026-10-20)blockquote joins the existingRevision (2026-06-19)/Amendment (2026-07-07)chain: the same blockquote chain, a bare quote-marker separator line, the same bold-lead shape. It records that the key retired in 18.0; that there is no replacement key; that there is no rewrite (the conversionview-list-filterable-fields-removeddrops the key, and record 6278907207 says why a rewrite touserFilters.fieldskeeps nothing an author saw); and that the auto-upgrade loader was never built. It cites spec(ui): ListViewSchema.filterableFields is described as the userFilters.fields shorthand, but its one renderer reads it as the Filter panel whitelist; retire or redefine (objectui#13047) #24640, records 6278975049 and 6279033298 (verbatim rulings kept untranslated), and PR feat(spec)!: retire the list view's filterableFields — declared as the userFilters.fields shorthand, read as a Filter-panel whitelist; no per-view whitelist replaces it #247214bc3becd5.No other ADR text moves. The
**Status**:line, §4 Non-goals and the Context measurement line that namesfilterableFieldsare untouched.Before / after (Decision 1)
Before (
origin/main580fd4ed3c, lines 154–155):After (lines 174–177):
Rendered locally with
marked16.4.2 (GFM). The struck sentence is one strikethrough span across its line break. The new amendment renders inside the status blockquote, after the 2026-07-07 one.Premise readings (the dispatch's mechanism assumptions 1–3)
Base: the worktree was created at
origin/main580fd4ed3c. The dispatch namedf7005cbd8c;origin/mainadvanced between dispatch and worktree creation, andgit diff f7005cbd8c 580fd4ed3c -- docs/adr/0047-object-ui-run-modes.mdis empty.Holds. Lines 154–155 carried the quoted sentence. Line 3 is
**Status**: Accepted (2026-06-12; revised 2026-06-19) — …, followed by the Revision and Amendment blockquotes. The file's only other strikethrough is TL;DR ✨ Set up Copilot instructions #2 (line 38), the precedent followed here.Holds.
git grep -n filterableFields -- packages/spec/srcat580fd4ed3creturns 92 lines, all in the retirement kit:ui/view.zod.ts: theretiredKey()tombstone and its prescription.conversions/registry.ts:view-list-filterable-fields-removed, whoseapplyisstripKeys(payload, ['filterableFields'], …), and its fixture.migrations/entries/retired-keys/18.ui__ListView__filterableFields.tsand18.ui__ObjectListView__filterableFields.ts.migrations/entries/semantic/18.list-view-filterable-fields-retired.tsandmigrations/registry.ts.template.ui/view.form.ts: a comment on the removed input.ui/view-list-filterable-fields-retirement.test.ts,ui/view-list-tabs-retirement.test.ts,ui/view.test.tsandshared/retired-key-removal-version.pin.test.ts.No read path rewrites the key to
userFilters.fields.4bc3becd5^=0904d856e3;git merge-base --is-ancestor 4bc3becd5 HEADexits 0.git grep -n filterableFields 4bc3becd5^over the whole repository, excluding*.md/*.mdxand test files, returns 25 lines. They are the schema declaration (described as "Legacy shorthand for userFilters.fields"), the form input, its generated form translations, the authorable-surface and liveness artifacts, field-reference checks inpackages/lintandpackages/metadata-protocol, and the FLS scrubber's name-list classification inpackages/metadata-core. None rewrites the key intouserFilters.fields: the loader the sentence promised did not exist when the key retired.../objectuicheckout atf9401e6has no line that pairsfilterableFieldswithuserFiltersor with an upgrade.Holds. §4 Non-goals (now lines 275–276; 253–254 before the insert) calls the
filterableFieldsanduserFilters.elementsaliases "one-release courtesies, not commitments". That is consistent with the amendment, so it is left unchanged.Gates — all at
6d1c09b965, the final commitnode scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackwas re-derived on the actual diff and gives the same 19 commands as the dispatch. Each command ran with its output redirected first and$?captured before any read. The--ranreconciliation reads19 derived, 19 run, 0 NOT-MEASURED, 0 UNRUN, a derived zero: every line recorded an exit code.node scripts/check-adr-links.mjsnode scripts/check-adr-links.mjs --self-testnode scripts/check-adr-symbol-anchors.mjsnode scripts/check-adr-symbol-anchors.mjs --self-testnode scripts/check-ci-filter-parity.mjsnode scripts/check-closing-keyword-parity.mjsnode scripts/check-closing-keyword-parity.mjs --self-testnode scripts/check-comment-mask-corpus.mjspnpm --filter @objectstack/lint run check:doc-formula-expressionspnpm check:adr-anchorspnpm check:cross-package-test-inputspnpm check:doc-authoringpnpm check:driver-memory-censuspnpm check:gitlink-declaredpnpm check:nul-bytespnpm check:pm-governed-mergespnpm check:pm-prior-rulingspnpm check:refd-timer-probepnpm check:watch-hint-literalcheck:doc-formula-expressionsfirst exited 3, PREREQUISITE NOT MET: the fresh worktree had no@objectstack/formula/@objectstack/lintdist. That exit is not a measurement. The gate's own fix ran under the verify lock (turbo run build --concurrency=2 --filter=@objectstack/formula --filter=@objectstack/lint, 4/4 tasks,VERDICT command-exit 0), and the re-run exited 0.Acceptance notes
Pre-existing rendering, kept as it was. The
**Deciders**/**Builds on**/**Consumers**lines follow the status blockquote with no blank line. Markdown lazy continuation therefore folds them into the blockquote's last paragraph: before this PR, the 2026-07-07 amendment's paragraph; after it, the new one's. The insert keeps that adjacency byte for byte, because the card says no other ADR text moves; adding a blank line would change how those three lines render. Polish, not filed. Carrier: none. If wanted, the fix is one blank line.The
**Status**:line is left alone. It still reads "Accepted (2026-06-12; revised 2026-06-19)". The dated amendment block carries the 2026-10-20 change, as the card scoped it.Residual readers of the retired key after PR feat(spec)!: retire the list view's filterableFields — declared as the userFilters.fields shorthand, read as a Filter-panel whitelist; no per-view whitelist replaces it #24721. These are an observation, not filed. They read a key that every list-view door now refuses at parse, so on the authored path they get no input:
packages/lint/src/validate-list-view-field-refs.ts,validate-field-consumers.ts,reference-integrity-suite.tsandrule-explanations.ts;packages/metadata-protocol/src/metadata-diagnostics.ts;packages/metadata-core/src/object-schema-fls-references.ts(LIST_VIEW_NAME_LISTS).validate-react-page-props.tsreads a JSXListViewprop with the same name; that is a React prop, not stored metadata. Carrier: none.维护者速读(草稿)
改了什么:只动了一个文件 ADR-0047(对象 UI 的两种运行模式),两处改动:
filterableFields作为旧简写保留,加载器会把它自动升级成userFilters.fields」。原句保留可查,没有删除。其余 ADR 文字一字未动。
为什么改:您在 #24640 裁了「C」并「提前」到 18.0,PR #24721 已经落地:
userFilters.fields;所以 ADR 里那句话已经与现实相反。按第一指令 13,被推翻的决定要在原记录里修订。不改的话,后来读 ADR 的人(和 AI)会以为这个键还能写、还会被自动转换。
风险与代价(含回滚):纯文档改动,没有运行时影响,不发包,也没有 changeset。回滚就是 revert 这一个 commit。有一处取舍:顶部
**Status**:那一行没有改成「amended 2026-10-20」,修订信息只放在新增的引用块里,这是为了遵守卡上「其余文字不动」的要求。席位意见:
你要做的:看一下新增修订段的措辞和划线位置是否合适。同意就在 PR 上批准(Tier H,批准后由席位落地)。
Generated by Claude Code