Skip to content

docs(adr): ADR-0047 records the 18.0 retirement of filterableFields — no replacement key, no rewrite - #24756

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-24727-adr-0047-filterable-fields-amendment
Oct 20, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-24727-adr-0047-filterable-fields-amendment

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

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 to userFilters.fields entries". 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 a retiredKey() 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.md only (+24 / −2)

  1. Status block. A dated Amendment (2026-10-20) blockquote joins the existing Revision (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 conversion view-list-filterable-fields-removed drops the key, and record 6278907207 says why a rewrite to userFilters.fields keeps 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 #24721 4bc3becd5.
  2. Decision 1, §3.3 item 1. The sentence is struck in place with a strikethrough and annotated. It is not deleted. This follows the file's own precedent: TL;DR ✨ Set up Copilot instructions #2's struck "iron rule" carries an italic "Superseded by …" note.

No other ADR text moves. The **Status**: line, §4 Non-goals and the Context measurement line that names filterableFields are untouched.

Before / after (Decision 1)

Before (origin/main 580fd4ed3c, lines 154–155):

`filterableFields` stays as the legacy shorthand; loaders auto-upgrade it
to `userFilters.fields` entries.

After (lines 174–177):

~~`filterableFields` stays as the legacy shorthand; loaders auto-upgrade it
to `userFilters.fields` entries.~~ *(Struck by the 2026-10-20 amendment —
`filterableFields` retired in 18.0 by ruling C on #24640, with no
replacement key and no rewrite; see the status block above.)*

Rendered locally with marked 16.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/main 580fd4ed3c. The dispatch named f7005cbd8c; origin/main advanced between dispatch and worktree creation, and git diff f7005cbd8c 580fd4ed3c -- docs/adr/0047-object-ui-run-modes.md is empty.

  1. 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.

  2. Holds. git grep -n filterableFields -- packages/spec/src at 580fd4ed3c returns 92 lines, all in the retirement kit:

    • ui/view.zod.ts: the retiredKey() tombstone and its prescription.
    • conversions/registry.ts: view-list-filterable-fields-removed, whose apply is stripKeys(payload, ['filterableFields'], …), and its fixture.
    • migrations/entries/retired-keys/18.ui__ListView__filterableFields.ts and 18.ui__ObjectListView__filterableFields.ts.
    • migrations/entries/semantic/18.list-view-filterable-fields-retired.ts and migrations/registry.ts.template.
    • ui/view.form.ts: a comment on the removed input.
    • Tests: ui/view-list-filterable-fields-retirement.test.ts, ui/view-list-tabs-retirement.test.ts, ui/view.test.ts and shared/retired-key-removal-version.pin.test.ts.

    No read path rewrites the key to userFilters.fields.

    • Control on the tree the retirement replaced. That tree is 4bc3becd5^ = 0904d856e3; git merge-base --is-ancestor 4bc3becd5 HEAD exits 0. git grep -n filterableFields 4bc3becd5^ over the whole repository, excluding *.md/*.mdx and 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 in packages/lint and packages/metadata-protocol, and the FLS scrubber's name-list classification in packages/metadata-core. None rewrites the key into userFilters.fields: the loader the sentence promised did not exist when the key retired.
    • The clone is shallow, so "never built" is read on that tree and on today's, not by walking all history.
    • Supplementary: the local ../objectui checkout at f9401e6 has no line that pairs filterableFields with userFilters or with an upgrade.
  3. Holds. §4 Non-goals (now lines 275–276; 253–254 before the insert) calls the filterableFields and userFilters.elements aliases "one-release courtesies, not commitments". That is consistent with the amendment, so it is left unchanged.

Gates — all at 6d1c09b965, the final commit

node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack was 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 --ran reconciliation reads 19 derived, 19 run, 0 NOT-MEASURED, 0 UNRUN, a derived zero: every line recorded an exit code.

command exit
node scripts/check-adr-links.mjs 0 — 770 relative link destinations under docs/adr/ resolve
node scripts/check-adr-links.mjs --self-test 0
node scripts/check-adr-symbol-anchors.mjs 0 — 2369 anchors across 142 records resolve, 0 line anchors
node scripts/check-adr-symbol-anchors.mjs --self-test 0
node scripts/check-ci-filter-parity.mjs 0
node scripts/check-closing-keyword-parity.mjs 0
node scripts/check-closing-keyword-parity.mjs --self-test 0
node scripts/check-comment-mask-corpus.mjs 0 — 9639 files, 0 disagree
pnpm --filter @objectstack/lint run check:doc-formula-expressions 0 (see the note below)
pnpm check:adr-anchors 0
pnpm check:cross-package-test-inputs 0
pnpm check:doc-authoring 0
pnpm check:driver-memory-census 0
pnpm check:gitlink-declared 0
pnpm check:nul-bytes 0 — no raw ASCII control bytes
pnpm check:pm-governed-merges 0
pnpm check:pm-prior-rulings 0
pnpm check:refd-timer-probe 0
pnpm check:watch-hint-literal 0
  • check:doc-formula-expressions first exited 3, PREREQUISITE NOT MET: the fresh worktree had no @objectstack/formula / @objectstack/lint dist. 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.
  • No package is touched, so there is no dependency-closure build and no package test or typecheck run. There is no ablation either: the change is documentation, and no tested behaviour moves.
  • A self-scan of the ADR for control bytes found none.
  • Not run locally, owned by CI: the repo-wide scans and the families outside the derived total.

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.ts and rule-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.ts reads a JSX ListView prop with the same name; that is a React prop, not stored metadata. Carrier: none.

维护者速读(草稿)

改了什么:只动了一个文件 ADR-0047(对象 UI 的两种运行模式),两处改动:

  • 文件顶部状态区追加一段带日期(2026-10-20)的修订说明。
  • 「决定 1」里那句话用删除线划掉并加注。原话是「filterableFields 作为旧简写保留,加载器会把它自动升级成 userFilters.fields」。原句保留可查,没有删除。

其余 ADR 文字一字未动。

为什么改:您在 #24640 裁了「C」并「提前」到 18.0,PR #24721 已经落地:

  • 这个键在 18.0 退役,没有替代键;
  • 存量数据里的这个键直接丢弃,不会改写成 userFilters.fields;
  • 那个「自动升级」的加载器从来没有建成过。

所以 ADR 里那句话已经与现实相反。按第一指令 13,被推翻的决定要在原记录里修订。不改的话,后来读 ADR 的人(和 AI)会以为这个键还能写、还会被自动转换。

风险与代价(含回滚):纯文档改动,没有运行时影响,不发包,也没有 changeset。回滚就是 revert 这一个 commit。有一处取舍:顶部 **Status**: 那一行没有改成「amended 2026-10-20」,修订信息只放在新增的引用块里,这是为了遵守卡上「其余文字不动」的要求。

席位意见:

你要做的:看一下新增修订段的措辞和划线位置是否合适。同意就在 PR 上批准(Tier H,批准后由席位落地)。


Generated by Claude Code

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>
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Oct 20, 2026
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation labels Oct 20, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Rendered 2026-10-20T04:58Z by the reviewing session, read-only, on PR #24756 for card #24727.

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 6d1c09b9654d7db136b4dbe493980279f09f0341
Local-runs: none
Scope: docs/adr/0047-object-ui-run-modes.md + packages/spec/src/ui/view.zod.ts, packages/spec/src/conversions/registry.ts, packages/spec/src/conversions/types.ts, packages/spec/src/ui/view.form.ts, packages/spec/src/migrations/entries/retired-keys/18.ui__ListView__filterableFields.ts, packages/spec/src/migrations/entries/retired-keys/18.ui__ObjectListView__filterableFields.ts, packages/spec/src/ui/view-list-filterable-fields-retirement.test.ts, packages/spec/liveness/view.json (each at origin/main 580fd4e and, where the claim is about the pre-retirement tree, at 4bc3bec^ = 0904d85); objectui packages/plugin-list/src/ListView.tsx, packages/app-shell/src/views/ObjectView.tsx, packages/plugin-view/src/ObjectView.tsx (objectui origin/main 4b67746)

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 main (one file, +24/−2); the 43 check-runs on the head; ruling records 6278975049, 6279033298 and 6278907207 on #24640; PR #24721. Every other reading is a git show / git grep on a fetched ref: nothing built, run or re-run.

① Derived judgments

  • Accept set: nothing moves — right. No schema, conversion, registry, gate or script is in the diff; the only accept-set change the text describes is 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's, already on main. Clause-②: no on the PR body (line 2) and on the claim is the right declaration.
  • Public surface: nothing publishes — right. docs/adr/** sits in no package's files[] (grep of every packages/**/package.json on main for docs/adr: zero hits); skip-changeset is right (② below).
  • Governed face — right. docs/adr/** is Tier H: the PR is draft, auto-merge is unarmed, head repo equals base repo (not a fork), one file, size/s. This record is the at-tier review that precedes the maintainer's approval; the landing stays theirs.
  • Every factual claim the amendment makes, against its sources:
    1. 「C」 at record 6278975049 — right. The record carries the word verbatim and already states both halves the amendment repeats: "No Filter-panel whitelist replaces it: that is the ruling" and "An ADR-0087 entry may not rewrite filterableFields to userFilters.fields".
    2. 「提前」 at record 6279033298 — right; verbatim, target:v18 added in that act.
    3. "executed by 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, 4bc3becd5" — right; 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 merged as 4bc3becd5f4a1042d9f180eca262a90bfddcbb92 (2026-10-20T03:14Z) and main carries it.
    4. The quoted §3.3 item 1 sentence — right; lines 154–155 at origin/main 580fd4e (the branch's merge-base), byte-identical inside the strikethrough.
    5. "That loader was never built … the key was declared, offered as a Studio form input and checked for field references, and nothing rewrote it into userFilters.fields" — right on every reading in reach. The PR body's greps re-run read-only: on main, packages/spec/src is 92 lines, all retirement kit (the tombstone view.zod.ts:2898 and its prescription :2501–2536, conversions/registry.ts:15840–15881 strip plus fixture, the two retired-keys/18.ui__*__filterableFields.ts, the semantic entry, registry.ts.template:2169, the view.form.ts:81 comment, four test files). On 4bc3bec^ (0904d85) the whole-repo non-test, non-Markdown census is 25 lines: the declaration (view.zod.ts:2844, described "Legacy shorthand for userFilters.fields"), the form input (view.form.ts:81) and its four generated translation bundles, the field-reference checks (packages/lint validate-list-view-field-refs.ts:392/534 and validate-field-consumers.ts:307; packages/metadata-protocol metadata-diagnostics.ts:237–238, a requireField walk; packages/metadata-core object-schema-fls-references.ts:719, the FLS name list), the authorable-surface and liveness artifacts, and lint comments. A pairing grep (filterableFields and userFilters on one line) on that tree hits only the describe() and name lists: no assignment, no rewrite. Two readings the dev did not cite agree: the liveness ledger's prior live row (liveness/view.json, audit L15, cross-repo) named only objectui ListView.tsx / UserFilters.tsx as readers and the 2026-10-19 re-measure records "UserFilters never read it"; and a pickaxe over the loader packages (metadata*, objectql, runtime, cli, rest, core) inside the clone's horizon finds only the ADR-0106 field-mask commit (that FLS name list) and a version-packages commit. The clone is shallow (2,856 commits, horizon 2026-09-19), so older history is out of reach; the executing PR's body and the tombstone's own comment ("the declared one was never delivered") say the same, and §3.3 is the ADR's plan, not a report. Supported.
    6. "its one renderer, objectui's ListView, read it as the Filter panel's field whitelist" — right. objectui origin/main 4b67746: plugin-list/src/ListView.tsx:4656–4657 builds a Set from schema.filterableFields as the Filter panel's membership whitelist; app-shell/src/views/ObjectView.tsx:3464 and plugin-view/src/ObjectView.tsx:3124 only forward it; plugin-view/src/index.tsx:90 and types/src/objectql.ts declare it. One reader, matching record 6278907207 and the ledger note.
    7. "the list-view shapes (ListViewSchema, ObjectListViewSchema) refuse it at parse with a retiredKey() tombstone that names the fix" — right. The tombstone sits on ListViewShapeSchema (view.zod.ts:2898); ListViewSchema (:3183) is that shape refined and ObjectListViewSchema (:4924) is that shape with userFilters swapped, so both refuse it; the prescription (:2528–2536) names the fix (delete the key; userFilters for a curated bar; os migrate meta --from 17).
    8. "the conversion view-list-filterable-fields-removed drops it from stored views" — right. registry.ts:15851–15854 is stripKeys(payload, ['filterableFields']) on every list payload; retiredFromLoadPath: true retires it from the authoring funnel only — conversions/types.ts:209–235 says the data-at-rest seams replay retired entries on purpose — and the retirement test pins applyConversionsToStoredItem('view', …) dropping the key from a stored view row. Precision, not a finding: an object row's own listViews is reached by no conversion and is refused at its door (the BOUNDARY pin); the amendment says "stored views" and claims no more.
    9. "No conversion rewrites it to userFilters.fields: that rewrite keeps nothing an author saw — the whitelist would vanish and quick-filter chips would appear (record 6278907207)" — right; faithful to the record's sentence, and pinned (every notice's to is (removed); an authored userFilters rides through untouched).
    10. "A curated end-user filter bar is authored as userFilters" and "§4 already called the alias a one-release courtesy, not a commitment" — right (the prescription; §4 Non-goals, lines 253–254 before and 275–276 after).
  • No other ADR text moved — right. The diff is two hunks. Hunk 1 is a pure insert at 27–46: a bare quote-marker separator line (the shape line 13 already uses between the Revision and the 2026-07-07 Amendment) and the 19-line Amendment (2026-10-20) blockquote, inside the status blockquote after the 2026-07-07 amendment and before **Deciders**. Hunk 2 wraps 154–155 in ~~…~~ with the text unchanged and adds the italic annotation. The **Status**: line (3), the Context line that names filterableFields (89, now 109), §4 Non-goals and the Deciders / Builds on / Consumers lines are byte-identical. The strike-in-place follows the file's own TL;DR ✨ Set up Copilot instructions #2 precedent (~~…~~ plus an italic "Superseded by … — see banner above" note).
  • Prime Directive 13 — met. The reversal is amended in the ADR's own record, in the status block's dated Revision/Amendment chain (the file's convention and the card's first option); the ADR's number and file do not move (one modified path, no rename); no scripts/adr-anchors/*.json names 0047. For the maintainer's eye only: the **Status**: line still reads "revised 2026-06-19 … + the 2026-07-07 object-list narrowing" — the earlier amendment was named there and this one is not, by the card's 「⛔ No other ADR text moves」; nothing in that line is now false. Whether to add "; amended 2026-10-20" is a one-line call at approval, not a finding.
  • Communication and attribution — right. 「C」 and 「提前」 are kept verbatim; no model identifier in the diff, the PR body or the head commit (trailer pair Claude-Session: plus Co-authored-by: Claude); the PR body carries Fixes #24727, Clause-②: no, and the ## 维护者速读(草稿) with 席位意见 left empty; assignee os-justin; labels documentation, size/s, skip-changeset.
  • Check-runs on the head (second read; all complete). 43 runs: 32 success, 11 skipped, 0 failure, 0 in progress. The five required contexts: Lint & Repo Gates success (every lane: docs & code guards, repo & tooling gates, CI/release/engine gates, PM dispatch-gates, ESLint, the three scoped lanes), TypeScript Type Check success (workspace, source, consumer, debt ledger), Test Core success (six of six shards), Build Core skipped (paths filter: no package touched), Governed Surface Queue Guard success. Docs families: Check Documentation Links success, Check Changeset success, Check PR Size success. The three card/branch claim checks: success. Skipped by the paths filter, advisory: Build Docs, Console Pin Gate, the Dogfood shards and Verify CLI, Temporal Conformance, Packed-tarball smoke (opt-in), and one duplicate Auto Label / Check PR Size / Check Changeset run each. The dev's local 19-of-19 gate run is not relied on; the check-runs are the verdicts.

② Semver level

skip-changeset matches what the diff publishes: nothing. docs/adr/** ships in no released package (zero packages/**/package.json name docs/adr), so no .changeset/*.md is owed and none is in the diff; Check Changeset on the head is success under the label. Clause-②: no (PR body line 2, the claim's declaration copied) is right: no accept set widens or narrows, so no (widening) or (narrowing) arm and no ADR-0087 marker is owed. The accept-set change the text records is #24721's Clause-②: yes (narrowing) with its own registered conversion; this PR adds none.

③ Boundary flags

  • Flag 1 — lazy continuation of **Deciders** / **Builds on** / **Consumers** into the status blockquote's last paragraph. Answered. On main those three lines already follow the blockquote with no blank line (26 then 27), so Markdown lazy continuation folds them into the 2026-07-07 amendment's paragraph; after the insert they fold into the 2026-10-20 amendment's paragraph instead. The amendment's rendered meaning does not change: its last sentence closes with a full stop before them, every claim it makes sits inside its own lines, and the three lines render exactly where they rendered before (inside the blockquote, as the tail of its last paragraph). The defect neither grows nor shrinks. Not this PR's to fix — the card says 「⛔ No other ADR text moves」, and the one-line fix (a blank line after the new block) changes how three existing lines render. Carried in the PR body's Acceptance notes, which is where Prime Directive 10 puts a note that is neither a defect, a contract violation nor an authoring trap. The maintainer may fold the blank line in at approval; otherwise it is a later docs-only polish with no card owed.
  • Flag 2 — residual readers of the retired key. Verified on main: packages/lint/src/validate-list-view-field-refs.ts:392/534, validate-field-consumers.ts:307, reference-integrity-suite.ts (comments only), rule-explanations.ts:3114/3149, validate-react-page-props.ts:770/773 (a JSX prop — the boundary 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 stated); packages/metadata-protocol/src/metadata-diagnostics.ts:237–238; packages/metadata-core/src/object-schema-fls-references.ts:719. These are 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's own acceptance-noted residue ("out-of-lane readers left in place, for the seat's follow-up"; its tree-scoped pin holds four of them as self-expiring RESIDUE), outside this card's docs-only surface and outside this lane. The dev's dead-code reading is right for the parse-shadowed reads: once every list-view door refuses the key, no parsed stack, diagnostics input or FLS document reaches them. One member is not dead-code class: rule-explanations.ts:3114/3149 is os explain text shown to an author, and it still names filterableFields as a checked position — prose advertising a key the parse now refuses. Escalated to the seat, not a finding against this PR: confirm whether 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's seat (domain:spec seat 2, session_019oFY6Hi35J7atvgVFnmoaK) filed the follow-up its acceptance notes promised; if no card carries it, one is owed in the lint lane, naming rule-explanations.ts:3114/3149 as the user-facing member and the rest as the RESIDUE set the pin already tracks. Not a blocker here.
  • The dev's four deviations, each answered: (1) worktree base 580fd4e against the dispatch's f7005cb — the branch's merge-base is 580fd4e and the ADR is byte-identical between the two, no effect; (2) commit trailer in AGENTS.md's model-free form — right, AGENTS.md outranks the harness reminder, and the trailer pair on the head reads as declared; (3) PR-body footer in the session-URL form — right, AGENTS.md's footer table; (4) **Status**: line untouched — inside the card's scope, see ① above.
  • open_questions: [] — nothing to answer. The card's three Wanted lines are each met: one dated amendment in the status block citing 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 and both ruling records; the Decision 1 sentence struck in place, not deleted; docs only, one file.

Implemented-by: claude/issue-24727-adr-0047-filterable-fields-amendment
Reviewed-by: session_01HEdP5tPhqQfzwRmKDxwn85

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

维护者速读(终稿)· PR #24756 · domain:skills seat 1 · os-justin · session_01HEdP5tPhqQfzwRmKDxwn85 · 2026-10-20T04:59Z

席位核对

  • 形态: draft、base main、首行 Fixes #24727、行首 Clause-②: no、assignee os-justin、skip-changeset 随创建同笔(REST 回读 labels = documentation, size/s, skip-changeset);1 文件 +24/−2,一个提交;正文页脚 1 条(会话 URL 形);闭合关键词只有首行一处(另引 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、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 旁无动词)。
  • 前提实测(席位,origin/main 580fd4ed3 与分支 tip 6d1c09b96): 旧第 154–155 行如卡所引;新 Amendment 块在 2026-07-07 块之后、**Deciders** 之前(第 27–46 行);划线句在第 174–177 行;§4 Non-goals 的 one-release courtesy 句仍在;git grep filterableFields -- packages/spec/src 在 origin/main 只命中退役套件(dev 的 92 行读数,席位抽样 ui/view.zod.ts 墓碑与 conversions/registry.ts 的 stripKeys 丢弃)。
  • 门禁 check-runs(head 6d1c09b96): 2026-10-20T04:53Z 43 条(39 名),30 success、9 skipped、0 failed、0 in_progress;Lint & Repo Gates、TypeScript Type Check、Governed Surface Queue Guard 均 success 且 head_sha 钉 6d1c09b96;check-expected-skips --pr 24756:OK,11 条跳过全在名单(exit 0);check-governed-merges --pr 24756:GOVERNED,Tier H(docs/adr/**),26 行。dev 本地 19 条派生门禁全 0(doc-formula-expressions 首跑 exit 3 为前置未建,锁下补建后 0),--ran 19/19,钉 head 6d1c09b96。
  • 接受的偏差: 基点从派发读数 f7005cbd8 移到 580fd4ed3(该文件两处相同);两次 push;**Status**: 行不动(卡的范围);排版瑕疵不修;commit 尾注与 PR 页脚按 AGENTS.md 的无模型名形。
  • 复核记录: 隔离达档复审 PASS 6283742240(CONTRACT_REVIEW_TIER,head 6d1c09b96,Local-runs none;范围扩到 spec 退役套件八处、liveness 账本与 objectui 三个渲染器文件;修订块五条事实逐条对上出处;「从未建成」在 origin/main 与退役前树 0904d856e3 两棵树上复核成立)。两条旁注的判法:① 续行折叠不改修订块的渲染含义,不归本 PR;② 残余读者中 rule-explanations.ts 是面向作者的文案,非死读 —— 升级到本席:核 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 席位是否已立后续卡,无则在 lint 车道立一张。
  • 范围外去向: dev 两条 carrier-none 旁注 —— ① **Deciders**/**Builds on**/**Consumers** 三行被 Markdown 续行折进状态引用块(既有,润色类);② 退役键的残余读者(packages/lint 四处、metadata-protocol 诊断、metadata-core FLS 名单),每个入口已在 parse 拒收该键,属死读(零拉动类)—— 两条记座位贴 Carried pointers,不立卡。
  • 落地条款: Tier H;达档复核 PASS 在案(6283742240)后本席置顶本记录、卡挂 needs-user-decision、向 os-zhuang 与 hotlong 请审并通知维护者;获授权批准 ⇒ 本席过落地前检、ready + auto-merge。

ACCEPT(Tier H:等授权批准,⛔ 不入队)


Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 20, 2026 05:13
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 20, 2026 05:13
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 20, 2026
Merged via the queue into main with commit 795ff70 Oct 20, 2026
44 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-24727-adr-0047-filterable-fields-amendment branch October 20, 2026 05:23
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/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

3 participants