Zebra Skimmers · Redesign Plan

Data → Design

Mapping the metaobjects, metafields, and shop settings to every UI element on every page in the IA. Companion to the main plan, the schemas document, the spec schema, and the mockups. The point: anyone implementing a section knows exactly which field renders into it.
§ 01

The data layer, grouped by intent.

Six clusters of metaobjects and shop-level metafields. Three are designed and specified — Documents, Relationships, Specs — and three others span Compatibility (uses existing native types), AI (the policy pair), and Shop singletons (admin-editable copy and references). Anything not in this section is either a Shopify primitive (product, variant, collection) or a content type implied by a specific page — see § 04 for the implied set.

✓Spec'd in schema docs ◐Shop / theme setting ◯Future metaobject — see § 04 —Shopify native ×Hardcoded in Liquid
CLUSTER 01 · DOCUMENTS

product_document

Files attached to products — datasheets, manuals, drawings, certifications, SDS. Replaces the per-product PDF page-scrape that gave every product 46 attachments. The 51 unique documents in the catalog become explicit, reusable metaobject entries.

shop→theme.shop_documents
product→theme.documents
variant→theme.documents
type: list<product_document>
FEEDS · D, I, L, M
CLUSTER 02 · CURATED RELATIONSHIPS

product_relationship

Editorial parent-curated links between products — required accessories, replacement parts, frequently-bought-together, upgrade paths. Replaces the empty related_products array on every current product and the prose-only relationship descriptions.

product→theme.related_products
type: list<product_relationship>
relationship_type: accessory · required_accessory · replacement_part · upgrade · ...
FEEDS · D, I
CLUSTER 03 · COMPATIBILITY

fits_products (no metaobject)

Variant-granular compatibility, declared by the child (the part) rather than the parent. The "tube replacement" knows which reach variants it fits; the PDP queries this in reverse to show fitting parts. Uses native variant_reference — no new metaobject type needed.

product→theme.fits_products
type: list<variant_reference>
queried by: products where theme.fits_products contains <current_variant>
FEEDS · D, K, L
CLUSTER 04 · SPECIFICATIONS

product_spec_group · product_spec_row

Structured specification data. Group is the category (Performance, Electrical, etc.); row is the value, with US/metric units, comparable/filterable flags, and variant-override support. Same data feeds PDP spec table, comparison view, collection filters, printable spec sheet, JSON-LD, and the Find Your Fit rules engine.

product→theme.specs
variant→theme.specs (overrides product-level by key)
type: list<product_spec_row>
row.group→product_spec_group
FEEDS · A, D, E, F, G, K
CLUSTER 05 · AI POLICY

ai_policy · ai_crawler_policy

Admin-editable AI metadata. Single-entry ai_policy renders the meta tags in head on every page; multi-entry ai_crawler_policy drives the robots.txt template. Each crawler is one entry that the merchant can enable / disable without code.

shop→theme.ai_policy (single)
shop→theme.ai_crawler_policies
type: list<ai_crawler_policy>
FEEDS · ALL · <head> · robots.txt · /llms.txt
CLUSTER 06 · SHOP SINGLETONS

shop.theme.* (no metaobject)

One-off admin-editable copy and references that don't justify a metaobject. Hero headline, featured product reference, contact info, brand tagline. Shopify shop metafields with theme namespace, accessed via Liquid theme settings or direct metafield reads.

shop.theme.hero_headline
shop.theme.hero_body
shop.theme.featured_product (product_reference)
shop.theme.contact_phone, contact_emails
shop.theme.warranty_intro, warranty_terms
...and similar
FEEDS · A, M, P · all editorial pages
§ 02

Coverage matrix.

Rows are data sources. Columns are the fourteen pages in the IA. A check means the data source materially drives content on that page. The matrix reads diagonally as expected: PDP and Collection are the heaviest consumers; FAQ and Distributors barely touch the existing metaobjects (they need their own — see § 04).

