Write a meta description for this article about {topic}. Keep it under 160 characters. CODE_BLOCK: Write a meta description for this article about {topic}. Keep it under 160 characters. CODE_BLOCK: Write a meta description for this article about {topic}. Keep it under 160 characters. CODE_BLOCK: Write a meta description for this cybersecurity article. Rules:
- EXACTLY 140 to 160 characters (count carefully, including spaces)
- Start with an action verb or a direct hook
- Include the main topic and one concrete benefit
- No buzzwords (comprehensive, ultimate, complete)
- No "In this article" or "This guide" Article title: {title} Article excerpt: {excerpt} Main keywords: {keywords} Output only the description, nothing else. CODE_BLOCK: Write a meta description for this cybersecurity article. Rules:
- EXACTLY 140 to 160 characters (count carefully, including spaces)
- Start with an action verb or a direct hook
- Include the main topic and one concrete benefit
- No buzzwords (comprehensive, ultimate, complete)
- No "In this article" or "This guide" Article title: {title} Article excerpt: {excerpt} Main keywords: {keywords} Output only the description, nothing else. CODE_BLOCK: Write a meta description for this cybersecurity article. Rules:
- EXACTLY 140 to 160 characters (count carefully, including spaces)
- Start with an action verb or a direct hook
- Include the main topic and one concrete benefit
- No buzzwords (comprehensive, ultimate, complete)
- No "In this article" or "This guide" Article title: {title} Article excerpt: {excerpt} Main keywords: {keywords} Output only the description, nothing else. COMMAND_BLOCK: import re def validate_meta_description(desc: str) -> dict: length = len(desc) issues = [] if length < 140: issues.append(f"Too short: {length} chars (min 140)") if length > 160: issues.append(f"Too long: {length} chars (max 160)") if desc.startswith(("In this", "This article", "This guide")): issues.append("Starts with forbidden phrase") if re.search(r'\b(comprehensive|ultimate|complete)\b', desc, re.I): issues.append("Contains buzzword") return { "valid": len(issues) == 0, "length": length, "issues": issues, } def generate_meta_description(title: str, excerpt: str, keywords: list, max_retries: int = 3) -> str: for attempt in range(max_retries): desc = call_llm(build_prompt(title, excerpt, keywords)) result = validate_meta_description(desc) if result["valid"]: return desc # Retry with explicit correction hint if attempt < max_retries - 1: hint = f"Previous attempt failed: {', '.join(result['issues'])}. Try again." # inject hint into next prompt return None # manual review needed COMMAND_BLOCK: import re def validate_meta_description(desc: str) -> dict: length = len(desc) issues = [] if length < 140: issues.append(f"Too short: {length} chars (min 140)") if length > 160: issues.append(f"Too long: {length} chars (max 160)") if desc.startswith(("In this", "This article", "This guide")): issues.append("Starts with forbidden phrase") if re.search(r'\b(comprehensive|ultimate|complete)\b', desc, re.I): issues.append("Contains buzzword") return { "valid": len(issues) == 0, "length": length, "issues": issues, } def generate_meta_description(title: str, excerpt: str, keywords: list, max_retries: int = 3) -> str: for attempt in range(max_retries): desc = call_llm(build_prompt(title, excerpt, keywords)) result = validate_meta_description(desc) if result["valid"]: return desc # Retry with explicit correction hint if attempt < max_retries - 1: hint = f"Previous attempt failed: {', '.join(result['issues'])}. Try again." # inject hint into next prompt return None # manual review needed COMMAND_BLOCK: import re def validate_meta_description(desc: str) -> dict: length = len(desc) issues = [] if length < 140: issues.append(f"Too short: {length} chars (min 140)") if length > 160: issues.append(f"Too long: {length} chars (max 160)") if desc.startswith(("In this", "This article", "This guide")): issues.append("Starts with forbidden phrase") if re.search(r'\b(comprehensive|ultimate|complete)\b', desc, re.I): issues.append("Contains buzzword") return { "valid": len(issues) == 0, "length": length, "issues": issues, } def generate_meta_description(title: str, excerpt: str, keywords: list, max_retries: int = 3) -> str: for attempt in range(max_retries): desc = call_llm(build_prompt(title, excerpt, keywords)) result = validate_meta_description(desc) if result["valid"]: return desc # Retry with explicit correction hint if attempt < max_retries - 1: hint = f"Previous attempt failed: {', '.join(result['issues'])}. Try again." # inject hint into next prompt return None # manual review needed - "EXACTLY" instead of "under" — models respect hard constraints better than soft ones
- Positive framing of what to include, not just what to avoid
- Strip all meta-commentary — "Output only the description" eliminates the model explaining what it did - 71% — better than what I had before - 22% — similar quality - 7% — worse (usually missing context that wasn't in the excerpt)
- CTR: +0.8 percentage points average (statistically significant at this scale)
- Impressions: unchanged (as expected — meta descriptions don't affect rankings)
- Position: unchanged (also expected)
- Write a tight prompt with hard constraints
- Build validation + retry logic (don't trust the model to self-validate)
- Have decent source material to work from
- Measure the actual downstream metric (CTR), not a proxy