Skip to content

docs(changeset): date the two rotted present-tense declaration claims in the kanban pending entries - #9723

Merged
os-sales merged 2 commits into
mainfrom
claude/issue-9713-pending-changeset-present-tense
Sep 17, 2026
Merged

os-sales merged 2 commits into
mainfrom
claude/issue-9713-pending-changeset-present-tense

Conversation

@os-sales

@os-sales os-sales commented Sep 17, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes #9713

Clause-②: no — no declaration, accept set or requiredness moves. Prose only, in two
pending .changeset/*.md bodies; both frontmatters are byte-identical.

What was false, and which defect each site is

⭐ The card's own distinction, applied to every site before it was touched.

.changeset/8802-8257-8008-kanban-gantt-family-retirement.md — BOTH defects in one sentence

The sentence «The surviving ObjectKanbanSchema face declares none of them» was written
at adf581278 (2026-09-10T09:59:59Z, PR objectui#8865). The keys "them" refers to are the
twelve named in the two clauses just above it, plus a lane's cards.

key on ObjectKanbanSchema at adf581278 on origin/main bbba09840 verdict
columns not declared declared ROTTED — objectui#8913 (PR objectui#8989, 8693b8569, 2026-09-10T16:32Z), six and a half hours later
cardTitle not declared declared ROTTED — objectui#9606 (PR objectui#9709, 78a9c6744, 2026-09-17T18:36Z)
titleField declared (z.string().optional()) declared BORN FALSE
allowCollapse declared (z.boolean().optional(), live) declared, as a retirementTombstone() BORN FALSE
swimlaneField, grouping, navigation, cardTemplates, columnWidths, draggable, onColumnAdd, onCardAdd, cards not declared not declared true throughout

⇒ ⭐ The card recorded this site as rot. It is rot AND birth defect at once, and the
two halves need opposite repairs, so the repair states both rather than picking one.
titleField and allowCollapse appear in the sentence's refused-by-name clause — that
clause is true, the surviving face does not refuse them — but it declares both, which is
what «declares none of them» denied, on the day it was written.

Ordering is proved, not inferred: git merge-base --is-ancestor adf581278 8693b8569 and
… adf581278 78a9c674 both exit 0. An exit 0 is self-certifying on a shallow checkout
(it names a real ancestry path); the repository was deepened to 2072 commits first and the
two write commits were re-read from that history.

.changeset/7322-object-kanban-component-props.md — five readings, all ROTTED

Written at 6ca6e12a7 (2026-09-06T21:13Z, PR objectui#8153). git merge-base --is-ancestor 6ca6e12a7 X exits 0 for every one of the five falsifying commits.

reading measured at 6ca6e12a7 measured on bbba09840 falsified by
registered under two node type keys; KanbanSchema is a declared node type true KanbanSchema is gone; the prop is one arm again objectui#8802 (adf581278)
objectName REQUIRED z.string() z.string().optional() objectui#7780 (PR objectui#8412, 786bc91ea)
groupBy REQUIRED z.string() z.string().optional() objectui#8990 (PR objectui#9021, a4b723fab)
filter declared by NEITHER face true declared on ObjectKanbanSchema objectui#8174 (PR objectui#8788, ee4d19f6c)
columns, cardTitle — KanbanSchema only true both on ObjectKanbanSchema objectui#8913, objectui#9606

⛔ Not touched, and the reason is measured rather than assumed: line 47's «cardTitle
(already declared; the casts were redundant)» is a past-tense statement about the
retired arm and is still correct — the card warned that the two look alike and only one
moves. titleField — ObjectKanbanSchema only, and navigation declared on neither face,
both still read true and are left alone.

The repair shape, and why it is not an overwrite

Per the card's fix order: the construction that permits the error is the undated
present-tense sentence about another file's current state.
Both repairs delete that
construction rather than re-running it — every restated reading carries the date it was
taken and the card that moved it, so it can be re-derived from its own words and cannot
rot a second time. No gate was added; none is proposed here.

⚙ Anchors, re-taken — the readings above are ref-stable across three heads of main

⚠️ origin/main moved three times while this was being measured: 4cf57b6da →
95f7e4c3d (objectui#9719, objectui#9720) → bbba09840 (objectui#9712). The third move
landed between this seat's git fetch and its git merge origin/main — refs/remotes/*
is shared across worktrees, so a sibling's fetch advances it under you.
The merge was
taken, is clean and additive, and left both edited entries untouched
(git diff eae77bd91 HEAD -- the two paths is empty).

Every reading in the tables above was then re-taken on 95f7e4c3d, on bbba09840 and on
this branch's own head, with the same script each time. All four readings are identical:
columns / cardTitle / titleField / filter declared, allowCollapse a
retirementTombstone(), objectName and groupBy optional, and KanbanSchema at 0
export definitions against a lit control of 3 for ObjectKanbanSchema on the same
instrument, same corpus, same rev. ⭐ A ref that is two merges stale would be exactly the
defect this card exists to repair, so the anchor is named rather than assumed.

⚠️ One site deliberately NOT repaired — it is neither ROTTED nor BORN FALSE

8802-… names packages/types/src/complex.ts and content/docs/plugins/plugin-kanban.mdx,
which the in-flight draft PR objectui#9721 edits; that PR's own claim-re-read gate comment
reports the overlap. Measured against objectui#9721's live diff: it changes describe
text, the allowCollapse tombstone message and the KanbanColumn.collapsed doc comment,
and it adds and removes no member on either ObjectKanbanSchema face. So no sentence
this PR repairs depends on it. ⭐ A sentence that is true today and would be falsified only
once objectui#9721 lands is a third state — not yet false — and belongs to that PR, not
to this one. None was found in the two entries here, and the search was specific: the
only lane-collapse claim anywhere in either entry is allowCollapse, which objectui#9721
keeps as a retirementTombstone() and only re-words the refusal message of — so the
BORN FALSE row above stays true after that PR lands, in the window between the two merges
as well as after. The check is recorded because the absence is the result, not a skipped
step.

⛔ objectui#9721 is in the merge queue as this is written. File-level disjointness was
re-taken against its live file list, not against any table handed to this seat: it touches
.changeset/9628-kanban-column-collapsed-honoured.md and
.changeset/8801-object-kanban-allow-collapse-retired.md, neither of which is edited here.
All thirteen other open pull requests were enumerated and their .changeset/ files read off
their own file lists; none names either entry this PR edits.

Measurement — instruments, corpus, controls

⚠️ Every prose query is whitespace-tolerant: each body is read with its frontmatter
stripped and every whitespace run collapsed to a single space before matching, because
changeset prose wraps near eighty columns and a line-anchored matcher is blind to a
sentence that wraps. POSIX ERE has no \s, so no grep -E was used for prose at all.

Instrument P — the derived list. DOMAIN: 15628 sentences across all 1639 pending
entries. PREDICATE: the sentence names a schema symbol AND carries a present-tense
declaration verb (declares / declare / is|are declared). ⛔ Bare past declared is
excluded — a past-tense sentence is historical and cannot rot, which is the 7322:47
distinction above. Reading: 199 sentences across 169 entries. Controls, same instrument
and same corpus: lit — 502 entries match the present-tense verb at all; dark — 0 entries
contain a nonsense token.

Instrument V — mechanical polarity check. DOMAIN: instrument P's sentences. PREDICATE:
for each (schema S with a member set built from packages/types/src, backticked key K) in
one sentence, is K a member of S? Controls: lit — ObjectKanbanSchema has columns (true);
dark — it has zzqq (false). Reading: 154 candidate contradictions across 53 entries.

⛔ V's 53 are candidates, not verdicts, and saying so is part of the reading. Spot
review shows a high false-positive rate: the sentence window pairs a schema and a key that
are not predicated of each other, and keys declared by @objectstack/spec rather than by
this repo read as absent. ⚠️ V also misses the 8802-… site entirely — that sentence's
object is the pronoun «them», resolved across a sentence boundary, and no regex reaches it.
⇒ two zeros are never read as an absence here; both entries repaired in this PR were
reached by reading the files.

Declared narrowing. What is repaired here is the sub-class the card names and this seat
verified by hand — present-tense claims about what the kanban family declares. The 53-entry
candidate list is reported to the dispatching seat rather than swept in this PR: each one
needs the ROTTED / BORN-FALSE adjudication that must precede any touch, and that is per-site
work, not a batch edit.

Frontmatter, proved on both refs

entry frontmatter sha256 on origin/main in this branch bytes
8802-8257-8008-kanban-gantt-family-retirement.md 9f8dbee7965ce7e2554d3485936677648d200e0ba569000bbbd19594a0951f53 identical 243
7322-object-kanban-component-props.md bf9e59f968146504cb73c7508541747c555a82ca18f046bd3aa3f5138bc59380 identical 42

check-changeset-overwrite's documented case 2: a pre-existing entry modified for prose
only, every declared package name kept.

Gates

All nine green, re-run on the merged head ed2ab5078; each exit code captured to a file
before any pipe, each printed verdict line quoted in the gate comment on this thread.


🤖 Generated with Claude Code

https://claude.ai/code/session_01UanLVj6xvbS6puBCewLr8L


Generated by Claude Code

… in the kanban pending entries

Two pending `.changeset/*.md` bodies stated in the present tense what
`ObjectKanbanSchema` declares. A pending entry publishes verbatim into the
CHANGELOG at the next release, so a later card's merge falsifies a sentence
nobody re-reads.

`8802-8257-8008-kanban-gantt-family-retirement.md` — «The surviving
`ObjectKanbanSchema` face declares none of them» is replaced by a dated
per-key reading. It is BOTH defects at once: ROTTED for `columns`
(objectui#8913, six hours later) and `cardTitle` (objectui#9606), and BORN
FALSE for `titleField` and `allowCollapse`, which that face already declared
at `adf581278` when the sentence was written.

`7322-object-kanban-component-props.md` — five readings, all ROTTED, are
scoped by a dated-reading block naming each falsifying card, and the two
census bullets plus the requiredness clause are dated in place.

Prose only. Both frontmatters are byte-identical to `origin/main`
(sha256 9f8dbee7… and bf9e59f9…), which is check-changeset-overwrite's
documented case 2.

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

os-sales commented Sep 17, 2026 •

Copy link
Copy Markdown
Collaborator Author

Gates — every exit code captured to a file BEFORE any pipe

Run twice, from the worktree, each as
node scripts/X.mjs > file 2>&1; EXIT=$?; echo "$EXIT" > file.exit — first on eae77bd91,
then re-run on ed2ab5078, the head after origin/main (bbba09840) was merged in.
Both runs are 0 across the board; the verdict lines below are from the second.

gate exit its own printed verdict line
check-changeset-presence 0 "No source or published contract of a released package changed in this range, so no changeset is owed." — 2 files changed, 0 published source, 0 manifests
check-changeset-overwrite 0 report-only. Both entries listed with declared at base equal to declares now — its documented case 2, a prose correction with every declared package name kept
check-changeset-claims 0 "No pending changeset names a file this change touches." — 0 files changed outside .changeset/, 1636 pending in total
check-pending-changeset-literals 0 "No test source names a pending changeset."
check-changeset-no-major 0 "No changeset declares a major bump."
check-changeset-fixed 0 "All workspace packages are in the changeset fixed group."
check-control-bytes 0 "OK (scanned 7822 tracked text file(s); skipped 85 binary)."
check-new-cross-file-line-citations 0 "VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only"
check-governed-queue-guard --test (both paths) 0 "NOT GOVERNED — 2 path(s) checked against 5 governed surface(s); none matched."

Beyond the nine gates, a second control-byte scan was run directly over the two edited
files for the non-NUL control range as well: zero hits, and the scan's own exit code was
captured before any pipe.

⚠️ Declared narrowing. No package source moved, so there is no affected-package build
closure and no package test / typecheck owed. The repository-level scans that
.changeset/** triggers — Lint, Type Check, the four Test shards, Build & E2E,
Build Docs — are CI's runs, not this seat's, and are left to converge on this PR. That
narrowing is declared rather than silent.


🤖 Generated with Claude Code

https://claude.ai/code/session_01UanLVj6xvbS6puBCewLr8L


Generated by Claude Code

…present-tense

Re-anchors this branch's readings on the current main after objectui#9719 and
objectui#9720 merged. Every measurement in the PR body was re-taken against
95f7e4c and is unchanged.

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

Copy link
Copy Markdown
Collaborator Author

ACCEPT — card objectui#9713, reviewed by the domain:spec @ objectui execution seat at 2026-09-17T20:30Z. Enqueueing.

⛔ Nothing below is taken from the PR body. Two files, both pending changesets, prose only.

① Frontmatter byte-identical — the precondition for 「prose only」

entry origin/main PR head
.changeset/7322-object-kanban-component-props.md f103a55ffcd4 f103a55ffcd4 IDENTICAL
.changeset/8802-8257-8008-kanban-gantt-family-retirement.md 9fa322a3796b 9fa322a3796b IDENTICAL

(md5 of the frontmatter block on each side.) ⇒ no package's release moves; check-changeset-overwrite's documented case 2.

② The BORN FALSE half — verified AT THE WRITE-TIME REF, which is the only place it can be

This is the claim that matters, because ⭐ born-false can only be established at the ref where the sentence was written — measuring today proves nothing about it. Read at adf581278, the commit that wrote the 8802-… entry:

:21  titleField: z.string().optional().describe('Title field'),
:25  allowCollapse: z.boolean().optional().describe('Allow columns to collapse/expand'),

⇒ on the day that entry was written, the surviving ObjectKanbanSchema face declared both keys — while the entry said 「The surviving ObjectKanbanSchema face declares none of them」. BORN FALSE, confirmed at its own ref.

⭐ And the PR gets the subtlety right, which is easy to miss: those two keys are named in the sentence's refused-by-name clause, and that clause is true of the surviving face — it does not refuse them. What was false is 「declares none of them」. One sentence, one clause true and one false, and the repair says so instead of averaging them.

③ The ROTTED half, and every row of both tables checked against an enumerated list

⛔ Not spot-checked per key. The declared property list of ObjectKanbanSchema on origin/main was enumerated in full:

allowCollapse cardFields cardTitle columns conditionalFormatting coverImageField filter groupBy groupField limit objectName onCardClick onCardMove onQuickAdd quickAdd titleField type

Against it, every row of both tables holds: columns and cardTitle declared (ROTTED, falsified by objectui#8913 and objectui#9606); titleField and allowCollapse declared (BORN FALSE); filter declared (ROTTED, objectui#8174); and swimlaneField, grouping, navigation, cardTemplates, columnWidths, draggable, onColumnAdd, onCardAdd absent from the list, exactly as the table says.

⚠️ One control of mine was ambiguous and was resolved rather than reported: a grep for swimlaneField|onCardAdd inside the schema block returned 1, which looks like a declaration and is not — it is a mention inside the allowCollapse refusal message's prose (:86). ⭐ A key-shaped token inside a string is not a declaration; enumerating property lines is the instrument that can tell them apart, and a substring grep is not.

④ ⭐ The deepest thing in this PR, and it is not in the card

The 7322-… repair does not stop at re-dating five rotted readings. It states, and then obeys, the rule that follows:

「⛔ Every reading below therefore carries the date it was taken, and none is restated in the undated present tense — that tense is the construction that rotted, and a re-measurement written in it would only rot again before this entry publishes.」

⇒ the implementer declined to re-measure into the present tense at all. ⭐ That is the general lesson the card was groping for and did not have: for a file that publishes verbatim at an unknown future date, a fresh measurement written in the present tense is not a fix — it is the same defect with a newer number. The only durable repair is a dated reading, or no figure.

It also found five rotted readings in 7322-… that the card never named, each with its falsifying card and landing date.

⑤ Scope, collisions, gates

  • Scope held exactly. Two pending entries, prose only. ⛔ No declaration, no mirror, no source file.
  • Collision boundary held. The files in flight elsewhere in this lane are disjoint: objectui#9725 (in the queue) adds .changeset/9711-…; objectui#9724 touches no changeset; merged objectui#9721 touched 8801-… and 9628-…. ⛔ Nothing was edited across another card's PR.
  • ⚠️ The third case I gave this implementer — 「not yet false, falsified only once an unmerged PR lands」 — did not have to be exercised: objectui#9721 merged at 2026-09-17T20:17Z, before this head was pushed, and its diff moved no declaration (collapsed: z.boolean().optional() byte-steady on both mirrors, verified at that landing). ⇒ nothing in 8802-… was falsified by it.
  • Gates: all 34 check runs on head ed2ab50781 — 0 pending, 0 non-green.

Implemented-by: claude/issue-9713-pending-changeset-present-tense
Reviewed-by: session_01UanLVj6xvbS6puBCewLr8L

VERDICT: ACCEPT. Turning ready and enqueueing; card objectui#9713 closes on merge.


Generated by Claude Code

@os-sales
os-sales marked this pull request as ready for review September 17, 2026 20:30
@os-sales
os-sales added this pull request to the merge queue Sep 17, 2026
Merged via the queue into main with commit 2dbb499 Sep 17, 2026
36 checks passed
@os-sales
os-sales deleted the claude/issue-9713-pending-changeset-present-tense branch September 17, 2026 20:50
os-elon-musk pushed a commit that referenced this pull request Sep 25, 2026
… date the pending defaultSort claims this retirement falsifies

Review rework for objectui#5861.

- The three doc tombstones stop naming a spec version (doc-version-claims
  ratchet): they state that the installed protocol refuses the key by name.
- Five pending changesets that will publish in the same release describe
  the legacy key as honoured (objectui#4869, #6235, #8973, the #4082 grid
  filter-lowering entry, #5293). Each falsified sentence is put in the past
  tense for its own change and gains a dated note naming objectui#5861, the
  form PRs #9139 / #9723 / #9734 used. The retirement changeset names all
  five.
- ObjectView's objectui#5270 comment no longer quotes the retired
  defaultSort readers in the present tense.

Claude-Session: https://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN
Co-authored-by: Claude <noreply@anthropic.com>
akarma-synetal pushed a commit to akarma-synetal/objectui that referenced this pull request Sep 28, 2026
…bject-grid defaultSort (ADR-0049) (objectstack-ai#10533)

Fixes objectstack-ai#5861
Clause-②: yes — this removes the last runtime reads and the declared
docs of a key the installed `@objectstack/spec` 17.4.0 already refuses
by name; the published grid/view props surface narrows.

## What this does

ADR-0049 enforce-or-remove, remove arm, for `object-grid`'s
`defaultSort` and `object-view`'s `table.defaultSort` — the "C half" of
the maintainer's 2026-08-22 ruling on objectui#4869 (「接受所有」), restart
condition measured by triage comment 5808485875.

Every reader is removed in one change, so no path honours the key while
another ignores it:

| Reader | Before | After |
| --- | --- | --- |
| `ObjectGrid` fetch path | third arm `else if (schema.defaultSort)`
lowered it to `$orderby` | chain reads `sort` only |
| `ObjectGrid` header arrows | `parseSchemaSort(schemaSort ??
[schema.defaultSort])` | `parseSchemaSort(schemaSort)` |
| `ObjectView` non-grid fetch | fourth branch lowered
`table.defaultSort` into the sink | chain ends at `table.sort` |
| `ObjectView` grid forwarding | `defaultSort:
schema.table?.defaultSort` | not forwarded |
| `ObjectView` delegated `renderListView` | `mergedSort` wrapped
`table.defaultSort` into an array | chain ends at `table.sort` |
| `plugin-grid` registration | `sort` input described `defaultSort` as
its fallback | description says it is retired |

## H1 — the TypeScript declaration goes too, as a tombstone (decided and
measured)

`ObjectGridSchema.defaultSort` becomes `defaultSort?: never` and the zod
mirror member becomes `retirementTombstone(...)`, in lockstep. Not a
deletion: `ObjectGridSchema` extends `BaseSchema`, whose `[key: string]:
any` absorbs an undeclared key as `any`, and the mirror's
`.passthrough()` keeps it unexamined, so deleting would let the retired
spelling type-check and parse green and do nothing. This is the
package's existing convention (`ObjectViewSchema.viewTabBar`,
objectui#7779). Measured on the rebuilt `dist`: a downstream
`ObjectGridSchema` literal carrying `defaultSort` fails `tsc` in
`plugin-view` with TS2322 (reverse check below). Only the `defaultSort`
regions of `objectql.ts` / `objectql.zod.ts` were touched;
`ObjectGridSlotKey` keeps listing the key because the member is still
declared.

## H2 — no live producer (measured, with lit controls)

- Installed spec 17.4.0: `ObjectGridPropsSchema.safeParse({ objectName,
defaultSort })` fails `invalid_type` at `defaultSort` with the message
"`object-grid` property `defaultSort` was removed in @objectstack/spec
17 (ADR-0049) — it was the legacy second spelling of `sort` …"; control
`{ objectName, sort: [...] }` parses green.
- No non-test source outside the edited files reads the key (`git grep
defaultSort -- packages/` — the remaining hits are `plugin-detail`'s own
`RelatedList` `defaultSort` prop, a different carrier fed from
`schema.sort`, plus CHANGELOGs). `normalize-list-view` never mentions
it.
- Authored occurrences — objectui: `examples/` 0 files, `e2e/` 0,
`apps/` 1 (the registry parity test's comments, not authoring),
`content/` 2 (the two pages tombstoned here). objectstack `origin/main`:
`examples/` 0, `apps/` 0, `packages/qa/` 0. Lit control, identical
method, `searchableFields`: objectui `examples/` 4 files, `content/` 5;
objectstack `examples/` 2, `packages/qa/` 1.
- ⚠️ One authored occurrence the earlier reads did not flag: the
`ObjectGridSchema` JSON example in
`content/docs/api/schema-reference.md` authored `"defaultSort": {
"field": "name", "order": "asc" }` — a copy-paste of it is refused by
the spec. It now authors `"sort": [{ "field": "name", "order": "asc"
}]`.

## H3 — pins, red on the base and green on the head

The flipped cells were rewritten, not deleted: each now asserts the key
is inert on its path, beside a canonical `sort` control on the same path
in the same run.

Red leg: the five source files were put back to the base `59636b3a6`
under the committed tests, with a trap restore (blob hashes re-checked
against HEAD afterwards, `git diff HEAD` empty): **19 failed | 97 passed
(116)**, 8 of 9 files red. The only all-green file is
`gridRetiredStringSort-8767.test.tsx`, whose cell was only re-commented.
Green leg on the head: **116 passed (116)**, 9 files.

Flipped or new, each red on base:

- `plugin-view` `ObjectView.canonicalTableKeys.test.tsx` — grid path:
`no longer forwards a retired table.defaultSort — and does not rescue it
into sort`; `puts the canonical value in the canonical slot…` (legacy
slot now undefined); `keeps the named view sort in force, and a retired
table.defaultSort beside it is not forwarded`. Non-grid: `a retired
table.defaultSort alone orders NOTHING`. Delegated: `hands over NO sort
for a retired table.defaultSort alone`.
- `plugin-view` `ObjectView.sortSink.test.tsx` — `sends no $orderby at
all…`, `a descending legacy default is inert too…`, and the tail of
`keeps the sink STRICT…` (the sink-strictness half is unchanged).
- `plugin-view` `ObjectView.filterSources.test.tsx` — the three
objectui#6235 wrap cells, flipped.
- `plugin-view` `ObjectView.namedViewSortArity.test.tsx` — through the
REAL `ObjectGrid`: `a retired table.defaultSort sorts NOTHING on the
real grid path — no $orderby, no arrow`, plus a new canonical
`table.sort` control cell.
- `plugin-grid` `gridArrayArmOrderby-8973.test.tsx` — the legacy-arm
section, flipped (fully-specified, and `order` omitted, now send no
`$orderby`).
- `plugin-grid` `gridDefaultFiltersLowering.test.tsx` — `a retired
defaultSort reaches neither $orderby nor $filter`.
- `plugin-grid` `serverSorting.test.tsx` — new: `a retired defaultSort
lights NO arrow and sends NO $orderby`, with a sortable-chrome
non-vacuity check.
- `types` `object-grid-default-sort-tombstone-5861.test.ts` — new:
refused by name (`invalid_type` at `defaultSort`), lit control (unknown
key green), remedy text, describe equals message, canonical `sort`
green, upstream re-derivation from the installed pin, and the
`@ts-expect-error` on the `?: never` twin (compiled by
`tsconfig.test.json`; `--listFiles` includes the file).

Canonical `sort` is asserted on all three `ObjectView` paths and on bare
`ObjectGrid` in the same runs.

## Review rework (head `28b1a4d32`)

The contract review at `f40819d61` (comment 5828759786) returned FAIL on
two items and one nit. All three are addressed in `28b1a4d32`:

1. **Required `Test` was red** on
`scripts/__tests__/doc-version-claims.test.ts` ("records every version
literal on the scanned surfaces"). The doc tombstones had added
unregistered `@objectstack/spec` version literals in `plugin-view.mdx`
and `plugin-view/README.md`, plus a third in `schema-reference.md` split
across a line break, which the gate cannot see. The gate's preferred
remedy is applied to all three: the literal is deleted, and each page
now says the installed protocol refuses the key by name. No
`KNOWN_CLAIMS` entry is added. Reproduced red locally first (`Tests 1
failed | 28 passed (29)`, naming both visible sites), then green (`29
passed (29)`). No line this PR adds under `content/` or
`packages/plugin-view/README.md` carries a version-shaped token.
2. **Pending changesets that would publish "keeps working" beside "no
longer read".** Following the precedent of PRs objectstack-ai#9139, objectstack-ai#9723 and objectstack-ai#9734,
the falsified sentence in each is put in the past tense for its own
change ("at this change …"), and each now names objectui#5861: four
carry a dated note, and `5293` carries an inline citation in objectstack-ai#9139's
form:
- `objectview-sort-sink-4869.md`: "both spellings of the pair keep
working", and the `table.defaultSort` sink chain;
   - `6235-mergedsort-wrap.md`: the delegated-slot wrap;
- `8973-grid-orderby-normalize.md`: the legacy arm "is fixed with it";
- `grid-default-filters-lowering-4082.md`: the legacy leg "needs no
change";
- `5293-view-sort-order-spelling.md`: `ObjectGridSchema.defaultSort`
cited as a live `order` spelling.

A re-grep of the pending set finds three more `defaultSort` mentions,
all still true and left alone. `7122` says the spec made the key a D2
tombstone. `8767` quotes the spec's retirement text. `6697` concerns
`RelatedList`'s own `defaultSortKey`, a different carrier. The
retirement changeset's "supersedes" paragraph now names all five
entries.
3. **Nit.** The objectui#5270 comment block in `ObjectView.tsx` no
longer quotes the retired `defaultSort` header and fetch readers in the
present tense.

The branch was not merged with `main`. There was no conflict and CI did
not need it; the review reads `behind`, not `dirty`.

## Gates (code commit `43ab1fd43`; rework head `28b1a4d32`; full-suite
runs at `f40819d61`, and `plugin-view` re-run at `28b1a4d32`)

- Build closure: `turbo run build --filter='@object-ui/plugin-view^...'
--concurrency=2`: 15 successful, 15 total; rebuilt
`packages/types/dist/objectql.d.ts` carries `defaultSort?: never`.
- `pnpm --filter @object-ui/types type-check` exit 0 (script echoed
`@object-ui/types@17.6.0 type-check`); `@object-ui/plugin-grid` exit 0;
`@object-ui/plugin-view` exit 0.
- Reverse type check through the rebuilt `.d.ts`: injecting
`defaultSort: { field: "name", order: "asc" }` into `ObjectView`'s
`gridSchema` literal makes `plugin-view` `tsc --noEmit` fail with
`TS2322 … Types of property 'defaultSort' are incompatible … not
assignable to type 'undefined'`; restored, blob equals HEAD. (A first
attempt was a no-op: `ablation-replace` refused because the replacement
contained its own anchor. It changed nothing and ran nothing.)
- Root-form vitest: `packages/types/` 233 files, 5166 tests passed;
`packages/plugin-grid/` 156 files, 1487 tests passed;
`packages/plugin-view/` 48 files, 444 tests passed (re-run at
`28b1a4d32` together with `doc-version-claims`: 49 files, 473 tests
passed; `plugin-view` type-check exit 0 again, closure build 15/15
cached);
`apps/console/src/__tests__/registry-inputs-spec-parity.test.ts` (it
reads the `plugin-grid` registration inputs) 199 tests passed.
- `node scripts/check-changeset-presence.mjs` exit 0 (14 source files of
3 released packages, 1 changeset); `check-changeset-no-major` exit 0;
`check-changeset-fixed` exit 0.
- `check:new-line-citations`: `VERDICT new-cross-file-line-citations: 0
new citation(s)`; `check:control-bytes` OK.
- Doc gates: `check-doc-links` exit 0; `check:doc-types` exit 0;
`check:doc-fences` exit 0; `check:doc-example-ids` exit 0;
`check-prompt-component-keys` exit 0; `check-doc-expression-carriage`
exit 0 (report-only; its one `schema-reference.md` site,
`action.condition`, predates this branch); `check-changeset-claims` exit
0 (report-only); `check:pending-changeset-literals` exit 0.
- eslint, narrowed to the 14 changed `.ts`/`.tsx` files: 14 files in the
JSON report, 0 errors. Per-file warnings are equal to the base except
three test files (+1, +1, +2 `no-explicit-any` from `as any` fixtures,
matching those files' existing style). `eslint.config.js` has no
type-aware linting (`parserOptions.project` / `projectService` are
absent) and no custom rule under `eslint-rules/` reads the filesystem,
so a verdict on an untouched file cannot move.
- Governed surface: `check-governed-queue-guard --test` over all 18
paths says NOT GOVERNED.

## Registries and docs

- Touched: `@object-ui/types` (`ObjectGridSchema` member and its zod
mirror), the `plugin-grid` registration (`sort` description and
docblock), `content/docs/plugins/plugin-view.mdx`,
`content/docs/api/schema-reference.md`,
`packages/plugin-view/README.md`, and a changeset (`minor` on types /
plugin-grid / plugin-view, never `major`).
- Not touched, on purpose: the console registry parity ledger
`apps/console/src/__tests__/registry-inputs-spec-parity.test.ts`. Its
`object-grid.defaultSort` carve-out entry was already harvested when
spec 17.3.0 tombstoned the key; it keeps only a comment. `docs/adr/**`
is not needed, because no ADR lists the key.
- `schema-reference.md`: the `CRUDSchema` `defaultSort` /
`defaultSortOrder` sentence is untouched. Only the adjoining
`ObjectGridSchema` sentence ("that key is unaffected"), which this
change makes false, was rewritten.

## Acceptance notes

- File surface beyond the claim, with reasons.
`packages/plugin-view/README.md` described the key as a working alias,
and it ships in the package's `files[]`; this change makes it false, so
it is repaired here. Further `plugin-view` / `plugin-grid` test files
(`filterSources`, `namedViewSortArity`, `gridArrayArmOrderby-8973`,
`gridDefaultFiltersLowering`, `gridRetiredStringSort-8767`,
`serverSorting`) pinned the key as working, or referenced it. They sit
next to the landing points.
- `ObjectGrid.tsx`'s page-size region (draft objectui#10278) is
untouched. The two edits sit in the sort `if` chain and the
`declaredSort` expression; the fetch effect's dependency list is
unchanged.
- Five pending changesets described how the retired key used to be
honoured. They ship in the same release: objectui#4869, objectstack-ai#6235, objectstack-ai#8973,
the objectstack-ai#4082 grid filter-lowering entry, and objectstack-ai#5293. Four now carry a dated
note naming objectui#5861, and `5293` an inline citation (see Review
rework above).
- Line-address citations in `plugin-view.mdx` paragraphs this change
touched were rewritten to cite by content (AGENTS.md objectstack-ai#11). The
`data.ts:63` citation in the rewritten `gridDefaultFiltersLowering` cell
was dropped.
- A document that still carries `defaultSort` renders unsorted. It is
not re-routed into `sort`: that would be the tolerant alias this
retirement removes.

---
_Generated by [Claude
Code](https://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN)_

---------

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants