@bettercms-ai/mcp 0.84.4 → 0.85.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -72,7 +72,7 @@ Tags: global-synced, repeater, validation, variants. Proves: Smallest global hea
72
72
  - A 'Book a table' widget that opens a third-party modal is still a button with an external link — don't model the widget's script.
73
73
  - Don't create a link for the logo; it always goes home.
74
74
 
75
- Not carried by a stored component: category, item openMode, kind:global, variants.
75
+ Not carried by a stored component: item openMode, variants.
76
76
 
77
77
  ### Header with announcement + utility row (`nav-announcement-utility`)
78
78
 
@@ -92,7 +92,7 @@ Tags: global-synced, conditional, repeater, localized. Proves: Three stacked row
92
92
  - A rotating announcement (several messages cycling) is an array, not one string — switch `message` to an array of {message, link} rather than joining with ·.
93
93
  - Don't put the account/cart icons in utility links — those are app state; see `nav-ecommerce-header`.
94
94
 
95
- Not carried by a stored component: ai, category, item openMode, kind:global.
95
+ Not carried by a stored component: item openMode.
96
96
 
97
97
  ### Mega menu with featured cards + promo slot (`nav-mega-featured-promo`)
98
98
 
@@ -114,7 +114,7 @@ Tags: deep-nesting, slots, global-synced, conditional, references, variants, com
114
114
  - If two menu items share the same panel content, that is still two panels in content; don't invent a shared-panel global for it.
115
115
  - Hover-only panels fail keyboard users — the converter should default `openOn` to click when the source has no aria-expanded handling.
116
116
 
117
- Not carried by a stored component: ai, category, kind:global, shopify reference, variants.
117
+ Not carried by a stored component: shopify reference, variants.
118
118
 
119
119
  ### Docs sidebar navigation (`nav-docs-sidebar`)
120
120
 
@@ -135,7 +135,7 @@ Tags: deep-nesting, repeater, global-synced, conditional, dynamic-query, referen
135
135
  - Sidebars 4+ levels deep can't be represented — flatten to sub-pages and flag it rather than inventing nested objects.
136
136
  - Don't import the 'On this page' table of contents — it's generated from each page's headings.
137
137
 
138
- Not carried by a stored component: category, item openMode, kind:global.
138
+ Not carried by a stored component: item openMode.
139
139
 
140
140
  ### E-commerce header (`nav-ecommerce-header`)
141
141
 
@@ -156,7 +156,7 @@ Tags: global-synced, commerce, references, repeater, conditional, media-heavy. P
156
156
  - Copying '(2)' from the cart badge into content is the most common converter mistake — it's session state.
157
157
  - Free-shipping thresholds belong to commerce settings, not the header; reference them from the renderer.
158
158
 
159
- Not carried by a stored component: category, kind:global, shopify reference, variants.
159
+ Not carried by a stored component: shopify reference, variants.
160
160
 
161
161
  ### Multi-locale header with switchers (`nav-locale-header`)
162
162
 
@@ -176,7 +176,7 @@ Tags: localized, global-synced, conditional, repeater. Proves: Localized labels
176
176
  - Using flags for languages (🇬🇧 for English) — map to codes and set display: 'code'.
177
177
  - Translating the link target by typing /de/... URLs — link to the page and let locale routing resolve it.
178
178
 
179
- Not carried by a stored component: category, item openMode, kind:global.
179
+ Not carried by a stored component: item openMode.
180
180
 
181
181
  ### Sticky bottom CTA bar (mobile) (`sticky-mobile-cta-bar`)
182
182
 
@@ -196,8 +196,6 @@ Tags: responsive-layout, conditional, validation, commerce. Proves: A per-templa
196
196
  - 'Add to cart' is an ACTION, not a link — our button type only carries links (gap: action buttons).
197
197
  - A bar covering the cookie banner or chat launcher: the renderer must stack them; nothing to model.
198
198
 
199
- Not carried by a stored component: ai, category.
200
-
201
199
  ### Announcement bar with countdown (`announcement-countdown`)
202
200
 
203
201
  Tags: global-synced, conditional, validation, repeater, localized, a11y. Proves: Scheduled global with time zone · countdown with an after-end state · dismiss memory · rotating messages
@@ -216,7 +214,7 @@ Tags: global-synced, conditional, validation, repeater, localized, a11y. Proves:
216
214
  - Storing the countdown as text ('2 days left') — it's wrong the next day. Always a datetime with offset.
217
215
  - Hide-after earlier than the countdown end can't be caught today (gap: cross-field validation).
218
216
 
219
- Not carried by a stored component: ai, category, item openMode, kind:global.
217
+ Not carried by a stored component: item openMode.
220
218
 
221
219
  ### Cookie consent banner (`cookie-consent`)
222
220
 
@@ -236,7 +234,7 @@ Tags: global-synced, repeater, validation, a11y, localized, conditional, variant
236
234
  - Pre-ticked optional categories are unlawful in the EU — the converter must set isOnByDefault: false and report any source that pre-ticks.
237
235
  - A 'Reject all' hidden behind 'Preferences' is a dark pattern; flag it, don't replicate it.
238
236
 
239
- Not carried by a stored component: category, kind:global, variants.
237
+ Not carried by a stored component: variants.
240
238
 
241
239
  ### Breadcrumb trail (`breadcrumb-config`)
242
240
 
@@ -256,7 +254,7 @@ Tags: conditional, seo-structured, a11y, references, repeater. Proves: A mostly-
256
254
  - Importing the full trail per page as manual data — it rots the first time a page moves. Prefer auto.
257
255
  - A breadcrumb that's really a 'Back to results' link is navigation state, not a trail.
258
256
 
259
- Not carried by a stored component: category, item openMode.
257
+ Not carried by a stored component: item openMode.
260
258
 
261
259
  ### Multi-column footer (`footer-multi-column`)
262
260
 
@@ -276,7 +274,7 @@ Tags: global-synced, repeater, references, form, validation, commerce. Proves: L
276
274
  - Flattening columns into one long links array loses the headings — keep groups.
277
275
  - Uploading payment logos as images: they go stale and break brand rules. Use the fixed set.
278
276
 
279
- Not carried by a stored component: ai, category, item openMode, kind:global, variants.
277
+ Not carried by a stored component: item openMode, variants.
280
278
 
281
279
  ### Minimal footer (`footer-minimal`)
282
280
 
@@ -295,7 +293,7 @@ Tags: global-synced, repeater, validation. Proves: The smallest useful global: o
295
293
  **Pitfalls.**
296
294
  - Don't promote a minimal footer to the multi-column model just to have one footer type — the editor gets empty groups to ignore.
297
295
 
298
- Not carried by a stored component: ai, category, item openMode, kind:global.
296
+ Not carried by a stored component: item openMode.
299
297
 
300
298
  ### Mega footer with locations + app badges (`footer-mega-locations`)
301
299
 
@@ -316,7 +314,7 @@ Tags: global-synced, deep-nesting, repeater, seo-structured, validation, media-h
316
314
  - Duplicating locations in the footer AND a Locations collection — two truths; use references once a collection exists.
317
315
  - Times without a zone are read in the site's time zone; a chain spanning zones needs a zone per location (not modelled).
318
316
 
319
- Not carried by a stored component: category, item openMode, kind:global.
317
+ Not carried by a stored component: item openMode.
320
318
 
321
319
  ## Heroes
322
320
 
@@ -338,7 +336,7 @@ Tags: variants, conditional, media-heavy, a11y, repeater. Proves: One media slot
338
336
  - A hero with BOTH a background video and a side image is a different section (full-bleed video) — don't merge.
339
337
  - Alt text on a decorative hero photo should still describe it when it shows the product.
340
338
 
341
- Not carried by a stored component: ai, category, variants.
339
+ Not carried by a stored component: variants.
342
340
 
343
341
  ### Centered hero with gradient + screenshot (`hero-centered-gradient`)
344
342
 
@@ -359,7 +357,7 @@ Tags: variants, conditional, validation, media-heavy. Proves: Announcement chip
359
357
  - Editing the headline can orphan the highlight — the renderer must ignore a highlight that no longer matches (no cross-field validation yet).
360
358
  - Don't store raw CSS gradient strings — they can't be re-themed or validated.
361
359
 
362
- Not carried by a stored component: ai, category, variants.
360
+ Not carried by a stored component: variants.
363
361
 
364
362
  ### Full-bleed video hero with captions (`hero-video-fullbleed`)
365
363
 
@@ -380,7 +378,7 @@ Tags: media-heavy, a11y, conditional, repeater, validation. Proves: An Accessibi
380
378
  - A YouTube iframe can't autoplay muted reliably as a background — prefer MP4/Vimeo background mode; flag YouTube sources.
381
379
  - Captions and transcript are different things: captions sync to the film, a transcript is a page. Model both.
382
380
 
383
- Not carried by a stored component: ai, category, item openMode.
381
+ Not carried by a stored component: item openMode.
384
382
 
385
383
  ### Slider hero (`hero-slider`)
386
384
 
@@ -400,7 +398,7 @@ Tags: repeater, media-heavy, conditional, validation, a11y. Proves: Slides array
400
398
  - Cloned slides doubling the count — dedupe by image URL + heading.