Data source ADEFGHIJKLMNOP
DOCUMENTS · product_document
product.theme.documents ✓·✓✓
variant.theme.documents ✓
shop.theme.shop_documents ·✓✓
RELATIONSHIPS · product_relationship
product.theme.related_products ✓✓
COMPATIBILITY · fits_products
product.theme.fits_products ✓✓✓
SPECIFICATIONS · product_spec_group / row
product.theme.specs ✓✓✓✓✓·✓
variant.theme.specs ✓✓✓✓
product_spec_group (structure) ✓✓✓
AI · ai_policy / ai_crawler_policy
shop.theme.ai_policy (meta tags) ✓✓✓✓✓✓✓✓✓✓✓✓✓✓
shop.theme.ai_crawler_policies (robots.txt) Site-wide · /robots.txt template + /llms.txt Worker
SHOP SINGLETONS · shop.theme.*
shop.theme.featured_product ✓
shop.theme.hero_* (copy) ✓
shop.theme.contact_* (phone, emails, hours) ·✓
shop.theme.warranty_* (intro, terms) ✓
shop.theme.about_* (hero, stats) ✓
IMPLIED · NEW METAOBJECTS (see § 04)
◯ product_video ✓··✓
◯ distributor ✓
◯ faq_item / glossary_term ✓
◯ company_milestone ✓
◯ finder_intent_path / finder_step ✓
◯ learn_category / learn_article ✓✓·

✓ primary data source for this page · · secondary or partial use

§ 03

Per-page data maps.

Each page shown as a stacked schematic of its sections with numbered callouts, and a binding table listing every UI element with its data source. Use this as the implementation reference when building the Liquid templates — the table tells you the exact metafield path and any filter / sort logic the renderer needs.

Mock A · 06.1

Homepage — featured product, three intent paths, bestsellers grid

Three things above the fold (brand statement, featured product, intent paths) plus a bestseller grid below. Featured product is driven by a single shop metafield reference; bestsellers are dynamic from Shopify's BEST_SELLING sort.

1Site header
2Hero · tag, headline, CTAs
3Featured product
4Three intent paths
5Bestsellers grid (4)
1Site header
Brand / logo link×Hardcoded link to /
Main nav (5 items)—linklists.main-menu
Search / Account / Cart—Shopify native sections
2Hero
"Made in Ohio · Since 1994" tag◐shop.theme.brand_tagline
Headline (with serif emphasis)◐shop.theme.hero_headline · rich text with <em> permitted
Subtitle◐shop.theme.hero_body
Primary CTA (Find your fit)◐shop.theme.hero_cta_primary · text + link
Secondary CTA (Talk to sales)◐shop.theme.hero_cta_secondary
3Featured product
Product reference◐shop.theme.featured_product · product_reference
Image, title, description—.featuredImage, .title, .descriptionHtml
Spec quartet (capacity, savings, ROI, warranty)✓product.theme.specs · filter comparable=true · sort display_priority · take 4
Price—product.priceRange.minVariantPrice
"See full family" CTA×Hardcoded link to product's parent collection
4Intent paths
Three intent cards◯finder_intent_path metaobject (see § 04) · OR Liquid section blocks for v1
5Bestsellers grid
Product list—products(sortKey: BEST_SELLING, first: 4)
Card image, title, price—Shopify native fields
Spec pill (capacity)✓product.theme.specs · filter key=capacity · first match
Spec pills (2 more)✓product.theme.specs · filter comparable=true · take 2
Stock pill—product.totalInventory > 0
Mock D · 06.4

Product detail page — sticky sidebar, six anchored sections

The PDP is the heaviest consumer of the data layer. Every cluster except AI has primary feeds here. The variant picker triggers re-rendering of Specs and Parts & accessories without a page reload — both read variant-level metafields client-side after the picker change event.

1Site header + breadcrumb
2Image gallery
3Product info + variant pickers + CTAs
4Overview prose
5Specifications (grouped)
6Documents (PDFs)
7Installation (videos)
8Parts & accessories
9Reviews
1Header + breadcrumb
Breadcrumb trail—product.collections · primary collection chain + product.title
2Image gallery
Primary image—product.featuredImage · or selectedVariant.image
Thumbnail strip—product.media · images + videos mixed
3Product info + pickers
Family label ("Tube oil skimmer · ZVA8 family")✓product.theme.specs · filter key=product_family
Title—product.title
Short description—product.descriptionHtml · first paragraph
Price—selectedVariant.price
Stock pill—selectedVariant.availableForSale + inventoryQuantity
SKU / MOQ / Lead time—selectedVariant.sku + theme.specs filtered (lead_time, moq)
Reach picker (variant axis 1)—product.options[0] · post variant cleanup (see Phase 1 audit)
Voltage picker (variant axis 2)—product.options[1]
Add to cart / Request quote—Cart action / draft order action
Trust row◐shop.theme.pdp_trust_badges · list of 3 items
4Overview
Overview prose—product.descriptionHtml · or product.theme.overview_rich if extracted
Inline product links✓Resolved from product.theme.related_products at render
5Specifications
Group headings (PERFORMANCE, ELECTRICAL...)✓product_spec_group.label · sorted by display_order
Spec rows (label + value + unit)✓product.theme.specs ∪ variant.theme.specs · variant overrides product by key
"(this variant)" annotation✓Rendered when row source = variant.theme.specs (overrode product)
US + metric values✓value_number_us / unit_us · value_number_metric / unit_metric · render-time conversion when one absent
Print spec sheet button—Link to /products/<handle>/spec-sheet.pdf · same data, print CSS
6Documents
Document cards✓product.theme.documents ∪ selectedVariant.theme.documents · dedupe by metaobject id
Type label (MANUAL, DATASHEET, INSTALL...)✓product_document.document_type
File size✓product_document.file_size_bytes · auto-derived for file_reference
Description / blurb✓product_document.description
7Installation
Video cards◯product.theme.videos · filter video_topic=install (product_video metaobject — see § 04)
"See all install videos" link×Hardcoded link to /support/install filtered to this product
8Parts & accessories
Section header pill ("Filtered to fit ZVA8-08 · 115 VAC")—Composed from selectedVariant.title + variant options
Curated relationships (always shown)✓product.theme.related_products · grouped by relationship_type · required first
Compatibility relationships✓Storefront query: products where theme.fits_products contains <selectedVariant.id>
"Fits" pill on each card✓Rendered when product appears in compatibility result
Variant-picker change behavior—Client-side: re-query on variant change · no page reload
9Reviews
Aggregate rating—Reviews app (Judge.me / Loox / native) · standard integration
Individual reviews—Same reviews app
Mock E · 06.5

Collection page — spec-driven filter rail + product cards

The filter rail introspects spec rows flagged filterable=true across all products in the collection. No hardcoded facets per collection template.

1Breadcrumb + page title
2"Find Your Fit" inline banner
3Filter rail
4Product grid
1Header
Title, description, count—collection.title, .description, .productsCount
2Find Your Fit banner
Banner copy + CTA◐collection.metafields.theme.fyf_banner · per-collection override, fallback shop default
3Filter rail
Skimmer type facet—Native Shopify product_type filter
Reach range slider✓Aggregate spec_rows[key=reach_depth].value_number_us across products · min/max derived
Voltage / Mount style checkboxes✓Aggregate spec_rows[filterable=true, group=electrical|mechanical] · unique values
Availability toggle—Native Shopify availability filter
"Made in USA" toggle (future)✓spec_rows[key=country_of_origin] · boolean facet
4Product cards
Image, title, SKU, price, stock—Shopify native
Spec pills (3 per card)✓product.theme.specs · filter comparable=true · sort display_priority · take 3
Sort dropdown—Shopify native + custom keys (best match driven by Find Your Fit answers if persisted)
Mock F · 06.6

Compare tool — 2-4 products side-by-side

Pure derivation from spec data. The URL /products/compare?items=... encodes product handles and optional variant SKUs. No backing data store — the comparison is computed from the participating products' spec rows.

1Page header + count
2Column heads (image, name, price, CTA per product)
3Grouped spec rows
4Footer · permalink + actions
1Page header
Title with product count—Computed from URL parameter items length
2Column heads (per product)
Selected products + variants—URL state: ?items=zva8-sidewinder:zva8-08,bpf1-12-belt-skimmer,...
Image, name, subtitle, price—Shopify native per resolved variant
Add to cart per column—Cart action
3Comparison body
Group rows (Capacity, Connectivity, ...)✓product_spec_group · union of groups across compared products · sorted by display_order
Spec rows✓Union of spec_rows[comparable=true] indexed by key · variant-level wins over product-level
Missing value cell (em-dash)✓Rendered when key absent from a product · hover "Not specified"
Unit normalization✓Render-time conversion when products use different units for same key
4Footer
Permalink—Current URL · deeplinkable
Print comparison—window.print() · print CSS hides chrome
Quote request—Draft order with all selected variants as line items
Mock G · 06.7

Find Your Fit — intent entry

The intent paths and step questions are the bulk of the configuration. v1 can ship the entry screen as hardcoded section blocks; v2 should move them to a finder_intent_path metaobject so the merchant can adjust without code (see § 04).

1Step indicator
2Hero question + standfirst
3Three intent cards
4Skip-to-shop footer
1Step indicator
Step labels + current×Hardcoded by template · current derived from URL state
2Hero
Headline + standfirst◐shop.theme.fyf_entry_headline + fyf_entry_standfirst
3Intent cards (3)
Each card: number, title, body, link◯finder_intent_path metaobject · multi-entry · sort by display_order · see § 04
v1 fallback×3 hardcoded section blocks until metaobject ships
4Behind-the-scenes
Spec-row filtering on later steps✓product_spec_row matched against user answers · recommendation engine
URL state—?p=1&q1=tramp&q2=... · deep links work
Mock H · 06.8

Learn hub — editorial categories + recent

Replaces the 18-lesson nav. Built primarily on Shopify Blog (articles + tags + author) with a thin metaobject layer for category curation and a featured article reference at the shop level.

1Search input
2Featured article hero
3Three category cards
4Recent articles grid
1Search
Predictive search scoped to /learn—Shopify predictive search · resource_types: ARTICLE, PAGE, METAOBJECT
2Featured article
Featured article reference◐shop.theme.featured_learn_article · article_reference
Title, excerpt, hero image, byline—.title, .excerpt, .image, .author
Category tag (FEATURED · COOLANT 101)—article.tags · first tag
3Category cards
Three categories with descriptions + counts◯learn_category metaobject (see § 04) · or 3 hardcoded blog refs for v1
Item count per category—articles(tag: category_handle) count
4Recent
Article cards—articles(sortKey: PUBLISHED_AT, reverse: true, first: 4)
Mock I · 06.9

Application guide article — editorial template

Native Shopify Article with article-level metafields for the editorial framing (standfirst, reviewer credit) and a related-products list. Same template handles Coolant 101 lessons and longer-form white papers.

1Breadcrumb
2Article hero (category, headline, standfirst, byline)
3Article body (prose, figures, blockquote)
4Related products
1Breadcrumb
LEARN / APPLICATION GUIDES—Derived from article.blog.handle · or article.tags
2Hero
Category label—article.tags[0] + date
Headline (with serif em)—article.title · em markers in content allowed
Standfirst◐article.metafields.editorial.standfirst
Byline (author · reviewed by)◐article.author + article.metafields.editorial.reviewer
3Body
Rich-text content—article.contentHtml
Inline product links×Authored as anchor tags in article body
Figures + captions—<figure> elements in body · figcaption styled to mono
Pull quote (Instrument Serif)—<blockquote> elements · auto-styled
4Related products
Product cards◐article.metafields.related.products · list<product_reference>
Card spec line✓product.theme.specs · first comparable row
Mock J · 06.10

FAQ + Glossary — two views, one template

The most metaobject-needed page on the list. Both faq_item and glossary_term are net new in § 04. v1 could ship with structured content in a single Shopify page — but it won't be search-indexable as discrete units, won't deduplicate across product pages, and won't emit JSON-LD FAQPage / DefinedTerm schemas cleanly.

1View toggle (FAQ / Glossary)
2Search input (spans both)
3FAQ side · grouped accordions
4Glossary side · alphabet index + term cards
1Toggle
FAQ / Glossary tabs—URL state: /learn/faq · /learn/glossary
2Search
Predictive search—Shopify predictive search · metaobjects + pages scope
3FAQ side
Category headings + counts◯Aggregate from faq_item.category · see § 04
Q&A accordions◯faq_item metaobjects · fields: question, answer, category, display_order
FAQPage JSON-LD✓Auto-emitted from faq_item entries
4Glossary side
Alphabet index—Computed from glossary_term.label[0] · letters with terms highlighted
Term cards (label, category, definition)◯glossary_term metaobjects · see § 04
DefinedTerm JSON-LD✓Auto-emitted from glossary_term entries
Cross-link to PDPs◯glossary_term.related_products field · optional
Mock K · 06.11

Find parts by model — variant-aware results

Pure expression of the fits_products data layer. The customer types a SKU or model, the system resolves it to a specific variant, then queries products whose theme.fits_products metafield contains that variant.

