Repository navigation
The published skills corpus teaches the retired table column aliases — prose documents the name fallback and the example authors label #5473
Description
Activity
- addeddocumentationImprovements or additions to documentationImprovements or additions to documentation
on Aug 21, 2026 Triage:
pm:queue, type Task — two-line fix inskills/objectui/guides/schema-expressions.md(governed, customer-published surface ⇒ draft PR, human merge on the ACCEPT path).Sequencing (the card's "triage call"): land before or with #5350 — the corpus must not spend a window teaching a spelling the renderer already refuses, and the failure post-#5350 is silent (empty heading, no React key warning). If #5350's PR is still open at dispatch, the cleanest shape is landing this first (it is correct under both the old and new renderer:
header+accessorKeywere always the declared contract). ⛔ Scope stays the twotype: "table"sites only — thedata-tablealias sites at L410 / data-integration.md:212 belong to #5120/#5351 (in flight), do not fold.Size/model suggestion: S mechanical, sonnet.
Generated by Claude Code
Triage (daily round, session
session_01Kktexqp6uVuFMztvvTMf3V, 2026-08-24):domain:skillsadded (published skills corpus face; pm:queue already present). The skills seat owns dispatch; whole-package value-density review applies — this is a correction of retired aliases the corpus still teaches.
Generated by Claude Code
- added and removeddocumentationImprovements or additions to documentationImprovements or additions to documentation
on Aug 29, 2026 Claim: skills 席派发认领(定级 MEDIUM——两行修正;时序要求「先于或随 #5350」,dev 首步核 #5350 现势,若已落地则本卡已在敞口窗内,加急)。
Session:session_01MnijPVVDakqK2J335JoJtq· Branch:claude/issue-5473-table-alias-guide· Worktree:../objectui-5473-table(dev 自建)
File surface:skills/objectui/guides/schema-expressions.mdL493 + L500 两处(发布 skills 整包裁定适用;⛔ 不碰同文件 L410 data-table 半边——那是 #5120/#5351 的)。
Container & model: os-dev 子代理;无 tier 声明面 ⇒ PM 判:opus 执行。
Clause-② limb: 不触发。
Serial: schema-expressions.md 串行队首;#5759(row-predicate 弃用注记,~L305)排其后,待本卡落地再派。md 文件 ⇒ draft 双推维护者审。
Generated by Claude Code
os-dev-report
{ "issue": 5473, "status": "done", "premise_still_valid": true, "branch": "claude/issue-5473-table-alias-guide", "worktree": "/home/user/objectui-5473-table", "base": "546f610994bcd32908a7f6f7ce05b779f6e4c6b5", "pr": "https://github.com/objectstack-ai/objectui/pull/6738", "pr_url": "https://github.com/objectstack-ai/objectui/pull/6738", "pr_number": 6738, "draft": true, "r5350_state": "LANDED — measured in-tree, not recalled. packages/components/src/renderers/complex/table.tsx reads col.header (1 occurrence) and row[col.accessorKey] (1 occurrence); col.label and col.name are 0 occurrences, with col.header as the positive control proving the grep resolves. The renderer imports StaticTableColumn, and __tests__/table-column-contract.test.tsx names objectui#5350 in its header and pins the retired label/name aliases as failures.", "edits": [ "skills/objectui/guides/schema-expressions.md L501-503 prose: dropped the ', falling back to `name`' clause; reflowed within the same 3 lines.", "skills/objectui/guides/schema-expressions.md L509 worked example: \"label\" changed to \"header\" in the type:\"table\" columns example." ], "line_counts": { "file_before": 621, "file_after": 621, "file_delta": 0, "package_all_md_before": 5673, "package_all_md_after": 5673, "package_delta": 0, "skill_md_only_before": 155, "skill_md_only_after": 155, "numstat": "3 insertions, 3 deletions, 1 file — correction, zero net expansion" }, "gates": { "check:skills-paths": "PASS exit 0 — 'check-skills-paths: OK (93/94 stated path(s) resolve across 18 guide file(s); 1 baselined).'", "check:doc-types": "PASS exit 0 — 'Every documented component type is registered.'", "check:doc-fences": "PASS exit 0 — 'every TypeScript block in 223 document(s) is fenced ts/tsx/typescript'", "check:doc-snippets": "PASS — first returned exit 2, which the gate itself defines as 'I could not run' (needs a build), NOT a red. After turbo build over its own --build-filter closure (32/32 tasks successful) it reached a real verdict: 'Semantic phase: 267 of 267 block(s) judged, 0 failed.' / 'Every covered documentation snippet compiles against the built types.' Build and gate joined with && under the shared verify lock; lock printed 'VERDICT command-exit 0', so that number certifies both parts.", "docs:check-links": "PASS exit 0 — 'Links are valid across 17 scan roots.'", "check:control-bytes": "PASS exit 0 — 'check-control-bytes: OK (scanned 5593 tracked text file(s); skipped 85 binary).'", "check:shell-escape-residue": "PASS exit 0 — 'check-shell-escape-residue: OK (... skills: 18 file(s), 235 fence(s) ...)'; output confirms it actually scanned the skills root rather than skipping it.", "check-changeset-presence": "PASS exit 0 — 'No source of a released package changed in this range, so no changeset is owed.'", "pnpm lint": "DECLARED NARROWING, not run locally. Measured, three pieces: (1) population from eslint's own config — every files: selector in eslint.config.js is ts/tsx, no markdown processor; (2) tool's own output — eslint run directly on the changed file returns 'File ignored because no matching configuration was supplied.'; (3) invariance — the diff has no ts/tsx file and changes no eslint/tsconfig setting, so no untouched file's verdict can move. CI runs the farm regardless." }, "changeset": "None owed, none added. skills/ has no package.json and is in no package's files field — it ships via skills-lock.json, not an npm tarball. Precedent matches: 9363ad0 (docs-only) carried none; 0a2918f carried one only because it edited packages/plugin-map/README.md, which ships inside the published package. No skip-changeset label applied (phantom in this repo).", "stopped": false, "tests": "No test files changed, so no new test run is owed. The retirement's existing pin test (table-column-contract.test.tsx) was READ as evidence, not re-run — it already asserts the exact example this PR fixes renders an empty heading. Gate evidence is the table above, each verdict quoted from the gate's own output with exit codes captured by redirect-then-capture. Gate union ran on the tree at commit 35396f9, which is PR head.", "mcp_calls": 3, "open_questions": [], "out_of_scope_findings": [], "notes": [ "Card refinement, not a contradiction: the card cited TableColumn, which does declare required header + accessorKey, so the conclusion holds. But type:'table' columns are now typed StaticTableColumn — the narrow split from objectui#5474 (maintainer ruling 2026-08-22, Option C), which also requires header + accessorKey and carries ?: never tombstones. TableColumn stays the rich shape data-table honours. Either way label is declared nowhere and name is not an accessor, so no STOP was warranted.", "Scope fence held: the data-table example (still authoring name/label, belonging to #5120 and #5351) is untouched, and data-integration.md is not in the diff. Diff is exactly 1 file, 3 changed lines.", "AGENTS.md governed-surface classification: the published skills/** tree is NOT governed — the governed set is AGENTS.md, CLAUDE.md, .claude/**, docs/adr/**, and the sole criterion is a path starting with .claude/. So this PR is eligible for the ordinary merge-queue path once CI is green. Left as draft per dispatch; the flip is PM's or the maintainer's call, not mine.", "Deviation from the dispatch's body warning, measured: the dispatch said a trailing horizontal-rule plus footer would both be eaten. I ended the body with a bare footer and no rule; the platform then APPENDED its own rule plus a session-URL footer at create time, and full read-back confirms both survived. Nothing was eaten — the body is intact end to end.", "Read-back method note for the PM: the MCP pull_request_read response HTML-escapes on the read side (the plain apostrophe I sent in the PR TITLE comes back as an entity), so entity spellings in that response are not evidence of stored mutation. Confirmed against the rendered page over a separate non-MCP channel: body content markers all present, and the only double-escaped sequences live in GitHub's own og:description meta tags, not the body.", "pnpm install was initially skipped in the fresh worktree; check:doc-snippets surfaced it as ERR_MODULE_NOT_FOUND, which is a 'could not run', not a red gate. Installed and re-ran to a real verdict." ] }Generated by Claude Code
Generated by Claude Code
判决:ACCEPT。PM 收件复审:diff 恰为卡述两处(L501-503 去 name 回退括注、L509 例 label→header),净 0 行,data-table 半边(#5120/#5351 的)未触;dev 实测 #5350 已落地(渲染器读 col.header / row[col.accessorKey],label/name 零命中,正向对照在)——本卡正处发布指南与运行时不一致的敞口窗,修得及时。门全绿(doc-snippets 经 build 后 267/267 judged)。
PR #6738 保持 draft,双推 os-zhuang + hotlong(md 按 08-28 裁定走人审)。批准钉 head 后本席翻 ready + 挂 auto-merge。dev 有一条值得记的观察:objectui 的 AGENTS.md 治理面清单不含skills/**——但 md 走人审是 skills 巷道自己的裁定,不受此影响,照旧。
后续:同文件排队卡 ui#5759(row-predicate 弃用注记)在本卡落地后派。
Generated by Claude Code
Found while implementing #5350 (retiring the
tablerenderer's undeclared column aliases). Filed unassigned, deliberately NOT fixed in that PR:skills/**is a governed, customer-published surface and outside that card's declared file surface, which ispackages/components/src/renderers/complex/table.tsx+content/docs/api/schema-reference.md§TableSchema.This is blast radius of #5350, measured before that PR was opened.
Measured
skills/objectui/guides/schema-expressions.mdcarries two separate dependencies on the aliases #5350 retires.1. The prose documents the accessor fallback as contract (L492-494):
After #5350 there is no fallback to
name. The sentence becomes false.2. The worked example authors
labelfor the heading (L496-503):{ "type": "table", "columns": [{ "label": "Name", "accessorKey": "name" }], "data": [{ "name": "Ada" }, { "name": "Linus" }] }labelis not declared onTableColumn(packages/types/src/data-display.tsdeclares requiredheaderandaccessorKey). The renderer resolved the heading ascol.header || col.labelbefore #5350 and ascol.headerafter it, so this example renders an empty heading over a correct cell once that lands. Measured on the #5350 branch:Before the change the same shape measured
headers="Name" cells="Ada".Why it matters more than a docs typo
The skills corpus is the AI-authoring instruction set — the producer this platform cares most about. #5120's census established the same shape for
data-tableand the maintainer ruling (2026-08-20) retired the alias family anyway. The runtime and the instruction corpus should not disagree about which spelling exists; a platform refusing a spelling it still teaches is the worst configuration for an AI author, especially since the failure is silent (this renderer keys cells by index, so it does not even emit React's missing-key warning — see #5350's legibility pin).Suggested fix
, falling back toname`` — the accessor isaccessorKey, full stop.{ "label": "Name", "accessorKey": "name" }->{ "header": "Name", "accessorKey": "name" }.Sequencing is a triage call. Landing it before or with #5350 is what keeps the corpus and the runtime consistent; landing it after leaves a window where the published guide teaches a spelling the renderer has already dropped.
Scope note — the
data-tablehalf is a different cardThe same file also carries
data-tableexamples spelled{ name, label }at L410, andskills/objectui/guides/data-integration.md:212does too. Those were #5120's census hits and belong to #5120 / #5351, which is in flight. Only thetype: "table"prose at L493 and example at L500 are this issue.Reproduce
Related: #5350 (the retirement that makes this wrong), #5120 (the family ruling), #5351.
Generated by Claude Code