Skip to content

spec(ui): record:details hideEmpty: false — in read-only mode an all-empty section renders its heading plus one fold row; describe() says so - #25612

Merged
objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/issue-25511-hide-empty-describe
Oct 24, 2026
Merged

objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/issue-25511-hide-empty-describe

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #25511

Clause-②: no
Metadata-protocol: semantic

What this changes

The record:details section key hideEmpty (packages/spec/src/ui/component.zod.ts, the RecordDetailsProps.sections[] object form) gets a new describe() text. It implements ruling C on objectstack-ai/objectui#13386 (batch #7 item 4, the maintainer's 「objectui 三个都同意」, 2026-10-23T16:08:53Z):

  • Default (key omitted, or true): unchanged. An all-empty section renders nothing at all: no heading, no skeleton.
  • false, read-only mode: an all-empty section renders its heading plus one fold row that counts the empty fields and reveals them on request. This is the same fold a partly-filled section uses.
  • false, edit mode: unchanged. Every field renders as an editable row.

No key, shape or default changes. The renderer change is objectui's (DetailSection); objectstack-ai/objectui#13386 carries Blocked-by: this card and remains open.

Before After
describe() Hide this section's empty fields (renderer default: on — and a section whose fields are ALL empty then renders nothing at all: no heading, no skeleton). Set false to render empty rows, keeping the section's label skeleton on an all-empty record (e.g. a brand-new one). Whether this section disappears when ALL its fields are empty (renderer default: on — it then renders nothing at all: no heading, no skeleton). Set false to keep it on an all-empty record (e.g. a brand-new one): in read-only mode it renders its heading plus one fold row that counts the empty fields and reveals them on request — the same fold a partly-filled section uses; in edit mode it renders every field as an editable row.

Files:

  • packages/spec/src/ui/component.zod.ts: the describe string, plus one docblock paragraph above it recording the re-ruled false rendering and that the key governs only the all-empty case. The docblock's existing text is about the default and the pre-declaration history, so it stays as it was.
  • content/docs/references/ui/component.mdx: regenerated with gen:docs. check:generated named it as the only stale artifact. The shipped json-schema/ui/RecordDetailsProps.json (gitignored, in files[]) carries the new text after a build.
  • .changeset/25511-hide-empty-describe.md: @objectstack/spec minor, with both declaration lines.

Landing: the measured producer is the one the card named, component.zod.ts at :1440. No other producer of this text exists (git grep for the old phrases finds only the generated mdx, a test comment and the release-owned CHANGELOG.md).

Two wording calls

  1. The fold label is not quoted. The card writes the row as "N empty fields · Show". The ruling's text is 「N 个空字段 · 展开」, and what it rules is "the same fold the mixed sections use". objectui's English label for that fold is "Show {{count}} empty fields" (detail.showEmptyFields, packages/i18n/src/locales/en.ts at objectui 7981384). Quoting "N empty fields · Show" would contradict "the same fold", and quoting objectui's string would pin a label the spec does not own. So the text says what the row does: it counts the empty fields and reveals them on request.
  2. The lead changed from "Hide this section's empty fields" to "Whether this section disappears when ALL its fields are empty". Under C, both values hide an all-empty section's empty rows in read-only mode (true drops the section, false folds the rows), so the old lead no longer told the two values apart. The key never governed a partly-filled section's empty rows either: the renderer's own fold handles those whatever the key says (objectui#7129 Q2-C). The default sentence keeps its meaning; only its grammar follows the new lead.

Verification

