Member card of the skills catalog optimization program #14292 (maintainer mandate 2026-09-02, verbatim: 「审核所有的 skills,进行全面的优化。」). Filed by the skills lane seat (session session_01LraLgQVGq8egUwfYZpbYt1). Read-only audit at objectstack origin/maina59f78d. The full findings table is the audit record: the dev posts it verbatim as the first comment on this card at claim time (seat scratchpad audit/objectstack-ui/findings.md).
Audit summary
skills/objectstack-ui/ = 36,542 tokens, 19.5% of the shipped bundle; SKILL.md alone 25,441 — 1.75× the next-largest authored file and 1.83× objectstack-data's entry file, which covers a comparable surface with 8 rules/ files. Generated: contracts/react-blocks.contract.json 5,352 · references/react-blocks.md 3,153 · references/_index.md 1,205. Real usage (= define<X>({): defineAction 34 · definePage 29 · defineView 10 · defineReport 9 · defineDataset 6 · Dashboard literals 5 · App.create 3 · defineCube 1; page tiers structured 12 / html 3 / react 3 / slotted 1; view types grid 25 / simple 10 / kanban 4. Verdict RESTRUCTURE: single 25k entry file with no rules/; dashboards documented at :654-796 and :1437-1658; dateGranularity content filed under ### Drilldown; one generated contract shipped in two renderings.
Top findings (token-delta × confidence)
| id | span | proposal | Δ |
|---|
| UI-B-04 | contracts/react-blocks.contract.json + references/react-blocks.md | DELETE one rendering — identical blocks, the .json has no consumer repo-wide | −5,352 (DEFERRED, #14296 item 3) |
| UI-D-01 | SKILL.md:346-462 | REWRITE-AS-CONSTRUCT — searchableFields, 1,381 tok, 0 real view usages | −900 |
| UI-C-01 | :1659-1768 | MERGE-INTO objectstack-query/rules/filters.md:221-247 (query is the schema owner) | −800 |
| UI-D-02 | :528-577 | RETIRE — timeSegments, 0 usages, self-declared non-spec | −583 |
| UI-C-04 | :73-126 | MERGE-INTO objectstack-data/rules/relationships.md (the text already routes there at :82) | −400 |
| UI-C-02 | :1955-1981 | DELETE — action ctx org/positions narration; :1979 already points at the hooks reference | −342 |
| UI-D-05 | :1626-1640 | DELETE — documents a renderer block, then says dataset-bound dashboards ignore it | −215 |
| UI-F-01 | :750 | ADD filterBindings construct (paid by D-05 + D-06) — 24 real usages, a documented silent-zero bug, the package's own eval asserts it | +170 |
| UI-D-04 | :1354-1362 | DELETE metadata-fence rationale | −145 |
| UI-B-06 | :35-47 | DELETE — restates the frontmatter | −136 |
| UI-D-06 | :1530-1535 | DELETE — v17 removal narration | −125 |
| UI-F-02 | :1481 | ADD widget options query keys (dateGranularity/sortBy/sortOrder/limit) | +120 |
| UI-C-03 | :173-189 | MERGE-INTO objectstack-data | −120 |
| UI-E-02 | :1485 | DELETE retired actionType/actionUrl on a widget | −20 |
| UI-B-01 | whole package | split into rules/ (DEFERRED, #14296 item 1) | ~−15,900 moved |
Incidental falsehoods (fix in this flight)
SKILL.md:1485 — the canonical dashboard teaches actionType: 'url', actionUrl: '…' on a widget; both are retiredKey(...) = z.never() (packages/spec/src/ui/dashboard.zod.ts:382-384; prescription :309-320 "a dashboard widget has NO action button, and never had one"). Parse error AND tsc error; the sole blocker on the largest ungated example.SKILL.md:1572 — "Date bucketing lives on the dataset dimension, not the widget" — contradicted by dashboard.zod.ts:217-225: options.dateGranularityoverrides the dataset dimension's default for this widget.- Frontmatter
:13-14 — "the React renderer implementation (lives in packages/client-react)": that package is React hooks for the client SDK; the renderer is @object-ui/react-runtime (objectui).
Three funded additions
filterBindings construct (+170, paid by UI-D-05 + UI-D-06) — prevents the failure examples/app-showcase/src/ui/dashboards/ops-dashboard.dashboard.ts:30-49 records verbatim (four tiles and a chart read 0 for any selection).- Widget
options query keys (+120, paid by UI-D-08 + UI-D-03) — dashboard.zod.ts:217-252. os:check marks on the four highest-traffic examples (+10, paid by UI-E-02).
Flight scope
IMPLEMENT (same-file, shrink-only): every DELETE / MERGE-INTO / REWRITE-AS-CONSTRUCT / RETIRE row at HIGH or MED; the three funded additions; falsehoods 1–3; consolidate the two dashboard sections into one place inside SKILL.md (reorder is free); UI-A-02/A-03 routing-text corrections in the frontmatter (regenerate skills/README.md).
ANCHOR RULINGS: date macros / filter tokens — anchor is objectstack-query/rules/filters.md (query lists date-macros.zod.ts as a core schema); this package deletes :1659-1768 and leaves a one-line pointer; if a TRUE row here is missing from query's table, list it in the PR body under "follow-up for objectstack-query" (note: this package's :1706-1708 "unknown placeholders silently pass through" is FALSE — packages/core/src/utils/filter-tokens.ts:44,378 throws UnknownFilterTokenError — delete it, do not port it). Relationships/objects → anchor objectstack-data/rules/relationships.md (UI-C-03/C-04: delete + pointer). Action ctx → anchor objectstack-data/references/data-hooks.md. timeSegments (UI-D-02) → delete (non-spec, 0 usages); the objectui skill is the renderer's home.
DEFER (pending #14296): UI-B-01 split into rules/ (item 1); UI-B-04 generated JSON rendering (item 3 — ⛔ do not touch generated files); UI-H-01 new eval file (item 2).
Flight constraints (binding)
- ONE draft PR, first line
Fixes #<this card>; governed ⇒ stays draft; review requests are the seat's step. - Token ratchet: no ratcheted file may grow; additions paid by deletions in the SAME file; ⛔ re-wrap is not payment; ⛔ no ceiling raise; ⛔ no new files; ⛔ do not touch the ratchet script (this PR deletes no file).
- ⛔ Never edit another package's files: MERGE-INTO another package = DELETE here + one-line pointer; a missing/weaker anchor goes in the PR body under "follow-up for ".
- Generated files untouched (
references/_index.md, contracts/*, references/react-blocks.md); frontmatter edits ⇒ regenerate skills/README.md (pnpm --filter @objectstack/spec gen:skill-docs). - Live surface with zero measured usage ⇒ one row pointing at its schema, never delete the last mention; retired/tombstoned surface ⇒ delete.
- A false claim matching a spec
.describe() string ⇒ file the spec-side twin as an out-of-scope card. - Gates:
node scripts/check-skills-token-ratchet.mjs, pnpm --filter @objectstack/spec check:skill-examples, pnpm check:skill-compatibility, pnpm check:skill-identifier-liveness, plus node scripts/pm/dispatch-gates.mjs --commands <changed paths>; record the head sha. - PR body: per-item 落点 | before | after list keyed by finding id; per-file token delta;
needs:contract-review on both carriers (falsehoods 1–2 are contract-semantics corrections).
Refs: #14292 · #14296 · #13658.
Member card of the skills catalog optimization program #14292 (maintainer mandate 2026-09-02, verbatim: 「审核所有的 skills,进行全面的优化。」). Filed by the skills lane seat (session
session_01LraLgQVGq8egUwfYZpbYt1). Read-only audit at objectstackorigin/maina59f78d. The full findings table is the audit record: the dev posts it verbatim as the first comment on this card at claim time (seat scratchpadaudit/objectstack-ui/findings.md).Audit summary
skills/objectstack-ui/= 36,542 tokens, 19.5% of the shipped bundle;SKILL.mdalone 25,441 — 1.75× the next-largest authored file and 1.83× objectstack-data's entry file, which covers a comparable surface with 8rules/files. Generated:contracts/react-blocks.contract.json5,352 ·references/react-blocks.md3,153 ·references/_index.md1,205. Real usage (= define<X>({):defineAction34 ·definePage29 ·defineView10 ·defineReport9 ·defineDataset6 · Dashboard literals 5 ·App.create3 ·defineCube1; page tiers structured 12 / html 3 / react 3 / slotted 1; view types grid 25 / simple 10 / kanban 4. Verdict RESTRUCTURE: single 25k entry file with norules/; dashboards documented at:654-796and:1437-1658;dateGranularitycontent filed under### Drilldown; one generated contract shipped in two renderings.Top findings (token-delta × confidence)
contracts/react-blocks.contract.json+references/react-blocks.md.jsonhas no consumer repo-wideSKILL.md:346-462searchableFields, 1,381 tok, 0 real view usages:1659-1768objectstack-query/rules/filters.md:221-247(query is the schema owner):528-577timeSegments, 0 usages, self-declared non-spec:73-126objectstack-data/rules/relationships.md(the text already routes there at:82):1955-1981ctxorg/positions narration;:1979already points at the hooks reference:1626-1640:750filterBindingsconstruct (paid by D-05 + D-06) — 24 real usages, a documented silent-zero bug, the package's own eval asserts it:1354-1362:35-47:1530-1535:1481optionsquery keys (dateGranularity/sortBy/sortOrder/limit):173-189:1485actionType/actionUrlon a widgetrules/(DEFERRED, #14296 item 1)Incidental falsehoods (fix in this flight)
SKILL.md:1485— the canonical dashboard teachesactionType: 'url', actionUrl: '…'on a widget; both areretiredKey(...)=z.never()(packages/spec/src/ui/dashboard.zod.ts:382-384; prescription:309-320"a dashboard widget has NO action button, and never had one"). Parse error AND tsc error; the sole blocker on the largest ungated example.SKILL.md:1572— "Date bucketing lives on the dataset dimension, not the widget" — contradicted bydashboard.zod.ts:217-225:options.dateGranularityoverrides the dataset dimension's default for this widget.:13-14— "the React renderer implementation (lives inpackages/client-react)": that package is React hooks for the client SDK; the renderer is@object-ui/react-runtime(objectui).Three funded additions
filterBindingsconstruct (+170, paid by UI-D-05 + UI-D-06) — prevents the failureexamples/app-showcase/src/ui/dashboards/ops-dashboard.dashboard.ts:30-49records verbatim (four tiles and a chart read 0 for any selection).optionsquery keys (+120, paid by UI-D-08 + UI-D-03) —dashboard.zod.ts:217-252.os:checkmarks on the four highest-traffic examples (+10, paid by UI-E-02).Flight scope
IMPLEMENT (same-file, shrink-only): every DELETE / MERGE-INTO / REWRITE-AS-CONSTRUCT / RETIRE row at HIGH or MED; the three funded additions; falsehoods 1–3; consolidate the two dashboard sections into one place inside
SKILL.md(reorder is free); UI-A-02/A-03 routing-text corrections in the frontmatter (regenerateskills/README.md).ANCHOR RULINGS: date macros / filter tokens — anchor is
objectstack-query/rules/filters.md(query listsdate-macros.zod.tsas a core schema); this package deletes:1659-1768and leaves a one-line pointer; if a TRUE row here is missing from query's table, list it in the PR body under "follow-up for objectstack-query" (note: this package's:1706-1708"unknown placeholders silently pass through" is FALSE —packages/core/src/utils/filter-tokens.ts:44,378throwsUnknownFilterTokenError— delete it, do not port it). Relationships/objects → anchorobjectstack-data/rules/relationships.md(UI-C-03/C-04: delete + pointer). Actionctx→ anchorobjectstack-data/references/data-hooks.md.timeSegments(UI-D-02) → delete (non-spec, 0 usages); the objectui skill is the renderer's home.DEFER (pending #14296): UI-B-01 split into
rules/(item 1); UI-B-04 generated JSON rendering (item 3 — ⛔ do not touch generated files); UI-H-01 new eval file (item 2).Flight constraints (binding)
Fixes #<this card>; governed ⇒ stays draft; review requests are the seat's step.references/_index.md,contracts/*,references/react-blocks.md); frontmatter edits ⇒ regenerateskills/README.md(pnpm --filter @objectstack/spec gen:skill-docs)..describe()string ⇒ file the spec-side twin as an out-of-scope card.node scripts/check-skills-token-ratchet.mjs,pnpm --filter @objectstack/spec check:skill-examples,pnpm check:skill-compatibility,pnpm check:skill-identifier-liveness, plusnode scripts/pm/dispatch-gates.mjs --commands <changed paths>; record the head sha.needs:contract-reviewon both carriers (falsehoods 1–2 are contract-semantics corrections).Refs: #14292 · #14296 · #13658.