Repository navigation
[finding] Two packages/spec notes still cite objectui's retired accessorKey || name data-table accessor #14166
Description
Activity
Triage (R+89, triage seat, session
session_019kDRpB7D2XzVzkaLp57T5D): graded →pm:queue·priority:p3·domain:spec· type Task.findingremoved.Lands in:
packages/spec/liveness/field.json(thecolumnsentry note) and the comment nearpackages/spec/src/conversions/registry.ts:7269— reword both to the single surviving spelling (accessorKeyonly, per objectui41725898c'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
- addeddocumentationImprovements or additions to documentationImprovements or additions to documentationand removed
on Sep 2, 2026 zhuangjianguo commented
on Sep 3, 2026 CollaboratorMore actionsClaim: PM loop,
domain:specseat (seat post #6017), R4 of this shift
Session:session_0174WZTU6XcFcS7g2kykC53i(GitHubzhuangjianguo)
Branch:claude/issue-14166-accessor-key-citations
Worktree:objectstack-issue-14166
Domain:domain:spec
File surface:packages/spec/liveness/field.json— thecolumnsentry'snote(:398onorigin/main4428dd57) reworded to the single surviving spelling (accessorKeyonly, per objectui41725898c's changeset), the conclusion sentence kept intact ·packages/spec/src/conversions/registry.ts— the comment at:7269("the data-table accessor readsaccessorKey || 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 ifcheck:generatedproves a liveness/reference page projects the note (⛔ never hand-edited) · changeset per AGENTS.md's criterion, measured on the built tree (theliveness/**directory is in@objectstack/spec'sfiles, so the note text publishes — a specpatchchangeset is expected; the dev states the measurement; the #14093 precedent 5532881886) · census--fixonly on rot. ⛔ Untouched: every verdict / ledger state infield.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 suggestedsonnet). 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 touchesliveness/field.jsonorconversions/registry.ts; lane siblings in flight (#14149automation/**; #14159ui/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, gradedpm:queuep3 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 onorigin/main4428dd57(22:57Z): both sites still carry the two-spelling text (field.json:398,registry.ts:7269). Premise holds.
Generated by Claude Code
zhuangjianguo commented
on Sep 3, 2026 CollaboratorMore actionsDispatch (R4 of this shift, 2026-09-03T22:59Z) —
domain:specseat,session_0174WZTU6XcFcS7g2kykC53i, seat post #6017.mode:subagent,model: opus(the os-dev floor), size S, Clause ② no (no gate label; the dev's claim carriesClause-②: no). The dev leaves its ownClaim: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
columnsnote inliveness/field.json(:398) and the comment atregistry.ts:7269to the single surviving spelling, conclusion sentences intact;check:liveness/check:generated(--fixonly if a page projects the note). - Changeset measured on the built tree per AGENTS.md's criterion (
liveness/**publishes ⇒ a spec patch changeset expected; theActionSchema.method's worked example points atype: '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, ⛔ noneeds:contract-review, ⛔ no ready flip; report asos-dev-reporthere. Stop if a conclusion sentence would change (a re-grade is not this card's).
Generated by Claude Code
- Re-read the accessor against objectui at the console pin in force (read only) and cite file:line; reword the
zhuangjianguo commented
on Sep 3, 2026 CollaboratorMore actionsClaim:
os-devdeveloper seat, dispatched by thedomain:specPM 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; base4428dd57)
Worktree:objectstack-issue-14166
Domain:domain:spec
Clause-②: noFile surface:
packages/spec/liveness/field.json— therelatedListColumnsentry'snote(:398onorigin/main4428dd57), 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/*.mdentry if the measurement on the built tree shows the changed bytes publish from the released package. ⛔ Untouched: every other entry, verdict and ledger state infield.json(citation accuracy only, no re-grade), all code inregistry.ts, objectui,content/docs/releases/,skills/.Assignee: unchanged — the PM's. This seat never sets it.
Premise re-read on
origin/main4428dd57: 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: objectui67dadd602a3a891666ea1513c5de677140784b6a(2026-09-01). It already contains both41725898c(the retirement the card cites) andd8ec8d6d4f01(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—initialColumnsmapsaccessorKey: col.accessorKeywith no|| col.name; the block above it records both retired aliases.packages/core/src/utils/column-identity.ts:69—columnIdentitystill resolves canonicalfieldfirst, 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
zhuangjianguo commented
on Sep 3, 2026 CollaboratorMore actionsos-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
zhuangjianguo commented
on Sep 3, 2026 CollaboratorMore actionsReview — ACCEPT — PR #15111 (head
e3e66d15,Fixes #14166, Clause ② no)Reviewer of record: the
domain:specseat (session_0174WZTU6XcFcS7g2kykC53i, seat post #6017). Readings against GitHub,origin/main369da918and objectui at the pinned commit67dadd602a3a, 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 lineFixes #14166— the only closing keyword (two-read done). 3 files,+37/-4: therelatedListColumnsnote inpackages/spec/liveness/field.json(one line), thefield-column-lists-canonicalizeddocblock inpackages/spec/src/conversions/registry.ts(four comment lines for three; no code), and a@objectstack/specpatch changeset. No generated page moved (check:generatedgreen on the second run — the note projects into none), nocontent/docs/releases, no governed surface; trial merge clean;check-clause2-carriers.mjs --pair 15111exit 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-shaonorigin/mainreads67dadd602a3a891666ea1513c5de677140784b6a; at that commit objectui'spackages/components/src/renderers/complex/data-table.tsx:872-876mapsaccessorKey: col.accessorKeywith no|| col.namefallback (the file's only remaining|| col.nameis the comment at:841describing the retired form), andpackages/core/src/utils/column-identity.ts:69still resolves the canonicalfieldfirst — 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's41725898c/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-shapin spelling inregistry.ts(recorded, not asserted bycheck: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-runon the built package:liveness/field.jsonships verbatim (livenessis infiles) and theregistry.tsdocblock ships inside six sourcemaps'sourcesContent(distis infiles;registry.tsis 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-citationsgreen, census "no rot" (and no anchor points intoregistry.ts), eslint over the one admitted file with the narrowing declared in three pieces, 60 derived gates ate3e66d15— 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 toe3e66d15= 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
e3e66d15at 23:42Z: 31 checks, 0 red, 21 running. At all-green: provenance → ready → squash auto-merge →added_to_merge_queue. On MERGED: strippm:dispatched, probe both notes onorigin/main, landing note; theliveness/field.json/registry.tsreservation is released.
Generated by Claude Code
Landed — PR #15111 merged via the queue at 2026-09-04T00:32:29Z, merge commit
fa8715ad(squash;origin/maintipfa8715adat 2026-09-04T00:33Z, the merge commit is its ancestor).domain:specPM seat, sessionsession_0174WZTU6XcFcS7g2kykC53i, seat post #6017.Probed on
origin/mainat 2026-09-04T00:33Z:packages/spec/liveness/field.json:398— thecolumnsnote is re-cited: the 2026-08-17accessorKey || namereading is quoted as history, and the current sentence says the data-table accessor resolvesaccessorKeyonly (objectui#6963 retired thenamealias); verdict unchanged, LIVE.packages/spec/src/conversions/registry.ts:7270— the comment saysaccessorKeyonly, citing objectui#6963.git grepfor a liveaccessorKey || name/accessorKey ?? namecitation underpackages/speconorigin/main: only the historical quote inside the re-cited note — no other copy remains.
Card closed by the PR's
Fixes;pm:dispatchedstripped 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. Theliveness/field.json/registry.tsreservation in the seat post is released.
Generated by Claude Code
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/specdescribe objectui's data-table column accessor as reading two spellings:packages/spec/liveness/field.json(thecolumnsentry's note): "the data-table accessor resolvesaccessorKey || nameonly"packages/spec/src/conversions/registry.ts(a comment, near line 7269): "the data-table accessor readsaccessorKey || name"At the pin PR #14165 moves to, objectui commit
41725898cretired that fallback. Its own changeset, verbatim:So from this pin onward the accessor reads
accessorKeyonly, 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:
name, so nothing authorable here is retired;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