Uh oh!
There was an error while loading. Please reload this page.
docs(spec): record the live read point of page:tabs items[].icon (#9972) - #10055
Conversation
…9972) A `.describe()` naming the objectui consumer plus an accept-pin, the exact sibling of the landed accordion record — so a liveness sweep stops re-deriving a false retirement candidate for a key that renders. Re-verified at the pin this repo builds against (`.objectui-sha` = 82a94170c): `containers.tsx:662-665` renders `{item.icon && <LazyIcon name={item.icon} …/>}` inside the TabsTrigger, and `:721` publishes the key to the Studio block designer in the `items` input. Nothing about what parses changes — the key was already declared and optional. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01URCaKuNTuK3BKJvwqM74QU
📓 Docs Drift CheckThis PR changes 1 package(s): ⛔ 1 release-owned page(s) name something this change touched. These are read-only:
What this run could not seeCoarse fallback — 115 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin ce5b456ed4a40490f146a4294ae20557f3ff718f && git checkout ce5b456ed4a40490f146a4294ae20557f3ff718f
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 20b9a9ce1b184e55468444905dc215f64d459249 e521aba3f9423b08d776e047f50adb4badf631d7 && git checkout -B drift-repro 20b9a9ce1b184e55468444905dc215f64d459249 && git merge --no-ff e521aba3f9423b08d776e047f50adb4badf631d7
node scripts/docs-audit/affected-docs.mjs --json 20b9a9ce1b184e55468444905dc215f64d459249
|
Uh oh!
There was an error while loading. Please reload this page.
Fixes#9972
Text face only, the exact sibling of the landed accordion record:
page:tabsitems[].iconparsed, rendered, and said nothing about itself — the same absence a liveness sweep reads as declared-but-unenforced, and the same absence that once cost a full dispatch cycle re-deriving a cross-repo read point before the retirement candidate was closed premise-overtaken. Nothing about what parses changes.The key is live — re-measured at the pin, not taken from the card
Read at
.objectui-sha=82a94170c(the value at this branch point onorigin/main), viagit show 82a94170c:against the objectui sibling's object store:packages/components/src/renderers/layout/containers.tsx:662-665:PageTabsRendererguards onitem.iconand renders aLazyIconwhosenameprop isitem.icon, inside theTabsTrigger, left of the label span (mr-1.5 h-3.5 w-3.5 shrink-0 opacity-70,aria-hidden).containers.tsx:721: theitemsinput ofComponentRegistry.register('tabs', …)publishes the key to the Studio block designer, documented as[{ label, value?, icon?, count?, visibleWhen?, children }].Vocabulary resolves through objectui's
LazyIcon(lib/lazy-icon.tsx— kebab-case or PascalCase, normalised to kebab-case, with a fallback when the name is not a real Lucide icon).What changed
packages/spec/src/ui/component.zod.ts— a.describe()on the tab item'siconnaming the consumer behaviourally, plus the docblock above it carrying the file:line anchors and the measured pin, in the idiom the neighbouring split keys already use.packages/spec/src/ui/component.test.ts— an accept-pin beside the existingpage:tabsblocks asserting three things: the key parses and survives to the parsed output; an undeclared sibling on the same item is still refused (so the accept is not vacuous on a schema that stopped being strict); the.describe()still names the consumer..changeset/tabs-item-icon-liveness.md—@objectstack/specpatch.Reverse verification ran from the committed state with the direction predicted first: reverting only the schema file turned exactly one pin red (
descriptionisundefined) while the accept and the strictness pin stayed green — the two do not read the description, so this is the observed direction, not the presumed one.The remaining
iconslots incomponent.zod.ts, per the grading's in-scope extraRe-derived at this branch point with two probes (every line starting
icon:, plus a multi-line-declaration probe and a sweep for any*[Ii]con*key), because a multi-line declaration would evade a single-line grep:There are no other bare
iconslots — the tab item was the last one, so nothing else qualifies for same-PR coverage under the "same two-anchor live-reader class" rule. Full enumeration, all out of scope here:page:header.iconretiredKey(…)(ADR-0087, removed in 17.0.0)iconrecord:alert.iconpage:accordionitemsiconrecord:highlightsfieldiconelement:button.iconobject-metric.iconThe three vocabulary-only describes are a weaker class than this card's trigger (they are declared with intent, not bare), so they are recorded as findings for triage (#10053, #10054) rather than folded in here.
Verification
pnpm --filter @objectstack/spec test— 414 files / 11039 tests pass.pnpm --filter @objectstack/spec typecheckgreen (tsc, scripts tsconfig, and the test-layer ledger, counts unchanged). Generated artifacts:check:generatedandcheck:api-surfacegreen after a real DTS build; the describe regenerates nothing (git statusclean beyond the three files, and the landed accordion describe text likewise appears in no committed artifact). Gate families were re-derived against the actual changed paths withscripts/pm/dispatch-gates.mjs; the run and its result are in the report on the issue.Generated by Claude Code