Key LLM API Prompts

The actual Claude prompts the Corporate Venturing Toolkit sends to the Anthropic API, labelled by purpose. Highlighted {curly braces} mark where Python data is injected at runtime.

How to read this page. Each card shows one API call: its system prompt (fixed instructions) and its user prompt template. Text is reproduced from the source modules (cv_analyzer.py, cv_framework.py); the literal output-schema braces { } are shown as the model actually receives them, and only the genuine runtime substitutions are highlighted.
{placeholder}  = value injected from Python at call time ·  Model: claude-sonnet-4-5-20250929 (pinned) ·  temperature = 0.0 ·  on-disk response cache + server-side prompt caching

Pipeline order

  1. Rubric construction one-time setup
  2. Brief description one-time setup · Haiku
  3. Windowed evidence extraction per company · the main extractor
  4. Targeted cleanup re-extraction per company · only for empty dimensions
  5. Dimension scoring per company · the headline call (×N ensemble)
  6. Financial-metrics extraction per company
  7. Investment & funds synthesis per company

1 Rubric construction

One-time setup 1 call per dimension (×15, cached) max_tokens 1500 cv_framework.py · build_rubric_prompt

Turns each framework definition document into a structured scoring rubric (definition summary, key indicators, 5 scoring bands, evidence phrases, and the cross-objective relevance grid that later seeds the P×O matrix fallback).

System
You are an expert in corporate venturing strategy and evaluation.
You will create a structured scoring rubric from a definition document.
Return ONLY valid JSON — no markdown, no preamble.
User template
Create a detailed scoring rubric for the corporate venturing dimension:
"{dimension_name}"  (section: {section})

DEFINITION TEXT:
{definition_text}          (first 8000 chars; or a "use general knowledge" line if empty)

Return JSON in this EXACT structure:
{
  "dimension": "{dimension_name}",
  "section": "{section}",
  "definition_summary": "2-3 sentence synthesis of what this dimension means",
  "key_indicators": [ "indicator 1: what to look for in a 10-K", "indicator 2", ... ],
  "scoring_bands": {
    "80_100": "What high emphasis (80-100) looks like in a 10-K filing",
    "60_79":  "...", "40_59": "...", "20_39": "...", "0_19": "..."
  },
  "example_evidence_phrases": [ "example fragment (3-8 words)", ... ],
  "financial_signals": [ "financial metric/disclosure evidencing this dimension", ... ],
  "cross_objective_relevance": {
    "Risk Management": "low/medium/high", "Market Expansion": "low/medium/high",
    "Access to New Technology": "low/medium/high", "Develop Business Ecosystems": "low/medium/high",
    "Social and Environmental Impact": "low/medium/high",
    "Developing Entrepreneurial Culture and Capabilities": "low/medium/high"
  }
}
InjectedSource
{dimension_name}Dimension name, e.g. "Corporate Venture Capital"
{section}"practice" / "activity" / "objective"
{definition_text}Contents of the matching framework/ or framework_v2/ .txt file (truncated to 8000 chars)

2 Brief description

One-time setup 1 call per dimension (×15, cached) Haiku (cheap) cv_framework.py · _brief_desc_prompt

Adds a one–two sentence plain-English brief_description to each rubric. This short text is what later gets embedded into the extraction prompt's "dimension guide".

System
You write precise, plain-English descriptions of corporate venturing concepts.
Return ONLY valid JSON — no markdown, no preamble.
User template
Write a 1-2 sentence plain-English description of "{dim_name}" as a corporate venturing dimension.
The description should:
- State clearly what this dimension measures
- Mention 2-3 concrete signals that indicate its presence in a 10-K
- Be usable as a search query to retrieve relevant 10-K passages

Context:
{summary}            (rubric.definition_summary, first 600 chars)

Key indicators: {indicators}      (rubric.key_indicators, first 5)

Return JSON:
{"brief_description": "..."}
InjectedSource
{dim_name}Dimension name
{summary}The rubric's definition_summary from prompt 1
{indicators}The rubric's first 5 key_indicators

3 Windowed evidence extraction

Per company · core 1 call per 60K-char window (whole document tiled) max_tokens 8000 cv_analyzer.py · _batch_extraction_prompt

The main extractor. The entire narrative (Items 1, 1A, 2, 7, 8 incl. financial footnotes) is tiled into overlapping 60K/6K-char windows; every window is scanned for all 15 dimensions at once. The static prefix below is prompt-cached; only the window text (sent as the user message) is billed at full rate per window.

System
You are a corporate strategy analyst specialising in corporate venturing.
Analyse 10-K filing text and extract evidence for multiple venturing dimensions simultaneously.

CRITICAL PRINCIPLE: The dimension descriptions are CONCEPTUAL GUIDES, not semantic templates.
Companies describe venturing activities using their own vocabulary — often enterprise, product,
or financial language — which bears no surface resemblance to framework terminology.
Your job is to recognise the UNDERLYING ACTIVITY, regardless of the words used.

Return ONLY valid JSON — no markdown, no preamble.
User template — static prefix (prompt-cached)
Analyse a {block_label} excerpt from {ticker}'s 10-K filing.

For EACH of the {n_dims} dimensions below, extract ALL relevant evidence present in the excerpt.

KNOWN ENTITIES FOR {ticker}:                  (entity_block — omitted if none discovered)
  Funds/Programmes: {fund_descriptions}
  Portfolio companies: {portfolio_companies}

DIMENSIONS TO ANALYSE:
{dim_guide}
   └─ one line per dimension:  "- {dim}: {brief_description} | Indirect evidence (20-59): {mid_band} | Company hint: {dimension_hint}"

EXTRACTION RULES:
- The dimension descriptions are CONCEPTUAL GUIDES, not vocabulary checklists.
  A company doing the activity using different words still counts as evidence.
