Skip to content

The design pipeline skills — interview, direct, author motion, review - #151

Draft
lucaslyl wants to merge 66 commits into
mainfrom
eco-579-domain-interview-skill
Draft

lucaslyl wants to merge 66 commits into
mainfrom
eco-579-domain-interview-skill

Conversation

@lucaslyl

@lucaslyl lucaslyl commented Sep 28, 2026 •

Copy link
Copy Markdown
Contributor

⚠️ Do not merge. This draft is for Chuan's testing. It carries the whole design pipeline in one branch so it can be tried end to end. When everything is ready, it will be split into small PRs from main, each reviewed on its own, and this one closed.

Split so far: domain-interview → #183 (merged, with #172's terminal path); sample images → #184 (draft). Still to come: the "Just build it" fast path, the boxel-design references, design-review, and motion.

Background and Goal

The design pipeline, from a vague request to a scored build. Four skills, one artifact: a catalog Brief at Brief/<slug>.json with one MarkdownField per stage, so a stage only ever replaces its own field. No stage writes a markdown file.

spec              ← domain-interview (the spec)
designDirection   ← design-direction
motion            ← motion-authoring, only when the direction asked for an arc
                  ← design-review reads the card and writes nothing

The definition is the catalog's Brief card — cardstack/boxel-catalog#771, adopted as @cardstack/catalog/cards/projects/brief. That PR has to merge before this one, or the alias resolves to nothing for anyone running the skill.

The stages

  • domain-interview (ECO-579) — interviews the user in rounds and writes spec: domain primer, schema, element coverage matrix from a real catalog-reuse search, per-screen content contracts, flows, sample data. Makes no design decisions.
  • design-direction (ECO-576) — decides how the unit looks before it is built and writes designDirection. Asks only the feeling and the style; decides layout itself with reasons recorded, and writes acceptance lines a reviewer can tick without taste.
  • motion-authoring — opt-in, only when the direction recorded an arc, a scrubbed subject or a library way. Writes motion: one motion system, the engine per beat, the load-bearing CSS, an exhaustive effect table, and the three capture points.
  • design-review — scores what was built, from captures only, against the card's acceptance lines and an aesthetic bar whose gate is 8.5. Three modes: one screen, set across an app, card across a CardDef's formats.

Each stage ends by offering the next as a structured choice and never starts it itself.

Key decisions

  • One field per stage, not one content blob. A stage patch-fields only its own field, after reading the card back so it has indexed; a change to one block inside a field is an apply-markdown-edit, never a resend of the whole field.
  • Style is decided up front; screens are not. The style block — font, palette, mood, signature treatment — is written in full before anything is built. Only the first screen gets a full layout/interaction/acceptance block; the rest are one-line stubs, written out just before each is built.
  • Single-surface vs multi-object, decided from the schema. A unit whose CardDefs are only ever read through one screen gets one screen — tabs and filters are Interaction-table rows — and skips the nav and set-acceptance machinery.
  • design-direction runs in four phases: inventory → first screen (layout + interaction) → style → write and hand off.
  • design-review writes nothing. The brief card records decisions, not scores.

Also brings the show-scroll-reveal-and-scrub pattern, which motion-authoring's engine rows start from rather than rewriting the observer.

Testing-only commit — to be split out

e965ea7 (Source sample images by scenario) is here for testing alongside the pipeline only and belongs in its own PR. It will be moved to a separate branch off main and dropped from this one before this PR merges. It covers: declaring generate-thumbnail and download-file-to-realm in host-commands-reference, the new boxel-file-def/references/sample-images.md, removing the dead stock/placeholder URLs from asset-selection-guidelines, and the ImageDef import fix in attach-remote-image. Please review it separately.

🤖 Generated with Claude Code

@github-actions

