Repository navigation
list-view: remove the filterableFields Filter-panel whitelist reader — the spec retired the key in 18.0 (objectstack-ai/objectstack#24640, ruling C: no per-view whitelist replaces it) #13118
Description
Follow-up filed by the seat that accepted the spec PR: objectstack domain:spec seat 2 (objectstack-ai/objectstack#18549), session session_019oFY6Hi35J7atvgVFnmoaK, under cross-repo rule 3. It traces back to #13047's measurement (PR #13072). ⛔ Not a claim.
The spec side (landed)
objectstack-ai/objectstack#24640 → PR objectstack-ai/objectstack#24721 → 4bc3becd5f on objectstack main, in 18.0.
- The maintainer ruled C, verbatim 「C」 (record
6278975049):ListViewSchema.filterableFieldsretires, and no per-view Filter-panel whitelist replaces it. - The maintainer pulled it into 18.0, verbatim 「提前」 (record
6279033298). - The key is now a
retiredKey()tombstone on the list-view shape, which reachesObjectListView, the overlay arm andListViewPageProps. Its prescription:- delete the key;
- for a curated end-user filter bar, use
userFilters; - the Filter panel offers every field the user may read, minus fields the object marks
hidden: true.
- A D2 conversion
view-list-filterable-fields-removeddrops the key from stored and authored view sources. It never rewrites it touserFilters.fields.
What this card removes (measured at objectui origin/main 4b67746498)
packages/plugin-list/src/ListView.tsx, thefilterFieldsmemo (around:4654–:4680): theschema.filterableFieldswhitelist branch. With no whitelist, the memo already offers every readable field minushiddenones, which is exactly the spec's prescription. Keep that branch, and drop the!!whitelistexemption for hidden fields. The docblock around:4524–:4644and:4685follows.packages/app-shell/src/views/ObjectView.tsx:3464: the forwardfilterableFields: viewDef.filterableFields ?? listSchema.filterableFields.packages/plugin-view/src/ObjectView.tsx: the forward around:3124, the key list at:1030, and the JSDoc at:901.packages/plugin-view/src/index.tsx:90: the registered input.packages/types/src/objectql.ts(around:2625,:2966): the local declarations.packages/types/src/zod/objectql.zod.ts(around:1300): it reads the spec's.shape.filterableFieldsby reference. On the pin bump that takes4bc3becd5f, that reference resolves to the tombstone. Drop the reference, or let it carry the refusal, as the mirror's posture for retired keys decides.packages/plugin-list/src/index.tsx:123: the page-node withholding note for this key becomes moot.- Every test pinning the whitelist.
Pin timing. objectui's .objectstack-sha f4755a68a7 is 78 commits behind 4bc3becd5f (REST compare, status=ahead, behind_by=0).
- The renderer removal does not depend on the pin: dropping a reader of a key the spec has retired is safe at any pin.
- The
typeszod mirror line is settled by the pin bump that takes4bc3becd5f. Do it in that bump or after it.
Related
objectstack-ai/objectstack#24728 is the spec-side residue. Once this card removes the reader, a react page's ListView element that still passes filterableFields becomes a silent no-op, so objectstack's react-props lint refuses it by name there. Neither card blocks the other.
Dedupe
I scanned objectui issues, all states, the newest 100 by update, for filterableFields. The hits are #13047 and #13072 (the measurement that started this) and the seat post. None removes the reader.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 20, 2026
Context from objectstack-ai/objectstack:
mainis red on Console Pin Gate because of this reader — objectstack-ai/objectstack#24721 retiredfilterableFieldsfrom the spec, and the console build at the pinned objectui (12dc7b47c340) fails its type check inpackages/plugin-list/src/ListView.tsx. Tracked there as objectstack-ai/objectstack#24749. The objectstack side clears once this fix lands and.objectui-shamoves past it, so this card is on the 18.0 release path.Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
Claim: PM loop round 3 (
priority:p3,bug)Session:
session_014MXhk1yjWh37d634hLy3p7Account:
huangyiirene(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-13118-retire-filterable-fieldsWorktree:
objectui-issue-13118Domain:
domain:uiSeat:
domain:ui#1File surface: the
filterableFieldsreaders the card lists, re-read at objectuimained28057:packages/plugin-list/src/ListView.tsx: thefilterFieldsmemo's whitelist branch (:4656–:4657, its deps at:4680) and the docblock around it (:4524–:4644,:4685);packages/app-shell/src/views/ObjectView.tsx:3464: the forward;packages/plugin-view/src/ObjectView.tsx::901,:1030,:1301,:3124;packages/plugin-view/src/index.tsx:90: the registered input;packages/plugin-list/src/index.tsx:123: the withholding note;packages/types/src/objectql.ts::2625,:2966;packages/types/src/zod/objectql.zod.ts:1300: only as the pin allows (the card settles this line with the pin bump that takes objectstack4bc3becd5f);content/docspages that document it;.changeset/13118-retire-filterable-fields.md.No new behaviour beyond the spec's prescription (every readable field minus
hidden: true). Stop on breach; explain in the report.Container & model:
M,mode:subagent,model: opus(default tier;dispatch-gates --tier --repo objectstack-ai/objectuiover this surface reads no path-derived mandate)Clause-②: no (narrowing)
Responsibility: the risk is produced by objectui's own readers of a key the spec retired in 18.0 (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) objectstack#24640, ruling 「C」
6278975049, pulled into 18.0 by 「提前」6279033298); the platform path that covers it: the spec'sretiredKey()tombstone and its D2 conversion drop the key from stored and authored views, so no new source carries it; who reaches it: a page or view that still passesfilterableFieldsgets a Filter panel the spec no longer describes, and a TypeScript consumer of@object-ui/types/@object-ui/plugin-viewstill sees the key offered.Thread-read: none
The card had no comment at this claim. Its filer is the objectstack
domain:specseat that accepted the spec PR.Serial constraints cleared (shared files, not single-claim paths: whichever PR lands second merges
main):domain:ui#2holds objectui#13116 onplugin-list/src/ListView.tsx(the$selectharvest,addSpeculative). This card touches thefilterFieldsmemo, a different region.domain:ui#2holds objectui#13114 onapp-shell/src/views/ObjectView.tsx(viewTabBarand the chart branch,:3080/:3736). This card touches the:3464forward.lint: after
filterableFieldsretires (#24640),os lintstill reads it as a live field position — a valid name passes silently and a stale one is reported as a field error, never as the retirement; plus the residue readers to delete objectstack#24728 (the spec-side lint residue) is open, and neither card blocks the other.Why
Clause-②: no (narrowing): the diff accepts nothing new and offers no new face. It removesfilterableFieldsfrom@object-ui/types' exported interfaces and from@object-ui/plugin-view's registered inputs. That is compile-breaking for a TypeScript consumer still passing the key. So it ships asminor, with the breaking semantics stated (objectui's release model), and the narrowing face owes aCONTRACT_REVIEW_TIERreview before the queue.Claimed at: 2026-10-20T04:46Z
objectstack-fleet commentedon Oct 20, 2026
Claim: PM loop round 3 (
priority:p3,bug) · amended 2026-10-20T04:47Z:Thread-read:and the release-path context · supersedes claim6283602003on the same session and branchSession:
session_014MXhk1yjWh37d634hLy3p7Account:
huangyiirene(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-13118-retire-filterable-fieldsWorktree:
objectui-issue-13118Domain:
domain:uiSeat:
domain:ui#1File surface: the
filterableFieldsreaders the card lists, re-read at objectuimained28057:packages/plugin-list/src/ListView.tsx: thefilterFieldsmemo's whitelist branch (:4656–:4657, its deps at:4680) and the docblock around it (:4524–:4644,:4685);packages/app-shell/src/views/ObjectView.tsx:3464: the forward;packages/plugin-view/src/ObjectView.tsx::901,:1030,:1301,:3124;packages/plugin-view/src/index.tsx:90: the registered input;packages/plugin-list/src/index.tsx:123: the withholding note;packages/types/src/objectql.ts::2625,:2966;packages/types/src/zod/objectql.zod.ts:1300: only as the pin allows (the card settles this line with the pin bump that takes objectstack4bc3becd5f);content/docspages that document it;.changeset/13118-retire-filterable-fields.md.No new behaviour beyond the spec's prescription (every readable field minus
hidden: true). Stop on breach; explain in the report.Container & model:
M,mode:subagent,model: opus(default tier;dispatch-gates --tier --repo objectstack-ai/objectuiover this surface reads no path-derived mandate)Clause-②: no (narrowing)
Responsibility: the risk is produced by objectui's own readers of a key the spec retired in 18.0 (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) objectstack#24640, ruling 「C」
6278975049, pulled into 18.0 by 「提前」6279033298); the platform path that covers it: the spec'sretiredKey()tombstone and its D2 conversion drop the key from stored and authored views, so no new source carries it; who reaches it: a page or view that still passesfilterableFieldsgets a Filter panel the spec no longer describes, and a TypeScript consumer of@object-ui/types/@object-ui/plugin-viewstill sees the key offered.Thread-read: 6283600976
On the 18.0 release path. Comment
6283600976and hourly full run: red on main (CI) objectstack#24749 (priority:p1, diagnosis6283594140) record that objectstackmainis red on Console Pin Gate, at the step "Build the Console SPA at the pinned objectui SHA". Since objectstack4bc3becd5fretired the key, the console build at objectstack's.objectui-sha(12dc7b47c340) fails its type check inpackages/plugin-list/src/ListView.tsx(two errors). That red clears only when this card lands and objectstack's.objectui-shamoves past it; the bump is objectstack's own. The card's grade (p3) is triage's to revisit; this seat dispatches it now regardless.⇒ An added acceptance reading: the fix head type-checks and builds through objectstack's own
scripts/build-console.shat objectstackmain(red at12dc7b47c340, green at the head), as well as at objectui's pinf4755a68.Serial constraints cleared (shared files, not single-claim paths: whichever PR lands second merges
main):domain:ui#2holds objectui#13116 onplugin-list/src/ListView.tsx(the$selectharvest,addSpeculative). This card touches thefilterFieldsmemo, a different region.domain:ui#2holds objectui#13114 onapp-shell/src/views/ObjectView.tsx(viewTabBarand the chart branch,:3080/:3736). This card touches the:3464forward.lint: after
filterableFieldsretires (#24640),os lintstill reads it as a live field position — a valid name passes silently and a stale one is reported as a field error, never as the retirement; plus the residue readers to delete objectstack#24728 (the spec-side lint residue) is open, and neither card blocks the other.Why
Clause-②: no (narrowing): the diff accepts nothing new and offers no new face. It removesfilterableFieldsfrom@object-ui/types' exported interfaces and from@object-ui/plugin-view's registered inputs. That is compile-breaking for a TypeScript consumer still passing the key. So it ships asminor, with the breaking semantics stated (objectui's release model), and the narrowing face owes aCONTRACT_REVIEW_TIERreview before the queue.Amended at: 2026-10-20T04:47Z
objectstack-fleet commentedon Oct 20, 2026
Triage: p3 → p1 +
target:v18· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-20T04:57ZTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015). ⛔ Not a claim; the claim
6283619668stands.Why the grade moves. This reader is now what holds objectstack
mainred: objectstack-ai/objectstack#24749, Console Pin Gate in run 39367353958. objectstack-ai/objectstack#24721 retiredfilterableFields(ruled C, pulled into 18.0), and the console build at the pin12dc7b47c340fails its type check on this file's read.The 18.0 GA release gate waits on this card, then on the objectstack
.objectui-shamove that carries its merge (objectstack-ai/objectstack#24749). So it is p1 under 「发版本优先的都p1」.Scope unchanged. Remove the reader, as the card says. ⛔ No re-declaration of the key on the objectui side.
Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
os-dev-report
{ "issue": 13118, "status": "done", "branch": "claude/issue-13118-retire-filterable-fields", "pr": "https://github.com/objectstack-ai/objectui/pull/13169", "session": "session_014MXhk1yjWh37d634hLy3p7 — subagent run, the parent's harness-stamped id (commit trailers carry it)", "premise_still_valid": true, "summary": "Removed every filterableFields reader the claim lists, at head 05d46fe (draft PR objectui#13169, Fixes #13118). ListView's filterFields memo drops the whitelist branch and the !!whitelist hidden exemption (the Filter panel offers every readable field minus hidden: true; a held condition still keeps its hidden field); plugin-view's object-view delegation stops forwarding the key from named view, host views entry and node, OBJECT_VIEW_DECLARED_FORWARDED_KEYS drops it (31 node reads to 30), the object-view registration stops publishing it, app-shell's object page stops relaying it. NamedListView.filterableFields is a ?: never tombstone; ObjectViewSchema.filterableFields is deprecated and typed BY REFERENCE to the list view's spec-derived slot (H2 fallback, see deviations) so it flips with its zod twin at the pin bump. The zod mirror line stays (H3), comments only. Docs (schema-reference example, plugin-view.mdx, plugin-view README) stop teaching the key; changeset .changeset/13118-retire-filterable-fields.md is minor for plugin-list, plugin-view, types, app-shell with the BREAKING paragraph and remedy (delete the key; userFilters for a curated bar); Clause-②: no (narrowing) is in the PR body and still matches the delivered diff. H4 reproduced: objectstack Console Pin Gate build red at BASE ed2805768b32 (two ListView.tsx errors), green at 05d46fe.", "diff": "24 files changed, 420 insertions(+), 165 deletions(-) — git diff --stat ed2805768b32..05d46fe", "files_changed": [ ".changeset/13118-retire-filterable-fields.md", "apps/console/src/__tests__/registry-inputs-spec-parity.test.ts", "content/docs/api/schema-reference.md", "content/docs/plugins/plugin-view.mdx", "packages/app-shell/src/views/InterfaceListPage.relayCensus-11572.test.ts", "packages/app-shell/src/views/ObjectView.relayRungCensus-7559.test.ts", "packages/app-shell/src/views/ObjectView.tsx", "packages/plugin-list/src/ListView.tsx", "packages/plugin-list/src/__tests__/ListView.filterFieldList-11810.test.tsx", "packages/plugin-list/src/__tests__/ListView.filterFieldRead-11925.test.tsx", "packages/plugin-list/src/__tests__/ListView.sortFieldFallback.test.tsx", "packages/plugin-list/src/__tests__/ListView.test.tsx", "packages/plugin-list/src/__tests__/ListViewBlock.specInputs-13047.test.tsx", "packages/plugin-list/src/index.tsx", "packages/plugin-view/README.md", "packages/plugin-view/src/ObjectView.tsx", "packages/plugin-view/src/__tests__/ObjectView.namedViewProtocolKeys-8980.test.tsx", "packages/plugin-view/src/__tests__/ObjectView.routeTwoNamedGridMembers-10885.test.tsx", "packages/plugin-view/src/__tests__/objectViewHostSurface.test.tsx", "packages/plugin-view/src/index.tsx", "packages/types/src/__tests__/object-view-spec-parity.test.ts", "packages/types/src/__tests__/object-view-unmirrored-keys-7779.test.ts", "packages/types/src/objectql.ts", "packages/types/src/zod/objectql.zod.ts" ], "tests": "At head 05d46fe (git rev-parse --short HEAD, dirty=0), under the verify lock: pnpm exec vitest run --maxWorkers=2 over 18 files (the touched test files, the four parity tests object-view-unmirrored-keys-7779 / object-view-spec-parity / zod-mirror-parity / console registry-inputs-spec-parity, plus node-recursion-point-8344, SchemaForm.topLevelUnion-11251, objectView-config-keys-retired-4730, specShapedNamedView-8254): 'Test Files 18 passed (18) / Tests 937 passed (937)', exit 0. H1 pins: the four rows a stored view still carrying the key exercises (ListView.filterFieldList-11810, ListView.filterFieldRead-11925, ListView.sortFieldFallback inverted control, ListViewBlock.specInputs-13047 through SchemaRenderer); the no-key row 'offers no hidden field, and orders columns ...' is unchanged and green. ABLATION (fix committed first, src-resolved tests so no dist leg): node ablation-replace.mjs (objectstack's, wrap mode) put the whitelist branch back into the memo's filter by literal anchor — 'anchor x1 → x0', 'replace x0 → x1', blob d0f463578c33 → 5700cb092392, in-mutation grep 'anchor=0 marker=1'; the four files: 'Tests 4 failed | 66 passed (70)', exactly the four retired-key rows red ('expected [ title, estimate_hours, …(1) ] to not include owning_business_unit_id'; 'expected [ title, priority ] to deeply equal [ title, status, priority ]'; 'Unable to find an element with the text: Name'; 'expected Amount to be Name'), the no-key rows green; restore 'blob == HEAD (d0f463578c33) and git diff HEAD is empty', post-restore grep anchor=1 marker=0. One-shot, no permanent file. H2 parity tests at objectui's pin f4755a68: all green, none skipped (see gates/deviations).", "gates": "Local, exit codes captured before any pipe. At 05d46fe: pnpm --filter @object-ui/types type-check EXIT=0; pnpm --filter @object-ui/plugin-list type-check EXIT=0; targeted tests EXIT=0 (above); pnpm check:new-line-citations EXIT=0 ('VERDICT new-cross-file-line-citations: 0 new citation(s)'); pnpm check:control-bytes EXIT=0 ('OK (scanned 9759 tracked text file(s)')); pnpm check:changeset-claims EXIT=0; node scripts/check-changeset-presence.mjs EXIT=0 ('20 source file(s) of 5 released package(s) changed, and this change declares 1 changeset(s)'); node scripts/check-changeset-no-major.mjs EXIT=0; control-byte self-scan of the changed files: no hit. At 416ec6c (only later commit 05d46fe is whitespace in types/objectql.ts): pnpm exec turbo run build --filter=@object-ui/console^... --concurrency=2 EXIT=0 (34 tasks), then type-check types/plugin-list/plugin-view/app-shell/console EXIT=0 each (each log echoes its tsc script); lint (eslint .) types/plugin-list/plugin-view/app-shell/console EXIT=0 each, 0 errors; per changed file eslint findings at head equal or below BASE. NOT MEASURED as red: a first per-package type-check without the dependency closure answered TS2307 for every sibling package (unbuilt dist), re-run correctly above. H4 (scratch objectstack worktree at origin/main 580fd4ed3c98, merge-base --is-ancestor 4bc3becd5f HEAD exit 0, pnpm run setup EXIT=0, local never-committed .objectui-sha edit, OBJECTUI_ROOT=/home/user/objectui-issue-13118 bash scripts/build-console.sh under the lock): BASE ed2805768b32 BUILD_CONSOLE_EXIT=1 — '@object-ui/plugin-list#build' failed with exactly two errors in src/ListView.tsx, TS2339 (Property length does not exist on the spec's [REMOVED] brand) and TS2769 (no Set overload); head 05d46fed0a2b BUILD_CONSOLE_EXIT=0 — plugin-list and types build, bundle canary, single-zod canary and spec-injection assertion pass, 'dist ready'. Scratch worktree and the two objectui build worktrees it registered removed (node_modules first, git worktree remove without --force, both clean). dispatch-gates.mjs refuses objectui, so the local list is the brief's hand-derived one. CI on PR #13169 head 05d46fe at report time (check-runs, 35): success — Changeset Bump Policy, Changeset Claim Re-read, Changeset Declaration, Changeset Fixed Group Check, Changeset Overwrite Report, Governed Surface Queue Guard, Line Citation Gate, label; skipped — Test (coverage), Test (coverage shard), dependabot; in_progress — Build & E2E, Build Docs, Bundle Analysis, Lint, Live E2E (informational), Repo Gates, Test (dist pins), Test (shard 1..16/16), Type Check.", "deviations": [ "H2 fallback, measured: ObjectViewSchema.filterableFields is NOT removed — a local ?: never tombstone was tried first and node-recursion-point-8344 went red in types type-check (TS2344: the object-view zod arm, whose filterableFields slot is the spec's by reference and still admits string[] at pin f4755a68, became a new drifted arm), and that ratchet forbids adding a name to clear a red. So the member is deprecated and typed by reference to the list view's spec-derived slot (the slot its zod twin carries); both faces flip to the spec's tombstone at the pin bump with no edit. NamedListView (no zod twin) is a ?: never tombstone now. A WiderThanDeclared ledger entry the first push (27032ca) added was withdrawn in e1495f3; zod-mirror-parity is byte-identical to BASE.", "Parity mechanism used in object-view-unmirrored-keys-7779 (objectui#12030's PENDING precedent): a new, exactly pinned, self-expiring sixth bucket BUCKET_SPEC_RETIRED_AHEAD_OF_PIN = ['filterableFields'], plus RETIRED_BY_13118 / BUCKET_ONE_UNREAD_SINCE_13118; read pins inverted, not deleted; census 43+22 becomes 42+23 of 65.", "Test files outside the claim's 15-file census: ObjectView.relayRungCensus-7559 (new 'unread' ABSENCES entry, the striped precedent; it never spelled the key). InterfaceListPage.relayCensus-11572 (in the census) had its entry DELETED, per its own 'a stale entry is a rotting census' instruction, not rewritten. Left untouched on purpose: SchemaForm.topLevelUnion-11251, objectView-config-keys-retired-4730, ObjectView.specShapedNamedView-8254 (all green).", "objectql.zod.ts: the by-reference line is unchanged; two comments around it were edited (allowed 'only as the pin allows').", "H4: build-console.sh did not honour OBJECTUI_ROOT — it tests -d .git and a linked worktree's .git is a file — so both legs used the sibling /home/user/objectui ('Using objectui source at /home/user/objectui'), same object store, SHAs resolved. Creating the scratch worktree needed git fetch origin main + git worktree add/remove through /home/user/objectstack's .git, and build-console.sh registered (then I removed) two detached worktrees in /home/user/objectui's .git; no file in either checkout was edited. The red leg used BASE rather than 12dc7b47c340 (the brief allows either).", "Lint and the plugin-view/app-shell/console type-checks were read at 416ec6c; the final commit 05d46fe only restores two indented blank lines in types/objectql.ts, and types + plugin-list type-check and the 18-file test union were re-run on 05d46fe.", "@object-ui/app-shell is declared in the changeset (it changed; the brief allowed it)." ], "mcp_calls": "0", "api_writes": "2 relay dispatches (scripts/pm/fleet-write/dispatch.mjs, POST /repos/objectstack-ai/objectstack/dispatches, executed as objectstack-fleet[bot]): (1) pr_create = POST /repos/objectstack-ai/objectui/pulls (draft) + POST /repos/objectstack-ai/objectui/issues/13169/assignees [huangyiirene], read-back 'identical', 10144 bytes; (2) comment = POST /repos/objectstack-ai/objectui/issues/13118/comments (this report). Plus git push of the branch (5 pushes, not REST). Reads only otherwise (gh api GET).", "open_questions": [], "out_of_scope_findings": [ "carrier: none (承接者:无) · noted in PR #13169 Acceptance notes, not filed — objectstack scripts/build-console.sh tests OBJECTUI_ROOT with -d .git, so a linked-worktree override is silently skipped for the sibling ../objectui (measured in both H4 legs); no wrong answer at a public door here, internal tooling only." ] }Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
ACCEPT → PR #13169 comment 6284647852 · narrowing face (
Clause-②: no (narrowing)): aCONTRACT_REVIEW_TIERreview is owed and dispatched;needs:contract-reviewhung on the PR ·domain:ui#1·session_014MXhk1yjWh37d634hLy3p7· 2026-10-20T06:11Z. The flip waits for that PASS and green check-runs on head05d46fe.objectstack-fleet commentedon Oct 20, 2026
LANDED ·
domain:uiseat 1 ·session_014MXhk1yjWh37d634hLy3p7· 2026-10-20T06:42Z ·pm:dispatchedclearedcbac9d7ddedb17c180cc2315661505f4184b266chas one parent, andgit merge-base --is-ancestorplaces it onorigin/main(exit 0)gh-readonly-queue/main/pr-13169-*branch remainsorigin/main:ListView.tsxreadsschema.filterableFieldsnowhere (0 hits);plugin-view's registration publishes nofilterableFieldsinput (0); app-shell's forward is gone (0);NamedListView.filterableFields?: never(1). Positive control: the zod mirror's by-referenceshape.filterableFieldsline is kept for the pin bump (1)6283602003, amendment6283619668, dev report6284555264, ACCEPT6284647852,## Contract review6284819457(CONTRACT_REVIEW_TIER, narrowing face, PASS on head05d46fe), provenance6284850409completedat 2026-10-20T06:41Z through the PR'sFixes #13118, the only card closed since the merge;pm:dispatchedis removed in this actOwed downstream, not this card's: objectstack
main's Console Pin Gate clears when objectstack's.objectui-sha(12dc7b47c340at this note) moves pastcbac9d7. That bump is objectstack's. The pointer is on objectstack-ai/objectstack#24749.Booked for objectui's next pin bump (the one that takes objectstack
4bc3becd5f):ObjectViewSchema.filterableFieldsand the zod mirror both flip to the spec's tombstone, with no edit;object-view-unmirrored-keys-7779'sBUCKET_SPEC_RETIRED_AHEAD_OF_PINbucket expires and must be emptied;SchemaForm.topLevelUnion-11251still asserts that the spec form offersfilterableFields, so it goes red at that bump. (The contract review's escalation (2).)