Skip to content

Add a skill for declaring and sizing query-backed relationships - #123

Merged
habdelra merged 4 commits into
mainfrom
claude/query-backed-relationship-sizing
Sep 2, 2026
Merged

habdelra merged 4 commits into
mainfrom
claude/query-backed-relationship-sizing

Conversation

@habdelra

@habdelra habdelra commented Sep 1, 2026 •

Copy link
Copy Markdown
Contributor

⚠️ Do not merge until the API this documents has shipped. getRelationshipMembershipState returning isLoaded / totalMatchCount / isPartial, and the two server page ceilings (the mandatory-pagination default and the hard maximum an explicit page clamps to), do not exist in the host yet. A merge here syncs to the staging realm, so landing this early would tell authors to use an API that isn't there.

A query-backed linksTo / linksToMany reads like an ordinary relationship and holds a bounded page of its query. That is the one thing about it an author has to know, and nothing here said it.

The trap it leads with

// Reports 500 for a classroom with 600 activities. No error, no warning.
return this.everyActivity.length;

The fix isn't a bigger page — it's not holding rows at all. totalMatchCount comes from the search's own COUNT(*), which no page bounds:

let { totalMatchCount } = getRelationshipMembershipState(this, 'everyActivity');
// Returned as-is. `undefined` means the count is unknown — the field hasn't
// resolved, or a realm it targets failed and took its share of the count with
// it — and leaving the field empty says that. `?? 0` would render a confident
// nought over a set nobody counted.
return totalMatchCount;

Then: declaring a larger page when the rows are genuinely needed, why asking for the maximum isn't free (the page is a cost paid on every resolution of every instance, and each row's own query fields resolve in the next layer of the same pass), eager: false, the singular-linksTo arity, and a rule of thumb — a query-backed field is for a relationship the card reasons over; a search component is for a list it renders.

Three existing places described this surface and were wrong or incomplete

This is the part worth reviewing closely — the new file is additive, these are edits.

skills/bxl-authoring/SKILL.md §7 told authors to aggregate over query-backed inverses "for display and reporting" and warned only about staleness. Nothing about truncation — so COUNT([Claims[]]) over 600 claims silently reported 500. The bounded page now sits alongside the staleness bullets, with totalMatchCount / isPartial as the check before reducing, and checklist item 5 names it too.

skills/glossary.md and skills/boxel/references/relationship-loading-state.md both documented the status as { isLoading, membership }. Both now carry the full shape, including the trap that isLoaded means settled — which a truncated set also is — so isPartial is what licenses a reduction. The glossary also gains entries for totalMatchCount / isPartial and the page ceiling.

Encouragingly, boxel-patterns/patterns/show-count-tiles-from-query already got this right (results.meta.page.total, "not the entries"), so the correct instinct existed for the search-component surface and was missing only for query fields. No change needed there.

Repo conventions followed

  • boxel.kind: skill frontmatter, nested (the silent trap in boxel-skill-authoring).
  • Double-authoring handled the way Skill/source-code-editing.json does it — Skill/query-backed-relationships.json points instructionsSource at ../skills/query-backed-relationships/SKILL.md rather than duplicating the body, so one file serves both harnesses.
  • Catalog lines in index.md and skills/glossary.md (both the term entries and the skill registry).
  • Cross-skill links are relative (../bxl-authoring/SKILL.md), matching the existing files; no absolute realm URLs.

Generated by Claude Code

A query-backed `linksTo` / `linksToMany` reads like an ordinary
relationship and holds a bounded page of its query. That is the one thing
about it an author has to know, and nothing said it: counting
`field.length` over a match set larger than the page reports a
confidently wrong number, with no error and no warning in the card.

The new skill leads with that trap and its fix — read `totalMatchCount`,
which comes from the search's own count and no page bounds, so a
count-shaped rollup holds no rows at all. Then declaring a larger page
when the rows are genuinely needed, why asking for the maximum is not
free, `eager: false`, the singular-`linksTo` arity, and the rule of thumb
for when a field is the wrong tool and a search component is the right
one: a field is for a relationship the card reasons over, a component for
a list it renders.

Three existing places described this surface and are now consistent with
it:

`bxl-authoring` §7 told authors to aggregate over query-backed inverses
"for display and reporting" and warned only about staleness, so
`COUNT([Claims[]])` over 600 claims silently reported 500. It now carries
the bounded page alongside the staleness bullets, and its checklist item
names the same thing.

`glossary.md` and `boxel/references/relationship-loading-state.md` both
documented the relationship status as `{ isLoading, membership }`. Both
now carry the full shape, including that `isLoaded` means settled — which
a truncated set also is — so `isPartial` is what licenses a reduction.

Also registers the skill the way this repo requires: a `Skill/` card
whose `instructionsSource` points at the one SKILL.md rather than
duplicating the body, plus catalog lines in `index.md` and the glossary.
@github-actions

github-actions Bot commented Sep 1, 2026 •

Copy link
Copy Markdown

Staging Workspace Sync Successful

