Skip to content

docs(plugin-view): teach the spec-shaped named list view (objectui#8255) - #10504

Merged
objectstack-fleet[bot] merged 6 commits into
mainfrom
claude/issue-8255-docs-spec-shaped-list-view
Sep 25, 2026
Merged

objectstack-fleet[bot] merged 6 commits into
mainfrom
claude/issue-8255-docs-spec-shaped-list-view

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #8255
Clause-②: no

The docs half of the objectui#7928 ruling (decision batch #70, option A). The renderer half, objectui#8254, landed as PR #9605 and honours a spec-shaped named view, including columns in either union arm and filter as rule objects. This PR makes the four pages teach that shape: the three the card names, plus the CRUD guide folded in by the seat decision 5827390159 (patch round 1, head 9c7f893d3).

What changed

  • packages/plugin-view/README.md and content/docs/plugins/plugin-view.mdx (the same three examples in each): every named view now carries columns, the one key ObjectListViewSchema requires. The label-only all view in the ObjectView overview gains columns: ['name', 'email'] (the same list as the snippet's table.columns), and its inline comment now says each view needs label and columns. cheap (Read/List) gains columns: ['name', 'price'] and admins (View tabs) gains columns: ['name', 'email'], matching their sibling views.
  • content/docs/api/schema-reference.md, the ObjectViewSchema example: both views gain columns (the example's own table.columns list), and my-deals spells its filter as a spec rule object, { "field": "owner", "operator": "equals", "value": "{current_user_id}" }, instead of the ObjectQL tuple. The value is the spec's CONTEXT_TOKENS spelling (patch round 1; it was an invented ${currentUser.id} nothing resolves), and one sentence beside the example says the host that renders the list resolves the token, with the object-view node path tracked in objectui#10506. The view is again written label-first. The old order only existed to keep a pinned line byte-identical, and that pin now reads this example differently (see below).
  • content/docs/guide/building-crud-app.md (patch round 1): TaskSchema.listViews.active.filter becomes the rule object { field: 'status', operator: 'not_equals', value: 'Done' } instead of the tuple.
  • .changeset/object-view-unmirrored-keys-7779.md (patch round 1): the one sentence this PR falsified now reads in the past tense (the spec refused the named views the docs taught when the entry was written; objectui#8255 has since rewritten them). The front matter is byte-identical.
  • scripts/markdown-test-inputs.mjs (patch round 1): the 7779 pin's ledger row gains the guide page in reads, because --audit refuses an unadjudicated document the pin now resolves.
  • No renderer, type or schema change.

Validation against the installed spec

Schema: ObjectListViewSchema from @objectstack/spec/ui, @objectstack/spec@17.4.0, resolved from packages/types (the ^17.4.0 range there, ^17.0.0 in plugin-view, same install). This scratch script was not committed. It finds every fenced block in the three pages that mentions listViews and parses it with the TypeScript parser (a json body is wrapped in an initializer). For each listViews property it turns the literal into a value and runs each entry through ObjectListViewSchema.safeParse.

Before (base 39395455a), 12 entries in 7 blocks, 8 refused:

REFUSE  packages/plugin-view/README.md:154 (typescript) listViews.all -> columns: invalid_union
ACCEPT  packages/plugin-view/README.md:464 (typescript) listViews.all
REFUSE  packages/plugin-view/README.md:464 (typescript) listViews.cheap -> columns: invalid_union
ACCEPT  packages/plugin-view/README.md:622 (typescript) listViews.active
REFUSE  packages/plugin-view/README.md:622 (typescript) listViews.admins -> columns: invalid_union
REFUSE  content/docs/plugins/plugin-view.mdx:72 (typescript) listViews.all -> columns: invalid_union
ACCEPT  content/docs/plugins/plugin-view.mdx:399 (typescript) listViews.all
REFUSE  content/docs/plugins/plugin-view.mdx:399 (typescript) listViews.cheap -> columns: invalid_union
ACCEPT  content/docs/plugins/plugin-view.mdx:523 (typescript) listViews.active
REFUSE  content/docs/plugins/plugin-view.mdx:523 (typescript) listViews.admins -> columns: invalid_union
REFUSE  content/docs/api/schema-reference.md:872 (json) listViews.all -> columns: invalid_union
REFUSE  content/docs/api/schema-reference.md:872 (json) listViews.my-deals -> columns: invalid_union | filter.0: invalid_type
SUMMARY listViews blocks=7 entries accepted=4 refused=8 controls=pass

After (this branch), all 12 accepted, controls refused:

ACCEPT  packages/plugin-view/README.md:154 (typescript) listViews.all
ACCEPT  packages/plugin-view/README.md:464 (typescript) listViews.all
ACCEPT  packages/plugin-view/README.md:464 (typescript) listViews.cheap
ACCEPT  packages/plugin-view/README.md:623 (typescript) listViews.active
ACCEPT  packages/plugin-view/README.md:623 (typescript) listViews.admins
ACCEPT  content/docs/plugins/plugin-view.mdx:72 (typescript) listViews.all
ACCEPT  content/docs/plugins/plugin-view.mdx:399 (typescript) listViews.all
ACCEPT  content/docs/plugins/plugin-view.mdx:399 (typescript) listViews.cheap
ACCEPT  content/docs/plugins/plugin-view.mdx:524 (typescript) listViews.active
ACCEPT  content/docs/plugins/plugin-view.mdx:524 (typescript) listViews.admins
ACCEPT  content/docs/api/schema-reference.md:872 (json) listViews.all
ACCEPT  content/docs/api/schema-reference.md:872 (json) listViews.my-deals
CONTROL ok  tuple filter: refused -> filter.0: invalid_type
CONTROL ok  label-only: refused -> columns: invalid_union
CONTROL ok  entry-level default: refused -> (root): unrecognized_keys ["default"]
CONTROL ok  catalog shape: accepted
SUMMARY listViews blocks=7 entries accepted=12 refused=0 controls=pass

Patch round 1, over four pages (the CRUD guide added). Base 39395455a: SUMMARY listViews blocks=8 entries accepted=5 refused=9 controls=pass (the extra refusal: content/docs/guide/building-crud-app.md:130 (ts) listViews.active -> filter.0: invalid_type). Head 9c7f893d3:

SUMMARY listViews blocks=8 entries accepted=14 refused=0 controls=pass

The card named three examples. Measured, seven blocks carried eight refused entries: the cheap and admins views in both the README and the mdx were refused too (no columns), so all of them are rewritten.

The pin that held the old forms, and its successor

packages/types/src/__tests__/object-view-unmirrored-keys-7779.test.ts pinned the refused forms off disk as "still what the docs teach". That was the input to the measurement keeping listViews ledgered. Rewriting the docs turned it red, as designed. Before the successor was written it failed one test out of 233 (expected '# @object-ui/plugin-view…' to contain 'listViews: { all: { label: 'All User…').

That test is replaced by its successor and is not weakened. The new test reads every named view the four pages author off disk (three, plus the CRUD guide from patch round 1), using the TypeScript parser, and requires each one to parse under ObjectListViewSchema. It requires at least one entry per page, so a page cannot pass vacuously. It also runs a positive control through the same predicate: the retired label-only and tuple forms must come back refused, and the spec shape must not. The spec-side refusal assertions in the test before it are unchanged; only its title and comments moved to the past tense. The file header sentence that said the docs "teach" the refused forms is updated the same way. The pin reads all four pages, and its scripts/markdown-test-inputs.mjs ledger row names all four in reads (--audit: exit 0, 75 declared entries, all present).

This PR claims the pages validate. Per AGENTS.md #9, that claim now points at this pin as the instrument that re-derives it, not at the scratch output above.

Reverse verification (one-time, not committed)

Each leg ran through ablation-replace.mjs: the anchor had to hit, the blob had to change on disk, and the restore was proven by blob == HEAD plus an empty git diff HEAD.

  • Leg A: drop columns from the README's cheap view. Predicted red, naming that entry. Observed exit 1: + "packages/plugin-view/README.md:458 listViews.cheap". Restored, blob e7f0e491f2b4 == HEAD.

  • Leg B: put the tuple filter back in schema-reference.md. Predicted red naming my-deals, with the objectui#7923 pin still green. Observed exit 1: + "content/docs/api/schema-reference.md:853 listViews.my-deals", Test Files 1 failed | 1 passed (2). Restored, blob 67508396a7c5 == HEAD.

  • Leg C: set columns: 'name' on the README overview view, to prove check:doc-snippets compiles that block. Observed exit 1: packages/plugin-view/README.md:154:43 TS2322: Type 'string' is not assignable to type 'string[]'. Restored.

  • Leg D (patch round 1): put the tuple back in the CRUD guide. Observed exit 1: + "content/docs/guide/building-crud-app.md:89 listViews.active", Tests 1 failed | 228 passed (229). Restored: blob f390aef0ef41 == HEAD, git diff HEAD empty.

Gates, at HEAD 9c7f893d3 (patch round 1 re-ran every gate below)

gate result
pnpm check:doc-snippets (after the gate's own --build-filter closure, Tasks: 35 successful, 35 total) exit 0: Semantic phase: 673 of 673 block(s) judged, 0 failed.
pnpm check:doc-examples exit 0: Every covered @example compiles, or fails exactly as its ledger row declares. No ledger row keys on these examples (its three plugin-view rows are JSDoc blocks in the ObjectView source)
pnpm check:doc-fences exit 0
pnpm check:doc-types exit 0: Every documented component type is registered.
pnpm docs:check-links exit 0: Links are valid across 17 scan roots.
node scripts/check-doc-example-ids.mjs · pnpm check:readme-exports · node scripts/check-shell-escape-residue.mjs exit 0 each
pnpm check:control-bytes exit 0
pnpm check:new-line-citations exit 0: 0 new citation(s)
node scripts/check-changeset-presence.mjs exit 0. It owed a changeset for the test file under packages/types/src/, answered with the empty-frontmatter .changeset/8255-docs-spec-shaped-list-view.md. The docs alone owed none
node scripts/check-changeset-no-major.mjs · node scripts/check-pending-changeset-literals.mjs · node scripts/markdown-test-inputs.mjs --audit exit 0 each
doc-gate suites: 11 files under scripts/__tests__/ (the check-doc-* suites, markdown-test-inputs, check-pending-changeset-literals) exit 0: Test Files 11 passed (11), Tests 634 passed (634)
@object-ui/types, whole package: pnpm exec vitest run packages/types/ exit 0: Test Files 232 passed (232), Tests 5156 passed (5156)
pnpm --filter @object-ui/types type-check (includes tsconfig.test.json; --listFiles shows the edited pin in the program, 1 hit) exit 0
node scripts/check-governed-queue-guard.mjs --test on the eight paths NOT GOVERNED
patch round 1 additions: pnpm check:changeset-claims (the 7779 entry no longer flagged) · node scripts/check-changeset-overwrite.mjs (report-only; 7779 front matter unchanged, @object-ui/types: minor) · the 7779 + 7923 pins and the guideCrudAppRenders readers in plugin-detail and plugin-form (Tests 249 passed (249)) · 18 scripts/__tests__ suites naming the edited gates (Tests 991 passed (991)) exit 0 each

NOT MEASURED: the docs-site build (Build Docs), because CI owns it. The mdx edit is inside a code fence.

Premise check

Acceptance notes

  • A present-tense paragraph in the pending changeset .changeset/object-view-unmirrored-keys-7779.md is falsified by this PR. It says the spec refuses "the named views this package's own README and content/docs/api/schema-reference.md teach" (check:changeset-claims, report-only, flags it). That file is outside this claim's file surface, so it is left untouched here. It publishes verbatim at the next release, and the open release PR chore: release packages #5400 carries it. ⇒ Corrected in patch round 1 (seat decision 5827390159, option A): the one sentence now reads in the past tense, and the front matter is byte-identical.
  • Comments that describe the docs as still teaching the refused forms: the listViews ledger docblock in packages/types/src/zod/objectql.zod.ts and the matching UnmirroredDeclared entry comment in packages/types/src/__tests__/zod-mirror-parity.test.ts. The owner is objectui#7928's mirror flip, which rewrites both. The header of schema-reference-named-list-view-keys-7923.test.ts says the filter line is "held verbatim" by the 7779 pin and that the running dialect is unmeasured; no carrier has been named for it. Its assertions stay green.
  • content/docs/guide/building-crud-app.md also teaches a named view the spec refuses: TaskSchema.listViews.active uses the tuple [['status', '!=', 'Done']], refused by the spec's ObjectSchema.listViews at active.filter.0, while the rule-object spelling parses. It was not one of this card's three pages. ⇒ Folded in by patch round 1 (seat decision 5827390159): the rule-object spelling now, and the page joins the pin.
  • my-deals keeps its value ${currentUser.id}, because only the dialect was in scope. Nothing resolves that value on an object-view node. SchemaRenderer does not evaluate listViews (the spec's expressionBindableTextKeysFor('object-view') is empty), and plugin-view, plugin-grid and plugin-list have zero resolveFilterPlaceholders / current_user_id / useFilterScope reads. For comparison, app-shell's ObjectView.tsx has 3. The spec's context token is {current_user_id}. ⇒ Patch round 1 (seat decision 5827390159, option B): the example now uses {current_user_id}, with one sentence naming the host that resolves it; the object-view node path's gap is filed as objectui#10506.

Generated by Claude Code

Every `listViews` entry in the plugin-view README, plugin-view.mdx and
schema-reference.md now parses under @objectstack/spec's
ObjectListViewSchema: each named view carries `columns` (the one key the
spec requires), and schema-reference's `my-deals` view spells its filter
as a spec rule object instead of the ObjectQL tuple.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BA3nKVUwKQJf8DBxrSVtNC
The pin that held the three refused named-view forms as "still what the
docs teach" now asserts their successor: every `listViews` entry in the
plugin-view README, plugin-view.mdx and schema-reference.md, read off
disk with the TypeScript parser, parses under the spec's
ObjectListViewSchema. A positive control runs the same predicate over
the retired forms (label-only, tuple filter) and requires both refused.
The spec-side refusal assertions are unchanged.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BA3nKVUwKQJf8DBxrSVtNC
@github-actions github-actions Bot added documentation Improvements or additions to documentation package: types plugin tests labels Sep 25, 2026
@github-actions

github-actions Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

changeset-claim-re-read

⚠️ 14 pending changeset(s) describe a file this change touches

Their bodies publish verbatim into the CHANGELOG at the next release, so this is a request to re-read them against your diff — addressed here because you are the one seat that can answer it without re-deriving anything.

⛔ Nothing here blocks, and nothing here is a verdict on your change. This gate exits 0, is not a required context, and judges name resolution, never meaning: it asked whether a pending body names a file you touched. "Is this sentence still true?" is the one question it will not answer, and the one you are being asked to answer.

.changeset/3917-retire-action-condition-branch.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    • ActionCondition is removed from @object-ui/types (and from the barrel export). - ActionSchema.condition is retyped to the predicate the runtime actually honours: boolean | string | { dialect?: string; source: string } — the same three arms ActionRunner's own ActionDef.condition carries, and the same vocabulary visible and disabled use. - ActionConditionSchema is removed from @object-ui/types/zod (and from the zod barrel); the condition key now validates against that predicate union. - The two teaching sites (content/docs/core/enhanced-actions.mdx Conditional Execution, content/docs/api/schema-reference.md ActionSchema table) are rewritten to the live vocabulary: condition is a gate; a branch is expressed as separate actions with mutually exclusive conditions.

.changeset/6896-retire-chart-inline-data.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    ⚠️ One correction to the record the ruling rests on. The ruling states zero authorship of a populated series[].data outside tests across packages/ / apps/ / examples/. The re-measurement finds one such site inside those roots — packages/types/examples/data-display-examples.json (2 series) — plus four outside them, in documentation: content/docs/api/schema-reference.md (3) and content/docs/core/report-schema.mdx (1).

.changeset/6939-kanban-column-cards.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    Breaking, deliberately. KanbanColumn declared its card list as items in complex.ts and in the zod mirror complex.zod.ts. Every board reads cards. Measured on origin/main 78a3cc238: KanbanImpl.tsx reads .cards on 12 lines, KanbanEnhanced.tsx on 8, and bucketCardsIntoColumns twice more as col.cards || []; .items had zero read sites in either board (a same-shaped .title control on the same two files returns 8 and 3, so those zeros are readings and not a mis-shaped probe). Both catalog entries, the plugin docs and content/docs/api/schema-reference.md all author cards.

.changeset/6951-tree-view-data-retired.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    What was measured, on this branch's base. TreeViewSchema declared two spellings for its one inline-nodes slot — nodes (read second) and data (read third: boundData || schema.nodes || schema.data || [] at renderers/data-display/tree-view.tsx:105), both declared by objectui#6150. data had been REQUIRED until objectui#6939 / PR fix(types): tree-view mirror stops requiring the limb it reads third (group 2 of objectui#6939) #7533 made it optional, so this retirement starts from a declared-and-optional member on both faces. The in-repo corpus at the retirement: seven tree-view nodes under examples/schema-catalog and packages/types/examples plus one content/docs fence — six on nodes, two on data (packages/types/examples/data-display-examples.json and content/docs/api/schema-reference.md), both rewritten; no package source authored either spelling.

.changeset/7664-kanban-arm-plugin-dialect.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    Migration. Author boards in the plugin dialect — objectName + groupBy for an object-bound board, or columns[].cards[] with badges for a static one. Replace DeclarativeKanbanSchema imports with KanbanSchema (from @object-ui/types, or the Zod KanbanSchema from @object-ui/types/zod; @object-ui/plugin-kanban re-exports the same KanbanSchema type). Delete draggable (drag-and-drop is always on) and column color (style a lane through className). content/docs/api/schema-reference.md's kanban section now documents this dialect.

.changeset/7997-detail-view-related-retired.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    Documentation. packages/plugin-detail/README.md and content/docs/api/schema-reference.md stop teaching the retired array and gain a migration block each.

.changeset/8221-retire-legacy-string-sort.md

  • names content/docs/plugins/plugin-view.mdx → content/docs/plugins/plugin-view.mdx — edited by this change

    Docs teach the array only: content/docs/plugins/plugin-map.mdx, content/docs/plugins/plugin-view.mdx and packages/plugin-view/README.md.

  • names packages/plugin-view/README.md → packages/plugin-view/README.md — edited by this change

    Docs teach the array only: content/docs/plugins/plugin-map.mdx, content/docs/plugins/plugin-view.mdx and packages/plugin-view/README.md.

.changeset/8268-testid-emitted-as-data-testid.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    The other direction — retiring the promise — was considered and declined. It is what objectui#7088 did for BaseSchema.hidden, but that key had a working behaviour to describe and zero named consumers, and the ruling's decline turned on exactly that. This promise already has carriers outside the type declaration: content/docs/api/schema-reference.md states it as a table row and authors testId in that page's own base-schema example, @object-ui/cli's OBJECTUI_STRUCTURAL_KEYS identifies a file as an ObjectUI schema node by this key, ObjectGridSlotKey / ObjectFormSlotKey pin it, SchemaBuilder.testId() writes it, and ADR-0054 C4 — shipped — reads "the renderer emits data-testid … derived from metadata".

.changeset/8653-listview-title-retired-rowactiondefs-pinned.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    title — retired. ListView resolved its export filename through schema.label || (schema as any).title. @objectstack/spec/ui's ListViewSchema refuses title by name (unrecognized_keys: ['title']) while ObjectGridPropsSchema accepts it; packages/types mirrors the platform contract rather than ruling over it, so declaring title on ListViewSchema would have made this repo accept what the platform save gate rejects. That asymmetry is also why objectui#6639 could take the declare branch for ObjectGridSchema.title one package over and this site could not. A parse-based census of apps/ examples/ content/ and packages/ found zero list-view nodes authoring title, so the retirement costs no author a filename. Over that same corpus the instrument reports three object-grid nodes carrying the key: two authored ones, both in content/docs/api/schema-reference.md, plus one that is not authored at all — packages/plugin-view/src/ObjectView.tsx composes title: schema.table?.title onto a grid node it builds, so it is a producer writing the key rather than an author declaring it. ObjectGrid's own title reads are untouched — they remain declared, ruled and read.

.changeset/8801-object-kanban-allow-collapse-retired.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    • the declarations retired here — packages/types/src/objectql.ts and its mirror packages/types/src/zod/objectql.zod.ts; - the pins that assert the retirement — object-kanban-allow-collapse-retired-8801.test.ts and bare-kanban-node-key-retired-8802.test.ts; - a comment in packages/types/src/zod/complex.zod.ts, recording that the deleted retiredZeroReadKanbanKey helper once carried this spelling on the SIBLING arm; - one row of content/docs/api/schema-reference.md; - the .changeset/ release notes that discuss it — this one, the two historical entries covering the sibling arm's own spelling, and objectui#9629's note recording the correction to this paragraph.

.changeset/9187-record-highlights-layout-two-values.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    ⚠️ The census behind this narrowing covers this repository only, and it found no in-repo authoring to migrate: every in-tree layout: 'grid' belongs to a different component (detail-view in content/docs/api/schema-reference.md and phase2-schemas.test.ts, ai-recommendations in packages/plugin-ai/README.md), and the one in-repo consumer of this interface that writes a layout (p1-spec-alignment.test.ts) writes 'horizontal'. So no document in this repository stops type-checking. A TypeScript consumer outside this repo that wrote grid is not observable from here and gets a compile error (TS2322) naming the key — which is why the FROM/TO is spelled out above.

.changeset/calendar-view-schema-converge.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    Runtime renderer behaviour is unchanged. @object-ui/plugin-calendar's README and content/docs/api/schema-reference.md are repaired to the converged surface in the same change, so no copy of the old contradiction survives.

.changeset/issue-5373-retire-crud-schema.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    crud had four declaration faces and no registered renderer, for the whole life of the key: the TS interface (packages/types/src/crud.ts), the zod mirror (packages/types/src/zod/crud.zod.ts), a dedicated branch in validateSchema that affirmatively PASSED it, and CRUDBuilder in @object-ui/core. A node spelling it painted the OBJUI-001 "Unknown component type" panel, and content/docs/api/schema-reference.md published it as reference material — so a reader (or an AI author) who copied the page got a red panel.

  • names api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    Authoring crud is now REFUSED BY NAME rather than passed or silently ignored. validateSchema returns an error with code: 'RETIRED_TYPE' on schema.type — at any depth, since it is what validateChildren recurses with — so assertValidSchema throws and isValidSchema answers false. The message names the migration: object-grid for the record table with its toolbar, filters, pagination and row/batch actions, object-form for the create/edit form, and detail for the record view. api/schema-reference.md is rewritten around those shapes.

.changeset/table-renderer-declared-column-contract-5350.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    What makes this site different from its three siblings is that the alias was not merely tolerated, it was published. content/docs/api/schema-reference.md §TableSchema shipped a copyable { "name": "id", "label": "#" } example and a property row reading "Column definitions with name, label, …", while packages/types declared the opposite pair. Docs and type disagreed about one type they both call TableColumn, each internally consistent. Retiring the alias without correcting the page would have turned a documented, working example into a silently broken one, so both halves land together: the page now authors accessorKey/header. The same row also advertised a render property that TableColumn has never declared — the renderer's hook is cell — and that claim is dropped rather than re-spelled.

Read the paragraph, not the line: both false halves of the objectui#8617 claim sat in one paragraph, and correcting either alone would have left it asserting the same wrong thing.

If a claim did go false, correct the body. That is precedented and prose-only, frontmatter untouched; check-changeset-overwrite.mjs will report the correction as its own case 2 ("correcting a declaration on purpose … legitimate"), which is the intended shape — one gate asks for the read, the other records the write.

Not covered, stated so nobody reads this as more: a born-false claim that spells no line address at all (objectui#9495 coordinated one by ORDINAL — "a grep finds that member first" — and deciding that means reading what the sentence means), a claim spelled as a symbol or a package rather than a backticked file name, and a file named ambiguously.

Compared the checked-out tree with 02fe2578a (merge-base with origin/main): 6 file(s) changed outside .changeset/, read against 1418 pending declaration(s) that publish a body (1998 pending in total). · run

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3045.2 KB 3104.5 KB
Main entry chunk (gzip) 147.8 KB 350 KB
Entry file index-CgpwT8rS.js —
Status PASS —

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 16.68KB 6.20KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.52KB 3.45KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.13KB 7.95KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 544.62KB 130.17KB
core (index.js) 9.22KB 3.71KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 223.86KB 62.25KB
fields (index.js) 256.53KB 64.97KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.24KB 2.27KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.40KB 12.91KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 39.28KB 11.09KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.52KB 4.88KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 16.01KB 3.93KB
plugin-calendar (index.js) 51.22KB 14.56KB
plugin-charts (index.js) 74.76KB 20.82KB
plugin-chatbot (index.js) 198.36KB 47.20KB
plugin-dashboard (index.js) 133.59KB 35.39KB
plugin-designer (index.js) 216.25KB 44.39KB
plugin-detail (index.js) 231.81KB 61.27KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 146.50KB 37.51KB
plugin-gantt (index.js) 168.25KB 41.46KB
plugin-grid (index.js) 215.45KB 58.90KB
plugin-kanban (index.js) 49.30KB 15.39KB
plugin-list (index.js) 114.48KB 28.29KB
plugin-map (index.js) 21.83KB 7.07KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.55KB 11.99KB
plugin-timeline (index.js) 30.64KB 8.94KB
plugin-tree (index.js) 10.52KB 3.69KB
plugin-view (index.js) 87.90KB 21.97KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 114.58KB 37.60KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.03KB 1.86KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.78KB 2.09KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.78KB 2.56KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 18.27KB 6.20KB
types (ai.js) 4.11KB 2.06KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 17.15KB 6.32KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

…guide

schema-reference's my-deals view now filters on the spec's own context
token {current_user_id} (CONTEXT_TOKENS in @objectstack/spec/data)
instead of an invented ${currentUser.id}, with one sentence saying the
host that renders the list resolves it and that the object-view node
path is tracked in objectui#10506. The CRUD guide's TaskSchema
listViews.active filter becomes a { field, operator, value } rule
object, which the spec's ObjectSchema.listViews accepts.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BA3nKVUwKQJf8DBxrSVtNC
The guide page joins NAMED_VIEW_DOCS, keeping the per-page non-vacuity
bound, and the markdown-test-inputs ledger row for the pin now lists it
as a read so a markdown-only change to the guide still runs the pin.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BA3nKVUwKQJf8DBxrSVtNC
…ified

The pending 7779 entry said the spec refuses the named views the docs
teach; the docs no longer teach them, so that sentence now says what
the docs taught when the entry was written and that objectui#8255 has
since rewritten them. Front matter unchanged. This change's own
empty-frontmatter changeset now also names the CRUD guide and the
context token.

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

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3044.6 KB 3104.5 KB
Main entry chunk (gzip) 147.8 KB 350 KB
Entry file index-Ba1RqfGT.js —
Status PASS —

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 16.68KB 6.20KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.52KB 3.45KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.13KB 7.95KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 544.62KB 130.17KB
core (index.js) 9.22KB 3.71KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 223.86KB 62.25KB
fields (index.js) 256.68KB 65.01KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.24KB 2.27KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.40KB 12.91KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 39.28KB 11.09KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.52KB 4.88KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 16.01KB 3.93KB
plugin-calendar (index.js) 51.22KB 14.56KB
plugin-charts (index.js) 74.95KB 20.88KB
plugin-chatbot (index.js) 198.36KB 47.20KB
plugin-dashboard (index.js) 133.59KB 35.39KB
plugin-designer (index.js) 216.25KB 44.39KB
plugin-detail (index.js) 232.25KB 61.40KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 146.50KB 37.51KB
plugin-gantt (index.js) 168.43KB 41.50KB
plugin-grid (index.js) 215.49KB 58.91KB
plugin-kanban (index.js) 49.30KB 15.39KB
plugin-list (index.js) 114.48KB 28.29KB
plugin-map (index.js) 21.83KB 7.07KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.55KB 11.99KB
plugin-timeline (index.js) 30.64KB 8.94KB
plugin-tree (index.js) 10.52KB 3.69KB
plugin-view (index.js) 88.00KB 21.97KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 114.58KB 37.60KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.03KB 1.86KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.78KB 2.09KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.78KB 2.56KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 18.27KB 6.20KB
types (ai.js) 4.11KB 2.06KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 17.15KB 6.32KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review September 25, 2026 06:07
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Sep 25, 2026
Merged via the queue into main with commit a983357 Sep 25, 2026
45 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-8255-docs-spec-shaped-list-view branch September 25, 2026 06:20
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 package: types plugin tests

Projects

None yet

1 participant