Contract backed
Schemas, manifest metadata, editor fields, accessibility, and i18n remain attached to the block type.
- 1 registered contract
- Ensemble schema id
- Editor category metadata
Explore search-discovery as a composable block: contract metadata, multiple configuration defaults, and every theme recipe rendered against the same sample content.
Schemas, manifest metadata, editor fields, accessibility, and i18n remain attached to the block type.
The documentation route renders through native, alias, wrapped, or nonvisual runtime support without generic fallback UI.
Default, media, background, gradient, colorway, dense, and editorial configurations are all visible.
Every Theme Studio recipe has a focused page and an inline preview for this block.
CMS authors can lift structured payload recipes for default, media, operator, and stress contexts.
Default, empty, pending, active, invalid, and disabled states are documented for every cloneable block recipe.
Media replacement, long copy, and awkward content tolerance are represented in the documented defaults.
Baseline contract props with the selected recipe and standard system preset.
RAG-ready discovery block with deterministic local results, source cards, facets, and provider trace metadata.
Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.
Product
A discovery result with category, tags, action, and citation-style source metadata.
Recommendation
Recommendation surfaces use the same result card contract for static and API-backed states.
Demo retrieval does not replace tenant review, compliance review, or safety guidance.
Shows the block alongside Cloud Elephants placeholder media so image, card, and media spacing are visible.

RAG-ready discovery block with deterministic local results, source cards, facets, and provider trace metadata.
Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.
Product
A discovery result with category, tags, action, and citation-style source metadata.
Recommendation
Recommendation surfaces use the same result card contract for static and API-backed states.
Demo retrieval does not replace tenant review, compliance review, or safety guidance.
Places the component on a Cloud Elephants image-backed documentation frame for hero, CTA, and overlay-style review.
RAG-ready discovery block with deterministic local results, source cards, facets, and provider trace metadata.
Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.
Product
A discovery result with category, tags, action, and citation-style source metadata.
Recommendation
Recommendation surfaces use the same result card contract for static and API-backed states.
Demo retrieval does not replace tenant review, compliance review, or safety guidance.
Uses a strong gradient shell to prove contrast, buttons, and panels in energetic brand treatments.
RAG-ready discovery block with deterministic local results, source cards, facets, and provider trace metadata.
Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.
Product
A discovery result with category, tags, action, and citation-style source metadata.
Recommendation
Recommendation surfaces use the same result card contract for static and API-backed states.
Demo retrieval does not replace tenant review, compliance review, or safety guidance.
Electric blue, coral, and deep navy for launch and high-contrast hero treatments.
RAG-ready discovery block with deterministic local results, source cards, facets, and provider trace metadata.
Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.
Product
A discovery result with category, tags, action, and citation-style source metadata.
Recommendation
Recommendation surfaces use the same result card contract for static and API-backed states.
Demo retrieval does not replace tenant review, compliance review, or safety guidance.
Aqua, white, ink, and operator blue for service, contact, and listing pages.

RAG-ready discovery block with deterministic local results, source cards, facets, and provider trace metadata.
Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.
Product
A discovery result with category, tags, action, and citation-style source metadata.
Recommendation
Recommendation surfaces use the same result card contract for static and API-backed states.
Demo retrieval does not replace tenant review, compliance review, or safety guidance.
Coral, magenta, electric blue, and warm white for announcements and campaign pages.