1Search input · model entry
2Popular models pills
3Resolved model header
4Parts grid
1Search input
Free-text model / SKU / barcode—Predictive search against variant.sku + variant.barcode + product titles
"Identify by photo" link (future)◯Workers AI vision pipeline · reads nameplate · matches SKU
2Popular models
Quick-pick pills◐shop.theme.popular_parts_models · list<variant_reference>
3Resolved model
Model title + variant specs✓variant.title + variant.theme.specs filtered to comparable
4Parts results
Parts list (filtered to variant)✓Storefront query: products where theme.fits_products contains <resolved variant.id>
"Fits this variant" pill✓Rendered on every result · query result is by definition matching
Card spec line✓product.theme.specs · first comparable
Mock L · 06.12

Install & troubleshooting — support hub

Aggregates documents and videos across the catalog, filtered by document_type and audience. Each guide auto-links to the parts it references via metafield cross-references.

1Search
2Task category cards (4)
3Featured videos (3)
4Recent guides list
1Search
Scoped predictive search—Shopify predictive · metaobjects scope · filter document_type=install_guide / troubleshooting
2Task categories
Four category cards×Hardcoded section blocks (Installation / Maintenance / Replacement / Troubleshooting)
Item count per category✓Aggregate product_document.document_type counts across catalog
3Featured videos
Featured install videos◯shop.theme.featured_install_videos · list<product_video> (see § 04)
4Recent guides
Guide cards✓Aggregate product_document entries with type in (install_guide, manual, troubleshooting) sorted by revision_date
Card "references parts" line✓Inferred from parts whose fits_products matches the product owning the document
Mock M · 06.13

Warranty & returns — register, claim, terms

