Skip to content

Record boxel-ui component-selection and field-nesting rules#103

Draft
burieberry wants to merge 2 commits into
mainfrom
boxel-ui-component-variant-and-field-nesting-rules
Draft

Record boxel-ui component-selection and field-nesting rules#103
burieberry wants to merge 2 commits into
mainfrom
boxel-ui-component-variant-and-field-nesting-rules

Conversation

@burieberry

Copy link
Copy Markdown
Contributor

Five conventions learned while fixing the boxel.ai hero meta strip (CS-12316) — a spacing ticket that turned into a structural one. Each rule below is something the review of that change actually caught, not a hypothetical.

Authored into both trees per the double-authoring invariant in the README (skills/boxel-ui-guidelines/references/* and Skill/boxel-ui-guidelines.md), since nothing syncs them.

The rules

rule where
Don't neutralize a component — pick the variant use-boxel-ui-components.md
Button's real API: link kinds and @as were both undocumented use-boxel-ui-components.md
Primitive grays are illegible as text in dark mode use-boxel-design-tokens-for-theming.md
Collapse wrapper FieldDefs instead of :deep()-flattening them delegated-render-control.md
Override tokens in the container query, not the rules use-container-queries-not-viewport-units.md

Plus a typography note (take a whole semantic role group rather than assembling font-size + a hand-computed calc() line-height) and five checklist items.

Notes on two of them

The hrefless-anchor gotcha is written as a decision, not a rule. Button styles a.boxel-button:not([href]) as a disabled link — opacity: 0.5, disabled color, pointer-events: none — so @as='anchor' with a conditionally-empty @href produces a faded element whose state is never stated anywhere. The fade often looks like intentional de-emphasis, which is how it survives review. The guidance splits it into the two things it can mean: a link that genuinely exists but is unavailable (pass @disabled and aria-disabled, which Button's anchor branch does not set) versus an optional field where some items are plain labels (render a non-anchor element). They render nearly identically, so the only real difference is what the code claims is true.

The field-nesting rule sharpens existing guidance rather than adding to it. delegated-render-control.md already documents flattening host-generated plural-field wrappers with display: contents. What was missing is the check before reaching for it: if the wrapper is a FieldDef you own, delete it. Two tells that it isn't a real grouping level — a containsMany of wrappers each holding exactly one item, and writing a selector in the parent's <style scoped> that reaches a class defined in a child field's own template.

Also worth knowing

  • Button's documented @kind list was wrong by omission — it listed primary/secondary/muted/destructive/text-only but not link/link-primary/link-muted, which are exactly the variants you want for text that should read as a link rather than a control. That omission is arguably what caused the original code to reach for a Pill and strip it bare.
  • The Skill/ tree has no delegated-render coverage at all — no mention of plural-field, :deep(), or display: contents anywhere in it. The field-nesting rule went in there as a standalone section rather than a mirror. That gap is bigger than this PR and probably wants its own ticket.

Examples use meta-link / meta-strip naming rather than badge, matching what the code they came from ended up called. Pre-existing badge usages (fitted small-badge sizes, FittedCard's badgeLeft/badgeRow slots, Pill's own description) are untouched — those are real API surface.

Draft because these are conventions the team has to agree to, not just docs.

🤖 Drafted by Claude (Opus 5).

🤖 Generated with Claude Code

Five conventions, all found while fixing the boxel.ai hero meta strip
(CS-12316), where a spacing ticket turned into a structural one.

Authored into both trees per the double-authoring invariant in README:
skills/boxel-ui-guidelines/references/* and Skill/boxel-ui-guidelines.md.

- Don't neutralize a component, pick the variant. A <style scoped> block
  that zeroes a component's padding/background/border means the wrong
  component or variant was chosen. Includes the arg-portability warning
  (@as/@href are Button's; Pill uses @tag + ...attributes) and the
  hrefless-anchor-renders-as-disabled gotcha, split into the two cases
  it can mean (link genuinely unavailable -> @disabled + aria-disabled;
  optional field -> non-anchor element).
- Button's documented API was incomplete: the chromeless link kinds
  (link/link-primary/link-muted) and @as were both missing.
- Primitive grays as text color: concrete dark-mode failure mode, since
  a mid-gray reads as the safe neutral choice and isn't one.
- :deep()/display:contents are for host-generated DOM. A wrapper
  FieldDef you own gets deleted, not flattened. Two tells: a
  containsMany of wrappers each holding one item, and reaching across a
  scoped-style boundary into a child's own classes.
- Responsive values: reassign custom properties in the @container block
  instead of re-declaring the consuming rules per breakpoint.

Plus a typography note (take a whole semantic role group rather than
assembling font-size + a hand-computed calc() line-height) and five
checklist items.

Examples use meta-link / meta-strip naming rather than badge, matching
what the code they came from ended up called.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

Workspace Sync Dry-Run Complete

Dry-run completed successfully - no changes were made
Target workspace: https://realms-staging.stack.cards/skills/
PR: #103
Changes will be synced when this PR is merged to main

Dry-Run Results
Starting push from . to https://realms-staging.stack.cards/skills/
Testing realm access...
Realm access verified
Found 381 files in local directory
No sync manifest found, will upload all files
Uploading 381 file(s) via /_atomic...
[DRY RUN] Would upload Skill/boxel-design.json
[DRY RUN] Would upload Skill/boxel-design.md
[DRY RUN] Would upload Skill/boxel-development.json
[DRY RUN] Would upload Skill/boxel-environment.json
[DRY RUN] Would upload Skill/boxel-ui-guidelines.json
[DRY RUN] Would upload Skill/boxel-ui-guidelines.md
[DRY RUN] Would upload Skill/catalog-listing.json
[DRY RUN] Would upload Skill/catalog-listing.md
[DRY RUN] Would upload Skill/dev-bfm-syntax.json
[DRY RUN] Would upload Skill/dev-bfm-syntax.md
[DRY RUN] Would upload Skill/dev-command-development.json
[DRY RUN] Would upload Skill/dev-command-development.md
[DRY RUN] Would upload Skill/dev-core-concept.json
[DRY RUN] Would upload Skill/dev-core-concept.md
[DRY RUN] Would upload Skill/dev-core-patterns.json
[DRY RUN] Would upload Skill/dev-core-patterns.md
[DRY RUN] Would upload Skill/dev-data-management.json
[DRY RUN] Would upload Skill/dev-data-management.md
[DRY RUN] Would upload Skill/dev-defensive-link-traversal.json
[DRY RUN] Would upload Skill/dev-defensive-link-traversal.md
[DRY RUN] Would upload Skill/dev-defensive-programming.json
[DRY RUN] Would upload Skill/dev-defensive-programming.md
[DRY RUN] Would upload Skill/dev-delegated-rendering.json
[DRY RUN] Would upload Skill/dev-delegated-rendering.md
[DRY RUN] Would upload Skill/dev-enumerations.json
[DRY RUN] Would upload Skill/dev-enumerations.md
[DRY RUN] Would upload Skill/dev-external-libraries.json
[DRY RUN] Would upload Skill/dev-external-libraries.md
[DRY RUN] Would upload Skill/dev-file-def.json
[DRY RUN] Would upload Skill/dev-file-def.md
[DRY RUN] Would upload Skill/dev-file-editing.json
[DRY RUN] Would upload Skill/dev-file-editing.md
[DRY RUN] Would upload Skill/dev-fitted-formats.json
[DRY RUN] Would upload Skill/dev-fitted-formats.md
[DRY RUN] Would upload Skill/dev-markdown-format.json
[DRY RUN] Would upload Skill/dev-markdown-format.md
[DRY RUN] Would upload Skill/dev-query-systems.json
[DRY RUN] Would upload Skill/dev-query-systems.md
[DRY RUN] Would upload Skill/dev-quick-reference.json
[DRY RUN] Would upload Skill/dev-quick-reference.md
[DRY RUN] Would upload Skill/dev-relationship-loading-state.json
[DRY RUN] Would upload Skill/dev-relationship-loading-state.md
[DRY RUN] Would upload Skill/dev-replicate-ai.json
[DRY RUN] Would upload Skill/dev-replicate-ai.md
[DRY RUN] Would upload Skill/dev-searchable-fields.json
[DRY RUN] Would upload Skill/dev-searchable-fields.md
[DRY RUN] Would upload Skill/dev-spec-usage.json
[DRY RUN] Would upload Skill/dev-spec-usage.md
[DRY RUN] Would upload Skill/dev-styling-design.json
[DRY RUN] Would upload Skill/dev-styling-design.md
[DRY RUN] Would upload Skill/dev-technical-rules.json
[DRY RUN] Would upload Skill/dev-technical-rules.md
[DRY RUN] Would upload Skill/dev-template-patterns.json
[DRY RUN] Would upload Skill/dev-template-patterns.md
[DRY RUN] Would upload Skill/dev-theme-design-system.json
[DRY RUN] Would upload Skill/dev-theme-design-system.md
[DRY RUN] Would upload Skill/env-assistant-persona.json
[DRY RUN] Would upload Skill/env-assistant-persona.md
[DRY RUN] Would upload Skill/env-calling-commands.json
[DRY RUN] Would upload Skill/env-calling-commands.md
[DRY RUN] Would upload Skill/env-choosing-llm-models.json
[DRY RUN] Would upload Skill/env-choosing-llm-models.md
[DRY RUN] Would upload Skill/env-creating-and-editing-cards.json
[DRY RUN] Would upload Skill/env-creating-and-editing-cards.md
[DRY RUN] Would upload Skill/env-diagnosing-broken-links.json
[DRY RUN] Would upload Skill/env-diagnosing-broken-links.md
[DRY RUN] Would upload Skill/env-indexing-operations.json
[DRY RUN] Would upload Skill/env-indexing-operations.md
[DRY RUN] Would upload Skill/env-markdown-edit.json
[DRY RUN] Would upload Skill/env-markdown-edit.md
[DRY RUN] Would upload Skill/env-searching-and-querying.json
[DRY RUN] Would upload Skill/env-searching-and-querying.md
[DRY RUN] Would upload Skill/env-sim-boxel-environment-guide.json
[DRY RUN] Would upload Skill/env-sim-boxel-environment-guide.md
[DRY RUN] Would upload Skill/env-user-environment-awareness.json
[DRY RUN] Would upload Skill/env-user-environment-awareness.md
[DRY RUN] Would upload Skill/env-workflows-and-orchestration-patterns.json
[DRY RUN] Would upload Skill/env-workflows-and-orchestration-patterns.md
[DRY RUN] Would upload Skill/source-code-editing.json
[DRY RUN] Would upload commands/boxel-add-field.md
[DRY RUN] Would upload commands/boxel-add-file-field.md
[DRY RUN] Would upload commands/boxel-build-from-pattern.md
[DRY RUN] Would upload commands/boxel-create-card.md
[DRY RUN] Would upload commands/boxel-create-instance.md
[DRY RUN] Would upload commands/boxel-debug-runtime.md
[DRY RUN] Would upload commands/boxel-design-card.md
[DRY RUN] Would upload commands/boxel-develop-theme.md
[DRY RUN] Would upload commands/boxel-edit-template.md
[DRY RUN] Would upload commands/boxel-install-listing.md
[DRY RUN] Would upload commands/boxel-migrate-schema.md
[DRY RUN] Would upload commands/boxel-preview-card.md
[DRY RUN] Would upload commands/boxel-search-cards.md
[DRY RUN] Would upload commands/boxel-submit-listing.md
[DRY RUN] Would upload commands/boxel-sync-workspace.md
[DRY RUN] Would upload commands/distill-learnings.md
[DRY RUN] Would upload index.json
[DRY RUN] Would upload index.md
[DRY RUN] Would upload realm.json
[DRY RUN] Would upload skills/boxel/SKILL.md
[DRY RUN] Would upload skills/boxel/references/base-field-catalog.md
[DRY RUN] Would upload skills/boxel/references/card-references.md
[DRY RUN] Would upload skills/boxel/references/command-development.md
[DRY RUN] Would upload skills/boxel/references/command-invocation-modes.md
[DRY RUN] Would upload skills/boxel/references/common-imports.md
[DRY RUN] Would upload skills/boxel/references/container-query-fitted-layout.md
[DRY RUN] Would upload skills/boxel/references/core-concept.md
[DRY RUN] Would upload skills/boxel/references/core-patterns.md
[DRY RUN] Would upload skills/boxel/references/data-management.md
[DRY RUN] Would upload skills/boxel/references/date-math.md
[DRY RUN] Would upload skills/boxel/references/defensive-link-traversal.md
[DRY RUN] Would upload skills/boxel/references/defensive-programming.md
[DRY RUN] Would upload skills/boxel/references/delegated-rendering.md
[DRY RUN] Would upload skills/boxel/references/design-playbook.md
[DRY RUN] Would upload skills/boxel/references/enumerations.md
[DRY RUN] Would upload skills/boxel/references/external-libraries.md
[DRY RUN] Would upload skills/boxel/references/file-editing.md
[DRY RUN] Would upload skills/boxel/references/fitted-formats.md
[DRY RUN] Would upload skills/boxel/references/formatters.md
[DRY RUN] Would upload skills/boxel/references/icons.md
[DRY RUN] Would upload skills/boxel/references/imagedef.md
[DRY RUN] Would upload skills/boxel/references/lint-workflow.md
[DRY RUN] Would upload skills/boxel/references/prefers-wide-format.md
[DRY RUN] Would upload skills/boxel/references/query-systems.md
[DRY RUN] Would upload skills/boxel/references/quick-reference.md
[DRY RUN] Would upload skills/boxel/references/qunit-testing.md
[DRY RUN] Would upload skills/boxel/references/relationship-loading-state.md
[DRY RUN] Would upload skills/boxel/references/searchable-fields.md
[DRY RUN] Would upload skills/boxel/references/spec-usage.md
[DRY RUN] Would upload skills/boxel/references/styling-design.md
[DRY RUN] Would upload skills/boxel/references/template-syntax.md
[DRY RUN] Would upload skills/boxel/references/theme-design-system.md
[DRY RUN] Would upload skills/boxel/scripts/instance-correctness-scan.py
[DRY RUN] Would upload skills/boxel-create-edit-cards/SKILL.md
[DRY RUN] Would upload skills/boxel-design/SKILL.md
[DRY RUN] Would upload skills/boxel-design/references/asset-selection-guidelines.md
[DRY RUN] Would upload skills/boxel-design/references/critical-rules.md
[DRY RUN] Would upload skills/boxel-environment/SKILL.md
[DRY RUN] Would upload skills/boxel-environment/references/assistant-persona.md
[DRY RUN] Would upload skills/boxel-environment/references/calling-commands.md
[DRY RUN] Would upload skills/boxel-environment/references/card-tool-selection.md
[DRY RUN] Would upload skills/boxel-environment/references/choosing-llm-models.md
[DRY RUN] Would upload skills/boxel-environment/references/common-errors.md
[DRY RUN] Would upload skills/boxel-environment/references/diagnosing-broken-links.md
[DRY RUN] Would upload skills/boxel-environment/references/fresh-realm-push-integrity.md
[DRY RUN] Would upload skills/boxel-environment/references/host-commands-reference.md
[DRY RUN] Would upload skills/boxel-environment/references/indexing-operations.md
[DRY RUN] Would upload skills/boxel-environment/references/markdown-edit.md
[DRY RUN] Would upload skills/boxel-environment/references/searching-and-querying.md
[DRY RUN] Would upload skills/boxel-environment/references/source-code-editing.md
[DRY RUN] Would upload skills/boxel-environment/references/user-environment-awareness.md
[DRY RUN] Would upload skills/boxel-environment/references/workflows-and-orchestration.md
[DRY RUN] Would upload skills/boxel-file-def/SKILL.md
[DRY RUN] Would upload skills/boxel-file-def/references/available-fields.md
[DRY RUN] Would upload skills/boxel-file-def/references/filedef-first-class-file-support.md
[DRY RUN] Would upload skills/boxel-file-def/references/filedef-vs-base64imagefield.md
[DRY RUN] Would upload skills/boxel-file-def/references/import-paths.md
[DRY RUN] Would upload skills/boxel-file-def/references/markdowndef-vs-markdownfield.md
[DRY RUN] Would upload skills/boxel-file-def/references/no-inline-binary.md
[DRY RUN] Would upload skills/boxel-file-def/references/rendering-file-fields-in-templates.md
[DRY RUN] Would upload skills/boxel-file-def/references/type-hierarchy.md
[DRY RUN] Would upload skills/boxel-file-def/references/using-filedef-in-cards.md
[DRY RUN] Would upload skills/boxel-flavored-markdown/SKILL.md
[DRY RUN] Would upload skills/boxel-flavored-markdown/references/authoring-notes.md
[DRY RUN] Would upload skills/boxel-flavored-markdown/references/base-syntax.md
[DRY RUN] Would upload skills/boxel-flavored-markdown/references/bfm-extensions-beyond-commonmarkgfm.md
[DRY RUN] Would upload skills/boxel-flavored-markdown/references/card-directives-the-boxel-extension.md
[DRY RUN] Would upload skills/boxel-flavored-markdown/references/quick-reference.md
[DRY RUN] Would upload skills/boxel-flavored-markdown/references/where-bfm-is-used.md
[DRY RUN] Would upload skills/boxel-markdown-format/SKILL.md
[DRY RUN] Would upload skills/boxel-markdown-format/references/delegation-composes.md
[DRY RUN] Would upload skills/boxel-markdown-format/references/essential-helper-markdownescape.md
[DRY RUN] Would upload skills/boxel-markdown-format/references/pitfalls.md
[DRY RUN] Would upload skills/boxel-markdown-format/references/rendering-markdown-html-at-runtime.md
[DRY RUN] Would upload skills/boxel-markdown-format/references/shape-of-a-static-markdown-template.md
[DRY RUN] Would upload skills/boxel-markdown-format/references/the-default-usually-good-enough.md
[DRY RUN] Would upload skills/boxel-markdown-format/references/the-markdown-helpers-toolkit.md
[DRY RUN] Would upload skills/boxel-markdown-format/references/when-youre-done.md
[DRY RUN] Would upload skills/boxel-markdown-format/references/worked-example-note-card-with-custom-markdown.md
[DRY RUN] Would upload skills/boxel-patterns/SKILL.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/app-card-home-with-search/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/attach-remote-image/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/automate-image-steering/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/automate-image-steering/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/automate-linked-to-me-lookup/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/automate-linked-to-me-lookup/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/automate-run-command-cli/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/automate-run-command-cli/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/build-planning-cards-trio/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/build-site-config-with-theme/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/build-site-config-with-theme/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/cardinfo-override-title/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/cardinfo-override-title/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/command-atomic-install/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/command-atomic-install/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/command-data-resource/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/command-data-resource/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/command-optimistic-pipeline/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/command-optimistic-pipeline/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/command-typed-with-progress/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/command-typed-with-progress/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/command-with-skill-card-ref/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/command-with-skill-card-ref/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/containsmany-sorted-render/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/containsmany-sorted-render/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/format-morph-shared-component/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/integrate-chess-js-via-cdn/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/integrate-chess-js-via-cdn/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/integrate-filedef-generated-image/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/integrate-filedef-generated-image/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/integrate-leaflet-via-cdn/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/integrate-leaflet-via-cdn/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/integrate-one-shot-llm/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/integrate-one-shot-llm/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/integrate-openrouter-image-generation/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/integrate-openrouter-image-generation/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/integrate-screenshot-card-format/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/integrate-screenshot-card-format/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/integrate-send-request-via-proxy/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/integrate-send-request-via-proxy/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/integrate-three-js-3mf-fabrication/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/integrate-three-js-3mf-fabrication/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/integrate-three-js-via-cdn/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/integrate-three-js-via-cdn/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/integrate-thumbnail-card-ai/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/integrate-thumbnail-card-ai/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/integrate-tone-js-via-cdn/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/integrate-tone-js-via-cdn/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/integrate-web-audio-synthesis/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/integrate-web-audio-synthesis/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/layout-3d-card-carousel/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/layout-3d-card-carousel/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/layout-design-board/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/layout-design-board/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/layout-kanban-drag-drop/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/layout-kanban-drag-drop/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/layout-sectioned-record-with-nav/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/layout-sectioned-record-with-nav/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/link-command-menu-item/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/link-command-menu-item/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/link-discriminated-action-resolver/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/link-discriminated-action-resolver/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/link-element-tag-helper/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/link-element-tag-helper/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/link-flip-card/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/link-flip-card/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/link-host-mode-paths/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/link-host-mode-paths/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/link-onclick-outside/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/link-onclick-outside/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/link-view-transition/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/link-view-transition/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/organize-atomic-field-factory/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/organize-atomic-field-factory/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/organize-base-class-taxonomy/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/organize-base-class-taxonomy/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/organize-lru-cached-parser/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/organize-lru-cached-parser/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/organize-recursive-fielddef/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/organize-recursive-fielddef/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/organize-resource-class-data-loader/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/organize-resource-class-data-loader/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/organize-sensitive-stub-pair/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/organize-sensitive-stub-pair/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/organize-typed-activity-feed/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/organize-typed-activity-feed/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/organize-variant-field-dispatcher/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/organize-variant-field-dispatcher/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/pick-rating/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/pick-rating/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/pick-typed-sort/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/pick-typed-sort/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/polymorphic-field-subclass/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/resource-for-state/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/show-card-list-with-views/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/show-card-list-with-views/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/show-count-tiles-from-query/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/show-count-tiles-from-query/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/show-filedef-audio-player/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/show-filedef-audio-player/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/show-list-prefer-prerendered/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/show-list-prefer-prerendered/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/show-pdf-annotations-filedef/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/show-pdf-annotations-filedef/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/show-runtime-markdown-html/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/show-runtime-markdown-html/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/show-table-from-query/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/show-table-from-query/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/show-wiki-links/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/show-wiki-links/example.gts
[DRY RUN] Would upload skills/boxel-patterns/patterns/theme-first-workflow/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/theme-first-workflow/example.gts
[DRY RUN] Would upload skills/boxel-patterns/references/ai-image-models.md
[DRY RUN] Would upload skills/boxel-patterns/references/integration-surfaces.md
[DRY RUN] Would upload skills/boxel-patterns/references/libraries.md
[DRY RUN] Would upload skills/boxel-patterns/references/pattern-authoring.md
[DRY RUN] Would upload skills/boxel-patterns/references/pattern-backlog.md
[DRY RUN] Would upload skills/boxel-patterns/scripts/audit-host-command-refs.mjs
[DRY RUN] Would upload skills/boxel-skill-authoring/SKILL.md
[DRY RUN] Would upload skills/boxel-theme-development/SKILL.md
[DRY RUN] Would upload skills/boxel-theme-development/references/design-md-adapter.md
[DRY RUN] Would upload skills/boxel-theme-development/references/shadcn-boxel-token-mapping.md
[DRY RUN] Would upload skills/boxel-ui-component-discovery/SKILL.md
[DRY RUN] Would upload skills/boxel-ui-guidelines/SKILL.md
[DRY RUN] Would upload skills/boxel-ui-guidelines/references/checklist.md
[DRY RUN] Would upload skills/boxel-ui-guidelines/references/delegated-render-control.md
[DRY RUN] Would upload skills/boxel-ui-guidelines/references/field-rendering-fields-vs-model.md
[DRY RUN] Would upload skills/boxel-ui-guidelines/references/font-loading-theme-card-owns-imports.md
[DRY RUN] Would upload skills/boxel-ui-guidelines/references/prefer-component-apis-write-new-components-when-needed.md
[DRY RUN] Would upload skills/boxel-ui-guidelines/references/prevent-content-overflow.md
[DRY RUN] Would upload skills/boxel-ui-guidelines/references/print-and-published-output.md
[DRY RUN] Would upload skills/boxel-ui-guidelines/references/style-budget.md
[DRY RUN] Would upload skills/boxel-ui-guidelines/references/template-patterns.md
[DRY RUN] Would upload skills/boxel-ui-guidelines/references/use-boxel-design-tokens-for-theming.md
[DRY RUN] Would upload skills/boxel-ui-guidelines/references/use-boxel-ui-components.md
[DRY RUN] Would upload skills/boxel-ui-guidelines/references/use-container-queries-not-viewport-units.md
[DRY RUN] Would upload skills/boxel-workspace-cardinal-rules/SKILL.md
[DRY RUN] Would upload skills/catalog-listing/SKILL.md
[DRY RUN] Would upload skills/catalog-listing/references/submission-workflow.md
[DRY RUN] Would upload skills/ember-best-practices/README.md
[DRY RUN] Would upload skills/ember-best-practices/SKILL.md
[DRY RUN] Would upload skills/ember-best-practices/rules/a11y-automated-testing.md
[DRY RUN] Would upload skills/ember-best-practices/rules/a11y-form-labels.md
[DRY RUN] Would upload skills/ember-best-practices/rules/a11y-keyboard-navigation.md
[DRY RUN] Would upload skills/ember-best-practices/rules/a11y-route-announcements.md
[DRY RUN] Would upload skills/ember-best-practices/rules/a11y-semantic-html.md
[DRY RUN] Would upload skills/ember-best-practices/rules/advanced-concurrency.md
[DRY RUN] Would upload skills/ember-best-practices/rules/advanced-data-loading-with-ember-concurrency.md
[DRY RUN] Would upload skills/ember-best-practices/rules/advanced-helpers.md
[DRY RUN] Would upload skills/ember-best-practices/rules/advanced-modifiers.md
[DRY RUN] Would upload skills/ember-best-practices/rules/advanced-tracked-built-ins.md
[DRY RUN] Would upload skills/ember-best-practices/rules/bundle-direct-imports.md
[DRY RUN] Would upload skills/ember-best-practices/rules/bundle-embroider-static.md
[DRY RUN] Would upload skills/ember-best-practices/rules/bundle-lazy-dependencies.md
[DRY RUN] Would upload skills/ember-best-practices/rules/component-args-validation.md
[DRY RUN] Would upload skills/ember-best-practices/rules/component-avoid-classes-in-examples.md
[DRY RUN] Would upload skills/ember-best-practices/rules/component-avoid-constructors.md
[DRY RUN] Would upload skills/ember-best-practices/rules/component-avoid-lifecycle-hooks.md
[DRY RUN] Would upload skills/ember-best-practices/rules/component-cached-getters.md
[DRY RUN] Would upload skills/ember-best-practices/rules/component-class-fields.md
[DRY RUN] Would upload skills/ember-best-practices/rules/component-composition-patterns.md
[DRY RUN] Would upload skills/ember-best-practices/rules/component-controlled-forms.md
[DRY RUN] Would upload skills/ember-best-practices/rules/component-file-conventions.md
[DRY RUN] Would upload skills/ember-best-practices/rules/component-memory-leaks.md
[DRY RUN] Would upload skills/ember-best-practices/rules/component-minimal-tracking.md
[DRY RUN] Would upload skills/ember-best-practices/rules/component-on-modifier.md
[DRY RUN] Would upload skills/ember-best-practices/rules/component-reactive-chains.md
[DRY RUN] Would upload skills/ember-best-practices/rules/component-strict-mode.md
[DRY RUN] Would upload skills/ember-best-practices/rules/component-tracked-toolbox.md
[DRY RUN] Would upload skills/ember-best-practices/rules/component-use-glimmer.md
[DRY RUN] Would upload skills/ember-best-practices/rules/exports-named-with-default-fallback.md
[DRY RUN] Would upload skills/ember-best-practices/rules/helper-builtin-functions.md
[DRY RUN] Would upload skills/ember-best-practices/rules/helper-composition.md
[DRY RUN] Would upload skills/ember-best-practices/rules/helper-plain-functions.md
[DRY RUN] Would upload skills/ember-best-practices/rules/performance-on-modifier-vs-handlers.md
[DRY RUN] Would upload skills/ember-best-practices/rules/route-lazy-routes.md
[DRY RUN] Would upload skills/ember-best-practices/rules/route-loading-substates.md
[DRY RUN] Would upload skills/ember-best-practices/rules/route-model-caching.md
[DRY RUN] Would upload skills/ember-best-practices/rules/route-parallel-model.md
[DRY RUN] Would upload skills/ember-best-practices/rules/route-templates.md
[DRY RUN] Would upload skills/ember-best-practices/rules/service-cache-responses.md
[DRY RUN] Would upload skills/ember-best-practices/rules/service-data-requesting.md
[DRY RUN] Would upload skills/ember-best-practices/rules/service-ember-data-optimization.md
[DRY RUN] Would upload skills/ember-best-practices/rules/service-owner-linkage.md
[DRY RUN] Would upload skills/ember-best-practices/rules/service-shared-state.md
[DRY RUN] Would upload skills/ember-best-practices/rules/template-avoid-computation.md
[DRY RUN] Would upload skills/ember-best-practices/rules/template-conditional-rendering.md
[DRY RUN] Would upload skills/ember-best-practices/rules/template-each-key.md
[DRY RUN] Would upload skills/ember-best-practices/rules/template-fn-helper.md
[DRY RUN] Would upload skills/ember-best-practices/rules/template-helper-imports.md
[DRY RUN] Would upload skills/ember-best-practices/rules/template-let-helper.md
[DRY RUN] Would upload skills/ember-best-practices/rules/template-only-component-functions.md
[DRY RUN] Would upload skills/ember-best-practices/rules/testing-library-dom-abstraction.md
[DRY RUN] Would upload skills/ember-best-practices/rules/testing-modern-patterns.md
[DRY RUN] Would upload skills/ember-best-practices/rules/testing-msw-setup.md
[DRY RUN] Would upload skills/ember-best-practices/rules/testing-no-raf-for-state.md
[DRY RUN] Would upload skills/ember-best-practices/rules/testing-qunit-dom-assertions.md
[DRY RUN] Would upload skills/ember-best-practices/rules/testing-render-patterns.md
[DRY RUN] Would upload skills/ember-best-practices/rules/testing-test-waiters.md
[DRY RUN] Would upload skills/ember-best-practices/rules/vscode-setup-recommended.md
[DRY RUN] Would upload skills/glossary.md
[DRY RUN] Would upload skills/source-code-editing/SKILL.md
Skipping 2 realm-managed remote artifact(s): index.json, realm.json
Push completed
Push completed successfully

The gotcha was written around boxel-ui's current internals — "Button
sets no aria-disabled, add it yourself", "@disabled on an anchor is
identical DOM". CS-12305 will falsify all of that, and the worst of it
is the instruction: it would keep teaching a workaround for a fixed bug.

Restructured so the durable part leads and the perishable part is
fenced:

- The rule is now "an optional @href is a decision, not a detail" —
  Case 1 (link exists, unavailable) vs Case 2 (optional field, plain
  label), decided by what the data model intends. That holds at any
  boxel-ui version.
- The mechanism moved into a dated, ticket-linked version note that
  tells the reader to delete it, and itself, once CS-12305 lands.
- Added why this matters more after the fix, not less: today a Case 2
  item written as Case 1 is silent to assistive tech; afterwards it
  actively announces a plain label as an unavailable link.
- Checklist item reworded off the current behaviour too.

CS-12305 now lists the three files to clean up when that bullet ships,
so the note can't rot unnoticed.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant