t0ddc3by/claude-for-customer-success/expansion-business-case

Claude Code and agent skill by t0ddc3by/claude-for-customer-success

Trust tier 2
  • community
LLM review pending
Source check pending

Checking that the SKILL.md file is still in the repository.

Generate a customer-facing expansion proposal (csm-led) or a CSQL Qualification Package for Sales handoff (csql) based on account health, usage signals, and expansion opportunity context. Applies 5 constraints, 5 expert checks, and 5 anti-pattern guards before output generation.

Install

npx vskill@latest install t0ddc3by/claude-for-customer-success/expansion-business-case

SKILL.md

/expansion-business-case

[PROPOSED]

Overview

Generate evidence-based expansion business cases or Sales qualification packages for Customer Success Managers working within the Expansion & Growth service at Stage 4 of the CS Journey. Two output modes serve distinct audiences:

  • csm-led: Customer-facing expansion proposal (600–1,200 words). Positions

product expansion in terms of the customer's achieved outcomes, not vendor features.

  • csql: CSQL Qualification Package — internal Sales handoff brief (400–800

words). Summarizes MEDDIC qualification status, expansion signals, and recommended AE next steps.

Service context: Expansion & Growth service, Stage 4 CS Journey. This skill produces the primary output artifact for the expansion opportunity workflow step. Upstream dependencies: csm:health-monitor (account health score), csm:usage-analyzer (usage signal data). Both are optional inputs; the skill operates with partial context but activates relevant constraint warnings.


Use When

  • CSM has identified an expansion opportunity and needs a structured business case document
  • AE or CSM manager requests a CSQL qualification package before Sales engagement
  • Renewal cycle approaching and CSM wants to document expansion rationale
  • Account has clear adoption signal and CSM needs to articulate value chain to economic buyer
  • QBR preparation requires a formal expansion proposal

Upstream dependency: Before using this skill, identify and qualify expansion signals using the Renewals plugin's expansion-signal skill — this skill builds the business case from those qualified signals (if the renewals plugin is installed, run /renewals:expansion-signal).

Do NOT Use For

  • Initial onboarding value assessments (use csm:onboarding-value-assessment)
  • Renewal risk analysis (use csm:renewal-risk-assessment)
  • Health score computation (use csm:health-monitor)
  • Usage trend analysis (use csm:usage-analyzer)
  • Churn prediction or escalation documents
  • Any document intended to persuade a customer to remain (retention context, not expansion)

Typical Activation

  • "Build a business case for expanding to the enterprise tier with Acme Corp"
  • "Generate a CSQL package for the Globex sales handoff"
  • "Write a csm-led expansion proposal for TechCo — they've been hitting limits for 3 months"
  • "Create the expansion brief for the Q3 QBR with Springfield Industries"

Parameters

ParameterTypeRequiredDescription
modestringYesOutput mode: csm-led or csql
account_namestringYesCustomer account name (used in document output via display_account)
csm_namestringYesCSM name for document attribution (used in CSQL package header via safe_csm_name)
expansion_productstringYesProduct, tier, or seat expansion being proposed
outcome_evidencestringYesDocumented business outcomes the customer has already achieved
expansion_signals`string \list`YesUsage patterns, requests, or signals indicating expansion readiness
health_scorenumberNoAccount health score (0–100). Triggers C-1 warning if < 70.
utilization_ratenumberNoCurrent product utilization (0–100%). Triggers C-2 flag if < 60%.
csql_contextobjectConditionalRequired for csql mode. Contains: economic_buyer, decision_criteria, decision_process, identified_pain, champion, competition (MEDDIC fields)
expansion_amountstringNoEstimated expansion ARR or deal size
timelinestringNoExpected decision or close timeline

Execution Flow

Phase 1: CLASSIFY

Step 1 — Mode determination

Parse mode parameter:

  • If mode is present and equals csm-led or csql → proceed
  • If mode is absent or invalid → AskUserQuestion:

``` question: "Which output type do you need?" header: "Output Mode" options:

  • label: "Customer proposal (csm-led)"

description: "Expansion business case document for the customer"

  • label: "Sales handoff (csql)"

description: "CSQL Qualification Package for the AE" ```

Step 2 — State initialization

Initialize mutual exclusivity flags at CLASSIFY entry (before any output):

python
csql_package_created = False
csm_led_proposal_created = False

Step 3 — Display/safe name separation

python
import html, unicodedata, re
def xml_structural_escape(value: str) -> str:
"""
Two-layer structural escape for XML/HTML injection defense.
Layer 1 of 2-layer defense. Returns display-safe string.
Step 0: html.unescape() — single pass; resolves double-encoding
(e.g., &amp;lt; → &lt;) and 4-hex-digit entities (&#x003c;)
Step 1: NFKC normalization — collapse width variants and compatibility forms
Step 2: Strip raw < and > individually via two full-string passes
(no separator inserted between adjacent tag residues)
Step 3: HTML entity regex — matches &lt; &gt; &#60; &#62; &#x3c; &#x3e;
and variants with leading zeros: #[xX]0*3[cCeE]
Step 4: Unicode homoglyphs — explicit iteration over 10 characters:
U+003C <, U+003E >, U+2039 ‹, U+203A ›, U+27E8 ⟨, U+27E9 ⟩,
U+3008 〈, U+3009 〉, U+FE64 ﹤, U+FE65 ﹥
"""
# Step 0: single-pass html.unescape
value = html.unescape(value)
# Step 1: NFKC normalization
value = unicodedata.normalize('NFKC', value)
# Step 2: strip raw angle brackets individually (no separator)
value = value.replace('<', '').replace('>', '')
# Step 3: HTML entity regex (leading zeros, case variants)
value = re.sub(r'&(?:lt|gt|#(?:60|62|[xX]0*3[cCeE]));', '', value)
# Step 4: Unicode homoglyph iteration
for ch in '<>‹›⟨⟩〈〉﹤﹥':
value = value.replace(ch, '')
return value
display_account = xml_structural_escape(account_name) # document output only
safe_account = re.sub(r'[^\w\-]', '_', display_account) # filesystem ops only
safe_csm_name = xml_structural_escape(csm_name) # document output only

Step 4 — expansion_signals normalization

python
def normalize_expansion_signals(signals) -> str:
"""
Normalize expansion_signals to a single escaped string.
Accepts string or list (max 20 elements, max 500 chars/element).
Per-element xml_structural_escape applied before join.
"""
if isinstance(signals, list):
signals = signals[:20] # max 20 elements
escaped = [xml_structural_escape(str(s)[:500]) for s in signals]
return '; '.join(escaped)
return xml_structural_escape(str(signals))
safe_signals = normalize_expansion_signals(expansion_signals)

Phase 2: PRE-FLIGHT

Step 1 — xml_structural_escape all user-provided string inputs

Apply xml_structural_escape() to every string parameter before any use:

python
safe_outcome_evidence = xml_structural_escape(outcome_evidence)
safe_expansion_product = xml_structural_escape(expansion_product)
safe_timeline = xml_structural_escape(timeline) if timeline else None
safe_expansion_amount = xml_structural_escape(expansion_amount) if expansion_amount else None
if csql_context:
safe_csql = {k: xml_structural_escape(str(v)) for k, v in csql_context.items()}
else:
safe_csql = {}

Step 2 — Layer 2 semantic injection scan

