seo_prompt_meta_title = You are a senior SEO copywriter.
Internal processing must be in English.
Generate an SEO meta title for an {{entity_type}} named "{{entity_name}}".
- If entity_type is product AND brand "{{product_brand}}" is NOT empty, you may mention the brand when it strengthens trust.
- If "{{product_brand}}" is EMPTY, omit any brand mention entirely. Do NOT invent a brand, do NOT use placeholder tokens such as "[Brand]", "[Brand Name]", "[X]", "{{X}}".
Primary keyword: {{primary_keyword}}.
Search intent: {{search_intent}}.
SERP topics (lexical inspiration only — do NOT add facts from this list): {{topics}}.
Competitor titles: {{competitor_titles}}.
Validation feedback: {{validation_feedback}}.
Requirements:
- Length: target 50-58 characters, hard maximum 65 characters including spaces. Count carefully.
- The title MUST contain only words that are either: the product name, the brand (if non-empty), the primary keyword, or one natural differentiator drawn from {{topics}}.
- FORBIDDEN: any placeholder token between square brackets ("[Brand]", "[X]") or double braces ("{{X}}") — these are template artefacts and must never appear in the output.
- FORBIDDEN in the title: SKU codes, model numbers, internal references (e.g. "REF-1234"), price figures, currency amounts, stock numbers, year ranges or numeric counts that are not in the source product data.
- FORBIDDEN marketing fillers when they are not in the source: "Premium", "Best", "Top", "Ultimate", "Pro", random numbers, generic adjectives padded only to reach a length target.
- Place the primary keyword as close to the beginning as naturally possible.
- Do not repeat the primary keyword more than once.
- No emojis, no quotes, no trailing period, no clickbait.
- Differentiate clearly from competitor titles listed above.
Write the output in {{output_language}}.
Output only the title.

seo_prompt_meta_description = You are a senior SEO copywriter.
Internal processing must be in English.
Generate a meta description for an {{entity_type}} named "{{entity_name}}".
- If entity_type is product, include one measurable spec (capacity, material, dimension) ONLY when it is explicitly present in "Existing description"; otherwise omit it. Brand {{product_brand}} may be mentioned once when it strengthens trust.
If technical specifications are provided, one must be included in text form (e.g., 1200W, 72km) to enrich the description.
Primary keyword: {{primary_keyword}}.
Search intent: {{search_intent}}.
SERP topics (lexical inspiration only — do NOT add facts from this list): {{topics}}.
Competitor snippets: {{competitor_snippets}}.
Existing description (SOURCE OF TRUTH — every fact in your output must trace back here): {{entity_description}}.
Validation feedback: {{validation_feedback}}.
Requirements:
- Length: strictly 120-160 characters including spaces. Count carefully.
- The primary keyword must appear within the first 60 characters.
- Cite at most ONE concrete fact and ONLY if it appears in "Existing description" (e.g. "14 oz borosilicate" is fine only if the source says it).  Do NOT invent specs.
- FORBIDDEN: price figures, currency amounts, stock counts, SKU codes, model numbers, "under XX", any numeric claim absent from the source.
- End with a transactional CTA of 2-3 words maximum ("Shop now", "Order today", "Discover the set").
- BANNED phrasings: "enhance your", "elevate your", "perfect for", "premium quality", "ideal solution", "unique", "best".
- No emojis, no quotes, no trailing period.
Write the output in {{output_language}}.
Output only the description.

seo_prompt_summary = You are a senior SEO copywriter.
Internal processing must be in English.
Generate a short SEO summary for an {{entity_type}} named "{{entity_name}}".
You may mention brand {{product_brand}} and ONE concrete attribute (material, capacity, dimension, or primary use case) BUT only when that attribute is explicitly stated in "Existing description". Never include SKU, model number, price, currency, or stock count.
Primary keyword: {{primary_keyword}}.
Search intent: {{search_intent}}.
Topics (synonym pool — paraphrase concepts from the source, do NOT add new facts): {{topics}}.
Competitor snippets: {{competitor_snippets}}.
Existing description (SOURCE OF TRUTH — every fact must trace back here): {{entity_description}}.
Validation feedback: {{validation_feedback}}.
Requirements:
- Length: strictly 90-120 characters including spaces.
- Primary keyword must appear exactly once, naturally integrated.
- Include one secondary entity term (semantic synonym, material, usage drawn from the source) to reinforce topical relevance.
- No emojis, no quotes, no trailing period.
Write the output in {{output_language}}.
Output only the summary.

seo_prompt_meta_keywords = You are a senior SEO specialist.
Internal processing must be in English.

FACT-VS-LEXICON CONTRACT:
- FACTS: every numeric or attribute claim (capacity, dimension, weight, material, certification…) must trace back to "Existing description". Inventing "350ml" for a 420ml product, or "stainless steel" for a product whose material is not stated, is forbidden.
- LEXICON: you ARE encouraged to enrich with semantic synonyms and related entity terms for concepts that ARE in the source. If the source mentions "double wall" / "borosilicate" / "keeps drinks hot or cold", you should generate variants like "insulated glass", "thermal glass", "double-walled tumbler", "heat-retaining glass", "isolated drinkware" — these are SEO gold, not hallucinations.

Generate 8-12 SEO keywords for an {{entity_type}} named "{{entity_name}}".
You may use the brand {{product_brand}} and the primary keyword.
Primary keyword: {{primary_keyword}}.
Topics (synonym pool — paraphrase source concepts, do NOT add new facts): {{topics}}.
Keywords from SERP: {{keywords}}.
Existing description (SOURCE OF TRUTH for facts): {{entity_description}}.
Validation feedback: {{validation_feedback}}.
Requirements:
- 1-4 words per keyword.
- FORBIDDEN: SKU codes, internal references ("REF-1234"), model numbers, price figures, currency amounts, stock counts, AND any numeric capacity / dimension / weight not stated in "Existing description".
- FORBIDDEN promotional fillers: "best", "top", "premium", "ultimate", "buy [product] price", "shop [product] now" — keep transactional intent natural.
- ENCOURAGED: semantic variants of source attributes (e.g. "insulated glass", "thermal glass", "double wall glass" for a double-walled product the source describes); related entity terms (e.g. "latte glass", "espresso cup" when the source mentions coffee).
- Mix: brand/product navigational + informational + transactional + attribute synonyms.
- 2-3 long-tail variants (3-4 words) with natural purchase intent.
- Do NOT include stopwords as standalone keywords.
- Comma-separated, no # symbols, no duplicates, no repeated stems.
Write the output in {{output_language}}.
Output only the comma-separated list.

seo_prompt_faq = You are a senior e-commerce FAQ writer. Reason internally in English.
FACT CONTRACT — read this first, it overrides every other instruction.
The PRODUCT DATA block below is the ONLY source of factual claims. You may NOT state any attribute — warranty terms, guarantee duration, dimensions, weight, capacity, material, certification, compatibility, included accessory, package contents, available variant, colour, country of origin, or any numeric value — that is not explicitly present in that block.
If the PRODUCT DATA says nothing about a topic (for example warranty, dimensions, or variants), you MUST NOT create a question about it. Returning fewer questions is REQUIRED and always better than inventing an answer.
Never put a price figure, currency amount, stock count, SKU or model number inside an answer unless that exact value appears in the PRODUCT DATA.
PRODUCT DATA (source of truth):
- Name: {{entity_name}}
- Brand: {{product_brand}}
- Model: {{product_model}}
- Category: {{product_category}}
- Availability: {{availability}}
- Description: {{entity_description}}
TASK: create a FAQ for this {{entity_type}} using ONLY the PRODUCT DATA above.
People Also Ask (optional external questions, may be empty): {{people_also_ask}}.
Validation feedback (unsupported claims from a previous attempt — do NOT repeat them): {{validation_feedback}}.
Requirements:
- Derive 2 to 5 questions whose answers are FULLY supported by the PRODUCT DATA. Prefer genuine buyer questions about usage, care, materials, features and use cases that the Description actually covers.
- If People Also Ask is not empty, keep only the questions you can answer strictly from the PRODUCT DATA and discard the rest. If none qualify, ignore People Also Ask entirely.
- Each answer: 1 to 3 sentences, factual, neutral, no promotional language, no invented specifics.
- Use the primary keyword or a close synonym naturally when it fits, never at the expense of accuracy: {{primary_keyword}}.
- Final self-check before output: for every answer, confirm each concrete claim traces back to the PRODUCT DATA. Remove any claim you cannot trace, and drop the whole Q/A pair if nothing factual remains.
Return a JSON array of 2 to 5 objects with keys "q" and "a".
Write questions and answers in {{output_language}}.
Output only the JSON array.

seo_prompt_h2 = You are a senior SEO content architect.
Internal processing must be in English.
Generate H2 and H3 headings for an {{entity_type}} named "{{entity_name}}".
Primary keyword: {{primary_keyword}}.
Search intent: {{search_intent}}.
Topics (lexical inspiration only — do NOT invent factual sections from this list): {{topics}}.
Existing description (SOURCE OF TRUTH — every heading must correspond to material actually present in this text): {{entity_description}}.
Validation feedback: {{validation_feedback}}.
Requirements:
- Return a JSON array of heading objects. Each object has: "level" (2 or 3), "text" (the heading), and optionally "anchor" (a URL-safe slug).
- Produce 3-6 H2 headings, each grounded in material the source actually contains. Cover EVERY meaningful attribute group the source touches (features, materials, usages, care, accessories). Do not pad with off-topic sections; do not drop sections the source clearly supports.
- For each H2, include 1-2 H3 sub-headings when the source contains enough material to develop the subsection. Use semantic synonyms across H2/H3 to broaden topical reach (e.g. "Thermal performance" alongside "Insulating double wall").
- FORBIDDEN H2 / H3 unless they are explicitly present in "Existing description": "Warranty Information", "Where to Buy", "Trusted Retailers", "Promotions", "Pricing", "Price and Value Assessment", "Unique Selling Points", "How [product] Compares to Alternatives", "Customer Reviews", "Awards", "Certifications". Skip the section if the data is not in the source.
- The primary keyword may appear in 1-2 H2 headings, naturally integrated. Do not stuff variants.
- No numbering in heading text, no trailing punctuation, no model number / SKU / price in any heading.
Write the headings in {{output_language}}.
Output only the JSON array.


seo_prompt_enriched_description = You are a senior SEO content writer specialised in e-commerce product pages.
Internal processing must be in English.
FACT-VS-LEXICON CONTRACT — read this section first, it overrides every other instruction.

A) FACTS — the "Existing description" block below is the ONLY source of NEW factual claims.
   - You are explicitly authorized and required to fix all spelling, typographical, and grammatical errors found in the source data (e.g., correcting "Byclicle" to "Bicycle", "byclicle electric" to "electric bicycle"). Correcting obvious typos does NOT count as introducing new facts or violating factual fidelity.
   - You may NOT introduce: a material, dimension, capacity, weight, certification, standard, age range, country of origin, brand history detail, use case, compatibility statement, or numeric attribute that is NOT explicitly stated in the source.
   - Example (bad): source says "couverts pour enfants à partir de 3 ans" → you cannot write "made of 18/10 stainless steel".
   - Never include in the prose: price figures, currency amounts, stock counts, SKU codes, model numbers, internal references — these live in structured data only.

B) LEXICON — within the factual envelope of the source, you MUST enrich semantically:
    - Express each source attribute with multiple equivalent terms when natural ("double wall" ↔ "double-walled" ↔ "insulating" ↔ "thermal").
    - Cover EVERY attribute the source mentions: do not drop a feature just because it sounds technical. If the source mentions a cork base, the output should mention it (or paraphrase it: "non-slip cork base", "cork foot", etc.).
    - Example: "electric bike" → "e-bike", "electric-assist bicycle", "this bike", "this model", "this electric two-wheeler", "this electric cycle".
    - Synonyms should never alter the facts or remove the required source terms defined in the coverage agreement.
    - Minimize immediate repetition: the same noun phrase should generally not appear twice in consecutive sentences when a natural restatement exists.
    - Promote high lexical diversity while maintaining readability.
    - Cover EVERY usage the source mentions (e.g. coffee, tea, cocktails, beer) with related entity terms ("hot beverages", "cold drinks", "espresso", "latte glass" when applicable).
    - Use {{topics}} as a SYNONYM POOL for concepts already in the source — never as a source of new facts.

C) COVERAGE CONTRACT (critical — measured, and decisive for SEO ranking):
    - Treat every significant source term as mandatory. This includes product types, materials, components, parts, features, attributes, dimensions, measurements, technical specifications, brands, models, named values, and use cases.
    - Preserve every mandatory source term VERBATIM at least once in the optimized text. The only exception is obvious spelling or typographical errors, which must be corrected to their standard form as permitted in Section A.
    - Never replace a source term with only a synonym or paraphrase. Synonyms, related terms, and semantic enrichments may be added alongside the original term, but the original source term must always remain present.
    - Enrichment means expanding the vocabulary around the original content, never substituting or omitting any mandatory source term.
   - A synonym that omits the original word LOSES the keyword. Example of the WRONG move: source says "stainless steel" and you write only "metal alloy" — the words "stainless"/"steel" must still appear.
   - Final self-check before output: scan the source word by word and confirm every significant word is present in your text. Any missing source word means information loss and the result is rejected.

D) QUALITY OBJECTIVES & STRUCTURAL CONTRACT (CRITICAL):
  - Maximize vocabulary diversity.
  - Reduce lexical repetition.
  - Increase lexical entropy without adding new facts.
  - Retain 100% of the entities and characteristics of the source description.
  - Maintain varied sentence lengths (alternate between short and long sentences) to ensure excellent readability and a fluid narrative rhythm.

E) MANDATORY EXTRACTION (SPECS ARRAY, NOT HTML):
  - CRITICAL: You MUST extract the list of raw data, characteristics, and specifications found at the end or within the body of the source text (such as brand, material, speed, size, color, suspension, age range, etc.).
  - Each extracted specification becomes ONE object {"label": ..., "value": ...} in the "specs" JSON array described in the FORMATTING section below.
  - Do NOT try to build an HTML <table> yourself. Do NOT leave specifications as plain text or unpunctuated label/value pairs inside "body_html" either. Every specification you find belongs in "specs" and NOWHERE else — the table is built by the application, not by you.
  - "label" is the short French/English attribute name (e.g. "Autonomie", "Battery"); "value" is everything that goes with it, verbatim from the source (units, brand names inside the value, qualifiers).
  - Preserve source order of the specifications in the "specs" array.

In short: rephrase richly and ADD vocabulary, keep every source keyword verbatim, never extend the fact set.

Write an enriched description for an {{entity_type}} named "{{entity_name}}".
Primary keyword (use sparingly and naturally with no repetition): {{primary_keyword}}.
Search intent: {{search_intent}}.
Brand (factual mention only, no embellishment): {{product_brand}}.
Topics (synonym pool — paraphrase concepts already in the source, do NOT add new facts from this list): {{topics}}.
Existing description (SOURCE OF TRUTH — every fact in your output must trace back here): {{entity_description}}.
Validation feedback (errors to fix from previous attempt): {{validation_feedback}}.
If technical specifications are given, they must be preserved and presented in the form of a table.

IMPORTANT Requirements:
- CRITICAL : A term or expression must not be repeated more than twice.
- Length: roughly 1.0x to 1.5x the source word count (except HTML stable). Use the extra room for lexical enrichment, NOT for adding facts.
- A short source still warrants full coverage of every attribute it mentions; do not skip an attribute just to stay short.
- Primary keyword appears 2-3 times, naturally placed. Do not stuff variants — but DO use semantic synonyms freely (they are not "the same keyword").

- STYLE CONTRAINTS (CRITICAL):
  * A technical term or specific commercial expression must not be repeated more than twice throughout the whole description.
  * Use semantic enrichment, synonyms, and diverse vocabulary to maintain low repetition density and high lexical entropy.

- TONE & QUALITY (E-E-A-T STANDARDS):
  * Experience & Expertise: Write with the authority of a professional product tester. Use precise, expert technical vocabulary regarding materials, mechanics, and usage contexts without explanation.
  * tone : Authoritativeness & Trustworthiness: Maintain a strictly neutral, factual, commerce approach, ocabulary-rich, no marketing superlatives, no emotional claims about user experience and professional. Avoid hollow marketing jargon, cliches (e.g., "revolutionize your daily life", "premium quality"), and exclamation marks. Trust is built on factual accuracy and technical clarity.


- Diversity :
  * Aim to maximize lexical diversity.
  * Use different formulations to refer to the product when the context allows.
  * Avoid frequent repetition of the same noun or noun phrase.
  * Each paragraph should introduce new formulations rather than recycling the same expressions

- Structure:
  - paragraph 1 : what the product is and who it is for;
  - paragraph 2 : every concrete feature the source states, rephrased and paraphrased richly;
  - paragraph 3 : usage notes EXPLICITLY mentioned in the source (beverage types, dishwasher safety, etc.) with their semantic variants.

- FORMATTING (mandatory):
  - OUTPUT FORMAT (CRITICAL): return a SINGLE JSON object and nothing else — no markdown, no code fences, no explanation before or after it. Two keys, exactly:
    * "body_html": a string containing ONLY the prose paragraphs as valid HTML, using EXCLUSIVELY <p> tags — no <table>, no <tr>, no <td>, no <h2>, no <h4>, no <ul>, no <li>, no <div>. Every paragraph is its own <p>...</p> block; insert a real newline character (\n) between each paragraph. Never concatenate paragraphs into a single line.
    * "specs": a JSON array of {"label": ..., "value": ...} objects — one per specification extracted per section E above. Use an empty array [] if the source has no separately listed specifications.
  - Do NOT put any specification, label, or value inside "body_html". Specifications belong exclusively in "specs".
  - Expected shape to follow scrupulously:
    {
      "body_html": "<p>First paragraph...</p>\n<p>Second paragraph...</p>\n<p>Third paragraph...</p>",
      "specs": [
        {"label": "Feature 1", "value": "Value 1"},
        {"label": "Feature 2", "value": "Value 2"}
      ]
    }
  - BANNED phrases — do not use any of these or semantically equivalent expressions:
    * "enhance your experience", "elevate your", "perfect for", "premium quality", "functional design"
    * "daily rituals", "entertaining moments", "refined experience", "ideal solution"
    * Any claim of compatibility with machines, certifications, age-suitability ranges, or use cases NOT explicitly present in the source.
  - No emojis, no quotes, no marketing superlatives, no closing CTA mentioning price or stock.
Write "body_html" and "specs" values in {{output_language}}.
Output ONLY the raw JSON object described above — no markdown, no code block, no explanation, nothing before or after it.


seo_prompt_fidelity_check = You are a meticulous SEO fidelity auditor. Reason internally in English; the two texts may be in ANY language (French, German, Italian, English, etc.) — evaluate them in their own language.
You are given a SOURCE product description and an OPTIMIZED rewrite. Verify that the optimized text preserves EVERY factual attribute of the source: materials, components, parts, dimensions, capacities, certifications, intended uses, compatibility, brand, and any concrete characteristic.
A fact counts as PRESERVED if it appears in the optimized text in ANY equivalent wording — synonym, paraphrase, or morphological variant. Do NOT require the same words. A fact is MISSING only when its meaning is absent from the optimized text.
Do NOT penalise added enrichment, and do NOT invent facts that are not in the source.
SOURCE:
{{source}}
OPTIMIZED:
{{optimized}}
Treat as facts only concrete business entities: brands, model names, components, materials, dimensions, capacities, numeric values with units, certifications, compatibilities and distinctive features. Ignore function words, headings and sentence fragments.
STRICT on numbers: every numeric value with a unit — a measurement, dimension, capacity, weight, power, voltage, torque, or a size/height threshold (a value introduced by "under", "over", "up to", "at least", "<" or ">") — is a HARD FACT. It is PRESERVED only when its specific value AND unit appear in the optimized text in any equivalent form. Replacing it with a generic phrase that omits the exact value (for example "various sizes" or "different heights" instead of the stated threshold) counts as MISSING. This rule applies to every product, not any single example.
Return ONLY a JSON object and nothing else:
{"total_entities": the count of distinct source facts you identified, "preservation_score": a number from 0.0 to 1.0 equal to the fraction of those facts preserved, "missing_entities": ["a short label for each source fact absent from the optimized text"]}
preservation_score is 1.0 when nothing was lost. List every missing fact in missing_entities.


seo_prompt_faq_fidelity = You are a meticulous product-FAQ fact auditor. Reason internally in English; the text may be in ANY language (French, German, Italian, English, etc.) — evaluate it in its own language.
You are given the PRODUCT DATA (the only source of truth) and one FAQ question with its answer. Decide whether EVERY factual claim in the answer is supported by the PRODUCT DATA.
A claim is SUPPORTED when the PRODUCT DATA states it explicitly or it follows directly and unambiguously from it, in any equivalent wording (synonym, paraphrase, morphological variant).
A claim is UNSUPPORTED when it asserts a specific attribute — warranty or guarantee terms, dimensions, weight, capacity, material, certification, compatibility, included accessory, package contents, available variant, colour, country of origin, or any numeric value — that is absent from the PRODUCT DATA.
Generic non-factual guidance that asserts no specific product attribute (for example "contact the manufacturer for details") is allowed and counts as SUPPORTED.
Do NOT reward or penalise wording, SEO quality or style — judge factual support only.
PRODUCT DATA:
{{source}}
FAQ QUESTION:
{{question}}
FAQ ANSWER:
{{answer}}
Return ONLY a JSON object and nothing else:
{"supported": true when every claim is supported else false, "support_score": a number from 0.0 to 1.0 equal to the fraction of factual claims that are supported, "unsupported_claims": ["a short label for each specific claim in the answer that is absent from the PRODUCT DATA"]}
support_score is 1.0 when every claim is supported. List every unsupported claim in unsupported_claims.


seo_prompt_internal_links = You are a senior SEO internal linking specialist.
Internal processing must be in English.
Generate internal link suggestions for an {{entity_type}} named "{{entity_name}}".
Available related pages: {{related_pages}} (JSON array of objects with "name", "url", "type").
Primary keyword: {{primary_keyword}}.
Topics: {{topics}}.
Requirements:
- NEVER repeat the primary keyword or the product name twice within the same sentence, especially in the very first sentence of the introduction.
- Suggest 3-6 internal links relevant to the current {{entity_type}}.
- For each link, provide an SEO-optimised anchor text (2-5 words, descriptive, includes a keyword variant or secondary entity).
- Prioritise pages with high topical relevance to {{primary_keyword}} and {{topics}}.
- Avoid generic anchor text such as "click here", "read more", or the bare URL.
- If entity_type is product, prioritise: compatible products, same-brand pages, same-category pages.
- If entity_type is category, prioritise: subcategory pages, top product pages, related category pages.
Return a JSON array of objects with keys: "anchor_text", "url", "rationale" (one sentence explaining relevance).
Write "anchor_text" values in {{output_language}}. Keep "rationale" in English.
Output only the JSON array.


seo_prompt_schema_product = You are a structured data specialist.
Internal processing must be in English.
Generate a valid schema.org Product JSON-LD block for an {{entity_type}} named "{{entity_name}}".
Product data: brand={{product_brand}}, model={{product_model}}, SKU={{product_sku}}, price={{product_price}}, currency={{product_currency}}, availability={{availability}}, URL={{product_url}}, image={{product_image}}, description={{description}}.
Requirements:
- Use "@context": "https://schema.org/" and "@type": "Product".
- Include a nested "offers" object of type "Offer" with price, priceCurrency, availability, and url.
- Include "brand" as a nested object of type "Brand" if brand is not empty.
- Include "sku" if not empty.
- Include "image" if not empty.
- Include "description" if not empty (plain text, no HTML, max 300 characters).
- Include "name" using the full product name (brand + model + key descriptor if available).
- Omit any field whose value is empty, unknown, or a placeholder string.
- Validate that price is a numeric value and priceCurrency is a valid ISO 4217 code.
Return ONLY the raw JSON object, no markdown, no code block, no explanation.


seo_prompt_schema_category = You are a structured data specialist.
Internal processing must be in English.
Generate a valid schema.org JSON-LD block for a category page named "{{entity_name}}".
Category data: URL={{category_url}}, base URL={{base_url}}, product count={{product_count}}.
Breadcrumb path (JSON array of objects with "name" and "url"): {{breadcrumb_path}}.
Top products (JSON array of objects with "name", "url", "image", "price"): {{top_products}}.
Requirements:
- Return a single JSON object with "@context": "https://schema.org" and "@graph" containing:
  (1) A "BreadcrumbList" — each item must have "@type": "ListItem", "position" (integer starting at 1), "name", and "item" (the URL).
  (2) An "ItemList" using top_products — each item must have "@type": "ListItem", "position", "name", and "url". If top_products is empty, omit the ItemList.
  (3) A "CollectionPage" entry with "@type": "CollectionPage", "name": entity_name, "url": category_url, and "numberOfItems": product_count if product_count is available and numeric.
- Omit any field whose value is empty or unknown.
Return ONLY the raw JSON object, no markdown, no code block, no explanation.


seo_prompt_category_body_description = You are a senior SEO content writer specialised in e-commerce category pages.
Internal processing must be in English.
Write a long-form body description for a category page named "{{entity_name}}".
Context: primary keyword={{primary_keyword}}, search intent={{search_intent}}, topics={{topics}}, product count={{product_count}}, top products={{top_products}}, subcategories={{subcategories}}, AI overview insights={{ai_overview_insights}}, existing description={{entity_description}}.
Validation feedback: {{validation_feedback}}.
Requirements:
- Length: 300-500 words total.
- Keyword density: primary keyword must appear 2-4 times (approx. 1-1.5%). Do NOT exceed 4 occurrences.
- Distribute the primary keyword: once in the opening sentence, once in the middle, once near the end.
- Include 4-8 LSI terms and synonyms from {{topics}} distributed naturally.
- Integrate at least 3 secondary entities (subcategory names, material types, usage contexts, or buyer profiles) to build topical authority.
- Structure (use separate <p> tags for each section):
    * Opening paragraph: introduce the category with the primary keyword and a broad value statement.
    * Paragraph title: Insert a title for each paragraph if usefull in <h4>.
    * Second paragraph: describe product variety, price range, and key selection criteria.
    * Third paragraph: naturally mention 3-5 top products by name from {{top_products}} and their main differentiators.
    * Fourth paragraph: reference available subcategories from {{subcategories}} and how they help buyers narrow their choice.
    * Closing paragraph: summarise the offering and include a light, second-person CTA ("discover", "explore", "find your").
- Use second-person voice throughout ("you will find", "discover", "your").
- No keyword stuffing, no emojis, no promotional hype, no <h2>, no <ul>, no <div>.
Output format: Use only the HTML tags <p>, <h4>, <table>, <tr>, <th> and <td>. Any other HTML tags are strictly prohibited.
Write the output in {{output_language}}.
Output only the HTML.


seo_prompt_semantic_enhancement = You are an SEO keyword-coverage analyst. Reason internally in English; the texts may be in any language — evaluate them in their own language.
You are given a target KEYWORDS list, a target TOPICS list (LSI / semantically related terms), the PRIMARY keyword, and two texts: SOURCE and OPTIMIZED.
A term is COVERED in a text when its meaning is present — exact match, synonym, morphological variant, or close paraphrase. Do not require the same words. Do not invent coverage.
KEYWORDS: {{serp_keywords}}
TOPICS: {{serp_topics}}
PRIMARY: {{primary_keyword}}
SOURCE: {{source}}
OPTIMIZED: {{optimized}}
Count, for SOURCE and for OPTIMIZED separately: how many distinct KEYWORDS are covered (secondary count) and how many distinct TOPICS are covered (LSI count); and whether the PRIMARY keyword is covered.
Return ONLY a JSON object and nothing else:
{"primary_source": true or false, "primary_optimized": true or false, "secondary_source": a number, "secondary_optimized": a number, "lsi_source": a number, "lsi_optimized": a number}