Successfully synced changes to staging workspace
Workspace: https://realms-staging.stack.cards/skills/
Commit: 7f4dd1d
Synced at: 2026-09-02 15:51:06 UTC

Sync Details

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

Checkpoint created: 1a6b96b [MAJOR] Push: 373 files (~373)
Push completed
Push completed successfully

@habdelra
habdelra requested review from a team and a lite review from Copilot September 1, 2026 15:43

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new Boxel authoring skill that documents the semantics and sizing tradeoffs of query-backed linksTo/linksToMany relationships (bounded pages, counting via totalMatchCount, and partial/truncation detection), and updates existing docs to reflect the expanded relationship-membership status shape.

Changes:

  • Introduces skills/query-backed-relationships/SKILL.md covering bounded pages, totalMatchCount/isPartial, page sizing, eager: false, and singular linksTo query semantics.
  • Updates glossary and BXL authoring guidance to explicitly warn about truncation and point to the new skill.
  • Expands getRelationshipMembershipState() documentation to include { isLoaded, totalMatchCount, isPartial }.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
skills/query-backed-relationships/SKILL.md New skill documenting query-backed relationship behavior, pitfalls, and sizing guidance.
skills/glossary.md Adds glossary entries for totalMatchCount/isPartial, page ceilings, and registers the new skill.
skills/bxl-authoring/SKILL.md Updates inverse-aggregation guidance to include bounded-page truncation and references the new skill.
skills/boxel/references/relationship-loading-state.md Updates the documented getRelationshipMembershipState() return shape and guidance.
Skill/query-backed-relationships.json Adds in-app SkillPlusMarkdown card pointing instructionsSource to the new SKILL.md.
index.md Adds the new skill to the top-level skill catalog list.
Suppressed comments (1)

skills/query-backed-relationships/SKILL.md:81

  • membership here reads like it contains card instances, but getRelationshipMembershipState()’s membership is a per-slot RelationshipState[] (per relationship-loading-state.md). Clarifying this avoids confusion between the relationship field value (this.everyActivity) vs the membership state object.
| `membership` | the rows the field is holding (`undefined` until resolved) |

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread skills/boxel/references/relationship-loading-state.md
Comment thread skills/query-backed-relationships/SKILL.md
Two things review caught, both mine.

The count example did `totalMatchCount ?? 0` while the same file warns,
twelve lines later, that an absent count means unknown and must not be
collapsed to zero. It now returns the value as authored — an empty field
says "no answer" where a nought claims one — and the "are there any?"
line says plainly that `?? 0` reads a genuine zero and an unknown alike,
so a caller who needs them apart branches on `undefined` first.

`skills/boxel/references/relationship-loading-state.md` gained the full
status shape but its `Skill/` twin still documented `{ isLoading,
membership }`. Nothing syncs those two trees, which is the invariant the
README calls out and which this change had already claimed to honor. The
twin now carries `isLoaded`, `totalMatchCount` and `isPartial`, and its
card summary says so rather than describing the spinner alone.

`bxl-authoring` needed no such treatment: its card points
`instructionsSource` at the shared `skills/` file, so one file already
serves both harnesses.

habdelra commented Sep 1, 2026

Copy link
Copy Markdown
Contributor Author

[Claude Code 🤖] Flagging the merge gate, since approval is the point where it's easiest to miss: the API this documents isn't on main yet. getRelationshipMembershipState doesn't return totalMatchCount or isPartial there, and neither server page ceiling exists.

Merging syncs to the staging realm, so landing it before then hands authors a skill telling them to call something that isn't there. Safe to merge once those land — checking getRelationshipMembershipState's return type on main is the whole test.


Generated by Claude Code

Four files describing relationship status were edited on both sides.

The substantive one: main documents `isLoaded` as "the one to gate on
before reading a rollup over the field and trusting the number", which is
the claim this branch exists to correct — a truncated set is settled too,
so `isLoaded` says membership is final, not that it is complete, and
`isPartial` is what licenses a reduction. The merged bullet keeps main's
descriptive wording and drops the guarantee, with `isPartial` documented
directly beneath it.

Two of main's corrections are taken as-is. The glossary's per-slot pointer
now names `getRelationshipMembershipState`, which is the function that
exists — `getRelationship` is not exported. And the observe-only section's
example becomes main's rewrite, where a count gated on `isLoaded` never
resolves the field it counts; the shared reference file already carries
that version, so the `Skill/` twin follows it rather than diverging.

The card summary covers both sides: `isLoading`, `isLoaded`, the
`totalMatchCount` / `isPartial` pair, and main's `eager` option.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CG5z1n3z6iy7Sr8Fv5XjBf
The status table described `membership` as "the rows the field is holding",
which reads as the linked cards. It is a `RelationshipState` per slot, so an
author following that description would map over it expecting instances and
find none of the fields they asked for.

The row now names the type, and a line beneath it points at the field getter
for the cards and at the defensive-traversal reference for the slot states.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CG5z1n3z6iy7Sr8Fv5XjBf
@habdelra
habdelra merged commit 7f4dd1d into main Sep 2, 2026
4 checks passed
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.

4 participants