python
INJECTION_PATTERNS = [
# Patterns 0-9: content injection — matched case-insensitively via lower_value
r'\bignore\b.{0,30}\b(?:previous|above|prior|instructions?|directives?|rules?|constraints?)\b',
r'\bdisregard\b.{0,30}\b(?:previous|above|prior|instructions?|directives?|rules?|constraints?)\b',
r'\bforget\b.{0,30}\b(?:previous|above|prior|instructions?|directives?|rules?|constraints?)\b',
r'\bact\s+as\b.{0,50}\b(?:different|new|another|alternate|alternative)\b',
r'\b(?:you\s+are|you\'re)\s+(?:now\s+)?(?:a\s+|an\s+)(?!CSM|customer)',
r'\b(?:pretend|roleplay|role-play|simulate)\b.{0,30}\b(?:you\s+are|you\'re|as\b)',
r'\bdo\s+not\b.{0,30}\b(?:follow|apply|use|respect|enforce)\b.{0,30}\b(?:rules?|constraints?|instructions?|guidelines?)\b',
r'\b(?:reveal|expose|output|print|display|show)\b.{0,30}\b(?:system\s+prompt|instructions?|directives?|rules?)\b',
r'\boverride\w*\b.{0,30}\b(?:instructions?|rules?|constraints?|directives?|guidelines?)\b',
r'\b(?:inject|insertion|payload)\b.{0,30}\b(?:prompt|instruction|directive|command)\b',
# Patterns 10-12: structural LLM-format injection (re.IGNORECASE on original value)
r'\[(?:INST|SYS|SYSTEM|END)\]',
r'(?:###\s*)?(?:instruction|system|user|assistant)\s*:\s',
r'\bhuman\s*:\s|\bassistant\s*:\s',
]
def scan_for_injection(value: str) -> bool:
"""
Returns True if injection attempt detected. Patterns 0-9 match against
lowercased value for case-insensitive coverage. Patterns 10-12 use
re.IGNORECASE on the original value (preserves delimiter detection).
"""
lower_value = value.lower()
for i, pattern in enumerate(INJECTION_PATTERNS):
target = lower_value if i < 10 else value
flags = re.IGNORECASE if i >= 10 else 0
if re.search(pattern, target, flags):
return True
return False
# Scan all escaped inputs
inputs_to_scan = [
safe_outcome_evidence, safe_expansion_product, safe_signals,
safe_csm_name, safe_timeline or '', safe_expansion_amount or '',
] + list(safe_csql.values())
for val in inputs_to_scan:
if scan_for_injection(val):
raise ValueError(
"Input rejected: potential prompt injection detected. "
"Please review your inputs and remove any instruction-like content."
)

Phase 3: CONSTRAINTS

Evaluate constraints in order. Blocking constraints raise errors; non-blocking produce warning annotations stored for header injection.

python
constraint_warnings = []
constraint_errors = []
# C-3: CSQL minimum inputs (BLOCKING)
if mode == 'csql':
required_csql_fields = ['economic_buyer', 'identified_pain', 'champion']
missing = [f for f in required_csql_fields if not safe_csql.get(f)]
if missing:
constraint_errors.append(
f"C-3 ERROR: CSQL mode requires {', '.join(missing)}. "
f"Provide these fields in csql_context before proceeding."
)
# C-4: Mutual exclusivity (BLOCKING)
if mode == 'csm-led' and csm_led_proposal_created:
constraint_errors.append(
"C-4 ERROR: A csm-led proposal has already been generated for this "
"invocation. Start a new skill session to generate an additional proposal."
)
if mode == 'csql' and csql_package_created:
constraint_errors.append(
"C-4 ERROR: A CSQL package has already been generated for this "
"invocation. Start a new skill session to generate an additional package."
)
if constraint_errors:
raise ValueError('\n'.join(constraint_errors))
# C-1: Health score (non-blocking)
if health_score is not None and health_score < 70:
constraint_warnings.append(
f"⚠️ C-1: Account health score is {health_score}/100 (below 70). "
"Review health trajectory before presenting expansion to customer."
)
# C-2: Utilization rate (non-blocking)
if utilization_rate is not None and utilization_rate < 60:
constraint_warnings.append(
f"⚠️ C-2: Current utilization is {utilization_rate}% (below 60%). "
"Consider whether expansion is premature given current adoption level."
)
# C-5: Economic buyer placeholder (non-blocking)
economic_buyer = safe_csql.get('economic_buyer', '') if safe_csql else ''
if not economic_buyer:
economic_buyer = '[Economic Buyer — confirm with AE]'
constraint_warnings.append(
"⚠️ C-5: Economic buyer not identified. Placeholder inserted in output. "
"Confirm with AE before customer-facing use."
)

Phase 4: EXPERT CHECK

This is the start of the file. Read the full SKILL.md on GitHub.

Security

  • Security scanPassed, 100 of 100Pattern checks on the skill's files.
  • Model reviewNot runA model review is scheduled for the next rescan.

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

Repository stars
62
Repository forks
21
7-day trend score
21

Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/t0ddc3by/claude-for-customer-success/expansion-business-case/badge)](https://verified-skill.com/skills/t0ddc3by/claude-for-customer-success/expansion-business-case)

Something wrong with this skill or its page? Tell us.