
Marketing Context
Score and gap-check a marketing context document before campaigns, positioning, or agent-generated copy so messaging stays on-brand and complete.
Overview
Marketing Context is an agent skill most often used in Validate (also Launch, Grow) that runs a Python completeness scorer (0–100) on your marketing context doc before you ship messaging.
Install
npx skills add https://github.com/alirezarezvani/claude-skills --skill marketing-contextWhat is this skill?
- Python validator scores marketing context completeness 0–100
- Weighted sections: product overview, audience, pain, competitors, differentiation, voice, proof
- Required vs optional blocks with marker phrases per section
- Flags missing competitive landscape, customer language, and brand voice fields
- Runnable check against a on-disk marketing context file path
- 0–100 completeness score
- 12 weighted document sections in the validator rubric
Adoption & trust: 527 installs on skills.sh; 17.5k GitHub stars; 2/3 security scanners passed (skills.sh audits).
What problem does it solve?
You are about to generate landing copy or campaigns but your positioning doc is missing ICP, differentiation, or voice sections and nobody noticed.
Who is it for?
Indie SaaS founders maintaining a single marketing-context.md source of truth before SEO, ads, or agent copy workflows.
Skip if: Teams with no written positioning artifact yet—draft the doc first; this skill validates rather than researches the market.
When should I use this skill?
You have a draft marketing context file and need a scored completeness check before campaigns, SEO, or agent copy generation.
What do I get? / Deliverables
You get a 0–100 completeness score and clear section gaps so you can fill the marketing context file before launch or content skills consume it.
- Numeric completeness score (0–100)
- Section-level gap signal against required markers
Recommended Skills
Journey fit
Spans multiple journey phases - primary shelf plus alternate fits below.
Canonical shelf is validate/scope where positioning and audience definition must be locked before expensive launch and growth work. Scope covers whether your go-to-market narrative, ICP, and differentiation sections are complete—not executing ads or SEO tooling yet.
Where it fits
Score the positioning doc before approving landing-page copy requests to your agent.
Confirm pain points and differentiation markers exist before publishing a waitlist page.
Verify customer language and words-to-avoid sections before meta descriptions and blog outlines.
Re-run the scorer after adding case studies to the proof-points section.
How it compares
Local file checker with weighted rubric—not a CRM integration and not a keyword SEO rank tracker.
Common Questions / FAQ
Who is marketing-context for?
Solo and small-team builders who keep positioning in a markdown doc and want an objective completeness gate before marketing execution.
When should I use marketing-context?
Run during validate/scope before positioning sign-off, again at launch/distribution before pages go live, and during grow/content when refreshing personas or proof points.
Is marketing-context safe to install?
It runs a local Python script against files you point at; review the Security Audits panel on this Prism page and inspect the script before running on sensitive drafts.
SKILL.md
READMESKILL.md - Marketing Context
#!/usr/bin/env python3 """Validate marketing context completeness — scores 0-100.""" import json import re import sys from pathlib import Path SECTIONS = { "Product Overview": {"required": True, "weight": 10, "markers": ["one-liner", "what it does", "product category", "business model"]}, "Target Audience": {"required": True, "weight": 12, "markers": ["target compan", "decision-maker", "use case", "jobs to be done"]}, "Personas": {"required": False, "weight": 5, "markers": ["persona", "champion", "decision maker"]}, "Problems & Pain Points": {"required": True, "weight": 10, "markers": ["core problem", "fall short", "cost", "tension"]}, "Competitive Landscape": {"required": True, "weight": 10, "markers": ["direct", "competitor", "secondary"]}, "Differentiation": {"required": True, "weight": 10, "markers": ["differentiator", "differently", "why customers choose"]}, "Objections": {"required": False, "weight": 5, "markers": ["objection", "response", "anti-persona"]}, "Switching Dynamics": {"required": False, "weight": 5, "markers": ["push", "pull", "habit", "anxiety"]}, "Customer Language": {"required": True, "weight": 10, "markers": ["verbatim", "words to use", "words to avoid"]}, "Brand Voice": {"required": True, "weight": 8, "markers": ["tone", "style", "personality"]}, "Style Guide": {"required": False, "weight": 3, "markers": ["grammar", "capitalization", "formatting"]}, "Proof Points": {"required": True, "weight": 7, "markers": ["metric", "customer", "testimonial"]}, "Content & SEO": {"required": False, "weight": 3, "markers": ["keyword", "internal link"]}, "Goals": {"required": True, "weight": 2, "markers": ["business goal", "conversion"]} } def validate_context(content: str) -> dict: """Validate marketing context file and return score.""" content_lower = content.lower() results = {"sections": {}, "score": 0, "max_score": 100, "missing_required": [], "missing_optional": [], "warnings": []} total_weight = sum(s["weight"] for s in SECTIONS.values()) earned = 0 for name, config in SECTIONS.items(): section_present = name.lower().replace("& ", "").replace(" ", " ") in content_lower or any( m in content_lower for m in config["markers"][:2] ) markers_found = sum(1 for m in config["markers"] if m in content_lower) markers_total = len(config["markers"]) has_placeholder = bool(re.search(r'\[.*?\]', content[content_lower.find(name.lower()):content_lower.find(name.lower()) + 500] if name.lower() in content_lower else "")) if section_present and markers_found > 0: completeness = markers_found / markers_total if has_placeholder and completeness < 0.5: completeness *= 0.5 # Penalize unfilled templates section_score = round(config["weight"] * completeness) earned += section_score status = "complete" if completeness >= 0.75 else "partial" else: section_score = 0 status = "missing" if config["required"]: results["missing_required"].append(name) else: results["missing_optional"].append(name) results["sections"][name] = { "status": status, "markers_found": markers_found, "markers_total": markers_total, "score": section_score, "max_score": config["weight"], "required": config["required"] } results["score"] = round((earned / total_weight) * 100) # Warnings if "verbatim" not in content_lower and '"' not in content: results["warnings"].append("No verbatim customer quotes found — copy will sound generic") if not re.search(r'\d+%|\$\d+|\d+ customer', content_lower): results["warnings"].append("No metrics or proof points with numbers found") if "last updated" in content_lower: date_match = re.search(r'last up