All readings were taken on head 0ed74f8840 (the merge of origin/main e649c2d91e; the branch delta against origin/main is exactly the three files above).

  • pnpm --filter @objectstack/spec build: lock VERDICT command-exit 0. The build left no tracked file changed (authorable-surface.base.json untouched).
  • pnpm --filter @objectstack/spec check:generated, before regeneration: exit 1, ✗ 1 of 14 artifact(s) stale: content/docs/references/**. After gen:docs, on the final head: ✓ All 14 generated artifacts are up to date.
  • pnpm --filter @objectstack/spec test: Test Files 714 passed (714), Tests 21687 passed | 1 todo (21688). pnpm --filter @objectstack/spec typecheck (tsc, scripts typecheck, test typecheck): exit 0. Lock VERDICT command-exit 0.
  • Gates: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 107 commands from this diff. Each was run with its exit code captured before any pipe: 106 exited 0. One, pnpm check:dual-build-cjs-loads, exited 3 (PREREQUISITE NOT MET — this gate reads built output, and some package has no dist/), so it is NOT MEASURED. It needs every workspace package built, and only the spec, lint, objectql, client, client-react and formula closures were built (targeted build; declared narrowing). CI's Lint & Repo Gates runs it. Reconciliation: ✓ dispatch-gates --ran: 107 derived famil(ies) accounted for — 106 run, 1 NOT-MEASURED (0 DERIVED from a recorded exit 3, 1 claimed). Selected verdict lines: check:generated ✓ All 14 generated artifacts are up to date; check:docs ✅ 227 generated files in sync with packages/spec; check:api-surface public API surface + factory signatures unchanged ✓; check:doc-authoring clean (9559 describe strings read); check:nul-bytes OK; check-adr-0087-registration this PR adds no declared-breaking changeset (1 non-breaking changeset(s) seen).
  • Local-only check:dev-prereqs: its self-test passes, but the scan exits 1 with ✗ The workspace is not built — 1 unmet precondition (33 of 70 packages have no dist/, same targeted-build cause). NOT MEASURED. The spec build's own stamp (✓ packages/spec/dist/.build-input-hash) and check:generated's declaration-stamp match show packages/spec/dist is current.
  • No ablation or reverse verification. The diff changes describe text and generated docs only, and no test pins that text.

Acceptance notes

  • The renderer lags the text until [Decision] 记录页上「全部字段都为空」的分区,是逐行显示「—」,还是像其他分区一样折叠成「N 个空字段 · 展开」——objectui#12618 objectui#13386 lands. Until then, a false all-empty section still renders empty rows in read-only mode. The ruling orders it this way (spec text first, renderer second).
  • The default in edit mode (noted, not filed; carrier: none). objectui renders every row of an all-empty section in edit mode for the default too (hideAllEmptySection requires !isEditing, DetailSection.tsx at objectui 7981384). The default sentence says "renders nothing at all" with no mode qualifier, as the card asked. No author writes wrong metadata because of it.
  • A stale test comment (noted, not filed; carrier: none). packages/spec/src/ui/component.test.ts at about line 636 still calls false "the only spelling that keeps a section's label skeleton on an all-empty record". That file is outside the claim's file surface, and no assertion depends on the wording.

Generated by Claude Code

@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation protocol:ui tooling labels Oct 24, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

Nothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 1 changed package(s)), so this run has no opinion about the docs.

What this run could not see

Coarse fallback — 144 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json e649c2d91e270e3da26820bcfe54a28445305a75 → packageMentionDocs.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对

ACCEPT · #25511 · domain:spec seat 2 (seat post #18549) · sunhaolin · session session_01PC4NPXPgPmpDRG9DdDnyXT · 2026-10-24T09:21Z · head 0ed74f8840 · report 6382456646 · self-review at TIER_DEFAULT (a packages/spec describe-text surface, this lane's own).

  1. Shape. Draft, base main, first line Fixes #25511, with no other closing keyword in the body. Clause-②: no and Metadata-protocol: semantic are line-initial in the body and in .changeset/25511-hide-empty-describe.md (@objectstack/spec minor). Three files, +30/−2, all inside the claim's surface (get_files): packages/spec/src/ui/component.zod.ts, content/docs/references/ui/component.mdx, the changeset. No governed path, no content/docs/releases/.
  2. Premise and ruling, measured. The describe now states ruling C on [Decision] 记录页上「全部字段都为空」的分区,是逐行显示「—」,还是像其他分区一样折叠成「N 个空字段 · 展开」——objectui#12618 objectui#13386: with false, read-only renders the heading plus one fold row; edit mode renders every row, editable. The default is unchanged ("renders nothing at all"), and no key, shape or default changed. I checked the changeset's sentences against objectui origin/main packages/plugin-detail/src/DetailSection.tsx. "A partly-filled section's empty rows are not governed by this key, in either value" matches its comment at about :302–:306 ("authored hideEmpty does NOT override this branch in either polarity"). The all-empty hide is section.hideEmpty === true && allFieldsEmpty && !isEditing at about :366. Not quoting the fold label is right: the label belongs to objectui (detail.showEmptyFields, "Show COUNT empty fields", interpolated, about :829).
  3. Gates. Check-runs on 0ed74f8840 at this record: 21 success, 6 skipped, 12 in progress (Test Core 1–6/6, Build Core, Build Docs, three Type Check lanes, one scoped Lint), 0 failed. Local: spec test 714/714 files, check:generated up to date after gen:docs, --ran 106 run / 1 NOT MEASURED (check:dual-build-cjs-loads, declared narrowing; CI runs it). Landing waits for every check green on this head.
  4. Deviations accepted. (a) origin/main merged once before the PR opened (e649c2d91e, the Version Packages merge) through scripts/pm/os-regen-merge.sh, with no conflict and re-tested on the merge head. (b) git fetch --unshallow on the shared clone, additive. (c) Targeted builds only, declared. (d) A model-free commit trailer pair, per AGENTS.md. mcp_calls 0; relay writes 2.
  5. Out-of-scope outcomes.
  6. Landing. Not governed and under 3000 changed lines, so the seat lands it. Once every check on the then-current head is green or an expected skip, the seat sends pr_ready + automerge_enable through the relay. The maintainer's hold 「正在发版本,你可以派发但是不要合并。」 is read as ended by their word 「objectstack 已发布 18.1」 in the seat's session. On merge, [Decision] 记录页上「全部字段都为空」的分区,是逐行显示「—」,还是像其他分区一样折叠成「N 个空字段 · 展开」——objectui#12618 objectui#13386 unblocks.

Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Correction to the ## 席位核对 record 6382491996, item 6 (landing) · domain:spec seat 2 · 2026-10-24T09:32Z

The clause-② enqueue gate's path limb hits: the diff touches packages/spec/src/ui/component.zod.ts, a published schema, even though the change is describe text with Clause-②: no. So landing also needs a same-shape ## Contract review PASS on this head, served at CONTRACT_REVIEW_TIER (contract-review.md). needs:contract-review is added in this stroke. The review runs as an isolated at-tier subagent when one of this seat's 3 batch slots frees. Ready and auto-merge follow only after that PASS and all checks green on the then-current head. My record omitted this; the rest of 6382491996 stands.


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 0ed74f8840010e01c98092eb792a7dbd51208b51
Local-runs: none
Scope: packages/spec/src/ui/component.zod.ts + content/docs/references/ui/component.mdx, .changeset/25511-hide-empty-describe.md, sdui.manifest.json (read, unchanged), objectui packages/plugin-detail/src/DetailSection.tsx and objectui packages/i18n/src/locales/en.ts (read at objectui origin/main 7981384, the tree the PR cites as 7981384)

Inputs read: card #25511 (body and all three comments), ruling C on objectstack-ai/objectui#13386 (body, ruling comment 6369306878, triage comment 6370301339), PR #25612 body and file list, the net diff of merge-base e649c2d to the head (three files, +30/-2), and the 47 check-runs on the head: 37 success, 10 skipped (opt-in harnesses, the filtered dogfood/pin/temporal jobs), 0 failed, no legacy commit statuses. The dispatching seat's PR comment was not read before this verdict was formed.

① Derived judgments

  • Accept set: unchanged — right. hideEmpty stays z.boolean().optional() with no schema default; no refinement, key, shape or export moves. check:api-surface (public API surface unchanged) and check:authorable-surface are green on the head; json-schema.manifest/ui.json lists schema ids and authorable-surface*.json lists keys, neither carries describe text, both correctly untouched.
  • The one public surface that moves is the describe() string, which the shipped JSON Schema description and the reference doc read. Read against ruling C (objectui#13386, comment 6369306878): default unchanged (on, an all-empty section renders nothing); false in read-only mode renders the heading plus one fold row that counts the empty fields and reveals them on request, the mixed-section fold; false in edit mode renders every row editable; no new key. The new text states all four and nothing more — right. The card's done-when (what false renders in read-only AND edit mode) is met on the one producer the card named; no other producer of the old phrase exists outside the generated mdx, a test comment and the release-owned CHANGELOG.
  • Lead change, "Whether this section disappears when ALL its fields are empty" — right, verified on the renderer. objectui DetailSection.tsx at origin/main 7981384 reads the key once: hideAllEmptySection = section.hideEmpty === true && allFieldsEmpty && !isEditing. The partly-filled auto-hide (shouldAutoHideEmpty, requires filledCount above zero) and its toggle are not overridden by the key in either polarity, as the renderer's own comment (objectui#7129 Q2-C) and sdui.manifest.json already tell authors. The key governs the all-empty case only, so the old lead "Hide this section's empty fields" was the inaccurate one and the new lead is the narrower, true claim.
  • "the same fold a partly-filled section uses" — right. The renderer's existing control is the detail.showEmptyFields / detail.hideEmptyFields toggle (en: "Show COUNT empty fields" with the count hole, and "Hide empty fields"). The text describes that row by function and quotes no label. The card's parenthetical "N empty fields · Show" is the card's gloss of the ruling's 「N 个空字段 · 展开」, not an objectui string; pinning either into the spec would claim a label the spec does not own and the renderer does not print. Wording call 1 stands.
  • "in edit mode it renders every field as an editable row" — right. Both hide branches in the renderer carry !isEditing.
  • Docblock paragraph — right. Records the ruling and the all-empty-only domain above the key; not author-facing, so the tracker citations are in the same register as the surrounding docblock; check:doc-authoring is clean on the describe strings.
  • Generated artefacts — right. content/docs/references/ui/component.mdx row regenerated and byte-equal to the describe string; check:docs and check:generated are green (Lint & Repo Gates, TypeScript Type Check). sdui.manifest.json still carries objectui's "label skeleton" sentence for hideEmpty: false and is right to leave untouched: it is regenerated from objectui's built tree at the .objectui-sha pin (2958f17), it is objectui-owned text, and it moves when objectui#13386 lands and the pin bumps.
  • Renderer lag — acceptable under the ruling. On this head the renderer still draws empty rows for a false all-empty section in read-only mode, so the describe text runs ahead of the renderer. The ruling ordered exactly this sequence (spec text first; objectui#13386 carries Blocked-by: this card and sits pm:blocked), so the text is the ruled contract, not an advertised capability nobody ordered. See ③.
  • Landing posture — right. Head repo equals base repo (not a fork); no governed path in the file list; the PR is draft and was never readied, queued or armed; the Governed Surface Queue Guard, the claim gates and Spec property liveness are green on the head.

② Semver level

  • .changeset/25511-hide-empty-describe.md: @objectstack/spec minor, with Clause-②: no and Metadata-protocol: semantic line-initial in the body; the PR body carries the same two lines. Check Changeset green.
  • Kind: semantic — right. The meaning of an authorable value (hideEmpty: false) changes; no key is added, removed or tombstoned, no value refused, no default moved. Level: minor — right. A kind other than none takes at least minor on a package the diff moves, and the diff moves @objectstack/spec. Not patch, and not skip-changeset (the diff publishes).
  • Clause-②: no, no arm — right. The accept set is unchanged, so neither (widening) nor (narrowing) applies; the changeset is non-breaking, no ADR-0087 marker is owed, and check-adr-0087-registration reads it as the one non-breaking changeset.
  • The changeset body states the author-facing consequence (authored metadata needs no change; a false section keeps its heading), which is what the CHANGELOG needs to say for a semantic change.

③ Boundary flags

  • open_questions: none declared; none found.
  • Flag: the renderer lags the text until objectui#13386 lands — answered, ordered by ruling. Comment 6369306878 on that card sequences spec text first and renderer second; comment 6370301339 records Blocked-by: objectstack-ai/objectstack#25511 and the unlock scan on this card's close. Nothing for this PR to do.
  • Flag: the default sentence says "renders nothing at all" with no mode qualifier, while the renderer renders every row in edit mode for the default too — answered, not a FAIL point. The wording pre-dates this PR (the old text said the same); the card ordered the default sentence kept as it is; the renderer's own comment documents !isEditing as a deliberate boundary ("what the contract governs is what a READER sees") and sdui.manifest.json already tells authors that inline-edit mode renders the section either way. It is not a metadata-authoring trap: the only metadata an author could write because of it is false, which keeps the heading and is harmless. If the lane seat wants the default sentence to carry the same mode split the false clause now carries, that is a follow-up describe-text card at p3, a doc nit; this read-only review files nothing.
  • Flag: the stale comment in packages/spec/src/ui/component.test.ts lines 635 to 638 ("the only spelling that keeps a section's label skeleton") — answered, not a blocker. It is a comment, no assertion reads it, and the file is outside the claim's declared surface, where the dev correctly stopped. A later spec touch or the objectui#13386 follow-up can reword it.
  • Dev-declared deviations: (a) the origin/main merge — the net diff against the merge-base is exactly the three files; (b) the unshallow on the shared clone and (c) the stray pid file at the filesystem root are outside the tree (the file list is three paths) and outside this review; (d) check:dual-build-cjs-loads NOT MEASURED locally is covered by Lint & Repo Gates success on the head, and check:dev-prereqs is local-only; (e) the attribution-trailer choice is not a contract matter; (f) test:repo not run locally is covered by Test Core success.
  • Wording calls 1 and 2 are judged right in ①.

Implemented-by: claude/issue-25511-hide-empty-describe
Reviewed-by: session_01PC4NPXPgPmpDRG9DdDnyXT

VERDICT: PASS

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 24, 2026 10:07
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 24, 2026 10:07
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 24, 2026
Merged via the queue into main with commit 2af790f Oct 24, 2026
51 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-25511-hide-empty-describe branch October 24, 2026 10:42
os-tesla pushed a commit that referenced this pull request Oct 25, 2026
…-empty body (objectui#13386) (#13483)

<!-- claude-projects-attribution: {"github_login":"os-elon-musk"} -->
_Requested by **Elon** · [project
thread](https://claude.ai/code/project/chan_01WedDzV26nniwxv7jC88B9D?thread=cmsg_01WedDzV26nniwxv7jC88B9D3jMyxwR7kHLu9j9TjYFimf)_

Fixes #13386
Fixes #12618

Seat: domain:ui#4 · card thread `session_01AqaieDWuDnBRyh3u8epGx6` ·
claim 6391455338
Ruling-ref: 6369306878 (batch #7 item 4, letter C)
Clause-②: no · Metadata-protocol: semantic (the spec side landed as
#25612)

## What changes

Ruling C: in read-only mode an all-empty section that the page keeps
draws its heading plus ONE "Show N empty fields" row, the same toggle a
partly-filled section uses, instead of one em-dash row per field. Edit
mode is unchanged, and a body whose sections are all empty folds once
more (item 2 of #12618).

| Where | Before | After |
|---|---|---|
| `DetailSection`, all-empty section kept (`hideEmpty: false`, or
omitted where no default resolves it), read-only | heading + one `No
value` row per field | heading + one "Show N empty fields" row; the
toggle reveals the rows and "Hide empty fields" folds them back |
| same, edit mode | every field an editable row | unchanged |
| same, print page | every row prints | unchanged: every row prints, no
toggle (#12717) |
| `hideEmpty: true` all-empty section | renders nothing | unchanged |
| partly-filled section | heuristic fold (#7129 Q2-C) | unchanged |
| detail body (`DetailView` sections) where every section is empty and
at least two are kept | one folded section after another | ONE "Show N
empty fields" row for the body (new `EmptySectionsFold`); revealing it
draws each section folded on its own |

No key, shape or default moved, and no new i18n key: both rows reuse
`detail.showEmptyFields` / `detail.hideEmptyFields`. The `hideEmpty`
descriptions in `@object-ui/types` (`DetailViewSection`,
`RecordDetailsSection`, the zod mirror) and the two
`@object-ui/plugin-detail` registration texts now say what a kept
section draws.

## Readings taken (for the seat's review)

1. **"Kept" includes an omitted key where no default resolves it.** The
ruling names `hideEmpty: false`. On `detail-view`, the `detail-section`
node and the `record:details` direct-`fields` fallback, omitted already
meant the same as `false` (keep), and their descriptions said so. The
fold keeps them equal, so the test is "kept" (`!hideAllEmptySection`),
not `=== false`. On `record:details` authored sections nothing changes
for an omitted key: it still resolves `?? true` and hides.
2. **Copy.** The ruling's 「N 个空字段 · 展开」 is described as "the same fold
the mixed sections use", so the row is that fold's existing copy: `Show
4 empty fields` (en), `显示 4 个空字段` (zh). No new string.
3. **Body fold threshold.** The body folds only when every section that
draws anything is all-empty AND at least two are kept: one kept section
is already one row, so folding it again would only drop its heading.
Section groups (`sectionGroups`) turn the body fold off, as they draw
fields of their own beside the sections. A malformed section (no field
array, or a read that throws) turns it off too, so each section still
renders or fails inside its own boundary (#8497).

## Tests

- New:
`packages/plugin-detail/src/__tests__/DetailSection.allEmptyFold-13386.test.tsx`
— the 「交易说明」 fixture: heading + one "Show 4 empty fields" row and no
em-dash; reveal and fold back; untitled section; `hideEmpty: true`
control; edit mode draws four textboxes and no fold; print page prints
four rows; mixed sections (small and large) unchanged; body fold counts
8 over three sections, reveals each section folded, folds back; controls
for a filled field anywhere, a single kept section, edit mode and print
page; `emptySectionsFoldCount` rules including malformed sections.
- Reverse check: with `DetailSection.tsx` at base, 6 of the new file's
cases go red (the edit-mode, print, mixed and count cases stay green, as
they pin unchanged behaviour).
- Updated pins that read an all-empty kept section's rows, now through
the fold: `record-details.hideEmptyRetired-7129` 4/4(b),
`record-details.emptySectionDefault` (`false` keeps; direct-`fields`
fallback), `detailSectionAuthoredHideEmpty-10485`, the AMPLIFICATION
cases of `DetailSection.emptyArray-8474` and
`DetailSection.emptinessAuthority-8376` (now: the fold counts all four
rows, so the empty value is not counted as filled),
`inlineCredentialGate` (`signature`'s empty sample reveals the fold
before reading the pencil),
`record-details.unresolvedIdentityFailClosed-9054` (the legacy
`fieldName` entry survives as "Show 1 empty field").

## Verification (local)

- `pnpm exec vitest run packages/plugin-detail/ packages/types/` — green
after the pin updates (the first full run surfaced the six pins above;
their files re-run green: 132 passed).
- `pnpm --filter @object-ui/plugin-detail type-check`, `pnpm --filter
@object-ui/types type-check` — clean.
- `pnpm --filter @object-ui/plugin-detail lint` — 0 errors.
- `check:new-line-citations` 0 new · `check:doc-json` ·
`check:doc-fences` · `check:control-bytes` · `check:i18n-keys` ·
`check-changeset-presence` — pass.
- `node scripts/check-governed-queue-guard.mjs --test <diff>` — NOT
GOVERNED.
- NOT MEASURED: `check:doc-snippets` / `check:doc-examples` (need the
whole build; CI runs them). NOT MEASURED: screenshots of the HotCRM
opportunity record at 1280 px (#12618 acceptance 2), reason: no HotCRM
console stack in this container; the 「交易说明」 case is pinned in the DOM
test above.

## Acceptance notes

- The `hideEmpty` describe text on the installed spec pin still carries
the pre-#25612 wording; the next pin move picks up the ruled text.
Nothing here reads that prose.

- [x] Adds no product-specific widget, dialog, hook or string (see
AGENTS.md › Product-neutral renderer)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_01AqaieDWuDnBRyh3u8epGx6

---------

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation protocol:ui size/s tooling

Projects

None yet

2 participants