Skip to content

docs(schema-reference): ObjectGridSchema.sort row reads SortConfig[] only (objectui#10581) - #10621

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-10581-grid-sort-row
Sep 25, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-10581-grid-sort-row

Conversation

@objectstack-fleet

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

Copy link
Copy Markdown
Contributor

Fixes #10581

Clause-②: no

Clause-②: no — reference docs stop teaching a refused spelling; no code, export or accept set moves.

What changed

One row of content/docs/api/schema-reference.md, in the ObjectGridSchema property table:

  • before: sort | string \| SortConfig[] | "Default sort configuration."
  • after: sort | SortConfig[] | "Default sort configuration. The string clause ("name desc") was retired in objectui#8221 and now fails validation."

Docs only, under content/ (not a workspace package, not released): no changeset. node scripts/check-changeset-presence.mjs agrees (verdict line below).

The retired-row form, and where it was copied from

The row copies the form the same file already uses for a live key whose value lost a member: the CalendarViewSchema table's view row, which keeps its row, narrows the Type column to what survives, and says ""agenda" was retired in objectui#5740 and now fails validation." The Type-column *retired* / RETIRED form (the BaseSchema body row, the related row) is for a retired KEY; sort is live, so that form does not apply.

Premise check (objectui origin/main at 6c2f3c533)

  • The row read string \| SortConfig[], as the card said.
  • @object-ui/types declares ObjectGridSchema.sort as SortConfig[] on the TypeScript face and as z.array(SortConfigSchema) on the zod mirror (describe text: "array only; the legacy string clause is retired — objectui#8221").
  • The grid refuses a string at runtime: the typeof schemaSort === 'string' arm in ObjectGrid.tsx ("the legacy string sort clause is RETIRED (objectui#8221, decision batch Release v0.2.1 with changeset automation #77) and is REFUSED here rather than lowered") sends no $orderby, and convertSortToQueryParams reports the spelling once with console.error.
  • "now fails validation" is an existing pin, not prose: packages/types/src/__tests__/sort-string-arm-retired-8221.test.ts, test "object-grid refuses the legacy string clause", asserts ObjectGridSchema.safeParse fails on sort: 'name desc' with an issue at path sort. It ran green at this head (below).

Sweep of content/

No other row or example in content/ authors a string sort on a grid-family node. Searches run: quoted field asc|desc clauses; sort: / "sort": followed by a string or a string array; every sort table row. What they found:

  • the ObjectGridSchema example in this file already writes "sort": [{ "field": "name", "order": "asc" }];
  • plugin-grid.mdx, plugin-map.mdx, plugin-gantt.mdx and plugin-view.mdx type or write sort as the array;
  • the only string hits are not grid-family sort: report-schema.mdx groupBy[].sort: 'asc' (the report grouping direction enum), and the $orderby strings 'createdAt asc' in plugin-detail.mdx and 'createdAt desc' in data-objectstack.mdx (DataSource.find query params).

A repo-wide search for the union spelling string | SortConfig outside content/ matches only changesets, a CHANGELOG and test comments that record the retirement.

Gates (run locally at head 810b89da0)

  • pnpm docs:check-links, exit 0: "Links are valid across 17 scan roots."
  • pnpm check:doc-fences, exit 0: "check:doc-fences — every TypeScript block in 227 document(s) is fenced ts/tsx/typescript …"
  • pnpm check:doc-example-ids, exit 0: "414 real reference(s) all resolve in the catalog registry."
  • pnpm check:doc-types, exit 0: "Every documented component type is registered."
  • node scripts/check-prompt-component-keys.mjs, exit 0 (the same workflow as check:doc-types).
  • node scripts/check-doc-expression-carriage.mjs, exit 0 (Build Docs job step; report-only census).
  • pnpm check:doc-example-readers, exit 0; pnpm check:spec-symbols, exit 0: "nothing cites a key its spec symbol does not declare."
  • node scripts/check-shell-escape-residue.mjs, exit 0; pnpm check:docs-route-closure, exit 0.
  • pnpm check:new-line-citations, exit 0: "VERDICT new-cross-file-line-citations: 0 new citation(s)".
  • pnpm check:control-bytes, exit 0: "check-control-bytes: OK (scanned 8717 tracked text file(s) …)".
  • node scripts/check-changeset-presence.mjs, exit 0: "No source or published contract of a released package changed in this range, so no changeset is owed." check-changeset-claims, exit 0 (report-only).
  • node scripts/check-governed-queue-guard.mjs --test content/docs/api/schema-reference.md: "NOT GOVERNED".
  • Tests that read this file: node scripts/markdown-test-inputs.mjs --changed names it, and its ledger names 18 test files (the content/docs/** glob plus the two that read this file by name). Those 18 plus the objectui#8221 pin ran under the shared verify lock with pnpm exec vitest run --maxWorkers=2: "Test Files 19 passed (19) · Tests 969 passed (969)", VERDICT command-exit 0.

No test pins this row's text (Default sort configuration has no hit outside the row), so no test changed.

Acceptance notes

  • No new pin was added, so there is no red-then-green pair to show. The "fails validation" claim rests on the existing objectui#8221 pin named above.
  • Declared narrowing, left to CI: check:doc-snippets / Doc Snippet Types (it needs the packages' built dist/*.d.ts across a near-whole-workspace build closure). Its population is fenced ts/tsx blocks, and the edited row sits outside any fence (34 fence delimiters come before it, an even count), so this diff cannot move that gate's verdict. The Build Docs site build (turbo run build --filter=@object-ui/site) and the full test shards are also CI's. No workspace package is touched, so no package typecheck or test is owed.
  • Observation only, not filed: the installed @objectstack/spec@17.4.0 still declares ObjectGridPropsSchema.sort as z.unknown(), and it accepts "name desc" (measured with safeParse). objectstack main already declares it as z.array(SortItemSchema), and its describe text refuses the string clause. The protocol face therefore catches up on the next spec release that objectui installs. This row documents the @object-ui/types face, which is the one this page covers.

Dev run https://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN, dispatched by the domain:ui seat 2 (claim comment 5832093380).


Generated by Claude Code

…only

The ObjectGridSchema property table typed `sort` as `string | SortConfig[]`,
teaching the legacy string clause that objectui#8221 retired. The row now
reads `SortConfig[]` and names the retirement in the form the CalendarViewSchema
`view` row already uses for a retired value ("was retired in objectui#N and now
fails validation").

Docs only, under content/ (not a released package): no changeset.

Claude-Session: https://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions

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/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/object-view-unmirrored-keys-7779.md

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

    listViews stays unmirrored, on the ruling's own fallback clause. The declaration's value is the local NamedListView — 64 declared top-level members (⚠️ re-taken at objectui#8980, which added the seventeen the protocol declares on this surface to the 47 this entry first measured), of which the renderer reads 21 off a named view. data is one of the 21 now: it used to reach the renderer through an as any cast on the named-view config in packages/plugin-view/src/ObjectView.tsx and be declared nowhere, and the objectui#8980 ruling declared it by name — objectui#7928's open half, answered. The spec's ViewSchema.listViews is a record of the STRICT ObjectListViewSchema, which requires columns and refuses options, ObjectQL tuple filters and default — that is, it refused the named views this package's own README and content/docs/api/schema-reference.md taught when this entry was written ({ label: 'All Users' } fails at columns; filter: [["owner", "=", "..."]] fails at filter.0), and objectui#8255 has since rewritten them in the spec shape. Mirroring the spec value would have lost documented behaviour; mirroring the local value would enforce 43 unread members (64 declared, minus the 21 that are both declared and read) into the contract — the very thing ruling B refused for the six local keys. The key therefore stays in the parity ledger with that measurement, pinned, until the maintainer decides its value type. It is not papered over with z.any().

.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 c2d86599b (merge-base with origin/main): 1 file(s) changed outside .changeset/, read against 1478 pending declaration(s) that publish a body (2062 pending in total). · run

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 810b89da004e0314f82806c84f28d41d9a739f72

① Derived judgments

Diff scope (measured). git diff 6c2f3c533..810b89da0: 1 file, +1/−1, content/docs/api/schema-reference.md:777 only. One commit; trailer pair present.

The row is true on the face the page declares.

  • TS face: packages/types/src/objectql.ts:757 sort?: SortConfig[] (siblings :2854 map, :3261 gantt, :3506 calendar; NamedListView.sort :2232 is Array OF { field, order }, also array-only).
  • Zod mirror: packages/types/src/zod/objectql.zod.ts:242 z.array(SortConfigSchema), describe "array only; the legacy string clause is retired — objectui#8221" (map :1806, gantt :1975, calendar :2093 same).
  • Renderer: packages/plugin-grid/src/ObjectGrid.tsx:2182 typeof schemaSort === 'string' arm calls convertSortToQueryParams and sets no $orderby; packages/core/src/utils/sort-query.ts:303 routes to reportRetiredSortSpelling (:176, console.error, deduped by a Set OF string at :122). Header reader parseSchemaSort (:113-130) admits the array alone.
  • Measured in a scratch worktree at the head (sibling node_modules, zod 4.4.3), all against PR-head source: ObjectGridSchema.safeParse sort:'name desc' ⇒ success=false, issue path sort (invalid_type); ['name desc'] ⇒ false at sort.0; [{field,order}] ⇒ true. Map, gantt, calendar mirrors refuse the string identically. safeValidateSchema (what objectui validate runs, packages/cli/src/commands/validate.ts:13,59, and objectui check, check.ts:14,146; it is AnyComponentSchema.safeParse, index.zod.ts:541, whose union lists ObjectGridSchema at :313) ⇒ same three verdicts. So "now fails validation" holds for objectui validate, objectui check, the mirror's safeParse, and the renderer refuses at fetch.
  • What does NOT refuse it (finding, not a stop): installed @objectstack/spec@17.4.0 (dist/ui/index.js:12744) declares ObjectGridPropsSchema.sort as zod.z.unknown().optional(). Measured: {sort:'name desc'} ⇒ success=true; {sort:['name desc']} true; {sort:42} true (the spec face is strict on keys but blind on this value; it does not declare type, so a bare node object is unrecognized_keys on type before sort is even judged). Consumers of that face are on the objectstack side only: packages/lint/src/validate-component-props.ts and page-envelope-audit.ts:101,145 via ComponentPropsMap (component.zod.ts:4446, 'object-grid': ObjectGridPropsSchema :4585). No non-test objectui source parses through ObjectGridPropsSchema (4 hits, all comments). objectstack origin/main 949e99b already has sort: z.array(SortItemSchema) at component.zod.ts:2878 with the string clause refused in describe text, changeset .changeset/object-block-sort-item-array.md still pending, spec CHANGELOG top entry 17.4.0 = installed, so unreleased. Judgment: "fails validation" is unscoped, and a reader validating with @objectstack/lint at 17.4.0 meets a string sort that passes. It is not an overclaim on this page's declared face (banner: "All types are available from @object-ui/types"), and the same file's precedent rows use the identical unscoped phrase (:316 mode, :1093 agenda). But the same table's defaultSort note 11 lines below (:788-795) explicitly names "the installed @objectstack/spec protocol", so both faces are in the reader's view. A scoped spelling such as "fails objectui validate, and the grid refuses it at fetch" would be tighter. Non-blocking.

The form. Precedent row is real: :1093 view | CalendarViewMode | "…"agenda" was retired in objectui#5740 and now fails validation." Measured on the types face: CalendarViewSchema.safeParse view:'agenda' ⇒ false at view (invalid_value), control 'month' ⇒ true, shape has view. Same class as sort (live key, value union lost a member), so the copied form is the right one; the Type-column *retired*/RETIRED form (:81 body, :1169 related) is for retired keys, as the PR body says. Pre-existing defect in the precedent, outside this diff: objectui#5740 is HTTP 404 via REST (as is objectui#5784, which objectql.ts:3466 and objectql.zod.ts:1180 cite for the agenda retirement); objectstack#5740 is an unrelated service-analytics 400-vs-500 fix. Worth its own card. This PR's citation is sound: objectui#8221 resolves (closed, "finding(core/sdui-parser): the legacy string sort clause convertSortToQueryParams honours is declared by none of the seven sort inputs…"); the pin packages/types/src/__tests__/sort-string-arm-retired-8221.test.ts and .changeset/8221-retire-legacy-string-sort.md both name it as the ruling (decision batch #77, option B). #8767 (grid private lowering) and #8961 (header arrow) are later cards; #8221 is the retirement itself.

Sweep (PR head, git grep over content/, docs/, skills/, packages/*/README.md, apps/*/README.md).

  • Union spelling string | SortConfig / SortConfig[] | string: 0 hits.
  • sort table rows: 3 — this row; content/docs/plugins/plugin-grid.mdx:88 and packages/plugin-grid/README.md:187, both [{ field, order }].
  • String-valued sort: literals: content/docs/core/report-schema.mdx:296,301 (groupBy[].sort: 'asc', a direction enum, not grid-family). $orderby strings: plugin-detail.mdx:124 'createdAt asc', data-objectstack.mdx:392 'createdAt desc' (query params, not a node key). String-array sort: ['x desc']: 0. skills/: 0.
  • One item the PR body's sweep did not name: content/docs/guide/building-crud-app.md:342 prose "sort (priority asc)" glossing the active list view, whose source at :139 is sort: [{ field: 'priority', order: 'asc' }]. Not an authored string sort; not a hit.
  • Repo-wide string | SortConfig outside content/: 6 hits, all history (.changeset/6235-…:18, .changeset/8221-…:23, packages/plugin-view/CHANGELOG.md:169,181, two plugin-view test comments), as the PR body says.
  • No test pins the row text: Default sort configuration has exactly 1 hit repo-wide (the row).

Table well-formedness. Rows 772-786 all carry 3 cells (4 pipes); the new description has no unescaped pipe; "name desc" sits inside backticks. 34 fence delimiters precede :777 (even), so the row is outside every code fence.

② Semver level

Docs only. pnpm-workspace.yaml lists packages/*, examples/*, apps/*, docs; content/ is not a workspace package, so no changeset is owed. CI agrees: Changeset Declaration, Changeset Claim Re-read, Changeset Fixed Group Check all success. Clause-②: no is correct: no export, code or accept set moves.

PR body, sentence by sentence: before/after rows match the diff; premise items (types :757, zod :242 describe text, ObjectGrid :2182-2209, pin test name "object-grid refuses the legacy string clause") verified; "reports the spelling once with console.error" verified (sort-query.ts:122,176,180); 34-fence count verified; the installed-spec observation (z.unknown(), accepts "name desc") and the objectstack-main state verified; gate lines match the now-green CI. One inaccuracy: the body says $orderby: 'createdAt asc' appears in both plugin-detail.mdx and data-objectstack.mdx; data-objectstack.mdx:392 reads 'createdAt desc'. Cosmetic.

③ Boundary flags

  • CI on the head: 39 check runs at last poll: 36 success, 3 skipped (coverage shard, coverage, dependabot), 0 in progress, 0 failed. Earlier polls had the 8 test shards and Spec Main Shape Gate in progress; all completed green. Doc Snippet Type Check and Build Docs are success.
  • merge-tree: refs/review/main = 8e5fba7 (2 commits past base 6c2f3c5, none touching schema-reference.md); git merge-tree --write-tree exit 0, tree 8f34423f6, no conflicts. PR mergeable_state read behind, then unknown while GitHub recomputed after main moved.
  • PR state: draft: true; assignees [] (the dev's assignee write was refused by the classifier, per the os-dev-report); labels []. The card is assigned to os-elon-musk. Marking ready and setting the assignee are the seat's steps before landing, not contract defects.
  • Not a stop, for a separate card: the precedent row's objectui#5740 citation (and the types source's objectui#5784) is dead via REST.
  • Checkout /home/user/objectui untouched: 0 dirty paths, branch unchanged; scratch worktree removed and pruned.

Implemented-by: claude/issue-10581-grid-sort-row
Reviewed-by: session_014mXUNuFomfj24w7s1pZzhN

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review September 25, 2026 12:35
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Sep 25, 2026
Merged via the queue into main with commit 5add18a Sep 25, 2026
41 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-10581-grid-sort-row branch September 25, 2026 12:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

finding(docs): schema-reference.md types ObjectGridSchema.sort as string | SortConfig[], but a string sort is refused (objectui#8221)

1 participant