RAG-ready discovery block with deterministic local results, source cards, facets, and provider trace metadata.
Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.
Product
A discovery result with category, tags, action, and citation-style source metadata.
Recommendation
Recommendation surfaces use the same result card contract for static and API-backed states.
Demo retrieval does not replace tenant review, compliance review, or safety guidance.
Mist, ink, slate, blue, and coral for editorial and proof-heavy surfaces.
RAG-ready discovery block with deterministic local results, source cards, facets, and provider trace metadata.
Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.
Product
A discovery result with category, tags, action, and citation-style source metadata.
Recommendation
Recommendation surfaces use the same result card contract for static and API-backed states.
Demo retrieval does not replace tenant review, compliance review, or safety guidance.
Compact operator layout with dashboard-style controls and tighter spacing.
RAG-ready discovery block with deterministic local results, source cards, facets, and provider trace metadata.
Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.
Product
A discovery result with category, tags, action, and citation-style source metadata.
Recommendation
Recommendation surfaces use the same result card contract for static and API-backed states.
Demo retrieval does not replace tenant review, compliance review, or safety guidance.
Roomier narrative treatment for content, FAQ, testimonials, and feature blocks.
RAG-ready discovery block with deterministic local results, source cards, facets, and provider trace metadata.
Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.
Product
A discovery result with category, tags, action, and citation-style source metadata.
Recommendation
Recommendation surfaces use the same result card contract for static and API-backed states.
Demo retrieval does not replace tenant review, compliance review, or safety guidance.
Smallest useful CMS payload with the block type, stable id, editable props, and recipe-aware appearance.
search-discovery uses recipe surface tokens to keep the outer frame styled and composable.
background, panel, panelElevated, borderCopy fields map to primary and muted text roles so editors can change words without restyling the block.
text, textMutedAction regions use recipe button and accent tokens while preserving href or event payloads.
button, buttonText, signal, uplinkControl regions keep labels, required state, and options aligned with recipe control tokens.
control, controlText, borderFeedback regions tie state-readiness evidence to visible recipe status treatments.
badge, badgeText, signalUse when a search-discovery block should land quickly with balanced Polished SaaS defaults.
Minimal Default is a high-complexity quick-start recipe with 5 documented composition slots.
3 required regions, 2 optional regions.
search-discovery is best composed into funnel, contact, service-page.
3 page types mapped for search-discovery.Choose the first matching page type before editing copy, media, or actions so the recipe starts in the right narrative context.search-discovery can act as conversion, content, form-controls within a composed page.
5 anatomy regions produce 3 section roles.Place the block where its required anatomy regions have enough room before compressing it into dense page slots.Minimal Default composition passport is copy-led, cta-led, input-led for CMS composition.
32/33 fields are editable across 3 content models.Keep the content model stable when replacing defaults; do not turn a repeatable or media-led recipe into unrelated ad hoc content.search-discovery carries link-link, text interaction affordances.
4 action surfaces and 3 control surfaces mapped.Review href, event, input, required, and disabled-state evidence before publishing an interactive recipe.search-discovery uses quick-start authoring with high complexity.
33 default provenance items with 2 high-care replacements.Use the default provenance map before cloning the recipe into CMS content or agent-generated page data.search-discovery has explicit phone, tablet, and desktop compatibility evidence for composed pages.
3 responsive behavior maps cover phone, tablet, and desktop composition.Review phone wrapping, tablet mid-width balance, and desktop density before adding nested content, longer labels, or extra media.search-discovery keeps a stable recipe surface with panel, border, and spacing roles instead of ad hoc wrappers.
default treatment uses comfortable density and 14px radius base.background, panel, panelElevated, borderPrimary, muted, and badge text roles stay distinct enough for headings, body copy, metadata, and helper text.
6/6 contrast checks pass the AA target.text, textMuted, badgeTextInteractive regions use recipe action/control tokens and preserve labels, hrefs, events, required state, and options.
4 action surfaces and 3 control surfaces mapped.button, buttonText, control, controlText, signal, uplinkThe recipe remains polished without requiring placeholder media or visual assets inside this block.
No media region is required for this recipe.panelElevated, border, textMutedFeedback, selected, loading, invalid, and disabled treatments use visible state evidence instead of color-only meaning.
6 state-readiness entries include default, empty, pending, active, invalid, disabled.badge, badgeText, signalPhone, tablet, and desktop defaults have explicit stack, wrap, media, and overflow policies for the recipe.
single-column stack phone behavior, two-column adaptive grid tablet behavior, and responsive composition grid desktop behavior documented.panel, border, controlKeep visual styling aligned to Polished SaaS recipe tokens unless the recipe itself changes.
Polished SaaS recipe tokensCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadReplace the asset through CMS media data and keep alt, title, provider, or label fallback text meaningful.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadKeep the label paired with a valid href or canonical postEvent event name before publishing.
CMS route, URL, or canonical postEvent pathEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadKeep the label paired with a valid href or canonical postEvent event name before publishing.
CMS route, URL, or canonical postEvent pathCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadCopy bundle groups 10 fields so CMS edits preserve the recipe shape and default polish.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.Action bundle groups 2 fields so CMS edits preserve the recipe shape and default polish.
CMS route, URL, or canonical postEvent pathKeep the label paired with a valid href or canonical postEvent event name before publishing.Proof bundle groups 1 field so CMS edits preserve the recipe shape and default polish.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.Style bundle groups 1 field so CMS edits preserve the recipe shape and default polish.
Polished SaaS recipe tokensKeep visual styling aligned to Polished SaaS recipe tokens unless the recipe itself changes.Content bundle groups 19 fields so CMS edits preserve the recipe shape and default polish.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.
cloneable block recipe payloadActions should resolve to a URL or event name with a human-readable label.
CMS route, URL, or canonical postEvent pathProof fields should keep labels, values, and status text visible without color-only meaning.
cloneable block recipe payloadStyle fields should prefer recipe or appearance tokens over one-off inline values.
Polished SaaS recipe tokensContent should remain serializable JSON and preserve the documented block contract.
cloneable block recipe payloadPolished SaaS tokens with default documentation treatment
The Polished SaaS recipe renders a contract-safe primary state for search-discovery.Reserved panel space with fallback copy or placeholder media
Repeatable fields are documented for add, remove, reorder, and item-level editing.Neutral reserved frame with status copy and no layout shift
Async-capable props are mapped through controls, events, or provider placeholders.Signal/uplink emphasis with visible selected-state chips
4 action surfaces and 3 control surfaces are mapped for selected-state review.Warning/danger status treatment while preserving the block frame
Form controls preserve labels, required state, options, and submission metadata.Muted affordance with preserved label, spacing, and hit-area rhythm
Interactive maps preserve labels and control roles so disabled states can stay understandable.search-discovery keeps semantic wrappers and readable heading/copy structure in the runtime preview.
runtime block sections, cards, lists, and headingsInteractive surfaces stay reachable, focusable, and recipe-styled without shrinking below expected touch affordances.
mapped actions/controls render as native focusable surfacesRecipes without media do not leave decorative media shells that need alt text.
media slots collapse when unusedInput and choice controls are mapped with labels, required state, and option counts for CMS and runtime review.
control map includes required field labels and option metadataRecipe defaults avoid motion-only meaning and keep status text inspectable when state is present.
runtime evidence avoids hidden status-only contentPolished SaaS stacks search-discovery into one phone column with comfortable spacing and bounded content.
min-width:0 surfaces, wrapping copy, and no horizontal overflow in the static catalog phone smoke.Polished SaaS adapts search-discovery to 2 tablet columns before expanding to the desktop layout.
tablet preview frames keep mid-width composition, wrap controls, and avoid horizontal overflow in the static catalog smoke.Polished SaaS gives search-discovery up to 2 desktop columns while preserving recipe spacing.
desktop preview frames keep constrained widths, stable cards, and no horizontal overflow in the static catalog smoke.RAG-ready discovery block with deterministic local results, source cards, facets, and provider trace metadata.
Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.
Product
A discovery result with category, tags, action, and citation-style source metadata.
Recommendation
Recommendation surfaces use the same result card contract for static and API-backed states.
Demo retrieval does not replace tenant review, compliance review, or safety guidance.
{
"id": "block-doc-search-discovery-data-minimal-default",
"block_type": "search-discovery",
"props": {
"appearance": {
"preset": "shadcn"
},
"title": "Search discovery",
"description": "RAG-ready discovery block with deterministic local results, source cards, facets, and provider trace metadata.",
"query_placeholder": "Search services, products, or resources",
"mode": "both",
"surface": "block-explorer",
"provider": "local-fallback",
"api": {
"search_endpoint": "/api/ensemble/templates/example-sites/kindcart-market/rag/search",
"recommend_endpoint": "/api/ensemble/templates/example-sites/kindcart-market/rag/recommend"
},
"filters": [
{
"label": "Products",
"value": "products",
"count": 3
},
{
"label": "Guides",
"value": "guides",
"count": 2
},
{
"label": "Services",
"value": "services",
"count": 4
}
],
"answer": "Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.",
"results": [
{
"title": "Source-backed product match",
"description": "A discovery result with category, tags, action, and citation-style source metadata.",
"category": "Product",
"topic": "Catalog retrieval",
"byline": "Block Explorer desk",
"published_at": "2026-06-09",
"freshness": "Demo source",
"content_type": "article",
"reading_time": "4 min read",
"tags": [
"rag-ready",
"local"
],
"href": "#block-preview",
"sources": [
{
"title": "Template catalog source",
"citation_label": "Catalog source A",
"excerpt": "Example-site content roots can include local retrieval indexes."
}
]
},
{
"title": "Guided service recommendation",
"description": "Recommendation surfaces use the same result card contract for static and API-backed states.",
"category": "Recommendation",
"tags": [
"guided",
"source-card"
],
"href": "#block-preview",
"sources": [
{
"title": "Operator-approved source",
"excerpt": "Replace demo content with tenant-approved source records before publishing."
}
]
}
],
"recommendations": [
{
"title": "Ask for a fit check",
"description": "Use provider-neutral recommendation APIs when external retrieval is configured."
},
{
"title": "Review source cards",
"description": "Show citations and trace metadata before a user acts on a recommendation."
}
],
"sources": [
{
"title": "Local fallback index",
"url": "#block-preview"
},
{
"title": "Provider-neutral endpoint",
"url": "#block-preview"
}
],
"disclaimer": "Demo retrieval does not replace tenant review, compliance review, or safety guidance."
},
"block_order": 1,
"metadata": {
"composition_recipe": {
"id": "minimal-default",
"intent": "default",
"label": "Minimal Default",
"recipe": "polished-saas",
"source": "block-explorer",
"quality_proof": [
"composition"
],
"composition_passport": {
"id": "minimal-default",
"label": "Minimal Default composition passport",
"intent": "default",
"recipe": "polished-saas",
"authoring_mode": "quick-start",
"complexity": "high",
"fit": "Use when a search-discovery block should land quickly with balanced Polished SaaS defaults.",
"required_regions": [
"surface",
"copy",
"feedback"
],
"optional_regions": [
"actions",
"controls"
],
"slots": [
{
"id": "surface",
"label": "Surface",
"required": true,
"field_count": 1,
"editable_count": 0,
"token_roles": [
"background",
"panel",
"panelElevated",
"border"
],
"summary": "search-discovery uses recipe surface tokens to keep the outer frame styled and composable."
},
{
"id": "copy",
"label": "Copy",
"required": true,
"field_count": 10,
"editable_count": 10,
"token_roles": [
"text",
"textMuted"
],
"summary": "Copy fields map to primary and muted text roles so editors can change words without restyling the block."
},
{
"id": "actions",
"label": "Actions",
"required": false,
"field_count": 6,
"editable_count": 2,
"token_roles": [
"button",
"buttonText",
"signal",
"uplink"
],
"summary": "Action regions use recipe button and accent tokens while preserving href or event payloads."
},
{
"id": "controls",
"label": "Controls",
"required": false,
"field_count": 3,
"editable_count": 0,
"token_roles": [
"control",
"controlText",
"border"
],
"summary": "Control regions keep labels, required state, and options aligned with recipe control tokens."
},
{
"id": "feedback",
"label": "Feedback",
"required": true,
"field_count": 0,
"editable_count": 0,
"token_roles": [
"badge",
"badgeText",
"signal"
],
"summary": "Feedback regions tie state-readiness evidence to visible recipe status treatments."
}
],
"builder_field_count": 33,
"editable_field_count": 32,
"action_count": 4,
"control_count": 3,
"replacement_guidance": [
"Keep Polished SaaS recipe tokens as the source of visual styling for the surface, text, controls, and actions.",
"No media replacement is required; keep the layout rhythm stable when optional visual fields are omitted.",
"Verify each action keeps either a valid href or canonical event name plus an editor-visible label.",
"Verify control labels, required state, choices, and submission metadata before publishing.",
"The recipe does not require repeatable collection editing."
],
"publish_checklist": [
"Validate search-discovery against its block contract before publishing.",
"3 required anatomy regions remain present: surface, copy, feedback.",
"32/33 builder fields are CMS-editable or intentionally locked.",
"Interactive labels, target size, href/event wiring, and disabled states have been reviewed.",
"Phone, tablet, and desktop responsive behavior maps have been reviewed for wrapping and overflow.",
"Contrast checks meet the AA recipe target."
],
"agent_notes": [
"Prefer editing props fields described by the builder field map; metadata is evidence, not primary content.",
"Preserve recipe_alignment token roles unless the page theme or recipe changes intentionally.",
"Use the anatomy slots to compose or replace content without changing the block type."
],
"summary": "Minimal Default is a high-complexity quick-start recipe with 5 documented composition slots."
},
"composition_passport_complexity": "high",
"composition_passport_authoring_mode": "quick-start",
"composition_passport_slots": [
"surface",
"copy",
"actions",
"controls",
"feedback"
],
"composition_passport_check_count": 6,
"visual_polish_check_count": 6,
"visual_polish_pass_count": 6,
"visual_polish_checks": [
{
"id": "surface-rhythm",
"label": "Surface rhythm",
"axis": "layout",
"status": "ready",
"token_roles": [
"background",
"panel",
"panelElevated",
"border"
],
"evidence": "default treatment uses comfortable density and 14px radius base.",
"summary": "search-discovery keeps a stable recipe surface with panel, border, and spacing roles instead of ad hoc wrappers."
},
{
"id": "type-hierarchy",
"label": "Type hierarchy",
"axis": "typography",
"status": "ready",
"token_roles": [
"text",
"textMuted",
"badgeText"
],
"evidence": "6/6 contrast checks pass the AA target.",
"summary": "Primary, muted, and badge text roles stay distinct enough for headings, body copy, metadata, and helper text."
},
{
"id": "action-clarity",
"label": "Action clarity",
"axis": "interaction",
"status": "ready",
"token_roles": [
"button",
"buttonText",
"control",
"controlText",
"signal",
"uplink"
],
"evidence": "4 action surfaces and 3 control surfaces mapped.",
"summary": "Interactive regions use recipe action/control tokens and preserve labels, hrefs, events, required state, and options."
},
{
"id": "media-treatment",
"label": "Media treatment",
"axis": "media",
"status": "ready",
"token_roles": [
"panelElevated",
"border",
"textMuted"
],
"evidence": "No media region is required for this recipe.",
"summary": "The recipe remains polished without requiring placeholder media or visual assets inside this block."
},
{
"id": "state-feedback",
"label": "State feedback",
"axis": "state",
"status": "ready",
"token_roles": [
"badge",
"badgeText",
"signal"
],
"evidence": "6 state-readiness entries include default, empty, pending, active, invalid, disabled.",
"summary": "Feedback, selected, loading, invalid, and disabled treatments use visible state evidence instead of color-only meaning."
},
{
"id": "responsive-balance",
"label": "Responsive balance",
"axis": "responsive",
"status": "ready",
"token_roles": [
"panel",
"border",
"control"
],
"evidence": "single-column stack phone behavior, two-column adaptive grid tablet behavior, and responsive composition grid desktop behavior documented.",
"summary": "Phone, tablet, and desktop defaults have explicit stack, wrap, media, and overflow policies for the recipe."
}
],
"visual_polish_axes": [
"layout",
"typography",
"interaction",
"media",
"state",
"responsive"
],
"default_provenance_count": 33,
"default_provenance_map": [
{
"path": "appearance",
"label": "Appearance",
"field_role": "style",
"value_type": "object",
"editable": false,
"repeated": false,
"default_source": "Polished SaaS recipe tokens",
"replacement_policy": "locked-token",
"replacement_risk": "medium",
"guardrail": "Keep visual styling aligned to Polished SaaS recipe tokens unless the recipe itself changes.",
"validation": "Style fields should prefer recipe or appearance tokens over one-off inline values.",
"summary": "Appearance defaults from Polished SaaS recipe tokens; replacement is medium risk with locked-token policy."
},
{
"path": "title",
"label": "Title",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Title defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "description",
"label": "Description",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Description defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "query_placeholder",
"label": "Query Placeholder",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Query Placeholder defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "mode",
"label": "Mode",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Mode defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "surface",
"label": "Surface",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Surface defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "provider",
"label": "Provider",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "requires-alt-text",
"replacement_risk": "medium",
"guardrail": "Replace the asset through CMS media data and keep alt, title, provider, or label fallback text meaningful.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Provider defaults from cloneable block recipe payload; replacement is medium risk with requires-alt-text policy."
},
{
"path": "api",
"label": "Api",
"field_role": "content",
"value_type": "object",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Api defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "filters",
"label": "Filters",
"field_role": "content",
"value_type": "array",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Filters defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "filters[].label",
"label": "Filters Item Label",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Filters Item Label defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "filters[].value",
"label": "Filters Item Value",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Filters Item Value defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "filters[].count",
"label": "Filters Item Count",
"field_role": "content",
"value_type": "number",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Filters Item Count defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "answer",
"label": "Answer",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Answer defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "results",
"label": "Results",
"field_role": "content",
"value_type": "array",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Results defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "results[].title",
"label": "Results Item Title",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Results Item Title defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].description",
"label": "Results Item Description",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Results Item Description defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].category",
"label": "Results Item Category",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Results Item Category defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].topic",
"label": "Results Item Topic",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Results Item Topic defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].byline",
"label": "Results Item Byline",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Results Item Byline defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].published_at",
"label": "Results Item Published At",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Results Item Published At defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].freshness",
"label": "Results Item Freshness",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Results Item Freshness defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].content_type",
"label": "Results Item Content Type",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Results Item Content Type defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].reading_time",
"label": "Results Item Reading Time",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Results Item Reading Time defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].tags",
"label": "Results Item Tags",
"field_role": "proof",
"value_type": "array",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Proof fields should keep labels, values, and status text visible without color-only meaning.",
"summary": "Results Item Tags defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].href",
"label": "Results Item Href",
"field_role": "action",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "CMS route, URL, or canonical postEvent path",
"replacement_policy": "requires-action-target",
"replacement_risk": "high",
"guardrail": "Keep the label paired with a valid href or canonical postEvent event name before publishing.",
"validation": "Actions should resolve to a URL or event name with a human-readable label.",
"summary": "Results Item Href defaults from CMS route, URL, or canonical postEvent path; replacement is high risk with requires-action-target policy."
},
{
"path": "results[].sources",
"label": "Results Item Sources",
"field_role": "content",
"value_type": "array",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Results Item Sources defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "recommendations",
"label": "Recommendations",
"field_role": "content",
"value_type": "array",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Recommendations defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "recommendations[].title",
"label": "Recommendations Item Title",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Recommendations Item Title defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "recommendations[].description",
"label": "Recommendations Item Description",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Recommendations Item Description defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "sources",
"label": "Sources",
"field_role": "content",
"value_type": "array",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Sources defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "sources[].title",
"label": "Sources Item Title",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Sources Item Title defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "sources[].url",
"label": "Sources Item Url",
"field_role": "action",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "CMS route, URL, or canonical postEvent path",
"replacement_policy": "requires-action-target",
"replacement_risk": "high",
"guardrail": "Keep the label paired with a valid href or canonical postEvent event name before publishing.",
"validation": "Actions should resolve to a URL or event name with a human-readable label.",
"summary": "Sources Item Url defaults from CMS route, URL, or canonical postEvent path; replacement is high risk with requires-action-target policy."
},
{
"path": "disclaimer",
"label": "Disclaimer",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Disclaimer defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
}
],
"default_replacement_policies": [
"collection-item",
"locked-token",
"requires-action-target",
"requires-alt-text",
"safe-to-edit"
],
"default_replacement_risks": [
"high",
"low",
"medium"
],
"default_replacement_high_risk_count": 2,
"content_edit_bundle_count": 5,
"content_edit_bundles": [
{
"id": "copy",
"label": "Copy bundle",
"intent": "required",
"edit_mode": "repeatable-items",
"field_paths": [
"answer",
"description",
"filters[].label",
"recommendations[].description",
"recommendations[].title",
"results[].content_type",
"results[].description",
"results[].title",
"sources[].title",
"title"
],
"default_sources": [
"cloneable block recipe payload"
],
"guardrails": [
"Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape."
],
"depends_on": [
"type hierarchy",
"mobile wrapping"
],
"summary": "Copy bundle groups 10 fields so CMS edits preserve the recipe shape and default polish."
},
{
"id": "actions",
"label": "Action bundle",
"intent": "recommended",
"edit_mode": "repeatable-items",
"field_paths": [
"results[].href",
"sources[].url"
],
"default_sources": [
"CMS route, URL, or canonical postEvent path"
],
"guardrails": [
"Keep the label paired with a valid href or canonical postEvent event name before publishing."
],
"depends_on": [
"copy labels",
"href or event target",
"state readiness"
],
"summary": "Action bundle groups 2 fields so CMS edits preserve the recipe shape and default polish."
},
{
"id": "proof",
"label": "Proof bundle",
"intent": "recommended",
"edit_mode": "repeatable-items",
"field_paths": [
"results[].tags"
],
"default_sources": [
"cloneable block recipe payload"
],
"guardrails": [
"Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape."
],
"depends_on": [
"copy labels",
"contrast proof"
],
"summary": "Proof bundle groups 1 field so CMS edits preserve the recipe shape and default polish."
},
{
"id": "style",
"label": "Style bundle",
"intent": "guarded",
"edit_mode": "guarded-system",
"field_paths": [
"appearance"
],
"default_sources": [
"Polished SaaS recipe tokens"
],
"guardrails": [
"Keep visual styling aligned to Polished SaaS recipe tokens unless the recipe itself changes."
],
"depends_on": [
"theme recipe tokens",
"contrast proof"
],
"summary": "Style bundle groups 1 field so CMS edits preserve the recipe shape and default polish."
},
{
"id": "content",
"label": "Content bundle",
"intent": "required",
"edit_mode": "repeatable-items",
"field_paths": [
"api",
"disclaimer",
"filters",
"filters[].count",
"filters[].value",
"mode",
"provider",
"query_placeholder",
"recommendations",
"results",
"results[].byline",
"results[].category",
"results[].freshness",
"results[].published_at",
"results[].reading_time",
"results[].sources",
"results[].topic",
"sources",
"surface"
],
"default_sources": [
"cloneable block recipe payload"
],
"guardrails": [
"Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"Replace the asset through CMS media data and keep alt, title, provider, or label fallback text meaningful."
],
"depends_on": [
"contract-safe JSON"
],
"summary": "Content bundle groups 19 fields so CMS edits preserve the recipe shape and default polish."
}
],
"content_edit_bundle_ids": [
"copy",
"actions",
"proof",
"style",
"content"
],
"content_edit_bundle_modes": [
"guarded-system",
"repeatable-items"
],
"content_edit_bundle_required_count": 2,
"content_edit_bundle_guarded_count": 1,
"recipe_compatibility_count": 6,
"recipe_compatibility_map": [
{
"id": "page-context",
"label": "Page context",
"axis": "page",
"fit": "primary",
"values": [
"funnel",
"contact",
"service-page"
],
"evidence": "3 page types mapped for search-discovery.",
"guardrail": "Choose the first matching page type before editing copy, media, or actions so the recipe starts in the right narrative context.",
"summary": "search-discovery is best composed into funnel, contact, service-page."
},
{
"id": "section-role",
"label": "Section role",
"axis": "layout",
"fit": "primary",
"values": [
"conversion",
"content",
"form-controls"
],
"evidence": "5 anatomy regions produce 3 section roles.",
"guardrail": "Place the block where its required anatomy regions have enough room before compressing it into dense page slots.",
"summary": "search-discovery can act as conversion, content, form-controls within a composed page."
},
{
"id": "content-model",
"label": "Content model",
"axis": "content",
"fit": "supporting",
"values": [
"copy-led",
"cta-led",
"input-led"
],
"evidence": "32/33 fields are editable across 3 content models.",
"guardrail": "Keep the content model stable when replacing defaults; do not turn a repeatable or media-led recipe into unrelated ad hoc content.",
"summary": "Minimal Default composition passport is copy-led, cta-led, input-led for CMS composition."
},
{
"id": "interaction-model",
"label": "Interaction model",
"axis": "interaction",
"fit": "primary",
"values": [
"link-link",
"text"
],
"evidence": "4 action surfaces and 3 control surfaces mapped.",
"guardrail": "Review href, event, input, required, and disabled-state evidence before publishing an interactive recipe.",
"summary": "search-discovery carries link-link, text interaction affordances."
},
{
"id": "authoring-fit",
"label": "Authoring fit",
"axis": "authoring",
"fit": "specialized",
"values": [
"quick-start",
"high-complexity",
"2-high-care-replacements"
],
"evidence": "33 default provenance items with 2 high-care replacements.",
"guardrail": "Use the default provenance map before cloning the recipe into CMS content or agent-generated page data.",
"summary": "search-discovery uses quick-start authoring with high complexity."
},
{
"id": "responsive-fit",
"label": "Responsive fit",
"axis": "responsive",
"fit": "primary",
"values": [
"single-column stack",
"two-column adaptive grid",
"responsive composition grid",
"min-width:0 surfaces, wrapping copy, and no horizontal overflow in the static catalog phone smoke."
],
"evidence": "3 responsive behavior maps cover phone, tablet, and desktop composition.",
"guardrail": "Review phone wrapping, tablet mid-width balance, and desktop density before adding nested content, longer labels, or extra media.",
"summary": "search-discovery has explicit phone, tablet, and desktop compatibility evidence for composed pages."
}
],
"recipe_compatibility_axes": [
"page",
"layout",
"content",
"interaction",
"authoring",
"responsive"
],
"recipe_compatibility_page_types": [
"funnel",
"contact",
"service-page"
],
"recipe_compatibility_section_roles": [
"conversion",
"content",
"form-controls"
],
"recipe_compatibility_fits": [
"primary",
"specialized",
"supporting"
],
"builder_field_count": 33,
"builder_field_map": [
{
"path": "appearance",
"label": "Appearance",
"value_type": "object",
"role": "style",
"editable": false,
"repeated": false,
"summary": "Appearance is a object field used for style."
},
{
"path": "title",
"label": "Title",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": false,
"summary": "Title is a string field used for copy."
},
{
"path": "description",
"label": "Description",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": false,
"summary": "Description is a string field used for copy."
},
{
"path": "query_placeholder",
"label": "Query Placeholder",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Query Placeholder is a string field used for content."
},
{
"path": "mode",
"label": "Mode",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Mode is a string field used for content."
},
{
"path": "surface",
"label": "Surface",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Surface is a string field used for content."
},
{
"path": "provider",
"label": "Provider",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Provider is a string field used for content."
},
{
"path": "api",
"label": "Api",
"value_type": "object",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Api is a object field used for content."
},
{
"path": "filters",
"label": "Filters",
"value_type": "array",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Filters is a array field used for content."
},
{
"path": "filters[].label",
"label": "Filters Item Label",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": true,
"summary": "Filters Item Label is a string collection field used for copy."
},
{
"path": "filters[].value",
"label": "Filters Item Value",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": true,
"summary": "Filters Item Value is a string collection field used for content."
},
{
"path": "filters[].count",
"label": "Filters Item Count",
"value_type": "number",
"role": "content",
"editable": true,
"repeated": true,
"summary": "Filters Item Count is a number collection field used for content."
},
{
"path": "answer",
"label": "Answer",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": false,
"summary": "Answer is a string field used for copy."
},
{
"path": "results",
"label": "Results",
"value_type": "array",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Results is a array field used for content."
},
{
"path": "results[].title",
"label": "Results Item Title",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": true,
"summary": "Results Item Title is a string collection field used for copy."
},
{
"path": "results[].description",
"label": "Results Item Description",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": true,
"summary": "Results Item Description is a string collection field used for copy."
},
{
"path": "results[].category",
"label": "Results Item Category",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": true,
"summary": "Results Item Category is a string collection field used for content."
},
{
"path": "results[].topic",
"label": "Results Item Topic",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": true,
"summary": "Results Item Topic is a string collection field used for content."
},
{
"path": "results[].byline",
"label": "Results Item Byline",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": true,
"summary": "Results Item Byline is a string collection field used for content."
},
{
"path": "results[].published_at",
"label": "Results Item Published At",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": true,
"summary": "Results Item Published At is a string collection field used for content."
},
{
"path": "results[].freshness",
"label": "Results Item Freshness",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": true,
"summary": "Results Item Freshness is a string collection field used for content."
},
{
"path": "results[].content_type",
"label": "Results Item Content Type",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": true,
"summary": "Results Item Content Type is a string collection field used for copy."
},
{
"path": "results[].reading_time",
"label": "Results Item Reading Time",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": true,
"summary": "Results Item Reading Time is a string collection field used for content."
},
{
"path": "results[].tags",
"label": "Results Item Tags",
"value_type": "array",
"role": "proof",
"editable": true,
"repeated": true,
"summary": "Results Item Tags is a array collection field used for proof."
},
{
"path": "results[].href",
"label": "Results Item Href",
"value_type": "string",
"role": "action",
"editable": true,
"repeated": true,
"summary": "Results Item Href is a string collection field used for action."
},
{
"path": "results[].sources",
"label": "Results Item Sources",
"value_type": "array",
"role": "content",
"editable": true,
"repeated": true,
"summary": "Results Item Sources is a array collection field used for content."
},
{
"path": "recommendations",
"label": "Recommendations",
"value_type": "array",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Recommendations is a array field used for content."
},
{
"path": "recommendations[].title",
"label": "Recommendations Item Title",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": true,
"summary": "Recommendations Item Title is a string collection field used for copy."
},
{
"path": "recommendations[].description",
"label": "Recommendations Item Description",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": true,
"summary": "Recommendations Item Description is a string collection field used for copy."
},
{
"path": "sources",
"label": "Sources",
"value_type": "array",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Sources is a array field used for content."
},
{
"path": "sources[].title",
"label": "Sources Item Title",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": true,
"summary": "Sources Item Title is a string collection field used for copy."
},
{
"path": "sources[].url",
"label": "Sources Item Url",
"value_type": "string",
"role": "action",
"editable": true,
"repeated": true,
"summary": "Sources Item Url is a string collection field used for action."
},
{
"path": "disclaimer",
"label": "Disclaimer",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Disclaimer is a string field used for content."
}
],
"editor_guidance_count": 5,
"editor_guidance_map": [
{
"id": "copy",
"label": "Copy",
"field_role": "copy",
"field_count": 10,
"editable_count": 10,
"editor_widget": "text/rich-text editor",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"default_source": "cloneable block recipe payload",
"summary": "Copy fields use the text/rich-text editor across 10/10 editable fields."
},
{
"id": "action",
"label": "Action",
"field_role": "action",
"field_count": 2,
"editable_count": 2,
"editor_widget": "link or event action editor",
"validation": "Actions should resolve to a URL or event name with a human-readable label.",
"default_source": "CMS route, URL, or canonical postEvent path",
"summary": "Action fields use the link or event action editor across 2/2 editable fields."
},
{
"id": "proof",
"label": "Proof",
"field_role": "proof",
"field_count": 1,
"editable_count": 1,
"editor_widget": "metric, badge, or proof editor",
"validation": "Proof fields should keep labels, values, and status text visible without color-only meaning.",
"default_source": "cloneable block recipe payload",
"summary": "Proof fields use the metric, badge, or proof editor across 1/1 editable field."
},
{
"id": "style",
"label": "Style",
"field_role": "style",
"field_count": 1,
"editable_count": 0,
"editor_widget": "appearance preset selector",
"validation": "Style fields should prefer recipe or appearance tokens over one-off inline values.",
"default_source": "Polished SaaS recipe tokens",
"summary": "Style fields use the appearance preset selector across 0/1 editable field."
},
{
"id": "content",
"label": "Content",
"field_role": "content",
"field_count": 19,
"editable_count": 19,
"editor_widget": "plain content field",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"default_source": "cloneable block recipe payload",
"summary": "Content fields use the plain content field across 19/19 editable fields."
}
],
"editor_field_roles": [
"copy",
"action",
"proof",
"style",
"content"
],
"editor_editable_field_count": 32,
"state_readiness_count": 6,
"state_readiness_map": [
{
"id": "default",
"label": "Default",
"status": "covered",
"trigger": "Initial render with the cloneable recipe payload",
"visual_treatment": "Polished SaaS tokens with default documentation treatment",
"token_roles": [
"surface",
"panel",
"text",
"button"
],
"proof": "The Polished SaaS recipe renders a contract-safe primary state for search-discovery.",
"summary": "Default state uses the recipe surface, text, and action tokens without one-off styling."
},
{
"id": "empty",
"label": "Empty",
"status": "covered",
"trigger": "Repeatable collections have zero items",
"visual_treatment": "Reserved panel space with fallback copy or placeholder media",
"token_roles": [
"panel",
"textMuted",
"badge",
"border"
],
"proof": "Repeatable fields are documented for add, remove, reorder, and item-level editing.",
"summary": "Empty-state guidance preserves layout rhythm instead of collapsing the block surface."
},
{
"id": "pending",
"label": "Pending",
"status": "covered",
"trigger": "Async assignment, embed load, or form submission is in flight",
"visual_treatment": "Neutral reserved frame with status copy and no layout shift",
"token_roles": [
"control",
"textMuted",
"progressTrack",
"border"
],
"proof": "Async-capable props are mapped through controls, events, or provider placeholders.",
"summary": "Pending state keeps dimensions stable while using muted control/status tokens."
},
{
"id": "active",
"label": "Active",
"status": "covered",
"trigger": "Selected action, active link, checked input, or open disclosure",
"visual_treatment": "Signal/uplink emphasis with visible selected-state chips",
"token_roles": [
"signal",
"uplink",
"button",
"badge"
],
"proof": "4 action surfaces and 3 control surfaces are mapped for selected-state review.",
"summary": "Active state is represented with recipe accent tokens and visible state labels."
},
{
"id": "invalid",
"label": "Invalid",
"status": "covered",
"trigger": "Required input, option, or submitted value is invalid",
"visual_treatment": "Warning/danger status treatment while preserving the block frame",
"token_roles": [
"warning",
"danger",
"border",
"text"
],
"proof": "Form controls preserve labels, required state, options, and submission metadata.",
"summary": "Invalid state guidance favors explicit status evidence over ambiguous visual collapse."
},
{
"id": "disabled",
"label": "Disabled",
"status": "covered",
"trigger": "Unavailable action or temporarily disabled control",
"visual_treatment": "Muted affordance with preserved label, spacing, and hit-area rhythm",
"token_roles": [
"control",
"textMuted",
"border",
"panel"
],
"proof": "Interactive maps preserve labels and control roles so disabled states can stay understandable.",
"summary": "Disabled state keeps the block readable and spatially stable when interaction is unavailable."
}
],
"state_readiness_states": [
"default",
"empty",
"pending",
"active",
"invalid",
"disabled"
],
"state_readiness_statuses": [
"covered",
"covered",
"covered",
"covered",
"covered",
"covered"
],
"anatomy_region_count": 5,
"anatomy_map": [
{
"id": "surface",
"label": "Surface",
"region_role": "outer layout and background",
"field_paths": [
"appearance"
],
"token_roles": [
"background",
"panel",
"panelElevated",
"border"
],
"state_ids": [
"default",
"empty",
"pending",
"active",
"invalid",
"disabled"
],
"required": true,
"summary": "search-discovery uses recipe surface tokens to keep the outer frame styled and composable."
},
{
"id": "copy",
"label": "Copy",
"region_role": "headings, body copy, labels, and supporting text",
"field_paths": [
"answer",
"description",
"filters[].label",
"recommendations[].description",
"recommendations[].title",
"results[].content_type",
"results[].description",
"results[].title",
"sources[].title",
"title"
],
"token_roles": [
"text",
"textMuted"
],
"state_ids": [
"default",
"empty",
"pending",
"active",
"invalid",
"disabled"
],
"required": true,
"summary": "Copy fields map to primary and muted text roles so editors can change words without restyling the block."
},
{
"id": "actions",
"label": "Actions",
"region_role": "CTA, link, event, and navigation affordances",
"field_paths": [
"results[].href",
"results[0]",
"results[1]",
"sources[].url",
"sources[0]",
"sources[1]"
],
"token_roles": [
"button",
"buttonText",
"signal",
"uplink"
],
"state_ids": [
"default",
"empty",
"pending",
"active",
"invalid",
"disabled"
],
"required": false,
"summary": "Action regions use recipe button and accent tokens while preserving href or event payloads."
},
{
"id": "controls",
"label": "Controls",
"region_role": "inputs, choices, form fields, and operator controls",
"field_paths": [
"filters[0]",
"filters[1]",
"filters[2]"
],
"token_roles": [
"control",
"controlText",
"border"
],
"state_ids": [
"default",
"empty",
"pending",
"active",
"invalid",
"disabled"
],
"required": false,
"summary": "Control regions keep labels, required state, and options aligned with recipe control tokens."
},
{
"id": "feedback",
"label": "Feedback",
"region_role": "status, validation, selected, loading, and disabled evidence",
"field_paths": [],
"token_roles": [
"badge",
"badgeText",
"signal"
],
"state_ids": [
"default",
"empty",
"pending",
"active",
"invalid",
"disabled"
],
"required": true,
"summary": "Feedback regions tie state-readiness evidence to visible recipe status treatments."
}
],
"anatomy_regions": [
"surface",
"copy",
"actions",
"controls",
"feedback"
],
"anatomy_token_roles": [
"background",
"badge",
"badgeText",
"border",
"button",
"buttonText",
"control",
"controlText",
"panel",
"panelElevated",
"signal",
"text",
"textMuted",
"uplink"
],
"action_count": 4,
"action_map": [
{
"path": "results[0]",
"label": "Source-backed product match",
"action_type": "link",
"href": "#block-preview",
"event_name": null,
"summary": "Source-backed product match is a link action linking to #block-preview."
},
{
"path": "results[1]",
"label": "Guided service recommendation",
"action_type": "link",
"href": "#block-preview",
"event_name": null,
"summary": "Guided service recommendation is a link action linking to #block-preview."
},
{
"path": "sources[0]",
"label": "Local fallback index",
"action_type": "link",
"href": "#block-preview",
"event_name": null,
"summary": "Local fallback index is a link action linking to #block-preview."
},
{
"path": "sources[1]",
"label": "Provider-neutral endpoint",
"action_type": "link",
"href": "#block-preview",
"event_name": null,
"summary": "Provider-neutral endpoint is a link action linking to #block-preview."
}
],
"control_count": 3,
"control_map": [
{
"path": "filters[0]",
"label": "Products",
"control_type": "text",
"required": false,
"option_count": null,
"summary": "Products is a text control."
},
{
"path": "filters[1]",
"label": "Guides",
"control_type": "text",
"required": false,
"option_count": null,
"summary": "Guides is a text control."
},
{
"path": "filters[2]",
"label": "Services",
"control_type": "text",
"required": false,
"option_count": null,
"summary": "Services is a text control."
}
],
"style_token_count": 15,
"style_token_map": [
{
"role": "background",
"label": "Page background",
"value": "#f7fbff",
"token_type": "color",
"summary": "Page background uses the background recipe token."
},
{
"role": "panel",
"label": "Panel surface",
"value": "#ffffff",
"token_type": "color",
"summary": "Panel surface uses the panel recipe token."
},
{
"role": "panelElevated",
"label": "Elevated surface",
"value": "#ffffff",
"token_type": "color",
"summary": "Elevated surface uses the panelElevated recipe token."
},
{
"role": "text",
"label": "Primary text",
"value": "#142033",
"token_type": "color",
"summary": "Primary text uses the text recipe token."
},
{
"role": "textMuted",
"label": "Muted text",
"value": "#526174",
"token_type": "color",
"summary": "Muted text uses the textMuted recipe token."
},
{
"role": "signal",
"label": "Signal accent",
"value": "#166bff",
"token_type": "color",
"summary": "Signal accent uses the signal recipe token."
},
{
"role": "uplink",
"label": "Secondary accent",
"value": "#00a6a6",
"token_type": "color",
"summary": "Secondary accent uses the uplink recipe token."
},
{
"role": "border",
"label": "Border",
"value": "#d6dee8",
"token_type": "color",
"summary": "Border uses the border recipe token."
},
{
"role": "control",
"label": "Control surface",
"value": "#ffffff",
"token_type": "color",
"summary": "Control surface uses the control recipe token."
},
{
"role": "controlText",
"label": "Control text",
"value": "#142033",
"token_type": "color",
"summary": "Control text uses the controlText recipe token."
},
{
"role": "button",
"label": "Button surface",
"value": "#166bff",
"token_type": "color",
"summary": "Button surface uses the button recipe token."
},
{
"role": "buttonText",
"label": "Button text",
"value": "#ffffff",
"token_type": "color",
"summary": "Button text uses the buttonText recipe token."
},
{
"role": "badge",
"label": "Badge surface",
"value": "#eef5ff",
"token_type": "color",
"summary": "Badge surface uses the badge recipe token."
},
{
"role": "badgeText",
"label": "Badge text",
"value": "#174ea6",
"token_type": "color",
"summary": "Badge text uses the badgeText recipe token."
},
{
"role": "fontFamily",
"label": "Font family",
"value": "Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif",
"token_type": "font",
"summary": "Font family comes from the active recipe theme tokens."
}
],
"style_token_roles": [
"background",
"panel",
"panelElevated",
"text",
"textMuted",
"signal",
"uplink",
"border",
"control",
"controlText",
"button",
"buttonText",
"badge",
"badgeText",
"fontFamily"
],
"contrast_check_count": 6,
"contrast_pass_count": 6,
"contrast_checks": [
{
"id": "text-on-background",
"label": "Text on background",
"foreground_role": "text",
"background_role": "background",
"foreground": "#142033",
"background": "#f7fbff",
"ratio": 15.73,
"required_ratio": 4.5,
"passes": true,
"level": "AAA",
"summary": "Text on background is AAA at 15.73:1 against a 4.5:1 requirement."
},
{
"id": "text-on-panel",
"label": "Text on panel",
"foreground_role": "text",
"background_role": "panel",
"foreground": "#142033",
"background": "#ffffff",
"ratio": 16.35,
"required_ratio": 4.5,
"passes": true,
"level": "AAA",
"summary": "Text on panel is AAA at 16.35:1 against a 4.5:1 requirement."
},
{
"id": "muted-text-on-panel",
"label": "Muted text on panel",
"foreground_role": "textMuted",
"background_role": "panel",
"foreground": "#526174",
"background": "#ffffff",
"ratio": 6.32,
"required_ratio": 4.5,
"passes": true,
"level": "AA",
"summary": "Muted text on panel is AA at 6.32:1 against a 4.5:1 requirement."
},
{
"id": "button-text-on-button",
"label": "Button text on button",
"foreground_role": "buttonText",
"background_role": "button",
"foreground": "#ffffff",
"background": "#166bff",
"ratio": 4.58,
"required_ratio": 4.5,
"passes": true,
"level": "AA",
"summary": "Button text on button is AA at 4.58:1 against a 4.5:1 requirement."
},
{
"id": "control-text-on-control",
"label": "Control text on control",
"foreground_role": "controlText",
"background_role": "control",
"foreground": "#142033",
"background": "#ffffff",
"ratio": 16.35,
"required_ratio": 4.5,
"passes": true,
"level": "AAA",
"summary": "Control text on control is AAA at 16.35:1 against a 4.5:1 requirement."
},
{
"id": "badge-text-on-badge",
"label": "Badge text on badge",
"foreground_role": "badgeText",
"background_role": "badge",
"foreground": "#174ea6",
"background": "#eef5ff",
"ratio": 7.15,
"required_ratio": 4.5,
"passes": true,
"level": "AAA",
"summary": "Badge text on badge is AAA at 7.15:1 against a 4.5:1 requirement."
}
],
"contrast_target": "AA",
"accessibility_standard": "WCAG_2_2_AA",
"accessibility_check_count": 5,
"accessibility_checks": [
{
"id": "semantic-structure",
"label": "Semantic structure",
"category": "semantics",
"status": "covered",
"required": true,
"proof": "runtime block sections, cards, lists, and headings",
"summary": "search-discovery keeps semantic wrappers and readable heading/copy structure in the runtime preview."
},
{
"id": "keyboard-and-tap-targets",
"label": "Keyboard and tap targets",
"category": "keyboard",
"status": "covered",
"required": true,
"proof": "mapped actions/controls render as native focusable surfaces",
"summary": "Interactive surfaces stay reachable, focusable, and recipe-styled without shrinking below expected touch affordances."
},
{
"id": "text-alternatives",
"label": "Text alternatives",
"category": "media",
"status": "covered",
"required": false,
"proof": "media slots collapse when unused",
"summary": "Recipes without media do not leave decorative media shells that need alt text."
},
{
"id": "control-labels",
"label": "Control labels",
"category": "forms",
"status": "covered",
"required": true,
"proof": "control map includes required field labels and option metadata",
"summary": "Input and choice controls are mapped with labels, required state, and option counts for CMS and runtime review."
},
{
"id": "status-and-motion",
"label": "Status and motion",
"category": "state",
"status": "covered",
"required": true,
"proof": "runtime evidence avoids hidden status-only content",
"summary": "Recipe defaults avoid motion-only meaning and keep status text inspectable when state is present."
}
],
"responsive_behavior_count": 3,
"responsive_behavior_map": [
{
"id": "phone",
"label": "Phone",
"viewport_width": 390,
"layout_mode": "single-column stack",
"column_count": 1,
"spacing_density": "comfortable",
"media_policy": "Media slots remain optional and collapse without leaving empty chrome.",
"overflow_policy": "min-width:0 surfaces, wrapping copy, and no horizontal overflow in the static catalog phone smoke.",
"interaction_policy": "Actions and controls wrap into reachable rows with stable tap targets.",
"proof": "npm run test:static:block-catalog all-blocks-phone",
"summary": "Polished SaaS stacks search-discovery into one phone column with comfortable spacing and bounded content."
},
{
"id": "tablet",
"label": "Tablet",
"viewport_width": 768,
"layout_mode": "two-column adaptive grid",
"column_count": 2,
"spacing_density": "comfortable",
"media_policy": "Media slots remain optional and collapse without leaving empty chrome.",
"overflow_policy": "tablet preview frames keep mid-width composition, wrap controls, and avoid horizontal overflow in the static catalog smoke.",
"interaction_policy": "Actions and controls wrap into reachable rows with stable tap targets.",
"proof": "npm run test:static:block-catalog all-blocks-tablet",
"summary": "Polished SaaS adapts search-discovery to 2 tablet columns before expanding to the desktop layout."
},
{
"id": "desktop",
"label": "Desktop",
"viewport_width": 1366,
"layout_mode": "responsive composition grid",
"column_count": 2,
"spacing_density": "comfortable",
"media_policy": "Media slots remain optional and collapse without leaving empty chrome.",
"overflow_policy": "desktop preview frames keep constrained widths, stable cards, and no horizontal overflow in the static catalog smoke.",
"interaction_policy": "Actions and controls wrap into reachable rows with stable tap targets.",
"proof": "npm run test:static:block-catalog all-blocks-desktop",
"summary": "Polished SaaS gives search-discovery up to 2 desktop columns while preserving recipe spacing."
}
],
"responsive_viewports": [
"phone",
"tablet",
"desktop"
],
"responsive_proof": [
"npm run test:static:block-catalog all-blocks-phone",
"npm run test:static:block-catalog all-blocks-tablet",
"npm run test:static:block-catalog all-blocks-desktop"
],
"interactive_roles": [
"link",
"text"
],
"recipe_alignment": {
"action_token": "button",
"control_token": "control",
"surface_token": "panel",
"text_token": "text",
"source": "theme recipe tokens"
}
},
"cloneable": true
}
}A brandable payload that includes placeholder media where the block can express imagery, previews, or visual proof.
search-discovery uses recipe surface tokens to keep the outer frame styled and composable.
background, panel, panelElevated, borderCopy fields map to primary and muted text roles so editors can change words without restyling the block.
text, textMutedAction regions use recipe button and accent tokens while preserving href or event payloads.
button, buttonText, signal, uplinkControl regions keep labels, required state, and options aligned with recipe control tokens.
control, controlText, borderFeedback regions tie state-readiness evidence to visible recipe status treatments.
badge, badgeText, signalUse when the search-discovery story depends on replaceable imagery, embeds, logos, or visual proof.
Media Ready is a high-complexity media-led recipe with 5 documented composition slots.
3 required regions, 2 optional regions.
search-discovery is best composed into funnel, contact, service-page, and related pages.
4 page types mapped for search-discovery.Choose the first matching page type before editing copy, media, or actions so the recipe starts in the right narrative context.search-discovery can act as conversion, content, form-controls within a composed page.
5 anatomy regions produce 3 section roles.Place the block where its required anatomy regions have enough room before compressing it into dense page slots.Media Ready composition passport is copy-led, cta-led, input-led for CMS composition.
32/33 fields are editable across 3 content models.Keep the content model stable when replacing defaults; do not turn a repeatable or media-led recipe into unrelated ad hoc content.search-discovery carries link-link, text interaction affordances.
4 action surfaces and 3 control surfaces mapped.Review href, event, input, required, and disabled-state evidence before publishing an interactive recipe.search-discovery uses media-led authoring with high complexity.
33 default provenance items with 2 high-care replacements.Use the default provenance map before cloning the recipe into CMS content or agent-generated page data.search-discovery has explicit phone, tablet, and desktop compatibility evidence for composed pages.
3 responsive behavior maps cover phone, tablet, and desktop composition.Review phone wrapping, tablet mid-width balance, and desktop density before adding nested content, longer labels, or extra media.search-discovery keeps a stable recipe surface with panel, border, and spacing roles instead of ad hoc wrappers.
image treatment uses spacious density and 18px radius base.background, panel, panelElevated, borderPrimary, muted, and badge text roles stay distinct enough for headings, body copy, metadata, and helper text.
6/6 contrast checks pass the AA target.text, textMuted, badgeTextInteractive regions use recipe action/control tokens and preserve labels, hrefs, events, required state, and options.
4 action surfaces and 3 control surfaces mapped.button, buttonText, control, controlText, signal, uplinkThe recipe remains polished without requiring placeholder media or visual assets inside this block.
No media region is required for this recipe.panelElevated, border, textMutedFeedback, selected, loading, invalid, and disabled treatments use visible state evidence instead of color-only meaning.
6 state-readiness entries include default, empty, pending, active, invalid, disabled.badge, badgeText, signalPhone, tablet, and desktop defaults have explicit stack, wrap, media, and overflow policies for the recipe.
single-column stack phone behavior, two-column adaptive grid tablet behavior, and responsive composition grid desktop behavior documented.panel, border, controlKeep visual styling aligned to Polished SaaS Growth recipe tokens unless the recipe itself changes.
Polished SaaS Growth recipe tokensCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadReplace the asset through CMS media data and keep alt, title, provider, or label fallback text meaningful.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadKeep the label paired with a valid href or canonical postEvent event name before publishing.
CMS route, URL, or canonical postEvent pathEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadKeep the label paired with a valid href or canonical postEvent event name before publishing.
CMS route, URL, or canonical postEvent pathCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadCopy bundle groups 10 fields so CMS edits preserve the recipe shape and default polish.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.Action bundle groups 2 fields so CMS edits preserve the recipe shape and default polish.
CMS route, URL, or canonical postEvent pathKeep the label paired with a valid href or canonical postEvent event name before publishing.Proof bundle groups 1 field so CMS edits preserve the recipe shape and default polish.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.Style bundle groups 1 field so CMS edits preserve the recipe shape and default polish.
Polished SaaS Growth recipe tokensKeep visual styling aligned to Polished SaaS Growth recipe tokens unless the recipe itself changes.Content bundle groups 19 fields so CMS edits preserve the recipe shape and default polish.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.
cloneable block recipe payloadActions should resolve to a URL or event name with a human-readable label.
CMS route, URL, or canonical postEvent pathProof fields should keep labels, values, and status text visible without color-only meaning.
cloneable block recipe payloadStyle fields should prefer recipe or appearance tokens over one-off inline values.
Polished SaaS Growth recipe tokensContent should remain serializable JSON and preserve the documented block contract.
cloneable block recipe payloadPolished SaaS Growth tokens with image documentation treatment
The Polished SaaS Growth recipe renders a contract-safe primary state for search-discovery.Reserved panel space with fallback copy or placeholder media
Repeatable fields are documented for add, remove, reorder, and item-level editing.Neutral reserved frame with status copy and no layout shift
Async-capable props are mapped through controls, events, or provider placeholders.Signal/uplink emphasis with visible selected-state chips
4 action surfaces and 3 control surfaces are mapped for selected-state review.Warning/danger status treatment while preserving the block frame
Form controls preserve labels, required state, options, and submission metadata.Muted affordance with preserved label, spacing, and hit-area rhythm
Interactive maps preserve labels and control roles so disabled states can stay understandable.search-discovery keeps semantic wrappers and readable heading/copy structure in the runtime preview.
runtime block sections, cards, lists, and headingsInteractive surfaces stay reachable, focusable, and recipe-styled without shrinking below expected touch affordances.
mapped actions/controls render as native focusable surfacesRecipes without media do not leave decorative media shells that need alt text.
media slots collapse when unusedInput and choice controls are mapped with labels, required state, and option counts for CMS and runtime review.
control map includes required field labels and option metadataRecipe defaults avoid motion-only meaning and keep status text inspectable when state is present.
runtime evidence avoids hidden status-only contentPolished SaaS Growth stacks search-discovery into one phone column with spacious spacing and bounded content.
min-width:0 surfaces, wrapping copy, and no horizontal overflow in the static catalog phone smoke.Polished SaaS Growth adapts search-discovery to 2 tablet columns before expanding to the desktop layout.
tablet preview frames keep mid-width composition, wrap controls, and avoid horizontal overflow in the static catalog smoke.Polished SaaS Growth gives search-discovery up to 2 desktop columns while preserving recipe spacing.
desktop preview frames keep constrained widths, stable cards, and no horizontal overflow in the static catalog smoke.RAG-ready discovery block with deterministic local results, source cards, facets, and provider trace metadata.
Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.
Product
A discovery result with category, tags, action, and citation-style source metadata.
Recommendation
Recommendation surfaces use the same result card contract for static and API-backed states.
Demo retrieval does not replace tenant review, compliance review, or safety guidance.
{
"id": "block-doc-search-discovery-data-media-ready",
"block_type": "search-discovery",
"props": {
"appearance": {
"preset": "bento"
},
"title": "Search discovery",
"description": "RAG-ready discovery block with deterministic local results, source cards, facets, and provider trace metadata.",
"query_placeholder": "Search services, products, or resources",
"mode": "both",
"surface": "block-explorer",
"provider": "local-fallback",
"api": {
"search_endpoint": "/api/ensemble/templates/example-sites/kindcart-market/rag/search",
"recommend_endpoint": "/api/ensemble/templates/example-sites/kindcart-market/rag/recommend"
},
"filters": [
{
"label": "Products",
"value": "products",
"count": 3
},
{
"label": "Guides",
"value": "guides",
"count": 2
},
{
"label": "Services",
"value": "services",
"count": 4
}
],
"answer": "Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.",
"results": [
{
"title": "Source-backed product match",
"description": "A discovery result with category, tags, action, and citation-style source metadata.",
"category": "Product",
"topic": "Catalog retrieval",
"byline": "Block Explorer desk",
"published_at": "2026-06-09",
"freshness": "Demo source",
"content_type": "article",
"reading_time": "4 min read",
"tags": [
"rag-ready",
"local"
],
"href": "#block-preview",
"sources": [
{
"title": "Template catalog source",
"citation_label": "Catalog source A",
"excerpt": "Example-site content roots can include local retrieval indexes."
}
]
},
{
"title": "Guided service recommendation",
"description": "Recommendation surfaces use the same result card contract for static and API-backed states.",
"category": "Recommendation",
"tags": [
"guided",
"source-card"
],
"href": "#block-preview",
"sources": [
{
"title": "Operator-approved source",
"excerpt": "Replace demo content with tenant-approved source records before publishing."
}
]
}
],
"recommendations": [
{
"title": "Ask for a fit check",
"description": "Use provider-neutral recommendation APIs when external retrieval is configured."
},
{
"title": "Review source cards",
"description": "Show citations and trace metadata before a user acts on a recommendation."
}
],
"sources": [
{
"title": "Local fallback index",
"url": "#block-preview"
},
{
"title": "Provider-neutral endpoint",
"url": "#block-preview"
}
],
"disclaimer": "Demo retrieval does not replace tenant review, compliance review, or safety guidance."
},
"block_order": 2,
"metadata": {
"composition_recipe": {
"id": "media-ready",
"intent": "media",
"label": "Media Ready",
"recipe": "polished-saas-growth",
"source": "block-explorer",
"quality_proof": [
"composition"
],
"composition_passport": {
"id": "media-ready",
"label": "Media Ready composition passport",
"intent": "media",
"recipe": "polished-saas-growth",
"authoring_mode": "media-led",
"complexity": "high",
"fit": "Use when the search-discovery story depends on replaceable imagery, embeds, logos, or visual proof.",
"required_regions": [
"surface",
"copy",
"feedback"
],
"optional_regions": [
"actions",
"controls"
],
"slots": [
{
"id": "surface",
"label": "Surface",
"required": true,
"field_count": 1,
"editable_count": 0,
"token_roles": [
"background",
"panel",
"panelElevated",
"border"
],
"summary": "search-discovery uses recipe surface tokens to keep the outer frame styled and composable."
},
{
"id": "copy",
"label": "Copy",
"required": true,
"field_count": 10,
"editable_count": 10,
"token_roles": [
"text",
"textMuted"
],
"summary": "Copy fields map to primary and muted text roles so editors can change words without restyling the block."
},
{
"id": "actions",
"label": "Actions",
"required": false,
"field_count": 6,
"editable_count": 2,
"token_roles": [
"button",
"buttonText",
"signal",
"uplink"
],
"summary": "Action regions use recipe button and accent tokens while preserving href or event payloads."
},
{
"id": "controls",
"label": "Controls",
"required": false,
"field_count": 3,
"editable_count": 0,
"token_roles": [
"control",
"controlText",
"border"
],
"summary": "Control regions keep labels, required state, and options aligned with recipe control tokens."
},
{
"id": "feedback",
"label": "Feedback",
"required": true,
"field_count": 0,
"editable_count": 0,
"token_roles": [
"badge",
"badgeText",
"signal"
],
"summary": "Feedback regions tie state-readiness evidence to visible recipe status treatments."
}
],
"builder_field_count": 33,
"editable_field_count": 32,
"action_count": 4,
"control_count": 3,
"replacement_guidance": [
"Keep Polished SaaS Growth recipe tokens as the source of visual styling for the surface, text, controls, and actions.",
"No media replacement is required; keep the layout rhythm stable when optional visual fields are omitted.",
"Verify each action keeps either a valid href or canonical event name plus an editor-visible label.",
"Verify control labels, required state, choices, and submission metadata before publishing.",
"The recipe does not require repeatable collection editing."
],
"publish_checklist": [
"Validate search-discovery against its block contract before publishing.",
"3 required anatomy regions remain present: surface, copy, feedback.",
"32/33 builder fields are CMS-editable or intentionally locked.",
"Interactive labels, target size, href/event wiring, and disabled states have been reviewed.",
"Phone, tablet, and desktop responsive behavior maps have been reviewed for wrapping and overflow.",
"Contrast checks meet the AA recipe target."
],
"agent_notes": [
"Prefer editing props fields described by the builder field map; metadata is evidence, not primary content.",
"Preserve recipe_alignment token roles unless the page theme or recipe changes intentionally.",
"Use the anatomy slots to compose or replace content without changing the block type."
],
"summary": "Media Ready is a high-complexity media-led recipe with 5 documented composition slots."
},
"composition_passport_complexity": "high",
"composition_passport_authoring_mode": "media-led",
"composition_passport_slots": [
"surface",
"copy",
"actions",
"controls",
"feedback"
],
"composition_passport_check_count": 6,
"visual_polish_check_count": 6,
"visual_polish_pass_count": 6,
"visual_polish_checks": [
{
"id": "surface-rhythm",
"label": "Surface rhythm",
"axis": "layout",
"status": "ready",
"token_roles": [
"background",
"panel",
"panelElevated",
"border"
],
"evidence": "image treatment uses spacious density and 18px radius base.",
"summary": "search-discovery keeps a stable recipe surface with panel, border, and spacing roles instead of ad hoc wrappers."
},
{
"id": "type-hierarchy",
"label": "Type hierarchy",
"axis": "typography",
"status": "ready",
"token_roles": [
"text",
"textMuted",
"badgeText"
],
"evidence": "6/6 contrast checks pass the AA target.",
"summary": "Primary, muted, and badge text roles stay distinct enough for headings, body copy, metadata, and helper text."
},
{
"id": "action-clarity",
"label": "Action clarity",
"axis": "interaction",
"status": "ready",
"token_roles": [
"button",
"buttonText",
"control",
"controlText",
"signal",
"uplink"
],
"evidence": "4 action surfaces and 3 control surfaces mapped.",
"summary": "Interactive regions use recipe action/control tokens and preserve labels, hrefs, events, required state, and options."
},
{
"id": "media-treatment",
"label": "Media treatment",
"axis": "media",
"status": "ready",
"token_roles": [
"panelElevated",
"border",
"textMuted"
],
"evidence": "No media region is required for this recipe.",
"summary": "The recipe remains polished without requiring placeholder media or visual assets inside this block."
},
{
"id": "state-feedback",
"label": "State feedback",
"axis": "state",
"status": "ready",
"token_roles": [
"badge",
"badgeText",
"signal"
],
"evidence": "6 state-readiness entries include default, empty, pending, active, invalid, disabled.",
"summary": "Feedback, selected, loading, invalid, and disabled treatments use visible state evidence instead of color-only meaning."
},
{
"id": "responsive-balance",
"label": "Responsive balance",
"axis": "responsive",
"status": "ready",
"token_roles": [
"panel",
"border",
"control"
],
"evidence": "single-column stack phone behavior, two-column adaptive grid tablet behavior, and responsive composition grid desktop behavior documented.",
"summary": "Phone, tablet, and desktop defaults have explicit stack, wrap, media, and overflow policies for the recipe."
}
],
"visual_polish_axes": [
"layout",
"typography",
"interaction",
"media",
"state",
"responsive"
],
"default_provenance_count": 33,
"default_provenance_map": [
{
"path": "appearance",
"label": "Appearance",
"field_role": "style",
"value_type": "object",
"editable": false,
"repeated": false,
"default_source": "Polished SaaS Growth recipe tokens",
"replacement_policy": "locked-token",
"replacement_risk": "medium",
"guardrail": "Keep visual styling aligned to Polished SaaS Growth recipe tokens unless the recipe itself changes.",
"validation": "Style fields should prefer recipe or appearance tokens over one-off inline values.",
"summary": "Appearance defaults from Polished SaaS Growth recipe tokens; replacement is medium risk with locked-token policy."
},
{
"path": "title",
"label": "Title",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Title defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "description",
"label": "Description",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Description defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "query_placeholder",
"label": "Query Placeholder",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Query Placeholder defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "mode",
"label": "Mode",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Mode defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "surface",
"label": "Surface",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Surface defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "provider",
"label": "Provider",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "requires-alt-text",
"replacement_risk": "medium",
"guardrail": "Replace the asset through CMS media data and keep alt, title, provider, or label fallback text meaningful.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Provider defaults from cloneable block recipe payload; replacement is medium risk with requires-alt-text policy."
},
{
"path": "api",
"label": "Api",
"field_role": "content",
"value_type": "object",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Api defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "filters",
"label": "Filters",
"field_role": "content",
"value_type": "array",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Filters defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "filters[].label",
"label": "Filters Item Label",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Filters Item Label defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "filters[].value",
"label": "Filters Item Value",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Filters Item Value defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "filters[].count",
"label": "Filters Item Count",
"field_role": "content",
"value_type": "number",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Filters Item Count defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "answer",
"label": "Answer",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Answer defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "results",
"label": "Results",
"field_role": "content",
"value_type": "array",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Results defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "results[].title",
"label": "Results Item Title",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Results Item Title defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].description",
"label": "Results Item Description",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Results Item Description defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].category",
"label": "Results Item Category",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Results Item Category defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].topic",
"label": "Results Item Topic",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Results Item Topic defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].byline",
"label": "Results Item Byline",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Results Item Byline defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].published_at",
"label": "Results Item Published At",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Results Item Published At defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].freshness",
"label": "Results Item Freshness",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Results Item Freshness defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].content_type",
"label": "Results Item Content Type",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Results Item Content Type defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].reading_time",
"label": "Results Item Reading Time",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Results Item Reading Time defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].tags",
"label": "Results Item Tags",
"field_role": "proof",
"value_type": "array",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Proof fields should keep labels, values, and status text visible without color-only meaning.",
"summary": "Results Item Tags defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].href",
"label": "Results Item Href",
"field_role": "action",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "CMS route, URL, or canonical postEvent path",
"replacement_policy": "requires-action-target",
"replacement_risk": "high",
"guardrail": "Keep the label paired with a valid href or canonical postEvent event name before publishing.",
"validation": "Actions should resolve to a URL or event name with a human-readable label.",
"summary": "Results Item Href defaults from CMS route, URL, or canonical postEvent path; replacement is high risk with requires-action-target policy."
},
{
"path": "results[].sources",
"label": "Results Item Sources",
"field_role": "content",
"value_type": "array",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Results Item Sources defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "recommendations",
"label": "Recommendations",
"field_role": "content",
"value_type": "array",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Recommendations defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "recommendations[].title",
"label": "Recommendations Item Title",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Recommendations Item Title defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "recommendations[].description",
"label": "Recommendations Item Description",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Recommendations Item Description defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "sources",
"label": "Sources",
"field_role": "content",
"value_type": "array",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Sources defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "sources[].title",
"label": "Sources Item Title",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Sources Item Title defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "sources[].url",
"label": "Sources Item Url",
"field_role": "action",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "CMS route, URL, or canonical postEvent path",
"replacement_policy": "requires-action-target",
"replacement_risk": "high",
"guardrail": "Keep the label paired with a valid href or canonical postEvent event name before publishing.",
"validation": "Actions should resolve to a URL or event name with a human-readable label.",
"summary": "Sources Item Url defaults from CMS route, URL, or canonical postEvent path; replacement is high risk with requires-action-target policy."
},
{
"path": "disclaimer",
"label": "Disclaimer",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Disclaimer defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
}
],
"default_replacement_policies": [
"collection-item",
"locked-token",
"requires-action-target",
"requires-alt-text",
"safe-to-edit"
],
"default_replacement_risks": [
"high",
"low",
"medium"
],
"default_replacement_high_risk_count": 2,
"content_edit_bundle_count": 5,
"content_edit_bundles": [
{
"id": "copy",
"label": "Copy bundle",
"intent": "required",
"edit_mode": "repeatable-items",
"field_paths": [
"answer",
"description",
"filters[].label",
"recommendations[].description",
"recommendations[].title",
"results[].content_type",
"results[].description",
"results[].title",
"sources[].title",
"title"
],
"default_sources": [
"cloneable block recipe payload"
],
"guardrails": [
"Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape."
],
"depends_on": [
"type hierarchy",
"mobile wrapping"
],
"summary": "Copy bundle groups 10 fields so CMS edits preserve the recipe shape and default polish."
},
{
"id": "actions",
"label": "Action bundle",
"intent": "recommended",
"edit_mode": "repeatable-items",
"field_paths": [
"results[].href",
"sources[].url"
],
"default_sources": [
"CMS route, URL, or canonical postEvent path"
],
"guardrails": [
"Keep the label paired with a valid href or canonical postEvent event name before publishing."
],
"depends_on": [
"copy labels",
"href or event target",
"state readiness"
],
"summary": "Action bundle groups 2 fields so CMS edits preserve the recipe shape and default polish."
},
{
"id": "proof",
"label": "Proof bundle",
"intent": "recommended",
"edit_mode": "repeatable-items",
"field_paths": [
"results[].tags"
],
"default_sources": [
"cloneable block recipe payload"
],
"guardrails": [
"Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape."
],
"depends_on": [
"copy labels",
"contrast proof"
],
"summary": "Proof bundle groups 1 field so CMS edits preserve the recipe shape and default polish."
},
{
"id": "style",
"label": "Style bundle",
"intent": "guarded",
"edit_mode": "guarded-system",
"field_paths": [
"appearance"
],
"default_sources": [
"Polished SaaS Growth recipe tokens"
],
"guardrails": [
"Keep visual styling aligned to Polished SaaS Growth recipe tokens unless the recipe itself changes."
],
"depends_on": [
"theme recipe tokens",
"contrast proof"
],
"summary": "Style bundle groups 1 field so CMS edits preserve the recipe shape and default polish."
},
{
"id": "content",
"label": "Content bundle",
"intent": "required",
"edit_mode": "repeatable-items",
"field_paths": [
"api",
"disclaimer",
"filters",
"filters[].count",
"filters[].value",
"mode",
"provider",
"query_placeholder",
"recommendations",
"results",
"results[].byline",
"results[].category",
"results[].freshness",
"results[].published_at",
"results[].reading_time",
"results[].sources",
"results[].topic",
"sources",
"surface"
],
"default_sources": [
"cloneable block recipe payload"
],
"guardrails": [
"Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"Replace the asset through CMS media data and keep alt, title, provider, or label fallback text meaningful."
],
"depends_on": [
"contract-safe JSON"
],
"summary": "Content bundle groups 19 fields so CMS edits preserve the recipe shape and default polish."
}
],
"content_edit_bundle_ids": [
"copy",
"actions",
"proof",
"style",
"content"
],
"content_edit_bundle_modes": [
"guarded-system",
"repeatable-items"
],
"content_edit_bundle_required_count": 2,
"content_edit_bundle_guarded_count": 1,
"recipe_compatibility_count": 6,
"recipe_compatibility_map": [
{
"id": "page-context",
"label": "Page context",
"axis": "page",
"fit": "primary",
"values": [
"funnel",
"contact",
"service-page",
"event-promotion"
],
"evidence": "4 page types mapped for search-discovery.",
"guardrail": "Choose the first matching page type before editing copy, media, or actions so the recipe starts in the right narrative context.",
"summary": "search-discovery is best composed into funnel, contact, service-page, and related pages."
},
{
"id": "section-role",
"label": "Section role",
"axis": "layout",
"fit": "primary",
"values": [
"conversion",
"content",
"form-controls"
],
"evidence": "5 anatomy regions produce 3 section roles.",
"guardrail": "Place the block where its required anatomy regions have enough room before compressing it into dense page slots.",
"summary": "search-discovery can act as conversion, content, form-controls within a composed page."
},
{
"id": "content-model",
"label": "Content model",
"axis": "content",
"fit": "supporting",
"values": [
"copy-led",
"cta-led",
"input-led"
],
"evidence": "32/33 fields are editable across 3 content models.",
"guardrail": "Keep the content model stable when replacing defaults; do not turn a repeatable or media-led recipe into unrelated ad hoc content.",
"summary": "Media Ready composition passport is copy-led, cta-led, input-led for CMS composition."
},
{
"id": "interaction-model",
"label": "Interaction model",
"axis": "interaction",
"fit": "primary",
"values": [
"link-link",
"text"
],
"evidence": "4 action surfaces and 3 control surfaces mapped.",
"guardrail": "Review href, event, input, required, and disabled-state evidence before publishing an interactive recipe.",
"summary": "search-discovery carries link-link, text interaction affordances."
},
{
"id": "authoring-fit",
"label": "Authoring fit",
"axis": "authoring",
"fit": "specialized",
"values": [
"media-led",
"high-complexity",
"2-high-care-replacements"
],
"evidence": "33 default provenance items with 2 high-care replacements.",
"guardrail": "Use the default provenance map before cloning the recipe into CMS content or agent-generated page data.",
"summary": "search-discovery uses media-led authoring with high complexity."
},
{
"id": "responsive-fit",
"label": "Responsive fit",
"axis": "responsive",
"fit": "primary",
"values": [
"single-column stack",
"two-column adaptive grid",
"responsive composition grid",
"min-width:0 surfaces, wrapping copy, and no horizontal overflow in the static catalog phone smoke."
],
"evidence": "3 responsive behavior maps cover phone, tablet, and desktop composition.",
"guardrail": "Review phone wrapping, tablet mid-width balance, and desktop density before adding nested content, longer labels, or extra media.",
"summary": "search-discovery has explicit phone, tablet, and desktop compatibility evidence for composed pages."
}
],
"recipe_compatibility_axes": [
"page",
"layout",
"content",
"interaction",
"authoring",
"responsive"
],
"recipe_compatibility_page_types": [
"funnel",
"contact",
"service-page",
"event-promotion"
],
"recipe_compatibility_section_roles": [
"conversion",
"content",
"form-controls"
],
"recipe_compatibility_fits": [
"primary",
"specialized",
"supporting"
],
"builder_field_count": 33,
"builder_field_map": [
{
"path": "appearance",
"label": "Appearance",
"value_type": "object",
"role": "style",
"editable": false,
"repeated": false,
"summary": "Appearance is a object field used for style."
},
{
"path": "title",
"label": "Title",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": false,
"summary": "Title is a string field used for copy."
},
{
"path": "description",
"label": "Description",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": false,
"summary": "Description is a string field used for copy."
},
{
"path": "query_placeholder",
"label": "Query Placeholder",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Query Placeholder is a string field used for content."
},
{
"path": "mode",
"label": "Mode",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Mode is a string field used for content."
},
{
"path": "surface",
"label": "Surface",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Surface is a string field used for content."
},
{
"path": "provider",
"label": "Provider",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Provider is a string field used for content."
},
{
"path": "api",
"label": "Api",
"value_type": "object",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Api is a object field used for content."
},
{
"path": "filters",
"label": "Filters",
"value_type": "array",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Filters is a array field used for content."
},
{
"path": "filters[].label",
"label": "Filters Item Label",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": true,
"summary": "Filters Item Label is a string collection field used for copy."
},
{
"path": "filters[].value",
"label": "Filters Item Value",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": true,
"summary": "Filters Item Value is a string collection field used for content."
},
{
"path": "filters[].count",
"label": "Filters Item Count",
"value_type": "number",
"role": "content",
"editable": true,
"repeated": true,
"summary": "Filters Item Count is a number collection field used for content."
},
{
"path": "answer",
"label": "Answer",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": false,
"summary": "Answer is a string field used for copy."
},
{
"path": "results",
"label": "Results",
"value_type": "array",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Results is a array field used for content."
},
{
"path": "results[].title",
"label": "Results Item Title",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": true,
"summary": "Results Item Title is a string collection field used for copy."
},
{
"path": "results[].description",
"label": "Results Item Description",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": true,
"summary": "Results Item Description is a string collection field used for copy."
},
{
"path": "results[].category",
"label": "Results Item Category",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": true,
"summary": "Results Item Category is a string collection field used for content."
},
{
"path": "results[].topic",
"label": "Results Item Topic",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": true,
"summary": "Results Item Topic is a string collection field used for content."
},
{
"path": "results[].byline",
"label": "Results Item Byline",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": true,
"summary": "Results Item Byline is a string collection field used for content."
},
{
"path": "results[].published_at",
"label": "Results Item Published At",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": true,
"summary": "Results Item Published At is a string collection field used for content."
},
{
"path": "results[].freshness",
"label": "Results Item Freshness",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": true,
"summary": "Results Item Freshness is a string collection field used for content."
},
{
"path": "results[].content_type",
"label": "Results Item Content Type",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": true,
"summary": "Results Item Content Type is a string collection field used for copy."
},
{
"path": "results[].reading_time",
"label": "Results Item Reading Time",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": true,
"summary": "Results Item Reading Time is a string collection field used for content."
},
{
"path": "results[].tags",
"label": "Results Item Tags",
"value_type": "array",
"role": "proof",
"editable": true,
"repeated": true,
"summary": "Results Item Tags is a array collection field used for proof."
},
{
"path": "results[].href",
"label": "Results Item Href",
"value_type": "string",
"role": "action",
"editable": true,
"repeated": true,
"summary": "Results Item Href is a string collection field used for action."
},
{
"path": "results[].sources",
"label": "Results Item Sources",
"value_type": "array",
"role": "content",
"editable": true,
"repeated": true,
"summary": "Results Item Sources is a array collection field used for content."
},
{
"path": "recommendations",
"label": "Recommendations",
"value_type": "array",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Recommendations is a array field used for content."
},
{
"path": "recommendations[].title",
"label": "Recommendations Item Title",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": true,
"summary": "Recommendations Item Title is a string collection field used for copy."
},
{
"path": "recommendations[].description",
"label": "Recommendations Item Description",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": true,
"summary": "Recommendations Item Description is a string collection field used for copy."
},
{
"path": "sources",
"label": "Sources",
"value_type": "array",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Sources is a array field used for content."
},
{
"path": "sources[].title",
"label": "Sources Item Title",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": true,
"summary": "Sources Item Title is a string collection field used for copy."
},
{
"path": "sources[].url",
"label": "Sources Item Url",
"value_type": "string",
"role": "action",
"editable": true,
"repeated": true,
"summary": "Sources Item Url is a string collection field used for action."
},
{
"path": "disclaimer",
"label": "Disclaimer",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Disclaimer is a string field used for content."
}
],
"editor_guidance_count": 5,
"editor_guidance_map": [
{
"id": "copy",
"label": "Copy",
"field_role": "copy",
"field_count": 10,
"editable_count": 10,
"editor_widget": "text/rich-text editor",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"default_source": "cloneable block recipe payload",
"summary": "Copy fields use the text/rich-text editor across 10/10 editable fields."
},
{
"id": "action",
"label": "Action",
"field_role": "action",
"field_count": 2,
"editable_count": 2,
"editor_widget": "link or event action editor",
"validation": "Actions should resolve to a URL or event name with a human-readable label.",
"default_source": "CMS route, URL, or canonical postEvent path",
"summary": "Action fields use the link or event action editor across 2/2 editable fields."
},
{
"id": "proof",
"label": "Proof",
"field_role": "proof",
"field_count": 1,
"editable_count": 1,
"editor_widget": "metric, badge, or proof editor",
"validation": "Proof fields should keep labels, values, and status text visible without color-only meaning.",
"default_source": "cloneable block recipe payload",
"summary": "Proof fields use the metric, badge, or proof editor across 1/1 editable field."
},
{
"id": "style",
"label": "Style",
"field_role": "style",
"field_count": 1,
"editable_count": 0,
"editor_widget": "appearance preset selector",
"validation": "Style fields should prefer recipe or appearance tokens over one-off inline values.",
"default_source": "Polished SaaS Growth recipe tokens",
"summary": "Style fields use the appearance preset selector across 0/1 editable field."
},
{
"id": "content",
"label": "Content",
"field_role": "content",
"field_count": 19,
"editable_count": 19,
"editor_widget": "plain content field",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"default_source": "cloneable block recipe payload",
"summary": "Content fields use the plain content field across 19/19 editable fields."
}
],
"editor_field_roles": [
"copy",
"action",
"proof",
"style",
"content"
],
"editor_editable_field_count": 32,
"state_readiness_count": 6,
"state_readiness_map": [
{
"id": "default",
"label": "Default",
"status": "covered",
"trigger": "Initial render with the cloneable recipe payload",
"visual_treatment": "Polished SaaS Growth tokens with image documentation treatment",
"token_roles": [
"surface",
"panel",
"text",
"button"
],
"proof": "The Polished SaaS Growth recipe renders a contract-safe primary state for search-discovery.",
"summary": "Default state uses the recipe surface, text, and action tokens without one-off styling."
},
{
"id": "empty",
"label": "Empty",
"status": "covered",
"trigger": "Repeatable collections have zero items",
"visual_treatment": "Reserved panel space with fallback copy or placeholder media",
"token_roles": [
"panel",
"textMuted",
"badge",
"border"
],
"proof": "Repeatable fields are documented for add, remove, reorder, and item-level editing.",
"summary": "Empty-state guidance preserves layout rhythm instead of collapsing the block surface."
},
{
"id": "pending",
"label": "Pending",
"status": "covered",
"trigger": "Async assignment, embed load, or form submission is in flight",
"visual_treatment": "Neutral reserved frame with status copy and no layout shift",
"token_roles": [
"control",
"textMuted",
"progressTrack",
"border"
],
"proof": "Async-capable props are mapped through controls, events, or provider placeholders.",
"summary": "Pending state keeps dimensions stable while using muted control/status tokens."
},
{
"id": "active",
"label": "Active",
"status": "covered",
"trigger": "Selected action, active link, checked input, or open disclosure",
"visual_treatment": "Signal/uplink emphasis with visible selected-state chips",
"token_roles": [
"signal",
"uplink",
"button",
"badge"
],
"proof": "4 action surfaces and 3 control surfaces are mapped for selected-state review.",
"summary": "Active state is represented with recipe accent tokens and visible state labels."
},
{
"id": "invalid",
"label": "Invalid",
"status": "covered",
"trigger": "Required input, option, or submitted value is invalid",
"visual_treatment": "Warning/danger status treatment while preserving the block frame",
"token_roles": [
"warning",
"danger",
"border",
"text"
],
"proof": "Form controls preserve labels, required state, options, and submission metadata.",
"summary": "Invalid state guidance favors explicit status evidence over ambiguous visual collapse."
},
{
"id": "disabled",
"label": "Disabled",
"status": "covered",
"trigger": "Unavailable action or temporarily disabled control",
"visual_treatment": "Muted affordance with preserved label, spacing, and hit-area rhythm",
"token_roles": [
"control",
"textMuted",
"border",
"panel"
],
"proof": "Interactive maps preserve labels and control roles so disabled states can stay understandable.",
"summary": "Disabled state keeps the block readable and spatially stable when interaction is unavailable."
}
],
"state_readiness_states": [
"default",
"empty",
"pending",
"active",
"invalid",
"disabled"
],
"state_readiness_statuses": [
"covered",
"covered",
"covered",
"covered",
"covered",
"covered"
],
"anatomy_region_count": 5,
"anatomy_map": [
{
"id": "surface",
"label": "Surface",
"region_role": "outer layout and background",
"field_paths": [
"appearance"
],
"token_roles": [
"background",
"panel",
"panelElevated",
"border"
],
"state_ids": [
"default",
"empty",
"pending",
"active",
"invalid",
"disabled"
],
"required": true,
"summary": "search-discovery uses recipe surface tokens to keep the outer frame styled and composable."
},
{
"id": "copy",
"label": "Copy",
"region_role": "headings, body copy, labels, and supporting text",
"field_paths": [
"answer",
"description",
"filters[].label",
"recommendations[].description",
"recommendations[].title",
"results[].content_type",
"results[].description",
"results[].title",
"sources[].title",
"title"
],
"token_roles": [
"text",
"textMuted"
],
"state_ids": [
"default",
"empty",
"pending",
"active",
"invalid",
"disabled"
],
"required": true,
"summary": "Copy fields map to primary and muted text roles so editors can change words without restyling the block."
},
{
"id": "actions",
"label": "Actions",
"region_role": "CTA, link, event, and navigation affordances",
"field_paths": [
"results[].href",
"results[0]",
"results[1]",
"sources[].url",
"sources[0]",
"sources[1]"
],
"token_roles": [
"button",
"buttonText",
"signal",
"uplink"
],
"state_ids": [
"default",
"empty",
"pending",
"active",
"invalid",
"disabled"
],
"required": false,
"summary": "Action regions use recipe button and accent tokens while preserving href or event payloads."
},
{
"id": "controls",
"label": "Controls",
"region_role": "inputs, choices, form fields, and operator controls",
"field_paths": [
"filters[0]",
"filters[1]",
"filters[2]"
],
"token_roles": [
"control",
"controlText",
"border"
],
"state_ids": [
"default",
"empty",
"pending",
"active",
"invalid",
"disabled"
],
"required": false,
"summary": "Control regions keep labels, required state, and options aligned with recipe control tokens."
},
{
"id": "feedback",
"label": "Feedback",
"region_role": "status, validation, selected, loading, and disabled evidence",
"field_paths": [],
"token_roles": [
"badge",
"badgeText",
"signal"
],
"state_ids": [
"default",
"empty",
"pending",
"active",
"invalid",
"disabled"
],
"required": true,
"summary": "Feedback regions tie state-readiness evidence to visible recipe status treatments."
}
],
"anatomy_regions": [
"surface",
"copy",
"actions",
"controls",
"feedback"
],
"anatomy_token_roles": [
"background",
"badge",
"badgeText",
"border",
"button",
"buttonText",
"control",
"controlText",
"panel",
"panelElevated",
"signal",
"text",
"textMuted",
"uplink"
],
"action_count": 4,
"action_map": [
{
"path": "results[0]",
"label": "Source-backed product match",
"action_type": "link",
"href": "#block-preview",
"event_name": null,
"summary": "Source-backed product match is a link action linking to #block-preview."
},
{
"path": "results[1]",
"label": "Guided service recommendation",
"action_type": "link",
"href": "#block-preview",
"event_name": null,
"summary": "Guided service recommendation is a link action linking to #block-preview."
},
{
"path": "sources[0]",
"label": "Local fallback index",
"action_type": "link",
"href": "#block-preview",
"event_name": null,
"summary": "Local fallback index is a link action linking to #block-preview."
},
{
"path": "sources[1]",
"label": "Provider-neutral endpoint",
"action_type": "link",
"href": "#block-preview",
"event_name": null,
"summary": "Provider-neutral endpoint is a link action linking to #block-preview."
}
],
"control_count": 3,
"control_map": [
{
"path": "filters[0]",
"label": "Products",
"control_type": "text",
"required": false,
"option_count": null,
"summary": "Products is a text control."
},
{
"path": "filters[1]",
"label": "Guides",
"control_type": "text",
"required": false,
"option_count": null,
"summary": "Guides is a text control."
},
{
"path": "filters[2]",
"label": "Services",
"control_type": "text",
"required": false,
"option_count": null,
"summary": "Services is a text control."
}
],
"style_token_count": 15,
"style_token_map": [
{
"role": "background",
"label": "Page background",
"value": "#f7fbff",
"token_type": "color",
"summary": "Page background uses the background recipe token."
},
{
"role": "panel",
"label": "Panel surface",
"value": "#ffffff",
"token_type": "color",
"summary": "Panel surface uses the panel recipe token."
},
{
"role": "panelElevated",
"label": "Elevated surface",
"value": "#ffffff",
"token_type": "color",
"summary": "Elevated surface uses the panelElevated recipe token."
},
{
"role": "text",
"label": "Primary text",
"value": "#142033",
"token_type": "color",
"summary": "Primary text uses the text recipe token."
},
{
"role": "textMuted",
"label": "Muted text",
"value": "#526174",
"token_type": "color",
"summary": "Muted text uses the textMuted recipe token."
},
{
"role": "signal",
"label": "Signal accent",
"value": "#166bff",
"token_type": "color",
"summary": "Signal accent uses the signal recipe token."
},
{
"role": "uplink",
"label": "Secondary accent",
"value": "#00a6a6",
"token_type": "color",
"summary": "Secondary accent uses the uplink recipe token."
},
{
"role": "border",
"label": "Border",
"value": "#d6dee8",
"token_type": "color",
"summary": "Border uses the border recipe token."
},
{
"role": "control",
"label": "Control surface",
"value": "#ffffff",
"token_type": "color",
"summary": "Control surface uses the control recipe token."
},
{
"role": "controlText",
"label": "Control text",
"value": "#142033",
"token_type": "color",
"summary": "Control text uses the controlText recipe token."
},
{
"role": "button",
"label": "Button surface",
"value": "#166bff",
"token_type": "color",
"summary": "Button surface uses the button recipe token."
},
{
"role": "buttonText",
"label": "Button text",
"value": "#ffffff",
"token_type": "color",
"summary": "Button text uses the buttonText recipe token."
},
{
"role": "badge",
"label": "Badge surface",
"value": "#eef5ff",
"token_type": "color",
"summary": "Badge surface uses the badge recipe token."
},
{
"role": "badgeText",
"label": "Badge text",
"value": "#174ea6",
"token_type": "color",
"summary": "Badge text uses the badgeText recipe token."
},
{
"role": "fontFamily",
"label": "Font family",
"value": "Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif",
"token_type": "font",
"summary": "Font family comes from the active recipe theme tokens."
}
],
"style_token_roles": [
"background",
"panel",
"panelElevated",
"text",
"textMuted",
"signal",
"uplink",
"border",
"control",
"controlText",
"button",
"buttonText",
"badge",
"badgeText",
"fontFamily"
],
"contrast_check_count": 6,
"contrast_pass_count": 6,
"contrast_checks": [
{
"id": "text-on-background",
"label": "Text on background",
"foreground_role": "text",
"background_role": "background",
"foreground": "#142033",
"background": "#f7fbff",
"ratio": 15.73,
"required_ratio": 4.5,
"passes": true,
"level": "AAA",
"summary": "Text on background is AAA at 15.73:1 against a 4.5:1 requirement."
},
{
"id": "text-on-panel",
"label": "Text on panel",
"foreground_role": "text",
"background_role": "panel",
"foreground": "#142033",
"background": "#ffffff",
"ratio": 16.35,
"required_ratio": 4.5,
"passes": true,
"level": "AAA",
"summary": "Text on panel is AAA at 16.35:1 against a 4.5:1 requirement."
},
{
"id": "muted-text-on-panel",
"label": "Muted text on panel",
"foreground_role": "textMuted",
"background_role": "panel",
"foreground": "#526174",
"background": "#ffffff",
"ratio": 6.32,
"required_ratio": 4.5,
"passes": true,
"level": "AA",
"summary": "Muted text on panel is AA at 6.32:1 against a 4.5:1 requirement."
},
{
"id": "button-text-on-button",
"label": "Button text on button",
"foreground_role": "buttonText",
"background_role": "button",
"foreground": "#ffffff",
"background": "#166bff",
"ratio": 4.58,
"required_ratio": 4.5,
"passes": true,
"level": "AA",
"summary": "Button text on button is AA at 4.58:1 against a 4.5:1 requirement."
},
{
"id": "control-text-on-control",
"label": "Control text on control",
"foreground_role": "controlText",
"background_role": "control",
"foreground": "#142033",
"background": "#ffffff",
"ratio": 16.35,
"required_ratio": 4.5,
"passes": true,
"level": "AAA",
"summary": "Control text on control is AAA at 16.35:1 against a 4.5:1 requirement."
},
{
"id": "badge-text-on-badge",
"label": "Badge text on badge",
"foreground_role": "badgeText",
"background_role": "badge",
"foreground": "#174ea6",
"background": "#eef5ff",
"ratio": 7.15,
"required_ratio": 4.5,
"passes": true,
"level": "AAA",
"summary": "Badge text on badge is AAA at 7.15:1 against a 4.5:1 requirement."
}
],
"contrast_target": "AA",
"accessibility_standard": "WCAG_2_2_AA",
"accessibility_check_count": 5,
"accessibility_checks": [
{
"id": "semantic-structure",
"label": "Semantic structure",
"category": "semantics",
"status": "covered",
"required": true,
"proof": "runtime block sections, cards, lists, and headings",
"summary": "search-discovery keeps semantic wrappers and readable heading/copy structure in the runtime preview."
},
{
"id": "keyboard-and-tap-targets",
"label": "Keyboard and tap targets",
"category": "keyboard",
"status": "covered",
"required": true,
"proof": "mapped actions/controls render as native focusable surfaces",
"summary": "Interactive surfaces stay reachable, focusable, and recipe-styled without shrinking below expected touch affordances."
},
{
"id": "text-alternatives",
"label": "Text alternatives",
"category": "media",
"status": "covered",
"required": false,
"proof": "media slots collapse when unused",
"summary": "Recipes without media do not leave decorative media shells that need alt text."
},
{
"id": "control-labels",
"label": "Control labels",
"category": "forms",
"status": "covered",
"required": true,
"proof": "control map includes required field labels and option metadata",
"summary": "Input and choice controls are mapped with labels, required state, and option counts for CMS and runtime review."
},
{
"id": "status-and-motion",
"label": "Status and motion",
"category": "state",
"status": "covered",
"required": true,
"proof": "runtime evidence avoids hidden status-only content",
"summary": "Recipe defaults avoid motion-only meaning and keep status text inspectable when state is present."
}
],
"responsive_behavior_count": 3,
"responsive_behavior_map": [
{
"id": "phone",
"label": "Phone",
"viewport_width": 390,
"layout_mode": "single-column stack",
"column_count": 1,
"spacing_density": "spacious",
"media_policy": "Inline media uses full-width phone framing, tablet-friendly aspect ratios, and stable desktop constraints.",
"overflow_policy": "min-width:0 surfaces, wrapping copy, and no horizontal overflow in the static catalog phone smoke.",
"interaction_policy": "Actions and controls wrap into reachable rows with stable tap targets.",
"proof": "npm run test:static:block-catalog all-blocks-phone",
"summary": "Polished SaaS Growth stacks search-discovery into one phone column with spacious spacing and bounded content."
},
{
"id": "tablet",
"label": "Tablet",
"viewport_width": 768,
"layout_mode": "two-column adaptive grid",
"column_count": 2,
"spacing_density": "spacious",
"media_policy": "Inline media uses full-width phone framing, tablet-friendly aspect ratios, and stable desktop constraints.",
"overflow_policy": "tablet preview frames keep mid-width composition, wrap controls, and avoid horizontal overflow in the static catalog smoke.",
"interaction_policy": "Actions and controls wrap into reachable rows with stable tap targets.",
"proof": "npm run test:static:block-catalog all-blocks-tablet",
"summary": "Polished SaaS Growth adapts search-discovery to 2 tablet columns before expanding to the desktop layout."
},
{
"id": "desktop",
"label": "Desktop",
"viewport_width": 1366,
"layout_mode": "responsive composition grid",
"column_count": 2,
"spacing_density": "spacious",
"media_policy": "Inline media uses full-width phone framing, tablet-friendly aspect ratios, and stable desktop constraints.",
"overflow_policy": "desktop preview frames keep constrained widths, stable cards, and no horizontal overflow in the static catalog smoke.",
"interaction_policy": "Actions and controls wrap into reachable rows with stable tap targets.",
"proof": "npm run test:static:block-catalog all-blocks-desktop",
"summary": "Polished SaaS Growth gives search-discovery up to 2 desktop columns while preserving recipe spacing."
}
],
"responsive_viewports": [
"phone",
"tablet",
"desktop"
],
"responsive_proof": [
"npm run test:static:block-catalog all-blocks-phone",
"npm run test:static:block-catalog all-blocks-tablet",
"npm run test:static:block-catalog all-blocks-desktop"
],
"interactive_roles": [
"link",
"text"
],
"recipe_alignment": {
"action_token": "button",
"control_token": "control",
"surface_token": "panel",
"text_token": "text",
"source": "theme recipe tokens"
}
},
"cloneable": true
}
}A dense operator-friendly payload for dashboards, catalogs, forms, and internal review surfaces.
search-discovery uses recipe surface tokens to keep the outer frame styled and composable.
background, panel, panelElevated, borderCopy fields map to primary and muted text roles so editors can change words without restyling the block.
text, textMutedAction regions use recipe button and accent tokens while preserving href or event payloads.
button, buttonText, signal, uplinkControl regions keep labels, required state, and options aligned with recipe control tokens.
control, controlText, borderFeedback regions tie state-readiness evidence to visible recipe status treatments.
badge, badgeText, signalUse when editors need denser search-discovery controls, diagnostics, or internal review context.
Compact Ops is a high-complexity operator-review recipe with 5 documented composition slots.
3 required regions, 2 optional regions.
search-discovery is best composed into funnel, contact, service-page, and related pages.
4 page types mapped for search-discovery.Choose the first matching page type before editing copy, media, or actions so the recipe starts in the right narrative context.search-discovery can act as conversion, content, form-controls within a composed page.
5 anatomy regions produce 3 section roles.Place the block where its required anatomy regions have enough room before compressing it into dense page slots.Compact Ops composition passport is copy-led, cta-led, input-led for CMS composition.
32/33 fields are editable across 3 content models.Keep the content model stable when replacing defaults; do not turn a repeatable or media-led recipe into unrelated ad hoc content.search-discovery carries link-link, text interaction affordances.
4 action surfaces and 3 control surfaces mapped.Review href, event, input, required, and disabled-state evidence before publishing an interactive recipe.search-discovery uses operator-review authoring with high complexity.
33 default provenance items with 2 high-care replacements.Use the default provenance map before cloning the recipe into CMS content or agent-generated page data.search-discovery has explicit phone, tablet, and desktop compatibility evidence for composed pages.
3 responsive behavior maps cover phone, tablet, and desktop composition.Review phone wrapping, tablet mid-width balance, and desktop density before adding nested content, longer labels, or extra media.search-discovery keeps a stable recipe surface with panel, border, and spacing roles instead of ad hoc wrappers.
dense treatment uses compact density and 8px radius base.background, panel, panelElevated, borderPrimary, muted, and badge text roles stay distinct enough for headings, body copy, metadata, and helper text.
6/6 contrast checks pass the AA target.text, textMuted, badgeTextInteractive regions use recipe action/control tokens and preserve labels, hrefs, events, required state, and options.
4 action surfaces and 3 control surfaces mapped.button, buttonText, control, controlText, signal, uplinkThe recipe remains polished without requiring placeholder media or visual assets inside this block.
No media region is required for this recipe.panelElevated, border, textMutedFeedback, selected, loading, invalid, and disabled treatments use visible state evidence instead of color-only meaning.
6 state-readiness entries include default, empty, pending, active, invalid, disabled.badge, badgeText, signalPhone, tablet, and desktop defaults have explicit stack, wrap, media, and overflow policies for the recipe.
single-column stack phone behavior, two-column adaptive grid tablet behavior, and responsive composition grid desktop behavior documented.panel, border, controlKeep visual styling aligned to Compact Ops recipe tokens unless the recipe itself changes.
Compact Ops recipe tokensCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadReplace the asset through CMS media data and keep alt, title, provider, or label fallback text meaningful.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadKeep the label paired with a valid href or canonical postEvent event name before publishing.
CMS route, URL, or canonical postEvent pathEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadKeep the label paired with a valid href or canonical postEvent event name before publishing.
CMS route, URL, or canonical postEvent pathCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadCopy bundle groups 10 fields so CMS edits preserve the recipe shape and default polish.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.Action bundle groups 2 fields so CMS edits preserve the recipe shape and default polish.
CMS route, URL, or canonical postEvent pathKeep the label paired with a valid href or canonical postEvent event name before publishing.Proof bundle groups 1 field so CMS edits preserve the recipe shape and default polish.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.Style bundle groups 1 field so CMS edits preserve the recipe shape and default polish.
Compact Ops recipe tokensKeep visual styling aligned to Compact Ops recipe tokens unless the recipe itself changes.Content bundle groups 19 fields so CMS edits preserve the recipe shape and default polish.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.
cloneable block recipe payloadActions should resolve to a URL or event name with a human-readable label.
CMS route, URL, or canonical postEvent pathProof fields should keep labels, values, and status text visible without color-only meaning.
cloneable block recipe payloadStyle fields should prefer recipe or appearance tokens over one-off inline values.
Compact Ops recipe tokensContent should remain serializable JSON and preserve the documented block contract.
cloneable block recipe payloadCompact Ops tokens with dense documentation treatment
The Compact Ops recipe renders a contract-safe primary state for search-discovery.Reserved panel space with fallback copy or placeholder media
Repeatable fields are documented for add, remove, reorder, and item-level editing.Neutral reserved frame with status copy and no layout shift
Async-capable props are mapped through controls, events, or provider placeholders.Signal/uplink emphasis with visible selected-state chips
4 action surfaces and 3 control surfaces are mapped for selected-state review.Warning/danger status treatment while preserving the block frame
Form controls preserve labels, required state, options, and submission metadata.Muted affordance with preserved label, spacing, and hit-area rhythm
Interactive maps preserve labels and control roles so disabled states can stay understandable.search-discovery keeps semantic wrappers and readable heading/copy structure in the runtime preview.
runtime block sections, cards, lists, and headingsInteractive surfaces stay reachable, focusable, and recipe-styled without shrinking below expected touch affordances.
mapped actions/controls render as native focusable surfacesRecipes without media do not leave decorative media shells that need alt text.
media slots collapse when unusedInput and choice controls are mapped with labels, required state, and option counts for CMS and runtime review.
control map includes required field labels and option metadataRecipe defaults avoid motion-only meaning and keep status text inspectable when state is present.
runtime evidence avoids hidden status-only contentCompact Ops stacks search-discovery into one phone column with compact spacing and bounded content.
min-width:0 surfaces, wrapping copy, and no horizontal overflow in the static catalog phone smoke.Compact Ops adapts search-discovery to 2 tablet columns before expanding to the desktop layout.
tablet preview frames keep mid-width composition, wrap controls, and avoid horizontal overflow in the static catalog smoke.Compact Ops gives search-discovery up to 2 desktop columns while preserving recipe spacing.
desktop preview frames keep constrained widths, stable cards, and no horizontal overflow in the static catalog smoke.RAG-ready discovery block with deterministic local results, source cards, facets, and provider trace metadata.
Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.
Product
A discovery result with category, tags, action, and citation-style source metadata.
Recommendation
Recommendation surfaces use the same result card contract for static and API-backed states.
Demo retrieval does not replace tenant review, compliance review, or safety guidance.
{
"id": "block-doc-search-discovery-data-compact-ops",
"block_type": "search-discovery",
"props": {
"appearance": {
"preset": "dashboard"
},
"title": "Search discovery",
"description": "RAG-ready discovery block with deterministic local results, source cards, facets, and provider trace metadata.",
"query_placeholder": "Search services, products, or resources",
"mode": "both",
"surface": "block-explorer",
"provider": "local-fallback",
"api": {
"search_endpoint": "/api/ensemble/templates/example-sites/kindcart-market/rag/search",
"recommend_endpoint": "/api/ensemble/templates/example-sites/kindcart-market/rag/recommend"
},
"filters": [
{
"label": "Products",
"value": "products",
"count": 3
},
{
"label": "Guides",
"value": "guides",
"count": 2
},
{
"label": "Services",
"value": "services",
"count": 4
}
],
"answer": "Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.",
"results": [
{
"title": "Source-backed product match",
"description": "A discovery result with category, tags, action, and citation-style source metadata.",
"category": "Product",
"topic": "Catalog retrieval",
"byline": "Block Explorer desk",
"published_at": "2026-06-09",
"freshness": "Demo source",
"content_type": "article",
"reading_time": "4 min read",
"tags": [
"rag-ready",
"local"
],
"href": "#block-preview",
"sources": [
{
"title": "Template catalog source",
"citation_label": "Catalog source A",
"excerpt": "Example-site content roots can include local retrieval indexes."
}
]
},
{
"title": "Guided service recommendation",
"description": "Recommendation surfaces use the same result card contract for static and API-backed states.",
"category": "Recommendation",
"tags": [
"guided",
"source-card"
],
"href": "#block-preview",
"sources": [
{
"title": "Operator-approved source",
"excerpt": "Replace demo content with tenant-approved source records before publishing."
}
]
}
],
"recommendations": [
{
"title": "Ask for a fit check",
"description": "Use provider-neutral recommendation APIs when external retrieval is configured."
},
{
"title": "Review source cards",
"description": "Show citations and trace metadata before a user acts on a recommendation."
}
],
"sources": [
{
"title": "Local fallback index",
"url": "#block-preview"
},
{
"title": "Provider-neutral endpoint",
"url": "#block-preview"
}
],
"disclaimer": "Demo retrieval does not replace tenant review, compliance review, or safety guidance."
},
"block_order": 3,
"metadata": {
"composition_recipe": {
"id": "compact-ops",
"intent": "operator",
"label": "Compact Ops",
"recipe": "compact-ops",
"source": "block-explorer",
"quality_proof": [
"composition"
],
"composition_passport": {
"id": "compact-ops",
"label": "Compact Ops composition passport",
"intent": "operator",
"recipe": "compact-ops",
"authoring_mode": "operator-review",
"complexity": "high",
"fit": "Use when editors need denser search-discovery controls, diagnostics, or internal review context.",
"required_regions": [
"surface",
"copy",
"feedback"
],
"optional_regions": [
"actions",
"controls"
],
"slots": [
{
"id": "surface",
"label": "Surface",
"required": true,
"field_count": 1,
"editable_count": 0,
"token_roles": [
"background",
"panel",
"panelElevated",
"border"
],
"summary": "search-discovery uses recipe surface tokens to keep the outer frame styled and composable."
},
{
"id": "copy",
"label": "Copy",
"required": true,
"field_count": 10,
"editable_count": 10,
"token_roles": [
"text",
"textMuted"
],
"summary": "Copy fields map to primary and muted text roles so editors can change words without restyling the block."
},
{
"id": "actions",
"label": "Actions",
"required": false,
"field_count": 6,
"editable_count": 2,
"token_roles": [
"button",
"buttonText",
"signal",
"uplink"
],
"summary": "Action regions use recipe button and accent tokens while preserving href or event payloads."
},
{
"id": "controls",
"label": "Controls",
"required": false,
"field_count": 3,
"editable_count": 0,
"token_roles": [
"control",
"controlText",
"border"
],
"summary": "Control regions keep labels, required state, and options aligned with recipe control tokens."
},
{
"id": "feedback",
"label": "Feedback",
"required": true,
"field_count": 0,
"editable_count": 0,
"token_roles": [
"badge",
"badgeText",
"signal"
],
"summary": "Feedback regions tie state-readiness evidence to visible recipe status treatments."
}
],
"builder_field_count": 33,
"editable_field_count": 32,
"action_count": 4,
"control_count": 3,
"replacement_guidance": [
"Keep Compact Ops recipe tokens as the source of visual styling for the surface, text, controls, and actions.",
"No media replacement is required; keep the layout rhythm stable when optional visual fields are omitted.",
"Verify each action keeps either a valid href or canonical event name plus an editor-visible label.",
"Verify control labels, required state, choices, and submission metadata before publishing.",
"The recipe does not require repeatable collection editing."
],
"publish_checklist": [
"Validate search-discovery against its block contract before publishing.",
"3 required anatomy regions remain present: surface, copy, feedback.",
"32/33 builder fields are CMS-editable or intentionally locked.",
"Interactive labels, target size, href/event wiring, and disabled states have been reviewed.",
"Phone, tablet, and desktop responsive behavior maps have been reviewed for wrapping and overflow.",
"Contrast checks meet the AA recipe target."
],
"agent_notes": [
"Prefer editing props fields described by the builder field map; metadata is evidence, not primary content.",
"Preserve recipe_alignment token roles unless the page theme or recipe changes intentionally.",
"Use the anatomy slots to compose or replace content without changing the block type."
],
"summary": "Compact Ops is a high-complexity operator-review recipe with 5 documented composition slots."
},
"composition_passport_complexity": "high",
"composition_passport_authoring_mode": "operator-review",
"composition_passport_slots": [
"surface",
"copy",
"actions",
"controls",
"feedback"
],
"composition_passport_check_count": 6,
"visual_polish_check_count": 6,
"visual_polish_pass_count": 6,
"visual_polish_checks": [
{
"id": "surface-rhythm",
"label": "Surface rhythm",
"axis": "layout",
"status": "ready",
"token_roles": [
"background",
"panel",
"panelElevated",
"border"
],
"evidence": "dense treatment uses compact density and 8px radius base.",
"summary": "search-discovery keeps a stable recipe surface with panel, border, and spacing roles instead of ad hoc wrappers."
},
{
"id": "type-hierarchy",
"label": "Type hierarchy",
"axis": "typography",
"status": "ready",
"token_roles": [
"text",
"textMuted",
"badgeText"
],
"evidence": "6/6 contrast checks pass the AA target.",
"summary": "Primary, muted, and badge text roles stay distinct enough for headings, body copy, metadata, and helper text."
},
{
"id": "action-clarity",
"label": "Action clarity",
"axis": "interaction",
"status": "ready",
"token_roles": [
"button",
"buttonText",
"control",
"controlText",
"signal",
"uplink"
],
"evidence": "4 action surfaces and 3 control surfaces mapped.",
"summary": "Interactive regions use recipe action/control tokens and preserve labels, hrefs, events, required state, and options."
},
{
"id": "media-treatment",
"label": "Media treatment",
"axis": "media",
"status": "ready",
"token_roles": [
"panelElevated",
"border",
"textMuted"
],
"evidence": "No media region is required for this recipe.",
"summary": "The recipe remains polished without requiring placeholder media or visual assets inside this block."
},
{
"id": "state-feedback",
"label": "State feedback",
"axis": "state",
"status": "ready",
"token_roles": [
"badge",
"badgeText",
"signal"
],
"evidence": "6 state-readiness entries include default, empty, pending, active, invalid, disabled.",
"summary": "Feedback, selected, loading, invalid, and disabled treatments use visible state evidence instead of color-only meaning."
},
{
"id": "responsive-balance",
"label": "Responsive balance",
"axis": "responsive",
"status": "ready",
"token_roles": [
"panel",
"border",
"control"
],
"evidence": "single-column stack phone behavior, two-column adaptive grid tablet behavior, and responsive composition grid desktop behavior documented.",
"summary": "Phone, tablet, and desktop defaults have explicit stack, wrap, media, and overflow policies for the recipe."
}
],
"visual_polish_axes": [
"layout",
"typography",
"interaction",
"media",
"state",
"responsive"
],
"default_provenance_count": 33,
"default_provenance_map": [
{
"path": "appearance",
"label": "Appearance",
"field_role": "style",
"value_type": "object",
"editable": false,
"repeated": false,
"default_source": "Compact Ops recipe tokens",
"replacement_policy": "locked-token",
"replacement_risk": "medium",
"guardrail": "Keep visual styling aligned to Compact Ops recipe tokens unless the recipe itself changes.",
"validation": "Style fields should prefer recipe or appearance tokens over one-off inline values.",
"summary": "Appearance defaults from Compact Ops recipe tokens; replacement is medium risk with locked-token policy."
},
{
"path": "title",
"label": "Title",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Title defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "description",
"label": "Description",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Description defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "query_placeholder",
"label": "Query Placeholder",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Query Placeholder defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "mode",
"label": "Mode",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Mode defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "surface",
"label": "Surface",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Surface defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "provider",
"label": "Provider",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "requires-alt-text",
"replacement_risk": "medium",
"guardrail": "Replace the asset through CMS media data and keep alt, title, provider, or label fallback text meaningful.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Provider defaults from cloneable block recipe payload; replacement is medium risk with requires-alt-text policy."
},
{
"path": "api",
"label": "Api",
"field_role": "content",
"value_type": "object",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Api defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "filters",
"label": "Filters",
"field_role": "content",
"value_type": "array",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Filters defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "filters[].label",
"label": "Filters Item Label",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Filters Item Label defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "filters[].value",
"label": "Filters Item Value",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Filters Item Value defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "filters[].count",
"label": "Filters Item Count",
"field_role": "content",
"value_type": "number",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Filters Item Count defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "answer",
"label": "Answer",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Answer defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "results",
"label": "Results",
"field_role": "content",
"value_type": "array",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Results defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "results[].title",
"label": "Results Item Title",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Results Item Title defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].description",
"label": "Results Item Description",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Results Item Description defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].category",
"label": "Results Item Category",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Results Item Category defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].topic",
"label": "Results Item Topic",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Results Item Topic defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].byline",
"label": "Results Item Byline",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Results Item Byline defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].published_at",
"label": "Results Item Published At",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Results Item Published At defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].freshness",
"label": "Results Item Freshness",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Results Item Freshness defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].content_type",
"label": "Results Item Content Type",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Results Item Content Type defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].reading_time",
"label": "Results Item Reading Time",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Results Item Reading Time defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].tags",
"label": "Results Item Tags",
"field_role": "proof",
"value_type": "array",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Proof fields should keep labels, values, and status text visible without color-only meaning.",
"summary": "Results Item Tags defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].href",
"label": "Results Item Href",
"field_role": "action",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "CMS route, URL, or canonical postEvent path",
"replacement_policy": "requires-action-target",
"replacement_risk": "high",
"guardrail": "Keep the label paired with a valid href or canonical postEvent event name before publishing.",
"validation": "Actions should resolve to a URL or event name with a human-readable label.",
"summary": "Results Item Href defaults from CMS route, URL, or canonical postEvent path; replacement is high risk with requires-action-target policy."
},
{
"path": "results[].sources",
"label": "Results Item Sources",
"field_role": "content",
"value_type": "array",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Results Item Sources defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "recommendations",
"label": "Recommendations",
"field_role": "content",
"value_type": "array",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Recommendations defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "recommendations[].title",
"label": "Recommendations Item Title",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Recommendations Item Title defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "recommendations[].description",
"label": "Recommendations Item Description",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Recommendations Item Description defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "sources",
"label": "Sources",
"field_role": "content",
"value_type": "array",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Sources defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "sources[].title",
"label": "Sources Item Title",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Sources Item Title defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "sources[].url",
"label": "Sources Item Url",
"field_role": "action",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "CMS route, URL, or canonical postEvent path",
"replacement_policy": "requires-action-target",
"replacement_risk": "high",
"guardrail": "Keep the label paired with a valid href or canonical postEvent event name before publishing.",
"validation": "Actions should resolve to a URL or event name with a human-readable label.",
"summary": "Sources Item Url defaults from CMS route, URL, or canonical postEvent path; replacement is high risk with requires-action-target policy."
},
{
"path": "disclaimer",
"label": "Disclaimer",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Disclaimer defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
}
],
"default_replacement_policies": [
"collection-item",
"locked-token",
"requires-action-target",
"requires-alt-text",
"safe-to-edit"
],
"default_replacement_risks": [
"high",
"low",
"medium"
],
"default_replacement_high_risk_count": 2,
"content_edit_bundle_count": 5,
"content_edit_bundles": [
{
"id": "copy",
"label": "Copy bundle",
"intent": "required",
"edit_mode": "repeatable-items",
"field_paths": [
"answer",
"description",
"filters[].label",
"recommendations[].description",
"recommendations[].title",
"results[].content_type",
"results[].description",
"results[].title",
"sources[].title",
"title"
],
"default_sources": [
"cloneable block recipe payload"
],
"guardrails": [
"Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape."
],
"depends_on": [
"type hierarchy",
"mobile wrapping"
],
"summary": "Copy bundle groups 10 fields so CMS edits preserve the recipe shape and default polish."
},
{
"id": "actions",
"label": "Action bundle",
"intent": "recommended",
"edit_mode": "repeatable-items",
"field_paths": [
"results[].href",
"sources[].url"
],
"default_sources": [
"CMS route, URL, or canonical postEvent path"
],
"guardrails": [
"Keep the label paired with a valid href or canonical postEvent event name before publishing."
],
"depends_on": [
"copy labels",
"href or event target",
"state readiness"
],
"summary": "Action bundle groups 2 fields so CMS edits preserve the recipe shape and default polish."
},
{
"id": "proof",
"label": "Proof bundle",
"intent": "recommended",
"edit_mode": "repeatable-items",
"field_paths": [
"results[].tags"
],
"default_sources": [
"cloneable block recipe payload"
],
"guardrails": [
"Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape."
],
"depends_on": [
"copy labels",
"contrast proof"
],
"summary": "Proof bundle groups 1 field so CMS edits preserve the recipe shape and default polish."
},
{
"id": "style",
"label": "Style bundle",
"intent": "guarded",
"edit_mode": "guarded-system",
"field_paths": [
"appearance"
],
"default_sources": [
"Compact Ops recipe tokens"
],
"guardrails": [
"Keep visual styling aligned to Compact Ops recipe tokens unless the recipe itself changes."
],
"depends_on": [
"theme recipe tokens",
"contrast proof"
],
"summary": "Style bundle groups 1 field so CMS edits preserve the recipe shape and default polish."
},
{
"id": "content",
"label": "Content bundle",
"intent": "required",
"edit_mode": "repeatable-items",
"field_paths": [
"api",
"disclaimer",
"filters",
"filters[].count",
"filters[].value",
"mode",
"provider",
"query_placeholder",
"recommendations",
"results",
"results[].byline",
"results[].category",
"results[].freshness",
"results[].published_at",
"results[].reading_time",
"results[].sources",
"results[].topic",
"sources",
"surface"
],
"default_sources": [
"cloneable block recipe payload"
],
"guardrails": [
"Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"Replace the asset through CMS media data and keep alt, title, provider, or label fallback text meaningful."
],
"depends_on": [
"contract-safe JSON"
],
"summary": "Content bundle groups 19 fields so CMS edits preserve the recipe shape and default polish."
}
],
"content_edit_bundle_ids": [
"copy",
"actions",
"proof",
"style",
"content"
],
"content_edit_bundle_modes": [
"guarded-system",
"repeatable-items"
],
"content_edit_bundle_required_count": 2,
"content_edit_bundle_guarded_count": 1,
"recipe_compatibility_count": 6,
"recipe_compatibility_map": [
{
"id": "page-context",
"label": "Page context",
"axis": "page",
"fit": "primary",
"values": [
"funnel",
"contact",
"service-page",
"listing"
],
"evidence": "4 page types mapped for search-discovery.",
"guardrail": "Choose the first matching page type before editing copy, media, or actions so the recipe starts in the right narrative context.",
"summary": "search-discovery is best composed into funnel, contact, service-page, and related pages."
},
{
"id": "section-role",
"label": "Section role",
"axis": "layout",
"fit": "primary",
"values": [
"conversion",
"content",
"form-controls"
],
"evidence": "5 anatomy regions produce 3 section roles.",
"guardrail": "Place the block where its required anatomy regions have enough room before compressing it into dense page slots.",
"summary": "search-discovery can act as conversion, content, form-controls within a composed page."
},
{
"id": "content-model",
"label": "Content model",
"axis": "content",
"fit": "supporting",
"values": [
"copy-led",
"cta-led",
"input-led"
],
"evidence": "32/33 fields are editable across 3 content models.",
"guardrail": "Keep the content model stable when replacing defaults; do not turn a repeatable or media-led recipe into unrelated ad hoc content.",
"summary": "Compact Ops composition passport is copy-led, cta-led, input-led for CMS composition."
},
{
"id": "interaction-model",
"label": "Interaction model",
"axis": "interaction",
"fit": "primary",
"values": [
"link-link",
"text"
],
"evidence": "4 action surfaces and 3 control surfaces mapped.",
"guardrail": "Review href, event, input, required, and disabled-state evidence before publishing an interactive recipe.",
"summary": "search-discovery carries link-link, text interaction affordances."
},
{
"id": "authoring-fit",
"label": "Authoring fit",
"axis": "authoring",
"fit": "specialized",
"values": [
"operator-review",
"high-complexity",
"2-high-care-replacements"
],
"evidence": "33 default provenance items with 2 high-care replacements.",
"guardrail": "Use the default provenance map before cloning the recipe into CMS content or agent-generated page data.",
"summary": "search-discovery uses operator-review authoring with high complexity."
},
{
"id": "responsive-fit",
"label": "Responsive fit",
"axis": "responsive",
"fit": "primary",
"values": [
"single-column stack",
"two-column adaptive grid",
"responsive composition grid",
"min-width:0 surfaces, wrapping copy, and no horizontal overflow in the static catalog phone smoke."
],
"evidence": "3 responsive behavior maps cover phone, tablet, and desktop composition.",
"guardrail": "Review phone wrapping, tablet mid-width balance, and desktop density before adding nested content, longer labels, or extra media.",
"summary": "search-discovery has explicit phone, tablet, and desktop compatibility evidence for composed pages."
}
],
"recipe_compatibility_axes": [
"page",
"layout",
"content",
"interaction",
"authoring",
"responsive"
],
"recipe_compatibility_page_types": [
"funnel",
"contact",
"service-page",
"listing"
],
"recipe_compatibility_section_roles": [
"conversion",
"content",
"form-controls"
],
"recipe_compatibility_fits": [
"primary",
"specialized",
"supporting"
],
"builder_field_count": 33,
"builder_field_map": [
{
"path": "appearance",
"label": "Appearance",
"value_type": "object",
"role": "style",
"editable": false,
"repeated": false,
"summary": "Appearance is a object field used for style."
},
{
"path": "title",
"label": "Title",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": false,
"summary": "Title is a string field used for copy."
},
{
"path": "description",
"label": "Description",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": false,
"summary": "Description is a string field used for copy."
},
{
"path": "query_placeholder",
"label": "Query Placeholder",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Query Placeholder is a string field used for content."
},
{
"path": "mode",
"label": "Mode",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Mode is a string field used for content."
},
{
"path": "surface",
"label": "Surface",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Surface is a string field used for content."
},
{
"path": "provider",
"label": "Provider",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Provider is a string field used for content."
},
{
"path": "api",
"label": "Api",
"value_type": "object",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Api is a object field used for content."
},
{
"path": "filters",
"label": "Filters",
"value_type": "array",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Filters is a array field used for content."
},
{
"path": "filters[].label",
"label": "Filters Item Label",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": true,
"summary": "Filters Item Label is a string collection field used for copy."
},
{
"path": "filters[].value",
"label": "Filters Item Value",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": true,
"summary": "Filters Item Value is a string collection field used for content."
},
{
"path": "filters[].count",
"label": "Filters Item Count",
"value_type": "number",
"role": "content",
"editable": true,
"repeated": true,
"summary": "Filters Item Count is a number collection field used for content."
},
{
"path": "answer",
"label": "Answer",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": false,
"summary": "Answer is a string field used for copy."
},
{
"path": "results",
"label": "Results",
"value_type": "array",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Results is a array field used for content."
},
{
"path": "results[].title",
"label": "Results Item Title",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": true,
"summary": "Results Item Title is a string collection field used for copy."
},
{
"path": "results[].description",
"label": "Results Item Description",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": true,
"summary": "Results Item Description is a string collection field used for copy."
},
{
"path": "results[].category",
"label": "Results Item Category",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": true,
"summary": "Results Item Category is a string collection field used for content."
},
{
"path": "results[].topic",
"label": "Results Item Topic",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": true,
"summary": "Results Item Topic is a string collection field used for content."
},
{
"path": "results[].byline",
"label": "Results Item Byline",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": true,
"summary": "Results Item Byline is a string collection field used for content."
},
{
"path": "results[].published_at",
"label": "Results Item Published At",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": true,
"summary": "Results Item Published At is a string collection field used for content."
},
{
"path": "results[].freshness",
"label": "Results Item Freshness",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": true,
"summary": "Results Item Freshness is a string collection field used for content."
},
{
"path": "results[].content_type",
"label": "Results Item Content Type",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": true,
"summary": "Results Item Content Type is a string collection field used for copy."
},
{
"path": "results[].reading_time",
"label": "Results Item Reading Time",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": true,
"summary": "Results Item Reading Time is a string collection field used for content."
},
{
"path": "results[].tags",
"label": "Results Item Tags",
"value_type": "array",
"role": "proof",
"editable": true,
"repeated": true,
"summary": "Results Item Tags is a array collection field used for proof."
},
{
"path": "results[].href",
"label": "Results Item Href",
"value_type": "string",
"role": "action",
"editable": true,
"repeated": true,
"summary": "Results Item Href is a string collection field used for action."
},
{
"path": "results[].sources",
"label": "Results Item Sources",
"value_type": "array",
"role": "content",
"editable": true,
"repeated": true,
"summary": "Results Item Sources is a array collection field used for content."
},
{
"path": "recommendations",
"label": "Recommendations",
"value_type": "array",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Recommendations is a array field used for content."
},
{
"path": "recommendations[].title",
"label": "Recommendations Item Title",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": true,
"summary": "Recommendations Item Title is a string collection field used for copy."
},
{
"path": "recommendations[].description",
"label": "Recommendations Item Description",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": true,
"summary": "Recommendations Item Description is a string collection field used for copy."
},
{
"path": "sources",
"label": "Sources",
"value_type": "array",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Sources is a array field used for content."
},
{
"path": "sources[].title",
"label": "Sources Item Title",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": true,
"summary": "Sources Item Title is a string collection field used for copy."
},
{
"path": "sources[].url",
"label": "Sources Item Url",
"value_type": "string",
"role": "action",
"editable": true,
"repeated": true,
"summary": "Sources Item Url is a string collection field used for action."
},
{
"path": "disclaimer",
"label": "Disclaimer",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Disclaimer is a string field used for content."
}
],
"editor_guidance_count": 5,
"editor_guidance_map": [
{
"id": "copy",
"label": "Copy",
"field_role": "copy",
"field_count": 10,
"editable_count": 10,
"editor_widget": "text/rich-text editor",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"default_source": "cloneable block recipe payload",
"summary": "Copy fields use the text/rich-text editor across 10/10 editable fields."
},
{
"id": "action",
"label": "Action",
"field_role": "action",
"field_count": 2,
"editable_count": 2,
"editor_widget": "link or event action editor",
"validation": "Actions should resolve to a URL or event name with a human-readable label.",
"default_source": "CMS route, URL, or canonical postEvent path",
"summary": "Action fields use the link or event action editor across 2/2 editable fields."
},
{
"id": "proof",
"label": "Proof",
"field_role": "proof",
"field_count": 1,
"editable_count": 1,
"editor_widget": "metric, badge, or proof editor",
"validation": "Proof fields should keep labels, values, and status text visible without color-only meaning.",
"default_source": "cloneable block recipe payload",
"summary": "Proof fields use the metric, badge, or proof editor across 1/1 editable field."
},
{
"id": "style",
"label": "Style",
"field_role": "style",
"field_count": 1,
"editable_count": 0,
"editor_widget": "appearance preset selector",
"validation": "Style fields should prefer recipe or appearance tokens over one-off inline values.",
"default_source": "Compact Ops recipe tokens",
"summary": "Style fields use the appearance preset selector across 0/1 editable field."
},
{
"id": "content",
"label": "Content",
"field_role": "content",
"field_count": 19,
"editable_count": 19,
"editor_widget": "plain content field",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"default_source": "cloneable block recipe payload",
"summary": "Content fields use the plain content field across 19/19 editable fields."
}
],
"editor_field_roles": [
"copy",
"action",
"proof",
"style",
"content"
],
"editor_editable_field_count": 32,
"state_readiness_count": 6,
"state_readiness_map": [
{
"id": "default",
"label": "Default",
"status": "covered",
"trigger": "Initial render with the cloneable recipe payload",
"visual_treatment": "Compact Ops tokens with dense documentation treatment",
"token_roles": [
"surface",
"panel",
"text",
"button"
],
"proof": "The Compact Ops recipe renders a contract-safe primary state for search-discovery.",
"summary": "Default state uses the recipe surface, text, and action tokens without one-off styling."
},
{
"id": "empty",
"label": "Empty",
"status": "covered",
"trigger": "Repeatable collections have zero items",
"visual_treatment": "Reserved panel space with fallback copy or placeholder media",
"token_roles": [
"panel",
"textMuted",
"badge",
"border"
],
"proof": "Repeatable fields are documented for add, remove, reorder, and item-level editing.",
"summary": "Empty-state guidance preserves layout rhythm instead of collapsing the block surface."
},
{
"id": "pending",
"label": "Pending",
"status": "covered",
"trigger": "Async assignment, embed load, or form submission is in flight",
"visual_treatment": "Neutral reserved frame with status copy and no layout shift",
"token_roles": [
"control",
"textMuted",
"progressTrack",
"border"
],
"proof": "Async-capable props are mapped through controls, events, or provider placeholders.",
"summary": "Pending state keeps dimensions stable while using muted control/status tokens."
},
{
"id": "active",
"label": "Active",
"status": "covered",
"trigger": "Selected action, active link, checked input, or open disclosure",
"visual_treatment": "Signal/uplink emphasis with visible selected-state chips",
"token_roles": [
"signal",
"uplink",
"button",
"badge"
],
"proof": "4 action surfaces and 3 control surfaces are mapped for selected-state review.",
"summary": "Active state is represented with recipe accent tokens and visible state labels."
},
{
"id": "invalid",
"label": "Invalid",
"status": "covered",
"trigger": "Required input, option, or submitted value is invalid",
"visual_treatment": "Warning/danger status treatment while preserving the block frame",
"token_roles": [
"warning",
"danger",
"border",
"text"
],
"proof": "Form controls preserve labels, required state, options, and submission metadata.",
"summary": "Invalid state guidance favors explicit status evidence over ambiguous visual collapse."
},
{
"id": "disabled",
"label": "Disabled",
"status": "covered",
"trigger": "Unavailable action or temporarily disabled control",
"visual_treatment": "Muted affordance with preserved label, spacing, and hit-area rhythm",
"token_roles": [
"control",
"textMuted",
"border",
"panel"
],
"proof": "Interactive maps preserve labels and control roles so disabled states can stay understandable.",
"summary": "Disabled state keeps the block readable and spatially stable when interaction is unavailable."
}
],
"state_readiness_states": [
"default",
"empty",
"pending",
"active",
"invalid",
"disabled"
],
"state_readiness_statuses": [
"covered",
"covered",
"covered",
"covered",
"covered",
"covered"
],
"anatomy_region_count": 5,
"anatomy_map": [
{
"id": "surface",
"label": "Surface",
"region_role": "outer layout and background",
"field_paths": [
"appearance"
],
"token_roles": [
"background",
"panel",
"panelElevated",
"border"
],
"state_ids": [
"default",
"empty",
"pending",
"active",
"invalid",
"disabled"
],
"required": true,
"summary": "search-discovery uses recipe surface tokens to keep the outer frame styled and composable."
},
{
"id": "copy",
"label": "Copy",
"region_role": "headings, body copy, labels, and supporting text",
"field_paths": [
"answer",
"description",
"filters[].label",
"recommendations[].description",
"recommendations[].title",
"results[].content_type",
"results[].description",
"results[].title",
"sources[].title",
"title"
],
"token_roles": [
"text",
"textMuted"
],
"state_ids": [
"default",
"empty",
"pending",
"active",
"invalid",
"disabled"
],
"required": true,
"summary": "Copy fields map to primary and muted text roles so editors can change words without restyling the block."
},
{
"id": "actions",
"label": "Actions",
"region_role": "CTA, link, event, and navigation affordances",
"field_paths": [
"results[].href",
"results[0]",
"results[1]",
"sources[].url",
"sources[0]",
"sources[1]"
],
"token_roles": [
"button",
"buttonText",
"signal",
"uplink"
],
"state_ids": [
"default",
"empty",
"pending",
"active",
"invalid",
"disabled"
],
"required": false,
"summary": "Action regions use recipe button and accent tokens while preserving href or event payloads."
},
{
"id": "controls",
"label": "Controls",
"region_role": "inputs, choices, form fields, and operator controls",
"field_paths": [
"filters[0]",
"filters[1]",
"filters[2]"
],
"token_roles": [
"control",
"controlText",
"border"
],
"state_ids": [
"default",
"empty",
"pending",
"active",
"invalid",
"disabled"
],
"required": false,
"summary": "Control regions keep labels, required state, and options aligned with recipe control tokens."
},
{
"id": "feedback",
"label": "Feedback",
"region_role": "status, validation, selected, loading, and disabled evidence",
"field_paths": [],
"token_roles": [
"badge",
"badgeText",
"signal"
],
"state_ids": [
"default",
"empty",
"pending",
"active",
"invalid",
"disabled"
],
"required": true,
"summary": "Feedback regions tie state-readiness evidence to visible recipe status treatments."
}
],
"anatomy_regions": [
"surface",
"copy",
"actions",
"controls",
"feedback"
],
"anatomy_token_roles": [
"background",
"badge",
"badgeText",
"border",
"button",
"buttonText",
"control",
"controlText",
"panel",
"panelElevated",
"signal",
"text",
"textMuted",
"uplink"
],
"action_count": 4,
"action_map": [
{
"path": "results[0]",
"label": "Source-backed product match",
"action_type": "link",
"href": "#block-preview",
"event_name": null,
"summary": "Source-backed product match is a link action linking to #block-preview."
},
{
"path": "results[1]",
"label": "Guided service recommendation",
"action_type": "link",
"href": "#block-preview",
"event_name": null,
"summary": "Guided service recommendation is a link action linking to #block-preview."
},
{
"path": "sources[0]",
"label": "Local fallback index",
"action_type": "link",
"href": "#block-preview",
"event_name": null,
"summary": "Local fallback index is a link action linking to #block-preview."
},
{
"path": "sources[1]",
"label": "Provider-neutral endpoint",
"action_type": "link",
"href": "#block-preview",
"event_name": null,
"summary": "Provider-neutral endpoint is a link action linking to #block-preview."
}
],
"control_count": 3,
"control_map": [
{
"path": "filters[0]",
"label": "Products",
"control_type": "text",
"required": false,
"option_count": null,
"summary": "Products is a text control."
},
{
"path": "filters[1]",
"label": "Guides",
"control_type": "text",
"required": false,
"option_count": null,
"summary": "Guides is a text control."
},
{
"path": "filters[2]",
"label": "Services",
"control_type": "text",
"required": false,
"option_count": null,
"summary": "Services is a text control."
}
],
"style_token_count": 15,
"style_token_map": [
{
"role": "background",
"label": "Page background",
"value": "#f7fbff",
"token_type": "color",
"summary": "Page background uses the background recipe token."
},
{
"role": "panel",
"label": "Panel surface",
"value": "#ffffff",
"token_type": "color",
"summary": "Panel surface uses the panel recipe token."
},
{
"role": "panelElevated",
"label": "Elevated surface",
"value": "#ffffff",
"token_type": "color",
"summary": "Elevated surface uses the panelElevated recipe token."
},
{
"role": "text",
"label": "Primary text",
"value": "#142033",
"token_type": "color",
"summary": "Primary text uses the text recipe token."
},
{
"role": "textMuted",
"label": "Muted text",
"value": "#526174",
"token_type": "color",
"summary": "Muted text uses the textMuted recipe token."
},
{
"role": "signal",
"label": "Signal accent",
"value": "#166bff",
"token_type": "color",
"summary": "Signal accent uses the signal recipe token."
},
{
"role": "uplink",
"label": "Secondary accent",
"value": "#00a6a6",
"token_type": "color",
"summary": "Secondary accent uses the uplink recipe token."
},
{
"role": "border",
"label": "Border",
"value": "#d6dee8",
"token_type": "color",
"summary": "Border uses the border recipe token."
},
{
"role": "control",
"label": "Control surface",
"value": "#ffffff",
"token_type": "color",
"summary": "Control surface uses the control recipe token."
},
{
"role": "controlText",
"label": "Control text",
"value": "#142033",
"token_type": "color",
"summary": "Control text uses the controlText recipe token."
},
{
"role": "button",
"label": "Button surface",
"value": "#166bff",
"token_type": "color",
"summary": "Button surface uses the button recipe token."
},
{
"role": "buttonText",
"label": "Button text",
"value": "#ffffff",
"token_type": "color",
"summary": "Button text uses the buttonText recipe token."
},
{
"role": "badge",
"label": "Badge surface",
"value": "#eef5ff",
"token_type": "color",
"summary": "Badge surface uses the badge recipe token."
},
{
"role": "badgeText",
"label": "Badge text",
"value": "#174ea6",
"token_type": "color",
"summary": "Badge text uses the badgeText recipe token."
},
{
"role": "fontFamily",
"label": "Font family",
"value": "Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif",
"token_type": "font",
"summary": "Font family comes from the active recipe theme tokens."
}
],
"style_token_roles": [
"background",
"panel",
"panelElevated",
"text",
"textMuted",
"signal",
"uplink",
"border",
"control",
"controlText",
"button",
"buttonText",
"badge",
"badgeText",
"fontFamily"
],
"contrast_check_count": 6,
"contrast_pass_count": 6,
"contrast_checks": [
{
"id": "text-on-background",
"label": "Text on background",
"foreground_role": "text",
"background_role": "background",
"foreground": "#142033",
"background": "#f7fbff",
"ratio": 15.73,
"required_ratio": 4.5,
"passes": true,
"level": "AAA",
"summary": "Text on background is AAA at 15.73:1 against a 4.5:1 requirement."
},
{
"id": "text-on-panel",
"label": "Text on panel",
"foreground_role": "text",
"background_role": "panel",
"foreground": "#142033",
"background": "#ffffff",
"ratio": 16.35,
"required_ratio": 4.5,
"passes": true,
"level": "AAA",
"summary": "Text on panel is AAA at 16.35:1 against a 4.5:1 requirement."
},
{
"id": "muted-text-on-panel",
"label": "Muted text on panel",
"foreground_role": "textMuted",
"background_role": "panel",
"foreground": "#526174",
"background": "#ffffff",
"ratio": 6.32,
"required_ratio": 4.5,
"passes": true,
"level": "AA",
"summary": "Muted text on panel is AA at 6.32:1 against a 4.5:1 requirement."
},
{
"id": "button-text-on-button",
"label": "Button text on button",
"foreground_role": "buttonText",
"background_role": "button",
"foreground": "#ffffff",
"background": "#166bff",
"ratio": 4.58,
"required_ratio": 4.5,
"passes": true,
"level": "AA",
"summary": "Button text on button is AA at 4.58:1 against a 4.5:1 requirement."
},
{
"id": "control-text-on-control",
"label": "Control text on control",
"foreground_role": "controlText",
"background_role": "control",
"foreground": "#142033",
"background": "#ffffff",
"ratio": 16.35,
"required_ratio": 4.5,
"passes": true,
"level": "AAA",
"summary": "Control text on control is AAA at 16.35:1 against a 4.5:1 requirement."
},
{
"id": "badge-text-on-badge",
"label": "Badge text on badge",
"foreground_role": "badgeText",
"background_role": "badge",
"foreground": "#174ea6",
"background": "#eef5ff",
"ratio": 7.15,
"required_ratio": 4.5,
"passes": true,
"level": "AAA",
"summary": "Badge text on badge is AAA at 7.15:1 against a 4.5:1 requirement."
}
],
"contrast_target": "AA",
"accessibility_standard": "WCAG_2_2_AA",
"accessibility_check_count": 5,
"accessibility_checks": [
{
"id": "semantic-structure",
"label": "Semantic structure",
"category": "semantics",
"status": "covered",
"required": true,
"proof": "runtime block sections, cards, lists, and headings",
"summary": "search-discovery keeps semantic wrappers and readable heading/copy structure in the runtime preview."
},
{
"id": "keyboard-and-tap-targets",
"label": "Keyboard and tap targets",
"category": "keyboard",
"status": "covered",
"required": true,
"proof": "mapped actions/controls render as native focusable surfaces",
"summary": "Interactive surfaces stay reachable, focusable, and recipe-styled without shrinking below expected touch affordances."
},
{
"id": "text-alternatives",
"label": "Text alternatives",
"category": "media",
"status": "covered",
"required": false,
"proof": "media slots collapse when unused",
"summary": "Recipes without media do not leave decorative media shells that need alt text."
},
{
"id": "control-labels",
"label": "Control labels",
"category": "forms",
"status": "covered",
"required": true,
"proof": "control map includes required field labels and option metadata",
"summary": "Input and choice controls are mapped with labels, required state, and option counts for CMS and runtime review."
},
{
"id": "status-and-motion",
"label": "Status and motion",
"category": "state",
"status": "covered",
"required": true,
"proof": "runtime evidence avoids hidden status-only content",
"summary": "Recipe defaults avoid motion-only meaning and keep status text inspectable when state is present."
}
],
"responsive_behavior_count": 3,
"responsive_behavior_map": [
{
"id": "phone",
"label": "Phone",
"viewport_width": 390,
"layout_mode": "single-column stack",
"column_count": 1,
"spacing_density": "compact",
"media_policy": "Media slots remain optional and collapse without leaving empty chrome.",
"overflow_policy": "min-width:0 surfaces, wrapping copy, and no horizontal overflow in the static catalog phone smoke.",
"interaction_policy": "Actions and controls wrap into reachable rows with stable tap targets.",
"proof": "npm run test:static:block-catalog all-blocks-phone",
"summary": "Compact Ops stacks search-discovery into one phone column with compact spacing and bounded content."
},
{
"id": "tablet",
"label": "Tablet",
"viewport_width": 768,
"layout_mode": "two-column adaptive grid",
"column_count": 2,
"spacing_density": "compact",
"media_policy": "Media slots remain optional and collapse without leaving empty chrome.",
"overflow_policy": "tablet preview frames keep mid-width composition, wrap controls, and avoid horizontal overflow in the static catalog smoke.",
"interaction_policy": "Actions and controls wrap into reachable rows with stable tap targets.",
"proof": "npm run test:static:block-catalog all-blocks-tablet",
"summary": "Compact Ops adapts search-discovery to 2 tablet columns before expanding to the desktop layout."
},
{
"id": "desktop",
"label": "Desktop",
"viewport_width": 1366,
"layout_mode": "responsive composition grid",
"column_count": 2,
"spacing_density": "compact",
"media_policy": "Media slots remain optional and collapse without leaving empty chrome.",
"overflow_policy": "desktop preview frames keep constrained widths, stable cards, and no horizontal overflow in the static catalog smoke.",
"interaction_policy": "Actions and controls wrap into reachable rows with stable tap targets.",
"proof": "npm run test:static:block-catalog all-blocks-desktop",
"summary": "Compact Ops gives search-discovery up to 2 desktop columns while preserving recipe spacing."
}
],
"responsive_viewports": [
"phone",
"tablet",
"desktop"
],
"responsive_proof": [
"npm run test:static:block-catalog all-blocks-phone",
"npm run test:static:block-catalog all-blocks-tablet",
"npm run test:static:block-catalog all-blocks-desktop"
],
"interactive_roles": [
"link",
"text"
],
"recipe_alignment": {
"action_token": "button",
"control_token": "control",
"surface_token": "panel",
"text_token": "text",
"source": "theme recipe tokens"
}
},
"cloneable": true
}
}A resilience payload with plausible long CMS copy, longer labels, and dense supporting metadata to prove wrapping and spacing.
search-discovery uses recipe surface tokens to keep the outer frame styled and composable.
background, panel, panelElevated, borderCopy fields map to primary and muted text roles so editors can change words without restyling the block.
text, textMutedAction regions use recipe button and accent tokens while preserving href or event payloads.
button, buttonText, signal, uplinkControl regions keep labels, required state, and options aligned with recipe control tokens.
control, controlText, borderFeedback regions tie state-readiness evidence to visible recipe status treatments.
badge, badgeText, signalUse to verify search-discovery long copy, awkward values, and wrapping before publishing customer pages.
Long Copy Stress is a high-complexity stress-test recipe with 5 documented composition slots.
3 required regions, 2 optional regions.
search-discovery is best composed into funnel, contact, service-page, and related pages.
4 page types mapped for search-discovery.Choose the first matching page type before editing copy, media, or actions so the recipe starts in the right narrative context.search-discovery can act as conversion, content, form-controls within a composed page.
5 anatomy regions produce 3 section roles.Place the block where its required anatomy regions have enough room before compressing it into dense page slots.Long Copy Stress composition passport is copy-led, cta-led, input-led for CMS composition.
36/37 fields are editable across 3 content models.Keep the content model stable when replacing defaults; do not turn a repeatable or media-led recipe into unrelated ad hoc content.search-discovery carries link-link, text interaction affordances.
4 action surfaces and 3 control surfaces mapped.Review href, event, input, required, and disabled-state evidence before publishing an interactive recipe.search-discovery uses stress-test authoring with high complexity.
37 default provenance items with 3 high-care replacements.Use the default provenance map before cloning the recipe into CMS content or agent-generated page data.search-discovery has explicit phone, tablet, and desktop compatibility evidence for composed pages.
3 responsive behavior maps cover phone, tablet, and desktop composition.Review phone wrapping, tablet mid-width balance, and desktop density before adding nested content, longer labels, or extra media.search-discovery keeps a stable recipe surface with panel, border, and spacing roles instead of ad hoc wrappers.
editorial treatment uses spacious density and 8px radius base.background, panel, panelElevated, borderPrimary, muted, and badge text roles stay distinct enough for headings, body copy, metadata, and helper text.
6/6 contrast checks pass the AA target.text, textMuted, badgeTextInteractive regions use recipe action/control tokens and preserve labels, hrefs, events, required state, and options.
4 action surfaces and 3 control surfaces mapped.button, buttonText, control, controlText, signal, uplinkThe recipe remains polished without requiring placeholder media or visual assets inside this block.
No media region is required for this recipe.panelElevated, border, textMutedFeedback, selected, loading, invalid, and disabled treatments use visible state evidence instead of color-only meaning.
6 state-readiness entries include default, empty, pending, active, invalid, disabled.badge, badgeText, signalPhone, tablet, and desktop defaults have explicit stack, wrap, media, and overflow policies for the recipe.
single-column stack phone behavior, two-column adaptive grid tablet behavior, and responsive composition grid desktop behavior documented.panel, border, controlKeep visual styling aligned to Editorial Block System recipe tokens unless the recipe itself changes.
Editorial Block System recipe tokensCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadReplace the asset through CMS media data and keep alt, title, provider, or label fallback text meaningful.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadKeep the label paired with a valid href or canonical postEvent event name before publishing.
CMS route, URL, or canonical postEvent pathEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.
cloneable block recipe payloadKeep the label paired with a valid href or canonical postEvent event name before publishing.
CMS route, URL, or canonical postEvent pathCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.
cloneable block recipe payloadKeep the label paired with a valid href or canonical postEvent event name before publishing.
CMS route, URL, or canonical postEvent pathCopy bundle groups 13 fields so CMS edits preserve the recipe shape and default polish.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.Action bundle groups 3 fields so CMS edits preserve the recipe shape and default polish.
CMS route, URL, or canonical postEvent pathKeep the label paired with a valid href or canonical postEvent event name before publishing.Proof bundle groups 1 field so CMS edits preserve the recipe shape and default polish.
cloneable block recipe payloadEdit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.Style bundle groups 1 field so CMS edits preserve the recipe shape and default polish.
Editorial Block System recipe tokensKeep visual styling aligned to Editorial Block System recipe tokens unless the recipe itself changes.Content bundle groups 19 fields so CMS edits preserve the recipe shape and default polish.
cloneable block recipe payloadCopy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.
cloneable block recipe payloadActions should resolve to a URL or event name with a human-readable label.
CMS route, URL, or canonical postEvent pathProof fields should keep labels, values, and status text visible without color-only meaning.
cloneable block recipe payloadStyle fields should prefer recipe or appearance tokens over one-off inline values.
Editorial Block System recipe tokensContent should remain serializable JSON and preserve the documented block contract.
cloneable block recipe payloadEditorial Block System tokens with editorial documentation treatment
The Editorial Block System recipe renders a contract-safe primary state for search-discovery.Reserved panel space with fallback copy or placeholder media
Repeatable fields are documented for add, remove, reorder, and item-level editing.Neutral reserved frame with status copy and no layout shift
Async-capable props are mapped through controls, events, or provider placeholders.Signal/uplink emphasis with visible selected-state chips
4 action surfaces and 3 control surfaces are mapped for selected-state review.Warning/danger status treatment while preserving the block frame
Form controls preserve labels, required state, options, and submission metadata.Muted affordance with preserved label, spacing, and hit-area rhythm
Interactive maps preserve labels and control roles so disabled states can stay understandable.search-discovery keeps semantic wrappers and readable heading/copy structure in the runtime preview.
runtime block sections, cards, lists, and headingsInteractive surfaces stay reachable, focusable, and recipe-styled without shrinking below expected touch affordances.
mapped actions/controls render as native focusable surfacesRecipes without media do not leave decorative media shells that need alt text.
media slots collapse when unusedInput and choice controls are mapped with labels, required state, and option counts for CMS and runtime review.
control map includes required field labels and option metadataRecipe defaults avoid motion-only meaning and keep status text inspectable when state is present.
runtime evidence avoids hidden status-only contentEditorial Block System stacks search-discovery into one phone column with spacious spacing and bounded content.
min-width:0 surfaces, wrapping copy, and no horizontal overflow in the static catalog phone smoke.Editorial Block System adapts search-discovery to 2 tablet columns before expanding to the desktop layout.
tablet preview frames keep mid-width composition, wrap controls, and avoid horizontal overflow in the static catalog smoke.Editorial Block System gives search-discovery up to 2 desktop columns while preserving recipe spacing.
desktop preview frames keep constrained widths, stable cards, and no horizontal overflow in the static catalog smoke.This intentionally longer copy uses normal words, punctuation, and CMS-style details so the block proves it can remain polished with production-length titles, helper text, labels, badges, links, and nested content.
Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.
Product
A discovery result with category, tags, action, and citation-style source metadata.
Recommendation
Recommendation surfaces use the same result card contract for static and API-backed states.
Demo retrieval does not replace tenant review, compliance review, or safety guidance.
{
"id": "block-doc-search-discovery-data-long-copy-stress",
"block_type": "search-discovery",
"props": {
"appearance": {
"preset": "block"
},
"title": "Search Discovery with a realistic CMS-authored headline that wraps cleanly across compact cards, mobile panels, and generated documentation frames",
"description": "This intentionally longer copy uses normal words, punctuation, and CMS-style details so the block proves it can remain polished with production-length titles, helper text, labels, badges, links, and nested content.",
"query_placeholder": "Search services, products, or resources",
"mode": "both",
"surface": "block-explorer",
"provider": "local-fallback",
"api": {
"search_endpoint": "/api/ensemble/templates/example-sites/kindcart-market/rag/search",
"recommend_endpoint": "/api/ensemble/templates/example-sites/kindcart-market/rag/recommend"
},
"filters": [
{
"label": "Products",
"value": "products",
"count": 3
},
{
"label": "Guides",
"value": "guides",
"count": 2
},
{
"label": "Services",
"value": "services",
"count": 4
}
],
"answer": "Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.",
"results": [
{
"title": "Source-backed product match",
"description": "A discovery result with category, tags, action, and citation-style source metadata.",
"category": "Product",
"topic": "Catalog retrieval",
"byline": "Block Explorer desk",
"published_at": "2026-06-09",
"freshness": "Demo source",
"content_type": "article",
"reading_time": "4 min read",
"tags": [
"rag-ready",
"local"
],
"href": "#block-preview",
"sources": [
{
"title": "Template catalog source",
"citation_label": "Catalog source A",
"excerpt": "Example-site content roots can include local retrieval indexes."
}
]
},
{
"title": "Guided service recommendation",
"description": "Recommendation surfaces use the same result card contract for static and API-backed states.",
"category": "Recommendation",
"tags": [
"guided",
"source-card"
],
"href": "#block-preview",
"sources": [
{
"title": "Operator-approved source",
"excerpt": "Replace demo content with tenant-approved source records before publishing."
}
]
}
],
"recommendations": [
{
"title": "Ask for a fit check",
"description": "Use provider-neutral recommendation APIs when external retrieval is configured."
},
{
"title": "Review source cards",
"description": "Show citations and trace metadata before a user acts on a recommendation."
}
],
"sources": [
{
"title": "Local fallback index",
"url": "#block-preview"
},
{
"title": "Provider-neutral endpoint",
"url": "#block-preview"
}
],
"disclaimer": "Demo retrieval does not replace tenant review, compliance review, or safety guidance.",
"headline": "Search Discovery with a realistic CMS-authored headline that wraps cleanly across compact cards, mobile panels, and generated documentation frames",
"subtitle": "This intentionally longer copy uses normal words, punctuation, and CMS-style details so the block proves it can remain polished with production-length titles, helper text, labels, badges, links, and nested content.",
"caption": "Replaceable media caption with enough source context to wrap onto multiple lines without crowding adjacent controls.",
"buttonText": "Continue with the guided CMS review"
},
"metadata": {
"long_copy_tolerance": true,
"awkward_content_tolerance": true,
"composition_recipe": {
"id": "long-copy-stress",
"intent": "stress",
"label": "Long Copy Stress",
"recipe": "editorial-block-system",
"source": "block-explorer",
"quality_proof": [
"long_copy_tolerance",
"awkward_content_tolerance"
],
"composition_passport": {
"id": "long-copy-stress",
"label": "Long Copy Stress composition passport",
"intent": "stress",
"recipe": "editorial-block-system",
"authoring_mode": "stress-test",
"complexity": "high",
"fit": "Use to verify search-discovery long copy, awkward values, and wrapping before publishing customer pages.",
"required_regions": [
"surface",
"copy",
"feedback"
],
"optional_regions": [
"actions",
"controls"
],
"slots": [
{
"id": "surface",
"label": "Surface",
"required": true,
"field_count": 1,
"editable_count": 0,
"token_roles": [
"background",
"panel",
"panelElevated",
"border"
],
"summary": "search-discovery uses recipe surface tokens to keep the outer frame styled and composable."
},
{
"id": "copy",
"label": "Copy",
"required": true,
"field_count": 13,
"editable_count": 13,
"token_roles": [
"text",
"textMuted"
],
"summary": "Copy fields map to primary and muted text roles so editors can change words without restyling the block."
},
{
"id": "actions",
"label": "Actions",
"required": false,
"field_count": 7,
"editable_count": 3,
"token_roles": [
"button",
"buttonText",
"signal",
"uplink"
],
"summary": "Action regions use recipe button and accent tokens while preserving href or event payloads."
},
{
"id": "controls",
"label": "Controls",
"required": false,
"field_count": 3,
"editable_count": 0,
"token_roles": [
"control",
"controlText",
"border"
],
"summary": "Control regions keep labels, required state, and options aligned with recipe control tokens."
},
{
"id": "feedback",
"label": "Feedback",
"required": true,
"field_count": 0,
"editable_count": 0,
"token_roles": [
"badge",
"badgeText",
"signal"
],
"summary": "Feedback regions tie state-readiness evidence to visible recipe status treatments."
}
],
"builder_field_count": 37,
"editable_field_count": 36,
"action_count": 4,
"control_count": 3,
"replacement_guidance": [
"Keep Editorial Block System recipe tokens as the source of visual styling for the surface, text, controls, and actions.",
"No media replacement is required; keep the layout rhythm stable when optional visual fields are omitted.",
"Verify each action keeps either a valid href or canonical event name plus an editor-visible label.",
"Verify control labels, required state, choices, and submission metadata before publishing.",
"The recipe does not require repeatable collection editing."
],
"publish_checklist": [
"Validate search-discovery against its block contract before publishing.",
"3 required anatomy regions remain present: surface, copy, feedback.",
"36/37 builder fields are CMS-editable or intentionally locked.",
"Interactive labels, target size, href/event wiring, and disabled states have been reviewed.",
"Phone, tablet, and desktop responsive behavior maps have been reviewed for wrapping and overflow.",
"Contrast checks meet the AA recipe target."
],
"agent_notes": [
"Prefer editing props fields described by the builder field map; metadata is evidence, not primary content.",
"Preserve recipe_alignment token roles unless the page theme or recipe changes intentionally.",
"Use the anatomy slots to compose or replace content without changing the block type."
],
"summary": "Long Copy Stress is a high-complexity stress-test recipe with 5 documented composition slots."
},
"composition_passport_complexity": "high",
"composition_passport_authoring_mode": "stress-test",
"composition_passport_slots": [
"surface",
"copy",
"actions",
"controls",
"feedback"
],
"composition_passport_check_count": 6,
"visual_polish_check_count": 6,
"visual_polish_pass_count": 6,
"visual_polish_checks": [
{
"id": "surface-rhythm",
"label": "Surface rhythm",
"axis": "layout",
"status": "ready",
"token_roles": [
"background",
"panel",
"panelElevated",
"border"
],
"evidence": "editorial treatment uses spacious density and 8px radius base.",
"summary": "search-discovery keeps a stable recipe surface with panel, border, and spacing roles instead of ad hoc wrappers."
},
{
"id": "type-hierarchy",
"label": "Type hierarchy",
"axis": "typography",
"status": "ready",
"token_roles": [
"text",
"textMuted",
"badgeText"
],
"evidence": "6/6 contrast checks pass the AA target.",
"summary": "Primary, muted, and badge text roles stay distinct enough for headings, body copy, metadata, and helper text."
},
{
"id": "action-clarity",
"label": "Action clarity",
"axis": "interaction",
"status": "ready",
"token_roles": [
"button",
"buttonText",
"control",
"controlText",
"signal",
"uplink"
],
"evidence": "4 action surfaces and 3 control surfaces mapped.",
"summary": "Interactive regions use recipe action/control tokens and preserve labels, hrefs, events, required state, and options."
},
{
"id": "media-treatment",
"label": "Media treatment",
"axis": "media",
"status": "ready",
"token_roles": [
"panelElevated",
"border",
"textMuted"
],
"evidence": "No media region is required for this recipe.",
"summary": "The recipe remains polished without requiring placeholder media or visual assets inside this block."
},
{
"id": "state-feedback",
"label": "State feedback",
"axis": "state",
"status": "ready",
"token_roles": [
"badge",
"badgeText",
"signal"
],
"evidence": "6 state-readiness entries include default, empty, pending, active, invalid, disabled.",
"summary": "Feedback, selected, loading, invalid, and disabled treatments use visible state evidence instead of color-only meaning."
},
{
"id": "responsive-balance",
"label": "Responsive balance",
"axis": "responsive",
"status": "ready",
"token_roles": [
"panel",
"border",
"control"
],
"evidence": "single-column stack phone behavior, two-column adaptive grid tablet behavior, and responsive composition grid desktop behavior documented.",
"summary": "Phone, tablet, and desktop defaults have explicit stack, wrap, media, and overflow policies for the recipe."
}
],
"visual_polish_axes": [
"layout",
"typography",
"interaction",
"media",
"state",
"responsive"
],
"default_provenance_count": 37,
"default_provenance_map": [
{
"path": "appearance",
"label": "Appearance",
"field_role": "style",
"value_type": "object",
"editable": false,
"repeated": false,
"default_source": "Editorial Block System recipe tokens",
"replacement_policy": "locked-token",
"replacement_risk": "medium",
"guardrail": "Keep visual styling aligned to Editorial Block System recipe tokens unless the recipe itself changes.",
"validation": "Style fields should prefer recipe or appearance tokens over one-off inline values.",
"summary": "Appearance defaults from Editorial Block System recipe tokens; replacement is medium risk with locked-token policy."
},
{
"path": "title",
"label": "Title",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Title defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "description",
"label": "Description",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Description defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "query_placeholder",
"label": "Query Placeholder",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Query Placeholder defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "mode",
"label": "Mode",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Mode defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "surface",
"label": "Surface",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Surface defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "provider",
"label": "Provider",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "requires-alt-text",
"replacement_risk": "medium",
"guardrail": "Replace the asset through CMS media data and keep alt, title, provider, or label fallback text meaningful.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Provider defaults from cloneable block recipe payload; replacement is medium risk with requires-alt-text policy."
},
{
"path": "api",
"label": "Api",
"field_role": "content",
"value_type": "object",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Api defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "filters",
"label": "Filters",
"field_role": "content",
"value_type": "array",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Filters defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "filters[].label",
"label": "Filters Item Label",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Filters Item Label defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "filters[].value",
"label": "Filters Item Value",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Filters Item Value defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "filters[].count",
"label": "Filters Item Count",
"field_role": "content",
"value_type": "number",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Filters Item Count defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "answer",
"label": "Answer",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Answer defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "results",
"label": "Results",
"field_role": "content",
"value_type": "array",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Results defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "results[].title",
"label": "Results Item Title",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Results Item Title defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].description",
"label": "Results Item Description",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Results Item Description defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].category",
"label": "Results Item Category",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Results Item Category defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].topic",
"label": "Results Item Topic",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Results Item Topic defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].byline",
"label": "Results Item Byline",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Results Item Byline defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].published_at",
"label": "Results Item Published At",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Results Item Published At defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].freshness",
"label": "Results Item Freshness",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Results Item Freshness defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].content_type",
"label": "Results Item Content Type",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Results Item Content Type defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].reading_time",
"label": "Results Item Reading Time",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Results Item Reading Time defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].tags",
"label": "Results Item Tags",
"field_role": "proof",
"value_type": "array",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Proof fields should keep labels, values, and status text visible without color-only meaning.",
"summary": "Results Item Tags defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "results[].href",
"label": "Results Item Href",
"field_role": "action",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "CMS route, URL, or canonical postEvent path",
"replacement_policy": "requires-action-target",
"replacement_risk": "high",
"guardrail": "Keep the label paired with a valid href or canonical postEvent event name before publishing.",
"validation": "Actions should resolve to a URL or event name with a human-readable label.",
"summary": "Results Item Href defaults from CMS route, URL, or canonical postEvent path; replacement is high risk with requires-action-target policy."
},
{
"path": "results[].sources",
"label": "Results Item Sources",
"field_role": "content",
"value_type": "array",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Results Item Sources defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "recommendations",
"label": "Recommendations",
"field_role": "content",
"value_type": "array",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Recommendations defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "recommendations[].title",
"label": "Recommendations Item Title",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Recommendations Item Title defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "recommendations[].description",
"label": "Recommendations Item Description",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Recommendations Item Description defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "sources",
"label": "Sources",
"field_role": "content",
"value_type": "array",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Sources defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "sources[].title",
"label": "Sources Item Title",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "cloneable block recipe payload",
"replacement_policy": "collection-item",
"replacement_risk": "medium",
"guardrail": "Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Sources Item Title defaults from cloneable block recipe payload; replacement is medium risk with collection-item policy."
},
{
"path": "sources[].url",
"label": "Sources Item Url",
"field_role": "action",
"value_type": "string",
"editable": true,
"repeated": true,
"default_source": "CMS route, URL, or canonical postEvent path",
"replacement_policy": "requires-action-target",
"replacement_risk": "high",
"guardrail": "Keep the label paired with a valid href or canonical postEvent event name before publishing.",
"validation": "Actions should resolve to a URL or event name with a human-readable label.",
"summary": "Sources Item Url defaults from CMS route, URL, or canonical postEvent path; replacement is high risk with requires-action-target policy."
},
{
"path": "disclaimer",
"label": "Disclaimer",
"field_role": "content",
"value_type": "string",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"summary": "Disclaimer defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "headline",
"label": "Headline",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Headline defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "subtitle",
"label": "Subtitle",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Subtitle defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "caption",
"label": "Caption",
"field_role": "copy",
"value_type": "string",
"editable": true,
"repeated": false,
"default_source": "cloneable block recipe payload",
"replacement_policy": "safe-to-edit",
"replacement_risk": "low",
"guardrail": "Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"summary": "Caption defaults from cloneable block recipe payload; replacement is low risk with safe-to-edit policy."
},
{
"path": "buttonText",
"label": "ButtonText",
"field_role": "action",
"value_type": "string",
"editable": true,
"repeated": false,
"default_source": "CMS route, URL, or canonical postEvent path",
"replacement_policy": "requires-action-target",
"replacement_risk": "high",
"guardrail": "Keep the label paired with a valid href or canonical postEvent event name before publishing.",
"validation": "Actions should resolve to a URL or event name with a human-readable label.",
"summary": "ButtonText defaults from CMS route, URL, or canonical postEvent path; replacement is high risk with requires-action-target policy."
}
],
"default_replacement_policies": [
"collection-item",
"locked-token",
"requires-action-target",
"requires-alt-text",
"safe-to-edit"
],
"default_replacement_risks": [
"high",
"low",
"medium"
],
"default_replacement_high_risk_count": 3,
"content_edit_bundle_count": 5,
"content_edit_bundles": [
{
"id": "copy",
"label": "Copy bundle",
"intent": "required",
"edit_mode": "repeatable-items",
"field_paths": [
"answer",
"caption",
"description",
"filters[].label",
"headline",
"recommendations[].description",
"recommendations[].title",
"results[].content_type",
"results[].description",
"results[].title",
"sources[].title",
"subtitle",
"title"
],
"default_sources": [
"cloneable block recipe payload"
],
"guardrails": [
"Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape."
],
"depends_on": [
"type hierarchy",
"mobile wrapping"
],
"summary": "Copy bundle groups 13 fields so CMS edits preserve the recipe shape and default polish."
},
{
"id": "actions",
"label": "Action bundle",
"intent": "recommended",
"edit_mode": "repeatable-items",
"field_paths": [
"buttonText",
"results[].href",
"sources[].url"
],
"default_sources": [
"CMS route, URL, or canonical postEvent path"
],
"guardrails": [
"Keep the label paired with a valid href or canonical postEvent event name before publishing."
],
"depends_on": [
"copy labels",
"href or event target",
"state readiness"
],
"summary": "Action bundle groups 3 fields so CMS edits preserve the recipe shape and default polish."
},
{
"id": "proof",
"label": "Proof bundle",
"intent": "recommended",
"edit_mode": "repeatable-items",
"field_paths": [
"results[].tags"
],
"default_sources": [
"cloneable block recipe payload"
],
"guardrails": [
"Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape."
],
"depends_on": [
"copy labels",
"contrast proof"
],
"summary": "Proof bundle groups 1 field so CMS edits preserve the recipe shape and default polish."
},
{
"id": "style",
"label": "Style bundle",
"intent": "guarded",
"edit_mode": "guarded-system",
"field_paths": [
"appearance"
],
"default_sources": [
"Editorial Block System recipe tokens"
],
"guardrails": [
"Keep visual styling aligned to Editorial Block System recipe tokens unless the recipe itself changes."
],
"depends_on": [
"theme recipe tokens",
"contrast proof"
],
"summary": "Style bundle groups 1 field so CMS edits preserve the recipe shape and default polish."
},
{
"id": "content",
"label": "Content bundle",
"intent": "required",
"edit_mode": "repeatable-items",
"field_paths": [
"api",
"disclaimer",
"filters",
"filters[].count",
"filters[].value",
"mode",
"provider",
"query_placeholder",
"recommendations",
"results",
"results[].byline",
"results[].category",
"results[].freshness",
"results[].published_at",
"results[].reading_time",
"results[].sources",
"results[].topic",
"sources",
"surface"
],
"default_sources": [
"cloneable block recipe payload"
],
"guardrails": [
"Copy can be edited directly when text remains trimmed, localizable, and safe to wrap at phone widths.",
"Edit repeatable items through collection controls so add, remove, reorder, and item-level updates preserve shape.",
"Replace the asset through CMS media data and keep alt, title, provider, or label fallback text meaningful."
],
"depends_on": [
"contract-safe JSON"
],
"summary": "Content bundle groups 19 fields so CMS edits preserve the recipe shape and default polish."
}
],
"content_edit_bundle_ids": [
"copy",
"actions",
"proof",
"style",
"content"
],
"content_edit_bundle_modes": [
"guarded-system",
"repeatable-items"
],
"content_edit_bundle_required_count": 2,
"content_edit_bundle_guarded_count": 1,
"recipe_compatibility_count": 6,
"recipe_compatibility_map": [
{
"id": "page-context",
"label": "Page context",
"axis": "page",
"fit": "supporting",
"values": [
"funnel",
"contact",
"service-page",
"blog"
],
"evidence": "4 page types mapped for search-discovery.",
"guardrail": "Choose the first matching page type before editing copy, media, or actions so the recipe starts in the right narrative context.",
"summary": "search-discovery is best composed into funnel, contact, service-page, and related pages."
},
{
"id": "section-role",
"label": "Section role",
"axis": "layout",
"fit": "primary",
"values": [
"conversion",
"content",
"form-controls"
],
"evidence": "5 anatomy regions produce 3 section roles.",
"guardrail": "Place the block where its required anatomy regions have enough room before compressing it into dense page slots.",
"summary": "search-discovery can act as conversion, content, form-controls within a composed page."
},
{
"id": "content-model",
"label": "Content model",
"axis": "content",
"fit": "supporting",
"values": [
"copy-led",
"cta-led",
"input-led"
],
"evidence": "36/37 fields are editable across 3 content models.",
"guardrail": "Keep the content model stable when replacing defaults; do not turn a repeatable or media-led recipe into unrelated ad hoc content.",
"summary": "Long Copy Stress composition passport is copy-led, cta-led, input-led for CMS composition."
},
{
"id": "interaction-model",
"label": "Interaction model",
"axis": "interaction",
"fit": "primary",
"values": [
"link-link",
"text"
],
"evidence": "4 action surfaces and 3 control surfaces mapped.",
"guardrail": "Review href, event, input, required, and disabled-state evidence before publishing an interactive recipe.",
"summary": "search-discovery carries link-link, text interaction affordances."
},
{
"id": "authoring-fit",
"label": "Authoring fit",
"axis": "authoring",
"fit": "specialized",
"values": [
"stress-test",
"high-complexity",
"3-high-care-replacements"
],
"evidence": "37 default provenance items with 3 high-care replacements.",
"guardrail": "Use the default provenance map before cloning the recipe into CMS content or agent-generated page data.",
"summary": "search-discovery uses stress-test authoring with high complexity."
},
{
"id": "responsive-fit",
"label": "Responsive fit",
"axis": "responsive",
"fit": "primary",
"values": [
"single-column stack",
"two-column adaptive grid",
"responsive composition grid",
"min-width:0 surfaces, wrapping copy, and no horizontal overflow in the static catalog phone smoke."
],
"evidence": "3 responsive behavior maps cover phone, tablet, and desktop composition.",
"guardrail": "Review phone wrapping, tablet mid-width balance, and desktop density before adding nested content, longer labels, or extra media.",
"summary": "search-discovery has explicit phone, tablet, and desktop compatibility evidence for composed pages."
}
],
"recipe_compatibility_axes": [
"page",
"layout",
"content",
"interaction",
"authoring",
"responsive"
],
"recipe_compatibility_page_types": [
"funnel",
"contact",
"service-page",
"blog"
],
"recipe_compatibility_section_roles": [
"conversion",
"content",
"form-controls"
],
"recipe_compatibility_fits": [
"primary",
"specialized",
"supporting"
],
"builder_field_count": 37,
"builder_field_map": [
{
"path": "appearance",
"label": "Appearance",
"value_type": "object",
"role": "style",
"editable": false,
"repeated": false,
"summary": "Appearance is a object field used for style."
},
{
"path": "title",
"label": "Title",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": false,
"summary": "Title is a string field used for copy."
},
{
"path": "description",
"label": "Description",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": false,
"summary": "Description is a string field used for copy."
},
{
"path": "query_placeholder",
"label": "Query Placeholder",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Query Placeholder is a string field used for content."
},
{
"path": "mode",
"label": "Mode",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Mode is a string field used for content."
},
{
"path": "surface",
"label": "Surface",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Surface is a string field used for content."
},
{
"path": "provider",
"label": "Provider",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Provider is a string field used for content."
},
{
"path": "api",
"label": "Api",
"value_type": "object",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Api is a object field used for content."
},
{
"path": "filters",
"label": "Filters",
"value_type": "array",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Filters is a array field used for content."
},
{
"path": "filters[].label",
"label": "Filters Item Label",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": true,
"summary": "Filters Item Label is a string collection field used for copy."
},
{
"path": "filters[].value",
"label": "Filters Item Value",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": true,
"summary": "Filters Item Value is a string collection field used for content."
},
{
"path": "filters[].count",
"label": "Filters Item Count",
"value_type": "number",
"role": "content",
"editable": true,
"repeated": true,
"summary": "Filters Item Count is a number collection field used for content."
},
{
"path": "answer",
"label": "Answer",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": false,
"summary": "Answer is a string field used for copy."
},
{
"path": "results",
"label": "Results",
"value_type": "array",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Results is a array field used for content."
},
{
"path": "results[].title",
"label": "Results Item Title",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": true,
"summary": "Results Item Title is a string collection field used for copy."
},
{
"path": "results[].description",
"label": "Results Item Description",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": true,
"summary": "Results Item Description is a string collection field used for copy."
},
{
"path": "results[].category",
"label": "Results Item Category",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": true,
"summary": "Results Item Category is a string collection field used for content."
},
{
"path": "results[].topic",
"label": "Results Item Topic",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": true,
"summary": "Results Item Topic is a string collection field used for content."
},
{
"path": "results[].byline",
"label": "Results Item Byline",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": true,
"summary": "Results Item Byline is a string collection field used for content."
},
{
"path": "results[].published_at",
"label": "Results Item Published At",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": true,
"summary": "Results Item Published At is a string collection field used for content."
},
{
"path": "results[].freshness",
"label": "Results Item Freshness",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": true,
"summary": "Results Item Freshness is a string collection field used for content."
},
{
"path": "results[].content_type",
"label": "Results Item Content Type",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": true,
"summary": "Results Item Content Type is a string collection field used for copy."
},
{
"path": "results[].reading_time",
"label": "Results Item Reading Time",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": true,
"summary": "Results Item Reading Time is a string collection field used for content."
},
{
"path": "results[].tags",
"label": "Results Item Tags",
"value_type": "array",
"role": "proof",
"editable": true,
"repeated": true,
"summary": "Results Item Tags is a array collection field used for proof."
},
{
"path": "results[].href",
"label": "Results Item Href",
"value_type": "string",
"role": "action",
"editable": true,
"repeated": true,
"summary": "Results Item Href is a string collection field used for action."
},
{
"path": "results[].sources",
"label": "Results Item Sources",
"value_type": "array",
"role": "content",
"editable": true,
"repeated": true,
"summary": "Results Item Sources is a array collection field used for content."
},
{
"path": "recommendations",
"label": "Recommendations",
"value_type": "array",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Recommendations is a array field used for content."
},
{
"path": "recommendations[].title",
"label": "Recommendations Item Title",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": true,
"summary": "Recommendations Item Title is a string collection field used for copy."
},
{
"path": "recommendations[].description",
"label": "Recommendations Item Description",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": true,
"summary": "Recommendations Item Description is a string collection field used for copy."
},
{
"path": "sources",
"label": "Sources",
"value_type": "array",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Sources is a array field used for content."
},
{
"path": "sources[].title",
"label": "Sources Item Title",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": true,
"summary": "Sources Item Title is a string collection field used for copy."
},
{
"path": "sources[].url",
"label": "Sources Item Url",
"value_type": "string",
"role": "action",
"editable": true,
"repeated": true,
"summary": "Sources Item Url is a string collection field used for action."
},
{
"path": "disclaimer",
"label": "Disclaimer",
"value_type": "string",
"role": "content",
"editable": true,
"repeated": false,
"summary": "Disclaimer is a string field used for content."
},
{
"path": "headline",
"label": "Headline",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": false,
"summary": "Headline is a string field used for copy."
},
{
"path": "subtitle",
"label": "Subtitle",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": false,
"summary": "Subtitle is a string field used for copy."
},
{
"path": "caption",
"label": "Caption",
"value_type": "string",
"role": "copy",
"editable": true,
"repeated": false,
"summary": "Caption is a string field used for copy."
},
{
"path": "buttonText",
"label": "ButtonText",
"value_type": "string",
"role": "action",
"editable": true,
"repeated": false,
"summary": "ButtonText is a string field used for action."
}
],
"editor_guidance_count": 5,
"editor_guidance_map": [
{
"id": "copy",
"label": "Copy",
"field_role": "copy",
"field_count": 13,
"editable_count": 13,
"editor_widget": "text/rich-text editor",
"validation": "Text should be editable, trimmed, localizable, and safe to wrap at mobile widths.",
"default_source": "cloneable block recipe payload",
"summary": "Copy fields use the text/rich-text editor across 13/13 editable fields."
},
{
"id": "action",
"label": "Action",
"field_role": "action",
"field_count": 3,
"editable_count": 3,
"editor_widget": "link or event action editor",
"validation": "Actions should resolve to a URL or event name with a human-readable label.",
"default_source": "CMS route, URL, or canonical postEvent path",
"summary": "Action fields use the link or event action editor across 3/3 editable fields."
},
{
"id": "proof",
"label": "Proof",
"field_role": "proof",
"field_count": 1,
"editable_count": 1,
"editor_widget": "metric, badge, or proof editor",
"validation": "Proof fields should keep labels, values, and status text visible without color-only meaning.",
"default_source": "cloneable block recipe payload",
"summary": "Proof fields use the metric, badge, or proof editor across 1/1 editable field."
},
{
"id": "style",
"label": "Style",
"field_role": "style",
"field_count": 1,
"editable_count": 0,
"editor_widget": "appearance preset selector",
"validation": "Style fields should prefer recipe or appearance tokens over one-off inline values.",
"default_source": "Editorial Block System recipe tokens",
"summary": "Style fields use the appearance preset selector across 0/1 editable field."
},
{
"id": "content",
"label": "Content",
"field_role": "content",
"field_count": 19,
"editable_count": 19,
"editor_widget": "plain content field",
"validation": "Content should remain serializable JSON and preserve the documented block contract.",
"default_source": "cloneable block recipe payload",
"summary": "Content fields use the plain content field across 19/19 editable fields."
}
],
"editor_field_roles": [
"copy",
"action",
"proof",
"style",
"content"
],
"editor_editable_field_count": 36,
"state_readiness_count": 6,
"state_readiness_map": [
{
"id": "default",
"label": "Default",
"status": "covered",
"trigger": "Initial render with the cloneable recipe payload",
"visual_treatment": "Editorial Block System tokens with editorial documentation treatment",
"token_roles": [
"surface",
"panel",
"text",
"button"
],
"proof": "The Editorial Block System recipe renders a contract-safe primary state for search-discovery.",
"summary": "Default state uses the recipe surface, text, and action tokens without one-off styling."
},
{
"id": "empty",
"label": "Empty",
"status": "covered",
"trigger": "Repeatable collections have zero items",
"visual_treatment": "Reserved panel space with fallback copy or placeholder media",
"token_roles": [
"panel",
"textMuted",
"badge",
"border"
],
"proof": "Repeatable fields are documented for add, remove, reorder, and item-level editing.",
"summary": "Empty-state guidance preserves layout rhythm instead of collapsing the block surface."
},
{
"id": "pending",
"label": "Pending",
"status": "covered",
"trigger": "Async assignment, embed load, or form submission is in flight",
"visual_treatment": "Neutral reserved frame with status copy and no layout shift",
"token_roles": [
"control",
"textMuted",
"progressTrack",
"border"
],
"proof": "Async-capable props are mapped through controls, events, or provider placeholders.",
"summary": "Pending state keeps dimensions stable while using muted control/status tokens."
},
{
"id": "active",
"label": "Active",
"status": "covered",
"trigger": "Selected action, active link, checked input, or open disclosure",
"visual_treatment": "Signal/uplink emphasis with visible selected-state chips",
"token_roles": [
"signal",
"uplink",
"button",
"badge"
],
"proof": "4 action surfaces and 3 control surfaces are mapped for selected-state review.",
"summary": "Active state is represented with recipe accent tokens and visible state labels."
},
{
"id": "invalid",
"label": "Invalid",
"status": "covered",
"trigger": "Required input, option, or submitted value is invalid",
"visual_treatment": "Warning/danger status treatment while preserving the block frame",
"token_roles": [
"warning",
"danger",
"border",
"text"
],
"proof": "Form controls preserve labels, required state, options, and submission metadata.",
"summary": "Invalid state guidance favors explicit status evidence over ambiguous visual collapse."
},
{
"id": "disabled",
"label": "Disabled",
"status": "covered",
"trigger": "Unavailable action or temporarily disabled control",
"visual_treatment": "Muted affordance with preserved label, spacing, and hit-area rhythm",
"token_roles": [
"control",
"textMuted",
"border",
"panel"
],
"proof": "Interactive maps preserve labels and control roles so disabled states can stay understandable.",
"summary": "Disabled state keeps the block readable and spatially stable when interaction is unavailable."
}
],
"state_readiness_states": [
"default",
"empty",
"pending",
"active",
"invalid",
"disabled"
],
"state_readiness_statuses": [
"covered",
"covered",
"covered",
"covered",
"covered",
"covered"
],
"anatomy_region_count": 5,
"anatomy_map": [
{
"id": "surface",
"label": "Surface",
"region_role": "outer layout and background",
"field_paths": [
"appearance"
],
"token_roles": [
"background",
"panel",
"panelElevated",
"border"
],
"state_ids": [
"default",
"empty",
"pending",
"active",
"invalid",
"disabled"
],
"required": true,
"summary": "search-discovery uses recipe surface tokens to keep the outer frame styled and composable."
},
{
"id": "copy",
"label": "Copy",
"region_role": "headings, body copy, labels, and supporting text",
"field_paths": [
"answer",
"caption",
"description",
"filters[].label",
"headline",
"recommendations[].description",
"recommendations[].title",
"results[].content_type",
"results[].description",
"results[].title",
"sources[].title",
"subtitle",
"title"
],
"token_roles": [
"text",
"textMuted"
],
"state_ids": [
"default",
"empty",
"pending",
"active",
"invalid",
"disabled"
],
"required": true,
"summary": "Copy fields map to primary and muted text roles so editors can change words without restyling the block."
},
{
"id": "actions",
"label": "Actions",
"region_role": "CTA, link, event, and navigation affordances",
"field_paths": [
"buttonText",
"results[].href",
"results[0]",
"results[1]",
"sources[].url",
"sources[0]",
"sources[1]"
],
"token_roles": [
"button",
"buttonText",
"signal",
"uplink"
],
"state_ids": [
"default",
"empty",
"pending",
"active",
"invalid",
"disabled"
],
"required": false,
"summary": "Action regions use recipe button and accent tokens while preserving href or event payloads."
},
{
"id": "controls",
"label": "Controls",
"region_role": "inputs, choices, form fields, and operator controls",
"field_paths": [
"filters[0]",
"filters[1]",
"filters[2]"
],
"token_roles": [
"control",
"controlText",
"border"
],
"state_ids": [
"default",
"empty",
"pending",
"active",
"invalid",
"disabled"
],
"required": false,
"summary": "Control regions keep labels, required state, and options aligned with recipe control tokens."
},
{
"id": "feedback",
"label": "Feedback",
"region_role": "status, validation, selected, loading, and disabled evidence",
"field_paths": [],
"token_roles": [
"badge",
"badgeText",
"signal"
],
"state_ids": [
"default",
"empty",
"pending",
"active",
"invalid",
"disabled"
],
"required": true,
"summary": "Feedback regions tie state-readiness evidence to visible recipe status treatments."
}
],
"anatomy_regions": [
"surface",
"copy",
"actions",
"controls",
"feedback"
],
"anatomy_token_roles": [
"background",
"badge",
"badgeText",
"border",
"button",
"buttonText",
"control",
"controlText",
"panel",
"panelElevated",
"signal",
"text",
"textMuted",
"uplink"
],
"action_count": 4,
"action_map": [
{
"path": "results[0]",
"label": "Source-backed product match",
"action_type": "link",
"href": "#block-preview",
"event_name": null,
"summary": "Source-backed product match is a link action linking to #block-preview."
},
{
"path": "results[1]",
"label": "Guided service recommendation",
"action_type": "link",
"href": "#block-preview",
"event_name": null,
"summary": "Guided service recommendation is a link action linking to #block-preview."
},
{
"path": "sources[0]",
"label": "Local fallback index",
"action_type": "link",
"href": "#block-preview",
"event_name": null,
"summary": "Local fallback index is a link action linking to #block-preview."
},
{
"path": "sources[1]",
"label": "Provider-neutral endpoint",
"action_type": "link",
"href": "#block-preview",
"event_name": null,
"summary": "Provider-neutral endpoint is a link action linking to #block-preview."
}
],
"control_count": 3,
"control_map": [
{
"path": "filters[0]",
"label": "Products",
"control_type": "text",
"required": false,
"option_count": null,
"summary": "Products is a text control."
},
{
"path": "filters[1]",
"label": "Guides",
"control_type": "text",
"required": false,
"option_count": null,
"summary": "Guides is a text control."
},
{
"path": "filters[2]",
"label": "Services",
"control_type": "text",
"required": false,
"option_count": null,
"summary": "Services is a text control."
}
],
"style_token_count": 15,
"style_token_map": [
{
"role": "background",
"label": "Page background",
"value": "#f7fbff",
"token_type": "color",
"summary": "Page background uses the background recipe token."
},
{
"role": "panel",
"label": "Panel surface",
"value": "#ffffff",
"token_type": "color",
"summary": "Panel surface uses the panel recipe token."
},
{
"role": "panelElevated",
"label": "Elevated surface",
"value": "#ffffff",
"token_type": "color",
"summary": "Elevated surface uses the panelElevated recipe token."
},
{
"role": "text",
"label": "Primary text",
"value": "#142033",
"token_type": "color",
"summary": "Primary text uses the text recipe token."
},
{
"role": "textMuted",
"label": "Muted text",
"value": "#526174",
"token_type": "color",
"summary": "Muted text uses the textMuted recipe token."
},
{
"role": "signal",
"label": "Signal accent",
"value": "#166bff",
"token_type": "color",
"summary": "Signal accent uses the signal recipe token."
},
{
"role": "uplink",
"label": "Secondary accent",
"value": "#00a6a6",
"token_type": "color",
"summary": "Secondary accent uses the uplink recipe token."
},
{
"role": "border",
"label": "Border",
"value": "#d6dee8",
"token_type": "color",
"summary": "Border uses the border recipe token."
},
{
"role": "control",
"label": "Control surface",
"value": "#ffffff",
"token_type": "color",
"summary": "Control surface uses the control recipe token."
},
{
"role": "controlText",
"label": "Control text",
"value": "#142033",
"token_type": "color",
"summary": "Control text uses the controlText recipe token."
},
{
"role": "button",
"label": "Button surface",
"value": "#166bff",
"token_type": "color",
"summary": "Button surface uses the button recipe token."
},
{
"role": "buttonText",
"label": "Button text",
"value": "#ffffff",
"token_type": "color",
"summary": "Button text uses the buttonText recipe token."
},
{
"role": "badge",
"label": "Badge surface",
"value": "#eef5ff",
"token_type": "color",
"summary": "Badge surface uses the badge recipe token."
},
{
"role": "badgeText",
"label": "Badge text",
"value": "#174ea6",
"token_type": "color",
"summary": "Badge text uses the badgeText recipe token."
},
{
"role": "fontFamily",
"label": "Font family",
"value": "Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif",
"token_type": "font",
"summary": "Font family comes from the active recipe theme tokens."
}
],
"style_token_roles": [
"background",
"panel",
"panelElevated",
"text",
"textMuted",
"signal",
"uplink",
"border",
"control",
"controlText",
"button",
"buttonText",
"badge",
"badgeText",
"fontFamily"
],
"contrast_check_count": 6,
"contrast_pass_count": 6,
"contrast_checks": [
{
"id": "text-on-background",
"label": "Text on background",
"foreground_role": "text",
"background_role": "background",
"foreground": "#142033",
"background": "#f7fbff",
"ratio": 15.73,
"required_ratio": 4.5,
"passes": true,
"level": "AAA",
"summary": "Text on background is AAA at 15.73:1 against a 4.5:1 requirement."
},
{
"id": "text-on-panel",
"label": "Text on panel",
"foreground_role": "text",
"background_role": "panel",
"foreground": "#142033",
"background": "#ffffff",
"ratio": 16.35,
"required_ratio": 4.5,
"passes": true,
"level": "AAA",
"summary": "Text on panel is AAA at 16.35:1 against a 4.5:1 requirement."
},
{
"id": "muted-text-on-panel",
"label": "Muted text on panel",
"foreground_role": "textMuted",
"background_role": "panel",
"foreground": "#526174",
"background": "#ffffff",
"ratio": 6.32,
"required_ratio": 4.5,
"passes": true,
"level": "AA",
"summary": "Muted text on panel is AA at 6.32:1 against a 4.5:1 requirement."
},
{
"id": "button-text-on-button",
"label": "Button text on button",
"foreground_role": "buttonText",
"background_role": "button",
"foreground": "#ffffff",
"background": "#166bff",
"ratio": 4.58,
"required_ratio": 4.5,
"passes": true,
"level": "AA",
"summary": "Button text on button is AA at 4.58:1 against a 4.5:1 requirement."
},
{
"id": "control-text-on-control",
"label": "Control text on control",
"foreground_role": "controlText",
"background_role": "control",
"foreground": "#142033",
"background": "#ffffff",
"ratio": 16.35,
"required_ratio": 4.5,
"passes": true,
"level": "AAA",
"summary": "Control text on control is AAA at 16.35:1 against a 4.5:1 requirement."
},
{
"id": "badge-text-on-badge",
"label": "Badge text on badge",
"foreground_role": "badgeText",
"background_role": "badge",
"foreground": "#174ea6",
"background": "#eef5ff",
"ratio": 7.15,
"required_ratio": 4.5,
"passes": true,
"level": "AAA",
"summary": "Badge text on badge is AAA at 7.15:1 against a 4.5:1 requirement."
}
],
"contrast_target": "AA",
"accessibility_standard": "WCAG_2_2_AA",
"accessibility_check_count": 5,
"accessibility_checks": [
{
"id": "semantic-structure",
"label": "Semantic structure",
"category": "semantics",
"status": "covered",
"required": true,
"proof": "runtime block sections, cards, lists, and headings",
"summary": "search-discovery keeps semantic wrappers and readable heading/copy structure in the runtime preview."
},
{
"id": "keyboard-and-tap-targets",
"label": "Keyboard and tap targets",
"category": "keyboard",
"status": "covered",
"required": true,
"proof": "mapped actions/controls render as native focusable surfaces",
"summary": "Interactive surfaces stay reachable, focusable, and recipe-styled without shrinking below expected touch affordances."
},
{
"id": "text-alternatives",
"label": "Text alternatives",
"category": "media",
"status": "covered",
"required": false,
"proof": "media slots collapse when unused",
"summary": "Recipes without media do not leave decorative media shells that need alt text."
},
{
"id": "control-labels",
"label": "Control labels",
"category": "forms",
"status": "covered",
"required": true,
"proof": "control map includes required field labels and option metadata",
"summary": "Input and choice controls are mapped with labels, required state, and option counts for CMS and runtime review."
},
{
"id": "status-and-motion",
"label": "Status and motion",
"category": "state",
"status": "covered",
"required": true,
"proof": "runtime evidence avoids hidden status-only content",
"summary": "Recipe defaults avoid motion-only meaning and keep status text inspectable when state is present."
}
],
"responsive_behavior_count": 3,
"responsive_behavior_map": [
{
"id": "phone",
"label": "Phone",
"viewport_width": 390,
"layout_mode": "single-column stack",
"column_count": 1,
"spacing_density": "spacious",
"media_policy": "Media slots remain optional and collapse without leaving empty chrome.",
"overflow_policy": "min-width:0 surfaces, wrapping copy, and no horizontal overflow in the static catalog phone smoke.",
"interaction_policy": "Actions and controls wrap into reachable rows with stable tap targets.",
"proof": "npm run test:static:block-catalog all-blocks-phone",
"summary": "Editorial Block System stacks search-discovery into one phone column with spacious spacing and bounded content."
},
{
"id": "tablet",
"label": "Tablet",
"viewport_width": 768,
"layout_mode": "two-column adaptive grid",
"column_count": 2,
"spacing_density": "spacious",
"media_policy": "Media slots remain optional and collapse without leaving empty chrome.",
"overflow_policy": "tablet preview frames keep mid-width composition, wrap controls, and avoid horizontal overflow in the static catalog smoke.",
"interaction_policy": "Actions and controls wrap into reachable rows with stable tap targets.",
"proof": "npm run test:static:block-catalog all-blocks-tablet",
"summary": "Editorial Block System adapts search-discovery to 2 tablet columns before expanding to the desktop layout."
},
{
"id": "desktop",
"label": "Desktop",
"viewport_width": 1366,
"layout_mode": "responsive composition grid",
"column_count": 2,
"spacing_density": "spacious",
"media_policy": "Media slots remain optional and collapse without leaving empty chrome.",
"overflow_policy": "desktop preview frames keep constrained widths, stable cards, and no horizontal overflow in the static catalog smoke.",
"interaction_policy": "Actions and controls wrap into reachable rows with stable tap targets.",
"proof": "npm run test:static:block-catalog all-blocks-desktop",
"summary": "Editorial Block System gives search-discovery up to 2 desktop columns while preserving recipe spacing."
}
],
"responsive_viewports": [
"phone",
"tablet",
"desktop"
],
"responsive_proof": [
"npm run test:static:block-catalog all-blocks-phone",
"npm run test:static:block-catalog all-blocks-tablet",
"npm run test:static:block-catalog all-blocks-desktop"
],
"interactive_roles": [
"link",
"text"
],
"recipe_alignment": {
"action_token": "button",
"control_token": "control",
"surface_token": "panel",
"text_token": "text",
"source": "theme recipe tokens"
}
},
"cloneable": true
},
"block_order": 4
}Dense, scannable interfaces for dashboards, configuration, and internal operations.
RAG-ready discovery block with deterministic local results, source cards, facets, and provider trace metadata.
Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.
Product
A discovery result with category, tags, action, and citation-style source metadata.
Recommendation
Recommendation surfaces use the same result card contract for static and API-backed states.
Demo retrieval does not replace tenant review, compliance review, or safety guidance.
Compact product and service-operations rhythm for B2B tools, resource hubs, and trial-interest flows.
RAG-ready discovery block with deterministic local results, source cards, facets, and provider trace metadata.
Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.
Product
A discovery result with category, tags, action, and citation-style source metadata.
Recommendation
Recommendation surfaces use the same result card contract for static and API-backed states.
Demo retrieval does not replace tenant review, compliance review, or safety guidance.
A calm product-marketing baseline with balanced hierarchy, spacing, and rounded controls.
RAG-ready discovery block with deterministic local results, source cards, facets, and provider trace metadata.
Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.
Product
A discovery result with category, tags, action, and citation-style source metadata.
Recommendation
Recommendation surfaces use the same result card contract for static and API-backed states.
Demo retrieval does not replace tenant review, compliance review, or safety guidance.
A tighter SaaS treatment with crisp hierarchy, restrained spacing, and clean control rhythm.
RAG-ready discovery block with deterministic local results, source cards, facets, and provider trace metadata.
Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.
Product
A discovery result with category, tags, action, and citation-style source metadata.
Recommendation
Recommendation surfaces use the same result card contract for static and API-backed states.
Demo retrieval does not replace tenant review, compliance review, or safety guidance.
A roomier product-marketing recipe for conversion pages, feature launches, and trial funnels.
RAG-ready discovery block with deterministic local results, source cards, facets, and provider trace metadata.
Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.
Product
A discovery result with category, tags, action, and citation-style source metadata.
Recommendation
Recommendation surfaces use the same result card contract for static and API-backed states.
Demo retrieval does not replace tenant review, compliance review, or safety guidance.
A precise B2B SaaS recipe with compact density, strong readability, and restrained depth.
RAG-ready discovery block with deterministic local results, source cards, facets, and provider trace metadata.
Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.
Product
A discovery result with category, tags, action, and citation-style source metadata.
Recommendation
Recommendation surfaces use the same result card contract for static and API-backed states.
Demo retrieval does not replace tenant review, compliance review, or safety guidance.
Measured hierarchy, conservative spacing, and high-readability surfaces for advisory and regulated service pages.
RAG-ready discovery block with deterministic local results, source cards, facets, and provider trace metadata.
Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.
Product
A discovery result with category, tags, action, and citation-style source metadata.
Recommendation
Recommendation surfaces use the same result card contract for static and API-backed states.
Demo retrieval does not replace tenant review, compliance review, or safety guidance.
Generous type, cinematic spacing, and understated surfaces for premium narrative pages.
RAG-ready discovery block with deterministic local results, source cards, facets, and provider trace metadata.
Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.
Product
A discovery result with category, tags, action, and citation-style source metadata.
Recommendation
Recommendation surfaces use the same result card contract for static and API-backed states.
Demo retrieval does not replace tenant review, compliance review, or safety guidance.
Large type, decisive rhythm, and high contrast for announcements and campaign pages.
RAG-ready discovery block with deterministic local results, source cards, facets, and provider trace metadata.
Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.
Product
A discovery result with category, tags, action, and citation-style source metadata.
Recommendation
Recommendation surfaces use the same result card contract for static and API-backed states.
Demo retrieval does not replace tenant review, compliance review, or safety guidance.
Viewport-scale block rhythm with large editorial type, crisp radii, and expressive motion for premium brand and contact pages.
RAG-ready discovery block with deterministic local results, source cards, facets, and provider trace metadata.
Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.
Product
A discovery result with category, tags, action, and citation-style source metadata.
Recommendation
Recommendation surfaces use the same result card contract for static and API-backed states.
Demo retrieval does not replace tenant review, compliance review, or safety guidance.
A template-ready full-page block system for duplicable landing, brand, contact, campaign, and lead-generation page sets.
RAG-ready discovery block with deterministic local results, source cards, facets, and provider trace metadata.
Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.
Product
A discovery result with category, tags, action, and citation-style source metadata.
Recommendation
Recommendation surfaces use the same result card contract for static and API-backed states.
Demo retrieval does not replace tenant review, compliance review, or safety guidance.
Flat, sharp, restrained hierarchy for documentation, proof pages, and quiet brands.
RAG-ready discovery block with deterministic local results, source cards, facets, and provider trace metadata.
Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.
Product
A discovery result with category, tags, action, and citation-style source metadata.
Recommendation
Recommendation surfaces use the same result card contract for static and API-backed states.
Demo retrieval does not replace tenant review, compliance review, or safety guidance.
Clear service-page rhythm for residential and local businesses with pricing, FAQs, resources, and appointment requests.
RAG-ready discovery block with deterministic local results, source cards, facets, and provider trace metadata.
Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.
Product
A discovery result with category, tags, action, and citation-style source metadata.
Recommendation
Recommendation surfaces use the same result card contract for static and API-backed states.
Demo retrieval does not replace tenant review, compliance review, or safety guidance.
Tactile raised panels and ledger-like rhythm for recurring services, quote funnels, memberships, and field-service notes.
RAG-ready discovery block with deterministic local results, source cards, facets, and provider trace metadata.
Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.
Product
A discovery result with category, tags, action, and citation-style source metadata.
Recommendation
Recommendation surfaces use the same result card contract for static and API-backed states.
Demo retrieval does not replace tenant review, compliance review, or safety guidance.
Soft raised panels with lower visual noise for guided tools and onboarding flows.
RAG-ready discovery block with deterministic local results, source cards, facets, and provider trace metadata.
Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.
Product
A discovery result with category, tags, action, and citation-style source metadata.
Recommendation
Recommendation surfaces use the same result card contract for static and API-backed states.
Demo retrieval does not replace tenant review, compliance review, or safety guidance.
Layered translucent panels for demos, product storytelling, and immersive showcases.
RAG-ready discovery block with deterministic local results, source cards, facets, and provider trace metadata.
Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.
Product
A discovery result with category, tags, action, and citation-style source metadata.
Recommendation
Recommendation surfaces use the same result card contract for static and API-backed states.
Demo retrieval does not replace tenant review, compliance review, or safety guidance.
Chunky rhythm and nostalgic scale for playful campaigns without sacrificing contrast.
RAG-ready discovery block with deterministic local results, source cards, facets, and provider trace metadata.
Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.
Product
A discovery result with category, tags, action, and citation-style source metadata.
Recommendation
Recommendation surfaces use the same result card contract for static and API-backed states.
Demo retrieval does not replace tenant review, compliance review, or safety guidance.
Sharp edges, hard shadows, and assertive scale for high-emphasis conversion surfaces.
RAG-ready discovery block with deterministic local results, source cards, facets, and provider trace metadata.
Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.
Product
A discovery result with category, tags, action, and citation-style source metadata.
Recommendation
Recommendation surfaces use the same result card contract for static and API-backed states.
Demo retrieval does not replace tenant review, compliance review, or safety guidance.
High-contrast cards, chunky controls, and expressive spacing for modern playful brands.
RAG-ready discovery block with deterministic local results, source cards, facets, and provider trace metadata.
Local fallback results render immediately; configured APIs can replace them with provider-backed retrieval.
Product
A discovery result with category, tags, action, and citation-style source metadata.
Recommendation
Recommendation surfaces use the same result card contract for static and API-backed states.
Demo retrieval does not replace tenant review, compliance review, or safety guidance.
implemented · 0.1.0
No public prop fields are exposed for this block contract.