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.
claude-sonnet-4-5-20250929 (pinned)
· temperature = 0.0
· on-disk response cache + server-side prompt caching
Pipeline order
- Rubric construction one-time setup
- Brief description one-time setup · Haiku
- Windowed evidence extraction per company · the main extractor
- Targeted cleanup re-extraction per company · only for empty dimensions
- Dimension scoring per company · the headline call (×N ensemble)
- Financial-metrics extraction per company
- Investment & funds synthesis per company
1 Rubric construction
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).
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.
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" } }
| Injected | Source |
|---|---|
{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
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".
You write precise, plain-English descriptions of corporate venturing concepts. Return ONLY valid JSON — no markdown, no preamble.
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": "..."}
| Injected | Source |
|---|---|
{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
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.
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.
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:
{window_text} (one 60,000-char window of the narrative, with 6,000-char overlap into the next)
| Injected | Source |
|---|---|
{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
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.
You are a corporate strategy analyst. Extract evidence from 10-K filing text. Return ONLY valid JSON — no markdown fences, no preamble.
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"]}
| Injected | Source |
|---|---|
{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
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.
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.
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}
| Injected | Source |
|---|---|
{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
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).
You are a financial analyst extracting specific metrics from 10-K filing text. Return ONLY valid JSON — no markdown, no preamble.
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)
| Injected | Source |
|---|---|
{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
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.
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.
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')" }
| Injected | Source |
|---|---|
{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) |