- Extract DIRECT evidence (activity explicitly described) AND INDIRECT evidence
  (same underlying activity described in the company's own terminology)
- Examples of conceptual equivalence:
    "Google Cloud Platform" → Business Services (providing infrastructure to users including startups)
    "Other Bets / Waymo / Isomorphic Labs" → Venture Building (internal new venture creation)
    "strategic investments and acquisitions" → Venture Clienting (engaging startups commercially)
    "training, mentorship, and support programmes" → Mentorship
- Do NOT require startup-specific language. Enterprise-scale activities that serve
  the same function as the dimension describes count as indirect evidence.
- Return empty arrays ONLY if the concept has truly NO expression in the excerpt.
- COMPLETENESS: extract EVERY distinct relevant sentence — do NOT limit the count.
- DISTINCTNESS: prefer DIFFERENT sentences for different dimensions.

REQUIRED OUTPUT — a single JSON object with exactly {n_dims} keys, one per dimension:
{
  "{example_dim}": {"sentences": ["verbatim quote..."], "key_terms": ["term1"], "financial_figures": ["$X million"]},
  ... (one entry per dimension listed above)
}

THE {block_label} EXCERPT TO ANALYSE FOLLOWS BELOW — extract evidence ONLY from this text:
User template — variable suffix (billed per window)
{window_text}     (one 60,000-char window of the narrative, with 6,000-char overlap into the next)
InjectedSource
{block_label}"NARRATIVE" for the 10-K, or "CURATED WEB" when --with-scraped
{ticker}Company ticker
{n_dims}Number of dimensions in the batch (15)
{fund_descriptions} / {portfolio_companies}From company_context.json + entity discovery (RAG)
{dim_guide}Built from each rubric's brief_description, mid-band text, and the company's dimension_hints
{window_text}The current overlapping window of the full narrative (or scraped text)

4 Targeted cleanup re-extraction

Per company · conditional 1 call per dimension still at 0 evidence max_tokens 1000 cv_analyzer.py · cleanup_prompt

A safety net: any single dimension that came back with no evidence after the windowed pass is re-scanned over the whole narrative, focused on that one concept.

System
You are a corporate strategy analyst. Extract evidence from 10-K filing text.
Return ONLY valid JSON — no markdown fences, no preamble.
User template
Analyse this 10-K excerpt for {ticker}.

Find ANY evidence for this ONE dimension — direct or indirect:

DIMENSION: {dim}
CONCEPT: {brief}

IMPORTANT: The description above is a CONCEPTUAL GUIDE, not a vocabulary list.
The company likely uses completely different words for the same activity.
Look for the underlying BEHAVIOUR, not the rubric terminology.

What indirect evidence looks like (score 20-59):
{mid_band_or_low_band}

How {ticker} expresses this: {hint}      (only if a dimension_hint exists)

Examples of what to look for regardless of exact wording:
- Strategic investments / acquisitions / joint ventures → Venture Clienting
- Internal subsidiaries / new business units / moonshots → Venture Building
- Platform / infrastructure / tools provided to customers → Business Services
- Training / coaching / advisory / board involvement → Mentorship

TEXT ({n_chars} chars):
{full_narrative_text}

Return JSON (empty arrays only if truly ZERO connection):
{"sentences": ["verbatim quote (max 150 chars)"], "key_terms": ["term"], "financial_figures": ["$X"]}
InjectedSource
{dim} / {brief}The empty dimension's name and brief description
{mid_band_or_low_band}The rubric's 40–59 (else 20–39) scoring-band text
{hint}The company's dimension_hints entry, if any
{full_narrative_text}The entire narrative (this pass is recall-focused, not windowed)

5 Dimension scoring — the headline call

Per company · core N independent passes (ensemble, default N=5) → per-dimension median max_tokens 16000 cv_analyzer.py · _scoring_prompt

All merged evidence for all 15 dimensions is sent in one call. The model returns the 0–100 emphasis scores, ranks, descriptions, top quotes, rubric bands, and the practice×objective matrix. Run {N} times on the same evidence; the reported score is the per-dimension median and the spread becomes the uncertainty / error bars.

System
You are a corporate venturing strategy expert. Score and rank dimensions
based on aggregated 10-K evidence and detailed rubrics.

CRITICAL PRINCIPLE: Rubric descriptions are CONCEPTUAL GUIDES, not literal checklists.
They describe what each dimension MEANS, not what words must appear in the filing.
Score based on whether the company IS DOING the activity — the spirit of the dimension —
not whether they use the rubric's specific terminology.

Example: A company whose 10-K describes providing cloud infrastructure to enterprise
customers (including startups) IS providing Business Services, even if it says nothing
about "portfolio companies" or "startup support programmes."

Return ONLY valid JSON — no markdown, no preamble.
User template
Score ALL 15 corporate venturing dimensions for {company} ({ticker}).

CRITICAL: Use ONLY the exact dimension names listed below. Do NOT invent new names.

PRACTICES (4):   {PRACTICES}
ACTIVITIES (4):  {ACTIVITIES}
OBJECTIVES (7):  {OBJECTIVES}

AGGREGATED EVIDENCE + RUBRICS:
{merged_evidence_and_rubrics_json}
   └─ per dimension: company_specific_context, evidence_sentences[:20], financial_figures, key_terms_found, definition_brief, compact scoring_bands  (truncated to 120,000 chars)

SCORING GUIDANCE:
- Rubric descriptions define the CONCEPT, not a vocabulary list. Score the activity, not the words.
- company_specific_context (when present) shows how THIS company expresses the activity.
- Score 20-39: any incidental or indirect reference to the underlying activity.
- Score 40-59: clear but generic or enterprise-scale expression of the activity.
- Score 60-79: explicit, named, or quantified expression of the activity.
- Score 80-100: comprehensive, strategic, multi-faceted expression with metrics.
- Score 0 ONLY when the evidence has NO conceptual connection. If evidence is non-empty, score is almost never 0.

Return this EXACT JSON structure with all dimensions populated:
{
  "ticker": "{ticker}",
  "company": "{company}",
  "practices":  { {dim_block(PRACTICES)} },
  "activities": { {dim_block(ACTIVITIES)} },
  "objectives": { {dim_block(OBJECTIVES)} },
  "practice_x_objective_matrix": { {matrix_block} },
  "overall_assessment": {
    "venturing_tier": "Tier 1 / Tier 2 / Tier 3",
    "dominant_practice": "name from practices list",
    "dominant_objective": "name from objectives list",
    "total_emphasis_score": 0,
    "strategic_posture": "2-3 sentence overall assessment",
    "key_strengths": ["strength 1", "strength 2"],
    "key_gaps": ["gap 1", "gap 2"]
  }
}

Scoring rules:
- emphasis_score: 0-100 based on evidence depth, financial scale, strategic language
- rank: 1=highest; practices 1-4, activities 1-4, objectives 1-7 (ranked separately)
- practice_x_objective_matrix: how strongly each practice/activity SERVES each objective (0-100)
- total_emphasis_score: sum of all 15 dimension scores
- activities with no 10-K evidence score 0 — do not fabricate
- NEVER rename or skip any dimension
- top_quote: the SINGLE most specific sentence for THIS dimension — every dimension MUST have a DIFFERENT quote.

Where {dim_block(...)} expands — one entry per dimension:

"{dim}": {"emphasis_score": 0, "rank": 1, "evidence_count": 0, "description": "...",
         "top_quote": "...", "rubric_band": "...", "scoring_rationale": "..."}

Where {matrix_block} expands — one row per practice/activity, columns = the 7 objectives:

"{practice}": {"Risk Management": 0, "Market Expansion": 0, "Access to New Technology": 0,
              "Develop Business Ecosystems": 0, "Social and Environmental Impact": 0,
              "Developing Entrepreneurial Culture and Capabilities": 0, "Financial Return": 0}
InjectedSource
{company} / {ticker}Company identifiers
{PRACTICES} / {ACTIVITIES} / {OBJECTIVES}The canonical dimension-name lists from cv_config.py
{merged_evidence_and_rubrics_json}The merged extraction output (prompts 3+4) joined with the compact rubrics — the heart of the call
{dim_block(...)} / {matrix_block}Code-generated JSON skeletons so the model returns an exact, parseable shape

6 Financial-metrics extraction

Per company 1 call cv_analyzer.py · _financial_prompt

Text-based extraction of 34 GAAP/CVC metrics from the financial sections. These results are then overridden by authoritative XBRL structured data for all standard metrics (cv_sec.merge_xbrl_into_financials).

System
You are a financial analyst extracting specific metrics from 10-K filing text.
Return ONLY valid JSON — no markdown, no preamble.
User template
Extract the following financial metrics from the {ticker} 10-K filing text.
Use null for any metric not found. All monetary values in USD millions.
Percentages as decimal numbers (e.g. 15.3 for 15.3%).

Metrics to extract:
{metric_list}        (34 metrics: "name": label (unit), one per line)

Return JSON:
{
  "fiscal_year": "YYYY",
  "currency": "USD",
  "metrics": {
    "revenue_total": 350000,
    "revenue_yoy_pct": 14.0,
    ... (all 34 metrics, null if not found)
  },
  "extraction_notes": "brief note on data quality or gaps"
}

10-K TEXT (key financial sections):
{financial_window}       (best ~50,000-char window of the Item 7 / Item 8 financial text)
InjectedSource
{ticker}Company ticker
{metric_list}The 34-entry FINANCIAL_METRICS table from cv_config.py
{financial_window}The most number-dense window of the financial statements (selected by _best_financial_window)

7 Investment & funds synthesis

Per company 1 call max_tokens 1500 cv_analyzer.py · _extract_investment_and_funds

Synthesises the merged evidence, discovered fund descriptions, the scraper's structured output, and the financial figures into the investment_and_funds field: number of investments, fund name(s)/size(s), and investment preferences.

System
You are a corporate venturing analyst. From the evidence provided, extract
structured facts about the company's venture INVESTMENTS and FUNDS. Report ONLY what the evidence
supports; use null (never a guess) when something is not stated. Return ONLY valid JSON, no prose.
User template
Company: {company} ({ticker})

STRUCTURED EVIDENCE:
{struct_json}       (named_funds, fund_descriptions, investment_vehicles, portfolio_companies, scraped_cvc, financial_metrics — first 6000 chars)

EVIDENCE SENTENCES (10-K + curated web):
{evidence_sentences_json}     (up to 40 deduped sentences from the 4 practice dimensions — first 7000 chars)

CURATED WEB TEXT (excerpt):
{scraped_text}      (first 18000 chars, empty if not scraped)

Return EXACTLY this JSON (use null wherever the evidence is silent — do NOT invent figures):
{
  "num_investments": "count or range with unit (e.g. '400+ portfolio companies') or null",
  "funds": [
    {"name": "fund/vehicle name", "size": "AUM / fund size / committed capital if stated, else null",
     "type": "CVC | Accelerator | Incubator | Growth | Impact | other", "notes": "one short line, else null"}
  ],
  "investment_preferences": {
    "check_size": "typical investment / check size or range, else null",
    "stage": "seed / early / growth / late, etc., else null",
    "geography": "regions / countries of focus, else null",
    "technology": "sectors / technology areas of focus, else null"
  },
  "evidence_quotes": ["up to 5 short verbatim quotes supporting the above"],
  "sources": "which evidence informed this (e.g. '10-K + curated web')"
}
InjectedSource
{company} / {ticker}Company identifiers
{struct_json}Entity-discovery output + scraper's CVC fields + filtered financial metrics
{evidence_sentences_json}Deduped sentences from the 4 practice dimensions of the merged evidence
{scraped_text}Curated-web text (only when --with-scraped was used)
Not shown here. Two non-LLM steps shape what the prompts above receive but make no Claude call of their own: entity discovery (BM25 + sentence-transformer RAG over the filing, used only to surface fund/portfolio names) and XBRL merge (authoritative SEC structured financials that overwrite prompt 6's text extraction). A small JSON-repair prompt also exists, invoked only when a response fails to parse.