Mostly editorial copy from shop metafields, plus the existing native warranty registration form section (PR #35 — already shipped). Terms are rendered from a single shop metafield so updates don't require a code change.

1Hero · "Lifetime warranty"
2Register form (left col)
3Claim flow (right col)
4Warranty terms
1Hero
"Lifetime" pill◐shop.theme.warranty_headline_pill
Headline + standfirst◐shop.theme.warranty_headline + warranty_intro
2Register form
Form fields (8)×Existing PR #35 native form section · contact[...] field naming · tag warranty-registration
Submit routing—Shopify Flow on tag
3Claim flow
Three-step description◐shop.theme.warranty_claim_steps · list of {label, body}
Urgent callout (phone)◐shop.theme.contact_phone · same source as Mock P
4Terms
"Covered" / "Not covered" sections◐shop.theme.warranty_terms_rich · rich text · admin-editable
PDF version✓shop.theme.shop_documents · filter document_type=warranty
Mock N · 06.14

About / Made in USA — editorial brand page

Editorial layout with a hero photograph, brand story prose, by-the-numbers grid, and a milestone timeline. Two new metaobjects implied: company_stat and company_milestone.

1Hero (serif italic year)
2Plant photograph
3"Why we exist" + "By the numbers"
4Timeline
5Visit address
1Hero
Headline◐shop.theme.about_headline · rich text with em for year
Section label ("SINCE 1994 · SOLON, OHIO")◐shop.theme.about_tagline
2Plant photo
Hero image◐shop.theme.about_hero_image · file_reference
Caption◐shop.theme.about_hero_caption
3Story + stats
"Why we exist" body◐shop.theme.about_body · rich text
Stat rows (years, units, countries...)◯company_stat metaobject (see § 04) · {label, value} pairs
4Timeline
Year rows◯company_milestone metaobject (see § 04) · {year, description} · sorted by year
5Visit
Address + phone—shop.address + shop.theme.contact_phone
Mock O · 06.15

Distributors — 68 partners, 42 countries

Largely a single new metaobject (distributor) driving the map, the search, and the list. The "become a distributor" path is form-based; the portal sign-in is Phase 4.

1Hero + intro
2Map with pins
3Search input
4Distributor list (grouped by region)
5"Become a distributor" + portal sign-in
1Hero
Page intro◐shop.theme.distributors_intro
2Map
Pin coordinates◯distributor.latitude, distributor.longitude (see § 04)
3Search
Country / state / postal input—Client-side filter against distributor.country + .region + .service_zip_codes
4Distributor list
Each row (region, name, phone, contact)◯distributor metaobject · fields below
Region grouping◯distributor.continent
5Apply + Sign-in
Become a distributor form—Contact form · tag distributor-application
Portal sign-in (Phase 4)×Customer accounts B2B · placeholder for now
Mock P · 06.16

Contact — phone-first, form-second

Almost entirely shop metafields. The form is the same Shopify Contact-form backbone used for warranty registration and the distributor application, with tag-based routing.

1Hero · "Talk to a human"
2Phone card (with "currently open" pill)
3Email departments
4Mailing address
5Message form
1Hero
Headline + standfirst◐shop.theme.contact_headline + contact_intro
2Phone
Phone number (large)◐shop.theme.contact_phone
Hours line◐shop.theme.business_hours · {timezone, days, open, close}
"Currently open" pill—Computed client-side from business_hours + Date.now()
3Email departments
Department blocks (Sales, Support, Distributors)◐shop.theme.contact_departments · list of {label, email, description}
4Mailing address
Address block—shop.address · Shopify native
5Form
"What's this about?" dropdown—Hardcoded options · sets contact form tag for Flow routing
Form fields—Shopify Contact form section · standard fields
Submit routing—Shopify Flow routes by tag: contact-sales / contact-support / contact-partners / contact-press
§ 04

Metaobjects the IA implies beyond v1.

Working through the page maps surfaced six additional metaobject types the design needs that aren't covered by the three already specified. Each card lists the type, the page(s) that consume it, why it's worth creating versus hardcoding, and a verdict on whether to ship it in v1 or defer. The combined effect of deferring all six is a v1 with a small number of hardcoded sections and limited admin editability — acceptable trade for getting the data layer out, then adding admin power in v2.

IMPLIED 01 · NEEDED FOR D, H, I, L

product_video

The AI Search pipeline already structures videos with clean fields (title, platform, video_id, watch_url, embed_url, thumbnail_url). Five videos per major product, mostly install and demo content. Without a metaobject, videos stay as third-party iframe embeds in product descriptions — unsearchable, unfilterable, no JSON-LD VideoObject emission.

Verdict · Ship in Phase 1 alongside product_document. Same data-layer release, similar shape, the AI Search corpus already has the source data.
IMPLIED 02 · NEEDED FOR J

faq_item · glossary_term

The FAQ + Glossary page can't realistically be a single rich-text page if the search needs to find individual entries, if items need to cross-link from product PDPs, or if JSON-LD FAQPage / DefinedTerm schemas should emit cleanly. The current site has duplicate FAQ pages partly because there was no structured single source of truth.

Verdict · Ship in Phase 1. Cheap schema (4-5 fields each), big payoff in indexability and structured data emission.
IMPLIED 03 · NEEDED FOR O

distributor

68 distributors across 42 countries. The list is the source of truth for the map, the searchable list, and downstream regional routing on contact forms. Without a metaobject, the distributor list lives in a spreadsheet, the map is hand-maintained, and updates require code changes.

Verdict · Ship in Phase 1. Single-purpose, well-bounded schema, immediate merchant value.
IMPLIED 04 · NEEDED FOR N

company_stat · company_milestone

"By the numbers" rows (32 years, ~140k skimmers shipped, 42 countries) and the timeline of milestones (1994 founding through 2026 redesign). Could be hardcoded as Liquid section blocks, but every catalog has the same need — and once specified, the same metaobjects work for any merchant. Theme-Store-friendly.

Verdict · Defer to Phase 2. Hardcode in v1 as section blocks, promote to metaobjects when polishing for Theme Store submission.
IMPLIED 05 · NEEDED FOR G

finder_intent_path · finder_step

The Find Your Fit configuration. v1 can ship with hardcoded paths and questions baked into Liquid templates because the recommendation rules don't change often. v2 should expose the question tree as metaobjects so the merchant can A/B test entry points without a code change.

Verdict · Defer to Phase 2 or 3. Hardcode v1. The data layer driving recommendations (product_spec_row) is what matters; the question UI can ossify and still work.
IMPLIED 06 · NEEDED FOR H, I

learn_category

The three Learn hub categories (Coolant 101, Application Guides, Glossary & FAQ) with their descriptions and item counts. Shopify Blogs are categorized by tag; learn_category would be the merchandising layer on top — a category landing image, an editorial description, optional ordering of articles within.

Verdict · Defer to Phase 2. v1 ships with 3 hardcoded category sections referencing blog tags. Promote to metaobject when adding more categories becomes inevitable.

Ship-in-Phase-1 set: the three specified metaobjects (product_document, product_relationship, ai_policy + ai_crawler_policy), the two spec metaobjects (product_spec_group, product_spec_row), plus three from above: product_video, faq_item, glossary_term, and distributor. That's nine metaobject types total — a reasonable v1 ceiling. Phase 2 adds the four deferred types.