401
399
  - Slide schedules that leave fewer than 2 live slides: the renderer should fall back to a static hero (min can't be enforced over time).
402
400
 
403
- Not carried by a stored component: ai, category, fieldset (derived).
401
+ Not carried by a stored component: fieldset (derived).
404
402
 
405
403
  ### Product hero with variant picker (`hero-product`)
406
404
 
@@ -421,7 +419,7 @@ Tags: references, commerce, media-heavy, conditional, repeater. Proves: Live com
421
419
  - Hard-coding the price in the tagline ('Just $165!') — it goes stale; flag any currency in copy.
422
420
  - Picker options are a fixed list here; a product with a 'Handle wrap' option can't be picked until options come from the reference (gap).
423
421
 
424
- Not carried by a stored component: ai, category, shopify reference, variants.
422
+ Not carried by a stored component: shopify reference, variants.
425
423
 
426
424
  ### Search hero (`hero-search`)
427
425
 
@@ -440,8 +438,6 @@ Tags: references, conditional, dynamic-query, media-heavy. Proves: Search box co
440
438
  **Pitfalls.**
441
439
  - Don't model the autocomplete dropdown's results — they come from the search index.
442
440
 
443
- Not carried by a stored component: ai, category.
444
-
445
441
  ### Lead-form hero (`hero-lead-form`)
446
442
 
447
443
  Tags: form, references, conditional, validation, repeater. Proves: A form REFERENCE plus per-placement settings: hidden source fields, label override, message vs redirect
@@ -460,7 +456,7 @@ Tags: form, references, conditional, validation, repeater. Proves: A form REFERE
460
456
  - Copying inputs into the hero's schema — the form then can't be reused or receive submissions properly.
461
457
  - Hidden values that contain personal data (an email from the URL) must not be stored in content.
462
458
 
463
- Not carried by a stored component: ai, category, item openMode, variants.
459
+ Not carried by a stored component: item openMode, variants.
464
460
 
465
461
  ### App download hero (`hero-app-download`)
466
462
 
@@ -480,7 +476,7 @@ Tags: media-heavy, conditional, validation, global-synced, repeater. Proves: A f
480
476
  - Uploading badge or QR images — they can't be updated and the QR silently breaks when the link changes.
481
477
  - Ratings copied from the store go stale; the help text says so because there's no live source.
482
478
 
483
- Not carried by a stored component: ai, category, item openMode.
479
+ Not carried by a stored component: item openMode.
484
480
 
485
481
  ### Stats hero (`hero-stats`)
486
482
 
@@ -500,7 +496,7 @@ Tags: repeater, validation, variants, media-heavy. Proves: Numbers stored as num
500
496
  - Reading '0' from a count-up that hasn't run — always prefer data-target/data-count.
501
497
  - '1.2k' style abbreviations: store 1.2 with suffix 'k', not 1200, so the copy stays as written.
502
498
 
503
- Not carried by a stored component: ai, category, fieldset (derived), variants.
499
+ Not carried by a stored component: fieldset (derived), variants.
504
500
 
505
501
  ### Hero with logo wall (`hero-logo-wall`)
506
502
 
@@ -520,7 +516,7 @@ Tags: repeater, media-heavy, a11y, conditional, variants. Proves: Logos as a gri
520
516
  - Alt text 'logo' x12 — screen readers hear nothing useful. Name is required for that reason.
521
517
  - Marquee without a pause control is a WCAG 2.2.2 problem; the renderer pauses on hover/focus and reduced motion.
522
518
 
523
- Not carried by a stored component: ai, category, variants.
519
+ Not carried by a stored component: variants.
524
520
 
525
521
  ### Split hero with testimonial card (`hero-split-testimonial`)
526
522
 
@@ -538,7 +534,7 @@ Tags: references, conditional, variants, media-heavy. Proves: Pick from the Test
538
534
  **Pitfalls.**
539
535
  - Quotes typed inline on every landing page drift from the approved wording — prefer the collection.
540
536
 
541
- Not carried by a stored component: ai, category, variants.
537
+ Not carried by a stored component: variants.
542
538
 
543
539
  ### Event hero (`hero-event`)
544
540
 
@@ -559,8 +555,6 @@ Tags: conditional, seo-structured, validation, media-heavy. Proves: Date/time wi
559
555
  - Dates stored as text ('Nov 14, 6pm') can't drive the countdown or JSON-LD — always a datetime with offset.
560
556
  - End before start isn't caught today (gap: cross-field validation).
561
557
 
562
- Not carried by a stored component: ai, category.
563
-
564
558
  ### Personalized hero (audiences + A/B) (`hero-personalized`)
565
559
 
566
560
  Tags: personalization, conditional, repeater, validation, deep-nesting. Proves: Default content + audience versions that override only what they set · rule types with conditional inputs · an experiment split
@@ -580,8 +574,6 @@ Tags: personalization, conditional, repeater, validation, deep-nesting. Proves:
580
574
  - Two audiences that both match: order decides; the converter must preserve the source's precedence.
581
575
  - Personalized copy must not be indexed as the canonical content — crawlers see Everyone.
582
576
 
583
- Not carried by a stored component: ai, category.
584
-
585
577
  ## Features & storytelling
586
578
 
587
579
  ### Icon feature grid (`feature-icon-grid`)
@@ -603,7 +595,7 @@ Tags: repeater, variants, validation, localized. Proves: Bounded repeater · per
603
595
  - Feature cards with large photos are an image card grid, not this block.
604
596
  - Icon fonts with ligatures (Material Symbols) store the icon as TEXT content — read the text, not the class.
605
597
 
606
- Not carried by a stored component: ai, category, variants.
598
+ Not carried by a stored component: variants.
607
599
 
608
600
  ### Alternating feature rows (`feature-alternating-rows`)
609
601
 
@@ -623,7 +615,7 @@ Tags: repeater, conditional, media-heavy, variants, rich-text. Proves: Per-row m
623
615
  - Storing `side` on every row breaks the zigzag the moment rows are reordered — store `auto` unless the source deliberately breaks the pattern.
624
616
  - Autoplay videos without a poster flash black; always extract or generate a poster.
625
617
 
626
- Not carried by a stored component: ai, category, variants.
618
+ Not carried by a stored component: variants.
627
619
 
628
620
  ### Feature bento (responsive spans) (`bento-feature-showcase`)
629
621
 
@@ -644,7 +636,7 @@ Tags: slots, responsive-layout, conditional, media-heavy, variants. Proves: Slot
644
636
  - Phones stack cells; if the source reorders them with CSS `order`, capture it or the story reads out of order.
645
637
  - 6-column variants need spans up to 6; validate spans against the variant's column count.
646
638
 
647
- Not carried by a stored component: ai, category, variants.
639
+ Not carried by a stored component: variants.
648
640
 
649
641
  ### Steps / how it works (`steps-how-it-works`)
650
642
 
@@ -663,7 +655,7 @@ Tags: repeater, variants, validation. Proves: Order is the number (never stored)
663
655
  - Never store the number as content — the converter must strip it, otherwise reordering shows “3, 1, 2”.
664
656
  - HowTo rich results were retired by Google; do not emit HowTo JSON-LD for this block.
665
657
 
666
- Not carried by a stored component: ai, category, variants.
658
+ Not carried by a stored component: variants.
667
659
 
668
660
  ### Timeline / company history (`timeline-company-history`)
669
661
 
@@ -683,7 +675,7 @@ Tags: repeater, conditional, media-heavy, validation, rich-text. Proves: Date pr
683
675
  - Storing “2014” in a date field becomes 2014-01-01 and later renders as “Jan 1, 2014”.
684
676
  - Two milestones with the same year keep their array order as the tie-breaker — keep the array roughly sorted.
685
677
 
686
- Not carried by a stored component: ai, category, variants.
678
+ Not carried by a stored component: variants.
687
679
 
688
680
  ### Tabs with media (`tabs-with-media`)
689
681
 
@@ -703,7 +695,7 @@ Tags: repeater, conditional, media-heavy, variants, a11y, localized. Proves: Fix
703
695
  - Auto-advancing tabs must stop on interaction and respect reduced motion — the renderer handles it; never model a “pause” field.
704
696
  - Tab labels longer than ~20 characters wrap on the top variant and break the underline.
705
697
 
706
- Not carried by a stored component: ai, category, variants.
698
+ Not carried by a stored component: variants.
707
699
 
708
700
  ### Accordion features with image swap (`accordion-feature-image-swap`)
709
701
 
@@ -722,7 +714,7 @@ Tags: repeater, media-heavy, a11y, variants, rich-text. Proves: One required ima
722
714
  - Images of different aspect ratios cause the layout to jump on every click — warn when the source images differ.
723
715
  - Do not tag these rows as FAQ structured data — they are not questions.
724
716
 
725
- Not carried by a stored component: ai, category, variants.
717
+ Not carried by a stored component: variants.
726
718
 
727
719
  ### Comparison vs competitors (`comparison-vs-competitors`)
728
720
 
@@ -744,7 +736,7 @@ Tags: deep-nesting, conditional, repeater, validation, a11y, variants. Proves: B
744
736
  - Icons without text alternatives fail screen readers; the enum lets the renderer output “Included”/“Not included”.
745
737
  - Comparative claims without a date and source are a legal risk — `verifiedOn` is required on purpose.
746
738
 
747
- Not carried by a stored component: ai, category, variants.
739
+ Not carried by a stored component: variants.
748
740
 
749
741
  ### Stats band (`stats-band`)
750
742
 
@@ -764,7 +756,7 @@ Tags: repeater, validation, variants, a11y, localized. Proves: Numbers stored as
764
756
  - Scraping during a count-up animation captures “0” — read the data attribute or wait for the final value.
765
757
  - “1.2M” is value 1.2 + suffix M, not 1200000 with no suffix, unless the design formats compact numbers itself.
766
758
 
767
- Not carried by a stored component: ai, category, variants.
759
+ Not carried by a stored component: variants.
768
760
 
769
761
  ### Manifesto / pull quote (`manifesto-pull-quote`)
770
762
 
@@ -783,7 +775,7 @@ Tags: conditional, rich-text, variants, localized. Proves: Mode select swaps an
783
775
  - Quotation marks typed into content double up with the design's quotes — strip them.
784
776
  - Lines split by `<br>` inside one paragraph are still separate lines.
785
777
 
786
- Not carried by a stored component: category, variants.
778
+ Not carried by a stored component: variants.
787
779
 
788
780
  ### Problem → solution (`problem-solution`)
789
781
 
@@ -801,7 +793,7 @@ Tags: repeater, variants, validation. Proves: Pairs keep both columns aligned ·
801
793
  **Pitfalls.**
802
794
  - Unequal lists in the source must not be silently truncated — flag them.
803
795
 
804
- Not carried by a stored component: ai, category, variants.
796
+ Not carried by a stored component: variants.
805
797
 
806
798
  ### Integrations grid (`integrations-grid`)
807
799
 
@@ -820,7 +812,7 @@ Tags: dynamic-query, references, conditional, variants, media-heavy. Proves: Dyn
820
812
  - Brand logos have usage rules — keep the original SVG, never recolor it in content; `isMonochrome` is a render-time filter.
821
813
  - Category options cannot come from a sibling array in our schema, which is exactly why categories are a referenced collection.
822
814
 
823
- Not carried by a stored component: ai, category, variants.
815
+ Not carried by a stored component: variants.
824
816
 
825
817
  ## Social proof
826
818
 
@@ -843,7 +835,7 @@ Tags: references, dynamic-query, conditional, variants, validation. Proves: Refe
843
835
  - Grids look broken with 4 or 5 items in a 3-column layout; validation nudges multiples of 3.
844
836
  - Do not emit Review JSON-LD for testimonials about your own business — Google ignores self-serving reviews.
845
837
 
846
- Not carried by a stored component: ai, category, variants.
838
+ Not carried by a stored component: variants.
847
839
 
848
840
  ### Video testimonial slider (`testimonial-video-slider`)
849
841
 
@@ -863,7 +855,7 @@ Tags: media-heavy, a11y, conditional, repeater, variants, references, validation
863
855
  - Hosted MP4s with no captions file fail accessibility — the converter must flag, not skip, them.
864
856
  - Autoplaying a slider while a video plays is hostile; the renderer pauses advance once any video starts.
865
857
 
866
- Not carried by a stored component: ai, category, variants.
858
+ Not carried by a stored component: variants.
867
859
 
868
860
  ### Wall of love (`wall-of-love`)
869
861
 
@@ -883,7 +875,7 @@ Tags: polymorphic-array, repeater, validation, media-heavy, a11y. Proves: Polymo
883
875
  - Third-party embed scripts (twitter widgets.js) slow the page and break when posts are deleted — store the content, link the original.
884
876
  - Reposting customer photos without permission is a copyright problem; the required flag forces the question.
885
877
 
886
- Not carried by a stored component: ai, category, variants.
878
+ Not carried by a stored component: variants.
887
879
 
888
880
  ### Case study cards (`case-study-cards`)
889
881
 
@@ -902,7 +894,7 @@ Tags: references, dynamic-query, conditional, variants. Proves: Array of objects
902
894
  - Copying the card title/logo into the section duplicates the story — reference it, override only what differs.
903
895
  - `col_case_studies` must exist before import; create the collection first in the conversion plan.
904
896
 
905
- Not carried by a stored component: ai, category, variants.
897
+ Not carried by a stored component: variants.
906
898
 
907
899
  ### Logo cloud (`logo-cloud`)
908
900
 
@@ -922,7 +914,7 @@ Tags: repeater, variants, a11y, validation, conditional, media-heavy. Proves: Gr
922
914
  - Alt text like “logo” or empty alt on linked logos fails a11y; the required name fixes it.
923
915
  - Conditions on `_variant` work today because the variant is stored on the block value — this is a schema-language gap worth making official.
924
916
 
925
- Not carried by a stored component: category, item openMode, variants.
917
+ Not carried by a stored component: item openMode, variants.
926
918
 
927
919
  ### Press mentions (`press-mentions`)
928
920
 
@@ -941,7 +933,7 @@ Tags: repeater, validation, variants, media-heavy, localized. Proves: Quotes tie
941
933
  - Never shorten a quote by paraphrasing — use an ellipsis and keep the source link.
942
934
  - Outlet logos are trademarks; use the outlet's press-kit file and do not recolour it in content.
943
935
 
944
- Not carried by a stored component: category, variants.
936
+ Not carried by a stored component: variants.
945
937
 
946
938
  ### Awards & certifications (`awards-certifications`)
947
939
 
@@ -961,7 +953,7 @@ Tags: conditional, validation, repeater, seo-structured, a11y. Proves: Kind sele
961
953
  - “HIPAA certified” and “GDPR certified” badges are marketing inventions; the converter flags them.
962
954
  - Organization JSON-LD `award` should only list awards, never certifications.
963
955
 
964
- Not carried by a stored component: category, variants.
956
+ Not carried by a stored component: variants.
965
957
 
966
958
  ### Review summary (`review-summary`)
967
959
 
@@ -982,7 +974,7 @@ Tags: seo-structured, references, conditional, validation, a11y, commerce. Prove
982
974
  - Typed-in ratings drift from the real ones; prefer the connected source and show “Synced …” in the UI.
983
975
  - Distribution counts that don't sum to the total look fake; validate the sum.
984
976
 
985
- Not carried by a stored component: category, item openMode, itemNoun (derived), shopify reference, variants.
977
+ Not carried by a stored component: item openMode, itemNoun (derived), shopify reference, variants.
986
978
 
987
979
  ## Media & galleries
988
980
 
@@ -1005,7 +997,7 @@ Tags: media-heavy, a11y, responsive-layout, repeater, validation, localized. Pro
1005
997
  - Credits pasted into captions get translated; keep them in the credit object.
1006
998
  - Empty alt is right for decorative photos but wrong for a portfolio — flag empties for review.
1007
999
 
1008
- Not carried by a stored component: category, variants.
1000
+ Not carried by a stored component: variants.
1009
1001
 
1010
1002
  ### Gallery with category filters (`lightbox-gallery-filters`)
1011
1003
 
@@ -1024,7 +1016,7 @@ Tags: media-heavy, a11y, repeater, validation, localized. Proves: Filters define
1024
1016
  - A photo tagged with a key that no filter defines is invisible under every filter except All — validate keys against the filters.
1025
1017
  - Free-typed keys are error-prone; a select fed by the section's filters is the right control (schema gap).
1026
1018
 
1027
- Not carried by a stored component: category, item openMode, variants.
1019
+ Not carried by a stored component: item openMode, variants.
1028
1020
 
1029
1021
  ### Video section (YouTube · Vimeo · hosted) (`video-section`)
1030
1022
 
@@ -1045,7 +1037,7 @@ Tags: media-heavy, a11y, seo-structured, conditional, validation, embed, localiz
1045
1037
  - Missing uploadDate/duration silently drops the video from rich results — they are required for that reason.
1046
1038
  - Embedding raw YouTube iframes costs ~1 MB of JS per video; the renderer uses a facade until play.
1047
1039
 
1048
- Not carried by a stored component: category, item openMode, variants.
1040
+ Not carried by a stored component: item openMode, variants.
1049
1041
 
1050
1042
  ### Before / after slider (`before-after-slider`)
1051
1043
 
@@ -1064,7 +1056,7 @@ Tags: media-heavy, a11y, repeater, validation, variants, localized. Proves: Pair
1064
1056
  - Before and after with different crops make the slider useless — dimensions should match (not enforceable in our schema yet).
1065
1057
  - A slider built from a div with mouse events only is not keyboard accessible; the renderer must use a real range input.
1066
1058
 
1067
- Not carried by a stored component: category, variants.
1059
+ Not carried by a stored component: variants.
1068
1060
 
1069
1061
  ### Image with hotspots (shop the look) (`image-hotspots`)
1070
1062
 
@@ -1084,7 +1076,7 @@ Tags: media-heavy, conditional, references, commerce, a11y, validation, variants
1084
1076
  - Copying product price into the note text goes stale; reference the product.
1085
1077
  - Re-cropping the image after placing pins moves every pin. A visual point picker would prevent this (schema gap).
1086
1078
 
1087
- Not carried by a stored component: category, shopify reference, variants.
1079
+ Not carried by a stored component: shopify reference, variants.
1088
1080
 
1089
1081
  ### 3D model / Lottie / 360° embed (`interactive-3d-lottie-embed`)
1090
1082
 
@@ -1105,7 +1097,7 @@ Tags: embed, conditional, media-heavy, a11y, validation, variants. Proves: Embed
1105
1097
  - Iframe embeds from un-vetted hosts are a security hole — the host allow-list is intentional.
1106
1098
  - Lottie animations that loop forever must stop for reduced-motion users; the renderer shows the fallback instead.
1107
1099
 
1108
- Not carried by a stored component: category, variants.
1100
+ Not carried by a stored component: variants.
1109
1101
 
1110
1102
  ### Mixed-media carousel (`mixed-media-carousel`)
1111
1103
 
@@ -1124,7 +1116,7 @@ Tags: polymorphic-array, media-heavy, a11y, responsive-layout, references, condi
1124
1116
  - Loop mode clones slides in the DOM — import only originals.
1125
1117
  - Autoplaying carousels need a pause control and must stop on focus (WCAG 2.2.2); the renderer adds both.
1126
1118
 
1127
- Not carried by a stored component: category, shopify reference, variants.
1119
+ Not carried by a stored component: shopify reference, variants.
1128
1120
 
1129
1121
  ### Full-bleed parallax image with overlay text (`parallax-image-overlay`)
1130
1122
 
@@ -1145,7 +1137,7 @@ Tags: media-heavy, a11y, responsive-layout, variants, conditional. Proves: Art-d
1145
1137
  - Text over a busy photo fails contrast; the overlay help gives a range and the renderer checks contrast.
1146
1138
  - A background-image has no alt — converting to an `<img>` with alt (or decorative) is part of the import.
1147
1139
 
1148
- Not carried by a stored component: ai, category, variants.
1140
+ Not carried by a stored component: variants.
1149
1141
 
1150
1142
  ### Social photo feed (UGC) (`ugc-social-feed`)
1151
1143
 
@@ -1164,7 +1156,7 @@ Tags: dynamic-query, embed, conditional, media-heavy, references, commerce, vali
1164
1156
  - Widget scripts from UGC vendors add 200–500 KB and third-party cookies — replace, don't import.
1165
1157
  - Never mark rightsGranted true on import; only a person can confirm permission.
1166
1158
 
1167
- Not carried by a stored component: category, shopify reference, variants.
1159
+ Not carried by a stored component: shopify reference, variants.
1168
1160
 
1169
1161
  ## Commerce
1170
1162
 
@@ -1189,7 +1181,7 @@ Tags: dynamic-query, commerce, conditional, references, repeater, validation, va
1189
1181
  - Filter values are untyped strings today (price '200' vs 200); the converter must normalize units.
1190
1182
  - excludeCurrent only applies inside a product template; on a static page it is a no-op.
1191
1183
 
1192
- Not carried by a stored component: ai, category, variants.
1184
+ Not carried by a stored component: variants.
1193
1185
 
1194
1186
  ### Product detail page (`commerce-product-detail`)
1195
1187
 
@@ -1213,7 +1205,7 @@ Tags: commerce, deep-nesting, polymorphic-array, conditional, references, media-
1213
1205
  - Variant combinations are typed strings; renaming an option value orphans gallery `forValues` and variant rows.
1214
1206
  - Video posters are required: autoplaying video without a poster hurts LCP on the product page.
1215
1207
 
1216
- Not carried by a stored component: ai, category, kind:entry (props), shopify reference.
1208
+ Not carried by a stored component: shopify reference.
1217
1209
 
1218
1210
  ### Featured product spotlight (`commerce-featured-product`)
1219
1211
 
@@ -1233,7 +1225,7 @@ Tags: references, commerce, variants, conditional, media-heavy, repeater. Proves
1233
1225
  - Copying the product name into `heading` freezes it; renames in Shopify won't flow through.
1234
1226
  - A deleted or archived product leaves the section empty — the renderer hides it and the editor flags the broken reference.
1235
1227
 
1236
- Not carried by a stored component: ai, category, variants.
1228
+ Not carried by a stored component: variants.
1237
1229
 
1238
1230
  ### Collection header + filters (`commerce-collection-header-facets`)
1239
1231
 
@@ -1253,7 +1245,7 @@ Tags: commerce, dynamic-query, references, repeater, conditional, validation, me
1253
1245
  - defaultSort must be one of sortOptions; select options can't depend on another field yet (gap), so it's validated on save.
1254
1246
  - Importing facet values as content makes new colors invisible until someone edits the page.
1255
1247
 
1256
- Not carried by a stored component: ai, category, variants.
1248
+ Not carried by a stored component: variants.
1257
1249
 
1258
1250
  ### Bundle builder (choose N) (`commerce-bundle-builder`)
1259
1251
 
@@ -1273,8 +1265,6 @@ Tags: commerce, conditional, references, repeater, validation. Proves: Eligible
1273
1265
  - min ≤ max and ascending tier quantities can't be enforced by the schema yet (no cross-field rules).
1274
1266
  - The page promise and the Shopify discount can disagree; the converter must flag bundles without a discountCode.
1275
1267
 
1276
- Not carried by a stored component: ai, category.
1277
-
1278
1268
  ### Cart upsell & cross-sell (`commerce-cart-cross-sell`)
1279
1269
 
1280
1270
  Tags: commerce, references, conditional, deep-nesting, personalization, repeater, validation. Proves: Rules array: when (condition type) → then (offer references) with condition-specific inputs · fallback list · placement
@@ -1294,8 +1284,6 @@ Tags: commerce, references, conditional, deep-nesting, personalization, repeater
1294
1284
  - percentOff needs a matching Shopify discount — otherwise the price promised in the cart won't apply at checkout.
1295
1285
  - A rule's trigger can't reference products already in the offer set; 'hideInCart' handles it at render.
1296
1286
 
1297
- Not carried by a stored component: category.
1298
-
1299
1287
  ### Promo banner with code + countdown (`commerce-promo-countdown`)
1300
1288
 
1301
1289
  Tags: commerce, conditional, validation, personalization, variants. Proves: Discount code with pattern validation · fixed-deadline vs per-visitor countdown (conditional) · what happens after it ends · schedule + audience
@@ -1315,7 +1303,7 @@ Tags: commerce, conditional, validation, personalization, variants. Proves: Disc
1315
1303
  - hideAfter earlier than endsAt can't be caught by the schema (no cross-field rules).
1316
1304
  - Evergreen timers that reset on refresh are deceptive; the renderer persists the start per visitor.
1317
1305
 
1318
- Not carried by a stored component: ai, category, variants.
1306
+ Not carried by a stored component: variants.
1319
1307
 
1320
1308
  ### Shop the look (hotspots) (`commerce-shop-the-look`)
1321
1309
 
@@ -1336,7 +1324,7 @@ Tags: media-heavy, references, deep-nesting, repeater, commerce, a11y, validatio
1336
1324
  - Coordinates are raw numbers today — there's no visual point picker bound to the image yet (gap).
1337
1325
  - Dots without labels fail WCAG 4.1.2; the label is required for that reason.
1338
1326
 
1339
- Not carried by a stored component: ai, category, variants.
1327
+ Not carried by a stored component: variants.
1340
1328
 
1341
1329
  ### Size guide table (`commerce-size-guide`)
1342
1330
 
@@ -1358,8 +1346,6 @@ Tags: repeater, validation, a11y, references, media-heavy. Proves: `table` type:
1358
1346
  - Auto-converting inches to cm produces values the brand never published.
1359
1347
  - A size guide pasted as an image fails accessibility; the converter should OCR it into rows and keep the image only as the diagram.
1360
1348
 
1361
- Not carried by a stored component: category.
1362
-
1363
1349
  ### Store locator (`commerce-store-locator`)
1364
1350
 
1365
1351
  Tags: references, dynamic-query, conditional, deep-nesting, repeater, validation, embed, seo-structured. Proves: Locations collection query vs written-here list · geopoint · weekly hours + holiday exceptions with HH:MM validation · map provider settings
@@ -1380,7 +1366,7 @@ Tags: references, dynamic-query, conditional, deep-nesting, repeater, validation
1380
1366
  - Overnight hours (closes 01:00) need care: closes < opens means past midnight.
1381
1367
  - The Locations collection does not exist in the demo seed, so the collection path can't be previewed here.
1382
1368
 
1383
- Not carried by a stored component: category, variants.
1369
+ Not carried by a stored component: variants.
1384
1370
 
1385
1371
  ### Product comparison (2–4) (`commerce-product-comparison`)
1386
1372
 
@@ -1401,8 +1387,6 @@ Tags: references, commerce, deep-nesting, repeater, validation, conditional, a11
1401
1387
  - Keeping `products` and the spec columns in step (add a product → add its column) is the editor's job today; a column source ('one column per item of products') is the follow-up (gap 3).
1402
1388
  - Icon-only cells need text alternatives; Yes / no cells render ✓ plus the words, which is what search and AI read.
1403
1389
 
1404
- Not carried by a stored component: ai, category.
1405
-
1406
1390
  ## Pricing & plans
1407
1391
 
1408
1392
  ### Plans with monthly / yearly switch (`pricing-tiers-billing-toggle`)
@@ -1425,7 +1409,7 @@ Tags: commerce, conditional, validation, repeater, variants. Proves: Both cycle
1425
1409
  - `inherits` is a free string, not a reference to a sibling plan — renaming a plan leaves stale 'Everything in' lines (gap: references within the same entry).
1426
1410
  - Per-seat prices must say 'per seat' near the number, not only in the footnote.
1427
1411
 
1428
- Not carried by a stored component: ai, category, variants.
1412
+ Not carried by a stored component: variants.
1429
1413
 
1430
1414
  ### Usage-based price calculator (`pricing-usage-calculator`)
1431
1415
 
@@ -1447,8 +1431,6 @@ Tags: deep-nesting, repeater, validation, conditional, commerce. Proves: Slider
1447
1431
  - min < start < max is a cross-field rule the schema can't express yet.
1448
1432
  - Graduated vs volume pricing are different maths; this model is graduated only — say so in notes for volume-priced brands.
1449
1433
 
1450
- Not carried by a stored component: category.
1451
-
1452
1434
  ### Full feature comparison matrix (`pricing-feature-matrix`)
1453
1435
 
1454
1436
  Tags: deep-nesting, repeater, conditional, validation, responsive-layout, a11y. Proves: Plans as keyed columns · one `table` keyed by plan key · Yes / no columns with per-row (limits) and per-cell (partial, add-on, soon) types · row groups · price row → Offers JSON-LD · sticky header + mobile mode
@@ -1471,8 +1453,6 @@ Tags: deep-nesting, repeater, conditional, validation, responsive-layout, a11y.
1471
1453
  - Price lines in the header duplicate the plan cards above — they should reference one plan source (gap: plans as CMS items).
1472
1454
  - Icon-only cells need words: Yes / no cells render ✓ / – plus visually hidden 'Included' / 'Not included'.
1473
1455
 
1474
- Not carried by a stored component: category.
1475
-
1476
1456
  ### Single plan with add-ons (`pricing-single-plan-addons`)
1477
1457
 
1478
1458
  Tags: commerce, repeater, conditional, validation, rich-text. Proves: One plan object + add-on array with units, quantities and preselection · eligibility flags · live total
@@ -1492,8 +1472,6 @@ Tags: commerce, repeater, conditional, validation, rich-text. Proves: One plan o
1492
1472
  - A minimum term hidden in small print is a trust killer — it has its own field on purpose.
1493
1473
  - Mixed units (per month + per session) can't be summed into one honest monthly number without an assumption; show the breakdown.
1494
1474
 
1495
- Not carried by a stored component: category.
1496
-
1497
1475
  ### Enterprise contact card (`pricing-enterprise-card`)
1498
1476
 
1499
1477
  Tags: conditional, references, form, repeater, a11y, media-heavy. Proves: Action select → form reference (opens in place) / calendar URL / plain link · compliance badges · customer logos with alt · inline quote
@@ -1512,8 +1490,6 @@ Tags: conditional, references, form, repeater, a11y, media-heavy. Proves: Action
1512
1490
  - Inlining the contact-sales fields into the section creates a second form with separate submissions and rules.
1513
1491
  - Compliance badges are claims; the converter imports them but flags them for a human to confirm.
1514
1492
 
1515
- Not carried by a stored component: ai, category.
1516
-
1517
1493
  ### Pricing FAQ (`pricing-faq`)
1518
1494
 
1519
1495
  Tags: rich-text, seo-structured, conditional, references, repeater, validation. Proves: Grouped questions (written here or FAQs collection) · price tokens in answers so copy never drifts from the plans · FAQPage rich results
@@ -1532,7 +1508,7 @@ Tags: rich-text, seo-structured, conditional, references, repeater, validation.
1532
1508
  - Tokens are plain strings inside rich text — typos aren't caught until preview (gap: typed inline references to plan fields).
1533
1509
  - Two FAQ blocks emitting FAQPage on one URL is invalid; the toggle exists for that.
1534
1510
 
1535
- Not carried by a stored component: ai, category, variants.
1511
+ Not carried by a stored component: variants.
1536
1512
 
1537
1513
  ### Pay-yearly savings banner (`pricing-annual-savings-banner`)
1538
1514
 
@@ -1551,8 +1527,6 @@ Tags: personalization, conditional, validation, commerce. Proves: Savings expres
1551
1527
  - The saving isn't computed from the actual plan prices (no computed fields) — a price change can make the banner untrue.
1552
1528
  - Targeting signed-in members needs the portal integration; without it the banner silently shows to no one.
1553
1529
 
1554
- Not carried by a stored component: ai, category.
1555
-
1556
1530
  ## Conversion & forms
1557
1531
 
1558
1532
  ### CTA band (`conversion-cta-band`)
@@ -1573,7 +1547,7 @@ Tags: variants, conditional, media-heavy. Proves: Variants that swap layout with
1573
1547
  - Fields can't be conditioned on the variant (gap) — `image` is always visible and its help explains why.
1574
1548
  - Hard-coded hex colors break dark mode and brand updates; map to tokens.
1575
1549
 
1576
- Not carried by a stored component: ai, category, variants.
1550
+ Not carried by a stored component: variants.
1577
1551
 
1578
1552
  ### Newsletter sign-up with consent (`conversion-newsletter-consent`)
1579
1553
 
@@ -1594,7 +1568,7 @@ Tags: form, references, conditional, validation, a11y, repeater. Proves: The sim
1594
1568
  - A pre-ticked consent box is not valid consent under GDPR — the option says 'Unticked'.
1595
1569
  - Submit is a string, not `type: button`: our button unit is label + LINK, and a submit action has no link (gap: action buttons).
1596
1570
 
1597
- Not carried by a stored component: ai, category, variants.
1571
+ Not carried by a stored component: variants.
1598
1572
 
1599
1573
  ### Lead capture form + success state (`conversion-lead-capture`)
1600
1574
 
@@ -1616,7 +1590,7 @@ Tags: form, references, conditional, repeater, validation, rich-text. Proves: Fo
1616
1590
  - Redirect pages must exist and be noindexed natively — never add a robots field to the section.
1617
1591
  - Token names in hidden fields are free strings; a typo silently sends an empty value.
1618
1592
 
1619
- Not carried by a stored component: ai, category, variants.
1593
+ Not carried by a stored component: variants.
1620
1594
 
1621
1595
  ### Multi-step form (`conversion-multi-step-form`)
1622
1596
 
@@ -1638,8 +1612,6 @@ Tags: form, polymorphic-array, deep-nesting, conditional, validation, references
1638
1612
  - Inline-built forms fork submissions and notifications from the Forms area; keep them rare.
1639
1613
  - Persisting answers in localStorage is a privacy risk for health data.
1640
1614
 
1641
- Not carried by a stored component: category.
1642
-
1643
1615
  ### Booking / reservations embed (`conversion-booking-embed`)
1644
1616
 
1645
1617
  Tags: embed, conditional, repeater, validation, media-heavy, rich-text. Proves: Provider select → provider-specific ids (conditional) · experiences array with party-size range and deposits · large-party handoff
@@ -1659,8 +1631,6 @@ Tags: embed, conditional, repeater, validation, media-heavy, rich-text. Proves:
1659
1631
  - partyMin ≤ partyMax is a cross-field rule the schema can't express (gap).
1660
1632
  - Widget heights vary by provider; the renderer reserves space to avoid layout shift.
1661
1633
 
1662
- Not carried by a stored component: category.
1663
-
1664
1634
  ### Waitlist with referral rewards (`conversion-waitlist-referral`)
1665
1635
 
1666
1636
  Tags: form, references, conditional, repeater, validation, media-heavy. Proves: Reuses one form with a list tag · referral reward ladder · share channels + message token · an honest signup counter with a minimum
@@ -1681,8 +1651,6 @@ Tags: form, references, conditional, repeater, validation, media-heavy. Proves:
1681
1651
  - Static 'join 12,000 others' numbers are often invented; the schema doesn't allow typing one.
1682
1652
  - {{position}} only makes sense with referrals on; the editor warns when it's used without them.
1683
1653
 
1684
- Not carried by a stored component: ai, category.
1685
-
1686
1654
  ### Contact section (`conversion-contact-section`)
1687
1655
 
1688
1656
  Tags: form, references, repeater, conditional, embed, variants, a11y. Proves: Channel cards with typed links (email / phone / chat / visit) · form reference · optional map pin + address · layout variants
@@ -1701,7 +1669,7 @@ Tags: form, references, repeater, conditional, embed, variants, a11y. Proves: Ch
1701
1669
  - Email addresses and phone numbers duplicated across header, footer and contact drift apart — prefer site settings + references (gap: global values referenced from sections).
1702
1670
  - Address must be text as well as a pin; maps aren't accessible on their own.
1703
1671
 
1704
- Not carried by a stored component: category, variants.
1672
+ Not carried by a stored component: variants.
1705
1673
 
1706
1674
  ### Quiz / product finder (`conversion-quiz-product-finder`)
1707
1675
 
@@ -1722,8 +1690,6 @@ Tags: deep-nesting, conditional, references, repeater, validation, form, persona
1722
1690
  - Picture-card images can't be shown/hidden by the PARENT question's style (gap: parent-scoped conditions), so the image field is always visible with an explaining hint.
1723
1691
  - A gate that hides results until an email is given is a dark pattern; results always show.
1724
1692
 
1725
- Not carried by a stored component: ai, category.
1726
-
1727
1693
  ### Exit-intent popup (`conversion-exit-intent-popup`)
1728
1694
 
1729
1695
  Tags: conditional, personalization, form, references, validation, a11y, media-heavy. Proves: Trigger rules (exit / delay / scroll / click) with per-trigger inputs · page targeting · frequency capping · offer as code / form / link
@@ -1744,8 +1710,6 @@ Tags: conditional, personalization, form, references, validation, a11y, media-he
1744
1710
  - Never show on /checkout — it's in the default excludes.
1745
1711
  - Focus must move into the dialog and return on close; that's the renderer's job, so there's no field for it.
1746
1712
 
1747
- Not carried by a stored component: ai, category, kind:global.
1748
-
1749
1713
  ### Trust badges & guarantees row (`conversion-trust-badges`)
1750
1714
 
1751
1715
  Tags: repeater, a11y, variants, conditional, validation, media-heavy. Proves: Typed badges (guarantee / shipping / certification…) with logo only when certified · payment icons as a multiselect · a synced review score that can't be typed
@@ -1765,7 +1729,7 @@ Tags: repeater, a11y, variants, conditional, validation, media-heavy. Proves: Ty
1765
1729
  - Payment icons for methods not enabled at checkout are a common trust-breaker.
1766
1730
  - Icon-only badges need text; the title is required.
1767
1731
 
1768
- Not carried by a stored component: category, variants.
1732
+ Not carried by a stored component: variants.
1769
1733
 
1770
1734
  ## Listings & feeds
1771
1735
 
@@ -1791,7 +1755,7 @@ Tags: dynamic-query, references, conditional, variants, validation. Proves: A li
1791
1755
  - pageSize that isn't a multiple of columns leaves a ragged last row.
1792
1756
  - A topic-scoped index (/journal/topic/camp) is a page template on the Topics collection, not a copy of this section per topic.
1793
1757
 
1794
- Not carried by a stored component: ai, category, variants.
1758
+ Not carried by a stored component: variants.
1795
1759
 
1796
1760
  ### Category filter bar (`category-filter-bar`)
1797
1761
 
@@ -1813,7 +1777,7 @@ Tags: references, dynamic-query, conditional, variants, responsive-layout, a11y.
1813
1777
  - Counts that include drafts or future posts — counts must use the published query.
1814
1778
  - Wrapping 12 chips on a phone pushes the list below the fold.
1815
1779
 
1816
- Not carried by a stored component: category, variants.
1780
+ Not carried by a stored component: variants.
1817
1781
 
1818
1782
  ### Related posts (`related-posts`)
1819
1783
 
@@ -1835,7 +1799,7 @@ Tags: conditional, references, dynamic-query, validation, variants. Proves: Auto
1835
1799
  - Picking the current post (self-reference) — the renderer must skip it.
1836
1800
  - Unpublished picks: the reference resolves only to published entries on the live site.
1837
1801
 
1838
- Not carried by a stored component: category, variants.
1802
+ Not carried by a stored component: variants.
1839
1803
 
1840
1804
  ### Resource library (`resource-library`)
1841
1805
 
@@ -1858,7 +1822,7 @@ Tags: dynamic-query, repeater, conditional, references, form, validation, respon
1858
1822
  - Gating every type (including blog-like guides) hurts organic traffic; gate by type.
1859
1823
  - Pinned items that also match the filters appear twice unless the renderer de-duplicates.
1860
1824
 
1861
- Not carried by a stored component: ai, category, variants.
1825
+ Not carried by a stored component: variants.
1862
1826
 
1863
1827
  ### Podcast episode list (`podcast-episode-list`)
1864
1828
 
@@ -1880,7 +1844,7 @@ Tags: dynamic-query, media-heavy, references, conditional, repeater, embed, a11y
1880
1844
  - Two players playing at once when several inline players exist — the renderer must use one shared player.
1881
1845
  - Trailers at the top of a 'newest' list unless types excludes them.
1882
1846
 
1883
- Not carried by a stored component: category, variants.
1847
+ Not carried by a stored component: variants.
1884
1848
 
1885
1849
  ### Changelog (`changelog`)
1886
1850
 
@@ -1903,7 +1867,7 @@ Tags: deep-nesting, repeater, conditional, rich-text, validation, dynamic-query,
1903
1867
  - Version strings with spaces or dates as versions collide as anchors.
1904
1868
  - 60+ releases inline makes the section slow to edit — move to the collection.
1905
1869
 
1906
- Not carried by a stored component: category, segmented fallback, variants.
1870
+ Not carried by a stored component: variants.
1907
1871
 
1908
1872
  ### Public roadmap (`public-roadmap`)
1909
1873
 
@@ -1926,7 +1890,7 @@ Tags: deep-nesting, repeater, conditional, references, form, validation. Proves:
1926
1890
  - Editable vote counts invite fake numbers — keep votes read-only.
1927
1891
  - Dates as promises ('Ships Oct 3') — use quarters.
1928
1892
 
1929
- Not carried by a stored component: category, variants.
1893
+ Not carried by a stored component: variants.
1930
1894
 
1931
1895
  ### Search results page (`search-results-page`)
1932
1896
 
@@ -1948,7 +1912,7 @@ Tags: dynamic-query, references, conditional, repeater, validation, a11y. Proves
1948
1912
  - A label-less search input fails WCAG 1.3.1 / 4.1.2 — label is required.
1949
1913
  - Search pages must be noindex — the platform does it natively; never add a field for it.
1950
1914
 
1951
- Not carried by a stored component: category, shopify reference, variants.
1915
+ Not carried by a stored component: shopify reference, variants.
1952
1916
 
1953
1917
  ## Long-form & docs
1954
1918
 
@@ -1974,8 +1938,6 @@ Tags: rich-text, references, media-heavy, embed, conditional, validation, seo-st
1974
1938
  - Sponsored links without rel=sponsored — set by the sponsorLink default.
1975
1939
  - updatedAt bumped for typo fixes makes every post look fresh and erodes trust.
1976
1940
 
1977
- Not carried by a stored component: ai, category, kind:entry (props).
1978
-
1979
1941
  ### Author bio (`author-bio`)
1980
1942
 
1981
1943
  Tags: references, conditional, variants, dynamic-query, a11y. Proves: One reference drives photo, name, role, bio and socials · per-placement bio override · latest posts by that author
@@ -1996,7 +1958,7 @@ Tags: references, conditional, variants, dynamic-query, a11y. Proves: One refere
1996
1958
  - 'Latest posts' listing the current post.
1997
1959
  - Two authors: the box must render both or say why only the first.
1998
1960
 
1999
- Not carried by a stored component: category, variants.
1961
+ Not carried by a stored component: variants.
2000
1962
 
2001
1963
  ### Docs page (`docs-page`)
2002
1964
 
@@ -2020,8 +1982,6 @@ Tags: rich-text, references, global-synced, conditional, embed, validation. Prov
2020
1982
  - Deprecated without a replacement link — the reader is stranded.
2021
1983
  - Relative links (../guides/x) must be rewritten to page references on import.
2022
1984
 
2023
- Not carried by a stored component: category, kind:entry (props).
2024
-
2025
1985
  ### Code tabs (`code-tabs`)
2026
1986
 
2027
1987
  Tags: embed, repeater, validation, variants. Proves: One example in N languages · language is a select, not a free label · tabs sync across the page by key
@@ -2042,7 +2002,7 @@ Tags: embed, repeater, validation, variants. Proves: One example in N languages
2042
2002
  - API keys in sample code — replace real-looking secrets with $ENV placeholders.
2043
2003
  - The `code` field's built-in language list (html/css/js/liquid/json) doesn't cover API languages — the select carries it.
2044
2004
 
2045
- Not carried by a stored component: category, variants.
2005
+ Not carried by a stored component: variants.
2046
2006
 
2047
2007
  ### Knowledge-base article (`kb-article`)
2048
2008
 
@@ -2064,8 +2024,6 @@ Tags: rich-text, form, conditional, references, validation. Proves: 'Was this he
2064
2024
  - No owner → stale answers nobody reviews.
2065
2025
  - Plan badges as body text drift from pricing — use appliesTo.
2066
2026
 
2067
- Not carried by a stored component: category, kind:entry (props).
2068
-
2069
2027
  ### Glossary A–Z (`glossary`)
2070
2028
 
2071
2029
  Tags: dynamic-query, repeater, conditional, references, seo-structured, a11y, validation. Proves: Terms written here or from a Glossary collection · auto letter index · aliases and see-also links · each term deep-linkable
@@ -2086,7 +2044,7 @@ Tags: dynamic-query, repeater, conditional, references, seo-structured, a11y, va
2086
2044
  - 300 inline terms is the ceiling — beyond that, use the collection.
2087
2045
  - Localised term lists re-sort per language (Ä, Ø, Ł) — sort with the locale's collation.
2088
2046
 
2089
- Not carried by a stored component: category, variants.
2047
+ Not carried by a stored component: variants.
2090
2048
 
2091
2049
  ### Recipe (`recipe`)
2092
2050
 
@@ -2110,7 +2068,7 @@ Tags: deep-nesting, repeater, seo-structured, media-heavy, conditional, referenc
2110
2068
  - Dietary claims set at recipe level while an optional ingredient breaks them.
2111
2069
  - Timer fields filled but hasTimer off — hidden values still ship unless cleared on save.
2112
2070
 
2113
- Not carried by a stored component: category, kind:entry (props), shopify reference.
2071
+ Not carried by a stored component: shopify reference.
2114
2072
 
2115
2073
  ### Course curriculum (`course-curriculum`)
2116
2074
 
@@ -2132,7 +2090,7 @@ Tags: deep-nesting, repeater, conditional, references, validation, media-heavy,
2132
2090
  - Live lesson times stored in local time without a zone.
2133
2091
  - Five levels inline (course → module → lesson → resource → file) — keep resources tiny and inline.
2134
2092
 
2135
- Not carried by a stored component: category, segmented fallback, variants.
2093
+ Not carried by a stored component: variants.
2136
2094
 
2137
2095
  ### Legal / policy page (`legal-policy`)
2138
2096
 
@@ -2155,8 +2113,6 @@ Tags: deep-nesting, repeater, rich-text, validation, conditional, a11y, localize
2155
2113
  - 'Last updated' bumped for typos implies the terms changed.
2156
2114
  - Localized policies must be reviewed per locale, not machine-translated — flag localized fields.
2157
2115
 
2158
- Not carried by a stored component: category, kind:entry (props).
2159
-
2160
2116
  ### Case study (`case-study`)
2161
2117
 
2162
2118
  Tags: rich-text, repeater, references, conditional, media-heavy, validation. Proves: Customer facts as an object · headline metrics repeater · challenge/solution/results as three rich-text bodies · quote written here or referenced
@@ -2178,8 +2134,6 @@ Tags: rich-text, repeater, references, conditional, media-heavy, validation. Pro
2178
2134
  - Customer logos as JPG with a white box — ask for SVG/transparent PNG.
2179
2135
  - Duplicate quotes typed in three places drift — reference Testimonials.
2180
2136
 
2181
- Not carried by a stored component: ai, category, kind:entry (props).
2182
-
2183
2137
  ### Podcast episode (`podcast-episode`)
2184
2138
 
2185
2139
  Tags: media-heavy, embed, references, repeater, seo-structured, a11y, validation, conditional. Proves: Audio file + show notes + timestamped chapters + transcript (a11y) · guests by reference · feeds the RSS and PodcastEpisode JSON-LD
@@ -2201,8 +2155,6 @@ Tags: media-heavy, embed, references, repeater, seo-structured, a11y, validation
2201
2155
  - Missing transcript fails accessibility and loses search traffic.
2202
2156
  - Changing the audio file URL after publish re-downloads in every subscriber's app — replace in place.
2203
2157
 
2204
- Not carried by a stored component: category, kind:entry (props).
2205
-
2206
2158
  ## Company & people
2207
2159
 
2208
2160
  ### Team grid (`team-grid`)
@@ -2225,7 +2177,7 @@ Tags: references, dynamic-query, conditional, variants, a11y, validation. Proves
2225
2177
  - Former employees lingering — set end dates, keep excludeAlumni on.
2226
2178
  - Department tabs with one person each look broken — hide tabs under ~12 people.
2227
2179
 
2228
- Not carried by a stored component: category, variants.
2180
+ Not carried by a stored component: variants.
2229
2181
 
2230
2182
  ### Leadership with bios (`leadership-bios`)
2231
2183
 
@@ -2247,7 +2199,7 @@ Tags: references, conditional, rich-text, repeater, variants, a11y. Proves: Grou
2247
2199
  - Bios in first person on one page and third on another — the override exists for this.
2248
2200
  - Investor logos mixed into this section — they belong in a logo wall.
2249
2201
 
2250
- Not carried by a stored component: category, variants.
2202
+ Not carried by a stored component: variants.
2251
2203
 
2252
2204
  ### Values & culture (`values-culture`)
2253
2205
 
@@ -2268,7 +2220,7 @@ Tags: repeater, media-heavy, variants, validation, a11y. Proves: Values with a r
2268
2220
  - Perks with prices or policies that change — keep them short and dated in HR, not here.
2269
2221
  - Nine-value lists — validation caps at eight; past five, nobody remembers them.
2270
2222
 
2271
- Not carried by a stored component: ai, category, variants.
2223
+ Not carried by a stored component: variants.
2272
2224
 
2273
2225
  ### Careers list (`careers-list`)
2274
2226
 
@@ -2290,7 +2242,7 @@ Tags: dynamic-query, conditional, references, variants, embed. Proves: Open role
2290
2242
  - ATS iframes are unstyled and invisible to search — prefer the sync.
2291
2243
  - Salary on the row but not on the job page (or vice versa) — one source: the job entry.
2292
2244
 
2293
- Not carried by a stored component: category, variants.
2245
+ Not carried by a stored component: variants.
2294
2246
 
2295
2247
  ### Job posting (`job-posting`)
2296
2248
 
@@ -2313,8 +2265,6 @@ Tags: seo-structured, conditional, references, repeater, validation, form. Prove
2313
2265
  - Closed roles deleted instead of closed: their URLs 404 and lose links. Close them.
2314
2266
  - Benefits retyped on every job drift — use the shared block.
2315
2267
 
2316
- Not carried by a stored component: category, kind:entry (props).
2317
-
2318
2268
  ### About & mission with timeline (`about-timeline`)
2319
2269
 
2320
2270
  Tags: repeater, media-heavy, rich-text, references, variants, validation. Proves: Mission + story (rich text) · founders by reference · stats · dated milestones with optional photo and link · order and orientation as design
@@ -2334,7 +2284,7 @@ Tags: repeater, media-heavy, rich-text, references, variants, validation. Proves
2334
2284
  - A timeline of 30 tiny events — the cap is 30; most stories need 6–10.
2335
2285
  - Founder bios duplicated here — reference people instead.
2336
2286
 
2337
- Not carried by a stored component: ai, category, variants.
2287
+ Not carried by a stored component: variants.
2338
2288
 
2339
2289
  ### Press & brand kit (`press-kit`)
2340
2290
 
@@ -2356,7 +2306,7 @@ Tags: deep-nesting, repeater, media-heavy, conditional, validation, a11y. Proves
2356
2306
  - Photos without credits get printed uncredited — credit is required for photos.
2357
2307
  - A stale .zip that no longer matches the assets shown.
2358
2308
 
2359
- Not carried by a stored component: category, variants.
2309
+ Not carried by a stored component: variants.
2360
2310
 
2361
2311
  ## Events & places
2362
2312
 
@@ -2380,7 +2330,7 @@ Tags: dynamic-query, conditional, variants, references, a11y. Proves: Upcoming /
2380
2330
  - Deleting past events loses their recordings and links — keep them, the list hides them.
2381
2331
  - Calendar variant with three events looks empty — use the list until there are ~8 a month.
2382
2332
 
2383
- Not carried by a stored component: category, variants.
2333
+ Not carried by a stored component: variants.
2384
2334
 
2385
2335
  ### Event detail (conference) (`event-detail`)
2386
2336
 
@@ -2404,8 +2354,6 @@ Tags: deep-nesting, references, seo-structured, conditional, commerce, repeater,
2404
2354
  - Cancelled events deleted rather than marked — Google keeps showing the old date.
2405
2355
  - Sold-out early-bird tiers left 'On sale' after salesEnd — use the window, not the badge.
2406
2356
 
2407
- Not carried by a stored component: category, kind:entry (props).
2408
-
2409
2357
  ### Webinar registration (`webinar-registration`)
2410
2358
 
2411
2359
  Tags: form, conditional, references, embed, validation, variants. Proves: One section across the lifecycle: upcoming (form) → live (stream) → on demand (recording, optionally gated) · CRM campaign locked
@@ -2426,7 +2374,7 @@ Tags: form, conditional, references, embed, validation, variants. Proves: One se
2426
2374
  - Leaving stage 'live' after the event — the page shows a dead stream.
2427
2375
  - Gating on-demand recordings of public talks lowers reach; gate deliberately.
2428
2376
 
2429
- Not carried by a stored component: ai, category, variants.
2377
+ Not carried by a stored component: variants.
2430
2378
 
2431
2379
  ### Locations directory (`locations-directory`)
2432
2380
 
@@ -2450,7 +2398,7 @@ Tags: dynamic-query, conditional, repeater, deep-nesting, validation, a11y, resp
2450
2398
  - Pins at the geocoded centroid of a mall instead of the door.
2451
2399
  - A map without a list fails keyboard and screen-reader users — the list is the primary UI.
2452
2400
 
2453
- Not carried by a stored component: category, variants.
2401
+ Not carried by a stored component: variants.
2454
2402
 
2455
2403
  ### Restaurant menu (`restaurant-menu`)
2456
2404
 
@@ -2474,7 +2422,7 @@ Tags: deep-nesting, repeater, commerce, conditional, variants, localized, valida
2474
2422
  - Prices typed with symbols ('$18') break sorting and JSON-LD.
2475
2423
  - Four nesting levels: keep sizes inline (openMode inline) so the deepest level isn't another drill.
2476
2424
 
2477
- Not carried by a stored component: category, variants.
2425
+ Not carried by a stored component: variants.
2478
2426
 
2479
2427
  ### Single location page (`location-page`)
2480
2428
 
@@ -2498,8 +2446,6 @@ Tags: seo-structured, repeater, conditional, references, media-heavy, a11y, vali
2498
2446
  - A booking widget without a phone fallback excludes people who can't use it.
2499
2447
  - closed defaults to false or new days hide their shifts.
2500
2448
 
2501
- Not carried by a stored component: category, kind:entry (props).
2502
-
2503
2449
  ## Data & interactive
2504
2450
 
2505
2451
  ### Spec table (`data-table-specs`)
@@ -2523,7 +2469,7 @@ Tags: repeater, conditional, validation, a11y. Proves: Typed columns · rows fro
2523
2469
  - Past ~60 rows, keep the data in CSV or a collection; the grid stays usable but the page gets heavy.
2524
2470
  - Do not model 'striped' or 'compact' as booleans — they are variants.
2525
2471
 
2526
- Not carried by a stored component: ai, category, variants.
2472
+ Not carried by a stored component: variants.
2527
2473
 
2528
2474
  ### Table (`table-comparison`)
2529
2475
 
@@ -2544,8 +2490,6 @@ Tags: validation, a11y, seo-structured, references, commerce. Proves: The `table
2544
2490
  - A blank cell in a yes/no column is 'Not included'; a blank cell anywhere else is 'No value'.
2545
2491
  - Don't retype units in cells — the column carries them.
2546
2492
 
2547
- Not carried by a stored component: ai, category.
2548
-
2549
2493
  ### Chart with annotations (`chart-attrition`)
2550
2494
 
2551
2495
  Tags: repeater, conditional, a11y, validation. Proves: Chart type → series → data points (3 levels) · annotations · text alternative required · data from CSV or URL
@@ -2567,7 +2511,7 @@ Tags: repeater, conditional, a11y, validation. Proves: Chart type → series →
2567
2511
  - Color picker accepts any hex; the series palette should be restricted to brand chart tokens for contrast (see section-theme-tokens).
2568
2512
  - Bar charts with a non-zero `yMin` mislead; the help text warns but nothing prevents it.
2569
2513
 
2570
- Not carried by a stored component: ai, category, variants.
2514
+ Not carried by a stored component: variants.
2571
2515
 
2572
2516
  ### ROI calculator (`roi-calculator`)
2573
2517
 
@@ -2590,7 +2534,7 @@ Tags: form, repeater, conditional, validation. Proves: Typed inputs (slider · n
2590
2534
  - SCHEMA GAP: `readOnly: "developer"` is the only field-level permission — no 'finance can edit formulas' role scope.
2591
2535
  - A select's choices need numeric values; a text-only dropdown ("Small team") must be given a number or it breaks the maths.
2592
2536
 
2593
- Not carried by a stored component: ai, category, variants.
2537
+ Not carried by a stored component: variants.
2594
2538
 
2595
2539
  ### Product configurator (`product-configurator`)
2596
2540
 
@@ -2614,7 +2558,7 @@ Tags: commerce, deep-nesting, repeater, conditional, references, validation. Pro
2614
2558
  - SCHEMA GAP: option keys need to be unique within their step only (scoped uniqueness) — `unique` is neither scoped nor enforced.
2615
2559
  - Price deltas drift from Shopify variant prices; prefer reading the variant price and keeping priceDelta only for non-Shopify add-ons.
2616
2560
 
2617
- Not carried by a stored component: ai, category, shopify reference, variants.
2561
+ Not carried by a stored component: shopify reference, variants.
2618
2562
 
2619
2563
  ### Map with markers (`stockist-map`)
2620
2564
 
@@ -2637,7 +2581,7 @@ Tags: repeater, conditional, embed, a11y, references, seo-structured. Proves: Ca
2637
2581
  - SCHEMA GAP: no address type (street, locality, region, postcode, country) — needed for JSON-LD PostalAddress and geocoding; a multi-line text loses structure.
2638
2582
  - Turning off `showList` leaves keyboard and screen-reader users with no way to reach the places.
2639
2583
 
2640
- Not carried by a stored component: ai, category, variants.
2584
+ Not carried by a stored component: variants.
2641
2585
 
2642
2586
  ### Product comparison slider (`product-compare-slider`)
2643
2587
 
@@ -2659,7 +2603,7 @@ Tags: references, repeater, conditional, validation, commerce, responsive-layout
2659
2603
  - SCHEMA GAP: array `unique: true` (no duplicate product) is declared but not enforced by the validator.
2660
2604
  - SCHEMA GAP: custom `values` should have exactly one entry per product (a matrix keyed by another array); adding a fourth product leaves rows with three values and nothing warns.
2661
2605
 
2662
- Not carried by a stored component: ai, category, variants.
2606
+ Not carried by a stored component: variants.
2663
2607
 
2664
2608
  ### Countdown and live counter (`countdown-live-counter`)
2665
2609
 
@@ -2681,7 +2625,7 @@ Tags: conditional, validation, localized, a11y. Proves: Datetime + time zone ·
2681
2625
  - SCHEMA GAP: no 'scheduled content' primitive — after-launch copy should be a scheduled change (release) rather than a second set of fields.
2682
2626
  - Countdowns that reset per visitor are dark patterns (and illegal under EU UCPD guidance); the schema has no per-visitor mode on purpose.
2683
2627
 
2684
- Not carried by a stored component: ai, category, variants.
2628
+ Not carried by a stored component: variants.
2685
2629
 
2686
2630
  ### Poll (`reader-poll`)
2687
2631
 
@@ -2703,7 +2647,7 @@ Tags: form, conditional, repeater, validation, references. Proves: Question type
2703
2647
  - SCHEMA GAP: no read-only, platform-computed fields — editors can't see live tallies inside the schema form; results live in another surface.
2704
2648
  - Multiple-question surveys modelled as nested arrays in a block become an unversioned form builder — use Forms.
2705
2649
 
2706
- Not carried by a stored component: ai, category, variants.
2650
+ Not carried by a stored component: variants.
2707
2651
 
2708
2652
  ### Embed (iframe, HTML, script) (`safe-embed`)
2709
2653
 
@@ -2726,7 +2670,7 @@ Tags: embed, conditional, a11y, validation. Proves: Kind switches URL vs code ·
2726
2670
  - oEmbed providers change markup; store the URL, never the provider's HTML snapshot.
2727
2671
  - allow-scripts + allow-same-origin on a same-origin URL removes the sandbox entirely — the help warns, nothing blocks it.
2728
2672
 
2729
- Not carried by a stored component: category, variants.
2673
+ Not carried by a stored component: variants.
2730
2674
 
2731
2675
  ### Code snippet with tabs (`code-snippet-tabs`)
2732
2676
 
@@ -2748,7 +2692,7 @@ Tags: repeater, validation, conditional, embed. Proves: Tabs per language/packag
2748
2692
  - Highlight ranges aren't checked against the code's line count.
2749
2693
  - Never store highlighted HTML (token spans) — store plain text and highlight at render.
2750
2694
 
2751
- Not carried by a stored component: category, variants.
2695
+ Not carried by a stored component: variants.
2752
2696
 
2753
2697
  ## Advanced patterns
2754
2698
 
@@ -2773,7 +2717,7 @@ Tags: deep-nesting, slots, repeater, variants, media-heavy. Proves: Guide › Ta
2773
2717
  - Breadcrumb at 7 drills (Guide / Seasoning / Steps and kit / Steps / Season over fire… / Heat it upside down / Card / Button) must fold into the Pathway chip on a 380px inspector — this entry is the test case.
2774
2718
  - Accordion item cards inside a 1/3 column are cramped; that's a variant decision, not a field.
2775
2719
 
2776
- Not carried by a stored component: ai, category, variants.
2720
+ Not carried by a stored component: variants.
2777
2721
 
2778
2722
  ### Any-block module list (`polymorphic-modules`)
2779
2723
 
@@ -2795,8 +2739,6 @@ Tags: polymorphic-array, media-heavy, references, rich-text, repeater. Proves: O
2795
2739
  - Changing an item's type (quote → callout) isn't a schema operation; the editor must delete and re-add, losing the _key.
2796
2740
  - A textModule per paragraph is the most common bad conversion — it explodes the list and breaks reading flow.
2797
2741
 
2798
- Not carried by a stored component: ai, category, kind:entry (props).
2799
-
2800
2742
  ### Conditional source matrix (`conditional-source-matrix`)
2801
2743
 
2802
2744
  Tags: conditional, references, dynamic-query, commerce, validation. Proves: Manual / collection / query / external branches · nested conditionals two levels down · empty-state fallback
@@ -2817,7 +2759,7 @@ Tags: conditional, references, dynamic-query, commerce, validation. Proves: Manu
2817
2759
  - SCHEMA GAP: required-if — `maxPrice` is required only when visible; that works because hidden fields skip validation, but 'required when price = between AND minPrice is set' can't be written.
2818
2760
  - minPrice < maxPrice can't be validated (cross-field).
2819
2761
 
2820
- Not carried by a stored component: ai, category, shopify reference, variants.
2762
+ Not carried by a stored component: shopify reference, variants.
2821
2763
 
2822
2764
  ### Global block with per-page overrides (`global-announcement-overrides`)
2823
2765
 
@@ -2839,7 +2781,7 @@ Tags: global-synced, conditional, validation, variants. Proves: Synced fields fr
2839
2781
  - SCHEMA GAP: instance-only fields (visibility, hideReason) live in the same schema as the global's fields; there's no way to say 'this field exists only on instances'.
2840
2782
  - Overriding `tone` on one page makes the bar look broken next to the header; consider locking design fields too.
2841
2783
 
2842
- Not carried by a stored component: ai, category, kind:global, variants.
2784
+ Not carried by a stored component: variants.
2843
2785
 
2844
2786
  ### Localized section with RTL (`localized-section`)
2845
2787
 
@@ -2862,7 +2804,7 @@ Tags: localized, repeater, conditional, a11y, validation. Proves: Localized fiel
2862
2804
  - SCHEMA GAP: no `dir`/`lang` awareness in text fields — the editor won't render the Arabic copy right-to-left while typing.
2863
2805
  - Recommended lengths are per English; German runs ~30% longer and Arabic ~25% shorter, so a single recommendedMax misfires per locale.
2864
2806
 
2865
- Not carried by a stored component: ai, category, variants.
2807
+ Not carried by a stored component: variants.
2866
2808
 
2867
2809
  ### Personalized hero with A/B test (`personalized-hero`)
2868
2810
 
@@ -2885,7 +2827,7 @@ Tags: personalization, deep-nesting, conditional, repeater, validation. Proves:
2885
2827
  - SCHEMA GAP: a variant's hidden `content` is still required-validated by its own rules if `isControl` flips — conditions hide but can't relax `required` declaratively.
2886
2828
  - Personalized copy must not change the H1 for SEO purposes; the native page title stays the default's.
2887
2829
 
2888
- Not carried by a stored component: ai, category, variants.
2830
+ Not carried by a stored component: variants.
2889
2831
 
2890
2832
  ### Responsive layout settings (`responsive-layout-settings`)
2891
2833
 
@@ -2907,7 +2849,7 @@ Tags: responsive-layout, repeater, conditional, variants. Proves: Columns, gap a
2907
2849
  - SCHEMA GAP: `mobileOrder` should be unique among items and ≤ item count — cross-item validation isn't available.
2908
2850
  - Hiding content on phones hides it from mobile-first indexing too; prefer reordering over hiding.
2909
2851
 
2910
- Not carried by a stored component: category, variants.
2852
+ Not carried by a stored component: variants.
2911
2853
 
2912
2854
  ### Grid with per-cell layout (`grid-cell-layout`)
2913
2855
 
@@ -2928,7 +2870,7 @@ Tags: slots, variants, media-heavy, responsive-layout, commerce. Proves: Slot ce
2928
2870
  - SCHEMA GAP: slotSettings can't be conditional on the child's block type (e.g. padding 'none' only for images) and can't vary per breakpoint.
2929
2871
  - Dense packing changes the visual order but not the DOM order — screen readers follow the DOM.
2930
2872
 
2931
- Not carried by a stored component: ai, category, variants.
2873
+ Not carried by a stored component: variants.
2932
2874
 
2933
2875
  ### References web (`references-web`)
2934
2876
 
@@ -2951,7 +2893,7 @@ Tags: references, dynamic-query, conditional, repeater, validation. Proves: Prod
2951
2893
  - SCHEMA GAP: `unique` on reference arrays isn't enforced; the same story can be pinned twice.
2952
2894
  - Referencing pages by id survives slug changes; storing hrefs doesn't.
2953
2895
 
2954
- Not carried by a stored component: category, shopify reference.
2896
+ Not carried by a stored component: shopify reference.
2955
2897
 
2956
2898
  ### Changelog with nested validation (`changelog-nested-validation`)
2957
2899
 
@@ -2974,7 +2916,7 @@ Tags: validation, repeater, conditional, rich-text. Proves: Releases → changes
2974
2916
  - SCHEMA GAP: patterns validate strings only; a `date` can't be constrained (not in the future, after the previous release).
2975
2917
  - Inline packages with three fields each get cramped; the inline openMode threshold (≤3 primitives) is exactly at its limit here.
2976
2918
 
2977
- Not carried by a stored component: category, variants.
2919
+ Not carried by a stored component: variants.
2978
2920
 
2979
2921
  ### Rich text with components and annotations (`rich-text-embedded-components`)
2980
2922
 
@@ -2996,8 +2938,6 @@ Tags: rich-text, references, embed, a11y, media-heavy. Proves: Body with linked
2996
2938
  - SCHEMA GAP: inline references (entry links) are link-picker values serialised into the HTML, so the platform's reference graph can't see them without parsing the body.
2997
2939
  - Footnote numbers in the text are render-time; storing '1', '2' in the markup goes stale when paragraphs move (shown here only for readable fallback).
2998
2940
 
2999
- Not carried by a stored component: ai, category, kind:entry (props).
3000
-
3001
2941
  ### Dynamic query listing (`dynamic-query-listing`)
3002
2942
 
3003
2943
  Tags: dynamic-query, conditional, repeater, references, validation. Proves: Collection + filter rows (field · operator · value) + sort + limit + pagination + pinned + empty state
@@ -3018,7 +2958,7 @@ Tags: dynamic-query, conditional, repeater, references, validation. Proves: Coll
3018
2958
  - SCHEMA GAP: no live query preview/count in the schema (e.g. '7 entries match') and no validation that the query returns anything.
3019
2959
  - SCHEMA GAP: AND/OR groups beyond one level (all of (A, any of (B, C))) can't be modelled without recursive object types — the language has no recursion.
3020
2960
 
3021
- Not carried by a stored component: category, variants.
2961
+ Not carried by a stored component: variants.
3022
2962
 
3023
2963
  ### Modal, drawer and popover (`overlays-with-triggers`)
3024
2964
 
@@ -3041,8 +2981,6 @@ Tags: slots, conditional, a11y, form, repeater, references. Proves: Overlays wit
3041
2981
  - Exit-intent doesn't exist on touch devices; the label says '(desktop)' because the schema can't scope a trigger per device.
3042
2982
  - Focus trap, Esc to close and focus return are renderer requirements, not fields — never make them toggles.
3043
2983
 
3044
- Not carried by a stored component: category.
3045
-
3046
2984
  ### Sticky scroll story (`scrollytelling`)
3047
2985
 
3048
2986
  Tags: media-heavy, repeater, conditional, a11y, variants. Proves: Steps synced to scroll with media swaps (image / video / stat) · trigger offset · reduced-motion and phone fallbacks
@@ -3063,7 +3001,7 @@ Tags: media-heavy, repeater, conditional, a11y, variants. Proves: Steps synced t
3063
3001
  - Videos in sticky panels must be muted and short; there's no duration validation on the video type.
3064
3002
  - Preview `media: "media.image"` is empty for stat/video steps — preview can't fall back across paths.
3065
3003
 
3066
- Not carried by a stored component: ai, category, variants.
3004
+ Not carried by a stored component: variants.
3067
3005
 
3068
3006
  ### Accessibility-critical media and form (`a11y-critical-media-form`)
3069
3007
 
@@ -3086,8 +3024,6 @@ Tags: a11y, media-heavy, form, validation, conditional. Proves: Captions per lan
3086
3024
  - SCHEMA GAP: the sign-up form is modelled inline because forms are a separate system; ideally the block only references the form and the form owns labels/errors.
3087
3025
  - Autoplay over 5 seconds without a pause control fails WCAG 2.2.2; the help warns, nothing blocks it.
3088
3026
 
3089
- Not carried by a stored component: category.
3090
-
3091
3027
  ### Section theme tokens (`section-theme-tokens`)
3092
3028
 
3093
3029
  Tags: variants, conditional, a11y, validation, media-heavy. Proves: Dark section inside a light page · surface + accent override from brand tokens · spacing tokens · all in the Design group
@@ -3108,7 +3044,7 @@ Tags: variants, conditional, a11y, validation, media-heavy. Proves: Dark section
3108
3044
  - SCHEMA GAP: no responsive values for spacing (see responsive-layout-settings).
3109
3045
  - SCHEMA GAP: design fields are repeated per block; a shared, named object type (sectionTheme) can't be referenced by name, only copied.
3110
3046
 
3111
- Not carried by a stored component: category, variants.
3047
+ Not carried by a stored component: variants.
3112
3048
 
3113
3049
  ## Core examples
3114
3050
 
@@ -3131,7 +3067,7 @@ Tags: repeater, conditional, validation, dynamic-query. Proves: Small items stil
3131
3067
  - `open` on the first item is behaviour in the worked example and stays in the template; keep the per-item boolean only if the template reads it.
3132
3068
  - Bind the question on the <h3>, not the <summary>, or a save erases the chevron.
3133
3069
 
3134
- Not carried by a stored component: ai, variants.
3070
+ Not carried by a stored component: variants.
3135
3071
 
3136
3072
  ### Mega menu (`core-megaMenu`)
3137
3073
 
@@ -3152,7 +3088,7 @@ Tags: deep-nesting, repeater, global-synced, validation. Proves: Five levels dee
3152
3088
  - A nav placed on a page as a section renders nowhere, and a page that draws its own header gets no Layout copy on top: remove page-level copies.
3153
3089
  - The worked example keeps `sticky`, colours and height in code; expose the Behaviour props only if the template reads them.
3154
3090
 
3155
- Not carried by a stored component: ai, category, kind:global, variants.
3091
+ Not carried by a stored component: category, variants.
3156
3092
 
3157
3093
  ### Tabs (`core-tabs`)
3158
3094
 
@@ -3172,7 +3108,7 @@ Tags: slots, polymorphic-array, repeater, variants. Proves: Array of tabs, each
3172
3108
  - Slot children are `{ componentId, overrides? }` with no `_variant`: a variant is its own component.
3173
3109
  - Give every block, tab and instance a stable `id`; changing one orphans the edits made against it.
3174
3110
 
3175
- Not carried by a stored component: ai, category, variants.
3111
+ Not carried by a stored component: category, variants.
3176
3112
 
3177
3113
  ### Pricing (`core-pricing`)
3178
3114
 
@@ -3194,7 +3130,7 @@ Tags: repeater, conditional, commerce, variants, validation. Proves: Tiers → f
3194
3130
  - The nested features table is the deepest a prop goes: its rows take scalars only.
3195
3131
  - A tier added to the comparison is a new sub-field, a schema change. No Offer JSON-LD is built from prices; paste it as `schema` on update_page when needed.
3196
3132
 
3197
- Not carried by a stored component: ai, category, variants.
3133
+ Not carried by a stored component: variants.
3198
3134
 
3199
3135
  ### Bento grid (`core-bento`)
3200
3136
 
@@ -3214,7 +3150,7 @@ Tags: slots, polymorphic-array, variants, responsive-layout, media-heavy. Proves
3214
3150
  - A slot child has no `_variant`: a variant is its own component.
3215
3151
  - slotSettings are leaf fields only; a cell's own copy stays in the cell component's props.
3216
3152
 
3217
- Not carried by a stored component: ai, category, variants.
3153
+ Not carried by a stored component: category, variants.
3218
3154
 
3219
3155
  ### Journal story (`core-journalStory`)
3220
3156
 
@@ -3235,7 +3171,7 @@ Tags: rich-text, references, media-heavy, seo-structured, localized, validation,
3235
3171
  - Reading time is computed by the template; no field stores it today, so don't copy "7 min read" into readingTime.
3236
3172
  - Bind the body wrapper as kind `document`, never `richtext`, or a save repaints the article from plain text.
3237
3173
 
3238
- Not carried by a stored component: ai, kind:entry (props), shopify reference.
3174
+ Not carried by a stored component: shopify reference.
3239
3175
 
3240
3176
  ### Hero (`core-hero`)
3241
3177
 
@@ -3256,4 +3192,4 @@ Tags: variants, media-heavy, localized, a11y. Proves: Buttons as one unit · inl
3256
3192
  - object-position is the image's focal point (50% 35% → { x: 0.5, y: 0.35 }); store the number 4.8, never the star glyphs.
3257
3193
  - A variant that renames a key (title vs heading) silently drops that content on a swap.
3258
3194
 
3259
- Not carried by a stored component: ai, variants.
3195
+ Not carried by a stored component: variants.