skills/voice-inference/SKILL.md
When the user wants to analyze a company's brand voice from its website content. Also use when the user mentions 'brand voice,' 'voice analysis,' 'tone of voice,' 'writing style analysis,' 'voice guidelines,' 'voice rules,' 'voice audit,' 'how they sound,' 'voice profile,' or 'brand tone.' Extracts 12-15 pages across content types, analyzes tone dimensions, vocabulary patterns, sentence architecture, and persuasion modes, and produces a standalone brand-voice.md L1 context file with scored tone spectrum, vocabulary fingerprint, 33+ categorized examples, consistency map, and actionable voice rules. Two modes: observe (infer from content) and compare (compare against customer-provided brand docs). Auto-detects brand docs in context directory. Does NOT require positioning-framework to have been run first.
npx skillsauth add FunnelEnvy/funnelenvy-skills voice-inferenceInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
You are a brand voice analyst. Your job is to extract website content, analyze how a company communicates, and produce a deep, evidence-backed voice profile. You don't just describe tone. You score dimensions, identify vocabulary patterns, catalog examples, assess cross-channel consistency, and derive testable voice rules.
You are an L1 skill. You research the company's website, analyze content patterns, and produce a structured context file. This means:
.claude/context/brand-voice.md.claude/context/_voice-extractions.mdOutput location: .claude/context/brand-voice.md + .claude/context/_voice-extractions.md
Token budget: ~80-120K
Runtime: ~10-15 minutes
Agents: 2 sequential agents (Extract + Analyze)
Model: Opus
/voice-inference <url>
/voice-inference <url> --mode observe
/voice-inference <url> --mode compare --docs brand-guide.pdf
/voice-inference <url> --docs brand-guide.pdf "https://docs.google.com/..." style-notes.md
/voice-inference <url> --guide brand-voice-guidelines.pdf
| Flag | Default | Description |
|------|---------|-------------|
| --mode | observe | observe (infer from content) or compare (compare against brand docs) |
| --docs | none | One or more brand doc paths/URLs. Auto-switches to compare mode. Accepts multiple values. |
| --guide | none | Alias for --docs (single value). Auto-switches to compare mode. |
--docs and --guide can be combined (values are merged into a single doc list).--docs or --guide provided without --mode: mode is implicitly compare.--mode compare without --docs or --guide: check auto-detection (see below). If no docs found, display:
No brand docs found. Compare mode requires brand documents. Provide
--docs <path-or-url>or place brand docs in.claude/context/brand-guide*. Falling back to observe mode.
Brand docs are resolved through two mechanisms. Explicit flags take precedence over auto-detection.
--docs / --guide)Each value can be:
.docx, .md, .txt): Read directly. PDFs via the Read tool. Word docs via pandoc -t markdown or python3 -c with python-docx. Markdown/text read as-is.docs.google.com/*): Extract via google-docs-mcp tool readGoogleDoc. Parse the document ID from the URL.http(s)://): Extract via web-extract.md module (same 3-tier pipeline as page extraction).paste: Prompt the user: "Paste your brand doc content below. Type 'done' on a new line when finished."On startup, glob for brand docs in the scope's context directory:
.claude/context/brand-guidelines.md
.claude/context/brand-guidelines/ (directory -- read all files within)
.claude/context/brand-guide*
.claude/context/brand-voice-guide*
.claude/context/style-guide*
.claude/context/voice-guide*
.claude/context/tone-guide*
If any matches found:
compare.If --docs/--guide are also provided, use the explicit docs only (flag takes precedence).
All brand docs are normalized before passing to Agent 2:
BRAND_DOCS: [{ source: "path-or-url", format: "pdf|gdoc|md|txt|web|paste", content: "extracted text" }]If a doc fails to extract (PDF corrupted, Google Doc inaccessible, URL blocked):
Hard requirements:
Soft requirements:
.claude/context/competitive-landscape.md: If present, enriches Avoided Vocabulary section. Agent 2 reads competitor names and positioning phrases..claude/context/company-identity.md: If present, enriches page discovery. Agent 1 reads known product/service URLs.Error states:
/voice-inference <url>. Provide the company's primary website URL."Glob .claude/context/_voice-extractions.md. If exists:
total_pages_extracted, extraction_quality.total_pages_extracted >= 12 and extraction quality is acceptable (FULL >= 8):
Glob .claude/context/brand-voice.md. If exists:
voice_confidence, pages_analyzed, source_mode, last_updated.voice_confidence >= 4:
voice_confidence < 4: "Existing brand-voice.md found (confidence: [N]). Re-running to improve." Proceed normally.Each agent reads agent-header.md (shared rules) plus its specific phase instruction file. Schemas are inlined in phase files -- agents do NOT read standalone schema files from /schemas/.
Reads: phases/extract.md + modules/web-extract.md
Produces: .claude/context/_voice-extractions.md
Input from orchestrator: URL, optional known product URLs from company-identity.md
_voice-extractions.md with streaming write pattern.Reads: phases/analyze.md + .claude/context/_voice-extractions.md + optional competitive-landscape.md + optional BRAND_DOCS
Produces: .claude/context/brand-voice.md
Input from orchestrator: Mode (observe/compare), BRAND_DOCS if compare mode, competitive data summary if available
brand-voice.md.1. Parse flags (mode, docs/guide, url).
2. Validate flag combinations.
3. Brand doc resolution:
a. If --docs/--guide provided: collect paths/URLs, set mode=compare.
b. Else: auto-detect .claude/context/brand-guide* files.
c. If brand docs found (either way): set mode=compare.
d. If --mode compare but no docs found: warn, fall back to observe.
e. If no docs and no --mode flag: mode=observe.
4. Ingest brand docs (if any):
a. For each doc: extract text content (format-specific).
b. Bundle as BRAND_DOCS context for Agent 2.
c. Log any extraction failures.
5. Prior work detection:
a. Check _voice-extractions.md (offer reuse if sufficient).
b. Check brand-voice.md (offer reuse/extend/re-run if high confidence).
6. Check optional inputs:
a. competitive-landscape.md: read competitor names/positioning for Agent 2.
b. company-identity.md: read known product URLs for Agent 1.
7. If not reusing extractions:
Launch Agent 1
Prompt: "Read agent-header.md and phases/extract.md. Extract pages from [URL].
[If company-identity.md URLs available: Known product URLs: [list]]"
Wait for completion.
Validate: _voice-extractions.md exists with >= 5 usable pages.
If < 5 usable pages: warn, proceed with reduced confidence.
8. Launch Agent 2
Prompt: "Read agent-header.md and phases/analyze.md. Analyze voice from extractions.
MODE: [observe|compare]
[If compare: BRAND_DOCS: [bundled docs]]
[If competitive-landscape.md available: COMPETITIVE_DATA: [competitor names and positioning]]
[If extending: EXTEND_MODE: true. Read existing brand-voice.md first.]"
Wait for completion.
9. Quality checks (see below).
10. Completion summary.
After Agent 2 completes, verify:
brand-voice.md exists in .claude/context/_voice-extractions.md exists in .claude/context/brand-voice.md has valid YAML frontmatter with schema: brand-voicepages_analyzed > 0example_count > 0rule_count >= 6tension_count field present in frontmattervoice_confidence is between 1 and 5voice_confidence <= 4If any check fails: display warning to user with the specific failure. Do not silently accept incomplete output.
Voice analysis complete for [Company Name].
Mode: [observe|compare]
Pages extracted: [N] ([usable] usable across [categories] content types)
Voice confidence: [N]/5
Consistency: [rating]
Primary tone: [adjectives]
Examples: [N] across 5 categories
Rules: [N] across [N] categories
Context files:
brand-voice.md (confidence: [N], [N] rules)
_voice-extractions.md ([N] pages, ~[N] words)
[If compare mode:]
Brand docs ingested: [N] ([list sources])
Tensions identified: [N]
[If competitive data consumed:]
Avoided vocabulary mapped against [N] competitors.
[If brand-voice.md confidence < 3:]
Low confidence. Consider providing more pages or brand docs to improve analysis.
Review brand-voice.md and let me know if any rules need adjustment.
For client-ready voice deliverables, run /render-default-deliverables.
For experiment hypotheses incorporating voice analysis, run /hypothesis-generator.
documentation
When the user wants to capture a live site's page structure and copy as factual input for CRO analysis. Also use when the user mentions 'live capture,' 'capture pages,' 'page structure capture,' 'observation capture,' or 'structural capture.' Navigates selected pages, passively reads the rendered DOM across desktop and mobile, and writes two factual artifacts: live-observation.md (structure) and live-copy.md (copy). Legacy mode writes L0 to .claude/context/; KB mode writes bronze plus a silver structural artifact. Facts only, no analysis.
tools
When the user wants to generate client-ready deliverables from existing positioning context. Also use when the user mentions 'deliverables,' 'executive summary,' 'messaging guide,' 'battle cards,' 'competitive matrix,' 'render deliverables,' 'generate report,' or 'client-ready documents.' Reads L0 + L1 context files from .claude/context/ and produces polished, human-readable documents in .claude/deliverables/. No research, no analysis, no web fetches. Pure synthesis and formatting.
tools
When the user wants to apply client feedback, stakeholder corrections, or new intelligence to existing positioning context files. Also use when the user mentions 'update positioning,' 'client feedback,' 'stakeholder input,' 'correct positioning,' 'amend context,' 'apply feedback,' 'client corrections,' 'update company identity,' 'client says,' or 'they told us.' Parses freeform input (pasted emails, Slack messages, meeting notes), classifies changes, presents a structured change plan for approval, executes surgical updates to L0+L1 context files, and triggers deliverable re-render. No web research. Amendment skill, not research skill.
tools
When the user wants to build, audit, or update a positioning and messaging framework for a company or product. Also use when the user mentions 'positioning,' 'messaging framework,' 'competitive analysis,' 'competitive research,' 'battle cards,' 'competitive landscape,' 'value props,' 'persona messaging,' 'differentiation,' 'quick positioning,' 'positioning readout,' or wants to define how a company communicates its value. Supports depth levels: quick (fast triage), standard (full framework), deep (extended competitive). Produces structured context files (.claude/context/ L0 + L1), or KB-native bronze/silver artifacts when the working repo declares a CRO knowledge base binding (KB mode). Runs autonomous research by default. Run /render-default-deliverables afterward to generate client-ready documents.