github-actions Bot commented Sep 28, 2026 •

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: #151
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 322 files in local directory
No sync manifest found, will upload all files
Uploading 322 file(s) via /_atomic...
[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/default-index-card.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-design/references/layout-gravity.md
[DRY RUN] Would upload skills/boxel-design/references/layout-vocabulary.md
[DRY RUN] Would upload skills/boxel-design/references/signature-treatments.md
[DRY RUN] Would upload skills/boxel-design/references/style-families.md
[DRY RUN] Would upload skills/boxel-design/references/untrusted-content.md
[DRY RUN] Would upload skills/boxel-design/scripts/check-palette.mjs
[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/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/shared-mirror-safety.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/sample-images.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-declared-captures/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/automate-declared-captures/example.gts
[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/collab-yjs-shared-document/README.md
[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-capture-card-format/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/integrate-capture-card-format/example.gts
[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-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-consume-from-context/README.md
[DRY RUN] Would upload skills/boxel-patterns/patterns/resource-consume-from-context/example.gts
[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/theme-token-contract.md
[DRY RUN] Would upload skills/boxel-ui-guidelines/references/ui-review-procedure.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/bxl-authoring/SKILL.md
[DRY RUN] Would upload skills/card-motion/SKILL.md
[DRY RUN] Would upload skills/card-motion/references/choreo.md
[DRY RUN] Would upload skills/card-motion/references/drag-and-reorder.md
[DRY RUN] Would upload skills/card-motion/references/element.md
[DRY RUN] Would upload skills/card-motion/references/layout.md
[DRY RUN] Would upload skills/card-motion/references/presence.md
[DRY RUN] Would upload skills/card-motion/references/scroll.md
[DRY RUN] Would upload skills/card-motion/references/testing.md
[DRY RUN] Would upload skills/card-motion/references/view-transitions.md
[DRY RUN] Would upload skills/card-operations-authoring/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/catalog-reuse/SKILL.md
[DRY RUN] Would upload skills/design-review/SKILL.md
[DRY RUN] Would upload skills/design-review/references/benchmark-and-refine.md
[DRY RUN] Would upload skills/design-review/references/build-check.md
[DRY RUN] Would upload skills/design-review/references/capture.md
[DRY RUN] Would upload skills/domain-interview/SKILL.md
[DRY RUN] Would upload skills/domain-interview/references/brief-template.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/query-backed-relationships/SKILL.md
[DRY RUN] Would upload skills/realm-policy-authoring/SKILL.md
[DRY RUN] Would upload skills/rich-markdown-reports/SKILL.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

@lucaslyl
lucaslyl marked this pull request as draft September 28, 2026 08:25
@lucaslyl lucaslyl changed the title Write the domain-interview output as a software-factory brief card domain-interview skill — interview the domain, write the spec Sep 28, 2026
Interviews the user and writes a buildable brief as a software-factory
Wiki card, with no design decisions.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@lucaslyl
lucaslyl force-pushed the eco-579-domain-interview-skill branch from 095e47e to ba2f1a1 Compare September 28, 2026 09:13
Decides how a unit looks, moves and responds before it is built, and
records it as a DESIGN-DIRECTION.md. SKILL.md routes to one reference
file per phase.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
lucaslyl and others added 2 commits September 28, 2026 17:45
The direction is a `## Design direction` section on the unit's brief
card, never a markdown file. The skill stops after the hand-off summary;
build order and the after-build gate belong to the builder and
design-review. Adds a Reads / Writes / Stops-when contract.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Refining a brief keeps the sections later stages added to the same card.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@lucaslyl lucaslyl left a comment

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.

[Claude Code 🤖] Focused on the new domain-interview skill's own internal consistency and its consistency with the sibling skills it tells the reader to load (source-code-editing, catalog-reuse, boxel-environment's tool-selection docs) — not on the Wiki/software-factory contract itself, which lives outside this repo and isn't checkable here.

Bottom line: no blocking issues. One non-blocking finding below — the create-then-patch-fields recipe conflicts with the platform's documented tool-selection rule, though the skill's own "check it landed" step recovers from it.

Adjacent, out of scope: none noticed.

Comment thread skills/domain-interview/SKILL.md Outdated
lucaslyl and others added 2 commits September 29, 2026 12:52
Bring design-direction's history into this branch so domain-interview
can hand off to it directly, resolving the follow-up noted in this
PR's description.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Offer design-direction as the next stage when the brief is done,
instead of stopping with no next-step guidance.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@lucaslyl lucaslyl changed the title domain-interview skill — interview the domain, write the spec domain-interview + design-direction skills — interview the domain, decide the look, write the brief Sep 29, 2026
lucaslyl and others added 4 commits September 29, 2026 14:05
Add a single-surface / multi-object fork at Phase 1, decided from the
schema's link calls: a unit whose CardDefs are only ever read through one
screen gets one screen with tabs and filters as interaction rows, and skips
the nav and set-acceptance machinery. Multi-object units still get real
screens, but only the first is written out in full before the build.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Layout and interaction were two passes over the same screen, and the
hand-off was four bullets of reporting on the end of the write. Merge them
into a first-screen phase and a write-and-hand-off phase, renumbering the
references that named the old six.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The direction ended by reporting and stopping, which dead-ends a pipeline
whose first stage now offers its next step. Offer build, motion-authoring
or adjust as a choice, gated on the motion line it just wrote.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Both were written against a file-based pipeline, where each stage dropped
a markdown file beside the last. The brief card replaced that, so their
output is retargeted: motion-authoring appends a Motion section to the
same card with patch-fields, and design-review reads the card's acceptance
lines and writes nothing, since a review scores rather than decides.

Brings the scroll reveal/scrub pattern with them — motion-authoring's
engine rows start from it rather than rewriting the observer.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@lucaslyl lucaslyl changed the title domain-interview + design-direction skills — interview the domain, decide the look, write the brief The design pipeline skills — interview, direct, author motion, review Sep 29, 2026
lucaslyl and others added 2 commits September 29, 2026 14:51
The software-factory Wiki card held every stage in one content blob, so
each stage had to read the whole brief back and resend all of it to add
its own section — 14k+ characters per patch, and the field every stage
could accidentally truncate. BriefCard gives spec, designDirection and
motion their own MarkdownField: a stage replaces only its own field, and
a change to one block inside it is an apply-markdown-edit, not a resend.

The definition ships as a reference file and is written into a realm
that lacks it, so nothing crosses realms.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The definition belongs with the other shared CardDefs, not as a file the
skill copies into each realm — one definition, nothing to drift. The
skills now adopt from @cardstack/catalog/cards/projects/brief.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
lucaslyl and others added 8 commits September 29, 2026 15:42
A marketing screen is judged against the best of its kind, so the style
phase names three to five real sites first, and says whether it looked
or recalled — the Boxel assistant cannot fetch pages, only whitelisted
APIs and Google image search.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Questions typed as prose made a non-expert compose answers from scratch,
and a four-question batch written up front went wrong all at once: "spa"
was read as a medical spa before anyone checked. Each round is now a
choice-UI call of at most two questions, and the first call asks what the
thing is and who it's for, with ambiguous readings offered as answers.

Depth (Quick, Standard, Deep) is never asked. Every interview starts
Quick and goes deeper only where the answers, or "Not sure, suggest for
me" picks, show gaps; call counts are ceilings, and the brief records
which depth it was written at.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
"Where the environment supports it" let the model type questions as
prose. Every ask (feeling, interaction fork, style directions, revision
scope, hand-off) is now one choice-UI call: single-select by default,
recommended first, each option saying what it commits the build to, and
lettered options in chat only when no choice tool exists.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A one-word feeling answer gets the default it usually produces: "calm"
becomes a pale grey page. Phase 0b turns the brief and the feeling into
`## Story` (one image, a named reader, a voice, a scene per screen or
band with what they feel and what must never happen), and every later
phase argues from it.

The feeling question now offers scenes, never adjectives, alongside a
question about the reader's moment. The story is not put to the user
as text; each Phase 3 style direction shows its reading of the story
next to a palette whose colours each have a role in the story's image,
so picking a direction is picking a reading. The skill opens on the
art-director bar Phase 3 already used, so the story is written to it.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
"Create me a landing page" matched both domain-interview ("even when
the user sounds confident") and design-direction ("even when nobody
asks"), so the model guessed. The index now asks once: just build it
(the default, since most users want to see something first), plan it
first (recommended only for specialist domains), or build from an
existing brief. The two skills' descriptions no longer claim the same
request.

"Just build it" still asks what it is and who it's for in one call,
researches real examples where a browsing tool exists, and writes a
two-sentence story the mockup is argued from.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Included here for testing alongside the design pipeline only. This
belongs in its own PR and will be moved to a separate branch before
this one merges.

The assistant had no build-time way to fill sample instances' image
fields. host-commands-reference now declares generate-thumbnail (any
OpenRouter image, not only thumbnails) and download-file-to-realm, both
with approval, and boxel-file-def/references/sample-images.md picks a
source by scenario (the user's own, AI-generated, stock, or a
placeholder) and links each without breaking the realm.

Never guess an image URL: a made-up Pexels ID loads an unrelated photo.
asset-selection-guidelines drops the guessing advice and the dead
source.unsplash.com, via.placeholder.com, unDraw and SVGBackgrounds
patterns. attach-remote-image imported ImageDef from
@cardstack/base/image, whose default is ImageCard; it now uses
@cardstack/base/image-file-def.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Resolves the glossary conflict with the screenshot-to-captures rename
(#150): main's renamed entries kept, with this branch's Sample images
entry added after GenerateThumbnailCommand.

Follows the rename in this branch's own text: design-review's capture
table and pattern link now name CaptureCardTool, POST /_capture-card and
integrate-capture-card-format, and motion-authoring and the scroll-reveal
pattern say capture rather than screenshot service.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
lucaslyl and others added 4 commits October 6, 2026 17:11
…very media slot

Three gaps found in real Claude Code builds (a rider app, a cinema app)
and in Chuan's review:

- Look check. "Plan it with me" (domain-interview) makes no design
  decisions on purpose, and since design-direction was retired nothing
  after it asked the user about the look, so the careful route gave less
  say than the shortcut. boxel-design now runs a Look check at build
  entry: the shortcut's feel and real-details questions, asked once and
  only when unanswered ("Use what's in the brief" when the spec already
  holds facts), recorded as Look: and Real details: lines in the brief's
  designDirection. The shortcut points at the same block, so nothing is
  asked twice. domain-interview's hand-off, the glossary and
  design-review say the same.
- Review from a terminal. Both rider sessions skipped the automatic
  design review because no skill named a capture tool outside the app.
  capture.md and the index name `npx boxel screenshot` (with a tall
  --viewport for cards that scroll inside their root), a blank region
  is re-captured once and then reported, and Home lists use embedded
  rows, fitted only for tile grids, since fitted tiles hid the data.
- Media slots. Builds shipped gradients or initials where photos belong,
  or random picsum photos as film posters. Every media slot now ships
  with an image: real photos from Openverse when the session can run
  curl (Unsplash and Pexels search pages refuse non-browser requests),
  each URL load-checked, else a labelled placeholder in theme colours
  sized to the slot; named fictional people and real copyrighted
  subjects always get placeholders; in the Boxel app, AI images are
  offered after the build as one batched question. The file's own
  contradictions (a solid-colour fallback as the default, dead hosts in
  the style table) are removed.

Tested: the plan route asked the Look check once and changed only
designDirection; two cinema simulations filled every media slot (real
photos where the load check passed); a real staging build had no empty
section and placed 2nd of 5 against four real cinema sites in a judged
comparison, with its design review run through the CLI.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ound

A real "kid swimming course app" build still shipped no photos: it
followed the playbook's pointer to sample-images.md, whose source table
still offered "Placeholder (Lorem Picsum, placehold.co)" and never
mentioned Openverse, which lived only in asset-selection-guidelines.md.
It drew CSS boxes where photos belong.

- sample-images.md now holds the Openverse recipe (one query per
  subject, 20 results so a refused host has fallbacks, title match, load
  check, thumbnail only for small tiles), a source table led by
  Openverse photos and labelled placeholders, and the rule that every
  media slot of every sample instance gets an image (a gradient,
  initials or CSS box is not one). It drops a duplicated paragraph and
  the advice to open Unsplash or Pexels pages, which refuse a terminal.
- asset-selection-guidelines.md keeps the policy and points at the
  recipe; the playbook and boxel-design's reference list say the same.

From the e2e cinema build and its review:
- critical-rules: a marked slot never removes the main action; Book,
  Buy, Enrol or Sign up stays on screen and points at a slot until the
  link is known (the judge found no Book button anywhere).
- capture.md: a fitted capture on its own can come back without the
  card's theme; check it inside its parent before reporting it (the
  review spent a fix round on this).
- motion-baseline: set --i with the cssVar helper; a literal
  style='--i: 2' fails no-inline-styles.
- index step 1: the call asks up to four questions; domain-interview's
  two-per-call limit is for its own rounds.
- check-palette.mjs reads a StructuredTheme JSON's rootVariables, so it
  finds every role without flags.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Both judged end-to-end builds lost points on the same defect: the user
could not see what to do. The cinema build had no Book button; the swim
school build (an internal app) showed no Add swimmer or Take attendance.
The rule added last commit named only public verbs, so an internal app
read as exempt.

- critical-rules: a standalone "Main action always on screen" rule.
  Every app names one main action for its primary user (one per
  audience view when there are two), shown as a button on Home without
  scrolling at desktop and phone widths and repeated on the cards it
  applies to. An external target with no link opens a marked slot and
  is never replaced by a home-made booking system; an internal target
  works in the first build as an @operation, since a "coming soon"
  button there is an unfinished feature, not a missing input. Only the
  main action must work; others wait in a "Next to add" note, never as
  live-looking dead buttons; a blocked operation shows disabled with its
  reason. "Never invent proof" keeps a one-line pointer.
- index (app branch): name the main action and give it one working
  @operation before polishing layout.
- design-playbook: one primary-styled button on Home, in reach on a
  phone, repeated where it applies.
- design-review (constraints): a main-action check with blocker, major
  and minor severities, and "not exercised" when the session cannot run
  it.
- card-operations-authoring: the first build's main action as the
  common reason to declare one create-and-link operation.

Decided by a council run (2 of 3 for a working operation over a stub,
2 of 3 for a standalone rule); not yet exercised in a real build.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@tintinthong

Copy link
Copy Markdown
Contributor

This PR shud be split up for easy review. it's too big

lucaslyl and others added 8 commits October 7, 2026 10:19
…sible control work

- design-review/references/build-check.md: the builder captures its own work
  and fixes every pass/fail line (names, fill, media, phone, colour roles,
  type, controls, one signature, job first, same facts) before the review,
  and again after the fix round. No score.
- The automatic review runs one fix round, then offers another as a choice;
  the re-score gets the gap list so a fresh reviewer does not reverse it.
  Flaky captures are re-checked once; a gap is a cause, not an instance.
- critical-rules: a first build is Home plus at most four card types; every
  visible control works (main action plus up to three cheap ones via the
  host's viewCard side stack, edit view, tabs or links), or it is not drawn;
  a card the main action creates takes the app's theme.
- Placeholder labels are quieter and sized for the largest display; sample
  data carries the longest realistic name.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- catalog-reuse: "Reuse the model, own the look". Adopting a catalog card
  binds the build to its fields, computeds and operations, never its
  templates. Four routes, lightest first: the theme (only when the stock
  layout already fits), its fields in the parent's own markup (one
  placement), extend it and override isolated/embedded/fitted (an app
  entity or several placements), refuse only for a model or behaviour
  mismatch. The disposition records the route.
- build-check: a catalog card shown through its stock template fails the
  one-signature line.
- critical-rules: the three cheap controls count kinds, not instances;
  linked cards and real links do not count.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- The boxel search check writes `cardInfo.name`: the CLI adds the `item.`
  prefix itself, so `item.cardInfo.name` went out doubled and matched
  nothing (checked against a realm with boxel-cli 0.8.0-unstable.0; the
  0.7.0 source prefixes the same way).
- A whole-file rewrite through `boxel file write` has no version check, so
  it is safe only while this stage is the card's only writer: read right
  before writing, carry every attribute, cardInfo key and relationship,
  change `spec` alone, and confirm `designDirection` and `motion` after.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Step 1 sent a terminal agent to the refine paragraph, which uses
apply-markdown-edit, a tool the terminal section says it does not have; it
now points at the whole-file rewrite. The landed check says to write again
from a terminal instead of patching.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…rove

- Look for an earlier brief (another slug, a Wiki card, a markdown file)
  before creating one, so an upgrade is not started as a new interview.
- Branch on the read's status: 404 create, 200 refine, anything else stop.
- Rewrite by parsing the JSON read and setting data.attributes.spec, so
  meta and every other key go back as they were.
- Correct the concurrency guard: a read after an unconditional write cannot
  show a write that landed in between, so the path is for when no other
  stage is editing; the read-back only shows whether someone wrote after.
- Compare the stored spec exactly, match the search result's exact id, and
  allow for indexing lag before calling it a failure.
- A schema that differs from an old brief is raised with the user, not
  folded in silently; numbered options where an agent has no choice tool.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…e-and-cli

domain-interview: terminal-agent write path, and upgrading older briefs
…iew-skill

# Conflicts:
#	index.md
#	skills/domain-interview/SKILL.md
lucaslyl and others added 2 commits October 7, 2026 15:04
Takes #184's tested image guidance (sample-images, asset-selection, host
commands, the Images-in-templates section) and keeps this branch's own
sections around it: never invent proof, main action, visible controls and
first-build size in critical-rules, and the boxel-design reference list.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A labelled placeholder image is an honest gap, like a marked slot for a
review the business has not given yet: the build puts one where no photo
may be used or none could be found. The review scores the slot's space,
crop and shape as if a fitting photo stood there, and never the
placeholder's colours, label or count. The build check's label rule
exempts a small avatar that shares the panel's URL.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
lucaslyl and others added 3 commits October 8, 2026 15:17
…and #189's interview record

Brings in main (including #184's sample images), takes #188's versions of
layout-vocabulary.md and layout-gravity.md, and #189's interview record in
domain-interview, its brief template and glossary entry, and its routing
skip sentence in index.md. Conflicts keep #151's fuller text and add the
newer lines into it.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ayout token fix

Main now carries #188 and #189 and the layered-surface / edge-overlap token fix. The layout files and their glossary and SKILL.md lines take main's wording; index.md and the domain-interview field table keep this branch's fuller text, which names the Look check and motion-authoring.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

@lucaslyl lucaslyl left a comment

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.

[Claude Code 🤖] This review runs the boxel-ui-guidelines UI review procedure (contract tokens, guaranteed pairs, typography roles, ladders, components, markup) over show-scroll-reveal-and-scrub/example.gts and the CSS snippets in the skills, and the pr-review correctness pass over all 27 files. It reads each file whole and checks every named path, API, flag and token against boxel and boxel-catalog main. Almost all of this PR's content landed after the last reviewed commit, so this pass covers the whole diff. Contrast was not computed for the example, because its colours are literals (see the inline comment). Nothing was rendered, so hover, motion timing, sticky behaviour inside a live card and hit sizes are unverified.

3 blocking: the example card renders @model.title, which CardDef doesn't have; the example pins literal colours; check-palette.mjs reports contrast: pass when it could not check a pair.

  1. (blocking) @model.title: see the comment on the <h1> in example.gts.
  2. (blocking) Literal colours: see the comment on the .piece root in example.gts (UI review §2).
  3. (blocking) False pass: see the comment on the pair loop in check-palette.mjs.
  4. .card-body is read as the page background: see check-palette.mjs.
  5. Rules that only a full direction can satisfy (Views table, Width line, Interaction rows, build order) are read unconditionally: see design-review/SKILL.md.
  6. The Source order link points at a section that doesn't exist: see untrusted-content.md (the same link is in design-review/SKILL.md).
  7. The glossary's routing question still says a web research pass runs: see glossary.md.
  8. A terminal has no documented way to write motion or the Look check lines: see motion-authoring/SKILL.md.
  9. The focus ring uses currentColor instead of --ring: see motion-baseline.md (UI review §2).
  10. Journey wording in several files: see signature-treatments.md.
  11. The description is out of date. It still names the retired design-direction skill as the designDirection writer. It says the catalog Brief PR must merge first, but that PR has merged, and cards/projects/brief.gts on catalog main has spec/designDirection/motion. It also says design-review has three modes, and it has four.

Addressed since the last review: the create-then-patch-fields thread on domain-interview. Step 2 now reads the instance back before patching, and the terminal path writes the whole card.

The request to split this PR is covered by the description's do-not-merge banner and its split plan.

Pre-existing, not caused by this change: in the catalog Brief card, the Design direction empty state still says "design-direction writes this", naming the retired skill. The writer is now boxel-design's Look check. That is a boxel-catalog follow-up.

<template>
<section class='piece' data-motion-root>
<header class='intro' data-reveal {{this.reveal}}>
<h1>{{@model.title}}</h1>

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.

[Claude Code 🤖] CardDef has no title field. Base declares cardTitle, cardDescription and cardInfo, and this class doesn't declare one either. So the <h1> renders empty, and Component<typeof ScrollMotionExample> won't type-check under glint. motion-authoring tells builders to start from this file, so every copy inherits the bug. Use {{@model.cardTitle}}, or declare @field title = contains(StringField) if the pattern should have its own. Regression in new code; blocking.

Comment on lines +264 to +265
background: #0e0f12;
color: #f2f0ea;

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.

[Claude Code 🤖] UI review §1/§2 Colors: the root pins #0e0f12 / #f2f0ea, and the subject's gradient further down pins #cfe8ff / #37506b. The pattern therefore looks the same under every theme, and it teaches builders to hardcode colours. CardContainer already gives the isolated root the --background/--foreground pair, so these two lines can go. For the subject, use a tint taken from the contract, for example radial-gradient(circle at 35% 30%, color-mix(in oklch, var(--primary) 30%, var(--background)), var(--primary)). Blocking under the UI review (literal colours in a template).


console.log('\ncontrast');
for (const [fg, bg, min, what] of PAIRS) {
if (!roles[fg] || !roles[bg]) continue;

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.

[Claude Code 🤖] When a role is missing or can't be parsed, its pair is skipped with continue, and the run still ends with contrast: pass and exit 0. A theme written in hsl(), or in bare shadcn triples like 0 0% 100%, parses to nothing. I ran it on :root { --background: hsl(0 0% 100%); --foreground: #111; --muted-foreground: #999; }: it printed no contrast lines, then contrast: pass, exit 0. The skills present this script as the gate that fails a build ("exits 1 when a pair fails"), so a palette it couldn't read passes the gate. Either track the skipped pairs and exit non-zero (for example 2, with could not check: …) whenever any of the five goes unchecked, or add hsl() parsing and still report what was skipped. Regression in the new script. Blocking, because it turns an accessibility check into a false pass.

}
}
// The body's own background beats a guessed token when it is a literal colour.
const bodyBg = text.match(/body\s*\{[^}]*background(?:-color)?\s*:\s*([^;}]+)/i);

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.

[Claude Code 🤖] /body\s*\{/ has no boundary, so .card-body { background: #000 } matches and replaces the canvas. On :root { --background: #fff; --foreground: #111 } .card-body { background: #000 } the script reports ink on canvas 1.11:1 FAIL from body background. Anchor the match to the element selector, for example /(?:^|[\s,}])body\s*\{[^}]*background(?:-color)?\s*:\s*([^;}]+)/im. Non-blocking: it's a false FAIL, and the report names where the colour came from.

Comment on lines +18 to +23
Everywhere below, `## Design direction` means the brief card's `designDirection` field and
`## Motion` its `motion` field. `boxel-design`'s Look check writes only a `Look:` and a `Real details:` line into
`designDirection`: score the colour against the first and check that no proof was invented beyond the
second. A brief from earlier work, or one written by hand, may carry a full direction. Every rule below
that reads `## Design direction` acceptance lines applies only when that field holds them. With it empty, what was decided is the brief's `spec` (or, with no
brief, the build's own hand-off line).

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.

[Claude Code 🤖] This guard covers acceptance lines only. Several rules below read parts of a full direction that nothing in this pipeline writes any more, because the Look check writes only Look: and Real details::

  • Card mode step 5 compares prefersWideFormat against the direction's Width line.
  • The Media row reads its Views table.
  • The Motion row scores a unit without ## Motion "on its Interaction rows alone".
  • Reviewing hardcoded work points at "the build order in ## Design direction".

On current briefs, the reviewer is told to check against rows that don't exist. Either widen this sentence to cover every ## Design direction read ("…applies only when the field holds it; otherwise skip that check and say so"), or drop those clauses. The same dependency shows up in motion-authoring's triggers (Interaction row marked JS, Narrative arc, spatial model) and in the "Phase 2" / "Phase 3" references in signature-treatments.md. Non-blocking.

Comment thread skills/glossary.md

- **Brief card** — a unit's one source of truth: a catalog `Brief` (`@cardstack/catalog/cards/projects/brief`) at `Brief/<slug>.json` with one MarkdownField per stage — `spec` from `domain-interview`, `designDirection` (`boxel-design`'s Look check), then `motion`. No stage writes a markdown file or another stage's field.
- **Interview depth (Quick / Standard / Deep)** — how far `domain-interview` goes, never asked: every interview starts Quick (at most 3 calls) and goes to Standard (6) or Deep (10) only when the answers show gaps, or "Not sure, suggest for me" picks. Counts are ceilings; the interview stops once it could build. → `domain-interview/SKILL.md` "Size the interview from the answers"
- **Routing question** — the one single-select question the index asks before loading a skill for a short build request ("create me a landing page"): just build it (`boxel-design`, the default recommendation, after one purpose question and a web research pass), plan it first (`domain-interview`, recommended only for specialist domains), or build from an existing brief. Each stage then offers the next as its own hand-off question. → `index.md` Pre-flight

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.

[Claude Code 🤖] "after one purpose question and a web research pass" contradicts the index's step 2 and untrusted-content.md → When to research. Both make research opt-in and skip it for common categories. Suggest "after one call (purpose, audience, feel, real details)". Non-blocking.

Comment thread skills/motion-authoring/SKILL.md Outdated
One line per beat: name · engine · trigger · the one number that defines its feel. The build then
proceeds from the brief, with `## Design direction` when there is one, and `## Motion` together.

**Writing it onto the brief card.** Read the card back first so it has resolved, then

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.

[Claude Code 🤖] This write path only exists in the assistant. The same goes for the brief-card create earlier in this file, and for boxel-design's Record it on the brief, which names no mechanism at all. From a terminal, patch-fields and apply-markdown-edit aren't available. domain-interview covers that case with its own terminal path (boxel file read → script → boxel file write --file → read back). The index runs terminal builds through this pipeline too (npx boxel screenshot for design-review), so a Claude Code run has no documented way to save motion. Add a terminal paragraph that reuses domain-interview's steps (read the card, set the one field in a script, write it with --file, read it back and compare), or link to them. Non-blocking.

.control:hover { transform: translateY(-2px); }
}
.control:active { transform: translateY(0) scale(0.98); }
.control:focus-visible { outline: 2px solid currentColor; outline-offset: 2px; }

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.

[Claude Code 🤖] UI review §2 Colors: focus outlines use --ring, not currentColor, so this should be outline: 2px solid var(--ring). This recipe goes into every build's controls. A Pret UI Button already draws this ring, so the line only belongs on non-Button controls. Non-blocking.


## Spatial model — the control that was never defined

`spatial model` is the style control for depth, and until now it had

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.

[Claude Code 🤖] Some wording describes how these files got here, and it will read wrong once merged:

  • "until now it had no vocabulary" here, and "Upstream's" / "Upstream ships" in this file and in design-review/SKILL.md
  • "the one this list used to miss" and "it used to appear in neither the build gate nor this list" in design-review/SKILL.md
  • "The earlier rules in this skill described only that look" in style-families.md
  • "Today boxel-design's Look check writes…" in glossary.md

State each rule as it is now. Non-blocking.

Comment thread skills/domain-interview/SKILL.md Outdated
lucaslyl and others added 5 commits October 9, 2026 13:44
…light

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The section now carries #196's exact text: the one call of four questions and the never-invent rule scoped to the user's own business, with sample records still realistic. This branch keeps its extras around it: the page-colour hint, the Look check and Never invent proof links, and the research and page-or-app steps after the call.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…s final wording

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Drop motion-authoring, motion-baseline and the scroll reveal-and-scrub
pattern: card-motion (glimmer-motion and Choreo) is now the one way to
animate a card, and a build animates only when the user or the design
asks for it. Review no longer marks down a still page.

Never invent proof gains demo mode's guardrails and the two
contradiction fixes from #205; the app rules gain the free
catalog-button row, the viewCard guard and the hand-off note.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.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.

2 participants