Skip to content

linksTo never in attributes - #112

Merged
jurgenwerk merged 2 commits into
mainfrom
add-instance-link-and-base-import-cardinal-rules
Aug 13, 2026
Merged

linksTo never in attributes#112
jurgenwerk merged 2 commits into
mainfrom
add-instance-link-and-base-import-cardinal-rules

Conversation

@jurgenwerk

@jurgenwerk jurgenwerk commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Teaches the assistant the linksTo-in-attributes trap: a linksTo field written into attributes (even as null) passes lint and writes successfully, then every read of the instance fails with cannot deserialize non-relationship value until the raw JSON is repaired by hand.

The rule lands everywhere the other silent-failure traps already live: Cardinal Rule 14 in skills/boxel/SKILL.md, a mirror bullet in index.md (in every prompt), a glossary bullet, and item 10 in the boxel-workspace-cardinal-rules pre-finish checklist.

Rule 14 — a linksTo field never appears in attributes, not even as
null. Models writing card instances put a bare "theme": null inside
attributes.cardInfo; that passes lint and writes successfully, and then
every read of the instance throws "linkTo field 'theme' cannot
deserialize non-relationship value null" until the raw JSON is repaired
by hand. Rules 12 and 13 cover what goes inside links.self and the
linksToMany shape; nothing said a linksTo may not sit in attributes at
all.

Rule 15 — base modules import by URL, never by package name. Models
write the npm-style import "@cardstack/base/card-api" where a realm
requires "https://cardstack.com/base/card-api"; the module never
resolves and the file bounces back for a repair turn. The skill page
never showed a correct base import, so a model that skips the
common-imports reference had nothing to overrule its prior.

Both rules are mirrored in the index conventions and the glossary like
their siblings, and common-imports.md now opens with the trap before
the preflight.

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

github-actions Bot commented Aug 12, 2026

Copy link
Copy Markdown

Staging Workspace Sync Successful

Successfully synced changes to staging workspace
Workspace: https://realms-staging.stack.cards/skills/
Commit: 76dcf28
Synced at: 2026-08-13 08:08:35 UTC

Sync Details

Starting push from . to https://realms-staging.stack.cards/skills/
Testing realm access...
Realm access verified
Found 367 files in local directory
No sync manifest found, will upload all files
Uploading 367 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/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/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/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/source-code-editing/SKILL.md
Skipping 2 realm-managed remote artifact(s): index.json, realm.json

Checkpoint created: 675a29d [MAJOR] Push: 367 files (~367)
Push completed
Push completed successfully

@jurgenwerk
jurgenwerk marked this pull request as ready for review August 12, 2026 11:08
@jurgenwerk jurgenwerk changed the title Add cardinal rules: linksTo never in attributes; base modules import by URL linksTo never in attributes; base modules import by URL Aug 12, 2026
@jurgenwerk
jurgenwerk requested a review from a team August 12, 2026 11:09

@habdelra habdelra 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.

Docs-only change adding Cardinal Rules 14 (linksTo never in attributes) and 15 (base modules import by URL). The good news first: rule numbering is clean (1–15, no collisions), the cardInfo.theme dotted-key shape matches the rest of the repo, the base module names are all correct, and glossary.md was updated per the maintenance rule.

Two inline comments above. The important one is on common-imports.md — Rule 15's absolute "@cardstack/base/... never resolves / @cardstack/* only correct for three packages" contradicts existing docs that use @cardstack/base/workspace as a valid adoptsFrom. It's the only finding here that could induce a wrong edit (a model "fixing" a correct workspace reference); everything else is a propagation/consistency gap.

Two more findings that don't map to a changed line, so they're here rather than inline:

  • Rule 14 isn't added to the boxel-workspace-cardinal-rules checklist. index.md points authors to that skill as the pre-finish silent-failure gate ("check every card/field against it before finishing"), and its list stops at item 9. The linksTo-in-attributes trap (writes fine, throws on every read) is exactly the class it catalogs — an author who runs the checklist gets a false all-clear on the very bug this PR targets. Worth adding it there.

  • Rules 14/15 landed only in the skills/ tree, not the parallel Skill/ tree. The maintainer note in index.md/CLAUDE.md says a convention change must be authored into both trees or they drift, so the in-app assistant that consumes Skill/ cards won't learn these rules. (Rules 12/13 are already absent from Skill/, so this continues an existing drift rather than starting it — same gap, worth closing.)

Net: solid, useful additions. The @cardstack/base over-broad phrasing is the one thing I'd fix before merge; the rest are follow-ups.


Generated by Claude Code


## The `@cardstack/base` trap

Base card modules resolve by URL, not by package name. `import StringField from '@cardstack/base/string'` looks like every other npm import and is always wrong in a realm — the module never resolves, the card fails to load, and the correctness check bounces the file back for a repair turn. Everything under the base realm imports as `https://cardstack.com/base/<module>`: `card-api`, `string`, `number`, `boolean`, `date`, `datetime`, `text-area`, `url`, `markdown`, and the rest. The `@cardstack/*` scope is only correct for the packages listed in this file: `@cardstack/boxel-ui/*`, `@cardstack/boxel-icons/*`, `@cardstack/runtime-common`.

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.

This is correct for base module imports in .gts (card-api, string, etc.) — @cardstack/base/string genuinely won't resolve there. But the absolute framing ("The @cardstack/* scope is only correct for @cardstack/boxel-ui/*, @cardstack/boxel-icons/*, @cardstack/runtime-common") is too broad and collides with the repo's own docs: @cardstack/base/... does resolve as a registered VirtualNetwork prefix, and @cardstack/base/workspace is documented as a valid adoptsFrom:

  • skills/boxel/references/card-references.md:90 — "@cardstack/base/... can resolve through prefix mappings"
  • skills/boxel/references/default-index-card.md:3,63 — set adoptsFrom to Workspace / @cardstack/base/workspace
  • skills/glossary.md:26 and Skill/dev-core-concept.md:22 — same

Suggest scoping the rule to base field / card-api module imports rather than the whole @cardstack/base namespace, so a model doesn't "fix" a correct @cardstack/base/workspace adoptsFrom and break the default index card. The same absolute wording was added to the sibling copies here too — skills/boxel/SKILL.md Rule 15, index.md Rule 15, and skills/glossary.md — worth adjusting all four together.


Generated by Claude Code

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

(Written by Claude on Matic's behalf.)

Removed the rule entirely rather than scoping it — #113 establishes the @cardstack/base/... prefix as canonical (it resolves for module imports too, e.g. tracked experiments-realm cards import @cardstack/base/card-api), so any form of this rule points the wrong way.

Comment thread skills/boxel/SKILL.md Outdated
| 11 | **`DateField` vs `DateTimeField` — schema MUST match value format.** `contains(DateField)` requires JSON value `YYYY-MM-DD` (NO `T`). `contains(DateTimeField)` requires ISO datetime with `T` (`YYYY-MM-DDTHH:MM:SS[.sss]Z`). A mismatch passes `npx boxel file lint`, writes successfully, AND indexes — then blows up at render time as `RangeError: Invalid time value` from date-fns inside `Contains.serialize`. Pick the type by whether time-of-day is meaningful (`*At` suffix → DateTimeField; `*Date`/`*On`/`hireDate`/`dob` → DateField), then keep instance values in lockstep. See `references/base-field-catalog.md`. |
| 12 | **🚨 External URLs in JSON:API `relationships.<field>.links.self` brick the entire realm.** A relationship's `links.self` is a card identifier — relative paths (`"../Theme/foo"`) or absolute realm URLs only. **NEVER put an external image/asset URL there.** The indexer fetches the URL expecting a card document, gets binary bytes (JPEG, PNG, etc.), `JSON.parse` throws on the binary, the error message contains the binary's NULL byte, postgres rejects the JSONB write with `22P05: unsupported Unicode escape sequence`, and the transaction rolls back — taking every other card in the batch with it. The whole realm stays unindexed until the bad instance is fixed. For image URLs, use the `cardInfo` pair pattern: `@field heroImage = linksTo(ImageDef)` + `@field heroImageURL = contains(UrlField)`; the URL goes in `attributes.heroImageURL`, not the relationship. See `references/base-field-catalog.md` "Image fields — the URL/ImageDef pair pattern". |
| 13 | **🚨 `linksToMany` JSON shape uses INDEXED KEYS, never an array under `links.self`.** Each linked item in a `linksToMany` field gets its own top-level relationship key with an indexed suffix. Correct: `"activityFeed.0": { "links": { "self": "..." } }`, `"activityFeed.1": { "links": { "self": "..." } }`. WRONG (and the host rejects with "instance ... is not a card resource document"): `"activityFeed": { "links": { "self": ["...", "..."] } }`. The array-inside-`self` shape is intuitive but not valid Boxel JSON:API — `links.self` is a single string per JSON:API spec, and Boxel's encoding of "many" is indexed top-level keys. See `references/core-patterns.md` "JSON:API instance shapes". |
| 14 | **🚨 `linksTo` fields never appear in `attributes` — not even as `null`.** A `linksTo` field is serialized under `relationships`, keyed by its field path — for a linksTo nested inside a contained field, a dotted key: `"cardInfo.theme": { "links": { "self": "../Theme/foo" } }`. An empty link is `{ "links": { "self": null } }`, or omit the key entirely. Writing `"theme": null` (or any value) into `attributes` passes lint and writes successfully — then every read of the instance throws `linkTo field 'theme' cannot deserialize non-relationship value null` until the raw JSON is repaired by hand. |

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.

The example mixes nested and top-level shapes. The right-shape example uses the nested dotted key "cardInfo.theme", but the wrong-shape example is a top-level "theme": null and the error quotes linkTo field 'theme'. For a link nested inside cardInfo, the incorrect attributes shape a model actually emits is "cardInfo": { "theme": null }, not a top-level "theme". As written it's ambiguous whether the rule targets nested links or top-level ones — suggest making the wrong example "cardInfo": { "theme": null } to match, or use a single top-level linksTo field name throughout.

Minor: every other rule in this table (11–13, 15) ends with a See references/... pointer; Rule 14 doesn't. Not blocking (there's no reference doc for this trap today), just noting the inconsistency.


Generated by Claude Code

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

(Written by Claude on Matic's behalf.)

Fixed — the wrong-shape example is now "cardInfo": { "theme": null }, matching the nested dotted-key shape in the right-shape example.

…ecklist

The @cardstack/base/... prefix is a registered VirtualNetwork mapping and
is the canonical reference form, so the rule that banned it taught the
assistant to "repair" valid imports. The linksTo-in-attributes rule
stays: its wrong-shape example now uses the nested cardInfo shape, and
the trap is added to the boxel-workspace-cardinal-rules checklist.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@jurgenwerk

Copy link
Copy Markdown
Contributor Author

(Written by Claude on Matic's behalf.)

Review addressed: the base-import rule is removed from all four files (#113 is the source of truth — the @cardstack/base/... prefix is canonical and resolves), the linksTo rule's wrong-shape example now uses the nested cardInfo shape, and the trap is added to the boxel-workspace-cardinal-rules checklist as item 10. Skill/-tree propagation stays a follow-up since #113 rewrites that tree.

@jurgenwerk jurgenwerk changed the title linksTo never in attributes; base modules import by URL linksTo never in attributes Aug 13, 2026
@jurgenwerk
jurgenwerk merged commit 76dcf28 into main Aug 13, 2026
1 check 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.

2 participants