Competitive Positioning Skill
Help startup founders see their competitive landscape clearly — who the real competitors are, where they're differentiated, how defensible that differentiation is, and how to present it to investors. Produce a competitive analysis with positioning maps, moat scorecards, and an investor-ready narrative. The tone is founder-first: a coaching tool for preparation, not a judgment.
Skill Metadata
- Author: lool-ventures
- Version: managed in
founder-skills/.claude-plugin/plugin.json - Compatibility: Python 3.10+ and
uvfor script execution. - Imports (optional):
deck-review:checklist.json— competition slide claims for cross-validationmarket-sizing:sizing.json— validate market claims in positioning
- Exports:
landscape.json→deck-review,fundraise-readinessreport.json→ic-sim,fundraise-readiness,cross-document-consistency
Skill Execution Model (READ FIRST)
This skill runs inline in the main thread (not as a sub-agent). The main thread has full tool access including Bash, and is responsible for orchestrating the full pipeline: running producer scripts, persisting artifacts, and dispatching the competitive-positioning sub-agent at specific moments.
Two dispatch contexts for the sub-agent:
- Context A — Per-step analytical dispatch (Mitigation 1): Steps 4 (LANDSCAPE_RESEARCH), 5 (MOAT_SCORING + POSITIONING_SCORING), and 6 (CHECKLIST) dispatch the competitive-positioning agent via the
Tasktool. The agent does deep analysis and returns structured JSON. The main thread captures the JSON and pipes it through the producer script (validate_landscape.py,score_moats.py,score_positioning.py, orchecklist.py). The sub-agent does NOT write artifacts directly. - Context B — Post-compose coaching dispatch: Step 7 dispatches the sub-agent after
compose_report.pywritesreport.md. The sub-agent readsreport.md, appends## Coaching Commentary, verifies all canonical artifacts on disk, and returns a structured success payload.
Why this model: In Cowork, sub-agents have a restricted tool allowlist (no Bash). By keeping orchestration in the main thread and dispatching sub-agents only for analytical or post-compose tasks that use only Read/Edit/Glob/Grep, the pipeline works correctly in both Claude Code (CLI) and Cowork.
Tolerant JSON extraction protocol (Context A): After dispatching the sub-agent, capture its final assistant message. The sub-agent should return raw JSON, but may wrap it in ```json ... ``` fences or add a prose preamble. Extract JSON tolerantly:
- If the message is wrapped in a
```json ... ```(or plain``` ... ```) fence, strip the fence first. - Try to parse the stripped text directly as JSON.
- If that fails, walk through the text looking for the first
{character and tryjson.JSONDecoder().raw_decode(text[i:])— this is brace-aware and handles nested objects correctly (unlike regex, which truncates on the first}). - If extraction fails entirely, re-prompt the sub-agent with: "Your previous reply could not be parsed as JSON. Return ONLY the JSON object — no markdown fences, no prose preamble."
See
founder-skills/references/skill-execution-model.mdfor the full inline-skill execution model (3 dispatch contexts, Mitigation 1+2, producer contract, Cowork quirks, per-symptom triage).
Input Formats
Accept any combination: pitch deck (PDF), competitive analysis document, text description of the product and market, prior deck-review or market-sizing artifacts, or conversational input. If a pitch deck is provided, extract competitor claims from the competition slide for validation.
Available Scripts
All scripts are at ${CLAUDE_PLUGIN_ROOT}/skills/competitive-positioning/scripts/:
validate_landscape.py— Validates and normalizes competitor landscape; checks slug uniqueness, category distribution, research depth; emits warnings for quality issuesscore_moats.py— Validates per-company moat assessments, computes aggregates (moat_count, strongest_moat, overall_defensibility), produces cross-company comparison by moat dimensionscore_positioning.py— Scores positioning views with rank-based differentiation, detects vanity axes, passes through stress-test resultschecklist.py— Scores 25 criteria across 6 categories (pass/fail/warn/not_applicable) with mode-based gating by input_modecompose_report.py— Assembles report with cross-artifact validation;--strictexits 1 on high-severity warningsvisualize.py— Generates self-contained HTML with SVG charts (not JSON)explore.py— Generates interactive HTML explorer with Chart.js scatter plot, view switching, bubble encoding controls, and company detail panels (not JSON)
Also available from ${CLAUDE_PLUGIN_ROOT}/scripts/ (shared):
founder_context.py— Per-company context management (init/read/merge/validate)find_artifact.py— Resolves artifact paths by skill name and filename (for cross-skill lookups)
Run with: python3 ${CLAUDE_PLUGIN_ROOT}/skills/competitive-positioning/scripts/<script>.py --pretty [args]
Available References
Read each when first needed — do NOT load all upfront. At ${CLAUDE_PLUGIN_ROOT}/skills/competitive-positioning/references/:
competitive-analysis-methodology.md— Read before Step 3. Axis selection, competitor categorization, stress-testing, investor expectationsmoat-definitions.md— Read before Step 5. Six canonical moat dimensions with scoring rubrics and stage-calibrated expectationschecklist-criteria.md— Read before Step 6. All 25 checklist criteria with category definitions and mode-based gating rulesartifact-schemas.md— Consult as needed when depositing agent-written artifacts
From ${CLAUDE_PLUGIN_ROOT}/references/ (shared): stage-expectations.md, benchmarks.md, israel-guidance.md
Artifact Pipeline
Every analysis deposits structured JSON artifacts into a working directory. The final step assembles all artifacts into a report and validates consistency. This is not optional.
| Step | Artifact | Producer |
|---|---|---|
| 2 | product_profile.json | Agent (main) |
| 3 | landscape_draft.json | Agent (main) |
| 4 | landscape_enriched.json | Context A dispatch: LANDSCAPE_RESEARCH |
| 4b | landscape.json | validate_landscape.py (from enriched) |
| 5a | moat_scores.json | Context A dispatch: MOAT_SCORING → score_moats.py |
| 5b | positioning_scores.json | Context A dispatch: POSITIONING_SCORING → score_positioning.py |
| 5c | positioning.json | Agent (main — views, moats, stress-tests) |
| 6 | checklist.json | Context A dispatch: CHECKLIST → checklist.py |
| 7 | report.json | compose_report.py reads all |
| 7d | report.html | visualize.py |
| 7e | explore.html | explore.py |
Rules:
- Deposit each artifact before proceeding to the next step
- For agent-written artifacts, consult
references/artifact-schemas.mdfor the JSON schema - If a step is not applicable, deposit a stub:
{"skipped": true, "reason": "..."} - Do NOT use
isolation: "worktree"for sub-agents — files written in a worktree won't appear in the main$ANALYSIS_DIR
Keep the founder informed with brief, plain-language updates at each step. Never mention file names, scripts, or JSON. After each analytical step (4-6), share a one-sentence finding before moving on.
Workflow
Step 0: Path Setup
Every Bash tool call runs in a fresh shell — variables do not persist. Prefix every Bash call that uses these paths with the variable block below, or substitute absolute paths directly:
SCRIPTS="${CLAUDE_PLUGIN_ROOT}/skills/competitive-positioning/scripts"
REFS="${CLAUDE_PLUGIN_ROOT}/skills/competitive-positioning/references"
SHARED_SCRIPTS="${CLAUDE_PLUGIN_ROOT}/scripts"
SHARED_REFS="${CLAUDE_PLUGIN_ROOT}/references"
if ls "$(pwd)"/