Skip to content

[finding] Two packages/spec notes still cite objectui's retired accessorKey || name data-table accessor #14166

Description

@claude

Found while bumping the console pin to objectui d8ec8d6d4f01 (#14027 / PR #14165). Out of scope there under pin-bump discipline, so recorded rather than ridden.

What is stale

Two places in packages/spec describe objectui's data-table column accessor as reading two spellings:

  • packages/spec/liveness/field.json (the columns entry's note): "the data-table accessor resolves accessorKey || name only"
  • packages/spec/src/conversions/registry.ts (a comment, near line 7269): "the data-table accessor reads accessorKey || name"

At the pin PR #14165 moves to, objectui commit 41725898c retired that fallback. Its own changeset, verbatim:

Breaking for authored metadata: a data-table column spelled name no longer resolves its cells. Use the declared accessorKey.

So from this pin onward the accessor reads accessorKey only, and both notes describe a two-spelling resolution that no longer exists.

What is NOT affected

The verdicts those notes support are unchanged, and this is a citation-accuracy finding rather than a liveness re-grade:

  • the spec declares no data-table column accessor named name, so nothing authorable here is retired;
  • the liveness note's actual conclusion — that a spec-canonical object form renders blank and is therefore refused at parse — still holds.

That is why this was not folded into the pin bump: nothing in the bump's diff depends on it, and the correct fix is prose in files the bump must not touch.

Prior art, same class

#7133 was the citation-repair bundle for exactly this shape: liveness entries whose verdict is right and whose cited objectui reader has moved. It is closed; this is a fresh instance, produced by a pin bump rather than found by a sweep. Worth asking whether a pin bump should carry a routine citation re-check, since the bump is the moment upstream readers move.

Suggested check

Re-read both notes against objectui at the pin in force and reword to the single surviving spelling, keeping the conclusion sentence intact.


Generated by Claude Code

Activity

  1. huangyiirene commented on Sep 2, 2026

    @huangyiirene
    Collaborator

    Triage (R+89, triage seat, session session_019kDRpB7D2XzVzkaLp57T5D): graded → pm:queue · priority:p3 · domain:spec · type Task. finding removed.

    Lands in: packages/spec/liveness/field.json (the columns entry note) and the comment near packages/spec/src/conversions/registry.ts:7269 — reword both to the single surviving spelling (accessorKey only, per objectui 41725898c's changeset), keeping each conclusion sentence intact. Citation accuracy only; no verdict moves, no ledger re-grade, ⛔ no code. Same class as the closed #7133 bundle.

    The card's side question — should a console pin bump carry a routine citation re-check — is not answered here and not lost: it is one sentence to add to the pin-bump discipline if a second pin produces a second instance; one instance does not buy a rule.

    Size/model suggestion: S mechanical, sonnet.


    Generated by Claude Code

  2. added theissue type on Sep 2, 2026
  3. zhuangjianguo commented on Sep 3, 2026

    @zhuangjianguo
    Collaborator

    Claim: PM loop, domain:spec seat (seat post #6017), R4 of this shift
    Session: session_0174WZTU6XcFcS7g2kykC53i (GitHub zhuangjianguo)
    Branch: claude/issue-14166-accessor-key-citations
    Worktree: objectstack-issue-14166
    Domain: domain:spec
    File surface: packages/spec/liveness/field.json — the columns entry's note (:398 on origin/main 4428dd57) reworded to the single surviving spelling (accessorKey only, per objectui 41725898c's changeset), the conclusion sentence kept intact · packages/spec/src/conversions/registry.ts — the comment at :7269 ("the data-table accessor reads accessorKey || name") reworded the same way · the dev re-reads both against objectui at the console pin in force before rewording (the pin bump #14027 / PR #14165 is the source of the retirement) · generated artifacts only if check:generated proves a liveness/reference page projects the note (⛔ never hand-edited) · changeset per AGENTS.md's criterion, measured on the built tree (the liveness/** directory is in @objectstack/spec's files, so the note text publishes — a spec patch changeset is expected; the dev states the measurement; the #14093 precedent 5532881886) · census --fix only on rot. ⛔ Untouched: every verdict / ledger state in field.json (citation accuracy only — no re-grade), all code, content/docs/releases, skills.
    Container & model: S, mode:subagent, model: opus (the os-dev floor; triage suggested sonnet). Tier from content — prose citations only; registry.ts ⇢ packages/spec/src/** is the Clause ② SUSPECT glob, but no accept set and no surface moves.
    Clause-②: no — comment and ledger-note text; no accept-set or surface movement. The dev's own claim comment carries the same line.
    Serial constraints cleared: open-PR file inventory (23 open PRs, 203 files at 22:29Z): none touches liveness/field.json or conversions/registry.ts; lane siblings in flight (#14149 automation/**; #14159 ui/component.zod.ts + ui/page.zod.ts; the three queued PRs #15098 / #15101 / #15102) file-disjoint; no remote branch exists for this card (22:58Z).
    H17 on-hold trigger-file index (#9857 body, read 20:38Z): neither file is a declared trigger file — no notice owed.
    Decision re-read (1 comment): triage 5502966399 (2026-09-02, graded pm:queue p3 Task; lands in the two files named above; reword to the single surviving spelling keeping each conclusion sentence intact; citation accuracy only, no verdict moves, no ledger re-grade, ⛔ no code; the side question about pin-bump citation checks is not answered here — one instance does not buy a rule). Premise re-read on origin/main 4428dd57 (22:57Z): both sites still carry the two-spelling text (field.json:398, registry.ts:7269). Premise holds.


    Generated by Claude Code

  4. zhuangjianguo commented on Sep 3, 2026

    @zhuangjianguo
    Collaborator

    Dispatch (R4 of this shift, 2026-09-03T22:59Z) — domain:spec seat, session_0174WZTU6XcFcS7g2kykC53i, seat post #6017. mode:subagent, model: opus (the os-dev floor), size S, Clause ② no (no gate label; the dev's claim carries Clause-②: no). The dev leaves its own Claim: comment below; the assignee stays the PM's.

    Dispatch text handed to the dev, in brief (triage 5502966399's constraints are the operative ones — citation accuracy only, no verdict moves, no code):

    • Re-read the accessor against objectui at the console pin in force (read only) and cite file:line; reword the columns note in liveness/field.json (:398) and the comment at registry.ts:7269 to the single surviving spelling, conclusion sentences intact; check:liveness / check:generated (--fix only if a page projects the note).
    • Changeset measured on the built tree per AGENTS.md's criterion (liveness/** publishes ⇒ a spec patch changeset expected; the ActionSchema.method's worked example points a type: 'api' PATCH at /api/v1/sys_api_key/{id} — the shipped data API is /api/v1/data/:object/:id, so copying it 404s #14093 precedent), census check after the last edit.
    • Landing: draft PR Fixes #14166, two-limb Clause ② line, before/after of both notes and the objectui citation in the body, ⛔ no needs:contract-review, ⛔ no ready flip; report as os-dev-report here. Stop if a conclusion sentence would change (a re-grade is not this card's).

    Generated by Claude Code

  5. zhuangjianguo commented on Sep 3, 2026

    @zhuangjianguo
    Collaborator

    Claim: os-dev developer seat, dispatched by the domain:spec PM seat (seat post #6017, R4 of this shift), mode:subagent, size S.
    Session: session_0174WZTU6XcFcS7g2kykC53i
    Branch: claude/issue-14166-accessor-key-citations (empty branch pushed before the first edit; base 4428dd57)
    Worktree: objectstack-issue-14166
    Domain: domain:spec
    Clause-②: no

    File surface: packages/spec/liveness/field.json — the relatedListColumns entry's note (:398 on origin/main 4428dd57), the accessor phrase only, conclusion sentence kept intact · packages/spec/src/conversions/registry.ts — the TSDoc comment at :7269, the same phrase, no code · a .changeset/*.md entry if the measurement on the built tree shows the changed bytes publish from the released package. ⛔ Untouched: every other entry, verdict and ledger state in field.json (citation accuracy only, no re-grade), all code in registry.ts, objectui, content/docs/releases/, skills/.

    Assignee: unchanged — the PM's. This seat never sets it.

    Premise re-read on origin/main 4428dd57: both sites still carry the two-spelling text (field.json:398, registry.ts:7269). Premise holds.

    Pin in force, read from this repo's .objectui-sha: objectui 67dadd602a3a891666ea1513c5de677140784b6a (2026-09-01). It already contains both 41725898c (the retirement the card cites) and d8ec8d6d4f01 (the sha the pin bump named), so the reworded citation names the pin's own commit rather than the card's. Read at that commit, read-only, in a separate checkout:

    • packages/components/src/renderers/complex/data-table.tsx:872-876 — initialColumns maps accessorKey: col.accessorKey with no || col.name; the block above it records both retired aliases.
    • packages/core/src/utils/column-identity.ts:69 — columnIdentity still resolves canonical field first, legacy spellings after.

    Both notes' conclusion sentences survive unchanged (a spec-canonical object entry still renders blank cells, and is still refused at parse), so no verdict moves and no re-grade is owed — the stop condition in the dispatch does not fire.


    Generated by Claude Code

  6. zhuangjianguo commented on Sep 3, 2026

    @zhuangjianguo
    Collaborator

    os-dev-report

    {
      "issue": 14166,
      "status": "done",
      "branch": "claude/issue-14166-accessor-key-citations",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/15111",
      "premise_still_valid": true,
      "summary": "Both cited notes still carried the two-spelling text on origin/main 4428dd57, so the premise held. Reworded the accessor phrase to the single surviving spelling in packages/spec/liveness/field.json (the relatedListColumns entry's note, :398) and in the field-column-lists-canonicalized docblock in packages/spec/src/conversions/registry.ts (:7269) — prose only, no code, no verdict or ledger state moved. Two judgement calls stated in the PR body: (1) the pin in force is objectui 67dadd602a3a, which already contains both 41725898c (the retirement) and d8ec8d6d4f01 (the sha the bump named), so the notes cite the pin's own commit as the dispatch directs, re-read at packages/components/src/renderers/complex/data-table.tsx:872-876 (accessorKey: col.accessorKey, no fallback) and packages/core/src/utils/column-identity.ts:69 (columnIdentity still canonical-field-first); (2) each note's measurement attribution moved with the spelling, because leaving 'Measured 2026-08-17 against objectui main' in front of the new reading would have manufactured a fresh miscitation — the 2026-08-17 tree really did read accessorKey || name. Both conclusion sentences are kept verbatim and the stop condition did not fire. In registry.ts the historical pin spelling ('.objectui-sha' pin 'sha') was chosen over the asserting one deliberately: the asserting form would add a new gate edge that reds on the next pin bump, and this card explicitly does not decide whether a pin bump should carry a routine citation re-check. A @objectstack/spec patch changeset is included; the measurement is below. The assignee is the PM's and was not touched.",
      "tests": "All exits captured by redirecting first (cmd > log 2>&1; EXIT=$?), never through a pipe; verdicts below are the gates' own printed lines. Verification record at final head e3e66d15 (tree clean, union re-derived there and byte-identical to the pre-commit derivation). Heavy runs went through scripts/pm/os-verify-lock.sh with OS_VERIFY_LOCK_SLOT=issue-14166-dev; its VERDICT lines read command-exit 0 (waits 0s/1m59s/1m07s/0s/1m26s) and its shared-box caveat applies to every wall-clock figure. BUILD: `pnpm --filter '@objectstack/spec^...' build` exit 0 — 'No projects matched the filters', which is real and not the zero-match trap: @objectstack/spec declares zero workspace dependencies (only pg-connection-string and zod), verified from its package.json. `pnpm --filter @objectstack/spec build` exit 0 — 'check-dts-emitted: @objectstack/spec - 34/34 declared declaration file(s) present.'. TESTS: `pnpm --filter @objectstack/spec exec vitest run --maxWorkers=2` exit 0 — 'Test Files  466 passed (466)' / 'Tests  12435 passed (12435)' (389s under the lock). TYPECHECK: `pnpm --filter @objectstack/spec typecheck` exit 0 — 'check:test-typecheck: OK — @objectstack/spec's test layer compiles under packages/spec/tsconfig.test.json'; coverage proved rather than assumed, `tsc --noEmit --listFiles` names src/conversions/registry.ts (1 hit). NAMED GATES: check:liveness exit 0 ('every path:NNN citation names a line that file actually has'); check:generated exit 0 — 'All 15 generated artifacts are up to date', so the note projects into NO generated page and --fix was neither needed nor run; check:docs exit 0 and check:api-surface exit 0 (both inside the union); check:objectui-pin-citations exit 0 — '8 asserting objectui pin citation(s) match .objectui-sha (67dadd602), 16 historical citation(s) recorded and not checked, across 1140 spec source(s)', which is where the new registry.ts citation lands (historical, recorded, not checked); node scripts/check-system-context-census.mjs exit 0 — 'OK — 106 elevation read sites in 20 packages across 45 files, all anchored; 140 anchors resolve, 27 declared non-read' (no --fix; registry.ts carries no isSystem read site and no anchor points into it, so its net +1 line cannot rot the page); pnpm check:nul-bytes exit 0 — 'OK (scanned 8217 text file(s) ... no raw ASCII control bytes)'. ESLINT over the edited TypeScript file: exit 0, 1 file, 0 errors, 0 warnings — a DECLARED NARROWING with all three pieces: population read from eslint's own config (it reports field.json and the changeset .md as 'File ignored because no matching configuration was supplied', so registry.ts is the only changed file its config admits), count read from --format json (1 file), and invariance from eslint.config.mjs:327-328 stating this repo 'never enables type-aware linting (no parserOptions.project, no typed @typescript-eslint rules) for ANY file'. UNION: `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack`, no paths passed, 60 commands over the 3 paths it read from git; 58 green. NOT MEASURED (2, each the gate's own exit-3 code, neither a red, neither caused by this diff): check-test-completeness.mjs ('There is no local log to hand it, so the local reading for this gate is NOT MEASURED') wants a saved turbo run test log; check:dual-build-cjs-loads ('PREREQUISITE NOT MET — this gate reads built output, and some package has no dist/', 85 packages) wants a whole-repo build, which is CI's run. Two more were environmental on first pass and then measured properly, so they are NOT in the NOT MEASURED set: check-plugin-teardown-shape.mjs --self-test first exit 1 on a shallow checkout ('cannot read the positive control at 621a4876'), green after `git fetch --depth=1 origin 621a4876` ('47 cases pass'); check:doc-formula-expressions first exit 3 for two unbuilt workspace packages, green after building @objectstack/formula and @objectstack/lint ('22 record-scoped formula example(s) across 426 files / 1368 TS blocks judged clean'). The derivation also flags 7 artifact-roster families whose roster directory contains one of my paths (silence is evidence in neither direction); 6 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) and the 7th, check:spec-changes, is covered inside check:generated. CHANGESET MEASUREMENT (not assumed): `npm pack --dry-run --json` in packages/spec after the build lists 2082 files; liveness/field.json ships verbatim (liveness is in the package's files) and the registry.ts docblock ships inside dist/index.js.map, dist/index.mjs.map, dist/shared/index.{js,mjs}.map and dist/browser/index.{js,mjs}.map via sourcesContent (registry.ts is not a .zod.ts file, so the src/**/*.zod.ts entry does not carry it) — `grep -rl 'data-table accessor reads' dist/` returns exactly those six maps. Both changed byte-ranges therefore publish from the released package, so this carries a @objectstack/spec patch changeset and NOT skip-changeset; no label was applied. EDIT-LANDED PROOF (both sites, before the gates): each rewrite was applied by an anchored replace that refused on a non-unique anchor and then counted occurrences on disk — field.json old phrase 0 / new phrase 1 and the file still JSON.parses; registry.ts old block 0 / new block 1, and `accessorKey || name` now occurs 0 times in registry.ts and exactly once in field.json, inside the new sentence that describes the past reading. No ablation or reverse verification is owed: the diff is prose.",
      "mcp_calls": "3 — add_issue_comment (the claim), create_pull_request, add_issue_comment (this report); every read went through unauthenticated REST on the public repo, git, and local greps",
      "open_questions": [],
      "out_of_scope_findings": []
    }

    Generated by Claude Code

  7. zhuangjianguo commented on Sep 3, 2026

    @zhuangjianguo
    Collaborator

    Review — ACCEPT — PR #15111 (head e3e66d15, Fixes #14166, Clause ② no)

    Reviewer of record: the domain:spec seat (session_0174WZTU6XcFcS7g2kykC53i, seat post #6017). Readings against GitHub, origin/main 369da918 and objectui at the pinned commit 67dadd602a3a, 2026-09-03T23:42Z–23:44Z; report comment on this card (mcp_calls 3: claim, PR creation, report — declared).

    Form and scope. Draft, base main, first line Fixes #14166 — the only closing keyword (two-read done). 3 files, +37/-4: the relatedListColumns note in packages/spec/liveness/field.json (one line), the field-column-lists-canonicalized docblock in packages/spec/src/conversions/registry.ts (four comment lines for three; no code), and a @objectstack/spec patch changeset. No generated page moved (check:generated green on the second run — the note projects into none), no content/docs/releases, no governed surface; trial merge clean; check-clause2-carriers.mjs --pair 15111 exit 0 (23:42Z). Triage's constraints (5502966399) honoured: citation accuracy only, both conclusion sentences kept verbatim, no verdict or ledger state moved, no code.

    The citation is verified on the tree, at the pin in force. .objectui-sha on origin/main reads 67dadd602a3a891666ea1513c5de677140784b6a; at that commit objectui's packages/components/src/renderers/complex/data-table.tsx:872-876 maps accessorKey: col.accessorKey with no || col.name fallback (the file's only remaining || col.name is the comment at :841 describing the retired form), and packages/core/src/utils/column-identity.ts:69 still resolves the canonical field first — two vocabularies, so both notes' conclusions ("a spec-canonical object form renders BLANK cells — refused at parse") stand and the card's stop condition did not fire. Citing the pin's own commit rather than the card's 41725898c / d8ec8d6d4f01 (both ancestors of the pin) is the honest spelling; moving the measurement attribution with the reading ("RE-CITED 2026-09-03 … Verdict unchanged: LIVE", the ledger's existing house style) is right — leaving "Measured 2026-08-17" in front of a reading that was false on that date would have manufactured a new miscitation. The historical .objectui-sha pin spelling in registry.ts (recorded, not asserted by check:objectui-pin-citations) is the correct choice: the asserting form would add a gate edge that reds on the next bump, which this card explicitly does not decide.

    Changeset — measured, patch accepted. npm pack --dry-run on the built package: liveness/field.json ships verbatim (liveness is in files) and the registry.ts docblock ships inside six sourcemaps' sourcesContent (dist is in files; registry.ts is not a .zod.ts) — the AGENTS.md criterion, the #14093 precedent (5532881886). Recorded again for the skills-lane finding at shift end (the checklist's "docs-only ⇒ skip-changeset" wording).

    Evidence. Spec build, the spec suite 466 files / 12435 tests, typecheck with the edited file proven in-program, check:liveness / check:generated / check:docs / check:api-surface / check:objectui-pin-citations green, census "no rot" (and no anchor points into registry.ts), eslint over the one admitted file with the narrowing declared in three pieces, 60 derived gates at e3e66d15 — 58 green, 2 NOT MEASURED by their own verdict (the saved-log and whole-repo-build family; CI's), two environmental first-pass failures converted to real measurements. No reverse verification owed for prose; the edit-landed proof (anchored replace, occurrence counts on disk) stands in its place. Evidence pinned to e3e66d15 = PR head.

    Out-of-scope group: none. The card's side question (should a pin bump carry a routine citation re-check) stays recorded on the card, unanswered — one instance does not buy a rule.

    Landing. CI on e3e66d15 at 23:42Z: 31 checks, 0 red, 21 running. At all-green: provenance → ready → squash auto-merge → added_to_merge_queue. On MERGED: strip pm:dispatched, probe both notes on origin/main, landing note; the liveness/field.json / registry.ts reservation is released.


    Generated by Claude Code

  8. claude commented on Sep 4, 2026

    @claude
    ContributorAuthor

    Landed — PR #15111 merged via the queue at 2026-09-04T00:32:29Z, merge commit fa8715ad (squash; origin/main tip fa8715ad at 2026-09-04T00:33Z, the merge commit is its ancestor). domain:spec PM seat, session session_0174WZTU6XcFcS7g2kykC53i, seat post #6017.

    Probed on origin/main at 2026-09-04T00:33Z:

    • packages/spec/liveness/field.json:398 — the columns note is re-cited: the 2026-08-17 accessorKey || name reading is quoted as history, and the current sentence says the data-table accessor resolves accessorKey only (objectui#6963 retired the name alias); verdict unchanged, LIVE.
    • packages/spec/src/conversions/registry.ts:7270 — the comment says accessorKey only, citing objectui#6963.
    • git grep for a live accessorKey || name / accessorKey ?? name citation under packages/spec on origin/main: only the historical quote inside the re-cited note — no other copy remains.

    Card closed by the PR's Fixes; pm:dispatched stripped in this stroke (read back). H17 on-hold trigger-file index (#9857 body, read at 2026-09-04T00:33Z): no entry names these three files. The liveness/field.json / registry.ts reservation in the seat post is released.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions