docs(spec): re-cite objectui's data-table accessor as accessorKey only - #15111
Conversation
Two notes in `packages/spec` described objectui's `data-table` column accessor
as resolving two spellings, `accessorKey || name`:
- `liveness/field.json` — the `relatedListColumns` entry's `note`
- `src/conversions/registry.ts` — the `field-column-lists-canonicalized`
docblock
objectui#6963 retired the `name` alias, and the console pin this repo builds
against (`.objectui-sha` = `67dadd602a3a891666ea1513c5de677140784b6a`) already
contains it, so both notes described a resolution that no longer exists — and
both carried a measurement attribution that predated the retirement, which is
the half a spelling-only fix would have turned into a fresh miscitation.
Re-read at the pin, read-only:
- `packages/components/src/renderers/complex/data-table.tsx:872-876` maps
`accessorKey: col.accessorKey` with no fallback
- `packages/core/src/utils/column-identity.ts:69` still resolves canonical
`field` first, legacy spellings after
Citation accuracy only. Each note keeps its conclusion sentence verbatim, the
`relatedListColumns` entry keeps its `live` status, `verifiedAt`, `evidence`
and every count, and no code changes.
Both edited byte-ranges publish from `@objectstack/spec` — `liveness/**` is in
the package's `files`, and the docblock ships inside `dist/*.map`
`sourcesContent` — so this carries a patch changeset rather than
`skip-changeset`.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0174WZTU6XcFcS7g2kykC53i
📓 Docs Drift Check
What this run could not see
Coarse fallback — 128 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
|
Landing provenance — Landing window readings, all on head
Sequence: ready → squash auto-merge → Generated by Claude Code |
Fixes #14166
Clause ②: no — path limb fires (
packages/spec/src/**), content limb no: citation text only.Two
packages/specnotes described objectui'sdata-tablecolumn accessor as resolving two spellings,accessorKey || name. objectui retired thenamealias, so both described a resolution that no longer exists. This rewords them to the single surviving spelling. Citation accuracy only — no verdict moves, no ledger re-grade, no code.The objectui citation, re-read at the pin in force
The card names objectui
41725898cas the retirement andd8ec8d6d4f01as the sha the pin bump moved to. Neither is the pin this repo builds against now:.objectui-shareads67dadd602a3a891666ea1513c5de677140784b6a(objectui, 2026-09-01), andgit merge-base --is-ancestorputs both of those commits behind it. So the reworded notes cite the pin's own commit, not the card's.Read at
67dadd602a3a, read-only, in a separate checkout:packages/components/src/renderers/complex/data-table.tsx:872-876— the adapter'sinitialColumnsmapsaccessorKey: col.accessorKey, with no|| col.name. The block immediately above it records both retired aliases (labelandname) and states that a{ name, label }column still renders only when a producer resolved its identity intoaccessorKeyfirst.packages/core/src/utils/column-identity.ts:69—columnIdentityis unchanged: canonicalfieldfirst, the legacy spellings after.Two vocabularies, therefore, still —
columnIdentitycanonical-fieldagainst an accessor that now readsaccessorKeyalone — which is why both conclusion sentences survive verbatim and the stop condition on this card (a conclusion that depends on the retired fallback) does not fire.Before / after
packages/spec/liveness/field.json— therelatedListColumnsentry'snoteBefore (the changed sentence; the note's first two sentences are untouched):
After:
The measurement attribution moves with the spelling deliberately. Changing only
accessorKey || namewould have left "Measured 2026-08-17 against objectui main" standing in front of a reading that was false on that date — a fresh miscitation manufactured by the repair. TheRE-CITED … / Verdict unchanged: LIVE.framing is this ledger's existing house style for a citation repair whose verdict holds (four sibling entries in the same file use it).Everything else in the entry is byte-identical:
status: "live",verifiedAt: "2026-08-17",evidenceScope,evidence, and every count. No other entry infield.jsonis touched.packages/spec/src/conversions/registry.ts— thefield-column-lists-canonicalizeddocblockBefore:
After:
.objectui-shapinshais the HISTORICAL spellingcheck:objectui-pin-citationsrecognises — a dated record of where a measurement was taken, which a later pin bump does not falsify. The asserting spelling (.objectui-sha=sha) was deliberately not used: it would have added a new gate edge that reds on the next bump, and this card explicitly does not decide whether a pin bump should carry a routine citation re-check. The gate confirms the classification below.No code in
registry.tschanged — the diff is four comment lines replacing three.Changeset — measured, not assumed
Both edited byte-ranges publish from the released
@objectstack/spec, so this carries a patch changeset rather thanskip-changeset(AGENTS.md Post-Task Checklist §3; the #14093 precedent in PR #15098).Measured on the built tree with
npm pack --dry-run --jsoninpackages/specafterpnpm --filter @objectstack/spec build— 2082 files in the tarball:liveness/field.jsonliveness/field.jsonlivenessis in the package'sfilessrc/conversions/registry.tsdist/index.js.map,dist/index.mjs.map,dist/shared/index.{js,mjs}.map,dist/browser/index.{js,mjs}.mapdistis infiles, and the docblock ships inside the sourcemaps'sourcesContentregistry.tsis not a.zod.tsfile, so thesrc/**/*.zod.tsentry offilesdoes not carry it; the sourcemaps do.grep -rl "data-table accessor reads" dist/returns those six maps and nothing else.Verification record — head
e3e66d15Every exit code captured by redirecting first (
cmd > log 2>&1; EXIT=$?), never read through a pipe. Verdicts quoted are the gates' own lines.pnpm --filter '@objectstack/spec^...' buildNo projects matched the filters— real, not a typo:@objectstack/specdeclares zero workspace dependencies (pg-connection-string,zodonly)pnpm --filter @objectstack/spec buildcheck-dts-emitted: @objectstack/spec - 34/34 declared declaration file(s) present.pnpm --filter @objectstack/spec exec vitest run --maxWorkers=2Test Files 466 passed (466)·Tests 12435 passed (12435)pnpm --filter @objectstack/spec typecheckcheck:test-typecheck: OK — @objectstack/spec's test layer compiles under packages/spec/tsconfig.test.jsonpnpm --filter @objectstack/spec check:liveness✓ every governed-type property at the walk's one-level granularity is classified … every 'path:NNN' citation names a line that file actually haspnpm --filter @objectstack/spec check:generated✓ All 15 generated artifacts are up to date.pnpm --filter @objectstack/spec check:docspnpm --filter @objectstack/spec check:api-surfacepnpm --filter @objectstack/spec check:objectui-pin-citations✅ 8 asserting objectui pin citation(s) match .objectui-sha (67dadd602), 16 historical citation(s) recorded and not checked, across 1140 spec source(s).pnpm exec eslint --no-inline-config --format json packages/spec/src/conversions/registry.tsnode scripts/check-system-context-census.mjscheck-system-context-census: OK — 106 elevation read sites in 20 packages across 45 files, all anchored; 140 anchors resolve, 27 declared non-read.pnpm check:nul-bytescheck-nul-bytes: OK (scanned 8217 text file(s) … no raw ASCII control bytes).check:generatedreports all fifteen artifacts current, so the reworded note projects into no generated page and--fixwas neither needed nor run. The census is unrotted for a second, independent reason as well:packages/spec/src/conversions/registry.tscarries noisSystemread site and no anchor points into it, so the file's net+1line cannot move a page anchor.Typecheck coverage, not assumed:
pnpm exec tsc --noEmit --listFilesinpackages/specnamessrc/conversions/registry.ts(1 hit), so the green above really did read the edited file.The derived gate union
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, run in this worktree with no paths passed, re-derived at heade3e66d15and byte-identical to the pre-commit derivation: 60 commands over the change set it read from git (.changeset/spec-accessor-key-citations.md,packages/spec/liveness/field.json,packages/spec/src/conversions/registry.ts).58 green. Two gates report their own NOT MEASURED code (exit 3, which each distinguishes from a finding's exit 1 in its own output) — neither is a red, and neither is caused by this diff:
node scripts/check-test-completeness.mjs— "That list names this script with NO argument … There is no local log to hand it, so the local reading for this gate is NOT MEASURED. ⛔ It is not a red, and there is nothing here to fix." It wants a savedturbo run testlog.pnpm check:dual-build-cjs-loads— "PREREQUISITE NOT MET — this gate reads built output, and some package has no dist/", listing 85 unbuilt packages. It wants a whole-repopnpm build, which is CI's run, not a targeted local one. Its self-test passed (93 cases).Two more reported exit 3 / exit 1 on the first pass for environmental reasons and were then measured properly, so they are not in the NOT MEASURED set:
node scripts/check-plugin-teardown-shape.mjs --self-testfirst failed with "cannot read the positive control at 621a487… Deepen the clone" — this container's checkout is shallow. Aftergit fetch --depth=1 origin 621a4876…it passes: "47 cases pass".pnpm --filter @objectstack/lint run check:doc-formula-expressionsfirst reportedPREREQUISITE NOT METfor two unbuilt workspace packages. After building@objectstack/formulaand@objectstack/lintit passes: "22 record-scoped formula example(s) across 426 files / 1368 TS blocks judged clean".The derivation also flags seven artifact-roster families whose roster directory contains one of my paths, where its
silentverdict is evidence in neither direction. Six were run directly and are green (check-changeset-fixed,check:meta-url-spelling,check:authz-resolver,check:error-code-casing,check:filter-alias-parity,check:swallow-census-controls); the seventh,check:spec-changes, is covered insidecheck:generatedabove.The eslint narrowing, declared
The repo-wide
pnpm lintwas not run; a proven narrowing was. All three pieces:packages/spec/liveness/field.jsonand.changeset/spec-accessor-key-citations.mdas "File ignored because no matching configuration was supplied." — soregistry.tsis the only changed file its config admits.--format json: 1 file linted,errorCount0,warningCount0.eslint.config.mjs:327-328states that this repo "runs oneeslint.config.mjs, which never enables type-aware linting (noparserOptions.project, no typed@typescript-eslintrules) for ANY file, test or not". With no type-aware rules, a comment-only edit in one file cannot move any untouched file's verdict.Scope
Untouched, as the card requires: every other entry, verdict and ledger state in
field.json; all code inregistry.ts; objectui;content/docs/releases/;skills/. Noneeds:contract-reviewlabel. Left as a draft — not flipped ready.Base was
origin/main4428dd57;origin/mainhas since moved tob812a549, and the gate derivation reports that nothing this tree can see touched what its answer derives from.Out-of-scope findings: none. The card's own side question — whether a console pin bump should carry a routine citation re-check — is recorded on the card and deliberately not answered here.
Generated by Claude Code